Prometheus(译:普罗米修斯)用领先的开源监控解决方案为你的指标和警报提供动力(赋能)。
1. 概述
小说搜索 https://shupu.org/1.1. Prometheus是什么?
Prometheus是一个开源的系统监控和警报工具包。自2012年启动以来,许多公司和组织都采用了Prometheus,该项目拥有非常活跃的开发人员和用户社区。它现在是一个独立的开源项目,独立于任何公司进行维护。Prometheus于2016年加入云原生计算基金会,成为继Kubernetes之后的第二个托管项目。
1.1.1. Prometheus的主要特性:
- 一个多维数据模型,包含由指标名称和键/值对(Tag)标识的时间序列数据
- PromQL是一种灵活的查询语音,用于查询并利用这些维度数据
- 不依赖分布式存储,单个服务器节点是自治的
- 时间序列收集是通过HTTP上的pull模型进行的(支持Pull)
- 推送时间序列是通过一个中间网关来支持的(也支持Push)
- 目标是通过服务发现或静态配置发现的
- 多种模式的图形和仪表盘支持
总结一下,就是多维数据模型、PromQL查询语言、节点自治、HTTP主动拉取或者网关主动推送的方式获取时间序列数据、自动发现目标、多种仪表盘支持
1.1.2. 组件:
- Prometheus server,它负责抓取和存储时间序列数据,是最主要的组件
- client libraries,用于检测应用程序代码的客户端库
- push gateway,用于支持短期的jobs
- exporters,用于支持HAProxy等第三方
- alertmanager,用于处理告警
- 各种支持工具
大多数Prometheus组件都是用Go编写的,这使得它们易于作为静态二进制文件构建和部署
1.1.3. 架构:
这张图展示了架构及其生态系统的一些组成部分:
Prometheus从工具化的作业中获取指标,要么直接获取,要么通过中介推送网关获取短期作业。它在本地存储所有抓取的样本,并对这些数据应用规则将这些数据进行聚合,并记录新的时间序列,或者生成警报。可以用Grafana或其他API来可视化收集的数据。
1.2. 什么时候用它合适
Prometheus可以很好地记录任何纯数字时间序列。它既适合以机器为中心的监视,也适合高度动态的面向服务的体系结构的监视。在微服务的世界中,它对多维数据收集和查询的支持是一个特别的优势。
Prometheus是为可靠性而设计的,在你的服务宕机的时候,你可以快速诊断问题。每台Prometheus服务器都是独立的,不依赖于网络存储或其他远程服务。
1.3. 什么时候用它不合适
Prometheus的值的可靠性。你总是可以查看有关系统的统计信息,即使在出现故障的情况下也是如此。如果你需要100%的准确性,例如按请求计费,Prometheus不是一个好的选择,因为收集的数据可能不够详细和完整。在这种情况下,最好使用其他系统来收集和分析用于计费的数据,并使用Prometheus来完成剩下的监视工作。
1.4. Prometheus VS InfluxDB
InfluxDB是一个开源的时间序列数据库,具有扩展和集群的商业选项。InfluxDB项目是在Prometheus开发开始将近一年后发布的,所以当时无法考虑将其作为替代方案。尽管如此,Prometheus和fluxdb之间仍然存在显著的差异。二者有许多相似之处。两者都有标签(在InfluxDB中称为tags)来有效地支持多维度度量。它们基本上使用相同的数据压缩算法。两者都具有广泛的集成,包括彼此之间的集成。两者都有挂钩,允许进一步扩展它们,例如在统计工具中分析数据或执行自动化操作。
下列情况,用InfluxDB更好:
- 如果你正在进行事件日志记录
- 商业选项为InfluxDB提供集群,这对于长期数据存储也更好
- 最终实现副本之间数据的一致性
下列情况,用Prometheus更好:
- 如果你主要做的是度量
- 如果你需要更强大的查询语言、警报和通知功能
- 更高的可用性和正常运行时间,用于绘图和报警
InfluxDB由一家遵循开放核心模型的商业公司维护,提供高级特性,如闭源集群、托管和支持。
Prometheus是一个完全开源和独立的项目,由许多公司和个人维护,其中一些还提供商业服务和支持。
2. 基本概念
2.1. 数据模型
Prometheus基本上将所有数据存储为时间序列:属于同一指标和同一组标记维度的时间戳值流。除了存储时间序列外,Prometheus还可以根据查询结果生成临时派生的时间序列。
(PS:这里对时间序列的解释是这样的,
time series: streams of timestamped values belonging to the same metric and the same set of labeled dimensions
)
2.1.1. Metric names and labels
Every time series is uniquely identified by its metric name and optional key-value pairs called labels.
(每个时间序列都由其指标名称和称为标签的可选键值对唯一标识)
指标名称指定要度量的系统的一般特性(例如,http_requests_total表示接收的HTTP请求的总数)。它可能包含ASCII字母和数字,以及下划线和冒号。它必须匹配正则表达式[a-zA-Z_:][a-zA-Z0-9_:]*
标签名称可以包含ASCII字母、数字和下划线。它们必须匹配正则表达式[a-zA-Z_][a-zA-Z0-9_]*。以__开头的标签名称保留内部使用。
标签值可以包含任何Unicode字符。
2.1.2. Sample(样本)
样本构成实际的时间序列数据。每个样本包括:
- a float64 value
- a millisecond-precision timestamp
2.1.3. notation(记法)
给定一个度量名称和一组标签,时间序列通常使用以下符号标识:
<metric name>{<label name>=<label value>,...}