Prometheus简介

什么是Prometheus?

Prometheus是由前 Google 工程师从 2012 年开始在 Soundcloud以开源软件的形式进行研发的系统监 控和告警工具包,自此以后,许多公司和组织都采用了 Prometheus 作为监控告警工具。Prometheus 的开发者和用户社区非常活跃,它现在是一个独立的开源项目,可以独立于任何公司进行维护。为了证 明这一点,Prometheus 于 2016 年 5 月加入CNCF基金会,成为继 Kubernetes 之后的第二个 CNCF 托 管项目。

Prometheus的优势

Prometheus 的主要优势有:

由指标名称和和键/值对标签标识的时间序列数据组成的多维数据模型

强大的查询语言 PromQL

不依赖分布式存储;单个服务节点具有自治能力。

时间序列数据是服务端通过 HTTP 协议主动拉取获得的。

也可以通过中间网关来推送时间序列数据

可以通过静态配置文件或服务发现来获取监控目标。

支持多种类型的图表和仪表盘。

Prometheus的组件、架构

Prometheus 的整体架构以及生态系统组件如下图所示:

Prometheus 监控系统_linux

Prometheus适用于什么场景

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

Prometheus不适合什么场景

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

Prometheus快速部署

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

wget https://github.com/prometheus/prometheus/releases/download/v2.25.0/prometheus-2.25.0.linux-amd64.tar.gz

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

sha256sum prometheus-2.25.0.linux-amd64.tar.gz

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

tar -zxvf prometheus-2.25.0.linux-amd64.tar.gz -C /data/
chown -R root:root prometheus-2.25.0.linux-amd64
ln -sv prometheus-2.25.0.linux-amd64 prometheus

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

cd /data/prometheus
yum install -y screen
screen -S prometheus-server
./prometheus

Exporter

简介

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

Linux主机监控(node_exporter 9100)

它提供了系统内部几乎所有的标准指标,如 cpu、内存、磁盘空间、磁盘I/O、系统负载和网络带宽。另外它还提供了由内核公开的大量额外监控指 标,从负载平均到主板温度等。

1.在检测的客户端安装官网中找到自己想要的Exporter并进行下载https://prometheus.io/download/ 并下载二进制包,解压缩

wget https://github.com/prometheus/node_exporter/releases/download/v1.1.1/node_ex porter-1.1.1.linux-amd64.tar.gz
tar -zxvf node_exporter-1.1.1.linux-amd64.tar.gz -C /data/
cd /data/
chown -R root:root node_exporter-1.1.1.linux-amd64
ln -sv node_exporter-1.1.1.linux-amd64 node_exporter

2.启动node_exporter

cd /data/node_exporter
yum install -y screen
screen -S prometheus-exporter
./node_exporter

3.与Prometheus server集成(在promethues的服务端)

vim prometheus.yml
- job_name: 'node_exporter'
static_configs:
- targets: [192.168.80.152:9100]

MySQL监控(mysqld_exporter 9104)

它提供了数据库内部几乎所有的标准指标

1.在检测的客户端安装

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

wget https://github.com/prometheus/mysqld_exporter/releases/download/v0.12.1/mysqld_exporter-0.12.1.linux-amd64.tar.gz
tar -xzvf mysqld_exporter-0.12.1.linux-amd64.tar.gz -C /data/
cd /data/
chown root:root mysqld_exporter-0.12.1.linux-amd64 -R
ln -sv mysqld_exporter-0.12.1.linux-amd64
sha256sum mysqld_exporter-0.12.1.linux-amd64.tar.gz

2.创建MySQL授权用户

yum install mariadb-server.x86_64 -y
create user 'mysqld_exporter'@'%' identified by '1';
grant process,replication client,select on *.* to 'mysqld_exporter'@'%';
flush privileges;

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

vim /data/mysqld_exporter/.mysqld_exporter.cnf
[client]
user=mysqld_exporter
password=1
./mysqld_exporter --config.my-cnf='.mysqld_exporter.cnf'

