zabbix-API对接实录:关键基础设施数据清洗和封装函数(php数组函数、数据清洗、数据结构化)

news2024/11/17 23:47:37

系列文章目录

  1. Zabbix监控系统PHP-API开发测试实录
  2. Zabbix监控系统开发(2):JSON多维数组筛选字段是否包含字符串的解决方案
  3. Zabbix物联网可视化开发文档

文章目录

  • 系列文章目录
  • 前言
  • 一、zabbix-API数据爬虫
  • 二、主机ID封装接口
    • 1.封装API接口
    • 2.数据处理封装函数
  • 三、组ID封装接口
    • 1.格式化数据所需格式
    • 2.初始化默认数据
    • 3.数据过滤
    • 4.数据结构化处理
      • 数据遍历
      • 结构化数据makeZabArr函数
  • 总结


前言

关键基础设施的四环图,是zabbix开发中的重点和难点。不管是数据处理的复杂程序,数据爬取→数据过滤→数据清洗→数据结构化→数据入库→数据输出→数据图表渲染和统计,基本上将数据可视化在前端的展示和后端的对接,充分调动了起来。
在这里插入图片描述


一、zabbix-API数据爬虫

zabbix-API数据爬虫,通过curl爬取对应的API即可。

/*
 * zabbix-API数据爬虫
 * $url,默认爬取地址;
*/
function getZabAPI($url, $group_id)
{
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    $resp = curl_exec($ch);
    curl_close($ch);
    return $resp;
}

注意:配置访问https网站的时,是为true,否则可能会报400错误。

curl_setopt( c u r l , C U R L O P T S S L V E R I F Y P E E R , t r u e ) ; c u r l s e t o p t ( curl, CURLOPT_SSL_VERIFYPEER, true); curl_setopt( curl,CURLOPTSSLVERIFYPEER,true);curlsetopt(curl, CURLOPT_SSL_VERIFYHOST, true);

CURLOPT_SSL_VERIFYPEER 设置为FALSE 禁止 cURL 验证对等证书(peer’s
certificate)。要验证的交换证书可以在 CURLOPT_CAINFO 选项中设置,或在
CURLOPT_CAPATH中设置证书目录。

CURLOPT_SSL_VERIFYHOST 设置为 1 是检查服务器SSL证书中是否存在一个公用名(common name)。公用名(Common Name)一般来讲就是填写你将要申请SSL证书的域名 (domain)或子域名(sub domain)。 设置成 2,会检查公用名是否存在,并且是否与提供的主机名匹配。 在生产环境中,这个值应该是 2(默认值)。

二、主机ID封装接口

1.封装API接口

    public function getZabBasics()
    {
        global $db, $res, $CONF;
        dbc();
        $quota = get_param("quota");//获取指标数量;
        $group = $this->getGroupId();
        $hostids = $group["basicsid"];
        if ($hostids && $hostids != "0") {
            $res = getZabAPI($CONF['zab_url'] . 'api/api.php?act=getItem&hostids=' . $hostids . '&token=' . $CONF['zab_token']);
            $dataInfo = json_decode($res, true);
            //01.按照设备名称进行数组合并;
            $list = array();
            foreach ($dataInfo as $v) {
                if (stripos($v["name"], 'CPU') !== false || stripos($v["name"], '内存') !== false || stripos($v["name"], '硬盘守护') !== false || stripos($v["name"], '网口守护') !== false || stripos($v["name"], '存储') !== false) {
                    $list[explode('|', $v['name'])[0]][] = $v;
                }
            }

            //02.筛选键值;
            $dName = array();
            foreach ($dataInfo as $v) {
                $key = explode('|', $v['name'])[0];
                if (!isset($dName[$key])) {
                    $dName[$key] = $v['name'];
                }
            }
            //保留唯一值;
            $unique = array_values($dName);
            $len = count($unique);

            //03前端数据格式;
            @$dataInfoNew = array();
            for ($n = 0; $n < $len; $n++) {
                $dataInfoNew[$n] = makeZabArr($list[explode('|', $unique[$n])[0]], $quota);
            }

            //echo "<pre>";
            //die(json_encode_lockdata($dataInfoNew));

            @$listArr = array();
            foreach ($dataInfoNew as $k => $v) {
                if (array_key_exists("name", $dataInfoNew[$k])) {
                    $listArr[] = $v;
                }
            }

            //04.将数据总条数入库;
            $len1 = count($listArr);
            $row = $db->fetch('basics', 'group_id,total', array('group_id' => $hostids), ' id DESC');
            if (!$row) {
                $db->insert('basics', array('group_id' => $hostids, 'total' => $len1));
            } else {
                $db->update('basics', array('total' => $len1), 'group_id=' . $hostids);
            }

            //05.输出JSON
            die(json_encode_lockdata($listArr));
        } else {
            $res["data"] = NULL;
            die(json_encode_lockdata($res));
        }
    }

