使用Prometheus&Alertmanager&kintone来实现监控和升级体系!

注意:本文与https://ibukintone.jp/entry/2021/07/02/prometheus-alertmanager-kintone中的内容相同m(_ _)m

最近,在服务器监控领域中越来越多地听到的名字是「Prometheus」。

可以与「Alertmanager」一起使用,通过Slack或邮件发送通知。

如果能够有效地与kintone进行整合,似乎可以创建一个不错的升级制度!

想做的事情

    1. 使用Prometheus进行度量收集

 

    1. 如果出现异常,则触发警报,并通知Alertmanager

 

    1. Alertmanager将Webhook发送到自定义处理程序

 

    自定义处理程序将记录注册到kintone中。

创建kintone应用

030.png

以下是字段和字段代码:

字段(field)和字段代码(field code)如下所示。

フィールド名フィールドフィールドコードアラート文字列1行alertname作成日時文字列1行starts_at概要文字列複数行summary

配置完字段后,进行以下操作并保存应用程序。

    • レコード追加権限のあるAPIトークンの発行

 

    プロセス管理の有効化

设置监控系统

下一步我们将构建监视系统。请预先准备好以下环境。

    • docker

 

    docker-compose

设置各文件的目录结构如下。确认后,开始编写配置文件。

├── alertmanager
│   └── config.yaml
├── docker-compose.yaml
└── prometheus
    ├── alert.rules
    └── prometheus.yaml

docker-compose.yaml的内容是参考了Qiita。因为想要从本地的proc获取信息,所以将根目录以只读的方式挂载进Node-Exporter容器。

version: '3'
services:
  prometheus:
    image: prom/prometheus
    container_name: prometheus
    volumes:
      - ./prometheus:/etc/prometheus
    command: "--config.file=/etc/prometheus/prometheus.yaml"
    ports:
      - 9090:9090
    restart: always
  exporter:
    image: prom/node-exporter
    container_name: node-exporter
    ports:
      - 9100:9100
    command:
      - '--path.rootfs=/host'
    network_mode: host
    pid: host
    volumes:
      - '/:/host:ro,rslave'
    restart: always
  alertmanager:
    image: prom/alertmanager
    container_name: alertmanager
    volumes:
      - ./alertmanager:/etc/alertmanager
    command: "--config.file=/etc/alertmanager/config.yaml"
    ports:
      - 9093:9093
    restart: always

接下来,准备Prometheus的配置文件prometheus.yaml。在文件中描述警报的接收者以及要收集的指标。

global:
  scrape_interval:     15s 
  evaluation_interval: 15s 

rule_files:
  - /etc/prometheus/alert.rules

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

scrape_configs:
  - job_name: 'prometheus'
    static_configs:
      - targets:
        -  prometheus:9090
        -  ホストのIPアドレス:9100

alert.rules 用于设置 Prometheus 的警报触发条件。本次设置为当服务器宕机1分钟后发送通知。

groups:
- name: example
  rules:
  - alert: instance_down
    expr: up == 0
    for: 1m
    labels:
      severity: critical
    annotations:
      summary: "{{ $labels.instance }} がダウンしました..."

当收到警报时,Alertmanager的config.yaml文件会将Webhook发送到自定义处理程序。

route:
  receiver: 'handler'

receivers:
- name: 'handler'
  webhook_configs:
    - url: 'http://handler:9083'
      send_resolved: true

以上就完成了监视系统部分的设置!

我自己开发的处理程序

接下来,我们将开发一个将Alertmanager接收的Webhook发送到kintone的处理程序。添加处理程序后的最终目录结构如下所示。

├── alertmanager
│   └── config.yaml
├── docker-compose.yaml
├── handler
│   ├── account.yaml
│   ├── Dockerfile
│   └── handler.py
└── prometheus
    ├── alert.rules
    └── prometheus.yaml

我在Qiita上找到了一篇看起来很有参考价值的文章。
https://qiita.com/noexpect/items/2dc9f110d784acc95e21

参考上述文章编写代码。我使用pykintone进行记录注册。

import json
import logging
from http.server import BaseHTTPRequestHandler
from http.server import HTTPServer
import pykintone
from pykintone import model

# ログ関連設定
logging.basicConfig(level=logging.DEBUG, format="%(asctime)-15s %(message)s")
requests_log = logging.getLogger("requests.packages.urllib3")
requests_log.setLevel(logging.DEBUG)
requests_log.propagate = True

class TroubleHandler(BaseHTTPRequestHandler):
    def do_POST(self):
        self.send_response(200)
        self.end_headers()
        data = json.loads(self.rfile.read(int(self.headers['Content-Length'])))

        alert_data = self.build_alert_data(data)
        logging.info("recieved data:%s" % alert_data)
        self.create_alert_kintone_record(alert_data, data["status"])

    # Webhookのデータからアラートデータを作成
    def build_alert_data(self, data):
        alert_data = {
            "status": data["status"],
            "alertname": data["alerts"][0]["labels"]["alertname"],
            "starts_at": data["alerts"][0]["startsAt"],
            "summary": data["alerts"][0]["annotations"]["summary"]
        }
        return alert_data

   # kintoneにレコード登録
    def create_alert_kintone_record(self, alert_data, alert_status):
        k = KintonePoster()
        k.create_alert_kintone(alert_data)

# kintoneアプリのフィールドに合わせてpykintoneのModelを定義
class KintoneModel(model.kintoneModel):
    def __init__(self):
        super(KintoneModel, self).__init__()
        self.alertname = ""
        self.starts_at = ""
        self.summary = ""
# pykintoneを使ってkintoneにレコード登録
class KintonePoster(KintoneModel):
    def create_alert_kintone(self, data):
        if data["status"] == "firing":
            account = pykintone.load("account.yaml")
            app = account.app()

            record = KintoneModel()
            record.alertname = data["alertname"]
            record.starts_at = data["starts_at"]
            record.summary = data["summary"]

            app.create(record)

if __name__ == "__main__":
    httpd = HTTPServer(('', 9083), TroubleHandler)
    httpd.serve_forever()

将用于加载到pykintone的认证信息写入到account.yaml文件中。

domain: サブドメイン
apps:
  test:
    id: アプリID
    token: APIトークン

最后,我们会写一个Dockerfile作为执行先前编写的Python的容器的基础。我们会在其中使用pip来安装pykintone。

FROM python:3
USER root

RUN mkdir -p /root/src
COPY handler.py /root/src
COPY account.yaml /root/src
WORKDIR /root/src

RUN pip install --upgrade pip
RUN pip install --upgrade setuptools
RUN pip install pykintone

ENTRYPOINT ["python"]
CMD ["handler.py"]

确认动作

在存放了docker-compose.yaml文件的目录中,执行以下命令,启动容器组。

docker-compose up -d
010.png

由于我们想要确认通知操作,请模拟服务器宕机的状态。让我们停止Node-Exporter容器试试看。

docker stop node-exporter
040.png
050.png
060.png

“结束”

我使用Prometheus&Alertmanager&kintone成功地实现了一个很好的监控和升级系统。

我认为 Prometheus 和 Alertmanager 的配置很随意,可以更加仔细地设置。

好了好了~。

广告
将在 10 秒后关闭
bannerAds