summaryrefslogtreecommitdiff
path: root/buildmaster/execution-times.php
blob: cc1e064496c701b4568c6c3f10297ae5253d5000 (plain)
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
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
<?php

require_once '../init.php';
require_once BASE . '/lib/mysql.php';

abort_iff_webspider();

if (array_key_exists('from', $_GET))
  $min_time = 'from_base64("' . base64_encode('-' . $_GET['from']) . '")';
else
  $min_time='"-7 00:00:00"';

$result = mysql_run_query(
  'SELECT' .
  ' UNIX_TIMESTAMP(`ssh_log`.`date`) AS `date`,' .
  '`ssh_log`.`duration`,' .
  '`ssh_log`.`action`,' .
  '`ssh_log`.`parameters`' .
  ' FROM `ssh_log`' .
  ' WHERE `ssh_log`.`date`>=ADDDATE(NOW(),' . $min_time . ')' .
  ' AND `ssh_log`.`duration` IS NOT NULL' .
  ' AND `ssh_log`.`action` != "ping-from-slave"' .
  ' AND `ssh_log`.`exit_code` = 0' .
  ' ORDER BY `ssh_log`.`date`'
);

$infos = array();
while ($row = $result -> fetch_assoc()) {
  $info = array(
    'date' => $row['date'],
    'duration' => $row['duration'],
    'action' => $row['action']
  );
  if ($row['action'] == 'return-assignment') {
    if (substr($row['parameters'], -6) == ' ERROR')
      $info['action'] .= ' ERROR';
    elseif (substr($row['parameters'], -6) == ' ABORT')
      $info['action'] .= ' ABORT';
    else
      $info['action'] .= ' SUCCESS';
  }
  $infos[] = $info;
}

foreach ($infos as $info)
  $actions[$info['action']][] = array(
    'date' => $info['date'],
    'duration' => $info['duration']
  );

foreach ($actions as $action)
  foreach ($action as $event) {
    if (isset($min_date)) {
      $min_date = min($min_date, $event['date']);
      $max_date = max($max_date, $event['date']);
      $max_duration = max($max_duration, $event['duration']);
    } else {
      $min_date = $event['date'];
      $max_date = $event['date'];
      $max_duration = $event['duration'];
    }
  }

$width = 1600;
$height = 600;
$border = 5;
$legend_line_length = 10;
$legend_height = 2*ImageFontHeight(5) + $legend_line_length;
$left_legend_length = strlen($max_duration) * ImageFontWidth(5);

$im = @ImageCreate ($width + $legend_line_length + $left_legend_length, $height + $legend_height)
      or die ('Cannot create new gd-image-stream');

$background_color = ImageColorAllocate ($im, 255, 255, 255);
$foreground_color = ImageColorAllocate ($im, 0, 0, 0);
$colors['return-assignment SUCCESS'] = ImageColorAllocate ($im, 0, 255, 0);
$colors['return-assignment ERROR'] = ImageColorAllocate ($im, 255, 0, 0);
$colors['return-assignment ABORT'] = ImageColorAllocate ($im, 255, 0, 0);
$colors['get-assignment'] = ImageColorAllocate ($im, 0, 0, 255);
$colors['undef'] = ImageColorAllocate ($im, 255, 0, 255);

function scale($x, $x_min, $x_max, $scale, $log) {
  if ($log) {
    $x = log($x + 10);
    $x_min = log($x_min + 10);
    $x_max = log($x_max + 10);
  };
  if ($x_max == $x_min)
    $frac = 0;
  else
    $frac = ($x - $x_min)/($x_max - $x_min);
  if ($scale < 0)
    return ($frac-1) * $scale;
  else
    return $frac * $scale;
};

function print_graph($data, $color) {
  global $width, $height, $im, $min_date, $max_date, $min_duration, $max_duration, $border, $legend_line_length, $left_legend_length;
  foreach ($data as $val) {
    ImageFilledEllipse(
      $im,
      scale($val['date'], $min_date, $max_date, $width - 2*$border - $left_legend_length, false) + $border + $legend_line_length + $left_legend_length,
      scale($val['duration'], 0, $max_duration, -$height + 2*$border, array_key_exists('log', $_GET)) + $border,
      max(2,pow($val['duration'],0.4)),
      max(2,pow($val['duration'],0.4)),
      $color
    );
  }
/*  ImageString(
    $im,
    5,
    $width + $legend_line_length,
    scale($last_val, 0, $val_max, -$height + 2*$border, array_key_exists('log', $_GET)) + $border - ImageFontHeight(5)/2,
    ' ' . $data[$t_max],
    $color
  ); */
};

ImageRectangle($im, $legend_line_length + $left_legend_length, 0, $width-1 + $legend_line_length, $height-1, $foreground_color);

$xpos = $legend_line_length + $left_legend_length;
foreach ($actions as $action => $data) {
  if (array_key_exists($action, $colors))
    $color = $colors[$action];
  else
    $color = $colors['undef'];
  print_graph($data, $color);
  ImageString($im, 5, $xpos, $height + $legend_line_length + ImageFontHeight(5), $action, $color);
  $xpos += (strlen($action) + 1.75) * ImageFontWidth(5);
}

ImageString($im, 5, $legend_line_length+$left_legend_length, $height + $legend_line_length, date('Y-m-d H:i', $min_date), $foreground_color);
$s = date('Y-m-d H:i', $max_date);
ImageString($im, 5, $width+$legend_line_length - strlen($s)*ImageFontWidth(5), $height + $legend_line_length, $s, $foreground_color);

for ($t=ceil($min_date/24/60/60); $t<=floor($max_date/24/60/60); $t++)
  ImageLine(
    $im,
    scale($t*24*60*60,$min_date,$max_date,$width-2*$border-$left_legend_length,false)+$border+$legend_line_length+$left_legend_length,
    $height,
    scale($t*24*60*60,$min_date,$max_date,$width-2*$border-$left_legend_length,false)+$border+$legend_line_length+$left_legend_length,
    $height+$legend_line_length,
    $foreground_color
  );

for ($val = 0; $val <= $max_duration;) {
  ImageLine(
    $im,
    $left_legend_length,
    scale($val, 0, $max_duration, -$height + 2*$border, array_key_exists('log', $_GET)) + $border,
    $legend_line_length+$left_legend_length,
    scale($val, 0, $max_duration, -$height + 2*$border, array_key_exists('log', $_GET)) + $border,
    $foreground_color
  );
  ImageString(
    $im,
    5,
    $left_legend_length - strlen($val)*ImageFontWidth(5),
    scale($val, 0, $max_duration, -$height + 2*$border, array_key_exists('log', $_GET)) + $border - 0.5*ImageFontHeight(5),
    $val,
    $foreground_color
  );
  if (! array_key_exists('log', $_GET))
    $val+=pow(10, round(log($max_duration) / log(10)) - 1);
  elseif ($val == 0)
    $val++;
  else
    $val = $val*10;
}

// ImageString ($im, 1, 5, 5, "Test-String ".rand(), $foreground_color);

header ('Content-type: image/png');

ImagePNG ($im);