请求协助实现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
相关产品推荐
相关产品推荐

