Zabbix实战-简易教程--订阅类
作者:@skyflask
转载本文请注明出处:https://www.cnblogs.com/skyflask/p/8366902.html
目录
一、需求提出
二、需求分析
三、数据提取
四、订阅实现
五、总结
一、需求提出
最近数据中心有一个新的需求,有一批后台任务需要在每天固定时间点运行(凌晨8:00),现在希望能够把这个任务执行的结果定时上报给他。
说明:执行的任务为一个sql查询,查询出来的是每个任务相关的信息:比如任务名称、任务主机、结果成功数、结果失败数、平均执行时间、总执行时间。。。。。
二、需求分析
根据需求,我们需要对其进行详细分析:
a、数据提取。(sql编写,然后通过脚本对sql结果进行解析,并把结果的关键数据进行处理)
b、订阅实现。(通过zabbix根据结果的特征进行每日定时上报。)
流程清晰后,我们便根据以上流程进行操作。
订阅,其实在监控的角度来说,也就是一种报警,但是这种报警不用恢复功能,只需要定时通知给用户。
三、数据提取
1、sql编写
接到任务后,联系需求提出人,根据执行任务的情况进行SQL语句编写(当然,这个SQL你也可以要求提需求者编写),代码如下:
cat process.sh(后面做成计划任务,定时执行,并写入文件作为结果)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | #!/bin/bash date1=` date -d yesterday "+%Y-%m-%d" ` #date1=` date "+%Y-%m-%d" ` mysql -uzabbix -pzabbix -e "use tasklog;select system,task_group,host, count(distinct task_id) task_idcnt, sum(case when exec_result = 0 then 1 else 0 end) result_success_cnt, sum(case when exec_result != 0 then 1 else 0 end) result_fail_cnt, avg(exec_cost_time) avg_exec_cost_time, sum(exec_cost_time) sum_exec_cost_time, avg(used_retry_times) avg_used_retry_times, sum(used_retry_times) sum_used_retry_times, avg(exec_result_size) avg_exec_result_size, sum(exec_result_size) sum_exec_result_size, sum(exec_count) sum_exec_count, (sum(exec_count) * 1000 / sum(exec_cost_time)) tps, sum(case when task_status = 'INIT' then 1 else 0 end) status_init_cnt, sum(case when task_status = 'RUNNING' then 1 else 0 end) status_running_cnt, sum(case when task_status = 'RETRY' then 1 else 0 end) status_retry_cnt, sum(case when task_status = 'END' then 1 else 0 end) status_end_cnt from tasklog where task_group = 'dw' and task_date = '${date1}' group by system,task_group,host\G" |
注意:需要创建本地用户zabbix,授予读权限。
执行sql语句的结果如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 | *************************** 1. row *************************** system: offline batch_id: TZ_GMT+08 task_group: ad host: 10.92.4.2 task_idcnt: 5 result_success_cnt: 5 result_fail_cnt: 0 avg_exec_cost_time: 800844.8000 sum_exec_cost_time: 4004224 avg_used_retry_times: 0.0000 sum_used_retry_times: 0 avg_exec_result_size: 0.0000 sum_exec_result_size: 0 sum_exec_count: 0 tps: 0.0000 status_init_cnt: 0 status_running_cnt: 0 status_retry_cnt: 0 status_end_cnt: 5 *************************** 2. row *************************** system: offline batch_id: TZ_GMT+08 task_group: dw host: 10.92.4.2 task_idcnt: 15 result_success_cnt: 15 result_fail_cnt: 0 avg_exec_cost_time: 146484.9333 sum_exec_cost_time: 2197274 avg_used_retry_times: 0.0000 sum_used_retry_times: 0 avg_exec_result_size: 0.0000 sum_exec_result_size: 0 sum_exec_count: 0 tps: 0.0000 status_init_cnt: 0 status_running_cnt: 0 status_retry_cnt: 0 status_end_cnt: 15 *************************** 3. row *************************** system: offline batch_id: TZ_GMT+08 task_group: fig host: 10.92.4.2 task_idcnt: 8 result_success_cnt: 7 result_fail_cnt: 1 avg_exec_cost_time: 419232.7500 sum_exec_cost_time: 3353862 avg_used_retry_times: 0.0000 sum_used_retry_times: 0 avg_exec_result_size: 0.0000 sum_exec_result_size: 0 sum_exec_count: 0 tps: 0.0000 status_init_cnt: 0 status_running_cnt: 1 status_retry_cnt: 0 status_end_cnt: 7 *************************** 4. row *************************** system: offline batch_id: TZ_GMT+08 task_group: mycat_high host: 10.92.4.2 task_idcnt: 37 result_success_cnt: 37 result_fail_cnt: 0 avg_exec_cost_time: 716846.1081 sum_exec_cost_time: 26523306 avg_used_retry_times: 0.0270 sum_used_retry_times: 1 avg_exec_result_size: 0.0000 sum_exec_result_size: 0 sum_exec_count: 0 tps: 0.0000 status_init_cnt: 0 status_running_cnt: 0 status_retry_cnt: 0 status_end_cnt: 37 *************************** 5. row *************************** system: offline batch_id: TZ_GMT+08 task_group: st_high host: 10.92.4.2 task_idcnt: 27 result_success_cnt: 27 result_fail_cnt: 0 avg_exec_cost_time: 394375.6296 sum_exec_cost_time: 10648142 avg_used_retry_times: 0.0370 sum_used_retry_times: 1 avg_exec_result_size: 0.0000 sum_exec_result_size: 0 sum_exec_count: 0 tps: 0.0000 status_init_cnt: 0 status_running_cnt: 0 status_retry_cnt: 0 status_end_cnt: 27 *************************** 6. row *************************** system: offline batch_id: TZ_GMT+08 task_group: st_low host: 10.92.4.2 task_idcnt: 54 result_success_cnt: 48 result_fail_cnt: 6 avg_exec_cost_time: 527090.0370 sum_exec_cost_time: 28462862 avg_used_retry_times: 0.0000 sum_used_retry_times: 0 avg_exec_result_size: 0.0000 sum_exec_result_size: 0 sum_exec_count: 0 tps: 0.0000 status_init_cnt: 0 status_running_cnt: 0 status_retry_cnt: 0 status_end_cnt: 54 |
2、数据提取
通过sql语句查询出原始数据后,我们即可以对原始数据进行提取关键数据,比如:
1 2 3 4 5 6 7 | [root@vm10-136-9-24 externalscripts]# python deal.py ad->(5, 0) fig->(8, 1) st_low->(54, 6) dw->(15, 0) st_high->(27, 0) mycat_high->(37, 0) |
数据中心需要的关键数据:
时区、任务名、主机IP、任务成功数、任务失败数。
比如,如下订阅信息:
[每日订阅]每日订阅正式环境东八区任务执行结果
[订阅详情]: ad->(5, 0),fig->(8, 1),st_low->(54, 6),dw->(15, 0),st_high->(27, 0),mycat_high->(37, 0)
[订阅IP]:10.92.4.2
3、实现
a、将查询结果作为定时任务,做成crontab
5 8 * * * /bin/sh /etc/zabbix/externalscripts/process.sh +08 10.254.219.127>/etc/zabbix/externalscripts/cs-127-08.txt
以上是东八区,10.254.219.127上的执行结果,有可能还有其他不同任务需要执行,同理也可以写成计划任务形式。
b、获取任务结果
cat deal-2.sh
1 2 3 4 5 6 7 8 | #!/bin/bash result=` cat /etc/zabbix/externalscripts/zs-29-08 .txt| grep -E "batch_id|task_group|host|task_idcnt|result_fail_cnt" ` if [ ! -n "$result" ]; then echo "null" else echo $result fi |
将结果格式化一下,当结果为空时,返回null字符串。
c、处理结果
cat dealpy
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | #!/usr/bin/env python import commands import json def get_result(mylist,myname): try: ad_index = mylist.index(myname) except: _rt_dic[myname] = (0,0) else : ad_task_idcnt = int(mylist[mylist.index(myname)+4]) ad_result_fail_cnt = int(mylist[mylist.index(myname)+6]) _rt_dic[myname] = (ad_task_idcnt,ad_result_fail_cnt) return _rt_dic _rt_dic = {} _rt_list =[] _s,_rt = commands.getstatusoutput( 'sh /etc/zabbix/externalscripts/deal-2.sh' ) if _rt== 'null' : print 'null' else : rt = _rt. split () for name in [ 'ad' , 'dw' , 'st_low' , 'st_high' , 'fig' , 'mycat_high' ]: _rt_dic = get_result(rt,name) for k, v in _rt_dic.items(): print "%s->%s" %(k, v ) |
执行后的结果如下:
1 2 3 4 5 6 7 | [root@vm10-136-9-24 externalscripts] # python deal.py ad->(5, 0) fig->(8, 1) st_low->(54, 6) dw->(15, 0) st_high->(27, 0) mycat_high->(37, 0) |
四、订阅实现
通过前面三步,我们获取到了各个任务的统计结果。但是,怎么实现订阅呢?
实现方法:
1、7:59分时,将原始数据置为null
59 7 * * * echo null >/etc/zabbix/externalscripts/cs-127-08.txt
2、8:05分执行deal.py脚本,通过zabbix获取结果
3、由于8:05分之前zabbix获取的值为null,8:05分之后zabbix获取的值为统计后的结果,所以我们可以通过这个方法进行触发器设定,触发后即发送信息。
4、自定义key
UserParameter=xinwy.result[*],/bin/sh /etc/zabbix/externalscripts/deal.py
5、设置触发器
6、实现效果
五、总结
从以上可以看出,大部分工作在数据获取和处理上,其实zabbix只是作为通知的一种手段,当然你也可以使用其他方法,比如直接通过短信API将结果进行定时任务发送,也更简单。
脚本地址:https://github.com/loveqx/zabbix-doc/tree/master/zabbix-scripts/zabbix-template-rss
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)
· AI 智能体引爆开源社区「GitHub 热点速览」