0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

《基于时间序列数据进行有效报警》的实践总结

马哥Linux运维 来源:马哥Linux运维 作者:马哥Linux运维 2022-07-11 11:29 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

本文可以看做是对《SRE》一书第10章《基于时间序列数据进行有效报警》的实践总结。 Prometheus是一款开源的业务监控软件,可以看作是Google内部监控系统 Borgmon 的一个(非官方)实现。 本文会介绍我近期使用Prometheus构建的一套完整的,可用于中小规模(小于500节点)的半自动化(少量人工操作)监控系统方案。

主动监控

监控是运维系统的基础,我们衡量一个公司/部门的运维水平,看他们的监控系统就可以了。 监控手段一般可以分为三种:

主动监控:业务上线前,按照运维制定的标准,预先埋点。具体的实现方式又有多种,可能通过日志、向本地 Agent 上报、提供 REST API 等。

被动监控:通常是对主动监控的补充,从外围进行黑盒监控,通过主动探测服务的功能可用性来进行监控。比如定期ping业务端口

旁路监控:主动监控和被动监控,通常还是都在内部进行的监控,内部运行平稳也不能保证用户的体验都是正常的(比如用户网络出问题),所以仍然需要通过舆情监控、第三方监控工具等的数据来间接的监控真实的服务质量。

主动监控是最理想的方案,后两种主要用作补充,本文只关注主动监控。 监控实际是一个端到端的体系(基础设施-服务器-业务-用户体验),本文只关注业务级别的主动监控。

Prometheus

为什么选择Prometheus而不是其它TSDB实现(如InfluxDB)?主要是因为Prometheus的核心功能,查询语言 PromQL,它更像一种可编程计算器,而不是其那么像 SQL,也意味着 PromQL 可以近乎无限之组合出各种查询结果。 比如,我们有一个http服务,监控项http_requests_total用于统计请求次数。某一组监控数据可能是这个样子:

http_requests_total{instance="1.1.1.1:80",job="cluster1",location="/a"} 100http_requests_total{instance="1.1.1.1:80", job="cluster1", location="/b"} 110http_requests_total{instance="1.1.1.2:80", job="cluster2", location="/b"} 100http_requests_total{instance="1.1.1.3:80", job="cluster3", location="/c"} 110 这里有3个标签,分别对应抓取的实例,所属的 Job(一般我用集群名),访问路径(你可以理解为Nginx的location),Prometheus多维数据模型意味着我们可以在任意一个或多个维度进行计算:

如果你想统计单机qps,sum(rate(http_requests_total[1m])) by (instance)

如果想用统计每个集群每个不同 location 的 path 的 qps,sum(rate(http_requests_total[1m])) by (job, path),PromQL会依据标签job-path的值聚合出结果。

除了PromQL,丰富的数据类型可以提供更有意义的监控项:

Counter(计数器):标识单调递增的数据,比如接口访问次数。

Gauge(刻度):当前瞬时的一个状态,可能增加,也可能减小,比如CPU使用率,平均延时等等。

Historgram(直方图):用于统计数据的分布,比如95 percentile latency。

大部分监控项都可以使用Counter来实现,少部分使用Gauge和Histogram,其中Histogram在服务端计算是相当费CPU的,所以也没要导出太多Histogram数据。 最后,Prometheus采用PULL模型的实时抓取存储计算,主动去抓取监控实例数据,相比于PUSH模型对业务侵入更低,相比于基于log的离线统计则更实时,而监控实例只需提供一个文本格式的/metrics接口也更容易debug。

服务框架的改造

笔者所在团队使用统一的服务框架来规范项目开发并有效降低了开发难度。 这里先介绍下我们的服务框架:

类似于 Nginx 的多进程架构(master/worker),但同时也支持多线程的事件循环编程模型

支持多种接入协议(HTTP,Thrift,PB等),但主流是HTTP

业务通过 Module 来加载进框架执行(类似 Nginx 的 module,但更简单)

提供纯异步的下游访问 API

为了使服务框架可以导出内部监控项,主要涉及几方面的工作:

提供基础数据类型

目前并没有官方的Prometheus Client Library,几种开源实现也都不太符合框架的需求。目前实现了支持多线程多进程的Counter和Histogram(除了初始化之外,更新操作都是无锁的),而Gauge由于多进程场景有的情况是无法聚合监控数据的(没用统一的聚合方法,并不一定都可以相加),所以没有提供具体实现

基础数据要有类似注册表的功能,方便自动导出数据到/metrics接口

在服务框架埋点

要足够灵活,将容易变化的信息通过标签来表达。 比如一个web服务可能有echo,date两个location,如果要统计它们qps,不要定义echo_requests_total,date_requests_total两个不同名字的 metrics,而应该定义一个名为http_requests_total的 metrics,通过标签location(分别为echo/date)来区分,这样再增加/减少接口是不需要改代码的

理想情况是业务几乎为各种通信功能自行埋点,所以内置埋点要将常用监控项都要覆盖到(QPS,Latency,Error Ratio)

数据的抓取与展现

具备导出能力后,就可以通过Prometheus 进行抓取了,但还有几个小坑: 用户定义的metrics名字,可能是不符合Prometheus规范的,而遇到一条不合法的数据,Prometheus就会停止抓取,所以导出数据时要先做一遍过滤和改写 要控制导出数据规模,一些只对单机监控有意义的数据可以不导出(框架有针对单机的监控页面) 在使用 Prometheus 时,也有几个地方要注意: Prometheus即是一个CPU密集型(查询)也是一个IO密集型(数据落地)的,CPU数量是多多益善,内存越大越好(来缓存抓取的数据,所以应该减少不必要的业务数据导出),尽量要使用SSD(这个很关键!),因为一旦Prometheus的内存使用量达到阈值会停止抓取数据!这个停止抓取的时间,至少是分钟级,甚至是无法恢复!所以只要有条件就要用SSD。 Prometheus号称支持 reload,但目测不是很好用,比如你修改了告警规则文件,重载之后,新旧告警规则似乎会一起计算执行…. Prometheus本身也提供图形界面,但是很简陋:

5780048a-00c3-11ed-ba43-dac502259ad0.png

通常还是使用Grafana来展示监控数据。

57993eaa-00c3-11ed-ba43-dac502259ad0.png

因为是统一的业务框架,统一的监控指标,所以 Grafana 的 Dashboard 很容易统一配置:

我没有找到将默认模板打包进 Grafana 的方法,只能迂回的创建了一个新的Grafana Plugin,在启动之后,每个业务实例只需要启动下这个插件,然后配置一个默认的 Prometheus 数据源,就可以使用统一的监控 Dashboard

Dashboard 分为3行

第一行展示实时的 QPS,平均延时,平均排队时间,Coredump 数量,下游引擎失败率,下游引擎延时变化

第二行展示业务的延迟(50%和95%延迟),流量,吞吐(按照不同错误码)

第三行展示下游引擎的延迟(50%和95%延迟),流量,吞吐(按照不同错误码)

能够展示 Prometheus 强大威力的是,这里面每一个图表,都可以同时展示所有机房的监控指标,而每一个指标的计算只需要一条 Query 语句。比如第一行第五列,各个机房的各个下游的失败率统计并排序,只用了一条语句:

topk(5, 100*sum(rate(downstream_responses{error_code!="0"}[5m])) by (job, server)/sum(rate(downstream_responses[5m])) by (job, server)) 注意这里的Range Vector Selector - [5m],意味着我们是基于过去5分钟的数据来计算rate,这个值取的越小,得到的监控结果波动越大,越大则越平滑,选择多大的值,取决于你想要什么结果。建议图表使用5m,而告警规则计算采用1m。如果业务不是很重要,可以适当增大这个值。 这一套监控模板基本覆盖了业务对可用性监控的需求,同时业务也可以自己定义监控指标并进行监控。

AlertManager

Prometheus 周期性进行抓取数据,完成抓取后会检查是否有告警规则并进行计算,满足告警规则就会触发告警,发送到 alertmanager。基于这个流程,当你在监控图表看到异常时,告警已经先行触发了。

57aa5f82-00c3-11ed-ba43-dac502259ad0.png

