using System.Text.Json; using Launcher.Next.Core; namespace Launcher.Next.Observability; public sealed class JsonlTelemetry(string logRoot) : ILauncherTelemetry { public void Write(string eventType, IReadOnlyDictionary? fields = null) { try { Directory.CreateDirectory(logRoot); var allowed = (fields ?? new Dictionary()).Where(x => !x.Key.Contains("user", StringComparison.OrdinalIgnoreCase) && !x.Key.Contains("token", StringComparison.OrdinalIgnoreCase) && !x.Key.Contains("password", StringComparison.OrdinalIgnoreCase)).ToDictionary(); var line = JsonSerializer.Serialize(new { Timestamp = DateTimeOffset.UtcNow, EventType = eventType, Fields = allowed }); File.AppendAllText(Path.Combine(logRoot, DateTime.UtcNow.ToString("yyyyMMdd") + ".jsonl"), line + Environment.NewLine); } catch { } } }