この記事では、Java アプリケーションから Cloud Database ClickHouse Enterprise Edition にオブザーバビリティデータをエクスポートし、ワンストップオブザーバビリティサービスを使用して分析する方法について説明します。これにより、開発チームと運用チームは、アプリケーションのパフォーマンスをリアルタイムで監視し、問題をより迅速に解決できます。
前提条件
Alibaba Cloud ClickHouse Enterprise Edition インスタンスで ワンストップ可観測性サービス が有効になっている必要があります。
手順
この例では、ビジネスサービスと OpenTelemetry Collector を同じ ECS インスタンス上にデプロイします。本番環境では、ビジネスサービスと OpenTelemetry Collector を別々にデプロイすることを推奨します。
ステップ 1:OpenTelemetry Collector のデプロイ
-
ECS インスタンスを構成します。
-
ECS インスタンスを購入 します。パブリックネットワークアクセスのために、購入時にパブリック IP アドレスを割り当てることを推奨します。
-
ECS インスタンスの IP アドレスを Alibaba Cloud ClickHouse の 許可リスト に追加します。
-
プライベート IP アドレス:ECS インスタンスと Alibaba Cloud ClickHouse Enterprise Edition インスタンスが同一の Virtual Private Cloud(VPC)内にある場合、ECS インスタンスのプライベート IP アドレスを許可リストに追加します。この場合、以下の手順で Alibaba Cloud ClickHouse インスタンスの VPC エンドポイントを使用します。
-
パブリック IP アドレス:ECS インスタンスがプライベートネットワーク経由で Alibaba Cloud ClickHouse Enterprise Edition インスタンスに接続できない場合、ECS インスタンスのパブリック IP アドレスを許可リストに追加します。この場合、以下の手順で Alibaba Cloud ClickHouse インスタンスのパブリックエンドポイントを使用します。
ECS インスタンスに接続 し、次のコマンドを実行して Alibaba Cloud ClickHouse インスタンスへの接続をテストできます。
Ok.という応答が返された場合、接続は成功しています。curl http://cc-xxxxxxx-clickhouse.clickhouseserver.pre.rds.aliyuncs.com:8123 -
-
-
ECS インスタンスに接続 し、次のコマンドを実行して otelcol-contrib をインストールします。
mkdir llm-demo cd llm-demo wget -O otelcol-contrib.rpm https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v0.136.0/otelcol-contrib_0.136.0_linux_amd64.rpm yum install otelcol-contrib.rpm -
OpenTelemetry Collector を構成して、gRPC および HTTP 経由で可観測性データを受信し、HTTP 経由で Alibaba Cloud ClickHouse インスタンスに送信できるようにします。
次のコマンドをコピーし、以下のように設定を変更してください。
-
receiversセクションでは、OTLP レシーバーのendpointをご利用の OpenTelemetry Collector サービスのエンドポイントに置き換えることを推奨します。 -
exportersセクションで:-
Alibaba Cloud ClickHouse インスタンスの接続情報を設定します。これには
endpoint、username、passwordが含まれます。 -
Alibaba Cloud ClickHouse インスタンス内で可観測性データを保存するためのデータベース名およびテーブル名を設定します。これには
database、traces_table_name、logs_table_name、およびmetrics_tablesが含まれます。
-
cat > /etc/otelcol-contrib/config.yaml << EOF receivers: otlp: protocols: grpc: endpoint: 0.0.0.0:4317 http: endpoint: 0.0.0.0:4318 processors: batch: timeout: 5s send_batch_size: 5000 exporters: clickhouse: endpoint: http://cc-xxxxxx-clickhouse.clickhouseserver.pre.rds.aliyuncs.com:8123?dial_timeout=10s&compress=lz4&async_insert=1 username: test password: password # ttl: 72h traces_table_name: otel_traces logs_table_name: otel_logs metrics_tables: gauge: name: otel_metrics_gauge sum: name: otel_metrics_sum summary: name: otel_metrics_summary histogram: name: otel_metrics_histogram exponential_histogram: name: otel_metrics_exp_histogram create_schema: false timeout: 5s database: clickobserve_service sending_queue: queue_size: 1000 retry_on_failure: enabled: true initial_interval: 5s max_interval: 30s max_elapsed_time: 300s service: pipelines: traces: receivers: [otlp] processors: [batch] exporters: [clickhouse] metrics: receivers: [otlp] processors: [batch] exporters: [clickhouse] logs: receivers: [otlp] processors: [batch] exporters: [clickhouse] EOF -
-
OpenTelemetry Collector を起動します。
service otelcol-contrib restart
ステップ 2:Java アプリケーションの作成
このセクションでは、簡単な Spring Boot のサイコロを振るサービスを例に、アプリケーションを作成する方法を説明します。
-
Java 環境を設定します。
-
Java 環境をデプロイします。Java 17 以降をインストールすることを推奨します。
-
-
この例では、ディレクトリ名は
java-simpleです。初期化後、ディレクトリ構造は次のようになります。java-simple ├── app │ ├── build.gradle.kts │ └── src │ ├── main │ │ ├── java │ │ │ └── org │ │ │ └── example │ │ │ └── App.java │ │ └── resources │ └── test │ ├── java │ │ └── org │ │ └── example │ │ └── AppTest.java │ └── resources ├── gradle │ ├── libs.versions.toml │ └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradle.properties ├── gradlew ├── gradlew.bat └── settings.gradle.kts -
java-simpleディレクトリで、次のファイルを変更または作成します。build.gradle.kts
plugins { id("java") id("org.springframework.boot") version "3.0.6" id("io.spring.dependency-management") version "1.1.0" } sourceSets { main { java.setSrcDirs(setOf(".")) } } repositories { mavenCentral() } dependencies { implementation("org.springframework.boot:spring-boot-starter-web") }App.java
package org.example; import org.springframework.boot.Banner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class App { public static void main(String[] args) { SpringApplication app = new SpringApplication(App.class); app.setBannerMode(Banner.Mode.OFF); app.run(args); } }RollController.java
package org.example; import java.util.Optional; import java.util.concurrent.ThreadLocalRandom; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; @RestController public class RollController { private static final Logger logger = LoggerFactory.getLogger(RollController.class); @GetMapping("/rolldice") public String index(@RequestParam("player") Optional<String> player) { int result = this.getRandomNumber(1, 6); if (player.isPresent()) { logger.info("{} is rolling the dice: {}", player.get(), result); } else { logger.info("Anonymous player is rolling the dice: {}", result); } return Integer.toString(result); } public int getRandomNumber(int min, int max) { return ThreadLocalRandom.current().nextInt(min, max + 1); } }
ステップ 3:OpenTelemetry Java エージェントの設定
-
OpenTelemetry Java エージェントをダウンロードします。
curl -L -O https://github.com/open-telemetry/opentelemetry-java-instrumentation/releases/latest/download/opentelemetry-javaagent.jar -
環境変数を設定します。
export JAVA_TOOL_OPTIONS="-javaagent:/path/to/opentelemetry-javaagent.jar" \ OTEL_TRACES_EXPORTER=otlp \ OTEL_METRICS_EXPORTER=otlp \ OTEL_LOGS_EXPORTER=otlp \ OTEL_EXPORTER_OTLP_PROTOCOL=http/protobuf \ OTEL_EXPORTER_OTLP_ENDPOINT=http://<IP_ADDRESS>:4318 \ OTEL_EXPORTER_OTLP_TRACES_ENDPOINT=http://<IP_ADDRESS>:4318/v1/traces \ OTEL_EXPORTER_OTLP_METRICS_ENDPOINT=http://<IP_ADDRESS>:4318/v1/metrics \ OTEL_EXPORTER_OTLP_LOGS_ENDPOINT=http://<IP_ADDRESS>:4318/v1/logs \ OTEL_METRIC_EXPORT_INTERVAL=15000-
JAVA_TOOL_OPTIONS:opentelemetry-javaagent.jarファイルの実際のパスに設定します。 -
エンドポイント設定:
http://<IP_ADDRESS>:4318の<IP_ADDRESS>を、Java アプリケーションからアクセス可能な Otel Collector サービスのエンドポイントの IP アドレスに置き換えます。 -
その他のパラメーターについては、properties-exporters をご参照ください。
-
ステップ 4:Java アプリケーションの起動とアクセス
-
プロジェクトのアプリケーションディレクトリで、次のコマンドを実行してアプリケーションを起動します。
この例では、プロジェクトのアプリケーションディレクトリは
../java-simple/appです。gradle assemble java -jar ./build/libs/app.jar -
ブラウザーで
http://<IP_ADDRESS>:8080/rolldiceにアクセスします。<IP_ADDRESS>を、Java アプリケーションが実行されているサーバーの IP アドレスに置き換えます。リクエストが成功すると、次の例に示すように、ページにランダムな数値が返されます。
5
ステップ 5:オブザーバビリティデータのクエリと分析
-
Cloud Database ClickHouse インスタンス詳細ページの左側のナビゲーションペインで、ワンストップ可観測 をクリックし、画面の指示に従ってサービスポータルを開きます。
-
メインページで、Java アプリケーションからのオブザーバビリティデータをクエリおよび分析します。
HyperDX の [検索] ページで、データソースを [otel_traces] に設定します。SQL クエリ
SELECT Timestamp, ServiceName as service, StatusCode as level, round(Duration / 1e6) as duration, SpanNameを入力し、ソート順を [Timestamp DESC] に設定します。左側の [フィルター] パネルで、[SpanName] (例:GET /rolldiceまたはPUBLISH) と [ServiceName] (例:appまたはlanggenius/dify) でフィルタリングします。結果テーブルには Timestamp、service、level、duration、SpanName などの列が表示され、サービス間のスパンのレイテンシー詳細を確認できます。