Zabbix自定义redis6集群监控项并用python脚本自动创建应用集、监控项、触发器

news2024/11/24 3:03:03

1.1、编写redis_status.sh脚本

[fieldyang@centos7-135 sbin]$ mkdir -p /usr/lib/zabbix/scripts/

[fieldyang@centos7-135 sbin]$ cd /usr/lib/zabbix/scripts/

[fieldyang@centos7-135 scripts]$ cat >redis_status.sh

#!/bin/bash
#author:Fieldyang
#description:此脚本用于监控redis集群

REDISCLI='/app/redis/bin/redis-cli'

HOST='192.168.28.135'

PORT=7001

PASS='123456'


if [[ $# == 1 ]];then

        case $1 in

        cluster_state)

        result=`$REDISCLI -c -h $HOST -p $PORT -a $PASS cluster info 2>/dev/null | grep -w "cluster_state" | awk -F':' '{print $2}'| grep -c ok`

        echo $result

        ;;

        cluster_slots_assigned)

        result=`$REDISCLI -c -h $HOST -p $PORT -a $PASS cluster info 2>/dev/null | grep -w "cluster_slots_assigned" | awk -F':' '{print $2}'`

        echo $result

        ;;

        cluster_slots_ok)

        result=`$REDISCLI -c -h $HOST -p $PORT -a $PASS cluster info 2>/dev/null | grep -w "cluster_slots_ok" | awk -F':' '{print $2}'`

        echo $result

        ;;

        cluster_slots_pfail)

        result=`$REDISCLI -c -h $HOST -p $PORT -a $PASS cluster info 2>/dev/null | grep -w "cluster_slots_pfail" | awk -F':' '{print $2}'`

        echo $result

        ;;

        cluster_slots_fail)

        result=`$REDISCLI -c -h $HOST -p $PORT -a $PASS cluster info 2>/dev/null | grep -w "cluster_slots_fail" | awk -F':' '{print $2}'`

        echo $result

        ;;

        cluster_known_nodes)

        result=`$REDISCLI -c -h $HOST -p $PORT -a $PASS cluster info 2>/dev/null | grep -w "cluster_known_nodes" | awk -F':' '{print $2}'`

        echo $result

        ;;

        cluster_size)

        result=`$REDISCLI -c -h $HOST -p $PORT -a $PASS cluster info 2>/dev/null | grep -w "cluster_size" | awk -F':' '{print $2}'`

        echo $result

        ;;

        cluster_current_epoch)

        result=`$REDISCLI -c -h $HOST -p $PORT -a $PASS cluster info 2>/dev/null | grep -w "cluster_current_epoch" | awk -F':' '{print $2}'`

        echo $result

        ;;

        cluster_my_epoch)

        result=`$REDISCLI -c -h $HOST -p $PORT -a $PASS cluster info 2>/dev/null | grep -w "cluster_my_epoch" | awk -F':' '{print $2}'`

        echo $result

        ;;

        cluster_stats_messages_ping_sent)

        result=`$REDISCLI -c -h $HOST -p $PORT -a $PASS cluster info 2>/dev/null | grep -w "cluster_stats_messages_ping_sent" | awk -F':' '{print $2}'`

        echo $result

        ;;

        cluster_stats_messages_pong_sent)

        result=`$REDISCLI -c -h $HOST -p $PORT -a $PASS cluster info 2>/dev/null | grep -w "cluster_stats_messages_pong_sent" | awk -F':' '{print $2}'`

        echo $result

        ;;

        cluster_stats_messages_sent)

        result=`$REDISCLI -c -h $HOST -p $PORT -a $PASS cluster info 2>/dev/null | grep -w "cluster_stats_messages_sent" | awk -F':' '{print $2}'`

        echo $result

        ;;

        cluster_stats_messages_ping_received)

        result=`$REDISCLI -c -h $HOST -p $PORT -a $PASS cluster info 2>/dev/null | grep -w "cluster_stats_messages_ping_received" | awk -F':' '{print $2}'`

        echo $result

        ;;

        cluster_stats_messages_pong_received)

        result=`$REDISCLI -c -h $HOST -p $PORT -a $PASS cluster info 2>/dev/null | grep -w "cluster_stats_messages_pong_received" | awk -F':' '{print $2}'`

        echo $result

        ;;

        cluster_stats_messages_received)

        result=`$REDISCLI -c -h $HOST -p $PORT -a $PASS cluster info 2>/dev/null | grep -w "cluster_stats_messages_received" | awk -F':' '{print $2}'`

        echo $result

        ;;

        fail_node)

        result=`$REDISCLI -c -h $HOST -p $PORT -a $PASS cluster nodes 2>/dev/null | awk -F ',' '{print $2}' | grep -c 'fail'`

        echo $result

        ;;

        *)

        echo -e "\033[33mUsage: $0 {cluster_state|cluster_slots_assigned|cluster_slots_ok|cluster_slots_pfail|cluster_slots_fail|cluster_known_nodes|cluster_size|cluster_current_epoch|cluster_my_epoch|cluster_stats_messages_ping_sent|cluster_stats_messages_pong_sent|cluster_stats_messages_sent|cluster_stats_messages_ping_received|cluster_stats_messages_pong_received|cluster_stats_messages_received|fail_node}\033[0m"

        ;;

        esac

