-
Notifications
You must be signed in to change notification settings - Fork 50
Expand file tree
/
Copy pathMetricsReporter.cs
More file actions
67 lines (61 loc) · 1.83 KB
/
MetricsReporter.cs
File metadata and controls
67 lines (61 loc) · 1.83 KB
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
namespace ServiceControl.Infrastructure.Metrics
{
using System;
using System.Threading;
using System.Threading.Tasks;
public class MetricsReporter
{
readonly Metrics metrics;
readonly Action<string> printLine;
readonly TimeSpan interval;
CancellationTokenSource tokenSource;
Task task;
public MetricsReporter(Metrics metrics, Action<string> printLine, TimeSpan interval)
{
this.metrics = metrics;
this.printLine = printLine;
this.interval = interval;
}
public void Start()
{
tokenSource = new CancellationTokenSource();
task = Task.Run(async () =>
{
try
{
while (!tokenSource.IsCancellationRequested)
{
Print();
await Task.Delay(interval, tokenSource.Token).ConfigureAwait(false);
}
}
catch (OperationCanceledException) when (tokenSource.IsCancellationRequested)
{
//no-op
}
}, CancellationToken.None);
}
void Print()
{
if (!metrics.Enabled)
{
return;
}
var values = metrics.GetMeterValues();
foreach (var metricSet in values)
{
printLine(
$"{metricSet.Name,-40};{metricSet.Current:F};{metricSet.Average15:F};{metricSet.Average60:F};{metricSet.Average300:F}");
}
}
public Task Stop()
{
if (tokenSource == null)
{
return Task.CompletedTask;
}
tokenSource.Cancel();
return task;
}
}
}