Skip to content

Commit 4a96d68

Browse files
authored
Register TypeInfoProvider explicitly (#527)
- **Add EcsJsonContext.Default to JsonSerializerOptions** - **Update JsonSerializerOptions to combine DefaultJsonTypeInfoResolver with EcsJsonContext** - **Add JsonSerializable attributes for EcsDocument and Labels in EcsJsonContext**
1 parent cffe8e3 commit 4a96d68

File tree

20 files changed

+100
-54
lines changed

20 files changed

+100
-54
lines changed

examples/playground/Program.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using Elastic.Channels;
22
using Elastic.CommonSchema;
3+
using Elastic.CommonSchema.Serialization;
34
using Elastic.Elasticsearch.Ephemeral;
45
using Elastic.Ingest.Elasticsearch;
56
using Elastic.Ingest.Elasticsearch.CommonSchema;
@@ -116,7 +117,8 @@ EcsDataStreamChannel<EcsDocument> SetupElasticsearchChannel()
116117
var c = new EcsDataStreamChannel<EcsDocument>(
117118
new DataStreamChannelOptions<EcsDocument>(new DistributedTransport(transportConfiguration))
118119
{
119-
BufferOptions = bufferOptions
120+
BufferOptions = bufferOptions,
121+
SerializerContext = EcsJsonContext.Default
120122
});
121123

122124
return c;

src/Elastic.CommonSchema.BenchmarkDotNetExporter/ElasticsearchBenchmarkExporter.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
using BenchmarkDotNet.Reports;
1414
using Elastic.Channels;
1515
using Elastic.CommonSchema.BenchmarkDotNetExporter.Domain;
16+
using Elastic.CommonSchema.Serialization;
1617
using Elastic.Ingest.Elasticsearch.CommonSchema;
1718
using Elastic.Ingest.Elasticsearch.DataStreams;
1819
using Elastic.Transport;
@@ -69,6 +70,7 @@ public override void ExportToLog(Summary summary, ILogger logger)
6970
OutboundBufferMaxSize = benchmarksCount,
7071
OutboundBufferMaxLifetime = TimeSpan.FromSeconds(5)
7172
},
73+
SerializerContext = EcsJsonContext.Default,
7274
ExportExceptionCallback = e => observedException ??= e,
7375
ExportResponseCallback = (response, _) =>
7476
{

src/Elastic.CommonSchema.NLog/EcsLayout.cs

Lines changed: 2 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -16,19 +16,10 @@
1616

1717
namespace Elastic.CommonSchema.NLog
1818
{
19-
internal class NlogEcsDocumentCreationOptions : IEcsDocumentCreationOptions
20-
{
21-
public static NlogEcsDocumentCreationOptions Default { get; } = new();
22-
public bool IncludeHost { get; set; } = true;
23-
public bool IncludeProcess { get; set; } = false;
24-
public bool IncludeUser { get; set; } = false;
25-
public bool IncludeActivityData { get; set; } = false;
26-
}
27-
2819
/// <summary> An NLOG layout implementation that renders logs as ECS json</summary>
2920
[Layout(Name)]
3021
[ThreadAgnostic]
31-
public class EcsLayout : Layout
22+
public partial class EcsLayout : Layout
3223
{
3324
/// <summary> An NLOG layout implementation that renders logs as ECS json</summary>
3425
public const string Name = nameof(EcsLayout);
@@ -569,7 +560,7 @@ private Process GetProcess(LogEventInfo logEventInfo)
569560
var processExecutable = ProcessExecutable?.Render(logEventInfo);
570561
var processThreadId = ProcessThreadId?.Render(logEventInfo);
571562
var processThreadName = ProcessThreadName?.Render(logEventInfo);
572-
563+
573564
var previousProcess = _previousProcess;
574565
if (string.IsNullOrEmpty(processThreadId) && string.IsNullOrEmpty(processThreadName))
575566
{
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
using System.Text.Json.Serialization;
2+
3+
namespace Elastic.CommonSchema.NLog;
4+
5+
/// <summary>
6+
///
7+
/// </summary>
8+
[JsonSerializable(typeof(EcsLayout.NLogEcsDocument))]
9+
[JsonSourceGenerationOptions(DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull)]
10+
public partial class NLogEcsJsonContext : JsonSerializerContext { }
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
namespace Elastic.CommonSchema.NLog;
2+
3+
internal class NlogEcsDocumentCreationOptions : IEcsDocumentCreationOptions
4+
{
5+
public static NlogEcsDocumentCreationOptions Default { get; } = new();
6+
public bool IncludeHost { get; set; } = true;
7+
public bool IncludeProcess { get; set; } = false;
8+
public bool IncludeUser { get; set; } = false;
9+
public bool IncludeActivityData { get; set; } = false;
10+
}

src/Elastic.CommonSchema/EcsDocument.Serialization.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ protected internal virtual void WriteAdditionalProperties(Action<string, object>
6363
public static EcsDocument? Deserialize(Stream stream) => EcsSerializerFactory<EcsDocument>.Deserialize(stream);
6464

6565
// ReSharper disable once UnusedMember.Global
66-
/// <summary> Deserialize asynchronously a stream to <see cref="EcsDocument"/> </summary>
66+
/// <summary> Asynchronously deserialize a stream to <see cref="EcsDocument"/> </summary>
6767
public static ValueTask<EcsDocument?> DeserializeAsync(Stream stream, CancellationToken ctx = default) =>
6868
EcsSerializerFactory<EcsDocument>.DeserializeAsync(stream, ctx);
6969

src/Elastic.CommonSchema/Serialization/EcsJsonContext.Generated.cs

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,17 @@
66
/*
77
IMPORTANT NOTE
88
==============
9-
This file has been generated.
9+
This file has been generated.
1010
If you wish to submit a PR please modify the original csharp file and submit the PR with that change. Thanks!
1111
*/
1212

1313
using System.Text.Json.Serialization;
1414

1515
namespace Elastic.CommonSchema.Serialization;
1616

17+
/// An implementation of <see cref="JsonSerializerContext"/> that could be used to be combined with user data
18+
[JsonSerializable(typeof(EcsDocument))]
19+
[JsonSerializable(typeof(Labels))]
1720
[JsonSerializable(typeof(Agent))]
1821
[JsonSerializable(typeof(As))]
1922
[JsonSerializable(typeof(Client))]
@@ -64,7 +67,7 @@ namespace Elastic.CommonSchema.Serialization;
6467
[JsonSerializable(typeof(Volume))]
6568
[JsonSerializable(typeof(Vulnerability))]
6669
[JsonSerializable(typeof(X509))]
67-
[JsonSerializable(typeof(LogEntityJsonConverter.LogOriginInvalid))]
68-
[JsonSerializable(typeof(LogEntityJsonConverter.LogFileOriginInvalid))]
70+
[JsonSerializable(typeof(ParserIntermediary.LogOriginInvalid))]
71+
[JsonSerializable(typeof(ParserIntermediary.LogFileOriginInvalid))]
6972
[JsonSourceGenerationOptions(DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull)]
70-
internal partial class EcsJsonContext : JsonSerializerContext { }
73+
public partial class EcsJsonContext : JsonSerializerContext { }

src/Elastic.CommonSchema/Serialization/JsonConfiguration.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
using System.Text.Encodings.Web;
77
using System.Text.Json;
88
using System.Text.Json.Serialization;
9+
using System.Text.Json.Serialization.Metadata;
910

1011
namespace Elastic.CommonSchema.Serialization
1112
{
@@ -19,6 +20,7 @@ public static class EcsJsonConfiguration
1920
NumberHandling = JsonNumberHandling.AllowNamedFloatingPointLiterals,
2021
Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping,
2122
PropertyNamingPolicy = new SnakeCaseJsonNamingPolicy(),
23+
TypeInfoResolver = JsonTypeInfoResolver.Combine(new DefaultJsonTypeInfoResolver(), EcsJsonContext.Default),
2224
Converters =
2325
{
2426
new EcsDocumentJsonConverterFactory(),

src/Elastic.CommonSchema/Serialization/PropertiesReaderJsonConverterBase.cs

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -57,29 +57,41 @@ internal partial class EcsEntityJsonConverter
5757
private partial bool ReadProperty(ref Utf8JsonReader reader, string propertyName, Ecs ecsEvent, JsonSerializerOptions options) => false;
5858
}
5959

60-
internal partial class LogEntityJsonConverter
60+
61+
/// intermediary parser objects, not meant for direct consumption
62+
public class ParserIntermediary
6163
{
62-
internal class LogFileOriginInvalid
64+
/// intermediary parser for log data in a different format
65+
public class LogFileOriginInvalid
6366
{
67+
/// <inheritdoc cref="LogFieldSet.OriginFileName"/>
6468
[JsonPropertyName("name"), DataMember(Name = "name")]
6569
public string? Name { get; set; }
6670

71+
/// <inheritdoc cref="LogFieldSet.OriginFileLine"/>
6772
[JsonPropertyName("line"), DataMember(Name = "line")]
6873
public int? Line { get; set; }
6974
}
70-
internal class LogOriginInvalid
75+
76+
/// intermediary parser for log data in a different format
77+
public class LogOriginInvalid
7178
{
79+
/// <inheritdoc cref="LogFieldSet.OriginFunction"/>
7280
[JsonPropertyName("function"), DataMember(Name = "function")]
7381
public string? Function { get; set; }
7482

83+
/// <inheritdoc cref="LogFieldSet.FilePath"/>
7584
[JsonPropertyName("file"), DataMember(Name = "file")]
7685
public LogFileOriginInvalid? File { get; set; }
7786
}
87+
}
7888

89+
internal partial class LogEntityJsonConverter
90+
{
7991
private partial bool ReadProperty(ref Utf8JsonReader reader, string propertyName, Log ecsEvent, JsonSerializerOptions options) =>
8092
propertyName switch
8193
{
82-
"origin" => ReadProp<LogOriginInvalid>(ref reader, "origin", ecsEvent, (b, v) =>
94+
"origin" => ReadProp<ParserIntermediary.LogOriginInvalid>(ref reader, "origin", ecsEvent, (b, v) =>
8395
{
8496
if (v == null) return;
8597
b.OriginFunction = v.Function;

src/Elastic.Extensions.Logging.Common/LogEvent.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,4 +81,5 @@ protected override void WriteAdditionalProperties(Action<string, object> write)
8181
if (Scopes != null) write(ScopesPropertyName, Scopes);
8282
}
8383
}
84+
8485
}

0 commit comments

Comments
 (0)