Выводим характеристики узлов (имя, IP, диск, процессор, память) из базы zabbix на postgresql

Для получения такой таблички понадобится создать два Представления в базе zabbix в postgresql.

  1. Суммируем место на дисках
  2. Формируем сводную табличку
  3. Дополнительно можно создать страничку на php

Требования к системе:

Проверено для zabbix = 2.0.6 и postgresql = 9.2.4. Для корректной работы понадобится подключить расширение tablefunc и plpgsql в postgresql.

Пример как будет выглядеть страничка на php:

Характеристики узлов (имя, IP, диск, процессор, память) из базы zabbix на postgresql

Для создания представлений удобно использовать 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);
 
?>

Комментарии закрыты.