-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathdogwatcher-dns.pl
89 lines (80 loc) · 1.79 KB
/
dogwatcher-dns.pl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
#!/usr/bin/perl
use DataDog::DogStatsd;
use File::Tail;
my $VERSION = "0.02";
my $PIDFILE = "/var/run/dogwatcher.pid";
my $LOGWAITINT=1;
my $QFILE = "/var/log/named/queries.log";
my $HOSTNAME= `hostname`;
chomp($HOSTNAME);
my %OPTS;
$OPTS->{'tags'} = $HOSTNAME;
open(PID,">$PIDFILE");
print PID $$ or die;
close(PID);
my %CLIENT_STATS;
my %REQUEST_STATS;
my %CLASS_STATS;
my %TYPE_STATS;
my $stat = DataDog::DogStatsd->new();
@query_list=("A", "PTR", "ANY", "MX", "NS", "CNAME", "SOA", "SRV", "AAAA");
$SIG{'HUP'}='dump';
sub init {
}
sub getlogline {
if(!defined($LFFD)){
$LFFD = File::Tail->new(name=>$QFILE,maxinterval=>5,interval=>$LOGWAITINT);
if(!defined $LFFD) {
die "Can't open $QFILE.";
}
}
return $LFFD->read;
}
init();
while ($l=getlogline) {
my @L = split(' ',$l);
my $i = 0;
my $client = $L[3];
$client =~ s/#.*//;
my $request = $L[5];
my $class = $L[6];
my $type = $L[7];
#print "Request from $client for $request $class $type\n";
if($client){
$CLIENT_STATS{"$client"}++;
$stat->set('dns.query.client',$client,%OPTS);
}
$REQUEST_STATS{"$request"}++;
$CLASS_STATS{"$class"}++;
$TYPE_STATS{"$type"}++;
if ($type eq "A"){
$stat->set('dns.query.a',$request,%OPTS);
}
elsif ($type eq "PTR"){
$stat->set('dns.query.ptr',$request,%OPTS);
}
elsif ($type eq "SRV"){
$stat->set('dns.query.srv',$request,%OPTS);
}
elsif ($type eq "SOA"){
$stat->set('dns.query.soa',$request,%OPTS);
}
elsif ($type eq "IXFR"){
$stat->set('dns.query.ixfr',$request,%OPTS);
}
elsif ($type eq "NS"){
$stat->set('dns.query.ns',$request,%OPTS);
}
elsif ($type eq "MX"){
$stat->set('dns.query.mx',$request,%OPTS);
}
}
sub dump {
foreach (keys %CLIENT_STATS){
print "$_ ".$CLIENT_STATS{"$_"}."\n";
}
foreach (keys %REQUEST_STATS){
print "$_ ".$REQUEST_STATS{"$_"}."\n";
}
die;
}