第一部分:核心概念澄清
我们之前的类比非常准确:OpenTelemetry 是可观测性领域的“SLF4J”。它本身并非一个带界面的监控平台,而是一套开源的、厂商中立的工具、API 和 SDK 集合,其核心作用是统一观测数据(追踪、指标、日志)的生成、收集和导出标准。
简单来说,OpenTelemetry 的作用是让您的所有应用(Java, Nginx, Python 等)都能以一种标准的“普通话”(OTLP 协议)说出自己的运行状态。而 Jaeger (用于追踪分析)、Prometheus (用于指标存储) 和 Grafana (用于数据可视化) 才是接收这些“普通话”并进行展示的具体“监控平台”。它们之间的关系,以及数据从应用到展示的完整流程,如下图所示:
第二部分:部署 OpenTelemetry Collector(数据中枢)
Collector 是整个可观测性架构的中枢,负责接收、处理和转发所有数据。在您的虚拟机上安装它,建议使用官方包管理器。
1. 安装 Collector
# 对于 Debian/Ubuntu 系统
sudo apt-get update
sudo apt-get -y install wget
wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v0.141.0/otelcol_0.141.0_linux_amd64.deb
sudo dpkg -i otelcol_0.141.0_linux_amd64.deb
# 对于 Red Hat/CentOS 系统
sudo yum update
sudo yum -y install wget systemctl
wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v0.141.0/otelcol_0.141.0_linux_amd64.rpm
sudo rpm -ivh otelcol_0.141.0_linux_amd64.rpm
安装后,Collector 会作为 otelcol 系统服务运行,其配置文件位于 /etc/otelcol/config.yaml。
2. 核心配置
您需要编辑上述配置文件,定义数据流水线。以下是一个将数据同时发送到 Jaeger 和 Prometheus 的基础配置示例:
# /etc/otelcol/config.yaml
receivers:
otlp: # 接收器:通过OTLP协议(gRPC和HTTP)接收应用数据
protocols:
grpc:
endpoint: 0.0.0.0:4317
http:
endpoint: 0.0.0.0:4318
exporters: # 导出器:配置数据发送的后端
jaeger: # 将追踪数据发送到Jaeger
endpoint: "jaeger:14250" # 假设Jaeger服务地址
tls:
insecure: true
prometheus: # 将指标数据暴露给Prometheus抓取
endpoint: "0.0.0.0:8889"
processors: # 处理器:对数据进行批处理等优化
batch:
service:
pipelines: # 流水线:将组件连接起来
traces:
receivers: [otlp]
processors: [batch]
exporters: [jaeger]
metrics:
receivers: [otlp]
processors: [batch]
exporters: [prometheus]
修改配置后,重启服务:sudo systemctl restart otelcol。
第三部分:应用集成(让数据“说”出来)
1. Java 应用集成(无侵入式,推荐)
这是最简单的方式,通过 Java Agent 自动注入探针,无需修改代码。
- 下载 Agent:从官方仓库获取
opentelemetry-javaagent.jar。 - 启动应用时添加参数:
java -javaagent:/path/to/opentelemetry-javaagent.jar \
-Dotel.exporter.otlp.endpoint=http://<collector_ip>:4318 \ # 指向您的Collector
-Dotel.service.name=your-java-app \ # 设置服务名
-jar your-application.jar
2. Nginx 集成(需加载模块)
Nginx 需要通过动态模块支持 OpenTelemetry。最直接的方法是使用预编译了该模块的 Nginx 镜像(如 nginx:otel),或从源码编译。
- 关键配置:在
nginx.conf的http块中添加以下配置,将数据指向 Collector。
load_module modules/ngx_http_opentelemetry_module.so; # 加载模块
opentelemetry on;
opentelemetry_service_name nginx-frontend;
opentelemetry_endpoint <collector_host>:4317; # 替换为Collector地址
3. Python 应用集成(SDK方式)
通过安装 SDK 和相应工具包进行集成。
- 安装基础包:
pip install opentelemetry-api opentelemetry-sdk opentelemetry-exporter-otlp-proto-http
# 根据您的框架选择安装,例如Flask
pip install opentelemetry-instrumentation-flask
- 代码初始化(以Flask为例):在应用启动文件中配置SDK,使其将数据发送到 Collector。
from opentelemetry.instrumentation.flask import FlaskInstrumentor
from opentelemetry.exporter.otlp.proto.http.trace_exporter import OTLPSpanExporter
from opentelemetry.sdk.trace.export import BatchSpanProcessor
app = Flask(__name__)
FlaskInstrumentor().instrument_app(app)
# ... 设置TracerProvider,并添加OTLP处理器 ...
processor = BatchSpanProcessor(OTLPSpanExporter(endpoint="http://<collector_ip>:4318/v1/traces"))
trace.get_tracer_provider().add_span_processor(processor)
第四部分:构建观测平台(数据的“展示台”)
您可以使用 Docker Compose 快速搭建后端平台。创建 docker-compose.yml 文件并启动以下服务:
- Jaeger:用于追踪可视化,UI 端口
16686。 - Prometheus:用于抓取并存储 Collector 暴露在
8889端口的指标,端口9090。 - Grafana:用于创建监控仪表盘,端口
3000。启动后需在 Grafana 中添加 Prometheus 作为数据源。
最终验证:依次访问 Jaeger UI 和 Grafana,查看是否有来自您应用的追踪数据和指标图表。
注意事项与后续步骤
- 网络与防火墙:确保您的 Collector 和各个后端服务的相关端口(如
4317,4318,16686,9090)在虚拟机之间可访问。 - 配置检查:应用、Collector、后端三者的地址和端口配置需保持连贯。
- 深入探索:待基础链路运行后,可进一步探索日志集成、更细粒度的性能指标监控以及设置告警规则。