.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
当前环境配置
- kube-prometheus-stack开启OTLP端点的配置:
prometheus: prometheusSpec: additionalArgs: - name: web.enable-otlp-receiver value: ""
- 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]
- .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"
- .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