fi

[fieldyang@centos7-135 scripts]$ chmod +x redis_status.sh

1.2、修改agent配置并重启

[fieldyang@centos7-135 scripts]$ grep ^UserParameter /etc/zabbix/zabbix-agent/conf/zabbix_agentd.conf

UserParameter=redis.status[*],/usr/lib/zabbix/scripts/redis_status.sh $1

[fieldyang@centos7-135 scripts]$

[fieldyang@centos7-135 sbin]$ ps -ef|grep zabbix_agentd |grep -v grep|awk '{print $2}'|xargs kill -9

[fieldyang@centos7-135 sbin]$ ./zabbix_agentd -c /etc/zabbix/zabbix-agent/conf/zabbix_agentd.conf

zabbix_agentd [31217]: Warning: EnableRemoteCommands parameter is deprecated, use AllowKey=system.run[*] or DenyKey=system.run[*] instead

[fieldyang@centos7-135 sbin]$

1.3、测试验证

[fieldyang@www ~]$ echo "cluster_state|cluster_slots_assigned|cluster_slots_ok|cluster_slots_pfail|cluster_slots_fail|cluster_known_nodes|cluster_size|cluster_current_epoch|cluster_my_epoch|cluster_stats_messages_ping_sent|cluster_stats_messages_pong_sent|cluster_stats_messages_sent|cluster_stats_messages_ping_received|cluster_stats_messages_pong_received|cluster_stats_messages_received|fail_node"|sed "s/|/\n/g"|while  read i

> do

> zabbix_get -s 192.168.28.135 -k redis.status[$i] |xargs |xargs echo "${i}:"

> done

cluster_state: 1

cluster_slots_assigned: 16384

cluster_slots_ok: 16384

cluster_slots_pfail: 0

cluster_slots_fail: 0

cluster_known_nodes: 10

cluster_size: 5

cluster_current_epoch: 15

cluster_my_epoch: 11

cluster_stats_messages_ping_sent: 15397

cluster_stats_messages_pong_sent: 15516

cluster_stats_messages_sent: 30913

cluster_stats_messages_ping_received: 15516

cluster_stats_messages_pong_received: 15394

cluster_stats_messages_received: 30910

fail_node: 0

[fieldyang@www ~]$

转换一下,方便后面使用python脚本自动添加item项目

echo "cluster_state|cluster_slots_assigned|cluster_slots_ok|cluster_slots_pfail|cluster_slots_fail|cluster_known_nodes|cluster_size|cluster_current_epoch|cluster_my_epoch|cluster_stats_messages_ping_sent|cluster_stats_messages_pong_sent|cluster_stats_messages_sent|cluster_stats_messages_ping_received|cluster_stats_messages_pong_received|cluster_stats_messages_received|fail_node"|sed -e "s/|/\",\"/g" -e "s/^/\"/g" -e "s/$/\"/g"

