1. 概述

SkyWalking是一个国产的开源框架,用于分布式系统应用程序的性能监控,专门为微服务、云原生架构和基于容器(Docker、K8s、Mesos)架构而设计,包括了分布式追踪、性能指标分析、应用和服务依赖分析等
更多详情请参阅官网
主要特性如下:

  • 多种监控手段,开源通过语言探针和service mesh获得监控的数据
  • 支持多种语言自动探针,包括Java、.NET Core和Node JS
  • 轻量高效,无需大数据平台和大量的服务器资源
  • 模块化、UI、储存、集群管理都有多种机制可选
  • 支持告警
  • 优秀的可视化解决方案

其整体架构如下
架构图
上部分 Agent :负责从应用中,收集链路信息,发送给 SkyWalking OAP 服务器。目前支持 SkyWalking、Zikpin、Jaeger 等提供的 Tracing 数据信息。而我们目前采用的是,SkyWalking Agent 收集 SkyWalking Tracing 数据,传递给服务器
下部分 SkyWalking OAP :负责接收 Agent 发送的 Tracing 数据信息,然后进行分析(Analysis Core) ,存储到外部存储器( Storage ),最终提供查询( Query )功能
右部分 Storage :Tracing 数据存储。目前支持 ES、MySQL、Sharding Sphere、TiDB、H2 多种存储器。而我们目前采用的是 ES ,主要考虑是 SkyWalking 开发团队自己的生产环境采用 ES 为主
左部分 SkyWalking UI :负责提供控台,查看链路等等

2. SkyWalking环境搭建

单机部署示意图如下
架构

  • skywalking agent和业务系统绑定在一起,负责收集各种监控数据
  • skywalking oapservice负责处理监控数据,比如接受skywalking agent的监控数据,并存储在数据库中,接受skywalking webapp的前端请求,从数据库查询数据,并返回数据给前端,skywalking oapservice通常以集群形式存在
  • skywalking webapp负责前端界面,用于展示数据
  • 数据库用于存储监控数据

2.1. 下载skywalking安装包

官网地址下载安装包
下载skywalking apm
8.7版本后SkyWalking APM已不包括Agents,需要单独下载
下载agents

2.2. 启动SkyWalking

在/bin目录下,分别双击oapService.bat和webappService.bat,或者直接双击startup.bat,会看到如下窗口
启动
启动成功后,浏览器地址输入http://localhost:8080
首页

3. 微服务整合SkyWalking

分别新建3个springboot项目,skywalking-customer、skywalking-product和skywalking-order,其中order微服务可以使用openfeign调用customer和product,启动项目前需要如下配置

-javaagent:D:\software\skywalking-agent\skywalking-agent.jar
SW_AGENT_COLLECTOR_BACKEND_SERVICES=localhost:11800;SW_AGENT_NAME=alibaba-skywalking-order

idea配置skywalking
先访问order服务接口,刷新skywalking ui界面
服务
几个重要的概念
服务(Service) :表示对请求提供相同行为的一系列或一组工作负载。在使用 Agent 或 SDK 的时候,你可以定义服务的名字。如果不定义的话,SkyWalking 将会使用你在平台(例如说 Istio)上定义的名字。这里,我们可以看到 Spring Boot 应用的服务为 “alibaba-skywalking-customer”,就是我们在环境变量 SW_AGENT_NAME 中所定义的。
服务实例(Service Instance) :上述的一组工作负载中的每一个工作负载称为一个实例。就像 Kubernetes 中的 pods 一样, 服务实例未必就是操作系统上的一个进程。但当你在使用 Agent 的时候, 一个服务实例实际就是操作系统上的一个真实进程。这里,我们可以看到 Spring Boot 应用的服务为 {agent_name}-pid:{pid}@{hostname},由 Agent 自动生成。
端点(Endpoint) :对于特定服务所接收的请求路径, 如 HTTP 的 URI 路径和 gRPC 服务的类名 + 方法签名。这里,我们可以看到 Spring Boot 应用的一个端点,为 API 接口 GET:/product/getProductById/{id}

点击Topology菜单,进入查看拓扑图界面
拓扑图
点击Trace菜单,进入查看链路数据界面
链路数据

4. Shell脚本方式配置skywalking

需要提前将agent安装包上传到服务器目录,配置Java启动脚本

export SW_AGENT_NAME=alibaba-skywalking-customer #配置Agent名称
export SW_AGENT_COLLECTOR_BACKEND_SERVICES=127.0.0.1:11800 #配置Collector名称
export SW_AGENT_SPAN_LIMIT=2000 #配置链路最大span数量,默认300
export JAVA_AGENT=-javaagent:/opt/software/skywalking-agent/skywalking-agent.jar #配置SkyWalking Agent jar地址

java $JAVA_AGENT -jar alibaba-skywalking-customer.jar

5. SkyWalking持久化监控数据

skywalking默认使用H2数据库进行存储,每次重启服务后,原有的数据就会丢失,可以改为基于mysql或elasticsearch实现持久化,下面以mysql为例
修改/conf目录下application.yml文件
修改数据库
另外,修改mysql数据库连接信息
修改连接信息
在数据库中新建swtest库,并将mysql jar文件拷贝到skywalking-apm/oap-lib目录下,重启skywalking即可

