Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 7 additions & 4 deletions src/ad/Dockerfile
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
# run from repo root
# docker buildx build --platform linux/amd64,linux/arm64 -t appmonitoring.azurecr.io/demo-ad:1.0.0 --push -f ./src/ad/Dockerfile .
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is this comment desired or is it a development thing?


# Copyright The OpenTelemetry Authors
# SPDX-License-Identifier: Apache-2.0

Expand All @@ -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
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this env var is used by the Docker Compose:

ad:
image: ${IMAGE_NAME}:${DEMO_VERSION}-ad
container_name: ad
build:
context: ./
dockerfile: ${AD_DOCKERFILE}
cache_from:
- ${IMAGE_NAME}:${IMAGE_VERSION}-ad
args:
OTEL_JAVA_AGENT_VERSION: ${OTEL_JAVA_AGENT_VERSION}
deploy:
resources:
limits:
memory: 300M
restart: unless-stopped
ports:
- "${AD_PORT}"
environment:
- AD_PORT
- FLAGD_HOST
- FLAGD_PORT
- OTEL_EXPORTER_OTLP_ENDPOINT=http://${OTEL_COLLECTOR_HOST}:${OTEL_COLLECTOR_PORT_HTTP}
- OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE
- OTEL_RESOURCE_ATTRIBUTES
- OTEL_LOGS_EXPORTER=otlp
- OTEL_SERVICE_NAME=ad
# Workaround on OSX for https://bugs.openjdk.org/browse/JDK-8345296
- _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
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is this comment removing the OTel Java Autoinstr agent from the Docker image? I think we need it


EXPOSE ${AD_PORT}
ENTRYPOINT [ "./build/install/opentelemetry-demo-ad/bin/Ad" ]
1 change: 0 additions & 1 deletion src/ad/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand Down
1 change: 0 additions & 1 deletion src/ad/src/main/java/oteldemo/AdService.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
3 changes: 3 additions & 0 deletions src/cart/src/Dockerfile
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
# run from repo root
# docker buildx build --platform linux/amd64,linux/arm64 -t appmonitoring.azurecr.io/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
Expand Down
12 changes: 5 additions & 7 deletions src/cart/src/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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"];
Expand All @@ -27,9 +28,7 @@
Environment.Exit(1);
}

builder.Logging
.AddOpenTelemetry(options => options.AddOtlpExporter())
.AddConsole();
builder.Logging.AddConsole();

