De forma predeterminada, el probe registra el historial de conversaciones durante las llamadas a LLM y agentes en un formato compatible con OpenTelemetry. Puede configurar cómo se recopilan y almacenan estos datos para sus aplicaciones de LLM.
El agente de ARMS admite tres modos para recopilar y registrar el historial de conversaciones:
Registrar el historial de conversaciones en los atributos de span (predeterminado).
Detener el registro del historial de conversaciones.
Registrar el historial de conversaciones en los registros.
Puede configurar el comportamiento de recopilación según sus necesidades.
Requisitos previos
Ha instalado Python probe o Java probe.
-
Python
Componente/Framework
Versiones compatibles
Escenarios
Versión del probe
OpenAI Python SDK
1.X
-
ChatCompletion
-
Completion
-
Embedding
2.0.0 o posterior
Java
Componente/Framework
Versiones compatibles
Escenarios
Versión del probe
OpenAI Java SDK
1.1.0 o posterior
-
ChatCompletion
-
Completion
-
Embedding
4.6.0 o posterior
Spring AI
1.0.0 o posterior
-
OpenAI ChatModel
-
ChatClient (Default)
-
ToolManager (Default)
4.6.0 o posterior
Spring AI Alibaba
1.0.0.3 o posterior
-
DashScope ChatModel
4.6.0 o posterior
-
Ejemplo
Este ejemplo muestra cómo un React agent realiza una llamada a herramienta. La LLM application envía una solicitud con una tool definition al large model, que responde con una solicitud tool_call. La aplicación ejecuta la llamada, devuelve el tool call result y el large model genera la respuesta final. El siguiente sequence diagram ilustra este proceso.

