文章目录

  • 一、前言
  • 二、指标术语解释
  • 三、指标盘界面通识
  • 四、各指标模块介绍
    • 4.1【仪表盘】模块
      • 4.1.1 APM监控
        • 4.1.1.1 APM - Global
        • 4.1.1.2 APM - Service
        • 4.1.1.3 APM - Instance
        • 4.1.1.4 APM - EndPoint
      • 4.1.2 DataBase监控
      • 4.1.3 SelfObservability监控
    • 4.2【拓扑图】模块
      • 4.2.1 拓扑图的功能区
      • 4.2.2 实例信息面板
        • A. 服务调用追踪
        • B. 通向告警面板
        • C. 通向追踪面板
        • D. 通向服务实例性能监控面板
        • E. 通向EndPoint性能监控面板
    • 4.3【追踪】模块
      • 4.3.1 链路追踪详细说明
      • 4.3.2 链路追踪相关术语
        • 4.3.2.1 Trace
        • 4.3.2.2 TraceSegment
        • 4.3.2.3 Span
      • 4.3.3 链路追踪中自身耗时和总耗时分析
    • 4.4 【性能剖析】模块
      • Step1、新建任务
      • Step2、执行分析:
      • Step3、性能剖析
    • 4.5 【日志】模块
      • 4.5.1 服务如何对接skywalking日志集成系统?
        • 4.5.1.1 添加依赖
        • 4.5.1.2 修改日志配置文件
        • 4.5.1.3 日志集成到OAP系统后查看
        • 4.5.1.4 各日志框架下配置完整样例
    • 4.6 【告警】模块
      • 4.6.1 默认告警规则
      • 4.6.2 告警规则属性及其含义
      • 4.6.3 自定义告警功能
        • 4.6.3.1 创建controller
        • 4.6.3.2 修改alarm-settings.yml配置
    • 4.7 【事件】模块
  • 五、自定义链路追踪
    • step1、引入依赖
    • step2、@Trace注解
    • step3、@Tag或@Tags注解
  • 最后

一、前言

基于skywalking 8.9.0版本,为大家提供UI使用攻略,帮助大家快速理解各项指标及其含义。

二、指标术语解释

Apdex:应用性能指数,Apdex(Application Performance Index)是一个国际通用标准,Apdex 是用户对应用性能满意度的量化值,供了一个统一的测量和报告用户体验的方法,把最终用户的体验和应用性能作为一个完整的指标进行统一度量,其中最高为1最低为0;
ResponseTime:响应时间,即在选定时间内,服务所有请求的平均响应时间(ms);
Throughput:吞吐量,即在选定时间内,每分钟服务响应的请求量;
SLA:服务等级协议(Service Level Agreement),SW中指每分钟内请求响应成功的占比;
PPM:Packets Per Minute,特指TCP服务,每分钟收发包数;
CPM:Calls Per Minute,即每分钟请求数;
APM:Application Performance Monitor,应用程序性能监控工具;
OAP:Observability Analysis Platform,可观测性分析平台;
OAL:Observability Analysis Language,是一门用来分析流式数据的语言,主要聚焦于度量 Service 、 Service Instance 和 Endpoint 的指标。OAL 基于 altlr 与 javassist 将 oal 脚本转化为动态生成的类文件;
Service:表示对请求提供相同行为的一组工作负载;
Instance:一组工作负载中的每一个工作负载称为一个实例。一个服务实例可以理解为操作系统上的一个真实进程;
Endpoint:端点,即对于特定服务所接收的请求路径,如HTTP请求的URI路径、gRPC服务的类名+方法签名;

三、指标盘界面通识

仪表盘:提供全局(Global)、当前服务(Service)、当前实例(Instance)、当前端点(Endpoint )几个维度的运行状态和监控指标;
拓扑图:以拓扑图的方式展现服务之间的依赖关系,并且可以以此为入口查看告警、调用链、服务状态等信息;
追踪:以接口列表的方式展现,追踪接口内部调用过程,可以通过 traceid 查询,进行分布式集群的日志查看及问题排查;
性能剖析:对某个服务的某个具体端点进行采样分析,并且可查看到详细的堆栈信息;
日志:提供查看日志功能,包括了 browser 与 service 日志集合。这个功能需要在业务项目中接入Skywalking的日志系统才会在这显示日志信息,成功接入日志后,我们就可以根据 追踪ID 进行跨服务整体流程日志的追踪;
告警:展示触发了告警的告警列表,包括实例、请求超时等信息;
事件:展示服务实例的启动和服务端点的调用等事件信息;
调试:此功能模块目前还没使用过,后续再做补充;
时间区:用来设定统计指标的时间域,所有的指标数据展示都依赖于这个时间范围;
刷新:点击自动按钮,可以开启自动刷新模式。

