added TAGS=dc=ffzg
[atop-influxdb] / atop2influx.pl
1 #!/usr/bin/perl
2 use warnings;
3 use strict;
4 use Time::Local;
5
6 use Data::Dump;
7 sub XXX { warn Data::Dump::dump( @_ ) };
8
9 my $measurement = 'debug';
10 my $host;
11 my $yyyymmdd;
12
13 my ($dd,$mm,$yyyy);
14 my ($hour,$min,$sec)=(0,0,0);
15 my @cols;
16 my $time;
17 sub update_time {
18         #warn "# time $yyyy-$mm-$dd $hour:$min:$sec $time\n";
19         $time = timelocal($sec,$min,$hour,$dd,$mm-1,$yyyy) * 1000_000_000;
20         return $time;
21 }
22
23 my $tags = $ENV{TAGS};
24 $tags = ",$tags" unless $tags =~ m/^,/;
25
26 while(<>) {
27         chomp;
28         next if /^$/;
29
30         #warn "#[$_]\n";
31
32         my @vals;
33
34         if ( /^(\w+)\s+(\d+\S+)\s+(.+)\s+(\w+)\s+(\d\d\d\d)\/(\d\d)\/(\d\d)$/ ) {
35                 $host = $1;
36                 @cols = qw( kernel build arch );
37                 @vals =   ( qq{"$2"}, qq{"$3"}, qq{"$4"} ); # must quote all this as strings for influx
38                 ( $yyyy, $mm, $dd ) = ( $5, $6, $7 ); update_time;
39
40         } elsif ( m/analysis date: (\S+)/ ) {
41                 ( $yyyy, $mm, $dd ) = split(/\//, $1, 3); update_time;
42                 next;
43
44         } elsif ( m/^\d\d:\d\d:\d\d\s+(.+)_(\w+)_/ ) {
45                 $measurement = $2;
46                 my $cols = $1;
47                 $cols =~ s/(in|out):\s+(\w+)/$1_$2/g; # ipv4, ipv6
48                 @cols = split(/\s+/, $cols);
49                 next;
50
51         } elsif ( m/^(\d\d:\d\d:\d\d)\s+(.+)/ ) {
52                 next if m/logging restarted/;
53                 ( $hour, $min, $sec )  = split(/:/, $1, 3); update_time;
54                 @vals = split(/\s+/, $2);
55         } elsif ( m/^\s+(.+)/ ) {
56                 @vals = split(/\s+/, $1);
57         } else {
58                 die "UNPARSED: $_\n";
59         }
60
61         next unless @vals;
62
63         next if $measurement =~ /top3/; # FIXME this isn't parsed yet
64
65         #XXX { cols => \@cols, vals => \@vals };
66         print "atop_$measurement,host=$host$tags";
67         my $d = " ";
68         foreach my $i ( 0 .. $#cols ) {
69                 if ( my $c = $cols[$i] ) {
70                         my $s = '';
71
72                         if ( $c =~ m/(cpu|disk|interf)/ ) { ; # XXX tag
73                                 ($d,$s) = (',',' ');
74                         }
75
76                         $c =~ s/^%//;
77                         $c =~ s{/s$}{};
78                         $c =~ s/\W+/_/g;
79
80                         my $v = $vals[$i];
81                         if ( ! defined $v ) {
82                                 warn "WARN line: [$_]\nno vals[$i] in ",Data::Dump::dump( @vals );
83                                 next;
84                         };
85
86                         $v *= 1024 * 1024 if $v =~ s/M$//;
87                         #$v =~ s/M$//;
88                         $v =~ s/%$//;
89
90                         $v =~ s/\s/\\ /g unless $v =~ m/"/;
91
92                         next if $c eq "busy" && $v eq "?";
93
94 #                       $s = 'i' if $v =~ m/^\d+$/;
95
96                         print "$d$c=$v$s";
97
98                         $d ||= ',';
99                         $d = '' if $s eq " "; # move to values
100                         $d = ',' if $d eq " "; # move to values
101
102
103                 } else {
104                         die "line: [$_]\nno cols[$i] in ",Data::Dump::dump( @cols );
105                 };
106                 
107         }
108         print " $time\n";
109 }
110