Prometheus实战-从0构建高可用监控平台(三)

141 阅读2分钟

当今的互联网应用系统越来越复杂,其中涉及的组件和服务越来越多,需要进行高效、可靠的监控,以保证系统的稳定性和性能。Prometheus是一款功能强大的开源监控系统,可以实时监控多个维度的指标数据,并支持强大的查询语言和告警机制,是目前广泛使用的云原生应用监控系统之一。

本文档合集《Prometheus实战:从0构建高可用监控平台》将从零开始,手把手教您如何构建一套高可用的Prometheus监控平台,涵盖了以下内容:

  1.  Prometheus集群搭建:实现高可用和可扩展的监控系统
  2.  动态监控指标:自动发现和注册要监控的目标
  3.  告警机制配置:灵活配置告警规则、分组、过滤、抑制,实时通知异常情况
  4. 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-20234as 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)