- Java锁的逻辑(结合对象头和ObjectMonitor)
- 还在用饼状图?来瞧瞧这些炫酷的百分比可视化新图形(附代码实现)⛵
- 自动注册实体类到EntityFrameworkCore上下文,并适配ABP及ABPVNext
- 基于Sklearn机器学习代码实战
Alertmanager 处理由客户端应用程序(如 Prometheus server)发送的警报。它负责去重(deduplicating),分组(grouping),并将它们路由(routing)到正确的接收器(receiver)集成,如电子邮件,微信,或钉钉。它还负责处理警报的静默/屏蔽(silencing)、定时发送/不发送(Mute)和抑制(inhibition)问题.
AlertManager 作为 开源的为 Prometheus 而设计的告警应用, 已经具备了告警应用各类丰富、灵活、可定制的功能:
AlertName
, Instance
, Job
等任意 label 对海量告警进行分组. 典型情况就是, 突然好多 Pod 都发出了 AlertName: InstanceDown
的 Alerts, 那么可以直接根据 AlertName
进行分组后发送, 这样用户只会收到一封 xxx 个 Pods InstanceDown
的告警邮件. 大大减少告警接收人员的收件量. job=db
的告警路由给 DBA; 满足 team=team-A
的告警路由给 team-A 的邮件组... critical
级别告警已经触发(空间使用超过 90%), 这时候 warning
级别的告警(空间使用超过 80%)就被抑制. 除了没有多租户功能、没有很好的 UI 界面、没有告警历史统计展示之外,作为告警应用, AlertManager 已经是非常强大了。👍️👍️👍️ 。
接下来就不东拉西扯了, 直接进入正题:AlertManager 生产配置趟过的坑 。
📝 Notes
以下所有内容基于 20220723 时 AlertManager 的最新版: v0.24 。
https://ewhisper.cn/alertmanager/#/alerts
/alertmanager/
前缀 https://10.0.0.1:9093/#/alerts
即: 反向代理发送的路径与用户使用的不同. 。
这里直接使用 Traefik 来实现的, 之前已经写过文章了, 具体参见这里
AlertManager 这里需要配置 2 个静态参数, 是通过在 AlertManager 的 StatefulSets 中添加 alertmanager --<flags> 来实现的. 。
默认情况下,Prometheus(和 Alertmanager)假定外部URL( -web.external-url )中的任何路径都是一个前缀路径,将在所有发送到它的请求中出现。然而这并不总是如此, --web.route-prefix 标志允许你更细化地控制这一点.
通过如下配置, 这将在向 AlertManager 传递请求之前剥离掉 /alertmanager/ 。在这种情况下,你需要指定用户在其浏览器中使用的URL是 https://ewhisper.cn/alertmanager/ ,而Prometheus在其HTTP请求中看到的前缀不是 /alertmanager/ ,而只是空的 / .
alertmanager \
--web.external-url https://ewhisper.cn/alertmanager/ \
--web.route-prefix=/
经过上面的配置, 都很完美, 但是查看邮件内容的时候发现一个小坑
Sent by Alertmanager
url 没有 /
, 导致点击该url后无法正常跳转.
这里是通过 Ingress - Traefik 实现了自动加 / 的功能, 可以参见另一篇文章
如果你没有详细看过文档, 直接采用的默认配置, 并且 AlertManager 的告警源除了 Prometheus 也有其他监控软件. 你会发现一个情况: 每过 5min, 某些还在触发中的告警被自动 Resolved(已恢复) 了.
这是因为默认的 AlertManager 的配置中, 有个 resolve_timeout 的参数, 且其默认配置为: resolve_timeout: 5m . 。
📚️ Reference
ResolveTimeout是alertmanager使用的默认值,如果 alerts 不包括EndsAt,在这个时间过后,如果 alerts 没有被更新,AlertManager 会将其声明为已解决(Resolved)。 这个参数对来自Prometheus的 alerts 没有影响,因为它们总是包括EndsAt.
这就是 自动 Resolved 的原因, 当初碰到的时候, 我一看, 这好办啊, 我想要禁用这个功能, 虽然这个参数无法禁用, 如果非要在这份爱上加上一个期限,我希望是一万年 , 直接设置个 10000y 得了. 。
结果报错了...😂😂😂 。
这个 duration 在文档上, 明明说是
📚️ Reference
<duration> : 正则表达式匹配的持续时间 ((([0-9]+)y)?(([0-9]+)w)?(([0-9]+)d)?(([0-9]+)h)?(([0-9]+)m)?(([0-9]+)s)?(([0-9]+)ms)?|0) , 如. 1d , 1h30m , 5m , 10s 。
但是设置 10000y 满足 ([0-9]+)y) 却报错了. 😂 。
后面又翻各种源码, 终于发现这个 <duration> 是无法设置为 三位数的 y 的: 设置 100y 报错, 设置 99y 正常运行. 。
所以, 想要禁用 AlertManager 自动 Resolved 的功能, 就这么设置: resolve_timeout: 99y 。
不管是谁, 我觉得都是希望自己每天收到的告警邮件越少越好的, 方便一项项跟进解决. 结果 AlertManager 倒好, "贴心" 地提供了 4H 未解决告警自动重发 的功能. 😂😂😂 。
这是因为默认的 AlertManager 的配置中, 有个 repeat_interval 的参数, 且其默认配置为: repeat_interval: 4h ... 。
还是像上回一样, 我想要禁用这个功能, 虽然这个参数无法禁用(如果设置为0, 不会禁用, 反而会报错: repeat_interval cannot be zero ), 如果非要在这份爱上加上一个期限,我希望是一万年 , 直接设置个 10000y 得了. 。
结果又报错了(严格说是warning)...😂😂😂 。
repeat_interval is greater than the data retention period.
It can lead to notifications being repeated more often than expected.
📚️ Reference
repeat_interval大于数据保留期。这可能导致通知的重复频率超过预期.
也就是说, repeat_interval 设置太大反而可能会导致通知的重复频率更高, 如果想把它设置的尽可能大, 也不要大于数据的保留时间. 。
所以, 想要尽可能降低 AlertManager 未解决告警自动重发 的频率, 就这么设置: repeat_interval: <尽可能大, 但不要大于数据的保留(data retention)时间 。
接着上文来说, 默认的 AlertManager 的数据保留(data retention)时长是多久呢? 如果想要调大该如何调呢?
查找文档, 又没找到😂😂😂 。
为啥没找到, 原因如下
📚️ Reference
Alertmanager通过命令行标志(command-line flags)和一个配置文件进行配置。 命令行标志配置了不可改变的系统参数,而配置文件定义了抑制规则、通知路由和通知接收者.
文档是没有关于 命令行标志配置 的内容的. 在哪儿能找到呢? 运行 alertmanager -h 命令, 结果如下
📝 Notes
仅显示部分, cluster 相关的 flags 很多, 就不展示了. 。
$ alertmanager -h
usage: alertmanager [<flags>]
Flags:
...
--config.file="alertmanager.yml"
Alertmanager configuration file name.
--storage.path="data/" Base path for data storage.
--data.retention=120h How long to keep data for.
--alerts.gc-interval=30m Interval between alert GC.
--web.config.file="" [EXPERIMENTAL] Path to configuration file that can enable TLS or authentication.
--web.external-url=WEB.EXTERNAL-URL
The URL under which Alertmanager is externally reachable (for example, if Alertmanager is served via a reverse proxy). Used for generating relative and absolute links back to Alertmanager itself.
If the URL has a path portion, it will be used to prefix all HTTP endpoints served by Alertmanager. If omitted, relevant URL components will be derived automatically.
--web.route-prefix=WEB.ROUTE-PREFIX
Prefix for the internal routes of web endpoints. Defaults to path of --web.external-url.
--web.listen-address=":9093"
Address to listen on for the web interface and API.
--web.get-concurrency=0 Maximum number of GET requests processed concurrently. If negative or zero, the limit is GOMAXPROC or 8, whichever is larger.
--web.timeout=0 Timeout for HTTP requests. If negative or zero, no timeout is set.
...
--log.level=info Only log messages with the given severity or above. One of: [debug, info, warn, error]
--log.format=logfmt Output format of log messages. One of: [logfmt, json]
可以看到: --data.retention=120h 默认是 120h, 5天. 。
太少了, 改为 --data.retention=90d , 结果又错了😂😂😂, 这次是格式, 应该写为: --data.retention=--data.retention=2160h 。
那么相应的, 上面的参数就可以设置为: repeat_interval: 90d (是的, 你没看错, 这里可以写为 90d ...😅😅😅) 。
最终, 给到大家一份完整的生产实践 AlertManager 配置, 供参考
'--storage.path=/alertmanager'
(存储位置, 生产上这个目录需要配置持久化存储) '--config.file=/etc/alertmanager/alertmanager.yml'
(配置文件位置, 生产上可以通过 ConfigMap 保存并使用) '--cluster.advertise-address=[$(POD_IP)]:9094'
(高可用集群端口 9094) '--cluster.listen-address=0.0.0.0:9094'
(高可用集群端口 9094) --cluster.peer=alertmanager-0.alertmanager-headless:9094
(高可用集群的一个 peer; 需要创建 headless service) --cluster.peer=alertmanager-1.alertmanager-headless:9094
(高可用集群的另一个 peer) --cluster.peer=alertmanager-2.alertmanager-headless:9094
(高可用集群的第三个 peer) '--data.retention=2160h'
'--log.level=info'
(日志级别, 开发测试环境可以设置为 debug
) '--web.external-url=https://ewhisper.cn/alertmanager/'
'--web.route-prefix=/'
global:
resolve_timeout: 99y
receivers:
# jiralert 插件, 可以将告警发送到 jira
- name: jiralert
webhook_configs:
- send_resolved: true
url: http://jiralert:9097/alert
route:
group_by:
- alertname
group_interval: 5m
group_wait: 1m
receiver: dev-receiver
repeat_interval: 90d
templates:
- /etc/alertmanager/*.tmpl
具体的 route, receiver, inhibit 等配置就不体现了. 。
以上. 。
🎉🎉🎉 。
最后此篇关于PrometheusAlertmanager生产配置趟过的坑总结的文章就讲到这里了,如果你想了解更多关于PrometheusAlertmanager生产配置趟过的坑总结的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我在一个网站上工作,该网站在生产中只有 aspx 文件和 bin 目录和文件。任何人都知道这个网站是如何部署的,我通常有我的网站,我也会提交代码。 我的问题 2. 如何在同一台服务器上创建测试网站?我
您好,我认为这应该是一个相当简单的问题,但我对管理 git 不太熟悉。 我使用的是非常流行的 http://nvie.com/posts/a-successful-git-branching-mode
目前我的网站(生产服务器)已经有很多代码了。现在我想开始在我的项目中使用 Git 并为我的团队设置一个暂存服务器。谁能给我任何建议? 这是我脑海中的画面: Production
我目前正在学习 Erlang SO 用户能否提供有关他们的任何 Erlang 应用程序部署的有趣示例? 我想深入了解 Erlang 在过去的电信中的常见用途,以及 Erlang 在开发/部署过程中带来
我关注了Ryan's screencast并部署到 VPS。所以我使用 Unicorn + nginx + github + Ubuntu 12.04 LTS + capistrano。我也使用 i1
我想在 Azure 中维护临时环境和生产环境。每个都应该有自己的 blob 存储和 sql 存储。实现这一目标的最佳方法是什么?设置临时和生产 SQL Server 以及两个 Blob 存储帐户? 最
我无法使用 Electron 打包程序在内置的 Electron 应用程序中打开chrome开发工具。 我已经尝试过mainWindow.webContents.openDevTools(),但这没有
我有一个 Azure 应用程序服务环境。 可以在同一个 ASE 中运行多个应用服务计划(开发、测试和生产)吗? 基本上,我知道他们会共享前端池,我认为这很好,因为那里没有运行应用程序代码,并且它“..
我是 Maven 新手,有 Rails 背景。在较高级别上,如果我正在运行测试、在本地运行应用程序以及在部署到生产环境时,我希望连接到不同的数据库。 这就是我的想法。当我运行 mvn test 时,它
我有一个 Azure 应用程序服务环境。 可以在同一个 ASE 中运行多个应用服务计划(开发、测试和生产)吗? 基本上,我知道他们会共享前端池,我认为这很好,因为那里没有运行应用程序代码,并且它“..
我正在使用 faSTLane\produce 脚本制作一个新应用程序,我收到以下错误消息: in `parse_response': {"data"=>nil, "messages"=>{"warn"
使开发人员能够构建包含私有(private)数据的系统的当前做法是什么?谁能指出这类事情的“最佳实践”指南? 我们这里有一个 Catch-22,因为开发人员需要编写与具有被认为是“私有(private
我有一个连接 Azure SQL Server 的 Azure 云服务。当我第一次设置这个时,我真的不太了解自己在做什么,只是想熟悉 Azure。所以现在我想利用我所拥有的东西并将其转变为可靠的部署结
我是 Cordova 的新手。抱歉,如果这些是业余问题。我想详细了解典型手机应用程序的设置和架构。 我有一个本地版本的 Meteor Cordova 正在运行,它通过 Modulus 连接到远程服务器
我一直在寻找一些在一些 POS(销售点)设备和服务器之间同步数据的选项。 SymmetricDS似乎是具有商业友好许可证的选项之一。作为一个 Codehaus 项目确实保证了一定程度的质量,所以我同意
在 PHP 开发中,可以通过服务器的“环境”变量确定应用程序是在生产环境还是开发环境中运行。 在 tomcat 服务器上是否有类似的变量可用,或者是否有更好的方法将应用程序用于生产和开发? 最佳答案
我正在做一个项目,我需要使用 TwitterAPI 检索 Twitter 消息,处理它们并将它们存储在数据库中。我正在使用 Producer/Consumer BlockingQueue,其中元素的作
这个问题类似于:iPhone development - what is the difference between a development and distribution provision
我正在尝试根据 URL 在 Drupal 中设置环境。例如,如果我访问 mysite.local,它将使用 localdb 并将站点名称更改为“Local Mysite”;如果我转到 mysite.c
我今天一直在阅读 Magento 中的数据库同步。 我目前正在努力解决的一件事是在开发期间和上传到生产期间需要同步什么。现在假设一批更改将包含对数据库和类似代码的更改,下面是我对模型工作流的理解(我目
我是一名优秀的程序员,十分优秀!