Zabbix实战-简易教程--业务类

一、需求

项目要求对线上服务器进行监控,包括服务器本身状态、进程相关数据、业务相关数据。

服务器本身状态可以通过基础模板即可获取数据(CPU、内存、网络、磁盘);

进程相关数据,前面也有相关文章专门监控http://www.cnblogs.com/skyflask/articles/8007162.html

所以只剩下业务相关数据了。而业务数据需要紧贴业务,所以需要程序那边提供接口,把数据吐出来,然后我这边接受获取,进行监控。

于是,向程序提出需求,将你要监控的业务数据以json格式吐出来,剩下的交给我就行了。

二、数据提取

1、数据结构

拿到json字段后,就可以开工获取数据进行相关处理了。

我这边主要是游戏的数据,大家都知道,游戏是分区服的,所以数据的提取可以根据区服关系来,比如一个大区,下面有N个服,那么,这N个服就可以很方便的使用LLD方式,因为各个服的监控字段是一样的。

而大区一般有全局(Global字段)、N服(服字段)。以下是我简化最简单的json字段,中间省略了很多角色。比如Gloabl里面还有其他进程,group里面还有其他类型的进程。

 2、提取数据

#!/usr/bin/env python
#coding:utf-8

import simplejson as json
import argparse
import urllib2
import os

