ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

codeburn sync 团队同步指南:将本地 AI 用量遥测安全推送到共享 OTLP 后端

codeburn sync 团队同步指南:将本地 AI 用量遥测安全推送到共享 OTLP 后端 【免费下载链接】codeburnFree, local tool to track AI coding token usage and cost across 37 tools and agents (Claude Code, Cursor, Codex, Gemini and more), by model, project, and task. npx codeburn项目地址https://gitcode.com/gh_mirrors/co/codeburn点击查看免费下载codeburn sync 是 codeburn 的可选团队功能把本地解析出的 AI 编码用量与费用遥测token 数、成本、模型、工具调用等推送到团队自建的共享后端让团队能够跟踪 adoption、预算与 ROI。它坚持 local-first 原则——不会主动发送任何数据且提示词prompt与代码内容永远不会出现在载荷中。读完本文你将掌握codeburn sync的完整命令用法、OTLP 载荷字段语义、OIDC 认证流程、去重与重试机制以及如何用--attribution在零 git hook 的前提下把 AI 用量关联到 git 提交。快速开始sync 只需要三个命令即可完成从配置到推送的完整闭环# 一次性配置会打开浏览器完成登录 codeburn sync setup https://metrics.your-team.com # 推送最近未发送的用量 codeburn sync push # 查看同步状态 codeburn sync status第一次配置只需做一次此后每次push都会静默地用 refresh token 换取新的访问令牌。停止同步也很简单——执行codeburn sync logout即清除凭证并吊销令牌或者干脆不再运行push。命令详解codeburn sync setup url用远程端点配置同步并打开浏览器完成一次性的 OIDC 登录。其完整流程见 src/sync/cli.ts 的 setup 实现从url/.well-known/codeburn-export.json获取服务器配置发现文档打开浏览器跳转到身份提供方IdP的登录页登录成功后将 refresh token 安全存入操作系统钥匙串把不含任何秘密的端点配置写入~/.config/codeburn/sync.json。codeburn sync setup https://metrics.your-team.com客户端在拿回 code 后调用 token 端点换取access_token与refresh_token若 IdP 未返回 refresh tokenCLI 会给出可能需要频繁重新认证的警告随后才落盘配置。整个交互过程的错误登录超时、端口被占用、发现文档失败会被收敛为一行清晰报错而不是 Node 崩溃堆栈。codeburn sync push把窗口内未发送的 AI 用量数据推送到已配置端点# 推送最近 7 天默认窗口的未发送调用 codeburn sync push # 扩大窗口推送最近 30 天 codeburn sync push --since 30d # 预演只展示将要发送什么实际不发送 codeburn sync push --dry-run # 额外推送 git 归属opt-in见下文 Git attribution codeburn sync push --attribution--since的合法取值src/sync/cli.ts 中的映射表为today、7d/week、30d/30days、month、all最多 6 个月受解析器保留期限限制。未知值会直接报错退出。--dry-run是强大的审计工具它会在不发送任何数据的前提下报告窗口内调用总数、已同步数量、被 hold 的调用数会话仍在 reconcile见 FAQ、被 frozen 的 Copilot 调用数、本次将推送的调用数与预估成本以及各字段的携带情况lineage 字段、缓存 token、ai.subscription_covered与codeburn.coverage_through。启用插件时还会列出已加载/被拒绝的插件及其声明的同步属性确保插件不能静默拓宽线上数据。推送成功后 CLI 会更新lastSync时间戳并输出汇总Synced N calls ($X.XX) to url。若推送未完成如被限流或服务端错误进程以非零退出码结束方便 cron/脚本检测。codeburn sync status展示当前同步配置与认证状态Endpoint: https://metrics.your-team.com Traces path: /v1/traces Issuer: https://auth.your-team.com Auth: configured Token storage: keychain Last sync: 2h ago实现见 src/sync/cli.ts未配置时提示先运行setupToken storage一行会如实报告当前使用的是 keychain、secret-tool、DPAPI 还是文件回退。codeburn sync logout删除本地存储的凭证并在身份提供方吊销令牌吊销端点不可用时为 best-effortcodeburn sync logoutcodeburn sync reset --confirm清空 sent-ledger使下一次 push 重新发送窗口内全部数据。适用于后端迁移后或怀疑数据丢失的场景codeburn sync reset --confirm注意重置前必须先清空接收端副本否则会产生恰好是你想避免的双重计数详见下文 Copilot 冻结形状与 FAQ。自动同步codeburn sync auto除手动 push 外仓库还实现了可选的定时自动同步src/sync/cli.ts 与 src/sync/schedule-installer.ts# 以 daily 频率启用自动推送需 --accept 同意披露内容 codeburn sync auto enable --cadence daily --accept # 附带工作匹配session→commit 关联 codeburn sync auto enable --cadence hourly --attribution --accept # 关闭 codeburn sync auto disable # 查看状态含最近 5 条运行回执 codeburn sync auto status codeburn sync auto status --json # 机器可读 # 由调度器调用的内部入口 codeburn sync auto run自动同步引入接受指纹acceptance fingerprint机制启用时计算并保存一份覆盖目标端点、出站字段集合、工作匹配开关与节奏的指纹之后每次auto run都会重算当前指纹并与之比对一旦字段集如新增插件属性发生变化就停止推送并写入acceptance-required回执直到用户重新确认。每次运行结果以 JSONL 追加到~/.config/codeburn/receipts.jsonl见 src/sync/config.ts。线上数据格式每次交互对应一条 OTLP span每次 AI 交互被编码为一条 OTLP span严格按 protobuf-JSON 映射ExportTraceServiceRequestlowerCamelCase 字段、hex 编码 ID、整数枚举实现见 src/sync/otlp.ts。span 属性如下字段示例说明ai.providerkiro,cursor,claude使用的 AI 工具ai.modelclaude-sonnet-4-6使用的模型ai.input_tokens12500提示词 tokenai.output_tokens3200可计费输出 token适用时包含单独计费的 reasoningai.cost_usd0.085估算成本ai.projectmy-app项目 basename仅当有 provider 记录的精确工作目录为背书时携带否则省略ai.tools[Edit, Bash]调用的工具ai.speedstandardprovider 记录的速度档位ai.cost_estimatedtrue成本是估算而非 provider 上报ai.cache_read_tokens800缓存读取 token仅当 provider 记录非零值时携带ai.cache_write_tokens200缓存写入 token仅当 provider 记录非零值时携带ai.call_count3该 span 所属会话在同步窗口内贡献的用量 span 数ai.session_duration_ms61000provider 记录事件的首末时间差任一端缺失或乱序时省略ai.subscription_coveredtrue成本是否被已配置套餐或代理路径覆盖无法判定时省略ai.work_unit_id9f2c…伪匿名工作单元 id根会话的 trace id把会话与其委派子会话归组ai.session_roleroot,child会话与其工作单元的关系ai.lineage_evidenceprovider-recorded归组所依据的证据类别每批导出还携带一个伪匿名device_id资源属性SHA-256(hostnameusername)前 16 位 hex见 src/sync/otlp.ts用于区分不同机器而不暴露主机名。另有codeburn.coverage_through资源属性本地历史完整覆盖到的 ISO 日期取自 daily-cache 的水位线仅当一次完整本地解析最终确定了该水位线时才盖章complete与watermarkTrusted同时成立见 src/sync/cli.ts接收端应把缺失视为覆盖未知而不是无历史。可选字段的证明语义从ai.work_unit_id往下的每个字段都是可选的只在值被证明时才发送旧接收端忽略未知属性不会丢失任何东西src/sync/otlp.ts 的注释详细说明了判定规则ai.work_unit_id/ai.session_role/ai.lineage_evidence三者要么一起发、要么都不发且只针对 provider 在磁盘上持久记录了血缘lineage的会话对应 issue #1140。ai.work_unit_id是根会话 id 经 work-unit 解析器#1145推导出的deriveTraceId——与线上 trace id 使用同一套 SHA-256 推导保证一个工作单元的标识与已上线根 trace 一致。血缘从不推断没有记录血缘的会话不携带这三字段父会话超出窗口、链接歧义或成环的 child 会话也 fail-closed 不携带。ai.cache_read_tokens/ai.cache_write_tokens是 provider 记录的缓存 token 数与ai.input_tokens的计费口径一致缓存读取采用展示层跨 Anthropic 与 OpenAI 词汇的max(cacheReadInputTokens, cachedInputTokens)约定。每个字段仅当非零时发送。ai.call_count是该会话在同步窗口内贡献的用量 span 数ai.session_duration_ms为会话 provider 记录事件时间末减首任一端缺失或乱序时省略。ai.subscription_covered由套餐/代理路径机制判定配置的套餐覆盖该调用的 provider、或会话的 provider 记录 cwd 位于配置的代理路径下时为 true两者都被排除时为 false无法判定无套餐匹配且无 cwd 可查时省略。ai.output_tokens是可计费输出总量。对于单独计量 reasoning 的 providercodeburn 会把 reasoning 计入此字段response 计数已含 reasoning 的 provider 则保持不变。ai.project是可选字段usage span 只在 codeburn 能从一个 provider 记录的绝对工作目录中推导出唯一安全 basename 时携带它attribution span 则只从规范化的git.repo推导纯 PR 证据省略之。接收端必须把缺失项目归为 unattributed且不得强制要求该字段。确定性 span/trace idspan_id 与 trace_id 是确定性推导src/sync/otlp.tsspan_id SHA-256(deduplicationKey) 的前 8 字节 → hex16 字符 trace_id SHA-256(sessionId) 的前 16 字节 → hex32 字符这意味着重发在字节级别完全相同服务端去重只是纵深防御同时也使按 span id 存储的服务端天然具备幂等 upsert 能力。Git attributionopt-in--attributioncodeburn sync push --attribution会额外发送codeburn yield在本地计算的 会话→提交 关联让后端无需任何 git hook 就能把 AI 用量关联到 git 活动。启用后会额外发射两种 spancodeburn.session.attribution—— 每个有可连接证据的会话一条字段示例说明ai.projectmy-app由规范化git.repo推导的仓库 basename纯 PR 证据时省略git.repogithub.com/acme/widget规范化的origin远端剥离凭证与端口git.pr_links[…/pull/12]会话捕获的 PR URLgit.commit_count2归因的提交数如果同一 trace 的 usage span 与 attribution span 携带了不同的安全项目 basenameattribution 中的仓库 basename 对项目聚合具有权威性。usage span 上的 provider 记录 cwd basename 只是临时标签不得据此创建第二个项目桶。codeburn.commit—— 每个被归因到会话的提交一条字段示例说明git.sha4f2a…提交 SHAgit.in_maintrue提交是否进入 main 分支git.was_revertedfalse是否有后续提交将其回滚归因是推断的时间戳窗口关联与codeburn yield同一启发式资源属性codeburn.attribution_methodology: timestamp-window如实标注了这一点。状态迁移提交合入 main、或被回滚会在后续 push 中自动重发——接收端应按(git.repo, git.sha)upsert 提交、按traceIdupsert 会话 span与 usage span 同 id后者状态为准。当提交迁移到窗口更紧的后解析会话时失利的会话会以git.commit_count: 0重发即撤回 retraction因此对 upsert 后的会话行求和git.commit_count不会重复计数。撤回只在提交被另一会话赢得时触发——仅仅因超出--since窗口而老化的提交不会撤回已同步计数保持正确。进行中会话的窗口增长时会话 span 也会重发以保持 end time 最新。启用 attribution 后究竟会发送什么启用--attribution后以下内容会离开你的机器规范化的仓库远端 URL、提交 SHA、提交时间戳span 开始时间、PR URL、merged/reverted 布尔值以及 usage span 同样携带的伪匿名codeburn.device_id。PR 链接在客户端由 scheme host path 重建丢弃 userinfo、查询串与 fragment要求 https、/org/repo/pull/N路径、长度受限、每会话最多 20 条仓库身份本身在发送前必须通过严格的主机名/路径白名单——畸形或 transport-helper 远端ext::…、codecommit::…会被直接拒绝而不是解析。精确边界如下提交只来自具有网络origin远端的仓库且只针对其受信任的 provider 记录工作目录解析到该仓库的会话。本地分组标签、provider 存储路径、提示词文本、纯本地仓库、file://远端、Windows 文件系统路径永不作为仓库身份发出。没有可信 cwd 来源的会话永远不会继承你恰好从哪个目录 push 的仓库。PR 链接只要会话捕获了就发送即使会话所属仓库无法识别——PR URL 本身就点名了仓库所以这不比会话已记录链接多出任何信息。不加该标志以上内容一律不发送。什么绝不会被发送提示词Prompts—— 你发给 AI 的实际消息永不包含代码Code—— 文件内容、diff、路径都留在本地Bash 命令—— 可能包含机密永不发送姓名/邮箱—— 身份由服务端从登录 token 的sub声明推导主目录形、邮箱形、凭证形的项目标签都会被省略。没有开关可以覆盖这些限制。隐私是结构性的不是可配置的。唯一额外的 opt-in 是--attribution仓库远端、提交 SHA、PR URL——绝无代码或提示词。另外遗留 Hermes 消息中含有的文本Current working directory:行含 Windows 路径仍可能提供本地分组标签但提示词文本永远不会成为受信任的projectPath/workingDirectory来源也永远不会产生出站ai.project。认证标准 OIDC PKCEsync 使用标准 OIDC与Sign in with Google同协议。团队管理员配置身份提供方开发者只需点一次浏览器登录。完整流程src/sync/auth.ts为 Authorization Code PKCE客户端生成code_verifier32 随机字节base64url与code_challengeverifier 的 SHA-256base64url——见generatePkce()客户端在127.0.0.1:19876启动回调服务器端口占用时依次回退 19877、19878——CALLBACK_PORTS定义于 src/sync/auth.ts浏览器打开{authorization_endpoint}?response_typecodeclient_id...redirect_urihttp://127.0.0.1:{port}/callbackcode_challenge...code_challenge_methodS256state...scope...用户在 IdP 登录IdP 重定向回http://127.0.0.1:{port}/callback?code...state...回调服务器校验state并提取codestate 不匹配、缺少 code、IdP 返回 error 都会得到明确的错误页或错误信息客户端向{token_endpoint}POSTgrant_typeauthorization_code、code、code_verifier、redirect_uri、client_idIdP 返回access_tokenrefresh_token。固定端口的原因Cognito及 Okta对回调 URL 做精确字符串比较临时端口无法满足因此注册三个固定端口依次尝试。RFC 8252 推荐127.0.0.1IP 字面量而非localhost以规避 IPv6::1解析问题。令牌刷新每次sync push时客户端从系统存储读取 refresh tokenPOST{token_endpoint}携带grant_typerefresh_token并把服务器返回的新 refresh token 存回透明处理轮换若收到invalid_grant则停止并提示用户重新运行sync setup。scope 解析请求codeburn-export.json中的 scopes仅当 OIDC 发现文档的scopes_supported包含offline_access时才追加它——Cognito 会以invalid_scope拒绝offline_access它无需该 scope 就签发 refresh token。凭证存储平台方法实现macOSKeychainsecurity add-generic-password/find-generic-passwordLinuxlibsecretsecret-tool store/secret-tool lookupWindowsDPAPIPowerShellConvertTo-SecureString/ConvertFrom-SecureString回退文件~/.config/codeburn/.sync-token权限0600不引入原生模块keytar已归档改为调用操作系统 CLIsrc/sync/credentials.ts。测试/CI 可用CODEBURN_SYNC_TOKEN_STOREfile强制使用文件存储以隔离环境。回退到文件的情况会在sync status中如实报告。Token 生命周期通常 30–90 天由管理员设定过期后会被提示重新登录重新登录再次运行codeburn sync setup url。发现协议与服务器契约服务器发现文档GET {baseUrl}/.well-known/codeburn-export.json{ version: 1, issuer: https://cognito-idp.us-west-2.amazonaws.com/us-west-2_XXXX, client_id: 70e6sgst2ju6ff9dnrmv4l1tcb, scopes: [openid, email], traces_path: /v1/traces, max_batch_size: 1000 }字段必填默认说明version否1客户端拒绝version 1issuer是—OIDC issuer URL客户端拉取{issuer}/.well-known/openid-configurationclient_id是—该部署的 OAuth client IDscopes否[openid]请求的 scopes若 IdP 支持则动态追加offline_accesstraces_path否/v1/tracesOTLP POST 路径max_batch_size否1000单次 HTTP 请求的最大 span 数解析与校验逻辑在 src/sync/discovery.ts必须提供issuer与client_idissuer必须 https发现文档缺失字段、返回 404、或版本超前都会给出可读的DiscoveryError。为什么不用.well-known/openid-configuration代理OIDC 要求发现文档内的issuer声明与获取它的 URL 一致。从不同域名提供 Cognito 的文档违反此约束。codeburn-export.json文档把指标端点与身份提供方解耦。客户端安全校验所有携带令牌的远程端点强制 httpsRFC 8252 §8.3仅回环地址127.0.0.1、[::1]、localhost允许明文 httpassertHttpssrc/sync/discovery.ts。OIDC 发现文档还执行 issuer mix-up 防御元数据中的issuer声明必须与获取来源一致否则报OIDC issuer mismatch。服务器契约后端必须实现GET {baseUrl}/.well-known/codeburn-export.json—— 返回发现文档公开无需认证POST {baseUrl}{traces_path}—— 接受带 Bearer token 的 OTLP/HTTP JSON校验 JWT由配置的 IdP 签发从 token 的sub声明推导开发者身份接受最早 6 个月前的startTimeUnixNano返回标准 OTLP 响应体。载荷中不含任何 PII服务端仅凭认证 token 推导身份。代码中的测试 CDK 栈Cognito User Pool JWT authorizer Discovery Lambda Ingest Lambda仅为测试夹具而非生产参考——任何 OIDC 提供方 接受 OTLP 的端点都能满足契约。去重、部分成功与限流sent-ledger 机制客户端去重来源sent-ledger 位于~/.cache/codeburn/sync-ledger.json格式为{ key: string, ts: string }对象数组。推送逻辑收集窗口内全部调用 → 减去 ledger 中已有的条目 → 发送剩余 → 成功后追加到 ledger。每次 push 时清理 6 个月前的旧条目。为什么不用水位线watermark时间戳水位线会静默跳过迟到调用长会话、provider 后补行。ledger 是精确的。部分成功partial successOTLP 会在响应体中返回partial_success.rejected_spans。由于 OTLP 不指明哪些span 被拒绝客户端对部分拒绝的批次不记账——整个批次在下一次 push 时重试。这是安全的span id 由去重键确定性派生按 span id 存储的服务器会把重发 span 视为幂等 upsert。限流429一次 push 会运行到完成——没有常规的每推上限仅有 50,000 调用的安全阀。服务器限流才是预期中的刹车收到 HTTP 429 时客户端遵守Retry-Afterdelta-seconds 或 HTTP-date单次等待上限 120 秒头部缺失时默认 5 秒parseRetryAfterMs与默认值见 src/sync/push.ts同一批次最多连续重试 3 次若服务器仍限流推送停止剩余未记账的调用在下次 push 发送401 或 5xx 立即停止同样在下一次 push 续传。安全阀MAX_PER_PUSH 50_000usage与MAX_ATTRIBUTION_PER_PUSH 10_000attribution只是病理情况如 ledger 损坏导致全量重发数年数据下的安全阀不是常规上限超出的部分会在下一次 push 继续。FAQQ: sync 会自动运行吗A: 不会。需要时运行codeburn sync push。未来版本可能提供机会式推送如每次codeburn report之后但始终是显式行为。注仓库已实现需显式同意的sync auto定时推送。Q: 同一数据推两次会怎样A: 安全。本地 sent-ledger 记录已发送内容重推同一窗口不会产生重复。Q: 为什么我的 dashboard 缺少今天的 Copilot 用量A: Copilot 的 input/cache 用量在本地于按请求的session-store.db行与session.shutdown汇总之间 reconcile且该调和在会话存活期间持续变化——汇总残差会随着覆盖它的行落地而缩小看似仅崩溃请求的行在 journal 条目出现后会变为补充。ledger 是 append-once 的调和中途发送的值将永远无法在接收端修正。因此 Copilot 会话会被保留held直到静默满 24 小时然后一次性最终推送。没有任何数据被丢弃--dry-run会报告被保留的调用数。实现常量RECONCILE_SETTLE_MS 24h与完整论证见 src/sync/push.ts。Q: 为什么我旧的 Copilot 会话没有用新的按请求分解重新同步A: 这是有意的。一个 Copilot 会话的 input/cache 可以以两种形状之一离开你的机器——每个 (session, model) 一条session.shutdownrollupspan或reconciled成每个 API 请求一条 span 外加残差。它们描述相同的 token接收端绝不能同时持有两者而 usage span 一旦被 append-once ledger 发送就无法撤回。会话首次同步成哪种形状就保持哪种另一种对该会话永久冻结。两个方向都生效pre-store 版本同步的会话保持 rollup 永不发送行按行同步的会话之后也绝不发送 rollup——这很重要因为在 90 天 durable age-out 时缓存行被修剪rollup 会在一个从未发送过的键下重新服务。会话已用形状内的增长不受影响按轮输出 span 永不冻结。--dry-run报告冻结数量。codeburn sync reset --confirm清空本地 ledger 并以新分解重推一切——只有当接收端副本也清空时才应这样做否则你得到的正是它要避免的双重计数。Q: 离线一周怎么办A: 下次 push 会补齐。默认窗口 7 天长间隔用--since 30d或--since all最多 6 个月。推送无论多大都会运行到完成——服务器限流429会自动等待。Q: 管理员能看到我的提示词吗A: 不能。提示词永不进入载荷。服务器只能看到 token 数、成本、保守净化的 provider/model/tool 标识以及仅在 codeburn 有可信 cwd 来源时的可选项目 basename。Q: 如何停止同步A:codeburn sync logout删除一切。或者干脆停止运行push。深入阅读用户文档docs/sync/README.md本文原始依据开发者文档docs/sync/DEVELOPER.md架构图、协议细节、测试策略命令注册与编排src/sync/cli.ts、src/sync/push.tsOIDC 认证与发现src/sync/auth.ts、src/sync/discovery.tsOTLP 载荷构建src/sync/otlp.ts配置与凭证src/sync/config.ts、src/sync/credentials.ts测试单测 tests/sync.test.ts发现解析、PKCE、scope 解析、回调服务器、配置读写等纯函数、Mock IdP e2e tests/sync-e2e.test.ts完整 auth 往返、令牌刷新/轮换/吊销全离线可入 CI、Playwright 无头浏览器 e2e tests/sync-headless-e2e.test.ts仅开发者运行需真实 Cognito 测试后端以及线上协议相关测试 tests/sync-cb3-wire.test.ts、tests/sync-attribution.test.ts、tests/sync-consent.test.ts赞分享【免费下载链接】codeburnFree, local tool to track AI coding token usage and cost across 37 tools and agents (Claude Code, Cursor, Codex, Gemini and more), by model, project, and task. npx codeburn项目地址https://gitcode.com/gh_mirrors/co/codeburn点击查看免费下载相关推荐Phoenix LDAP 后台同步Background LDAP Sync设计与落地推演从登录时同步到定时全量同步Phoenix LDAP 后台同步Background LDAP Sync设计与落地推演从登录时同步到定时全量同步 导读 本文基于 internal_do可观测性AI 评测LLMOpsAI 应用人工智能数据炼金术用Awesome Claude Skills重塑Excel到AI的工作流数据炼金术用Awesome Claude Skills重塑Excel到AI的工作流 想象一下这样的场景你面对着一份包含数千行数据的Excel报表需要从中提AI 技能AI 插件人工智能工作流自动化团队协作利器如何使用Settings Sync共享VSCode配置团队协作利器如何使用Settings Sync共享VSCode配置 Visual Studio Code Settings Sync插件是开发者必备的团队协作创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表