"cluster_state","cluster_slots_assigned","cluster_slots_ok","cluster_slots_pfail","cluster_slots_fail","cluster_known_nodes","cluster_size","cluster_current_epoch","cluster_my_epoch","cluster_stats_messages_ping_sent","cluster_stats_messages_pong_sent","cluster_stats_messages_sent","cluster_stats_messages_ping_received","cluster_stats_messages_pong_received","cluster_stats_messages_received","fail_node"

2.1、编写python脚本:自动添加应用集,批量添加监控项、触发器

相关api参考官方文档

#!/usr/bin/env python
"""
# author: Fieldyang
# version 1.0
# description:此脚本用于自动创建应用集,批量生成监控项,并创建触发器,可用于脚本自定义的监控项的添加
"""

from urllib import request, parse
import json


# 定义通过HTTP方式访问API地址的函数,后面每次请求API的各个方法都会调用这个函数
def requestJson(url, values):
    data = json.dumps(values)
    # json.dumps() 	将python数据结构转化为Json字符串,即dict类型转换为str类型
    # json.dump() 	编码,用于将dict类型的数据转换为str类型,并写入到json文件
    data = bytes(data, 'utf8')
    # 必须做转换,否则会返回 TypeError: POST data should be bytes, an iterable of bytes,
    # or a file object. It cannot be of type str.
    req = request.Request(url, data, {'Content-Type': 'application/json-rpc'})
    response = request.urlopen(req, data)
    output = json.loads(response.read())
    # json.loads() 	将json编码的字符串转换回python数据结构,即str类型转换成dict类型
    # json.load() 	解码,用于从json文件中读取数据。
    try:
        message = output['result']
    except:
        message = output['error']['data']
        print(message)
        quit()
    return output['result']


# API接口认证的函数,登录成功会返回一个Token
def authenticate(url, username, password):
    pdata = {}
    pdata['method'] = 'user.login'  # 方法
    pdata['id'] = '0'  # 用户 id
    pdata['jsonrpc'] = "2.0"  # api 版本
    pdata['params'] = {"user": username, "password": password}  # 用户账号密码
    #此种定义方式方便json转换,其它方法直接从官方拷贝json
    token = requestJson(url, pdata)
    return token

#定义获取hostid函数
def gethostid(auth, ip):
    pdata = {
        "jsonrpc": "2.0",
        "method": "host.get",
        "params": {
            "output": [
                "hostid",
                "host"
            ],
            "selectInterfaces": [
                "interfaceid",
                "ip"
            ],
            'filter': {
                'ip': ip
            },
        },
        "id": 2,
        "auth": auth
    }
    output = requestJson(url, pdata)
    return output


#定义获取应用集函数
def getapp(hostid,appname,auth):
    values = {
           "jsonrpc": "2.0",
           "method": "application.get",
           "params": {
               "output": "extend",
               "hostids": hostid,
               "sortfield": "name",
				'filter': {
				'name': appname
				}
           },
           "auth":auth,
           "id": 1
       }
    output = requestJson(url,values)
    return output


#定义创建应用集函数
def createapp(hostid,appname,auth):
    values = {
           "jsonrpc": "2.0",
           "method": "application.create",
           "params": {
               "name": appname,
               "hostid": hostid,
           },
           "auth": auth,
           "id": 1
       }
    output = requestJson(url,values)
    return output


# 定义maintenance维修模式host函数,本文不涉及,可忽略
def maintenancecreate(maintenancename,active_since,active_till,hostid,period,auth):
    values = {
            'jsonrpc': '2.0',
            'method': 'maintenance.create',
            'params': {
                "name": maintenancename,
                "active_since": active_since,
                "active_till": active_till,
                "hostids": [
                    hostid
                ],
                "timeperiods": [{
                    "timeperiod_type": 0,
                    "every": 1,
                    "dayofweek": 64,
                    "start_time": 64800,
                    "period": period
                            }]
                    },
            'auth': auth,
            'id': '8'
            }
    output = requestJson(url,values)
    return output