class LjStatics(object):

    def __init__(self,api_url):

        html = urllib2.urlopen(api_url)
        strJson = "".join([ html.read().strip().rsplit("}" , 1)[0] ,  "}"] )
        with open(‘lj.json‘,‘w+‘) as f:
            f.write(strJson)
        #jsondata = json.loads(strJson)
        global hjson
        hjson = self.get_json_data()

    def get_json_data(self):
        jsondata = json.load(file("lj.json"))
        return  jsondata

    def get_role_list(self):
        return hjson.keys()

    def get_role_uptime(self,arg):
        self.arg = args.uptime

        return hjson[arg][‘update_time‘]

    def get_global_role_list(self):
        g_list = []

        g_list = hjson[‘global‘][‘status‘].keys()
        return g_list

    def get_global_role_status(self,arg,item):
        self.arg = args.glbstatus
        self.item = args.gitem

        for key in hjson[‘global‘][‘status‘].keys():
            if key == arg:
                return hjson[‘global‘][‘status‘].get(key).get(item)

    def get_region_role_id(self):
        _id_list = []
        for role in hjson[‘region‘][‘status‘]:
            _id_list.append(role[‘id‘])
        return _id_list

    def get_regin_role_list(self):
        r_list = []
        for role in hjson[‘region‘][‘status‘]:
            for r_role in role[‘status‘]:
                if r_role[‘type_name‘] == ‘location‘:continue
                r_list.append(r_role[‘type_name‘]+‘-‘+str(r_role[‘instance_id‘]))
        return r_list

    def get_region_location_lld(self):
        r_list = []
        for role in hjson[‘region‘][‘status‘]:
            for r_role in role[‘status‘]:
                if r_role[‘type_name‘] != ‘location‘:continue
                r_list.append(r_role[‘type_name‘]+‘-‘+str(r_role[‘instance_id‘]))
        _rts = []
        for _rt in  r_list:
            r = os.path.basename(_rt.strip())
            _rts += [{‘{#SERVERID}‘:r}]
        return json.dumps({‘data‘:_rts},sort_keys=True,indent=4,separators=(‘,‘,‘:‘))

    def get_regin_role_status(self,arg,item):
        self.arg = args.regstatus
        self.item = args.item
        _id = int(arg.split(‘-‘)[1])
        _arg = arg.split(‘-‘)[0]

        for role in hjson[‘region‘][‘status‘]:
            for r_role in role[‘status‘]:
                if r_role[‘type_name‘] == _arg and r_role[‘instance_id‘] == _id:
                    return r_role[‘status‘][item]

    @staticmethod
    def parse_args():
        parser = argparse.ArgumentParser()

        help = ‘Get role list‘
        parser.add_argument(‘-rl‘,‘--getrole‘, help=help)

        help = ‘Get global role list ‘
        parser.add_argument(‘-gbl‘,‘--getglist‘, help=help)

        help = ‘The global role status‘
        parser.add_argument(‘-grs‘,‘--glbstatus‘, help=help)

        help = ‘The global role status item‘
        parser.add_argument(‘-gi‘,‘--gitem‘, help=help)

        help = ‘Get regin role list‘
        parser.add_argument(‘-grl‘,‘--getrlist‘, help=help)

        help = ‘Get regin location role list‘
        parser.add_argument(‘-grll‘,‘--getrllist‘, help=help)

        help = ‘The regin role status‘
        parser.add_argument(‘-rs‘,‘--regstatus‘, help=help)

        help = ‘The regin role status item‘
        parser.add_argument(‘-i‘,‘--item‘, help=help)

        help = ‘Get the role uptime‘
        parser.add_argument(‘-u‘,‘--uptime‘, help=help)

        args = parser.parse_args()
        return args

if __name__ == ‘__main__‘:
    ‘‘‘
    python ljstatics.py -rl 1   #获取所有角色列表
    python ljstatics.py -gbl 1  #获取所有global列表
    python ljstatics.py -grl 1  #获取所有region列表
    python ljstatics.py -gbll 1 #获取所有location的LLD值
    python ljstatics.py -grs feedback -gi http_total_req #获取global里面的某个角色的监控项
    python ljstatics.py -rs queue -i total_send_message  #获取region里面queue的监控项total_send_message

    全局和除location以外的,只能通过具体监控项参数进行添加
    location1-15,可以通过LLD功能进行监控项添加
    LLD适用场景:对于同一对象,有相同的指标值。例如:采集每个磁盘的IO参数。
   ‘‘‘
    api_url = ‘http://10.20.122.7:10200/GetMonitorData‘
    lj = LjStatics(api_url)

    args = lj.parse_args()
    #获取整体角色列表[region、global、ret]
    if args.getrole:
        print lj.get_role_list()

    #获取global角色列表gbl
    elif args.getglist:
        print lj.get_global_role_list()

    #获取region角色列表grl
    elif args.getrlist:
        print lj.get_regin_role_list()

    #获取region里面的location自动发现项 grll
    elif args.getrllist:
        print lj.get_region_location_lld()

    #获取全局角色及监控项值  grs  gi
    elif args.glbstatus and args.gitem:
        print lj.get_global_role_status(args.glbstatus,args.gitem)

    #获取region角色及监控项值  rs i
    elif args.regstatus and args.item:
        print lj.get_regin_role_status(args.regstatus,args.item)

    #获取角色uptime
    elif args.uptime:
        print lj.get_role_uptime(args.uptime)

    else:
        print ‘null‘

  

三、测试和自定义key

通过上面的脚本,我们可以获取region(区)和group(服)的数据。所以可以按照这个思路通过LLD进行监控项设置:

由于监控项比较多,所以我们可以通过写成配置文件的方式,进入/etc/zabbix/zabbix_agentd.d目录,定义配置文件:

区配置:

[[email protected] zabbix_agentd.d]# cat userparameter_global.conf
#lld for global statics(gc)
UserParameter=lj.global.activation.status[*],python /etc/zabbix/externalscripts/ljstatics.py  -grs activation -gi $1
UserParameter=lj.global.app.status[*],python /etc/zabbix/externalscripts/ljstatics.py  -grs app -gi $1
UserParameter=lj.global.authentication.status[*],python /etc/zabbix/externalscripts/ljstatics.py  -grs authentication -gi $1
UserParameter=lj.global.config.status[*],python /etc/zabbix/externalscripts/ljstatics.py  -grs config -gi $1
UserParameter=lj.global.feedback.status[*],python /etc/zabbix/externalscripts/ljstatics.py  -grs feedback -gi $1
UserParameter=lj.global.file.status[*],python /etc/zabbix/externalscripts/ljstatics.py  -grs file -gi $1
UserParameter=lj.global.gm.status[*],python /etc/zabbix/externalscripts/ljstatics.py  -grs gm -gi $1
UserParameter=lj.global.im.status[*],python /etc/zabbix/externalscripts/ljstatics.py  -grs im -gi $1
UserParameter=lj.global.logger.status[*],python /etc/zabbix/externalscripts/ljstatics.py  -grs logger -gi $1

#UserParameter=lj.region.process.discovery[*],python /etc/zabbix/externalscripts/region_list.py
#UserParameter=lj.region.process.status[*],python /etc/zabbix/externalscripts/ljstatics.py -rs $1 -i $2

  

服配置:

[[email protected] zabbix_agentd.d]# cat userparameter_region.conf
UserParameter=lj.region.process.status[*],python /etc/zabbix/externalscripts/ljstatics.py -rs $1 -i $2

UserParameter=custom.location.discovery,python /etc/zabbix/externalscripts/ljstatics.py  -grll true
UserParameter=custom.location.status[*],python /etc/zabbix/externalscripts/ljstatics.py  -rs $1 -i $2

  

四、制作模板

模板已上传至github:https://github.com/loveqx/zabbix-doc/tree/master/zabbix-scripts/zabbix-template-project

五、效果图

监控项:

六、参考文献

模板和脚本已上传至github:https://github.com/loveqx/zabbix-doc/tree/master/zabbix-scripts/zabbix-template-project

原文地址:https://www.cnblogs.com/skyflask/p/8439115.html

时间: 2024-11-05 22:33:54

Zabbix实战-简易教程--业务类的相关文章

zabbix实战-简易教程(1)

玩zabbix已经几年了,一直准备分享一些相关的使用心得,但是总是因为各种借口而拖延,最近准备重新整理,记录一些实际工作环境中的示例,希望能够帮助正在学习或者正在寻找这方面资料的朋友,也算是对自己学习的一些记录吧. 以下是大概内容: ====================一.总流程===================== 环境安装->添加hosts/items/模板->获取items->入库.存档->对比触发器阈值->触发报警->执行动作->触发器阈值恢复正常

Zabbix实战-简易教程--低层次发现(LLD)

一.概述 自动发现(LLD)提供了一种在为不同实体自动创建监控项,触发器和图形的方法.例如,Zabbix可以在你的机器上自动监控磁盘或网卡,而无需为每个磁盘或网卡手动创建监控项.(LLD) 此外,可以配置Zabbix根据定期执行发现后的得到实际结果,来移除不需要的监控项.(根据正则过滤) 二.类型 在Zabbix中,支持六种类型的发现项目: 系统文件的发现: 网络接口的发现: CPU和CPU内核的发现 SNMP OID的发现 使用ODBC SQL查询的发现 Windows服务的发现 三.流程 发

Zabbix实战-简易教程--排错(持续收集中)

一.安装错误 1.zabbix 安装故障之无法跳到下一步 执行命令:chownnginx:nginx /var/lib/php/session/ -R 2.proxy上无法采集交换机数据 yum install net-snmp net-snmp-utils 3.2.2.4升级到3.0,提示缺少参数HistoryIndexCacheSize 21076:20160714:115534.776 [file:dbcache.c,line:2610] zbx_mem_realloc(): please

Zabbix实战-简易教程--动作(Actions)--自动注册

一.概述 之前已经讲述了自动发现功能,自动注册和自动发现非常类似,但是比自动发现更精确.因为自动注册,是在Agent上自定义元数据,然后Agent将元数据发送给server进行匹配,如果匹配一致,则进行下一步的动作(添加主机.模板之类的操作),所以从流程上来说,主动注册比自动发现更加精确. 二.配置 1.指定服务器 在agent配置文件中指定Zabbix server - zabbix_agentd.conf ServerActive=1.0.0.1 如果你没有在zabbix_agentd.co

Zabbix实战-简易教程--宏变量(Macro)

一.概述 Zabbix支持许多在多种情况下使用的宏.宏是一个变量,由如下特殊语法标识:MACRO 有效地使用宏可以节省时间,并使Zabbix变地更加高效. 在一个的典型用途中,宏可以用于模板中.因此,模板的触发器可能命名为"{HOST.NAME}的mysql{#MYSQLPORT} 端口已宕掉,请注意查看!". 当这个模板应用在主机( 飞龙在天roledb-192.168.1.100)时,并且当触发器展示在监控页面上时,触发器的名称将解析为"飞龙在天roledb-192.16

Zabbix实战-简易教程--告警屏蔽(Maintenances)

Zabbix Maintenance 一.Zabbix Maintenance(zabbix告警屏蔽) 很多时候,我们需要在某段时间更新维护线上环境,这个时候你是已知触发器会引发报警,所以此时你可以提前通过zabbix的维护模式来进行主动屏蔽报警. 配置也很简单,下面就进行详细讲解: 1.选择 配置管理-->告警屏蔽 2.创建,点击 创建维护区间 3.设置--告警屏蔽全局设置 4.设置--维护时长 5.设置--维护对象 6.效果图 总结: 1.处于维护中的主机,告警信息还是会报出来,但是不会触发

Zabbix实战-简易教程(4)--Server端安装

zabbix server安装 在数据库安装完成后,接着开始安装server端了. 3.2.1 安装rpm源 Zabbix 2.2 for RHEL5, Oracle Linux 5, CentOS 5: #rpm -ivh http://repo.zabbix.com/zabbix/2.2/rhel/5/x86_64/zabbix-release-2.2-1.el5.noarch.rpm Zabbix 2.2 for RHEL6, Oracle Linux 6, CentOS 6: #rpm

Zabbix实战-简易教程(7)--添加item

一.术语 1.1 Item概念 Item是从主机里面获取的所有数据.通常情况下 item称为监控项,例如我们host加入了 zabbix 监控,我们需要监控它的内存.CPU信息,那么获取的CPU或内存的这个元素就是 item,也就是监控项. 每个item 由 key[参数1,参数2,参数3,参数n]组成. 比如:监控项中需要获取主机信息,则需要一个对应的监控 key:system.hostname.如果是获取网卡流量,那么获取网卡这个监控项需要 key:net.if.in 或者 net.if.o

Zabbix实战-简易教程(3)--DB安装和表分区

一.安装环境 主机角色 主机IP VIP 操作系统版本 软件版本 ServerA(Master) 192.168.1.101 192.168.1.100 (keepalived+脚本) CentOS 6.5 64bit Zabbix-2.2.4 ServerB(Backup) 192.168.1.102 CentOS 6.5 64bit Zabbix-2.2.4 Master A 192.168.1.97 (主从) CentOS 6.5 64bit mysql-5.6.21 Slave B 19