Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .editorconfig
Original file line number Diff line number Diff line change
Expand Up @@ -133,6 +133,7 @@ resharper_redundant_case_label_highlighting=do_not_show
resharper_redundant_argument_default_value_highlighting=do_not_show
# Do not penalize code that explicitly lists generic arguments
resharper_redundant_type_arguments_of_method_highlighting=do_not_show
resharper_switch_expression_handles_some_known_enum_values_with_exception_in_default_highlighting=error

[Jenkinsfile]
indent_style = space
Expand Down
19 changes: 19 additions & 0 deletions src/Elastic.Transport/Components/Pipeline/PipelineFailure.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
// Elasticsearch B.V licenses this file to you under the Apache 2.0 License.
// See the LICENSE file in the project root for more information

using System;
using Elastic.Transport.Products;

namespace Elastic.Transport;
Expand Down Expand Up @@ -56,3 +57,21 @@ public enum PipelineFailure
/// </summary>
NoNodesAttempted
}

internal static class PipelineFailureExtensions
{
public static string ToStringFast(this PipelineFailure failure) => failure switch
{
PipelineFailure.BadAuthentication => nameof(PipelineFailure.BadAuthentication),
PipelineFailure.BadResponse => nameof(PipelineFailure.BadResponse),
PipelineFailure.PingFailure => nameof(PipelineFailure.PingFailure),
PipelineFailure.SniffFailure => nameof(PipelineFailure.SniffFailure),
PipelineFailure.CouldNotStartSniffOnStartup => nameof(PipelineFailure.CouldNotStartSniffOnStartup),
PipelineFailure.MaxTimeoutReached => nameof(PipelineFailure.MaxTimeoutReached),
PipelineFailure.MaxRetriesReached => nameof(PipelineFailure.MaxRetriesReached),
PipelineFailure.Unexpected => nameof(PipelineFailure.Unexpected),
PipelineFailure.BadRequest => nameof(PipelineFailure.BadRequest),
PipelineFailure.NoNodesAttempted => nameof(PipelineFailure.NoNodesAttempted),
_ => throw new ArgumentOutOfRangeException(nameof(failure), failure, null)
};
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@
using System.Globalization;
using System.Text.Json;
using System.Text.Json.Serialization;
using System.Text.Json.Serialization.Metadata;
using Elastic.Transport.Products.Elasticsearch;
using JsonSerializer = System.Text.Json.JsonSerializer;

namespace Elastic.Transport;
Expand All @@ -17,15 +19,15 @@ public override DynamicDictionary Read(ref Utf8JsonReader reader, Type typeToCon
{
if (reader.TokenType == JsonTokenType.StartArray)
{
var array = JsonSerializer.Deserialize<object[]>(ref reader, options); // TODO: Test! This might not work without adding `object[]` to `ErrorSerializationContext`
var array = JsonSerializer.Deserialize<object[]>(ref reader, ErrorSerializerContext.Default.ObjectArray); // TODO: Test! This might not work without adding `object[]` to `ErrorSerializationContext`
var arrayDict = new Dictionary<string, object>();
for (var i = 0; i < array.Length; i++)
arrayDict[i.ToString(CultureInfo.InvariantCulture)] = new DynamicValue(array[i]);
return DynamicDictionary.Create(arrayDict);
}
if (reader.TokenType != JsonTokenType.StartObject) throw new JsonException();

var dict = JsonSerializer.Deserialize<Dictionary<string, object>>(ref reader, options); // TODO: Test! This might not work without adding `Dictionary<string, object>` to `ErrorSerializationContext`
var dict = JsonSerializer.Deserialize<Dictionary<string, object>>(ref reader, ErrorSerializerContext.Default.DictionaryStringObject); // TODO: Test! This might not work without adding `Dictionary<string, object>` to `ErrorSerializationContext`
return DynamicDictionary.Create(dict);
}

Expand All @@ -39,7 +41,10 @@ public override void Write(Utf8JsonWriter writer, DynamicDictionary dictionary,

writer.WritePropertyName(kvp.Key);

JsonSerializer.Serialize(writer, kvp.Value.Value, kvp.Value.GetType(), options); // TODO: Test! We have to make sure all possible "Value" types are registered in the `ErrorSerializationContext`
// TODO: Test! We have to make sure all possible "Value" types are registered in the `ErrorSerializationContext`
#pragma warning disable IL2026, IL3050 // ErrorSerializerContext is registered.
JsonSerializer.Serialize(writer, kvp.Value.Value, kvp.Value.GetType(), options);
#pragma warning restore IL2026, IL3050
}

writer.WriteEndObject();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
using System.Collections.Generic;
using System.Text.Json;
using System.Text.Json.Serialization;
using Elastic.Transport.Products.Elasticsearch;
using JsonSerializer = System.Text.Json.JsonSerializer;

namespace Elastic.Transport;
Expand Down Expand Up @@ -71,7 +72,7 @@ public override void Write(Utf8JsonWriter writer, Exception value, JsonSerialize
foreach (var kv in flattenedException)
{
writer.WritePropertyName(kv.Key);
JsonSerializer.Serialize(writer, kv.Value, options); // TODO: Test! This might not work without adding `KeyValuePair<string, object>` to `ErrorSerializationContext`
JsonSerializer.Serialize(writer, kv.Value, ErrorSerializerContext.Default.Object); // TODO: Test! This might not work without adding `KeyValuePair<string, object>` to `ErrorSerializationContext`
}
writer.WriteEndObject();
}
Expand Down
4 changes: 2 additions & 2 deletions src/Elastic.Transport/Diagnostics/Auditing/Audit.cs
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ public override string ToString()
if (took >= TimeSpan.Zero) tookString = $" Took: {took}";

return Node == null
? $"Event: {Event.GetStringValue()}{tookString}"
: $"Event: {Event.GetStringValue()} Node: {Node?.Uri} NodeAlive: {Node?.IsAlive}Took: {tookString}";
? $"Event: {Event.ToStringFast()}{tookString}"
: $"Event: {Event.ToStringFast()} Node: {Node?.Uri} NodeAlive: {Node?.IsAlive}Took: {tookString}";
}
}
29 changes: 29 additions & 0 deletions src/Elastic.Transport/Diagnostics/Auditing/AuditEvent.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@
// Elasticsearch B.V licenses this file to you under the Apache 2.0 License.
// See the LICENSE file in the project root for more information

