読者です 読者をやめる 読者になる 読者になる

zabbix_get使ってzabtop作ってみた

Zabbixには動作確認用にzabbix_getってコマンドがついてて、これを使うとCLIで監視してる値が取れちゃいます。

$ zabbix_get -stest-web01 -k"system.cpu.load[,avg5]"
1.460000

けっこうサクサク動くので試しに複数サーバの状態をリアルタイム表示するコマンドを作ってみました

$ ./zabtop test-web0{1,2} test-db0{1,2}
HOSTNAME   Load(1/5/15)      Memory  Swap     us  sy  id  wa
test-web01 1.09/1.12/1.22    10.0%   0.0%     19   2  79   0
test-web02 1.78/1.18/1.08    10.3%   0.0%     19   2  73   0
test-db01  0.11/0.18/0.17    92.0%   0.0%      2   0  95   0
test-db02  0.29/0.16/0.10    91.6%   0.0%      2   0  96   0

使えるかも!!!

ソースコード

やっつけ版です!
取得できる項目はZabbix設定によると思います。

#!/usr/bin/perl
use strict;
use warnings;

my @hosts = @ARGV or die;
my $len = (sort {$a<=>$b} map {length} @hosts)[$#hosts];
my $sleep = 10;

my %keys = (
  la1        => "system.cpu.load[,avg1]",
  la5        => "system.cpu.load[,avg5]",
  la15       => "system.cpu.load[,avg15]",
  mem_avail  => "vm.memory.size[available]",
  mem_total  => "vm.memory.size[total]",
  swap_pused => "system.swap.size[,pused]",
  cpu_us     => "system.cpu.util[,user,]",
  cpu_sy     => "system.cpu.util[,system,]",
  cpu_id     => "system.cpu.util[,idle,]",
  cpu_wa     => "system.cpu.util[,iowait,]",
);

while(1){
  my @out;
  push @out, "\033[0;0H";
  push @out, "\033[2J";
  push @out, "HOSTNAME".(" "x($len-7))."Load(1/5/15)  \tMemory\tSwap\t us  sy  id  wa\n";

  for my $host (@hosts){

    my %vals;
    for my $name (keys %keys){
      my $val = `zabbix_get -s$host -k$keys{$name}`;
      chomp $val;
      $vals{$name} = $val;
    }
    my $line = sprintf "%-".$len."s %.2f/%.2f/%.2f\t%3.1f%%\t%3.1f%%\t%3d %3d %3d %3d\n",
                $host, @vals{"la1","la5","la15"},
                (1-$vals{mem_avail}/$vals{mem_total})*100, $vals{swap_pused},
                @vals{"cpu_us","cpu_sy","cpu_id","cpu_wa"};
    push @out, $line;
  }
  print for @out;
  sleep $sleep;
}