AWS.Lambda.Powertools.Tracing 1.6.0

Prefix Reserved
dotnet add package AWS.Lambda.Powertools.Tracing --version 1.6.0                
NuGet\Install-Package AWS.Lambda.Powertools.Tracing -Version 1.6.0                
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="AWS.Lambda.Powertools.Tracing" Version="1.6.0" />                
For projects that support PackageReference, copy this XML node into the project file to reference the package.
paket add AWS.Lambda.Powertools.Tracing --version 1.6.0                
#r "nuget: AWS.Lambda.Powertools.Tracing, 1.6.0"                
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
// Install AWS.Lambda.Powertools.Tracing as a Cake Addin
#addin nuget:?package=AWS.Lambda.Powertools.Tracing&version=1.6.0

// Install AWS.Lambda.Powertools.Tracing as a Cake Tool
#tool nuget:?package=AWS.Lambda.Powertools.Tracing&version=1.6.0                

AWS.Lambda.Powertools.Tracing

Powertools for AWS Lambda (.NET) tracing is an opinionated thin wrapper for AWS X-Ray .NET SDK a provides functionality to reduce the overhead of performing common tracing tasks.

Key Features

  • Helper methods to improve the developer experience for creating custom AWS X-Ray subsegments.
  • Capture cold start as annotation.
  • Capture function responses and full exceptions as metadata.
  • Better experience when developing with multiple threads.
  • Auto-patch supported modules by AWS X-Ray

Read the docs

For a full list of features go to docs.powertools.aws.dev/lambda/dotnet/core/tracing/

GitHub: https://github.com/aws-powertools/powertools-lambda-dotnet/

Sample Function

View the full example here: https://github.com/aws-powertools/powertools-lambda-dotnet/tree/develop/examples/Tracing

public class Function
{
    /// <summary>
    /// Lambda Handler
    /// </summary>
    /// <param name="apigwProxyEvent">API Gateway Proxy event</param>
    /// <param name="context">AWS Lambda context</param>
    /// <returns>API Gateway Proxy response</returns>
    [Logging(LogEvent = true)]
    [Tracing(CaptureMode = TracingCaptureMode.ResponseAndError)]
    public async Task<APIGatewayProxyResponse> FunctionHandler(APIGatewayProxyRequest apigwProxyEvent,
        ILambdaContext context)
    {
        var requestContextRequestId = apigwProxyEvent.RequestContext.RequestId;

        Logger.LogInformation("Getting ip address from external service");

        var location = await GetCallingIp().ConfigureAwait(false);

        var lookupRecord = new LookupRecord(lookupId: requestContextRequestId,
            greeting: "Hello Powertools for AWS Lambda (.NET)", ipAddress: location);

        // Trace Fluent API
        Tracing.WithSubsegment("LoggingResponse",
            subsegment =>
            {
                subsegment.AddAnnotation("AccountId", apigwProxyEvent.RequestContext.AccountId);
                subsegment.AddMetadata("LookupRecord", lookupRecord);
            });

        try
        {
            await SaveRecordInDynamo(lookupRecord);

            return new APIGatewayProxyResponse
            {
                Body = JsonSerializer.Serialize(lookupRecord),
                StatusCode = 200,
                Headers = new Dictionary<string, string> { { "Content-Type", "application/json" } }
            };
        }
        catch (Exception e)
        {
            Logger.LogError(e.Message);
            
            return new APIGatewayProxyResponse
            {
                Body = e.Message,
                StatusCode = 500,
                Headers = new Dictionary<string, string> { { "Content-Type", "application/json" } }
            };
        }
    }

    /// <summary>
    /// Calls location api to return IP address
    /// </summary>
    /// <returns>IP address string</returns>
    [Tracing(SegmentName = "Location service")]
    private static async Task<string?> GetCallingIp()
    {
        if (_httpClient == null) return "0.0.0.0";
        _httpClient.DefaultRequestHeaders.Accept.Clear();
        _httpClient.DefaultRequestHeaders.Add("User-Agent", "AWS Lambda .Net Client");

        try
        {
            Logger.LogInformation("Calling Check IP API");

            var response = await _httpClient.GetStringAsync("https://checkip.amazonaws.com/").ConfigureAwait(false);
            var ip = response.Replace("\n", "");

            Logger.LogInformation($"API response returned {ip}");

            return ip;
        }
        catch (Exception ex)
        {
            Logger.LogError(ex);
            throw;
        }
    }

    /// <summary>
    /// Saves the lookup record in DynamoDB
    /// </summary>
    /// <param name="lookupRecord">Instance of LookupRecord</param>
    /// <returns>A Task that can be used to poll or wait for results, or both.</returns>
    [Tracing(SegmentName = "DynamoDB")]
    private static async Task SaveRecordInDynamo(LookupRecord lookupRecord)
    {
        try
        {
            Logger.LogInformation($"Saving record with id {lookupRecord.LookupId}");
            await _dynamoDbContext?.SaveAsync(lookupRecord)!;
        }
        catch (AmazonDynamoDBException e)
        {
            Logger.LogCritical(e.Message);
            throw;
        }
    }
}

Sample output

Tracing showcase

Product Compatible and additional computed target framework versions.
.NET net6.0 is compatible.  net6.0-android was computed.  net6.0-ios was computed.  net6.0-maccatalyst was computed.  net6.0-macos was computed.  net6.0-tvos was computed.  net6.0-windows was computed.  net7.0 was computed.  net7.0-android was computed.  net7.0-ios was computed.  net7.0-maccatalyst was computed.  net7.0-macos was computed.  net7.0-tvos was computed.  net7.0-windows was computed.  net8.0 is compatible.  net8.0-android was computed.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-maccatalyst was computed.  net8.0-macos was computed.  net8.0-tvos was computed.  net8.0-windows was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages (1)

Showing the top 1 NuGet packages that depend on AWS.Lambda.Powertools.Tracing:

Package Downloads
Lambifast

Package Description

GitHub repositories (4)

Showing the top 4 popular GitHub repositories that depend on AWS.Lambda.Powertools.Tracing:

Repository Stars
aws/aws-lambda-dotnet
Libraries, samples and tools to help .NET Core developers develop AWS Lambda functions.
aws-samples/serverless-test-samples
This repository is designed to provide guidance for implementing comprehensive test suites for serverless applications.
aws-powertools/powertools-lambda-dotnet
Powertools is a developer toolkit to implement Serverless best practices and increase developer velocity.
aws-samples/serverless-dotnet-demo
Version Downloads Last updated
1.6.0 1,296 11/12/2024
1.5.2 16,545 10/8/2024
1.5.1 17,838 8/29/2024
1.5.0 8,369 7/25/2024
1.4.2 80,034 3/21/2024
1.4.1 15,660 3/10/2024
1.4.0 18,996 2/16/2024
1.3.2 67,958 9/19/2023
1.2.0 12,745 9/7/2023
1.1.2 11,980 8/22/2023
1.1.1 24,853 6/21/2023
1.1.0 19,888 5/5/2023
1.0.1 15,781 4/6/2023
1.0.0 4,208 2/24/2023
0.0.2-preview 224 1/18/2023
0.0.1-preview.1 3,755 8/1/2022