すべてのプロダクト
Search
ドキュメントセンター

Simple Log Service:ACKクラスタ内のJavaアプリケーションとプロファイリングツールの統合

最終更新日:Sep 03, 2024

マイクロサービスアーキテクチャでは、OpenTelemetryは、分散システム内のサービス間で転送されるリクエストトレースをキャプチャできる強力なトレースフレームワークを提供します。 トレースは、リクエストフローとサービス間の依存関係を理解するために不可欠です。 ただし、マイクロサービスの内部パフォーマンスを分析する場合は、トレースのみを使用することはできません。 たとえば、サービスの応答速度が遅い場合やリクエストがタイムアウトした場合、トレースのみでは問題の根本原因を特定できない場合があります。 この場合、詳細なプロファイリングデータが必要です。

仕組み

image.jpeg

  1. プロファイリング設定に基づいて分析するトレースを特定します。 必要なトレースがキャプチャされると、拡張パッケージはJava Flight Recorder (JFR) プロファイリングタスクをトリガーして、メソッドの実行時間、メモリ使用量、CPU使用率などのプロファイリングデータをランタイムで収集します。

  2. Logtailは、収集したプロファイリングデータをSimple Log Serviceに送信します。 Simple Log Serviceでは、プロファイルデータをトレースIDに基づいてトレースに関連付けることができます。 これにより、Javaアプリケーションのパフォーマンスホットスポットを特定できます。

シナリオ

次の一覧では、プロファイルデータに基づいて問題の根本原因を特定できるシナリオについて説明します。 次に、Javaアプリケーションのパフォーマンスのボトルネックを特定できます。

  • 要求されるメモリサイズが大きいため、GC操作が頻繁に発生します

    Javaアプリケーションは、Java database Connectivity (JDBC) を使用してデータベーステーブルからデータを照会します。返されるデータの量に制限はありません。 テーブルのデータ量が多い場合、要求されるメモリサイズが大きく、ガベージコレクション (GC) 操作が頻繁に実行されます。 これにより、Javaアプリケーションのパフォーマンスが低下します。

    image

  • トレースインスツルメンテーションがまばらに追加され、CPUが長時間占有されているため、根本原因分析が困難です

    Javaアプリケーションのパフォーマンスに対するエージェントの影響を減らすために、コード行ごとにトレースインストルメンテーションは追加されません。 この場合、パフォーマンス分析では、トレースインストルメンテーションが追加されていない時間のかかるコードをカバーできません。 コードでパフォーマンスの問題が発生した場合、トレースに基づいて問題を特定するのが難しい場合があります。 たとえば、重要なコードスニペットにトレースインストルメンテーションを追加しない場合、トレースに基づいて関連するパフォーマンスの問題を特定することはできません。

    image

プロファイリングデータレシーバーのインストール

CRDテンプレートツールのインストール

移動方法

説明

CRDテンプレートツールをクラスター外にインストールする

CRDテンプレートツールをクラスター外にインストールする場合は、ログオンアカウントに ~/.kube/config設定ファイルが存在することを確認してください。 構成ファイルには、クラスターで管理操作を実行できる設定が含まれています。 kubectlコマンドを実行すると、関連する操作を実行できます。

CRDテンプレートツールをクラスターにインストールする

CRDテンプレートツールをコンテナーにインストールする場合、システムはalibaba-log-controllerという名前のインストール済みコンポーネントの権限に基づいてCRDを作成します。 ~/.kube/config構成ファイルが存在しない場合、またはネットワークの状態が悪いために接続障害が発生した場合は、この方法を使用してCRDテンプレートツールをインストールできます。

CRDテンプレートツールをクラスター外にインストール

  1. クラスターにログインし、CRDテンプレートツールをダウンロードします。

    • 中国

      curl https://logtail-release-cn-hangzhou.oss-cn-hangzhou.aliyuncs.com/kubernetes/crd-tool.tar.gz -o /tmp/crd-tool.tar.gz
    • 中国国外

      curl https://logtail-release-ap-southeast-1.oss-ap-southeast-1.aliyuncs.com/kubernetes/crd-tool.tar.gz -o /tmp/crd-tool.tar.gz
  2. CRDテンプレートツールをインストールします。 ツールをインストールすると、crdテンプレートツールがインストールされているフォルダーにsls-CRD-toolが生成されます。

    tar -xvf /tmp/crd-tool.tar.gz -C /tmp &&chmod 755 /tmp/crd-tool/install.sh  && sh -x  /tmp/crd-tool/install.sh
  3. を実行します。Run the. /sls-crd-ツールリストコマンドを実行して、ツールがインストールされているかどうかを確認します。 値が返されると、ツールがインストールされます。

