使用Prometheus&Alertmanager&kintone来实现监控和升级体系!
注意:本文与https://ibukintone.jp/entry/2021/07/02/prometheus-alertmanager-kintone中的内容相同m(_ _)m
最近,在服务器监控领域中越来越多地听到的名字是「Prometheus」。
可以与「Alertmanager」一起使用,通过Slack或邮件发送通知。
如果能够有效地与kintone进行整合,似乎可以创建一个不错的升级制度!
想做的事情
-
- 使用Prometheus进行度量收集
-
- 如果出现异常,则触发警报,并通知Alertmanager
-
- Alertmanager将Webhook发送到自定义处理程序
- 自定义处理程序将记录注册到kintone中。
创建kintone应用
以下是字段和字段代码:
字段(field)和字段代码(field code)如下所示。
配置完字段后,进行以下操作并保存应用程序。
-
- レコード追加権限のある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
由于我们想要确认通知操作,请模拟服务器宕机的状态。让我们停止Node-Exporter容器试试看。
docker stop node-exporter
“结束”
我使用Prometheus&Alertmanager&kintone成功地实现了一个很好的监控和升级系统。
我认为 Prometheus 和 Alertmanager 的配置很随意,可以更加仔细地设置。
好了好了~。