s-blog

清理 Prometheus 中 Claude Code 错误遥测数据(Windows + NSSM)

ssssmy · 2026-06-15 · 4 min · Windows

背景

Grafana 面板出现"脏数据":一批 Claude Code 遥测数据因配置写错了标签(例如 user_name="<错误用户名>",标签里还有 exported_job=claude-codedepartment=<部门>)混进了 Prometheus,需要彻底删除。

关键认知:Grafana 不存数据,只查询数据源。清理脏数据要在数据源(这里是 Prometheus)层面做,或在面板查询侧过滤掩盖。本次目标是彻底删源数据。

  • 数据源:Prometheus,地址 http://<prometheus-host>:9090
  • Prometheus 部署:Windows 裸机,用 NSSM 包装成 Windows 服务(服务名 prometheus),nssm 路径形如 C:\path\to\nssm.exe
  • 本地操作环境:Windows PowerShell

下文 <prometheus-host><错误用户名>C:\path\to\nssm.exe 等均为占位符,按实际环境替换。

踩坑记录

  1. curl -X POST 报错 —— PowerShell 里 curlInvoke-WebRequest 别名,不认 -X。解决:用真 curl 写 curl.exe,或改用 Invoke-RestMethod
  2. Invoke-RestMethod 返回被截断 —— 对象按表格显示,列太多被裁掉。解决:.data | Format-List.data | ConvertTo-Json -Depth 5
  3. 删除报 admin APIs disabled —— Prometheus 默认没开 admin API。必须在服务端加 --web.enable-admin-api 并重启。
  4. nssm 命令找不到 —— 不在 PATH,要用全路径 & "C:\path\to\nssm.exe" 调用。

完整流程

第 0 步:定位要删的序列(删前必做)

$prom = "http://<prometheus-host>:9090"

# 看命中了哪些序列(完整标签)
(Invoke-RestMethod -Uri "$prom/api/v1/series?match[]={user_name=`"<错误用户名>`"}").data | Format-List

# 命中条数 & 涉及哪些指标名
$series = (Invoke-RestMethod -Uri "$prom/api/v1/series?match[]={user_name=`"<错误用户名>`"}").data
$series.Count
$series.__name__ | Sort-Object -Unique

第 1 步:在 Prometheus 服务器上开启 Admin API

诊断部署方式:

Get-CimInstance Win32_Process -Filter "name='prometheus.exe'" | Select-Object ProcessId, CommandLine | Format-List
Get-CimInstance Win32_Service -Filter "name like '%prometheus%'" | Select-Object Name, State, StartMode, PathName | Format-List

确认是 NSSM 后,用 GUI 改最稳:

& "C:\path\to\nssm.exe" edit prometheus
# Application 标签页 → Arguments 末尾加空格 + --web.enable-admin-api → Edit service
Restart-Service prometheus

或纯命令行(注意:nssm get 输出是宽字符,别用变量自动拼接,手敲):

$nssm = "C:\path\to\nssm.exe"
& $nssm get prometheus AppParameters          # 看现有参数
& $nssm set prometheus AppParameters "<现有参数原样> --web.enable-admin-api"
& $nssm restart prometheus

第 2 步:验证已开启

# 不再返回 "admin APIs disabled" 即成功
Invoke-RestMethod -Method Post -Uri "$prom/api/v1/admin/tsdb/clean_tombstones"

第 3 步:备份 + 删除 + 释放磁盘

# 快照备份(可回滚,存于 storage.tsdb.path/snapshots/)
Invoke-RestMethod -Method Post -Uri "$prom/api/v1/admin/tsdb/snapshot"

# 删除匹配序列(成功返回 HTTP 204,无响应体)
Invoke-RestMethod -Method Post -Uri "$prom/api/v1/admin/tsdb/delete_series?match[]={user_name=`"<错误用户名>`"}"

# 立即清理墓碑、释放磁盘(否则等下次 compaction)
Invoke-RestMethod -Method Post -Uri "$prom/api/v1/admin/tsdb/clean_tombstones"

第 4 步:治本 + 收尾

  • 修源头:改正 Claude Code 遥测配置(名字一般在 OTEL_RESOURCE_ATTRIBUTES 里的 service.name 等),重启 Claude Code,避免脏数据再写入。
  • 关 Admin API:清理完把 --web.enable-admin-api 去掉重启,恢复默认关闭,避免 9090 被误删数据。

备选方案(无权限改服务器/不能重启时)

  • Grafana 查询侧过滤:PromQL 加 {user_name!="<错误用户名>"},图上不显示(数据仍在)。
  • 靠保留期自然过期:在采集端用 relabel drop 掉这批错误数据停止写入,旧数据等 retention 到期自动消失。

要点速记

  • delete_series 默认删全时间范围,可加 &start=&end= 限定。
  • 多条件重复 &match[]={...}
  • PowerShell 里 match 的双引号要用反引号转义:{label=`"value`"}
  • 如果后端是 Mimir / Thanos / VictoriaMetrics 而非原生 Prometheus,删除 API 不同,需另查。

原文链接:https://www.ssssmy.com/notes/qing-li-prometheus-zhong-claude-code-cuo-wu-yao-ce-shu-ju-windows-nssm