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

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

前言

关键基础设施的四环图,是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,CURLOPT

S

SL

V

ERIFYPEER,true);curl

s

etopt(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

相关文章
|
18天前
|
算法
数据结构和算法学习记录——线性表之双向链表(上)-结点类型定义、初始化函数、创建新结点函数、尾插函数、打印函数、尾删函数
数据结构和算法学习记录——线性表之双向链表(上)-结点类型定义、初始化函数、创建新结点函数、尾插函数、打印函数、尾删函数
19 0
|
13天前
|
机器学习/深度学习 存储 算法
PHP中的数据结构及其在机器学习中的应用
本文探讨了PHP在机器学习中的作用,强调了数据结构的重要性。文中列举了PHP中的常见数据结构,如数组、对象、字典、链表、树和图,并解释了它们在机器学习场景下的应用。例如,数组用于特征向量,对象封装模型,字典存储特征映射,链表和树实现特定算法。通过示例代码展示了如何使用这些数据结构进行特征标准化和模型预测。文章总结指出,PHP的数据结构为机器学习提供了有效工具,随着技术发展,PHP在数据处理领域的应用将持续扩展。
21 4
|
13天前
|
存储 数据可视化 前端开发
PHP中的数据结构可视化:深入探索与实现
本文探讨了PHP中数据结构可视化的价值,强调其在理解、调试和优化代码中的作用。文中列举了数据结构如数组、栈、队列等,并介绍了三种可视化方法:使用第三方库、自定义渲染函数和集成前端工具。通过示例展示了如何使用PHP的GD库和自定义函数可视化二叉树。最后,指出数据结构可视化并非总是适用,但结合前端技术可实现更高效解决方案,并鼓励开发者充分利用此工具提升项目性能。
23 3
|
18天前
数据结构学习记录——判断是否为同一颗二叉搜索树(题意理解、求解思路、程序搭建框架、具体函数的实现)
数据结构学习记录——判断是否为同一颗二叉搜索树(题意理解、求解思路、程序搭建框架、具体函数的实现)
12 2
|
12天前
|
Web App开发 API PHP
PHP封装的不错的一个Curl方法
This is a PHP function named `teacher_curl` that wraps around the cURL library for making HTTP requests. The function initializes a cURL session, sets various options such as disabling SSL verification, sets headers, handles POST data
16 0
|
18天前
|
存储 算法
数据结构学习记录——集合及运算(集合的表示、并查集、树结构表示集合、集合运算、查找函数、并运算)
数据结构学习记录——集合及运算(集合的表示、并查集、树结构表示集合、集合运算、查找函数、并运算)
8 0
|
18天前
|
算法
数据结构和算法学习记录——初识二叉树(定义、五种基本形态、几种特殊的二叉树、二叉树的重要性质、初识基本操作函数)
数据结构和算法学习记录——初识二叉树(定义、五种基本形态、几种特殊的二叉树、二叉树的重要性质、初识基本操作函数)
9 0
|
18天前
|
存储 算法
数据结构和算法学习记录——特殊线性表之队列-队列的概念、队列结构体类型定义 、基本接口函数、初始化函数、销毁队列函数、入队列函数、判断队列是否为空、出队列函数、读取队头队尾的数据 、计算队列数据个数
数据结构和算法学习记录——特殊线性表之队列-队列的概念、队列结构体类型定义 、基本接口函数、初始化函数、销毁队列函数、入队列函数、判断队列是否为空、出队列函数、读取队头队尾的数据 、计算队列数据个数
13 0
|
18天前
|
算法 C语言
数据结构和算法学习记录——特殊线性表之栈(下)-销毁栈函数、判断栈是否为空、压栈函数、出栈函数、取栈顶元素、计算栈中有多少个元素、栈有关习题-有效的括号
数据结构和算法学习记录——特殊线性表之栈(下)-销毁栈函数、判断栈是否为空、压栈函数、出栈函数、取栈顶元素、计算栈中有多少个元素、栈有关习题-有效的括号
14 0
|
18天前
|
算法
数据结构和算法学习记录——特殊线性表之栈(上)-栈的概念、栈的结构、链式栈数组栈、栈的结构体定义、栈的基本接口函数、栈顶初始化函数
数据结构和算法学习记录——特殊线性表之栈(上)-栈的概念、栈的结构、链式栈数组栈、栈的结构体定义、栈的基本接口函数、栈顶初始化函数
9 0

推荐镜像

更多