y70.第四章 Prometheus大厂监控体系及实战 -- Prometheus监控介绍(一)
1.监控简介
亚马逊副总裁、CTO 沃纳 · 沃格斯(Werner Voegls)表示:“他/她/团队构建了它,并负责运营这个系统的基础架构. 作为管理者, 你们必须确保持续维护并管理这一平台。”

1.1 监控概述
系统层监控:
CPU、内存、网卡、磁盘利用率、带宽利用率、延迟、丢包率、交换机、路由器、防火墙等基础设置监控
web监控:
打开速度、URL打开状态码、API接口可用性
业务监控:
订单交易量、活跃用户量、支付量
中间件监控:
数据库、redis、kafka、MQ、API等
AI助手
1.2 监控规划


1.3 监控方案
开源网络性能与故障管理工具:包括但不限于网络性能分析工具(Cacti)、系统状态监视器(Nagios)、综合管理平台(Zabbix)、网络连通性测试工具(SmokePing)、企业级协议解析工具(Open-Falcon)及系统性能可视化平台(Prometheus),适用于企业级网络环境的综合管理解决方案等
1.3.1 Cacti
https://github.com/Cacti/cacti
Cacti是基于LAMP平台展现的网络流量监测及分析工具,通过SNMP技术或自定义脚本从目标设备/主机获取监控指标信息;其次进行数据存储,调用模版将数据存到数据库,使用rrdtool存储和更新数据,通过rrdtool绘制结果图形;最后进行数据展现,通过Web方式将监控结果呈现出来,常用于在数据中心监控网络设备。
AI助手
1.3.2 Nagios
Nagios用来监视系统和网络的开源应用软件,利用其众多的插件实现对本机和远端服务的监控,当被监控对象发生异常时,会及时向管理员告警,提供一批预设好的监控插件,用户可以之间调用,也可以自定义shell脚本来监控服务,适合各企业的业务监控,可通过Web页面显示对象状态、日志、告警信息,分层告警机制及自定义监控相对薄弱。
AI助手
1.3.3 Smokeping
https://oss.oetiker.ch/smokeping/
Smokeping是一款用于网络性能监测的开源监控软件,主要用于对IDC的网络状况,网络质量,稳定性等做检测,通过rrdtool制图方式,图形化的展示网络时延情况,进而能够清楚的判断出网络的即时通信情况。
AI助手
1.3.4 Open-falcon
https://github.com/XiaoMi/open-falcon
https://book.open-falcon.org/zh_0_2/
小米公司开源出来的监控软件open-falcon(鹰隼),监控能力和性能较强。
AI助手

1.3.5 Nightingale 夜莺
一款经过大规模生产环境验证的、分布式高性能的运维监控系统,有滴滴基于open-falcon二次开发后开源出来的分布式监控系统。
AI助手

