Для получения такой таблички понадобится создать два Представления в базе zabbix в postgresql.
- Суммируем место на дисках
- Формируем сводную табличку
- Дополнительно можно создать страничку на php
Требования к системе:
Проверено для zabbix = 2.0.6 и postgresql = 9.2.4. Для корректной работы понадобится подключить расширение tablefunc и plpgsql в postgresql.
Пример как будет выглядеть страничка на php:
Для создания представлений удобно использовать pgadmin3.
Представление 1 (суммируем место на дисках):
-- View: zabbixhdd -- DROP VIEW zabbixhdd; CREATE OR REPLACE VIEW zabbixhdd AS SELECT i.hostid, SUM(i.lastvalue::BIGINT) AS disk_total_size FROM items i JOIN hosts h ON h.hostid = i.hostid WHERE i.key_::text ~ 'vfs.fs.size\[.*,total\]'::text AND i.key_::text !~ 'vfs.fs.size\[.#FSNAME.,total\]'::text AND h.status <> 3 GROUP BY i.hostid ORDER BY i.hostid; ALTER TABLE zabbixhdd OWNER TO zabbix;
Представление 2 (формируем сводную табличку):
-- View: zabbixcpuram -- DROP VIEW zabbixcpuram; CREATE OR REPLACE VIEW zabbixcpuram AS SELECT tbl.vm_name, tbl.vm_dns, tbl.vm_ip, tbl.disk_size_total, tbl.cpu_num, tbl.memory_size_total FROM crosstab('SELECT h.name, if.dns, if.ip, hd.disk_total_size, i.key_, i.lastvalue FROM items i JOIN interface if ON if.hostid = i.hostid JOIN hosts h ON h.hostid = i.hostid JOIN zabbixhdd hd ON hd.hostid = i.hostid WHERE i.key_ IN (''system.cpu.num'', ''vm.memory.size[total]'') AND h.status != ''3'' ORDER BY 1'::text, 'SELECT DISTINCT i.key_ FROM items i WHERE i.key_ IN (''system.cpu.num'', ''vm.memory.size[total]'') ORDER BY 1'::text) tbl(vm_name text, vm_dns text, vm_ip text, disk_size_total BIGINT, cpu_num INTEGER, memory_size_total BIGINT); ALTER TABLE zabbixcpuram OWNER TO zabbix;
Страничка на php:
<?php header('Content-Type: text/html; charset=utf-8'); session_start(); echo "<style type='text/css'> body {font:10pt Arial,Helvetica,sans-serif; color:black; background:White;} p {font:10pt Arial,Helvetica,sans-serif; color:black; background:White;} form {padding:1em 0px 0px 0px;} table.up, .up tr, .up td {border: 0px; clear:left;} table.left {float:left; margin-right:5em;} table {border-collapse: collapse;} table, tr, td {font:10pt Arial,Helvetica,sans-serif; color:Black; background:#f7f7e7; padding:0px 0px 0px 0px; margin:0px 0px 0px 0px; border:1px solid;} th {font:bold 10pt Arial,Helvetica,sans-serif; color:#336699; background:#cccc99; padding:0px 0px 0px 0px; border:1px solid;} h1 {font:16pt Arial,Helvetica,Geneva,sans-serif; color:#336699; background-color:White; border-bottom:1px solid #cccc99; margin-top:0pt; margin-bottom:0pt; padding:0px 0px 0px 0px;-} h2 {font:bold 10pt Arial,Helvetica,Geneva,sans-serif; color:#336699; background-color:White; margin-top:4pt; margin-bottom:0pt;} a {font:9pt Arial,Helvetica,sans-serif; color:#663300; background:#ffffff; margin-top:0pt; margin-bottom:0pt; vertical-align:top;} tr.gre td {background:#E8E8E8 ;} tr td.red {background:Red;} tr td.wrn {background:#FFCC66;} tr td.grn {background:#99FF66;} </style> <title>PGSQL Report</title>\n"; $con = pg_connect("host=localhost port=5432 dbname=zabbix user=zabbix password=*******") or die("Could not connect" . pg_last_error()); $result = pg_query("SELECT vm_name, vm_dns, vm_ip, disk_size_total, cpu_num, memory_size_total FROM zabbixcpuram;"); echo "<table class=\"left\"> <tr> <th colspan=8>Сейчас используются</th> </tr> <tr> <th>Name</th> <th>DNS name</th> <th>IP</th> <th>Total HDD<br/>GB</th> <th>CPU cores<br/>Num</th> <th>Total RAM<br/>MB</th> </tr>"; $i = 0; $j = 1; $ips = array(); while($row = pg_fetch_array($result)) { $i++; if ($i & 1) { echo "<tr>\n"; } else { echo "<tr class=\"gre\">\n"; } echo "<td>" . $row['vm_name'] . "</td>\n"; echo "<td>" . $row['vm_dns'] . "</td>\n"; $ip = preg_replace('/\.[0-9]{1,3}$/', '.*', $row['vm_ip']); if ($ips[$j-1] != $ip) { $ips[$j] = $ip; $j++; } echo "<td>" . $row['vm_ip'] . "</td>\n"; echo "<td align=right>" . round($row['disk_size_total']/1024/1024/1024, 0, PHP_ROUND_HALF_UP) . "</td>\n"; echo "<td align=right>" . $row['cpu_num'] . "</td>\n"; echo "<td align=right>" . round($row['memory_size_total']/1024/1024, 0, PHP_ROUND_HALF_UP) . "</td>\n"; echo "</tr>\n"; } echo "</table>"; echo "<p>Всего записей: $i</p>"; $i=1; echo "<table> <tr> <th>Занятые диапазоны IP</th> </tr>"; while ($i <= $j) { if ($i & 1) { echo "<tr>\n"; } else { echo "<tr class=\"gre\">\n"; } print "<td>" . $ips[$i] . "</td>\n"; echo "</tr>\n"; $i++; } echo "</table>"; pg_close($con); ?>