# Prometheus监控系统 # Prometheus简介 ## 什么是Prometheus? Prometheus是由前 Google 工程师从 2012 年开始在 Soundcloud以开源软件的形式进行研发的系统监控和告警工具包,自此以后,许多公司和组织都采用了 Prometheus 作为监控告警工具。Prometheus 的开发者和用户社区非常活跃,它现在是一个独立的开源项目,可以独立于任何公司进行维护。为了证明这一点,Prometheus 于 2016 年 5 月加入CNCF基金会,成为继 Kubernetes 之后的第二个 CNCF 托管项目。 ## Prometheus的优势 Prometheus 的主要优势有: - 由指标名称和和键/值对标签标识的时间序列数据组成的多维数据模型 - 强大的查询语言 PromQL - 不依赖分布式存储;单个服务节点具有自治能力。 - 时间序列数据是服务端通过 HTTP 协议主动拉取获得的。 - 也可以通过中间网关来推送时间序列数据 - 可以通过静态配置文件或服务发现来获取监控目标。 - 支持多种类型的图表和仪表盘。 ## Prometheus的组件、架构 Prometheus 的整体架构以及生态系统组件如下图所示: ![img](Prometheus/9Qt5yi.jpg) Prometheus Server 直接从监控目标中或者间接通过推送网关来拉取监控指标,它在本地存储所有抓取到的样本数据,并对此数据执行一系列规则,以汇总和记录现有数据的新时间序列或生成告警。可以通过 Grafana或者其他工具来实现监控数据的可视化。 - Prometheus server是Prometheus架构中的**核心组件**,基于go语言编写而成,无第三方依赖关系,可以独立部署在物理服务器上、云主机、Docker容器内。主要用于收集每个目标数据,并存储为时间序列数据,对外可提供数据查询支持和告警规则配置管理。 - Prometheus服务器可以对监控目标进行静态配置管理或者动态配置管理,**它将监控采集到的数据按照时间序列存储在本地磁盘的时序数据库中**(当然也支持远程存储),自身对外提供了自定义的PromQL语言,可以对数据进行查询和分析 - Client Library是用于检测应用程序代码的客户端库。在监控服务之前,需要向客户端库代码添加检测实现Prometheus中metric的类型。 - Exporter(数据采集)用于**输出被监控组件信息的HTTP**接口统称为Exporter(导出器)。目前互联网公司常用的组件大部分都有Expoter供**直接使用**,比如Nginx、MySQL、linux系统信息等。 - Pushgateway是指用于支持短期临时或批量计划任务工作的汇聚节点。主要用于短期的job,此类存在的job时间较短,可能在Prometheus来pull之前就自动消失了。所以针对这类job,设计成可以直接向Pushgateway推送metric,这样Prometheus服务器端便可以定时去Pushgateway拉去metric - Pushgateway是prometheus的一个组件,prometheus server默认是通过exporter主动获取数据(默认采取pull拉取数据),pushgateway则是通过被动方式推送数据到prometheus server,用户可以写一些自定义的监控脚本把需要监控的数据发送给pushgateway, 然后pushgateway再把数据发送给Prometheus server - 总结就是pushgateway是prometheus的一个组件,是通过被动的方式将数据上传至prometheus。这个可以解决不在一个网段的问题 - Alertmanager主要用于处理Prometheus服务器端发送的alerts信息,对其去除重数据、分组并路由到正确的接收方式,发出**告警**,支持丰富的告警方式。 - Service Discovery:**动态发现**待监控的target,从而完成监控配置的重要组件,在容器环境中尤为重要,该组件目前由Prometheus Server内建支持 参考博客:https://blog.51cto.com/u_986899/5658872 ## Prometheus适用于什么场景 Prometheus适用于记录**文本格式的时间序列**,它既适用于以机器为中心的监控,也适用于高度动态的面向服务的监控,在微服务的世界中,它对多维数据收集和查询的支持有特殊优势。Prometheus是专为提高系统可靠性而设计的,它可以在断电期间快速诊断问题,每个Prometheus Server都是相互独立的,不依赖于网络存储或者其他远程服务。当基础架构出现问题时,你可以通过Prometheus快速定位故障点,而且不会消耗大量的基础架构资源。 ## Prometheus不适合什么场景 Prometheus非常重视可靠性,即使在出现故障的情况下,你也可以随时统计有关系统的可用系统信息。如果你需要百分之百的准确度,例如按请求数量计费,那么Prometheus可能不太适合你,因为它收集的数据可能**不够详细完整精确**。 # 相关概念 ## 数据模型 Prometheus所有采集的监控数据均以**指标的形式**保存在内置的时间序列数据库当中(TSDB):属于同一**指标名称**、同一**标签**集合的、有**时间戳**标记的数据流。除了存储的时间序列,Prometheus还可以根据查询请求产生临时的、衍生的时间序列作为返回结果。 ### 指标名称和标签 每一条时间序列由指标名称(Metric Name)以及一组标签(键值对)唯一标识。其中指标的名称(Metric Name)可以反映被监控样本的含义(例如,http_request_total可以看出来表示当前系统接收到的http请求总量),指标名称只能由ASCII字符、数字、下划线以及冒号组成,同时必须匹配正则表达式`[a-zA-Z_:][a-zA-Z0-9_:]*`。 **注意** 冒号用来表示用户自定义的记录规则,不能在 exporter 中或监控对象直接暴露的指标中使用冒号来定义指标名称。 通过使用标签,Prometheus开启了强大的多维数据模型:对于相同的指标名称,通过不同标签列表的集合,会形成特定的度量维度实例(例如,所有包含度量名称为 `/api/tracks` 的 http 请求,打上 `method=POST` 的标签,就会形成具体的 http 请求)。查询语言在这些指标和标签列表的基础上进行过滤和聚合,改变任何度量指标上的任何标签值(包括添加或删除指标),都会创建新的时间序列。 标签的名称只能由ASCII字符、数字、以及下划线组成并满足正则表达式`[a-zA-Z_][a-zA-Z0-9_]*`。其中以 `__` 作为前缀的标签,是系统保留的关键字,只能在系统内部使用。标签的值则可以包含任何 `Unicode` 编码的字符。 ### 样本 在时间序列中的每一个点称为样本,样本由以下三部分组成: - 指标(metric):指标名称和描述当前样本特征的labelset; - 时间戳:一个精确到时间毫秒的时间戳 - 样本值:一个浮点型数据表示当前样本的值 ### 表示方式 通过如下表示方式表示指定名称和指定标签集合的时间序列 ``` {