From 76ebb55ab733af3c89d609dbad03416dc326018e Mon Sep 17 00:00:00 2001 From: AliveDevil Date: Sun, 14 Jan 2024 01:11:41 +0100 Subject: [PATCH] Review logging --- src/pdns-dhcp/Kea/KeaDhcpLeaseWatcher.cs | 2 +- src/pdns-dhcp/Kea/KeaService.cs | 2 +- src/pdns-dhcp/PowerDns/Methods.cs | 2 +- src/pdns-dhcp/PowerDns/Parameters.cs | 31 ++++++++- src/pdns-dhcp/PowerDns/PowerDnsHandler.cs | 69 ++++++++++--------- .../PowerDns/PowerDnsSerializerContext.cs | 2 +- src/pdns-dhcp/Services/DhcpWatcher.cs | 2 +- 7 files changed, 71 insertions(+), 39 deletions(-) diff --git a/src/pdns-dhcp/Kea/KeaDhcpLeaseWatcher.cs b/src/pdns-dhcp/Kea/KeaDhcpLeaseWatcher.cs index e6c619f..13ff3b0 100644 --- a/src/pdns-dhcp/Kea/KeaDhcpLeaseWatcher.cs +++ b/src/pdns-dhcp/Kea/KeaDhcpLeaseWatcher.cs @@ -206,7 +206,7 @@ public sealed class KeaDhcpLeaseWatcher : IHostedService } else { - await waitHandle.WaitOneAsync(stoppingToken).ConfigureAwait(continueOnCapturedContext: false); + await waitHandle.WaitOneAsync(stoppingToken).ConfigureAwait(false); } } } diff --git a/src/pdns-dhcp/Kea/KeaService.cs b/src/pdns-dhcp/Kea/KeaService.cs index 863be32..c166227 100644 --- a/src/pdns-dhcp/Kea/KeaService.cs +++ b/src/pdns-dhcp/Kea/KeaService.cs @@ -49,6 +49,6 @@ public class KeaService : IHostedService var waitTask = Task.WhenAll(tasks); TaskCompletionSource taskCompletionSource = new(); using var registration = cancellationToken.Register(s => ((TaskCompletionSource)s!).SetCanceled(), taskCompletionSource); - await Task.WhenAny(waitTask, taskCompletionSource.Task).ConfigureAwait(continueOnCapturedContext: false); + await Task.WhenAny(waitTask, taskCompletionSource.Task).ConfigureAwait(false); } } diff --git a/src/pdns-dhcp/PowerDns/Methods.cs b/src/pdns-dhcp/PowerDns/Methods.cs index 37f5928..1a6a64a 100644 --- a/src/pdns-dhcp/PowerDns/Methods.cs +++ b/src/pdns-dhcp/PowerDns/Methods.cs @@ -4,7 +4,7 @@ public interface IMethod; public record MethodBase(string Method); -public abstract record Method(string Method, TParam Parameters) : MethodBase(Method) +public record Method(string Method, TParam Parameters) : MethodBase(Method) where TParam : MethodParameters; public record InitializeMethod(InitializeParameters Parameters) : Method("initialize", Parameters), IMethod; diff --git a/src/pdns-dhcp/PowerDns/Parameters.cs b/src/pdns-dhcp/PowerDns/Parameters.cs index 93238c1..4d11a5d 100644 --- a/src/pdns-dhcp/PowerDns/Parameters.cs +++ b/src/pdns-dhcp/PowerDns/Parameters.cs @@ -1,16 +1,43 @@ +using System.Text; using System.Text.Json; using System.Text.Json.Serialization; namespace pdns_dhcp.PowerDns; -[JsonDerivedType(typeof(InitializeParameters))] -[JsonDerivedType(typeof(LookupParameters))] public record class Parameters; +[JsonDerivedType(typeof(InitializeParameters))] +[JsonDerivedType(typeof(LookupParameters))] public record class MethodParameters : Parameters { [JsonExtensionData] public Dictionary AdditionalProperties { get; set; } = []; + + protected override bool PrintMembers(StringBuilder builder) + { + if (base.PrintMembers(builder)) + { + builder.Append(", "); + } + + builder.Append("AdditionalProperties = ["); + bool append = false; + foreach (var kv in AdditionalProperties) + { + if (append) + { + builder.Append(", "); + } + + append = true; + builder.Append(kv.Key); + builder.Append(" = "); + builder.Append(kv.Value); + } + + builder.Append(']'); + return true; + } } public record class InitializeParameters( diff --git a/src/pdns-dhcp/PowerDns/PowerDnsHandler.cs b/src/pdns-dhcp/PowerDns/PowerDnsHandler.cs index cacee28..fa8b598 100644 --- a/src/pdns-dhcp/PowerDns/PowerDnsHandler.cs +++ b/src/pdns-dhcp/PowerDns/PowerDnsHandler.cs @@ -72,39 +72,44 @@ public class PowerDnsHandler : ConnectionHandler continue; } - MethodBase method; - try - { - using var jsonDocument = JsonDocument.Parse(json.WrittenMemory); - var root = jsonDocument.RootElement; - if (!root.TryGetProperty("method", out var methodElement)) - { - _logger.LogWarning("Json Document missing required property method: {document}", jsonDocument); - continue; - } - - if (Parse(methodElement, root.GetProperty("parameters")) is not { } methodLocal) - { - continue; - } - - method = methodLocal; - } - finally - { - json.Clear(); - state = default; - } - Reply reply = BoolReply.False; try { + MethodBase method; + try + { + using var jsonDocument = JsonDocument.Parse(json.WrittenMemory); + var root = jsonDocument.RootElement; + if (!root.TryGetProperty("method", out var methodElement)) + { + _logger.LogWarning("Json Document missing required property method: {document}", jsonDocument); + continue; + } + + if (Parse(methodElement, root.GetProperty("parameters")) is not { } methodLocal) + { + continue; + } + + method = methodLocal; + } + finally + { + json.Clear(); + state = default; + } + reply = await Handle(method, connection.ConnectionClosed).ConfigureAwait(false); } - catch (Exception e) { } - - await JsonSerializer.SerializeAsync(writer, reply, PowerDnsSerializerContext.Default.Reply, connection.ConnectionClosed) - .ConfigureAwait(continueOnCapturedContext: false); + catch (Exception e) + { + _logger.LogError(e, "Error"); + } + finally + { + await JsonSerializer.SerializeAsync(writer, reply, PowerDnsSerializerContext.Default.Reply, connection.ConnectionClosed) + .ConfigureAwait(false); + } } input.AdvanceTo(read.Buffer.End); @@ -166,7 +171,7 @@ public class PowerDnsHandler : ConnectionHandler return element.GetString() switch { null => null, - { } methodName when !Converters.TryGetValue(methodName, out converter) => new MethodBase(methodName), + { } methodName when !Converters.TryGetValue(methodName, out converter) => new Method(methodName, parameters.Deserialize(PowerDnsSerializerContext.Default.MethodParameters)!), _ => converter(parameters) }; } @@ -184,7 +189,7 @@ public class PowerDnsHandler : ConnectionHandler static ValueTask LogUnhandled(ILogger logger, MethodBase method) { - logger.LogWarning("Unhandled Method {Method}", method); + logger.LogWarning("Unhandled {Method}", method); return ValueTask.FromResult(BoolReply.False); } } @@ -193,7 +198,7 @@ public class PowerDnsHandler : ConnectionHandler { if (_logger.IsEnabled(LogLevel.Information)) { - _logger.LogInformation("Handling Initialize {parameters}", parameters); + _logger.LogInformation("Handling {parameters}", parameters); } return ValueTask.FromResult(BoolReply.True); @@ -217,7 +222,7 @@ public class PowerDnsHandler : ConnectionHandler if (_logger.IsEnabled(LogLevel.Information)) { - _logger.LogInformation("Searching for {key} in {family}", parameters.Qname, parameters.Qtype); + _logger.LogInformation("Lookup {key} in {family}", parameters.Qname, parameters.Qtype); } return FindByName(((AddressFamily)qtype, parameters.Qname.AsMemory()), _repository, _logger); diff --git a/src/pdns-dhcp/PowerDns/PowerDnsSerializerContext.cs b/src/pdns-dhcp/PowerDns/PowerDnsSerializerContext.cs index 84c3085..942bc8c 100644 --- a/src/pdns-dhcp/PowerDns/PowerDnsSerializerContext.cs +++ b/src/pdns-dhcp/PowerDns/PowerDnsSerializerContext.cs @@ -3,7 +3,7 @@ using System.Text.Json.Serialization; namespace pdns_dhcp.PowerDns; [JsonSerializable(typeof(Reply))] -[JsonSerializable(typeof(Parameters))] +[JsonSerializable(typeof(MethodParameters))] [JsonSourceGenerationOptions( DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull, NumberHandling = JsonNumberHandling.AllowReadingFromString, diff --git a/src/pdns-dhcp/Services/DhcpWatcher.cs b/src/pdns-dhcp/Services/DhcpWatcher.cs index 0ce62ed..da6c4c1 100644 --- a/src/pdns-dhcp/Services/DhcpWatcher.cs +++ b/src/pdns-dhcp/Services/DhcpWatcher.cs @@ -45,6 +45,6 @@ public class DhcpWatcher : IHostedService var waitTask = Task.WhenAll(tasks); TaskCompletionSource taskCompletionSource = new(); using var registration = cancellationToken.Register(s => ((TaskCompletionSource)s!).SetCanceled(), taskCompletionSource); - await Task.WhenAny(waitTask, taskCompletionSource.Task).ConfigureAwait(continueOnCapturedContext: false); + await Task.WhenAny(waitTask, taskCompletionSource.Task).ConfigureAwait(false); } }