基于SkyWalking的分布式跟踪系统-微服务监控

7次阅读

共计 2416 个字符,预计需要花费 7 分钟才能阅读完成。

上一篇文章我们搭建了基于 SkyWalking 分布式跟踪环境,今天聊聊使用 SkyWalking 监控我们的微服务(DUBBO)

服务案例

假设你有个订单微服务,包含以下组件

  • MySQL 数据库分表分库(2 台)
  • 生产者(2 台)dubbo-provider
  • 消费者 dubbo-consumer

网络拓扑图如下

生产者的关键代码

@Service
public class OrderServiceImpl implements OrderService {

    @Autowired
    protected OrderMapper orderMapper;

    @Override
    public OrderVO getById(long id) {OrderVO orderVO = new OrderVO();
        Order order = orderMapper.selectById(id);
        BeanUtils.copyProperties(order,orderVO);
        return orderVO;
    }
}

消费者的关键代码

@RestController
public class OrderController {@Reference(retries = 0)
    private OrderService orderService;

    @GetMapping("/order/{id}")
    public OrderVO getOrder(@PathVariable long id){return orderService.getById(id);
    }

}

监控启动

  • 使用 javaagent 启动生产者

    -javaagent:E:\ 讯飞开发工具 \skywalking\agent\skywalking-agent.jar -Dskywalking.agent.service_name=dubbo-provider -Dskywalking.collector.backend_service=192.168.136.129:11800

    -javaagent:E:\ 讯飞开发工具 \skywalking\agent\skywalking-agent.jar -Dskywalking.agent.service_name=dubbo-provider2 -Dskywalking.collector.backend_service=192.168.136.129:11800

  • 启动消费者
    -javaagent:E:\ 讯飞开发工具 \skywalking\agent\skywalking-agent.jar -Dskywalking.agent.service_name=dubbo-consumer -Dskywalking.collector.backend_service=192.168.136.129:11800
  • 模拟请求

在浏览器访问http://localhost:9090/order/1184489161562816511,多次调用使负载生效;修改订单 id 参数,让调用覆盖不同的数据库

  • 效果查看

访问 skywalking 监控地址 http://192.168.136.129:8080/ 查看监控效果

仪表盘

网络拓扑图

错误日志

Trace 查询

日志集成

这部分我们先看下调用链的原理:

  • 请求到来生成一个全局 TraceID,通过 TraceID 可以串联起整个调用链,一个 TraceID 代表一次请求。
  • 除了 TraceID 外,还需要 SpanID 用于记录调用父子关系。每个服务会记录下 Parent id 和 Span id,通过他们可以组织一次完整调用链的父子关系。
  • 要查看某次完整的调用则只要根据 TraceID 查出所有调用记录,然后通过 Parent id 和 Span id 组织起整个调用父子关系。

正是由于 TraceID 如此重要,所以我们希望这个调用链的 TraceID 能输出在日志文件中,一旦观察到有异常调用,我们在日志分析平台直接搜索 TraceID 即可将关联的日志全部检索出来,大大提高我们解决问题的效率。

集成过程(log4j2)

  • 引入日志包 log4j2

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
        <exclusions>
            <exclusion>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-logging</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-log4j2</artifactId>
    </dependency>
  • 引入 SW 工具包

     <!--SW trace 跟踪 -->
    <dependency>
        <groupId>org.apache.skywalking</groupId>
        <artifactId>apm-toolkit-log4j-2.x</artifactId>
        <version>6.4.0</version>
    </dependency>
  • 修改日志显示格式 log4j2.xml

%d [%traceId] %-5p %c{1}:%L - %m%n

  • 启动应用,观察控制台

刚启动时候获取不到 TraceID, 所以 TID 显示为 N /A,启动完成后调用请求再次观察控制台,发现所有链路上的日志都打上了 TraceID。

很简单的几步就让你的微服务加上了调用链监控,你还不赶紧试试?

相关文章:
基于 SkyWalking 的分布式跟踪系统 – 环境搭建

SpringBoot2.1.9+dubbo2.7.3+Nacos1.1.4 构建你的微服务体系

欢迎关注我的个人公众号:JAVA 日知录

正文完
 0