Make diagnostics JSON trim safe

This commit is contained in:
Ochenstarik 2026-07-17 01:04:26 +07:00
parent 160a5c683d
commit c252701623

View file

@ -3,6 +3,7 @@ using System.Runtime.InteropServices;
using System.Security.Cryptography; using System.Security.Cryptography;
using System.Text; using System.Text;
using System.Text.Json; using System.Text.Json;
using System.Text.Json.Serialization;
namespace ServerMonitorManager.Core; namespace ServerMonitorManager.Core;
@ -36,12 +37,6 @@ public sealed record DiagnosticMetricInput(
public static class DiagnosticsExportService public static class DiagnosticsExportService
{ {
private static readonly JsonSerializerOptions JsonOptions = new()
{
WriteIndented = true,
PropertyNamingPolicy = JsonNamingPolicy.SnakeCaseLower
};
public static string CreateJson( public static string CreateJson(
IEnumerable<DiagnosticServerInput> servers, IEnumerable<DiagnosticServerInput> servers,
IEnumerable<DiagnosticNodeInput> nodes, IEnumerable<DiagnosticNodeInput> nodes,
@ -87,7 +82,7 @@ public static class DiagnosticsExportService
nodeSnapshots, nodeSnapshots,
linkSnapshots, linkSnapshots,
metricSnapshots); metricSnapshots);
return JsonSerializer.Serialize(snapshot, JsonOptions); return JsonSerializer.Serialize(snapshot, DiagnosticsJsonContext.Default.DiagnosticSnapshot);
} }
private static string Fingerprint(string value) private static string Fingerprint(string value)
@ -107,7 +102,9 @@ public static class DiagnosticsExportService
_ => "unknown" _ => "unknown"
}; };
private sealed record DiagnosticSnapshot( }
internal sealed record DiagnosticSnapshot(
int FormatVersion, int FormatVersion,
DateTimeOffset GeneratedAt, DateTimeOffset GeneratedAt,
string AppVersion, string AppVersion,
@ -119,19 +116,19 @@ public static class DiagnosticsExportService
IReadOnlyList<DiagnosticLink> Links, IReadOnlyList<DiagnosticLink> Links,
IReadOnlyList<DiagnosticMetric> Metrics); IReadOnlyList<DiagnosticMetric> Metrics);
private sealed record DiagnosticServer( internal sealed record DiagnosticServer(
string EndpointFingerprint, string EndpointFingerprint,
bool IsHub, bool IsHub,
bool IsOnline, bool IsOnline,
bool HasWarning, bool HasWarning,
double CpuPercent); double CpuPercent);
private sealed record DiagnosticNode( internal sealed record DiagnosticNode(
string NodeFingerprint, string NodeFingerprint,
string State, string State,
int HandshakeAgeSeconds); int HandshakeAgeSeconds);
private sealed record DiagnosticLink( internal sealed record DiagnosticLink(
string SourceFingerprint, string SourceFingerprint,
string TargetFingerprint, string TargetFingerprint,
string Protocol, string Protocol,
@ -140,10 +137,15 @@ public static class DiagnosticsExportService
long Version, long Version,
long ExpiresUnix); long ExpiresUnix);
private sealed record DiagnosticMetric( internal sealed record DiagnosticMetric(
string ServerFingerprint, string ServerFingerprint,
DateTimeOffset Timestamp, DateTimeOffset Timestamp,
double CpuPercent, double CpuPercent,
double MemoryPercent, double MemoryPercent,
double DiskPercent); double DiskPercent);
}
[JsonSourceGenerationOptions(
PropertyNamingPolicy = JsonKnownNamingPolicy.SnakeCaseLower,
WriteIndented = true)]
[JsonSerializable(typeof(DiagnosticSnapshot))]
internal sealed partial class DiagnosticsJsonContext : JsonSerializerContext;