diff --git a/.github/renovate.json b/.github/renovate.json index 9629b838..9b8bbba1 100644 --- a/.github/renovate.json +++ b/.github/renovate.json @@ -42,6 +42,17 @@ "matchCurrentValue": "^\\[[^,]+,\\)$", "enabled": false }, + { + "extends": ["monorepo:aws-sdk-net"], + "description": ["Only update the AWS SDK once a week"], + "schedule": ["* 5-21 * * MON"] + }, + { + "extends": ["monorepo:aws-sdk-net"], + "description": ["Disable major version updates for the AWS SDK"], + "matchUpdateTypes": ["major"], + "enabled": false + }, { "extends": ["monorepo:dotnet"], "description": "Disable major version updates for .NET", diff --git a/docker/docker-compose-aspnetcore/docker-compose.oats.yml b/docker/docker-compose-aspnetcore/docker-compose.oats.yml index ad92f303..c01f243c 100644 --- a/docker/docker-compose-aspnetcore/docker-compose.oats.yml +++ b/docker/docker-compose-aspnetcore/docker-compose.oats.yml @@ -5,6 +5,10 @@ services: context: ../.. dockerfile: examples/net8.0/aspnetcore/Dockerfile environment: + - AWS_ACCESS_KEY_ID=localstack + - AWS_SECRET_ACCESS_KEY=localstack + - AWS_REGION=us-east-1 + - AWS_ENDPOINT_URL_S3=http://localstack:4566 - OTEL_EXPORTER_OTLP_ENDPOINT=http://lgtm:4317 ports: - "5000:8080" @@ -28,3 +32,8 @@ services: environment: - ACCEPT_EULA=Y - MSSQL_SA_PASSWORD=Password12345%% + localstack: + image: localstack/localstack:4.5.0@sha256:9d4253786e0effe974d77fe3c390358391a56090a4fff83b4600d8a64404d95d + ports: + - "4510-4559:4510-4559" + - "4566:4566" diff --git a/docker/docker-compose-aspnetcore/docker-compose.self-contained.oats.yml b/docker/docker-compose-aspnetcore/docker-compose.self-contained.oats.yml index c3f797f8..ea48db4b 100644 --- a/docker/docker-compose-aspnetcore/docker-compose.self-contained.oats.yml +++ b/docker/docker-compose-aspnetcore/docker-compose.self-contained.oats.yml @@ -8,6 +8,10 @@ services: DOTNET_PUBLISH_ARGS: "--self-contained true /p:PublishSingleFile=true" entrypoint: ./aspnetcore environment: + - AWS_ACCESS_KEY_ID=localstack + - AWS_SECRET_ACCESS_KEY=localstack + - AWS_REGION=us-east-1 + - AWS_ENDPOINT_URL_S3=http://localstack:4566 - OTEL_EXPORTER_OTLP_ENDPOINT=http://lgtm:4317 ports: - "5000:8080" @@ -31,3 +35,8 @@ services: environment: - ACCEPT_EULA=Y - MSSQL_SA_PASSWORD=Password12345%% + localstack: + image: localstack/localstack:4.5.0@sha256:9d4253786e0effe974d77fe3c390358391a56090a4fff83b4600d8a64404d95d + ports: + - "4510-4559:4510-4559" + - "4566:4566" diff --git a/docker/docker-compose-aspnetcore/docker-compose.yml b/docker/docker-compose-aspnetcore/docker-compose.yml index e68c3a5b..4fcdfc5d 100644 --- a/docker/docker-compose-aspnetcore/docker-compose.yml +++ b/docker/docker-compose-aspnetcore/docker-compose.yml @@ -9,6 +9,11 @@ services: - mssql ports: - "8080:8080" # for OATs + environment: + - AWS_ACCESS_KEY_ID=localstack + - AWS_SECRET_ACCESS_KEY=localstack + - AWS_REGION=us-east-1 + - AWS_ENDPOINT_URL_S3=http://localstack:4566 redis: image: redis:8.0@sha256:1b835e5a8d5db58e8b718850bf43a68ef5a576fc68301fd08a789b20b4eecb61 ports: @@ -20,3 +25,8 @@ services: environment: - ACCEPT_EULA=Y - MSSQL_SA_PASSWORD=Password12345%% + localstack: + image: localstack/localstack:4.5.0@sha256:9d4253786e0effe974d77fe3c390358391a56090a4fff83b4600d8a64404d95d + ports: + - "4510-4559:4510-4559" + - "4566:4566" diff --git a/docker/docker-compose-aspnetcore/oats.yaml b/docker/docker-compose-aspnetcore/oats.yaml index a216e71c..ca5c08ef 100644 --- a/docker/docker-compose-aspnetcore/oats.yaml +++ b/docker/docker-compose-aspnetcore/oats.yaml @@ -1,6 +1,7 @@ include: - ./oats-template.yml input: + - path: /api/Aws/ListBuckets - path: /api/HttpClient/Get - path: /api/HttpClient/GetError - path: /api/MsSql/ServerInfo @@ -80,3 +81,12 @@ expected: db.name: main peer.service: /app/App_Data/TodoApp.db otel.library.name: OpenTelemetry.Instrumentation.EntityFrameworkCore + - traceql: '{ span.http.route =~ "api/Aws/ListBuckets" }' + spans: + - name: 'S3.ListBuckets' + attributes: + aws.request_id: regex:.+ + otel.library.name: AWSSDK.S3 + rpc.method: ListBuckets + rpc.service: S3 + rpc.system: aws-api diff --git a/examples/net8.0/aspnetcore/Controllers/AwsController.cs b/examples/net8.0/aspnetcore/Controllers/AwsController.cs new file mode 100644 index 00000000..abbeb223 --- /dev/null +++ b/examples/net8.0/aspnetcore/Controllers/AwsController.cs @@ -0,0 +1,26 @@ +// +// Copyright Grafana Labs +// SPDX-License-Identifier: Apache-2.0 +// + +using Amazon.S3; +using Microsoft.AspNetCore.Mvc; + +namespace aspnetcore.Controllers; + +[Route("api/[controller]/[action]")] +[ApiController] +public class AwsController(IAmazonS3 client, ILogger logger) : ControllerBase +{ + [HttpGet] + public async Task> ListBuckets() + { + var response = await client.ListBucketsAsync(); + + var buckets = response.Buckets.Select(o => o.BucketName).ToArray(); + + logger.LogInformation("Found {Count} buckets.", buckets.Length); + + return this.Ok(buckets); + } +} diff --git a/examples/net8.0/aspnetcore/Program.cs b/examples/net8.0/aspnetcore/Program.cs index 85b6baf5..b7ed1665 100644 --- a/examples/net8.0/aspnetcore/Program.cs +++ b/examples/net8.0/aspnetcore/Program.cs @@ -3,6 +3,7 @@ // SPDX-License-Identifier: Apache-2.0 // +using Amazon.S3; using aspnetcore; using Grafana.OpenTelemetry; using Microsoft.Data.SqlClient; @@ -29,6 +30,9 @@ return new SqlConnection(connectionString); }); +// AWS SDKs +builder.Services.AddSingleton((_) => new AmazonS3Client(new AmazonS3Config() { ForcePathStyle = true })); + builder.Services.AddHttpClient(); builder.Services.AddControllers(); diff --git a/examples/net8.0/aspnetcore/aspnetcore.csproj b/examples/net8.0/aspnetcore/aspnetcore.csproj index 6a45f4a6..cd402af0 100644 --- a/examples/net8.0/aspnetcore/aspnetcore.csproj +++ b/examples/net8.0/aspnetcore/aspnetcore.csproj @@ -10,6 +10,7 @@ +