OpenTelemetry Collector 无法通过 OTLP 导出到 Jaeger

xRe*_*Red 1 jaeger open-telemetry otlp-grpc

正如标题所述,我有一些客户端应用程序将指标、跟踪和日志发送到 opentelemtry 收集器,然后收集器应将提到的信号导出到 jaeger 实例。

由于某种原因,它失败了,并出现了一个不太明显的错误,我陷入了困境。

这是 Docker 的组成:

version: '3.9'
    x-default-logging: &logging
      driver: "json-file"
      options:
        max-size: "5m"
        max-file: "2"
    
    services:
      # ********************
      # Telemetry Components
      # ********************
      
      # Jaeger
      jaeger:
        image: jaegertracing/all-in-one:1.50
        container_name: jaeger
        deploy:
          resources:
            limits:
              memory: 500M
        restart: unless-stopped
        ports:
          - "16686:16686"                    # Jaeger UI
          - "4317"                           # OTLP gRPC default port
          - "4318"                           # OTLP HTTP default port (protobuf)
          - "14250"
        environment:
          - COLLECTOR_OTLP_ENABLED=true
        logging: *logging
    
      # OpenTelemetry Collector
      otelcol:
        image: otel/opentelemetry-collector-contrib:0.87
        container_name: otel-col
        deploy:
          resources:
            limits:
              memory: 525M
        restart: unless-stopped
        command: [ "--config=/etc/otelcol-config.yml" ]
        volumes:
          - ./otel/otelcol-config.yml:/etc/otelcol-config.yml
        ports:
          - "4317:4317"     # OTLP over gRPC receiver
          - "4318:4318"     # OTLP over HTTP receiver
          - "9464"          # Prometheus exporter
          - "8888"          # metrics endpoint
        depends_on:
          - jaeger
        logging: *logging
Run Code Online (Sandbox Code Playgroud)

这是 otelcol-config.yml:

receivers:
      otlp:
        protocols:
          grpc:
          http:
            cors:
              allowed_origins:
                - "http://*"
                - "https://*"
    
    exporters:
      debug:
        verbosity: detailed
      otlp:
        endpoint: "jaeger:4317"
        tls:
          insecure: true
    
    processors:
      batch:
    
    service:
      telemetry:
        logs:
          level: debug
      pipelines:
        traces:
          receivers: [otlp]
          processors: [batch]
          exporters: [debug, otlp]
        metrics:
          receivers: [otlp]
          processors: [batch]
          exporters: [debug, otlp]
        logs:
          receivers: [otlp]
          processors: [batch]
          exporters: [debug, otlp]
Run Code Online (Sandbox Code Playgroud)

我可以确认收集器成功接收所有信号(它导出到收集器的标准输出),但导出到 Jaeger 时出现以下错误:

2023-10-17T01:44:36.404Z    error   exporterhelper/retry_sender.go:145      Exporting failed. The error is not retryable. Dropping data.    {"kind": "exporter", "data_type": "metrics", "name": "otlp", "error": "Permanent error: rpc error: code = Unimplemented desc = unknown service opentelemetry.proto.collector.metrics.v1.MetricsService", "dropped_items": 35}
otel-col  | go.opentelemetry.io/collector/exporter/exporterhelper.(*retrySender).send
otel-col  |     go.opentelemetry.io/collector/exporter@v0.87.0/exporterhelper/retry_sender.go:145
otel-col  | go.opentelemetry.io/collector/exporter/exporterhelper.(*metricsSenderWithObservability).send
otel-col  |     go.opentelemetry.io/collector/exporter@v0.87.0/exporterhelper/metrics.go:176
otel-col  | go.opentelemetry.io/collector/exporter/exporterhelper.(*queueSender).start.func1
otel-col  |     go.opentelemetry.io/collector/exporter@v0.87.0/exporterhelper/queue_sender.go:126
otel-col  | go.opentelemetry.io/collector/exporter/exporterhelper/internal.(*boundedMemoryQueue).Start.func1
otel-col  |     go.opentelemetry.io/collector/exporter@v0.87.0/exporterhelper/internal/bounded_memory_queue.go:52
Run Code Online (Sandbox Code Playgroud)

Jaeger这边好像没有实现这个功能?我查看了 Jaeger 和 OpenTelemetry 网站/Github 上的文档和示例,它们都是这样做的,但我无法让它工作。

小智 7

Jaeger 只能接收跟踪,而不能接收指标或日志。如果您otlp从导出器管道中删除指标和日志,则错误应该消失。

如果您确实想要导出指标和日志,则需要安装兼容的后端(例如 Prometheus 和 Loki),并使用适当的导出器。