Skip to content

Commit 01f61d8

Browse files
committed
add dependency to ILambdaContext, Powertools Lambda Context fails serialization due to reflection (AOT). Create new converter and use the default one on strings only.
1 parent 33546b4 commit 01f61d8

File tree

6 files changed

+84
-117
lines changed

6 files changed

+84
-117
lines changed

libraries/src/AWS.Lambda.Powertools.Metrics/AWS.Lambda.Powertools.Metrics.csproj

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,5 +10,13 @@
1010
<ItemGroup>
1111
<ProjectReference Include="..\AWS.Lambda.Powertools.Common\AWS.Lambda.Powertools.Common.csproj" PrivateAssets="All" />
1212
</ItemGroup>
13+
14+
<ItemGroup>
15+
<Compile Remove="Serializer\StringEnumConverter.cs" />
16+
</ItemGroup>
17+
18+
<ItemGroup>
19+
<PackageReference Include="Amazon.Lambda.Core" />
20+
</ItemGroup>
1321

1422
</Project>

libraries/src/AWS.Lambda.Powertools.Metrics/Internal/MetricsAspect.cs

Lines changed: 22 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
using System.Collections.Generic;
1818
using System.Linq;
1919
using System.Reflection;
20+
using Amazon.Lambda.Core;
2021
using AspectInjector.Broker;
2122
using AWS.Lambda.Powertools.Common;
2223

@@ -34,11 +35,6 @@ public class MetricsAspect
3435
/// </summary>
3536
private static bool _isColdStart;
3637

37-
/// <summary>
38-
/// Specify to clear Lambda Context on exit
39-
/// </summary>
40-
private bool _clearLambdaContext;
41-
4238
/// <summary>
4339
/// Gets the metrics instance.
4440
/// </summary>
@@ -100,14 +96,14 @@ public void Before(
10096
var nameSpace = _metricsInstance.GetNamespace();
10197
var service = _metricsInstance.GetService();
10298
Dictionary<string, string> dimensions = null;
103-
104-
_clearLambdaContext = PowertoolsLambdaContext.Extract(eventArgs);
105-
106-
if (PowertoolsLambdaContext.Instance is not null)
99+
100+
var context = GetContext(eventArgs);
101+
102+
if (context is not null)
107103
{
108104
dimensions = new Dictionary<string, string>
109105
{
110-
{ "FunctionName", PowertoolsLambdaContext.Instance.FunctionName }
106+
{ "FunctionName", context.FunctionName }
111107
};
112108
}
113109

@@ -129,8 +125,6 @@ public void Before(
129125
public void Exit()
130126
{
131127
_metricsInstance.Flush();
132-
if (_clearLambdaContext)
133-
PowertoolsLambdaContext.Clear();
134128
}
135129

136130

@@ -142,6 +136,21 @@ internal static void ResetForTest()
142136
_metricsInstance = null;
143137
_isColdStart = true;
144138
Metrics.ResetForTest();
145-
PowertoolsLambdaContext.Clear();
139+
}
140+
141+
/// <summary>
142+
/// Gets the Lambda context
143+
/// </summary>
144+
/// <param name="args"></param>
145+
/// <returns></returns>
146+
private static ILambdaContext GetContext(AspectEventArgs args)
147+
{
148+
var index = Array.FindIndex(args.Method.GetParameters(), p => p.ParameterType == typeof(ILambdaContext));
149+
if (index >= 0)
150+
{
151+
return (ILambdaContext)args.Args[index];
152+
}
153+
154+
return null;
146155
}
147156
}

libraries/src/AWS.Lambda.Powertools.Metrics/Model/MetricResolution.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
1-
using System.Runtime.Serialization;
21
using System.Text.Json.Serialization;
32

43
namespace AWS.Lambda.Powertools.Metrics;
54

65
/// <summary>
76
/// Enum MetricResolution
87
/// </summary>
8+
[JsonConverter(typeof(MetricResolutionJsonConverter))]
99
public enum MetricResolution
1010
{
1111
/// <summary>

libraries/src/AWS.Lambda.Powertools.Metrics/Model/MetricUnit.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ namespace AWS.Lambda.Powertools.Metrics;
2424
#if NET8_0_OR_GREATER
2525
[JsonConverter(typeof(JsonStringEnumConverter<MetricUnit>))]
2626
#else
27-
[JsonConverter(typeof(StringEnumConverter))]
27+
[JsonConverter(typeof(JsonStringEnumConverter))]
2828
#endif
2929
public enum MetricUnit
3030
{
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
using System;
2+
using System.Text.Json;
3+
using System.Text.Json.Serialization;
4+
5+
namespace AWS.Lambda.Powertools.Metrics;
6+
7+
/// <summary>
8+
/// Class MetricResolutionJsonConverter.
9+
/// Implements the <see cref="System.Text.Json.Serialization.JsonConverter{T}" />
10+
/// </summary>
11+
/// <seealso cref="System.Text.Json.Serialization.JsonConverter{T}" />
12+
public class MetricResolutionJsonConverter : JsonConverter<MetricResolution>
13+
{
14+
/// <summary>
15+
/// Reads the JSON representation of the object.
16+
/// </summary>
17+
/// <param name="reader">The <see cref="T:Utf8JsonReader" /> to read from.</param>
18+
/// <param name="typeToConvert">The <see cref="T:System.Type" /> being converted.</param>
19+
/// <param name="options">The <see cref="T:Utf8JsonSerializerOptions" /> being used.</param>
20+
/// <returns>The object value.</returns>
21+
public override MetricResolution Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
22+
{
23+
switch (reader.TokenType)
24+
{
25+
case JsonTokenType.String:
26+
{
27+
string stringValue = reader.GetString();
28+
if (int.TryParse(stringValue, out int value))
29+
{
30+
return (MetricResolution)value;
31+
}
32+
33+
break;
34+
}
35+
case JsonTokenType.Number:
36+
return (MetricResolution)reader.GetInt32();
37+
}
38+
39+
throw new JsonException();
40+
}
41+
42+
/// <summary>
43+
/// Writes the JSON representation of the object.
44+
/// </summary>
45+
/// <param name="writer">The <see cref="T:Utf8JsonWriter" /> to write to.</param>
46+
/// <param name="value">The value to convert.</param>
47+
/// <param name="options">The <see cref="T:Utf8JsonSerializerOptions" /> being used.</param>
48+
public override void Write(Utf8JsonWriter writer, MetricResolution value, JsonSerializerOptions options)
49+
{
50+
writer.WriteNumberValue((int)value);
51+
}
52+
}

libraries/src/AWS.Lambda.Powertools.Metrics/Serializer/StringEnumConverter.cs

Lines changed: 0 additions & 102 deletions
This file was deleted.

0 commit comments

Comments
 (0)