zoukankan      html  css  js  c++  java
  • 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,hostG"
    

      注意:需要创建本地用户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

  • 相关阅读:
    sqlmap注入分类
    sqlmap简单中文说明
    【Python Learning第一篇】Linux命令学习及Vim命令的使用
    模拟退火算法从原理到实战【基础篇】
    平面上给定n条线段,找出一个点,使这个点到这n条线段的距离和最小。
    使用VMWareWorkstation10搭建学习环境笔记
    洛谷P1313 计算系数【快速幂+dp】
    浅析Numpy.genfromtxt及File I/O讲解
    持续交付中高效率与高质量
    持续集成CI与自动化测试
  • 原文地址:https://www.cnblogs.com/skyflask/p/8366902.html
Copyright © 2011-2022 走看看