Skywalking告警配置

news2024/11/16 13:30:17

背景

  • 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
      # 配置url
      urls:
        - 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) >= 3
  period: 5
  silence-period: 5
  message: '服务 SLA 低于 100%'

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

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

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

xxx接口   in   group::服务

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

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

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

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

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

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

配置webhook

飞书
hooks:
  feishu:
    default:
      is-default: true
      text-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.coloradmin.cn/o/2168603.html

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

相关文章

[半导体检测-6]:为什么晶圆缺陷检测精度越高,所需要的光源的波长越短?

目录 前言&#xff1a; 1. 光束的聚焦能力 1.1 概述 1.2 光束的聚焦能力用什么指标来标识&#xff1f; 1. 光束质量因子&#xff08;M因子&#xff09; 2. 衍射极限倍数&#xff08;β因子&#xff09; 3. 斯特列尔比&#xff08;Strehl Ratio&#xff09; 4. 远场发散…

Spring6梳理13——依赖注入之引入集合Bean属性

以上笔记来源&#xff1a; 尚硅谷Spring零基础入门到进阶&#xff0c;一套搞定spring6全套视频教程&#xff08;源码级讲解&#xff09;https://www.bilibili.com/video/BV1kR4y1b7Qc 13 依赖注入之引入集合Bean属性 13.1 创建Lesson类&#xff0c;student类和teacher实体类…

【LeetCode:2535. 数组元素和与数字和的绝对差 + 模拟】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

jmeter性能测试---csv数据文件设置

&#xff08;1&#xff09;什么时候使用CSV数据文件设置&#xff1f; 当不同的用户&#xff0c;或者同一用户多次循环时&#xff0c;都可以获取到不同的值 &#xff08;2&#xff09;使用CSV数据文件设置进行参数化的步骤&#xff1f; 实例&#xff1a; 请求&#xff1a;htt…

基于Node.js+Express+MySQL+VUE实现的计算机毕业设计共享单车管理网站

单车信息选择骑行 骑行状态留言公告/springboot/javaWEB/J2EE/MYSQL数据库/vue前后分离小程序 功能如下&#xff1a; 一、开发目标 在共享经济日益盛行的今天&#xff0c;共享单车作为一种绿色、便捷的出行方式&#xff0c;已经深入人们的日常生活。然而&#xff0c;随着共享…

短效IP是网络世界的神秘助力者

伙伴们&#xff0c;我们都知道网络世界神秘莫测&#xff0c;在当今这个高度数字化的时代&#xff0c;网络如同一张无形的大网&#xff0c;将人们的生活和工作紧密相连&#xff0c;成为不可或缺的一部分。而在这庞大的网络背后&#xff0c;有着很多挑战和危险&#xff0c;为了能…

ps快速更换电商图片背景,轻松变成白底图

前言 在电商领域&#xff0c;一张高质量的商品图片往往能吸引更多消费者的目光&#xff0c;提升商品的点击率和转化率。而白底图&#xff0c;以其简洁、清晰、专业的特点&#xff0c;成为电商平台上商品展示的首选。然而&#xff0c;传统的手动抠图方式不仅耗时耗力&#xff0…

Linux中部署Docker环境;Docker常用操作

一&#xff0c;部署Docker环境 官网手册&#xff1a;CentOS | Docker Docs 1.1、查看一下Linux内核版本 uname -r 要求3.10版本及以上。 2.2、卸载老版本docker&#xff0c;避免产生影响 如果服务器安装过docker&#xff0c;没有卸载再次安装会导致安装失败&#xff0c;首…

Latex和Vscode安装和配置

一、Latex安装教程 打开清华大学开源软件镜像站&#xff0c;下载texlive.iso文件 右键点击ios文件&#xff0c;点击装载 配置latex安装 4. 安装过程 二、VScode安装和配置教程 打开Vscode官网&#xff0c;下载安装包 2.右键&#xff0c;以管理员身份运行VSCode安装包&#…

Day.js时间插件的安装引用与常用方法大全

&#x1f680; 个人简介&#xff1a;某大型国企资深软件研发工程师&#xff0c;信息系统项目管理师、CSDN优质创作者、阿里云专家博主&#xff0c;华为云云享专家&#xff0c;分享前端后端相关技术与工作常见问题~ &#x1f49f; 作 者&#xff1a;码喽的自我修养&#x1f9…

