简介:在实在的企业生产中,对研发和运维的同学都会面临一个非常简约且艰巨的问题,就是对指标的监控和告警。具体我枚举一些特定的问题请对号入座,看看在算力爆炸的时代是否通过算力和算法一起解决!
背景介绍
在实在的企业生产中,对研发和运维的同学都会面临一个非常简约且艰巨的问题,就是对指标的监控和告警。具体我枚举一些特定的问题请对号入座,看看在算力爆炸的时代是否通过算力和算法一起解决!
- 问题一:当一个新业务上线前,运维人员都须要明确服务的部署状况,确定监控对象,以及监控对象的一些可观测性指标,并依据此实现相干日志数据的采集和解决;这外面会波及到很多日志采集、指标加工等一系列脏活累活;
- 问题二:当确定了监控对象的黄金指标后,往往都须要先适配一组规定:某个接口每分钟的均匀申请延时不要超过多少毫秒;单位分钟内的谬误申请数量,不要超过多少等等;就如上图所示,从操作系统维度去看,每个个体有上百种形态各异的指标,切指标的状态有不尽相同,试问要多少种规定能力较好的笼罩到上述监控;
- 问题三:随着业务逐渐对外提供服务,以及各种经营流动的加推,咱们运维监控同学肯定会面临两个突出的问题:误报太多和漏报的危险,那么这两个问题都在现阶段都须要人工染指,进行阈值的调整;尤其是漏报的问题,更加须要人工盯屏的模式,设计新的监控规定去笼罩一些事件;
随着各个云上服务的 SLA 要求的晋升,企业服务也须要一直的提供问题发现的准确性和速度,在这一点上,自动化的被动巡检监控和秒级别的监控越来越被广大客户所器重。SLS 提供了对于指标数据的高效的存储格局,并齐全兼容 Prometheus 协定的时序数据,并在这个场景中,提供了对于海量指标线的智能巡检,让您能够丢掉简约的规定配置,通过简略的抉择就能够实现通用的异样检测。
时序存储的介绍
SLS 的日志存储引擎在 2016 年对外公布,目前承接阿里外部以及泛滥企业的日志数据存储,每天有数十 PB 的日志类数据写入。其中有很大一部分属于时序类数据或者用来计算时序指标,为了让用户可能一站式实现整个 DevOps 生命周期的数据接入、荡涤、加工、提取、存储、可视化、监控、问题剖析等过程,咱们专门推出了时序存储的性能,与日志存储一道为大家解决各类机器数据的存储问题。
在 SLS 平台中,能够较为简单的将主机的监控数据、Prometheus 监控数据通过 Logtail 间接写入,同时也有多种数据源的导入能力(阿里云监控数据)。本章次要通过对 ECS 机器数据和阿里云监控数据来阐明如何对接 SLS 智能时序巡检能力。
智能异样剖析介绍
智能异样剖析利用是一个可托管、高可用、可扩大的服务,次要提供智能巡检、文本剖析和根因诊断三大能力。本文介绍智能异样剖析利用的产品架构、性能劣势、实用场景、外围名词、应用限度和费用阐明等信息。
智能异样剖析利用围绕运维场景中的监控指标、程序日志、服务关系等外围因素开展,通过机器学习等伎俩产生异样事件,通过服务拓扑关联剖析时序数据和事件,最终升高企业的运维复杂度,进步服务质量。产品架构图如下所示。
在如下场景中,举荐应用智能异样剖析利用。
- 察看对象多且每个察看对象的观测维度也多。
- 观测对象没有明确的阈值规定,但须要关注指标的状态。
- 须要对观测对象编写大量的业务规定。
- 解决非结构化的日志数据时,须要对文本日志中的模式进行开掘。
接下来咱们在云监控指标数据场景中应用下
场景试验
智能监控云监控指标
云监控数据接入
通过官网文档能够较好的配置云监控的导入工作。通过配置后,能够依照如下截图去查看对应的导入工作
咱们能够在 SLS 管制台上查看对应的导入指标,对应各个指标的名称能够参考这篇文档。咱们能够通过如下查问语句查看下聚合的数据格式:
* | select promql_query_range('acs_ecs_dashboard:cpu_system:Average') from metrics limit 100000
云监控数据预览
通过【查问页面右上角的查问页面】按钮,能够跳转过来查看下具体的数据格式。
* | select __time_nano__ / 1000000 as time, __name__ as metric_name, element_at(__labels__, 'instanceId') as instanceId from "test01.prom" where __name__ != ''and __name__ ='acs_ecs_dashboard:cpu_system:Average' order by time, instanceId limit 100000
通过这条 SQL 语句,咱们能够具体的剖析出,写入到 SLS 中的具体的指标(某个监控对象,某个指标在什么工夫的值是多少)。上述 SQL 语句仅仅列举了在 2021-12-12 19:37~2021-12-12 19:38 这个工夫区间的全副监控对象的监控指标,接下来,咱们通过简略的改写,仅仅显示某个独自的监控对象在一分钟的数据状态。
* | select date_trunc('second', time) as format, * from (select __time_nano__ / 1000000 as time, __name__ as metric_name, element_at(__labels__, 'instanceId') as instanceId from "test01.prom" where __name__ != ''and __name__ ='acs_ecs_dashboard:cpu_system:Average') where instanceId ='xxxx' order by time limit 100000
咱们能够看到对于监控指标等于“acs_ecs_dashboard:cpu_system:Average”而言,某个特定的实例是每隔 15 秒一个监控指标。然而因为咱们应用的数据导入,将后果写入到 SLS 的 MetricStore 中,因而是每分钟写入如一分钟的监控数据。
这里要在强调一下:SLS 侧是是通过 OpenAPI 去获取云监控的指标数据的,数据导入 SLS 是有肯定的延时的,具体延时大概在 3 分钟左右,也就是说在 T0 时刻,SLS 中的数据只能保障 [T0-300s] 之前的数据时肯定按时写入的。这一点在后续的巡检工作配置过程中至关重要。
咱们通过 PromQL 在简化下上边的形容,咱们持续应用对应的指标 “acs_ecs_dashboard:cpu_system:Average”,通过如下的语句能够失去预期的后果,这曾经间隔咱们创立巡检工作曾经很靠近了。
* | select promql_query_range('avg({__name__=~"acs_ecs_dashboard:cpu_system:Average"}) by (instanceId, __name__)', '15s') from metrics limit 1000000
筛选监控指标
通过如下的 Query 能够大略晓得在云监控对于 ECS 提供了多少监控指标:
* | select COUNT(*) as num from (select DISTINCT __name__ from "test01.prom" where __name__ != ''and __name__ like'%acs_ecs_dashboard%' limit 10000)
失去的后果是 295 个后果,然而咱们没有比拟全副都进行巡检配置,因而第一步就是要依据指标阐明文档抉择须要监控的指标项,这里我提供一份简略整理出来的比拟重要的指标汇合,供大家参考:
acs_ecs_dashboard:CPUUtilization:Average
acs_ecs_dashboard:DiskReadBPS:Average
acs_ecs_dashboard:DiskReadIOPS:Average
acs_ecs_dashboard:DiskWriteBPS:Average
acs_ecs_dashboard:DiskWriteIOPS:Average
acs_ecs_dashboard:InternetIn:Average
acs_ecs_dashboard:InternetInRate:Average
acs_ecs_dashboard:InternetOut:Average
acs_ecs_dashboard:InternetOutRate:Average
acs_ecs_dashboard:InternetOutRate_Percent:Average
acs_ecs_dashboard:IntranetIn:Average
acs_ecs_dashboard:IntranetInRate:Average
acs_ecs_dashboard:IntranetOut:Average
acs_ecs_dashboard:IntranetOutRate:Average
acs_ecs_dashboard:cpu_idle:Average
acs_ecs_dashboard:cpu_other:Average
acs_ecs_dashboard:cpu_system:Average
acs_ecs_dashboard:cpu_total:Average
acs_ecs_dashboard:cpu_user:Average
acs_ecs_dashboard:cpu_wait:Average
acs_ecs_dashboard:disk_readbytes:Average
acs_ecs_dashboard:disk_readiops:Average
acs_ecs_dashboard:disk_writebytes:Average
acs_ecs_dashboard:disk_writeiops:Average
acs_ecs_dashboard:load_1m:Average
acs_ecs_dashboard:load_5m:Average
acs_ecs_dashboard:memory_actualusedspace:Average
acs_ecs_dashboard:memory_freespace:Average
acs_ecs_dashboard:memory_freeutilization:Average
acs_ecs_dashboard:memory_totalspace:Average
acs_ecs_dashboard:memory_usedspace:Average
acs_ecs_dashboard:memory_usedutilization:Average
acs_ecs_dashboard:net_tcpconnection:Average
acs_ecs_dashboard:networkin_errorpackages:Average
acs_ecs_dashboard:networkin_packages:Average
acs_ecs_dashboard:networkin_rate:Average
acs_ecs_dashboard:networkout_errorpackages:Average
acs_ecs_dashboard:networkout_packages:Average
acs_ecs_dashboard:networkout_rate:Average
根据上述配置,生成对应的查问 PromQL 如下:
* | select promql_query_range('avg({__name__=~"acs_ecs_dashboard:CPUUtilization:Average|acs_ecs_dashboard:DiskReadBPS:Average|acs_ecs_dashboard:DiskReadIOPS:Average|acs_ecs_dashboard:DiskWriteBPS:Average|acs_ecs_dashboard:DiskWriteIOPS:Average|acs_ecs_dashboard:InternetIn:Average|acs_ecs_dashboard:InternetInRate:Average|acs_ecs_dashboard:InternetOut:Average|acs_ecs_dashboard:InternetOutRate:Average|acs_ecs_dashboard:InternetOutRate_Percent:Average|acs_ecs_dashboard:IntranetIn:Average|acs_ecs_dashboard:IntranetInRate:Average|acs_ecs_dashboard:IntranetOut:Average|acs_ecs_dashboard:IntranetOutRate:Average|acs_ecs_dashboard:cpu_idle:Average|acs_ecs_dashboard:cpu_other:Average|acs_ecs_dashboard:cpu_system:Average|acs_ecs_dashboard:cpu_total:Average|acs_ecs_dashboard:cpu_user:Average|acs_ecs_dashboard:cpu_wait:Average|acs_ecs_dashboard:disk_readbytes:Average|acs_ecs_dashboard:disk_readiops:Average|acs_ecs_dashboard:disk_writebytes:Average|acs_ecs_dashboard:disk_writeiops:Average|acs_ecs_dashboard:load_1m:Average|acs_ecs_dashboard:load_5m:Average|acs_ecs_dashboard:memory_actualusedspace:Average|acs_ecs_dashboard:memory_freespace:Average|acs_ecs_dashboard:memory_freeutilization:Average|acs_ecs_dashboard:memory_totalspace:Average|acs_ecs_dashboard:memory_usedspace:Average|acs_ecs_dashboard:memory_usedutilization:Average|acs_ecs_dashboard:net_tcpconnection:Average|acs_ecs_dashboard:networkin_errorpackages:Average|acs_ecs_dashboard:networkin_packages:Average|acs_ecs_dashboard:networkin_rate:Average|acs_ecs_dashboard:networkout_errorpackages:Average|acs_ecs_dashboard:networkout_packages:Average|acs_ecs_dashboard:networkout_rate:Average"}) by (instanceId, __name__)', '1m') from metrics limit 1000000
对于个别场景而言,咱们能够在简化一些指标,这里间接提供对应的 PromQL 如下:
* | select promql_query_range('avg({__name__=~"acs_ecs_dashboard:CPUUtilization:Average|acs_ecs_dashboard:DiskReadBPS:Average|acs_ecs_dashboard:DiskReadIOPS:Average|acs_ecs_dashboard:DiskWriteBPS:Average|acs_ecs_dashboard:DiskWriteIOPS:Average|acs_ecs_dashboard:InternetIn:Average|acs_ecs_dashboard:InternetInRate:Average|acs_ecs_dashboard:InternetOut:Average|acs_ecs_dashboard:InternetOutRate:Average|acs_ecs_dashboard:InternetOutRate_Percent:Average|acs_ecs_dashboard:IntranetOut:Average|acs_ecs_dashboard:IntranetOutRate:Average|acs_ecs_dashboard:cpu_idle:Average|acs_ecs_dashboard:cpu_other:Average|acs_ecs_dashboard:cpu_system:Average|acs_ecs_dashboard:cpu_total:Average|acs_ecs_dashboard:cpu_user:Average|acs_ecs_dashboard:cpu_wait:Average|acs_ecs_dashboard:disk_readbytes:Average|acs_ecs_dashboard:disk_readiops:Average|acs_ecs_dashboard:disk_writebytes:Average|acs_ecs_dashboard:disk_writeiops:Average|acs_ecs_dashboard:load_1m:Average|acs_ecs_dashboard:load_5m:Average|acs_ecs_dashboard:memory_freespace:Average|acs_ecs_dashboard:memory_freeutilization:Average|acs_ecs_dashboard:memory_totalspace:Average|acs_ecs_dashboard:memory_usedspace:Average|acs_ecs_dashboard:memory_usedutilization:Average"}) by (instanceId, __name__)', '1m') from metrics limit 1000000
配置智能巡检工作
在【SLS 控制台】中找到【智能异样剖析】的入口,通过简略的初始化后,能够通过【智能巡检】的工作入口进入,找到对应的配置页面。在作业配置的过程中,应该留神这里要抉择时序库,否则无奈找到存储云监控数据的 MetricStore。
在特色配置中,通过如下的 Query 进行配置,这里也有几点须要留神的阐明:
- 通过 SQL 转写一下,并对 time 字段进行解决,因为在巡检中,承受的工夫的单位是秒,而 PromQL 失去的后果中 time 是毫秒;
- 通过 element_at 算子,提取出对应的实例 ID(instanceId);
- 目前在配置粒度时,最小只反对 60 秒;
* | select time / 1000 as time, metric, element_at(labels, 'instanceId') as instanceId, value from (select promql_query_range('avg({__name__=~"acs_ecs_dashboard:CPUUtilization:Average|acs_ecs_dashboard:DiskReadBPS:Average|acs_ecs_dashboard:DiskReadIOPS:Average|acs_ecs_dashboard:DiskWriteBPS:Average|acs_ecs_dashboard:DiskWriteIOPS:Average|acs_ecs_dashboard:InternetIn:Average|acs_ecs_dashboard:InternetInRate:Average|acs_ecs_dashboard:InternetOut:Average|acs_ecs_dashboard:InternetOutRate:Average|acs_ecs_dashboard:InternetOutRate_Percent:Average|acs_ecs_dashboard:IntranetOut:Average|acs_ecs_dashboard:IntranetOutRate:Average|acs_ecs_dashboard:cpu_idle:Average|acs_ecs_dashboard:cpu_other:Average|acs_ecs_dashboard:cpu_system:Average|acs_ecs_dashboard:cpu_total:Average|acs_ecs_dashboard:cpu_user:Average|acs_ecs_dashboard:cpu_wait:Average|acs_ecs_dashboard:disk_readbytes:Average|acs_ecs_dashboard:disk_readiops:Average|acs_ecs_dashboard:disk_writebytes:Average|acs_ecs_dashboard:disk_writeiops:Average|acs_ecs_dashboard:load_1m:Average|acs_ecs_dashboard:load_5m:Average|acs_ecs_dashboard:memory_freespace:Average|acs_ecs_dashboard:memory_freeutilization:Average|acs_ecs_dashboard:memory_totalspace:Average|acs_ecs_dashboard:memory_usedspace:Average|acs_ecs_dashboard:memory_usedutilization:Average"}) by (instanceId, __name__)', '1m') from metrics ) limit 10000
在上面的【算法配置】、【调度配置】中须要留神如下:
【工夫范畴】- 要抉择以后工夫的两天前,让算法有短缺的数据进行学习,这样成果更好;
【数据延时时长】- 因为咱们解决的是通过导入服务导入的云监控的数据,个别整体的链路延时最多不会超过 300s,因而这里要抉择 300 秒,防治观测丢点。
配置告警
通过 SLS 中提供的新版告警能够十分不便的对接机器学习的告警配置。您能够应用一整套告警的能力,对您的告警进行治理。
建议您应用一般模式却设置告警,在【口头策略】这一栏中,抉择咱们内置的口头策略(sls.app.ml.builtin),这里咱们曾经配置好了,具体能够在告警配置中进行查看,查看地址具体:
https://sls.console.aliyun.co…${projectName}/alertcenter?tab=action_policy
这里您要制订对应的申请地址(钉钉机器人的地址 webhook),内容模板抉择【SLS 智能巡检内置内容模板】。这样能够将【告警配置】与【巡检作业配置】解耦开来,后续用户需要批改【巡检作业】配置就能够实现告警配置的更新。至此,咱们在【云监控数据】中配置巡检算法的操作就实现了。
原文链接
本文为阿里云原创内容,未经容许不得转载。