另外,在Skywalking UI上G3服务都是以前缀“G3_”开头,如:

四、各指标模块介绍

4.1【仪表盘】模块

仪表盘模块下的 APM和Database两大维度,各项指标的英文含义已对照着官方为大家翻译成了中文,方便大家理解。但是,切指标图的时候把中文翻译版和英文原版都贴出来了,大家可以对照着参考。

4.1.1 APM监控

4.1.1.1 APM - Global

1)各指标英文名称:

2)各指标对应的中文含义:

4.1.1.2 APM - Service

1)各指标英文名称:

2)各指标对应的中文含义:

4.1.1.3 APM - Instance

1)各指标英文名称:

2)各指标对应的中文含义:

4.1.1.4 APM - EndPoint

1)各指标英文名称:

2)各指标对应的中文含义:

4.1.2 DataBase监控

1)各指标英文名称:

2)各指标对应的中文含义:

4.1.3 SelfObservability监控

该指标为SkywalkingOAP服务自我监控指标,包括对CPU的占比、内存占用大小、垃圾回收次数和耗时、每分钟链路收集量和每分钟数据聚合量等等,此项指标的监控大家无需关心,了解下即可。

4.2【拓扑图】模块


拓扑图展示服务之间的调用依赖关系,当服务可用率低的时候服务会显示为红色。除此之外,拓扑图还能查看服务运行信息进行度量,包括开发框架类型、服务平均响应时间、吞吐量、百分比响应、Apdex分值、SLA值等。

4.2.1 拓扑图的功能区

1. All Groups:选择服务组。提供服务组的任意子拓扑功能,但是分组的信息是保存在浏览器内的;
2. All Services:选择服务。支持显示直接关系,包括上游和下游;建议大家选择具体的服务查看,加载全部的话会很慢且有点卡顿。
3. Create Group:创建新的服务组。
4. 服务引用拓扑图:展示服务之间的调用关系,以及服务器的健康状态。点击任何小方格会显示该服务的菜单,可以查看服务详情,该图形还可以对所选择的服务进行度量、跟踪和告警查询。
5. 服务指标的关系虚线:提供服务RPC交互的度量以及这两个服务的实例。点击小圆点,会显示调用信息、调用次数、延迟时间。

Tips

  • 鼠标单机,可以随意拉动拓扑图位置;
  • 鼠标选中小方格,也可以随意拉动;
  • 双击或拖动鼠标滚轮(MAC通过双指)可放大、缩小拓扑区域;

4.2.2 实例信息面板

A. 服务调用追踪


  • 当前服务:可选择具体服务
  • 当前端点:可选择具体端点
  • 当前深度:可以选择展示的调用深度

Tips: 滑动指向连接线,点击后可以出现以下指标:

  1. 平均响应时间
  2. 平均吞吐量
  3. 平均SLA
  4. 相应百分比

说明:其实部分功能都是可以在其他地方看见的,只是这里多了一个全局调用链深度展示的功能。

B. 通向告警面板

C. 通向追踪面板

D. 通向服务实例性能监控面板

E. 通向EndPoint性能监控面板

4.3【追踪】模块

我们可以使用trace功能进行链路追踪,查看每个接口的调用链,链路中每个步骤的耗时、状态,并且可以看到请求都走了那些服务中间件。如果调用失败会展示错误信息;如果是数据库会展示查询语句;如果是Redis还会展示操作指令等。另外可以根据追踪ID和标记关键词进行条件筛选。

1. 这一部分筛选条件:选择服务、实例、状态(error、success)、端点。
2. 追踪ID: 可以根据 traceId 获取整个监控平台下相同 traceId的分布式集群的日志查看。
3. 时间范围: 选择日志时间范围。
4. 红色点大家应该都看见了,就是整个链路中报错的位置。点击后可以弹出相对应的异常信息。

4.3.1 链路追踪详细说明