1.3.6 Zabbix
目前使用较多的开源监控软件,可横向扩展、自定义监控项、支持多种监控方式、可监控网络与服务等。
AI助手
1.3.7 商业监控解决方案
监控宝(https://www.jiankongbao.com/)
听云(https://www.tingyun.com/)
AI助手
1.3.8 Prometheus
基于Go语言开发的一套开源监控、报警以及时间序列数据库的集成方案,
由Soundcloud公司开发作为开源监控系统的平台,
自2016年起加入云原生计算基金会(Cloud Native Computing Foundation, CNCF),
于2018年8月9日, Prometheus正式成为CNCF继Kubernetes之后退出的第二个毕业项目,
Prometheus在容器化与微服务架构中得到了广泛应用,
并且被广泛应用于该领域的发展过程中,
其特点主要如下:
使用key-value的多维度式保存数据
数据不使用Mysql这样的传统数据库,而是使用时序数据库,目前是使用的TSDB,https://www.aliyun.com/product/hitsdb #阿里元TSDB简介
支持第三方dashboard实现更高的图形界面,如Grafana(Grafana 2.5.0版本及以上)
功能组件化
不需要依赖存储,数据可以本地保存也可以远程保存
服务自动化发现
强大的数据查询语句功能(PromQL,prometheus Query Language)
支持不同语言开发的客户端
官方和社区推广很多exproter #https://prometheus.io/docs/instrumenting/exporters/
AI助手
2.prometheus简介和安装
2.1 Prometheus监控介绍
2.1.1 prometheus简介
作为一款广泛应用于系统监控的关键组件。Prometheus不仅是一款时序数据库(time series database),更是一个开源项目,在Kubernetes容器生态系统中已扩展至第三方服务提供者,并已整合了来自多个领域的专业知识以提升性能表现。作为一个开源项目。现已被CNCF基金会接纳。并已扩展至Kubernetes生态体系中作为第三方服务提供者。它不仅具备强大的性能表现能力——能够支撑上万台规模集群的工作负载——而且具备高度可扩展性——也能够通过pushgateway实现数据上传。常与各种工具和技术集成以满足不同场景下的需求
Prometheus的核心机制基于HTTP协议进行周期性抓取(pull)被监控组件的状态信息。其优势在于任意组件只需提供HTTP接口即可接入监控系统,并无需任何SDK或其他集成工具的支持。
该方案特别适用于基于虚拟化环境如VM或Docker进行HTTP调用的情形,在配置文件指定的网络端点(endpoint)上定期采集指标数据

包括白启动模式和黑启动模式。
其核心特征是系统内部自动生成指标数据。
这些指标数据由被 monitored 系统自行产生。
这种模式被称为 white box monitoring.
黑盒监控则是一种完全不干预目标系统的安全态势感知方式,在不影响系统正常运行的前提下实时跟踪当前运行状态。这种方法既可被亲切地称为黑盒监控技术,在实际应用中也可称为基于探测工具的实时监测方案。
该系统可提供多种监控策略,并支持基于白盒技术的方案。当选择该方法时,系统将通过三种不同的抓取手段从目标中收集关键指标数据。
Exporters
Instrumetation(测量系统)
Pushgateway

Prometheus相较于其他TSDB具有显著特征:该系统能够主动从各个目标(target)处获取数据,并不依赖于等待监控端进行数据推送。
两个方式各有优劣,其中,Pull 模型的优势在于:
有利于将配置集在 Prometheus Server 上完成,包括指标及采集速率等
Prometheus的核心任务旨在收集在Target上提前完成了数据汇总的汇总数据集,并非一种基于事件驱动的传统存储架构。
2.1.2 时序数据库简介
时序数据是在特定时间段内经过多次测量(measurement)所获得的一系列观测值的汇总,并且这些观测值被绘制到图形上具有一个数据轴和一个时间轴。

服务器指标数据、应用程序性能监控数据、网络数据等也都是时序数据
2.1.3 prometheus特点
- 多维度数据模型:由名称和键值对构成的时间序列数据能够实现聚合、切割等核心功能。每个metric均可赋予任意多维度标签以满足复杂分析需求。
- 灵活的查询语言(PromQL)支持加法、乘法以及连接操作等多种功能组合。
- 该系统可直接部署于本地环境而无需依赖其他分布式存储平台。
- 数据采集采用基于HTTP协议的pull请求方式进行实时获取。
- 通过服务探测或静态配置信息定位目标服务对象(targets)。
- 系统提供丰富的可视化界面供用户选择展示形式。
- 每个采样点占用约3.5字节空间,在线密度下连续记录60天时间序列数据(间隔约3秒),预计总存储量为689,199,848,728字节(约672GB)。
2.1.4 prometheus组件介绍
Prometheus 主要承担时序型指标数据的采集与存储功能;然而,在数据分析、整合以及直观展示等方面的功能不包括在 Prometheus Server 的职责范围内。

Prometheus Server 负责接收来自客户端库以及 exporter 的时间序列数据,并对其进行存储和管理。
Prometheus Client Library 是一个客户端库系统,在运行于应用程序代码之上时能够自动检测到目标服务的 metrics 信息,并通过 prometheus server 实现功能集成。
在 Prometheus Server 中定义了多种 Exporter 类型(如 Prometheus Exporter 和 Telegraf Exporter),这些 exporter 可以将采集到的 metrics 数据发送到 prometheus server 端。
Alertmanager 系统负责从 prometheus server 接收告警通知并进行处理,在告警处理过程中会对告警进行去重、分类以及路由设置。
promethues 提供了内置的 Prometheus Web UI 和第三方可视化工具 Grafana 来实现 metrics 的展示与分析功能。
Pushgateway 作为中间件节点,在其下游配置有多个 target 目标主机,在这些 target 主机上生成指标数据后会通过 Pushgateway 进行转发。
Service Discovery 功能模块的主要职责是动态发现待监控的目标服务或组件,在容器化应用中具有重要的实用价值;该模块由 Prometheus Server 内置支持,并通过配置文件自动生成静态资源列表实现服务发现。
为了方便管理目标服务的 metrics 数据配置项(Scrape),promethues 在目标配置中引入了 METRIC 集合这一概念
2.1.5 prometheus架构图
Prometheus生态系统的整体架构主要由以下组件构成:主节点服务器负责核心服务运行;数据采集模块完成实时数据采集;通过数据推送给 gateway 的通道实现与第三方服务的数据交互;告警管理模块提供全方位监控与告警响应能力;可视化平台基于 Grafana 实现数据分析与展示;前端控制台界面提供操作管理和监控功能。
Prometheus server由三个部分组成,Retrieval,Storage,PromQL
Retrieval负责在活跃的target主机上抓取监控指标数据
Storage存储主要是把采集到的数据存储到磁盘中
该系统不仅支持了内置查询语言PromQL,并且提供了强大的数据检索能力;同时配备了功能完善的可视化调试界面;还有一套直观的数据可视化展示系统。

prometheus工作流程是
该系统通过定期从活跃的(up)目标主机上(target)收集监控指标数据。其监控数据通常可通过配置静态job或通过服务发现机制被Prometheus server采集。此默认采用pull方式获取数据;此外,还可以使用pushgateway将采集的数据上报至Prometheus server;此外,各组件自身也可能配备有exporter以直接提供相关数据。
Prometheus服务器负责收集并存储来自设备的监控指标数据至本地硬盘或数据库。
Prometheus采集的监控指标数据按照时间序列进行存储;配置相应的报警规则后,将触发的报警信息发送至alertmanager中。
4). Alertmanager 通过配置报警接收方,发送报警到邮件,微信或者钉钉等
5). Prometheus 自带的web ui界面提供PromQL查询语言,可查询监控数据
6).Grafana 可接入 prometheus 数据源,把监控数据以图形化形式展示出
Prometheus 的局限性
- 1)Prometheus 是一个指标监控工具,在处理事件和日志记录方面并不擅长;它更侧重于趋势性监控而非提供精确的数据值
- 2)从设计初衷来看,Prometheus 更关注近期的监控数据需求,在本地存储资源仅限于一个月的时间段内;因此它不具备对大量历史数据进行直接存储的能力。如果用户确实需要长期的历史数据存储功能,则建议采用远程化解决方案,并将数据存儲至InfluxDB或OpenTSDB等系统中
- 3)就集群机制的成熟度而言,Prometheus尚不成熟,即使基于Thanos也同样面临这一问题
2.1.6 Prometheus 数据模型
Prometheus 主要用于以 key-value 形式存储时间序列数据,并不支持存储文本信息
其中的键被称为指标(metric),通常用于表示 CPU 速率、内存使用率或分区空闲比例等关键参数。
同一指标可能被多个目标或设备适配,在这种情况下该指标通过标签作为元数据进行扩展。
这些标签也可通过过滤器来进行指标筛选和聚合计算。

