You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

.NET OpenTelemetry导出Prometheus失败:snappy压缩不支持

问题描述

由于snappy压缩兼容性问题,.NET OpenTelemetry.AutoInstrumentation包无法通过OpenTelemetry Collector(otel/opentelemetry-collector-contrib)将指标导出至Prometheus。

Prometheus的OTLP端点/api/v1/otlp/v1/metrics返回400 Bad Request,错误信息如下:

unsupported compression: snappy. Only "gzip" or no compression supported

OpenTelemetry Collector相关日志:

  • Debug exporter的INFO日志:
2025-01-19T15:16:36.519Z    info    Metrics {"kind": "exporter", "data_type": "metrics", "name": "debug", "resource metrics": 1, "metrics": 36, "data points": 150}
  • PrometheusRemoteWrite exporter的ERROR日志:
2025-01-19T15:16:36.526Z    error   internal/queue_sender.go:103    Exporting failed. Dropping data.    {"kind": "exporter", "data_type": "metrics", "name": "prometheusremotewrite", "error": "Permanent error: Permanent error: Permanent error: remote write returned HTTP status 400 Bad Request; err = %!w(<nil>): unsupported compression: snappy. Only \"gzip\" or no compression supported\n", "dropped_items": 150}
go.opentelemetry.io/collector/exporter/exporterhelper/internal.NewQueueSender.func1
    go.opentelemetry.io/collector/exporter@v0.116.0/exporterhelper/internal/queue_sender.go:103
go.opentelemetry.io/collector/exporter/internal/queue.(*Consumers[...]).Start.func1
    go.opentelemetry.io/collector/exporter@v0.116.0/internal/queue/consumers.go:43

当前环境配置

  1. kube-prometheus-stack开启OTLP端点的配置:
prometheus:
  prometheusSpec:
    additionalArgs:
      - name: web.enable-otlp-receiver
        value: ""
  1. OpenTelemetry Collector配置:
apiVersion: opentelemetry.io/v1beta1
kind: OpenTelemetryCollector
metadata:
  name: ${NAME}
  namespace: ${NAMESPACE}
spec:
  config:
    receivers:
      otlp:
        protocols:
          grpc:
            endpoint: 0.0.0.0:4317
          http:
            endpoint: 0.0.0.0:4318

    processors:
      batch: {}
      memory_limiter:
        check_interval: 5s
        limit_percentage: 80
        spike_limit_percentage: 25

    exporters:
      debug:
        verbosity: basic
      prometheusremotewrite:
        endpoint: http://${PROMETHEUS_SERVICE}.${PROMETHEUS_NAMESPACE}.svc.cluster.local:9090/api/v1/otlp/v1/metrics
        tls:
          insecure: true

    service:
      pipelines:
        traces:
          receivers: [otlp]
          processors: [memory_limiter, batch]
          exporters: [debug]
        metrics:
          receivers: [otlp]
          processors: [memory_limiter, batch]
          exporters: [debug, prometheusremotewrite]
        logs:
          receivers: [otlp]
          processors: [memory_limiter, batch]
          exporters: [debug]
  1. .NET自动采集的Instrumentation配置:
apiVersion: opentelemetry.io/v1alpha1
kind: Instrumentation
metadata:
  name: ${NAME}
  namespace: ${NAMESPACE}
spec:
  exporter:
    endpoint: http://${COLLECTOR_SERVICE}.${COLLECTOR_NAMESPACE}.svc.cluster.local:4318
  propagators:
    - tracecontext
    - baggage
  sampler:
    type: parentbased_traceidratio
    argument: "1"
  1. .NET容器部署注解:
instrumentation.opentelemetry.io/inject-dotnet: true

解决方案

问题核心是.NET自动Instrumentation默认使用snappy压缩发送指标,但Prometheus OTLP接收器仅支持gzip或无压缩。可通过以下两种方式解决:

方式1:修改OpenTelemetry Collector的PrometheusRemoteWrite Exporter配置

prometheusremotewrite exporter中指定兼容的压缩方式(gzip)或禁用压缩:

exporters:
  prometheusremotewrite:
    endpoint: http://${PROMETHEUS_SERVICE}.${PROMETHEUS_NAMESPACE}.svc.cluster.local:9090/api/v1/otlp/v1/metrics
    tls:
      insecure: true
    compression: gzip # 或设置为"none"禁用压缩

方式2:修改.NET自动Instrumentation的环境变量

在.NET容器部署中添加环境变量,强制指定压缩方式为gzip或禁用压缩:

env:
  - name: OTEL_EXPORTER_OTLP_METRICS_COMPRESSION
    value: gzip # 或设置为"none"

如果使用Instrumentation CRD,可直接在spec中添加环境变量配置:

apiVersion: opentelemetry.io/v1alpha1
kind: Instrumentation
metadata:
  name: ${NAME}
  namespace: ${NAMESPACE}
spec:
  exporter:
    endpoint: http://${COLLECTOR_SERVICE}.${COLLECTOR_NAMESPACE}.svc.cluster.local:4318
  propagators:
    - tracecontext
    - baggage
  sampler:
    type: parentbased_traceidratio
    argument: "1"
  env:
    - name: OTEL_EXPORTER_OTLP_METRICS_COMPRESSION
      value: gzip

验证步骤

修改配置后重启相关组件,检查Collector日志是否不再出现unsupported compression: snappy错误,同时确认Prometheus能正常接收指标数据。

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

火山引擎 最新活动