Наблюдаемость с OpenTelemetry
Узнайте, как включить и настроить OpenTelemetry для Qwen Code.
- Наблюдаемость с OpenTelemetry
Примечания к миграции
-
Имя
tool_output_truncatedбыло изменено наqwen-code.tool_output_truncatedдля согласованности неймспейсов — системам-потребителям, фильтрующим по старому имени, следует обновить свои запросы. -
В документации к гистограмме
tool.call.latencyранее указывался атрибутdecision— этот атрибут никогда не устанавливался для гистограммы (записывается толькоfunction_name). Счетчикtool.call.countпо-прежнему включаетdecision. -
В документации к событию лога
qwen-code.file_operationи метрикеfile.operation.countранее указывались атрибуты diff-stat (model_added_lines,model_removed_lines,user_added_lines,user_removed_lines) — они никогда не устанавливались ни для того, ни для другого. Данные diff-stat доступны через атрибутmetadataсобытия логаtool_call.
Ключевые преимущества
- 🔍 Аналитика использования: Понимание паттернов взаимодействия и внедрения функций в вашей команде
- ⚡ Мониторинг производительности: Отслеживание времени отклика, потребления токенов и использования ресурсов
- 🐛 Отладка в реальном времени: Выявление узких мест, сбоев и паттернов ошибок по мере их возникновения
- 📊 Оптимизация рабочих процессов: Принятие обоснованных решений для улучшения конфигураций и процессов
- 🏢 Корпоративное управление: Мониторинг использования в командах, отслеживание затрат, обеспечение соответствия требованиям и интеграция с существующей инфраструктурой мониторинга
Интеграция с OpenTelemetry
Система наблюдаемости Qwen Code построена на базе OpenTelemetry — независимого от вендоров отраслевого стандарта фреймворка наблюдаемости — и предоставляет:
- Универсальная совместимость: Экспорт в любой бэкенд OpenTelemetry (Aliyun, Jaeger, Prometheus, Datadog и т. д.)
- Стандартизированные данные: Использование согласованных форматов и методов сбора во всем вашем инструментарии
- Интеграция, ориентированная на будущее: Подключение к существующей и будущей инфраструктуре наблюдаемости
- Отсутствие привязки к вендору: Переключение между бэкендами без изменения инструментации
Конфигурация
Все поведение телеметрии управляется через ваш файл .qwen/settings.json. Эти настройки могут быть переопределены переменными окружения или флагами CLI.
| Настройка | Переменная окружения | Флаг CLI | Описание | Значения | По умолчанию |
|---|---|---|---|---|---|
enabled | QWEN_TELEMETRY_ENABLED | --telemetry / --no-telemetry | Включить или отключить телеметрию | true/false | false |
target | QWEN_TELEMETRY_TARGET | --telemetry-target <local|gcp> (устарело) | Информационная метка назначения; не управляет маршрутизацией экспортера — установите otlpEndpoint или outfile, чтобы настроить, куда отправляются данные | "gcp"/"local" | "local" |
otlpEndpoint | QWEN_TELEMETRY_OTLP_ENDPOINT | --telemetry-otlp-endpoint <URL> | Эндпоинт OTLP-коллектора | URL string | http://localhost:4317 |
otlpProtocol | QWEN_TELEMETRY_OTLP_PROTOCOL | --telemetry-otlp-protocol <grpc|http> | Транспортный протокол OTLP | "grpc"/"http" | "grpc" |
otlpTracesEndpoint | QWEN_TELEMETRY_OTLP_TRACES_ENDPOINT | - | Переопределение эндпоинта для каждого сигнала для трейсов (только HTTP) | URL string | - |
otlpLogsEndpoint | QWEN_TELEMETRY_OTLP_LOGS_ENDPOINT | - | Переопределение эндпоинта для каждого сигнала для логов (только HTTP) | URL string | - |
otlpMetricsEndpoint | QWEN_TELEMETRY_OTLP_METRICS_ENDPOINT | - | Переопределение эндпоинта для каждого сигнала для метрик (только HTTP) | URL string | - |
outfile | QWEN_TELEMETRY_OUTFILE | --telemetry-outfile <path> | Сохранение телеметрии в файл (переопределяет экспорт OTLP) | file path | - |
logPrompts | QWEN_TELEMETRY_LOG_PROMPTS | --telemetry-log-prompts / --no-telemetry-log-prompts | Включать промпты в логи телеметрии | true/false | true |
userId | QWEN_TELEMETRY_USER_ID | - | Стабильный идентификатор конечного пользователя, записываемый в спаны GenAI как расширение ARMS gen_ai.user.id; предпочтительно псевдонимное значение | string | - |
includeSensitiveSpanAttributes | QWEN_TELEMETRY_INCLUDE_SENSITIVE_SPAN_ATTRIBUTES | - | Включать стандартные сообщения GenAI, инструкции, определения инструментов, аргументы инструментов и успешные результаты инструментов как нативные атрибуты спанов | true/false | false |
sensitiveSpanAttributeMaxLength | QWEN_TELEMETRY_SENSITIVE_SPAN_ATTRIBUTE_MAX_LENGTH | - | Максимальная длина JavaScript-строки для полезной нагрузки каждого чувствительного нативного атрибута спана. Установите меньшее значение, если ваш бэкенд отклоняет большие атрибуты. | 1..104857600 | 1048576 |
resourceAttributes | OTEL_RESOURCE_ATTRIBUTES (+ OTEL_SERVICE_NAME) | - | Статические атрибуты ресурсов, прикрепляемые к каждому экспортируемому спану / логу / метрике. См. Атрибуты ресурсов ниже. | key=value,… | {} |
metrics.includeSessionId | QWEN_TELEMETRY_METRICS_INCLUDE_SESSION_ID | - | Включать session.id в точки данных метрик. Отключено по умолчанию для защиты бэкендов метрик от разрастания временных рядов. | true/false | false |
Примечание о булевых переменных окружения: Для булевых настроек (enabled, logPrompts, includeSensitiveSpanAttributes) установка соответствующей переменной окружения в true или 1 включит функцию. Любое другое значение отключит её.
Примечание о целочисленных переменных окружения: QWEN_TELEMETRY_SENSITIVE_SPAN_ATTRIBUTE_MAX_LENGTH должно быть положительным целым числом при установке. Неверные значения приводят к сбою разрешения конфигурации телеметрии вместо тихого отката.
gen_ai.tool.description — это нечувствительная статическая метаданные реестра и выдается независимо от includeSensitiveSpanAttributes. Это включает описания, предоставленные MCP-серверами и другими поставщиками инструментов рабочего пространства. Значение ограничено 4096 единицами UTF-16 и никогда не включает детали динамического вызова.
Чувствительные атрибуты спанов: Когда includeSensitiveSpanAttributes включен, происходят две вещи:
-
Нативные атрибуты спанов содержат стандартный JSON OpenTelemetry GenAI:
- Входные сообщения основного агента и LLM (
gen_ai.input.messages) - Системные инструкции (
gen_ai.system_instructions) - Определения инструментов (
gen_ai.tool.definitions) - Выходные сообщения основного агента и LLM (
gen_ai.output.messages) - Финальные выполненные аргументы вызова инструмента (
gen_ai.tool.call.arguments) - Успешные результаты инструментов (
gen_ai.tool.call.result) - Спаны взаимодействия сохраняют совместимостный атрибут
new_context.
Входные данные основного агента — это одна исходная проекция пользовательского текста до расширения контекста, а выходные данные основного агента — это один финальный видимый пользователю ответ после завершения всей работы инструментов и продолжений. Значения LLM по-прежнему поступают из финальных объектов запроса SDK провайдера и сырых ответов провайдера, поэтому их вход может включать историю, расширенные файлы, системные инструкции и результаты инструментов, а их выход может включать каждого кандидата провайдера. Значения инструментов поступают из финальных параметров вызова и успешного ориентированного на модель результата. Каждое стандартное значение GenAI представляет собой компактный JSON и должно быть полным и соответствовать схеме. Значение, которое недействительно, циклически или длиннее
sensitiveSpanAttributeMaxLength, пропускается целиком; JSON никогда не усекается, и не выдается метаданных предварительного просмотра, хеша или усечения. Специфичный для взаимодействия атрибутnew_contextсохраняет свое существующее поведение усечения. Максимум по умолчанию составляет 1 МиБ (1048576) на атрибут, а принятый диапазон —1..104857600(100 МиБ). Лимит измеряется как длина JavaScript-строки, а не байты UTF-8. Поэтому не-ASCII контент может занимать больше байт после экспорта OTLP. - Входные сообщения основного агента и LLM (
-
Спаны моста log-to-span (используются, когда HTTP-трейсы экспортируются без эндпоинта логов) сохраняют свои существующие поля
prompt,function_argsиresponse_textвместо того, чтобы быть отброшенными.
⚠️ Предупреждение о безопасности: включение этого флага передает полную историю разговоров, содержимое файлов, прочитанное с помощью read_file, shell-команды и их вывод (включая секреты в переменных окружения или аргументах), а также ответы модели на настроенный OTLP-бэкенд. Относитесь к бэкенду как к привилегированному хранилищу данных. По умолчанию флаг установлен в false.
Стоимость / размер полезной нагрузки: При лимите по умолчанию один спан LLM может нести максимум около 4 МиБ через вход, выход, системные инструкции и определения инструментов; один спан инструмента может нести около 2 МиБ через аргументы и результат; одно взаимодействие может нести около 3 МиБ через вход агента, выход агента и совместимостный new_context. Это ограничение на стороне приложения Qwen Code, а не гарантия того, что каждый коллектор или бэкенд примет атрибут такого размера. Если спаны отклоняются или отбрасываются, уменьшите sensitiveSpanAttributeMaxLength (например, до 61440) и отслеживайте пропускную способность экспортера.
Эта настройка не отключает чувствительные данные в логах OTel или других приемниках телеметрии; телеметрия ответов не-внутреннего API может заполнять response_text, поэтому логи OTel, телеметрия UI и запись чата могут получать текст ответа независимо от этой настройки. QwenLogger не включает response_text.
Маршрутизация сигналов HTTP OTLP: При использовании протокола HTTP (otlpProtocol: "http") Qwen Code автоматически добавляет специфичные для сигнала пути (/v1/traces, /v1/logs, /v1/metrics) к базовому otlpEndpoint. Например, http://collector:4318 становится http://collector:4318/v1/traces для трейсов. Если URL уже заканчивается путем сигнала, он используется как есть. Переопределения эндпоинтов для каждого сигнала (otlpTracesEndpoint и т. д.) имеют приоритет над базовым эндпоинтом и используются дословно. Протокол gRPC использует маршрутизацию на основе сервисов и не добавляет пути.
Переменные окружения для эндпоинтов каждого сигнала также принимают стандартные имена OpenTelemetry: OTEL_EXPORTER_OTLP_TRACES_ENDPOINT, OTEL_EXPORTER_OTLP_LOGS_ENDPOINT, OTEL_EXPORTER_OTLP_METRICS_ENDPOINT. Варианты QWEN_TELEMETRY_OTLP_* имеют приоритет над вариантами OTEL_*.
Идентификация конечного пользователя: telemetry.userId и QWEN_TELEMETRY_USER_ID — это явно включаемые параметры для атрибута спана ARMS gen_ai.user.id. Переменная окружения имеет приоритет после обрезки обоих значений; пустое значение переменной окружения откатывается к настройкам. Идентификатор записывается только в спаны взаимодействия, LLM, инструмента и агента. Это не атрибут ресурса, атрибут лога или метрики, значение outbound Baggage или текущее поле стандарта OpenTelemetry GenAI. Предпочтительно использовать стабильный псевдонимный идентификатор. Значение разрешается при запуске, поэтому изменения конфигурации требуют перезапуска. Не настраивайте общепроцессное значение на экземпляре демона или канала, обслуживающем нескольких конечных пользователей.
Подробную информацию обо всех параметрах конфигурации см. в Руководстве по конфигурации.
Атрибуты ресурсов
Атрибуты ресурсов — это статические пары ключ-значение, прикрепляемые к каждому спану, логу и метрике, экспортируемым через OTLP. Используйте их для среза телеметрии по команде, окружению, региону развертывания или любому другому измерению, которое важно для вашего бэкенда.
Два источника, объединяемые в порядке приоритета (от низшего к высшему):
- Стандартная переменная окружения
OTEL_RESOURCE_ATTRIBUTES telemetry.resourceAttributesв.qwen/settings.json(переопределяет переменную окружения при конфликте ключей)
OTEL_SERVICE_NAME — это отдельный механизм переопределения: при установке он переопределяет service.name из любого другого источника (согласно спецификации OpenTelemetry).
Примеры
Срез всей телеметрии по команде / окружению:
export OTEL_RESOURCE_ATTRIBUTES="team=platform,env=prod,cost_center=eng-123"Маршрутизация в коллектор для каждого арендатора через service.name:
export OTEL_SERVICE_NAME=qwen-code-ciБазовая линия флота (~/.qwen/settings.json) + переопределение для каждого хоста:
{
"telemetry": {
"resourceAttributes": {
"deployment.environment": "production",
"service.namespace": "engineering-tooling"
}
}
}# Добавление разовой метки без изменения настроек:
export OTEL_RESOURCE_ATTRIBUTES="debug_run=true"Зарезервированные ключи
Некоторые ключи контролируются средой выполнения и не могут быть переопределены:
service.version— всегда устанавливается в версию работающего CLI. Установка из любого источника тихо отклоняется с предупреждением.session.id— внедряется средой выполнения для каждой сессии. Предоставленные пользователем значения из переменных окружения или настроек отклоняются с предупреждением. Причина в том, что атрибуты ресурсов автоматически прикрепляются к каждой точке данных метрик; разрешение пользовательского переопределения обошло бы Контроли кардинальности ниже. Спаны и логи всегда несутsession.id.
service.name не зарезервирован; он следует цепочке приоритетов, описанной выше.
Формат
OTEL_RESOURCE_ATTRIBUTES следует спецификации OpenTelemetry: key1=value1,key2=value2, где значения закодированы в формате percent-encoding. Пробелы в значениях должны быть закодированы как %20, запятые как %2C (незакодированные запятые разделяют значение в неправильной границе, и вторая половина отбрасывается как некорректная). Некорректные пары пропускаются с предупреждением, а не приводят к сбою запуска телеметрии.
Устранение неполадок: когда предоставленный пользователем атрибут, кажется, не вступает в силу
Зарезервированные ключи (service.version, session.id), некорректные пары, нестроковые значения настроек и некорректный percent-encoding тихо отклоняются, а предупреждение логируется через диагностический канал OpenTelemetry. Этот канал направляется в файл debug-лога (~/.qwen/log/otel-*.log), а не в консоль, поэтому поведение может выглядеть как тихий сбой.
Если пользовательский атрибут ресурса не появляется в экспортируемой телеметрии:
- Проверьте
~/.qwen/log/otel-*.logна наличие строк, соответствующихcannot override(зарезервированный ключ отклонен),Skipping malformed(некорректная пара в переменной окружения) илиmust be a string(нестроковое значение настройки). - Убедитесь, что переменная окружения установлена в окружении процесса qwen-code (а не только в вашей оболочке) и что значения закодированы в формате percent-encoding.
- Подтвердите, что
telemetry.enabledравноtrue— инициализация телеметрии запускается только если она включена.
Контроли кардинальности
Метрики агрегируются по набору атрибутов на бэкенде — каждая уникальная комбинация значений атрибутов создает новый временной ряд. Прикрепление поля с высокой кардинальностью, такого как session.id, к метрике вызывает разрастание временных рядов, пропорциональное количеству сессий, что быстро истощает хранилище бэкенда метрик.
Чтобы предотвратить это, Qwen Code по умолчанию исключает атрибуты с высокой кардинальностью из точек данных метрик. Спаны и логи создаются для каждого события и не затрагиваются, поэтому они продолжают нести session.id для корреляции трейсов и логов.
telemetry.metrics.includeSessionId (по умолчанию: false)
Установка значения true (через настройки или QWEN_TELEMETRY_METRICS_INCLUDE_SESSION_ID=true) повторно прикрепляет session.id к каждой точке данных метрик.
⚠️ Предупреждение: каждая сессия CLI создает новое значение. Оставление этого параметра включенным для флота приведет к взрывному росту хранилища метрик. Рекомендуется только для краткосрочной отладки. Для долгосрочной корреляции сессий вместо этого запрашивайте бэкенды трейсов или логов.
Миграция с предыдущих версий
До этого релиза session.id прикреплялся к метрикам по умолчанию. Если ваши запросы Prometheus / дашборды Grafana / правила алертов ссылаются на session_id в метрике, у вас есть два варианта:
Вариант A — восстановить предыдущее поведение для краткосрочной отладки:
export QWEN_TELEMETRY_METRICS_INCLUDE_SESSION_ID=trueили:
{
"telemetry": {
"metrics": { "includeSessionId": true }
}
}Вариант B (рекомендуется) — перенести анализ на уровне сессий с метрик. Спаны и логи по-прежнему несут session.id, а бэкенды трейсов / логов (Jaeger, Tempo, Loki, Aliyun SLS / ARMS Tracing) нативно обрабатывают срезы по сессиям без давления на кардинальность.
Клиентский HTTP-спан для исходящих fetch-запросов
Когда телеметрия включена, Qwen Code регистрирует UndiciInstrumentation, который создает клиентский HTTP-спан для каждого исходящего запроса fetch(), инициированного процессом, включая LLM SDK (openai, @google/genai, @anthropic-ai/sdk), MCP StreamableHTTP клиент, инструмент WebFetch и любые вызовы из отдельных процессов IDE-расширений. Спан позволяет видеть сетевую задержку (TTFB / передачу тела ответа) отдельно от времени обработки модели на стороне провайдера, что один только существующий спан api.generateContent различить не может.
Эти спаны отправляются в ваш собственный OTLP-коллектор (или файл вывода) так же, как и остальная телеметрия — они не влияют на то, что записывается в сам исходящий HTTP-запрос. Будет ли заголовок W3C traceparent также записываться в исходящий поток запроса, управляется отдельной, важной для безопасности настройкой, описанной в разделе Исходящая корреляция (важно для безопасности) ниже.
Избегание петли обратной связи. OTel SDK использует fetch внутри себя для загрузки данных OTLP. Без защиты инструментация fetch трассировала бы эти загрузки, которые, в свою очередь, были бы загружены, вызывая бесконечный цикл. Инструментация undici в Qwen Code настроена с ignoreRequestHook, который пропускает URL-адреса, соответствующие префиксам настроенных telemetry.otlpEndpoint / telemetry.otlpTracesEndpoint / telemetry.otlpLogsEndpoint / telemetry.otlpMetricsEndpoint. В режиме вывода в файл исходящих HTTP-загрузок нет, поэтому хук является no-op.
Исходящая корреляция (ВАЖНО ДЛЯ БЕЗОПАСНОСТИ)
Эти настройки намеренно находятся в отдельном неймспейсе верхнего уровня, отличном от telemetry.*: телеметрия управляет потоком данных в собственный бэкенд наблюдаемости оператора, в то время как outboundCorrelation.* управляет тем, какие данные клиентской корреляции qwen-code записывает в исходящие потоки запросов к LLM API, которые достигают эндпоинтов сторонних провайдеров LLM (DashScope, OpenAI, Anthropic и т. д.). Разные получатели, разные решения о согласии. Все значения по умолчанию отключены. См. обсуждение в ревью PR #4390 для обоснования такого подхода.
outboundCorrelation.propagateTraceContext
"outboundCorrelation": {
"propagateTraceContext": false // default
}При значении false (по умолчанию) Qwen Code устанавливает no-op TextMapPropagator в OTel SDK. UndiciInstrumentation по-прежнему создает клиентские HTTP-спаны для вашего OTLP-коллектора, но propagation.inject() является no-op, поэтому в исходящие запросы не записывается traceparent. Trace ID остаются внутренними для коллектора оператора.
При значении true устанавливается композитный W3C-пропагатор SDK по умолчанию
(tracecontext + baggage), и стандартный заголовок traceparent
записывается в каждый исходящий fetch:
traceparent: 00-<32-hex traceId>-<16-hex parentSpanId>-<01-sampled | 00-not-sampled>Кроме того, переменные окружения TRACEPARENT и TRACESTATE устанавливаются в
дочерних процессах оболочки (Bash tool, hooks, monitor), чтобы порожденные команды могли
участвовать в том же распределенном трейсе.
Включайте эту опцию только в том случае, если LLM-провайдер также отправляет данные в ваш OTel-коллектор
для сшивания кросс-процессных трейсов — например, ARMS Tracing для DashScope.
Для большинства операторов значение равно false; кросс-вендорное продолжение трейсов —
это нишевый сценарий.
Зависит от telemetry.enabled: true. OTel SDK инициализируется
только при включенной телеметрии, поэтому propagateTraceContext вступает в силу
только в этом состоянии. Установка значения true при отключенной телеметрии является
скрытым no-op — нет SDK, нет пропагатора, нет traceparent в сети.
Проверьте оба флага при настройке корреляции ARMS+DashScope:
{
"telemetry": {
"enabled": true,
"otlpTracesEndpoint": "http://tracing-analysis-...",
},
"outboundCorrelation": {
"propagateTraceContext": true,
},
}Другие заголовки исходящей корреляции
X-Qwen-Code-Session-Id и X-Qwen-Code-Request-Id не являются частью
этого PR. Они будут спроектированы и предложены в собственных последующих
PR в том же неймспейсе outboundCorrelation.*, каждый со своей
моделью угроз и процессом получения согласия оператора. Ревью PR #4390 (LaZzyMan)
закрепило принцип: “сфера работы телеметрии не включает отправку идентификаторов LLM-провайдерам”;
работа над заголовками корреляции переносится в отдельное обсуждение дизайна,
а не попадает в телеметрию.
Входящая корреляция (HTTP API демона)
HTTP API демона принимает стандартный заголовок W3C traceparent в каждом
запросе. Два потребителя читают его независимо:
- Переназначение родительского спана запроса (телеметрия включена). Когда SDK
телеметрии инициализирован, валидный заголовок извлекается как удалённый
родительский спан запроса, поэтому спаны демона прикрепляются под трейсом
вызывающей стороны вместо создания нового. Путь пересылки
_metaчитает ту же цепочку родителей, поэтому спаны подпроцессов сессии, пересылаемые через запрос демона, также наследуют его. - Поле
traceIdв access-логе (оба режима). Специализированный pre-auth middleware захватывает и разбирает заголовок в каждом запросе — включая те, которые обрываются на аутентификации (401), rate limiter (429), парсере тела JSON (400) или не совпадают ни с одним маршрутом (404) — и access-лог выдаёт trace id вызывающей стороны как полеtraceIdв camelCase. При отключённой телеметрии это поле является единственным способом связать строку лога демона с логами вызывающей стороны (или бэкендом трейсов), поэтому один сохранённый запрос работает для обоих режимов без настройки телеметрии.
Невалидный, но присутствующий заголовок отклоняется (спан остаётся без
родителя) и оставляет ограниченную по частоте DEBUG-метку
(qwen-code.daemon.traceparent.invalid), записывающую отклонённое значение,
чтобы сломанная кросс-сервисная связка была диагностируема только по логам
демона.
Принудительный сэмплинг под входящими родителями
При стандартном сэмплере parentbased_always_on (и других parentbased
значениях по умолчанию), флаг sampled=0 удалённого родителя — это
head-based решение на стороне вызывающего, а не запрос на отключение
телеметрии демона, поэтому извлечение принудительно устанавливает флаг
SAMPLED на входящих родителях. Единственный способ отключить это —
OTEL_TRACES_SAMPLER=parentbased_always_off, который уважает флаги
вызывающей стороны — обратите внимание, что он также отключает сэмплинг
корневых спанов для всего демона, а не только для запросов, связанных
с входящими родителями.
Предупреждение: постоянный traceparent (например, захардкоженный в
клиенте для нагрузочного тестирования) переназначает каждый запрос демона
в один единственный трейс; генерируйте свежий заголовок для каждого запроса.
Телеметрия Aliyun
Ручной экспорт OTLP
Чтобы просматривать телеметрию Qwen Code в Alibaba Cloud Managed Service for OpenTelemetry, настройте Qwen Code на экспорт в OTLP-эндпоинт, предоставленный ARMS.
Одной установки "target": "gcp" недостаточно для настройки назначения
экспорта. Если otlpEndpoint не задан, Qwen Code по умолчанию использует
http://localhost:4317. Если задан outfile, он переопределяет
otlpEndpoint, и телеметрия записывается в файл вместо отправки
в Alibaba Cloud.
-
Включите телеметрию в
.qwen/settings.jsonи задайте OTLP-эндпоинт:Вариант A: протокол gRPC (стандартный OTLP-эндпоинт):
{ "telemetry": { "enabled": true, "target": "gcp", "otlpEndpoint": "https://<your-otlp-endpoint>", "otlpProtocol": "grpc" } }Вариант B: протокол HTTP с эндпоинтами для каждого сигнала (для бэкендов, использующих нестандартные пути, например,
/api/otlp/tracesвместо/v1/traces):{ "telemetry": { "enabled": true, "otlpProtocol": "http", "otlpTracesEndpoint": "http://<host>/<token>/api/otlp/traces", "otlpLogsEndpoint": "http://<host>/<token>/api/otlp/logs", "otlpMetricsEndpoint": "http://<host>/<token>/api/otlp/metrics" } }Примечание: При использовании протокола HTTP только с
otlpEndpoint(без переопределений для каждого сигнала) Qwen Code добавляет стандартные пути OTLP (/v1/traces,/v1/logs,/v1/metrics) к базовому URL. Если ваш бэкенд использует другие пути, используйте переопределения эндпоинтов для каждого сигнала, как показано в Варианте B.Чтобы заполнить
User IDв ARMS Session Analysis, добавьте стабильный псевдонимный идентификатор как настройку уровня спана:{ "telemetry": { "userId": "user-079458", "resourceAttributes": { "acs.arms.service.feature": "genai_app" } } }Для развертываний в контейнерах установите
QWEN_TELEMETRY_USER_ID=user-079458вместо этого. Пользовательскийtelemetry.resourceAttributes.user.idостается несвязанным измерением ресурса и не заполняет ARMS Session Analysis; удалите его при миграции на настройку уровня спана. -
Если ваш эндпоинт Alibaba Cloud требует аутентификации, передайте заголовки OTLP через стандартные переменные окружения OpenTelemetry, такие как
OTEL_EXPORTER_OTLP_HEADERS(или специфичные для сигнала варианты). Qwen Code в настоящее время не предоставляет заголовки аутентификации OTLP напрямую в.qwen/settings.json. -
Запустите Qwen Code и отправьте промпты.
-
Просматривайте телеметрию в Managed Service for OpenTelemetry:
- Обзор продукта: Что такое Managed Service for OpenTelemetry?
- Начало работы: Начало работы с Managed Service for OpenTelemetry
- Точки входа в консоль:
- Материковый Китай: trace.console.aliyun.com (устаревшая консоль: tracing.console.aliyun.com )
- Международная версия: arms.console.alibabacloud.com
- В консоли используйте
Applicationsдля проверки трейсов и топологии сервисов. - Чтобы найти OTLP-эндпоинт и информацию о доступе:
- Новая консоль (
trace.console.aliyun.comили международная): перейдите вIntegration Center. - Устаревшая консоль (
tracing.console.aliyun.com): перейдите вCluster Configurations→Access point information.
- Новая консоль (
Локальная телеметрия
Для локальной разработки и отладки вы можете собирать телеметрические данные локально:
Вывод в файл (рекомендуется)
-
Включите телеметрию в
.qwen/settings.json:{ "telemetry": { "enabled": true, "outfile": ".qwen/telemetry.log" } }Примечание: При установке
outfileэкспорт OTLP автоматически отключается. НастройкиtargetиotlpEndpointне нужны для вывода только в файл и могут быть безопасно опущены в конфигурации. -
Запустите Qwen Code и отправьте промпты.
-
Просматривайте логи и метрики в указанном файле (например,
.qwen/telemetry.log).
Экспорт через коллектор (продвинутый)
- Запустите скрипт автоматизации:
Это позволит:
npm run telemetry -- --target=local- Скачать и запустить Jaeger и OTEL-коллектор
- Настроить ваше рабочее пространство для локальной телеметрии
- Предоставить Jaeger UI по адресу http://localhost:16686
- Сохранять логи/метрики в
~/.qwen/tmp/<projectHash>/otel/collector.log - Останавливать коллектор при выходе (например,
Ctrl+C)
- Запустите Qwen Code и отправьте промпты.
- Просматривайте трейсы по адресу http://localhost:16686 , а логи/метрики — в файле лога коллектора.
Логи и метрики
В следующем разделе описывается структура логов, метрик и спанов, генерируемых для Qwen Code.
sessionIdвключается в качестве общего атрибута во все логи и метрики.
Логи
Логи — это записи конкретных событий с временными метками. Все записи логов автоматически включают атрибуты event.name и event.timestamp.
Регистрируются следующие события:
Основные события сессии
-
qwen-code.config: Генерируется один раз при запуске с конфигурацией CLI.- Атрибуты:
model,sandbox_enabled,core_tools_enabled,approval_mode,file_filtering_respect_git_ignore,debug_mode,truncate_tool_output_threshold,truncate_tool_output_lines,hooks(через запятую, пропускается, если отключено),ide_enabled,interactive_shell_enabled,mcp_servers,mcp_servers_count,mcp_tools,mcp_tools_count,output_format,skills,subagents
- Атрибуты:
-
session.start: Сессия начинается. Генерируется после инициализации телеметрии при запуске и повторно при каждом переключении сессии; семантика жизненного цикла описана в разделе Спаны.- Атрибуты:
session.id(string),session.previous_id(string, присутствует только когда этот запуск продолжает сохранённый разговор с новым id сессии)
- Атрибуты:
-
session.end: Сессия завершается. Генерируется перед заменой текущей сессии при переключении и при завершении работы телеметрии.- Атрибуты:
session.id(string)
- Атрибуты:
-
qwen-code.user_prompt: Пользователь отправляет промпт.- Атрибуты:
prompt_length(int),prompt_id(string),prompt(string, исключается, еслиlog_prompts_enabledравно false),auth_type(string)
- Атрибуты:
-
qwen-code.user_retry: Пользователь повторяет последний промпт.- Атрибуты:
prompt_id(string)
- Атрибуты:
-
qwen-code.conversation_finished: Завершается последовательность ходов диалога.- Атрибуты:
approvalMode(string),turnCount(int)
- Атрибуты:
-
qwen-code.user_feedback: Пользователь отправляет отзыв о сессии.- Атрибуты:
session_id(string),rating(int: 1=плохо, 2=нормально, 3=хорошо),model(string),approval_mode(string),prompt_id(string, опционально)
- Атрибуты:
События инструментов
-
qwen-code.tool_call: Каждый вызов функции/инструмента. Терминальные события нормализованы так, чтоstatusявляется авторитетным: события успеха и отмены опускают поля ошибок, тогда как события ошибок всегда имеют непустойerror_type(unknown, когда продюсер не классифицировал ошибку). Пустые имена инструментов выдаются какunknown_tool. Отсутствующийexecution_statusнормализуется вunknownи никогда не выводится из терминальногоstatus.- Атрибуты:
function_name(string),function_args(object),call_id(string, опционально),duration_ms(int),status(string: “success”, “error” или “cancelled”),execution_status(string: “not_started”, “success”, “error”, “cancelled” или “unknown”),success(boolean),decision(string: “accept”, “reject”, “auto_accept” или “modify”, опционально),error(string, опционально),error_type(string, присутствует для событий ошибок),prompt_id(string),response_id(string, опционально),content_length(int, опционально),tool_type(string: “native” или “mcp”),mcp_server_name(string, опционально),metadata(object, опционально — для инструментов записи файлов содержитmodel_added_lines,model_removed_lines,user_added_lines,user_removed_lines,model_added_chars,model_removed_chars,user_added_chars,user_removed_chars)
- Атрибуты:
-
qwen-code.file_operation: Каждая операция с файлом.- Атрибуты:
tool_name(string),operation(string: “create”, “read”, “update”),lines(int, опционально),mimetype(string, опционально),extension(string, опционально),programming_language(string, опционально)
- Атрибуты:
-
qwen-code.tool_output_truncated: Вывод инструмента превысил пороговый размер.- Атрибуты:
tool_name(string),original_content_length(int),truncated_content_length(int),threshold(int),lines(int),prompt_id(string)
- Атрибуты:
События API
-
qwen-code.api_request: Исходящий запрос к API LLM.- Атрибуты:
model(string),prompt_id(string),request_text(string, опционально),subagent_name(string, опционально)
- Атрибуты:
-
qwen-code.api_response: Ответ, полученный от API LLM.- Атрибуты:
response_id(string),model(string),status_code(int/string, опционально),duration_ms(int),input_token_count(int),output_token_count(int),cached_content_token_count(int),thoughts_token_count(int),total_token_count(int),prompt_id(string),auth_type(string, опционально),response_text(string, опционально),subagent_name(string, опционально)
- Атрибуты:
-
qwen-code.api_error: Сбой запроса к API.- Атрибуты:
model(string),prompt_id(string),duration_ms(int),error_message(string),response_id(string, опционально),auth_type(string, опционально),error_type(string, опционально),status_code(int/string, опционально),subagent_name(string, опционально)
Дополнительно для совместимости генерируются стандартные алиасы OTel (
http.status_code,error.message,model_name,duration). - Атрибуты:
-
qwen-code.api_cancel: Запрос к API отменен пользователем.- Атрибуты:
model(string),prompt_id(string),auth_type(string, опционально),loop_wakeups_cancelled(int, опционально)
- Атрибуты:
-
qwen-code.api_retry: Повтор запроса по HTTP-статусу (429/5xx) при вызове LLM. Отличается отchat.content_retry, который обрабатывает повторыInvalidStreamErrorпо отдельному бюджету.- Атрибуты:
model(string),prompt_id(string, опционально),attempt_number(int),error_type(string, опционально),error_message(string),status_code(int/string, опционально),retry_delay_ms(int),duration_ms(int, равно retry_delay_ms — время ожидания backoff, а не HTTP round-trip; длительность попытки см. в спане qwen-code.llm_request),subagent_name(string, опционально)
- Атрибуты:
-
qwen-code.malformed_json_response: ОтветgenerateJsonне удалось распарсить.- Атрибуты:
model(string)
- Атрибуты:
-
qwen-code.flash_fallback: Переключение на flash-модель в качестве запасного варианта.- Атрибуты:
auth_type(string)
- Атрибуты:
-
qwen-code.ripgrep_fallback: Переключение на grep в качестве запасного варианта.- Атрибуты:
use_ripgrep(boolean),use_builtin_ripgrep(boolean),error(string, опционально)
- Атрибуты:
События отказоустойчивости
-
qwen-code.chat.content_retry: Повтор при ошибке контента (например, пустой поток).- Атрибуты:
attempt_number(int),error_type(string),retry_delay_ms(int),model(string)
- Атрибуты:
-
qwen-code.chat.content_retry_failure: Все повторы контента исчерпаны.- Атрибуты:
total_attempts(int),final_error_type(string),total_duration_ms(int, опционально),model(string)
- Атрибуты:
-
qwen-code.chat.invalid_chunk: Из потока получен невалидный чанк.- Атрибуты:
error.message(string, опционально)
- Атрибуты:
События команд и расширений
-
qwen-code.slash_command: Пользователь выполняет слэш-команду.- Атрибуты:
command(string),subcommand(string, опционально),status(string: “success” или “error”, опционально)
- Атрибуты:
-
qwen-code.slash_command.model: Пользователь переключает модель с помощью команды/model.- Атрибуты:
model_name(string)
- Атрибуты:
-
qwen-code.skill_launch: Запускается скилл.- Атрибуты:
skill_name(string),success(boolean),prompt_id(string)
- Атрибуты:
-
qwen-code.extension_install: Расширение установлено.- Атрибуты:
extension_name(string),extension_version(string),extension_source(string),status(string: “success”/“error”)
- Атрибуты:
-
qwen-code.extension_uninstall: Расширение удалено.- Атрибуты:
extension_name(string),status(string)
- Атрибуты:
-
qwen-code.extension_enable: Расширение включено.- Атрибуты:
extension_name(string),setting_scope(string)
- Атрибуты:
-
qwen-code.extension_disable: Расширение отключено.- Атрибуты:
extension_name(string),setting_scope(string)
- Атрибуты:
-
qwen-code.extension_update: Расширение обновлено.- Атрибуты:
extension_name(string),extension_id(string),extension_previous_version(string),extension_version(string),extension_source(string),status(string: “success”/“error”)
- Атрибуты:
-
qwen-code.ide_connection: Событие подключения к IDE.- Атрибуты:
connection_type(string: “start” или “session”)
- Атрибуты:
-
qwen-code.auth: Событие аутентификации.- Атрибуты:
auth_type(string),action_type(“auto”, “manual”, “coding-plan”),status(“success”, “error”, “cancelled”),error_message(опционально)
- Атрибуты:
События субагентов
qwen-code.subagent_execution: Событие жизненного цикла субагента.- Атрибуты:
subagent_name(string),status(“started”, “completed”, “failed”, “cancelled”),terminate_reason(опционально),result(опционально),execution_summary(опционально)
- Атрибуты:
События арены
-
qwen-code.arena_session_started: Начинается сессия арены.- Атрибуты:
arena_session_id(string),model_ids(JSON-массив строк),task_length(int)
- Атрибуты:
-
qwen-code.arena_agent_completed: Агент арены завершает работу.- Атрибуты:
arena_session_id(string),agent_session_id(string),agent_model_id(string),status(string: “completed”/“failed”/“cancelled”),duration_ms(int),rounds(int),total_tokens(int),input_tokens(int),output_tokens(int),tool_calls(int),successful_tool_calls(int),failed_tool_calls(int)
- Атрибуты:
-
qwen-code.arena_session_ended: Сессия арены завершается.- Атрибуты:
arena_session_id(string),status(string: “selected”/“discarded”/“failed”/“cancelled”),duration_ms(int),display_backend(string, опционально),agent_count(int),completed_agents(int),failed_agents(int),cancelled_agents(int),winner_model_id(string, опционально)
- Атрибуты:
События воркфлоу
-
qwen-code.workflow_keyword: Срабатывает триггер ключевого слова воркфлоу. -
qwen-code.workflow_run: Запуск воркфлоу достигает терминального состояния.- Атрибуты:
status(string),agents_dispatched(int),agents_completed(int),phase_count(int),tokens_spent(int),duration_ms(int)
- Атрибуты:
События автопамяти
-
qwen-code.memory.extract: Завершено извлечение памяти.- Атрибуты:
trigger(“auto”/“manual”),status(“completed”/“skipped”/“failed”),skipped_reason(опционально),patches_count(int),touched_topics(string),duration_ms(int)
- Атрибуты:
-
qwen-code.memory.dream: Завершена консолидация памяти (dream).- Атрибуты:
trigger(“auto”/“manual”),status(“updated”/“noop”/“failed”/“cancelled”),deduped_entries(int),touched_topics_count(int),touched_topics(string),duration_ms(int)
- Атрибуты:
-
qwen-code.memory.recall: Завершена операция отзыва памяти.- Атрибуты:
query_length(int),docs_scanned(int),docs_selected(int),strategy(“none”/“heuristic”/“model”),duration_ms(int)
- Атрибуты:
События предложений промптов и спекуляций
-
qwen-code.prompt_suggestion: Результат предложения промпта.- Атрибуты:
outcome(“accepted”/“ignored”/“suppressed”),prompt_id(опционально),accept_method(“tab”/“enter”/“right”, опционально),accept_source(“live”/“fallback”, опционально),time_to_accept_ms(опционально),time_to_ignore_ms(опционально),time_to_first_keystroke_ms(опционально),suggestion_length(опционально),similarity(опционально),was_focused_when_shown(опционально),reason(опционально)
- Атрибуты:
-
qwen-code.speculation: Результат спекулятивного выполнения.- Атрибуты:
outcome(“accepted”/“aborted”/“failed”),turns_used(int),files_written(int),tool_use_count(int),duration_ms(int),boundary_type(опционально),had_pipelined_suggestion(boolean)
- Атрибуты:
Другие события
-
qwen-code.chat_compression: Контекст чата сжат.- Атрибуты:
tokens_before(int),tokens_after(int),compression_input_token_count(int, опционально),compression_output_token_count(int, опционально)
- Атрибуты:
-
qwen-code.next_speaker_check: Определение следующего говорящего.- Атрибуты:
prompt_id(string),finish_reason(string),result(string)
- Атрибуты:
-
loop_detected: Обнаружена зацикленность во время выполнения агентом. (Примечание: генерируется без префиксаqwen-code.— исторически сложившееся несоответствие.)- Атрибуты:
loop_type(string),prompt_id(string)
- Атрибуты:
-
kitty_sequence_overflow: Последовательность протокола графики Kitty превысила размер буфера. (Примечание: генерируется без префиксаqwen-code.— исторически сложившееся несоответствие.)- Атрибуты:
sequence_length(int),truncated_sequence(string, первые 20 символов)
- Атрибуты:
Метрики
Метрики — это числовые измерения поведения во времени. Имена метрик используют префикс qwen-code.*.
Основные метрики
-
qwen-code.session.count(Counter, Int): Увеличивается на единицу при каждом запуске CLI. -
qwen-code.tool.call.count(Counter, Int): Подсчитывает вызовы инструментов.- Атрибуты:
function_name,status(“success”/“error”/“cancelled”),success(boolean, сохранен для совместимости),decision(“accept”/“reject”/“auto_accept”/“modify”, опционально),tool_type(“mcp”/“native”, опционально)
- Атрибуты:
-
qwen-code.tool.execution.count(Counter, Int): Подсчитывает результаты выполнения инструментов. Намеренно не несет измерениеfunction_name, чтобы оставаться с низкой кардинальностью, поэтому уровень отказов выполнения не может быть отнесен к конкретному инструменту без перехода к логамqwen-code.tool_call; исключитеunknown,not_startedиcancelledпри вычислении коэффициентов отказов выполнения (знаменатель —success+error).- Атрибуты:
execution_status(“not_started”/“success”/“error”/“cancelled”/“unknown”),tool_type(“mcp”/“native”), плюс глобально настроенные общие атрибуты метрик, такие как опциональныйsession.id
- Атрибуты:
-
qwen-code.tool.call.latency(Histogram, ms): Измеряет задержку вызова инструмента.- Атрибуты:
function_name(string)
- Атрибуты:
-
qwen-code.api.request.count(Counter, Int): Подсчитывает все запросы к API.- Атрибуты:
model,status_code,error_type(опционально)
- Атрибуты:
-
qwen-code.api.request.latency(Histogram, ms): Измеряет задержку запроса к API.- Атрибуты:
model(string)
- Атрибуты:
-
qwen-code.token.usage(Counter, Int): Подсчитывает использованные токены.- Атрибуты:
model,type(“input”/“output”/“thought”/“cache”)
- Атрибуты:
-
qwen-code.file.operation.count(Counter, Int): Подсчитывает операции с файлами.- Атрибуты:
operation(“create”/“read”/“update”),lines(опционально),mimetype(опционально),extension(опционально),programming_language(опционально)
- Атрибуты:
-
qwen-code.chat_compression(Counter, Int): Подсчитывает операции сжатия чата.- Атрибуты:
tokens_before(int),tokens_after(int)
- Атрибуты:
-
qwen-code.slash_command.model.call_count(Counter, Int): Подсчитывает вызовы слэш-команды модели.- Атрибуты:
slash_command.model.model_name(string)
- Атрибуты:
-
qwen-code.subagent.execution.count(Counter, Int): Подсчитывает события выполнения субагентов.- Атрибуты:
subagent_name,status(“started”/“completed”/“failed”/“cancelled”),terminate_reason(опционально)
- Атрибуты:
Метрики отказоустойчивости
-
qwen-code.api.retry.count(Counter, Int): Повторы по HTTP-статусу (429/5xx) при вызовах LLM.- Атрибуты:
model(string)
- Атрибуты:
-
qwen-code.chat.content_retry.count(Counter, Int): Повторы из-за ошибок контента. -
qwen-code.chat.content_retry_failure.count(Counter, Int): Все повторы контента исчерпаны. -
qwen-code.chat.invalid_chunk.count(Counter, Int): Невалидные чанки из потока.
Метрики арены
-
qwen-code.arena.session.count(Counter, Int): Сессии арены по статусу.- Атрибуты:
status,display_backend(опционально)
- Атрибуты:
-
qwen-code.arena.session.duration(Histogram, ms): Длительность сессии Arena.- Атрибуты:
status
- Атрибуты:
-
qwen-code.arena.agent.count(Counter, Int): Количество завершений агента Arena.- Атрибуты:
status,model_id
- Атрибуты:
-
qwen-code.arena.agent.duration(Histogram, ms): Длительность выполнения агента Arena.- Атрибуты:
model_id
- Атрибуты:
-
qwen-code.arena.agent.tokens(Counter, Int): Использование токенов агентами Arena.- Атрибуты:
model_id,type(“input”/“output”)
- Атрибуты:
-
qwen-code.arena.result.selected(Counter, Int): Количество выборов результата в Arena.- Атрибуты:
model_id
- Атрибуты:
Метрики Auto-Memory
-
qwen-code.memory.extract.count(Counter, Int): Количество запусков извлечения Auto-Memory.- Атрибуты:
trigger(“auto”/“manual”),status
- Атрибуты:
-
qwen-code.memory.extract.duration(Histogram, ms): Длительность извлечения.- Атрибуты:
trigger,status
- Атрибуты:
-
qwen-code.memory.dream.count(Counter, Int): Количество запусков dream в Auto-Memory.- Атрибуты:
trigger(“auto”/“manual”),status
- Атрибуты:
-
qwen-code.memory.dream.duration(Histogram, ms): Длительность выполнения dream.- Атрибуты:
trigger,status
- Атрибуты:
-
qwen-code.memory.recall.count(Counter, Int): Количество операций recall в Auto-Memory.- Атрибуты:
strategy(“none”/“heuristic”/“model”)
- Атрибуты:
-
qwen-code.memory.recall.duration(Histogram, ms): Длительность recall.- Атрибуты:
strategy
- Атрибуты:
Детализация API-запросов
qwen-code.api.request.breakdown(Histogram, ms): Детализация времени API-запроса по фазам.- Атрибуты:
model,phase(“request_preparation”/“network_latency”/“response_processing”/“token_processing”)
- Атрибуты:
Метрики демона
Процесс демона (режим долгоживущего HTTP-сервера) предоставляет собственные метрики.
Note: Три Observable Gauge (
daemon.session.active,daemon.sse.active,daemon.process.heap_used) — это метрики на основе callback-функций, которые обновляются при каждом интервале сбора;registerDaemonGaugeCallbacks()должна вызываться при инициализации демона для регистрации callback-функций наблюдения.
HTTP
-
qwen-code.daemon.http.request.count(Counter, Int): Количество запросов по маршрутам и классам статуса.- Атрибуты:
route,status_class(“2xx”/“4xx”/“5xx”)
- Атрибуты:
-
qwen-code.daemon.http.request.duration(Histogram, ms): Длительность запроса.- Атрибуты:
route - Корзины: 1, 2, 5, 10, 25, 50, 100, 250, 500, 1000, 2500, 5000, 10000, 30000
- Атрибуты:
Сессии
-
qwen-code.daemon.session.active(ObservableGauge, Int): Текущие активные сессии. -
qwen-code.daemon.session.lifecycle(Counter, Int): События жизненного цикла сессии.- Атрибуты:
action(“spawn”/“close”/“die”)
- Атрибуты:
Каналы
qwen-code.daemon.channel.lifecycle(Counter, Int): События жизненного цикла ACP-канала.- Атрибуты:
action(“spawn”/“exit”),expected(boolean, optional)
- Атрибуты:
Промпты
-
qwen-code.daemon.prompt.queue_wait(Histogram, ms): Время ожидания промпта в FIFO-очереди.- Корзины: 1, 5, 10, 50, 100, 500, 1000, 5000, 10000, 30000, 60000
-
qwen-code.daemon.prompt.duration(Histogram, ms): Сквозная длительность обработки промпта.- Корзины: 100, 500, 1000, 2500, 5000, 10000, 30000, 60000, 120000, 300000, 600000
Ошибки
-
qwen-code.daemon.bridge.error.count(Counter, Int): Ошибки bridge по типам.- Атрибуты:
error_type(известное имя класса или “unknown”)
- Атрибуты:
-
qwen-code.daemon.cancel.count(Counter, Int): Количество запросов на отмену.
Ресурсы
-
qwen-code.daemon.sse.active(ObservableGauge, Int): Активные SSE-соединения. -
qwen-code.daemon.process.heap_used(ObservableGauge, Int, bytes): Использование памяти кучи.
Спаны
Спаны распределенной трассировки образуют дерево с корнем в qwen-code.interaction. В CLI каждое взаимодействие является корнем трейса со своим traceId; пути ACP и демона могут наследовать входящий родительский контекст. Для кросс-промптной корреляции используется атрибут session.id.
Жизненный цикл сессии также экспортируется через семантические соглашения OpenTelemetry General Session. Когда включён конвейер логов OTel, Qwen Code генерирует события логов session.start и session.end с обязательным атрибутом session.id (каталогизированы в разделе Основные события сессии выше). Возобновлённый сохранённый разговор включает session.previous_id в событии session.start только когда возобновлённый id сессии отличается от текущего; холодные запуски с возобновлением (--resume, --continue, --fork-session) не несут его. /clear и другие потоки замены намеренно не заявляют о продолжении, потому что они отбрасывают предыдущий разговор.
Существующие записи qwen-code.config/cli_config и RUM session_start остаются доступными для совместимости. Спаны запросов GenAI продолжают использовать gen_ai.conversation.id для того же id владеющей сессии.
-
qwen-code.interaction: Спан вызова основного агента. Охватывает все запросы LLM, подтверждение/выполнение инструментов и продолжения для одного логического промпта. Запросы пользователя, повторы, cron-промпты, уведомления, сообщения участников и ходы Goal создают вызовы; результаты инструментов, хуки и руление переиспользуют точный активный ID промпта.- Атрибуты GenAI:
gen_ai.operation.name(invoke_agent),gen_ai.agent.name(qwen-code),gen_ai.conversation.id, опциональныйgen_ai.output.type(jsonтолько с настроенной JSON Schema), чувствительныеgen_ai.input.messages, чувствительныеgen_ai.output.messagesи опциональное расширение ARMSgen_ai.user.id - Атрибуты совместимости:
session.id,qwen-code.prompt_id,qwen-code.message_type,qwen-code.model,qwen-code.approval_mode,interaction.sequence,interaction.duration_ms,qwen-code.turn_status(“ok”/“error”/“cancelled”) gen_ai.request.modelнамеренно опущен, потому что агент поддерживает переопределения, фолбэк и динамический выбор модели.gen_ai.provider.nameи ID/версия/описание агента также опущены.- Вход агента — это один исходный промпт пользователя, а не расширенный запрос модели. Выход агента — одна финальная видимая пользователю текстовая проекция; структурированный JSON использует компактный JSON-текст с
finish_reason=tool_call. Оба опускаются, если не включены чувствительные атрибуты спанов и полный JSON помещается в лимит на атрибут.
- Атрибуты GenAI:
-
qwen-code.llm_request: Оборачивает одиночный вызов LLM API.- Атрибуты GenAI:
gen_ai.operation.name,gen_ai.provider.name,gen_ai.conversation.id, опциональное расширение ARMSgen_ai.user.id,gen_ai.request.model,gen_ai.request.stream,gen_ai.request.choice.count,gen_ai.request.max_tokens,gen_ai.request.temperature,gen_ai.request.top_p,gen_ai.request.frequency_penalty,gen_ai.request.presence_penalty,gen_ai.request.stop_sequences, опциональноgen_ai.output.type,gen_ai.response.id,gen_ai.response.model,gen_ai.response.finish_reasons,gen_ai.response.time_to_first_chunk,gen_ai.usage.input_tokens,gen_ai.usage.output_tokens,gen_ai.usage.cache_read.input_tokens,gen_ai.usage.cache_creation.input_tokens - Атрибуты совместимости:
session.id,qwen-code.prompt_id,llm_request.context(“subagent”/“interaction”/“standalone”),duration_ms,ttft_ms,request_setup_ms,attempt,retry_total_delay_ms,sampling_ms,output_tokens_per_second,success,error,finish_reason,thoughts_token_count,subagent_name,error_type,error_status_code - Стандартные поля ответа поступают из ответа провайдера. Стандартные поля токенов выдаются только для неотрицательных безопасных целых чисел, сообщенных провайдером. Если провайдер сообщает только общее количество токенов, использование вход/выход пропускается, а не оценивается.
- Стандартные поля параметров запроса поступают из первого финального объекта запроса SDK провайдера после адаптеров по умолчанию, переопределений, удаления неподдерживаемых полей и зажимов окна вывода. Qwen Code не выводит SDK или серверные значения по умолчанию.
- Запросы с потоковой передачей выдают
gen_ai.request.stream=true.gen_ai.response.time_to_first_chunkизмеряет секунды от вызова провайдера до первого нормализованного ответа, выданного адаптером провайдера, который может отличаться от первого сырого сетевого фрейма. Запросы без потоковой передачи опускают оба стандартных атрибута потоковой передачи, потому что отсутствующийgen_ai.request.streamозначает отсутствие потоковой передачи в семантическом соглашении.
- Атрибуты GenAI:
-
qwen-code.tool: Оборачивает полный жизненный цикл инструмента (ожидание подтверждения + выполнение).- Атрибуты:
session.id, опциональное расширение ARMSgen_ai.user.id,gen_ai.operation.name(execute_tool), опциональный унаследованныйgen_ai.agent.name,gen_ai.tool.name,gen_ai.tool.type(function),gen_ai.tool.call.id,tool.call_id,duration_ms,success,error,error.typeпри сбое,tool.failure_kind(string, опционально — конкретная причина сбоя, например, “cancelled”, “tool_error”, “tool_exception”, “timeout”, “permission_denied”, “pre_hook_blocked”)
- Атрибуты:
-
qwen-code.tool.execution: Оборачивает фазу выполнения инструмента (после подтверждения). Выдается только для попыток выполнения.- Атрибуты:
session.id,gen_ai.tool.name(опционально),tool.call_id(опционально),duration_ms,success,error,execution_status(“success”/“error”/“cancelled”),error_type,error.type
- Атрибуты:
-
qwen-code.tool.blocked_on_user: Время, которое инструмент тратит на ожидание подтверждения от пользователя.- Атрибуты:
session.id,tool.name,tool.call_id,duration_ms,decision(“proceed_once”/“proceed_always”/“cancel”/“aborted”/“auto_approved”/“error”),source(“cli”/“ide”/“hook”/“auto”/“system”)
- Атрибуты:
-
qwen-code.hook: Оборачивает каждое место срабатывания хука pre/post-tool-use.- Атрибуты:
session.id,hook_event(“PreToolUse”/“PostToolUse”/“PostToolUseFailure”/“PostToolBatch”),tool.name,tool.use_id(optional),is_interrupt(boolean, optional),duration_ms,success,should_proceed(optional),should_stop(optional),block_type(optional),error(optional)
- Атрибуты:
-
qwen-code.subagent: Оборачивает одиночный вызов субагента.- Атрибуты:
gen_ai.operation.name(invoke_agent),gen_ai.agent.name,gen_ai.agent.description,gen_ai.conversation.id, опциональное расширение ARMSgen_ai.user.id, опциональноgen_ai.request.model,qwen-code.subagent.id,qwen-code.subagent.name,qwen-code.subagent.invocation_kind(“foreground”/“fork”/“background”),qwen-code.subagent.is_built_in,qwen-code.subagent.depth,qwen-code.subagent.status,qwen-code.subagent.terminate_reason,qwen-code.subagent.duration_ms
- Атрибуты:
Успешные и отменённые спаны GenAI оставляют SpanStatus как UNSET. При сбоях устанавливается ERROR, ограниченное описание статуса и error.type с низкой кардинальностью.
Миграция полей GenAI и распознавание ARMS
Спаны LLM теперь используют стандартные поля gen_ai.request.*, gen_ai.response.* и gen_ai.usage.* без точных эквивалентных частных алиасов. Атрибуты семплинга запроса записываются только под их стандартными именами; не выдаются голые алиасы temperature, top_p, max_tokens, penalty, choice-count или stop-sequence. Спаны инструментов аналогично используют gen_ai.tool.name без tool.name; спаны blocked-on-user и hook сохраняют tool.name, потому что они не являются спанами инструментов GenAI. Недействительные алиасы gen_ai.usage.cached_tokens, gen_ai.server.time_to_first_token и gen_ai.usage.reasoning_tokens больше не выдаются. Используйте gen_ai.usage.cache_read.input_tokens для кэшированных чтений, сообщенных провайдером, и gen_ai.response.time_to_first_chunk для стандартной задержки потоковой передачи. Частный атрибут спана ttft_ms остается доступным для задержки первого видимого пользователю вывода и продолжает управлять /stats, sampling_ms и пропускной способностью токенов вывода; gen_ai.response.time_to_first_chunk — это независимый стандартный атрибут, измеряющий задержку первого нормализованного чанка. Полный контракт с привязкой к версии и отложенные поля документированы в Выравнивание полей GenAI и ARMS.
Чтобы ARMS распознавал экспортируемые спаны как приложение GenAI, явно настройте его функцию ресурса:
{
"telemetry": {
"resourceAttributes": {
"acs.arms.service.feature": "genai_app"
}
}
}Qwen Code не внедряет этот специфичный для ARMS атрибут ресурса или gen_ai.span.kind. ARMS может выводить роли LLM, инструмента и агента из gen_ai.operation.name.
-
qwen-code.daemon.request: Оборачивает HTTP-запрос демона.- Атрибуты:
http.request.method,http.route,qwen-code.daemon.operation,session.id,http.response.status_code
- Атрибуты:
-
qwen-code.daemon.bridge: Оборачивает операции bridge демона.- Атрибуты:
qwen-code.daemon.operation
- Атрибуты:
Метрики ресурсов
-
qwen-code.memory.usage(Histogram, bytes): Использование памяти. Записывается монитором нехватки памяти, когда телеметрия включена.- Атрибуты:
memory_type(string: “heap_used”/“rss”)
- Атрибуты:
-
qwen-code.cpu.usage(Histogram, percent): Процент использования CPU. Записывается монитором нехватки памяти, когда телеметрия включена.- Атрибуты: (отсутствуют)
Мониторинг производительности (Зарезервировано)
Следующие метрики определены, но еще не включены в продакшене. Они будут активированы через специальный флаг конфигурации мониторинга производительности.
-
qwen-code.startup.duration(Histogram, ms): Время запуска CLI по фазам.- Атрибуты:
phase(string)
- Атрибуты:
-
qwen-code.tool.queue.depth(Histogram, count): Количество инструментов в очереди на выполнение. -
qwen-code.tool.execution.breakdown(Histogram, ms): Время выполнения инструмента по фазам.- Атрибуты:
function_name,phase(“validation”/“preparation”/“execution”/“result_processing”)
- Атрибуты:
-
qwen-code.token.efficiency(Histogram, ratio): Метрики эффективности использования токенов.- Атрибуты:
model,metric,context(optional)
- Атрибуты:
-
qwen-code.performance.score(Histogram, score): Сводная оценка производительности (0-100).- Атрибуты:
category,baseline(optional)
- Атрибуты:
-
qwen-code.performance.regression(Counter, Int): События обнаружения регрессии.- Атрибуты:
metric,severity(“low”/“medium”/“high”),current_value,baseline_value
- Атрибуты:
-
qwen-code.performance.regression.percentage_change(Histogram, percent): Процентное изменение относительно базового значения.- Атрибуты:
metric,severity,current_value,baseline_value
- Атрибуты:
-
qwen-code.performance.baseline.comparison(Histogram, percent): Производительность относительно базового значения.- Атрибуты:
metric,category,current_value,baseline_value
- Атрибуты: