SLS告警最佳实践——在通知中引用日志内容

本文涉及的产品
对象存储 OSS,20GB 3个月
阿里云盘企业版 CDE,企业版用户数5人 500GB空间
对象存储 OSS,内容安全 1000次 1年
简介: 在配置告警通知的时候,通常我们需要知道告警的触发详情。例如Nginx访问错误告警,我们需要知道错误的HTTP Status 分布,错误的机器IP等信息,并且需要将这些信息体现在通知中,以便在接收到告警通知后,能够一目了然地知道发生了什么事情。那么在创建告警规则的时候,我们就需要进行合理的配置,使得告警在触发后,可以将这些信息放在合适的位置发送给通知服务,从而在通知模板里可以被引用到,从而被正确地通知。

概述

在配置告警通知的时候,通常我们需要知道告警的触发详情。例如Nginx访问错误告警,我们需要知道错误的HTTP Status 分布,错误的机器IP等信息,并且需要将这些信息体现在通知中,以便在接收到告警通知后,能够一目了然地知道发生了什么事情。

那么在创建告警规则的时候,我们就需要进行合理的配置,使得告警在触发后,可以将这些信息放在合适的位置发送给通知服务,从而在通知模板里可以被引用到,从而被正确地通知。

基本属性介绍

在告警规则触发告警后,我们可以通过如下一些属性获取到告警的原始日志信息,它们分别是:

  • labels
  • annotations
  • results
  • fire_results

它们的基本格式以及如何在模板中引用可以参考 内容模板变量说明(新版)。下面来分别进行介绍。

labels

自定义标签

在配置告警规则的时候,我们可以手动添加标签,例如:

那么在告警触发后,告警消息里就会包含如下信息:

{
"labels": {
"app": "nginx",
"env": "prod"    }
}

因此在内容模板里,就可以通过如下方式引用标签字段,例如:

应用: {{ alert.labels.app }}
环境: {{ alert.labels.env }}

分组评估

如果设置了分组评估,那么分组评估的字段会默认添加到标签中。关于分组评估的介绍,可以参考文档 分组评估。例如下面的配置,根据 status 字段做分组评估,那么当有错误时,不同的错误码是不同的告警,例如 400 的错误会是一个告警,404 的错误会是另外一个告警,等等。

此时除了自定义的 app 和 env 标签,还会有一个系统加上去的 stauts 标签。例如 404 的错误触发的告警会包含如下信息:

{
"labels": {
"app": "nginx",
"env": "prod",
"status": "404"    }
}

因此在内容模板里,就可以通过如下方式引用标签字段,例如:

应用: {{ alert.labels.app }}
环境: {{ alert.labels.env }}
错误码: {{ alert.labels.status }}

特别注意:

在设置分组评估的时候,需要特别注意,应当使用可枚举的字段。例如 http_status,slb_id 等。而对于不可枚举的随机字段,则不应该作为分组字段,例如 request_time,uuid 等。

annotations

自定义标注

在配置告警规则的时候,我们可以添加标注。与标签相比,标注更加灵活。标注不仅可以配置为固定的文本,还可以引用日志的字段,例如下面配置:

这里需要注意,默认有两个标注:

  • 标题,即 title 属性
  • 描述,即 desc 属性

那么在告警触发后,告警消息里就会包含如下信息:

{
"annotations": {
"title": "Nginx访问错误告警触发",
"desc": "状态码400错误发生了15次"    }
}

因此在内容模板里,就可以通过如下方式引用标注字段,例如:

告警标题: {{ alert.annotations.title }}
告警描述: {{ alert.annotations.desc }}

自动添加标注

除了自定义标注,还可以使用自动添加标注功能,例如:

它本质上相当于:

fire_results

fire_results 表示的是满足条件的告警记录。例如告警查询语句的结果如下:

当告警规则中触发条件配置为 cnt > 0 的时候:

触发的告警会有如下属性:

{
"fire_results": [
        { "status": "401", "ip": "127.0.0.1", "cnt": "3" },
        { "status": "400", "ip": "127.0.0.1", "cnt": "7" },
        { "status": "501", "ip": "127.0.0.1", "cnt": "4" },
        { "status": "404", "ip": "127.0.0.1", "cnt": "4" },
        { "status": "402", "ip": "127.0.0.1", "cnt": "6" },
        { "status": "403", "ip": "127.0.0.1", "cnt": "8" }
    ]
}

