デフォルトでは、プローブは LLM およびエージェント呼び出し時の会話履歴を記録し、そのコンテンツを OpenTelemetry 仕様に従ってフォーマットします。このドキュメントでは、LLM アプリケーションにおけるこのデータ収集の設定方法について説明します。
ARMS エージェントは、会話履歴を収集・記録するための 3 つのモードをサポートしています。
-
スパン属性に会話履歴を記録します (デフォルト)。
-
会話履歴の記録を停止します。
-
ログに会話履歴を記録します。
要件に応じて、LLM アプリケーションの会話履歴の収集動作を設定できます。
前提条件
-
Python プローブ または Java プローブ がインストールされていること。
-
Python
コンポーネント/フレームワーク
対応バージョン
シナリオ
プローブバージョン
OpenAI Python SDK
1.X
-
ChatCompletion
-
Completion
-
Embedding
2.0.0 以降
Java
コンポーネント/フレームワーク
対応バージョン
シナリオ
プローブバージョン
OpenAI Java SDK
1.1.0 以降
-
ChatCompletion
-
Completion
-
Embedding
4.6.0 以降
Spring AI
1.0.0 以降
-
OpenAI ChatModel
-
ChatClient (デフォルト)
-
ToolManager (デフォルト)
4.6.0 以降
Spring AI Alibaba
1.0.0.3 以降
-
DashScope ChatModel
4.6.0 以降
-
例
この例では、React エージェント が 関数 を使用してツール呼び出しを実行する方法を示します。まず、LLM アプリケーション は ツール定義 を指定して 大規模モデル を呼び出します。モデル は tool_call リクエストを返します。アプリケーションはこのリクエストを実行し、ツール呼び出し結果 を 大規模モデル に返します。それを受けて、大規模モデルは最終結果を生成します。次の シーケンス図 に、このプロセスを示します。

