apps/server/docs/ai-context/observability-conventions.md
这份约定定义 AIRI 服务端新增 trace / metric attributes 时应该遵守的命名规则,目标是减少自定义前缀扩散,并让 Grafana / Tempo / Loki 查询尽量对齐 OpenTelemetry 语义约定。
airi.* 命名空间下。llm.*、gateway.*、telegram.* 之类的 attribute key。优先使用:
GEN_AI_ATTR_OPERATION_NAMEGEN_AI_ATTR_REQUEST_MODELGEN_AI_ATTR_USAGE_INPUT_TOKENSGEN_AI_ATTR_USAGE_OUTPUT_TOKENSSERVER_ATTR_ADDRESSSERVER_ATTR_PORT适用场景:
注意:
Development 状态,因此只在“语义明确匹配”时采用。gen_ai.*。优先使用:
db.system.namedb.operation.namedb.namespacedb.query.textdb.response.status_codeserver.addressserver.portRedis 相关优先复用 instrumentation 自动产生的标准属性,不要重复造一套并行命名。
以下场景使用 airi.*:
当前示例:
AIRI_ATTR_BILLING_FLUX_CONSUMEDAIRI_ATTR_GEN_AI_STREAMAIRI_ATTR_GEN_AI_STREAM_INTERRUPTEDAIRI_ATTR_GEN_AI_OPERATION_KINDAIRI_ATTR_GEN_AI_INPUT_MESSAGESAIRI_ATTR_GEN_AI_INPUT_TEXTAIRI_ATTR_GEN_AI_OUTPUT_TEXT当前 apps/server 仍保留以下 metric name:
llm.request.durationllm.request.countllm.tokens.promptllm.tokens.completionflux.consumed这是有意为之,不是遗漏。
原因:
面板和告警查询优先依赖 metric labels,对齐我们已经统一的 attributes。
优先使用这些 Prometheus label:
gen_ai_request_modelgen_ai_operation_nameairi_gen_ai_operation_kindhttp_response_status_code说明:
. 转成 _,所以 gen_ai.request.model 会变成 gen_ai_request_model。gen_ai_operation_name 适合 chat、embeddings 这类有明确 semconv 的操作。airi_gen_ai_operation_kind 适合当前没有明确 semconv 的 AIRI 自定义操作类型,例如 tts、asr。新增 dashboard、录制规则、告警时,不要再新增依赖这些旧 label:
modeltype旧面板可以渐进迁移,不要求一次性全部替换,但新改动必须直接使用新标签。
apps/server/otel/grafana/dashboards/airi-server-overview-cloud.json 已经按以下方式查询:
gen_ai_request_modelgen_ai_operation_name + airi_gen_ai_operation_kindgen_ai_request_modelgen_ai_request_modelgen_ai_request_model如果未来新增本地 dashboard 或新的 cloud dashboard,默认按这一套 label 维度来。
span name 目前允许保留业务可读格式,例如:
llm.gateway.chatllm.gateway.ttsllm.gateway.asr原因:
如果未来统一 span name,也应保证查询主要依赖 gen_ai.* / db.* / airi.* attributes。
新增 observability 字段前,先问自己:
airi.*,而不是新造顶级前缀?gen_ai_request_model、gen_ai_operation_name、airi_gen_ai_operation_kind,而不是旧的 model / type?