首页 热点资讯 义务教育 高等教育 出国留学 考研考公
您的当前位置:首页正文

Prometheus MySQL_exporter

2023-11-12 来源:华拓网

mysqld_exporter是用来搜集mysql的性能指标的,适用于mysql5.5及其以上版本

程序安装

下载地址:https://prometheus.io/download/#mysqld_exporter

安装mysqld_exporter
tar -zxvf mysqld_exporter-0.11.0.linux-amd64.tar.gzmv mysqld_exporter-0.11.0.linux-amd64 /usr/local/mysqld_exporter
赋权

mysqld_exporter需要连接到Mysql,所以需要Mysql的权限,我们先为它创建用户并赋予所需的权限:

CREATE USER ‘exporter‘@‘localhost‘ IDENTIFIED BY ‘abc123‘ WITH MAX_USER_CONNECTIONS 3;GRANT PROCESS, REPLICATION CLIENT, SELECT ON *.* TO ‘exporter‘@‘localhost‘;
创建.my.cnf文件
cd /usr/local/mysqld_exportercat << EOF > .my.cnf[client]user=exporterpassword=abc123EOF
创建systemd服务
cat <<EOF > /etc/systemd/system/mysqld_exporter.service[Unit]Description=mysqld_exporterAfter=network.target[Service]Type=simpleUser=prometheusExecStart=/usr/local/mysqld_exporter/mysqld_exporter --config.my-cnf=/usr/local/mysqld_exporter/.my.cnfRestart=on-failure[Install]WantedBy=multi-user.targetEOF
启动myslqd_exporter
systemctl daemon-reloadsystemctl start mysqld_exportersystemctl status mysqld_exportersystemctl enable mysqld_exporter
验证
curl localhost:9104/metrics
拉取数据

利用 Prometheus 的 static_configs 来拉取 mysqld_exporter 的数据。

编辑prometheus.yml文件,添加内容

- job_name: ‘mysql‘ static_configs: - targets: [‘localhost:9104‘]

重启prometheus,然后在Prometheus页面中的Targets中就能看到新加入的mysql

MySQL exporter Dashboard 模板

搜索mysql的Grafana Dashboard,导入进去

技术分享图片

Prometheus MySQL_exporter

标签:程序安装   内容   ant   github   dash   sql   服务   network   src   

小编还为您整理了以下内容,可能对您也有帮助:

prometheus配置详解

本文按照官方文档的相关内容整理整理的配置语法以及实现功能

一个scrape_config 片段指定一组目标和参数, 目标就是实例,指定采集的端点, 参数描述如何采集这些实例, 配置文件格式如下

因为部署在kubernetes环境中所以我只在意基于kubernetes_sd_configs的服务发现和static_configs静态文件的发现

relable_configss是功能强大的工具,就是Relabel可以在Prometheus采集数据之前,通过Target实例的Metadata信息,动态重新写入Label的值。除此之外,我们还能根据Target实例的Metadata信息选择是否采集或者忽略该Target实例。

relabel_configs

配置格式如下:

其中action主要包括:

replace:默认,通过regex匹配source_label的值,使用replacement来引用表达式匹配的分组

keep:删除regex与连接不匹配的目标 source_labels

drop:删除regex与连接匹配的目标 source_labels

labeldrop:删除regex匹配的标签

labelkeep:删除regex不匹配的标签

hashmod:设置target_label为molus连接的哈希值source_labels

labelmap:匹配regex所有标签名称。然后复制匹配标签的值进行分组,replacement分组引用( {2},…)替代

prometheus中的数值都是key:value格式, 其中replace、keep、drop都是对value的操作, labelmap、labeldrop、labelkeep都是对key的操作

replace是action的默认值, 通过regex匹配source_label的值,使用replacement来引用表达式匹配的分组

上面的列子中 address 的值为 $1:$2 , 其中 $1 是正则表达式 ([^:]+)(?::d+)? 从 address 中获取, $2 是正则表达式 (d+)从(d+) 中获取, 最后的 address 的数值为192.168.1.1:9100

上面的例子只要匹配__meta_kubernetes_service_annotation_prometheus_io_probe=true数据就保留, 反正source_labels中的值没有匹配regex中的值就丢弃

drop 的使用和keep刚好相反, 还是使用keep的例子:

上面的例子只要__meta_kubernetes_service_annotation_prometheus_io_probe这个标签的值为true就丢弃, 反之如果__meta_kubernetes_service_annotation_prometheus_io_probe!=true的数据就保留

labelmap的用法和上面说到replace、keep、drop不同, labelmap匹配的是标签名称, 而replace、keep、drop匹配的是value

上面例子中只要匹配到正则表达式 __meta_kubernetes_service_label_(.+) 的标签, 就将标签重写为 (.+) 中的内容, 效果如下:

待续

使用labeldrop则可以对Target标签进行过滤,删除符合过滤条件的标签,例如:

该配置会使用regex匹配当前target中的所有标签, 删除符合规则的标签, 反之保留不符合规则的

使用labelkeep则可以对Target标签进行过滤,仅保留符合过滤条件的标签,例如:

该配置会使用regex匹配当前target中的所有标签, 保留符合规则的标签, 反之不符合的移除

上面我们说到relabel_config是获取metrics之前对标签的重写, 对应的metric_relabel_configs是对获取metrics之后对标签的操作, metric_relabel_configs能够确定我们保存哪些指标,删除哪些指标,以及这些指标将是什么样子。

metric_relabel_configs的配置和relabel_config的配置基本相同, 如果需要配置相关参数请参考 2.scrape_configs