2.数据处理封装函数

/*关键基础设施数据清洗封装函数*/
function makeZabArr($dd, $quota)
{
    //01.将数据遍历输出;
    $data = array();
    $bStatus = array();
    $cpu = array();
    $ddr = array();
    $disk = array();
    $wlan = array();
    $storage = array();
    $dhcp = array();//服务1
    $dns = array();//服务2
    for ($i = 0; $i < count($dd); $i++) {
        //var_dump($dd[$i]["state"] . " ");
        //设备名称;
        $data["name"] = explode('|', $dd[$i]["name"])[0];
        //CPU;
        if (stripos($dd[$i]["name"], 'cpu') !== false) {
            $cpu[] = $dd[$i]["lastvalue"];
            $bStatus["cpu"][] = [$dd[$i]["status"], $dd[$i]["triggers"][0]['value'], $dd[$i]["triggers"][1]['value']];
        }

        //内存;
        if (stripos($dd[$i]["name"], "内存") !== false) {
            $ddr[] = $dd[$i]["lastvalue"];
            $bStatus["ddr"][] = [$dd[$i]["status"], $dd[$i]["triggers"][0]['value'], $dd[$i]["triggers"][1]['value']];
        }

        //硬盘;
        if ($dd[$i]["name"] == '硬盘') {
            $disk[] = $dd[$i]["lastvalue"];
            $bStatus["disk"] = [$dd[$i]["status"], $dd[$i]["triggers"][0]['value'], $dd[$i]["triggers"][1]['value']];
        }

        //网口;
        if ($dd[$i]["name"] == "网口") {
            $wlan[] = $dd[$i]["lastvalue"];
            $bStatus["wlan"] = [$dd[$i]["status"], $dd[$i]["triggers"][0]['value'], $dd[$i]["triggers"][1]['value']];
        }

        //存储-列表API展示,图表不渲染;
        if (stripos($dd[$i]["name"], "存储") !== false) {
            $storage[] = $dd[$i]["lastvalue"];
            $bStatus["storage"][] = [$dd[$i]["status"], $dd[$i]["triggers"][0]['value'], $dd[$i]["triggers"][1]['value']];
        }

        //DHCP;
        if (stripos($dd[$i]["name"], "服务1") !== false) {
            $dhcp[] = $dd[$i]["lastvalue"];
            $bStatus["dhcp"][] = [$dd[$i]["status"], $dd[$i]["triggers"][0]['value'], $dd[$i]["triggers"][1]['value']];
        }

        //DNS;
        if (stripos($dd[$i]["name"], "服务2") !== false) {
            $dns[] = $dd[$i]["lastvalue"];
            $bStatus["dns"][] = [$dd[$i]["status"], $dd[$i]["triggers"][0]['value'], $dd[$i]["triggers"][1]['value']];
        }
    }

    //02.防止设备传入空数据;
    if (empty(count($cpu))) {
        $cpu = array("0" => 0);
        $bStatus["cpu"] = "0";
    }

    if (empty(count($ddr))) {
        $ddr = array("0" => 0);
        $bStatus["ddr"] = "0";
    }
    if (empty(count($disk))) {
        $disk = array("0" => 0);
        $bStatus["disk"] = "0";
    }

    if (empty(count($wlan))) {
        $wlan = array("0" => 0);
        $bStatus["wlan"] = "0";
    }

    if (empty(count($storage))) {
        $storage = array("0" => 0);
        $bStatus["storage"] = "0";
    }

    //03.六环指标 By Poleung 2021.07.24;
    if ($quota == "sixNorm") {
        if (empty(count($dns))) {
            $dns = array("0" => 0);
            $bStatus["dns"][] = "无设备";
        }

        if (empty(count($dhcp))) {
            $dhcp = array("0" => 0);
            $bStatus["dhcp"][] = "无设备";
        }

        $data["dhcp"] = round(array_sum($dhcp) / count($dhcp), 1);
        $data["dns"] = round(array_sum($dns) / count($dns), 1);
    }

    //04.输入$data;
    $data["cpu"] = round(array_sum($cpu) / count($cpu), 1);
    $data["ddr"] = round(array_sum($ddr) / count($ddr), 1);
    $data["disk"] = round(array_sum($disk) / count($disk), 1);
    $data["wlan"] = round(array_sum($wlan) / count($wlan), 1);
    $data["storage"] = round(array_sum($storage) / count($storage), 1);

    //05.状态灯;
    $data["status"] = $bStatus;
    return $data;
}

