使用 OpenTelemetry 进行可观测性
使用 OpenTelemetry 进行可观测性
Section titled “使用 OpenTelemetry 进行可观测性”了解如何为 Gemini CLI 启用和设置 OpenTelemetry。
(以下内容需等待原文提供后继续翻译)
使用分析:了解团队之间的交互模式和功能采用情况。 性能监控:跟踪响应时间、令牌消耗和资源利用率。 实时调试:实时识别瓶颈、故障和错误模式。 工作流程优化:做出明智的决策,改进配置和流程。 企业治理:跨团队监控使用情况,跟踪成本,确保合规,并与现有监控基础设施集成。
OpenTelemetry 集成
Section titled “OpenTelemetry 集成”基于**OpenTelemetry** — 中立厂商、行业标准的可观测性框架 — Gemini CLI 的可观测性系统提供:
- 通用兼容性:导出到任何 OpenTelemetry 后端(Google Cloud、Jaeger、Prometheus、Datadog 等)
- 标准化数据:在整个工具链中使用一致的数据格式和收集方法
- 面向未来的集成:与现有和未来的可观测性基础设施连接
- 无厂商锁定:在不更改仪器的情况下切换后端
所有遥测行为都通过您的 .gemini/settings.json 文件控制。环境变量可用于覆盖文件中的设置。
| 设置 | 环境变量 | 描述 | 值 | 默认 |
|---|---|---|---|---|
| telemetry | TELEMETRY | 启用或禁用遥测 | true/false | 默认值 |
| telemetry_url | TELEMETRY_URL | 发送遥测数据的位置 | URL字符串/禁用 | 默认值 |
| otlp_collector_endpoint | OTLP_COLLECTOR_ENDPOINT | OTLP收集器端点 | URL字符串 | 默认值 |
| otlp_transport_protocol | OTLP_TRANSPORT_PROTOCOL | OTLP传输协议 | 协议/禁用 | 默认值 |
| telemetry_file | TELEMETRY_FILE | 将遥测保存到文件(覆盖默认值) | 文件路径 | - |
| include_prompts | INCLUDE_PROMPTS | 在遥测日志中包含提示 | true/false | 默认值 |
| use_external_otlp_collector | USE_EXTERNAL_OTLP_COLLECTOR | 使用外部OTLP收集器(高级) | true/false | 默认值 |
| use_cli_credentials | USE_CLI_CREDENTIALS | 使用CLI凭据进行遥测(仅限GCP目标) | true/false | 默认值 |
关于布尔环境变量的说明: 对于布尔设置(TELEMETRY_ENABLED、TELEMETRY_URL_ENABLED、INCLUDE_PROMPTS),将对应的环境变量设置为”true”或”false”将启用该功能。任何其他值都将禁用它。
【配置指南】 有关所有配置选项的详细信息,请参阅配置指南。
Google Cloud遥测
Section titled “Google Cloud遥测”在使用以下任一方法之前,请完成以下步骤:
-
设置您的Google Cloud项目ID:
- 对于与推断分开项目的遥测:
Terminal window export OTLP_GOOGLE_CLOUD_PROJECT="your-telemetry-project-id" - 对于与推断同一项目的遥测:
Terminal window export GOOGLE_CLOUD_PROJECT="your-project-id"
- 对于与推断分开项目的遥测:
-
使用Google Cloud进行认证:
- 如果使用用户账户:
Terminal window gcloud auth application-default login - 如果使用服务账户:
Terminal window export GOOGLE_APPLICATION_CREDENTIALS="/path/to/your/service-account.json"
- 如果使用用户账户:
-
确保您的账户或服务账户拥有以下IAM角色:
- 云跟踪代理
- 监控指标写入者
- 日志写入者
-
启用所需的Google CloudAPI(如尚未启用):
Terminal window gcloud services enable \cloudtrace.googleapis.com \monitoring.googleapis.com \logging.googleapis.com \--project="$OTLP_GOOGLE_CLOUD_PROJECT"
使用CLI凭证认证
Section titled “使用CLI凭证认证”默认情况下,Google Cloud的遥测收集器使用应用程序默认凭证(ADC)。但是,您可以将其配置为使用与登录Gemini CLI相同的OAuth凭证。这在您没有设置ADC的环境中非常有用。
要启用此功能,请在您的telemetry设置中将useCliAuth属性设置为true:
{ "telemetry": { "enabled": true, "target": "gcp", "useCliAuth": true }}重要:
- 此设置需要使用直接导出(进程内导出器)。
- 它不能与
useCollector: true一起使用。如果同时启用两者,遥测将被禁用,并且会记录错误。 - CLI将自动使用您的凭证与Google Cloud跟踪、指标和日志API进行认证。
直接导出(推荐)
Section titled “直接导出(推荐)”直接将遥测数据发送到Google Cloud服务。无需收集器。
【翻译文本】
- 在您的
.gemini/settings.json中启用遥测:{"telemetry": {"enabled": true,"target": "gcp"}} - 运行 Gemini CLI 并发送提示。
- 查看日志和指标:
- 在发送提示后,在浏览器中打开 Google Cloud 控制台:
基于收集器的导出(高级)
Section titled “基于收集器的导出(高级)”对于自定义处理、过滤或路由,请使用 OpenTelemetry 收集器将数据转发到 Google Cloud。
- 配置您的
.gemini/settings.json:{"telemetry": {"enabled": true,"target": "gcp","useCollector": true}} - 运行自动化脚本:
这将:
Terminal window npm run telemetry -- --target=gcp- 启动一个本地 OTEL 收集器,该收集器将数据转发到 Google Cloud
- 配置您的工作空间
- 提供在 Google Cloud 控制台中查看跟踪、指标和日志的链接
- 将收集器日志保存到
~/.gemini/tmp/<projectHash>/otel/collector-gcp.log - 退出时停止收集器(例如
Ctrl+C)
- 运行 Gemini CLI 并发送提示。
- 查看日志和指标:
- 在发送提示后,在浏览器中打开 Google Cloud 控制台:
- 打开
~/.gemini/tmp/<projectHash>/otel/collector-gcp.log以查看本地 收集器日志。
对于本地开发和调试,您可以在本地捕获遥测数据:
基于文件的输出(推荐)
Section titled “基于文件的输出(推荐)”- 在您的
.gemini/settings.json中启用遥测:{"telemetry": {"enabled": true,"target": "local","otlpEndpoint": "","outfile": ".gemini/telemetry.log"}} - 运行 Gemini CLI 并发送提示。
- 在指定文件中查看日志和指标(例如,
.gemini/telemetry.log)。
基于收集器的导出(高级)
Section titled “基于收集器的导出(高级)”- 运行自动化脚本:
这将:
Terminal window npm run telemetry -- --target=local- 下载并启动 Jaeger 和 OTEL 收集器
- 为本地遥测配置您的工作空间
- 在 http://localhost:16686 提供 Jaeger UI
- 将日志/指标保存到
~/.gemini/tmp/<projectHash>/otel/collector.log - 退出时停止收集器(例如
Ctrl+C)
- 运行 Gemini CLI 并发送提示。
- 在 http://localhost:16686 查看跟踪,并在收集器日志文件中查看日志/指标。
以下部分描述了为 Gemini CLI 产生的日志和指标的架构。
session.id、installation.id 和 user.email(仅当使用 Google 帐户认证时可用)作为所有日志和指标的通用属性包含在内。
日志是特定事件的时间戳记录。以下事件按类别分组,记录了 Gemini CLI 的日志。
捕获启动配置和用户提示提交。
-
gemini_cli.config:在启动时发出一次,带有 CLI 配置。- 属性:
model(字符串)embedding_model(字符串)sandbox_enabled(布尔值)core_tools_enabled(字符串)approval_mode(字符串)api_key_enabled(布尔值)vertex_ai_enabled(布尔值)log_user_prompts_enabled(布尔值)file_filtering_respect_git_ignore(布尔值)debug_mode(布尔值)mcp_servers(字符串)mcp_servers_count(整数)extensions(字符串)extension_ids(字符串)extension_count(整数)mcp_tools(如果适用,字符串)mcp_tools_count(如果适用,整数)output_format(“text”、“json” 或 “stream-json”)
- 属性:
-
gemini_cli.user_prompt:当用户提交提示时发出。- 属性:
prompt_length(整数)prompt_id(字符串)prompt(字符串;如果telemetry.logPrompts是false,则排除)auth_type(字符串)
- 属性:
捕获工具执行、输出截断和编辑行为。
-
每个工具(函数)调用都会触发
gemini_cli.tool_call。- 属性:
function_namefunction_argsduration_mssuccess(布尔值)decision(“accept”、“reject”、“auto_accept” 或 “modify”,如果适用)error(如果适用)error_type(如果适用)prompt_id(字符串)tool_type(“native” 或 “mcp”)mcp_server_name(如果适用,字符串)extension_name(如果适用,字符串)extension_id(如果适用,字符串)content_length(如果适用,整数)metadata(如果适用)
- 属性:
-
工具调用的输出被截断
gemini_cli.tool_output_truncated。- 属性:
tool_name(字符串)original_content_length(整数)truncated_content_length(整数)threshold(整数)lines(整数)prompt_id(字符串)
- 属性:
-
选择的编辑策略
gemini_cli.edit_strategy。- 属性:
strategy(字符串)
- 属性:
-
编辑修正结果
gemini_cli.edit_correction。- 属性:
correction(“success” | “failure”)
- 属性:
-
此事件提供了关于 GenAI 操作的详细信息,与 [OpenTelemetry GenAI 语义约定事件] 保持一致
gen_ai.client.inference.operation.details。- 属性:
gen_ai.request.model(字符串)gen_ai.provider.name(字符串)gen_ai.operation.name(字符串)gen_ai.input.messages(JSON 字符串)gen_ai.output.messages(JSON 字符串)gen_ai.response.finish_reasons(字符串数组)gen_ai.usage.input_tokens(整数)gen_ai.usage.output_tokens(整数)gen_ai.request.temperature(浮点数)gen_ai.request.top_p(浮点数)gen_ai.request.top_k(整数)gen_ai.request.max_tokens(整数)gen_ai.system_instructions(JSON 字符串)server.address(字符串)server.port(整数)
- 属性:
跟踪工具执行的文件操作。
对于给定的 Markdown 文档片段,以下是翻译后的简体中文文本:
对于文件操作,将发出以下事件。
- 属性:
tool_name(字符串)operation(“create” | “read” | “update”)lines(整数,可选)mimetype(字符串,可选)extension(字符串,可选)programming_language(字符串,可选)
捕获 Gemini API 的请求、响应和错误。
-
gemini_cli.api_request:发送到 Gemini API 的请求。- 属性:
model(字符串)prompt_id(字符串)request_text(字符串,可选)
- 属性:
-
gemini_cli.api_response:从 Gemini API 收到的响应。- 属性:
model(字符串)status_code(整数或字符串)duration_ms(整数)input_token_count(整数)output_token_count(整数)cached_content_token_count(整数)thoughts_token_count(整数)tool_token_count(整数)total_token_count(整数)response_text(字符串,可选)prompt_id(字符串)auth_type(字符串)finish_reasons(字符串数组)
- 属性:
-
gemini_cli.api_error:API 请求失败。- 属性:
model(字符串)error(字符串)error_type(字符串)status_code(整数或字符串)duration_ms(整数)prompt_id(字符串)auth_type(字符串)
- 属性:
-
gemini_cli.malformed_json_response:无法解析generateJson响应。- 属性:
model(字符串)
- 属性:
-
gemini_cli.slash_command:执行了斜杠命令。- 属性:
command(字符串)subcommand(字符串,可选)status(“success” | “error”)
- 属性:
-
gemini_cli.slash_command.model:通过斜杠命令选择了模型。- 属性:
model_name(字符串)
- 属性:
请注意,根据您的要求,代码块和特殊标记已被保留,并且没有翻译。
【翻译】
- 模型路由器做出了决策。
- 属性:
decision_model(字符串)decision_source(字符串)routing_latency_ms(整数)reasoning(字符串,可选)failed(布尔值)error_message(字符串,可选)
- 属性:
-
聊天上下文被压缩。
- 属性:
tokens_before(整数)tokens_after(整数)
- 属性:
-
从流中接收到无效的分块。
- 属性:
error.message(字符串,可选)
- 属性:
-
由于内容错误触发了重试。
- 属性:
attempt_number(整数)error_type(字符串)retry_delay_ms(整数)model(字符串)
- 属性:
-
所有内容重试失败。
- 属性:
total_attempts(整数)final_error_type(字符串)total_duration_ms(整数,可选)model(字符串)
- 属性:
-
对话会话结束。
- 属性:
approvalMode(字符串)turnCount(整数)
- 属性:
-
确定下一个发言者。
- 属性:
prompt_id(字符串)finish_reason(字符串)result(字符串)
- 属性:
记录模型和网络操作的降级机制。
-
切换到快闪模型作为降级。
- 属性:
auth_type(字符串)
- 属性:
-
切换到 grep 作为文件搜索的降级。
- 属性:
error(字符串,可选)
- 属性:
-
尝试 web-fetch 降级。
- 属性:
reason(“private_ip” | “primary_failed”)
- 属性:
跟踪扩展的生命周期和设置更改。
【译文】
-
扩展已安装。
- 属性:
extension_name(字符串)extension_version(字符串)extension_source(字符串)status(字符串)
- 属性:
-
扩展已卸载。
- 属性:
extension_name(字符串)status(字符串)
- 属性:
-
扩展已启用。
- 属性:
extension_name(字符串)setting_scope(字符串)
- 属性:
-
扩展已禁用。
- 属性:
extension_name(字符串)setting_scope(字符串)
- 属性:
-
扩展已更新。
- 属性:
extension_name(字符串)extension_version(字符串)extension_previous_version(字符串)extension_source(字符串)status(字符串)
- 属性:
-
代理运行开始。
- 属性:
agent_id(字符串)agent_name(字符串)
- 属性:
-
代理运行结束。
- 属性:
agent_id(字符串)agent_name(字符串)duration_ms(整数)turn_count(整数)terminate_reason(字符串)
- 属性:
捕获 IDE 连接性和对话生命周期事件。
- IDE 伴侣连接。
- 属性:
connection_type(字符串)
- 属性:
跟踪终端渲染问题及相关信号。
- 终端 kitty 控制序列溢出。
- 属性:
sequence_length(整数)truncated_sequence(字符串)
- 属性:
指标是随时间推移的行为的数值测量。
统计 CLI 启动时的会话数。
gemini_cli.session.count(计数器,整数):每次 CLI 启动时增加一次。
测量工具使用和延迟。
【术语表】
- CLI: CLI(命令行界面)
- command-line interface: 命令行界面
- Shell: Shell
- Bash: Bash
- API: API
- endpoint: 端点
- token: 令牌
- Model Context Protocol: 模型上下文协议(MCP)
- MCP: MCP
- Markdown: Markdown
- JSON: JSON
- YAML: YAML
- Mermaid: Mermaid
- npm: npm
- pip: pip
- git: git
- repository: 仓库
- package: 包
- dependency: 依赖
- configuration: 配置
- environment variable: 环境变量
- workspace: 工作空间
- directory: 目录
- file: 文件
- script: 脚本
- plugin: 插件
- extension: 扩展
- integration: 集成
- authentication: 认证
- authorization: 授权
- credential: 凭证
- session: 会话
- context: 上下文
- prompt: 提示词
- completion: 补全
- streaming: 流式
- model: 模型
- provider: 提供商
- service: 服务
- request: 请求
- response: 响应
- header: 头部
- body: 主体
- payload: 负载
- error: 错误
- exception: 异常
- warning: 警告
- debug: 调试
- logging: 日志
- telemetry: 遥测
- analytics: 分析
- monitoring: 监控
- performance: 性能
- latency: 延迟
- throughput: 吞吐量
- concurrency: 并发
- thread: 线程
- process: 进程
- daemon: 守护进程
- background: 背景
- foreground: 前台
- interactive: 交互式
- batch: 批处理
- queue: 队列
- cache: 缓存
- database: 数据库
- storage: 存储
- memory: 内存
- disk: 磁盘
- network: 网络
- protocol: 协议
- HTTP: HTTP
- HTTPS: HTTPS
- WebSocket: WebSocket
- REST: REST
- GraphQL: GraphQL
- RPC: RPC
- SDK: SDK
- library: 库
- framework: 框架
- runtime: 运行时
- build: 构建
- deploy: 部署
- release: 发布
- version: 版本
- changelog: 更新日志
- migration: 迁移
- compatibility: 兼容性
- breaking change: 破坏性变更
- feature: 功能
- bug fix: 错误修复
- improvement: 改进
- enhancement: 增强
- refactor: 重构
- documentation: 文档
- tutorial: 教程
- example: 示例
- demo: 演示
- test: 测试
- unit test: 单元测试
【原文】
-
计数器(整数): 计数工具调用次数。
- 属性:
- 占位符
function_name - 占位符
success(布尔值) - 占位符
decision(字符串:“accept”、“reject”、“modify” 或 “auto_accept”,如果适用) - 占位符
tool_type(字符串:“mcp” 或 “native”,如果适用)
- 占位符
- 属性:
-
直方图(毫秒): 测量工具调用延迟。
- 属性:
- 占位符
function_name
- 占位符
- 属性:
跟踪 API 请求量和延迟。
-
计数器(整数): 计数所有 API 请求。
- 属性:
- 占位符
model - 占位符
status_code - 占位符
error_type(如果适用)
- 占位符
- 属性:
-
直方图(毫秒): 测量 API 请求延迟。
- 属性:
- 占位符
model
- 占位符
- 注意:与占位符
gen_ai.client.operation.duration(GenAI 约定)重叠。
- 属性:
跟踪模型和类型的令牌使用情况。
- 计数器(整数): 计数使用的令牌。
- 属性:
- 占位符
model - 占位符
type(“input”、“output”、“thought”、“cache” 或 “tool”)
- 占位符
- 属性:
【翻译】
-
计数器,整型(Counter, Int):统计流中的无效数据块。
-
计数器,整型(Counter, Int):因内容错误而重试的次数。
-
计数器,整型(Counter, Int):统计所有内容重试失败的请求。
统计模型路由的延迟/失败和斜杠命令选择。
-
计数器,整型(Counter, Int):通过斜杠命令选择模型的次数。
- 属性:
- 字符串(string)
- 属性:
-
直方图,毫秒(Histogram, ms):模型路由决策的延迟。
- 属性:
- 字符串(string)
- 字符串(string)
- 属性:
-
计数器,整型(Counter, Int):统计模型路由失败的次数。
- 属性:
- 字符串(string)
- 字符串(string)
- 属性:
代理生命周期指标:运行次数、持续时间和轮次。
-
计数器,整型(Counter, Int):统计代理运行次数。
- 属性:
- 字符串(string)
- 字符串(string)
- 属性:
-
直方图,毫秒(Histogram, ms):代理运行持续时间。
- 属性:
- 字符串(string)
- 属性:
-
直方图,轮次(Histogram, turns):每次代理运行的轮次。
- 属性:
- 字符串(string)
- 属性:
用户界面稳定性信号,例如闪烁计数。
- 计数器,整型(Counter, Int):统计UI帧闪烁次数(渲染高于终端高度)。
可选的性能监控,包括启动、CPU/内存和阶段计时。
-
直方图,毫秒(Histogram, ms):按阶段统计CLI启动时间。
- 属性:
- 字符串(string)
- 映射(可选,map, optional)
- 属性:
-
直方图,字节(Histogram, bytes):内存使用情况。
- 属性:
- “heap_used”, “heap_total”, “external”, “rss”
- 字符串(可选,string, optional)
- 属性:
-
直方图,百分比(Histogram, percent):CPU使用百分比。
- 属性:
- 字符串(可选,string, optional)
- 属性:
-
执行队列中的工具数量(直方图,计数)。
-
按阶段划分的工具时间(直方图,毫秒)。
- 属性:
function_name(字符串)phase(“validation”, “preparation”, “execution”, “result_processing”)
- 属性:
-
按阶段划分的API请求时间(直方图,毫秒)。
- 属性:
model(字符串)phase(“request_preparation”, “network_latency”, “response_processing”, “token_processing”)
- 属性:
-
令牌效率指标(直方图,比率)。
- 属性:
model(字符串)metric(字符串)context(字符串,可选)
- 属性:
-
复合性能得分(直方图,分数)。
- 属性:
category(字符串)baseline(数字,可选)
- 属性:
-
回归检测事件(计数器,整型)。
- 属性:
metric(字符串)severity(“low”, “medium”, “high”)current_value(数字)baseline_value(数字)
- 属性:
-
当检测到回归时的基线变化百分比(直方图,百分比)。
- 属性:
metric(字符串)severity(“low”, “medium”, “high”)current_value(数字)baseline_value(数字)
- 属性:
-
与基线比较(直方图,百分比)。
- 属性:
metric(字符串)category(字符串)current_value(数字)baseline_value(数字)
- 属性:
GenAI语义约定
Section titled “GenAI语义约定”以下指标符合[OpenTelemetry GenAI语义约定],用于标准化GenAI应用程序的可观测性:
-
每个操作使用的输入和输出令牌数量(直方图,令牌)。
- 属性:
- 操作类型(字符串):例如,“generate_content”、“chat”
- GenAI提供商(字符串):“gcp.gen_ai”或“gcp.vertex_ai”
- 令牌类型(字符串):“input”或“output”
- 请求所用的模型名称(字符串,可选)
- 生成响应的模型名称(字符串,可选)
- GenAI服务器地址(字符串,可选)
- GenAI服务器端口(整数,可选)
- 属性:
-
GenAI操作持续时间直方图(秒)。
- 属性:
- 操作类型(字符串):例如,“generate_content”、“chat”
- GenAI提供商(字符串):“gcp.gen_ai”或“gcp.vertex_ai”
- 请求所用的模型名称(字符串,可选)
- 生成响应的模型名称(字符串,可选)
- GenAI服务器地址(字符串,可选)
- GenAI服务器端口(整数,可选)
- 如果操作失败,错误类型(字符串,可选)
- 属性:
[OpenTelemetry GenAI语义约定]: https://github.com/open-telemetry/semantic-conventions/blob/main/docs/gen-ai/gen-ai-metrics.md [OpenTelemetry GenAI事件语义约定]: https://github.com/open-telemetry/semantic-conventions/blob/8b4f210f43136e57c1f6f47292eb6d38e3bf30bb/docs/gen-ai/gen-ai-events.md