CRDテンプレートツールのコンテナーへのインストール

  1. クラスターにログインし、alibaba-Log-controllerコンテナーにアクセスします。

    kubectl get pods -n kube-system -o wide |grep alibaba-log-controller | awk -F ' ' '{print $1}'
    kubectl exec -it {pod} -n kube-system bash
    cd ~
  2. CRDテンプレートツールをダウンロードします。

    • インターネット経由でクラスター内のリソースをダウンロードできる場合は、次のいずれかのコマンドを実行してCRDテンプレートツールをダウンロードします。

      • 中国

        curl https://logtail-release-cn-hangzhou.oss-cn-hangzhou.aliyuncs.com/kubernetes/crd-tool.tar.gz -o /tmp/crd-tool.tar.gz
      • 中国国外

        curl https://logtail-release-ap-southeast-1.oss-ap-southeast-1.aliyuncs.com/kubernetes/crd-tool.tar.gz -o /tmp/crd-tool.tar.gz
    • インターネット経由でクラスター内のリソースをダウンロードできない場合は、クラスター外にCRDテンプレートツールをダウンロードできます。 次に、kubectl cp <source> <destination> コマンドを実行するか、ACKのファイルアップロード機能を使用してCRDテンプレートツールをコンテナーにアップロードします。

  3. CRDテンプレートツールをインストールします。 ツールをインストールすると、crdテンプレートツールがインストールされているフォルダーにsls-CRD-toolが生成されます。

    tar -xvf /tmp/crd-tool.tar.gz -C /tmp &&chmod 755 /tmp/crd-tool/install.sh  && sh -x  /tmp/crd-tool/install.sh
  4. を実行します。Run the. /sls-crd-ツールリストコマンドを実行して、ツールがインストールされているかどうかを確認します。 値が返されると、ツールがインストールされます。

プロファイリングデータレシーバーのインストール

  1. . /sls-crd-tool -lのリストコマンドを実行します。

    image

  2. . /sls-crd-tool -i get -- project ${project} -- instance ${instance} profiling-receiverコマンドを実行します。

    1. ${project}: Full-stack Observabilityインスタンスが属するプロジェクト。

    2. ${instance}: Full-stack ObservabilityインスタンスのID。

  3. を実行します。Run the. /sls-crd-tool apply -f template-profiling-receiver.yamlコマンドを実行します。

Javaアプリケーションに対する操作の実行

