打通钉钉+WebHook: 日志服务(SLS)告警实践

简介: 用一个最最常用的案例(Nginx日志分析)来说明当前使用场景,告警要解决的3个问题:是否有错误;是否有性能问题;是否有流量急跌或暴涨

阿里云日志服务是针对实时数据一站式服务,用户只需要将精力集中在分析上,过程中数据采集、对接各种存储计算、数据索引和查询等琐碎工作等都可以交给日志服务完成。

9月日志服务升级实时分析功能(LogSearch/Analytics),可以使用查询+SQL92语法对日志进行实时分析,并在结果分析可视化上,支持自带DashboardDataVGrafanaTableua(通过JDBC)、QuickBI等可视化方式。

在监控场景中光有可视化是不够的,日志服务提供告警与通知功能如下:

  1. 将查询(SavedSearch)保存下来
  2. 对查询设置触发周期(间隔),并对执行结果设定判断条件并且告警
  3. 设置告警动作(如何通知),目前支持通知方式有3种:
    • 通知中心:在阿里云通知中心可以设置多个联系人,通知会通过邮件和短信方式发送
    • WebHook:包括钉钉机器人,及自定义WebHook等
    • (即将支持)写回日志服务(logstore):可以通过流计算,函数服务进行事件订阅;也可以对告警生成视图和报表
  1. 告警功能配置与使用可以参见告警文档
  2. 除自身告警外,日志服务与云监控已打通,可以使用云监控日志告警功能。

image

告警设置案例(Nginx日志为例)

我们用一个最最常用的案例(Nginx日志分析)来说明当前使用场景,告警要解决的3个问题:

  1. 是否有错误
  2. 是否有性能问题
  3. 是否有流量急跌或暴涨

准备工作(Nginx日志接入)

  1. 日志数据采集。详细步骤请参考5分钟快速入门 或 直接在Logstore页面 数据源接入向导 中设置。
  2. 索引设置,详细步骤请参考索引设置与可视化或最佳实践网站日志分析案例。
  3. 对关键指标设置视图 + 告警。

(在做完1、2步骤后,在查询页面可以看到原始日志)

image.png

Sample视图(例子):

Snip20171211_28

1. 是否有错误

错误一般有这样几类:404(请求无法找到地址)/502/500(服务端错误),我们一般只需关心500(服务端错误),将这个query保存下来,统计单位时间内错误数c。告警可以设定一个规则c > 0 则产生告警:

status:500 | select count(1) as c

这种方式比较简单,但往往过于敏感,对于一些业务压力较大的服务而言有零星几个500是正常的。为了应对这种情况,我们可以在告警条件中设置触发次数为2次:只有连续2次检查都符合条件后再发告警。

2. 是否有性能问题

服务器运行过程中虽然没有错误,但有可能会出现延迟(Latency)增大情况,因此我们可以针对延迟进行告警。