当告警规则中触发条件配置为 cnt > 5 时:

触发的告警的 fire_results 如下:

{
"fire_results": [
        { "status": "400", "ip": "127.0.0.1", "cnt": "7" },
        { "status": "402", "ip": "127.0.0.1", "cnt": "6" },
        { "status": "403", "ip": "127.0.0.1", "cnt": "8" }
    ]
}

然后就可以在模板变量中引用 fire_results 字段,例如:

告警触发详情: {{ alert.fire_results|to_json }}

results

results 是告警查询最原始的数据,例如上面的例子,告警触发后 results 信息如下:

{
"results": [{
"store_type": "log",
"region": "cn-hangzhou",
"project": "test-alert",
"store": "nginx-access-log",
"query": "status >= 400 | select status, __source__ as ip, count(*) as cnt group by status, ip",
"start_time": 1640006894,
"end_time": 1640007014,
"dashboard_id": "",
"raw_results": [
            { "status": "401", "ip": "127.0.0.1", "cnt": "3" },
            { "status": "400", "ip": "127.0.0.1", "cnt": "7" },
            { "status": "501", "ip": "127.0.0.1", "cnt": "4" },
            { "status": "404", "ip": "127.0.0.1", "cnt": "4" },
            { "status": "402", "ip": "127.0.0.1", "cnt": "6" },
            { "status": "403", "ip": "127.0.0.1", "cnt": "8" }
        ],
"raw_result_count": 6,
"fire_result": {
"status": "401",
"ip": "127.0.0.1",
"cnt": "3"        },
"has_sql": true,
"truncated": false,
"role_arn": ""    }]
}

之后也可以通过如下方式来引用原始日志:

告警查询详情: {{ alert.results[0].raw_results|to_json }}

注意:

  • 如果一个告警规则有多个查询语句,那么 results 数组就会有多项,每一项对应一个查询语句。
  • results 表示的是查询语句的原始查询数据,fire_results 表示的是满足告警触发条件的数据,这两者可能会有所差别的。例如触发条件是满足 cnt > 5,那么 results[0].raw_results 结果可能是 6条,但是 fire_results 结果可能是 3条,因为只有3条记录满足 cnt > 5

模板变量引用

循环展示触发日志

上文中 {{ alert.fire_results | to_json }} 会将 fire_results 以 JSON 字符串的形式来进行展示。有时候为了展示更友好,我们会希望通过循环的方式,一行行展示触发日志,此时可以通过循环来实现,例如:

{%-forresultinalert.fire_results%}
-status: {{ alert.status }}, count: {{ alert.cnt }}
{%-endfor%}

更多相关信息,可以参考 内容模板语法(新版)

通过模板函数进行数据处理

如果需要对告警的字段进行一些格式化或者处理后再展示,可以通过内置函数来实现。具体可以参考:

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
1月前
|
XML 安全 Java
【日志框架整合】Slf4j、Log4j、Log4j2、Logback配置模板
本文介绍了Java日志框架的基本概念和使用方法,重点讨论了SLF4J、Log4j、Logback和Log4j2之间的关系及其性能对比。SLF4J作为一个日志抽象层,允许开发者使用统一的日志接口,而Log4j、Logback和Log4j2则是具体的日志实现框架。Log4j2在性能上优于Logback,推荐在新项目中使用。文章还详细说明了如何在Spring Boot项目中配置Log4j2和Logback,以及如何使用Lombok简化日志记录。最后,提供了一些日志配置的最佳实践,包括滚动日志、统一日志格式和提高日志性能的方法。
345 30
【日志框架整合】Slf4j、Log4j、Log4j2、Logback配置模板
|
14天前
|
监控 安全 Apache
什么是Apache日志?为什么Apache日志分析很重要?
Apache是全球广泛使用的Web服务器软件,支持超过30%的活跃网站。它通过接收和处理HTTP请求,与后端服务器通信,返回响应并记录日志,确保网页请求的快速准确处理。Apache日志分为访问日志和错误日志,对提升用户体验、保障安全及优化性能至关重要。EventLog Analyzer等工具可有效管理和分析这些日志,增强Web服务的安全性和可靠性。
|
2月前
|
XML JSON Java
Logback 与 log4j2 性能对比:谁才是日志框架的性能王者?
【10月更文挑战第5天】在Java开发中,日志框架是不可或缺的工具,它们帮助我们记录系统运行时的信息、警告和错误,对于开发人员来说至关重要。在众多日志框架中,Logback和log4j2以其卓越的性能和丰富的功能脱颖而出,成为开发者们的首选。本文将深入探讨Logback与log4j2在性能方面的对比,通过详细的分析和实例,帮助大家理解两者之间的性能差异,以便在实际项目中做出更明智的选择。
333 3
|
24天前
|
存储 监控 安全
什么是事件日志管理系统?事件日志管理系统有哪些用处?
事件日志管理系统是IT安全的重要工具,用于集中收集、分析和解释来自组织IT基础设施各组件的事件日志,如防火墙、路由器、交换机等,帮助提升网络安全、实现主动威胁检测和促进合规性。系统支持多种日志类型,包括Windows事件日志、Syslog日志和应用程序日志,通过实时监测、告警及可视化分析,为企业提供强大的安全保障。然而,实施过程中也面临数据量大、日志管理和分析复杂等挑战。EventLog Analyzer作为一款高效工具,不仅提供实时监测与告警、可视化分析和报告功能,还支持多种合规性报告,帮助企业克服挑战,提升网络安全水平。
|
1月前
|
Oracle 关系型数据库 数据库
【赵渝强老师】Oracle的参数文件与告警日志文件
本文介绍了Oracle数据库的参数文件和告警日志文件。参数文件分为初始化参数文件(PFile)和服务器端参数文件(SPFile),在数据库启动时读取并分配资源。告警日志文件记录了数据库的重要活动、错误和警告信息,帮助诊断问题。文中还提供了相关视频讲解和示例代码。
|
2月前
|
存储 缓存 关系型数据库
MySQL事务日志-Redo Log工作原理分析
事务的隔离性和原子性分别通过锁和事务日志实现,而持久性则依赖于事务日志中的`Redo Log`。在MySQL中,`Redo Log`确保已提交事务的数据能持久保存,即使系统崩溃也能通过重做日志恢复数据。其工作原理是记录数据在内存中的更改,待事务提交时写入磁盘。此外,`Redo Log`采用简单的物理日志格式和高效的顺序IO,确保快速提交。通过不同的落盘策略,可在性能和安全性之间做出权衡。
1709 14
|
2月前
|
XML JSON 监控
告别简陋:Java日志系统的最佳实践
【10月更文挑战第19天】 在Java开发中,`System.out.println()` 是最基本的输出方法,但它在实际项目中往往被认为是不专业和不足够的。本文将探讨为什么在现代Java应用中应该避免使用 `System.out.println()`,并介绍几种更先进的日志解决方案。
62 1
|
1月前
|
存储 监控 安全
什么是日志管理,如何进行日志管理?
日志管理是对IT系统生成的日志数据进行收集、存储、分析和处理的实践,对维护系统健康、确保安全及获取运营智能至关重要。本文介绍了日志管理的基本概念、常见挑战、工具的主要功能及选择解决方案的方法,强调了定义管理目标、日志收集与分析、警报和报告、持续改进等关键步骤,以及如何应对数据量大、安全问题、警报疲劳等挑战,最终实现日志数据的有效管理和利用。
108 0
|
3月前
|
设计模式 SQL 安全
PHP中的设计模式:单例模式的深入探索与实践在PHP的编程实践中,设计模式是解决常见软件设计问题的最佳实践。单例模式作为设计模式中的一种,确保一个类只有一个实例,并提供全局访问点,广泛应用于配置管理、日志记录和测试框架等场景。本文将深入探讨单例模式的原理、实现方式及其在PHP中的应用,帮助开发者更好地理解和运用这一设计模式。
在PHP开发中,单例模式通过确保类仅有一个实例并提供一个全局访问点,有效管理和访问共享资源。本文详细介绍了单例模式的概念、PHP实现方式及应用场景,并通过具体代码示例展示如何在PHP中实现单例模式以及如何在实际项目中正确使用它来优化代码结构和性能。
56 2
|
2月前
|
Python
log日志学习
【10月更文挑战第9天】 python处理log打印模块log的使用和介绍
43 0

相关产品

  • 日志服务