プロファイリング拡張パッケージのインストール

  1. OpenTelemetry Java Agentをダウンロードします。

  2. otel-sls-extensionをダウンロードします。

  3. profiling_config.yamlという名前の設定ファイルを作成します。 構成ファイルに基づいて10個のトレースが収集されます。

    enabled: true
    maxProfilingCount: 10
    profilingIntervalMillis: 5000
    agentConfigs:
       agent.upload.server: "http://	
    logtail-statefulset.kube-system:4040"
       agent.timeout: 10
       agent.ingest.max.tries: 2
       agent.log.level: off
       agent.log.file: ""
       period: 20
       cpu.engine: async_profiler
       wallclock.engine: async_profiler
       alloc.engine: async_profiler

    次の表に、設定ファイルのパラメーターを示します。

    パラメーター

    説明

    必須

    デフォルト値

    enabled

    プロファイリングを有効にするかどうかを指定します。

    課金されます

    false

    maxProfilingCount

    同時に実行できるプロファイリングタスクの最大数。

    課金されません

    10

    profilingIntervalMillis

    プロファイリングタスクがトリガーされる間隔。

    課金されません

    5000

    agentConfigs

    プロファイリングエージェントの設定。

    課金されません

    agent.upload.server

    プロファイリングデータの受信者アドレス。

    課金されません

    http:// localhost:4040

    agent.timeout

    プロファイリングデータのアップロードのタイムアウト期間。 単位は秒です。

    課金されません

    10

    agent.ingest.max.tries

    プロファイリングデータのアップロードに許可される再試行の最大数。

    ×

    2

    agent.log.level

    プロファイリングエージェントのログレベル。

    課金されません

    off

    agent.log.file

    プロファイリングエージェントのログファイルへのパス。

    課金されません

    period

    プロファイリングデータがアップロードされる間隔。 単位は秒です。

    課金されません

    20

    cpu.engine

    収集に使用されるCPUエンジン。 auto/async_profiler/jfr/offがサポートされています。

    課金されません

    off

    wallclock.engine

    コレクションに使用されるwallclockエンジン。 auto/async_profiler/offがサポートされています。

    課金されません

    off

    alloc.engine

    収集に使用されるallocエンジン。 auto/async_profiler/jfr/offがサポートされています。

    課金されません

    off

    profilingRules

    プロファイリングルールの設定。

    課金されません

    profilingRules.name

    プロファイリングルールの名前。

    課金されます

    profilingRules.type

    プロファイリングルールのタイプ。 ROOT_SPAN、AGENT_RESOURCE、およびSPAN_NAMEがサポートされています。

    課金されます

    profilingRules.attributes

    プロファイリングルールの属性。 このパラメーターの有効な値は、プロファイリングルールのタイプによって異なります。

    課金されません

Javaアプリケーションの起動

java -javaagent:/path/to/opentelemetry-javaagent-all.jar \
     -Dotel.service.name=test-demo \
     -Dotel.javaagent.extensions=/path/to/otel-extension.jar \
     -Dotel.profiling.config_endpoint=file:/path/to/profiling_config.yaml \
     -Dotel.service.name=trace-profiling-demo \
     -jar myapp.jar

プロファイリングデータの表示

プロファイルデータを表示するには、Full-stack Observabilityインスタンスにアクセスし、関連するサービスをクリックします。

設定例

プロファイリング用にすべてのルートスパンを設定します。

enabled: true
maxProfilingCount: 10
profilingIntervalMillis: 5000
agentConfigs:
  agent.upload.server: "http://localhost:4040"
  agent.timeout: 10
  agent.ingest.max.tries: 2
  agent.log.level: off
  agent.log.file: ""
  period: 20
  cpu.engine: async_profiler
  wallclock.engine: async_profiler
  alloc.engine: async_profiler
profilingRules:
  - name: "profiling root span"
    type: ROOT_SPAN

サービス名がプロファイリングの支払いであるルートスパンを設定します。

enabled: true
maxProfilingCount: 10
profilingIntervalMillis: 5000
agentConfigs:
  agent.upload.server: "http://localhost:4040"
  agent.timeout: 10
  agent.ingest.max.tries: 2
  agent.log.level: off
  agent.log.file: ""
  period: 20
  cpu.engine: async_profiler
  wallclock.engine: async_profiler
  alloc.engine: async_profiler
profilingRules:
  - name: "profiling root span"
    type: ROOT_SPAN
  - name: "profiling all spans with some resouce attribute"
    type: AGENT_RESOURCE
    attributes:
      service.name: "payment" # In this example, specify spans whose service name is payment for collection.

サービス名が支払いであり、名前がGetで始まるスパンをプロファイリング用に設定します。

enabled: true
maxProfilingCount: 10
profilingIntervalMillis: 5000
agentConfigs:
   agent.upload.server: "http://localhost:4040"
   agent.timeout: 10
   agent.ingest.max.tries: 2
   agent.log.level: off
   agent.log.file: ""
   period: 20
   cpu.engine: async_profiler
   wallclock.engine: async_profiler
   alloc.engine: async_profiler
profilingRules:
   - name: "profiling all spans with some resouce attribute"
     type: AGENT_RESOURCE
     attributes:
        service.name: "payment" # In this example, specify spans whose service name is payment for collection.
   - name: "profiling with span name"
     type: SPAN_NAME
     attributes:
        pattern: "Get*" # You can use a regular expression to specify the name of a span.