打开编码插件- otel
一个 打开代码 通过 OpenTeleometry 导出遥测( OTLP over gRPC 或 HTTP/ protobuf) 的插件, 反射和 克劳德代码的监控。 。 。 .
仅限 OpenCode V2 . 版本
2.x此插件目标 打开代码>=2并输出 V2Plugin.define-样式默认导出( e)id: "devtheops.otel") (中文(简体) ). OpenCode V1 插件得到维护 编辑v1分支 编辑1.x释放 线条。 见 OpenCode 版本支持。 。 。 .
OpenCode 版本支持
| 插件行 | 打开代码 | 配置密钥 | 入境点 |
|---|---|---|---|
2.x (单位:千美元)main(中文(简体) ) | V2(>=2(中文(简体) ) | plugins | 默认导出 { id, setup } |
1.x (单位:千美元)v1 分支) | 五一号 | plugin | 名称 OtelPlugin 导出 |
OpenCode V2 替换了粗糙的 V1 消息事件 (message.updated, (中文(简体) ), message.part.updated(中文(简体) )
并删除 command.executed 财务报告和审定财务报表 session.diff 从插件事件流。 它规定
permission.asked 编号 : permission.replied 替换 V1 的 permission.updated 编号 : permission.replied, (中文(简体) ),
外加颗粒会话分类
(单位:千美元)session.execution.*, (中文(简体) ), session.step.*, (中文(简体) ), session.tool.*, (中文(简体) ), session.usage.updated, (中文(简体) ),
session.retry.scheduled) (中文(简体) ). 此插件直接消耗 V2 流, 产生更多
准确的LLM和工具比V1执行的时间跨度.
V1 信号等同 : lines_of_code.count 编号 : lines_of_code.total 依赖V1
session.diff 事件,而不会释放。 V2客户端有一个会话diff端点,
但是, V2 插件上下文不会曝光; VCS diff API 是寄存器范围
并且不等于每会的总数. command.executed 仪器是
替换为成功完成 shell-tool 。 信件/部分跨度被替换为
每步 LLM 跨度; 已完成的文本段仍然充斥 output.value 财务报告和审定财务报表
llm.output_messages。 。 。 .
当V2通过子代理工具进步或结果元数据提供清晰的子会话ID时, 子剂运行在调度工具下覆盖巢穴。 模糊或错失的关联又回到 父母运行跨度;背景孩子可能活过其已经到期的发送工具跨度.
它的乐器
计量
| 度量衡 | 类型 | 说明 |
|---|---|---|
opencode.session.count | 计数器 | 递增 session.created,或者在首次观测到原有会话时懒散 |
opencode.token.usage | 计数器 | 每个符号类型 : input, (中文(简体) ), output, (中文(简体) ), reasoning, (中文(简体) ), cacheRead, (中文(简体) ), cacheCreation (单位:千美元) session.step.ended) (中文(简体) ). 与 OPENCODE_COMBINE_REASONING_TOKENS, (中文(简体) ), reasoning 折叠为 output 而不单独排放 |
opencode.cost.usage | 计数器 | 每个完成的LLM步骤的美元费用 |
opencode.commit.count | 计数器 | git commit 在成功执行的 shell-tool调用中观察到的命令; Git 生成的仓库状态未验证 |
opencode.tool.duration | 直方图 | 工具执行时间( 毫秒) |
opencode.cache.count | 计数器 | 每一步缓存活性 : type=cacheRead 或者说 type=cacheCreation |
opencode.session.duration | 直方图 | 从会话创建(或第一次观察)到执行结束/ 闲置的时长以毫秒计 |
opencode.message.count | 计数器 | 完成或失败的 LLM 步骤的助理信息 |
opencode.session.token.total | 直方图 | 执行结束时记录的每会话消费的代号总数 |
opencode.session.cost.total | 直方图 | 以美元计的每届会议费用总额,执行结束时入账 |
opencode.model.usage | 计数器 | 每个模型和提供者的信息 |
opencode.retry.count | 计数器 | 通过耐用观测到的 API 重试 session.retry.scheduled 事件 |
opencode.subtask.count | 计数器 | 通过 session.created 带有 parentID |
日志事件
| 活动 | 说明 |
|---|---|
session.created | 会话开始 |
session.idle | 会话闲置( 包括总的令牌、 成本、 信件) |
session.error | 执行失败 |
user_prompt | 用户通过 session.inbox.enqueued (包括: prompt_length, (中文(简体) ), delivery; 还 prompt 何时 OPENCODE_CAPTURE_PROMPT_IN_LOGS 设置) |
api_request | 已完成 LLM 步骤(电话机、费用) |
api_error | LLM 步骤失败( 错误摘要) |
tool_result | 工具完成或出错(期限、成功、输出大小) |
tool_decision | 权限即时响应( 接受/ 拒绝) |
commit | 已检测出 Git 行为 |
subtask_invoked | 创建子代理会话(代理和主会话ID) |
安装
在您的打开代码配置中添加插件 ~/.config/opencode/opencode.json数字 :
{
"$schema": "https://opencode.ai/config.json",
"plugins": ["@devtheops/opencode-plugin-otel"]
}
为本地开发,安装依赖性 bun install 和
创建 .opencode/plugins/otel/index.ts 在 OpenCode 运行的项目中 :
export { default } from "/path/to/opencode-plugin-otel/src/index.ts"
OpenCode V2 自动发现此目录. 打开代码 2.0.1页:1
plugins 软件包条目直接指向绝对值 .ts 文件被拒绝;
包装器需要目录.
配置
插件从 OPENCODE_* 环境变量和(或)内置 插件选项 内 opencode.json。当两者同时存在时,一个选项胜过匹配的环境变量,后者胜过内置默认值.
当 OpenCode 在一个进程中加载多个位置时,所有已启用实例都必须 使用相同的遥测配置。 一个相互冲突的终点,认证, 资源属性、 参数前缀或信号选项失败而非设置 使用另一个位置的设置导出一个位置的数据 。 事件属性 可用时使用已观测到的会话项目ID。 共享事件处理 序列化所以同步会话查询无法重排步骤开始/结束事件 .
环境变量( 设置在您的外壳配置中 ) - ~/.zshrc, (中文(简体) ), ~/.bashrc等 :
| 变量 | 默认 | 说明 |
|---|---|---|
OPENCODE_ENABLE_TELEMETRY | (未设定) | 设置到任何非空值以启用插件 |
OPENCODE_OTLP_ENDPOINT | http://localhost:4317 | OTLP收集器端点. 总是包含一个 URL 方案 。 对于 grpc,使用收藏器 URL(例如 http://localhost:4317 或者说 grpc://collector:4317) (中文(简体) ). 对于 http/protobuf 财务报告和审定财务报表 http/json,使用基准 URL,插件将附加 /v1/traces, (中文(简体) ), /v1/metrics,以及 /v1/logs。 。 。 . |
OPENCODE_OTLP_PROTOCOL | grpc | OTLP运输协议: grpc, (中文(简体) ), http/protobuf,或 http/json |
OPENCODE_OTLP_METRICS_INTERVAL | 60000 | 导出间隔( 毫秒) |
OPENCODE_OTLP_LOGS_INTERVAL | 5000 | 日志导出间隔( 毫秒) |
OPENCODE_METRIC_PREFIX | opencode. | 所有公尺名称的前缀(例如设置为 claude_code. claude 代码仪表板兼容性) |
OPENCODE_DISABLE_METRICS | (未设定) | 以逗号分隔的计量名后缀列表来禁用(例如. cache.count,session.duration(中文(简体) ) |
OPENCODE_DISABLE_LOGS | (未设定) | 设定为任何非空值, 以压制所有 OTLP 日志事件, 而未留下测量和痕迹 |
OPENCODE_CAPTURE_PROMPT_IN_LOGS | (未设定) | 设定为任何非空值,以便在 prompt 属性 user_prompt 日志事件. 仅记录事件 - 跟踪跨度带有观测到的迅速进入 input.value 不分此旗帜( 无法通过 OPENCODE_DISABLE_TRACES) (中文(简体) ). 默认关闭——提示可能包含秘密或PII;只允许信任的收藏家使用. |
OPENCODE_CAPTURE_MODEL_CONTEXT | (未设定) | 设定为任何非空值, 将主模型可见上下文的限定文本预览附加到 LLM 跨度 。 默认关闭;可以包含系统指令,更早的消息,以及工具文本. |
OPENCODE_COMBINE_REASONING_TOKENS | (未设定) | 设定为任何非空值, 报告推理符作为其中的一部分 output 而不是单独的 reasoning 类型。 OpenCode V2 排除推理 output,而克洛德代码包含它, 所以让这个为克洛德代码仪表板和成本平价。 适用于 token.usage 计量, api_request output_tokens (与 reasoning_tokens 和 LLM 跨度 llm.token_count.completion· ; llm.token_count.completion_details.reasoning 仍然带有推理子集. |
OPENCODE_DISABLE_TRACES | (未设定) | 以逗号分隔的可禁用微量类型列表( N)session, (中文(简体) ), llm, (中文(简体) ), tool) (中文(简体) ). 使用 all, (中文(简体) ), *, (中文(简体) ), true,或 1 以禁用每个跟踪类型 |
OPENCODE_OTLP_HEADERS | (未设定) | 逗号分隔 key=value 在OTLP的所有出口中增加了页眉. 远离版本控制——可能包含敏感的认证符号. |
OPENCODE_OTLP_HEADERS_HELPER | (未设定) | 可执行的脚本/ 二进制,在认证失败后返回动态 OTLP 头作为 JSON 。 帮助信头覆盖 OPENCODE_OTLP_HEADERS。 。 。 . |
OPENCODE_RESOURCE_ATTRIBUTES | (未设定) | 逗号分隔 key=value 组合合并为OTel资源. 示例 service.version=1.2.3,deployment.environment=production |
OPENCODE_SPAN_ATTRIBUTES | (未设定) | 逗号分隔 key=value 与每个排放的跨度、日志事件和度量数据点相接。 示例 team=platform,deployment.environment=production |
OPENCODE_OTLP_METRICS_TEMPORALITY | (未设定) | 计量汇总时间性 : delta, (中文(简体) ), cumulative,或 lowmemory数据犬( 需要)delta) (中文(简体) ). 转给出口商并复制到 OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE。 。 。 . |
OPENCODE_TRACEPARENT | (未设定) | W3C 战车 traceparent 绳子。 设定时,所有跨度都会在此远程上下文下被父化,因此开口码会追踪呼叫者追踪中的巢穴(例如CI活). 无效的值会被记录和忽略 。 注意: 默认 ParentBased 采样器,带有被采样的旗去掉的值(...-00)抑制所有微量导出. |
OPENCODE_TRACESTATE | (未设定) | W3C 战车 tracestate 字符串, 边解析 OPENCODE_TRACEPARENT 并附在远程父上下文。 除非有效,否则被忽略 OPENCODE_TRACEPARENT 也设置了. |
OPENCODE_TRACE_PROPAGATION_PROVIDERS | (未设定) | 接收 W3C 的逗号分隔开码提供者ID traceparent 财务报告和审定财务报表 tracestate 关于 LLM 请求的页眉 。 使用 * 明确允许每个提供者. |
默认情况下, 快速日志仍然被禁用 。 只有当所配置的遥测目标被信任以接收潜在的敏感即时内容时才启用它.
插件选项( opencode.json)
每个设置也可以通过 Opencode 插件内接 对象窗体,所以不需要在外壳中输出。 选项优先于匹配 OPENCODE_* 环境变量,它反过来胜过内置默认值.
{
"$schema": "https://opencode.ai/config.json",
"plugins": [
{
"package": "@devtheops/opencode-plugin-otel",
"options": {
"enabled": true,
"endpoint": "http://localhost:4317",
"protocol": "grpc",
"metricPrefix": "claude_code.",
"resourceAttributes": "service.version=1.2.3,deployment.environment=production",
"disabledTraces": ["tool"]
}
}
]
}
选项密钥映射已解析的配置并映射到环境变量 :
| 选项 | 环境变量 |
|---|---|
enabled | OPENCODE_ENABLE_TELEMETRY |
logsEnabled | OPENCODE_DISABLE_LOGS (倒转) |
capturePromptInLogs | OPENCODE_CAPTURE_PROMPT_IN_LOGS |
captureModelContext | OPENCODE_CAPTURE_MODEL_CONTEXT |
combineReasoningTokens | OPENCODE_COMBINE_REASONING_TOKENS |
logLevel | (无——仅选择)数字 : debug, (中文(简体) ), info, (中文(简体) ), warn, (中文(简体) ), error |
endpoint | OPENCODE_OTLP_ENDPOINT |
protocol | OPENCODE_OTLP_PROTOCOL |
metricsInterval | OPENCODE_OTLP_METRICS_INTERVAL |
logsInterval | OPENCODE_OTLP_LOGS_INTERVAL |
metricPrefix | OPENCODE_METRIC_PREFIX |
otlpHeaders | OPENCODE_OTLP_HEADERS |
otlpHeadersHelper | OPENCODE_OTLP_HEADERS_HELPER |
resourceAttributes | OPENCODE_RESOURCE_ATTRIBUTES |
spanAttributes | OPENCODE_SPAN_ATTRIBUTES |
traceparent | OPENCODE_TRACEPARENT |
tracestate | OPENCODE_TRACESTATE |
metricsTemporality | OPENCODE_OTLP_METRICS_TEMPORALITY |
disabledMetrics | OPENCODE_DISABLE_METRICS (阵列,不是逗号字符串) |
disabledTraces | OPENCODE_DISABLE_TRACES (阵列,不是逗号字符串) |
tracePropagationProviders | OPENCODE_TRACE_PROPAGATION_PROVIDERS (阵列,不是逗号字符串) |
安全说明:
opencode.json经常致力于版本控制。 保密,例如otlpHeaders在环境变量或打开代码中{env:VAR}替换(例如:."otlpHeaders": "{env:OTEL_HEADERS}"而不是内在.
快开始
export OPENCODE_ENABLE_TELEMETRY=1
export OPENCODE_OTLP_ENDPOINT=http://localhost:4317
export OPENCODE_OTLP_PROTOCOL=grpc
opencode
总是设定 OPENCODE_OTLP_ENDPOINT 到一个包含一个方案的完整 URL。 无方案值 localhost:4317 拒绝.
对于 OPENCODE_OTLP_PROTOCOL=http/protobuf 或者说 OPENCODE_OTLP_PROTOCOL=http/json设置 OPENCODE_OTLP_ENDPOINT 改为收集器基址,而不是每个符号路径。 插件将其扩展为 /v1/traces, (中文(简体) ), /v1/metrics,以及 /v1/logs 自动.
标题和资源属性
# Auth token for a managed collector (e.g. Honeycomb, Grafana Cloud)
export OPENCODE_OTLP_HEADERS="x-honeycomb-team=your-api-key,x-honeycomb-dataset=opencode"
# Tag every metric and log with deployment context
export OPENCODE_RESOURCE_ATTRIBUTES="service.version=1.2.3,deployment.environment=production"
# Tag every span, log event, and metric point with filterable attributes
export OPENCODE_SPAN_ATTRIBUTES="team=platform,deployment.environment=production"
安全说明:
OPENCODE_OTLP_HEADERS通常含有认证符号。 设置在您的外壳配置( N)~/.zshrc, (中文(简体) ),~/.bashrc)或秘密管理器——永远不要承诺用于版本控制或将其打印入CI日志.
OPENCODE_RESOURCE_ATTRIBUTES 财务报告和审定财务报表 OPENCODE_SPAN_ATTRIBUTES 独立:
- 使用
OPENCODE_RESOURCE_ATTRIBUTES用于生产OTel资源元数据. - 使用
OPENCODE_SPAN_ATTRIBUTES用于每个跨度、日志事件和用于过滤或后端分组的度量数据点.
动态信头
使用 OPENCODE_OTLP_HEADERS_HELPER 当您的收藏家需要短期认证符时。 设定此选项时, 插件会在启动时预置一次帮助器, 这样第一个导出就可以使用新鲜的证书 。 如果以后的 OTLP 导出失败, 认证错误 (401编号 :403 用于 HTTP 或 UNAUTHENTICATED编号 :PERMISSION_DENIED 对于 gRPC ,插件会再次刷新信头,重建导出者,并重复一次失败的导出 .
export OPENCODE_OTLP_HEADERS_HELPER=/path/to/opencode-otel-headers.sh
使用绝对帮助路径 。 如果您需要路径来遵循当前工程, OPENCODE_OTLP_HEADERS_HELPER 也支持 ${PROJECT_ROOT}, (中文(简体) ), ${WORKTREE},以及 ${DIRECTORY} 占位符 .
export OPENCODE_OTLP_HEADERS_HELPER='${PROJECT_ROOT}/scripts/opencode-otel-headers.sh'
帮助者必须是可执行的,并打印一个 JSON 对象以显示 :
#!/bin/sh
printf '{"Authorization":"Bearer %s"}' "$(get-token.sh)"
对于一个使用IAM认证的云跑采集器, get-token.sh 也许是 gcloud auth print-identity-token。 。 。 .
若为 OPENCODE_OTLP_HEADERS 还设置了, 帮助提供的标题覆盖同名的静态标题。 头值从未被记录 .
模式可见上下文抓取
export OPENCODE_CAPTURE_MODEL_CONTEXT=1
当启用时, session.hook("context") 最多抓取两个系统部件和最后十二个部件
信件,只保留文本部分,并切入每个字符至1,000个字符。 匹配的初级
LLM 跨度收到此预览 llm.input_messages 及其最新的用户文本 input.value。 。 。 .
不包括媒体字节和结构化工具有效载荷。 钩子观察其位置的背景
;后续插件仍可更改请求。 这是独立于
OPENCODE_CAPTURE_PROMPT_IN_LOGS 并且可以包括以前消息中的秘密或PII,
系统指令,或工具文本。 只用一个信任的收藏家.
LLM 微量传播
使用 OPENCODE_TRACE_PROPAGATION_PROVIDERS 连接此插件的 LLM 跨度到像 LiteLLM 或 vLLLM 这样的 LLM 网关所释放的跨度 。 对于匹配的提供者 ID, 插件注入当前 opencode.llm 间距为 W3C traceparent 页眉并包含 tracestate 当在现相.
传播仅限于初级代理-loop请求,其提供者、模型和代理匹配主动LLM步骤;标题、收缩和瞬时生成请求不归为该步骤.
export OPENCODE_TRACE_PROPAGATION_PROVIDERS="company-litellm,vllm"
值是开口码提供者ID,包括配置在 provider 键入 opencode.json。在设置未设定时,宣传被禁用。 使用 * 仅当每个配置的提供者收到微量上下文时.
仅传播了W3C微量上下文. 该插件不注入任意头或W3C行李. 通过提供者的本土配置静态提供者专用信头 options.headers 设置在 opencode.json。 。 。 .
对于 WebSocket 支持的提供者,插件也注入了 V2 的实验性
experimental.ws.handshake 钩. 每一步更换跟踪头可以重开一个再利用的套接字,
因此,只有在连接痕迹大于连接再利用的情况下,才能向供应商传播.
钩子是实验性的,应该根据你供应商的WebSocket路线进行验证.
使具体衡量标准失效
使用 OPENCODE_DISABLE_METRICS 压制个人衡量标准。 该值是一个以逗号分隔的公尺名后缀列表(没有前缀).
禁用一个度量衡只会阻止计数器/相图被递增——相应的日志事件仍然被放出.
# Disable a single metric
export OPENCODE_DISABLE_METRICS="retry.count"
# Disable multiple metrics
export OPENCODE_DISABLE_METRICS="cache.count,session.duration,session.token.total,session.cost.total,model.usage,retry.count,message.count"
仅限代码的度量标准
以下的度量衡是开口码的特有性,在克洛德码的内置监测中没有等同性. 如果您使用克洛德码仪表板,并想避免用只用开码的度量符来搅拌,可以禁用:
export OPENCODE_DISABLE_METRICS="cache.count,session.duration,session.token.total,session.cost.total,model.usage,retry.count,message.count"
| 计量后缀 | 为什么它只开放代码 |
|---|---|
cache.count | 跟踪缓存读取/写入活动作为发生数——不是克劳德代码信号 |
session.duration | 会话时钟持续时间——不是由克洛德代码发布的 |
session.token.total | 平面符号直方图——不是克洛德代码发布的 |
session.cost.total | 人均成本直方图——不是克洛德代码发布的 |
model.usage | 每个模型信息计数器——不是克洛德代码发布的 |
retry.count | API 重试计数器——不是由 Claude Code 发布的 |
message.count | 已完成信件计数器——不是克洛德代码发布的 |
禁用 OTLP 日志
使用 OPENCODE_DISABLE_LOGS 以压制插件发布的每个 OTLP 日志事件.
export OPENCODE_DISABLE_LOGS=1
只禁用 OTLP 日志 。 继续出口的计量和道具,除非分别被禁用.
损坏痕迹
使用 OPENCODE_DISABLE_TRACES 以压制一个或多个痕量类型.
# Disable one trace type
export OPENCODE_DISABLE_TRACES="tool"
# Disable multiple trace types
export OPENCODE_DISABLE_TRACES="llm,tool"
# Disable every trace type explicitly
export OPENCODE_DISABLE_TRACES="all"
接受明确的“所有痕迹”值为 all, (中文(简体) ), *, (中文(简体) ), true,以及 1。 。 。 .
SigNoz 实例
export OPENCODE_ENABLE_TELEMETRY=1
export OPENCODE_OTLP_ENDPOINT="https://ingest.us.signoz.cloud:443"
export OPENCODE_OTLP_HEADERS="signoz-ingestion-key=<SIGNOZ_INGESTION_KEY>"
使用
https://ingest.in.signoz.cloud:443印度,https://ingest.eu2.signoz.cloud:443用于欧盟2, 等. 见 SigNoz 设置文件 适用于所有区域.
数据犬示例
export OPENCODE_ENABLE_TELEMETRY=1
export OPENCODE_OTLP_ENDPOINT=https://otlp.datadoghq.com
export OPENCODE_OTLP_PROTOCOL=http/protobuf
export OPENCODE_OTLP_HEADERS="dd-api-key=YOUR_DATADOG_API_KEY"
# Required — Datadog's OTLP intake only accepts delta temporality
export OPENCODE_OTLP_METRICS_TEMPORALITY=delta
说明: 终点是
otlp.datadoghq.com(无)api.datadoghq.com) (中文(简体) ). 使用otlp.datadoghq.eu代表欧盟,otlp.us3.datadoghq.com用于US3等. 见 数据犬 OTLP 文件 适用于所有区域.
Honeycomb 实例
export OPENCODE_ENABLE_TELEMETRY=1
export OPENCODE_OTLP_ENDPOINT=https://api.honeycomb.io
export OPENCODE_OTLP_PROTOCOL=http/protobuf
格拉法纳云实例
export OPENCODE_ENABLE_TELEMETRY=1
export OPENCODE_OTLP_ENDPOINT=https://otlp-gateway-prod-us-central-0.grafana.net/otlp
export OPENCODE_OTLP_PROTOCOL=http/protobuf
export OPENCODE_OTLP_HEADERS="Authorization=Basic <base64-instance-id:api-key>"
Claude 代码仪表板兼容性
export OPENCODE_METRIC_PREFIX=claude_code.
地方发展
见 捐款额。 。 。 .
GitHub 磁盘通知
此重播包括可重复使用的工作流程 .github/workflows/discord-notify.yml 贴出一个嵌入支持 GitHub 事件的 Discord 。 包含的内容 .github/workflows/discord-events.yml 文件为:
issues.openedpull_request.openedrelease.published
设置一个名为 org 或 repo 的秘密 DISCORD_WEBHOOK 工作流程会自动发送到那个网页.
从另一个存储器中重新使用 DEVtheOPS 鼠标 :
name: Discord Events
on:
issues:
types: [opened]
pull_request:
types: [opened]
release:
types: [published]
jobs:
notify-discord:
uses: DEVtheOPS/opencode-plugin-otel/.github/workflows/discord-notify.yml@main
with:
username: DEVtheOPS Bot
title_prefix: "[DEVtheOPS]"
include_body: true
secrets:
discord_webhook: ${{ secrets.DISCORD_WEBHOOK }}
可用工作流程输入 :
username: webhook 显示名称avatar_url: webhook 浮雕图像 URLtitle_prefix: 嵌入式的可选标题前缀include_body:在卡片中包括问题、公关或释放体color: 不支持的事件后置颜色