zabbix 如何在problem视图新增一列

来源:互联网 发布:mac win系统截图快捷键 编辑:程序博客网 时间:2024/06/07 01:56

zabbix在problem需要加一列显示群组

因为运维将原先的zabbix3.2版本升级为3.4.4,所以在代码上有所更改,原先页面显示可以直接在blocs.inc.php类中更改(小强离职前改的,虽然我也没太看懂),升级后,view类目下新增了许多类,分别用于控制不同类型的视图显示,因此需要找到problem类,在生成图表的方法中加入群组那一列

这里只是用到了 app/view/monitoring.widget.problems.view.php 类

控制图表列数及列名的代码

$table = (new CTableInfo())    ->setHeader(array_merge($header, [        $show_recovery_data ? _('Recovery time') : null, //时间        $show_recovery_data ? _('Status') : null, //        _('Info'), //信息        ($data['sortfield'] === 'host') ? [_('Host'), $sort_div] : _('Host'), //主机        [            ($data['sortfield'] === 'problem') ? [_('Problem'), $sort_div] : _('Problem'), //问题            ' • ',            ($data['sortfield'] === 'priority') ? [_('Severity'), $sort_div] : _('Severity') //严重性        ],        _('Duration'), //持续时间        $data['config']['event_ack_enable'] ? _('Ack') : null, //确认        _('Actions'), //动作        $data['fields']['show_tags'] ? _('Tags') : null //    ]));

CTableInfo是一个创建表格视图的类,它继承CTable.php,在zabbix中多次用到这个类,包括主机列表(hosts)、触发器列表(trigger)等,这里并不是主要介绍这个类,只要知道它是用来创建表格的类就行。在创建这一个表格对象的同时,调用了setHeader()方法(在它的父类CTable.php中),需要给这个方法传入一个表头数组,CTable就会根据传入的数组内容建表,列顺序与数组顺序相同,如默认代码,显示表头如下:

时间 信息 主机(ip) 问题·严重性 持续时间 确认 动作 标签

无群组problem视图
现在就是需要再这个头部加一个 【群组】列,能够更快的判断报警信息是来自于哪个项目组,及时反馈并解决问题,减少处理流程的响应时间
所以直接在传入的数组中,加一个项group即可
如下所示

_('Info'), //信息_('Group'), //加一个群组($data['sortfield'] === 'host') ? [_('Host'), $sort_div] : _('Host'), //主机

我是选择在主机前加入群组列,这样可以和ip信息相对应,但这里仅仅是在表头添加了一列,在生成图表时候,是没有这一列数据,所以需要查询群组数据,并将其插入相对应的位置。
从前面的代码可以看到,$trigger变量是具有hostid值,这样就可以根据hostid值查询群组数据,

    $hostid = $trigger['hosts'][0]['hostid'];    $groups = API::HostGroup()->get([        'output' => ['groupid', 'name'],        'groupids' => null,        'hostids' => $hostid,        'monitored_hosts' => true,        'preservekeys' => true    ]);    $group = array_shift($groups);    $group = new CCol($group['name']);

这里用到zabbix的api框架(工厂模式),通过api.php 的getApiService()方法,生成一个hostGroup实例(对应的就是groups表),调用该实例的get方法,能够根据hostid查询对应的群组信息。
zabbix查询方法很有意思,这里不做过多的解读,有空说一说,
同时通过 CCol类创建一个数据列,将group数据放入该列中,最后table的addRow方法把所有列数据,与表头列名一一对应,就可以在problem视图中新增一个group字段。

$table->addRow(array_merge($row, [        $show_recovery_data ? $cell_r_clock : null,        $show_recovery_data ? $cell_status : null,        makeInformationList($info_icons),        $group,        $triggers_hosts[$trigger['triggerid']],        $description,        (new CCol(            ($problem['r_eventid'] != 0)                ? zbx_date2age($problem['clock'], $problem['r_clock'])                : zbx_date2age($problem['clock'])        ))            ->addClass(ZBX_STYLE_NOWRAP),        $data['config']['event_ack_enable'] ? $acknowledges[$problem['eventid']] : null,        array_key_exists($eventid, $actions)            ? (new CCol($actions[$eventid]))->addClass(ZBX_STYLE_NOWRAP)            : '',        $data['fields']['show_tags'] ? $data['data']['tags'][$problem['eventid']] : null    ]));
时间 信息 群组 主机(ip) 问题·严重性 持续时间 确认 动作 标签

新增群组后problem视图