6. SkyWalking集成日志框架

6.1. 引入核心依赖

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

6.2. logback-spring.xml文件

添加日志配置文件,并配置%tid占位符

<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
    <include resource="org/springframework/boot/logging/logback/defaults.xml"/>

    <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>-%clr(%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} [%tid] %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}</Pattern>
            </layout>
        </encoder>
    </appender>
    <root level="INFO">
        <appender-ref ref="console"/>
    </root>
</configuration>

重新启动项目,访问接口,可以看到控制台输入了tid日志信息
日志

6.3. 上报日志到skywalking

在logback-spring.xml文件中配置grpc-log项,其完整配置如下:

<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
    <include resource="org/springframework/boot/logging/logback/defaults.xml"/>

    <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>-%clr(%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} [%tid] %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}</Pattern>
            </layout>
        </encoder>
    </appender>

    <appender name="grpc-log" class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.log.GRPCLogClientAppender">
        <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
            <layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.mdc.TraceIdMDCPatternLogbackLayout">
                <Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%X{tid}] [%thread] %-5level %logger{36} -%msg%n</Pattern>
            </layout>
        </encoder>
    </appender>

    <root level="INFO">
        <appender-ref ref="console"/>
        <appender-ref ref="grpc-log"/>
    </root>
</configuration>

重新启动服务,多次调用接口,点击链路选项可以查看到调用的请求
请求链路
选择其中一次请求,再点击右下角区域,进入详情界面
链路详情界面
点击相关日志,可以查看到具体日志信息
日志信息

6. 告警功能

skywalking提高异常告警功能,其核心由一组规则驱动,规则定义再config/alarm-settings.yml文件中,主要由告警规则和网络钩子组成
告警规则

6.1. 规则配置项

Rule name:规则名称,告警信息中显示的唯一名称,必须以_rule结尾,前缀可自定义
Metrics name:度量名称,取值为oal脚本中度量名,支持long、double和int类型
Include names:该规则作用于哪些实体名称,比如服务名称
Exclude names:该规则不作用于哪些实体名称,比如服务名
Threshold:阈值
OP:操作符,支持<、>、=
Period:多久告警规则需要被核实一次
Count:在一个Period窗口中,如果values超过Threshold值(按op),达到Count值,需要发送警报
Silence period:在时间N中触发报警后,在TN -> TN + period这个阶段不告警,默认与period一样,即相同的告警(在同一个Metrics name拥有相同的id)在同一个Period内只会触发一次
message:告警消息
更多信息可以查阅官网

6.2. Webhook(网络钩子)

一种Web层面的回调机制,由一些事件触发,与代码中的事件回调类似,当事件发生时,回调的是服务接口。SkyWalking告警消息会通过HTTP请求进行发送,请求方法为POST,Content-Type为application/json,其JSON数据基于List<org.apache.skywalking.oap.server.core.alarm.AlarmMessage>进行序列化,JSON数据示例如下:

[{
  "scopeId": 1, 
  "scope": "SERVICE",
  "name": "serviceA", 
  "id0": "12",  
  "id1": "",  
    "ruleName": "service_resp_time_rule",
  "alarmMessage": "alarmMessage xxxx",
  "startTime": 1560524171000,
    "tags": [{
        "key": "level",
        "value": "WARNING"
     }]
}, {
  "scopeId": 1,
  "scope": "SERVICE",
  "name": "serviceB",
  "id0": "23",
  "id1": "",
    "ruleName": "service_resp_time_rule",
  "alarmMessage": "alarmMessage yyy",
  "startTime": 1560524171000,
    "tags": [{
        "key": "level",
        "value": "CRITICAL"
    }]
}]

字段说明
scopeId、scope:所有可用的Scope,详见org.apache.skywalking.oap.server.core.source.DefaultScopeDefine
name:目标Scope实体名称
id0:Scope实体ID
id1:保留字段
ruleName:告警规则名称
alarmMessage:告警消息内容
startTime:告警时间,格式为时间戳

6.3. 微服务集成告警

需要先写一个消息回调接收类

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class SwAlarmDto {

    private Long scopeId;
    private String scope;
    private String name;
    private String id0;
    private String id1;
    private String ruleName;
    private String alarmMessage;
    private Long startTime;
    private transient Integer period;
    private transient Boolean onlyAsCondition;

    @Data
    public static class Tag {
        private String key;
        private String value;
    }
}

再写一个controller接收回调请求,处理具体事项

@Slf4j
@RestController
@RequestMapping("/alarm")
public class AwAlarmController {

    @PostMapping("/receive")
    public void receive(@RequestBody List<SwAlarmDto> alarmDtos) {
        log.info("skywalking alarm message {}", alarmDtos);
        //todo
    }
}

在方法中可用自行集成邮件、企微等第三方组件
alarm-settings.xml文件中配置回调地址

webhooks:
  - http://localhost:8603/alarm/receive

6.4. 验证

再订单接口设置sleep时长1000毫秒

Thread.sleep(4000);

频繁多次请求接口,在日志中会看到告警日志信息
告警日志
在skywalking控制台告警菜单中也能看到告警信息
告警日志

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