三、组ID封装接口

1.格式化数据所需格式

在这里插入图片描述

2.初始化默认数据

zabbix-API对接过来的数据,为统一设备下不同数据指标的json数据,同时内部存在很多非本项目需要的干扰数据。项目需求需将下面的数据格式化成为上述1所需的格式。
在这里插入图片描述

3.数据过滤

通过数据遍历,将name中含有CPU使用率、内存使用率、硬盘2和守护接口关键字符的数据筛选出来。

   //01.按照设备名称进行数组合并;
            $list = array();
            $dName = array();
            foreach ($dataInfo as $v) {
                if (stripos($v["name"], 'CPU使用率') !== false || stripos($v["name"], '内存使用率') !== false || stripos($v["name"], '硬盘2') !== false || stripos($v["name"], '守护接口') !== false) {
                    $key = $v["tags"][2]["value"];
                    $list[$v["tags"][2]["value"]][] = $v;
                    if (!isset($dName[$key])) {
                        $dName[$key] = $v["tags"][2]["value"];
                    }
                }
            }

在这里插入图片描述

4.数据结构化处理

数据遍历

  $unique = array_values($dName);
            $len = count($unique);
            //die(json_encode_lockdata($list[$unique[0]]));
            @$dataInfoNew = array();
            for ($n = 0; $n < $len; $n++) {
                $dataInfoNew[$n] = makeZabArr($list[$unique[$n]]);
            }

结构化数据makeZabArr函数

for ($i = 0; $i < count($dd); $i++) {
        //设备名称;
        $data["name"] = $dd[$i]["tags"][2]["value"];

        //设备状态;
        $triggers = $dd[$i]["triggers"];

        //CPU;
        if (stripos($dd[$i]["name"], 'CPU使用率') !== false) {
            $cpu[] = $dd[$i]["lastvalue"];
            for ($j = 0; $j < count($triggers); $j++) {
                $bStatus["cpu"][] = $triggers[$j]["value"];
            }
        }

        //内存;
        if (stripos($dd[$i]["name"], "内存使用率") !== false) {
            $ddr[] = $dd[$i]["lastvalue"];
            for ($j = 0; $j < count($triggers); $j++) {
                $bStatus["ddr"][] = $triggers[$j]["value"];
            }
        }

        //硬盘;
        if ($dd[$i]["name"] == "硬盘2") {
            $disk[] = $dd[$i]["lastvalue"];
            for ($j = 0; $j < count($triggers); $j++) {
                $bStatus["disk"][] = $triggers[$j]["value"];
            }
        }

        //守护接口;
        if (stripos($dd[$i]["name"], "守护接口") !== false) {
            $wlan[] = $dd[$i]["lastvalue"];
            for ($j = 0; $j < count($triggers); $j++) {
                $bStatus["wlan"][] = $triggers[$j]["value"];
            }
        }
    }
//02.防止设备传入空数据;
    if (empty(count($cpu))) {
        $cpu = array("0" => 0);
        $bStatus["cpu"] = "0";
    }
    if (empty(count($ddr))) {
        $ddr = array("0" => 0);
        $bStatus["ddr"] = "0";
    }
    if (empty(count($disk))) {
        $disk = array("0" => 0);
        $bStatus["disk"] = "0";
    }
    if (empty(count($wlan))) {
        $wlan = array("0" => 0);
        $bStatus["wlan"] = "0";
    }
   //03.输入$data;
    $data["cpu"] = $cpu[0];
    $data["ddr"] = $ddr[0];
    $data["disk"] = $disk[0];
    $data["wlan"] = $wlan[0];

    //05.状态灯;
    $data["status"] = $bStatus;
    return $data;

