精准捕捉异常时刻——从写好事件标题与内容开始

news2024/12/23 6:18:31

写在前面

在讨论如何写好监控器配置时的事件通知内容之前,需要明确这样一个逻辑:

当监控器检测规则生效后,它会针对系统业务数据进行一系列聚合数据处理并以事件的形式留存。这些事件记录可以理解为当前监控器检测对象发出的异常信号的承载者,本文即将讨论的事件标题与内容就是这些事件记录的一部分。如果利益相关方认为当前异常是紧急处理事项,并且需要预估风险、及时响应,就可以以告警的形式向外发送这些事件记录。

在这个传送过程中,告警配置中的不聚合、规则聚合和智能聚合这三种方式会对事件标题与内容进行对应的处理,最终成为利益相关方接收到的异常告警通知。(如下图所示)


 

再回到最初的问题,当我们借用监控器来对各类数据进行检测,十分期望在产生异常事件时,被通知对象能第一时间获取异常时刻下详细的上下文信息。这就要求创建者在配置监控器时,重视并了解如何定义、编辑需要通知的事件标题及内容。

模版变量

模版变量是编辑标题与内容的核心要素之一。以下是观测云支持的模板变量,帮助渲染动态文案。

模板变量类型说明
时间:
date、timestampInteger事件产生时间。单位为秒
df_date_rangeInteger时间范围。单位为秒
df_check_range_startInteger检测范围开始时间。Unix 时间戳,单位为秒
df_check_range_endInteger检测范围结束时间。Unix 时间戳,单位为秒
事件:
df_statusString(Enum)事件状态,可能的值为:
- 紧急 critical
- 重要 error
- 警告 warning
- 正常 ok
- 无数据 nodata
df_event_idString事件唯一 ID
df_event_urlString事件详情页 URL
df_dimension_tagsString事件维度。用于标识检测对象。如:{"host":"web-001"}
df_eventDict完整事件数据
告警:
df_monitor_idString告警策略 ID
如果对检测有疑问,可以将此 ID 发送给我们
df_monitor_nameString告警策略名称
监控器:
df_monitor_checker_idString监控器 ID
如果对检测有疑问,可以将此 ID 发送给我们
df_monitor_checker_nameString监控器名称
df_monitor_checker_valueString检测值,即被监控器检测的值
⚠️ 检测值会强制转换为 String 类型以保证兼容性
df_monitor_checker_event_refString监控器事件关联。根据监控器 ID、事件 df_dimension_tags 计算所得
df_labelList监控器标签列表
df_label[#]String监控器标签
故障:
df_fault_idString本轮故障 ID,取值为首次故障事件的 df_event_id
df_fault_statusString(Enum)本轮故障状态,为 df_status 的冗余字段,可能的值为:
- 正常 ok
- 故障 fault
df_fault_start_timeInteger本轮故障发生时间。Unix 时间戳,单位为秒
df_fault_durationInteger本轮故障持续时间。单位为秒
手工恢复:
df_user_idString手工恢复时,操作者用户 ID
df_user_nameString手工恢复时,操作者用户名称
df_user_emailString手工恢复时,操作者用户邮箱
检测:
df_check_conditionDict满足的检测条件
df_check_condition.operatorString满足检测条件的操作符,如:>、>= 等
df_check_condition.operandsList满足检测条件的操作数列表。
一般只有 1 个操作数,但 between 等操作符具有 2 个操作数
df_check_condition.operands[#]Integer, Float满足检测条件的操作数
ResultInteger, Float检测值,与 df_monitor_checker_value 一样为产生本事件时,检测到的值,但字段类型为检测时获得的原始类型,不会强制转换为 String
其他:
df_site_nameString当前观测云节点名
df_workspace_nameString所属工作空间名
df_workspace_uuidString所属工作空间 ID
如果对检测有疑问,可以将此 ID 发送给观测云侧
{df_dimension_tags 中的各字段}Stringdf_dimension_tags 中的各字段会被提取
df_eventDict完整事件数据

事件标题

事件标题讲究不拖沓,即一句话就能阐明要点。这样当接收到事件通知时,在第一眼看到标题的情况下,就能大致了解事件内容。如:

  • Consul 集群里成员的状态存在异常

除了上述这样纯文本的标题,我们还可以在标题内插入模版变量。如:

  • 主机 {{ host }} 可用内存小于 10%
  • {{ service }} 服务的链路 Trace 错误率过高,错误率为 {{ ReConsult | to_fixed(2) }}%

事件内容

在指定事件内容时,我们可以借助模板语法来实现。接下来,我们会以几种常见的场景,展示事件内容通知的实际编辑效果。

场景一:模版变量

假设监控器 by 配置了 region 和 host,基于上表中的模板变量,我们可以编辑一份最基础的事件内容:

  • 事件标题:
监控器 {{ df_monitor_checker_name }} 发现 {{ df_dimension_tags }} 存在故障
  • 事件内容:
地区:{{ region }}
主机:{{ host }}
主机:{{ host }}
级别:{{ df_status }}
检测值:{{ Result }}
监控器:{{ df_monitor_checker_name }}(告警策略:{{ df_monitor_name }})

那么,产生 error 事件后,经过渲染的事件输出如下:

  • 输出事件标题:
监控器 监控器001 发现 {"region":"hangzhou","host":"web-001"} 存在故障
  • 输出事件内容:
地区:hangzhou
主机:web-001
主机:web-001
级别:error
检测值:90.12345
监控器:监控器001(告警策略:团队001)

场景二:模版变量+模版函数

除了如场景一这样直接展示事件中的字段值外,我们还可以使用模板函数对字段值进行进一步处理。采用模版函数能优化事件的通知内容输出,整合必要信息。

其组合用法形式为: {{ <模板变量> | <模板函数> }}

在观测云,我们可用的模板函数列表如下:

模板函数参数说明
to_datetime时区将时间戳转换为日期(默认时区为 Asia/Shanghai)
示例:{{ date | to_datetime }}
输出:2022-01-01 01:23:45
to_status_human将 df_status 转换为易读形式
示例:{{ df_status | to_status_human }}
输出:紧急
to_fixed小数位数将数字输出为固定小数位数(默认保留 0 位小数)
示例:{{ Result | to_fixed(3) }}
输出:1.230
to_round小数位数将数字四舍五入(默认保留 0 位小数)
示例:{{ Result | to_round(2) }}
输出:1.24
to_percent小数位数将小数输出为百分比(默认保留 0 位小数)
示例:{{ Result | to_percent(1) }}
输出:12.3%
to_pretty_tags美化输出标签
示例:{{ df_dimension_tags | to_pretty_tags }}
输出:region:hanghzou, host:web-001

还是参考场景一中的示例,此时在使用模版函数的情况下(即 {{ df_dimension_tags | to_pretty_tags }}),事件标题与内容的写法分别为:

  • 事件标题:
监控器 {{ df_monitor_checker_name }} 发现 {{ df_dimension_tags | to_pretty_tags }} 存在故障
  • 事件内容:
对象:{{ df_dimension_tags | to_pretty_tags }}
时间:{{ date | to_datetime }}
级别:{{ df_status | to_status_human }}
检测值:{{ (Result * 100) | to_round(2) }}

那么,产生 error 事件后,经过渲染的事件输出如下:

  • 输出事件标题:
监控器 我的监控器 发现 region:hangzhou, host:web-001 存在故障
  • 输出事件内容:
检测对象:region:hangzhou, host:web-001
检测时间:2022-01-01 01:23:45
故障级别:重要
检测值:9012.35

场景三:模板分支

基于观测云现有的配置页面,假设我们期望在同一个事件内容框中描述不同等级下产生的异常,我们可以采用模版分支语法(if else)来实现。

语法大致写法如下:

{% if df_status == 'critical' %}
紧急问题,请立即处理!
{% elif df_status == 'error' %}
重要问题,请处理
{% elif df_status == 'warning' %}
可能有问题,有空处理
{% elif df_status == 'nodata' %}
数据中断,请立即处理!

{% else %}
没问题!

{% endif %}

示例效果如下:

{% if  df_status != 'ok' %}
等级:{{ df_status }}
主机:{{ host }}
内容:Elasticsearch JVM 堆内存的使用量为 {{ Result }}%
建议:当前 JVM 垃圾的收集已经跟不上 JVM 垃圾的产生请及时查看业务情况

{% else %}
等级:{{df_status}}
主机:{{host}}
内容:Elasticsearch JVM 堆内存告警已恢复

{% endif %}

场景四:内嵌 DQL 查询函数

还有这样一种情况:即事件关注者除了希望看到监控器下产生的事件相关的内容,还想实现额外的数据查询,无论该类数据与当前监控器配置规则有关与否。此时,仅使用模板变量无法满足渲染需求。我们可以采用内嵌 DQL 查询函数来实现。

该函数支持在本工作空间下本次检测时间范围内(即 check_start_time 和 end_time 的范围)执行任意 DQL 语句,通常情况下,查询所得的第一条数据可在模板中作为模板变量使用,使用方式如下:

{% set dql_data = DQL("需要执行的 DQL 语句") %}
某字段:{{ dql_data.some_field }}

假设,我们需要查询 host 字段为 "my_server" 的数据,并将第一条数据赋值给 dql_data 变量:

编辑效果为:

{% set dql_data = DQL("O::HOST:(host, host_ip, os, datakit_ver) { host = 'my_server' }") %}

主机 OS:{{ dql_data.os }}

此后的模板中即可使用 {{ dql_data.os }} 输出查询结果中的具体字段。

有时,所需执行的 DQL 语句需要传递参数。

假设监控器 by 条件中配置了 region 和 host,且事件内容的写法如下:

{% set dql_data = DQL("O::HOST:(host_ip, os) { region = ?, host = ? }", region, host) %}
主机信息:
IP:{{ dql_data.host_ip }}
OS: {{ dql_data.os }}

由于事件仅包含 region 和 host 模板变量用于标记不同的数据,不包含 IP 地址、操作系统等更多信息。那么,使用内嵌 DQL 可以通过 region 和 host 作为 DQL 查询参数获取对应数据,并使用 {{ dql_data.host_ip }} 等输出关联信息。

结论

无论处于上述哪种场景,我们的最终输出目标都是:利用观测云提供的模板变量,来自定义并精准捕获异常时刻下的上下文事件信息,以便相关关注者能够及时做出反应。

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

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

相关文章

WPS Office JS宏实现Excel转换为JSON格式数据

通过Excel JS宏&#xff0c;将表格中的数据以”列“形式导出为JSON数据格式。 我们在整理文档时&#xff0c;产品会通过Excel将功能点和功能描述分层级整理出来&#xff0c;有时需要将此数据导入到系统中&#xff0c;Web端对Json这类数据比较友好&#xff0c;所以这里试着使用E…

实现加盐加密方法以及MappedByteBuffer,RandomAccess

目录 自己实现 Spring Security MappedByteBuffer RandomAccess 加盐加密的实现 自己实现 传统MD5可通过彩虹表暴力破解&#xff0c; 加盐加密算法是一种常用的密码保护方法&#xff0c;它将一个随机字符串&#xff08;盐&#xff09;添加到原始密码中&#xff0c;然后再进…

Java面试题(每天10题)-------连载(46)

目录 Dubbo篇 1、Dubbo的默认集群容错方案 2、Dubbo支持哪些序列化方式&#xff1f; 3、Dubbo超时时间怎样设置&#xff1f; 4、服务调用超时问题怎么解决&#xff1f; 5、Dubbo在安全机制方面是如何解决的&#xff1f; 6、Dubbo和Dubbox之间的区别 7、Dubbo和Spring C…

java--正则表达式用于查找信息、用于搜索替换、分割内容

1.案例&#xff1a;使用正则表达式查找一段文本中的内容 需求&#xff1a;请把下面文本中的电话&#xff0c;邮箱&#xff0c;座机号码&#xff0c;热线都爬取出来。 2.正则表达式用于搜索替换、分割内容&#xff0c;需要结合String提供的如下方法完成

MySQL使用教程

数据构成了我们日益数字化的社会基础。想象一下&#xff0c;从移动应用和银行系统到搜索引擎&#xff0c;再到如 ChatGPT 这样的先进人工智能聊天机器人&#xff0c;这些工具若没有数据支撑&#xff0c;将寸步难行。你有没有好奇过这些海量数据都存放在哪里呢&#xff1f;答案正…

Java程序编写(下)

Scanner对象 通过java.util.Scanner来获得Scanner类 基本语法&#xff1a; Scanner s new Scanner(System.in)通过next()和nextLine()方法获取输入的字符串。 通过hasNext()和hasNextLine()判断是否还有输入的数据。 next(): 1、一定要读取到有效字符后才可以结束输入 2、…

uniapp移动端悬浮按钮(吸附边缘)

Uniapp移动端悬浮按钮可以通过CSS实现吸附边缘的效果。具体实现步骤如下&#xff1a; html&#xff1a; <movable-area class"movable-area"><movable-view class"movable-view" :position"position" :x"x" :y"y"…

列出最佳Aspera替代方案,给你执掌数据传输的权

Aspera是一种高速文件传输技术&#xff0c;广泛应用于科学研究、医疗保健、媒体和娱乐等领域。然而&#xff0c;由于Aspera的高昂价格&#xff0c;很多人不得不寻找替代方案。本文将列举最佳Aspera替代方案&#xff0c;以便执掌数据传输的权利。 1、FileZilla FileZilla是一款…

XUbuntu22.04之8款免费UML工具(一百九十七)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

基于ssm的电动车租赁网站论文

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本电动车租赁网站就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内处理完毕庞大的数据信息&…

FreeSSL申请免费域名证书

本文详细讲解如何申请免费证书&#xff0c;需要先准备好域名&#xff0c;将服务器IP和域名绑定。 1、注册FreeSSL账号 网址&#xff1a; https://freessl.org/ 2、申请流程 登录后首页输入域名&#xff0c;然后点击Create certificate&#xff0c;跳转到证书申请页面。 或者…

LLM中的Prompt提示

简介 在LLM中&#xff0c;prompt&#xff08;提示&#xff09;是一个预先设定的条件&#xff0c;它可以限制模型自由发散&#xff0c;而是围绕提示内容进行展开。输入中添加prompt&#xff0c;可以强制模型关注特定的信息&#xff0c;从而提高模型在特定任务上的表现。 结构 …

Ubuntu安装TensorRT

文章目录 1. 安装CUDAa. 下载CUDAb. 安装CUDAc. 验证CUDA 2. 安装CUDNNa. 下载CUDNNb. 安装CUDNNc. 验证CUDNN 3. 安装TensorRTa. 下载TensorRTb. 解压TensorRTc. 安装TensorRTd. 安装uff和graphsurgeone. 验证是否安装成功f. 备注 关注公众号&#xff1a;『AI学习星球』 回复&…

kafka支持外网访问

kafka支持外网访问 1.kafka正常部署之后如果不修改&#xff0c;外网是无法访问的&#xff0c;具体如下&#xff08;这里是单节点&#xff09; 2.这个时候需要修改kafka的config中的server.properties中的 listeners 修改为0.0.0.0 监控所有网卡&#xff0c;advertised.listene…

硬件开发笔记(十五):RK3568底板电路VGA显示接口原理图分析

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/134849296 红胖子网络科技博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬…

tp5 rewrite nginx重写

tp框架,默认的访问路径是 www.xxxx.com/index.php/admin/shop/index格式的&#xff0c;为了方便和更规范&#xff0c;也看起来有逼格一些&#xff0c;需要将index.php去掉 无index.php就会报404 我这里是宝塔 #地址重写if (!-e $request_filename) {rewrite ^(.*)$ /index.…

解决火狐浏览器拖拽事件打开新页面的问题

产生原因及解决方案 我们在进行拖拽事件的编写时会发现&#xff0c;在火狐浏览器上会发生打开新窗口的问题&#xff0c;这是火狐浏览器的一个特性。 这是因为在 Firefox 中 ondrop 事件会触发 Firefox 自带的拖拽搜索功能&#xff0c;在 ondrop 事件触发执行时触发的函数中加…

【深度挖掘Java性能调优】「底层技术原理体系」深入探索Java服务器性能监控Metrics框架的实现原理分析(Counter篇)

目录 前提概要监控工作可以分为四个部分 监控开发任务Metrics中的基础数据类型计数器&#xff08;Counter&#xff09;统计 API 访问中异常&#xff08;1000/1500&#xff09;的次数统计 API 的调用量统计特定事件发生的次数Counter的底层原理基础 (Base) 计数器单元 (Cell) 数…

MySQL行锁范围分析(行锁、间隙锁、临键锁)

MySQL 中锁的概念 排它锁&#xff08;Exclusive Lock&#xff09; X 锁&#xff0c;也称为写锁&#xff0c;若事务T对对象A加上X锁&#xff0c;则只允许T读取和修改A&#xff0c;其他任何事物都不能再对A 加任何锁&#xff0c;直到T释放A上的锁。 SELECT…FOR UPDATE 对读取的…

SocialSelling社交销售1+5+1方法论系列:社交销售基础思维

社交销售是一个融合系统、个人与组织的营销销售模式&#xff0c;对于企业和销售个体来说&#xff0c;做好这件事首先是理解其次是实操。近期SocialSelling社交销售151方法论系列内容中&#xff0c;我们将对其进行系统阐述。 本篇将侧重151方法论中的第一个“1”&#xff1a;社…