C++ 数据类型分类

在C中&#xff0c;数据类型可以大致分为内置类型&#xff08;Built-in Types&#xff09;、标准库类型&#xff08;Standard Library Types&#xff09;和自定义类型&#xff08;User-Defined Types&#xff09;三大类。 内置类型&#xff08;Built-in Types&#xff09; 内置…

Kafka和RabbitMQ比较

Kafka和RabbitMQ都是流行的消息队列系统&#xff0c;它们在分布式系统中扮演着至关重要的角色&#xff0c;用于异步消息传递和解耦应用组件。尽管它们共享一些基本的概念&#xff0c;但它们在设计目标、性能特性、使用场景等方面有着显著的差异。 设计目标 Kafka&#xff1a;Ka…

理解Java引用数据类型(数组、String)传参机制的一个例子

目录 理解Java引用数据类型&#xff08;数组、String&#xff09;传参机制的一个例子理解样例代码输出 参考资料 理解Java引用数据类型&#xff08;数组、String&#xff09;传参机制的一个例子 理解 引用数据类型传递的是地址。用引用类型A给引用类型B赋值&#xff0c;相当于…

ERROR:start workflow error,dolphinscheduler log重复刷屏(死循环)直至磁盘存满

在使用ds过后发现&#xff0c;我虚拟机中的磁盘内存全部沾满了 查看目录下大于100M的文件&#xff1a; find / -size 100M 查看后发现问题在于ds产生的日志文件特别大而且多&#xff0c; 查看日志后发现日志中一直都在死循环错误&#xff1a;start workflow error 等 其中文件…

【论文_1992】 REINFORCE » P2 附录

Williams, R. J. Simple statistical gradient-following algorithms for connectionist reinforcement learning. Mach. Learn., 8:229–256, 1992. PDF 下载链接 前面部分&#xff1a;【论文_1992】 REINFORCE P1 文章目录 附录 AA.1. REINFORCE 算法的一些结论A.2. 回合式 …

《深度学习》迁移学习综合应用 原理、案例解析与实现

目录 一、迁移学习 1、什么是迁移学习 2、迁移学习步骤 1&#xff09;选择预训练的模型和适当的层 2&#xff09;冻结预训练模型的参数 3&#xff09;在新数据集上训练新增加的层 4&#xff09;微调预训练模型的层 5&#xff09;评估和测试 二、案例实现 1、数据准备…

内网穿透的应用-Windows系统安装SeaFile并实现远程访问本地共享文件资料详细教程

文章目录 1. 前言2. SeaFile云盘设置2.1 Owncould的安装环境设置2.2 SeaFile下载安装2.3 SeaFile的配置 3. cpolar内网穿透3.1 下载安装3.2 Cpolar注册3.3 Cpolar云端设置3.4 Cpolar本地设置 4.公网访问测试5.结语 1. 前言 本文主要为大家介绍&#xff0c;如何使用两个简单软件…

如何使用ssm实现基于BS的库存管理软件设计与实现+vue

TOC ssm708基于BS的库存管理软件设计与实现vue 绪论 课题背景 身处网络时代&#xff0c;随着网络系统体系发展的不断成熟和完善&#xff0c;人们的生活也随之发生了很大的变化。目前&#xff0c;人们在追求较高物质生活的同时&#xff0c;也在想着如何使自身的精神内涵得到…

【Python报错已解决】ModuleNotFoundError: No module named ‘psutil’

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 专栏介绍 在软件开发和日常使用中&#xff0c;BUG是不可避免的。本专栏致力于为广大开发者和技术爱好者提供一个关于BUG解决的经…

【无人机设计与控制】基于改进蚁群算法的机器人_无人机_无人车_无人船的路径规划算法

摘要 改进的蚁群算法 (IACO) 通过结合启发式信息和自适应参数调节&#xff0c;优化了机器人、无人机、无人车和无人船的路径规划问题。本文对传统蚁群算法的局限性进行了分析&#xff0c;并提出了一种改进方法&#xff0c;提升了算法的收敛速度和全局搜索能力。通过实验对比&a…