主要用途为指定exporter获取metrics数据的目标, 可以指定prometheus、 mysql、 nginx等目标

此规则主要是用于抓取prometheus自己数据的配置, targets列表中的为prometheus 获取metrics的地址和端口, 因为没有指定metrics_path所以使用默认的/metrics中获取数据,

简单理解就是, prometheus访问 http://localhost:9090/metrics 获取监控数据

还可以配置指定exporter中的目的地址, 如获取node_exporter的数据

简单理解为分别访问 http://10.40.58.153:9100/metrics http://10.40.58.154:9100/metrics http://10.40.61.116:9100/metrics 获取metrics数据

kubernetes的服务发现可以刮取以下几种数据

通过指定kubernetes_sd_config的模式为endpoints,Prometheus会自动从Kubernetes中发现到所有的endpoints节点并作为当前Job监控的Target实例。如下所示,

该配置是使用kubernetes的发现机制发现kube-apiservers

上面的刮取配置定义了如下信息:

该配置是自动发现kubernetes中的endpoints

可以看到relable_configs中的规则很多, 具体的内容如下

获取的metrics的信息如下:

Prometheus

Prometheus是一个开源系统监控和报警工具包,具有活跃的生态系统。是一个*数据模型,其中的时间序列数据由指标名称和键/值对识别。它不依赖分布式存储,单个服务器节点是自治的。通过一个中间网关支持推送时间序列,可以通过服务发现或静态配置来发现目标,支持多种模式的图表和仪表盘制作。

Prometheus具体架构图如下:

Prometheus 直接或通过中介推送网关从检测的作业中抓取指标,用于短期作业。 它将所有抓取的样本存储在本地,并对这些数据运行规则,以从现有数据聚合和记录新的时间序列或生成警报。 Grafana 或其他 API 使用者可用于可视化收集的数据。

--config.file="prometheus.yml"Prometheus配置文件路径。

--web.listen-address="0.0.0.0:9090"用于监听UI、API和遥测的地址。

--web.config.file=""[EXPERIMENTAL] 可以启用TLS或认证的配置文件的路径。

--web.read-timeout=5m超时读取请求和关闭空闲连接之前的最大持续时间。

--web.max-connections=512最大同时连接数。

--web.external-url=<URL>外部可访问Prometheus所在的URL(例如,如果Prometheus通过反向代理提供服务)。用于生成返回到Prometheus本身的相对和绝对链接。如果URL有路径部分,它将用于为Prometheus服务的所有HTTP端点添加前缀。如果省略,将自动派生相关的URL组件。

--web.route-prefix=<path>Web端点的内部路线的前缀。默认为-web.external-url的路径。

--web.user-assets=<path>静态资源目录的路径,位于 /user。

--web.enable-lifecycle通过HTTP请求启用关闭和重新加载。

--web.enable-admin-api启用管理控制行动的API端点。

--web.console.templates="consoles"控制台模板目录的路径,位于/consoles。

--web.console.libraries="console_libraries"控制台库目录的路径。

--storage.tsdb.path="data/"指标存储的基本路径。仅用于server模式。

--storage.tsdb.retention.time= 样本在储存中保留多长时间。设置此标志后,它会覆盖“storage.tsdb.retention”。如果此标志、“storage.tsdb.retention”或“storage.tsdb.retention.size”均未设置,则保留时间默认为15d。支持的单位:y、w、d、h、m、s、ms。仅用于server模式。

--storage.tsdb.retention.size= 块存储的最大字节数。需要一个单位,支持的单位:B、KB、MB、GB、TB、PB、EB。例如:“512MB”。仅用于server模式。

--storage.tsdb.no-lockfile不在数据目录中创建锁文件。仅用于server模式。

--storage.tsdb.allow-overlapping-blocks允许重叠块,从而启用垂直压缩和垂直查询合并。仅用于服务器模式。

--storage.agent.path="data-agent/"指标存储的基本路径。仅用于agent模式。

--storage.agent.wal-compression压缩代理WAL。仅用于agent模式。

--storage.agent.retention.min-time=当WAL被截断时,样本在被强行删除之前的最小年龄,仅用于agent模式。

--storage.agent.retention.max-time=当WAL被截断时,样本在被强行删除之前的最大年龄,仅用于agent模式。

--storage.agent.no-lockfile不在数据目录中创建锁文件。仅用于agent模式。

--storage.remote.flush-deadline=<ration>在关闭或重新加载配置时等待刷新样本的时间。

--storage.remote.read-sample-limit=5e7在单个查询中通过远程读取接口返回的最大样本总数。 0 表示没有*。对于流式响应类型,将忽略此*。仅用于server模式。

--storage.remote.read-concurrent-limit=10并发远程读取调用的最大数量。 0 表示没有*。仅用于server模式。

--rules.alert.for-outage-tolerance=1h为恢复“for”警报状态而容忍Prometheus中断的最长时间。仅用于server模式。

--rules.alert.for-grace-period=10m警报和恢复“for”状态之间的最短持续时间。这仅适用于配置的“for”时间大于宽限期的警报。仅用于server模式。

--rules.alert.resend-delay=1m在向 Alertmanager 重新发送警报之前等待的最短时间。仅用于server模式。

--alertmanager.notification-queue-capacity=10000等待Alertmanager通知的队列容量。仅用于server模式。

--query.lookback-delta=5m在表达式评估和联合期间,检索指标的最长回溯持续时间。仅用于server模式。

--query.timeout=2m查询在中止之前可能需要的最长时间。仅用于server模式。

--query.max-concurrency=20并发执行的最大查询数。仅用于server模式。