4.与Prometheus集成

- job_name: 'mysqld_exporter'
scrape_interval: 10s
static_configs:
- targets: [IP:9104]

基于文件的服务发现

通过编写.yml(.json)文件来统一发现服务

1.准备JSON格式的文件

cd /data/prometheus
mkdir targets
vim targets/dev_node.json
[
{
"targets":"IP:端口号",
"labels":{
"env": "dev_webgame"
}
}
]
或者使用.yml格式
- targets:
- "IP:端口号"

2.修改配置文件

vim /data/prometheus/prometheus.yml
- job_name: 'node_service_discovery'
file_sd_configs:
- files:
- targets/.json(.yml)
refresh_interval: 60m

Grafana使用

grafana是一款图形显示非常优秀的工具,支持图表模板导入,支持出Prometheus之外多种数据源(包 括MySQL、zabbix、elasticsearch等等)

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

wget https://dl.grafana.com/oss/release/grafana-7.5.3-1.x86_64.rpm

2.启动grafana

systemctl start grafana-server.service

3.查看3000端口

ss -tanl

注意:进入Granfana后在设置里加入数据源

首次登陆用户名密码为admin admin

Prometheus 监控系统_数据_02

添加数据源

Prometheus 监控系统_数据_03

添加dashboard

Prometheus 监控系统_数据_04

人工创建图表比较繁琐,可以直接导入已经存在的模板

参考网址:https://www.cnblogs.com/xuliuzai/p/11134714.html

Prometheus 监控系统_数据_05

Alertmanager告警

概述

Prometheus对指标的收集、存储同告警能力分属于Prometheus Server和AlertManager两个独立 的组件组成,前者仅仅负责基于告警规则生成告警通知,具体的告警操作则有后者完成; AlertManager负责处理由客户端发来的告警通知 客户端通常是Prometheus Server,但也支持来自其他工具的告警 AlertManageer对告警通知进行分组、去重后根据路由规则将其路由到不同的receiver,如 email、企业微信、钉钉等

告警逻辑:

在AlertManager上定义receiver,他们能够基于某个媒介接收告警信息的特定用户;

在Alertmanager上定义路由规则(route),以便将收到的告警通知按需分别进行处理

在Prometheus上定义告警规则生成告警通知,发送给Alertmanager

Prometheus 监控系统_mysql_06

Alertmanager机制

除了基本的告警通知能力外,Alertmanager还支持对告警进行去重分组抑制静默和路由等功能

分组机制

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

抑制机制

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

静默机制

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

部署Alertmanger

1.下载二进制包

wget https://github.com/prometheus/alertmanager/releases/download/v0.21.0/alertman ager-0.21.0.linux-amd64.tar.gz


2.解压缩

tar -zxvf alertmanager-0.21.0.linux-amd64.tar.gz -C /data/
cd /data/
ln -sv alertmanager-0.21.0.linux-amd64 alertmanager
chown -R root:root alertmanager-0.21.0.linux-amd64


3.默认配置文件

receivers: # 接收器
- name: 'web.hook' # 接收器名称
webhook_configs: # 设置webhook地址
- url: 'http://127.0.0.1:5001/'

4.修改配置文件中的receivers并添加全局配置

receivers:
- name: 'email'
email_configs:
- to: '2177780569@qq.com'
send_resolved: true
global:
resolve_timeout: 5m
smtp_from: 'bbj1030@foxmail.com'
smtp_smarthost: 'smtp.qq.com:465'
smtp_auth_username: 'bbj1030@foxmail.com'
smtp_auth_password: '****************'
smtp_require_tls: false
smtp_hello: 'qq.com'

5.组合Prometheus与alertmanager

alerting:
alertmanagers:
- static_configs:
- targets:
- IP:9093
或者
scrape_configs:
- job_name: 'Alertmanager'
static_configs:
- targets: ['192.168.80.152:9093']

6.告警规则

cat prometheus.yml
rule_files:
- "/data/prometheus/rules/*.yml"
cd /data/prometheus/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"