You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Mimir remote-write接口遇err-mimir-missing-metric-name错误求助

使用Mimir Remote Write上报自定义指标时遇到err-mimir-missing-metric-name错误

已在标签列表中包含__name__: example_metric,但仍收到该错误,无法定位问题。

操作步骤

  • 下载三个proto文件:mimir.proto、gogoproto/gogo.proto、google/protobuf/descriptor.proto
  • 安装编译工具:npm install -g protoc-gen-js,执行编译命令:protoc --js_out=import_style=commonjs,binary:. mimir.proto gogo.proto descriptor.proto生成CommonJS模块
  • 从mimir_pb.js导入WriteRequest,构造包含uuid、status标签的example_metric指标请求对象
  • 调用serializeBinary序列化,用snappy压缩后发送POST请求,请求头如下:
    "Content-Encoding": "snappy"
    "Content-Type": "application/x-protobuf"
    "X-Prometheus-Remote-Write-Version": "0.1.0"
    

序列化前的WriteRequest对象

{
  "timeseriesList": [
    {
      "labelsList": [
        {
          "name": "__name__",
          "value": "example_metric"
        },
        {
          "name": "status",
          "value": "up"
        },
        {
          "name": "uuid",
          "value": "c4a1d53b-454e-434d-8f93-11f0e9e0d10a"
        }
      ],
      "samplesList": [
        {
          "timestampMs": 1735044676736,
          "value": 1.1
        }
      ],
      "exemplarsList": [],
      "histogramsList": []
    }
  ],
  "source": 0,
  "metadataList": [
    {
      "type": 0,
      "metricFamilyName": "example_metric",
      "help": "",
      "unit": ""
    }
  ],
  "skipLabelValidation": false,
  "skipLabelCountValidation": false
}

环境信息

  • libprotoc 3.21.12
  • Ubuntu 24
  • NodeJS v18.20.5

问题解答

1. 是否存在操作疏漏导致无法成功上报?

有几个潜在疏漏点:

  • Proto字段命名错误:你构造的对象中使用timeseriesList、labelsList这类字段名,需确认是否与proto定义完全匹配。Mimir的WriteRequest中时间序列字段为timeseries,gogo protobuf生成的JS代码中,重复字段的访问器是getTimeseriesList()/setTimeseriesList(),但构造对象时应直接用timeseries而非timeseriesList。字段名错误会导致序列化后服务端无法解析标签数据,触发缺失__name__的错误。
  • Metadata字段干扰:请求中加入的metadataList可能干扰指标解析,尝试移除该字段后重新测试。
  • Snappy压缩异常:若压缩过程损坏protobuf数据,服务端无法解析标签也会返回错误。可先去掉Content-Encoding头,不压缩发送请求,验证序列化后的protobuf本身是否有效。

2. 如何定位问题在客户端还是服务端?

  • 客户端验证:
    • 将序列化后的protobuf数据保存到文件,用protoc --decode=mimirpb.WriteRequest mimir.proto命令解码,检查输出是否包含正确的__name__标签。若解码后看不到标签,说明客户端序列化过程有问题。
    • 使用官方Prometheus remote write客户端发送相同指标,若能成功上报,说明自定义客户端存在问题。
  • 服务端验证:
    • 查看Mimir的distributor组件日志,开启debug级别日志后,会打印请求的详细解析信息,包括是否解析到__name__标签。
    • 用tcpdump或wireshark抓包,解码原始请求数据,确认服务端收到的数据包中是否包含__name__标签。若抓包能看到标签但服务端仍报错,说明服务端验证逻辑或配置有问题。

3. 能否在Mimir内部调试请求消息以了解验证逻辑?

可以通过以下方式调试:

  • 开启Debug日志:修改Mimir配置,将distributor组件的日志级别设为debug,重启服务后,日志会输出每个WriteRequest的标签提取、验证等详细过程。
  • 修改Mimir代码:若能编译Mimir,可在pkg/distributor/write_handler.go和pkg/mimirpb/validate.go文件的验证逻辑中添加额外日志,打印当前处理的标签列表,明确验证失败的原因。
  • 启用调试端点:部分Mimir版本提供/debug/pprof或/api/v1/status等端点,开启相关配置后可查看请求处理状态。

内容的提问来源于stack exchange,提问作者Alex Bondarev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 08:37:37