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目录,定义配置文件:
区配置:
[root@172-31-0-35-pub 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
服配置:
[root@172-31-0-35-pub 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
Zabbix实战-简易教程--业务类的更多相关文章
- Zabbix实战-简易教程--DB类--ClickHouse
一.ClickHouse介绍 Clickhouse是一个用于联机分析处理(OLAP)的列式数据库管理系统(columnar DBMS). 传统数据库在数据大小比较小,索引大小适合内存,数据缓存命中率足 ...
- Zabbix实战-简易教程--WEB类--Nginx
一.开启Nginx status状态 1.在默认主机里面加上location添加ngx_status 如下操作: server { listen 127.0.0.1:8080; server_name ...
- Zabbix实战-简易教程--订阅类
一.需求提出 最近数据中心有一个新的需求,有一批后台任务需要在每天固定时间点运行(凌晨8:00),现在希望能够把这个任务执行的结果定时上报给他. 说明:执行的任务为一个sql查询,查询出来的是每个任务 ...
- 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实战-简易教程--中间件RabbitMQ监控
一.环境 zabbix版本:3.0 二.脚本说明 .├── rabbitmq.template.xml 模板文件├── scripts │ └── rabbitmq│ ├── api.p ...
- Zabbix实战-简易教程--动作(Actions)--自动发现
一.概述 Zabbix提供了有效和非常灵活的网络自动发现功能. 设置网络发现后你可以: 加快Zabbix部署(自动添加主机.添加模板) 简化管理(自动删除主机.删除模板.禁用主机) 无需过多管理就能在 ...
随机推荐
- springmvc处理日期格式
解决http400错误 通常有两个来源: 1 页面的下拉列表中传入了字符串,而服务器需要的是Integer类型的,所以服务器拒绝. 2, 浏览器传给服务器端的日期格式字符串,服务器端理解不了,所以需要 ...
- Spring Boot Mybatis-Plus
Mybatis-Plus 是对 Mybatis-Plus 的一些扩充. 在 Spring Boot 中进行集成的时候其实基本上和 mybatis 是一致的. 在你的配置文件中.配置 你的 entity ...
- Substring Search
查找子字符串 Introduction 在长度为 N 的文本里寻找长度为 M 的模式(子串),典型情况是 N >> M. 这个应用就很广泛啦,在文本中寻找特定的模式(子串)是很常见的需求. ...
- Memcahce和Redis比较
一.Memcache 1. memecache 把数据全部存在内存之中,断电后会挂掉,数据不能超过内存大小redis有部份存在硬盘上,这样能保证数据的持久性. 2. Memcache ...
- 用pymysql代替MySQLdb
在我刚开始学python的时候,用的是python2.7,那时候连接mysql用的库是MySQLdb(很诡异的大小写,初学者经常因为记不住大小写导致“No module named xxx”).燃鹅, ...
- 【转】Android应用如何跳转到应用市场详情页面
Android应用开发过程中,可能会有需求,比如:推广时跳转到应用市场下载应用,跳转到应用市场给自己的应用打分,跳转到应用市场更新自己的应用.那如何跳转到应用市场呢? 可能跳转的方法大家都是知道的,方 ...
- Day1 MySql安装和基本操作
数据和数据库 1.数据:客观事物的符号表示. 2.存储介质:纸,光盘,磁盘,u盘,云盘… 3.存储的目的:检索(查询) 存储数据量加大,导致检索的难度升高. 4.数据库(DB:database):按照 ...
- Elasticsearch之如何合理分配索引分片
大多数ElasticSearch用户在创建索引时通用会问的一个重要问题是:我需要创建多少个分片? 在本文中, 我将介绍在分片分配时的一些权衡以及不同设置带来的性能影响. 如果想搞清晰你的分片策略以及如 ...
- webpack一小时入门
什么是 webpack? webpack是近期最火的一款模块加载器兼打包工具,它能把各种资源,例如JS(含JSX).coffee.样式(含less/sass).图片等都作为模块来使用和处理. 我们可以 ...
- echarts显示X轴最后一个lable
代码: xAxis: [ { axisLabel: { showMaxLabel: true } } ]