Skip to content

Bug: Metrics throws exception when using AddMetadata (An item with the same key has already been added) #504

Closed
@hjgraca

Description

@hjgraca

Expected Behaviour

When using Metrics.AddMetadata should not throw exception on the second Lambda invocation saying the An item with the same key has already been added

Current Behaviour

There are two issues when calling Metrics.AddMetadata

  • If the same key is used on the Metrics.AddMetric and on the Metrics.AddMetadata - it will throw the An item with the same key has already been added exception
  • On the second Lambda invocation it will throw the An item with the same key has already been added exception

Code snippet

[Metrics(Namespace = "ns", Service = "svc")]
    public async Task<string> Handle(string input)
    {
        // fails when key is same
        // add Metrics and addMetadata

        Metrics.AddMetric("MyMetric", 1);
        Metrics.AddMetadata("MyMetric", "meta");


        // fails on second call when key are different

        Metrics.AddMetric("MyMetric", 1);
        Metrics.AddMetadata("MyMetadata", "meta");
        
        await Task.Delay(1);

        return input.ToUpper(CultureInfo.InvariantCulture);
    }

Possible Solution

No response

Steps to Reproduce

[Metrics(Namespace = "ns", Service = "svc")]
public async Task<string> Handle(string input)
{
    // fails when key is same
    // add Metrics and addMetadata

    Metrics.AddMetric("MyMetric", 1);
    Metrics.AddMetadata("MyMetric", "meta");


    // fails on second call when key are different

    Metrics.AddMetric("MyMetric", 1);
    Metrics.AddMetadata("MyMetadata", "meta");
    
    await Task.Delay(1);

    return input.ToUpper(CultureInfo.InvariantCulture);
}

Powertools for AWS Lambda (.NET) version

latest

AWS Lambda function runtime

dotnet6

Debugging logs

System.ArgumentException
An item with the same key has already been added. Key: MyMetadata
   at System.Collections.Generic.Dictionary`2.TryInsert(TKey key, TValue value, InsertionBehavior behavior)
   at System.Collections.Generic.Dictionary`2.Add(TKey key, TValue value)
   at AWS.Lambda.Powertools.Metrics.Metadata.AddMetadata(String key, Object value) in /Users/henrigra/work/aws-lambda-powertools-dotnet/libraries/src/AWS.Lambda.Powertools.Metrics/Model/Metadata.cs:line 161
   at AWS.Lambda.Powertools.Metrics.MetricsContext.AddMetadata(String key, Object value) in /Users/henrigra/work/aws-lambda-powertools-dotnet/libraries/src/AWS.Lambda.Powertools.Metrics/Model/MetricsContext.cs:line 154
   at AWS.Lambda.Powertools.Metrics.Metrics.AWS.Lambda.Powertools.Metrics.IMetrics.AddMetadata(String key, Object value) in /Users/henrigra/work/aws-lambda-powertools-dotnet/libraries/src/AWS.Lambda.Powertools.Metrics/Metrics.cs:line 174
   at AWS.Lambda.Powertools.Metrics.Metrics.AddMetadata(String key, Object value) in /Users/henrigra/work/aws-lambda-powertools-dotnet/libraries/src/AWS.Lambda.Powertools.Metrics/Metrics.cs:line 326
   at AWS.Lambda.Powertools.Metrics.Tests.Handlers.FunctionHandler.Handle(String input) in /Users/henrigra/work/aws-lambda-powertools-dotnet/libraries/tests/AWS.Lambda.Powertools.Metrics.Tests/Handlers/FunctionHandler.cs:line 33
   at AWS.Lambda.Powertools.Common.MethodAspectAttribute.WrapAsync[T](Func`2 target, Object[] args, AspectEventArgs eventArgs) in /Users/henrigra/work/aws-lambda-powertools-dotnet/libraries/src/AWS.Lambda.Powertools.Common/Aspects/MethodAspectAttribute.cs:line 90
   at AWS.Lambda.Powertools.Metrics.MetricsAspectHandler.OnException(AspectEventArgs eventArgs, Exception exception) in /Users/henrigra/work/aws-lambda-powertools-dotnet/libraries/src/AWS.Lambda.Powertools.Metrics/Internal/MetricsAspectHandler.cs:line 133
   at AWS.Lambda.Powertools.Common.MethodAspectAttribute.WrapAsync[T](Func`2 target, Object[] args, AspectEventArgs eventArgs) in /Users/henrigra/work/aws-lambda-powertools-dotnet/libraries/src/AWS.Lambda.Powertools.Common/Aspects/MethodAspectAttribute.cs:line 96

Metadata

Metadata

Assignees

Labels

bugUnexpected, reproducible and unintended software behaviour

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions