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
<PackageReference Include="AWS.Lambda.Powertools.Tracing" Version="1.6.0" />
paket add AWS.Lambda.Powertools.Tracing --version 1.6.0
#r "nuget: AWS.Lambda.Powertools.Tracing, 1.6.0"
// 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
Product | Versions 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. |
-
net6.0
- Amazon.Lambda.Serialization.SystemTextJson (>= 2.4.3)
- AspectInjector (>= 2.8.1)
- AWSSDK.XRay (>= 3.7.400.8)
- AWSXRayRecorder.Core (>= 2.15.0)
- AWSXRayRecorder.Handlers.AwsSdk (>= 2.13.0)
-
net8.0
- Amazon.Lambda.Serialization.SystemTextJson (>= 2.4.3)
- AspectInjector (>= 2.8.1)
- AWSSDK.XRay (>= 3.7.400.8)
- AWSXRayRecorder.Core (>= 2.15.0)
- AWSXRayRecorder.Handlers.AwsSdk (>= 2.13.0)
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 |