OpenTelemetry(OTel)和 SkyWalking 组合实现可视化监控实现可视化监控,并且有多种部署方式。**
我们来详细拆解一下部署方案和可视化实现。
一、总体架构与可视化方案
OpenTelemetry(OTel)和 SkyWalking 组合实现可视化监控,主要有 两种核心架构:
- OTel 采集 -> SkyWalking 分析/可视化(主流推荐)
- OTel 采集 -> 其他后端 + SkyWalking 分析/可视化(混合架构)
下图清晰地展示了这两种部署架构及其数据流向:
"方案二:混合后端架构"
"方案一:SkyWalking 作为主力后端"
数据流与处理
数据采集层
应用服务集群
Java应用
Go应用
Node.js应用
"OpenTelemetry Agent/SDK
(多语言统一采集)"
"OTLP/gRPC协议
标准数据流"
"SkyWalking OAP Server
(接收OTLP数据)"
"SkyWalking UI
(一体化可视化)"
"Jaeger
(专注追踪)"
"Prometheus
(专注指标)"
"Grafana
(统一仪表盘)"
"(可选)SkyWalking数据
可再导出到Prometheus"
二、方案一:OTel 采集 + SkyWalking 作为主力后端(最简洁)
这是最直接的一体化方案,用 OTel 标准化采集,用 SkyWalking 做存储、分析和可视化。
部署步骤
第1步:部署 SkyWalking 后端(支持 OTLP)
SkyWalking 从 8.4.0 版本开始原生支持 OTLP 协议接收。
使用 Docker 快速部署:
bash
# 1. 创建网络
docker network create sw-net
# 2. 启动 Elasticsearch(存储)
docker run -d --name=elasticsearch \
--network=sw-net \
-p 9200:9200 -p 9300:9300 \
-e "discovery.type=single-node" \
-e "ES_JAVA_OPTS=-Xms512m -Xmx512m" \
docker.elastic.co/elasticsearch/elasticsearch:7.16.2
# 3. 启动 SkyWalking OAP(接收OTLP数据)
docker run -d --name=skywalking-oap \
--network=sw-net \
-p 11800:11800 -p 12800:12800 \
-p 4317:4317 -p 4318:4318 \ # OTLP gRPC和HTTP端口
-e SW_STORAGE=elasticsearch \
-e SW_STORAGE_ES_CLUSTER_NODES=elasticsearch:9200 \
-e SW_RECEIVER_OTEL_ENABLED=true \ # 启用OTLP接收器
apache/skywalking-oap-server:9.7.0
# 4. 启动 SkyWalking UI
docker run -d --name=skywalking-ui \
--network=sw-net \
-p 8080:8080 \
-e SW_OAP_ADDRESS=http://skywalking-oap:12800 \
apache/skywalking-ui:9.7.0
第2步:应用集成 OpenTelemetry SDK/Agent
以 Java Spring Boot 应用为例:
方式A:使用 OTel Java Agent(无侵入,推荐)
bash
# 1. 下载最新版 OTel Java Agent
wget https://github.com/open-telemetry/opentelemetry-java-instrumentation/releases/latest/download/opentelemetry-javaagent.jar
# 2. 启动应用时添加JVM参数
java -javaagent:./opentelemetry-javaagent.jar \
-Dotel.service.name=user-service \
-Dotel.traces.exporter=otlp \
-Dotel.metrics.exporter=otlp \
-Dotel.logs.exporter=otlp \
-Dotel.exporter.otlp.endpoint=http://skywalking-oap:4317 \
-Dotel.exporter.otlp.protocol=grpc \
-jar your-application.jar
方式B:通过依赖手动集成
xml
<!-- pom.xml 添加依赖 -->
<dependency>
<groupId>io.opentelemetry</groupId>
<artifactId>opentelemetry-api</artifactId>
<version>1.35.0</version>
</dependency>
<dependency>
<groupId>io.opentelemetry</groupId>
<artifactId>opentelemetry-sdk</artifactId>
<version>1.35.0</version>
</dependency>
<dependency>
<groupId>io.opentelemetry</groupId>
<artifactId>opentelemetry-exporter-otlp</artifactId>
<version>1.35.0</version>
</dependency>
对于其他语言:
- Go : 使用
go.opentelemetry.io/otelSDK,配置导出到 SkyWalking 的 OTLP 端点 - Python : 使用
opentelemetry-api和opentelemetry-sdk,配置 OTLP 导出器 - Node.js : 使用
@opentelemetry/api和@opentelemetry/sdk-trace-node
第3步:访问可视化界面
- 打开浏览器访问
http://localhost:8080 - 在 SkyWalking UI 中即可看到:
- 服务拓扑图(自动生成)
- 链路追踪详情
- 应用性能指标(JVM、请求量、延迟等)
- 日志关联查询(如果配置了日志导出)
三、方案二:OTel Collector + 混合后端(更灵活)
此方案使用 OTel Collector 作为数据管道,将数据分发给多个后端。
部署架构
应用 -> OTel Collector -> [SkyWalking OAP, Jaeger, Prometheus]
↓
[SkyWalking UI, Grafana]
部署步骤
第1步:部署 OTel Collector
创建 otel-collector-config.yaml:
yaml
receivers:
otlp:
protocols:
grpc:
endpoint: 0.0.0.0:4317
http:
endpoint: 0.0.0.0:4318
exporters:
# 导出到 SkyWalking
otlp/sw:
endpoint: "skywalking-oap:4317"
tls:
insecure: true
# 导出到 Jaeger
jaeger:
endpoint: "jaeger:14250"
tls:
insecure: true
# 导出到 Prometheus
prometheus:
endpoint: "0.0.0.0:9464"
processors:
batch:
memory_limiter:
check_interval: 1s
limit_mib: 512
service:
pipelines:
traces:
receivers: [otlp]
processors: [memory_limiter, batch]
exporters: [otlp/sw, jaeger]
metrics:
receivers: [otlp]
processors: [memory_limiter, batch]
exporters: [prometheus]
启动 Collector:
bash
docker run -d --name=otel-collector \
--network=sw-net \
-p 4317:4317 -p 4318:4318 -p 9464:9464 \
-v $(pwd)/otel-collector-config.yaml:/etc/otel-collector-config.yaml \
otel/opentelemetry-collector-contrib:0.95.0 \
--config=/etc/otel-collector-config.yaml
第2步:应用配置指向 Collector
bash
java -javaagent:./opentelemetry-javaagent.jar \
-Dotel.service.name=user-service \
-Dotel.traces.exporter=otlp \
-Dotel.metrics.exporter=otlp \
-Dotel.exporter.otlp.endpoint=http://otel-collector:4317 \
-jar your-application.jar
第3步:配置 Grafana 统一视图
在 Grafana 中:
- 添加 Prometheus 数据源(监控指标)
- 添加 Jaeger 数据源(链路追踪)
- 添加 SkyWalking 数据源(通过SkyWalking Grafana插件)
- 创建统一仪表盘,混合展示各类数据
四、Kubernetes 部署方案(生产推荐)
使用 Helm 快速部署
部署 SkyWalking(支持 OTLP)
bash
# 添加 Helm 仓库
helm repo add skywalking https://apache.jfrog.io/artifactory/skywalking-helm
# 部署 SkyWalking
helm install skywalking skywalking/skywalking \
--set oap.replicas=2 \
--set oap.image.tag=9.7.0 \
--set ui.image.tag=9.7.0 \
--set oap.env.SW_RECEIVER_OTEL_ENABLED=true \
--set storage.type=elasticsearch \
--set elasticsearch.enabled=true
为应用注入 OTel Sidecar
使用 OpenTelemetry Operator(如果已安装)自动注入:
yaml
apiVersion: opentelemetry.io/v1alpha1
kind: Instrumentation
metadata:
name: java-instrumentation
spec:
exporter:
endpoint: http://skywalking-oap:4317
propagators:
- tracecontext
- baggage
sampler:
type: parentbased_traceidratio
argument: "0.25"
java:
image: ghcr.io/open-telemetry/opentelemetry-operator/autoinstrumentation-java:latest
或者在 Deployment 中手动配置:
yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: user-service
spec:
template:
spec:
containers:
- name: app
image: your-app:latest
env:
- name: JAVA_TOOL_OPTIONS
value: >
-javaagent:/otel/javaagent.jar
-Dotel.service.name=user-service
-Dotel.exporter.otlp.endpoint=http://skywalking-oap:4317
volumeMounts:
- name: opentelemetry-javaagent
mountPath: /otel
volumes:
- name: opentelemetry-javaagent
emptyDir: {}
initContainers:
- name: download-javaagent
image: busybox
command: ['sh', '-c']
args:
- wget -O /otel/javaagent.jar https://github.com/open-telemetry/opentelemetry-java-instrumentation/releases/latest/download/opentelemetry-javaagent.jar
volumeMounts:
- name: opentelemetry-javaagent
mountPath: /otel
五、可视化效果与功能对比
| 可视化组件 | 主要功能 | 访问方式 |
|---|---|---|
| SkyWalking UI | 1. 服务拓扑图(实时动态) 2. 链路追踪查询 3. 性能指标仪表盘 4. 告警管理 5. 日志关联 | http://<skywalking-ui>:8080 |
| Grafana | 1. 自定义监控仪表盘 2. 多数据源聚合展示 3. 灵活的图表配置 | http://<grafana>:3000 |
| Jaeger UI | 1. 专业的链路追踪分析 2. 系统架构图 3. 对比分析功能 | http://<jaeger>:16686 |
六、关键配置要点
SkyWalking OAP 的 OTLP 配置
yaml
# 在 application.yml 中确保以下配置
receiver-otel:
default:
enabled: true
gRPCHost: ${SW_RECEIVER_OTEL_GRPC_HOST:0.0.0.0}
gRPCPort: ${SW_RECEIVER_OTEL_GRPC_PORT:4317}
httpHost: ${SW_RECEIVER_OTEL_HTTP_HOST:0.0.0.0}
httpPort: ${SW_RECEIVER_OTEL_HTTP_PORT:4318}
OTel Agent 关键配置
bash
# 基础配置
-Dotel.service.name=your-service-name
-Dotel.resource.attributes=deployment.environment=production
-Dotel.traces.exporter=otlp
-Dotel.metrics.exporter=otlp
# SkyWalking 后端地址
-Dotel.exporter.otlp.endpoint=http://skywalking-oap:4317
-Dotel.exporter.otlp.protocol=grpc
# 采样率配置
-Dotel.traces.sampler=parentbased_always_on
七、生产环境建议
- 存储选择 :生产环境建议使用 Elasticsearch 或 BanyanDB(SkyWalking 自研时序数据库)作为存储后端
- 高可用:部署至少 2 个 OAP 实例,并配置负载均衡
- 数据采样:在大流量场景下配置适当的采样率(如 10%-20%)
- 安全配置:启用 TLS 加密 OTLP 传输,配置认证
- 监控监控系统:监控 SkyWalking OAP 和 UI 本身的健康状态
快速验证命令
bash
# 验证 SkyWalking OAP 健康状态
curl http://localhost:12800/version
# 验证 OTLP 接收器
grpcurl -plaintext localhost:4317 list
# 发送测试数据
curl -X POST http://localhost:4318/v1/traces \
-H "Content-Type: application/json" \
-d '{"resourceSpans":[]}'
总结
通过 OpenTelemetry + SkyWalking 的组合,你可以:
- ✅ 实现完整的可视化监控:从链路追踪到性能指标
- ✅ 统一多语言数据采集:使用 OTel 标准化方案
- ✅ 享受 SkyWalking 的强大分析能力:特别是服务拓扑和 APM 功能
- ✅ 灵活选择部署架构:从简单一体到复杂混合架构
推荐方案 :对于大多数场景,直接从 方案一 (OTel采集 + SkyWalking后端)开始,这是最简洁高效的方案。当需要更专业的指标分析或与现有监控体系集成时,再考虑 方案二 的混合架构。