1)Metric 名字
用于标识时间序列的数据集名称通常用来描述其一般特性;例如,在网站访问总量方面的指标通常以website_visits_total这样的变量命名。 这些名称仅由ASCII字母、数字、下划线和冒号组成。
2)标签(Labels)
以 __为前缀的标签名称保留给普罗米修斯内部使用。
3)时间序列元素
4)Metric 保留时长
普罗米修斯专为实现短期监视与告警功能而设计。它通常在本地数据库中存储最多15天的时间序列数据。若需延长数据保存期限,则可将所需数据提交至远程第三方服务提供商。该系统具备向外部存储机构写入数据的能力。
5)安全模型
普罗米修斯采用了多种途径进行配置和部署方案的设计。该系统基于信任模型提出了两个较为宽泛的假设:
- 不受信任的用户将被允许通过普罗米修斯服务器的HTTP API获取数据库中的所有数据。
- 仅限于受信任的用户才能访问Prometheus及其组件的相关文档和配置信息。
随着Prometheus 2.0版本的发布, HTTP API中的某些管理功能被默认禁用了。
由此可知, 普罗米修斯及其组件并未提供任何服务器端的身份验证、授权或加密功能。
当您在更安全环境中工作时, 您必须实施额外的安全措施, 如提前关闭Prometheus服务器以使用反向代理, 或者通过代理机制来处理exporter的数据。
2.1.7 指标类型(Metric Types)
通过多种方式表示指标状态和趋势:包括计量型计数器、A类量测器型式别名、总计型计数器和直方图。
2.1.7.1 Counter:计算器
用于存储持续增长的数据(如网站访问量、日志条数等),该系统始终维持非负值状态,并提供不可减小的统计数据(如http请求总数、发生错误的数量)。其统计数据呈现递增趋势,并且只能通过累加的方式获取信息(如总处理时间包括CPU累计使用的时长等指标)。此外该系统支持将计数值重置回零以便重新开始统计(如已完成的任务数量等)。
2.1.7.2 Gauge:仪表盘
用于存储具有波动特性的指标数据。例如统计CPU使用率、内存使用率、磁盘使用率以及温度等指标。同样能够记录指标的上升和下降次数。Gauge是Counter的扩展类别,在指示器数据不会丢失的情况下能够准确反映随时间的变化;然而,在某些情况下可能出现数据丢失问题时,则需要优先选择Counter。
2.1.7.3 Histogram:直方图
该系统会在一段内对数据进行采样,并将该数据计入可配置的 bucket 之中; Histogram能够有效地存储更多信息, 包括样本值分布在每个 bucket(bucket自身具有可配置参数)中的数量、所有样本值之和以及总的样本数量, 因此 Prometheus 可以通过内置函数支持以下操作: 计算每组 bucket 的平均值, 统计满足条件的数据总数等。
- 估算样本均值:通过累加所有数值后再除以其总数量来确定。
- 估算样本分位数:用于分析满足特定条件的数据点数量情况。例如,在评估响应时间超过1秒的请求数量时可使用此方法;若超过20%,则建议触发报警机制。
Histogram由 _bucket{le=“”},_bucket{le=“+Inf”}, _sum,_count 组成
如
apiserver_request_latencies_sum、apiserver_request_latencies_count、apiserver_request_latencies_bucket
AI助手
2.1.7.4 Summary:摘要
该方法在扩展类型中应用广泛,在此过程中直接通过监控端自行聚合计算得出各区间内的分位数值,并将这些数值传递给 Prometheus Server 进行采样记录。因此,在此过程中,分位数的计算由监控端完成。该方法主要用于反映一段时间内数据采样的结果(通常包括请求持续时间和响应大小等)。此外,在该方法下还可以实现对度量值总和、度量值分位数以及指定时间段内度量值的分位数进行计算。这些功能均通过 {quantile=“<φ>”}、_sum 和 _count 三者组成
2.1.8 作业(Job)和实例(Instance)
Instance:支持接收 Prometheus Server 数据的处理操作的所有网络端点(endpoint),即为此处定义的一个 Instance(实例)。
一般情况下,具有类似功能的实例集合称为Job实例。例如说,在MySQL主从复制系统中所有的进程构成了一个完整的Job实例。

