/
CALL_BD.pl
145 lines (110 loc) · 6.43 KB
/
CALL_BD.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
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
#!/usr/bin/perl
use strict;
#use warnings;
use Data::Dumper;
my %actions = (
'CALL' => [
{
'action' => sub {
my ($event) = @_;
my $duration = $3 if $event =~ /^(\d\d:\d\d)\.(\d+)[-](\d+)/;
my $context = $1 if $event =~ /Context=([^,]+)/;
$context =~ s/\s//g; # Удаляем пробелы
my $result = "$duration-$context" if $context;
}
}
],
'SDBL' => [
{
'action' => sub {
my ($event) = @_;
my $duration = $3 if $event =~ /^(\d\d:\d\d)\.(\d+)[-](\d+)/;
my $context = $1 if $event =~ /Context='([^']+)/;
# убираем табуляцию, т.е. такой вид
# ОбщийМодуль.Вызов : ОбщийМодуль.СоединенияИБВызовСервера.Модуль.ПараметрыБлокировкиСеансов
# ОбщийМодуль.СоединенияИБВызовСервера.Модуль : 70 : Возврат СоединенияИБ.ПараметрыБлокировкиСеансов(ПолучитьКоличествоСеансов);
# ОбщийМодуль.СоединенияИБ.Модуль : 88 : ПараметрыБлокировки = СтруктураПараметровБлокировкиСеансов();
# ОбщийМодуль.СоединенияИБ.Модуль : 744 : ТекущийРежимОбластиДанных = ПолучитьБлокировкуСеансовОбластиДанных();
# ОбщийМодуль.СоединенияИБ.Модуль : 316 : НаборБлокировок.Прочитать();
# приводим к такому:
# ОбщийМодуль.Вызов:ОбщийМодуль.СоединенияИБВызовСервера.Модуль.ПараметрыБлокировкиСеансов
# ОбщийМодуль.СоединенияИБВызовСервера.Модуль:70:Возврат СоединенияИБ.ПараметрыБлокировкиСеансов(ПолучитьКоличествоСеансов);
# ОбщийМодуль.СоединенияИБ.Модуль:88:ПараметрыБлокировки=СтруктураПараметровБлокировкиСеансов();
# ОбщийМодуль.СоединенияИБ.Модуль:744:ТекущийРежимОбластиДанных=ПолучитьБлокировкуСеансовОбластиДанных();
# ОбщийМодуль.СоединенияИБ.Модуль:316:НаборБлокировок.Прочитать();
$context =~ s/\n/<end_line>/g;
$context =~ s/\s//g;
$context =~ s/<end_line>/\n/g;
#print "$context \n\n";
my $result = "$duration-$context" if $context;
}
}
]
);
print "\n";
my $Block;
my @Buffer;
while (<>) {
if (/^\d\d:\d\d\.\d+/) {
my $line = process_event($Block);
push(@Buffer, $line) if $line;
$Block = "";
}
$Block .= $_;
}
my %resultHash;
my %value;
my $Condition = qr(CALL[-](.+));
foreach(grep(/$Condition/s, @Buffer)) {
$resultHash{$2} += $1 if /^[\D]+[-](\d+)-(.+)/s;
# $value{CommonD} += $1 if /^[\D]+[-](\d+)-(.+)/s;
# $resultHash{$2} = \%value;
}
# Пересобираем буфер, что бы в нем не было учтенных элементов
@Buffer = grep(!/$Condition/s, @Buffer);
# C SDBL все сложнее, т.к. строк много, нам нужно знать по какой стоит мунусовать CALL, а по какой нет
foreach my $key (keys %resultHash) {
my $Condition = qr(SDBL[-]([\d]+)[-](.*?)$key(.*?));
my @SelectRow = grep(/$Condition/s, @Buffer);
foreach(@SelectRow) {
$resultHash{$key} -= $1 if /^[\D]+[-](\d+)/;
}
# Пересобираем буфер, что бы в нем не было учтенных элементов
@Buffer = grep(!/$Condition/s, @Buffer);
}
# То что осталось в @Buffer это запросы к БД которые не были учтены в CALL
# Для катих элементов, добавляем в хеш по последней строки стека
{
print "==== Остаток ====\n";
$" = "\n";
print @Buffer;
print "=====================\n\n";
}
# foreach(@Buffer) {
# my @break = split("\n", $_);
# $resultHash{pop @break} += $1 if /^[\D]+[-](\d+)/;
# }
# Выводим отсортированные (по убыванию) данные. Сортировка по значениею хеша
foreach my $tmp (sort {$resultHash{$b} <=> $resultHash{$a}} keys %resultHash) {
# duration для 8.3 это миллионные доли секунды
print "$tmp - $resultHash{$tmp} (~". sprintf("%.2f", $resultHash{$tmp}/1000000). " сек.) \n";
}
sub process_event($) {
my $result;
my ($Block) = @_;
if (!$Block) {
return;
}
foreach my $event_type ( keys %actions ) {
#print "$event_type - 1 \n";
next if not $Block =~ /^[^,]+,$event_type,/; # /^[^,]+,SDBL,/
#print "$event_type - 2 \n";
#print Dumper ( @{ $actions{$event_type} });
foreach my $issue ( @{ $actions{$event_type} }) {
my $resultLine = &{$issue->{action}}($Block);
$result = "$event_type-$resultLine\n" if $resultLine;
last;
}
}
return $result;
}