--query.max-samples=50000000单个查询可以加载到内存中的最大样本数。请注意,如果查询尝试将比这更多的样本加载到内存中,查询将失败,因此这也*了查询可以返回的样本数量。仅用于server模式。

--enable-feature=逗号分隔的要启用的功能名称。有效选项:agent、exemplar-storage、expand-external-labels、memory-snapshot-on-shutdown、promql-at-modifier、promql-negative-offset、remote-write-receiver。extra-scrape-metrics、new-service-discovery-manager。

--log.level=info只记录给定严重程度或以上的信息。其中之一:[debug, info, warn, error]。

--log.format=logfmt日志信息的输出格式。其中之一:[logfmt, json]。

通用占位符定义如下:

全局配置区域:

scrape_config部分指定了一组描述如何抓取它们的目标和参数,目标可以通过static_configs参数静态配置或使用支持的服务发现机制之一动态发现。

Prometheus自身支持basic验证和TLS(将来可能会改变),也可以通过nginx开启basic验证。

Exporter将监控数据采集的端点通过HTTP服务的形式暴露给Prometheus Server,Prometheus Server通过访问该Exporter提供的Endpoint端点,即可获取到需要采集的监控数据。

一般来说可以将Exporter分为2类:

Prometheus UI提供了快速验证PromQL以及临时可视化支持的能力,而在大多数场景下引入监控系统通常还需要构建可以长期使用的监控数据可视化面板(Dashboard)。这时用户可以考虑使用第三方的可视化工具如Grafana,Grafana是一个开源的可视化平台,并且提供了对Prometheus的完整支持。

在Prometheus Server中支持基于PromQL创建告警规则,如果满足PromQL定义的规则,则会产生一条告警,而告警的后续处理流程则由AlertManager进行管理。在AlertManager中我们可以与邮件,Slack等等内置的通知方式进行集成,也可以通过Webhook自定义告警处理方式。AlertManager即Prometheus体系中的告警处理中心。

Alertmanager 处理客户端应用程序(例如 Prometheus 服务器)发送的警报。 它负责对它们进行重复数据删除、分组和路由到正确的接收器集成,例如Email、PagerDuty 或 OpsGenie。 它还负责警报的静音和抑制。

报警全家桶 https://github.com/feiyu563/PrometheusAlert

Prometheus

Prometheus是一个开源系统监控和报警工具包,具有活跃的生态系统。是一个*数据模型,其中的时间序列数据由指标名称和键/值对识别。它不依赖分布式存储,单个服务器节点是自治的。通过一个中间网关支持推送时间序列,可以通过服务发现或静态配置来发现目标,支持多种模式的图表和仪表盘制作。

Prometheus具体架构图如下:

Prometheus 直接或通过中介推送网关从检测的作业中抓取指标,用于短期作业。 它将所有抓取的样本存储在本地,并对这些数据运行规则,以从现有数据聚合和记录新的时间序列或生成警报。 Grafana 或其他 API 使用者可用于可视化收集的数据。

--config.file="prometheus.yml"Prometheus配置文件路径。

--web.listen-address="0.0.0.0:9090"用于监听UI、API和遥测的地址。

--web.config.file=""[EXPERIMENTAL] 可以启用TLS或认证的配置文件的路径。

--web.read-timeout=5m超时读取请求和关闭空闲连接之前的最大持续时间。

--web.max-connections=512最大同时连接数。

--web.external-url=<URL>外部可访问Prometheus所在的URL(例如,如果Prometheus通过反向代理提供服务)。用于生成返回到Prometheus本身的相对和绝对链接。如果URL有路径部分,它将用于为Prometheus服务的所有HTTP端点添加前缀。如果省略,将自动派生相关的URL组件。

--web.route-prefix=<path>Web端点的内部路线的前缀。默认为-web.external-url的路径。

--web.user-assets=<path>静态资源目录的路径,位于 /user。

--web.enable-lifecycle通过HTTP请求启用关闭和重新加载。

--web.enable-admin-api启用管理控制行动的API端点。

--web.console.templates="consoles"控制台模板目录的路径,位于/consoles。

--web.console.libraries="console_libraries"控制台库目录的路径。

--storage.tsdb.path="data/"指标存储的基本路径。仅用于server模式。

--storage.tsdb.retention.time= 样本在储存中保留多长时间。设置此标志后,它会覆盖“storage.tsdb.retention”。如果此标志、“storage.tsdb.retention”或“storage.tsdb.retention.size”均未设置,则保留时间默认为15d。支持的单位:y、w、d、h、m、s、ms。仅用于server模式。

--storage.tsdb.retention.size= 块存储的最大字节数。需要一个单位,支持的单位:B、KB、MB、GB、TB、PB、EB。例如:“512MB”。仅用于server模式。

--storage.tsdb.no-lockfile不在数据目录中创建锁文件。仅用于server模式。

--storage.tsdb.allow-overlapping-blocks允许重叠块,从而启用垂直压缩和垂直查询合并。仅用于服务器模式。

--storage.agent.path="data-agent/"指标存储的基本路径。仅用于agent模式。

--storage.agent.wal-compression压缩代理WAL。仅用于agent模式。

--storage.agent.retention.min-time=当WAL被截断时,样本在被强行删除之前的最小年龄,仅用于agent模式。

--storage.agent.retention.max-time=当WAL被截断时,样本在被强行删除之前的最大年龄,仅用于agent模式。

--storage.agent.no-lockfile不在数据目录中创建锁文件。仅用于agent模式。

--storage.remote.flush-deadline=<ration>在关闭或重新加载配置时等待刷新样本的时间。

