platform/lib/src/stats/metric_server.dart
2018-06-08 03:06:26 -04:00

118 lines
2.9 KiB
Dart

import 'dart:async';
import 'dart:io';
import '../core/core.dart';
import '../http/http.dart';
import 'stats.dart';
@deprecated
class AngelMetrics extends Angel {
Angel _inner;
StreamSubscription<HttpRequest> _sub;
AngelMetrics() : super() {
get('/metrics', (req, res) {
res.contentType = ContentType.HTML;
var rows = stats.all.map((stat) {
return '''
<tr>
<td>${stat.name}</td>
<td>${stat.iterations}</td>
<td>${stat.sum}ms</td>
<td>${stat.average.toStringAsFixed(2)}ms</td>
</tr>''';
}).join();
res.write('''
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Metrics</title>
</head>
<body>
<h1>Metrics</h1>
<i>Updated every 5 seconds</i>
<table>
<thead>
<tr>
<th>Stat</th>
<th># Iterations</th>
<th>Total (ms)</th>
<th>Average (ms)</th>
</tr>
</thead>
<tbody>$rows</tbody>
</table>
<script>
window.setTimeout(function() {
window.location.reload();
}, 5000);
</script>
</body>
</html>
''');
});
}
final AngelMetricsStats stats = new AngelMetricsStats._();
@override
Future<HttpServer> close() {
_sub?.cancel();
_inner.close();
return super.close();
}
@override
Iterable<RoutingResult> resolveAll(String absolute, String relative,
{String method: 'GET', bool strip: true}) {
return stats.resolveAll.run(() =>
_inner.resolveAll(absolute, relative, method: method, strip: strip));
}
@override
Future<bool> executeHandler(
handler, RequestContext req, ResponseContext res) {
return stats.executeHandler
.run<bool>(() => super.executeHandler(handler, req, res));
}
@override
Future getHandlerResult(handler, RequestContext req, ResponseContext res) {
return stats.getHandlerResult
.run(() => super.getHandlerResult(handler, req, res));
}
@override
Future runContained(
Function handler, RequestContext req, ResponseContext res) {
return stats.runContained.run(() => super.runContained(handler, req, res));
}
}
class AngelMetricsStats {
AngelMetricsStats._() {
all = [
resolveAll,
executeHandler,
getHandlerResult,
runContained,
];
}
final Stats resolveAll = new Stats('resolveAll');
final Stats executeHandler = new Stats('executeHandler');
final Stats getHandlerResult = new Stats('getHandlerResult');
final Stats runContained = new Stats('runContained');
List<Stats> all;
void add(Stats stats) {
all.add(stats);
}
void log() {
all.forEach((s) => s.log());
}
}