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

プロファイリング設定に基づいて分析するトレースを特定します。 必要なトレースがキャプチャされると、拡張パッケージはJava Flight Recorder (JFR) プロファイリングタスクをトリガーして、メソッドの実行時間、メモリ使用量、CPU使用率などのプロファイリングデータをランタイムで収集します。
Logtailは、収集したプロファイリングデータをSimple Log Serviceに送信します。 Simple Log Serviceでは、プロファイルデータをトレースIDに基づいてトレースに関連付けることができます。 これにより、Javaアプリケーションのパフォーマンスホットスポットを特定できます。
シナリオ
次の一覧では、プロファイルデータに基づいて問題の根本原因を特定できるシナリオについて説明します。 次に、Javaアプリケーションのパフォーマンスのボトルネックを特定できます。
要求されるメモリサイズが大きいため、GC操作が頻繁に発生します
Javaアプリケーションは、Java database Connectivity (JDBC) を使用してデータベーステーブルからデータを照会します。返されるデータの量に制限はありません。 テーブルのデータ量が多い場合、要求されるメモリサイズが大きく、ガベージコレクション (GC) 操作が頻繁に実行されます。 これにより、Javaアプリケーションのパフォーマンスが低下します。

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

プロファイリングデータレシーバーのインストール
CRDテンプレートツールのインストール
移動方法 | 説明 |
CRDテンプレートツールをクラスター外にインストールする | CRDテンプレートツールをクラスター外にインストールする場合は、ログオンアカウントに |
CRDテンプレートツールをクラスターにインストールする | CRDテンプレートツールをコンテナーにインストールする場合、システムは |
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テンプレートツールをインストールします。 ツールをインストールすると、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を実行します。Run the
. /sls-crd-ツールリストコマンドを実行して、ツールがインストールされているかどうかを確認します。 値が返されると、ツールがインストールされます。
CRDテンプレートツールのコンテナーへのインストール
クラスターにログインし、
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 ~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テンプレートツールをコンテナーにアップロードします。
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を実行します。Run the
. /sls-crd-ツールリストコマンドを実行して、ツールがインストールされているかどうかを確認します。 値が返されると、ツールがインストールされます。
プロファイリングデータレシーバーのインストール
. /sls-crd-tool -lのリストコマンドを実行します。
. /sls-crd-tool -i get -- project ${project} -- instance ${instance} profiling-receiverコマンドを実行します。${project}: Full-stack Observabilityインスタンスが属するプロジェクト。
${instance}: Full-stack ObservabilityインスタンスのID。
を実行します。Run the
. /sls-crd-tool apply -f template-profiling-receiver.yamlコマンドを実行します。
Javaアプリケーションに対する操作の実行
プロファイリング拡張パッケージのインストール
OpenTelemetry Java Agentをダウンロードします。
otel-sls-extensionをダウンロードします。
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
プロファイリングデータの受信者アドレス。
課金されません
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.