目录
1. 介绍
2. 准备
3. 目录结构
4. 开始配置
5. 启动
5.1. 启动SW
5.2. SW动态配置
5.3. 启动agent
6. sw界面监控说明
6.1. 简单测试
6.2. 忽略部分 URL 的追踪
6.3. 对mysql的操作链路分析
6.4. 对redis的操作链路分析
6.5. 更多链路追踪
6.6. ui界面介绍
7. 日志框架示例
8. 告警配置
9. Sw+Elasticsearch集群配置
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
本文中的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
|
下载解压后---注意:标注了中文注释的地方代表需要修改
编辑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
|
调整JVM参数(可选)
编辑如下启动脚本:bin/oapServiceInit.sh bin/oapServiceNoInit.sh bin/oapService.sh
设置JAVA_OPTS=" -Xms2048M -Xmx4096M"
注释:bin/webappService.sh的JAVA_OPTS可自行调整
直接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 界面
官方文档: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而动态刷新配置的效果。
将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 基本加载成功:
在程序中新建一个测试controller(我程序是springcloud+nacos) 程序部署在服务132/133服务器上
请求接口/mms/test/test,查看sw仪表盘
请求test2接口,可以看到对该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(没有配置忽略)
(我的程序有定时执行mysql修改的操作)
1.点击「Database Dashboard」选项,再点击「Database」选项,可以以数据库为维度的监控数据。如下图所示:
2.点击「拓扑图」菜单,进入查看拓扑图的界面,可以看到 MySQL 小方块。如下图所示:
3.点击「追踪」菜单,进入查看链路数据的界面。如下图所示:
这里,我们暂时无法看到 SQL 的数据参数,可以通过修改 config/agent.config 配置文件,将 plugin.mysql.trace_sql_parameters 配置项,设置为 true 。
(我只有一个程序有定时操作redis)
1.点击「拓扑图」菜单,进入查看拓扑图的界面,可以看到 Redis 小方块。如下图所示:
2.点击「追踪」菜单,进入查看链路数据的界面。如下图所示:
3.点击 Redis 操作的链路数据,可以看到 Redis 具体操作。如下图所示:
可查看博客Spring Boot 链路追踪 SkyWalking 入门_weixin_42073629的博客-CSDN博客_springboot链路追踪
实例信息
端点
拓扑图
追踪
性能剖析
在使用 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]即可。更多信息查看官方文档
https://github.com/apache/skywalking/blob/v6.5.0/docs/en/setup/service-agent/java-agent/Application-toolkit-log4j-2.x.md
下面讲述使用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接口
Alarm | Apache SkyWalking
属性 | 含义 |
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击告警可以看到输出的告警信息,查看程序日志可以看到接收到告警
下载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界面