上图标1的区域,Trace列表中每一行都是一个分布式链路追踪树;
上图标2的区域,可以选择trace链路追踪列表的排序方式。按访问时间或链路持续时间(链路总耗时)倒序排列;
上图标3的区域,表示请求链路跨越的服务都是有哪些。每个服务都是链路的一个TraceSegment;
上图标4的区域,表示当前TraceSegment的所有Span元素。每一行都是一个span,鼠标悬浮每个span上面会显示当前span操作的自身耗时和它下面子span的所有总耗时;点击每个span行,在左侧会弹出详细的跨度信息。
上图标5的区域,列出了选择查看链路追踪信息的几种方式。

4.3.2 链路追踪相关术语

这里给大家简单介绍一下链路追踪中涉及到的几个Skywalking术语,感兴趣的可以了解下。

4.3.2.1 Trace

上图左侧列表,每一行都是一个trace,即链路追踪树。可以根据据图服务的具体端点筛选,然后按照开始时间或持续时间排列。

4.3.2.2 TraceSegment

TraceSegment是和线程绑定的,代表一个JVM进程的一个线程内的所有操作。分布式链路追踪基本上都要跨多个进程或者线程执行,实际上它的追踪树(Trace)就是由一个或多个TraceSegment组成。

4.3.2.3 Span

组成TraceSegment的基本元素,有三种类型,分别为EntrySpan、LocalSpan、ExitSpan。

1. EntrySpan表示服务提供者点(即服务调用方调用目标服务时,线程即将进入目标服务的入口点),例如Tomcat服务器入口、Apsaras调用入口、RabbitMQ消息队列等都是EntrySpan。EntrySpan是TraceSegment的起点(即第一个Span),即使在一个复杂的应用程序中可能有多个入口点,但是EntrySpan只表示第一个,这也是为什么称为"入口"Span的原因。可以把entryspan简单理解为进程|线程开始准备进入目标服务的操作;
2. ExitSpan表示一个服务消费者点(即服务调用方调用目标服务时,线程即将离开调用方所在服务的出口点),例如FeignClient、HttpClient、通过JDBC访问DB、读取Redis等都属于ExitSpan。它是一条链路追踪树的一个出口点。在单个rpc调用中,由于调用可能会跨多个服务,所以可能包含多个出口点,但是exitspan只会展示第一个。可以把exitspan简单理解为离开当前进程|线程的操作;
3. LocalSpan表示一种普通的Java方法,如本地方法。它与远程服务无关。它既不是MQ的生产者/消费者,也不是服务(如HTTP服务)provider/consumer。

4.3.3 链路追踪中自身耗时和总耗时分析

参见:Skywalking链路追踪自身耗时和总耗时算法分析

4.4 【性能剖析】模块

【追踪】功能展示出的跨度是服务调用粒度的,如果要看应用实时的堆栈信息,可以选择性能剖析功能。Skywalking 在性能剖析方面非常强大,提供到基于堆栈的分析结果,能够让开发人员看到调用过程中各个步骤所消耗的时间,以便有针对性的进行优化。如果发现某个端点耗时很长,又不知道具体耗时点在哪里,可以借助此模块进行堆栈分析。

性能剖析主要的工作就是通过新建任务、对不同的端点进行采样,然后提供一个更加详细的分析报告。它比链路追踪多了线程栈信息、慢方法提示等内容。

  1. Task List:任务列表
  2. 新建任务:创建一个性能剖析的任务。
  3. Sampled Traces:性能采样列表,最多展示的条数为创建任务时设置的最大采样数。

接下来我们就介绍下怎么进行性能剖析。

Step1、新建任务

在性能剖析模块 -> 新建任务 -> 选择服务、填写端点、监控时间等,如下图:

创建好任务后,Skywalking将开始采集应用端点的实时堆栈信息。并且采样结束后,用户点击分析即可查看具体的堆栈信息。

Step2、执行分析:

选定的服务和端点作为分析对象,多次访问dhgate-review-service_prod-jxq-r服务的 “POST:/com.dhgate.review.api.ReviewOpenService/loadReviewsBySupplieridNew” 接口,然后选择这个任务将会出现监控到的数据,如下图:

注意:
1、每个服务,相同时间只能添加一个任务,且添加的任务不能更改也不能删除,只能等待过期后自动删除。
2、需要连续执行多次请求,因为存在采样设置。如果执行次数少,可能不会出现采样数据,也就无法进行分析了。

Step3、性能剖析