--storage.remote.read-sample-limit=5e7在单个查询中通过远程读取接口返回的最大样本总数。 0 表示没有*。对于流式响应类型,将忽略此*。仅用于server模式。

--storage.remote.read-concurrent-limit=10并发远程读取调用的最大数量。 0 表示没有*。仅用于server模式。

--rules.alert.for-outage-tolerance=1h为恢复“for”警报状态而容忍Prometheus中断的最长时间。仅用于server模式。

--rules.alert.for-grace-period=10m警报和恢复“for”状态之间的最短持续时间。这仅适用于配置的“for”时间大于宽限期的警报。仅用于server模式。

--rules.alert.resend-delay=1m在向 Alertmanager 重新发送警报之前等待的最短时间。仅用于server模式。

--alertmanager.notification-queue-capacity=10000等待Alertmanager通知的队列容量。仅用于server模式。

--query.lookback-delta=5m在表达式评估和联合期间,检索指标的最长回溯持续时间。仅用于server模式。

--query.timeout=2m查询在中止之前可能需要的最长时间。仅用于server模式。

--query.max-concurrency=20并发执行的最大查询数。仅用于server模式。

--query.max-samples=50000000单个查询可以加载到内存中的最大样本数。请注意,如果查询尝试将比这更多的样本加载到内存中,查询将失败,因此这也*了查询可以返回的样本数量。仅用于server模式。

--enable-feature=逗号分隔的要启用的功能名称。有效选项:agent、exemplar-storage、expand-external-labels、memory-snapshot-on-shutdown、promql-at-modifier、promql-negative-offset、remote-write-receiver。extra-scrape-metrics、new-service-discovery-manager。

--log.level=info只记录给定严重程度或以上的信息。其中之一:[debug, info, warn, error]。

--log.format=logfmt日志信息的输出格式。其中之一:[logfmt, json]。

通用占位符定义如下:

全局配置区域:

scrape_config部分指定了一组描述如何抓取它们的目标和参数,目标可以通过static_configs参数静态配置或使用支持的服务发现机制之一动态发现。

Prometheus自身支持basic验证和TLS(将来可能会改变),也可以通过nginx开启basic验证。

Exporter将监控数据采集的端点通过HTTP服务的形式暴露给Prometheus Server,Prometheus Server通过访问该Exporter提供的Endpoint端点,即可获取到需要采集的监控数据。

一般来说可以将Exporter分为2类:

Prometheus UI提供了快速验证PromQL以及临时可视化支持的能力,而在大多数场景下引入监控系统通常还需要构建可以长期使用的监控数据可视化面板(Dashboard)。这时用户可以考虑使用第三方的可视化工具如Grafana,Grafana是一个开源的可视化平台,并且提供了对Prometheus的完整支持。

在Prometheus Server中支持基于PromQL创建告警规则,如果满足PromQL定义的规则,则会产生一条告警,而告警的后续处理流程则由AlertManager进行管理。在AlertManager中我们可以与邮件,Slack等等内置的通知方式进行集成,也可以通过Webhook自定义告警处理方式。AlertManager即Prometheus体系中的告警处理中心。

Alertmanager 处理客户端应用程序(例如 Prometheus 服务器)发送的警报。 它负责对它们进行重复数据删除、分组和路由到正确的接收器集成,例如Email、PagerDuty 或 OpsGenie。 它还负责警报的静音和抑制。

报警全家桶 https://github.com/feiyu563/PrometheusAlert

Prometheus SNMP Exporter

Prometheus SNMP Exporter 项目地址

SNMP Exporter 从 SNMP 服务中采集信息提供给 Promethers 监控系统使用。
有两个部分,执行提供数据的 exporter,以使用的 generator
(取决于netsnmp)生成配置为 exporter 提供配置。

默认情况下,snmp exporter 从 snmp.yml 文件中读取配置。此文件不是手动编写的,而是使用 generator 为您生成它。
默认配置的 snmp.yml 配置文件中包含各种公共硬件,对于这些硬件,mib对常见设备通用,使用 snmp v2 GETBULK 可以遍历它们。
除了最简单的设置外,您还需要使用生成器。需要定制哪些对象是遍历的,使用非公开 MIB 或指定认证参数。

SNMP Exporter 需要将地址作为参数传递,这可以通过重新标记来完成。
示例:

这种配置允许 Prometheus 提供调度和服务自动发现,这与不能在我们要从其获取指标的机器上运行 Exporter 的所有其他 Exporter 有所不同。

为 Counter64 较大的值提供准确的计数器,exporter 将为每 2^53 值自动包装,以避免 64 位浮点舍入。
要禁用此功能,请使用命令行参数 --no-snmp.wrap-large-counters 。

Prometheus SNMP Exporter

Prometheus SNMP Exporter 项目地址

SNMP Exporter 从 SNMP 服务中采集信息提供给 Promethers 监控系统使用。
有两个部分,执行提供数据的 exporter,以使用的 generator
(取决于netsnmp)生成配置为 exporter 提供配置。

默认情况下,snmp exporter 从 snmp.yml 文件中读取配置。此文件不是手动编写的,而是使用 generator 为您生成它。
默认配置的 snmp.yml 配置文件中包含各种公共硬件,对于这些硬件,mib对常见设备通用,使用 snmp v2 GETBULK 可以遍历它们。
除了最简单的设置外,您还需要使用生成器。需要定制哪些对象是遍历的,使用非公开 MIB 或指定认证参数。

SNMP Exporter 需要将地址作为参数传递,这可以通过重新标记来完成。
示例:

这种配置允许 Prometheus 提供调度和服务自动发现,这与不能在我们要从其获取指标的机器上运行 Exporter 的所有其他 Exporter 有所不同。

