Skywalking告警配置

背景

  • skywalking 9.7.0,地址:Backend setup | Apache SkyWalking

  • helm:skywalking-helm:4.5.0,地址:skywalking-helm/chart/skywalking/values.yaml at v4.5.0

首先来说一下为什么使用skywalking告警?

在我们目前的架构体系中:

  • prometheus:通过node exporter监控硬件级的监控,通过grafana来做告警(注意:grafana仅部分图支持告警)

    当然也可以监控业务级别的,但是这些指标需要业务人员提供,而业务人员又需要额外开发自定义指标,是一种双向配合的方式,比较麻烦

  • ELK:通过日志埋点,在grafana配置ES数据源,通过捕获关键字类型,从而到达一种监控告警,但是这种局限很明显,需要将业务数据采集到es里面,不够方便快捷

目前时间比较紧,开发人员较少,再加上我们已经使用上了skywalking,需要快速告警下面几个指标:

  • 接口成功率;
  • 接口响应时间;
  • 响应时间百分比

等等一些指标,来保证我们系统的稳定性,

由于上述指标对于skywalking都是现成的,想快速实现我们的需求,所以打算先通过skywalking告警来实现我们的需求

但这对于专业的监控告警系统,这样做不太好,因为告警的应该统一收口,在一个地方来配置,比如grafana;

因为告警的本质是通过采集日志,然后通过这些日志来进行定制告警,后续可以进行优化,这些不是本文章的主题

实践

k8s部署skywalking看看这个:k8s部署skywalking(helm)

本地实践的话,需要去官方下载一个APM,地址:Downloads | Apache SkyWalking
9.7.0本地玩的话,默认配置是JDK17哈,各位校验一下自己的Java环境

注意,这里的告警是在skywalking-oap服务端的,不是客户端哈

在这里插入图片描述

告警配置属性

告警模块相关配置文件路径:

在这里插入图片描述

打开之后官方默认了一些规则,官方查看:Alerting | Apache SkyWalking

接下来来解释一些这些属性的含义

Rule name:规则名称。需要保证唯一,必须以 _rule 结尾

Expression:告警表达式。

Include names:告警规则生效包含的实体名列表。本质是一个array,可以配置多个,但需要注意的是,这个是全匹配

我们在集成 Agent 的时候,一般都会设置 Service group。举个栗子: SW_AGENT_NAMESPACE:"dev" SW_AGENT_NAME:"dev::example-name" 当我这样定义时,service name 应该写成 dev::example-name|dev|,参考:Table of Agent Configuration Properties | Apache SkyWalking

Exclude names:告警规则不生效包含的实体名列表,本质是一个array,可以配置多个,但需要注意的是,这个是全匹配

Include names regex:和 Include names 一样。只不过是正则表达式字符串

Exclude names regex:和 Exclude names 一样。只不过是正则表达式字符串

Tags:自定义的 k-v 对(这个目前感觉只是增加一个自定义的提示信息的)

Period:表达式计算结果的缓存时间,也可以理解为没隔多长时间采集一次数据;

Silence Period:静默时间。例如我有一个规则,1分钟会触发一次,当我把Silence Period配置为 3 时。那就是3分钟内,不会发送一次请求到 hook

Hooks:向外界发送通知的方式 ,本质上都是 WebHook。

告警表达式

以下列示例解释:

rules:# service_sla 代表的是服务响应成功率service_sla_rule:# sum(service_sla < 8000) 该表达式表示的是 服务的响应成功率低于80%的次数# >= 2 是关键,表达式每分钟算一次(这是我看了文档后猜的,应该没问题), 那这里就表示最近2分钟服务SLA都低于90%expression: sum(service_sla < 8000) >= 2# 字符串匹配写法include-names:- 'dev::example|dev|'# 正则写法:所有dev组的include-names-regex: '^dev::.*' # 表达式计算结果缓存时长,表达式每一分钟计算一次,我表达式中设置了>=2# 所以period 应该设置一个大于2的值,这样能避免重复计算period: 10# 静默时间,如果服务有10分钟SLA是低于90的,那么m2的时候会提醒。# 下一次本来是m3提醒的,我设置了2,所以等到m5再次计算表达式的时候才会在提醒silence-period: 3# 自定义 tags,key-value形式tags:level: ERROR# 告警文本,{name} 是内置变量,代表服务名称,本地实际测试还有一个id,用来表示告警id,用法{id}message: '服务{name}成功率小于100%'
hooks:webhook:default:# 是否默认is-default: true# 配置urlurls:- http://127.0.0.1/notify/- http://127.0.0.1/go-wechat/

