Skip to content
清晨的一缕阳光
返回

SkyWalking 核心概念

SkyWalking 核心概念

SkyWalking 简介

SkyWalking 是一款开源的应用性能监控(APM)系统,为分布式系统提供链路追踪、性能分析、服务网格观测等功能。

核心特性

架构组成

┌─────────────────────────────────────────────────────┐
│                      Agent                          │
│  (Java Agent, Go SDK, Python SDK, etc.)             │
└──────────────────────┬──────────────────────────────┘

                       │ 上报追踪数据

┌─────────────────────────────────────────────────────┐
│                   OAP Server                        │
│  (数据接收、分析、聚合、告警)                         │
└──────────────────────┬──────────────────────────────┘

                       │ 存储数据

┌─────────────────────────────────────────────────────┐
│              Storage (ES, MySQL, etc.)              │
└──────────────────────┬──────────────────────────────┘

                       │ 查询数据

┌─────────────────────────────────────────────────────┐
│                    UI (Web)                         │
│  (可视化展示、拓扑图、链路追踪、指标分析)              │
└─────────────────────────────────────────────────────┘

核心概念

1. 服务(Service)

服务是 SkyWalking 中的基本概念,代表一个应用系统:

2. 服务实例(Service Instance)

服务实例是服务的具体运行单元:

3. 端点(Endpoint)

端点是服务提供的接口:

4. 追踪(Trace)

追踪是请求在分布式系统中的完整调用链路:

5. 跨度(Span)

跨度是追踪的基本单元:

快速开始

1. Docker 部署 SkyWalking

version: '3.3'
services:
  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:7.17.0
    container_name: es
    environment:
      - discovery.type=single-node
      - ES_JAVA_OPTS=-Xms512m -Xmx512m
    ports:
      - "9200:9200"
    volumes:
      - es_data:/usr/share/elasticsearch/data

  skywalking-oap:
    image: apache/skywalking-oap-server:9.7.0
    container_name: oap
    depends_on:
      - elasticsearch
    environment:
      SW_STORAGE: elasticsearch
      SW_STORAGE_ES_CLUSTER_NODES: elasticsearch:9200
    ports:
      - "11800:11800"
      - "12800:12800"

  skywalking-ui:
    image: apache/skywalking-ui:9.7.0
    container_name: ui
    depends_on:
      - skywalking-oap
    environment:
      SW_OAP_ADDRESS: skywalking-oap:12800
    ports:
      - "8080:8080"

volumes:
  es_data:

2. Java Agent 接入

下载 SkyWalking Agent:

wget https://archive.apache.org/dist/skywalking/9.7.0/apache-skywalking-apm-9.7.0.tar.gz
tar -xzf apache-skywalking-apm-9.7.0.tar.gz

配置 agent.config:

# agent 配置
agent.service_name=user-service
agent.namespace=dev
agent.instance_name=instance-1

# OAP 服务器地址
collector.backend_service=127.0.0.1:11800

# 采样率(100 表示 100%)
sample_n_per_3_secs=100

# 日志配置
logging.dir=logs
logging.level=DEBUG

3. 启动应用

java -javaagent:/path/to/skywalking/agent/skywalking-agent.jar \
     -Dskywalking.agent.service_name=user-service \
     -Dskywalking.collector.backend_service=127.0.0.1:11800 \
     -jar app.jar

4. Spring Boot 集成

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

链路追踪

自动追踪

SkyWalking Agent 会自动追踪以下框架:

手动埋点

1. 使用注解

@Service
public class UserService {
    
    @Trace
    public User findById(Long id) {
        return userRepository.findById(id).orElse(null);
    }
    
    @Trace(operationName = "customOperation")
    public User create(User user) {
        return userRepository.save(user);
    }
    
    @Trace(tags = {
        @Tag(key = "userId", value = "arg[0]"),
        @Tag(key = "result", value = "returnedObj")
    })
    public User update(Long id, User user) {
        return userRepository.save(user);
    }
}

2. 使用 API

@Service
public class OrderService {
    
    @Autowired
    private Tracer tracer;
    
    public Order createOrder(Order order) {
        // 创建 Span
        Span span = Tracer.createSpan("createOrder");
        try {
            span.tag("orderId", order.getId().toString());
            span.log("开始创建订单");
            
            // 业务逻辑
            Order result = orderRepository.save(order);
            
            span.log("订单创建成功");
            return result;
        } catch (Exception e) {
            span.errorOccurred();
            span.log("订单创建失败:" + e.getMessage());
            throw e;
        } finally {
            Tracer.stopSpan(span);
        }
    }
}

3. 异步追踪

@Service
public class AsyncService {
    
    @Trace
    public CompletableFuture<String> asyncTask() {
        Span span = Tracer.createSpan("asyncTask");
        try {
            return CompletableFuture.supplyAsync(() -> {
                try (Scope ignored = Tracer.activateSpan(span)) {
                    span.log("执行异步任务");
                    return "result";
                }
            });
        } finally {
            Tracer.stopSpan(span);
        }
    }
}