为 Counter64 较大的值提供准确的计数器,exporter 将为每 2^53 值自动包装,以避免 64 位浮点舍入。
要禁用此功能,请使用命令行参数 --no-snmp.wrap-large-counters 。

2020-08-25

Prometheus 实现邮件告警(Prometheus+Alertmanager+QQ邮箱或者网易163邮箱,目前测试过这两种邮箱都可以发送告警邮件)

Prometheus实现邮件告警原理如下:

Prometheus官方有一个附带的中间件:alertmanager,通过设置rules规则和路由转发可以实现邮件告警,前提是你需要有一个可以发送邮件的邮件服务端(可以自建或者使用互联网公司提供的免费邮箱)

告警原理图

Prometheus完整架构图

我之前得出的错误结论如下:

推荐直接在虚拟机操作系统上直接安装Prometheus和Alertmanager,不推荐其中任何一方在容器中运行,因为测试过在容器中运行Prometheus和alertmanager,结果出现如下错误情况

第一种情况是:我的node-exporter掉线跌机了(手动关机,模拟突然掉线跌机),Prometheus却提示节点依然在线?有时候却能够正常显示节点掉线跌机,生成告警发送邮件

第二种情况是:我的node-exporter掉线跌机了(手动关机,模拟突然掉线跌机),Prometheus提示节点掉线,告警生成,但是没有发送邮件,我手动恢复node-exporter后,告警解除,邮件能正常发送邮件提示告警已经解除。。。。

第三种情况是:我的node-exporter掉线跌机了(手动关机,模拟突然掉线跌机),Prometheus提示节点掉线,告警生成,正常成功发送邮件,我手动恢复node-exporter后,告警解除,邮件没有发送出来。。。。

以上三种情况之前经常出现,当时第一步以为是自己设置的scrape_interval不合理导致的,结果调试几次,问题没有解决,第二步以为是自己的服务器时间没有做到精确同步,然后我去设置和阿里云的ntp服务器同步,结果问题依然没有解决,第三步,换个方向,把alertmanager迁移到虚拟机操作系统上安装运行,问题解决!

北京时间是GMT+8小时,有些同志的时间可能是UTC的,但是如果是在要求不太十分精确的情况下,UTC时间是刚刚好等于GMT时间

为了避免时区的混乱,prometheus所有的组件内部都强制使用Unix时间,对外展示使用GMT时间。

要改时区有两个办法

1 .修改源码,重新编译。

2. 使用 docker 运行 Prometheus,挂载本地时区文件

docker run --restart always -e TZ=Asia/Shanghai --hostname prometheus --name prometheus-server -d -p 9090:9090 -v /data/prometheus/server/data:/prometheus -v /data/prometheus/server/conf/prometheus.yml:/etc/prometheus/prometheus.yml -u root prom/prometheus:v2.5.0

正文开始

安装alertmanager

容器安装方式:

docker run -d --name alertmanager -p 9093:9093 -v /usr/local/Prometheus/alertmanager/alertmanager.yml:/etc/alertmanager/alertmanager.yml prom/alertmanager:latest

先在宿主机/usr/local/Prometheus下创建一个文件夹alertmanager,然后在文件夹里创建alertmanager.yml配置文件,待会才能映射到alertmanager容器里的/etc/alertmanager目录下

global:全局配置

   resolve_timeout: 问题解决的超时时间

   smtp_from: 发送告警邮件的邮箱账号

   smtp_smarthost: 邮箱 SMTP 服务地址,这里是以QQ邮箱为例,也可以用网易163邮箱,这个和我之前设置zabbix邮件告警时的配置一样

   smtp_auth_username: 如果没有设置邮箱别名,那就是账户名

   smtp_auth_password:  邮箱的授权码,不是 账户密码,你可以在QQ邮箱或者网易163邮箱网页端设置,开启 POP3/SMTP 服务时会提示,和配置zabbix邮件告警的时候几乎一样

   smtp_require_tls: 是否使用 tls,根据环境不同,来选择开启和关闭。如果提示报错 email.loginAuth failed: 530 Must issue a STARTTLS command first,那么就需要设置为 true。着重说明一下,如果开启了 tls,提示报错 starttls failed: x509: certificate signed by unknown authority,需要在 email_configs 下配置 insecure_skip_verify: true 来跳过 tls 验证。

templates: 告警模板目录,可以不编写模板,有默认模板

    Subject: '{{ template "email.default.subject" . }}'

    html: '{{ template "email.default.html" . }}'

route:报警的分发设置

    group_by:分组

    group_wait: 分组等待时间

    group_interval: 5m 每组时间间隔

    repeat_interval: 10m 重复间隔

    receiver: 接收方式,请注意!这里的名字要对应下面receivers中的任何一个名字,不然会报错,这里其实就是选择方式,有邮箱,企业微信,wehook,victorops等等

receivers:接受方式汇总,即告警方式汇总

例子:

receivers:

- name:'default-receiver' 

email_configs:

- to:'whiiip@163.com'    

  html: '{{ template "alert.html" . }}'    

  headers: { Subject: "[WARN] 报警邮件test"}

inhibit_rules:   抑制规则

当存在与另一组匹配的警报(源)时,抑制规则将禁用与一组匹配的警报(目标)。

包括源匹配和目标匹配

alertmanager官方是这样说的

Inhibition

Inhibition is a concept of suppressing notifications for certain alerts if certain other alerts are already firing.

Example:  An alert is firing that informs that an entire cluster is not reachable. Alertmanager can be configured to mute all other alerts concerning this cluster if that particular alert is firing. This prevents notifications for hundreds or thousands of firing alerts that are unrelated to the actual issue.

Inhibitions are configured through the Alertmanager's configuration file.

当存在与另一组匹配器匹配的警报(源)时,禁止规则会使与一组匹配器匹配的警报(目标)静音。目标警报和源警报的equal列表中的标签名称都必须具有相同的标签值。

在语义上,缺少标签和带有空值的标签是同一件事。因此,如果equal源警报和目标警报都缺少列出的所有标签名称,则将应用禁止规则。

为了防止警报禁止自身,与规则的目标和源端 都 匹配的警报不能被警报(包括其本身)为真来禁止。但是,我们建议选择目标匹配器和源匹配器,以使警报永远不会同时匹配双方。这很容易进行推理,并且不会触发此特殊情况。

接着是规则rules

不解释了,自己研究官方文档

alertmanager的非容器安装方式是

 wget https://github.com/prometheus/alertmanager/releases/download/v0.20.0/alertmanager-0.20.0.linux-amd64.tar.gz

tar xf alertmanager-0.20.0.linux-amd64.tar.gz

mv alertmanager-0.20.0.linux-amd64 /usr/local/alertmanager

vim /usr/lib/systemd/system/alertmanager.service

[Unit]

Description=alertmanager

Documentation=https://github.com/prometheus/alertmanager

After=network.target

[Service]

Type=simple

User=root

ExecStart=/usr/local/alertmanager/alertmanager --config.file=/usr/local/alertmanager/alertmanager.yml

Restart=on-failure

[Install]

WantedBy=multi-user.target

Alertmanager 安装目录下默认有 alertmanager.yml 配置文件,可以创建新的配置文件,在启动时指定即可。

其余方式和上面一样

接着是Prometheus,我之前的博客里有写了容器安装和非容器安装的方法,自己去翻阅

然后是在prometheus.yml里修改相关配置

首先去掉alertmanager的注释,改成IP加你设置的端口号,默认是9093

接着在rule_files: 下面写下规则文件的绝对路径,可以是具体文件名,也可以是*,也可以分几级文件,*默认是全部匹配

接着是被监控项的设置,这里设置完成可以在Prometheus网页里的targets里看得到

请注意,这里设置的参数名字要和rule规则中设置的参数名字一模一样,否则你的prometheus服务会无法启动,然后报错

如果不在特定的job下设置scrape_interval(优先级高于全局),则默认采用gobal下的scrape_interval

最后模拟节点掉线,手动关闭node-exporter或者Cadvisor

docker stop node-exporter 或者容器ID

docker stop cadvisor 或者容器ID

或者把up{{job='prometheus'}} == 1 设置成1,反向设置,不用关掉服务,就可以看看告警成不成功

说明一下 Prometheus Alert 告警状态有三种状态:Inactive、Pending、Firing。

Inactive:非活动状态,表示正在监控,但是还未有任何警报触发。

Pending:表示这个警报必须被触发。由于警报可以被分组、压抑/抑制或静默/静音,所以等待验证,一旦所有的验证都通过,则将转到 Firing 状态。

Firing:将警报发送到 AlertManager,它将按照配置将警报的发送给所有接收者。一旦警报解除,则将状态转到 Inactive,如此循环。

没有配置告警模板时的默认告警格式是这样的

节点恢复后邮件告知是这样的

写了模板后是这样的

还要重新映射模板文件夹路径到alertmanager容器里的相对路径,然后重启alertmanager,当然,如果目录下没有模板文件,则不显示

告警模板

在alertmanager.yml中修改相关设置

重启alertmanager

docker restart alertmanager

最终效果不是很好

2020-08-25

Prometheus 实现邮件告警(Prometheus+Alertmanager+QQ邮箱或者网易163邮箱,目前测试过这两种邮箱都可以发送告警邮件)

Prometheus实现邮件告警原理如下:

Prometheus官方有一个附带的中间件:alertmanager,通过设置rules规则和路由转发可以实现邮件告警,前提是你需要有一个可以发送邮件的邮件服务端(可以自建或者使用互联网公司提供的免费邮箱)

告警原理图

Prometheus完整架构图

我之前得出的错误结论如下:

推荐直接在虚拟机操作系统上直接安装Prometheus和Alertmanager,不推荐其中任何一方在容器中运行,因为测试过在容器中运行Prometheus和alertmanager,结果出现如下错误情况

第一种情况是:我的node-exporter掉线跌机了(手动关机,模拟突然掉线跌机),Prometheus却提示节点依然在线?有时候却能够正常显示节点掉线跌机,生成告警发送邮件

第二种情况是:我的node-exporter掉线跌机了(手动关机,模拟突然掉线跌机),Prometheus提示节点掉线,告警生成,但是没有发送邮件,我手动恢复node-exporter后,告警解除,邮件能正常发送邮件提示告警已经解除。。。。

第三种情况是:我的node-exporter掉线跌机了(手动关机,模拟突然掉线跌机),Prometheus提示节点掉线,告警生成,正常成功发送邮件,我手动恢复node-exporter后,告警解除,邮件没有发送出来。。。。

以上三种情况之前经常出现,当时第一步以为是自己设置的scrape_interval不合理导致的,结果调试几次,问题没有解决,第二步以为是自己的服务器时间没有做到精确同步,然后我去设置和阿里云的ntp服务器同步,结果问题依然没有解决,第三步,换个方向,把alertmanager迁移到虚拟机操作系统上安装运行,问题解决!

北京时间是GMT+8小时,有些同志的时间可能是UTC的,但是如果是在要求不太十分精确的情况下,UTC时间是刚刚好等于GMT时间