默认情况我们配置了不到10条告警规则,要注意的是周期的选择,过长的话会产生较大延迟,太短的话一个小的流量波动都会导致大量报警出现。 Prometheus 的设计是产生报警,但报警的汇总、分发、屏蔽则在 AlertManager 服务完成。

57c574b6-00c3-11ed-ba43-dac502259ad0.png

AlertManager 目前还是非常简单的,但它可以将告警继续分发到其他接收者:

可以通过webhook机制,发送告警到一个中间服务转换格式再发送到内部告警接口

如果使用第三方告警管理平台,如PageDuty、OneAlert,可以直接用内置的 pageduty 支持或 webhook 发送告警过去

如果是一穷二白的团队,建议配置 email + slack,实现告警归档和手机 Push

更复杂告警分级管理,AlertManager 还是有很长的路要走,这个话题也值得今后单独讲下。

Prometheus + Grafana + Mesos

Prometheus + Grafana 的方案,加上统一的服务框架,可以满足大部分中小团队的监控需求。我们将这几个组件打包一起部署在 Mesos 之上,统一的安装包进一步降低监控系统部署的难度,用户需要配置一些简单的参数即可。但还需要注意几点:

目前并没有将 Prometheus 和 Grafana 容器化部署,因为这两者本身就没有什么特殊依赖;安装包存储在 minio 中。

由于 Prometheus 系统的特殊性,我们通常将其指定在一台固定的机器上执行,且将数据落地到一个固定的目录,这样重启 Prometheus 的影响会非常低

Grafana 是展示给用户的,需要尽可能的保持固定入口,所以我们通过HAPROXY_CONSUL给其配置了代理

57d7909c-00c3-11ed-ba43-dac502259ad0.png

结 论

Prometheus 是相当强大并快速成长的一个监控系统实现,虽然在稳定性、性能、文档上仍有很大提升空间,但对于中小团队是一个很棒的选择,通过定制服务框架,设计完善的埋点,统一的Prometheus/Grafana配置模板,再加上Mesos平台,可以半自动化的部署实时业务监控系统。

审核编辑 :李倩

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 监控系统
    +关注

    关注

    21

    文章

    4197

    浏览量

    185267
  • 时间序列
    +关注

    关注

    0

    文章

    32

    浏览量

    10719

原文标题:无监控,不运维!Prometheus 在线服务的监控实操指南