using System;

namespace Elastic.Transport.Diagnostics.Auditing;

/// <summary>
Expand Down Expand Up @@ -87,3 +89,30 @@ public enum AuditEvent
/// </summary>
FailedOverAllNodes,
}

internal static class AuditEventExtensions
{
public static string ToStringFast(this AuditEvent auditEvent) => auditEvent switch
{
AuditEvent.SniffOnStartup => nameof(AuditEvent.SniffOnStartup),
AuditEvent.SniffOnFail => nameof(AuditEvent.SniffOnFail),
AuditEvent.SniffOnStaleCluster => nameof(AuditEvent.SniffOnStaleCluster),
AuditEvent.SniffSuccess => nameof(AuditEvent.SniffSuccess),
AuditEvent.SniffFailure => nameof(AuditEvent.SniffFailure),
AuditEvent.PingSuccess => nameof(AuditEvent.PingSuccess),
AuditEvent.PingFailure => nameof(AuditEvent.PingFailure),
AuditEvent.Resurrection => nameof(AuditEvent.Resurrection),
AuditEvent.AllNodesDead => nameof(AuditEvent.AllNodesDead),
AuditEvent.BadResponse => nameof(AuditEvent.BadResponse),
AuditEvent.HealthyResponse => nameof(AuditEvent.HealthyResponse),
AuditEvent.MaxTimeoutReached => nameof(AuditEvent.MaxTimeoutReached),
AuditEvent.MaxRetriesReached => nameof(AuditEvent.MaxRetriesReached),
AuditEvent.BadRequest => nameof(AuditEvent.BadRequest),
AuditEvent.NoNodesAttempted => nameof(AuditEvent.NoNodesAttempted),
AuditEvent.CancellationRequested => nameof(AuditEvent.CancellationRequested),
AuditEvent.FailedOverAllNodes => nameof(AuditEvent.FailedOverAllNodes),
_ => throw new ArgumentOutOfRangeException(nameof(auditEvent), auditEvent, null)
};

}

