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

请求协助实现OpenTelemetry数据持久化至数据库并对接多观测工具

基于OpenTelemetry、数据库(TimescaleDB/MongoDB)与Jaeger的集成方案

以下是两种符合你需求的实现方案,优先推荐TimescaleDB(PostgreSQL时序扩展),因其对时序追踪数据的存储和查询优化更适配可观测场景。


方案一:PostgreSQL + TimescaleDB(推荐)

1. 更新docker-compose.yaml

添加TimescaleDB服务,调整Jaeger使用PostgreSQL作为存储后端,同时替换OpenTelemetry Collector为包含扩展 exporter 的 contrib 版本:

version: '3.3'

services:
  # TimescaleDB(PostgreSQL时序扩展)
  timescaledb:
    image: timescale/timescaledb:latest-pg15
    environment:
      POSTGRES_USER: jaeger
      POSTGRES_PASSWORD: jaegerpassword
      POSTGRES_DB: jaeger
    volumes:
      - jaeger_postgres_data:/var/lib/postgresql/data
    ports:
      - "5432:5432"

  # Jaeger(从PostgreSQL读取数据)
  jaeger-all-in-one:
    image: jaegertracing/all-in-one:latest
    environment:
      - SPAN_STORAGE_TYPE=postgres
      - POSTGRES_HOST=timescaledb
      - POSTGRES_PORT=5432
      - POSTGRES_USER=jaeger
      - POSTGRES_PASSWORD=jaegerpassword
      - POSTGRES_DB=jaeger
      - POSTGRES_SSL_MODE=disable
    ports:
      - "16686:16686"
      - "14268:14268"
      - "14250:14250"
    depends_on:
      - jaeger-migrate

  # Jaeger PostgreSQL Schema初始化
  jaeger-migrate:
    image: jaegertracing/all-in-one:latest
    command: ["postgres-migrate", "up"]
    environment:
      - SPAN_STORAGE_TYPE=postgres
      - POSTGRES_HOST=timescaledb
      - POSTGRES_PORT=5432
      - POSTGRES_USER=jaeger
      - POSTGRES_PASSWORD=jaegerpassword
      - POSTGRES_DB=jaeger
      - POSTGRES_SSL_MODE=disable
    depends_on:
      - timescaledb
    restart: on-failure

  # OpenTelemetry Collector(导出数据到PostgreSQL)
  otel-collector:
    image: otel/opentelemetry-collector-contrib:latest
    command: ["--config=/etc/otel-collector-config.yaml"]
    volumes:
      - ./opentelemetry/otel-collector-config.yaml:/etc/otel-collector-config.yaml:Z
    ports:
      - "13133:13133" # Health_check extension
      - "4317:4317"   # OTLP gRPC receiver
      - "4318:4318" # HTTP
    depends_on:
      - timescaledb

volumes:
  jaeger_postgres_data:

2. 修改otel-collector-config.yaml

替换Jaeger exporter为PostgreSQL exporter,将追踪数据写入TimescaleDB:

receivers:
  otlp:
    protocols:
      grpc:
        endpoint: otel-collector:4317
      http:
        cors:
          allowed_origins:
            - "https://*"
            - "http://*"
          allowed_headers:
            - "*"

exporters:
  # 导出追踪数据到PostgreSQL/TimescaleDB
  postgres:
    dsn: "postgres://jaeger:jaegerpassword@timescaledb:5432/jaeger?sslmode=disable"
    traces_table: spans
    timeout: 5s
    max_retries: 3

processors:
  batch:

extensions:
  health_check:

service:
  extensions: [health_check]
  pipelines:
    traces:
      receivers: [otlp]
      processors: [batch]
      exporters: [postgres]

3. 对接Zipkin等其他工具

  • 方式一:直接配置Zipkin连接TimescaleDB,使用Jaeger兼容的schema读取数据
  • 方式二:通过OpenTelemetry Collector扩展,添加PostgreSQL receiver读取数据,再通过Zipkin exporter导出:
    在Collector配置中添加:
    receivers:
      postgres:
        dsn: "postgres://jaeger:jaegerpassword@timescaledb:5432/jaeger?sslmode=disable"
        traces_table: spans
        poll_interval: 1m
    
    exporters:
      zipkin:
        endpoint: "http://zipkin:9411/api/v2/spans"
    
    service:
      pipelines:
        traces-to-zipkin:
          receivers: [postgres]
          processors: [batch]
          exporters: [zipkin]
    

方案二:MongoDB

1. 更新docker-compose.yaml

添加MongoDB服务,调整Jaeger使用MongoDB作为存储后端:

version: '3.3'

services:
  # MongoDB
  mongodb:
    image: mongo:latest
    environment:
      MONGO_INITDB_ROOT_USERNAME: jaeger
      MONGO_INITDB_ROOT_PASSWORD: jaegerpassword
      MONGO_INITDB_DATABASE: jaeger
    volumes:
      - jaeger_mongo_data:/data/db
    ports:
      - "27017:27017"

  # Jaeger(从MongoDB读取数据)
  jaeger-all-in-one:
    image: jaegertracing/all-in-one:latest
    environment:
      - SPAN_STORAGE_TYPE=mongodb
      - MONGO_URL=mongodb://jaeger:jaegerpassword@mongodb:27017/jaeger?authSource=admin
    ports:
      - "16686:16686"
      - "14268:14268"
      - "14250:14250"
    depends_on:
      - mongodb

  # OpenTelemetry Collector(导出数据到MongoDB)
  otel-collector:
    image: otel/opentelemetry-collector-contrib:latest
    command: ["--config=/etc/otel-collector-config.yaml"]
    volumes:
      - ./opentelemetry/otel-collector-config.yaml:/etc/otel-collector-config.yaml:Z
    ports:
      - "13133:13133" # Health_check extension
      - "4317:4317"   # OTLP gRPC receiver
      - "4318:4318" # HTTP
    depends_on:
      - mongodb

volumes:
  jaeger_mongo_data:

2. 修改otel-collector-config.yaml

替换Jaeger exporter为MongoDB exporter:

receivers:
  otlp:
    protocols:
      grpc:
        endpoint: otel-collector:4317
      http:
        cors:
          allowed_origins:
            - "https://*"
            - "http://*"
          allowed_headers:
            - "*"

exporters:
  # 导出追踪数据到MongoDB
  mongodb:
    database: jaeger
    collection: spans
    endpoint: mongodb://jaeger:jaegerpassword@mongodb:27017/
    timeout: 5s
    max_retries: 3

processors:
  batch:

extensions:
  health_check:

service:
  extensions: [health_check]
  pipelines:
    traces:
      receivers: [otlp]
      processors: [batch]
      exporters: [mongodb]

3. 对接Zipkin等其他工具

  • 方式一:配置Zipkin使用MongoDB作为存储后端,直接读取Jaeger写入的span数据
  • 方式二:通过OpenTelemetry Collector的MongoDB receiver读取数据,再导出到Zipkin exporter,配置类似TimescaleDB方案的扩展方式

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 00:01:38