文章出处:【微信号:magedu-Linux,微信公众号:马哥Linux运维】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    通过DSC实现VI与TestStand序列交互

    DSC是LabVIEW中工业监控与数据记录的核心模块。该教程通过DSC创建了共享变量,主程序中将共享变量值改变注册为事件,事件会将共享变量值更新在前面板上。在程序执行过程中,TestStand序列
    的头像 发表于 05-25 15:07 112次阅读
    通过DSC实现VI与TestStand<b class='flag-5'>序列</b>交互

    JSON:简洁代码高效搞定序列化与反序列

    面对频繁的数据交互需求,用最简方式实现JSON序列化与反序列化已成为开发者必备技能,借助主流库,轻松实现零负担数据转换。JSON(JavaScriptObjectNotation)是一
    的头像 发表于 02-25 19:04 315次阅读
    JSON:简洁代码高效搞定<b class='flag-5'>序列</b>化与反<b class='flag-5'>序列</b>化

    极简代码,搞定JSON序列化与反序列

    快速实现JSON数据的生成(序列化)与解析(反序列化)。 目前json库已全面支持LuatOS开发系列产品,开发者可根据项目实际需求,灵活选用并进行快速集成与开发。 一、 JSON基础
    的头像 发表于 02-23 21:46 505次阅读
    极简代码,搞定JSON<b class='flag-5'>序列</b>化与反<b class='flag-5'>序列</b>化

    【「Altium Designer 25 电路设计精进实践」阅读体验】+本书概览与内容特点介绍

    本文以AD 25版本为依托,介绍了AD25进行电子电路设计的方法,理论结合实践。 内容概览先来概览下本书的内容,看一本书的内容,从其目录就可以看到个大概本书分为以下章节,总体上来说还是按照先理论再
    发表于 02-14 15:56

    智能开关怎么做到对用电设备的有效监控管理?

    进行预警,还更关注运行行为本身是否存在异常模式。 这为后续的风险分析、故障定位和运维决策提供了更可靠的数据基础,而非仅停留在简单的阈值报警层面。 4、灵活组网与项目适配能力:降低网络安装重构成本 在多项
    发表于 01-31 09:58

    2024年度技术总结——MCU与MEMS和TOF应用实践

    认识到,技术的进步不仅仅是理论上的突破,更需要在客户应用场景中进行实践和验证。技术不应仅限于闭门造车,它的真正价值是在实际项目中落地,并为产品赋能,从而解决现实世界中的挑战。 通过对客户项目
    的头像 发表于 12-22 15:04 1578次阅读
    2024年度技术<b class='flag-5'>总结</b>——MCU与MEMS和TOF应用<b class='flag-5'>实践</b>

    一文读懂LSTM与RNN:从原理到实战,掌握序列建模核心技术

    在AI领域,文本翻译、语音识别、股价预测等场景都离不开序列数据处理。循环神经网络(RNN)作为最早的序列建模工具,开创了“记忆历史信息”的先河;而长短期记忆网络(LSTM)则通过创新设计,突破
    的头像 发表于 12-09 13:56 2024次阅读
    一文读懂LSTM与RNN:从原理到实战,掌握<b class='flag-5'>序列</b>建模核心技术

    ATA-D60090功率放大器在时间调制序列生成中的应用

    利用计算机生成波束扫描所需的的波束扫描的时间编码序列。根据时间编码序列,任意信号发生器产生的方波信号通过功率放大器产生控制电压信号。
    的头像 发表于 11-30 14:27 581次阅读
    ATA-D60090功率放大器在<b class='flag-5'>时间</b>调制<b class='flag-5'>序列</b>生成中的应用

    桂花网M1000:轻量型蓝牙网关的场景落地与客户实践

    :AES-128 加密与 TLS1.2 传输协议,满足医疗、工业等数据敏感场景需求。 这些特性使其成为固定网络缺失、需动态移动、需快速搭建连接场景的优选方案。 二、三大核心应用场景与客户实践 (一)智慧医疗:移动
    发表于 11-12 16:59

    校园一键报警

    报警
    jf_55301954
    发布于 :2025年11月06日 16:46:52

    时间频率标准源有什么功能

    时间频率
    西安同步电子科技有限公司
    发布于 :2025年11月04日 17:58:08

    报警芯片怎样选择?报警器用的什么芯片?报警芯片的主要类型?常见报警芯片推荐?防盗器芯片有哪些?

    选择报警芯片时,需要根据具体的应用场景、功能需求、成本预算和性能要求进行综合评估。以下是选择报警芯片时需要考虑的几个关键因素,帮助你做出更合适的选择:
    的头像 发表于 09-22 18:55 727次阅读
    <b class='flag-5'>报警</b>芯片怎样选择?<b class='flag-5'>报警</b>器用的什么芯片?<b class='flag-5'>报警</b>芯片的主要类型?常见<b class='flag-5'>报警</b>芯片推荐?防盗器芯片有哪些?

    LP5560可编程单LED驱动器数据手册总结

    LP5560 是一款可编程 LED 驱动器,可生成各种闪烁序列,每个序列最多三个不同长度的脉冲。闪烁序列可以通过单线接口进行编程。可编程参数包括开启和关闭
    的头像 发表于 08-29 11:07 1401次阅读
    LP5560可编程单LED驱动器<b class='flag-5'>数据</b>手册<b class='flag-5'>总结</b>

    TPS38700-Q1 电源供应序列总结

    计,可与多通道电压监控器连接。该器件默认为预编程的OTP选项,但I2C可以根据需要对上电和断电序列、看门狗设置和序列时序选项进行重新编程。
    的头像 发表于 08-18 15:17 1094次阅读
    TPS38700-Q1 电源供应<b class='flag-5'>序列</b>器<b class='flag-5'>总结</b>

    微五科技CF5010RBT60开发板试用体验+气体报警器项目demo

    微五科技CF5010RBT60开发板试用体验+气体报警器项目上期我们总结了关于CF5010RBT60开发板试用体验,本篇我给大家分享一个使用CF5010RBT60开发板做的一个气体报警器项目原型
    发表于 08-05 11:38