Skip to main content

Command Palette

Search for a command to run...

ChatBot:在 Slack 中使用监控和告警

Updated
2 min read

前面文章中我们使用 Errbot 通过 Kubernetes API 在 Slack 中进行 Kubernetes 查询。这种方式很局限。毕竟拉更多组件下水,写更多代码才是大势所趋 LOL。本文以 Istio 中的响应时间监控为例,看看 Errbot 和 Prometheus 的互动。

前提

  • Istio

  • Prometheus

  • 公网部署

  • 接入 Slack 的 Errbot

  • Errbot 开放 3141 端口,能够被 Alertmanager 使用。

注意:

  • 这里只是介绍一下这种思路,例子要求比较高,源文件也不会很完整。要投入实际使用,需要更多配合。

  • 选择 Istio 做监控目标,只是因为目前环境方便,并无特殊含义。

  • Errbot 的 Slack 接入在之前的文章有一些介绍可以参考。

在 Bot 中获取监控指标

Prometheus 提供了很方便的 HTTP API(注 1),简单的使用 HTTP 客户端即可获取。下面的表达式用于从 Istio 中获取响应时间的 p99 指标:

histogram_quantile(0.99, sum(irate(istio_request_duration_bucket[1m])) by (source_service, source_version, destination_service, destination_version, le))

这里为行文方便,直接硬编码,实际上可以通过查询模板、Bot 参数等方式,获得更灵活的查询。或者更加简单粗暴的,在聊天室向 Bot 提供查询公式直接查询。

下面的代码,会将 Prometheus 中的指标,在 Slack 中以卡片的方式输出到指定聊天室中。

  1. 指定一个 query 参数,取值为刚才提到的 Prometheus 查询语句,{"query": prom}的形式进行 URL Encode。

  2. API 指令发出后,Prometheus 会响应一段 JSON 报文,报文的result字段包含一个列表,包含了各个服务的各个版本之间的通信响应时间。

  3. 这里使用 Errbot 的 send_card(注 2)功能,通过 Field 方式逐个输出服务记录。

  4. room = self.build_identifier("#bot"),使用 self.build_identifier(注 3)设置发送目标。

  5. 代码放入 Errbot 插件之后,私聊窗口输入!restart,重启。会看到 Errbot 发出重启信息之后断线。

  6. 等 Errbot 再次在线,在聊天室输入指令!service quality,会看到类似如下的信息回应:

使用 Bot 接收 Prometheus 告警

实际上 Prometheus 的 Alert Manager 提供了到 Slack 的集成,这里纯属演示,绕了个远。

配置 Bot

  1. 在聊天室私信中发布命令 !plugin config Webserver {'HOST': '0.0.0.0','PORT': 3141},要求 Errbot 开放端口启动 Webhook 服务。

  2. 同样的使用私信发送命令 !stat

    us,查询插件运行状态,可以看到 Webserver 已经启动。

  3. 为 Bot 插件加入 Webhook 代码,并重新启动 Bot,这里定义了路径alertmanager用于接受告警,同样使用卡片方式,发送告警信息到bot频道,在卡片中显示告警的相关服务及其版本:

def alertmanager(self, data):
    """Webhook for alerts from Prometheus"""
    target = self.build_identifier("#bot")
    self.send(target, "Alert!!")
    for alert in data['alerts']:
        self.send_card(
            to=target,
            summary='[{}] {}'.format(
                data['status'].upper(),
                data['commonLabels']['alertname']
            ),
            title="Prometheus Alert",
            fields=[('From', alert['annotations']['from']),
                    ('To', alert['annotations']['to'])],
            body=alert['annotations']['summary']
        )

Prometheus 配置

  1. 配置 Prometheus 告警规则:

    • 使用前面提到的同一个公式

    • 使用注解来传递应用标签

    • 这里我们配置大于 3 秒钟的耗时发生告警

    groups:
    - name: fake
        rules:
        - alert: rules-alert
        expr: |
            histogram_quantile(0.99,
            sum(irate(istio_request_duration_bucket[1m]))
            by (source_service, source_version,
            destination_service, destination_version, le)) > 3
        for: 1m
        labels:
            alertname: "request-duration-3"
        annotations:
            summary: "Request duration gt 3"
            from: "{{ $labels.source_service }}:{{ $labels.source_version }}"
            to: "{{ $labels.destination_service }}:{{ $labels.destination_version }}"
  1. 配置和重启 Alert Manager,定义使用 Web hook 通知 errbot 发送告警到 Slack:

     route:
         receiver: 'webhook'
         group_wait: 30s
         group_interval: 5m
         repeat_interval: 4h
         group_by: ['from', 'to']
         routes:
    
     receivers:
     - name: 'webhook'
         webhook_configs:
         - url: "http://errbot.default:3141/alertmanager"
    
  2. Prometheus 连接到 AlertManager 上,用于发送告警,修改后重启 Prometheus:

alerting:
  alertmanagers:
  - scheme: http
    static_configs:
    - targets:
      - "alertmanager:9093"

运行

在负载上调用耗时操作,例如持续访问httpbin/delay/5指令,满足标准后,可以看到,告警的传递线路

  1. https://prometheus.io/docs/prometheus/latest/querying/api/

  2. http://errbot.io/en/latest/errbot.botplugin.html#errbot.botplugin.BotPlugin.send_card

  3. http://errbot.io/en/latest/errbot.botplugin.html#errbot.botplugin.BotPlugin.build_identifier

附录

  1. 查询
@botcmd
def service_quality(self, message, args):
  url = "http://prometheus-server.kube-system/api/v1/query?"
  prom = """
  histogram_quantile(0.99,
  sum(irate(istio_request_duration_bucket[1m]))
  by (source_service, source_version,
  destination_service, destination_version, le))
  """
  query = {"query": prom}
  query = urlencode(query)
  f = urllib.request.urlopen(url + query)
  resp = f.read()
  record_list = json.loads(resp)
  room = self.build_identifier("#bot")
  field_list = []
  for record in record_list["data"]["result"]:
      metric = record["metric"]
      value = record["value"]
      domain = ".svc.cluster.local"
      field = ("From {}:{} to {}:{}".format(
          metric["source_service"].replace(domain, ""),
          metric["source_version"],
          metric["destination_service"].replace(domain, ""),
          metric["destination_version"],
      ), value[-1])
      field_list.append(field)
  self.send_card(to=room, body=prom,
                 title="Query Statement", summary="From prometheus",
                 color="green", fields=field_list)

More from this blog

龙虾恐慌:AIOps 又要改名了?

ChatGPT 开始,把 AI 拉近到普罗大众的面前,让无数人感受到 AI 的亲民魅力。而龙虾,则把大模型驱动的自动化能力,突然间变得水灵灵、活泼泼地走进千家万户。它不只是“风口上的猪”,而是风口本身。热度高到让 Mac mini 一度断货,不知道这在不在库克的预料之内。 每代人都有每代人的鸡蛋,春节期间,我就领了我的鸡蛋。翻出古老的 MacBook Air M1,充值各种大模型。当然了,这个工具

Mar 9, 20261 min read

再见 2025

我猜不少人以为这个号废了吧?并没有,只是今年变化有点大,一直有种抄起键盘,无从说起的感觉,所以一直偷懒到今天,2025 的最后一天。 今年是我的第四个本命年,去年末一期播客里,大内说本命年不是灾年,是变化年,有危也有机。可是讲真啊,只看到危,没看到机。 各种因缘际会,从鹅厂跳槽到前东家,已经接近四年,第一个合同期已经进入尾声。除了前两年还在云原生领域嗷嗷叫,后两年基本都是些鸡零狗碎的东西了,用老东家的术语说是——偏离主航道,可谓是前景暗淡了。 一旦确定要滚蛋,反倒心思轻松起来,每天骑着我的小红车...

Jan 5, 20261 min read

辅助编程?dora 说:我知道你很急可是请你别急

从 OpenGPT 把大模型的火烧旺了之后,这三年来,相信很多组织或摩拳擦掌、或躬身入局,希望借助聪明能干的大模型,或想偿还技术宅,或想降本增效,或想弯道超车。一时间,沉寂许久的 AIxx 又活过来了,LLM Ops、Vibe Coding、中医大模型、GPT 算命等等,全都老树发新芽,焕发了勃勃生机。那么视角拉回从业者最关注的饭碗相关的领域之一——AI 辅助开发,产生了什么触动,应该如何拥抱呢? DORA 的年度报告中给出了很有意思的结论——强者恒强。 执行摘要部分总结了几个有趣的点: 问题...

Oct 6, 20251 min read

[译]dora:ai 辅助软件开发状态报告

执行摘要 在 2025 年,科技领导者面临的核心问题已不再是“是否要采用 AI”,而是“如何实现其价值”。 DORA 的研究基于超过 100 小时的定性访谈和来自全球近 5,000 名技术专业人士的问卷调查。研究揭示了一个关键事实:AI 在软件开发中的主要角色是“放大器”。它会放大高效能组织的优势,也会凸显组织的缺陷。 关键结论:AI 是放大器 AI 投资的最大回报并非来自工具本身,而是来自组织底层系统的战略性建设: 高质量的内部平台 清晰的工作流 团队的协同能力 缺少这些基础,AI ...

Oct 2, 202514 min read

僭越了,有人在用 Rust 写 Kubernetes

一个新语言问世,最爱做的事情之一,就是重写存量软件了。 云原生喝酒 SIG 重点扶持项目——rk8s(https://github.com/rk8s-dev/rk8s) 也可以归在这个范畴里,只不过这个项目重写的东西比较大,是 Kubernetes。 从 2025 年 1 月第一个 Commit 开始,到现在有了 200 多次 Commit,十几万行代码。当然距离 Kubernetes 的几百万行代码还差得远——老马就是喜欢整这种大无畏项目。 另外该项目也是国内第一个脱离 Cargo 转向使用 ...

Sep 27, 20253 min read

【伪】架构师

342 posts