2.1.9 PromQL
Prometheus 支持内建的 PromQL(Prometheus Query Language)语言,并且能够同时支持实时数据查询和数据聚合操作。
PromQL 支持处理两种向量,并内置提供了一组用于数据处理的函数
实时向量:基于最近一次时间戳收集的数据指标。
时间范围向量:基于预设的时间区间内全部的时间戳收集的数据指标。

2.1.10 Instrumentation(程序仪表)
任何能够支持 Scrape 指标数据的应用程序都首先要具有一个测量系统
在 Prometheus 环境中, Instrumentation 指的是集成到应用程序中的那些工具,它们负责将程序指标数据以易于获取的方式展示出来.开发人员通过这些工具库编写代码,以生成并提供可显示的指标数据.

2.1.11 Exporters
对于那些不内置Instrumentation,并且同样难以自行添加此类组件以暴露指标数据的应用程序而言,在待监控的目标应用程序外部运行一个独立指标暴露程序的做法较为常见。这些类型的应用程序通常被归类为Exporter类型
另一种说法是,Exporter 负责从目标应用程序中收集并整合原始数据格式,并将其转换为Prometheus数据格式以便对外提供。Prometheus站点上提供了丰富的Exporter资源。但是,在这种情况下,当我们的模型遇到复杂的场景时,在推理过程中可能会面临性能上的挑战。

2.1.12 Alerts
在捕获异常数据点后,Prometheus 拥有能力向用户发送告警信息或发出警示,并从而促使用户采取相应的应对措施。
Prometheus Server主要负责生成告警指示,并将详细的行为处理交由独立的应用程序AlertManager完成
- 根据用户的配置参数定期计算并生成相应的 ... 告警指标。
- 当 AlertManager 接收到 PrometheusServer 发送的特定类型告警通知时,在指定的路由路径上传递这些 ... alert messages 到相应的 receivers。

