skywalking使用教程

skywalking使用教程

一、介绍 skywalking

1.1 概念

skywalking是分布式系统的应用程序性能监视工具,专为微服务、云原生架构和基于容器(Docker、K8s、Mesos)架构而设计。SkyWalking

是观察性分析平台和应用性能管理系统,提供分布式追踪、服务网格遥测分析、度量聚合和可视化一体化解决方案。
官网:http://skywalking.apache.org/
下载:http://skywalking.apache.org/downloads/
Github:https://github.com/apache/skywalking
文档:https://skywalking.apache.org/docs/main/v10.0.1/readme/
中文文档: https://skyapm.github.io/document-cn-translation-of-skywalking/

1.2 Skywalking整体架构

上部分Agent :负责从应用中,收集链路信息,发送给 SkyWalking OAP 服务器; agent要与被监控的服务(如:springboot) 放在一起
下部分 SkyWalking OAP:负责接收Agent发送的Tracing数据信息,然后进行分析(Analysis Core),存储到外部存储器(Storage),最终提供查询(Query)功能;
右部分Storage:Tracing数据存储,目前支持ES、MySQL、Sharding Sphere、TiDB、H2多种存储器,目前采用较多的是ES,主要考虑是SkyWalking开发团队自己的生产环境采用ES为主;
左部分SkyWalking UI:负责提供控制台,查看链路等等;


版本

skywalking-oap-server:10.0.1

skywalking-ui:10.0.1

apache-skywalking-java-agent 9.4.0

数据库这里使用mysql8

二、安装

这里skywalking-oap-server与 skywalking-ui采用docker安装,apache-skywalking-java-agent解压到与springcloud本地

2.1 创建目录

mkdir -p /mydata/skywalking

2.2 拉取镜像

docker pull apache/skywalking-oap-server:10.0.1

docker pull apache/skywalking-ui:10.0.1

2.3 创建临时容器
powershell 复制代码
docker run \
--name skywalking-oap \
--restart always \
-p 11800:11800 \
-p 12800:12800 -d \
apache/skywalking-oap-server:10.0.1
2.4 复制临时容器的配置文件到宿主机

docker cp skywalking-oap:/skywalking/config /mydata/skywalking

docker cp skywalking-oap:/skywalking/oap-libs /mydata/skywalking

2.5 准备mysql驱动

因为我拿mysql作存储,如果用es就不用。 把mysql-connector-java-8.0.28.jar 拖进/mydata/skywalking/oap-libs/

mysql-connector-java-8.0.28.jar可以直接在aliyun的maven仓库下载

xml 复制代码
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.20</version>
</dependency>
2.6 修改 /mydata/skywalking/config/application.yml

这里提前准备好mysql8,并创建一个库skywalking

yaml 复制代码
storage:
  mysql:
    properties:
      jdbcUrl: ${SW_JDBC_URL:"jdbc:mysql://192.168.174.192:3307/skywalking?rewriteBatchedStatements=true&allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&serverTimezone=Asia/Shanghai"}
      dataSource.user: ${SW_DATA_SOURCE_USER:root}
      dataSource.password: ${SW_DATA_SOURCE_PASSWORD:123456}
2.7 创建容器

先删除之前创建的临时容器docker rm -f 容器id,再创建如下容器:

yaml 复制代码
docker run \
--name skywalking-oap \
--restart always \
-p 11800:11800 \
-p 12800:12800 -d \
--privileged=true \
-e TZ=Asia/Shanghai \
-v /etc/localtime:/etc/localtime:ro \
-v /mydata/skywalking/oap-libs:/skywalking/oap-libs \
-v /mydata/skywalking/config/application.yml:/skywalking/config/application.yml \
-v /mydata/skywalking/config/alarm-settings.yml:/skywalking/config/alarm-settings.yml \
apache/skywalking-oap-server:10.0.1

注意:这里我挂在了application.yml和alarm-settings.yml到宿主机