上图可以看出,“POST:/com.dhgate.review.api.ReviewOpenService/loadReviewsBySupplieridNew” 接口耗费了474ms,通过分析详细堆栈信息,我们可以看到耗时最多的操作就是com.dhgate.review.impl.ReviewOpenServiceImpl 类的loadReviewsBySupplieridNew()方法,耗费了264ms,如下图所示:

所以性能剖析对于我们解决慢接口慢响应到底哪里耗时,是非常有帮助的。

4.5 【日志】模块

日志界面提供了查看客户端和服务端日志的功能,默认是没有数据的,需要在项目中接入sw的日志系统才会在这显示出日志信息。成功接入日志后,我们就可以根据追踪ID进行跨服务整体流程日志的追踪。

4.5.1 服务如何对接skywalking日志集成系统?

官方参考文档:
1)log4j2日志框架接入:
https://github.com/apache/skywalking-java/blob/20fb8c81b3da76ba6628d34c12d23d3d45c973ef/docs/en/setup/service-agent/java-agent/Application-toolkit-log4j-2.x.md
2)logback日志框架接入:
https://github.com/apache/skywalking-java/blob/20fb8c81b3da76ba6628d34c12d23d3d45c973ef/docs/en/setup/service-agent/java-agent/Application-toolkit-logback-1.x.md
3)log4j日志框架接入:
https://github.com/apache/skywalking-java/blob/20fb8c81b3da76ba6628d34c12d23d3d45c973ef/docs/en/setup/service-agent/java-agent/Application-toolkit-log4j-1.x.md

以G4工程使用的logback日志框架为例,配置步骤如下:

4.5.1.1 添加依赖

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

4.5.1.2 修改日志配置文件

在 logback-spring.xml 配置文件中:
1)日志输出中加上打印Skywalking的traceId格式:

<appender name="STDOUT-SW" class="ch.qos.logback.core.ConsoleAppender"><encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder"><layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.mdc.TraceIdMDCPatternLogbackLayout"><!--添加一个%X{tid},即可在控制台打印出traceId--><Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%X{tid}] [%thread] %-5level %logger{36} -%msg%n</Pattern></layout></encoder>
</appender>

2)添加服务日志传输到Skywalking OAP系统的appender:

<!--添加grpc界面集成:日志传输到Skywalking的appender,通过gRPC传输-->
<appender name="GRPC-SW" class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.log.GRPCLogClientAppender"><encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder"><layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.mdc.TraceIdMDCPatternLogbackLayout"><Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%X{tid}] [%thread] %-5level %logger{36} -%msg%n</Pattern></layout></encoder>
</appender>

3)把需要上报到skywalking系统的日志appender,添加到多环境日志输出配置里

<springProfile name="qa"><root level="${level}"><!--日志信息同步输出--><appender-ref ref="STDOUT"/><!--开启日志输出到skywalking系统--><appender-ref ref="STDOUT-SW"/><appender-ref ref="GRPC-SW"/></root>
</springProfile>

只需要在日志配置文件中添加以上这些配置,即可实现服务日志接入到Skywalking系统!

当然,也支持日志异步上报到sw系统,主要配置如下:

<configuration scan="true" scanPeriod=" 5 seconds"><appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"><encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder"><layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.mdc.TraceIdMDCPatternLogbackLayout"><Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%X{tid}] [%thread] %-5level %logger{36} -%msg%n</Pattern></layout></encoder></appender><appender name="ASYNC" class="ch.qos.logback.classic.AsyncAppender"><discardingThreshold>0</discardingThreshold><queueSize>1024</queueSize><neverBlock>true</neverBlock><appender-ref ref="STDOUT"/></appender><root level="INFO"><appender-ref ref="ASYNC"/></root>
</configuration>

4.5.1.3 日志集成到OAP系统后查看

如下图,我们的服务日志成功集成到Skywalking OAP系统的话,启动服务可以在日志输出中看到“[TID:N/A]”的标识,其含义:当使用’ -javaagent '来激活SkyWalking探针时,如果探针成功激活,日志返回将输出traceId。如果探针未被注入或tracer不活跃,日志将会输出:TID: N/A


输出的日志中可以看到已经打印出了traceId。

skywalking中的日志模块输出的日志如下图:


可以看到日志已经传输到了skywalking中…

注意:如果agent和oap服务不在同一台服务器上,在/agent/config/agent.config配置文件末尾需要添加如下配置:

plugin.toolkit.log.grpc.reporter.server_host=OAP服务地址
plugin.toolkit.log.grpc.reporter.server_port=11800
plugin.toolkit.log.grpc.reporter.max_message_size=10485760
plugin.toolkit.log.grpc.reporter.upstream_timeout=30

4.5.1.4 各日志框架下配置完整样例

1、log4j.properties

log4j.rootLogger=info,CustomAppender
log4j.appender.CustomAppender=org.apache.skywalking.apm.toolkit.log.log4j.v1.x.log.GRPCLogClientAppender
log4j.appender.CustomAppender.layout=org.apache.log4j.PatternLayout
log4j.appender.CustomAppender.layout.ConversionPattern=[%t] %-5p %c %x - %m%nlog4j.logger.fileLogger=info,FileAppender
log4j.appender.FileAppender=org.apache.log4j.FileAppender
log4j.appender.FileAppender.ImmediateFlush=true
log4j.appender.FileAppender.Append=true
log4j.appender.FileAppender.File=/tmp/skywalking-logs/log4j1/e2e-service-provider.log
log4j.appender.FileAppender.layout=org.apache.skywalking.apm.toolkit.log.log4j.v1.x.TraceIdPatternLayout
log4j.appender.FileAppender.layout.ConversionPattern=[%T{SW_CTX}] [%p] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c:%L - %m%n

2、log4j2.xml

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN"><Appenders><Console name="Console" target="SYSTEM_OUT"><PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/></Console><GRPCLogClientAppender name="grpc-log"><PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/></GRPCLogClientAppender><RandomAccessFile name="fileAppender" fileName="/tmp/skywalking-logs/log4j2/e2e-service-provider.log" immediateFlush="true" append="true"><PatternLayout><Pattern>[%sw_ctx] [%p] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c:%L - %m%n</Pattern></PatternLayout></RandomAccessFile></Appenders><Loggers><Root level="info"><AppenderRef ref="Console"/><AppenderRef ref="grpc-log"/></Root><Logger name="fileLogger" level="info" additivity="false"><AppenderRef ref="fileAppender"/></Logger></Loggers>
</Configuration>

3、logback.xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod=" 5 seconds"><appender name="stdout" class="ch.qos.logback.core.ConsoleAppender"><encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder"><layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.mdc.TraceIdMDCPatternLogbackLayout"><!--添加一个%X{tid},即可在控制台打印出traceId--><Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%X{tid}] [%thread] %-5level %logger{36} -%msg%n</Pattern></layout></encoder></appender><appender name="grpc-log" class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.log.GRPCLogClientAppender"><encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder"><layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.mdc.TraceIdMDCPatternLogbackLayout"><Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%X{tid}] [%thread] %-5level %logger{36} -%msg%n</Pattern></layout></encoder></appender><appender name="fileAppender" class="ch.qos.logback.core.FileAppender"><file>/tmp/skywalking-logs/logback/e2e-service-provider.log</file><encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder"><layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.TraceIdPatternLogbackLayout"><Pattern>[%sw_ctx] [%level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %logger:%line - %msg%n</Pattern></layout></encoder></appender><root level="INFO"><appender-ref ref="grpc-log"/><appender-ref ref="stdout"/></root><logger name="fileLogger" level="INFO"><appender-ref ref="fileAppender"/></logger>
</configuration>

4.6 【告警】模块

对于服务的异常信息,比如接口有较长延迟,skywalking也做出了告警功能,如下图:

界面提供查看告警记录功能:

  • 过滤范围,可以按照一下几个维度进行过滤
    – 服务
    – 服务实例
    – 端点
    – 服务关系
    – 服务实例关系
    – 服务端点关系
  • 关键字
  • 标签

4.6.1 默认告警规则

Skywalking中有一些默认的告警规则,如下:

  • 最近3分钟内服务的平均响应时间超过1秒
  • 最近2分钟服务成功率低于80%
  • 最近3分钟90%服务响应时间超过1秒
  • 最近2分钟内服务实例的平均响应时间超过1秒

当然除了以上四种,随着Skywalking不断迭代也会新增其他规则,这些规则的配置在config/alarm-settings.yml配置文件中,如下:

# Sample alarm rules.
rules:# Rule unique name, must be ended with `_rule`.service_resp_time_rule:metrics-name: service_resp_timeop: ">"threshold: 1000period: 10count: 3silence-period: 5message: Response time of service {name} is more than 1000ms in 3 minutes of last 10 minutes.service_sla_rule:# Metrics value need to be long, double or intmetrics-name: service_slaop: "<"threshold: 8000# The length of time to evaluate the metricsperiod: 10# How many times after the metrics match the condition, will trigger alarmcount: 2# How many times of checks, the alarm keeps silence after alarm triggered, default as same as period.silence-period: 3message: Successful rate of service {name} is lower than 80% in 2 minutes of last 10 minutesservice_resp_time_percentile_rule:# Metrics value need to be long, double or intmetrics-name: service_percentileop: ">"threshold: 1000,1000,1000,1000,1000period: 10count: 3silence-period: 5message: Percentile response time of service {name} alarm in 3 minutes of last 10 minutes, due to more than one condition of p50 > 1000, p75 > 1000, p90 > 1000, p95 > 1000, p99 > 1000service_instance_resp_time_rule:metrics-name: service_instance_resp_timeop: ">"threshold: 1000period: 10count: 2silence-period: 5message: Response time of service instance {name} is more than 1000ms in 2 minutes of last 10 minutesdatabase_access_resp_time_rule:metrics-name: database_access_resp_timethreshold: 1000op: ">"period: 10count: 2message: Response time of database access {name} is more than 1000ms in 2 minutes of last 10 minutesendpoint_relation_resp_time_rule:metrics-name: endpoint_relation_resp_timethreshold: 1000op: ">"period: 10count: 2message: Response time of endpoint relation {name} is more than 1000ms in 2 minutes of last 10 minutes
#  Active endpoint related metrics alarm will cost more memory than service and service instance metrics alarm.
#  Because the number of endpoint is much more than service and instance.
#
#  endpoint_avg_rule:
#    metrics-name: endpoint_avg
#    op: ">"
#    threshold: 1000
#    period: 10
#    count: 2
#    silence-period: 5
#    message: Response time of endpoint {name} is more than 1000ms in 2 minutes of last 10 minuteswebhooks:
#  - http://127.0.0.1/notify/
#  - http://127.0.0.1/go-wechat/

4.6.2 告警规则属性及其含义

每个规则都由相同的属性组成,这些属性的含义如下图:

如果想要调整默认的规则,比如监控返回的信息,监控的参数等等,只需要改动上述配置文件中的参数即可。当然除了以上默认的几种规则,Skywalking还适配了一些钩子(webhooks),其实就是相当于一个回调函数,一旦触发了上述或自定义规则告警,Skywalking则会调用配置的webhook钩子函数,这样我们就可以定制一些处理方法,比如发送邮件、微信、飞书等通知运维或开发人员处理。

钩子函数的开发有如下三点要求:

  • POST请求;
  • application/json 格式接收数据;
  • 入参格式必须按照 {@link AlarmMessage} 中指定的属性规则定义;

org.apache.skywalking.oap.server.core.alarm.AlarmMessage类的属性,如下图:

4.6.3 自定义告警功能

如何在业务工程中开发自定义监控告警呢?