#定义创建监控项函数
def createitem(name, key, hostid, interfaceid,applicationid, auth):
    values = {
        "jsonrpc": "2.0",
        "method": "item.create",
        "params": {
            "name": name,
            "key_": key,
            "hostid": hostid,
            "type": 0,
            "value_type": 3,
            "interfaceid": interfaceid,
            "applications": [applicationid],
            "delay": "30s"
        },
        "auth": auth,
        "id": 1
    }
    output = requestJson(url, values)
    return output

#定义创建触发器函数
def createtrigger(description, expression,auth):
    values = {
           "jsonrpc": "2.0",
           "method": "trigger.create",
           "params": [
               {
                   "description": description,
                   "expression": expression,
               },
           ],
           "auth": auth,
           "id": 4
       }
    output = requestJson(url, values)
    return output


#登出函数
def logout(auth):
    pdata = {}
    pdata['method'] = 'user.logout'
    # 方法
    pdata['id'] = 3  # 用户 id
    pdata['jsonrpc'] = "2.0"  # api 版本
    pdata['params'] = []
    pdata['auth'] = auth  # auth 串
    output = requestJson(url, pdata)
    return output
    # 返回信息

if __name__ == '__main__':
    # 定义URL账户密码
    url = 'http://192.168.28.132/zabbix/api_jsonrpc.php'
    username = 'fieldyang'
    password = '8357690'
    ip = '192.168.28.135'
    #定义items条目
    item_list = ["cluster_state", "cluster_slots_assigned", "cluster_slots_ok", "cluster_slots_pfail",
                 "cluster_slots_fail",
                 "cluster_known_nodes", "cluster_current_epoch",
                 "cluster_size", "cluster_my_epoch", "cluster_stats_messages_ping_sent",
                 "cluster_stats_messages_pong_sent", "cluster_stats_messages_sent",
                 "cluster_stats_messages_ping_received", "cluster_stats_messages_pong_received",
                 "cluster_stats_messages_received", "fail_node"]
    auth = authenticate(url, username, password)
    if auth:
        host = gethostid(auth, ip)
        hostid = host[0]['hostid']
        interfaceid = host[0]['interfaces'][0]['interfaceid']
        #print(host)
        #print(interfaceid)
        if hostid:
            for item in item_list:
                name = 'redis.cluster_status.%s' %(item)
                key = 'redis.status[%s]' %(item)
                #print(name,key)
                appname = 'redis cluster'
                #定义应用集名称
                try:
                    #添加应用集
                    application = createapp(hostid,appname,auth)
                    print("添加 应用集 %s 成功!" %application)
                    if application:
                        applicationid=application[0]['interfaceid']
                        #print(applicationid)
                        #创建监控项
                        itemids = createitem(name, key, hostid, interfaceid,applicationid, auth)
                        itemid = itemids['itemids'][0]
                        #print("添加 应用集 %s 成功!" %application)
                        print("添加 名称 %s 键值 %s 键id %s 成功!" % (name,key,itemid))
                    else:
                        pass
                except:
                    # 检索应用集
                    application=getapp(hostid, appname, auth)
                    applicationid=application[0]['applicationid']
                    #print(application)
                    #print(applicationid)
                    # 创建监控项
                    itemids = createitem(name, key, hostid, interfaceid, applicationid, auth)
                    itemid = itemids['itemids'][0]
                    print("添加 名称 %s 键值 %s 键id %s 成功!" % (name,key,itemid))
            description = 'Redis cluster fail node >=1'
            expression = '{centos7-135:redis.status[fail_node].last()}>=1'
            triggerids=createtrigger(description, expression, auth)
            if triggerids:
                triggerid=triggerids['triggerids'][0]
                print("添加触发器 %s 触发器id %s 成功!" % (description,triggerid))
            else:
                pass
else:
    pass