2.8 创建UI界面
yaml 复制代码
docker run \
--name skywalking-ui \
--restart always \
-p 10086:8080 -d \
--privileged=true \
--link skywalking-oap:skywalking-oap \
-e TZ=Asia/Shanghai \
-e SW_OAP_ADDRESS=http://192.168.174.192:12800 \
-v /etc/localtime:/etc/localtime:ro \
apache/skywalking-ui:10.0.1

注意:这里我修改了ui的端口映射,10086,skywalking-oap是上一步的skywalking服务端的容器名字,192.168.174.192:12800是服务端的ip及端口


访问:192.168.174.192:10086

2.9 准备agent

解压apache-skywalking-java-agent-9.4.0到本地,这里服务在本地IDEA,如果服务在linux服务器上,那么agent也需要放在linux。

修改:agent\config\agent.conf

powershell 复制代码
agent.service_name=${SW_AGENT_NAME:agent-mfcx}
collector.backend_service=${SW_AGENT_COLLECTOR_BACKEND_SERVICES:192.168.174.192:11800}

当然:也可以使用skywalking.+配置文件中的配置名作为系统配置项来进行覆盖。 javaagent参数配置方式优先级更高


准备jar包,因为我们监控中包含agteway,所以要把agent\optional-plugins中的两个jar包,粘贴一份到agent\plugins
spring-webflux-6.x-webclient-plugin-9.4.0.jar
apm-spring-cloud-gateway-4.x-plugin-9.4.0.jar

版本与自己的spring-cloud-starter-gateway一致

三、微服务准备

3.1 导包
xml 复制代码
 <dependency>
                <groupId>org.apache.skywalking</groupId>
                <artifactId>apm-toolkit-trace</artifactId>
                <version>${skywalking.version}</version>
            </dependency>
      
            <dependency>
                <groupId>org.apache.skywalking</groupId>
                <artifactId>apm-toolkit-logback-1.x</artifactId>
                <version>${skywalking.version}</version>
            </dependency>

这里skywalking.version对应的版本是skywalking的agent的版本,我用的9.4.0,第一个是链路追踪的jar,第二个日志集成的jar

3.2 加注解

加在业务层,即@Service层,不要加在@Controller,没有用的

java 复制代码
 @Trace
 @Tags({@Tag(key = "param", value = "arg[0]"), @Tag(key = "queryUserInfo", value = "returnedObj")})

如果一个业务方法想在ui界面的追踪链路上显示出来,只需要在业务方法上加上@Trace注解即可。

还可以为追踪链路增加其他额外的信息,比如记录参数和返回信息。实现方式:在方法上增加@Tag或者@Tags

@Tag(key = "param", value = "arg[0]") 表示输入参数的第一个参数

@Tag 注解中 key = 方法名 ; value = returnedObj 返回值

业务代码也可以采用如下方法打印traceId:

java 复制代码
String traceId = TraceContext.traceId();
3.3 添加微服务启动参数

我在本地就在IDEA添加:

powershell 复制代码
-javaagent:D:\soft\skywalking\agent\skywalking-agent.jar
-DSW_AGENT_NAME=storage
-DSW_AGENT_COLLECTOR_BACKEND_SERVICES=192.168.174.192:11800

注意:

-javaagent 是自己的agent所在位置

DSW_AGENT_NAME是自己的微服务名字,可以自己取名

DSW_AGENT_COLLECTOR_BACKEND_SERVICES是skywalking的服务端地址

启动微服务后可以查看ui界面

四、日志框架集成

4.1 引入包
xml 复制代码
 <dependency>
                <groupId>org.apache.skywalking</groupId>
                <artifactId>apm-toolkit-logback-1.x</artifactId>
            </dependency>

版本与agent的版本一致