4.6.3.1 创建controller
package com.dhgate.controller;import com.alibaba.fastjson.JSON;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.experimental.Accessors;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.CollectionUtils;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;@Slf4j
@RestController
@RequestMapping("sw/alarm")
public class AlarmMessageController {// 保存从oap接收到的所有告警信息private List<AlarmMessage> alarmMessages = new ArrayList<AlarmMessage>();/*** Skywalking告警回调方法:一旦触发告警,则会调用这个接口** @param list 指定的参数,必须按照 {@link AlarmMessage} 属性规则定义*/@PostMapping("/doAlarm")public void receiveAlarmMessage(@RequestBody List<AlarmMessage> list) {// 告警信息放入alarmMessages集合log.info("自定义告警发送信息:" + JSON.toJSON(list));alarmMessages.addAll(list);// TODO 实现发邮件、微信、飞书通知的业务需求// ......}/*** 读取告警信息** @return*/@PostMapping("/read")public Alarms readMessages() {return Alarms.builder().messages(alarmMessages).build();}/*** Alarm message represents the details of each alarm.*/@Setter@Getter@NoArgsConstructorpublic static class AlarmMessage {private int scopeId;private String scope;private String name;private String id0;private String id1;private String ruleName;private String alarmMessage;private long startTime;private List<KeyValue> tags;}@Getter@Setter@EqualsAndHashCode@NoArgsConstructor@AllArgsConstructor@Data@Accessors(chain = true)public static class KeyValue {private String key;private String value;@Overridepublic String toString() {return key + "=" + value;}public static class Util {public static List<String> toStringList(List<KeyValue> list) {if (CollectionUtils.isEmpty(list)) {return Collections.emptyList();}return list.stream().map(KeyValue::toString).collect(Collectors.toList());}}}/*** Alarm wrapper*/@Data@Builder@NoArgsConstructor@AllArgsConstructorpublic static class Alarms {private List<AlarmMessage> messages;}}
4.6.3.2 修改alarm-settings.yml配置

接口定制完成后,在apache-skywalking-apm-8.9.1/dist-material/alarm-settings.yml配置文件中添加上这个钩子的回调:

webhooks:# 本地测试,生产环境需要配置正确的ip:port- http://127.0.0.1:7997/sw/alarm/doAlarm/

这里需要大家注意的是:自定义告警的钩子函数功能,如果有需求,需要联系架构组统一定制,不建议自己开发。

4.7 【事件】模块

该模块会展示一些如服务启动、告警信息等事件。也包括实例、端点请求超时等信息。

五、自定义链路追踪

Skywalking的调用链路中,记录的一般都是服务中对外暴露的接口URL,比如带有注解@RequestMapping、@PostMapping、@GetMapping的方法。那如果我们希望追踪链路中能记录到服务中Service层的业务方法,以便于我们更加方便地排查问题。那么该怎么实现呢?

step1、引入依赖

<!--skywalking自定义链路追踪使用的工具类依赖-->
<dependency><groupId>org.apache.skywalking</groupId><artifactId>apm-toolkit-trace</artifactId><version>8.9.0</version>
</dependency>

step2、@Trace注解

如果一个业务方法,想要在UI界面的追踪链路上显示出来,只需要在业务方法上加上@Trace注解即可。

step3、@Tag或@Tags注解

我们还可以为自定义追踪链路添加其他额外的信息,比如记录参数和返回值信息。
实现方式:在方法上增加 @Tag 或 @Tags 注解。其中@Tags注解是@Tag的包装,以允许对单个方法span设置多个标记:

import com.dhgate.disputeg3test.dao.TdRefundBeforeDao;
import com.dhgate.disputeg3test.po.TdRfxRefundBefore;
import com.dhgate.framework.service.service.impl.AbstractGenericServiceImpl;
import org.apache.skywalking.apm.toolkit.trace.Tag;
import org.apache.skywalking.apm.toolkit.trace.Tags;
import org.apache.skywalking.apm.toolkit.trace.Trace;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;@Service
public class RefundBeforeBean extends AbstractGenericServiceImpl {@AutowiredTdRefundBeforeDao tdRefundBeforeDao;// 加入@Trace注解,就把当前的业务方法也加入到追踪链路中@Trace// 为当前业务方法设置返回值标签,key="方法返回值标签名",value="returnedObj"// @Tag(key = "queryRefundBefore", value = "returnedObj")@Tags({@Tag(key = "返回值", value = "returnedObj"),// 指定返回值@Tag(key = "参数值", value = "arg[0]") // 指定参数})public TdRfxRefundBefore queryRefundBefore(String rfxid) {return tdRefundBeforeDao.getTdRfxRefundBefore(rfxid);}
}

注意:
1)使用@Tag或@Tags注解实现方法返回值的时候,返回值一定要实现toString()方法;
2)使用@Tag或@Tags注解的时候,前提一定要有@Trace注解,单独使用没有作用。

最后

PDF文档下载:Skywalking UI使用攻略