例如我们可以通过以下方式计算某个接口(“/adduser")所有写请求(”Post“)延时。告警规则设置为 l > 300000 (当平均值超过300ms后告警)。

Method:Post and URL:"/adduser" | select avg(Latency) as l

利用平均值来报警简单而直接,但这种方法往往会使得一些个体请求延时被平均掉,反馈不出问题。例如我们对该时间段的Latency可以计算一个数学上的分布(划分20个区间,计算每个区间内的数目),从分布图上可以看到大部分请求延时非常低(<20ms),但最高的延时有2.5S。

Method:Post and URL:"/adduser" | select numeric_histogram(20, Latency)

image

为应对这种情况,我们可以用数学上的百分数(99%最大延时)来作为报警条件,这样既可以排除偶发的延时高引起误报,也能对整体的演示更有代表性。以下的语句计算了99%分位的延时大小 approx_percentile(Latency, 0.99) ,同样我们也可以修改第二个参数进行其他分位的划分,例如中位数的请求延时 approx_percentile(Latency, 0.5)

Method:Post and URL:"/adduser" | select approx_percentile(Latency, 0.99) as p99

在监控的场景中,我们也可以在一个图上绘出平均延时,50%分位延时,以及90%分位延时。以下是按一天的窗口(1440分钟)统计各分钟内延时的图:

* | select avg(Latency) as l, approx_percentile(Latency, 0.5) as p50, approx_percentile(Latency, 0.99) as p99, date_trunc('minute', time) as t group by t order by t desc limit 1440

image

3. 是否有流量急跌或暴涨?

服务器端自然流量一般符合概率上的分布,会有一个缓慢上涨或下降过程。流量急跌或暴涨(短时间内变化非常大)一般都是不正常的现象,需要留意。

(例如下图的监控中,在2分钟时间内流量大小下跌30%以上,在2分钟内后又迅速恢复)

image

急跌和暴涨一般会有如下参考系:

  • 上一个时间窗口:环比上一个时间段
  • 上一天该时间段的窗口:环比昨天
  • 上一周该时间段的窗口:环比上周

我们这里以第一种情况来作为case讨论,计算流量infow数据的变动率(也可以换成QPS等流量)。

3.1 首先定义一个计算窗口

例如我们定一个1分钟的窗口,统计该分钟内的流量大小,以下是一个5分钟区间统计:

* | select sum(inflow)/(max(__time__)-min(__time__)) as inflow , __time__-__time__%60  as window_time from log group by window_time order by window_time limit 15

从结果分布上看,每个窗口内的平均流量 sum(inflow)/(max(time)-min(time)) 应该是均匀的:

image

3.2 计算窗口内的差异值(最大值变化率)

这里我们会用到子查询,我们写一个查询,从上述结果中计算最大值 或 最小值 与平均值的变化率(这里的max_ratio),例如如下计算结果max_ratio 为 1.02。我们可以定义一个告警规则,如果max_ratio > 1.5 (变化率超过50%)就告警。

 * | select max(inflow)/avg(inflow) as max_ratio from (select sum(inflow)/(max(__time__)-min(__time__)) as inflow , __time__-__time__%60  as window_time from log group by window_time order by window_time limit 15)

image

3.3 计算窗口内的差异值(最近值变化率)

在一些场景中我们更关注最新的数值是否有波动(是否已经恢复),那可以通过max_by方法获取最大windows_time中的流量来进行判断,这里计算的最近值为lastest_ratio=0.97。

注意:

  • 这里的max_by函数计算结果为字符类型,我们需要强转成数字类型
  • 如果要计算变化相对率,可以用(1.0-max_by(inflow, window_time)/1.0/avg(inflow)) as lastest_ratio 代替
 * | select max_by(inflow, window_time)/1.0/avg(inflow) as lastest_ratio from (select sum(inflow)/(max(__time__)-min(__time__)) as inflow , __time__-__time__%60  as window_time from log group by window_time order by window_time limit 15)

image

3.4 计算窗口内的差异值(定义波动率,上一个值与下一个变化率)

波动率另外一种计算方法是数学上一阶导数,既当前窗值 与 上个窗口值的变化值。

image.png

我们可以使用窗口函数(lag)进行计算,窗口函数中提取当前inflow与上一个周期inflow "lag(inflow, 1, inflow)over() " 进行差值,并除以当前值作为一个变化比率:

 * | select (inflow- lag(inflow, 1, inflow)over() )*1.0/inflow as diff, from_unixtime(window_time) from (select sum(inflow)/(max(__time__)-min(__time__)) as inflow , __time__-__time__%60  as window_time from log group by window_time order by window_time limit 15)

例如在我们例子中,11点39分流量有一个较大的降低(窗口之间变化率为40%以上):

如果要定义一个绝对变化率,可以使用abs函数(绝对值)对计算结果进行统一

image.png

总结

日志服务查询分析能力是完整SQL92,支持各种数理统计与计算等,只要会用SQL都能进行快速分析,欢迎尝试!

相关实践学习
通过日志服务实现云资源OSS的安全审计
本实验介绍如何通过日志服务实现云资源OSS的安全审计。
目录
相关文章
|
4月前
|
SQL 人工智能 监控
SLS Copilot 实践:基于 SLS 灵活构建 LLM 应用的数据基础设施
本文将分享我们在构建 SLS SQL Copilot 过程中的工程实践,展示如何基于阿里云 SLS 打造一套完整的 LLM 应用数据基础设施。
853 69
|
存储 运维 开发工具
警惕日志采集失败的 6 大经典雷区:从本地管理反模式到 LoongCollector 标准实践
本文探讨了日志管理中的常见反模式及其潜在问题,强调科学的日志管理策略对系统可观测性的重要性。文中分析了6种反模式:copy truncate轮转导致的日志丢失或重复、NAS/OSS存储引发的采集不一致、多进程写入造成的日志混乱、创建文件空洞释放空间的风险、频繁覆盖写带来的数据完整性问题,以及使用vim编辑日志文件导致的重复采集。针对这些问题,文章提供了最佳实践建议,如使用create模式轮转日志、本地磁盘存储、单线程追加写入等方法,以降低日志采集风险,提升系统可靠性。最后总结指出,遵循这些实践可显著提高故障排查效率和系统性能。
1263 21
|
8月前
|
监控 容灾 算法
阿里云 SLS 多云日志接入最佳实践:链路、成本与高可用性优化
本文探讨了如何高效、经济且可靠地将海外应用与基础设施日志统一采集至阿里云日志服务(SLS),解决全球化业务扩展中的关键挑战。重点介绍了高性能日志采集Agent(iLogtail/LoongCollector)在海外场景的应用,推荐使用LoongCollector以获得更优的稳定性和网络容错能力。同时分析了多种网络接入方案,包括公网直连、全球加速优化、阿里云内网及专线/CEN/VPN接入等,并提供了成本优化策略和多目标发送配置指导,帮助企业构建稳定、低成本、高可用的全球日志系统。
896 54
|
监控 安全 Apache
什么是Apache日志?为什么Apache日志分析很重要?
Apache是全球广泛使用的Web服务器软件,支持超过30%的活跃网站。它通过接收和处理HTTP请求,与后端服务器通信,返回响应并记录日志,确保网页请求的快速准确处理。Apache日志分为访问日志和错误日志,对提升用户体验、保障安全及优化性能至关重要。EventLog Analyzer等工具可有效管理和分析这些日志,增强Web服务的安全性和可靠性。
409 9
|
存储 数据采集 监控
云上数据安全保护:敏感日志扫描与脱敏实践详解
随着企业对云服务的广泛应用,数据安全成为重要课题。通过对云上数据进行敏感数据扫描和保护,可以有效提升企业或组织的数据安全。本文主要基于阿里云的数据安全中心数据识别功能进行深入实践探索。通过对商品购买日志的模拟,分析了如何使用阿里云的工具对日志数据进行识别、脱敏(3 种模式)处理和基于 StoreView 的查询脱敏方式,从而在保障数据安全的同时满足业务需求。通过这些实践,企业可以有效降低数据泄漏风险,提升数据治理能力和系统安全性。
1797 228
云上数据安全保护:敏感日志扫描与脱敏实践详解
|
10月前
|
数据采集 运维 监控
数据采集监控与告警:错误重试、日志分析与自动化运维
本文探讨了数据采集技术从“简单采集”到自动化运维的演进。传统方式因反爬策略和网络波动常导致数据丢失,而引入错误重试、日志分析与自动化告警机制可显著提升系统稳定性与时效性。正方强调健全监控体系的重要性,反方则担忧复杂化带来的成本与安全风险。未来,结合AI与大数据技术,数据采集将向智能化、全自动方向发展,实现动态调整与智能识别反爬策略,降低人工干预需求。附带的Python示例展示了如何通过代理IP、重试策略及日志记录实现高效的数据采集程序。
491 7
数据采集监控与告警:错误重试、日志分析与自动化运维
|
11月前
|
存储 SQL 关系型数据库
MySQL日志详解——日志分类、二进制日志bin log、回滚日志undo log、重做日志redo log
MySQL日志详解——日志分类、二进制日志bin log、回滚日志undo log、重做日志redo log、原理、写入过程;binlog与redolog区别、update语句的执行流程、两阶段提交、主从复制、三种日志的使用场景;查询日志、慢查询日志、错误日志等其他几类日志
892 35
MySQL日志详解——日志分类、二进制日志bin log、回滚日志undo log、重做日志redo log
|
11月前
|
存储 缓存 关系型数据库
图解MySQL【日志】——Redo Log
Redo Log(重做日志)是数据库中用于记录数据页修改的物理日志,确保事务的持久性和一致性。其主要作用包括崩溃恢复、提高性能和保证事务一致性。Redo Log 通过先写日志的方式,在内存中缓存修改操作,并在适当时候刷入磁盘,减少随机写入带来的性能损耗。WAL(Write-Ahead Logging)技术的核心思想是先将修改操作记录到日志文件中,再择机写入磁盘,从而实现高效且安全的数据持久化。Redo Log 的持久化过程涉及 Redo Log Buffer 和不同刷盘时机的控制参数(如 `innodb_flush_log_at_trx_commit`),以平衡性能与数据安全性。
572 5
图解MySQL【日志】——Redo Log

相关产品

  • 日志服务