スパン属性への対話履歴の記録
収集動作とデータ形式
デフォルトでは、プローブは入力メッセージ、出力メッセージ、システムインストラクション、およびツール定義を JSON 形式でスパン属性に記録します。
|
属性名 |
説明 |
スキーマ |
コンテンツの完全性 |
|
|
入力メッセージ |
完全 |
|
|
|
出力メッセージ |
完全 |
|
|
|
システムインストラクション |
完全 |
|
|
|
ツール定義 |
- |
|
設定
-
次の環境変数を使用して設定します。
環境変数名
値
OTEL_INSTRUMENTATION_GENAI_CAPTURE_MESSAGE_CONTENT
TrueOTEL_INSTRUMENTATION_GENAI_MESSAGE_CONTENT_CAPTURE_STRATEGY
"span-attributes" -
Java アプリケーションの場合は、起動コマンドでシステムプロパティを使用して設定することもできます。例:
-Dotel.instrumentation.genai.capture-message-content=true \ -Dotel.instrumentation.genai.message-content.capture-strategy=span-attributes
例
GenAI クライアントスパン 1
|
属性 |
値 |
|
スパン名 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
GenAI クライアントスパン 2
|
属性 |
値 |
|
スパン名 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
会話履歴収集の無効化
収集の挙動とデータフォーマット
このモードでは、プローブは入力メッセージ、出力メッセージ、またはシステムインストラクションの詳細な内容を記録しません。ツール定義については、プローブは基本情報のみを JSON フォーマットで記録します。
|
属性 |
説明 |
スキーマ |
コンテンツの完全性 |
|
|
入力メッセージ |
記録されません |
|
|
|
出力メッセージ |
記録されません |
|
|
|
システムインストラクション |
記録されません |
|
|
|
ツール定義 |
- |
|
設定
-
次の環境変数を設定します。
環境変数名
値
OTEL_INSTRUMENTATION_GENAI_CAPTURE_MESSAGE_CONTENT
False -
Java アプリケーションの場合、次のシステムプロパティを起動コマンドに追加することもできます。
-Dotel.instrumentation.genai.capture-message-content=false
例
GenAI クライアントスパン 1
|
属性 |
値 |
|
スパン名 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
GenAI クライアントスパン 2
|
属性 |
値 |
|
スパン名 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
会話履歴のログ記録
収集の挙動とデータフォーマット
このモードでは、スパンの属性には基本情報のみが格納されます。エージェントは、入力メッセージ、出力メッセージ、システム指示、ツール定義などの詳細情報を、単一行の JSON エントリとしてローカルのログファイルに書き込みます。
|
属性 |
説明 |
スキーマ |
コンテンツの完全性 |
|
|
入力メッセージ |
完全 |
|
|
|
出力メッセージ |
完全 |
|
|
|
システム指示 |
完全 |
|
|
|
ツール定義 |
- |
|
デフォルトでは、エージェントが起動すると、次の場所を順に確認して、利用可能なログディレクトリを検索します:
-
APSARA_APM_AGENT_WORKSPACE_DIR 環境変数を使用してディレクトリが指定されている場合、エージェントはそのディレクトリ内の
.apsara-apm/{language}/logsサブディレクトリにログを書き込みます。 -
エージェントログディレクトリ:
/home/admin/.opt/.apsara-apm/{language}/logs -
ホームディレクトリ:
~/.apsara-apm/{language}/{agent_version}_{agent_commit_id}/logs
アプリケーションが起動すると、エージェントはログストレージディレクトリを示すメッセージを標準出力に出力します。ディレクトリ管理を容易にするために、APSARA_APM_AGENT_WORKSPACE_DIR 環境変数を使用してディレクトリを指定することを推奨します。
Picked up [/Uxxxs/tools/log/.apsara-apm/python] as Agent Workspace.
会話履歴ログファイルは、genai_messages_{ip}_{pid}.log というフォーマットで命名されます。最大ファイルサイズは 256 MB です。このサイズを超えると、ファイルローテーションが実行されます。システムは最新の 2 つのログファイルのみを保持し、古いものは削除します。
設定
-
次の環境変数を設定してください:
環境変数
値
OTEL_INSTRUMENTATION_GENAI_CAPTURE_MESSAGE_CONTENT
TrueOTEL_INSTRUMENTATION_GENAI_MESSAGE_CONTENT_CAPTURE_STRATEGY
event -
Java アプリケーションの場合、起動コマンドにシステムプロパティーを追加してこれを設定することもできます。例:
-Dotel.instrumentation.genai.capture-message-content=true \ -Dotel.instrumentation.genai.message-content.capture-strategy=event
例
GenAI クライアントスパン 1
|
属性 |
値 |
|
スパン名 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
GenAI クライアントイベント 1
spanId は GenAI Client Span 1 に対応します。
{
"scope": {
"name": "aliyun.instrumentation.openai",
"version": "1.0.1"
},
"timeUnixNano": 1760080084146812928,
"severity": "UNSPECIFIED",
"attributes": {
"event.name": "gen_ai.client.inference.operation.details",
"gen_ai.provider.name": "openai",
"gen_ai.operation.name": "chat",
"gen_ai.request.model": "gpt-4",
"gen_ai.request.max_tokens": 200,
"gen_ai.request.top_p": 1.0,
"gen_ai.response.id": "chatcmpl-9J3uIL87gldCFtiIbyaOvTeYBRA3l",
"gen_ai.response.model": "gpt-4-0613",
"gen_ai.usage.output_tokens": 17,
"gen_ai.usage.input_tokens": 47,
"gen_ai.response.finish_reasons": ["tool_calls"],
"gen_ai.input.messages": "[{\"role\":\"user\",\"parts\":[{\"type\":\"text\",\"content\":\"Weather in Paris?\"}]}]",
"gen_ai.output.messages": "[{\"role\":\"assistant\",\"parts\":[{\"type\":\"tool_call\",\"id\":\"call_VSPygqKTWdrhaFErNvMV18Yl\",\"name\":\"get_weather\",\"arguments\":{\"location\":\"Paris\"}}],\"finish_reason\":\"tool_call\"}]",
"gen_ai.tool.definitions": "[{\"type\":\"function\",\"name\":\"get_weather\",\"description\":\"Get the current temperature for a specific location.\"}]"
},
"traceId": "0b46a347592ac487ed092ebe802c6818",
"spanId": "b3c40af8cd1a522c"
}
GenAI クライアントスパン 2
|
属性 |
値 |
|
スパン名 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
GenAI クライアントイベント 2
spanId は GenAI Client Span 2 に対応します。
{
"scope": {
"name": "aliyun.instrumentation.openai",
"version": "1.0.1"
},
"timeUnixNano": 1760080084176812928,
"severity": "UNSPECIFIED",
"attributes": {
"event.name": "gen_ai.client.inference.operation.details",
"gen_ai.provider.name": "openai",
"gen_ai.operation.name": "chat",
"gen_ai.request.model": "gpt-4",
"gen_ai.request.max_tokens": 200,
"gen_ai.request.top_p": 1.0,
"gen_ai.response.id": "chatcmpl-VSPygqKTWdrhaFErNvMV18Yl",
"gen_ai.response.model": "gpt-4-0613",
"gen_ai.usage.output_tokens": 52,
"gen_ai.usage.input_tokens": 97,
"gen_ai.response.finish_reasons": ["stop"],
"gen_ai.input.messages": "[{\"role\":\"user\",\"parts\":[{\"type\":\"text\",\"content\":\"Weather in Paris?\"}]},{\"role\":\"assistant\",\"parts\":[{\"type\":\"tool_call\",\"id\":\"call_VSPygqKTWdrhaFErNvMV18Yl\",\"name\":\"get_weather\",\"arguments\":{\"location\": \"Paris\"}}]},{\"role\":\"tool\",\"parts\":[{\"type\":\"tool_call_response\",\"id\":\"call_VSPygqKTWdrhaFErNvMV18Yl\",\"response\":\"rainy, 57°F\"}]}]",
"gen_ai.output.messages": "[{\"role\":\"assistant\",\"parts\":[{\"type\":\"text\",\"content\":\"The weather in Paris is currently rainy with a temperature of 57°F.\"}],\"finish_reason\":\"stop\"}]"
},
"traceId": "0b46a347592ac487ed092ebe802c6818",
"spanId": "0a706a178bd746c5"
}
会話履歴の SLS への送信
会話履歴をローカルログに記録するモードでは、LoongCollector を使用してローカルログを収集し、処理のために Log Service (SLS) に送信できます。
ステップ 1:LoongCollector のインストール
環境に LoongCollector が既にインストールされている場合は、このステップを省略できます。
|
[環境タイプ] |
[参照] |
|
Linux |
|
|
Windows |
|
|
Kubernetes |
ステップ 2:収集設定の作成
-
Log Service コンソールにログインします。対象のプロジェクトをクリックし、ログを保存する Logstore を展開してから、 [データインポート] の横にある
アイコンをクリックします。 [JSON - テキストログ] セクションで、 Connect Now をクリックします。 -
既存のマシングループを選択するか、ログが保存されているホスト用に新しいマシングループを作成します。
[シナリオ] では [ホストシナリオ] を選択します。[インストール環境] では [ECS] を選択します。[適用されたマシングループ] リストで、対象のマシングループ (例:
genai) が追加されていることを確認します。 -
収集設定を作成します。 [入力設定] で、 [ファイルパス] を実際のログディレクトリに置き換えます。ディレクトリパスを確認するには、起動時のアプリケーションの標準出力を確認してください。 [処理設定] では、標準 JSON 解析を選択します。
たとえば、 [設定名] を
playground-test-configに設定し、 [入力タイプ] で [テキストログ収集] を選択し、/home/admin/logs/.apsara-apm/java/**/logs/genai_messages_*.logのようなファイルパス形式を使用し、 [最大ディレクトリモニタリング深さ] を1に設定します。xxx Picked up /home/admin/logs/.apsara-apm/java/4.6.0_4e280e61/ as Agent Workspace. Unable to locate the -XX:ErrorFile parameter in the JVM options. If you are using Kubernetes, we recommend updating ack-onepilot to version 3.2.3 or later. For other environments, please consider adding the following parameters manually: -XX:ErrorFile=/{JavaAgentDirectory}/hs_err_pid%p.log -XX:OnError=/{JavaAgentDirectory}/crash_log_collector.sh These settings will enable automatic crash log collection to ARMS, helping us monitor incidents and provide timely feedback. Please note that this reminder does not affect the functionality of ARMS. If you prefer not to make these changes, feel free to disregard this message. Apsara Java Agent start cost: 5071 ms -
データの取得と分析を有効にするには、次のようにインデックスを設定します:
[フルテキストインデックス] を有効にしますが、 [大文字と小文字の区別] と [中国語文字を含める] は無効にします。[指定フィールドでのクエリ] で、次のフィールドのインデックスを追加します: [属性] (タイプ:json。[大文字と小文字の区別] と [中国語文字を含める] を有効にします)、 [リソース] (タイプ:json。[大文字と小文字の区別] と [中国語文字を含める] を有効にします)、 [spanId] (タイプ:text。[大文字と小文字の区別] と [中国語文字を含める] を無効にします)、 [traceId] (タイプ:text。[大文字と小文字の区別] と [中国語文字を含める] を無効にします)。
ログ収集の詳細については、ホストからテキストログを継続的に収集するをご参照ください。
ステップ 3:SLS で収集されたログの表示
初期設定が完了すると、数分以内に SLS にログが表示されます。
▼ attributes: {}
event.name: "gen_ai.client.inference.operation.details"
gen_ai.input.messages: "[{"role":"system","parts":[{"type":"text","content":"
xxx
xxx
xxx
:
xxx
xxx"}]},{"role":"user","parts":[{"type":"text","content":"xxx"}]}]"
gen_ai.operation.name: "invoke_agent"
gen_ai.output.messages: "[{"role":"assistant","parts":[{"type":"text","content":"
xxx
"}],"finishReason":"stop"}]"
gen_ai.provider.name: "spring-ai"
gen_ai.request.model: "qwen-max"
gen_ai.request.temperature: 0.8
► gen_ai.response.finish_reasons: []
gen_ai.response.id: "0d98f.xxx"
gen_ai.tool.definitions: "[{"type":"function","name":"getBookingDetails"},{"type":"function","name":"cancelBooking"},{"type":"function","name":"changeBooking"}]"
gen_ai.usage.input_tokens: 1300
gen_ai.usage.output_tokens: 59
body:
▼ resource: {}
► attributes: {}
メッセージ長の制限の調整
過剰な使用量を防ぐため、プローブはメッセージあたり 8192 文字のデフォルト上限を超えるメッセージ内容を切り捨てます。切り捨てられたメッセージには、次の例のように ...[truncated] 識別子が付きます:
[
{
"role": "assistant",
"parts": [
{
"type": "text",
"content": "The weather in Paris...[truncated]"
}
],
"finish_reason": "stop"
}
]
設定
-
次の環境変数を使用して上限を設定します:
環境変数
値
OTEL_INSTRUMENTATION_GENAI_MESSAGE_CONTENT_MAX_LENGTH
8192
-
Java アプリケーションの場合は、起動コマンドにシステムプロパティを追加して、この上限を設定することもできます。例:
-Dotel.instrumentation.genai.message.content.max.length=8192
切り捨て対象のメッセージ本文
|
会話履歴タイプ |
メッセージ |
|
|
TextPart.content |
|
|
TextPart.content |
|
|
TextPart.content |