Skip to content

Apache SkyWalking

Apache SkyWalking 是一个应用性能监控(APM)系统,专门为微服务、云原生和基于容器(Docker、K8s、Mesos)的架构而设计。它提供了分布式追踪、服务网格遥测分析、指标聚合和可视化等功能。

核心特性

  • 分布式追踪:自动追踪分布式系统中的请求链路
  • 性能指标监控:监控应用性能指标,包括响应时间、吞吐量等
  • 服务拓扑图:自动生成服务依赖关系图
  • 告警:支持多种告警规则和通知方式
  • 日志关联:将日志与追踪数据关联
  • 多语言支持:支持 Java、.NET、Node.js、Python、Go 等
  • 存储支持:支持 Elasticsearch、MySQL、TiDB、InfluxDB 等

架构组件

  • Agent:探针,负责收集应用数据
  • Collector:收集器,接收 Agent 上报的数据
  • Storage:存储层,存储追踪和指标数据
  • UI:Web 界面,提供可视化和查询功能

Docker 安装

安装 Elasticsearch(存储)

bash
docker run -d \
  --name elasticsearch \
  --restart=always \
  -p 9200:9200 \
  -p 9300:9300 \
  -e "discovery.type=single-node" \
  -e "ES_JAVA_OPTS=-Xms512m -Xmx512m" \
  elasticsearch:7.17.0

安装 SkyWalking OAP(收集器)

bash
docker run -d \
  --name skywalking-oap \
  --restart=always \
  -p 11800:11800 \
  -p 12800:12800 \
  -e SW_STORAGE=elasticsearch \
  -e SW_STORAGE_ES_CLUSTER_NODES=elasticsearch:9200 \
  apache/skywalking-oap-server:9.5.0

安装 SkyWalking UI

bash
docker run -d \
  --name skywalking-ui \
  --restart=always \
  -p 8080:8080 \
  --link skywalking-oap:skywalking-oap \
  -e SW_OAP_ADDRESS=http://skywalking-oap:12800 \
  apache/skywalking-ui:9.5.0

访问 UI:http://localhost:8080

Java 应用集成

方式一:使用 Agent(推荐)

下载 SkyWalking Agent:

bash
wget https://archive.apache.org/dist/skywalking/9.5.0/apache-skywalking-java-agent-9.5.0.tgz
tar -xzf apache-skywalking-java-agent-9.5.0.tgz

启动应用时添加 JVM 参数:

bash
java -javaagent:/path/to/skywalking-agent/skywalking-agent.jar \
  -DSW_AGENT_NAME=your-service-name \
  -DSW_AGENT_COLLECTOR_BACKEND_SERVICES=localhost:11800 \
  -jar your-application.jar

方式二:Spring Boot 集成

添加依赖

pom.xml 中添加依赖:

xml
<dependency>
    <groupId>org.apache.skywalking</groupId>
    <artifactId>apm-toolkit-trace</artifactId>
    <version>9.5.0</version>
</dependency>

<dependency>
    <groupId>org.apache.skywalking</groupId>
    <artifactId>apm-toolkit-logback-1.x</artifactId>
    <version>9.5.0</version>
</dependency>

配置 Agent

application.yml 中配置:

yaml
skywalking:
  agent:
    service_name: your-service-name
    collector:
      backend_service: localhost:11800
    plugin:
      mysql:
        trace_sql_parameters: true

启动参数

在启动脚本中添加:

bash
-javaagent:/path/to/skywalking-agent/skywalking-agent.jar

手动追踪

创建自定义追踪

java
import org.apache.skywalking.apm.toolkit.trace.Trace;
import org.apache.skywalking.apm.toolkit.trace.TraceContext;

@Service
public class OrderService {
    
    @Trace
    public void createOrder(Order order) {
        // 业务逻辑
        processOrder(order);
    }
    
    @Trace(operationName = "processOrder")
    public void processOrder(Order order) {
        // 处理订单
    }
    
    public void logTraceId() {
        // 获取追踪 ID
        String traceId = TraceContext.traceId();
        log.info("Trace ID: {}", traceId);
    }
}

异步追踪

java
import org.apache.skywalking.apm.toolkit.trace.RunnableWrapper;
import org.apache.skywalking.apm.toolkit.trace.TraceCrossThread;

@Service
public class AsyncService {
    
    @TraceCrossThread
    public void asyncProcess() {
        CompletableFuture.runAsync(
            RunnableWrapper.of(() -> {
                // 异步任务
            })
        );
    }
}

日志关联

Logback 配置

logback-spring.xml 中配置:

xml
<configuration>
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
            <layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.TraceIdPatternLogbackLayout">
                <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%tid] [%thread] %-5level %logger{36} - %msg%n</pattern>
            </layout>
        </encoder>
    </appender>
    
    <root level="INFO">
        <appender-ref ref="STDOUT" />
    </root>
</configuration>

使用日志

java
import org.apache.skywalking.apm.toolkit.trace.ActiveSpan;
import org.apache.skywalking.apm.toolkit.trace.TraceContext;

@Service
public class OrderService {
    
    public void createOrder(Order order) {
        // 添加追踪信息到日志
        ActiveSpan.info("Creating order: " + order.getOrderId());
        
        // 获取追踪 ID
        String traceId = TraceContext.traceId();
        log.info("Trace ID: {}, Order ID: {}", traceId, order.getOrderId());
    }
}

指标监控

HTTP 指标

SkyWalking 自动监控 HTTP 请求的以下指标:

  • 响应时间
  • 吞吐量(QPS)
  • 错误率
  • 状态码分布

数据库指标

自动监控数据库操作的:

  • SQL 执行时间
  • SQL 执行次数
  • 慢 SQL 识别

自定义指标

java
import org.apache.skywalking.apm.toolkit.meter.Counter;
import org.apache.skywalking.apm.toolkit.meter.Gauge;
import org.apache.skywalking.apm.toolkit.meter.MeterFactory;

@Service
public class MetricsService {
    
    private Counter orderCounter;
    
    @PostConstruct
    public void init() {
        orderCounter = MeterFactory.counter("order_count")
            .tag("type", "create")
            .build();
    }
    
    public void createOrder() {
        // 增加计数器
        orderCounter.increment();
    }
}

告警配置

告警规则配置

config/alarm-settings.yml 中配置:

yaml
rules:
  # 服务响应时间告警
  service_sla_rule:
    metrics-name: service_sla
    threshold: 8000
    op: "<"
    period: 10
    count: 3
    message: "服务 {name} 的平均响应时间在最近 10 分钟内低于 8000 毫秒"
  
  # 服务错误率告警
  service_resp_time_rule:
    metrics-name: service_resp_time
    threshold: 1000
    op: ">"
    period: 10
    count: 3
    message: "服务 {name} 的平均响应时间在最近 10 分钟内超过 1000 毫秒"
  
  # 数据库慢查询告警
  database_access_sla_rule:
    metrics-name: database_access_sla
    threshold: 1000
    op: "<"
    period: 10
    count: 2
    message: "数据库 {name} 的平均响应时间在最近 10 分钟内低于 1000 毫秒"

Webhook 通知

yaml
webhooks:
  - http://localhost:8080/webhook

服务拓扑图

SkyWalking 会自动生成服务依赖关系图,包括:

  • 服务之间的调用关系
  • 服务与数据库的依赖关系
  • 服务与消息队列的依赖关系
  • 调用链路的性能指标

追踪查询

按服务查询

在 UI 中可以按服务查询追踪数据:

  • 选择服务
  • 选择时间范围
  • 查看追踪列表

按端点查询

可以查询特定端点的追踪数据:

  • 选择端点(如 HTTP 路径)
  • 查看该端点的所有追踪

按追踪 ID 查询

如果知道追踪 ID,可以直接查询:

  • 输入追踪 ID
  • 查看完整的调用链路

性能分析

端点性能分析

  • 查看端点的平均响应时间
  • 查看端点的吞吐量
  • 查看端点的错误率
  • 识别慢端点

服务性能分析

  • 查看服务的整体性能
  • 分析服务的依赖关系
  • 识别性能瓶颈

数据库性能分析

  • 查看 SQL 执行时间
  • 识别慢 SQL
  • 分析数据库连接池使用情况

最佳实践

  1. 合理设置采样率:在高并发场景下,可以设置采样率减少数据量
  2. 配置告警规则:及时发现问题
  3. 日志关联:将日志与追踪数据关联,便于排查问题
  4. 性能优化:根据监控数据优化性能瓶颈
  5. 存储优化:合理配置存储,定期清理历史数据
  6. Agent 版本管理:保持 Agent 版本与 OAP 版本一致

常见问题

Agent 无法连接 OAP

  • 检查网络连接
  • 检查 OAP 服务是否正常启动
  • 检查配置的地址和端口是否正确

数据不显示

  • 检查 Agent 是否正常启动
  • 检查采样率配置
  • 检查存储配置

性能影响

  • Agent 对应用性能影响很小(通常 < 3%)
  • 可以调整采样率减少影响
  • 可以关闭不需要的插件

SkyWalking 作为强大的 APM 工具,可以帮助开发团队快速定位和解决分布式系统中的性能问题,提升系统的可观测性。