清理 Prometheus 中 Claude Code 错误遥测数据(Windows + NSSM)
背景
Grafana 面板出现"脏数据":一批 Claude Code 遥测数据因配置写错了标签(例如 user_name="<错误用户名>",标签里还有 exported_job=claude-code、department=<部门>)混进了 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等均为占位符,按实际环境替换。
踩坑记录
curl -X POST报错 —— PowerShell 里curl是Invoke-WebRequest别名,不认-X。解决:用真 curl 写curl.exe,或改用Invoke-RestMethod。Invoke-RestMethod返回被截断 —— 对象按表格显示,列太多被裁掉。解决:.data | Format-List或.data | ConvertTo-Json -Depth 5。- 删除报
admin APIs disabled—— Prometheus 默认没开 admin API。必须在服务端加--web.enable-admin-api并重启。 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