OpenTelemetry(OTel)和 SkyWalking 组合实现可视化监控

OpenTelemetry(OTel)和 SkyWalking 组合实现可视化监控实现可视化监控,并且有多种部署方式。**

我们来详细拆解一下部署方案和可视化实现。


一、总体架构与可视化方案

OpenTelemetry(OTel)和 SkyWalking 组合实现可视化监控,主要有 两种核心架构

  1. OTel 采集 -> SkyWalking 分析/可视化(主流推荐)
  2. 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/otel SDK,配置导出到 SkyWalking 的 OTLP 端点
  • Python : 使用 opentelemetry-apiopentelemetry-sdk,配置 OTLP 导出器
  • Node.js : 使用 @opentelemetry/api@opentelemetry/sdk-trace-node
第3步:访问可视化界面
  1. 打开浏览器访问 http://localhost:8080
  2. 在 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 中:

  1. 添加 Prometheus 数据源(监控指标)
  2. 添加 Jaeger 数据源(链路追踪)
  3. 添加 SkyWalking 数据源(通过SkyWalking Grafana插件)
  4. 创建统一仪表盘,混合展示各类数据

四、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

七、生产环境建议

  1. 存储选择 :生产环境建议使用 ElasticsearchBanyanDB(SkyWalking 自研时序数据库)作为存储后端
  2. 高可用:部署至少 2 个 OAP 实例,并配置负载均衡
  3. 数据采样:在大流量场景下配置适当的采样率(如 10%-20%)
  4. 安全配置:启用 TLS 加密 OTLP 传输,配置认证
  5. 监控监控系统:监控 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 的组合,你可以:

  1. 实现完整的可视化监控:从链路追踪到性能指标
  2. 统一多语言数据采集:使用 OTel 标准化方案
  3. 享受 SkyWalking 的强大分析能力:特别是服务拓扑和 APM 功能
  4. 灵活选择部署架构:从简单一体到复杂混合架构

推荐方案 :对于大多数场景,直接从 方案一 (OTel采集 + SkyWalking后端)开始,这是最简洁高效的方案。当需要更专业的指标分析或与现有监控体系集成时,再考虑 方案二 的混合架构。

相关推荐
dgvri5 天前
Skywalking介绍,Skywalking 9.4 安装,SpringBoot集成Skywalking
spring boot·后端·skywalking
rOuN STAT6 天前
Skywalking介绍,Skywalking 9.4 安装,SpringBoot集成Skywalking
spring boot·后端·skywalking
危笑ioi6 天前
helm部署skywalking链路追踪 java
java·开发语言·skywalking
MmeD UCIZ7 天前
Skywalking介绍,Skywalking 9.4 安装,SpringBoot集成Skywalking
spring boot·后端·skywalking
专注API从业者7 天前
淘宝 API 调用链路追踪实战:基于 SkyWalking/Pinpoint 的全链路监控搭建
大数据·开发语言·数据库·skywalking
MMMMMMMMMMemory8 天前
记录skywalking预警如何处理401问题
skywalking
SoulRoar.8 天前
Armbian离线安装ES+SkyWalking并注册系统服务
大数据·elasticsearch·skywalking
@土豆9 天前
Java JVM参数环境变量详解及SkyWalking Agent集成技术文档
java·jvm·skywalking
NCIN EXPE9 天前
SpringBoot教程(三十二) SpringBoot集成Skywalking链路跟踪
spring boot·后端·skywalking
enjoy编程9 天前
SkyWalking 分布式追踪、APM学习-I
skywalking