为了避免时区的混乱,prometheus所有的组件内部都强制使用Unix时间,对外展示使用GMT时间。

要改时区有两个办法

1 .修改源码,重新编译。

2. 使用 docker 运行 Prometheus,挂载本地时区文件

docker run --restart always -e TZ=Asia/Shanghai --hostname prometheus --name prometheus-server -d -p 9090:9090 -v /data/prometheus/server/data:/prometheus -v /data/prometheus/server/conf/prometheus.yml:/etc/prometheus/prometheus.yml -u root prom/prometheus:v2.5.0

正文开始

安装alertmanager

容器安装方式:

docker run -d --name alertmanager -p 9093:9093 -v /usr/local/Prometheus/alertmanager/alertmanager.yml:/etc/alertmanager/alertmanager.yml prom/alertmanager:latest

先在宿主机/usr/local/Prometheus下创建一个文件夹alertmanager,然后在文件夹里创建alertmanager.yml配置文件,待会才能映射到alertmanager容器里的/etc/alertmanager目录下

global:全局配置

   resolve_timeout: 问题解决的超时时间

   smtp_from: 发送告警邮件的邮箱账号

   smtp_smarthost: 邮箱 SMTP 服务地址,这里是以QQ邮箱为例,也可以用网易163邮箱,这个和我之前设置zabbix邮件告警时的配置一样

   smtp_auth_username: 如果没有设置邮箱别名,那就是账户名

   smtp_auth_password:  邮箱的授权码,不是 账户密码,你可以在QQ邮箱或者网易163邮箱网页端设置,开启 POP3/SMTP 服务时会提示,和配置zabbix邮件告警的时候几乎一样

   smtp_require_tls: 是否使用 tls,根据环境不同,来选择开启和关闭。如果提示报错 email.loginAuth failed: 530 Must issue a STARTTLS command first,那么就需要设置为 true。着重说明一下,如果开启了 tls,提示报错 starttls failed: x509: certificate signed by unknown authority,需要在 email_configs 下配置 insecure_skip_verify: true 来跳过 tls 验证。

templates: 告警模板目录,可以不编写模板,有默认模板

    Subject: '{{ template "email.default.subject" . }}'

    html: '{{ template "email.default.html" . }}'

route:报警的分发设置

    group_by:分组

    group_wait: 分组等待时间

    group_interval: 5m 每组时间间隔

    repeat_interval: 10m 重复间隔

    receiver: 接收方式,请注意!这里的名字要对应下面receivers中的任何一个名字,不然会报错,这里其实就是选择方式,有邮箱,企业微信,wehook,victorops等等

receivers:接受方式汇总,即告警方式汇总

例子:

receivers:

- name:'default-receiver' 

email_configs:

- to:'whiiip@163.com'    

  html: '{{ template "alert.html" . }}'    

  headers: { Subject: "[WARN] 报警邮件test"}

inhibit_rules:   抑制规则

当存在与另一组匹配的警报(源)时,抑制规则将禁用与一组匹配的警报(目标)。

包括源匹配和目标匹配

alertmanager官方是这样说的

Inhibition

Inhibition is a concept of suppressing notifications for certain alerts if certain other alerts are already firing.

Example:  An alert is firing that informs that an entire cluster is not reachable. Alertmanager can be configured to mute all other alerts concerning this cluster if that particular alert is firing. This prevents notifications for hundreds or thousands of firing alerts that are unrelated to the actual issue.

Inhibitions are configured through the Alertmanager's configuration file.

当存在与另一组匹配器匹配的警报(源)时,禁止规则会使与一组匹配器匹配的警报(目标)静音。目标警报和源警报的equal列表中的标签名称都必须具有相同的标签值。

在语义上,缺少标签和带有空值的标签是同一件事。因此,如果equal源警报和目标警报都缺少列出的所有标签名称,则将应用禁止规则。

为了防止警报禁止自身,与规则的目标和源端 都 匹配的警报不能被警报(包括其本身)为真来禁止。但是,我们建议选择目标匹配器和源匹配器,以使警报永远不会同时匹配双方。这很容易进行推理,并且不会触发此特殊情况。

接着是规则rules

不解释了,自己研究官方文档

alertmanager的非容器安装方式是

 wget https://github.com/prometheus/alertmanager/releases/download/v0.20.0/alertmanager-0.20.0.linux-amd64.tar.gz

tar xf alertmanager-0.20.0.linux-amd64.tar.gz

mv alertmanager-0.20.0.linux-amd64 /usr/local/alertmanager

vim /usr/lib/systemd/system/alertmanager.service

[Unit]

Description=alertmanager

Documentation=https://github.com/prometheus/alertmanager

After=network.target

[Service]

Type=simple

User=root

ExecStart=/usr/local/alertmanager/alertmanager --config.file=/usr/local/alertmanager/alertmanager.yml

Restart=on-failure

[Install]

WantedBy=multi-user.target

Alertmanager 安装目录下默认有 alertmanager.yml 配置文件,可以创建新的配置文件,在启动时指定即可。

其余方式和上面一样

接着是Prometheus,我之前的博客里有写了容器安装和非容器安装的方法,自己去翻阅

然后是在prometheus.yml里修改相关配置

首先去掉alertmanager的注释,改成IP加你设置的端口号,默认是9093

接着在rule_files: 下面写下规则文件的绝对路径,可以是具体文件名,也可以是*,也可以分几级文件,*默认是全部匹配

接着是被监控项的设置,这里设置完成可以在Prometheus网页里的targets里看得到

请注意,这里设置的参数名字要和rule规则中设置的参数名字一模一样,否则你的prometheus服务会无法启动,然后报错