Registro del historial de diálogos en atributos de span
Comportamiento de recopilación y formato de datos
De forma predeterminada, el probe registra los mensajes de entrada, los mensajes de salida, las instrucciones del sistema y las definiciones de herramientas como JSON en los atributos de span.
|
Nombre del atributo |
Descripción |
Esquema |
Integridad del contenido |
|
|
mensajes de entrada |
Completo |
|
|
|
mensajes de salida |
Completo |
|
|
|
instrucciones del sistema |
Completo |
|
|
|
definiciones de herramientas |
- |
|
Configuración
-
Configure mediante las siguientes variables de entorno:
Nombre de la variable de entorno
Valor
OTEL_INSTRUMENTATION_GENAI_CAPTURE_MESSAGE_CONTENT
TrueOTEL_INSTRUMENTATION_GENAI_MESSAGE_CONTENT_CAPTURE_STRATEGY
"span-attributes" -
Para aplicaciones Java, también puede configurar esto con propiedades del sistema en el comando de inicio; por ejemplo:
-Dotel.instrumentation.genai.capture-message-content=true \ -Dotel.instrumentation.genai.message-content.capture-strategy=span-attributes
Ejemplo
GenAI client span 1
|
Atributo |
Valor |
|
nombre de span |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
GenAI client span 2
|
Atributo |
Valor |
|
nombre de span |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Deshabilitar la recopilación del historial de conversaciones
Comportamiento de recopilación y formato de datos
En este modo, el probe no registra los mensajes de entrada, los mensajes de salida ni las instrucciones del sistema. Para las definiciones de herramientas, solo se registra información básica en formato JSON.
|
Atributo |
Descripción |
Esquema |
Integridad del contenido |
|
|
mensajes de entrada |
No registrado |
|
|
|
mensajes de salida |
No registrado |
|
|
|
instrucciones del sistema |
No registrado |
|
|
|
definiciones de herramientas |
- |
|
Configuración
-
Establezca esta variable de entorno:
Nombre de la variable de entorno
Valor
OTEL_INSTRUMENTATION_GENAI_CAPTURE_MESSAGE_CONTENT
False -
Para aplicaciones Java, también puede agregar la siguiente propiedad del sistema al comando de inicio:
-Dotel.instrumentation.genai.capture-message-content=false
Ejemplo
GenAI Client Span 1
|
Atributo |
Valor |
|
nombre de span |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
GenAI Client Span 2
|
Atributo |
Valor |
|
nombre de span |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Registro del historial de conversaciones en registros
Comportamiento de recolección y formato de datos
En este modo, los atributos del span almacenan únicamente información básica. El agente escribe los datos detallados de la conversación (mensajes de entrada, mensajes de salida, instrucciones del sistema y definiciones de herramientas) en un archivo de registro local como entradas JSON de una sola línea.
|
Atributo |
Descripción |
Esquema |
Integridad del contenido |
|
|
mensajes de entrada |
Completo |
|
|
|
mensajes de salida |
Completo |
|
|
|
instrucciones del sistema |
Completo |
|
|
|
definiciones de herramientas |
- |
|
De forma predeterminada, cuando el agente se inicia, busca un directorio de registros disponible y verifica las siguientes ubicaciones en orden:
Si se especifica un directorio mediante la variable de entorno APSARA_APM_AGENT_WORKSPACE_DIR, el agente escribe los registros en el subdirectorio
.apsara-apm/{language}/logsdentro de dicho directorio.Directorio de registros del agente:
/home/admin/.opt/.apsara-apm/{language}/logsDirectorio principal:
~/.apsara-apm/{language}/{agent_version}_{agent_commit_id}/logs
Durante el inicio, el agente imprime el directorio de almacenamiento de registros en stdout. Para simplificar la gestión de directorios, especifique uno mediante la variable de entorno APSARA_APM_AGENT_WORKSPACE_DIR.
Picked up [/Uxxxs/tools/log/.apsara-apm/python] as Agent Workspace.
El archivo de registro del historial de conversaciones se denomina genai_messages_{ip}_{pid}.log. El tamaño máximo del archivo es de 256 MB. Al alcanzar este límite, se activa la rotación de archivos y solo se conservan los dos archivos de registro más recientes.
Configuración
-
Establezca las siguientes variables de entorno:
Variable de entorno
Valor
OTEL_INSTRUMENTATION_GENAI_CAPTURE_MESSAGE_CONTENT
TrueOTEL_INSTRUMENTATION_GENAI_MESSAGE_CONTENT_CAPTURE_STRATEGY
event -
Para aplicaciones Java, también puede agregar propiedades del sistema al comando de inicio. Por ejemplo:
-Dotel.instrumentation.genai.capture-message-content=true \ -Dotel.instrumentation.genai.message-content.capture-strategy=event
Ejemplo
GenAI Client Span 1
|
Atributo |
Valor |
|
nombre del span |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
GenAI Client Event 1
El spanId corresponde al 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 Client Span 2
|
Atributo |
Valor |
|
nombre del span |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
GenAI Client Event 2
El spanId corresponde al 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"
}
Envío del historial de conversaciones a SLS
Cuando el historial de conversaciones se registra en archivos locales, puede usar LoongCollector para recopilar y enviar los registros a Log Service (SLS) para su procesamiento.
Paso 1: Instalar LoongCollector
Si LoongCollector ya está instalado en su entorno, puede omitir este paso.
|
Tipo de entorno |
Referencia |
|
Linux |
|
|
Windows |
|
|
Kubernetes |
Paso 2: Crear la configuración de recolección
Inicie sesión en la consola de Log Service. Haga clic en el Project deseado, expanda el Logstore donde desea almacenar los registros y luego haga clic en el icono
junto a Data Import. En la sección JSON - Text Log, haga clic en Connect Now.-
Seleccione un machine group existente o cree uno para el host donde se almacenan los registros.
En Scenario, seleccione Host Scenario. En Installation Environment, seleccione ECS. En la lista Applied Machine Group, confirme que se haya agregado el grupo de máquinas deseado (por ejemplo,
genai). -
Cree una configuración de recolección. En Input Configuration, reemplace File Path con la ruta real de su directorio de registros. Para obtener la ruta del directorio, consulte la salida estándar de su aplicación durante el inicio. En Processing Configuration, seleccione el análisis JSON estándar.
Por ejemplo, establezca Configuration Name como
playground-test-config, seleccione Text Log Collection para Input Type, use un formato de ruta de archivo como/home/admin/logs/.apsara-apm/java/**/logs/genai_messages_*.logy configure Maximum Directory Monitoring Depth en1.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 Para habilitar la recuperación y el análisis de datos, configure los índices de la siguiente manera: Habilite Full-Text Index, pero deshabilite Case Sensitive e Include Chinese Characters. En Query on Specified Fields, agregue índices para los siguientes campos: attributes (tipo: json; habilite Case Sensitive e Include Chinese Characters), resource (tipo: json; habilite Case Sensitive e Include Chinese Characters), spanId (tipo: text; deshabilite Case Sensitive e Include Chinese Characters) y traceId (tipo: text; deshabilite Case Sensitive e Include Chinese Characters).
Para obtener más información sobre la recolección de registros, consulte Continuously collect text logs from hosts.
Paso 3: Consultar los registros recopilados en SLS
Después de completar la configuración inicial, los registros aparecen en Log Service (SLS) en unos minutos:
▼ 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: {}
Ajuste del límite de longitud de mensajes
El sondeo trunca el contenido de los mensajes que supera el límite predeterminado de 8192 caracteres por mensaje. Los mensajes truncados se marcan con el identificador ...[truncated], como se muestra a continuación:
[
{
"role": "assistant",
"parts": [
{
"type": "text",
"content": "The weather in Paris...[truncated]"
}
],
"finish_reason": "stop"
}
]
Configuración
-
Configure el límite mediante la siguiente variable de entorno:
Variable de entorno
Valor
OTEL_INSTRUMENTATION_GENAI_MESSAGE_CONTENT_MAX_LENGTH
8192
-
Para aplicaciones Java, también puede agregar una propiedad del sistema al comando de inicio. Por ejemplo:
-Dotel.instrumentation.genai.message-content.max-length=8192
Cuerpos de mensaje sujetos a truncamiento
|
Tipo de historial de conversaciones |
Mensaje |
|
|
TextPart.content |
|
|
TextPart.content |
|
|
TextPart.content |