k8s全方位监控 -prometheus实现短信告警接口编写(python)
1、prometheus短信告警接口实现(python)源码如下:
import subprocess
from flask import Flask
from flask import request
import json
import logging
import requests
logging.basicConfig(filename='/log/phone-hook-log.log',
format='%(asctime)s -%(name)s-%(levelname)s-%(module)s:%(message)s',
datefmt='%Y-%m-%d %H:%M:%S %p',
level=logging.DEBUG)
app = Flask(__name__)
@app.route('/', methods=['GET', 'POST'])
def home():
msg = ""
msg1 = ""
msg2 = ""
data = json.loads(request.data)
alerts = data['alerts']
for itm in alerts:
logging.info('------------------------itm info------------------\n' + str(itm))
alert_status = itm['status']
alert_level = itm['labels']['severity']
alert_name = itm['labels']['alertname']
alert_summary = itm['annotations']['summary']
alert_value = itm['annotations']['value']
alert_start = itm['startsAt'].split('.')[0].replace('T', ' ')
alert_end = itm['endsAt'].split('.')[0].replace('T', ' ')
# 告警触发
if alert_status == "firing":
msg1 = msg1 + "【告警触发】\n" + "告警级别: " + alert_level + "\n告警类型: " + alert_name + "\n监控项目: " + alert_summary + "\n触发时间: " + alert_start + "\n当前数值: " + alert_value + "\n\n"
# 告警恢复
elif alert_status == "resolved":
msg2 = msg2 + "【告警恢复】\n" + "告警级别: " + alert_level + "\n告警类型: " + alert_name + "\n监控项目: " + alert_summary + "\n触发时间: " + alert_start + "\n恢复时间: " + alert_end + "\n当前数值: " + alert_value+ "\n\n"
# 手机短信告警配置
if msg1 == "":
msg = msg2
elif msg2 == "":
msg = msg1
else:
msg = msg1 + "\n" + msg2
logging.info('------------------------alert msg-------------------\n' + msg)
smsuser = '111111'
smspass = '1HsbJ3YHe'
extno = '10000'
phones_f = open("/app/phones.txt", 'r')
phones = phones_f.read()
phones_f.close()
logging.info("---------------------phones------------------------\n" + phones)
values = {'account': smsuser,
'password': smspass,
'mobile': phones,
'content': msg,
'extno': extno}
'''
post_url = 'http://127.0.0.1:8080/sms?action=send'
try:
req = requests.get(post_url, values)
print (req.text)
except Exception as e:
print (e)
'''
return '<h1>Home</h1>'
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000)
2、构建dockerfile镜像
FROM python:3.6.4 RUN mkdir -p /app /log WORKDIR /app ADD . /app # install requirements RUN pip install -r requirements.txt # run server CMD python sendPhone.py
cat requirements.txt Flask==1.0.2 requests==2.20.1
3、推送到镜像仓库
docker push 172.19.0.14/prom/py-hook:v0.0.1
4、部署
[root@VM_0_48_centos prometheus_hook]# cat phone-hook.yaml apiVersion: extensions/v1beta1 kind: Deployment metadata: name: phone-hook namespace: monitoring spec: template: metadata: labels: app: phone-hook spec: containers: - name: phone-hook image: 172.19.0.14/prom/py-hook:v0.0.1 imagePullPolicy: IfNotPresent ports: - containerPort: 5000 name: http volumeMounts: - name: phone-hook-config-volume mountPath: /app - name: phone-hook-volume mountPath: /log - name: localtime mountPath: /etc/localtime resources: requests: cpu: 100m memory: 100Mi limits: cpu: 200m memory: 200Mi volumes: - name: phone-hook-config-volume configMap: name: phone-hook-config - name: phone-hook-volume persistentVolumeClaim: ##此处使用了永久存储券 claimName: web-hook - name: localtime hostPath: path: /etc/localtime imagePullSecrets: - name: registrysecret --- apiVersion: v1 kind: Service metadata: name: phone-hook namespace: monitoring spec: selector: app: phone-hook ports: - name: hook port: 5000 targetPort: http
5、补充
kubectl create cm phone-hook-config --from-file=./conf -n monitoring [root@VM_0_48_centos prometheus_hook]# cat conf/phones.txt 18125012766
6、配置告警规则
良禽择木而栖 贤臣择主而侍

浙公网安备 33010602011771号