Skip to content

Commit

Permalink
Use App.Metrics on JSON-RPC replay tool (#5919)
Browse files Browse the repository at this point in the history
* Use 'App.Metrics'

* Remove unused imports

* Inspection

Redundant arguments

* Lift formatter to class field

* Refactor out 'IMetricsOutputFormatter'

- Removes "duplicated" consumers
- Introduces top level references to 'App.Metrics'
  • Loading branch information
emlautarom1 authored Jul 17, 2023
1 parent 540bf0d commit ce06472
Show file tree
Hide file tree
Showing 9 changed files with 138 additions and 178 deletions.
92 changes: 46 additions & 46 deletions tools/Nethermind.Tools.Kute/Application.cs
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
// SPDX-FileCopyrightText: 2023 Demerzel Solutions Limited
// SPDX-License-Identifier: LGPL-3.0-only

using System.Diagnostics;
using Nethermind.Tools.Kute.MessageProvider;
using Nethermind.Tools.Kute.JsonRpcMethodFilter;
using Nethermind.Tools.Kute.JsonRpcSubmitter;
Expand Down Expand Up @@ -33,58 +32,59 @@ IJsonRpcMethodFilter methodFilter

public async Task Run()
{
var start = Stopwatch.GetTimestamp();

await foreach (var jsonRpc in _msgProvider.Messages)
using (_metrics.TimeTotal())
{
_metrics.TickMessages();

switch (jsonRpc)
await foreach (var jsonRpc in _msgProvider.Messages)
{
case null:
_metrics.TickFailed();

break;

case JsonRpc.BatchJsonRpc batch:
var startBatch = Stopwatch.GetTimestamp();
await _submitter.Submit(batch);
_metrics.TickBatch(Stopwatch.GetElapsedTime(startBatch));

break;
_metrics.TickMessages();

case JsonRpc.SingleJsonRpc single:
if (single.IsResponse)
{
_metrics.TickResponses();
continue;
}

if (single.MethodName is null)
{
switch (jsonRpc)
{
case null:
_metrics.TickFailed();
continue;
}

if (_methodFilter.ShouldIgnore(single.MethodName))
{
_metrics.TickIgnoredRequests();
continue;
}

var startMethod = Stopwatch.GetTimestamp();
await _submitter.Submit(single);
_metrics.TickRequest(single.MethodName, Stopwatch.GetElapsedTime(startMethod));

break;

default:
throw new ArgumentOutOfRangeException(nameof(jsonRpc));
break;

case JsonRpc.BatchJsonRpc batch:
using (_metrics.TimeBatch())
{
await _submitter.Submit(batch);
}

break;

case JsonRpc.SingleJsonRpc single:
if (single.IsResponse)
{
_metrics.TickResponses();
continue;
}

if (single.MethodName is null)
{
_metrics.TickFailed();
continue;
}

if (_methodFilter.ShouldIgnore(single.MethodName))
{
_metrics.TickIgnoredRequests();
continue;
}

using (_metrics.TimeMethod(single.MethodName))
{
await _submitter.Submit(single);
}

break;

default:
throw new ArgumentOutOfRangeException(nameof(jsonRpc));
}
}
}

_metrics.TotalRunningTime = Stopwatch.GetElapsedTime(start);

_metricsConsumer.ConsumeMetrics(_metrics);
await _metricsConsumer.ConsumeMetrics(_metrics);
}
}
8 changes: 4 additions & 4 deletions tools/Nethermind.Tools.Kute/Config.cs
Original file line number Diff line number Diff line change
Expand Up @@ -55,10 +55,10 @@ public class Config
shortName: 'o',
longName: "output",
Required = false,
Default = MetricConsumerStrategy.Report,
Default = MetricsOutputFormatter.Report,
HelpText = "Strategy to report metrics"
)]
public MetricConsumerStrategy MetricConsumerStrategy { get; }
public MetricsOutputFormatter MetricsOutputFormatter { get; }

