/
c3mc-mon-mesg-grepvack
executable file
·92 lines (75 loc) · 2.84 KB
/
c3mc-mon-mesg-grepvack
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
90
91
92
#!/data/Software/mydan/perl/bin/perl -I/data/Software/mydan/JOB/lib
use strict;
use warnings;
$|++;
use YAML::XS;
use uuid;
use POSIX;
use Time::Local;
=head1 SYNOPSIS
$0
=cut
local $/ = undef;
my @data = YAML::XS::Load( <STDIN> );
local $/ = "\n";
sub gettime
{
my $t = shift;
return $t unless $t =~ /^(\d+)-(\d+)-(\d+)T(\d+):(\d+):(\d+)\.\d+Z$/;
my $x = timelocal($6,$5,$4,$3,$2-1,$1);
return POSIX::strftime( "%Y-%m-%dT%H:%M:%S", localtime( $x + 8 * 3600) );
}
my @out;
sub adduser
{
my $data = shift @_;
unless( $data && ref $data eq 'HASH'
&& defined $data->{'fingerprint' } && $data->{'fingerprint' } =~ /^[a-zA-Z0-9]+$/
&& defined $data->{'startsAt' } && $data->{'startsAt' } =~ /^[a-zA-Z0-9:\.\-]+$/
&& defined $data->{'labels.fromtreeid' } && $data->{'labels.fromtreeid' } =~ /^\d+$/
)
{
push @out, $data;
return;
}
my $caseuuid = join '.',$data->{'fingerprint'}, gettime( $data->{'startsAt'} );
my $treeid = $data->{'labels.fromtreeid'};
my $uuid = uuid->new()->create_str;
my $time = time;
if(
( $data->{'labels.serialcall'} ) &&
( ( $data->{status} eq 'resolved' ) )
)
{
system( "c3mc-mon-serialcall-ctrl --cleancase '$caseuuid'" );
}
my @acked = `c3mc-base-db-get id --table openc3_monitor_ack_active --filter "(uuid='$data->{fingerprint}' or uuid='$caseuuid' ) and type='G' and expire>$time"`;
return if @acked;
if( $data->{status} eq 'firing' )
{
my @dealed = `c3mc-base-db-get id --table openc3_monitor_serialcall_deal --filter "caseuuid='$caseuuid'"`;
return if @dealed;
}
if( $data->{status} eq 'resolved' && defined $data->{'labels.fromtreeid'} && defined $data->{'labels.instance'} && defined $data->{'labels.alertname'}
&& $data->{'labels.fromtreeid'} !~ /'/ && $data->{'labels.instance'} !~ /'/ && $data->{'labels.alertname'} !~ /'/
)
{
my $x = `c3mc-mon-prometheus-alerts-check '$data->{'labels.fromtreeid'}' '$data->{'labels.instance'}' '$data->{'labels.alertname'}'`;
chomp $x;
if( $x && $x eq '1' )
{
my $tmpdir = "/data/open-c3-data/monitor-debug";
system "mkdir -p '$tmpdir'" unless -d $tmpdir;
eval{ YAML::XS::DumpFile( sprintf( "$tmpdir/%s.%04d", time, int rand 10000 ), $data ) };
return;
}
}
$data->{ack} = $uuid;
$data->{c3monitormsguuid} = $caseuuid;
my $labels = join ',', map{ "$_=$data->{$_}" }sort grep{ /^annotations/ || /^labels/}keys %$data;
$labels =~ s/'|"//g;
system "c3mc-base-db-ins -t openc3_monitor_ack_table fingerprint '$data->{fingerprint}' caseuuid '$caseuuid' ackuuid '$uuid' treeid '$treeid' labels '$labels'";
push @out, $data;
}
map{ adduser($_ ) }@data;
print YAML::XS::Dump @out;