Scripts to automating daily tasks http://gitea.open6hosting.com/Open6Hosting/smartos-bin
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

237 lines
5.4 KiB

  1. #!/usr/bin/perl
  2. use strict;
  3. use IO::Socket;
  4. use Data::Dumper;
  5. my $graphitehost = "graphite.open6hosting.com";
  6. my $port = "2003";
  7. my $hostname = "o6hsmartos16";
  8. my $grupo = "joyent";
  9. my %ipmistatus = (
  10. "CPU_Temp" => "cpu_temp",
  11. "CPU_Temperature" => "cpu_temp",
  12. "CPU1_Temperature" => "cpu_temp",
  13. "+12V_" => "12v",
  14. "12V" => "12v",
  15. "12V_" => "12v",
  16. "CPU_FAN1" => "cpu_fan1",
  17. "CPU_FAN1_" => "cpu_fan1",
  18. "FAN1" => "cpu_fan1",
  19. "FAN1_" => "cpu_fan1",
  20. );
  21. my %mdbstatus = (
  22. "Kernel_" => "kernel",
  23. "Boot_pages" => "boot_pages",
  24. "ZFS_File_Data_" => "zfs_file",
  25. "Anon_" => "anon",
  26. "Exec_and_libs_" => "exec_and_libs",
  27. "Page_cache" => "page_cache",
  28. "Free_(cachelist)" => "free_cachelist",
  29. "Free_(freelist)" => "free_freelist",
  30. );
  31. # create Socket
  32. my $socket = IO::Socket::INET -> new
  33. (
  34. PeerAddr => $graphitehost,
  35. PeerPort => $port,
  36. Proto => "tcp",
  37. Type => SOCK_STREAM
  38. ) or die "Couldn't connect to $graphitehost:$port: $@ \n";
  39. # enviaremos algo asi
  40. # print $socket "$grupo.$hostname.vfsstat.read_s $estructura{read_s} $time\n";
  41. sub enviadatos ($$$$)
  42. {
  43. my $hash = shift;
  44. my $socket = shift;
  45. my $tabla = shift;
  46. my $tiempo = shift;
  47. while ( my ( $keys, $values ) = each %{$hash} )
  48. {
  49. print $socket "$grupo.$hostname.$tabla.$keys ${$hash}{$keys} $tiempo\n";
  50. }
  51. }
  52. ########
  53. #
  54. # iostat
  55. #
  56. ########
  57. # numero de dispositivos
  58. my $devices = `zpool list -v | grep -c "c[0-9]*" | tr -d '\n'`;
  59. # r/s w/s kr/s kw/s read_t write_t
  60. # iostat -xzr 10 2
  61. # device,r/s,w/s,kr/s,kw/s,wait,actv,svc_t,%w,%b
  62. # sd1,27.9,0.0,111.5,0.0,0.0,0.7,24.6,0,45
  63. my $captura = `iostat -xr 15 2 | awk -F, '\$1 ~ /^sd[0-8]|blkdev/ { print \$1,\$2,\$3,\$4,\$5,\$7,\$8,\$9,\$10 }' | tail -n$devices`;
  64. my @fields = split(" ", $captura);
  65. my @wcfields = @fields;
  66. my %estructura;
  67. my $disco;
  68. foreach (@fields)
  69. {
  70. if ( $_ =~ /^sd[0-9]|blkdev[0-9]/ )
  71. {
  72. $disco = $_;
  73. shift @wcfields;
  74. $estructura{$disco}{r_s} = shift @wcfields;
  75. $estructura{$disco}{w_s} = shift @wcfields;
  76. $estructura{$disco}{kr_s} = shift @wcfields;
  77. $estructura{$disco}{kw_s} = shift @wcfields;
  78. if ( $estructura{$disco}{kr_s} > 0 && $estructura{$disco}{r_s} > 0 )
  79. {
  80. $estructura{$disco}{ars} = $estructura{$disco}{kr_s} / $estructura{$disco}{r_s};
  81. }
  82. if ( $estructura{$disco}{kw_s} > 0 && $estructura{$disco}{w_s} > 0 )
  83. {
  84. $estructura{$disco}{awrs} = $estructura{$disco}{kw_s} / $estructura{$disco}{w_s};
  85. }
  86. $estructura{$disco}{actv} = shift @wcfields;
  87. $estructura{$disco}{svc_t} = shift @wcfields;
  88. $estructura{$disco}{w} = shift @wcfields;
  89. $estructura{$disco}{b} = shift @wcfields;
  90. }
  91. }
  92. my $time = time();
  93. foreach $disco (keys %estructura)
  94. {
  95. &enviadatos (\%{ $estructura{$disco} }, $socket, "iostat.$disco", $time);
  96. }
  97. ########
  98. #
  99. # ziostat
  100. #
  101. ########
  102. # numero de zonas
  103. my $zonas = `vmadm list -H state=running | wc -l | tr -d '\n'`;
  104. $captura = `ziostat -Z -r 15 2 | awk -F, '\$1 ~ /^[0-9]/ { print \$7,\$1,\$2,\$3,\$4,\$5,\$6 }' | tail -n$zonas`;
  105. @fields = split(" ", $captura);
  106. @wcfields = @fields;
  107. my %ziostat;
  108. my $uuid;
  109. foreach (@fields)
  110. {
  111. if ( $_ =~ /.*[a-z].*/ )
  112. {
  113. $uuid = $_;
  114. shift @wcfields;
  115. $ziostat{$uuid}{r_s} = shift @wcfields;
  116. $ziostat{$uuid}{kr_s} = shift @wcfields;
  117. $ziostat{$uuid}{actv} = shift @wcfields;
  118. $ziostat{$uuid}{wsvc_t} = shift @wcfields;
  119. $ziostat{$uuid}{asvc_t} = shift @wcfields;
  120. $ziostat{$uuid}{b} = shift @wcfields;
  121. }
  122. }
  123. $time = time();
  124. foreach $uuid (keys %ziostat)
  125. {
  126. &enviadatos (\%{ $ziostat{$uuid} }, $socket, "ziostat.$uuid", $time);
  127. }
  128. ########
  129. #
  130. # zonememstat
  131. #
  132. ########
  133. my $memcommand = `zonememstat -H | awk '{ print \$1,\$2,\$4,\$5,\$6 }'`;
  134. my %zonememstat;
  135. my @memfields = split(" ", $memcommand);
  136. my @wcmemfields = @memfields;
  137. my $memuuid;
  138. foreach (@memfields)
  139. {
  140. if ( $_ =~ /^([a-z0-9]{8}-|global)/ ) {
  141. $memuuid = $_;
  142. shift @wcmemfields;
  143. $zonememstat{$memuuid}{rss} = shift @wcmemfields;
  144. $zonememstat{$memuuid}{nover} = shift @wcmemfields;
  145. $zonememstat{$memuuid}{pout} = shift @wcmemfields;
  146. $zonememstat{$memuuid}{swap} = shift @wcmemfields;
  147. }
  148. }
  149. my $memtime = time();
  150. foreach my $uuid (keys %zonememstat)
  151. {
  152. &enviadatos ( \%{ $zonememstat{$uuid} }, $socket, "zonememstat.$uuid", $memtime );
  153. }
  154. ########
  155. #
  156. # cerramos el descriptor
  157. #
  158. ########
  159. shutdown($socket,2);
  160. ########
  161. #
  162. # collect IPMI sensors
  163. #
  164. ########
  165. my $ipmicommand = "ipmitool sdr list | sed 's/|//g' | sed 's/ /_/' | awk '\$1 ~ /CPU_Temp/ || \$1 ~ /CPU1_Temp/ || \$1 ~ /CPU_FAN1/ || \$1 ~ /^FAN1/ || \$1 ~ /12V/ { print \$1,\$2 }'";
  166. open(IPMI, "$ipmicommand |") or die("Could not execute '$ipmicommand': $!");
  167. while (<IPMI>) {
  168. my ($k, $v) = (m/([\+\w\d]*).*?(\d+(?:\.\d+)?)/);
  169. next unless ($k);
  170. if (exists $ipmistatus{$k} ) {
  171. system("echo -n '$grupo.$hostname.ipmi.$ipmistatus{$k} $v $time' | nc -w 0 $graphitehost $port");
  172. }
  173. }
  174. close (IPMI);
  175. ########
  176. #
  177. # collect memstat mdb data
  178. #
  179. ########
  180. my $mdbcommand = "mdb -ke '::memstat' | sed 's/ZFS File Data/ZFS_File_Data/' | sed 's/Exec and libs/Exec_and_libs/' | sed 's/ /_/' | awk '{ print \$1,\$3 }'";
  181. open(MEMSTAT, "$mdbcommand |") or die("Could not execute '$mdbcommand': $!");
  182. while (<MEMSTAT>) {
  183. my ($k, $v) = (m/([\w_()]+)\s+?(\d+)?/);
  184. next unless ($k);
  185. if (exists $mdbstatus{$k} ) {
  186. system("echo '$grupo.$hostname.memstat.$mdbstatus{$k} $v $time' | nc -w 0 $graphitehost $port");
  187. }
  188. }
  189. close (MEMSTAT);