diff --git a/ArchiSteamFarm.OfficialPlugins.Monitoring/MonitoringPlugin.cs b/ArchiSteamFarm.OfficialPlugins.Monitoring/MonitoringPlugin.cs index 78fdb8be30d3b..fd29ed8c360e6 100644 --- a/ArchiSteamFarm.OfficialPlugins.Monitoring/MonitoringPlugin.cs +++ b/ArchiSteamFarm.OfficialPlugins.Monitoring/MonitoringPlugin.cs @@ -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; @@ -50,6 +51,16 @@ internal sealed class MonitoringPlugin : OfficialPlugin, IWebServiceProvider, IG private const string MetricNamePrefix = "asf"; + private static readonly Measurement BuildInfo = + new( + 1, + new KeyValuePair(TagNames.Version, SharedInfo.Version.ToString()), + new KeyValuePair(TagNames.Variant, SharedInfo.BuildInfo.Variant), + new KeyValuePair(TagNames.ModuleVersion, SharedInfo.ModuleVersion.ToString()) + ); + + private static readonly Measurement RuntimeInfo = CreateRuntimeInformation(); + private static bool Enabled => ASF.GlobalConfig?.IPC ?? GlobalConfig.DefaultIPC; [JsonInclude] @@ -98,6 +109,33 @@ internal sealed class MonitoringPlugin : OfficialPlugin, IWebServiceProvider, IG public override Task OnLoaded() => Task.CompletedTask; + private static Measurement 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( + 1, + new KeyValuePair(TagNames.Framework, framework), + new KeyValuePair(TagNames.Runtime, runtime), + new KeyValuePair(TagNames.OS, description) + ); + } + [MemberNotNull(nameof(Meter))] private void InitializeMeter() { if (Meter != null) { @@ -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(), diff --git a/ArchiSteamFarm.OfficialPlugins.Monitoring/TagNames.cs b/ArchiSteamFarm.OfficialPlugins.Monitoring/TagNames.cs index bbe3ea1543cb5..e97a7e395dae8 100644 --- a/ArchiSteamFarm.OfficialPlugins.Monitoring/TagNames.cs +++ b/ArchiSteamFarm.OfficialPlugins.Monitoring/TagNames.cs @@ -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"; } diff --git a/ArchiSteamFarm/SharedInfo.cs b/ArchiSteamFarm/SharedInfo.cs index 1bb235540ae01..9fe556a9ef2cf 100644 --- a/ArchiSteamFarm/SharedInfo.cs +++ b/ArchiSteamFarm/SharedInfo.cs @@ -101,7 +101,7 @@ public static class SharedInfo { internal static string PublicIdentifier => $"{AssemblyName}{(BuildInfo.IsCustomBuild ? "-custom" : PluginsCore.HasCustomPluginsLoaded ? "-modded" : "")}"; internal static Version Version => Assembly.GetExecutingAssembly().GetName().Version ?? throw new InvalidOperationException(nameof(Version)); - private static Guid ModuleVersion => Assembly.GetExecutingAssembly().ManifestModule.ModuleVersionId; + internal static Guid ModuleVersion => Assembly.GetExecutingAssembly().ManifestModule.ModuleVersionId; private static string? CachedHomeDirectory;