AWS.Lambda.Powertools.Tracing 1.6.1 (original) (raw)

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

Key Features

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

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. net9.0 was computed. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 was computed. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed.

NuGet packages (1)

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

Package Downloads
Lambifast Package Description 164

GitHub repositories (3)

Showing the top 3 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. 1.6K
aws-samples/serverless-test-samples This repository is designed to provide guidance for implementing comprehensive test suites for serverless applications. 325
aws-samples/serverless-dotnet-demo 155
Version Downloads Last updated
1.6.1 23,453 2/11/2025
1.6.0 44,646 11/12/2024
1.5.2 121,893 10/8/2024
1.5.1 30,188 8/29/2024
1.5.0 14,824 7/25/2024
1.4.2 110,793 3/21/2024
1.4.1 28,255 3/10/2024
1.4.0 23,579 2/16/2024
1.3.2 85,882 9/19/2023
1.2.0 15,398 9/7/2023
1.1.2 12,313 8/22/2023
1.1.1 28,016 6/21/2023
1.1.0 21,817 5/5/2023
1.0.1 16,109 4/6/2023
1.0.0 4,690 2/24/2023
0.0.2-preview 248 1/18/2023
0.0.1-preview.1 4,004 8/1/2022