• 项目运行状况不断,怎么办?看看企业级监控项目Skywalking吧


    一. Skywalking概述

    一个优秀的项目,除了具有高拓展的架构、高性能的方案、高质量的代码之外,还应该在上线后具备多角度的监控功能。现在企业中的监控服务也有很多,Skywalking除了提供多维度、多粒度的监控之外,也提供了良好的图形化界面以及性能剖析、服务报警等多种功能,备受很多企业的青睐。因此侯哥今天给大家通过一篇文章,来详细地给大家介绍Skywalking。

    1.1 什么是Skywalking?

    Skywalking是一款分布式的系统性能监视工具,专为微服务、云原生架构和基于容器(Docker、K8s、Mesos)架构而设计。SkyWalking是一款观察性分析平台和应用性能管理系统提供了分布式追踪、性能指标分析、应用服务依赖分析、可视化一体化等解决方案。

    1.2 官网地址

    https://skywalking.apache.org/

    1.3 Skywalking功能特点

    Skywalking功能非常丰富,侯哥简单地给大家总结一下。

    • 监控手段丰富

    • 多语言自动探针

    • 优秀的可视化方案

    • 分布式链路跟踪和上下文传播

    • 数据库访问指标

    • 告警

    1.4 Skywalking架构图

    这是官网提供的Skywalking架构图,可以分成几个部分,简单来说,可以分成oapwebappagent三部分:

    • oap是skywalking最核心的部分,主要用于汇总数据、存储数据、提供对外的相关接口;

    • webapp主要提供了ui界面,并且从oap获取数据并且展示(通常和oap部署在服务端,相当于skywalking服务的后台监控管理程序);

    • agent是探针,部署在需要收集数据的应用服务器上,并将数据同步到Skywalking平台。

    二. Skywalking的安装与使用

    2.1 Skywalking服务端安装步骤

    2.1.1 前置环境

    首先需要安装JDK,并确保以下端口可用:

    11800:探针和Skywalking通讯的gRPC端口 12800:UI视图程序和Skywalking通讯的HTTP端口 8080:可视化视图UI服务的启动端口

    2.1.2 官网下载SkyWalking包

    2.1.3 上传到Linux服务器并解压

    1. #解压skywalking
    2. tar -zxf apache-skywalking-apm-8.9.1.tar.gz
    3. #修改解压后的文件夹
    4. mv apache-skywalking-apm-8.9.1 skywalking
    5. #进入skywalking文件夹
    6. cd skywalking

    2.1.4 直接启动Skywalking服务(默认单机模式)

    1. bin/startup.sh
    2. #运行结果
    3. SkyWalking OAP started successfully!
    4. SkyWalking Web Application started successfully!
    5. #查看运行结果
    6. JPS
    7. #结果
    8. 11569 skywalking-webapp.jar
    9. 11668 Jps
    10. 11549 OAPServerStartUp

    2.1.5 访问Skywalking管理端页面

    http://ip:8080

    2.2 Skywalking服务端Docker安装

    准备docker-compose文件

    1. version: "3.1"
    2. services:  
    3.   skywalking-oap:
    4.     image: apache/skywalking-oap-server:8.9.1
    5.     container_name: skywalking-oap
    6.     restart: always
    7.     volumes:
    8.       - ./skywalking/alarm-settings.yml:/skywalking/config/alarm-settings.yml
    9.       - ./skywalking/application.yml:/skywalking/config/application.yml
    10.       - ./skywalking/service-apdex-threshold.yml:/skywalking/config/service-apdex-threshold.yml
    11.       - ./skywalking/libs:/skywalking/ext-libs
    12.     environment:
    13.       - TZ=Asia/Shanghai
    14.       - JAVA_OPTS=-Xms2048m -Xmx2048m
    15.     ports:
    16.       - 11800:11800
    17.       - 12800:12800
    18.   skywalking-ui:
    19.     image: apache/skywalking-ui:8.9.1
    20.     container_name: skywalking-ui
    21.     restart: always
    22.     ports:
    23.       - 8080:8080
    24.     environment:
    25.       - SW_OAP_ADDRESS=http://skywalking-oap:12800

    2.3 微服务整合Skywalking

    2.3.1 下载java-agent(Java探针)

    2.3.2 将探针解压,放入工程中(或任意位置都可以)

    2.3.3 修改agent配置文件

    2.3.4 修改微服务的启动VM option

    -javaagent:./agent/skywalkingagent.jar

    -Dskywalking.agent.service_name=qphone-student

    三. Java Agent配置

    3.1 Java Agent配置属性详解

    属性名

    描述

    默认值

    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. 将被忽略)

    未设置

    示例:设置Skywalking采样率

    配置属性:agent.sample_n_per_3_secs=${SW_AGENT_SAMPLE:-1}

    -1 表示全部采样,改为大于0的数即可

    示例:设置数据库采集SQL执行参数

    配置属性: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}

    3.2 Java Agent配置方式

    3.2.1 直接修改配置文件

    3.2.2 在服务VM 启动参数项中配置

    -Dskywalking.配置名称=配置的值

     //或者 

    -javaagent:agent路径/skywalking-agent.jar=[配置名称]=[配置的值],[配置名称2]=[配置的值2]

    3.2.3 系统环境变量

    #例如这样的配置,表示会去读取SW_AGENT_NAME的环境变量,如果没有再去获取:后面的值 agent.service_name=${SW_AGENT_NAME:Your_ApplicationName}

    3.3 Java Agent相关插件介绍

    相关插件介绍

    四. Skywalking仪表盘

    Skywalking最主要的功能就是APM,监控维度与指标都非常丰富,为了让大家能更好的掌握Skywalkig的使用,接下来侯哥就把Skywalking的每个指标都给大家进行详细地解释。

    4.1 APM参数详解

    APM(Application Performance Monitor) -应用性能监视器

    Global - 全局指标

    Service - 当前服务指标

    Instance - 当前服务实例指标

    Endpoint - 端点(接口)指标

    4.2 Database参数详解

    4.3 什么是Apdex?

    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。

    4.4 Skywalking自定义T

    1. #配置文件config/service-apdex-threshold.yml
    2. default threshold is 500ms
    3. default500
    4. # example:
    5. # the threshold of service "tomcat" is 1s
    6. # tomcat: 1000
    7. # the threshold of service "springboot1" is 50ms
    8. # springboot150

    五. Skywalking拓扑图

    六. Skywalking追踪

    6.1 追踪面板参数详解

    6.2 在代码中获取当前业务请求的TraceId

    6.2.1 添加依赖

    1. <dependency>
    2.     <groupId>org.apache.skywalking</groupId>
    3.     <artifactId>apm-toolkit-trace</artifactId>
    4.     <version>8.9.0</version>
    5. </dependency>

    6.2.2 在代码上标记@Trace注解

    1. @RequestMapping("/getById")
    2. @Trace//在需要获取TraceId的代码上添加该注解
    3. public R getById(Integer sId){
    4.     .....
    5. }

    6.2.3 在代码中获取TraceId

    1. ...
    2. //获取全局追踪Id
    3. String traceId = TraceContext.traceId();   
    4. ...

    6.3 Skywalking整合Log4j2在日志中打印TraceId

    6.3.1 添加依赖

    1. <dependency>
    2.     <groupId>org.apache.skywalking</groupId>
    3.     <artifactId>apm-toolkit-log4j-2.x</artifactId>
    4.     <version>8.9.0</version>
    5. </dependency>

    6.3.2 在log4j2的配置文件中获得TraceId

    1. 通过 -[%traceId]- 标签可获取全局TraceId 

    2. 示例:%date{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} [%traceId] - %msg%n

    七. Skywalking性能剖析

    性能剖析主要的工作就是对不同的端点进行采样,然后提供一个更加详细的分析结果。

    7.1 使用示例

    7.1.1 先随机在业务代码中设置一个睡眠时间,模拟慢请求

    7.1.2 在Skywalking控制台创建监控任务

    7.1.3 给相应的端点发送请求,然后控制台查看监控结果

    注意:

    • 一个服务在监控持续时间内只能设置一个端点监控任务

    • 剖析端点的响应时间必须大于监控间隔时间,如果响应时间小于监控间隔时间,则无法进行采集

    八. Skywalking日志采集(Log4j2版)

    Skywalking支持微服务间运行日志上传到Skywalking端,进行日志相关管理,并且可以将日志和相关服务节点关联起来。

    8.1 配置方式

    8.1.1 微服务添加依赖(同Log4j2获取TraceId的依赖)

    1. <dependency>
    2.     <groupId>org.apache.skywalking</groupId>
    3.     <artifactId>apm-toolkit-log4j-2.x</artifactId>
    4.     <version>8.9.0</version>
    5. </dependency>

    8.1.2 配置Log4j2输出器

    1. <appenders>
    2.   ......  
    3.     
    4.   
    5.   <GRPCLogClientAppender name="SkywalkingLog">
    6.     <ThresholdFilter level="debug" onMatch="ACCEPT" onMismatch="DENY"/>
    7.     <PatternLayout pattern="${LOG_PATTERN}"/>
    8.   </GRPCLogClientAppender>
    9. </appenders>
    10. <loggers>
    11.     
    12.     <root level="info">
    13.       ......
    14.       <appender-ref ref="SkywalkingLog"/>
    15.     </root>
    16. </loggers>

    8.1.3 启动微服务,发送请求,查看Skywalking日志面板

    九. Skywalking告警

    Skywalking可以对指定参数设置阈值,当超过阈值时,就会触发告警,及时通知开发人员

    9.1 告警配置方式

    9.1.1 定义告警规则

    Skywalking-OAP端 config/alarm-settings.yml

    1. #配置告警规则
    2. rule:
    3.   #服务自带的告警规则
    4.   ...
    5.   #自定义告警规则
    6.   #规则名称,必须全局唯一,并且以"_rule"结尾
    7.   xxxxxx_rule:
    8.     #告警的指标名称,具体值可以参考下图
    9.     metrics-name: endpoint_sla
    10.     #[可选] 指定告警的服务
    11.     include-names:
    12.       - serviceA
    13.       - serviceB
    14.     #[可选] 排除的服务将不触发告警  
    15.     exclude-names:
    16.       - serviceC
    17.     #[可选] 匹配微服务的名称, 通过正则表达式  
    18.     include-names-regex: instance\_\d+
    19.     #阈值,对于不同的指标类型,可以设置不用类型的值,目前支持long, double or int  
    20.     threshold: 9000  
    21.     #操作符
    22.     op: "<"
    23.     #时间窗口长度,单位时间内,指标异常就会触发告警 (单位是分钟)
    24.     period: 2
    25.     #累计数量,指标符合告警条件达到累计数量后,才会触发告警
    26.     count: 3
    27.     #静默时间,当发生告警后,多长时间不再告警,默认和period值保持一致
    28.     silence-period: 10
    29.     #告警内容,触发告警时,显示的消息内容 {name} 表示告警的服务名称
    30.     message: Successful rate of service {name} is lower than 90% in 2 minutes of last 10 minutes

    9.1.2 重启Skywalking服务即可

    9.2 动态配置告警

    动态配置就是将相关配置信息,放入配置中心(比如nacos),然后修改nacos的配置,在无需重启skywalking服务的情况下达到刷新配置的目的

    9.2.1 Skywalking支持动态配置的配置项

    • 告警相关配置,会覆盖alarm-settings.yml配置内容

    • apdex阈值相关配置,会覆盖service-apdex-threshold.yml配置内容

    9.2.2 基于nacos实现动态配置

    1)安装nacos服务器

    2)修改Skywalking配置文件 - config/application.yml

    1. 428 configuration:
    2. 429   selector: ${SW_CONFIGURATION:nacos} #该选项改为nacos
    3. 430   none:
    4. .....
    5. #配置好nacos的相关属性
    6. 467   nacos:
    7. 468     # Nacos Server Host
    8. 469     serverAddr: ${SW_CONFIG_NACOS_SERVER_ADDR:nacos}
    9. 470     # Nacos Server Port
    10. 471     port: ${SW_CONFIG_NACOS_SERVER_PORT:8848}
    11. 472     # Nacos Configuration Group
    12. 473     group: ${SW_CONFIG_NACOS_SERVER_GROUP:skywalking}
    13. 474     # Nacos Configuration namespace
    14. 475     namespace: ${SW_CONFIG_NACOS_SERVER_NAMESPACE:skywalking}
    15. 476     # Unit seconds, sync period. Default fetch every 60 seconds.
    16. 477     period: ${SW_CONFIG_NACOS_PERIOD:60}
    17. 478     # Nacos auth username
    18. 479     username: ${SW_CONFIG_NACOS_USERNAME:"nacos"}
    19. 480     password: ${SW_CONFIG_NACOS_PASSWORD:"nacos"}
    20. 481     # Nacos auth accessKey
    21. 482     accessKey: ${SW_CONFIG_NACOS_ACCESSKEY:""}
    22. 483     secretKey: ${SW_CONFIG_NACOS_SECRETKEY:""}

    3)在nacos上创建配置信息

    注意:配置的dataId必须为 - alarm.default.alarm-settings

    9.3 告警通知

    Skywalking并没有提供告警通知的功能(发短信、发邮件等方式),但是提供了一个webhook(网络钩子),开发者可以通过webhook自定义通知接口,然后再自己实现告警通知的方式

    9.3.1 配置webhook

    webhooks: 

    - 通知接收地址

    9.3.2 接收告警消息

    自定义的webhook接口将接收到类似如下的消息,只需要解析并且按照自己的需求发送即可

    1. [
    2.  {
    3.     "scopeId"1,
    4.     "scope""SERVICE",
    5.     "name""qphone-gateway",
    6.     "id0""cXBob25lLWdhdGV3YXk\u003d.1",
    7.     "id1""",
    8.     "ruleName""service_sla_rule",
    9.     "alarmMessage""警告,服务qphone-gateway处于响应请求过慢!",
    10.     "tags": [],
    11.     "startTime"1655046016465
    12.  },
    13.  ...... 
    14. ]

    十. Skywalking数据持久化

    Skywalking数据持久化的方式比较多,常见的有基于mysql和es的方式,这里我们选择mysql的方式持久化数据

    10.1 基于Mysql配置Skywalking数据持久化

    10.1.1 修改配置文件config/application.yml

    1. storage:
    2.   selector: ${SW_STORAGE:mysql} #修改配置存储方式为mysql
    3. ...
    4.   #配置mysql的相关属性
    5.   mysql:
    6.     properties:
    7.       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"}
    8.       dataSource.user: ${SW_DATA_SOURCE_USER:root}
    9.       dataSource.password: ${SW_DATA_SOURCE_PASSWORD:root}
    10.       dataSource.cachePrepStmts: ${SW_DATA_SOURCE_CACHE_PREP_STMTS:true}
    11.       dataSource.prepStmtCacheSize: ${SW_DATA_SOURCE_PREP_STMT_CACHE_SQL_SIZE:250}
    12.       dataSource.prepStmtCacheSqlLimit: ${SW_DATA_SOURCE_PREP_STMT_CACHE_SQL_LIMIT:2048}
    13.       dataSource.useServerPrepStmts: ${SW_DATA_SOURCE_USE_SERVER_PREP_STMTS:true}
    14.     metadataQueryMaxSize: ${SW_STORAGE_MYSQL_QUERY_MAX_SIZE:5000}
    15.     maxSizeOfArrayColumn: ${SW_STORAGE_MAX_SIZE_OF_ARRAY_COLUMN:20}
    16.     numOfSearchableValuesPerTag: ${SW_STORAGE_NUM_OF_SEARCHABLE_VALUES_PER_TAG:2}
    17.     maxSizeOfBatchSql: ${SW_STORAGE_MAX_SIZE_OF_BATCH_SQL:2000}
    18.     asyncBatchPersistentPoolSize: ${SW_STORAGE_ASYNC_BATCH_PERSISTENT_POOL_SIZE:4}

    10.1.2 提前在数据库中创建好skywalking库

    create database skywalking;

    10.1.3 在Skywalking-oap服务下放入mysql驱动包

    10.1.4 重启skywalking服务,查看数据库是否自动创建相关表

    十一. 结语

    Skywalking是一款很好的APM服务,希望通过这篇使用指南,能让大家更好地掌握学习Skywalking的服务运用。大家记得一定要自己上手实操,才能真正的掌握Skywalking的魅力哦。

  • 相关阅读:
    Nginx入门到搭建
    Java实现顺序表
    解决Selenium元素拖拽不生效Bug
    分布式ID生成策略-雪花算法Snowflake
    docker-compose deploy 高可用 elasticsearch TLS
    捆绑保险的同时,平安汽车金融还站着把利息收了?
    【教程】超详细通过Shizuku转生支付宝集成XQ_Crystal来自动收能量
    Netty+WebSocket整合STOMP协议
    k8s部署springboot
    Vue路由组件的缓存keep-alive和include属性
  • 原文地址:https://blog.csdn.net/finally_vince/article/details/126782711