Zabbix告警消息推送至kafka

微信公众号:运维开发故事,作者:wanger

Zabbix告警消息推送至kafka

应用场景
由于朋友所在公司对安全性要求较高,zabbix所在的网络环境不能上外网,因此不能通过zabbix将告警直接发送至一些即时通讯工具,这就需要将报警消息发送至一些中间件,并通过中间件转发出去,这里选择使用了kafka,当然kafka中不只有报警信息,也有其他需要发送的数据,这里就不过多透漏
基础环境配置
kafka集群已部署好,这里不介绍安装细节

vim /etc/hosts
192.168.179.133 kafka3
192.168.179.132 kafka2
192.168.179.131 kafka1

![image.png](https://img-blog.csdnimg.cn/img_convert/b882bccf1001f57260fe61096d5f904c.png#align=left&display=inline&height=129&margin=[object Object]&name=image.png&originHeight=258&originWidth=553&size=44748&status=done&style=none&width=276.5)
启动zookeeper以及kafka
为了能让消费者均匀消费broker里的数据,这里我设置了6分区三副本

启动zookeeper
cd /root/kafka_2.12-2.4.1
nohup bin/zookeeper-server-start.sh config/zookeeper.properties & >> zookeeper.log &
启动kafka
nohup bin/kafka-server-start.sh config/server.properties & >> kafka.log &
创建topics
bin/kafka-topics.sh --create --zookeeper kafka1:2181,kafka2:2181,kafka3:2181 --replication-factor 3 --partitions 6 --topic zabbix-alert
bin/kafka-topics.sh --list --bootstrap-server 192.168.179.132:9092

编写脚本将报警信息发送至kafka中

vim /usr/lib/zabbix/alertscripts/alert_kafka.py
chmod +x /usr/lib/zabbix/alertscripts/alert_kafka.py
#!/usr/bin/python
#coding=utf-8
from kafka import KafkaProducer
import json,sys
receive=sys.argv[1]
message=sys.argv[2]

producer = KafkaProducer(
value_serializer=lambda v: json.dumps(v).encode('utf-8'),
bootstrap_servers=['192.168.179.132:9092','192.168.179.133:9092','192.168.179.134:9092']
)
data={"receive":receive,"alert":message}
producer.send('zabbix-alert', data)
producer.close()

编写脚本接收报警信息并发送至企业微信

vim /usr/lib/zabbix/alertscripts/receive.py
#!/usr/bin/python
#coding=utf-8
from kafka import KafkaConsumer
import json,requests
import sys
from requests.packages.urllib3.exceptions import InsecureRequestWarning
requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
reload(sys)
sys.setdefaultencoding('utf-8')
corpid='ww95f3a6ffd22fee8b8'
secret='iJjHQxTCjIMyW7ZjziaULcxqA7Hg2fjcLM2ssdvwY1Zc'
agentid='1000002' 
'''
    消费zabbix-alert主题中的数据
    注意事项:如需以json格式读取数据需加上value_deserializer参数
'''
consumer = KafkaConsumer('zabbix-alert',group_id="zabbix-alert",
                         bootstrap_servers=['192.168.179.132:9092','192.168.179.133:9092','192.168.179.134:9092'],
                         auto_offset_reset='earliest',value_deserializer=json.loads
                         )
def gettoken():
        tokenurl = "https://qyapi.weixin.qq.com/cgi-bin/gettoken"
        data = {"corpid": corpid,
                "corpsecret": secret}
        r = requests.get(url=tokenurl, params=data, verify=False)
        token = r.json()['access_token']
        return token
def sendweixin(token):
        wechaturl="https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=%s"%token
        data={"touser" : messages['receive'],
                "msgtype" : "text",
                "agentid" : agentid,
                "text" : {"content" : messages['alert']},
                "safe": "0"}
        headers = {'content-type': 'application/json'}
        req = requests.post(url=wechaturl,headers=headers,json=data, verify=False)
        print(req.text)
        return req

for message in consumer:
        token=gettoken()
        #messages=json.dumps(message.value,ensure_ascii=False)
        messages=message.value
        sendweixin(token)

将此脚本放入后台持续运行

nohup python alert_receive.py & >> alert.log &

ZABBIX动作配置
创建报警媒介
![image.png](https://img-blog.csdnimg.cn/img_convert/f50a900d4bcd772badfde623b089eeab.png#align=left&display=inline&height=171&margin=[object Object]&name=image.png&originHeight=342&originWidth=553&size=44155&status=done&style=none&width=276.5)

配置用户告警媒介

收件人为企业微信的用户id
![image.png](https://img-blog.csdnimg.cn/img_convert/915464eca39dfe8a925f5595090eb0d4.png#align=left&display=inline&height=117&margin=[object Object]&name=image.png&originHeight=234&originWidth=553&size=28198&status=done&style=none&width=276.5)

配置动作

![image.png](https://img-blog.csdnimg.cn/img_convert/f4dcd1f83d8ae16630e50ec56be21a31.png#align=left&display=inline&height=156&margin=[object Object]&name=image.png&originHeight=311&originWidth=553&size=43566&status=done&style=none&width=276.5)
![image.png](https://img-blog.csdnimg.cn/img_convert/8500dffa0950463905caf0b825796474.png#align=left&display=inline&height=179&margin=[object Object]&name=image.png&originHeight=357&originWidth=553&size=64704&status=done&style=none&width=276.5)

配置完成后触发告警进行测试

效果如下
![image.png](https://img-blog.csdnimg.cn/img_convert/13a4d5e20e2716d847819f42b55193b3.png#align=left&display=inline&height=553&margin=[object Object]&name=image.png&originHeight=1106&originWidth=553&size=248535&status=done&style=none&width=276.5)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值