[Option(
shortName: 'f',
Expand All @@ -76,7 +76,7 @@ public Config(
string jwtSecretFilePath,
int authTtl,
bool dryRun,
MetricConsumerStrategy metricConsumerStrategy,
MetricsOutputFormatter metricsOutputFormatter,
IEnumerable<string> methodFilters
)
{
Expand All @@ -85,7 +85,7 @@ IEnumerable<string> methodFilters
JwtSecretFilePath = jwtSecretFilePath;
AuthTtl = authTtl;
DryRun = dryRun;
MetricConsumerStrategy = metricConsumerStrategy;
MetricsOutputFormatter = metricsOutputFormatter;
MethodFilters = methodFilters;
}
}
82 changes: 49 additions & 33 deletions tools/Nethermind.Tools.Kute/Metrics.cs
Original file line number Diff line number Diff line change
@@ -1,49 +1,65 @@
// SPDX-FileCopyrightText: 2023 Demerzel Solutions Limited
// SPDX-License-Identifier: LGPL-3.0-only

using App.Metrics;
using App.Metrics.Counter;
using App.Metrics.Timer;

namespace Nethermind.Tools.Kute;

public class Metrics
{
public TimeSpan TotalRunningTime { get; set; }
public int Messages { get; private set; }
public int Failed { get; private set; }
public int IgnoredRequests { get; private set; }
public int Responses { get; private set; }
public ItemMetrics Batches { get; } = new();
public IDictionary<string, ItemMetrics> ProcessedRequests { get; } = new Dictionary<string, ItemMetrics>();

public void TickMessages() => Messages++;
public void TickFailed() => Failed++;
public void TickIgnoredRequests() => IgnoredRequests++;
public void TickResponses() => Responses++;
public void TickBatch(TimeSpan runningTime) => Batches.Tick(runningTime);

public void TickRequest(string methodName, TimeSpan runningTime)
{
if (!ProcessedRequests.ContainsKey(methodName))
{
ProcessedRequests[methodName] = new ItemMetrics();
}
private readonly IMetrics _metrics;

ProcessedRequests[methodName].Tick(runningTime);
}
private readonly TimerOptions _totalRunningTime = new()
{
Name = "Total Running Time", DurationUnit = TimeUnit.Milliseconds,
};
private readonly CounterOptions _messages = new()
{
Name = "Messages", MeasurementUnit = Unit.Items,
};
private readonly CounterOptions _failed = new()
{
Name = "Failed", MeasurementUnit = Unit.Items,
};
private readonly CounterOptions _ignoredRequests = new()
{
Name = "Ignored Requests", MeasurementUnit = Unit.Items
};
private readonly CounterOptions _responses = new()
{
Name = "Responses", MeasurementUnit = Unit.Items
};
private readonly TimerOptions _batches = new()
{
Name = "Batches", DurationUnit = TimeUnit.Milliseconds
};
private readonly IDictionary<string, TimerOptions> _processedRequests = new Dictionary<string, TimerOptions>();

public class ItemMetrics
public Metrics()
{
public int Count { get; private set; }
public TimeSpan RunningTime { get; private set; }
_metrics = new MetricsBuilder().Build();
}

public ItemMetrics()
{
Count = 0;
RunningTime = TimeSpan.Zero;
}
public MetricsDataValueSource Snapshot => _metrics.Snapshot.Get();

public void TickMessages() => _metrics.Measure.Counter.Increment(_messages);
public void TickFailed() => _metrics.Measure.Counter.Increment(_failed);
public void TickIgnoredRequests() => _metrics.Measure.Counter.Increment(_ignoredRequests);
public void TickResponses() => _metrics.Measure.Counter.Increment(_responses);

public void Tick(TimeSpan runningTime)
public TimerContext TimeTotal() => _metrics.Measure.Timer.Time(_totalRunningTime);
public TimerContext TimeBatch() => _metrics.Measure.Timer.Time(_batches);
public TimerContext TimeMethod(string methodName)
{
if (!_processedRequests.ContainsKey(methodName))
{
Count++;
RunningTime += runningTime;
_processedRequests[methodName] = new TimerOptions
{
Name = methodName, MeasurementUnit = Unit.Requests, DurationUnit = TimeUnit.Milliseconds, RateUnit = TimeUnit.Milliseconds
};
}
return _metrics.Measure.Timer.Time(_processedRequests[methodName]);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
// SPDX-FileCopyrightText: 2023 Demerzel Solutions Limited
// SPDX-License-Identifier: LGPL-3.0-only

using App.Metrics.Formatters;

namespace Nethermind.Tools.Kute.MetricsConsumer;

public class ConsoleMetricsConsumer : IMetricsConsumer
{

private readonly IMetricsOutputFormatter _formatter;

public ConsoleMetricsConsumer(IMetricsOutputFormatter formatter)
{
_formatter = formatter;
}

public async Task ConsumeMetrics(Metrics metrics)
{
var snapshot = metrics.Snapshot;
using (var stream = Console.OpenStandardOutput())
{
await _formatter.WriteAsync(stream, snapshot);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,10 @@ namespace Nethermind.Tools.Kute.MetricsConsumer;

public interface IMetricsConsumer
{
void ConsumeMetrics(Metrics metrics);
Task ConsumeMetrics(Metrics metrics);
}

public enum MetricConsumerStrategy
public enum MetricsOutputFormatter
{
Report, Json
Report, Json,
}
52 changes: 0 additions & 52 deletions tools/Nethermind.Tools.Kute/MetricsConsumer/JsonMetricsConsumer.cs

This file was deleted.

This file was deleted.

1 change: 1 addition & 0 deletions tools/Nethermind.Tools.Kute/Nethermind.Tools.Kute.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
</PropertyGroup>

<ItemGroup>
<PackageReference Include="App.Metrics" Version="4.3.0" />
<PackageReference Include="CommandLineParser" Version="2.9.1" />
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="7.0.0" />
<PackageReference Include="System.IdentityModel.Tokens.Jwt" Version="6.30.1" />
Expand Down
Loading

0 comments on commit ce06472

Please sign in to comment.