File: NativeDiagnosticWriter.cs
Web Access
Project: src\src\Aspire.Hosting.Native.Server\Aspire.Hosting.Native.Server.csproj (Aspire.Hosting.Native.Server)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
using System.Text;
using System.Text.Json;
using Aspire.Hosting.Native.Diagnostics;
using Microsoft.Extensions.Logging;
 
namespace Aspire.Hosting.Native.Server;
 
/// <summary>Writes classified host failures and opt-in correlated operation traces without caller data.</summary>
internal sealed class NativeDiagnosticWriter(bool verbose, ILogger logger)
{
    public void Write(OperationEvent operation)
    {
        if (!verbose && operation.Outcome != OperationOutcome.Error)
        {
            return;
        }
        using var buffer = new MemoryStream();
        using (var writer = new Utf8JsonWriter(buffer))
        {
            writer.WriteStartObject();
            writer.WriteString("timestamp", operation.Timestamp);
            writer.WriteString("operationId", operation.OperationId);
            writer.WriteString("operation", operation.Operation);
            writer.WriteString("outcome", operation.Outcome.ToWire());
            writer.WriteString("sessionId", operation.SessionId?.ToString());
            writer.WriteString("generationId", operation.GenerationId?.ToString());
            writer.WriteString("resourceId", operation.ResourceId?.ToString());
            writer.WriteString("traceId", operation.TraceId);
            writer.WriteString("errorType", operation.ErrorType);
            writer.WriteNumber("durationSeconds", operation.DurationSeconds);
            writer.WriteEndObject();
        }
        logger.Log(operation.Outcome == OperationOutcome.Error ? LogLevel.Error : LogLevel.Information,
            "{OperationEvent}", Encoding.UTF8.GetString(buffer.ToArray()));
    }
 
}