整套解决方案:Prometheus+Grafana+Alertmanager实现告警推送教程
优采云 发布时间: 2022-10-06 14:12整套解决方案:Prometheus+Grafana+Alertmanager实现告警推送教程
前言
本文主要介绍Prometheus采集数据,通过Grafana加PromQL语句实现数据可视化,通过Alertmanage实现告警推送功能。温馨提醒,本文文章特产,2w多文字加几十张图片,建议采集观看。
介绍普罗米修斯
Prometheus 是一个开源系统监控和警报框架。受 Google 的 borgmon 监控系统启发,由在 SoundCloud 工作的前 google 员工于 2012 年创建,作为社区开源项目开发,并于 2015 年正式发布。 2016 年,Prometheus 正式加入云原生计算基金会,成为最Kubernetes 之后的热门项目。
作为新一代监控框架,Prometheus 具有以下特点:
示例图:
Prometheus的适用场景
在选择 Prometheus 作为监控工具之前,需要明确其适用范围以及不适用的场景。
Prometheus 非常擅长记录纯数字时间序列。它适用于以服务器为中心的监控和高度动态的面向服务架构的监控。
在微服务的监控中,Prometheus 对多维数据采集 和查询的支持也是一个特殊的优势。
Prometheus 更加强调可靠性,即使在发生故障时也能查看系统统计数据。权衡利弊以确保整个系统的可用性,但可能会丢失少量数据。因此,它不适用于需要 100% 数据准确度的系统,例如实时计费系统(涉及金钱)。
Prometheus 核心组件介绍
普罗米修斯服务器:
Prometheus Server 是 Prometheus 组件的核心部分,负责获取、存储和查询监控数据。Prometheus Server可以通过静态配置管理监控目标,也可以通过Service Discovery动态管理监控目标,并从这些监控目标中获取数据。其次,Prometheus Server 需要存储 采集 收到的监控数据。Prometheus Server 本身是一个时序数据库,采集 接收到的监控数据以时序的方式存储在本地磁盘中。最后,Prometheus Server 提供了一种自定义的 PromQL 语言来查询和分析数据。Prometheus Server 内置的 Express Browser UI,您可以通过它直接通过 PromQL 查询和可视化数据。
出口商:
Exporter通过HTTP服务Prometheus将监控数据采集的端点暴露给Prometheus Server
服务器可以通过访问Exporter提供的Endpoint端点来获取需要采集的监控数据。一般来说,出口商可以分为两类:
Direct 采集:这类Exporter直接内置了对Prometheus监控的支持,如cAdvisor、Kubernetes、Etcd、Gokit等,都是直接内置的endpoint,用于将监控数据暴露给Prometheus。
间接采集:间接采集,原来监控目标不直接支持Prometheus,所以我们需要通过Prometheus提供的Client Library为监控目标编写监控采集程序。例如:Mysql Exporter、JMX Exporter、Consul Exporter等。
推送网关:
Prometheus Server 支持基于 PromQL 创建报警规则。如果满足 PromQL 定义的规则,就会产生告警,告警的后续处理流程由 AlertManager 管理。在AlertManager中,我们可以与内置的通知方式如email、Slack等进行集成,也可以通过Webhook自定义告警处理方式。
服务发现:
服务发现是 Prometheus 中一个特别重要的部分。对于基于Pull模型的抓取方式,需要在Prometheus中配置大量抓取节点信息,才能进行数据采集。有了服务发现,用户通过服务发现和注册工具为数百个节点注册服务,最后在Prometheus的配置文件中配置注册中心的地址,大大简化了配置文件的复杂度。
它还可以更好地管理各种服务。在众多云平台(AWS、OpenStack)中,Prometheus 可以
通过平台自带的API,直接自动发现平台上运行的各种服务,并获取它们的信息。Kubernetes 掌握和管理所有容器和服务信息。这时候,Prometheus 只需要和 Kubernetes 打交道,就能找到所有需要监控的需求。的容器和服务对象。
普罗米修斯用户界面
Prometheus UI 是 Prometheus 内置的可视化管理界面。通过 Prometheus UI,用户可以轻松了解 Prometheus 当前的配置,监控任务的运行状态。通过Graph面板,用户还可以直接使用PromQL实时查询监控数据。访问ServerIP:9090/graph打开WEB页面,可以通过PromQL查询数据,可以进行基础数据展示。
如下图,查询主机负载的变化,可以使用关键字node_load1查询Prometheus采集接收到的主机负载的样本数据。这些样本数据按时间顺序显示,形成主机负载随时间变化的趋势。图表:
关于格拉法纳
Grafana 是一个跨平台的开源度量分析和可视化工具,可以通过查询采集的数据来展示,然后可视化。Grafana 为 prometheus 提供友好的支持,各种工具帮助你构建更酷的数据可视化。
格拉法纳功能
这里我们使用上面的Prometheus使用关键字node_load1来使用Grafana进行可视化,点击侧边栏中的加号图标,然后点击Dashboard点击Create,然后将Prometheus刚刚使用的查询语句放到Metries中,点击右上角的apply角落。.
示例图:
格拉法纳用户界面
在上面的示例中,我们使用 Prometheus+grafana 通过 PromQL 监控和可视化简单的服务器负载。我们也可以通过第三方提供可视化的JSON文件,帮助我们快速监控服务器、Elasticsearch、MYSQL等。这里我们从grafana提供的第三方dashboard地址下载对应的json文件,然后导入grafana进行监控服务器。
监控服务器示例图:
除了服务器端监控之外,还可以监控应用服务。Prometheus 监控应用的方式很简单,只要进程暴露一个 HTTP 访问地址,就可以获取当前的监控样本数据。这样的程序称为 Exporter,Exporter 的实例称为 Target。Prometheus 通过循环训练定期从这些 Targets 中获取监控数据样本。对于应用来说,只需要暴露一个收录监控数据的HTTP访问地址即可。当然,提供的数据需要满足一定的格式。这种格式是 Metrics 格式:metric name>{=, …} 。label name 是标签,label value 是标签的值。
Grafana监控springboot应用实现效果图:
Prometheus+Grafana+Alertmanager等安装配置
Prometheus 及相关组件使用 2.x 版本,Grafana 使用 7.x 版本。
下载地址推荐使用清华大学或华为的开源镜像站点。
下载链接:
Prometheus及相关组件百度网盘地址:
关联:
提取码:4nlh
Prometheus安装1、文件准备
解压下载的 Prometheus 文件
进入
tar -zxvf prometheus-2.19.3.linux-amd64.tar.gz
然后移动到 /opt/prometheus 文件夹,并在没有这个文件夹的情况下创建它
2.配置修改
在prometheus-2.19.3.linux-amd64文件夹目录下找到prometheus.yml配置文件,修改
prometheus.yml 文件配置如下:
# my global config
global:
scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.
# scrape_timeout is set to the global default (10s).
# Alertmanager configuration
alerting:
alertmanagers:
- static_configs:
- targets:
- alertmanager:9093
# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:
# - "first_rules.yml"
# - "second_rules.yml"
# A scrape configuration containing exactly one endpoint to scrape:
# Here it's Prometheus itself.
scrape_configs:
# The job name is added as a label job= to any timeseries scraped from this config.
- job_name: 'prometheus'
# metrics_path defaults to '/metrics'
# scheme defaults to 'http'.
static_configs:
- targets: ['192.168.8.181:9090']
3.普罗米修斯启动
进入/opt/prometheus/prometheus-2.19.3.linux-amd64目录:
nohup ./prometheus >/dev/null 2>&1 &
启动成功后,在浏览器输入ip+9090查看相关信息。
Grafana安装1、文件准备
通过apm安装下载的grafana-7.1.1-1.x86_64.rpm文件
进入:
rpm -ivh grafana-7.1.1-1.x86_64.rpm
安装
如果出现以下错误:
error: Failed dependencies:
urw-fonts is needed by grafana-6.1.4-1.x86_64
没有安装依赖包,需要先安装依赖包,再安装grafana
# yum install -y urw-fonts
2. Grafana 启动
在root用户下启动
进入:
sudo /bin/systemctl start grafana-server.service
启动成功后,在浏览器输入ip+3000查看相关信息
Alertmanager安装1、文件准备
解压下载的 Alertmanager 文件
进入
tar -zxvf alertmanager-0.21.0.linux-386.tar.gz
然后移动到 /opt/prometheus 文件夹,并在没有这个文件夹的情况下创建它
2、alertmanager启动
在root用户下启动
进入:
nohup ./alertmanager >/dev/null 2>&1 &
启动成功后,在浏览器输入ip+9093查看相关信息
示例图:
Pushgateway安装1、文件准备
解压下载的pushgateway文件
进入
tar -zxvf pushgateway-1.2.0.linux-amd64.tar.gz
然后移动到 /opt/prometheus 文件夹,并在没有这个文件夹的情况下创建它
2.开始
在root用户下启动
进入:
nohup ./pushgateway >/dev/null 2>&1 &
启动成功后在浏览器输入ip+9091查看相关信息
五、Node_export安装1、文件准备
解压下载的 Node_export 文件
进入
tar -zxvf node_exporter-0.17.0.linux-amd64.tar.gz
然后移动到 /opt/prometheus 文件夹,并在没有这个文件夹的情况下创建它
2.开始
在root用户下启动
进入:
nohup ./consul_exporter >/dev/null 2>&1 &
启动成功后在浏览器输入ip+9100查看相关信息
Prometheus 使用教程
Prometheus接口地址:ip+9090。
这里我将使用图片和评论来解释。
一、基本使用1>、Prometheus主界面说明
2>、图表使用示例
3>、查看运行信息
4>、查看命令标签值
5>、查看配置信息
6、>查看集成组件
集成的组件需要下载相应的导出服务并开始运行,并添加到prometheus的配置中!
7>、查看服务发现
8>、查看报警规则
first_rules.yml 的配置。
9>、检查是否触发了报警
相关文件:
格拉法纳使用
Grafanf接口地址:ip+3000
初始账号密码:admin、admin
这里我还是用图片和注释来解释,想必这样会更容易理解。. .
[英文]
我这里还是用图片和笔记来解释,一定更容易理解。
1>、主界面信息
2>、创建仪表板监控实现
1.添加数据源
2.选择普罗米修斯
3. 单击创建仪表板
4. 点击创建
5、输入node_load1表示语句,填写相关信息,点击apply完成,名称保存为Test
6.点击搜索Test,点击查看
3>、使用第三方dashboard来监控执行
注意:需要提前添加数据源。
1.点击左上角的加号,点击导入
在线模式
地址:
离线模式
监控示例:
监控和警报实施
监控告警的实现需要依赖Alertmanager及相关组件,如上例中监控服务器应用的node_server组件。
电子邮件警报实施
需要安装警报管理器。因为发邮件比较简单,我这里直接贴配置。xxx字符的参数需要根据情况改变。以下企业微信报警同理。
Alertmanagers 服务的 alertmanager.yml 配置如下:
global:
resolve_timeout: 5m
smtp_from: 'xxx@qq.com'
smtp_smarthost: 'smtp.qq.com:465'
smtp_auth_username: 'xxx@qq.com'
smtp_auth_password: 'xxx'
smtp_require_tls: false
smtp_hello: 'qq.com'
route:
group_by: ['alertname']
group_wait: 5s
group_interval: 5s
repeat_interval: 5m
receiver: 'email'
receivers:
- name: 'email'
email_configs:
- to: 'xxx@qq.com'
send_resolved: true
inhibit_rules:
- source_match:
severity: 'critical'
target_match:
severity: 'warning'
equal: ['alertname', 'dev', 'instance']
注意:smtp_from、smtp_auth_username、to可以填写同一个邮箱,smtp_auth_password填写验证码,需要开启POS3。
如果不知道如何开启POS3,可以查看我的文章文章:
Prometheus服务的Prometheus.yml配置如下:
# my global config
global:
scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.
# scrape_timeout is set to the global default (10s).
# Alertmanager configuration
alerting:
alertmanagers:
- static_configs:
- targets:
- '192.168.214.129:9093'
# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:
- "/opt/prometheus/prometheus-2.19.3.linux-amd64/first_rules.yml"
# - "second_rules.yml"
# A scrape configuration containing exactly one endpoint to scrape:
# Here it's Prometheus itself.
scrape_configs:
# The job name is added as a label job= to any timeseries scraped from this config.
- job_name: 'prometheus'
# metrics_path defaults to '/metrics'
# scheme defaults to 'http'.
static_configs:
- targets: ['192.168.214.129:9090']
- job_name: 'server'
static_configs:
- targets: ['192.168.214.129:9100']
注意:如果target有多个配置,可以在后面添加其他服务的节点。最好alertmanagers写下服务器的ip,否则可能无法发送报警数据。
Error sending alert" err="Post \"http://alertmanager:9093/api/v1/alerts\": context deadline exceeded
配置好Prometheus.yml之后,我们还需要配置告警的规则,也就是触发条件,满足条件就会触发。我们创建一个新的 first_rules.yml 来检测服务器何时挂起并发送消息
first_rules.yml 报警配置:
注意:与job相等的服务名称填写Prometheus.yml配置对应的名称。例如这里设置的服务器对应Prometheus.yml中配置的服务器。
groups:
- name: node
rules:
- alert: server_status
expr: up{job="server"} == 0
for: 15s
annotations:
summary: "机器{{ $labels.instance }} 挂了"
description: "报告.请立即查看!"
依次启动prometheus、altermanagers、node_server服务,查看告警,然后停止node_export服务,稍等片刻查看。
企业微信报警实现
操作与上例基本相同,主要区别在于配置。
1.在企业微信中创建应用,获取secret、corp_id和agent_id配置。
2.然后修改alertmanager.yml配置,alertmanager.yml配置如下:
global:
resolve_timeout: 5s
wechat_api_url: 'https://qyapi.weixin.qq.com/cgi-bin/'
wechat_api_secret: 'xxx'
wechat_api_corp_id: 'xxx'
templates:
- '/opt/prometheus/alertmanager-0.21.0.linux-386/template/wechat.tmpl'
route:
group_by: ['alertname']
group_wait: 10s
group_interval: 10s
repeat_interval: 10s
receiver: 'wechat'
receivers:
- name: 'wechat'
wechat_configs:
- send_resolved: true
to_party: '2'
agent_id: xxx
corp_id: 'xxx'
api_secret: 'xxx'
api_url: 'https://qyapi.weixin.qq.com/cgi-bin/'
<p>
inhibit_rules:
- source_match:
severity: 'critical'
target_match:
severity: 'warning'
equal: ['alertname', 'dev', 'instance']
</p>
配置成功后,操作和上面邮件发送的一样,在企业微信中可以看到如下信息。
[英文]
配置成功后,如果操作与上面发送的邮件一致,可以在微信中看到如下信息。
如果上面的例子不友好,我们也可以开发一个报警模板。
添加警报模板:
在alertmanagers文件夹下创建一个模板文件夹,然后在该文件夹中创建一个微信提醒模板wechat.tmpl,并添加如下配置:
{{ define "wechat.default.message" }}
{{ range .Alerts }}
========start=========
告警程序: prometheus_alert
告警级别: {{ .Labels.severity}}
告警类型: {{ .Labels.alertname }}
故障主机: {{ .Labels.instance }}
告警主题: {{ .Annotations.summary }}
告警详情: {{ .Annotations.description }}
=========end===========
{{ end }}
{{ end }}
然后在alertmanager.yml中添加如下配置:
templates:
- '/opt/prometheus/alertmanager-0.21.0.linux-386/template/wechat.tmpl'
渲染:
应用服务监控告警实现
Prometheus 监控应用的方式很简单,只需要进程暴露一个 HTTP 即可获取当前的监控样本数据
地址。这样的程序称为 Exporter,Exporter 的实例称为 Target。Prometheus 通过循环训练定期从这些 Targets 中获取监控数据样本。对于应用来说,只需要暴露一个收录监控数据的HTTP访问地址即可。当然,提供的数据需要满足一定的格式。这种格式是 Metrics 格式:metric name>{=, …} 。label name 是标签,label value 是标签的值。
Springboot应用实现步骤
1.在pom文件中添加
io.micrometer
micrometer-registry-prometheus
org.springframework.boot
spring-boot-starter-actuator
2.在代码中添加如下配置:
private Counter requestErrorCount;
private final MeterRegistry registry;
@Autowired
public PrometheusCustomMonitor(MeterRegistry registry) {
this.registry = registry;
}
@PostConstruct
private void init() {
requestErrorCount = registry.counter("requests_error_total", "status", "error");
}
public Counter getRequestErrorCount() {
return requestErrorCount;
}
3.在异常处理中添加如下记录:
monitor.getRequestErrorCount().increment();
4.在prometheus的配置中添加springboot应用服务监控
- job_name: 'springboot'
metrics_path: '/actuator/prometheus'
scrape_interval: 5s
static_configs:
- targets: ['192.168.8.45:8080']
5.Promethe.yml配置如下:
- job_name: 'springboot'
metrics_path: '/actuator/prometheus'
scrape_interval: 5s
static_configs:
- targets: ['192.168.8.45:8080']
规则文件配置如下:
6.可以在prometheus监控中查看
企业微信报警效果图:
被监控的springboot项目地址:
其他配置prometheus动态加载配置
Prometheus数据源的配置主要分为静态配置和动态发现。常用的有以下几类:
file_sd_configs 方法提供了一个简单的接口,可以实现在单独的配置文件中配置拉取对象,并监控这些文件的变化并自动加载变化。基于这种机制,我们可以开发自己的程序来监控监控对象的变化,并自动生成配置文件,实现监控对象的自动发现。
在prometheus文件夹目录下创建targets.json文件
配置如下:
[
{
"targets": [ "192.168.214.129:9100"],
"labels": {
"instance": "node",
"job": "server-129"
}
},
{
"targets": [ "192.168.214.134:9100"],
"labels": {
"instance": "node",
"job": "server-134"
}
}
]
然后在prometheus目录下添加如下配置:
- job_name: 'file_sd'
file_sd_configs:
- files:
- targets.json
一些警报配置
这是我整理的一些服务应用告警的配置,欢迎大家讨论一些常用的相关配置。
[英文]
这是我整理的一些服务应用告警的配置,欢迎大家讨论一些常用的相关配置。
内存警报设置
- name: test-rule
rules:
- alert: "内存报警"
expr: 100 - ((node_memory_MemAvailable_bytes * 100) / node_memory_MemTotal_bytes) > 30
for: 15s
labels:
severity: warning
annotations:
summary: "服务名:{{$labels.instance}}内存使用率超过30%了"
description: "业务500报警: {{ $value }}"
value: "{{ $value }}"
示例图:
磁盘设置:
总百分比设置:
(node_filesystem_size_bytes {mountpoint ="/"} - node_filesystem_free_bytes {mountpoint ="/"}) / node_filesystem_size_bytes {mountpoint ="/"} * 100
查看目录的磁盘使用百分比
(node_filesystem_size_bytes{mountpoint="/boot"}-node_filesystem_free_bytes{mountpoint="/boot"})/node_filesystem_size_bytes{mountpoint="/boot"} * 100
匹配多个挂载点的正则表达式
(node_filesystem_size_bytes{mountpoint=”/|/run”}-node_filesystem_free_bytes{mountpoint=”/|/run”})
/node_filesystem_size_bytes{mountpoint=~”/|/run”}*100
磁盘填满预计需要多长时间
predict_linear(node_filesystem_free_bytes {mountpoint = "/"}[1h],
4 _3600) < 0 predict_linear(node_filesystem_free_bytes
{job=”node”}[1h], 4_3600) < 0
CPU使用率
100 – (avg(irate(node_cpu_seconds_total{mode=”idle”}[5m])) 由
(实例) * 100)
空闲内存剩余率
(node_memory_MemFree_bytes+node_memory_Cached_bytes+node_memory_Buffers_bytes)
/node_memory_MemTotal_bytes * 100
内存使用情况
100 –
(node_memory_MemFree_bytes+node_memory_Cached_bytes+node_memory_Buffers_bytes)
/node_memory_MemTotal_bytes * 100
磁盘使用情况
100 – (node_filesystem_free_bytes{mountpoint=”/”,fstype=~”ext4|xfs”}/
node_filesystem_size_bytes{mountpoint=”/”,fstype=~”ext4|xfs”} * 100)
其他
这次比较忙,ELK要等一段时间才能更新,虽然发布的博客对应的是去年整理的博客。. . .
这篇文章文章准备了很久,写了这么多。但我觉得这还不错。对于读者来说,一次写一次可能并不比一次又一次地单独写更好。毕竟,没有必要一一寻找。
[英文]
这篇文章准备了很久,一边整理一边写,没想到会写这么多。不过,感觉也不错。对读者来说,一次写可能比单独写要好。毕竟,没有必要一一寻找。
音乐推荐
原创不容易,如果觉得不错,希望给个推荐!您的支持是我写作的最大动力!
[英文]
原创不易,如果觉得不错,希望给个推荐!您的支持是我写作的最大动力!
最新版:新版PHP无陌然在线云加密平台系统源码 带安装说明(无陌然PHP云加密)
源代码介绍
新版PHP乌墨然在线云加密平台系统源码分享器展示最新版PHP在线云加密平台,
PHP文件加密系统的源代码使用了这个加密系统。用户需要注册并登录才能使用此加密。
用户登录后可以上传自己的php文件进行加密,加密成功后即可下载。但是每次php的加密文件只能下载一次,
这也是为了安全保护。
设备说明:
1.先把这个程序上传到你的空间,
2.设备数据库信息,
3.修改根目录下lib文件夹下的config.php文件
4.下一步是导入数据库。导入完成后,网站就可以访问了,
5.后台路径/admin 默认登录名:admin 密码:admin
如果要更正密码,请使用:password+dfghjklg 然后MD5加密,
比如我要登录密码为123456,我会用md5加密123456dfghjklg,
就拿到这么一串秘钥:1860afdf5e997838ef3ce89bc8409542 然后直接复制他,
只需替换数据库用户表下第一条数据的密码中的内容即可。