一个优秀的项目,除了具有高拓展的架构、高性能的方案、高质量的代码之外,还应该在上线后具备多角度的监控功能。现在企业中的监控服务也有很多,Skywalking除了提供多维度、多粒度的监控之外,也提供了良好的图形化界面以及性能剖析、服务报警等多种功能,备受很多企业的青睐。因此侯哥今天给大家通过一篇文章,来详细地给大家介绍Skywalking。
Skywalking是一款分布式的系统 性能监视工具,专为微服务、云原生架构和基于容器(Docker、K8s、Mesos)架构而设计。SkyWalking是一款 观察性的分析平台和应用性能管理系统,提供了 分布式追踪、性能指标分析、应用服务依赖分析、可视化一体化等解决方案。
https://skywalking.apache.org/
Skywalking功能非常丰富,侯哥简单地给大家总结一下。
监控手段丰富
多语言自动探针
优秀的可视化方案
分布式链路跟踪和上下文传播
数据库访问指标
告警
这是官网提供的Skywalking架构图,可以分成几个部分,简单来说,可以分成oap、webapp和agent三部分:
oap是skywalking最核心的部分,主要用于汇总数据、存储数据、提供对外的相关接口;
webapp主要提供了ui界面,并且从oap获取数据并且展示(通常和oap部署在服务端,相当于skywalking服务的后台监控管理程序);
agent是探针,部署在需要收集数据的应用服务器上,并将数据同步到Skywalking平台。
首先需要安装JDK,并确保以下端口可用:
11800:探针和Skywalking通讯的gRPC端口
12800:UI视图程序和Skywalking通讯的HTTP端口
8080:可视化视图UI服务的启动端口
#解压skywalking
tar -zxf apache-skywalking-apm-8.9.1.tar.gz
#修改解压后的文件夹
mv apache-skywalking-apm-8.9.1 skywalking
#进入skywalking文件夹
cd skywalking
bin/startup.sh
#运行结果
SkyWalking OAP started successfully!
SkyWalking Web Application started successfully!
#查看运行结果
JPS
#结果
11569 skywalking-webapp.jar
11668 Jps
11549 OAPServerStartUp
http://ip:8080
version: "3.1"
services:
skywalking-oap:
image: apache/skywalking-oap-server:8.9.1
container_name: skywalking-oap
restart: always
volumes:
- ./skywalking/alarm-settings.yml:/skywalking/config/alarm-settings.yml
- ./skywalking/application.yml:/skywalking/config/application.yml
- ./skywalking/service-apdex-threshold.yml:/skywalking/config/service-apdex-threshold.yml
- ./skywalking/libs:/skywalking/ext-libs
environment:
- TZ=Asia/Shanghai
- JAVA_OPTS=-Xms2048m -Xmx2048m
ports:
- 11800:11800
- 12800:12800
skywalking-ui:
image: apache/skywalking-ui:8.9.1
container_name: skywalking-ui
restart: always
ports:
- 8080:8080
environment:
- SW_OAP_ADDRESS=http://skywalking-oap:12800
-javaagent:./agent/skywalking-agent.jar
-Dskywalking.agent.service_name=qphone-student
属性名 |
描述 |
默认值 |
agent.namespace |
命名空间,用于隔离跨进程传播的header。如果进行了配置,header将为HeaderName:Namespace. |
未设置 |
agent.service_name |
在SkyWalking UI中展示的服务名。5.x版本对应Application,6.x版本对应Service。 建议:为每个服务设置个唯一的名字,服务的多个服务实例为同样的服务名 |
Your_ApplicationName |
agent.sample_n_per_3_secs |
负数或0表示不采样,默认不采样。SAMPLE_N_PER_3_SECS表示每3秒采样N条。 |
未设置 |
agent.authentication |
鉴权是否开启取决于后端的配置,可查看application.yml的详细描述。对于大多数的场景,需要后端对鉴权进行扩展。目前仅实现了基本的鉴权功能。 |
未设置 |
agent.span_limit_per_segment |
单个segment中的span的最大个数。通过这个配置项,Skywalking可评估应用程序内存使用量。 |
300 |
agent.ignore_suffix |
如果这个集合中包含了第一个span的操作名,这个segment将会被忽略掉。 |
未设置 |
agent.is_open_debugging_class |
如果为true,skywalking会将所有经Instrument转换过的类文件保存到/debugging文件夹下。Skywalking团队会要求你提供这些类文件以解决兼容性问题。 |
未设置 |
agent.active_v2_header |
是否默认使用v2版本的header。 |
TRUE |
agent.instance_uuid |
实例id。skywalking会将实例id相同的看做一个实例。如果为空,skywalking agent会生成一个32位的uuid。 |
“” |
agent.instance_properties[key]=value |
添加服务实例的定制属性。 |
未设置 |
agent.cause_exception_depth |
agent记录的异常时,代理进入的深度 |
5 |
agent.active_v1_header |
是否默认使用v1版本的header。 |
FALSE |
agent.cool_down_threshold |
收到reset命令后,代理应等待多久(以分钟为单位)才能重新注册到OAP服务器。 |
10 |
agent.force_reconnection_period |
根据grpc_channel_check_interval强制重新连接grpc。 |
1 |
agent.operation_name_threshold |
operationName最大长度,不建议将此值设置为> 500。 |
500 |
collector.grpc_channel_check_interval |
检查grpc的channel状态的时间间隔。 |
30 |
collector.app_and_service_register_check_interval |
检查应用和服务的注册状态的时间间隔。 |
3 |
collector.backend_service |
接收skywalking trace数据的后端地址 |
127.0.0.1:11800 |
collector.grpc_upstream_timeout |
grpc客户端向上游发送数据时的超时时间,单位秒。 |
30 秒 |
logging.level |
日志级别。默认为debug。 |
DEBUG |
logging.file_name |
日志文件名 |
skywalking-api.log |
logging.output |
日志输出,默认FILE。CONSOLE表示输出到stdout。 |
FILE |
logging.dir |
日志目录。默认为空串,表示使用"system.out"输出日志。 |
“” |
logging.pattern |
日志记录格式。所有转换说明符: %level 表示日志级别。 %timestamp 表示现在的时间,格式yyyy-MM-dd HH:mm:ss:SSS。 %thread 表示当前线程的名称。 %msg 表示消息。 %class 表示TargetClass的SimpleName。 %throwable 表示异常。 * %agent_name 表示agent.service_name |
%level %timestamp %thread %class : %msg %throwable |
logging.max_file_size |
日志文件的最大大小。当日志文件大小超过这个数,归档当前的日志文件,将日志写入到新文件。 |
30010241024 |
logging.max_history_files |
最大历史记录日志文件。发生翻转时,如果日志文件超过此值,则最早的文件将被删除。默认情况下,负数或零表示关闭。 |
-1 |
jvm.buffer_size |
收集JVM信息的buffer的大小。 |
60 * 10 |
buffer.channel_size |
buffer的channel大小。 |
5 |
buffer.buffer_size |
buffer的大小 |
300 |
dictionary.service_code_buffer_size |
The buffer size of application codes and peer |
10 * 10000 |
dictionary.endpoint_name_buffer_size |
The buffer size of endpoint names and peer |
1000 * 10000 |
plugin.peer_max_length |
Peer最大描述限制 |
200 |
plugin.mongodb.trace_param |
如果为true,记录所有访问MongoDB的参数信息。默认为false,表示仅记录操作名,不记录参数信息。 |
FALSE |
plugin.mongodb.filter_length_limit |
如果设为正数,WriteRequest.params 将被截断为该长度,否则将被完全保存,这可能会导致性能问题。 |
256 |
plugin.elasticsearch.trace_dsl |
如果为true,记录所有访问ElasticSearch的DSL信息。默认为false。 |
FALSE |
plugin.springmvc.use_qualified_name_as_endpoint_name |
如果为true,endpoint的name为方法的全限定名,而不是请求的URL。默认为false。 |
FALSE |
plugin.toolit.use_qualified_name_as_operation_name |
如果为true,operation的name为方法的全限定名,而不是给定的operation name。默认为false。 |
FALSE |
plugin.jdbc.trace_sql_parameters |
如果设置为true,则将收集sql的参数(通常为java.sql.PreparedStatement)。 |
FALSE |
lugin.jdbc.sql_parameters_max_length |
parameters_max_length 如果设置为正数,db.sql.parameters 将被截断为该长度,否则将被完全保存,这可能会导致性能问题。 |
512 |
plugin.postgresql.trace_sql_parameters |
如果设置为true,则将收集sql的参数(通常为java.sql.PreparedStatement)。 |
FALSE |
plugin.postgresql.sql_parameters_max_length |
如果设置为正数,db.sql.parameters 将被截断为该长度,否则将被完全保存,这可能会导致性能问题。 |
512 |
plugin.solrj.trace_statement |
如果为true,则在Solr查询请求中跟踪所有查询参数(包括deleteByIds和deleteByQuery) |
FALSE |
plugin.solrj.trace_ops_params |
如果为true,则跟踪Solr请求中的所有操作参数 |
FALSE |
plugin.light4j.trace_handler_chain |
如果为true,请跟踪Light4J的请求的所有中间件/业务handler。 |
FALSE |
plugin.opgroup.* |
支持操作名称自定义不同插件中的组的规则。详见 支持组规则的插件 |
未设置 |
plugin.springtransaction.simplify_transaction_definition_name |
设为true,则简化事务定义名称。 |
FALSE |
plugin.jdkthreading.threading_class_prefixes |
将对名称与任意一个 THREADING_CLASS_PREFIXES (多个使用 , 分隔)匹配的线程化类( java.lang.Runnable 和 java.util.concurrent.Callable )及其子类进行 Instrument,请确保仅将窄前缀指定为您希望Instrument的前缀(安全考虑, java. 和 javax. 将被忽略) |
未设置 |
配置属性: agent.sample_n_per_3_secs=${SW_AGENT_SAMPLE: -1}
-1 表示全部采样,改为大于0的数即可
配置属性: plugin.jdbc.trace_sql_parameters=${SW_JDBC_TRACE_SQL_PARAMETERS: false}
该属性设置为true即可,配套属性还有:
plugin.jdbc.sql_parameters_max_length=${SW_PLUGIN_JDBC_SQL_PARAMETERS_MAX_LENGTH:512}
-Dskywalking.配置名称=配置的值 //或者-javaagent:agent路径/skywalking-agent.jar=[配置名称]=[配置的值],[配置名称2]=[配置的值2]
#例如这样的配置,表示会去读取SW_AGENT_NAME的环境变量,如果没有再去获取:后面的值agent.service_name=${SW_AGENT_NAME:Your_ApplicationName}
相关插件介绍
Skywalking最主要的功能就是APM,监控维度与指标都非常丰富,为了让大家能更好的掌握Skywalkig的使用,接下来侯哥就把Skywalking的每个指标都给大家进行详细地解释。
APM(Application Performance Monitor) - 应用性能监视器
Global - 全局指标
Service - 当前服务指标
Instance - 当前服务实例指标
Endpoint - 端点(接口)指标
Apdex是衡量一个服务器性能的指标,这个值越高越好,满分为1。Apdex有三个指标:
正常:服务请求的响应时间 <= T
可容忍:T < 服务请求响应时间 <= 4T
慢调用:服务请求响应时间 > 4T
T是自定义的一个响应阈值,比如500ms
Apdex = (正常请求数 + 可容忍请求数 / 2)/ 请求总数。示例如下:
服务A定义T=200ms,在100个采样中,有20个请求小于200ms,有60个请求在200ms到800ms之间,有20个请求大于800ms。计算apdex = (20 + 60/2)/100 = 0.5。
#配置文件config/service-apdex-threshold.yml
# default threshold is 500ms
default: 500
# example:
# the threshold of service "tomcat" is 1s
# tomcat: 1000
# the threshold of service "springboot1" is 50ms
# springboot1: 50
org.apache.skywalking
apm-toolkit-trace
8.9.0
@RequestMapping("/getById")
@Trace//在需要获取TraceId的代码上添加该注解
public R getById(Integer sId){
.....
}
...
//获取全局追踪Id
String traceId = TraceContext.traceId();
...
org.apache.skywalking
apm-toolkit-log4j-2.x
8.9.0
通过 - [%traceId] - 标签可获取全局TraceId
示例:%date{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} [%traceId] - %msg%n
性能剖析主要的工作就是对不同的端点进行采样,然后提供一个更加详细的分析结果。
注意:
一个服务在监控持续时间内只能设置一个端点监控任务
剖析端点的响应时间必须大于监控间隔时间,如果响应时间小于监控间隔时间,则无法进行采集
Skywalking支持微服务间运行日志上传到Skywalking端,进行日志相关管理,并且可以将日志和相关服务节点关联起来。
org.apache.skywalking
apm-toolkit-log4j-2.x
8.9.0
......
......
Skywalking可以对指定参数设置阈值,当超过阈值时,就会触发告警,及时通知开发人员
Skywalking-OAP端 config/alarm-settings.yml
#配置告警规则
rule:
#服务自带的告警规则
...
#自定义告警规则
#规则名称,必须全局唯一,并且以"_rule"结尾
xxxxxx_rule:
#告警的指标名称,具体值可以参考下图
metrics-name: endpoint_sla
#[可选] 指定告警的服务
include-names:
- serviceA
- serviceB
#[可选] 排除的服务将不触发告警
exclude-names:
- serviceC
#[可选] 匹配微服务的名称, 通过正则表达式
include-names-regex: instance\_\d+
#阈值,对于不同的指标类型,可以设置不用类型的值,目前支持long, double or int
threshold: 9000
#操作符
op: "<"
#时间窗口长度,单位时间内,指标异常就会触发告警 (单位是分钟)
period: 2
#累计数量,指标符合告警条件达到累计数量后,才会触发告警
count: 3
#静默时间,当发生告警后,多长时间不再告警,默认和period值保持一致
silence-period: 10
#告警内容,触发告警时,显示的消息内容 {name} 表示告警的服务名称
message: Successful rate of service {name} is lower than 90% in 2 minutes of last 10 minutes
动态配置就是将相关配置信息,放入配置中心(比如nacos),然后修改nacos的配置,在无需重启skywalking服务的情况下达到刷新配置的目的
告警相关配置,会覆盖alarm-settings.yml配置内容
apdex阈值相关配置,会覆盖service-apdex-threshold.yml配置内容
1)安装nacos服务器
2)修改Skywalking配置文件 - config/application.yml
428 configuration:
429 selector: ${SW_CONFIGURATION:nacos} #该选项改为nacos
430 none:
.....
#配置好nacos的相关属性
467 nacos:
468 # Nacos Server Host
469 serverAddr: ${SW_CONFIG_NACOS_SERVER_ADDR:nacos}
470 # Nacos Server Port
471 port: ${SW_CONFIG_NACOS_SERVER_PORT:8848}
472 # Nacos Configuration Group
473 group: ${SW_CONFIG_NACOS_SERVER_GROUP:skywalking}
474 # Nacos Configuration namespace
475 namespace: ${SW_CONFIG_NACOS_SERVER_NAMESPACE:skywalking}
476 # Unit seconds, sync period. Default fetch every 60 seconds.
477 period: ${SW_CONFIG_NACOS_PERIOD:60}
478 # Nacos auth username
479 username: ${SW_CONFIG_NACOS_USERNAME:"nacos"}
480 password: ${SW_CONFIG_NACOS_PASSWORD:"nacos"}
481 # Nacos auth accessKey
482 accessKey: ${SW_CONFIG_NACOS_ACCESSKEY:""}
483 secretKey: ${SW_CONFIG_NACOS_SECRETKEY:""}
3)在nacos上创建配置信息
注意:配置的dataId必须为 - alarm.default.alarm-settings
Skywalking并没有提供告警通知的功能(发短信、发邮件等方式),但是提供了一个webhook(网络钩子),开发者可以通过webhook自定义通知接口,然后再自己实现告警通知的方式
webhooks: - 通知接收地址
自定义的webhook接口将接收到类似如下的消息,只需要解析并且按照自己的需求发送即可
[
{
"scopeId": 1,
"scope": "SERVICE",
"name": "qphone-gateway",
"id0": "cXBob25lLWdhdGV3YXk\u003d.1",
"id1": "",
"ruleName": "service_sla_rule",
"alarmMessage": "警告,服务qphone-gateway处于响应请求过慢!",
"tags": [],
"startTime": 1655046016465
},
......
]
Skywalking数据持久化的方式比较多,常见的有基于mysql和es的方式,这里我们选择 mysql的方式持久化数据
storage:
selector: ${SW_STORAGE:mysql} #修改配置存储方式为mysql
...
#配置mysql的相关属性
mysql:
properties:
jdbcUrl: ${SW_JDBC_URL:"jdbc:mysql://mysql:3306/skywalking?useUnicode=true&characterEncoding=utf8&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2b8&useSSL=true&allowMultiQueries=true&autoReconnect=true&nullCatalogMeansCurrent=true&nullCatalogMeansCurrent=true"}
dataSource.user: ${SW_DATA_SOURCE_USER:root}
dataSource.password: ${SW_DATA_SOURCE_PASSWORD:root}
dataSource.cachePrepStmts: ${SW_DATA_SOURCE_CACHE_PREP_STMTS:true}
dataSource.prepStmtCacheSize: ${SW_DATA_SOURCE_PREP_STMT_CACHE_SQL_SIZE:250}
dataSource.prepStmtCacheSqlLimit: ${SW_DATA_SOURCE_PREP_STMT_CACHE_SQL_LIMIT:2048}
dataSource.useServerPrepStmts: ${SW_DATA_SOURCE_USE_SERVER_PREP_STMTS:true}
metadataQueryMaxSize: ${SW_STORAGE_MYSQL_QUERY_MAX_SIZE:5000}
maxSizeOfArrayColumn: ${SW_STORAGE_MAX_SIZE_OF_ARRAY_COLUMN:20}
numOfSearchableValuesPerTag: ${SW_STORAGE_NUM_OF_SEARCHABLE_VALUES_PER_TAG:2}
maxSizeOfBatchSql: ${SW_STORAGE_MAX_SIZE_OF_BATCH_SQL:2000}
asyncBatchPersistentPoolSize: ${SW_STORAGE_ASYNC_BATCH_PERSISTENT_POOL_SIZE:4}
create database skywalking;
Skywalking是一款很好的APM服务,希望通过这篇使用指南,能让大家更好地掌握学习Skywalking的服务运用。大家记得一定要自己上手实操,才能真正的掌握Skywalking的魅力哦。