zabbix API的调用以及获取监控项信息_获取交换机的监控信息api(1)

2.4 application.yaml文件

zabbix:
  config:
    url: http://xx.xx.xx.xx/zabbix/api_jsonrpc.php
    username: Admin
    password: zabbix

这里的url是如我第一篇配置zabbix的那个url,username以及password都是zabbix默认的,如果大家配置时有修改则要对应修改,“/api_jsonrpc.php”这个后缀是我阅读了zabbix API官方文档后加上的,加上才能正确连接。zabbix API官方文档链接给大家附上:https://www.zabbix.com/documentation/5.0/zh/manual/ap(这个文档很重要,大家可以仔细阅读,后续,函数参数的选择等,也会用到这个文档)

2.5AbstractZabbixService 抽象类

接下来:AbstractZabbixService这个抽象类,其中包含了使用Zabbix API进行请求的方法和处理错误的方法。代码如下:

public abstract class AbstractZabbixService {


    protected JSONObject zabbixRequest(ZabbixApi zabbixApi,Request request) throws Exception {
        JSONObject response = zabbixApi.call(request); // 使用ZabbixApi对象调用call方法发起请求,并将响应存储在JSONObject对象中
        return response; // 返回响应结果
    }

    protected void zabbixError(JSONObject response) throws Exception {
        if (!isBlank(response.getString("error")))
            throw new Exception("向Zabbix请求出错了!" + JSON.parseObject(response.getString("error")).getString("data"));
    }

}

该抽象类封装了与Zabbix API的交互逻辑。zabbixRequest方法用于发送Zabbix API请求并返回响应结果。它接受一个ZabbixApi对象和一个Request对象作为参数,通过调用ZabbixApi对象的call方法发送请求,并将响应结果存储在JSONObject对象中,最后返回该对象。

zabbixError方法用于处理Zabbix API的错误响应。它接受一个JSONObject对象作为参数,通过判断响应中是否存在"error"字段且不为空,如果存在错误,则抛出一个Exception异常,错误信息为 “向Zabbix请求出错了!” 加上从错误响应中解析出的"data"字段的值。

2.6 ZabbixService

接下来,就是我们的重中之重了(我们先跳过InsertDataService),这个Service层包含了我们对zabbix所要做的所有操作,代码如下:

@Service
public class ZabbixService  extends AbstractZabbixService{

    @Autowired
    private ZabbixUtil zabbixUtil;

    //获取主机列表
    public String getHostList() throws Exception {
        ZabbixApi zabbixApi = zabbixUtil.getZabbixApi();
        Request request = RequestBuilder.newBuilder().method("host.get")
                .paramEntry("output", new String[]{"host", "name", "description", "hostid"})
                .paramEntry("selectGroups", "extend")
                .build();
        JSONObject response = zabbixRequest(zabbixApi,request);
        zabbixError(response);
        JSONArray result = response.getJSONArray("result");
        return result.toJSONString();
    }

    //获取监控项
    public String getMonitorItems(String hostId) throws Exception {
        ZabbixApi zabbixApi = zabbixUtil.getZabbixApi();
        Request request = RequestBuilder.newBuilder().method("item.get")
                .paramEntry("output", new String[]{"extend", "name"})
                .paramEntry("hostids", hostId)
                .build();
        JSONObject response = zabbixRequest(zabbixApi, request);
        zabbixError(response);
        JSONArray result = response.getJSONArray("result");

        List<String> desiredItems = Arrays.asList("Interface eth0(): Bits received");

        JSONArray filteredResult = new JSONArray();
        for (int i = 0; i < result.size(); i++) {
            JSONObject item = result.getJSONObject(i);
            String name = item.getString("name");
            if (desiredItems.contains(name)) {
                filteredResult.add(item);
            }
        }

        return filteredResult.toJSONString();
    }

    //获取监控项历史数据,paramEntry根据zabbixAPI设置,limit==481设定获取从timeform开始的为时一天的历史数据
    public String getHistory(String itemId, long timeform) throws Exception {
        ZabbixApi zabbixApi = zabbixUtil.getZabbixApi();
        Request request = RequestBuilder.newBuilder().method("history.get")
                .paramEntry("output", "extend")
                .paramEntry("itemids", itemId)
                .paramEntry("time_from", timeform)
//                .paramEntry("time_till", 1675424400)
                .paramEntry("sortfield","clock")
                .paramEntry("sortorder","ASC")
                .paramEntry("limit",481)
                .build();
        JSONObject response = zabbixRequest(zabbixApi, request);
        zabbixError(response);
        JSONArray result = response.getJSONArray("result");
        return result.toJSONString();
    }


}

我们在这里封装了三个函数,分别是: getHostList()、getMonitorItems(String hostId)以及getHistory(String itemId, long timeform),这三个函数的功能是环环相扣的,这里我们只详细解释一下第一个函数,后面的两个函数稍作讲解,因为只是参数类型有不同。

该方法首先通过zabbixUtil对象获取了一个ZabbixApi对象,用于与Zabbix API进行交互。然后,使用RequestBuilder创建一个Request对象,并设置请求方法为"host.get",.paramEntry后面接的是将被传递给API方法的参数,首先指定要获取的主机属性为"host"、"name"...。接下来,调用zabbixRequest方法发送Zabbix API请求,并将响应结果存储在JSONObject对象中。然后,调用zabbixError方法处理错误响应,如果存在错误,则会抛出异常。最后,从响应中获取主机列表数据,并将其转换为JSON字符串并返回。

