diff --git a/.github/workflows/oats.yml b/.github/workflows/oats.yml index 05e60e1e..529f10c3 100644 --- a/.github/workflows/oats.yml +++ b/.github/workflows/oats.yml @@ -2,36 +2,49 @@ name: OATS on: push: - branches: [ 'main*' ] + branches: [ main ] paths-ignore: - - '**.md' + - '**/*.gitattributes' + - '**/*.gitignore' + - '**/*.md' + pull_request: + branches: [ main ] + workflow_dispatch: + +permissions: {} jobs: acceptance-tests: runs-on: ubuntu-latest - permissions: {} + timeout-minutes: 20 steps: - - name: Check out - uses: actions/checkout@v4 - with: - persist-credentials: false - - name: Check out oats - uses: actions/checkout@v4 + + - name: Checkout code + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: - repository: grafana/oats - path: oats + filter: 'tree:0' persist-credentials: false + show-progress: false + - name: Set up Go - uses: actions/setup-go@v5 + uses: actions/setup-go@d35c59abb061a4a6fb18e82ac0862c26744d6ab5 # v5.5.0 with: - go-version: '1.22' - cache-dependency-path: oats/go.sum + go-version: '1.24' + + - name: Install OATS + env: + # renovate: datasource=github-releases depName=oats packageName=grafana/oats + OATS_VERSION: v0.3.2 + run: go install "github.com/grafana/oats@${OATS_VERSION}" + - name: Run acceptance tests - run: ./scripts/run-oats-tests.sh - - name: upload log file - uses: actions/upload-artifact@v4 + run: oats --timeout=5m ./docker/docker-compose-aspnetcore + + - name: Upload log file + uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 if: failure() with: name: docker-compose.log path: oats/yaml/build/**/output.log + if-no-files-found: ignore diff --git a/docker/docker-compose-aspnetcore/attributes/oats-template.yml b/docker/docker-compose-aspnetcore/attributes/oats-template.yml deleted file mode 100644 index b1edf1c8..00000000 --- a/docker/docker-compose-aspnetcore/attributes/oats-template.yml +++ /dev/null @@ -1,17 +0,0 @@ -matrix: - - name: default - docker-compose: - generator: docker-lgtm - files: - - ../docker-compose.oats.yml - - name: self-contained - docker-compose: - generator: docker-lgtm - files: - - ../docker-compose.self-contained.oats.yml - - name: net8 - docker-compose: - generator: docker-lgtm - files: - - ../docker-compose.net8.oats.yml -interval: 500ms diff --git a/docker/docker-compose-aspnetcore/attributes/oats.default-resource-attributes.yaml b/docker/docker-compose-aspnetcore/attributes/oats.default-resource-attributes.yaml deleted file mode 100644 index 7c2608a2..00000000 --- a/docker/docker-compose-aspnetcore/attributes/oats.default-resource-attributes.yaml +++ /dev/null @@ -1,25 +0,0 @@ -include: - - ./oats-template.yml -input: - - path: /api/HttpClient/Get -expected: - traces: - - traceql: '{ name =~ "api/HttpClient/Get" }' - spans: - - name: 'GET' - attributes: - service.name: aspnetcore - service.version: 1.0.0.0 - telemetry.distro.name: grafana-opentelemetry-dotnet - telemetry.distro.version: regex:.+ - deployment.environment: production - process.runtime.description: regex:.NET.+ - process.runtime.name: .NET - process.runtime.version: regex:.+ - host.name: regex:.+ - telemetry.sdk.name: opentelemetry - telemetry.sdk.language: dotnet - telemetry.sdk.version: regex:.+ - - traceql: '{ resource.process.pid > 0 }' - spans: - - name: 'GET' diff --git a/docker/docker-compose-aspnetcore/docker-compose.oats.yml b/docker/docker-compose-aspnetcore/docker-compose.oats.yml index 658e5f64..ffa60305 100644 --- a/docker/docker-compose-aspnetcore/docker-compose.oats.yml +++ b/docker/docker-compose-aspnetcore/docker-compose.oats.yml @@ -1,5 +1,3 @@ -version: '3.4' - services: aspnetcore: image: ${DOCKER_REGISTRY-}aspnetcore @@ -7,10 +5,10 @@ services: context: ../.. dockerfile: examples/net8.0/aspnetcore/Dockerfile environment: - - OTEL_EXPORTER_OTLP_ENDPOINT=http://collector:4317 + - OTEL_EXPORTER_OTLP_ENDPOINT=http://lgtm:4317 ports: - - "5000:80" - - "8080:80" # for OATs + - "5000:8080" + - "8080:8080" # for OATs depends_on: - redis - mssql @@ -25,6 +23,8 @@ services: retries: 5 mssql: image: mcr.microsoft.com/mssql/server:2022-latest + ports: + - "1433:1433" environment: - ACCEPT_EULA=Y - MSSQL_SA_PASSWORD=Password12345%% diff --git a/docker/docker-compose-aspnetcore/docker-compose.override.yml b/docker/docker-compose-aspnetcore/docker-compose.override.yml index 3cb53479..444eb62a 100644 --- a/docker/docker-compose-aspnetcore/docker-compose.override.yml +++ b/docker/docker-compose-aspnetcore/docker-compose.override.yml @@ -1,8 +1,6 @@ -version: '3.4' - services: aspnetcore: environment: - ASPNETCORE_ENVIRONMENT=Development ports: - - "80" + - "8080" 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 1b4a3a34..1ae6916f 100644 --- a/docker/docker-compose-aspnetcore/docker-compose.self-contained.oats.yml +++ b/docker/docker-compose-aspnetcore/docker-compose.self-contained.oats.yml @@ -1,19 +1,17 @@ -version: '3.4' - services: aspnetcore: image: ${DOCKER_REGISTRY-}aspnetcore build: context: ../.. - dockerfile: examples/net6.0/aspnetcore/Dockerfile + dockerfile: examples/net8.0/aspnetcore/Dockerfile args: DOTNET_PUBLISH_ARGS: "--self-contained true /p:PublishSingleFile=true" entrypoint: ./aspnetcore environment: - - OTEL_EXPORTER_OTLP_ENDPOINT=http://collector:4317 + - OTEL_EXPORTER_OTLP_ENDPOINT=http://lgtm:4317 ports: - - "5000:80" - - "8080:80" # for OATs + - "5000:8080" + - "8080:8080" # for OATs depends_on: - redis - mssql @@ -28,6 +26,8 @@ services: retries: 5 mssql: image: mcr.microsoft.com/mssql/server:2022-latest + ports: + - "1433:1433" environment: - ACCEPT_EULA=Y - MSSQL_SA_PASSWORD=Password12345%% diff --git a/docker/docker-compose-aspnetcore/docker-compose.yml b/docker/docker-compose-aspnetcore/docker-compose.yml index 0760d7fa..4f557bde 100644 --- a/docker/docker-compose-aspnetcore/docker-compose.yml +++ b/docker/docker-compose-aspnetcore/docker-compose.yml @@ -1,5 +1,3 @@ -version: '3.4' - services: aspnetcore: image: ${DOCKER_REGISTRY-}aspnetcore @@ -9,12 +7,16 @@ services: depends_on: - redis - mssql + ports: + - "8080:8080" # for OATs redis: image: redis:7.2 ports: - "6379:6379" mssql: image: mcr.microsoft.com/mssql/server:2022-latest + ports: + - "1433:1433" environment: - ACCEPT_EULA=Y - MSSQL_SA_PASSWORD=Password12345%% diff --git a/docker/docker-compose-aspnetcore/http/oats-template.yaml b/docker/docker-compose-aspnetcore/http/oats-template.yaml deleted file mode 100644 index b1edf1c8..00000000 --- a/docker/docker-compose-aspnetcore/http/oats-template.yaml +++ /dev/null @@ -1,17 +0,0 @@ -matrix: - - name: default - docker-compose: - generator: docker-lgtm - files: - - ../docker-compose.oats.yml - - name: self-contained - docker-compose: - generator: docker-lgtm - files: - - ../docker-compose.self-contained.oats.yml - - name: net8 - docker-compose: - generator: docker-lgtm - files: - - ../docker-compose.net8.oats.yml -interval: 500ms diff --git a/docker/docker-compose-aspnetcore/http/oats.http-get.yaml b/docker/docker-compose-aspnetcore/http/oats.http-get.yaml deleted file mode 100644 index a5775198..00000000 --- a/docker/docker-compose-aspnetcore/http/oats.http-get.yaml +++ /dev/null @@ -1,14 +0,0 @@ -include: - - ./oats-template.yaml -input: - - path: /api/HttpClient/Get -expected: - traces: - - traceql: '{ name =~ "api/HttpClient/Get" }' - spans: - - name: 'GET' - attributes: - http.request.method: GET - metrics: - - promql: http_client_request_duration_count{http_request_method="GET", http_response_status_code="200"} - value: '>= 0' diff --git a/docker/docker-compose-aspnetcore/http/oats.http-geterror.yaml b/docker/docker-compose-aspnetcore/http/oats.http-geterror.yaml deleted file mode 100644 index 17946cd3..00000000 --- a/docker/docker-compose-aspnetcore/http/oats.http-geterror.yaml +++ /dev/null @@ -1,15 +0,0 @@ -include: - - ./oats-template.yaml -input: - - path: /api/HttpClient/GetError -expected: - traces: - - traceql: '{ name =~ "api/HttpClient/GetError" }' - spans: - - name: 'GET' - attributes: - error.type: '500' - http.request.method: GET - metrics: - - promql: http_client_request_duration_count{} - value: '>= 0' diff --git a/docker/docker-compose-aspnetcore/oats-template.yml b/docker/docker-compose-aspnetcore/oats-template.yml index 6c259a8b..c5a56036 100644 --- a/docker/docker-compose-aspnetcore/oats-template.yml +++ b/docker/docker-compose-aspnetcore/oats-template.yml @@ -9,9 +9,4 @@ matrix: generator: docker-lgtm files: - ./docker-compose.self-contained.oats.yml - - name: net8 - docker-compose: - generator: docker-lgtm - files: - - ./docker-compose.net8.oats.yml interval: 500ms diff --git a/docker/docker-compose-aspnetcore/oats.mssql-query.yaml b/docker/docker-compose-aspnetcore/oats.mssql-query.yaml deleted file mode 100644 index ef7c986a..00000000 --- a/docker/docker-compose-aspnetcore/oats.mssql-query.yaml +++ /dev/null @@ -1,13 +0,0 @@ -include: - - ./oats-template.yml -input: - - path: /api/MsSql/Tables -expected: - traces: - - traceql: '{ name =~ "api/MsSql/Tables"}' - spans: - - name: 'master' - attributes: - db.system: mssql - db.statement_type: Text - otel.library.name: OpenTelemetry.Instrumentation.SqlClient diff --git a/docker/docker-compose-aspnetcore/oats.mssql-sproc.yaml b/docker/docker-compose-aspnetcore/oats.mssql-sproc.yaml deleted file mode 100644 index 0b339943..00000000 --- a/docker/docker-compose-aspnetcore/oats.mssql-sproc.yaml +++ /dev/null @@ -1,13 +0,0 @@ -include: - - ./oats-template.yml -input: - - path: /api/MsSql/ServerInfo -expected: - traces: - - traceql: '{ name =~ "api/MsSql/ServerInfo"}' - spans: - - name: 'master' - attributes: - db.system: mssql - db.statement_type: StoredProcedure - otel.library.name: OpenTelemetry.Instrumentation.SqlClient diff --git a/docker/docker-compose-aspnetcore/oats.yaml b/docker/docker-compose-aspnetcore/oats.yaml new file mode 100644 index 00000000..a821e622 --- /dev/null +++ b/docker/docker-compose-aspnetcore/oats.yaml @@ -0,0 +1,73 @@ +include: + - ./oats-template.yml +input: + - path: /api/HttpClient/Get + - path: /api/HttpClient/GetError + - path: /api/MsSql/ServerInfo + - path: /api/MsSql/Tables + - path: /api/Redis/LeftPush +expected: + logs: + - logql: '{service_name="aspnetcore"} |~ `Application started.`' + contains: + - 'Application started' + metrics: + - promql: http_client_request_duration_seconds_count{} + value: '>= 0' + - promql: http_client_request_duration_seconds_count{http_request_method="GET", http_response_status_code="200"} + value: '>= 0' + traces: + - traceql: '{ resource.process.pid > 0 }' + spans: + - name: 'GET' + - traceql: '{ span.http.route =~ "api/HttpClient/Get" }' + spans: + - name: 'GET api/HttpClient/Get' + attributes: + http.request.method: GET + - name: 'GET api/HttpClient/Get' + attributes: + service.name: aspnetcore + service.version: 1.0.0.0 + telemetry.distro.name: grafana-opentelemetry-dotnet + telemetry.distro.version: regex:.+ + deployment.environment: production + process.runtime.description: regex:.NET.+ + process.runtime.name: .NET + process.runtime.version: regex:.+ + host.name: regex:.+ + telemetry.sdk.name: opentelemetry + telemetry.sdk.language: dotnet + telemetry.sdk.version: regex:.+ + - traceql: '{ span.http.route =~ "api/HttpClient/GetError" }' + spans: + - name: 'GET api/HttpClient/GetError' + attributes: + http.request.method: GET + - name: 'GET' + attributes: + error.type: '500' + http.request.method: GET + http.response.status_code: '500' + - traceql: '{ span.http.route =~ "api/MsSql/ServerInfo"}' + spans: + - name: 'master' + attributes: + db.system: mssql + db.name: master + db.statement: sp_server_info + otel.library.name: OpenTelemetry.Instrumentation.SqlClient + - traceql: '{ span.http.route =~ "api/MsSql/Tables"}' + spans: + - name: 'master' + attributes: + db.system: mssql + db.name: master + otel.library.name: OpenTelemetry.Instrumentation.SqlClient + - traceql: '{ span.http.route =~ "api/Redis/LeftPush" }' + spans: + - name: 'LPUSH' + attributes: + db.statement: LPUSH + db.system: redis + net.peer.name: redis diff --git a/docker/docker-compose-aspnetcore/redis/oats-template.yaml b/docker/docker-compose-aspnetcore/redis/oats-template.yaml deleted file mode 100644 index b1edf1c8..00000000 --- a/docker/docker-compose-aspnetcore/redis/oats-template.yaml +++ /dev/null @@ -1,17 +0,0 @@ -matrix: - - name: default - docker-compose: - generator: docker-lgtm - files: - - ../docker-compose.oats.yml - - name: self-contained - docker-compose: - generator: docker-lgtm - files: - - ../docker-compose.self-contained.oats.yml - - name: net8 - docker-compose: - generator: docker-lgtm - files: - - ../docker-compose.net8.oats.yml -interval: 500ms diff --git a/docker/docker-compose-aspnetcore/redis/oats.redis-lpush.yaml b/docker/docker-compose-aspnetcore/redis/oats.redis-lpush.yaml deleted file mode 100644 index 3c4ae331..00000000 --- a/docker/docker-compose-aspnetcore/redis/oats.redis-lpush.yaml +++ /dev/null @@ -1,14 +0,0 @@ -include: - - ./oats-template.yaml -input: - - path: /api/Redis/LeftPush -interval: 5000ms -expected: - traces: - - traceql: '{ name =~ "api/Redis/LeftPush" }' - spans: - - name: 'LPUSH' - attributes: - db.statement: LPUSH - db.system: redis - net.peer.name: redis diff --git a/examples/net8.0/aspnetcore/Dockerfile b/examples/net8.0/aspnetcore/Dockerfile index c0e9863e..cc91f6b1 100644 --- a/examples/net8.0/aspnetcore/Dockerfile +++ b/examples/net8.0/aspnetcore/Dockerfile @@ -1,25 +1,19 @@ -#See https://aka.ms/customizecontainer to learn how to customize your debug container and how Visual Studio uses this Dockerfile to build your images for faster debugging. - -FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS base -WORKDIR /app -EXPOSE 80 - -FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build - +FROM --platform=$BUILDPLATFORM mcr.microsoft.com/dotnet/sdk:8.0 AS build +ARG TARGETARCH +ARG CONFIGURATION="Release" ARG DOTNET_PUBLISH_ARGS="" -WORKDIR /src -COPY ["examples/net8.0/aspnetcore/aspnetcore.csproj", "examples/net8.0/aspnetcore/"] -RUN dotnet restore "examples/net8.0/aspnetcore/aspnetcore.csproj" -COPY . . -WORKDIR "/src/examples/net8.0/aspnetcore" -RUN dotnet build "aspnetcore.csproj" -c Release -o /app/build +COPY . /source +WORKDIR /source + +SHELL ["/bin/bash", "-o", "pipefail", "-c"] -FROM build AS publish -RUN dotnet publish "aspnetcore.csproj" -c Release -o /app/publish ${DOTNET_PUBLISH_ARGS} +RUN --mount=type=cache,id=nuget,target=/root/.nuget/packages \ + dotnet publish "examples/net8.0/aspnetcore/aspnetcore.csproj" --arch "${TARGETARCH}" --configuration "${CONFIGURATION}" --output /app ${DOTNET_PUBLISH_ARGS} -FROM base AS final +FROM mcr.microsoft.com/dotnet/sdk:8.0 AS final WORKDIR /app -COPY --from=publish /app/publish . -RUN apt-get update && apt-get install -y curl +EXPOSE 8080 + +COPY --from=build /app . ENTRYPOINT ["dotnet", "aspnetcore.dll"] diff --git a/global.json b/global.json index 2e58f1da..c51594ae 100644 --- a/global.json +++ b/global.json @@ -1,6 +1,7 @@ { "sdk": { "rollForward": "latestFeature", - "version": "8.0.101" + "version": "8.0.101", + "allowPrerelease": false } } diff --git a/scripts/run-oats-tests.ps1 b/scripts/run-oats-tests.ps1 new file mode 100755 index 00000000..6ec92297 --- /dev/null +++ b/scripts/run-oats-tests.ps1 @@ -0,0 +1,11 @@ +#! /usr/bin/env pwsh + +$ErrorActionPreference = "Stop" +$InformationPreference = "Continue" +$ProgressPreference = "SilentlyContinue" + +# renovate: datasource=github-releases depName=oats packageName=grafana/oats +${env:OATS_VERSION}="v0.3.2" + +go install "github.com/grafana/oats@${env:OATS_VERSION}" +& "${env:GOPATH}/bin/oats" --timeout=5m ./docker/docker-compose-aspnetcore diff --git a/scripts/run-oats-tests.sh b/scripts/run-oats-tests.sh index d96232ba..4c64b62d 100755 --- a/scripts/run-oats-tests.sh +++ b/scripts/run-oats-tests.sh @@ -2,9 +2,8 @@ set -euo pipefail -cd oats/yaml -go install github.com/onsi/ginkgo/v2/ginkgo -export TESTCASE_SKIP_BUILD=true -export TESTCASE_TIMEOUT=5m -export TESTCASE_BASE_PATH=../../docker -ginkgo -r +# renovate: datasource=github-releases depName=oats packageName=grafana/oats +export OATS_VERSION=v0.3.2 + +go install "github.com/grafana/oats@${OATS_VERSION}" +${GOPATH}/bin/oats --timeout=5m ./docker/docker-compose-aspnetcore