logout(auth)




2.2、运行脚本创建 应用集、监控项、触发器

2.3、zabbix web端确认是否已经创建成功

2.4、确认最新数据

2.5、创建图形(略)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/613565.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

day 48 打家劫舍专题:198. 打家劫舍;213. 打家劫舍 II;337. 打家劫舍 III

打家劫舍 198. 打家劫舍1. dp数组以及下标名义2. 递归公式3. dp数组如何初始化4. 遍历顺序5. 代码 213. 打家劫舍 II:房间首尾相连1. dp数组以及下标名义2. 递归公式3. dp数组如何初始化4. 遍历顺序5. 代码 337. 打家劫舍 III:1. 递归,后序遍历动态规划:…

路径规划算法:基于热交换优化的路径规划算法- 附代码

路径规划算法:基于热交换优化的路径规划算法- 附代码 文章目录 路径规划算法:基于热交换优化的路径规划算法- 附代码1.算法原理1.1 环境设定1.2 约束条件1.3 适应度函数 2.算法结果3.MATLAB代码4.参考文献 摘要:本文主要介绍利用智能优化算法…

HTTP编码杂谈

一 HTTP编码杂谈 ① 知识铺垫 1) 编码的英文叫encode --> 常见HTTP URL编码、Base64编码等目的: 转变为二进制的stream(字节流),便于网络传输备注: 一般都是基于utf-8编码2) 解码叫decode3) 乱码的根源: 编码和解码的方式不一致4) url…

深入理解深度学习——切面距离(Tangent Distance)、正切传播(Tangent Prop)和流形正切分类器