总结

在实际开发中,使用到array_values、array_key_exists等php array数据函数,以及字符串stripos包含函数,是快速处理数据和解决问题的关键;也只有在实战中,不断地按照目标的需求,去学习和总结,才是不断能提升和进步的关键所在。

@lockdata.cn

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

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

相关文章

汽车 Automotive > T-BOX GNSS高精定位测试相关知识

参考&#xff1a;https://en.wikipedia.org/wiki/Global_Positioning_SystemGPS和GNSS的关系GPS&#xff08;Global Positioning System&#xff09;&#xff0c;全球定位系统是美国军民两用的导航定位卫星系统&#xff0c;GPS包含双频信号&#xff0c;频点L1、L2和L5GNSS&…

RecyclerView ViewType二级

实现效果描述&#xff1a; 1、点击recyclerview中item&#xff0c;列表下方出现其他样式的item&#xff0c;作为子item&#xff0c;如下所示 所需要的java文件和xml文件有&#xff1a; 1、创建FoldAdapteradapter, 在FoldAdapter中&#xff0c;定义两种不同的类型&#xff…

Allegro如何将Waived掉的DRC显示或隐藏操作指导

Allegro如何将Waived掉的DRC显示或隐藏操作指导 在用Allegro做PCB设计的时候,如果遇到正常的DRC,可以用Waive的命令将DRC不显示,如下图 当DRC被Waive掉的时候,如何将DRC再次显示出来。类似下图效果 具体操作如下 点击Display

linux下strace的使用

strace是一款用于跟踪Linux系统调用和信号的工具&#xff0c;可以帮助开发者排除程序运行时的问题。 具体来说&#xff0c;strace可以跟踪一个程序执行时所涉及到的系统调用&#xff0c;包括读写文件、网络通信、进程管理、内存管理等操作&#xff0c;通过分析程序运行过程中发…

JavaWeb--JSP案例

JSP案例8 案例8.1 环境准备8.1.1 创建工程8.1.2 创建包8.1.3 创建表8.1.4 创建实体类8.1.5 准备mybatis环境8.2 查询所有8.2.1 编写BrandMapper8.2.2 编写工具类8.2.3 编写BrandService8.2.4 编写Servlet8.2.5 编写brand.jsp页面8.2.6 测试8.3 添加8.3.1 编写BrandMapper方法8.…

ARM uboot 的移植0-从三星官方 uboot 开始移植的准备工作

一、移植前的准备工作 1、三星移植过的uboot源代码准备 (1) 三星对于 S5PV210 的官方开发板为 SMDKV210&#xff0c;对应的移植过的 uboot 是&#xff1a;三星官方为210移植过的uboot和kernel/android_uboot_smdkv210.tar.bz2。 (2) 这个源代码网上是下载不到的&#xff0c;…

Leetcode.2397 被列覆盖的最多行数

题目链接 Leetcode.2397 被列覆盖的最多行数 Rating &#xff1a; 1719 题目描述 给你一个下标从 0 开始的 m x n二进制矩阵 mat和一个整数 cols&#xff0c;表示你需要选出的列数。 如果一行中&#xff0c;所有的 1 都被你选中的列所覆盖&#xff0c;那么我们称这一行 被覆盖…

RabbitMQ的使用以及整合到SpringBoot中

RabbitMQ的使用以及整合到SpringBoot中 一、比较&#xff1a; (1)、传统请求服务器&#xff1a; (2)、通过MQ去操作数据库&#xff1a; 通过MQ去操作数据库&#xff0c;从而达到削峰的效果&#xff1b; 问题现象&#xff1a; (1)、海量数据&#xff1b; (2)、高并发&#…

Python如何获取弹幕?给你介绍两种方式

前言 弹幕可以给观众一种“实时互动”的错觉&#xff0c;虽然不同弹幕的发送时间有所区别&#xff0c;但是其只会在视频中特定的一个时间点出现&#xff0c;因此在相同时刻发送的弹幕基本上也具有相同的主题&#xff0c;在参与评论时就会有与其他观众同时评论的错觉。 在国内…

【SQLAlchemy】第二篇——连接失效及连接池