实际例子

service维度

所有服务SLA在最近3分钟内小于100

service_success_rule:expression: sum((service_success / 100) < 100) >= 3period: 5silence-period: 5message: '服务 SLA 低于 100%'

prod分组下,所有服务SLA在最近3分钟小于100

service_success_rule:expression: sum((service_success / 100) < 100) >= 3include-names-regex: '^prod::.*'period: 5silence-period: 5message: '服务 SLA 低于 100%'
endpoint维度

endpoint跟service不同的是,它的规则为:

xxx接口   in   group::服务

单接口SLA在最近3分钟内小于100

endpoint_sla_rule:expression: sum((endpoint_sla / 100) < 100) >= 3include-names: - 'GET:/test/custom1 in dev::example|dev|'period: 5message: '此接口 SLA 低于 100%'

prod分组下,所有接口(排除指定接口)SLA在最近3分钟内小于100

endpoint_sla_rule:expression: sum((endpoint_sla / 100) < 100) >= 3exclude-names:- 'GET:/test/custom1 in dev::example|dev|'include-names-regex: '.* in prod::.*'period: 5message: '此接口 SLA 低于 100%'
DB维度

所有DB SLA 最近1分钟内小于100

database_access_sla_rule:expression: sum((database_access_sla / 100) < 100) >= 1period: 3message: 'DB SLA 低于 100%'

配置webhook

飞书
hooks:feishu:default:is-default: truetext-template: |{"msg_type":"text","content": {"text": "Apache SkyWalking Alarm: \n %s."}}webhooks:- url: https://open.feishu.cn/open-apis/bot/v2/hook/axxxxxxx

skywalking默认提供的指标

目前skywalking定义的指标存在与下列目录下,以*.oal为结尾的文件

在这里插入图片描述

部分指标释义如下:

code解释备注
service维度
service_resp_time服务的平均响应时间
service_sla服务的成功率
service_cpm服务每分钟调用次数
服务实例指标
service_instance_sla服务实例的成功率
service_instance_resp_time服务实例的平均响应时间
service_instance_cpm服务实例每分钟调用次数
endpoint维度
endpoint_cpm端点每分钟调用次数
endpoint_avg端点平均响应时间
endpoint_sla端点成功率
JVM 指标, JVM 相关的指标, 只有当 javaagent 启用时才有效
instance_jvm_cpu
instance_jvm_memory_heap
instance_jvm_memory_noheap
instance_jvm_memory_heap_max
instance_jvm_memory_noheap_max
instance_jvm_young_gc_time
instance_jvm_old_gc_time
instance_jvm_young_gc_count
instance_jvm_old_gc_count
服务关系指标, 代表服务之间调用的指标 指标的 ID 只能在拓扑图查询中获取
service_relation_client_cpm在客户端每分钟检测到的调用次数
service_relation_server_cpm在服务端每分钟检测到的调用次数
service_relation_client_call_sla在客户端检测到的成功率
service_relation_server_call_sla在服务端检测到的成功率
service_relation_client_resp_time在客户端检测到的平均响应时间
service_relation_server_resp_time在服务端检测到的平均响应时间
端点关系指标, 代表相互依赖的端点之间的指标. 只有在追踪代理启用时有效. 指标 ID 只能在拓扑查询中获得.
endpoint_relation_cpm
endpoint_relation_resp_time

拓展

skywalking什么类型的信息会触发报警

默认情况下,当你Http status为非200的时候,skywalking会识别到这是一个失败的请求;

在实际场景中,我们业务可能会遇到这种情况,就是响应码为200,但是项目中做了异常全局处理,这种情况应该告警的。针对这种情况,想要让skywalking不触发告警,需要使用ActiveSpan.error()

引入pom

<dependency><groupId>org.apache.skywalking</groupId><artifactId>apm-toolkit-trace</artifactId><version>9.2.0</version>
</dependency>

示例代码:

import org.apache.skywalking.apm.toolkit.trace.ActiveSpan;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;@RestControllerAdvice
public class GlobalExceptionHandler {@ExceptionHandler({MyCustomException.class})public ResponseEntity<String> handleMyCustomException(MyCustomException e) {// 使用ActiveSpan.error()标记异常ActiveSpan.error(e);// 返回正常的响应,但SkyWalking会记录异常return new ResponseEntity<>("Handled MyCustomException: " + e.getMessage(), HttpStatus.OK);}
}

这种情况状态码是200,但是skywalking也会告警的。

忽略指定异常告警

这种方式是基本skywalking客户端的方式进行修改!!!!!!!

场景:

在业务使用过程中,我们会添加全局异常处理,当程序错误的时候,统一返回处理。

但是我们也会有这种场景:我们可能会抛出一些自定义的异常,而这些异常,并不是程序错误或者未知的错误,而是非常明确的终态,用来告知调用方一些信息,这种的我们想让skywalking不要报警,该怎么做呢?

在下述示例中,SkyException为我们要忽略报警的异常,MyCustomException为全局处理异常

SkyException

@Slf4j
public class SkyException extends RuntimeException{public SkyException(String message) {super(message);}
}

MycustomException

@Slf4j
public class MycustomException extends RuntimeException{public MycustomException(String message) {super(message);}
}

接口:

@GetMapping("/test")
public Integer pay(@RequestParam("id") Integer id) {throw new SkyException("skywalking忽略告警异常");
}@GetMapping("/test2")
public Integer pay(@RequestParam("id") Integer id) {return 1/0;
}

全局异常处理

@RestControllerAdvice
public class GlobalExceptionHandlers {@ExceptionHandler(SkyException.class)public Integer skyException(SixException e) {// 使用ActiveSpan.error()标记异常ActiveSpan.error(e);return 1;}@ExceptionHandler(MycustomException.class)public Integer mycustomException(SevenException e) {// 使用ActiveSpan.error()标记异常ActiveSpan.error(e);return 1;}
}

在上述情况下,访问/test1和/test2都会触发skywalking告警,如果我们想让SkyException不告警的话,有两种方式

  • skywalking默认的环境变量
  • 引入jar包,采用注解方式
环境变量的方式

修改jvm启动参数,当需要忽略多个异常时,使用逗号“,”分隔。如下所示。

-javaagent:/opt/skywalking-agent-9.2.0/skywalking-agent.jar
-Dskywalking.agent.service_name=sky-demo
-Dskywalking.collector.backend_service=127.0.0.1:11800
-Dskywalking.statuscheck.ignored_exceptions=com.xx.xxx.SkyException

修改完成后重新启动服务即可

如果是k8s的方式,注入环境变量: SW_STATUSCHECK_IGNORED_EXCEPTIONS:com.xx.xxx.SkyException

注解方式

引入pom

<dependency><groupId>org.apache.skywalking</groupId><artifactId>apm-toolkit-trace</artifactId><version>8.9.0</version>
</dependency>

在要忽略的异常上添加注解@IgnoredException,等同于添加配置statuscheck.ignored_exceptions

@Slf4j
@IgnoredException
public class SkyException extends RuntimeException{public SkyException(String message) {super(message);}
}

忽略链路插件

在skywalking控制台显示页面上,我们想让一些调用不显示链路,比如健康心跳显示,机器人巡检等功能,这些对于我们业务使用来说,不怎么关注,而且他们的触发频率很高,会有大量的链路,有时候直接把我们真正关心的链路给耍没了,那么这种场景,该怎么处理呢?

比如我不想让Lettuce/INFO在skywalking链路中显示

在这里插入图片描述

这种方式需要一个插件,进入optional-plugins文件夹,将jar包apm-trace-ignore-plugin-8.16.0.jar复制到plugins文件夹中

配置

忽略调用链路的配置有两种:

  1. 系统变量;
  2. 配置文件。

系统变量优先级大于文件。

其配置的路径应匹配Ant Path规则,如/path/*、/path/**、/path/?。

  • 系统变量

    在系统变量中添加skywalking.trace.ignore_path来配置要忽略的接口,多个接口之间用逗号“,”分隔。

  • 配置文件

    在config文件夹中添加配置文件apm-trace-ignore-plugin.config,在该配置文件中添加以下配置

    trace.ignore_path=/your/path/1/,/your/path/2/

我们要忽略掉eureka心跳检测的接口,则在配置文件中添加以下配置

trace.ignore_path=Lettuce/INFO

这样设置后,skywalking链路中不会在有该接口了

参考文献

skywalking中表字段的信息

skywalking全链路追踪

Skywalking(9.7.0) 告警配置

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/150815.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

Java转换流

转换流 是字符流和字节流之间的桥梁 转换输出流:OutputSteamWriter 转换输入流:InputStreamReader InputStreamReader输入流 package myio;import java.io.*;public class inputsteamread {public static void main(String[] args) throws IOException {InputStreamReader…

基于SSM的家政服务网站【附源码】

基于SSM的家政服务网站&#xff08;源码L文说明文档&#xff09; 目录 4 系统设计 4.1 系统概述 4.2 系统结构 4.3. 数据库设计 4.3.1 数据库实体 4.3.2 数据库设计表 4.4 数据表 第5章 系统详细设计 5.1管理员功能模块 5.2用户功能模块 5.3前…

利用低代码快速搭建电商小程序之商品列表页

目标&#xff1a; 搭建商城的一个商品列表页面&#xff08;先做静态页&#xff09; 开发环境&#xff1a; 访问白码低代码平台&#xff1a;https://www.bnocode.com/ 白码的新自定义页功能&#xff08;使用vue框架&#xff09; 前期准备&#xff1a; 需要先准备商品数据表…

LeaferJS 动画、状态、过渡、游戏框架

LeaferJS 现阶段依然专注于绘图、交互和图形编辑场景。我们引入游戏场景&#xff0c;只是希望让 LeaferJS 被更多有需要的人看到&#xff0c;以充分发挥它的价值 LeaferJS 为你带来了全新的游戏、动画、状态和过渡功能&#xff0c;助你实现那些年少时的游戏梦想。我们引入了丰富…

读论文《OmniGen: Unified Image Generation》

OmniGen演示了在单一框架内执行各种图像生成任务的能力。此外&#xff0c;它还具有推理能力和语境学习能力。 论文地址&#xff1a;2409.11340v1 (arxiv.org) 项目地址&#xff1a;GitHub - VectorSpaceLab/OmniGen 项目目前还不完整&#xff0c;论文展现的通用性十分强大&am…

【云安全】云原生安全攻防

一、云原生安全 1、云原生介绍 云原生指构建和运行应用以充分利用通过云交付模式交付的分布式计算。云原生应用旨在充分利用云平台特有的可扩展性、弹性和灵活性优势。根据云原生计算基金会 (CNCF)的定义&#xff0c;云原生技术可帮助企业在公有云、私有云和混合云上构建和运行…

认知杂谈82《跳出信息茧房,持续精进》

内容摘要&#xff1a; 互联网时代&#xff0c;信息丰富&#xff0c;但便捷性削弱了我们的好奇心。互联网是双刃剑&#xff0c;快速获取知识的同时&#xff0c;也让我们陷入“信息茧房”&#xff0c;限制视野。 好奇心减少&#xff0c;部分原因是互联网的“懒惰效应”&#xff0…

ProcessOn为什么导出有水印!!!(利用SVG转PNG)

processon-svg2png ProcessOn 一个非常好用的思维导图网站&#xff0c;但是为什么导出有水印&#xff01;&#xff01;&#xff01;。 功能 支持按钮拖拽支持将流程图svg 转成 png下载支持修改自定义文字下载svg&#xff08;开发中&#xff09; 安装/使用方法 安装并使用…

亚马逊跨境电商测评补单系统防关联全攻略

在跨境电商领域&#xff0c;尤其是亚马逊、速卖通等平台上&#xff0c;测评补单已成为提升产品曝光度和销量的重要手段。然而&#xff0c;但多账号操作带来的关联风险始终是卖家们需要面对的一大问题。为了维护平台的公平秩序&#xff0c;这些各电商平台实施了严格的用户管理制…

Mysql梳理10——使用SQL99实现7中JOIN操作

10 使用SQL99实现7中JOIN操作 10.1 使用SQL99实现7中JOIN操作 本案例的数据库文件分享&#xff1a; 通过百度网盘分享的文件&#xff1a;atguigudb.sql 链接&#xff1a;https://pan.baidu.com/s/1iEAJIl0ne3Y07kHd8diMag?pwd2233 提取码&#xff1a;2233 # 正中图 SEL…

线性跟踪微分器TD详细测试(Simulink 算法框图+CODESYS ST+博途SCL完整源代码)

1、ADRC线性跟踪微分器 ADRC线性跟踪微分器(ST+SCL语言)_adrc算法在博途编程中scl语言-CSDN博客文章浏览阅读784次。本文介绍了ADRC线性跟踪微分器的算法和源代码,包括在SMART PLC和H5U平台上的实现。文章提供了ST和SCL语言的详细代码,并讨论了跟踪微分器在自动控制中的作用…

【C++掌中宝】C++ 中的空指针救世主——nullptr

文章目录 1. 什么是 NULL&#xff1f;2. NULL 在 C 和 C 中的区别3. C11 引入 nullptr 的原因4. nullptr 与 NULL 的区别5. nullptr 的应用场景6. 模拟 nullptr 的实现7. 总结结语 1. 什么是 NULL&#xff1f; 在 C 和 C 编程中&#xff0c;NULL 常用于表示空指针&#xff0c;…

《开题报告》基于SpringBoot的社区养老平台的设计与实现+学习文档+答辩讲解视频

开题报告 研究背景 随着社会的快速发展和人口老龄化趋势的加剧&#xff0c;养老服务已经成为一个日益重要的议题。传统的养老模式逐渐暴露出诸多不足&#xff0c;如服务内容单一、服务质量难以保证、管理效率低下等问题&#xff0c;无法满足老年人日益多样化、个性化的需求。…

导出Power bi中的Measure

工作中做交接文档时&#xff0c;有时需要导出Power BI中所有度量值&#xff0c;这时可以下载两个工具。 一 &#xff0c; 下载工具&#xff1a; 1 &#xff0c; DaxStudio&#xff1a; http://daxstudio.org/ 2&#xff0c; Vertipaq Analyzer&#xff1a; https://www.sqlbi.c…

编写程序将华氏温度78度转换为摄氏温度,转换成的摄氏温度要求输出。转换公式为:摄氏度=(5/9)*(华氏度-32)

目录 前言 一、代码部分 二、运行截图 前言 1.本文所讲的是java程序设计语言&#xff0c;其内容是在java语言程序设计实现摄氏温度的转换&#xff1b; 2.Java文件的编写以收入到我的专栏“Java”当中&#xff0c;其中有相关的系列文章&#xff1b; 3.本文的操作步骤具有…

ROG NUC:重塑未来,从“芯”开始

ROG NUC以令人惊叹的紧凑身形、强大配置&#xff0c;从“芯”出发&#xff0c;重塑我们对科技生活的想象&#xff0c;让玩家感受由微缩主机带来的性能风暴。 至强“芯”脏&#xff0c;性能巅峰 ROG NUC至高搭载英特尔酷睿Ultra9处理器&#xff0c;采用先进的制程工艺&#xff…

for循环的应用

正三角 for (int i 0; i < 8; i) { for (int j 0; j < 15; j) { int kong 8 - i - 1; int star 2 * i 1; if (j < kong) { Console.Write(" "); } else if (j < kong star)…

基于Springboot企业员工人事管理系统JAVA|VUE|SSM计算机毕业设计源代码+数据库+LW文档+开题报告+答辩稿+部署教+代码讲解

源代码数据库LW文档&#xff08;1万字以上&#xff09;开题报告答辩稿 部署教程代码讲解代码时间修改教程 一、开发工具、运行环境、开发技术 开发工具 1、操作系统&#xff1a;Window操作系统 2、开发工具&#xff1a;IntelliJ IDEA或者Eclipse 3、数据库存储&#xff1a…

CodeMeter创新授权解决方案,为半导体自动化行业打造全面保护策略

面临挑战 随着半导体行业的快速发展&#xff0c;KINESYS Software需要为其客户提供更加灵活且适应性强的自动化解决方案。半导体制造过程的复杂性日益增加&#xff0c;晶圆追踪和设备管理需要更高效、精确的解决方案。同时&#xff0c;行业标准的变化以及对安全性和合规性的严格…

C++ 移动迭代器:STL与移动语义的相遇

移动迭代器&#xff1a;STL与移动语义的相遇 一、引言二、C 中移动语义的先决条件2.1、传统的复制机制2.2、移动语义的引入2.3、使用 std::move 进行显式移动 三、移动迭代器3.1、移动迭代器的用途3.2、如何使用移动迭代器3.3、移动迭代器的注意事项 四、避免数据丢失五、范围库…