分类目录:《自然语言处理从入门到应用》总目录 许多机器学习通过假设数据位于低维流形附近来克服维数灾难。一个利用流形假设的早期尝试是切面距离(Tangent Distance)算法 (Simard。它是一种非参数的最近邻算法,其中使用的度量不是…

libVLC 抓取视频帧并渲染(OpenGL)

作者: 一去、二三里 个人微信号: iwaleon 微信公众号: 高效程序员 在前面,我们写了几篇文章《libVLC 抓取视频帧并渲染(QWidget)》和《libVLC 抓取视频帧并渲染(QGraphicsView)》,分别介绍了QWidget 和 QGraphicsView 对视频帧的渲染,除了这些方式之外,还有一种最常…

动,静态库(与linux有关)

1.一些与本章标题无关的补充内容 当我们修改文件内容的时候,有可能会修改文件的属性。比如:可能会更改文件的大小属性。 我们在通过指令查看文件的时间相关属性时会往往观察到这样的现象:Access(访问时间,之前有具体讲过)没有及…

C++ string的简单应用

C语言的字符串 C的字符串 头文件&#xff1a; #include<string.h> //c #include<string> //C #include<cstring> //C 比较string的大小 两个string对象相加 使用字符串对象来存放字符串 两个string对象相加 string str "Hello,"; st…

求取平面参数

平面方程AXBYCZD0 变换一下-> A/DX B/DYC/DZ -1 该方程满足Axb 其中A为, x为,b为-1单位阵 求解代码如下: /* comment plane equation: Ax By Cz D 0 convert to: A/D*x B/D*y C/D*z -1 solve: A0*x0 b0 where A0_i [x_i, y_i, z_i], x0 [A/D, B/D, C/D]^T,…

逆向汇编与反汇编——基本数据类型

-1&#xff1a;0xFFFFFFFF 为什么内存使用补码来存储数据&#xff1f; 》因为CPU的设计只有加法器&#xff0c;没有减法&#xff0c;需要使用补码来实现减法 大端&#xff1a;数值的高位放到内存的低字节 小端模式验证&#xff1a;78 78 浮点型&#xff1a;单精度float和双精…

创建类构造器

类的创建 构造器 作用&#xff1a;给类赋值 类实际可分为&#xff1a;构造器属性方法 构造器的重载 重载&#xff1a;方法名相同&#xff0c;参数类型不同 一定要有空构造器&#xff01;&#xff01;&#xff01; TIP&#xff1a;this.指代当前创建对象

数据结构与算法系列之希尔排序

&#x1f497; &#x1f497; 博客:小怡同学 &#x1f497; &#x1f497; 个人简介:编程小萌新 &#x1f497; &#x1f497; 如果博客对大家有用的话&#xff0c;请点赞关注再收藏 &#x1f31e; 希尔排序 希尔排序法又称缩小增量法。希尔排序法的基本思想是&#xff1a;先选…

Python读写mat文件(使用scipy.io)

在matlab中&#xff0c;数据可保存为mat文件&#xff0c;使用save和load命令可进行读写操作。而在Python中&#xff0c;也可以对mat文件进行读写。 一、由matlab向Python传数据&#xff08;Python读取mat文件&#xff09; 第一步&#xff1a;使用matlab创建变量并保存至mat文…

某程序员——我应届毕业,年薪23万...

马士兵教育线下训练营第1期 已经圆满结束啦~ 不了解训练营的伙伴 有的在观望、有的在好奇 训练营真的能学到东西吗&#xff1f; 出去了之后能找到工作吗&#xff1f; 不如看看那些参加过的人是怎么说的 或许&#xff0c;你会对我们、对训练营 会有更深入的了解...... 0…

计算机视觉:转置卷积

转置卷积 文章目录 转置卷积基本操作填充、步幅和多通道性质 转置卷积&#xff08;Transposed Convolution&#xff09;&#xff0c;也称为反卷积&#xff08;Deconvolution&#xff09;&#xff0c;是卷积神经网络&#xff08;CNN&#xff09;中的一种操作&#xff0c;它可以将…

排他网关-部署流程定义

类&#xff1a;com.roy.ActivitiGatewayExclusive /*** 部署流程定义*/Testpublic void testDeployment(){ // 1、创建ProcessEngineProcessEngine processEngine ProcessEngines.getDefaultProcessEngine(); // 2、得到RepositoryService实例RepositoryService…

剑指offer刷题笔记--题目11-20

1-旋转数组的最小数字&#xff08;11&#xff09; 主要思路&#xff1a; 一次旋转将最后一个元素移动最前面&#xff0c;由于数组最开始是升序的&#xff0c;因此数组的大部分元素都应该保持升序的状态&#xff08;n1<n2<...<n3>n4<n5<...<n6&#xff09;…

JAVA练习小游戏——贪吃蛇小游戏 PLUS版

目录 基础版本 新增内容 1.添加START开始界面 2.新增背景音乐 3.添加SCORE计分 4.新增游戏机制 代码实现 实机演示 基础版本 JAVA练习小游戏——贪吃蛇小游戏_timberman666的博客-CSDN博客https://blog.csdn.net/timberman666/article/details/131046742?spm1001.201…

xshell使用技巧小节

文章目录 1. 输出日志文件2. 快捷键设置3. 使用ctrlv按键4. 快速命令 1. 输出日志文件 需求&#xff1a;我们使用xshell时会经常需要把xshell中的内容打印到文件中&#xff0c;或者因为内容过多&#xff0c;xshell界面无法显示先显示出的内容&#xff0c;或者需要明确记录文件…

AlterNET Studio v9.0 Crack

AlterNET Studio v9.0 改进了代码编辑器、表单设计器和 Python LSP 解析器。 2023 年 6 月 5 日 - 11:22新版本 特征 代码编辑器 编辑器中添加了 Microsoft Visual Studio 主题。现在包括一个放大镜区域&#xff0c;可以更轻松地浏览文档的内容。带有 alpha 通道的图像现在用于…

汽车电子AUTOSAR之EcuM模块

目录 前言 正文 EcuM模块总体介绍 主要功能 总状态机&#xff08;Flexible 与 Fixed&#xff09; Startup Sequence STARTUP I STARTUP II RUN Sequence RUN II RUN III ShutDown Sequence ShutDown Target Go Sleep Go OFF I Go OFF II Sleep Sequence Sleep…