一、背景 为了节约资源&#xff0c;MySQL会对建立的连接进行监控&#xff0c;当某些连接处于不活跃状态的时间超过一个阈值时&#xff0c;则关闭它们。 用户可以执行show variables like %wait_timeout%;来查看这个阈值&#xff1a; 可以看到&#xff0c;在默认的情况下&…

Multi-modal Graph Contrastive Learning for Micro-video Recommendation

模型总览如下&#xff1a; 解决问题&#xff1a;同种重要性对待每种模态&#xff0c;可能使得得到的特征表示次优&#xff0c;例如过度强调学习到的表示中的特定模态。以MMGCN为例&#xff0c;下图为MMGCN模型总览。 如上图所示MMGCN在每种模态上构建用户-物品二部图&#xff0…

【云原生】Gateway网关选型

网关一般分为流量网关和业务网关&#xff0c;流量网关负责接入所有的流量&#xff0c;并分发给不同的子系统&#xff0c;那在具体的业务接入之前&#xff0c;还有一层业务网关。流量网关提供全局性的、与后端业务应用无关的策略&#xff0c;例如 HTTPS证书卸载、Web防火墙、全局…

[vue]vue3.x 组合式API不同写法

[vue]vue3.x 组合式API不同写法改进后组合API实际实际使用中的疑问组件名称问题两种写法的优缺点对比优点缺点组合式API&#xff0c;采用了更加灵活的方式,官网推荐的语法糖&#xff0c;但仅限于比较简单的单文件&#xff0c;作为尝试 改进后组合API实际实际使用中的疑问 改进…

4-2 Linux进程和内存概念

文章目录前言进程状态进程优先级内存模型进程内存关系前言 进程是一个其中运行着一个或多个线程的地址空间和这些线程所需要的系统资源。一般来说&#xff0c;Linux系统会在进程之间共享程序代码和系统函数库&#xff0c;所以在任何时刻内存中都只有代码的一份拷贝。 进程状态…

36_2 On Chip Bus —— AXI总线介绍

目录 1.AXI总线介绍&#xff08;读2写3&#xff09; 1.1流量控制 1.2 AXI signals 信号线 1.3重点信号线的介绍 1.4原子操作——让读改写一套操作 永远是一个master对一个slave 1.5AXI BURST Boundary——一个burst不能跨4k boundary&#xff0c;master要保证 1.6读/写通…

k8s中的PV和PVS

前言&#xff1a;容器磁盘上的文件的生命周期是短暂的&#xff0c;这就使得在容器中运行重要应用时会出现一些问题。首先&#xff0c;当容器崩溃时&#xff0c;kubelet 会重启它&#xff0c;但是容器中的文件将丢失——容器以干净的状态&#xff08;镜像最初的状态&#xff09;…

Python 算法交易实验51 Step2 Signals 信号生成

说明 不可不读书 先从经典的一些超简单信号开始 使用移动平均指标SMA(算术&#xff09; 给出了信号的产生方法&#xff0c;还有一些测算结果&#xff0c;反正看起来都是盈利的 首先使用离线方法实验一组结果&#xff0c;然后就使用ADBS来进行类似的处理。 内容 1 原理分析…

【python中的列表和元组】

文章目录前言一、列表及其使用1.列表的特点2. 列表的使用方法二、元组及其特点1.元组的类型是tuple1.元组的查找操作2. 计算元组某个元素出现的次数3.统计元组内元素的个数总结前言 本文着重介绍python中的列表和元组以及列表和元组之间的区别 一、列表及其使用 1.列表的特点…

JavaSE学习进阶day2_02 抽象类和接口

第四章 抽象类 4.1 概述 4.1.1 抽象类引入 先看一张图&#xff1a; 这张图时之前学习继承时用的&#xff0c;但是现在有一个疑问&#xff0c;吃饭这个行为猫和狗都有&#xff0c;但是它们吃的东西却又不同&#xff0c;这个时候我们不能确定父类吃饭这个方法到底该写什么&…

数据库分库分表策略

一、MySQL扩展具体的实现方式 随着业务规模的不断扩大&#xff0c;需要选择合适的方案去应对数据规模的增长&#xff0c;以应对逐渐增长的访问压力和数据量。 关于数据库的扩展主要包括&#xff1a;业务拆分、主从复制&#xff0c;数据库分库与分表。这篇文章主要讲述数据库分库…