手把手演示用 OpenTelemetry Collector 把应用的 trace、metrics、logs 统一接入炬鲸 OBSERVE,包含采集器配置文件、Java 自动插桩参数、采样设置和验证方法,无需改业务代码即可看到完整调用链。
你需要一个炬鲸 OBSERVE 租户,记下接入地址和访问 Token。本文假设环境是 Linux + Docker,业务是 Java / Go 微服务。整个接入分三步:部署 Collector 作为统一接收端、业务侧上报、验证链路。
先跑一个 OpenTelemetry Collector,统一接收各服务的 trace / metrics / logs 并转发到 OBSERVE。用 docker-compose 起一个 collector:
otel-collector:
image: otel/opentelemetry-collector-contrib:0.102.0
volumes:
- ./otel-collector-config.yaml:/etc/otelcol/config.yaml
ports:
- "4317:4317" # OTLP gRPC
- "4318:4318" # OTLP HTTP
- "8889:8889" # Prometheus scrape
配置文件的关键在 exporter 和 pipelines:
receivers:
otlp:
protocols: { grpc: {}, http: {} }
prometheus:
config:
scrape_configs:
- job_name: 'otel-collector'
scrape_interval: 15s
static_configs: [{ targets: ['localhost:8888'] }]
exporters:
otlp/jjhub:
endpoint: "obs-gateway.jjhub.cn:4317"
headers: { authorization: "Bearer <TOKEN>" }
service:
pipelines:
traces: { receivers: [otlp], exporters: [otlp/jjhub] }
metrics: { receivers: [otlp, prometheus], exporters: [otlp/jjhub] }
logs: { receivers: [otlp], exporters: [otlp/jjhub] }
不改业务代码最快的方式是自动插桩(auto-instrumentation)。Java 服务启动时加 javaagent:
java -javaagent:opentelemetry-javaagent.jar -Dotel.service.name=order-service -Dotel.traces.exporter=otlp -Dotel.metrics.exporter=otlp -Dotel.logs.exporter=otlp -Dotel.exporter.otlp.endpoint=http://localhost:4318 -jar app.jar
Go 服务用 otelhttp、otelgrpc 等库手动埋点,或者在无法插桩的遗留系统上用 eBPF 无侵入采集(见 v2.6.0 发布说明)。无论哪种方式,service.name 一定要设置且全局唯一,否则链路和指标会混在一起。
中间加一层 Collector 而不是让业务直连 OBSERVE,主要有三个原因:一是统一鉴权,Token 只配置在 Collector 一处,业务侧无需感知;二是集中做采样、批处理和重试,网络抖动时不丢数据;三是改 exporter 配置只改一处,几百个服务不用逐个改。Collector 建议和业务部署在同一机房,减少跨机房上报延迟。
另外建议给每个服务统一打上 resource attribute,例如 deployment.environment=prod、service.version=v1.2.0。这些属性会随 trace 和 metrics 一起上报,在 OBSERVE 里可以按环境、版本过滤,排查时能快速圈定"是不是某次发布引入的问题"。环境标签不要写错,否则线上和预发的数据会混在一起。
全量采集在生产环境不现实,流量一大 Collector 和存储都会被打满。默认建议在 Collector 里用 tail_sampling 或 probabilistic_sampling 处理器,只保留慢请求和错误请求:
processors:
probabilistic_sampler:
sampling_percentage: 10
tail_sampling:
policies:
- name: slow
type: latency
latency: { threshold_ms: 500 }
- name: errors
type: status_code
status_code: { status_codes: [ERROR] }
慢请求和错误请求 100% 保留,正常请求按 10% 采样,既保住排障所需的完整链路,又控制存储成本。采样策略建议灰度调,先全量跑一天看数据量,再逐步收紧。
otel. 前缀;curl -v http://localhost:4318 检查端口,再看 collector 日志里 export 是否报错,多半是 Token 或 endpoint 写错;