Skywalking UI使用攻略相关推荐

  1. UI设计中个人页面设计攻略

    最近刚做完一个项目,我发现我的设计效率相比之前竟然提升了30%以上,在以前做界面时总是会纠结采用什么样式,什么布局.而现在再看了原型之后就大概知道我要怎么做了,没有了以前做页面时的纠结,效率自然提升了 ...

  2. UI设计中配色设计攻略

    不知道有没有小伙伴跟我一样在做页面配色时会很痛苦呢,很多时候都是凭感觉去配色.最近研究了一下配色方法,今天我就针对UI设计中配色设计攻略进行简单的说明,希望能帮助到一部分小伙伴. 有个有趣的研究成果 ...

  3. UI设计行业中的“延禧攻略”,教你从青铜变王者

    最近一直在追<延禧攻略>,女主魏璎珞敢爱敢恨,有仇必报的性格吸引不少人,她从低贱的秀坊小宫女步步为营,最终成为皇帝最宠爱的令妃呼风唤雨.尔虞我诈的后宫,想要打怪升级光有颜值是万万不够的,更 ...

  4. 程序员练级攻略(2018):前端 UI/UX设计

    这个是我订阅 陈皓老师在极客上的专栏<左耳听风>,我整理出来是为了自己方便学习,同时也分享给你们一起学习,当然如果有兴趣,可以去订阅,为了避免广告嫌疑,我这就不多说了!以下第一人称是指陈皓 ...

  5. 【CocosCreator 3.x】使用 RenderTexture 实现 3D 渲染在 UI 上 => 攻略

    前言 目前在 Cocos Creator 实现 3D 渲染在 UI上的常用方法有2种,使用 UIMeshRenderer 组件 和 使用 RenderTexture . 介绍 RenderTextur ...

  6. http状态404 vscode_VS Code 调试完全攻略(5):基于浏览器的 React 应用

    每日前端夜话第344篇 翻译:疯狂的技术宅 作者:Charles Szilagyi 来源:charlesagile 正文共:1750 字 预计阅读时间:7 分钟 这次我们来研究怎样把调试器连接到用 C ...

  7. [转]程序员技术练级攻略

    2019独角兽企业重金招聘Python工程师标准>>> 月光博客6月12日发表了<写给新手程序员的一封信>,翻译自<An open letter to those ...

  8. 清华学长请授接口自动化测试进阶攻略

    为什么要做接口自动化 相对于UI自动化而言,接口自动化具有更大的价值. 为了优化转化路径或者提升用户体验,APP/web界面的按钮控件和布局几乎每个版本都会发生一次变化,导致自动化的代码频繁变更,没有 ...

  9. silverlight,WPF动画终极攻略之白云飘,坐车去旅游篇(Blend 4开发)

    原文:silverlight,WPF动画终极攻略之白云飘,坐车去旅游篇(Blend 4开发) 这章有点长,所以我分成了两章.这一章主要是准备工作,差不多算美工篇吧,这章基本不会介绍多少动画效果,主要讲 ...

最新文章

  1. Linux shell 学习笔记(5)— 文件权限(添加、修改、删除用户及创建、修改群组)
  2. Linux下首次操作MySQL失败
  3. 微软项目管理[EPM]数据库应用举例2: 取得一个项目的某大纲代码的值
  4. 有限元笔记05——板单元(4节点12自由度)和壳单元(4节点24自由度)
  5. Qt工作笔记-QGraphics重设场景坐标【标签:Qt图形框架】
  6. 将springboot打包成的jar文件做成windows服务
  7. 网络驱动器映射成功但无法实时更新文件需要重新连接_无边界办公——WebDAV文件共享服务构建...
  8. UG NX 12 内部草图和外部草图的区别
  9. PC端用Itunes备份Iphone时修改备份路径的办法
  10. c++快速傅里叶变换、反变换(FFT、IFFT)
  11. 古老而神秘的龙泉寺,缘何成为互联网圈里的圣地
  12. 计算机考研评分标准,考研复试评分标准来啦!
  13. 知识点小记——广播地址与有限广播地址
  14. Selenium学习 - ActionChains接口
  15. 数据结构-栈(Stack)-定义与基本操作
  16. win7防火墙端口开放
  17. 深度学习入门:基于Python的理论与实现①
  18. Provision,webservice怎么接收dsmp发过来的包?
  19. Pintia公共子串查找
  20. vue点击input弹出带搜索键盘并监听该元素

热门文章

  1. 深度Linux桌面图标,图标推荐 Deepin plus 所有图标集
  2. Vue2.0开发之——购物车案例-Footer组件封装-计算商品的总价格(51)
  3. android qq登录分析,[原创]对QQ手游授权登录的一点分析
  4. Qt开发学生信息管理系统
  5. neo4j java json_如何将Neo4j JSON转换为Java Object
  6. 《基于Python的大数据分析基础及实战》第一章
  7. 移植boa服务器和错误指南
  8. 用layui创建表格
  9. Rime默认为英文状态
  10. git commit 错误:On branch main Changes not staged for commit: