SkyWalking - 使用指南

7,098 阅读8分钟

SkyWalking - 使用指南

本文使用SkyWalking-8.5.0,默认已部署Server端,UI,并使用ES-7.6存储。

Agent使用

SkyWalking无需手工埋点,而是在将JVM运行后将监控代码段插入Java 应用,实现对目标应用的监控。
SkyWalking Agent 会将服务运行过程中获得的监控数据通过 gRPC 发送给后端的 OAP 集群进行分析和存储。

对JAVA项目A进行监控,我们需要将skywalking安装目录下的agent目录完整复制到A项目所在的服务器,一般放在A项目同级目录下。agent的常用配置方式有以下两种

  1. 启动参数方式

    在项目A的启动参数中加入-javaagent参数,有两种格式

    • 格式1:-javaagent:/path/skywalking-agent.jar={config1}={value1},{config2}={value2}

    • 格式2:-javaagent:/path/skywalking-agent.jar -Dskywalking.[option1]=[value2] 给出探针方式启动的demo启动命令:

      java -javaagent:/home/demo/agent/skywalking-agent.jar -Dskywalking.agent.namespace=demo_183 -Dskywalking.agent.service_name=demo -Dskywalking.collector.backend_service=192.168.3.84:11800 -Xms128m -Xmx512m -jar /home/demo/demo-0.0.1-SNAPSHOT.jar --spring.profiles.active=test

  2. 配置文件方式

    修改项目A对应agent的agent/config/agent.config文件。启动项目时仅需指定agent包所在的位置,此时启动命令为:

    java -javaagent:/home/demo/agent/skywalking-agent.jar -Xms128m -Xmx512m -jar /home/demo/demo-0.0.1-SNAPSHOT.jar --spring.profiles.active=test
    

项目启动后,打开SkyWalking UI界面,Demo服务已经出现在仪表盘里啦。

UI界面

SkyWalking UI的包括:仪表盘、拓扑图、追踪、性能分析、日志、告警六个功能区。功能区下方为指标对象,SW的监控对象分为 服务端点实例三种。右下角为时间区,用来设定统计指标的时间域(所有的指标展示都依赖于这个时间范围)。点击右上“自动”按钮可以开启自动刷新模式;其余空间为指标盘展示区,用来展示各种指标信息。 image.png 这里着重介绍下 SkyWalking 中最基础的三个概念:

  • 服务(Service) :表示对请求提供相同行为的一系列或一组工作负载。在使用 Agent 或 SDK 的时候,你可以定义服务的名字。如果不定义的话,SkyWalking 将会使用应用名称上定义的名字,为了和告警服务联动,这里推荐大家配置成应用中心中的应用名。

    这里,我们可以看到 应用的服务"owind_base_info",这是在agent 环境变量 SW_AGENT_NAME 中所定义的。

  • 端点(Endpoint) :方法级别。如请求的接口路径,定时任务的方法,服务间的RPC远程调用等。

    这里,我们可以看到应用的一个端点,为 API 接口 /owind/api/websocket/{id}

  • 实例(Service Instance) :上述的一组工作负载中的每一个工作负载称为一个实例。就像 Kubernetes 中的 pods 一样, 服务实例未必就是操作系统上的一个进程。但当你在使用 Agent 的时候, 一个服务实例实际就是操作系统上的一个真实进程。

    这里,我们可以看到 Spring Boot 应用的实例{进程UUID}@{hostname},由 Agent 自动生成。

仪表盘

仪表盘中我们主要关注APM(Application Performance Management)应用性能管理、Database数据库。仪表盘中包含了服务的各种性能指标。

主要的性能指标有:

  • ApdexScore : 性能指数,Apdex(Application Performance Index)是一个国际通用标准,Apdex 是用户对应用性能满意度的量化值。它提供了一个统一的测量和报告用户体验的方法,把最终用户的体验和应用性能作为一个完整的指标进行统一度量,其中最高为1最低为0;

  • ResponseTime:响应时间,即在选定时间内,服务所有请求的平均响应时间(ms);

  • Throughput: 吞吐量,即在选定时间内,每分钟服务响应的请求量(cpm)

  • SLA: service level agreement,服务等级协议,SW中特指每分钟内响应成功请求的占比。

    大盘中会列出以上指标的当前的平均值,和历史走势。 image.png

比如Slow Endpoints(ms)指标列出了选中时间域内响应耗时最久的方法,左侧数字在这里代表响应时间

image.png 而Global Response Latency(响应延迟)折线图中,P75=530代表75%的响应延迟在530毫秒内

Instance(实例)指标中,除常见的吞吐量、响应时间等指标外,还会给出当前实例运行的JVM信息,如堆栈使用情况,GC次数和耗时等

Database中可以查看项目中使用数据库的响应时间,请求压力以及慢SQL。指标含义都很容易理解。

拓扑图

拓扑图用来展示服务和服务之间的依赖关系。SW会根据请求数据,自动探测出服务的依赖关系。点击服务,会显示当前服务的部分指标。点击依赖线上的圆点,会显示服务之间的依赖情况,如每分钟吞吐量,平均延迟时间等。

追踪

当用户发现服务SLA降低,或者某个具体的端口响应时间上扬明显,可以使用追踪功能查询具体的请求记录。

  • 最上方为搜索区,用户可以指定搜索条件,如隶属于哪个服务、哪个实例、哪个端口,或者请求是成功还是失败,端口名支持模糊查询;
  • 调用链上每一次调用称为一个跨度,每个跨度的耗时和执行结果都会被列出(默认是列表,也可选择树形结构和表格的形式);
  • 如果有步骤失败,该步骤会标记为红色。
  • 点击跨度,会显示跨度详情,如果有异常发生,异常的种类、信息和堆栈都会被自动捕获,如果跨度为数据库操作,执行的SQL也会被自动记录。
  • 如果项目关联了日志,可以点击右上角的查看日志查看当前接口对应的日志。

性能剖析

追踪功能展示出的跨度是服务调用粒度的,如果要看应用实时的堆栈信息,可以选择性能剖析功能。 在性能剖析页面新建任务后,SW将开始采集应用的实时堆栈信息。采样结束后,用户点击分析即可查看具体的堆栈信息。

  1. 点击跨度右侧的“查看”,可以看到调用链的具体详情;
  2. 跨度目录下方是SW收集到的具体进程堆栈信息和耗时情况。

需要提醒的是,性能剖析功能因为要实时高频率收集服务的JVM堆栈信息,对于服务本身有一定的性能消耗,只适用于耗时端点的行为分析。

新建任务的参数:

  • 服务:需要分析的服务
  • 端点:链路监控中端点的名称,即链路追踪中端点的完整路径。如下图中的{GET}/owind/api/fuseQuery/fuseQueryAll image.png
  • 监控时间:采集数据的开始时间
  • 监控持续时间:监控采集多长时间
  • 起始监控时间:多少秒后进行采集
  • 监控间隔:多少秒采集一次
  • 最大采集数:最大采集多少样本

日志

日志 本项目以logback作为日志框架,这里以就以logback为例集成skywalking。其它如log4j2等步骤类似。 首先在项目中添加依赖(其它日志框架需添加的依赖自行搜索):

<dependency>
    <groupId>org.apache.skywalking</groupId>
    <artifactId>apm-toolkit-logback-1.x</artifactId>
    <version>8.5.0</version>
</dependency>

在logback-spring.xml配置文件中增加skywalking appender

<appender name="SKYWALKING" class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.log.GRPCLogClientAppender">
    <!-- 日志输出编码 -->
    <encoder>
        <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
        <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n
        </pattern>
        <charset>UTF-8</charset> <!-- 设置字符集 -->
    </encoder>
</appender>
<springProfile name="local">
    <root level="info">
        <appender-ref ref="SKYWALKING"/>
        <appender-ref ref="INFO_FILE"/>
        <appender-ref ref="WARN_FILE"/>
        <appender-ref ref="ERROR_FILE"/>
    </root>
</springProfile>

在项目A对应agent的agent/config/agent.config文件下添加如下配置

plugin.toolkit.log.grpc.reporter.server_host=${SW_GRPC_LOG_SERVER_HOST:XXX.XXX.XXX.XXX}
plugin.toolkit.log.grpc.reporter.server_port=${SW_GRPC_LOG_SERVER_PORT:11800}
plugin.toolkit.log.grpc.reporter.max_message_size=${SW_GRPC_LOG_MAX_MESSAGE_SIZE:10485760}
plugin.toolkit.log.grpc.reporter.upstream_timeout=${SW_GRPC_LOG_GRPC_UPSTREAM_TIMEOUT:30}

其中server_host为SkyWalking server端地址。 重启A服务后,即可看到A服务的日志信息。在追踪中也查看跨度的相关日志信息了。

告警

SkyWalking通过Webhook配置告警,在Server端alarm-settings.yml文件中配置具体的告警策略及要推送的WebHook。

--告警策略示例--
rules:
  # Rule unique name, must be ended with `_rule`.
  service_resp_time_rule:
    metrics-name: service_resp_time
    op: ">"
    threshold: 1000
    period: 10
    count: 3
    silence-period: 5
    message: 过去十分钟内有3分钟服务 {name} 平均响应时间超过1秒
  • Rule name: 规则名称,也是在告警信息中显示的唯一名称。必须以_rule结尾,前缀可自定义
  • Metrics name: 度量名称,取值为oal文件夹下脚本中的度量名,目前只支持longdoubleint类型。详见Official OAL script
  • Include names: 该规则作用于哪些实体名称,比如服务名,终端名(可选,默认为全部)
  • Exclude names: 该规则作不用于哪些实体名称,比如服务名,终端名(可选,默认为空)
  • Threshold: 阈值
  • OP: 操作符,目前支持 &gt;&lt;=
  • Period: 多久告警规则需要被核实一下。这是一个时间窗口,与后端部署环境时间相匹配
  • Count: 在一个Period窗口中,如果values超过Threshold值(按op),达到Count值,需要发送警报
  • Silence period: 在时间N中触发报警后,在TN -> TN + period这个阶段不告警。 默认情况下,它和Period一样,这意味着相同的告警(在同一个Metrics name拥有相同的Id)在同一个Period内只会触发一次
  • message: 告警消息

配置告警规则后,即可看到规则对应的告警信息。如要实现推送钉钉,企业微信等,则还需配置对应的WebHook。