builder.Services.AddSingleton<ICartStore>(x =>
{
Expand Down Expand Up @@ -61,23 +60,22 @@
.AddHostDetector();

builder.Services.AddOpenTelemetry()
.UseOtlpExporter()
.ConfigureResource(appResourceBuilder)
.WithTracing(tracerBuilder => tracerBuilder
.AddSource("OpenTelemetry.Demo.Cart")
.AddRedisInstrumentation(
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());
Expand Down
16 changes: 8 additions & 8 deletions src/cart/src/cart.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -16,19 +16,19 @@

<ItemGroup>
<!-- Keeping Grpc.AspNetCore* to 2.67 due to https://github.com/grpc/grpc/issues/38538 -->
<PackageReference Include="Grpc.AspNetCore" Version="2.67.0" />
<PackageReference Include="Grpc.AspNetCore.HealthChecks" Version="2.67.0" />
<PackageReference Include="OpenTelemetry.Exporter.OpenTelemetryProtocol" Version="1.11.2" />
<PackageReference Include="OpenTelemetry.Extensions.Hosting" Version="1.11.2" />
<PackageReference Include="OpenTelemetry.Instrumentation.AspNetCore" Version="1.11.1" />
<PackageReference Include="Grpc.AspNetCore" Version="2.71.0" />
<PackageReference Include="Grpc.AspNetCore.HealthChecks" Version="2.71.0" />
<PackageReference Include="OpenTelemetry.Exporter.OpenTelemetryProtocol" Version="1.13.1" />
<PackageReference Include="OpenTelemetry.Extensions.Hosting" Version="1.13.1" />
<PackageReference Include="OpenTelemetry.Instrumentation.AspNetCore" Version="1.13.0" />
<PackageReference Include="OpenTelemetry.Instrumentation.GrpcNetClient" Version="1.11.0-beta.2" />
<PackageReference Include="OpenTelemetry.Instrumentation.Http" Version="1.11.1" />
<PackageReference Include="OpenTelemetry.Instrumentation.Http" Version="1.13.0" />
<PackageReference Include="OpenTelemetry.Instrumentation.Process" Version="1.11.0-beta.2" />
<PackageReference Include="OpenTelemetry.Instrumentation.StackExchangeRedis" Version="1.11.0-beta.2" />
<PackageReference Include="OpenTelemetry.Instrumentation.Runtime" Version="1.11.1" />
<PackageReference Include="OpenTelemetry.Instrumentation.Runtime" Version="1.13.0" />
<PackageReference Include="OpenTelemetry.Resources.Container" Version="1.11.0-beta.2" />
<PackageReference Include="OpenTelemetry.Resources.Host" Version="1.11.0-beta.2" />
<PackageReference Include="StackExchange.Redis" Version="2.8.31" />
<PackageReference Include="StackExchange.Redis" Version="2.9.32" />
<PackageReference Include="OpenFeature.Contrib.Providers.Flagd" Version="0.3.4" />
<PackageReference Include="OpenFeature" Version="2.9.0" />
<PackageReference Include="OpenFeature.Hosting" Version="2.9.0" />
Expand Down
3 changes: 3 additions & 0 deletions src/checkout/Dockerfile
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
# run from repo root
# docker buildx build --platform linux/amd64,linux/arm64 -t appmonitoring.azurecr.io/demo-checkout:1.0.0 --push -f ./src/checkout/Dockerfile .

# Copyright The OpenTelemetry Authors
# SPDX-License-Identifier: Apache-2.0

Expand Down
6 changes: 3 additions & 3 deletions src/checkout/go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
12 changes: 6 additions & 6 deletions src/checkout/go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -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=
Expand Down
16 changes: 8 additions & 8 deletions src/checkout/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down Expand Up @@ -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),
Expand All @@ -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(
Expand All @@ -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
}
Expand Down
7 changes: 5 additions & 2 deletions src/fraud-detection/Dockerfile
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
# run from repo root
# docker buildx build --platform linux/amd64,linux/arm64 -t appmonitoring.azurecr.io/demo-fraud-detection:1.0.0 --push -f ./src/fraud-detection/Dockerfile .

# Copyright The OpenTelemetry Authors
# SPDX-License-Identifier: Apache-2.0

Expand All @@ -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

Expand Down
2 changes: 0 additions & 2 deletions src/fraud-detection/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -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}")
Expand Down
7 changes: 4 additions & 3 deletions src/frontend/Dockerfile
Original file line number Diff line number Diff line change
@@ -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

Expand Down Expand Up @@ -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"]
35 changes: 35 additions & 0 deletions src/frontend/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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 `<script>` tag
- Browser extension or RUM solution
- Proxy-injected instrumentation

The application uses OpenTelemetry API calls that will only emit signals when an external SDK is present.

## Build Locally

By running `docker compose up` at the root of the project you'll have access to the
Expand Down
4 changes: 2 additions & 2 deletions src/frontend/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,9 @@
"version": "0.1.0",
"private": true,
"scripts": {
"dev": "NODE_OPTIONS='--require ./utils/telemetry/Instrumentation.js' next dev",
"dev": "next dev",
"build": "next build",
"start": "node --require ./Instrumentation.js server.js",
"start": "node server.js",
"lint": "next lint",
"cy:open": "cypress open",
"grpc:generate": "mkdir -p ./protos && protoc -I ./pb --plugin=./node_modules/.bin/protoc-gen-ts_proto --ts_proto_opt=esModuleInterop=true --ts_proto_out=./protos --ts_proto_opt=outputServices=grpc-js demo.proto"
Expand Down
2 changes: 0 additions & 2 deletions src/frontend/pages/_app.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@ import CurrencyProvider from '../providers/Currency.provider';
import CartProvider from '../providers/Cart.provider';
import { ThemeProvider } from 'styled-components';
import Theme from '../styles/Theme';
import FrontendTracer from '../utils/telemetry/FrontendTracer';
import SessionGateway from '../gateways/Session.gateway';
import { OpenFeatureProvider, OpenFeature } from '@openfeature/react-sdk';
import { FlagdWebProvider } from '@openfeature/flagd-web-provider';
Expand All @@ -25,7 +24,6 @@ declare global {
}

if (typeof window !== 'undefined') {
FrontendTracer();
if (window.location) {
const session = SessionGateway.getSession();

Expand Down
Loading