写点什么

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

  • 2023-05-08
    广东
  • 本文字数:2751 字

    阅读完需:约 9 分钟

当今的互联网应用系统越来越复杂,其中涉及的组件和服务越来越多,需要进行高效、可靠的监控,以保证系统的稳定性和性能。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.zipunzip 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=prometheusalertAfter=network.target
[Service]type=simpleWorkingDirectory=/usr/local/prometheusalertExecStart=/usr/local/prometheusalert/PrometheusAlert ExecReload=/bin/kill -HUP $MAINPIDTimeoutStopSec=20sRestart=on-failureLimitNOFILE=10240LimitNPROC=10240LimitCORE=infinity
[Install]WantedBy=multi-user.targetEOF
systemctl daemon-reloadsystemctl enable prometheusalert.servicesystemctl 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.modindex 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)
复制代码


发布于: 17 小时前阅读数: 3
用户头像

还未添加个人签名 2018-12-12 加入

还未添加个人简介

评论

发布
暂无评论
Prometheus实战-从0构建高可用监控平台(三)_Linux_小毛驴的烂笔头_InfoQ写作社区