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后端)开始,这是最简洁高效的方案。当需要更专业的指标分析或与现有监控体系集成时,再考虑 方案二 的混合架构。

相关推荐
shepherd1266 天前
从入门到实践:玩转分布式链路追踪利器SkyWalking
java·分布式·后端·skywalking
阿拉斯攀登14 天前
SkyWalking使用:Spring Boot场景
spring boot·后端·skywalking
阿拉斯攀登14 天前
SkyWalking使用:Spring Cloud Alibaba场景
skywalking
乐之者v14 天前
使用 SkyWalking,没有 traceId, 如何分析?
skywalking
阿拉斯攀登14 天前
SkyWalking 与 Zipkin、Prometheus 深度对比分析
prometheus·skywalking·可观测性·zipkin
小毅&Nora16 天前
【后端】【诡秘架构】 ① 序列9:占卜家——分布式链路追踪入门:用 SkyWalking 预知系统命运
分布式·架构·skywalking
boy快快长大18 天前
【Spring Cloud Alibaba】SkyWalking 链路追踪
skywalking
Li_76953218 天前
Spring Cloud — SkyWalking(六)
java·后端·spring·spring cloud·skywalking
Li_76953219 天前
Spring Cloud —— SkyWalking(五)
java·后端·spring·spring cloud·skywalking