目录
1. 修改config目录下的application.yml,使用mysql作为持久化存储的仓库
Skywalking主要功能特性
1、多种监控手段,可以通过语言探针和service mesh获得监控的数据;
2、支持多种语言自动探针,包括 Java,.NET Core 和 Node.JS;
3、轻量高效,无需大数据平台和大量的服务器资源;
4、模块化,UI、存储、集群管理都有多种机制可选;
5、支持告警;
6、优秀的可视化解决方案;
Skywalking整体架构
整个架构分成四部分:
1、上部分Agent :负责从应用中,收集链路信息,发送给 SkyWalking OAP 服务器;
2、下部分 SkyWalking OAP :负责接收Agent发送的Tracing数据信息,然后进行分析(Analysis Core),存储到外部存储器(Storage),最终提供查询(Query)功能;
3、右部分Storage:Tracing数据存储,目前支持ES、MySQL、Sharding Sphere、TiDB、H2多种存储器,目前采用较多的是ES,主要考虑是SkyWalking开发团队自己的生产环境采用ES为主;
4、左部分SkyWalking UI:负责提供控制台,查看链路等等;
SkyWalking支持三种探针:
● Agent – 基于ByteBuddy字节码增强技术实现,通过jvm的agent参数加载,并在程序启动时拦截指定的方法来收集数据。
● SDK – 程序中显式调用SkyWalking提供的SDK来收集数据,对应用有侵入。
● Service Mesh – 通过Service mesh的网络代理来收集数据。
后端(Backend)
接受探针发送过来的数据,进行度量分析,调用链分析和存储。后端主要分为两部分:
● OAP(Observability Analysis Platform)- 进行度量分析和调用链分析的后端平台,并支持将数据存储到各种数据库中,如:ElasticSearch,MySQL,InfluxDB等。
● OAL(Observability Analysis Language)- 用来进行度量分析的DSL,类似于SQL,用于查询度量分析结果和警报。
界面(UI)
● RocketBot UI – SkyWalking 7.0.0 的默认web UI
● CLI – 命令行界面
这三个模块的交互流程:
SkyWalking 环境搭建部署
- skywalking agent和业务系统绑定在一起,负责收集各种监控数据
- Skywalking oapservice是负责处理监控数据的,比如接受skywalking agent的监控数据,并存储在数据库中;接受skywalking webapp的前端请求,从数据库查询数据,并返回数据给前端。Skywalking oapservice通常以集群的形式存在。
- skywalking webapp,前端界面,用于展示数据。
- 用于存储监控数据的数据库,比如mysql、elasticsearch等。
下载 SkyWalking
下载:Downloads | Apache SkyWalking
目录结构
搭建SkyWalking OAP 服务
先使用默认的H2数据库存储,不用修改配置
config/application.yml
启动脚本bin/startup.bat
日志信息存储在logs目录
启动成功后会启动两个服务,一个是skywalking-oap-server,一个是skywalking-web-ui
skywalking-oap-server服务启动后会暴露11800 和 12800 两个端口,分别为收集监控数据的端口11800和接受前端请求的端口12800,修改端口可以修改config/applicaiton.yml
server.port:SkyWalking UI服务端口,默认是8080;
collector.ribbon.listOfServers:SkyWalking OAP服务地址数组,SkyWalking UI界面的数据是通过请求SkyWalking OAP服务来获得;
页面的右下角可以中英文切换,可以切换选择要展示的时间区间的跟踪数据。
SkyWalking快速开始
通过jar包方式接入
准备一个springboot程序,打成可执行jar包,写一个shell脚本,在启动项目的Shell脚本上,通过 -javaagent 参数进行配置SkyWalking Agent来跟踪微服务;
startup.sh脚本:
#!/bin/sh
# SkyWalking Agent配置
export SW_AGENT_NAME=springboot-skywalking-demo #Agent名字,一般使用`spring.application.name`
export SW_AGENT_COLLECTOR_BACKEND_SERVICES=127.0.0.1:11800 #配置 Collector 地址。
export SW_AGENT_SPAN_LIMIT=2000 #配置链路的最大Span数量,默认为 300。
export JAVA_AGENT=-javaagent:/usr/local/soft/apache-skywalking-apm-bin-es7/agent/skywalking-agent.jar
java $JAVA_AGENT -jar springboot-skywalking-demo-0.0.1-SNAPSHOT.jar #jar启动
启动日志
等同于
java -javaagent:/usr/local/soft/apache-skywalking-apm-bin-es7/agent/skywalking-agent.jar
-DSW_AGENT_COLLECTOR_BACKEND_SERVICES=127.0.0.1:11800
-DSW_AGENT_NAME=springboot-skywalking-demo -jar springboot-skywalking-demo-0.0.1-SNAPSHOT.jar
参数名对应agent/config/agent.config配置文件中的属性。
属性对应的源码:org.apache.skywalking.apm.agent.core.conf.Config.java
# The service name in UI
agent.service_name=${SW_AGENT_NAME:Your_ApplicationName}
# Backend service addresses.
collector.backend_service=${SW_AGENT_COLLECTOR_BACKEND_SERVICES:127.0.0.1:11800}
我们也可以使用skywalking.+配置文件中的配置名作为系统配置项来进行覆盖。 javaagent参数配置方式优先级更高
-javaagent:D:\apache\apache-skywalking-apm-es7-8.4.0\apache-skywalking-apm-bin-es7\agent\skywalking-agent.jar
-Dskywalking.agent.service_name=springboot-skywalking-demo
-Dskywalking.collector.backend_service=127.0.0.1:11800
测试: http://127.0.0.1:8000/user/list
在启动程序前加一个-javaagent 参数即可完成对程序的跟踪
在IDEA中使用Skywalking
# skywalking-agent.jar的本地磁盘的路径
-javaagent:D:\apache-skywalking\apache-skywalking-apm-es7-8.4.0\apache-skywalking-apm-bin-es7\agent\skywalking-agent.jar
# 在skywalking上显示的服务名
-DSW_AGENT_NAME=serviceb-skywalking-demo
# skywalking的collector服务的IP及端口
-DSW_AGENT_COLLECTOR_BACKEND_SERVICES=127.0.0.1:11800
Skywalking跨多个微服务跟踪
Skywalking跨多个微服务跟踪,只需要每个微服务启动时添加javaagent参数即可。
Skywalking告警通知
skywalking告警的核心由一组规则驱动,这些规则定义在config/alarm-settings.yml文件中,告警规则的定义分为三部分:
1、告警规则:它们定义了应该如何触发度量警报,应该考虑什么条件;
2、网络钩子(Webhook}:当警告触发时,哪些服务终端需要被通知;
3、gRPC钩子:远程gRPC方法的主机和端口,告警触发后调用;
为了方便,skywalking发行版中提供了默认的alarm-setting.yml文件,包括一些规则,每个规则有英文注释,可以根据注释得知每个规则的作用:
- 在最近10分钟的3分钟内服务平均响应时间超过1000ms
- 最近10分钟内,服务成功率在2分钟内低于80%
- 服务实例的响应时间在过去10分钟的2分钟内超过1000ms
- 数据库访问{name}的响应时间在过去10分钟的2分钟内超过1000ms
只要我们的服务请求符合alarm-setting.yml文件中的某一条规则就会触发告警。
比如service_resp_time_rule规则:
该规则表示服务{name}的响应时间在最近10分钟的3分钟内超过1000ms;
在config/alarm-settings.yml中配置回调接口,并重启skywalking服务
测试访问:http://localhost:8000/user/info/1,满足告警规则后,控制台输出告警信息
Skywalking持久化跟踪数据
基于mysql持久化:
1. 修改config目录下的application.yml,使用mysql作为持久化存储的仓库
h2改mysql
2改mysql连接配置
数据库,用户名,密码
storage:
#选择使用mysql 默认使用h2,不会持久化,重启skyWalking之前的数据会丢失
selector: ${SW_STORAGE:mysql}
#使用mysql作为持久化存储的仓库
mysql:
properties:
#数据库连接地址
jdbcUrl: ${SW_JDBC_URL:"jdbc:mysql://1ocalhost:3306/swtest?serverTimezone=UTC""}
#用户名
dataSource.user: ${SW_DATA_SOURCE_USER:root}
#密码
dataSource.password: ${SW_DATA_SOURCE_PASSWORD:root}
注意:需要添加mysql数据驱动包,因为在lib目录下是没有mysql数据驱动包的,所以修改完配置启动是会报错,启动失败的。
我的启动有时区错误: ${SW_JDBC_URL:"jdbc:mysql://localhost:3306/swtest?serverTimezone=UTC"}
3. 添加mysql数据驱动包到oap-libs目录下
4.启动Skywalking
查看swtest数据库,可以看到生成了很多表。差不多144张
测试:重启skywalking,验证跟踪数据会不会丢失