Zabbix实战-简易教程--订阅类
一、需求提出
最近数据中心有一个新的需求,有一批后台任务需要在每天固定时间点运行(凌晨8:00),现在希望能够把这个任务执行的结果定时上报给他。
说明:执行的任务为一个sql查询,查询出来的是每个任务相关的信息:比如任务名称、任务主机、结果成功数、结果失败数、平均执行时间、总执行时间。。。。。
二、需求分析
根据需求,我们需要对其进行详细分析:
a、数据提取。(sql编写,然后通过脚本对sql结果进行解析,并把结果的关键数据进行处理)
b、订阅实现。(通过zabbix根据结果的特征进行每日定时上报。)
流程清晰后,我们便根据以上流程进行操作。
订阅,其实在监控的角度来说,也就是一种报警,但是这种报警不用恢复功能,只需要定时通知给用户。
三、数据提取
1、sql编写
接到任务后,联系需求提出人,根据执行任务的情况进行SQL语句编写(当然,这个SQL你也可以要求提需求者编写),代码如下:
cat process.sh(后面做成计划任务,定时执行,并写入文件作为结果)
#!/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. 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语句查询出原始数据后,我们即可以对原始数据进行提取关键数据,比如:
[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
#!/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
#!/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)
执行后的结果如下:
[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
Zabbix实战-简易教程--订阅类的更多相关文章
- Zabbix实战-简易教程--WEB类--Nginx
一.开启Nginx status状态 1.在默认主机里面加上location添加ngx_status 如下操作: server { listen 127.0.0.1:8080; server_name ...
- Zabbix实战-简易教程--DB类--ClickHouse
一.ClickHouse介绍 Clickhouse是一个用于联机分析处理(OLAP)的列式数据库管理系统(columnar DBMS). 传统数据库在数据大小比较小,索引大小适合内存,数据缓存命中率足 ...
- Zabbix实战-简易教程--业务类
一.需求 项目要求对线上服务器进行监控,包括服务器本身状态.进程相关数据.业务相关数据. 服务器本身状态可以通过基础模板即可获取数据(CPU.内存.网络.磁盘): 进程相关数据,前面也有相关文章专门监 ...
- Zabbix实战-简易教程--日志类
一.主动模式和被动模式介绍 要监控日志,必须使用主动模式,那么,什么是主动模式?什么是被动模式呢? 1.主动模式和被动模式 主动模式 主动模式通讯过程: ● Agent打开TCP连接(主动检测变成Ag ...
- Zabbix实战-简易教程系列
一.基础篇(安装和接入) Zabbix实战-简易教程--总流程 Zabbix实战-简易教程--整体架构图 Zabbix实战-简易教程--DB安装和表分区 Zabbix实战-简易教程--Server端 ...
- Zabbix实战-简易教程(6)--Server端高可用
3.4 server前端高可用 至此,单台Zabbix server环境已经搭建完成,为了达到高可用效果,我们需要通过2台服务器之间通过HA软件进行探测,一旦检测到主的server挂掉后,从的s ...
- Zabbix实战-简易教程--技巧一(操作类技巧)
一.常用操作技巧 1.克隆 监控项.模板.触发器都可以进行克隆.其中,模板克隆又分为克隆和完全克隆.完全克隆会将LLD也一起复制一份,就是和之前的模板一模一样,而模板的克隆只是克隆监控项,不复制低层次 ...
- Zabbix实战-简易教程--动作(Actions)--自动发现
一.概述 Zabbix提供了有效和非常灵活的网络自动发现功能. 设置网络发现后你可以: 加快Zabbix部署(自动添加主机.添加模板) 简化管理(自动删除主机.删除模板.禁用主机) 无需过多管理就能在 ...
- Zabbix实战-简易教程--低层次发现(LLD)
一.概述 自动发现(LLD)提供了一种在为不同实体自动创建监控项,触发器和图形的方法.例如,Zabbix可以在你的机器上自动监控磁盘或网卡,而无需为每个磁盘或网卡手动创建监控项.(LLD) 此外,可以 ...
随机推荐
- 限定pan手势只能在圆内移动view
限定pan手势只能在圆内移动view 效果: 虽然看起来很简单,但实现原理还是稍微有点复杂-_-!! 核心的地方,就是需要计算pan手势的点与指定点的距离,不能超过这个距离,超过了就让动画还原,很容易 ...
- HTTP 错误 404.3 - Not Found的问题(WCF)
模块 StaticFileModule 通知 ExecuteRequestHandler 处理程序 StaticFile 错误代码 0x80070032 请求的 URL http://10.101.3 ...
- 用Python爬虫爬取炉石原画卡牌图片
前段时间看了点Python的语法以及制作爬虫常用的类库,于是动手制作了一个爬虫尝试爬取一些炉石原画图片.本文仅记录对特定目标网站的分析过程和爬虫代码的编写过程.代码功能很局限,无通用性,仅作为一个一般 ...
- php实现简单的单链表
<?php /** * 建立一个链表,节点的data为数组,记录一个id,完成链表所以操作 */ //结点,结点数据data定义为一个数组,id和value class Node{ public ...
- memcache分布式 存取
Memcached分布式 Memcached虽然称为“分布式“缓存服务器,但服务器端并没有“分布式”的功能.Memcached的分布式完全是由客户端实现的.memcached是怎么实现分布式缓存的呢? ...
- REDIS线上问题
这周终于解决了Redis访问经常超时的问题,终于可以踏实睡觉了.从上周就开始纠结在这个问题上,可以用寝食难安来形容,感觉这个问题就像个定时炸弹一样,虽然根据手搜的访问量,极少的Timeout Erro ...
- Android 4.4中AudioRecord用例 - 录制系统内置声音
通过API 19新加的MediaRecorder.AudioSource.REMOTE_SUBMIX參数能够让系统App录制系统内置的声音,也就是扬声器的声音.以下是一个巨简单的样例来演示样例怎样通过 ...
- Day16 IO流
流的概念和作用 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象.即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输特性将流抽象为各种类,方便更直观的进行数据操作. Ja ...
- java集合(类似python的列表)
一:学习方法 我们在学习一个类的时候,如果他是期其他类的实现类,我们在学习的时候,先学习他的共同的继承类,学习他们共有的方法,在学习他实现类的特殊方法.由共性--->特殊. 二:集合 1.集合和 ...
- 定义抽象类Shape,抽象方法为showArea(),求出面积并显示,定义矩形类Rectangle,正方形类Square,圆类 Circle,根据各自的属性,用showArea方法求出各自的面积,在main方法中构造3个对象,调用showArea方法。(体现多态)
实现多态的三个条件:1.要有继承2.要有抽象方法重写3.用父类指针(引用)指向子类对象 重载重写重定义的区别: 1.重载:在同一个类中进行; 编译时根据参数类型和个数决定方法调用; 子类无法重载父类; ...