如果不在特定的job下设置scrape_interval(优先级高于全局),则默认采用gobal下的scrape_interval

最后模拟节点掉线,手动关闭node-exporter或者Cadvisor

docker stop node-exporter 或者容器ID

docker stop cadvisor 或者容器ID

或者把up{{job='prometheus'}} == 1 设置成1,反向设置,不用关掉服务,就可以看看告警成不成功

说明一下 Prometheus Alert 告警状态有三种状态:Inactive、Pending、Firing。

Inactive:非活动状态,表示正在监控,但是还未有任何警报触发。

Pending:表示这个警报必须被触发。由于警报可以被分组、压抑/抑制或静默/静音,所以等待验证,一旦所有的验证都通过,则将转到 Firing 状态。

Firing:将警报发送到 AlertManager,它将按照配置将警报的发送给所有接收者。一旦警报解除,则将状态转到 Inactive,如此循环。

没有配置告警模板时的默认告警格式是这样的

节点恢复后邮件告知是这样的

写了模板后是这样的

还要重新映射模板文件夹路径到alertmanager容器里的相对路径,然后重启alertmanager,当然,如果目录下没有模板文件,则不显示

告警模板

在alertmanager.yml中修改相关设置

重启alertmanager

docker restart alertmanager

最终效果不是很好

普罗米修斯 Prometheus 入门

官方文档

Prometheus 从被监控目标设备通过检索 metrics HTTP endpoints 收集metrics。因为Prometheus自身也以同样的方式发布数据,所以它也可以监控自身的健康状态。

虽然Prometheus server仅采集自身的数据没什么意义,但是作为开始的范例很合适。

将下面的内容保存为 Prometheus 配置文件prometheus.yml:

实际上安装包内已经包含了该文件,无需修改

查看其他配置项,请参阅 configuration documentation 。

新开一个bash shell,查看服务和端口

访问测试 http://ip:9090/

访问测试 http://ip:9090/metrics/

我们试试查看Prometheus 收集的自身的数据。要使用 Prometheus 自带的 expression browser,导航到 http://localhost:9090/graph ,选择"Graph" tab内的 "Console" view 。

既然你可以从 localhost:9090/metrics 查看数据,那么可以看到一个Prometheus自己发布的指标 prometheus_target_interval_length_seconds (目标采集的实际间隔实际)。输入到expression console,然后点击 "Execute":

如上,返回了一些不同的时间序列 (along with the latest value recorded for each), 都是 prometheus_target_interval_length_seconds的metric name,但是拥有不同的标签。这些标签显示了不同的时间段( latency percentiles)和 目标组间隔(target group intervals)。

如果我们只对 99th percentile latencies有兴趣,我们可以通过如下查询:

要统计返回的时间序列数量,可以查询如下:

更多表达式语言参见 expression language documentation .

要图形表示,导航到 http://localhost:9090/graph ,点击 "Graph" tab。

比如,使用如下查询,图形表示demo Prometheus的per-second rate of chunks :

Experiment with the graph range parameters and other settings.

开始接入几个sample targets来演示。

Node Exporter 用来作为范例,怎么使用参见 see these instructions.

范例监听在 http://ip:8080/metrics , http://ip:8081/metrics , and http://ip:8082/metrics 。

现在我们配置 Prometheus 来采集这些对象。 我们把三个endpoints组成一个group到job内,称为node。 假设,前两个是生产,第三个是金丝雀实例。为了在Prometheus区分,我们增加了数个endpoint组,给每个组增加标签。在范例中,我们将增加 group="proction" 标签给第一个组, group="canary" 给第二个。

要实现这些,在prometheus.yml文件添加如下job定义到scrape_configs section,然后重启Prometheus 实例。

回到 expression browser ,确认 Prometheus 现在已经有了关于这三个范例的信息,比如查询

虽然在范例中没有这个问题,但是当computed ad-hoc ,跨成千上万时间序列的查询会变慢。为提升效率, Prometheus 允许通过配置recording rules 将预记录的表达式插入到新时间序列中。 假设我们需要5分钟时间窗口(job, instance and mode dimensions)的平均值 per-second rate of cpu time (node_cpu_seconds_total) 。我们可以查询如下:

实施图形展示。

要将这个表达式的值放到一个新metric job_instance_mode:node_cpu_seconds:avg_rate5m ,使用下面的recording rule 保存为 prometheus.rules.yml:

要让 Prometheus 使用这个 rule,在 prometheus.yml 添加 rule_files 声明部分。 如下是范例:

使用新配置文件重启 Prometheus ,确认一个新指标 job_instance_mode:node_cpu_seconds:avg_rate5m 可以通过expression browser查询了。

Prometheus无法获取Windows的CPU数据解决方法

在使用的Prometheus的wmi exporter进行Windows监控时,会遇到CPU、 流量、磁盘等指标数据无法获取的情况。本文说一下解决方法。

先说结论 :wmi exporter是通过Windows的WMI工具采集系统指标的,如果WMI这个工具有问题,那么监控工具肯定不会正常工作。

定位问题: 打开wmi exporter暴露的URL,查看cpu组件采集状态,一般是  http://localhost:9182/metrics ,搜索关键词,wmi_exporter_collector_success,发现cpu、disk、net的状态都是0,正常情况应该是1

排错步骤1:   打开Windows自带的events查看器,发现报错

排错步骤2: 打开 powershell,执行命令 Get-WmiObject Win32_PerfRawData_PerfOS_Processor,发现如下报错

得出结论: 这个报错表示WMI的获取CPU的方法无法执行,Windows的WMI组件受损,需要修复。

显示全文