性能指标监控

1. 服务指标

SkyWalking 自动收集以下服务指标:

2. JVM 指标

3. 数据库指标

告警配置

告警规则

# alarm-settings.yml
rules:
  # 服务响应时间告警
  service_resp_time_rule:
    metrics-name: service_resp_time
    op: ">"
    threshold: 1000
    period: 10
    count: 3
    silence-period: 5
    message: 服务 {name} 响应时间超过 1000ms
    
  # 服务成功率告警
  service_sla_rule:
    metrics-name: service_sla
    op: "<"
    threshold: 80
    period: 10
    count: 2
    silence-period: 5
    message: 服务 {name} 成功率低于 80%
    
  # 服务 P90 响应时间告警
  service_p90_rule:
    metrics-name: service_p90
    op: ">"
    threshold: 2000
    period: 10
    count: 3
    silence-period: 5
    message: 服务 {name} P90 响应时间超过 2000ms
    
  # 数据库慢查询告警
  database_resp_time_rule:
    metrics-name: database_resp_time
    op: ">"
    threshold: 500
    period: 10
    count: 5
    silence-period: 5
    message: 数据库响应时间超过 500ms

告警通知

# webhook 通知
webhooks:
  - http://alert-manager:9093/alert

# 钉钉通知
dingtalk:
  webhooks:
    - url: https://oapi.dingtalk.com/robot/send?access_token=xxx
      secret: xxx
      
# 企业微信通知
wechat:
  webhooks:
    - url: https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=xxx

拓扑分析

服务拓扑图

SkyWalking 自动生成服务依赖拓扑图:

依赖分析

通过拓扑图可以分析:

日志关联

日志采集

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

配置 logback.xml:

<configuration>
    <appender name="CONSOLE" 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="CONSOLE"/>
    </root>
</configuration>

日志与追踪关联

通过 Trace ID 将日志与追踪关联:

@Service
public class LogService {
    
    private static final Logger logger = LoggerFactory.getLogger(LogService.class);
    
    @Trace
    public void process(String data) {
        logger.info("开始处理数据:{}", data);
        
        // 业务逻辑
        
        logger.info("数据处理完成");
    }
}

日志输出:

2026-04-10 10:00:00.000 [TID: N/A] [main] INFO  c.e.service.LogService - 开始处理数据:test
2026-04-10 10:00:00.100 [TID: 123456.0.1] [main] INFO  c.e.service.LogService - 数据处理完成

生产实践

1. Agent 配置优化

# 服务名
agent.service_name=${SW_AGENT_NAME:user-service}

# 命名空间(环境隔离)
agent.namespace=${SW_AGENT_NAMESPACE:prod}

# 实例名
agent.instance_name=${SW_AGENT_INSTANCE:instance-1}

# OAP 地址
collector.backend_service=${SW_AGENT_COLLECTOR_BACKEND:127.0.0.1:11800}

# 采样率
sample_n_per_3_secs=${SW_SAMPLE_N_PER_3_SECS:100}

# 忽略路径
agent.ignore_suffix=${SW_AGENT_IGNORE:.css,.js,.html,.png,.jpg}

# 插件配置
plugin.mysql.trace_sql_parameters=${SW_MYSQL_TRACE_SQL_PARAMETERS:true}
plugin.httpclient.skipHttpClientCollect=${SW_HTTPCLIENT_SKIP_COLLECT:false}

2. 性能优化

3. 存储优化

# Elasticsearch 配置
storage:
  elasticsearch:
    namespace: ${SW_NAMESPACE:""}
    clusterNodes: ${SW_STORAGE_ES_CLUSTER_NODES:localhost:9200}
    indexShardsNumber: ${SW_STORAGE_ES_INDEX_SHARDS_NUMBER:2}
    indexReplicasNumber: ${SW_STORAGE_ES_INDEX_REPLICAS_NUMBER:0}
    # 索引保留天数
    day: ${SW_STORAGE_ES_DAY:7}

4. 多环境部署

# dev 环境
agent.namespace: dev
collector.backend_service: dev-oap:11800

# test 环境
agent.namespace: test
collector.backend_service: test-oap:11800

# prod 环境
agent.namespace: prod
collector.backend_service: prod-oap:11800

常见问题

1. Agent 不生效

问题:接入 Agent 后没有追踪数据

排查步骤

2. 数据不完整

问题:部分调用链路缺失

解决方案

3. 性能影响

问题:接入 Agent 后性能下降

解决方案

总结

SkyWalking 提供了强大的分布式链路追踪和性能监控能力,通过自动探针和手动埋点可以全面监控应用的运行状态。

合理配置 SkyWalking 可以帮助快速定位性能瓶颈和故障根源,提高系统的可观测性。

在生产环境中,建议做好环境隔离,优化 Agent 配置,并建立完善的告警机制。


分享这篇文章到:

上一篇文章
MySQL 性能优化实战指南
下一篇文章
Go 语言设计哲学