Skip to content

Commit

Permalink
Add build and runtime information metrics
Browse files Browse the repository at this point in the history
It is not recommended to include this information as labels in all
metrics. Instead, we add two special metrics with a constant value of
"1" and restrict those static pieces of information to them
  • Loading branch information
Abrynos committed Apr 6, 2024
1 parent f871997 commit c2f3fd4
Show file tree
Hide file tree
Showing 2 changed files with 56 additions and 0 deletions.
50 changes: 50 additions & 0 deletions ArchiSteamFarm.OfficialPlugins.Monitoring/MonitoringPlugin.cs
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
using System.Diagnostics.CodeAnalysis;
using System.Diagnostics.Metrics;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text.Json.Serialization;
using System.Threading.Tasks;
using ArchiSteamFarm.Core;
Expand All @@ -50,6 +51,16 @@ internal sealed class MonitoringPlugin : OfficialPlugin, IWebServiceProvider, IG

private const string MetricNamePrefix = "asf";

private static readonly Measurement<int> BuildInfo =
new(
1,
new KeyValuePair<string, object?>(TagNames.Version, SharedInfo.Version.ToString()),
new KeyValuePair<string, object?>(TagNames.Variant, SharedInfo.BuildInfo.Variant),
new KeyValuePair<string, object?>(TagNames.ModuleVersion, SharedInfo.ModuleVersion.ToString())

Check failure on line 59 in ArchiSteamFarm.OfficialPlugins.Monitoring/MonitoringPlugin.cs

View workflow job for this annotation

GitHub Actions / main (Debug, macos-latest)

'SharedInfo' does not contain a definition for 'ModuleVersion'

Check failure on line 59 in ArchiSteamFarm.OfficialPlugins.Monitoring/MonitoringPlugin.cs

View workflow job for this annotation

GitHub Actions / main (Debug, macos-latest)

'SharedInfo' does not contain a definition for 'ModuleVersion'

Check failure on line 59 in ArchiSteamFarm.OfficialPlugins.Monitoring/MonitoringPlugin.cs

View workflow job for this annotation

GitHub Actions / main (Debug, ubuntu-latest)

'SharedInfo' does not contain a definition for 'ModuleVersion'

Check failure on line 59 in ArchiSteamFarm.OfficialPlugins.Monitoring/MonitoringPlugin.cs

View workflow job for this annotation

GitHub Actions / main (Debug, ubuntu-latest)

'SharedInfo' does not contain a definition for 'ModuleVersion'

Check failure on line 59 in ArchiSteamFarm.OfficialPlugins.Monitoring/MonitoringPlugin.cs

View workflow job for this annotation

GitHub Actions / main (Debug, windows-latest)

'SharedInfo' does not contain a definition for 'ModuleVersion'

Check failure on line 59 in ArchiSteamFarm.OfficialPlugins.Monitoring/MonitoringPlugin.cs

View workflow job for this annotation

GitHub Actions / main (Debug, windows-latest)

'SharedInfo' does not contain a definition for 'ModuleVersion'

Check failure on line 59 in ArchiSteamFarm.OfficialPlugins.Monitoring/MonitoringPlugin.cs

View workflow job for this annotation

GitHub Actions / main (Release, macos-latest)

'SharedInfo' does not contain a definition for 'ModuleVersion'

Check failure on line 59 in ArchiSteamFarm.OfficialPlugins.Monitoring/MonitoringPlugin.cs

View workflow job for this annotation

GitHub Actions / main (Release, macos-latest)

'SharedInfo' does not contain a definition for 'ModuleVersion'

Check failure on line 59 in ArchiSteamFarm.OfficialPlugins.Monitoring/MonitoringPlugin.cs

View workflow job for this annotation

GitHub Actions / main (Release, ubuntu-latest)

'SharedInfo' does not contain a definition for 'ModuleVersion'

Check failure on line 59 in ArchiSteamFarm.OfficialPlugins.Monitoring/MonitoringPlugin.cs

View workflow job for this annotation

GitHub Actions / main (Release, ubuntu-latest)

'SharedInfo' does not contain a definition for 'ModuleVersion'

Check failure on line 59 in ArchiSteamFarm.OfficialPlugins.Monitoring/MonitoringPlugin.cs

View workflow job for this annotation

GitHub Actions / main (Release, windows-latest)

'SharedInfo' does not contain a definition for 'ModuleVersion'

Check failure on line 59 in ArchiSteamFarm.OfficialPlugins.Monitoring/MonitoringPlugin.cs

View workflow job for this annotation

GitHub Actions / main (Release, windows-latest)

'SharedInfo' does not contain a definition for 'ModuleVersion'

Check failure on line 59 in ArchiSteamFarm.OfficialPlugins.Monitoring/MonitoringPlugin.cs

View workflow job for this annotation

GitHub Actions / publish-asf (ubuntu-latest, generic)

'SharedInfo' does not contain a definition for 'ModuleVersion'
);

private static readonly Measurement<int> RuntimeInfo = CreateRuntimeInformation();

private static bool Enabled => ASF.GlobalConfig?.IPC ?? GlobalConfig.DefaultIPC;

[JsonInclude]
Expand Down Expand Up @@ -98,6 +109,33 @@ internal sealed class MonitoringPlugin : OfficialPlugin, IWebServiceProvider, IG

public override Task OnLoaded() => Task.CompletedTask;

private static Measurement<int> CreateRuntimeInformation() {
string framework = RuntimeInformation.FrameworkDescription.Trim();

if (framework.Length == 0) {
framework = "unknown";
}

string runtime = RuntimeInformation.RuntimeIdentifier.Trim();

if (runtime.Length == 0) {
runtime = "unknown";
}

string description = RuntimeInformation.OSDescription.Trim();

if (description.Length == 0) {
description = "unknown";
}

return new Measurement<int>(
1,
new KeyValuePair<string, object?>(TagNames.Framework, framework),
new KeyValuePair<string, object?>(TagNames.Runtime, runtime),
new KeyValuePair<string, object?>(TagNames.OS, description)
);
}

[MemberNotNull(nameof(Meter))]
private void InitializeMeter() {
if (Meter != null) {
Expand All @@ -106,6 +144,18 @@ internal sealed class MonitoringPlugin : OfficialPlugin, IWebServiceProvider, IG

Meter = new Meter(MeterName, Version.ToString());

Meter.CreateObservableGauge(
$"{MetricNamePrefix}_build_info",
static () => BuildInfo,
description: "Build information about ASF in form of label values"
);

Meter.CreateObservableGauge(
$"{MetricNamePrefix}_runtime_info",
static () => RuntimeInfo,
description: "Runtime information about ASF in form of label values"
);

Meter.CreateObservableGauge(
$"{MetricNamePrefix}_ipc_banned_ips",
static () => ApiAuthenticationMiddleware.GetCurrentlyBannedIPs().Count(),
Expand Down
6 changes: 6 additions & 0 deletions ArchiSteamFarm.OfficialPlugins.Monitoring/TagNames.cs
Original file line number Diff line number Diff line change
Expand Up @@ -27,5 +27,11 @@ internal static class TagNames {
internal const string BotName = "bot";
internal const string BotState = "state";
internal const string CurrencyCode = "currency";
internal const string Framework = "framework";
internal const string ModuleVersion = "module_version";
internal const string OS = "operating_system";
internal const string Runtime = "runtime";
internal const string SteamID = "steamid";
internal const string Variant = "variant";
internal const string Version = "version";
}

0 comments on commit c2f3fd4

Please sign in to comment.