目录
1. 介绍
Skywalking 是一个APM系统,即应用性能监控系统,为微服务架构和云原生架构系统设计。它通过探针自动收集所需的指标,并进行分布式追踪。通过这些调用链路以及指标,Skywalking APM会感知应用间关系和服务间关系,并进行相应的指标统计。
架构
图中组件看起来虽然多,但SW逻辑上分为四部分: Probes, Platform backend, Storage and UI
Probes(探针):基于不同的来源可能是不一样的, 但作用都是收集数据, 将数据格式化为 SkyWalking 适用的格式。
Platform backend(平台后端):支持数据聚合, 数据分析以及驱动数据流从探针到用户界面的流程。分析包括 Skywalking 原生追踪和性能指标以及第三方来源,包括 Istio 及 Envoy telemetry , Zipkin 追踪格式化等。
Storage (存储):通过开放的插件话的接口存放 SkyWalking 数据. 你可以选择一个既有的存储系统, 如 ElasticSearch, H2 或 MySQL 集群(Sharding-Sphere 管理),也可以选择自己实现一个存储系统.
UI(界面):一个基于接口高度定制化的Web系统,用户可以可视化查看和管理 SkyWalking 数据。
文档链接
官网:https://skywalking.apache.org/ 可以查看各个版本文档(英文)及提供下载等
中文文档:https://github.com/SkyAPM/document-cn-translation-of-skywalking
2. 准备
本文中的Nacos是作为注册中心使用,SW支持的注册中心还包括:ZooKeeper,Kubernetes,Consul,Consul ;Nacos同时也可以作为配置中心;MySql是作为数据存储容器,SW支持的存储还包括:H2,ElasticSearch 6, 7,TiDB,InfluxDB
Nacos+Skywalking+Mysql
软件名称 |
版本 |
Nacos |
2.0.3 |
Skywalking |
8.7.0 |
Mysql |
5.7 |
下载Skywalking 这里我们选择带有Mysql存储引擎的SkyWalking版本,大家各自选取对应的版本即可 Downloads | Apache SkyWalking
3. 目录结构
|
4. 开始配置
下载解压后---注意:标注了中文注释的地方代表需要修改
编辑application.yml
进入SW的config目录,编辑application.yml 配置文件太长 就不全列出 只列出需要修改的地方
|
注1:SW本身不提供Mysql的驱动,如果想使用Mysql作为存储,需要把Mysql的驱动jar复制到 sw的 'oap-libs '目录下
编辑agent.conf: (在启动agent上有详细说明,这一步可以先略过)
SW/agent/config/agent.conf:
|
编辑webapp.yml:
SW/webapp/webapp.yml
|
5. 启动
调整JVM参数(可选)
编辑如下启动脚本:bin/oapServiceInit.sh bin/oapServiceNoInit.sh bin/oapService.sh
设置JAVA_OPTS=" -Xms2048M -Xmx4096M"
注释:bin/webappService.sh的JAVA_OPTS可自行调整
5.1. 启动SW
直接sh SW/bin/startup.sh,启动SW会同时将OAP和UI启动,可以分别查看日志skywalking-oap-server.log和webapp.log观察是否启动成功
启动命令介绍:
/bin/oapService.sh:如果未进行初始化会进行初始化操作,然后开启监听提供服务。
/bin/oapServiceInit.sh:进行初始化操作,然后会退出。
/bin/oapServiceNoInit.sh:不进行初始化启动,会等待es索引、或者mysql、TIDB表存在,然后开始监听并提供服务。意味着oap服务器等待其他oap服务器进行初始化。
/bin/webappService.sh:启动UI服务。
/bin/startup.sh:同时启动oapService.sh和webappService.sh。
logs/skywalking-oap-server.log 日志代表启动成功
可以使用jps命令查看进程,可以看到这两个java程序在运行状态。
然后可以打开浏览器进行查看192.168.150.132/192.168.150.133:8899 sw ui 界面
5.2. SW动态配置
官方文档:Dynamic Configuration | Apache SkyWalking
SkyWalking支持对以下内容进行动态配置:
查看日志/utxt/soft/zpy/skywalking/apache-skywalking-apm-bin-es7/logs/skywalking-oap-server.log
Config Key |
Value Description |
Value Format Example |
agent-analyzer.default.slowDBAccessThreshold |
重写applciation.yml 中receiver-trace/default/slowDBAccessThreshold慢查询语句的阈值 |
default:200,mongodb:50 |
agent-analyzer.default.uninstrumentedGateways |
覆盖gateways.yml. |
same as gateways.yml |
alarm.default.alarm-settings |
警报设置将覆盖alarm-settings.yml。 |
same as alarm-settings.yml |
core.default.apdexThreshold |
覆盖service-apdex-threshold.yml中apdexThreshold |
Same as service-apdex-threshold.yml |
core.default.log4j-xml |
log4j xml 配置将覆盖log4j2.xml. |
same as log4j2.xml |
core.default.endpoint-name-grouping |
覆盖endpoint-name-grouping.yml |
same as endpoint-name-grouping.yml |
agent-analyzer.default.sampleRate |
重写applciation.yml 中receiver-trace/default/sampleRate 慢查询语句的阈值 |
10000 |
agent-analyzer.default.slowTraceSegmentThreshold |
设置这个关于延迟的阈值会使慢速跟踪段采样,如果它们花费更多的时间,即使采样机制被激活。默认值为-1,这意味着不会对慢跟踪进行采样。单位,毫秒。重写receiver-trace/default/slowTraceSegmentThreshold的application.yml。 |
-1 |
configuration-discovery.default.agentConfigurations |
配置发现设置 |
Lookat configuration-discovery.md |
默认动态配置是关闭的,在/config/application.yml中configuration处配置。已有的实现有Apollo、Nacos、Zookeeper、Consul。其中nacos配置如下,此处的config key为nacos中的dataId,namespace即命名空间对应的id,覆盖yml配置则属性文件后缀名选yaml,对于receiver-trace.default.slowDBAccessThreshold,文件后缀选text:
前面已经配置过了
访问nacos 可以看到skywalking服务已经启动(我是启动了两个(132,133),所以有两个实例)
测试动态配置:
新建一个data-id叫做agent-analyzer.default.uninstrumentedGateways,group信息是skywalking(skywalking 与前面aplication.yml中配置中心的nacos配置的group保持一致),配置格式yaml
配置内容:
|
点击发布,发布成功后,注意两台台机器skywalking-oap-server.log的日志信息,控制台打印了配置的变化,这里就达到了不重启Skywalking而动态刷新配置的效果。
5.3. 启动agent
将apache-skywalking-apm-bin-es7/agent文件夹拷贝到微服务的每个服务发布容器中,位置可以根据情况调整,建议放在jar包同级目录。 (也可以不复制一份,直接启动程序的时候指明服务名,服务地址)
修改/agent/config/agent.conf
一般配置下面两项即可:(具体配置可看上文agent.conf 配置)
agent.service_name:客户端服务名,在apm系统中显示的服务名称;collector.backend_service:SW上传的服务地址。
1、Linux Tomcat 7, Tomcat 8, Tomcat 9 部署
修改tomcat/bin/catalina.sh的第一行。
CATALINA_OPTS="$CATALINA_OPTS -javaagent:/swpath/agent/skywalking-agent.jar"; export CATALINA_OPTS
2、JAR包使用命令行启动应用时,添加-javaagent参数
java -javaagent:/sw的绝对路径/agent/skywalking-agent.jar -jar XXXX.jar
Linux : .sh 启动文件
可以不复制agent 直接用某个agent中的jar 然后在启动文件中指明服务名称和服务地址
我启动了两个一样的程序,132中的agent.service_name=witsky-mfp-mms,133中agent.service_name=witsky-mfp-mms2
在nacos中可以看到程序启动后成功注册在nacos上
在sw监控界面中可以看到两个服务名
Idea配置
通过 IDEA 的「Run/Debug Configurations」配置使用 SkyWalking Agent。如下图所示:
如果说控制台打印如下日志,说明 SkyWalking Agent 基本加载成功:
6. sw界面监控说明
6.1. 简单测试
在程序中新建一个测试controller(我程序是springcloud+nacos) 程序部署在服务132/133服务器上
请求接口/mms/test/test,查看sw仪表盘
请求test2接口,可以看到对该url追踪链路
6.2. 忽略部分 URL 的追踪
复制插件
trace-ignore-plugin 插件,在 optional-plugins 目录下,是可选插件,所以我们需要复制到 plugins 目录下。命令行操作如下:
cp optional-plugins/apm-trace-ignore-plugin-6.6.0.jar plugins/
配置文件
trace-ignore-plugin 插件,读取 apm-trace-ignore-plugin.config 配置文件,默认情况下不存在,所以我们需要进行创建并配置。
注:trace.ignore_path 配置项,设置忽略的 URL 路径,基于 Ant 风格路径表达式。这里,我们配置了读取环境变量 SW_AGENT_TRACE_IGNORE_PATH ,这样方便我们自定义。
重启程序
可以看到程序所在的agent已经加载了我们要忽略的配置文件
请求程序 /mms/test/test2接口后 查看sw仪表盘没有该链路的信息
请求/mms/test/test(没有配置忽略)
6.3. 对mysql的操作链路分析
(我的程序有定时执行mysql修改的操作)
1.点击「Database Dashboard」选项,再点击「Database」选项,可以以数据库为维度的监控数据。如下图所示:
2.点击「拓扑图」菜单,进入查看拓扑图的界面,可以看到 MySQL 小方块。如下图所示:
3.点击「追踪」菜单,进入查看链路数据的界面。如下图所示:
这里,我们暂时无法看到 SQL 的数据参数,可以通过修改 config/agent.config 配置文件,将 plugin.mysql.trace_sql_parameters 配置项,设置为 true 。
6.4. 对redis的操作链路分析
(我只有一个程序有定时操作redis)
1.点击「拓扑图」菜单,进入查看拓扑图的界面,可以看到 Redis 小方块。如下图所示:
2.点击「追踪」菜单,进入查看链路数据的界面。如下图所示:
3.点击 Redis 操作的链路数据,可以看到 Redis 具体操作。如下图所示:
6.5. 更多链路追踪
可查看博客Spring Boot 链路追踪 SkyWalking 入门_weixin_42073629的博客-CSDN博客_springboot链路追踪
6.6. ui界面介绍
实例信息
端点
拓扑图
追踪
性能剖析
- 服务:需要分析的服务;
- 端点:链路监控中端点的名称,可以在链路追踪中查看端点名称;
- 监控时间:采集数据的开始时间;
- 监控持续时间:监控采集多长时间;
- 起始监控时间:多少秒后进行采集;
- 监控间隔:多少秒采集一次;
- 最大采集数:最大采集多少样本;
7. 日志框架示例
在使用 SkyWalking 排查问题的时候,我们可能希望能够跟链路的日志进行关联,那么我们可以将链路编号( SkyWalking TraceId )记录到日志中,从而进行关联。
关于trace相关概念看中文翻译https://wu-sheng.gitbooks.io/opentracing-io/content/或者:https://github.com/opentracing-contrib/opentracing-specification-zh/blob/master/specification.md
traceId格式:{service_instance_id}.{thread_id}.({时间戳} * 10000 + 线程自增序列([0, 9999]))
SkyWalking 提供了多种日志框架的支持,通过不同的插件:
apm-toolkit-log4j-1.x-activation:支持 Log4j1 日志框架。
apm-toolkit-log4j-2.x-activation:支持 Log4j2 日志框架
apm-toolkit-logback-1.x-activation:支持 Logback 日志框架
日志为log4j2如果要在监控的应用中输出traceId,首先引入如下依赖:
|
然后修改log4j2.xml的日志输出格式增加[%traceId]即可。更多信息查看官方文档
下面讲述使用logback:
修改logback.xml的日志输出格式,增加%tid即可。更多信息查看官方文档https://github.com/apache/skywalking/blob/v6.5.0/docs/en/setup/service-agent/java-agent/Application-toolkit-logback-1.x.md
在 pom.xml 文件中,引入相关依赖。
|
在 logback-spring.xml 中,添加 Logback 配置,如下:
|
主要修改地方
注:
通过%tid∶配置SkyWalking Traceld占位符
通过TraceldPatternLogbackLayout:实现对%tid替换成SkyWalking Traceld
启动程序 因为此时没有 SkyWalking TraceId,所以 %tid 占位符被替换成了 TID:N/A。
然后请求接口 test2 后查看日志。 %tid 占位符被替换成了SkyWalking TraceId bf7fa613eef24ddd8f0550e578af21d0.68.16377562756730001。
用该 SkyWalking TraceId 在 SkyWalking UI 中,进行检索。如下图所示:
手动追踪traceId,首先引入如下依赖:
|
然后在想要追踪的方法上增加@Trace注解,该方法内部即可通过TraceContext.traceId()方法获取traceId,亦可通过ActiveSpan.tag("my_tag","my_value");增加标签标记。
添加了 SkyWalking @Trace 注解,实现 SkyWalking 指定方法的追踪,会创建一个 SkyWalking LocalSpan。同时,可以通过 operationName 属性,设置操作名。
通过 ActiveSpan#tag(String key, String value) 方法,设置该 LocalSpan 的标签。ActiveSpan 还有其它方法,如下:
ActiveSpan.error() 方法:将当前 Span 标记为出错状态.
ActiveSpan.error(String errorMsg) 方法:将当前 Span 标记为出错状态, 并带上错误信息.
ActiveSpan.error(Throwable throwable) 方法:将当前 Span 标记为出错状态, 并带上 Throwable。
ActiveSpan.debug(String debugMsg) 方法:在当前 Span 添加一个 debug 级别的日志信息.
ActiveSpan.info(String infoMsg) 方法:在当前 Span 添加一个 info 级别的日志信息.
另外,我们可以使用 TraceContext#traceId() 方法,获得当前的 SkyWalking TraceId 链路追踪编号。
启动程序请求/traceId接口
8. 告警配置
属性 |
含义 |
metrics-name |
指定的规则(与规则名不同,这里是对应的告警中的规则map,具体可查看https://github.com/apache/skywalking/blob/master/docs/en/setup/backend/backend-alarm.md#list-of-all-potential-metrics-name,其中一些常见的,endpoint_percent_rule——端点相应半分比告警,service_percent_rule——服务相应百分比告警) |
threshold |
阈值,与metrics-name和下面的比较符号相匹配 |
op |
比较操作符,可以设定>,<,=,即如metrics-name: endpoint_percent, threshold: 75,op: < ,表示如果相应时长小于平均75%则发送告警 |
period |
多久检查一次当前的指标数据是否符合告警规则 |
counts |
达到多少次告警后,发送告警消息 |
silence-period |
在多久之内,忽略相同的告警消息 |
message |
告警消息内容 |
include-names |
使用本规则告警的服务列表 |
我们通过nacos动态配置告警配置项测试
在nacos 中配置告警规则
|
注:webhook接口url的定义(地址自定义),除了规则制定之外,还有达到告警规则后,需要skywalking调用的webhook接口,如上所示的配置,一定要注意url的缩进,之前缩进两个空格,一直没生效。
告警webhook接口对接
编写上述webhook对接的接口,当前版本webhook接口调用的方式是post+requestbody,而body中的内容如下:
在程序中写一个告警接收接口部署启动
在nacos中点击发布后可以看到sw 中的日志 表示已经动态加载
然后测试触发告警信息 ,请求132程序的test2接口,可以看到这个请求 平均响应时间超过了1ms ,点sw击告警可以看到输出的告警信息,查看程序日志可以看到接收到告警
9. Sw+Elasticsearch集群配置
下载es Download Elasticsearch | Elastic
配置配置文件:
编辑/config/elasticsearch.yml 文件
|
因为es7 要使用jdk11 服务器上是java8 故改用es内置jdk
修改 bin/elasticsearch-env添加
ES_JAVA_HOME="/utxt/soft/zpy/skywalking/swes/elasticsearch-7.15.2/jdk"
修改es jvm 堆大小
Elasticsearch 和 Lucene 对内存使用情况:
Elasticsearch 限制的内存大小是 JAVA 堆空间的大小,不包括Lucene 缓存倒排索引数据空间。
一般情况下并不需要更改 JVM 的配置项。
最可能更改的 JVM 配置是堆大小(heap size)
可以使用 jvm.options 配置文件或 ES_JAVA_OPTS 环境变量更改 JVM 配置
首选通过 config/jvm.options配置项 更改配置
Elasticsearch 通过 jvm.options 中的 Xms 和 Xmx 设置堆的大小
应该讲 Xms 和 Xmx 设为相同的值 (最好不要超过32g)
确定堆内存大小的值
# 公式
heapSize = math.floor(RAM/2) # 物理内存的 50% 下取整
if heapSize > threshold: # 如果大于阈值,则设为等于(或略小于阈值大小)
heapSize = threshold
# 例一机器状况: 物理内存 128G,CompressedOops 阈值为 31 G,zero based Compressed Oops 阈值为 30 G 配置建议: 启动两个实例,堆内存大小设为 30G
# 例二(最佳实践)机器状况: 物理内存 64G,CompressedOops 阈值为 31 G,zero based Compressed Oops 阈值为 30 G 配置建议: 启动一个实例,堆内存大小设为 30G
# 例三机器状况: 物理内存 32G,CompressedOops 阈值为 31 G zero based Compressed Oops 阈值为 30 G 配置建议: 启动一个实例,堆内存大小设为 16G
Es不允许root用户进行启动 此时用sms启动
#启动 ./bin/elasticsearch
#后台启动 ./bin/elasticsearch -d
启动报错:
最大可创建文件数太小,使用root用户修改limits.conf
vi /etc/security/limits.conf
# 在文件末尾中增加下面内容
* hard nofile 65535
* soft nofile 65535
注:* 带表Linux所有用户名称
vi /etc/security/limits.d/20-nproc.conf
# 在文件末尾中增加下面内容
* soft nofile 65536
* hard nofile 65536
* hard nproc 4096
然后重新启动–又报错了啦。。。
最大虚拟机内存太小,使用root用户修改sysctl.conf
vi /etc/sysctl.conf
# 在文件中增加下面内容
vm.max_map_count=655360
重新加载配置
sysctl -p
再次启动-启动成功
l 集群状态显示“Green”,表示集群健康。还有其他“Yellow和Red”两种状态
l 查看集群节点-----heap.percent是堆内存的百分比
l 列出索引
Sw+es
修改sw中配置文件 在storage:中选择用es7作为存储数据 其他都不用改就用上文sw的配置就可以了
启动sw 查看启动日志 启动成功,访问sw ui界面