Projet

Général

Profil

Paste
Télécharger au format
Statistiques
| Branche: | Révision:

root / plugins / syslog / syslog_ng_stats @ eb100e33

Historique | Voir | Annoter | Télécharger (3,47 ko)

1 40ec9801 Roman V. Nikolaev
#!/usr/bin/perl
2
3
=head1 NAME
4
5 6368f71a Steve Schnepp
syslog_ng_stats - Plugin for syslog-ng.
6
It uses the C<syslog-ng-ctl> utility to grab values.
7 40ec9801 Roman V. Nikolaev
8
=head1 DESCRIPTION
9
10 6368f71a Steve Schnepp
See C<man syslog-ng-ctl> for the C<stats> option.
11
All options used are regexp.
12 40ec9801 Roman V. Nikolaev
13
=over
14
15
=item source_name
16
17
=item source_id
18
19
=item source_instance
20
21
=item state
22
23
=item type
24
25
=back
26
27
Example of input and destination via tcp for my application:
28
29
    [syslog_ng_stats]
30
    user root
31
    env.source_name = source dst\.tcp
32
    env.source_id = myname
33
34
=head1 AUTHORS
35
36
Dmitry E. Oboukhov <unera@debian.org>,
37
Roman V. Nikolaev <rshadow@rambler.ru>
38
39
=head1 COPYRIGHT
40
41
Copyright (C) 2013 Dmitry E. Oboukhov <unera@debian.org>
42
Copyright (C) 2013 Roman V. Nikolaev <rshadow@rambler.ru>
43
44
This library is free software; you can redistribute it and/or modify
45
it under the same terms as Perl itself, either Perl version 5.8.8 or,
46
at your option, any later version of Perl 5 you may have available.
47
48
=cut
49
50
use strict;
51
use warnings;
52
use utf8;
53
use open qw(:utf8 :std);
54
use List::MoreUtils qw(any);
55
56
# Filters
57
my (@source_name, @source_id, @source_instance, @state, @type);
58
@source_name     = split m{\s+}, $ENV{source_name} if $ENV{source_name};
59
@source_id       = split m{\s+}, $ENV{source_id}   if $ENV{source_id};
60
@source_instance = split m{\s+}, $ENV{source_instance}
61
                                                    if $ENV{source_instance};
62
@state           = split m{\s+}, $ENV{state}       if $ENV{state};
63
@type            = split m{\s+}, $ENV{type}        if $ENV{type};
64
65
# Get stats
66
my $data = `syslog-ng-ctl stats`;
67
die 'Can`t get stats from syslog-ng-ctl' unless $data;
68
69
# Split to graphs
70
my @str = split m{\n+}, $data;
71
# Remove title
72
shift @str;
73
74
my @gpaths;
75
for my $graph (@str) {
76
    # Split to data
77
    $graph = [ split m{;}, $graph ];
78
    $graph = {
79
        source_name     => $graph->[0],
80
        source_id       => $graph->[1],
81
        source_instance => $graph->[2],
82
        state           => $graph->[3],
83
        type            => $graph->[4],
84
        number          => $graph->[5],
85
    };
86
87
    # Apply filters
88
    next if @source_name        and
89
            ! any {$graph->{source_name} =~ m{$_}i } @source_name;
90
    next if @source_id          and
91
            ! any {$graph->{source_id} =~ m{$_}i } @source_id;
92
    next if @source_instance    and
93
            ! any {$graph->{source_instance} =~ m{$_}i } @source_instance;
94
    next if @state              and
95
            ! any {$graph->{state} =~ m{$_}i } @state;
96
    next if @type               and
97
            ! any {$graph->{type} =~ m{$_}i } @type;
98
99
    # Save graph
100
    push @gpaths, $graph;
101
}
102
103
# Show config
104 928f9d3d Roman V. Nikolaev
if( exists $ARGV[0] and $ARGV[0] eq "config" ) {
105 40ec9801 Roman V. Nikolaev
    print "graph_title Syslog-ng statistics\n";
106
    print "graph_vlabel count\n";
107
    print "graph_args --base 1000 --lower-limit 0 --rigid\n";
108
    print "graph_info This graph show syslog-ng-ctl stats\n";
109 eb100e33 dipohl
    print "graph_category system\n";
110 40ec9801 Roman V. Nikolaev
    for my $graph (@gpaths) {
111
        # ID
112
        my $id = sprintf '%s_%s',
113
            $graph->{source_id} || $graph->{source_instance},
114
            $graph->{type};
115
        s{#(\d+)}{[$1]}, s{[^\w\]\[]+}{_}g for $id;
116
117
        printf "%s.label %s: %s, %s\n", $id,
118
            $graph->{source_name},$graph->{source_id}, $graph->{type};
119
        printf "%s.min 0\n", $id;
120
    }
121
}
122
123 f68e4c96 Roman V. Nikolaev
# Print values
124 40ec9801 Roman V. Nikolaev
for my $graph (@gpaths) {
125
    # ID
126
    my $id = sprintf '%s_%s',
127
        $graph->{source_id} || $graph->{source_instance},
128
        $graph->{type};
129
    s{#(\d+)}{[$1]}, s{[^\w\]\[]+}{_}g for $id;
130
131
    printf "%s.value %s\n", $id, $graph->{number};
132
}
133
134
exit;