Prometheus

Prometheus

Prometheus 的主要优势有:

  • 由指标名称和和键/值对标签标识的时间序列数据组成的多维数据模型
  • 强大的查询语言 PromQL 不依赖分布式存储;
  • 单个服务节点具有自治能力。
  • 时间序列数据是服务端通过 HTTP 协议主动拉取获得的。
  • 也可以通过中间网关来推送时间序列数据
  • 可以通过静态配置文件或服务发现来获取监控目标。
  • 支持多种类型的图表和仪表盘。

Prometheus的组件、架构

-[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ncRQRmXA-1645951883303)(Prometheus

  • Prometheus server是Prometheus架构中的核心组件,基于go语言编写而成,无第三方依赖关 系,可以独立部署在物理服务器上、云主机、Docker容器内。主要用于收集每个目标数据,并存储 为时间序列数据,对外可提供数据查询支持和告警规则配置管理。
  • Exporter用于输出被监控组件信息的HTTP接口统称为Exporter(导出器)。目前互联网公司常用 的组件大部分都有Expoter供直接使用,比如Nginx、MySQL、linux系统信息等。
  • Pushgateway是指用于支持短期临时或批量计划任务工作的汇聚节点。主要用于短期的job,此类 存在的job时间较短,可能在Prometheus来pull之前就自动消失了。所以针对这类job,设计成可 以直接向Pushgateway推送metric,这样Prometheus服务器端便可以定时去Pushgateway拉去 metric
  • Alertmanager主要用于处理Prometheus服务器端发送的alerts信息,对其去除重数据、分组并路 由到正确的接收方式,发出告警,支持丰富的告警方式。
  • Service Discovery:动态发现待监控的target,从而完成监控配置的重要组件,在容器环境中尤为 重要,该组件目前由Prometheus Server内建支持

Prometheus适用于什么场景

Prometheus适用于记录文本格式的时间序列,它既适用于以机器为中心的监控,也适用于高度动态的 面向服务的监控,在微服务的世界中,它对多维数据收集和查询的支持有特殊优势。Prometheus是专 为提高系统可靠性而设计的,它可以在断电期间快速诊断问题,每个Prometheus Server都是相互独立 的,不依赖于网络存储或者其他远程服务。当基础架构出现问题时,你可以通过Prometheus快速定位 故障点,而且不会消耗大量的基础架构资源。

Prometheus不适合什么场景

Prometheus非常重视可靠性,即使在出现故障的情况下,你也可以随时统计有关系统的可用系统信 息。如果你需要百分之百的准确度,例如按请求数量计费,那么Prometheus可能不太适合你,因为它 收集的数据可能不够详细完整精确。

相关概念

Prometheus所有采集的监控数据均以指标的形式保存在内置的时间序列数据库当中(TSDB):属于同 一指标名称、同一标签集合的、有时间戳标记的数据流。除了存储的时间序列,Prometheus还可以根 据查询请求产生临时的、衍生的时间序列作为返回结果。

指标名称和标签

每一条时间序列由指标名称(Metric Name)以及一组标签(键值对)唯一标识。

<metric name>{<label name>=<label value>, ...}

指标类型

Counter计数器

Gauge仪表盘

Histogram直方图 (长尾问题 为了区分是平均的慢还是长尾的慢,最简单的方式就是按照请求延迟的范围进行分组 如果大多数api请求都维持在100ms 的响应时间范围内,而个别请求的响应时间需要5秒,那么就会导致某些web页面的响应落到中位数的情 况,而这种现象被称为长尾问题。Histogram和Summary都是为了能够解决这样问题的存在)

Summary摘要 (可以按百分比划 分跟踪结果,例如,quantile取值0.95,表示取样本里的95%数据。Histogram需要通过)

Prometheus快速开始

打开下载网址https://prometheus.io/download/,下载自己想要的版本

获取软件包的哈希值,与官网提供的软件包的哈希值进行对比,保证下载的Prometheus软件包的 完整性

[root@server1 ~]# wget https://github.com/prometheus/prometheus/releases/download/v2.25.0/prometheus-2.25.0.linux-amd64.tar.gz
[root@server1 ~]# sha256sum prometheus-2.25.0.linux-amd64.tar.gz d163e41c56197425405e836222721ace8def3f120689fe352725fe5e3ba1a69d prometheus-2.25.0.linux-amd64.tar.gz

解压缩二进制软件包到指定的安装目录,运行Prometheus

[root@server1 ~]# mkdir /data
[root@server1 ~]# tar -zxvf prometheus-2.25.0.linux-amd64.tar.gz -C /data/
[root@server1 ~]# cd /data/
[root@server1 data]# chown -R root:root prometheus-2.25.0.linux-amd64
[root@server1 data]# ln -sv prometheus-2.25.0.linux-amd64 prometheus
"prometheus" -> "prometheus-2.25.0.linux-amd64"

启动Prometheus,会输出如下信息,此时当终端关闭或者按下ctrl + c服务会自动关闭

[root@server1 prometheus]# ./prometheus
level=info ts=2021-02-28T06:03:36.885Z caller=main.go:366 msg="No time or
size retention was set so using the default time retention" duration=15d
level=info ts=2021-02-28T06:03:36.885Z caller=main.go:404 msg="Starting
Prometheus" version="(version=2.25.0, branch=HEAD,
revision=a6be548dbc17780d562a39c0e4bd0bd4c00ad6e2)
......

热加载更新配置

在Prometheus日常维护中,一定会对配置文件prometheus.yml进行再编辑操作,通常对Prometheus 服务进行重新启动操作即可完成对配置文件的加载。当然也可以通过动态的热加载来更新 prometheus.yml中的配置信息 查看进程id,向进程发送SIHHUP信号

检查配置文件的语法正确性

[root@server1 ~]# cd /data/prometheus
[root@server1 prometheus]# ls
console_libraries consoles data LICENSE NOTICE prometheus
prometheus.yml promtool
[root@server1 prometheus]# ./promtool check config prometheus.yml
Checking prometheus.yml
SUCCESS: 0 rule files found

关闭防火墙和selinux

浏览器可以正常访问则说明部署Prometheus server成功(端口号默认是9090)

Exporter

在Prometheus的核心组件中,Exporter是重要的组成部分,在实际中监控样本数据的收集都是由 Exporter完成的,Prometheus服务器只需要定时从这些Exporter提供的HTTP服务获取数据即可。官方 提供了多种常用的Exporter,比如用于对数据库监控的mysqld_exporter和redis_exporter等。 Exporter本质上是将收集的数据转化为对应的文本格式,并提供HTTP接口,供Prometheus定期采集数 据。

Exporter类型

  • 直接采集型
    • 这类Exporter直接内置了响应的应用程序,用于向Prometheus直接提供target数据支持。这 样设计的好处是,可以更好地监控各自系统内部的运行状态,同时也适合更多自定义监控指标 的项目实施。
  • 间接采集型
    • 原始监控目标并不直接支持Prometheus,需要我们使用Prometheus提供的客户端库编写该 监控目标的监控采集数据,用户可以将该程序独立运行,取获取指定的各类监控数据值。例 如,由于Linux操作系统自身并不能直接支持Prometheus,用户无法从操作系统层面上直接 提供对Prometheus的支持,因此单独提供Node Exporter,还有数据库或网站HTTP应用类等 Exporter。

可以使用浏览器,或者通过curl工具来获得采集数据

[root@server1 ~]# curl 192.168.80.151:9090/metrics

下载二进制包,解压缩

[root@server2 ~]# wget
https://github.com/prometheus/node_exporter/releases/download/v1.1.1/node_ex
porter-1.1.1.linux-amd64.tar.gz
[root@server2 ~]# mkdir /data
[root@server2 ~]# tar -zxvf node_exporter-1.1.1.linux-amd64.tar.gz -C /data/
node_exporter-1.1.1.linux-amd64/
node_exporter-1.1.1.linux-amd64/LICENSE
node_exporter-1.1.1.linux-amd64/NOTICE
node_exporter-1.1.1.linux-amd64/node_exporter
[root@server2 ~]# cd /data/
[root@server2 data]# chown -R root:root node_exporter-1.1.1.linux-amd64
[root@server2 data]# ln -sv node_exporter-1.1.1.linux-amd64 node_exporter
"node_exporter" -> "node_exporter-1.1.1.linux-amd64"

启动node_exporter

[root@server2 ~]# cd /data/node_exporter
[root@server2 node_exporter]# ls
LICENSE node_exporter NOTICE
[root@server2 node_exporter]# ./node_exporter

与Prometheus server集成

当启动node_exporter开始工作时,node_exporter和Prometheus server还没有进行关联,二者各自 独立没有关联。

可以在Prometheus server中,找到主机目录,找到主配置文件,使用其中的静态配置功能 static_configs来采集node_exporter提供的数据

主配置文件介绍

# 配置文件解释
global:
scrape_interval:每次数据采集的时间间隔,默认为1分钟
scrape_timeout:采集请求超时时间,默认为10秒
evaluation_interval:执行rules的频率,默认为1分钟
scrape_configs:主要用于配置被采集数据节点操作,每一个采集配置主要由以下几个参数
job_name:全局唯一名称
scrape_interval:默认等于global内设置的参数,设置后可以覆盖global中的值
scrape_timeout:默认等于global内设置的参数
metrics_path:从targets获取meitric的HTTP资源路径,默认是/metrics
honor_labels:Prometheus如何处理标签之间的冲突。若设置为True,则通过保留变迁来解
决冲突;若设置为false,则通过重命名;
scheme:用于请求的协议方式,默认是http
params:数据采集访问时HTTP URL设定的参数
relabel_configs:采集数据重置标签配置
metric_relabel_configs:重置标签配置
sample_limit:对每个被已知样本数量的每次采集进行限制,如果超过限制,该数据将被视为失
败。默认值为0,表示无限制

在默认配置文件的基础上,重新编辑配置文件,添加job与node_exporter进行关联

[root@server1 prometheus]# vim prometheus.yml
scrape_configs:
# The job name is added as a label `job=<job_name>` to any timeseries
scraped from this config.
  - job_name: 'prometheus'
# metrics_path defaults to '/metrics'
# scheme defaults to 'http'.
	static_configs:
	- targets: ['localhost:9090']
  - job_name: 'node_exporter'
	static_configs:
	  - targets: [192.168.80.152:9100]

重启服务即可成功关联

MySQL监控

官网下载mysqld_exporter二进制包解压缩

[root@server2 ~]# wget https://github.com/prometheus/mysqld_exporter/releases/download/v0.12.1/mysq
ld_exporter-0.12.1.linux-amd64.tar.gz
[root@server2 ~]# tar -xzvf mysqld_exporter-0.12.1.linux-amd64.tar.gz -C
/data/
mysqld_exporter-0.12.1.linux-amd64/
mysqld_exporter-0.12.1.linux-amd64/NOTICE
mysqld_exporter-0.12.1.linux-amd64/mysqld_exporter
mysqld_exporter-0.12.1.linux-amd64/LICENSE
[root@server2 ~]# cd /data/
[root@server2 data]# chown root:root mysqld_exporter-0.12.1.linux-amd64 -R
[root@server2 data]# ln -sv mysqld_exporter-0.12.1.linux-amd64
mysqld_exporter
"mysqld_exporter" -> "mysqld_exporter-0.12.1.linux-amd64"
[root@server2 ~]# sha256sum mysqld_exporter-0.12.1.linux-amd64.tar.gz
133b0c281e5c6f8a34076b69ade64ab6cac7298507d35b96808234c4aa26b351
mysqld_exporter-0.12.1.linux-amd64.tar.gz

创建MySQL授权用户

[root@server2 ~]# yum install mariadb-server.x86_64 -y
[root@server2 ~]# systemctl start mariadb
[root@server2 ~]# mysql_secure_installation
[root@server2 ~]# mysql -uroot -p
Enter password:
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 10
Server version: 5.5.68-MariaDB MariaDB Server
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input
statement.
MariaDB [(none)]> create user 'mysqld_exporter'@'%' identified by '1';
Query OK, 0 rows affected (0.00 sec)
MariaDB [(none)]> grant process,replication client,select on *.* to
'mysqld_exporter'@'%';
Query OK, 0 rows affected (0.00 sec)
MariaDB [(none)]> flush privileges;
Query OK, 0 rows affected (0.00 sec)
MariaDB [(none)]> select host,user from mysql.user;
+-----------+-----------------+
| host | user |
+-----------+-----------------+
| % | mysqld_exporter |
| 127.0.0.1 | root |
| ::1 | root |
| localhost | root |
+-----------+-----------------+
4 rows in set (0.00 sec)

配置数据库认证,并启动服务,默认端口号是9104

[root@server2 mysqld_exporter]# pwd
/data/mysqld_exporter
[root@server2 mysqld_exporter]# vim .mysqld_exporter.cnf
[client]
user=mysqld_exporter
password=1
[root@server2 mysqld_exporter]# ./mysqld_exporter --config.my-cnf='.mysqld_exporter.cnf

Prometheus集成

# 配置文件
  - job_name: 'mysqld_exporter'
    scrape_interval: 10s
  static_configs:
    - targets: [192.168.80.152:9104]

重新启动服务即可

服务发现

Prometheus服务发现能够自动化检测分类,并且能够识别新目标和变更目标。也就是说,可以自动发 现并监控目标或变更目标,动态进行数据采集和处理。

准备JSON格式的文件

[root@server1 ~]# cd /data/prometheus
[root@server1 prometheus]# mkdir targets
[root@server1 prometheus]# vim targets/dev_node.json
[
{
"targets":"192.168.80.152:9100",
"labels":{
"env": "dev_webgame"
}
}
]
-------------------------------------------------------------------
或者这里是准备yaml文件,那么下面相应的配置文件需要与yaml匹配
- targets:
- "192.168.80.152:9100"

修改配置文件

[root@server1 prometheus]# vim /data/prometheus/prometheus.yml
  - job_name: 'node_service_discovery'
	file_sd_configs:
      - files:
		- targets/*.json
		refresh_interval: 60m

重新启动服务

PromQL

Prometheus提供了一种功能强大的表达式语言PromQL(Prometheus Query Language)。 Prometheus允许用户实时选择和汇聚时间序列数据,是Prometheus自己开发的数据查询语言,使用这 个查询语言能够进行各种聚合、分析和计算,使管理员能够根据指标更好地了解系统性能。

时序数据库

  • 数据写入特点——写入平稳、持续、高并发高吞吐;写多读少,在写操作上数据上能达到95%以 上;无更新时写入最近生成的数据
  • 数据查询特点——按时间范围读取一段时间的数据;对最近生成的数据读取概率高,对历史数据查 询概率低;按照数据点的不同密集度实现多精度查询
  • 数据存储特点——数据存储量比较大;具有时效性,数据通常会有一个保存周期,多精度数据存储

时间序列数据:按照时间顺序记录系统、设备状态变化的数据,每个数据称为一个样本

数据采集以特定的时间周期进行,随着时间的流逝,将这些样本数据记录下来,将生成一个离散的样本 数据序列

把该序列称作为向量,而将多个序列放在同一个坐标系内(以时间为横轴,以序列为纵轴,将形成一个 有数据点组成的矩阵)

  • 即时向量:特定或全部的时间序列上的集合,具有相同时间戳的一组样本称之为即时向量
  • 范围向量:特定或全部的时间序列上的集合,在指定的同一时间范围内的所有样本值称之为范围向 量

Prometheus

时间序列选择器

  • 指标名称:用于限定特定指标下的时间序列,即负责过滤指标,可选
  • 匹配器:或称为标签选择器,用于过滤时间序列上的标签,定义在{}中
  • 常见使用举例
    • prometheus_http_requests_total,仅给定指标名称
    • {job=“node_exporter”},仅给定匹配器
    • up{job=“node_exporter”},指标名称和匹配器的组合

= != =~ !~

PromQL操作符

数学运算

布尔运算

集合运算符

操作符优先级

sum (求和) min (最小值) max (最大值) avg (平均值) stddev (标准差) stdvar (标准差异) count (计数) count_values (对value进行计数) bottomk (后n条时序) topk (前n条时序) quantile (分布统计)

向量匹配

one-to-one

一对一向量匹配模式,它从运算符的两侧表达式中获取即时向量,依次比较并找到一对唯一条目进行匹 配,如果两个条目具有完全相同的标签和对应的值,则他们匹配。

many-to-one和one-to-many

多对一和一对多的匹配模式,可以理解为向量元素中的一个样本数据匹配到了多个样本数据标签。在使 用该匹配模式时,需要使用group_left或者group_right修饰符明确指定哪一个向量具有更高的基数,也 就是说左或者右决定了哪边的向量具有较高的子集

内置函数

  • increase(v range-vector)函数是PromQL中提供的众多内置函数之一。其中参数v是一个区间向量, increase函数获取区间向量中的第一个后最后一个样本并返回其增长量。因此,可以通过以下表达式 Counter类型指标的增长率:
  • Histogram和Summary都可 以同于统计和分析数据的分布情况。区别在于Summary是直接在客户端计算了数据分布的分位数情况。 而Histogram的分位数计算需要通过histogram_quantile(φ float, b instant-vector)函数进行计算。

Grafana使用

下载安装rpm包,下载网址:https://grafana.com/grafana/download

[root@grafana ~]# wget https://dl.grafana.com/oss/release/grafana-7.5.3-
1.x86_64.rpm
[root@grafana ~]# yum install grafana-7.5.3-1.x86_64.rpm -y
[root@grafana ~]# systemctl start grafana-server.service
[root@grafana ~]# systemctl enable grafana-server.service
Created symlink from /etc/systemd/system/multi-user.target.wants/grafanaserver.service to /usr/lib/systemd/system/grafana-server.service.
[root@grafana ~]# ss -tanlp | grep 3000
LISTEN 0 128 :::3000 :::*
users:(("grafana-server",pid=1780,fd=12))

人工创建图表比较繁琐,可以直接导入已经存在的模板 参考网址:https://www.cnblogs.com/xuliuzai/p/11134714.html

Alertmanager告警

  • 告警逻辑
    • 在AlertManager上定义receiver,他们能够基于某个媒介接收告警信息的特定用户;
    • 在Alertmanager上定义路由规则(route),以便将收到的告警通知按需分别进行处理
    • 在Prometheus上定义告警规则生成告警通知,发送给Alertmanager

Prometheus

Alertmanager机制

分组机制

相似告警合并为单个告警通知的机制,在系统因大面积故障而触发告警是,分组机制能避免用户被大 量的告警噪声淹没,进而导致关键信息的隐没

抑制机制

系统中某个组件或服务故障而触发告警通知后,那些依赖于该组件或服务的其他组件或服务也会因此而 触发告警,抑制是避免类似的级联告警的一种特性,从而让用户的经历集中于真正的故障所在

静默机制

在一个特定的时间窗口内,便接收到告警通知,Alertmanager也不会真正向用户发送告警行为;通常, 在系统例行维护期间,需要激活告警系统的静默特性

下载二进制包

[root@server1 ~]# wget
https://github.com/prometheus/alertmanager/releases/download/v0.21.0/alertman
ager-0.21.0.linux-amd64.tar.gz
[root@server1 ~]# sha256sum alertmanager-0.21.0.linux-amd64.tar.gz
9ccd863937436fd6bfe650e22521a7f2e6a727540988eef515dde208f9aef232
alertmanager-0.21.0.linux-amd64.tar.gz
[root@server1 ~]# tar -zxvf alertmanager-0.21.0.linux-amd64.tar.gz -C /data/
[root@server1 ~]# cd /data/
[root@server1 data]# ln -sv alertmanager-0.21.0.linux-amd64 alertmanager
[root@server1 data]# chown -R root:root alertmanager-0.21.0.linux-amd64

配置文件参考文档:https://blog.csdn.net/aixiaoyang168/article/details/98474494

自定义alertmanager使用qq邮箱报警的配置文件

启动Alertmanager

组合Prometheus与alertmanager

[root@server1 prometheus]# cat prometheus.yml
alerting:
alertmanagers:
- static_configs:
- targets:
- 192.168.80.152:9093
.......
scrape_configs:
  - job_name: 'Alertmanager'
	static_configs:
	  - targets: ['192.168.80.152:9093']

告警规则

[root@server1 prometheus]# cat prometheus.yml
rule_files:
- "/data/prometheus/rules/*.yml"
[root@server1 rules]# pwd
/data/prometheus/rules
[root@server1 rules]# cat rules.yml
groups:
- name: up
rules:
- alert: node
expr: up{job="node_exporter"} == 0
for: 1m
labels:
severity: critical
annotations:
description: "Node has been dwon for more than 1 minutes"
summary: "Node down"
[root@server1 prometheus]# ./promtool check rules rules/rules.yml
Checking rules/rules.yml
SUCCESS: 1 rules found
  • Interval没有满足触发条件,告警未激活状态
  • pending,已满足触发条件,但未满足告警持续时间的状态,即未满足告警中for子句指定的持续时 间
  • firing,已满足触发条件且已经超过for子句中指定的持续时间时的状态

cat rules.yml

groups:

  • name: up
    rules:
  • alert: node
    expr: up{job=“node_exporter”} == 0
    for: 1m
    labels:
    severity: critical
    annotations:
    description: “Node has been dwon for more than 1 minutes”
    summary: “Node down”
    [root@server1 prometheus]# ./promtool check rules rules/rules.yml
    Checking rules/rules.yml
    SUCCESS: 1 rules found

- Interval没有满足触发条件,告警未激活状态 
- pending,已满足触发条件,但未满足告警持续时间的状态,即未满足告警中for子句指定的持续时 间
-  firing,已满足触发条件且已经超过for子句中指定的持续时间时的状态







上一篇:UDP协议实现简单的通信 C++


下一篇:概率机器人:速度运动模型