10 changes: 5 additions & 5 deletions src/Elastic.Transport/Elastic.Transport.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,11 @@
<IsPackable>true</IsPackable>
<GenerateDocumentationFile>true</GenerateDocumentationFile>
<TargetFrameworks>netstandard2.0;netstandard2.1;net462;net8.0</TargetFrameworks>
<IsAotCompatible>true</IsAotCompatible>
<JsonSerializerIsReflectionEnabledByDefault>false</JsonSerializerIsReflectionEnabledByDefault>
</PropertyGroup>
<PropertyGroup Condition="'$(TargetFramework)' == 'net8.0'">
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@Mpdreamz I learned that it's better to use e.g. $([MSBuild]::IsTargetFrameworkCompatible('$(TargetFramework)', 'net8.0')) in these cases, because otherwise, the condition does not equate to true for "sub-frameworks" like net8.0-ios, etc.

<IsAotCompatible>true</IsAotCompatible>
</PropertyGroup>

<PropertyGroup Condition="$([MSBuild]::IsTargetFrameworkCompatible('$(TargetFramework)', 'net8.0')) or
$([MSBuild]::IsTargetFrameworkCompatible('$(TargetFramework)', 'net9.0'))">
Expand All @@ -35,10 +37,8 @@
</ItemGroup>

<ItemGroup>
<PackageReference Include="PolySharp" Version="1.15.0">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="PolySharp" Version="1.15.0" PrivateAssets="all"
IncludeAssets="runtime; build; native; contentfiles; analyzers; buildtransitive"/>
</ItemGroup>

<ItemGroup Condition="'$(TargetFramework)' != 'net8.0'">
Expand Down
4 changes: 2 additions & 2 deletions src/Elastic.Transport/Exceptions/TransportException.cs
Original file line number Diff line number Diff line change
Expand Up @@ -66,9 +66,9 @@ public string DebugInformation
get
{
var sb = new StringBuilder();
var failureReason = FailureReason.GetStringValue();
var failureReason = FailureReason is { } r ? r.ToStringFast() : string.Empty;
if (FailureReason == PipelineFailure.Unexpected && AuditTrail.HasAny(out var auditTrail))
failureReason = "Unrecoverable/Unexpected " + auditTrail.Last().Event.GetStringValue();
failureReason = "Unrecoverable/Unexpected " + auditTrail.Last().Event.ToStringFast();

sb.Append("# FailureReason: ")
.Append(failureReason)
Expand Down
73 changes: 0 additions & 73 deletions src/Elastic.Transport/Extensions/EnumExtensions.cs

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
// Elasticsearch B.V licenses this file to you under the Apache 2.0 License.
// See the LICENSE file in the project root for more information

using System.Collections.Generic;
using System.Text.Json;
using System.Text.Json.Serialization;
using System.Text.Json.Serialization.Metadata;
Expand All @@ -12,7 +13,12 @@ namespace Elastic.Transport.Products.Elasticsearch;
[JsonSerializable(typeof(JsonElement))]
[JsonSerializable(typeof(Error))]
[JsonSerializable(typeof(ErrorCause))]
[JsonSerializable(typeof(IReadOnlyCollection<ErrorCause>))]
[JsonSerializable(typeof(ElasticsearchServerError))]
[JsonSerializable(typeof(ElasticsearchResponse))]
[JsonSourceGenerationOptions(GenerationMode = JsonSourceGenerationMode.Default)]
[JsonSerializable(typeof(object[]))]
[JsonSerializable(typeof(Dictionary<string, object>))]
[JsonSerializable(typeof(IReadOnlyDictionary<string, string>))]
[JsonSerializable(typeof(string))]
[JsonSourceGenerationOptions(GenerationMode = JsonSourceGenerationMode.Default, UseStringEnumConverter = true)]
public partial class ErrorSerializerContext : JsonSerializerContext;
Loading
Loading