4.2 编写 logback-spring.xml
xml 复制代码
> logback-spring.xml位于项目resource目录下,
<?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>
4.3 在agent下的config/agent.config文件添加
yaml 复制代码
plugin.toolkit.log.grpc.reporter.server_host=${SW_GRPC_LOG_SERVER_HOST:192.168.174.192}
plugin.toolkit.log.grpc.reporter.server_port=${SW_GRPC_LOG_SERVER_PORT:11800}
plugin.toolkit.log.grpc.reporter.max_message_size=${SW_GRPC_LOG_MAX_MESSAGE_SIZE:10485760}
plugin.toolkit.log.grpc.reporter.upstream_timeout=${SW_GRPC_LOG_GRPC_UPSTREAM_TIMEOUT:30}

发开UI界面查看日志:

五、告警

修改/mydata/skywalking/config/alarm-settings.yml,因为创建容器的时候我已经把此文件挂在到宿主机了

配置规则:

yaml 复制代码
rules:
  # Rule unique name, must be ended with `_rule`.
  service_resp_time_rule:
    # A MQE expression, the result type must be `SINGLE_VALUE` and the root operation of the expression must be a Compare Operation
    # which provides `1`(true) or `0`(false) result. When the result is `1`(true), the alarm will be triggered.
    expression: sum(service_resp_time > 1000) >= 1
    period: 1
    silence-period: 1
    message: 开始报警........................................................................Response time of service {name} is more than 1000ms in 3 minutes of last 10 minutes.

expression: 告警条件 period:多久告警规则需要被检查一下。这是一个时间窗口,与后端部署环境时间相匹配。
silence-period:在时间N中触发报警后,在N -> N + silence-period这段时间内不告警。
message:该规则触发时,发送的通知消息。
sum(service_resp_time > 1000) >= 1:表示,服务响应时间大于1000毫秒的总次数大于 1次

yaml 复制代码
hooks:
  webhook:
    default:
      is-default: true
      urls:
        - http://192.168.20.212:8080/admin/alarm/sendAlarm

网络钩子,当满足上述规则条件时,则会调用这里的url,这里的url对应业务代码的告警,例如钉钉消息、邮件等

调用是采用Post,会带参数:List<AlarmMessage> 格式

AlarmMessage的jar我没找到,不如在代码中使用Object接收

powershell 复制代码
[{
scopeId. 所有可用的Scope,参考:org.apache.skywalking.oap.server.core.source.DefaultScopeDefine;
name. 目标 Scope 的实体名称;
id0. Scope 实体的 ID;
id1. 未使用;
ruleName. 在 alarm-settings.yml 中配置的规则名;
alarmMessage. 报警消息内容;
startTime. 告警时间, 位于当前时间与 UTC 1970/1/1 之间;
}]

告警接口

java 复制代码
 @PostMapping("/sendAlarm")
    @Operation(summary = "发送告警邮件")
    public void sendAlarm(@RequestBody Object obj) {
        alarmService.sendAlarm(obj);
    }
相关推荐
dgvri5 天前
Skywalking介绍,Skywalking 9.4 安装,SpringBoot集成Skywalking
spring boot·后端·skywalking
rOuN STAT6 天前
Skywalking介绍,Skywalking 9.4 安装,SpringBoot集成Skywalking
spring boot·后端·skywalking
危笑ioi6 天前
helm部署skywalking链路追踪 java
java·开发语言·skywalking
MmeD UCIZ7 天前
Skywalking介绍,Skywalking 9.4 安装,SpringBoot集成Skywalking
spring boot·后端·skywalking
专注API从业者8 天前
淘宝 API 调用链路追踪实战:基于 SkyWalking/Pinpoint 的全链路监控搭建
大数据·开发语言·数据库·skywalking
MMMMMMMMMMemory8 天前
记录skywalking预警如何处理401问题
skywalking
SoulRoar.9 天前
Armbian离线安装ES+SkyWalking并注册系统服务
大数据·elasticsearch·skywalking
@土豆9 天前
Java JVM参数环境变量详解及SkyWalking Agent集成技术文档
java·jvm·skywalking
NCIN EXPE9 天前
SpringBoot教程(三十二) SpringBoot集成Skywalking链路跟踪
spring boot·后端·skywalking
enjoy编程10 天前
SkyWalking 分布式追踪、APM学习-I
skywalking