root / plugins / other / jvm_sun_minorgcs @ 8f0e3e45
Historique | Voir | Annoter | Télécharger (3,58 ko)
| 1 | 8ef126f4 | Various | #!/usr/bin/perl -w |
|---|---|---|---|
| 2 | |||
| 3 | # Sun JVM minor GC statistics. Parses a verbose log of minor GC |
||
| 4 | # stats. Reads the log file and sums time in seconds spent on GC and |
||
| 5 | # number of times it is performed. These numbers are saved in a state |
||
| 6 | # file. The next time the plugin is run it only reads from the point |
||
| 7 | # it quit the last time and increases the sums based on the lines |
||
| 8 | # found in the last portion of the log. Thus we obtain counters. The |
||
| 9 | # counters are reset when the log is rotated. |
||
| 10 | |||
| 11 | # The two numbers are graphed in _one_ graph. Where it has been used |
||
| 12 | # until now these two numbers have been in the same order of |
||
| 13 | # magnitude. |
||
| 14 | |||
| 15 | # Configuration (common with the other sun_jvm_* plugins in this family): |
||
| 16 | # [jvm_sun_*] |
||
| 17 | # env.logfile /var/foo/java.log (default: /var/log/munin/java.log) |
||
| 18 | # env.graphtitle (default: "Sun Java") |
||
| 19 | # env.grname (default: "sun-jvm". Used for state file-name) |
||
| 20 | |||
| 21 | # You need to configure your Sun JVM with these options: |
||
| 22 | # -verbose:gc |
||
| 23 | # -Xloggc:/var/log/app/jvm/gc.log |
||
| 24 | # -XX:+PrintGCTimeStamps |
||
| 25 | # -XX:+PrintGCDetails |
||
| 26 | |||
| 27 | # History: |
||
| 28 | |||
| 29 | # This plugin was developed by various people over some time - no logs |
||
| 30 | # of this has been found. - In 2006 significant contributions was |
||
| 31 | # financed by NRK (Norwegian Broadcasting Coproration) and performed |
||
| 32 | # by Nicolai Langfeldt of Linpro AS in Oslo, Norway. |
||
| 33 | |||
| 34 | # $Id: $ |
||
| 35 | |||
| 36 | use strict; |
||
| 37 | |||
| 38 | my $logfile = $ENV{logfile} || "/var/log/app/jvm/gc.log";
|
||
| 39 | my $grtitle = $ENV{graphtitle} || 'Sun Java';
|
||
| 40 | my $grname = $ENV{graphtitle} || 'sun-jvm';
|
||
| 41 | |||
| 42 | my $statefile = "/var/lib/munin/plugin-state/plugin-java_sun_${grname}_minorgcs.state";
|
||
| 43 | my $pos = 0; |
||
| 44 | my $count = 0; |
||
| 45 | my $seconds = 0; |
||
| 46 | my $startsize; |
||
| 47 | my $timespent; |
||
| 48 | my $totaltimespent=0; |
||
| 49 | |||
| 50 | if ( $ARGV[0] and $ARGV[0] eq "config" ) {
|
||
| 51 | print "graph_title $grtitle minor GCs pr minute\n"; |
||
| 52 | print "graph_args --base 1000 -l 0 --rigid\n"; |
||
| 53 | print "graph_scale no\n"; |
||
| 54 | print "graph_category Java\n"; |
||
| 55 | print "graph_period minute\n"; |
||
| 56 | print "gcs.label Number of GCs\n"; |
||
| 57 | print "gcs.type DERIVE\n"; |
||
| 58 | print "gcs.min 0\n"; |
||
| 59 | print "time.label Seconds spent on GC\n"; |
||
| 60 | print "time.type DERIVE\n"; |
||
| 61 | print "time.min 0\n"; |
||
| 62 | exit 0; |
||
| 63 | } |
||
| 64 | |||
| 65 | if (-l $statefile) {
|
||
| 66 | die("$statefile is a symbolic link, refusing to touch it.");
|
||
| 67 | } |
||
| 68 | |||
| 69 | if (! -f $logfile) {
|
||
| 70 | print "gcs.value U\n"; |
||
| 71 | print "time.value U\n"; |
||
| 72 | exit 0; |
||
| 73 | } |
||
| 74 | |||
| 75 | if (-f "$statefile") {
|
||
| 76 | open (IN, "$statefile") or exit 4; |
||
| 77 | ($pos,$count,$timespent) = split(/:/,<IN>); |
||
| 78 | close IN; |
||
| 79 | } |
||
| 80 | |||
| 81 | $startsize = (stat $logfile)[7]; |
||
| 82 | |||
| 83 | if ($startsize < $pos) {
|
||
| 84 | # Log rotated |
||
| 85 | $pos = 0; |
||
| 86 | } |
||
| 87 | |||
| 88 | ($pos, $count, $timespent) = parseFile ($logfile, $pos, $count, $timespent); |
||
| 89 | |||
| 90 | print "gcs.value $count\n"; |
||
| 91 | print "time.value ",int($timespent),"\n"; |
||
| 92 | |||
| 93 | open (OUT, ">$statefile") or die "Could not open $statefile for reading: $!\n"; |
||
| 94 | print OUT "$pos:$count:$timespent\n"; |
||
| 95 | close OUT; |
||
| 96 | |||
| 97 | sub parseFile {
|
||
| 98 | my ($fname, $start, $count, $timespent) = @_; |
||
| 99 | my @secs; |
||
| 100 | |||
| 101 | open (LOGFILE, $fname) or die "Could not open $fname: $!\n"; |
||
| 102 | |||
| 103 | # Stat filehandle after open - avoids race with logrotater or |
||
| 104 | # restart or whatever. |
||
| 105 | |||
| 106 | my $stop = $startsize = (stat LOGFILE)[7]; |
||
| 107 | |||
| 108 | if ($startsize < $start) {
|
||
| 109 | # Log rotated |
||
| 110 | $start = 0; |
||
| 111 | } |
||
| 112 | |||
| 113 | seek (LOGFILE, $start, 0) or |
||
| 114 | die "Could not seek to $start in $fname: $!\n"; |
||
| 115 | |||
| 116 | while (tell (LOGFILE) < $stop) {
|
||
| 117 | my $line =<LOGFILE>; |
||
| 118 | chomp ($line); |
||
| 119 | |||
| 120 | # Log format: 35.037: [GC 35.038: [DefNew: 166209K->11364K(174080K), 0.2106410 secs] 175274K->26037K(1721472K), 0.2107680 secs] |
||
| 121 | if ($line =~ /\[GC.+ (\d+\.\d+) secs\]/) {
|
||
| 122 | $count++; |
||
| 123 | $timespent += $1; |
||
| 124 | } |
||
| 125 | } |
||
| 126 | close(LOGFILE); |
||
| 127 | return($stop,$count,$timespent); |
||
| 128 | } |
||
| 129 | |||
| 130 | # vim:syntax=perl |
