当今的互联网应用系统越来越复杂,其中涉及的组件和服务越来越多,需要进行高效、可靠的监控,以保证系统的稳定性和性能。Prometheus 是一款功能强大的开源监控系统,可以实时监控多个维度的指标数据,并支持强大的查询语言和告警机制,是目前广泛使用的云原生应用监控系统之一。
本文档合集《Prometheus 实战:从 0 构建高可用监控平台》将从零开始,手把手教您如何构建一套高可用的 Prometheus 监控平台,涵盖了以下内容:
Prometheus 集群搭建:实现高可用和可扩展的监控系统
动态监控指标:自动发现和注册要监控的目标
告警机制配置:灵活配置告警规则、分组、过滤、抑制,实时通知异常情况
Grafana 可视化展示:直观了解系统运行状态和趋势
本文档合集的目标读者是具有一定 Linux 系统和网络知识的系统管理员和 DevOps 工程师。通过本文档合集的学习,您将掌握 Prometheus 的核心概念和实践技巧,能够快速搭建一套高效、可靠的监控平台,帮助您更好地管理和维护复杂的互联网应用系统。
本文以下内容是基于 PrometheusAlert 高可用配置。
PrometheusAlert 配置
PrometheusAlert 是开源的运维告警中心消息转发系统,支持主流的监控系统 Prometheus、Zabbix,日志系统 Graylog2,Graylog3、数据可视化系统 Grafana、SonarQube。 这个服务安装安装官方文档安装就行。
实现这个服务的高可用,依赖 MySQL, 可以用云,也可以自己安装一个 MySQL 实例。 MySQL 安装略。
node2 和 node3 操作
安装服务
cd /usr/local/src/
wget https://github.com/feiyu563/PrometheusAlert/releases/download/v4.8.2/linux.zip
unzip linux.zip
mv linux /usr/local/prometheusalert
复制代码
MySQL 授权和初始化数据库表
mysql> CREATE DATABASE prometheusalert CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
Query OK, 1 row affected (0.00 sec)
mysql> CREATE USER 'prometheusalertadmin'@'10.2.0.%' IDENTIFIED BY '69cH#&3dc14adbe';
Query OK, 0 rows affected (0.00 sec)
mysql> grant all privileges on prometheusalert.* to 'prometheusalertadmin'@'10.2.0.%';
Query OK, 0 rows affected (0.00 sec)
mysql> use prometheusalert;
Database changed
MySQL [prometheusalert]> source /usr/local/prometheusalert/db/prometheusalert.sql;
复制代码
注意修改配置文件 MySQL 相关信息。
服务启动脚本
cat > /etc/systemd/system/prometheusalert.service <<EOF
[Unit]
Description=prometheusalert
After=network.target
[Service]
type=simple
WorkingDirectory=/usr/local/prometheusalert
ExecStart=/usr/local/prometheusalert/PrometheusAlert
ExecReload=/bin/kill -HUP $MAINPID
TimeoutStopSec=20s
Restart=on-failure
LimitNOFILE=10240
LimitNPROC=10240
LimitCORE=infinity
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable prometheusalert.service
systemctl start prometheusalert.service
复制代码
高可用配置
按照之前规划使用 keepalived + haproxy, Alertmanager 到时候配置 vip 地址,端口为 18080, haproxy 配置如下:
frontend prometheusalert-in
bind *:18080
maxconn 20000
default_backend prometheusalert-out
backend prometheusalert-out
server prometheusalert-1 10.2.0.10:8080 maxconn 20480 weight 10 check inter 10s rise 1 fall 2
server prometheusalert-2 10.2.0.41:8080 maxconn 20480 weight 10 check inter 10s rise 1 fall 2
复制代码
告警记录写到 ES
注意修改配置文件 ES 相关信息。按照官方文档配置后,会出现如下报错信息:
Index a prometheusalert alert to es error: elastic: Error 400 (Bad Request): Rejecting mapping update to [prometheusalert-20234] as the final mapping would have more than 1 type: [_doc, prometheusalert] [type=illegal_argument_exception]
复制代码
从错误信息中可以看到,Elasticsearch 拒绝了对索引 [prometheusalert-20234] 进行映射更新,因为最终的 Mapping 将包含多个类型 [_doc, prometheusalert],这是不允许的。
由于在 Elasticsearch 7.x 版本及以上,不再支持多个类型(Multiple Types)的索引。需要把 models/elastic/elasticsearch.go 做如下修改,并重新打包。
func init() {
alertToES := beego.AppConfig.DefaultString("alert_to_es", "0")
@@ -103,7 +148,7 @@ func Insert(index string, value interface{}) {
res, err := esCli.Index().
Index(index).
- Type("prometheusalert").
+ Type("_doc").
BodyJson(value).
Do(ctx)
复制代码
然后自己打包可用的二进制文件。
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -mod=mod -o PrometheusAlert main.go
注意自己本地打包编译的时候,需要对go.mod做以下修改:
diff --git a/go.mod b/go.mod
index 80a6e2c4..ed874e65 100644
--- a/go.mod
+++ b/go.mod
@@ -9,6 +9,7 @@ require (
github.com/go-gomail/gomail v0.0.0-20160411212932-81ebce5c23df
github.com/go-sql-driver/mysql v1.6.0
github.com/go-telegram-bot-api/telegram-bot-api/v5 v5.5.1
+ github.com/hashicorp/golang-lru v0.5.4 // indirect
github.com/lib/pq v1.10.4
github.com/mattn/go-sqlite3 v2.0.3+incompatible
github.com/olivere/elastic/v7 v7.0.32
(END)
复制代码
飞书告警模版
告警模版要配合告警规则结合使用。
{{ $var := .externalURL}}{{ range $k,$v:=.alerts }}{{if eq $v.status "resolved"}}**<font color="info"> [Prometheus恢复信息]({{$v.generatorURL}})</font>**
*[{{$v.labels.alertname}}]({{$var}})*
开始时间:{{ GetCSTtime $v.startsAt }}
结束时间:{{GetCSTtime $v.endsAt }}
告警级别:{{$v.labels.severity}}
业务模块:{{$v.labels.module}}
故障主机IP:{{$v.labels.instance}}
摘要信息:**{{$v.annotations.description}}**{{else}}**<font color="#FF0000">[Prometheus告警信息]({{$v.generatorURL}})</font>**
*[{{$v.labels.alertname}}]({{$var}})*
开始时间:{{ GetCSTtime $v.startsAt }}
告警级别:{{$v.labels.severity}}
业务模块:{{$v.labels.module}}
故障主机IP:{{$v.labels.instance}}
摘要信息:**{{$v.annotations.description}}**{{end}}{{ end }}{{ $urimsg:=""}}{{ range $key,$value:=.commonLabels }}{{$urimsg = print $urimsg $key "%3D%22" $value "%22%2C" }}{{end}}
[*** 点我屏蔽该告警](http://x.x.x.x/#/silences/new?filter=%7B{{SplitString $urimsg 0 -3}}%7D)
复制代码
评论