Prometheus 是一个开源的服务监控系统和时序数据库,最初由SoundCloud开发的开源的系统监控和报警工具包。自2012年诞生以来,被许多公司和组织采用,该项目拥有非常活跃的社区和开发者。Prometheus 现在是一个独立的开源项目,独立于任何公司进行维护。为了证明这一点,Prometheus 于2016年加入了云原生计算基金会CNCF,成为了继Kubernetes之后的第二个CNCF托管项目。
Prometheus收集和存储metrics作为时间序列数据,也就是说,metrics与它被记录的时间戳以及称为标签的可选键值对一起被存储。
Prometheus 能够直接把API Server作为服务发现系统使用,进而动态发现和监控集群中的所有可被监控的对象。
更多关于企业级监控平台系列的学习文章,请参阅:构建企业级监控平台,本系列持续更新中。
Prometheus的基本原理是通过 HTTP 周期性抓取被监控组件的状态,任意组件只要提供对应的 HTTP 接口并且符合Prometheus定义的数据格式,就可以接入Prometheus监控。
Prometheus的实现架构并不复杂,原理其实就是收集数据、处理数据、可视化展示,再进行数据分析以及报警处理。但其珍贵之处在于提供了一整套可行的解决方案,并且形成了一整个生态,能够极大地降低我们的研发成本。
Prometheus Server 负责定期在目标上抓取 metric(指标)数据,每个抓取目标都需要暴露一个 HTTP 服务接口用于 Prometheus 定时抓取。
Storage 通过一点的规则清理和整理数据,并把得到的结果存储到新的时间序列中。
Prometheus 通过 PromQL 和其他 API 可视化地展示收集的数据。Prometheus 支持多种方式的图表可视化,例如 Grafana、自带的 PromDash 及自身提供的模板引擎等。Prometheus 还提供 HTTP API 查询方式,自定义所需要的输出。
AlertManager 是独立于 Prometheus 的一个组件,在出发了预先设置在 Prometheus 中的高级规则后, Prometheus 便会推送告警消息到 AlertManager。AlertManager 提供了十分灵活的告警方式,可以通过邮件、slack 或者钉钉等途径推送。并且 AlertManager 支持高可用部署,为了解决多个 AlertManager 重复告警的问题,引入了 Gossip,在多个 AlertManager 之间通过 Gossip 同步告警信息。更多关于企业级监控平台系列的学习文章,请参阅:构建企业级监控平台,本系列持续更新中。
Prometheus适用于记录文本格式的时间序列数据。既适合以机器为中心的监控,也适合面向服务的体系结构的监控。在微服务的世界里,对多维数据收集和查询的支持是一个特别的优势。
Prometheus 是专为提高系统可靠性而设计的,可以在断电期间快速诊断问题,每个 Prometheus Server 都是相互独立的,不依赖于网络存储或其他远程服务。当基础架构出现故障时,可以通过 Prometheus 快速定位故障点,而且不会消耗大量的基础架构资源。
Prometheus 非常重视可靠性,即使在出现故障的情况下,也可以随时查看有关系统的可用统计信息。如果需要百分之百的准确度,例如按请求数量计费,那么 Prometheus 不太适合,因为它收集的数据可能不够详细完整。这种情况下,最好使用其他系统来收集和分析数据以进行计费,并使用 Prometheus 来监控系统的其余部分。
时序数据,是在一段时间内通过重复测量(measurement)而获得的观测值的集合将这些观测值绘制于图形之上,它会有一个数据轴和一个时间轴,服务器指标数据、应用程序性能监控数据、网络数据等也都是时序数据。
Prometheus支持通过三种类型的途径从目标上"抓取(Scrape)"指标数据(基于白盒监控)。
Exporters一>工作在被监控端,周期性的抓取数据并转换为pro兼容格式等待prometheus来收集,自己并不推送。
Instrumentation一>指被监控对象内部自身有数据收集、监控的功能,只需要prometheus直接去获取。
Pushgateway —>短周期5s-10s的数据收集脚本。
更多关于企业级监控平台系列的学习文章,请参阅:构建企业级监控平台,本系列持续更新中。
Prometheus同其它TSDB相比有一个非常典型的特性:它主动从各Target上拉取(pull)数据,而非等待被监控端的推送(push)
两个获取方式各有优劣,其中,Pull模型的优势在于:
targets : [ ‘localhost:9090’]
下载地址:https://prometheus.io/download/
[root@localhost ~]# tar zxvf prometheus-2.27.1.linux-amd64.tar.gz -C /usr/local/
---
[root@localhost ~]# cd /usr/local/
[root@localhost local]# cd prometheus-2.27.1.linux-amd64/
[root@localhost prometheus-2.27.1.linux-amd64]# ./prometheus
---
#另开一台终端
[root@localhost ~]# netstat -natp | grep 9090
tcp6 0 0 :::9090 :::* LISTEN 10161/./prometheus
tcp6 0 0 ::1:9090 ::1:46988 ESTABLISHED 10161/./prometheus
tcp6 0 0 ::1:46988 ::1:9090 ESTABLISHED 10161/./prometheus
---
登录网址192.168.223.20:9090
#如果有warning报错的话:
[root@localhost ~]# ntpdate ntp1.aliyun.com
7 Dec 22:53:32 ntpdate[21741]: adjust time server 120.25.115.20 offset 0.002993 sec
[root@localhost ~]# init 6
#进入网页再刷新一下即可
访问192.168.223.20:9090/metrics
Prometheus通过命令行标志和配置文件进行配置。虽然命令行标志配置了不可变的系统参数(例如存储位置,保留在磁盘和内存中的数据量等),但配置文件定义了与抓取作业及其实例相关的所有内容,以及哪些规则文件加载。要查看所有可用的命令行标志,请运行./prometheus -h。
Prometheus可以在运行时重新加载其配置。如果新配置格式不正确,则不会应用更改。通过向Prometheus进程发送 SIGHUP 信号或使用HTTP 发送reload的POST请求命令发送( --web.enable-lifecycle 启用标志时)来触发配置重新加载。这也将重新加载任何已配置的规则文件。
该文件以YAML格式编写,由下面描述的方案定义。括号表示参数是可选的。对于非列表参数,该值设置为指定的默认值。
通用占位符定义如下:
<boolean>:一个可以取值true或的值的布尔值false
<duration>:与正则表达式匹配的持续时间 [0-9]+(ms|[smhdwy])
<labelname>:与正则表达式匹配的字符串 [a-zA-Z_][a-zA-Z0-9_]*
<labelvalue>:一串unicode字符
<filename>:当前工作目录中的有效路径
<host>:由主机名或IP后跟可选端口号组成的有效字符串
<path>:有效的URL路径
<scheme>:一个可以取值http或的字符串https
<string>:常规字符串
<secret>:一个秘密的常规字符串,例如密码
<tmpl_string>:使用前模板展开的字符串
其他占位符是单独指定的。
#配置文件中的全局配置
global:
scrape_interval: 15s #多久 收集 一次数据
evaluation_interval: 30s #多久评估一次 规则
scrape_timeout: 10s #每次 收集数据的 超时时间
#当Prometheus和外部系统(联邦, 远程存储, Alertmanager)通信的时候,添加标签到任意的时间序列或者报警
external_labels:
monitor: codelab
foo: bar
#加载规则文件, 可以使用通配符
#规则文件指定全局变量列表。从所有匹配的文件中读取规则和警报。
rule_files:
- "first.rules"
- "my/*.rules"
#远程写入功能相关的设置
remote_write:
- url: http://remote1/push
write_relabel_configs:
- source_labels: [__name__]
regex: expensive.*
action: drop
- url: http://remote2/push
#远程读取相关功能的设置
remote_read:
- url: http://remote1/read
read_recent: true
- url: http://remote3/read
read_recent: false
required_matchers:
job: special
#收集数据-配置列表
#scrape_config部分指定了一组目标和参数,描述了如何抓取它们。
#在一般情况下,一个抓取资源配置指定一个作业。在高级配置中,这可能会改变。
#可以通过static_configs参数静态配置目标,也可以使用支持的服务发现机制之一动态发现目标。
#此外,relabel_configs 允许在抓取之前对任何目标及其标签进行高级修改。
scrape_configs:
- job_name: prometheus #必须配置, 自动附加的job labels, 必须唯一
honor_labels: true #标签冲突, true 为以抓取的数据为准并忽略服务器中的,false 为通过重命名来解决冲突。
# scrape_interval is defined by the configured global (15s).
# scrape_timeout is defined by the global default (10s).
metrics_path: '/metrics'
# scheme defaults to 'http'.
#文件服务发现配置列表
#基于文件的服务发现提供了一种更通用的方法来配置静态目标,并用作插入自定义服务发现机制的接口。
#它读取一组包含零个或多个<static_config>列表的文件。
#对所有定义文件的更改都会通过磁盘监视检测到并立即应用。
#文件可以yaml或json格式提供。仅应用形成良好目标组的更改。
file_sd_configs:
- files: # 从这些文件中提取目标
- foo/*.slow.json
- single/file.yml
refresh_interval: 10m #刷新文件的时间间隔
#使用job名作为label的静态配置目录的列表
static_configs:
- targets: ['localhost:9090', 'localhost:9191']
labels:
my: label
your: label
#目标节点 重新打标签的配置列表。
#重新标记是一个功能强大的工具,可以在抓取目标之前动态重写目标的标签集。
#可以配置多个,按照先后顺序应用
relabel_configs:
- source_labels: [job, __meta_dns_name]
#从现有的标签中选择源标签, 最后会被替换,保持,丢弃
regex: (.*)some-[regex]
#正则表达式, 将会提取source_labels中匹配的值
target_label: job #在替换动作中将结果值写入的标签.
replacement: foo-${1}
#如果正则表达匹配, 那么替换值. 可以使用正则表达中的 捕获组
#action defaults to 'replace'
- source_labels: [abc] #将abc标签的内容复制到cde标签中
target_label: cde
- replacement: static
target_label: abc
- regex:
replacement: static
target_label: abc
bearer_token_file: valid_token_file #可选的, bearer token 文件的信息
#Alertmanager相关的配置
alerting:
alertmanagers:
- scheme: https
static_configs:
- targets:
- "1.2.3.4:9093"
- "1.2.3.5:9093"
更多关于企业级监控平台系列的学习文章,请参阅:构建企业级监控平台,本系列持续更新中。
服务核心组件,采用pull方式收集监控数据,通过http协议传输。并存储时间序列数据。Prometheus server 由三个部分组成:Retrival,Storage,PromQL。
客户端库,目的在于为那些期望原生提供Instrumentation功能的应用程序提供便捷的开发途径,用于基于应用程序内建的测量系统。
指标暴露器,负责收集不支持内建Instrumentation的应用程序或服务的性能指标数据,并通过HTTP接口供Prometheus Server获取。换句话说,Exporter 负责从目标应用程序上采集和聚合原始格式的数据,并转换或聚合为Prometheus格式的指标向外暴露。
服务发现,用于动态发现待监控的Target,Prometheus支持多种服务发现机制:文件、DNS、Consul、Kubernetes等等。
服务发现可通过第三方提供的接口,Prometheus查询到需要监控的Target列表,然后轮询这些Target 获取监控数据。该组件目前由Prometheus Server内建支持
是一个独立的告警模块,从Prometheus server端接收到“告警通知”后,会进行去重、分组,并路由到相应的接收方,发出报警,常见的接收方式有:电子邮件、钉钉、企业微信等。
Prometheus Server 仅负责生成告警指示,具体的告警行为由另一个独立的应用程序AlertManager负责;告警指示由 Prometheus Server基于用户提供的告警规则周期性计算生成,Alertmanager 接收到Prometheus Server发来的告警指示后,基于用户定义的告警路由向告警接收人发送告警信息。
类似一个中转站,Prometheus的server端只会使用pull方式拉取数据,但是某些节点因为某些原因只能使用push方式推送数据,那么它就是用来接收push而来的数据并暴露给Prometheus的server拉取的中转站。可以理解成目标主机可以上报短期任务的数据到Pushgateway,然后Prometheus server 统一从Pushgateway拉取数据。
是一个跨平台的开源的度量分析和可视化工具,可以将采集的数据可视化的展示,并及时通知给告警接收方。其官方库中具有丰富的仪表盘插件。
用于衡量应用程序的价值,如电商业务的销售量,ops、dau日活、转化率等,业务接口:登入数量,注册数、订单量、搜索量和支付量。
Prometheus是一款指际监控系统,不适合存储事件及日志等;它更多地展示的是趋势性的监控,而非精准数据;
Prometheus认为只有最近的监控数据才有查询的需要,其本地存储的设计初衷只是保存短期(例如一个月)数据,因而不支持针对大量的历史数据进行存储;若需要存储长期的历史数据,建议基于远端存储机制将数据保存于InfluxDB或openTsDB等系统中;
Prometheus的集群机制成熟度不高,可基于Thanos(和灭霸是一个单词)实现Prometheus集群的高可用及联邦集群。
mysql、nginx、k8s等使用多个不同的Prometheus收集,形成联邦集群。更多关于企业级监控平台系列的学习文章,请参阅:构建企业级监控平台,本系列持续更新中。
参考:https://blog.csdn.net/weixin_67470255/article/ details/126258467 https://stevelu.blog.csdn.net/article /details/126080391