接下来根据,第一个函数getHostList(),获取到的主机Id作为第二个函数的参数引用,来获取这台主机的监控项Id(!!这里的监控项Id,我是根据监控项的名称来获取的,大家如果参阅了官方API文档有更好的方式欢迎讨论!!),然后同理第三个函数:getHistory(String itemId, long timeform),根据监控项Id获取到我们所需要的历史数据(),并将其转换为JSON字符串并返回。(!!!第三个函数传入到param参数这里再详细解释一下吧,首先timeform,表示起始的时间戳,也是我们写的这个函数需要传入的参数;clock以及ASC表示打印顺序是按照时间戳升序排列;limit481,结合后面数据库中每隔三分钟取一次历史数据值则刚好可以实现每天取一次历史数据值,大家可以自行计算验证一下,作者因为时间戳的问题就憋了两天,这里可能有点绕,我就再罗嗦一下,数据库取值是同时进行的,意思是每隔三分钟取一次值,取481次,这是同一时间完成的,大家运行以下代码再结合官方API文档可能就更好理解了!!!)此时,我们就已经通过zabbix API获取到了历史数据了。我们可以用测试类中的代码来测试一下。

2.7 测试类

测试代码如下:

@RunWith(SpringRunner.class)
@SpringBootTest(classes = ZabbixApiDemoApplication.class)
public class ZabbixApiTest {

    @Autowired
    private ZabbixService zabbixService;


    @Test
    public void getHostList() throws Exception {
        String hostList = zabbixService.getHostList();
        System.out.println(hostList);

    }

    @Test
    public void getMonitorItems() throws Exception {
        String monitorItems = zabbixService.getMonitorItems("10439");
        System.out.println("1111111111");
        System.out.println(monitorItems);
        System.out.println("1111111111");
    }

这里给出的测试类代码,即可以调用2.6节中的函数在控制台打印出相应的主机列表以及选定主机Id的监控项,我们也可以在控制台中确定再得到要获取历史数据的监控项Id。

三、总结

因为篇幅原因,就先说到这里啦,后面还会出一篇编写时间函数,存入数据库实现获取每天的历史数据,以及显示到dataease平台上的文章。希望大家多多支持!因为时间比较紧,所以写作可能不是很详细,还有问题欢迎大家私聊以及评论区讨论。这里引用了gitee平台上作者名为yanzhen的部分代码结构,但是再次在平台上搜索时并未找到,很感谢大佬。

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数网络安全工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年网络安全全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上网络安全知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加VX:vip204888 (备注网络安全获取)
img

一、网安学习成长路线图

网安所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
在这里插入图片描述

二、网安视频合集

观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。
在这里插入图片描述

三、精品网安学习书籍

当我学到一定基础,有自己的理解能力的时候,会去阅读一些前辈整理的书籍或者手写的笔记资料,这些笔记详细记载了他们对一些技术点的理解,这些理解是比较独到,可以学到不一样的思路。
在这里插入图片描述

四、网络安全源码合集+工具包

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。
在这里插入图片描述

五、网络安全面试题

最后就是大家最关心的网络安全面试题板块
在这里插入图片描述在这里插入图片描述

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
img

入图片描述](https://i-blog.csdnimg.cn/blog_migrate/6a226f96d88902a2a7748f588179b72f.png)

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-x7XjOyXZ-1713031948808)]

### 如何使用 Zabbix 监控交换机 为了实现对网络交换机的有效监控,可以通过 SNMP 协议来收集设备的状态数据并将其集成到 Zabbix 中。以下是关于如何配置 Zabbix监控网络交换机的关键点: #### 配置交换机支持SNMP协议 大多数现代交换机都支持SNMP(简单网络管理协议),这是用于远程管理和监控的标准协议。需要确保目标交换机已启用SNMP功能,并设置了正确的访问权限和团体字符串[^3]。 - **步骤说明** 在交换机上开启SNMP服务,并指定读取权限的团体名(Community String)。例如,在Cisco交换机中执行如下命令: ```bash snmp-server community public RO ``` #### 添加交换机作为主机到Zabbix Server 在Zabbix前端界面完成以下操作以注册新的被监控对象——即您的交换机1. 进入“Configuration -> Hosts”,点击右上方的“Create host”按钮。 2. 填写基本信息:输入主机名称、IP地址以及所属组群信息。 3. 将该主机链接至预定义好的适用于SNMP设备的模板,比如`Template NetSwitch Cisco`或其他匹配您硬件型号的具体模板[^5]。 #### 设置SNMP接口参数 对于每一个新增加的网络设备都需要明确指出其通信端口,默认情况下SNMP监听的是UDP/161端口号。因此要确认此路径畅通无阻并且防火墙允许外部连接尝试到达这些特定端口之上。 - 修改或创建相应的宏变量如{$SNMP_COMMUNITY}用来存储公用字串值以便后续查询调用时自动填充相应字段位置[^4]。 #### 定义触发器与图形展示 基于所选模板内含的各关键性能指标构建自定义报警条件或者直接沿用推荐阈值设定范围内的默认规则集即可满足大部分场景需求。同时还可以借助内置绘图工具生成直观的历史趋势曲线帮助分析长期运行状况变化规律特征等等[^1]。 ```python # 示例 Python 脚本片段演示如何通过 pysnmp 库获取 OID 数据并与 Zabbix API 结合发送主动模式更新消息给服务器端处理逻辑部分省略... from pysnmp.hlapi import * errorIndication, errorStatus, errorIndex, varBinds = next( getCmd(SnmpEngine(), CommunityData('public'), UdpTransportTarget(('demo.snmplabs.com', 161)), ContextData(), ObjectType(ObjectIdentity('SNMPv2-MIB', 'sysDescr', 0))) if errorIndication: print(errorIndication) else: if errorStatus: print('%s at %s' % (errorStatus.prettyPrint(), errorIndex and varBinds[int(errorIndex)-1][0] or '?')) else: for varBind in varBinds: print(' = '.join([x.prettyPrint() for x in varBind])) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值