diff --git a/src/ad/Dockerfile b/src/ad/Dockerfile index 92f69c049e..3f58c9245f 100644 --- a/src/ad/Dockerfile +++ b/src/ad/Dockerfile @@ -1,3 +1,6 @@ +# run from repo root +# docker buildx build --platform linux/amd64,linux/arm64 -t ghcr.io/tokaplan/demo-ad:1.0.0 --push -f ./src/ad/Dockerfile . + # Copyright The OpenTelemetry Authors # SPDX-License-Identifier: Apache-2.0 @@ -22,14 +25,14 @@ RUN ./gradlew installDist -PprotoSourceDir=./proto FROM eclipse-temurin:21-jre -ARG OTEL_JAVA_AGENT_VERSION -ARG _JAVA_OPTIONS +# ARG OTEL_JAVA_AGENT_VERSION +# ARG _JAVA_OPTIONS WORKDIR /usr/src/app/ COPY --from=builder /usr/src/app/ ./ -ADD --chmod=644 https://github.com/open-telemetry/opentelemetry-java-instrumentation/releases/download/v$OTEL_JAVA_AGENT_VERSION/opentelemetry-javaagent.jar /usr/src/app/opentelemetry-javaagent.jar -ENV JAVA_TOOL_OPTIONS=-javaagent:/usr/src/app/opentelemetry-javaagent.jar +# ADD --chmod=644 https://github.com/open-telemetry/opentelemetry-java-instrumentation/releases/download/v$OTEL_JAVA_AGENT_VERSION/opentelemetry-javaagent.jar /usr/src/app/opentelemetry-javaagent.jar +# ENV JAVA_TOOL_OPTIONS=-javaagent:/usr/src/app/opentelemetry-javaagent.jar EXPOSE ${AD_PORT} ENTRYPOINT [ "./build/install/opentelemetry-demo-ad/bin/Ad" ] diff --git a/src/ad/build.gradle b/src/ad/build.gradle index 1172113d73..072f2b5e8d 100644 --- a/src/ad/build.gradle +++ b/src/ad/build.gradle @@ -48,7 +48,6 @@ dependencies { "io.grpc:grpc-netty:${grpcVersion}", "io.grpc:grpc-services:${grpcVersion}", "io.opentelemetry:opentelemetry-api", - "io.opentelemetry:opentelemetry-sdk", "io.opentelemetry.instrumentation:opentelemetry-instrumentation-annotations", "org.apache.logging.log4j:log4j-core:2.25.2", "dev.openfeature.contrib.providers:flagd:0.11.17", diff --git a/src/ad/src/main/java/oteldemo/AdService.java b/src/ad/src/main/java/oteldemo/AdService.java index d7f2688e66..cf6272c400 100644 --- a/src/ad/src/main/java/oteldemo/AdService.java +++ b/src/ad/src/main/java/oteldemo/AdService.java @@ -12,7 +12,6 @@ import io.grpc.protobuf.services.*; import io.grpc.stub.StreamObserver; import io.opentelemetry.api.GlobalOpenTelemetry; -import io.opentelemetry.api.OpenTelemetry; import io.opentelemetry.api.baggage.Baggage; import io.opentelemetry.api.common.AttributeKey; import io.opentelemetry.api.common.Attributes; diff --git a/src/cart/src/Dockerfile b/src/cart/src/Dockerfile index 9e4df98450..a0beb9a5f9 100644 --- a/src/cart/src/Dockerfile +++ b/src/cart/src/Dockerfile @@ -1,3 +1,6 @@ +# run from repo root +# docker buildx build --platform linux/amd64,linux/arm64 -t ghcr.io/tokaplan/demo-cart:1.0.0 --push -f ./src/cart/src/Dockerfile . + # Copyright The OpenTelemetry Authors # SPDX-License-Identifier: Apache-2.0 # Copyright 2021 Google LLC diff --git a/src/cart/src/Program.cs b/src/cart/src/Program.cs index 2053394fae..8be0eff52b 100644 --- a/src/cart/src/Program.cs +++ b/src/cart/src/Program.cs @@ -18,6 +18,7 @@ using OpenFeature; using OpenFeature.Hooks; using OpenFeature.Contrib.Providers.Flagd; +using OpenTelemetry; var builder = WebApplication.CreateBuilder(args); string valkeyAddress = builder.Configuration["VALKEY_ADDR"]; @@ -27,9 +28,7 @@ Environment.Exit(1); } -builder.Logging - .AddOpenTelemetry(options => options.AddOtlpExporter()) - .AddConsole(); +builder.Logging.AddConsole(); builder.Services.AddSingleton(x => { @@ -61,6 +60,7 @@ .AddHostDetector(); builder.Services.AddOpenTelemetry() + .UseOtlpExporter() .ConfigureResource(appResourceBuilder) .WithTracing(tracerBuilder => tracerBuilder .AddSource("OpenTelemetry.Demo.Cart") @@ -68,16 +68,14 @@ options => options.SetVerboseDatabaseStatements = true) .AddAspNetCoreInstrumentation() .AddGrpcClientInstrumentation() - .AddHttpClientInstrumentation() - .AddOtlpExporter()) + .AddHttpClientInstrumentation()) .WithMetrics(meterBuilder => meterBuilder .AddMeter("OpenTelemetry.Demo.Cart") .AddMeter("OpenFeature") .AddProcessInstrumentation() .AddRuntimeInstrumentation() .AddAspNetCoreInstrumentation() - .SetExemplarFilter(ExemplarFilterType.TraceBased) - .AddOtlpExporter()); + .SetExemplarFilter(ExemplarFilterType.TraceBased)); builder.Services.AddGrpc(); builder.Services.AddGrpcHealthChecks() .AddCheck("Sample", () => HealthCheckResult.Healthy()); diff --git a/src/cart/src/cart.csproj b/src/cart/src/cart.csproj index f9bd3ec0c0..35d979bf49 100644 --- a/src/cart/src/cart.csproj +++ b/src/cart/src/cart.csproj @@ -16,19 +16,19 @@ - - - - - + + + + + - + - + - + diff --git a/src/checkout/Dockerfile b/src/checkout/Dockerfile index 9aa66af251..f262e57d22 100644 --- a/src/checkout/Dockerfile +++ b/src/checkout/Dockerfile @@ -1,3 +1,6 @@ +# run from repo root +# docker buildx build --platform linux/amd64,linux/arm64 -t ghcr.io/tokaplan/demo-checkout:1.0.0 --push -f ./src/checkout/Dockerfile . + # Copyright The OpenTelemetry Authors # SPDX-License-Identifier: Apache-2.0 diff --git a/src/checkout/go.mod b/src/checkout/go.mod index 650da9afc2..cbb66f18f1 100644 --- a/src/checkout/go.mod +++ b/src/checkout/go.mod @@ -13,9 +13,9 @@ require ( go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.63.0 go.opentelemetry.io/contrib/instrumentation/runtime v0.63.0 go.opentelemetry.io/otel v1.38.0 - go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.14.0 - go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.38.0 - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.38.0 + go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.14.0 + go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.38.0 + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.38.0 go.opentelemetry.io/otel/log v0.14.0 go.opentelemetry.io/otel/sdk v1.38.0 go.opentelemetry.io/otel/sdk/log v0.14.0 diff --git a/src/checkout/go.sum b/src/checkout/go.sum index 7067daf2f8..5d8f3a6361 100644 --- a/src/checkout/go.sum +++ b/src/checkout/go.sum @@ -129,14 +129,14 @@ go.opentelemetry.io/contrib/instrumentation/runtime v0.63.0 h1:PeBoRj6af6xMI7qCu go.opentelemetry.io/contrib/instrumentation/runtime v0.63.0/go.mod h1:ingqBCtMCe8I4vpz/UVzCW6sxoqgZB37nao91mLQ3Bw= go.opentelemetry.io/otel v1.38.0 h1:RkfdswUDRimDg0m2Az18RKOsnI8UDzppJAtj01/Ymk8= go.opentelemetry.io/otel v1.38.0/go.mod h1:zcmtmQ1+YmQM9wrNsTGV/q/uyusom3P8RxwExxkZhjM= -go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.14.0 h1:OMqPldHt79PqWKOMYIAQs3CxAi7RLgPxwfFSwr4ZxtM= -go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.14.0/go.mod h1:1biG4qiqTxKiUCtoWDPpL3fB3KxVwCiGw81j3nKMuHE= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.38.0 h1:vl9obrcoWVKp/lwl8tRE33853I8Xru9HFbw/skNeLs8= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.38.0/go.mod h1:GAXRxmLJcVM3u22IjTg74zWBrRCKq8BnOqUVLodpcpw= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.14.0 h1:QQqYw3lkrzwVsoEX0w//EhH/TCnpRdEenKBOOEIMjWc= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.14.0/go.mod h1:gSVQcr17jk2ig4jqJ2DX30IdWH251JcNAecvrqTxH1s= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.38.0 h1:Oe2z/BCg5q7k4iXC3cqJxKYg0ieRiOqF0cecFYdPTwk= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.38.0/go.mod h1:ZQM5lAJpOsKnYagGg/zV2krVqTtaVdYdDkhMoX6Oalg= go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.38.0 h1:GqRJVj7UmLjCVyVJ3ZFLdPRmhDUp2zFmQe3RHIOsw24= go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.38.0/go.mod h1:ri3aaHSmCTVYu2AWv44YMauwAQc0aqI9gHKIcSbI1pU= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.38.0 h1:lwI4Dc5leUqENgGuQImwLo4WnuXFPetmPpkLi2IrX54= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.38.0/go.mod h1:Kz/oCE7z5wuyhPxsXDuaPteSWqjSBD5YaSdbxZYGbGk= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.38.0 h1:aTL7F04bJHUlztTsNGJ2l+6he8c+y/b//eR0jjjemT4= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.38.0/go.mod h1:kldtb7jDTeol0l3ewcmd8SDvx3EmIE7lyvqbasU3QC4= go.opentelemetry.io/otel/log v0.14.0 h1:2rzJ+pOAZ8qmZ3DDHg73NEKzSZkhkGIua9gXtxNGgrM= go.opentelemetry.io/otel/log v0.14.0/go.mod h1:5jRG92fEAgx0SU/vFPxmJvhIuDU9E1SUnEQrMlJpOno= go.opentelemetry.io/otel/metric v1.38.0 h1:Kl6lzIYGAh5M159u9NgiRkmoMKjvbsKtYRwgfrA6WpA= diff --git a/src/checkout/main.go b/src/checkout/main.go index f200865852..de748d531e 100644 --- a/src/checkout/main.go +++ b/src/checkout/main.go @@ -35,9 +35,9 @@ import ( "go.opentelemetry.io/contrib/instrumentation/runtime" "go.opentelemetry.io/otel" otelcodes "go.opentelemetry.io/otel/codes" - "go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc" - "go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc" - "go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc" + "go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp" + "go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp" + "go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp" "go.opentelemetry.io/otel/propagation" sdklog "go.opentelemetry.io/otel/sdk/log" @@ -87,9 +87,9 @@ func initResource() *sdkresource.Resource { func initTracerProvider() *sdktrace.TracerProvider { ctx := context.Background() - exporter, err := otlptracegrpc.New(ctx) + exporter, err := otlptracehttp.New(ctx) if err != nil { - logger.Error(fmt.Sprintf("new otlp trace grpc exporter failed: %v", err)) + logger.Error(fmt.Sprintf("new otlp trace http exporter failed: %v", err)) } tp := sdktrace.NewTracerProvider( sdktrace.WithBatcher(exporter), @@ -103,9 +103,9 @@ func initTracerProvider() *sdktrace.TracerProvider { func initMeterProvider() *sdkmetric.MeterProvider { ctx := context.Background() - exporter, err := otlpmetricgrpc.New(ctx) + exporter, err := otlpmetrichttp.New(ctx) if err != nil { - logger.Error(fmt.Sprintf("new otlp metric grpc exporter failed: %v", err)) + logger.Error(fmt.Sprintf("new otlp metric http exporter failed: %v", err)) } mp := sdkmetric.NewMeterProvider( @@ -119,7 +119,7 @@ func initMeterProvider() *sdkmetric.MeterProvider { func initLoggerProvider() *sdklog.LoggerProvider { ctx := context.Background() - logExporter, err := otlploggrpc.New(ctx) + logExporter, err := otlploghttp.New(ctx) if err != nil { return nil } diff --git a/src/fraud-detection/Dockerfile b/src/fraud-detection/Dockerfile index 60ed4b4ef4..a7069b5478 100644 --- a/src/fraud-detection/Dockerfile +++ b/src/fraud-detection/Dockerfile @@ -1,3 +1,6 @@ +# run from repo root +# docker buildx build --platform linux/amd64,linux/arm64 -t ghcr.io/tokaplan/demo-fraud-detection:1.0.0 --push -f ./src/fraud-detection/Dockerfile . + # Copyright The OpenTelemetry Authors # SPDX-License-Identifier: Apache-2.0 @@ -18,8 +21,8 @@ FROM gcr.io/distroless/java17-debian12:nonroot ARG OTEL_JAVA_AGENT_VERSION WORKDIR /usr/src/app/ -ADD --chmod=644 https://github.com/open-telemetry/opentelemetry-java-instrumentation/releases/download/v$OTEL_JAVA_AGENT_VERSION/opentelemetry-javaagent.jar /usr/src/app/opentelemetry-javaagent.jar -ENV JAVA_TOOL_OPTIONS=-javaagent:/usr/src/app/opentelemetry-javaagent.jar +# ADD --chmod=644 https://github.com/open-telemetry/opentelemetry-java-instrumentation/releases/download/v$OTEL_JAVA_AGENT_VERSION/opentelemetry-javaagent.jar /usr/src/app/opentelemetry-javaagent.jar +# ENV JAVA_TOOL_OPTIONS=-javaagent:/usr/src/app/opentelemetry-javaagent.jar COPY --from=builder /usr/src/app/build/libs/fraud-detection-1.0-all.jar fraud-detection-1.0-all.jar diff --git a/src/fraud-detection/build.gradle.kts b/src/fraud-detection/build.gradle.kts index 822a55fdd7..260bc27d44 100644 --- a/src/fraud-detection/build.gradle.kts +++ b/src/fraud-detection/build.gradle.kts @@ -38,8 +38,6 @@ dependencies { implementation("io.grpc:grpc-netty:${grpcVersion}") implementation("io.grpc:grpc-services:${grpcVersion}") implementation("io.opentelemetry:opentelemetry-api:1.55.0") - implementation("io.opentelemetry:opentelemetry-sdk:1.55.0") - implementation("io.opentelemetry:opentelemetry-extension-annotations:1.18.0") implementation("org.apache.logging.log4j:log4j-core:2.25.2") implementation("org.slf4j:slf4j-api:2.0.17") implementation("com.google.protobuf:protobuf-kotlin:${protobufVersion}") diff --git a/src/frontend/Dockerfile b/src/frontend/Dockerfile index 1dbbbc70af..aceee16f8b 100644 --- a/src/frontend/Dockerfile +++ b/src/frontend/Dockerfile @@ -1,3 +1,6 @@ +# run from repo root +# docker buildx build --platform linux/amd64,linux/arm64 -t appmonitoring.azurecr.io/demo-frontend:1.0.0 --push -f ./src/frontend/Dockerfile . + # Copyright The OpenTelemetry Authors # SPDX-License-Identifier: Apache-2.0 @@ -53,8 +56,6 @@ COPY --from=deps /app/node_modules/ node_modules/ COPY ./src/frontend/public/ public/ -COPY ./src/frontend/utils/telemetry/Instrumentation.js Instrumentation.js - EXPOSE ${FRONTEND_PORT} -CMD ["--require=./Instrumentation.js", "server.js"] +CMD ["server.js"] diff --git a/src/frontend/README.md b/src/frontend/README.md index c188410e74..b8e25b1868 100755 --- a/src/frontend/README.md +++ b/src/frontend/README.md @@ -6,6 +6,41 @@ by two layers. 1. Client side application. Which renders the components for the OTEL webstore. 2. API layer. Connects the client to the backend services by exposing REST endpoints. +## OpenTelemetry Instrumentation + +The frontend application has been configured to **not bundle the OpenTelemetry SDK**. Instead, it relies on external instrumentation attached at runtime via environment variables. + +### Server-Side (Node.js/Next.js) + +To enable OpenTelemetry on the Node.js server: + +**Option 1: Using environment variables** +```shell +export OTEL_SERVICE_NAME=frontend +export OTEL_EXPORTER_OTLP_ENDPOINT=http://otel-collector:4318 +export OTEL_TRACES_EXPORTER=otlp +export OTEL_METRICS_EXPORTER=otlp +export OTEL_LOGS_EXPORTER=otlp +npm run start +``` + +**Option 2: Using Node.js auto-instrumentation** +```shell +node --require @opentelemetry/auto-instrumentations-node/register server.js +``` + +**Option 3: Via Docker with environment variables** +Set the environment variables in your `docker-compose.yml` or deployment configuration. + +### Client-Side (Browser) + +Browser-side instrumentation requires: +- OpenTelemetry JavaScript SDK loaded via a `