如何在 VictoriaMetrics 中删除或修改指标

说明如何在 VictoriaMetrics 中使用 delete_series 删除指标,以及通过导出、修改、删除、重新导入的流程间接更新指标数据,并提示删除 API 的性能和合规边界。

作者 秦晓辉@快猫星云

作为 VictoriaMetrics 用户,我们希望其具备数据删除能力。VictoriaMetrics 也确实支持删除操作,但是程度有限。由于实现上的问题,VictoriaMetrics 保持为一个 append-only 数据库,非常适合存储时序数据。这样的架构的缺点,就是修改、删除数据会变得非常昂贵。所以 VictoriaMetrics 对修改、删除操作的支持非常有限。

这篇指南说明两件事:如何删除 VictoriaMetrics 中的指标,以及如果某些历史数据值不对,如何通过导出、修改、删除、重新导入的方式间接更新。

核心摘要

  • VictoriaMetrics 支持删除指标,但删除 API 不适合作为周期性任务使用,因为每次删除都会对性能产生影响。
  • 删除前必须先用 series 查询验证选择器,避免误删不该删除的时间序列。
  • 删除成功后,数据查询不到不代表磁盘空间立刻释放,空间释放依赖后续后台合并;必要时可以尝试强制合并。
  • VictoriaMetrics 默认不提供直接更新数据的机制,只能通过导出、修改文件、删除原指标、重新导入来实现折中更新。
  • 修改历史指标前要特别谨慎,最好先备份导出文件,并确认 match[] 选择器、实例、job 和时间范围都符合预期。

如何删除指标

💡 警告:数据删除操作不建议作为一个周期性行为来执行。每次调用删除 API 都会对性能产生影响。提供删除 API 主要用于一次性需求,用于删除格式错误的数据或满足 GDPR 合规性。

删除 API 需要指定时序数据选择器。所以删除之前,首先要做的,应该是验证选择器是否匹配了期望的数据。这个检查步骤不能省,否则可能把同名指标下不该删除的标签组合一起删掉。

可以使用如下命令来检查:

# Warning: response can return many metrics, so be careful with series selector.
curl -s 'http://vmselect:8481/select/0/prometheus/api/v1/series?match[]=process_cpu_cores_available' | jq

预期输出:

{
  "status": "success",
  "isPartial": false,
  "data": [
    {
      "__name__": "process_cpu_cores_available",
      "job": "vmagent",
      "instance": "vmagent:8429"
    },
    {
      "__name__": "process_cpu_cores_available",
      "job": "vmalert",
      "instance": "vmalert:8880"
    },
    {
      "__name__": "process_cpu_cores_available",
      "job": "vminsert",
      "instance": "vminsert:8480"
    },
    {
      "__name__": "process_cpu_cores_available",
      "job": "vmselect",
      "instance": "vmselect:8481"
    },
    {
      "__name__": "process_cpu_cores_available",
      "job": "vmstorage",
      "instance": "vmstorage-1:8482"
    },
    {
      "__name__": "process_cpu_cores_available",
      "job": "vmstorage",
      "instance": "vmstorage-2:8482"
    }
  ]
}

如果你确认时间序列选择器是符合预期的,接下来就可以发个POST请求执行删除,举例:

curl -s 'http://vmselect:8481/delete/0/prometheus/api/v1/admin/tsdb/delete_series?match[]=process_cpu_cores_available'

如果删除成功,删掉的数据就查不到了。不过存储空间不会立马释放,而是在后续数据文件后台合并的时候删除。前几个月的数据可能永远不会发生后台合并,因此不会为历史数据释放存储空间。这种情况下,可以尝试强制合并:

curl -v -X POST http://vmstorage:8482/internal/force_merge

merge 完成之后,数据就会从硬盘永久删除了。

这一节可以总结为三个动作:先查 series,确认选择器;再调用 delete_series;最后按需等待后台合并或执行 force_merge。

如何更新指标

VictoriaMetrics 默认不提供更新数据的机制。不过你可以通过如下方式曲线折中实现:

  • 导出指标数据到文件中
  • 修改文件中的 value
  • 从 VictoriaMetrics 中删除相关指标
  • 把刚才保存的文件中的数据重新导入

这里的“更新”本质上不是原地修改,而是重建一段指标数据。因此操作前要确认导出的数据就是要修改的范围,修改后的文件格式仍然能被 VictoriaMetrics import 接口识别。

导出指标

举个例子,导出node-exporter:9100这个实例和hostname.com这个job的node_memory_MemTotal_bytes指标:

curl -X POST -g http://vmselect:8481/select/0/prometheus/api/v1/export -d 'match[]=node_memory_MemTotal_bytes{instance="node-exporter:9100", job="hostname.com"}' > data.jsonl

检查一下导出的数据:

cat data.jsonl | jq

预期输出如下所示:

{
  "metric": {
    "__name__": "node_memory_MemTotal_bytes",
    "job": "hostname.com",
    "instance": "node-exporter:9100"
  },
  "values": [
    33604390912,
    33604390912,
    33604390912,
    33604390912
  ],
  "timestamps": [
    1656669031378,
    1656669032378,
    1656669033378,
    1656669034378
  ]
}

在这个例子中,我们使用 sed 命令替换 node_memory_MemTotal_bytes 的值,从 33604390912 改成 17179869184。当然,你可以使用自己习惯的方式来做修改:

sed -i 's/33604390912/17179869184/g' data.jsonl

检查一下修改是否成功:

cat data.jsonl | jq

期望的输出如下:

{
  "metric": {
    "__name__": "node_memory_MemTotal_bytes",
    "job": "hostname.com",
    "instance": "node-exporter:9100"
  },
  "values": [
    17179869184,
    17179869184,
    17179869184,
    17179869184
  ],
  "timestamps": [
    1656669031378,
    1656669032378,
    1656669033378,
    1656669034378
  ]
}

删除指标

前文介绍了删除方法,这里不再赘述。实际操作时,删除用的选择器应该和导出数据的范围保持一致,避免导入后出现新旧数据并存或误删其他序列。

导入指标

VictoriaMetrics 支持多种数据导入方式,下面我们使用从 json 文件导入的方式来导入数据:

curl -v -X POST http://vminsert:8480/insert/0/prometheus/api/v1/import -T data.jsonl

检查导入的指标

curl -X POST -g http://vmselect:8481/select/0/prometheus/api/v1/export -d match[]=node_memory_MemTotal_bytes

期望的输出如下:

{
  "metric": {
    "__name__": "node_memory_MemTotal_bytes",
    "job": "hostname.com",
    "instance": "node-exporter:9100"
  },
  "values": [
    17179869184,
    17179869184,
    17179869184,
    17179869184
  ],
  "timestamps": [
    1656669031378,
    1656669032378,
    1656669033378,
    1656669034378
  ]
}

常见问题

VictoriaMetrics 删除指标适合做定时清理吗?

不适合。原文已经提示,删除 API 主要用于一次性需求,比如删除格式错误的数据或满足 GDPR 合规性。频繁调用删除 API 会影响性能。

delete_series 删除成功后,为什么磁盘空间没有马上释放?

因为 VictoriaMetrics 的存储文件需要在后台合并时释放空间。删除后数据可能已经查不到,但相关磁盘空间要等后续 merge 才会真正释放;某些历史数据如果长期不再合并,可能需要尝试 force_merge

VictoriaMetrics 能直接 update 某个样本值吗?

默认不提供直接更新机制。可行的折中方案是先导出目标指标数据,修改导出文件中的 value,再删除原指标,最后重新导入修改后的数据。

总结

VictoriaMetrics 的 append-only 架构让写入和时序存储更适合监控场景,但也意味着修改和删除都不是低成本操作。删除指标时,核心是先验证选择器,再执行删除,并理解空间释放依赖后台合并。更新指标时,核心是把“更新”拆成导出、修改、删除、导入四步,确保每一步的数据范围都可控。

联系我们交流

延伸路径

继续看解决方案和产品对比

如果你正在做监控、可观测性或故障定位相关选型,建议从解决方案和产品对比继续往下看。

快猫星云 联系方式 快猫星云 联系方式
快猫星云 联系方式
快猫星云 联系方式
快猫星云 联系方式
快猫星云