From 2cb9b1263492ee17fcfe5fe824029c3ddba0ecc5 Mon Sep 17 00:00:00 2001 From: Alexander Dinauer Date: Thu, 1 Dec 2022 11:24:44 +0100 Subject: [PATCH 1/6] Add Sentry to adservice --- .env | 3 +++ docker-compose.yml | 5 +++++ src/adservice/Dockerfile | 3 ++- 3 files changed, 10 insertions(+), 1 deletion(-) diff --git a/.env b/.env index e4c71986ac..5595ef7811 100644 --- a/.env +++ b/.env @@ -80,4 +80,7 @@ GRAFANA_SERVICE_HOST=grafana JAEGER_SERVICE_PORT=16686 JAEGER_SERVICE_HOST=jaeger +# Sentry +SENTRY_OTEL_DEMO_DSN=https://502f25099c204a2fbf4cb16edc5975d1@o447951.ingest.sentry.io/5428563 + ENV_PLATFORM=local diff --git a/docker-compose.yml b/docker-compose.yml index a63d2a5d37..df726fe6e9 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -47,6 +47,11 @@ services: - OTEL_EXPORTER_OTLP_METRICS_ENDPOINT - OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE - OTEL_SERVICE_NAME=adservice + - OTEL_TRACES_EXPORTER=otlp + - OTEL_METRICS_EXPORTER=otlp + - SENTRY_DSN=${SENTRY_OTEL_DEMO_DSN} + - SENTRY_TRACES_SAMPLE_RATE=1.0 + - SENTRY_DEBUG=true depends_on: - otelcol logging: *logging diff --git a/src/adservice/Dockerfile b/src/adservice/Dockerfile index 86c2864eb4..c467a9c0e7 100644 --- a/src/adservice/Dockerfile +++ b/src/adservice/Dockerfile @@ -29,7 +29,8 @@ ARG version=1.19.1 WORKDIR /usr/src/app/ COPY --from=builder /usr/src/app/ ./ -ADD https://github.com/open-telemetry/opentelemetry-java-instrumentation/releases/download/v$version/opentelemetry-javaagent.jar /app/opentelemetry-javaagent.jar +ADD https://search.maven.org/remotecontent?filepath=io/sentry/sentry-opentelemetry-agent/6.9.1/sentry-opentelemetry-agent-6.9.1.jar /app/opentelemetry-javaagent.jar + ENV JAVA_TOOL_OPTIONS=-javaagent:/app/opentelemetry-javaagent.jar EXPOSE ${AD_SERVICE_PORT} From e10fdd40d068d4308d662a09d63562f2d235d698 Mon Sep 17 00:00:00 2001 From: Alexander Dinauer Date: Thu, 1 Dec 2022 12:56:24 +0100 Subject: [PATCH 2/6] fix env vars for non compose --- .env | 3 --- docker-compose.yml | 5 ----- src/adservice/Dockerfile | 5 +++++ 3 files changed, 5 insertions(+), 8 deletions(-) diff --git a/.env b/.env index 5595ef7811..e4c71986ac 100644 --- a/.env +++ b/.env @@ -80,7 +80,4 @@ GRAFANA_SERVICE_HOST=grafana JAEGER_SERVICE_PORT=16686 JAEGER_SERVICE_HOST=jaeger -# Sentry -SENTRY_OTEL_DEMO_DSN=https://502f25099c204a2fbf4cb16edc5975d1@o447951.ingest.sentry.io/5428563 - ENV_PLATFORM=local diff --git a/docker-compose.yml b/docker-compose.yml index df726fe6e9..a63d2a5d37 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -47,11 +47,6 @@ services: - OTEL_EXPORTER_OTLP_METRICS_ENDPOINT - OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE - OTEL_SERVICE_NAME=adservice - - OTEL_TRACES_EXPORTER=otlp - - OTEL_METRICS_EXPORTER=otlp - - SENTRY_DSN=${SENTRY_OTEL_DEMO_DSN} - - SENTRY_TRACES_SAMPLE_RATE=1.0 - - SENTRY_DEBUG=true depends_on: - otelcol logging: *logging diff --git a/src/adservice/Dockerfile b/src/adservice/Dockerfile index c467a9c0e7..581f70b79c 100644 --- a/src/adservice/Dockerfile +++ b/src/adservice/Dockerfile @@ -32,6 +32,11 @@ COPY --from=builder /usr/src/app/ ./ ADD https://search.maven.org/remotecontent?filepath=io/sentry/sentry-opentelemetry-agent/6.9.1/sentry-opentelemetry-agent-6.9.1.jar /app/opentelemetry-javaagent.jar ENV JAVA_TOOL_OPTIONS=-javaagent:/app/opentelemetry-javaagent.jar +ENV OTEL_TRACES_EXPORTER=otlp +ENV OTEL_METRICS_EXPORTER=otlp +ENV SENTRY_DSN=${SENTRY_ADSERVICE_DSN} +ENV SENTRY_TRACES_SAMPLE_RATE=1.0 +ENV SENTRY_DEBUG=true EXPOSE ${AD_SERVICE_PORT} ENTRYPOINT [ "./build/install/hipstershop/bin/AdService" ] From 7b57bc74eac7d94be1339932a293f08585536cbd Mon Sep 17 00:00:00 2001 From: Alexander Dinauer Date: Thu, 1 Dec 2022 13:15:53 +0100 Subject: [PATCH 3/6] Use default DSN env var name --- src/adservice/Dockerfile | 1 - 1 file changed, 1 deletion(-) diff --git a/src/adservice/Dockerfile b/src/adservice/Dockerfile index 581f70b79c..1b469cc963 100644 --- a/src/adservice/Dockerfile +++ b/src/adservice/Dockerfile @@ -34,7 +34,6 @@ ADD https://search.maven.org/remotecontent?filepath=io/sentry/sentry-opentelemet ENV JAVA_TOOL_OPTIONS=-javaagent:/app/opentelemetry-javaagent.jar ENV OTEL_TRACES_EXPORTER=otlp ENV OTEL_METRICS_EXPORTER=otlp -ENV SENTRY_DSN=${SENTRY_ADSERVICE_DSN} ENV SENTRY_TRACES_SAMPLE_RATE=1.0 ENV SENTRY_DEBUG=true From 8f628a687fe1670038dc8f70bc7a6434be0a30b6 Mon Sep 17 00:00:00 2001 From: Alexander Dinauer Date: Thu, 1 Dec 2022 13:16:51 +0100 Subject: [PATCH 4/6] Add comment for DSN --- src/adservice/Dockerfile | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/adservice/Dockerfile b/src/adservice/Dockerfile index 1b469cc963..06998f3c8c 100644 --- a/src/adservice/Dockerfile +++ b/src/adservice/Dockerfile @@ -37,5 +37,8 @@ ENV OTEL_METRICS_EXPORTER=otlp ENV SENTRY_TRACES_SAMPLE_RATE=1.0 ENV SENTRY_DEBUG=true +#NOTE: The Sentry DSN will be injected into the container at runtime +#ENV SENTRY_DSN=... + EXPOSE ${AD_SERVICE_PORT} ENTRYPOINT [ "./build/install/hipstershop/bin/AdService" ] From b662cf35d88d9bc9003ec557b95d168256a16cf8 Mon Sep 17 00:00:00 2001 From: Alexander Dinauer Date: Fri, 2 Dec 2022 10:52:47 +0100 Subject: [PATCH 5/6] Showcase Sentry for errors --- src/adservice/Dockerfile | 5 ---- src/adservice/build.gradle | 3 +- .../src/main/java/hipstershop/AdService.java | 29 +++++++++++++++++++ 3 files changed, 31 insertions(+), 6 deletions(-) diff --git a/src/adservice/Dockerfile b/src/adservice/Dockerfile index 06998f3c8c..4dcdb23ceb 100644 --- a/src/adservice/Dockerfile +++ b/src/adservice/Dockerfile @@ -34,11 +34,6 @@ ADD https://search.maven.org/remotecontent?filepath=io/sentry/sentry-opentelemet ENV JAVA_TOOL_OPTIONS=-javaagent:/app/opentelemetry-javaagent.jar ENV OTEL_TRACES_EXPORTER=otlp ENV OTEL_METRICS_EXPORTER=otlp -ENV SENTRY_TRACES_SAMPLE_RATE=1.0 -ENV SENTRY_DEBUG=true - -#NOTE: The Sentry DSN will be injected into the container at runtime -#ENV SENTRY_DSN=... EXPOSE ${AD_SERVICE_PORT} ENTRYPOINT [ "./build/install/hipstershop/bin/AdService" ] diff --git a/src/adservice/build.gradle b/src/adservice/build.gradle index 40bc08af59..8c8c470f6b 100644 --- a/src/adservice/build.gradle +++ b/src/adservice/build.gradle @@ -46,7 +46,8 @@ dependencies { "io.opentelemetry:opentelemetry-api", "io.opentelemetry:opentelemetry-sdk", "io.opentelemetry.instrumentation:opentelemetry-instrumentation-annotations", - "org.apache.logging.log4j:log4j-core:2.17.2" + "org.apache.logging.log4j:log4j-core:2.17.2", + "io.sentry:sentry:6.9.1" runtimeOnly "com.fasterxml.jackson.core:jackson-core:${jacksonVersion}", "com.fasterxml.jackson.core:jackson-databind:${jacksonVersion}", diff --git a/src/adservice/src/main/java/hipstershop/AdService.java b/src/adservice/src/main/java/hipstershop/AdService.java index a09ed9e580..6b97165b61 100644 --- a/src/adservice/src/main/java/hipstershop/AdService.java +++ b/src/adservice/src/main/java/hipstershop/AdService.java @@ -41,6 +41,9 @@ import java.util.Collection; import java.util.List; import java.util.Random; + +import io.sentry.Instrumenter; +import io.sentry.Sentry; import org.apache.logging.log4j.Level; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -131,6 +134,14 @@ public void getAds(AdRequest req, StreamObserver responseObserver) { span.setStatus(StatusCode.ERROR); logger.log(Level.WARN, "GetAds Failed with status {}", e.getStatus()); responseObserver.onError(e); + Sentry.captureException(e); + } catch (IllegalArgumentException e) { + span.addEvent( + "Error", Attributes.of(AttributeKey.stringKey("exception.message"), e.getMessage())); + span.setStatus(StatusCode.ERROR); + logger.log(Level.WARN, "GetAds Failed with message {}", e.getMessage()); + Sentry.captureException(e); + responseObserver.onError(e); } } } @@ -139,6 +150,9 @@ public void getAds(AdRequest req, StreamObserver responseObserver) { @WithSpan("getAdsByCategory") private Collection getAdsByCategory(@SpanAttribute("app.ads.category") String category) { + if ("telescopes".equals(category)) { + throw new IllegalArgumentException("Thrown on purpose for category " + category); + } Collection ads = adsMap.get(category); Span.current().setAttribute("app.ads.count", ads.size()); return ads; @@ -229,6 +243,21 @@ private static ImmutableListMultimap createAdsMap() { /** Main launches the server from the command line. */ public static void main(String[] args) throws IOException, InterruptedException { + logger.info("Initializing Sentry"); + Sentry.init(options -> { + // NOTE: SENTRY_DSN is injected as environment variable and this config setting picks it up + options.setEnableExternalConfiguration(true); + + // This is required for the Sentry Java Agent to actually perform instrumentation + options.setInstrumenter(Instrumenter.OTEL); + + // Send all transactions to Sentry + options.setTracesSampleRate(1.0); + + // Enable this to see more logs +// options.setDebug(true); + }); + // Start the RPC server. You shouldn't see any output from gRPC before this. logger.info("AdService starting."); final AdService service = AdService.getInstance(); From 2180bede75a124074471822b4f04d6a435081417 Mon Sep 17 00:00:00 2001 From: Alexander Dinauer Date: Tue, 6 Dec 2022 16:27:58 +0100 Subject: [PATCH 6/6] Update for linking errors to transactions --- src/adservice/Dockerfile | 4 +--- src/adservice/build.gradle | 7 ++++--- src/adservice/src/main/java/hipstershop/AdService.java | 5 ++++- 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/src/adservice/Dockerfile b/src/adservice/Dockerfile index 4dcdb23ceb..26b3288cc1 100644 --- a/src/adservice/Dockerfile +++ b/src/adservice/Dockerfile @@ -29,11 +29,9 @@ ARG version=1.19.1 WORKDIR /usr/src/app/ COPY --from=builder /usr/src/app/ ./ -ADD https://search.maven.org/remotecontent?filepath=io/sentry/sentry-opentelemetry-agent/6.9.1/sentry-opentelemetry-agent-6.9.1.jar /app/opentelemetry-javaagent.jar +ADD https://search.maven.org/remotecontent?filepath=io/sentry/sentry-opentelemetry-agent/6.9.2/sentry-opentelemetry-agent-6.9.2.jar /app/opentelemetry-javaagent.jar ENV JAVA_TOOL_OPTIONS=-javaagent:/app/opentelemetry-javaagent.jar -ENV OTEL_TRACES_EXPORTER=otlp -ENV OTEL_METRICS_EXPORTER=otlp EXPOSE ${AD_SERVICE_PORT} ENTRYPOINT [ "./build/install/hipstershop/bin/AdService" ] diff --git a/src/adservice/build.gradle b/src/adservice/build.gradle index 8c8c470f6b..0a43f693a5 100644 --- a/src/adservice/build.gradle +++ b/src/adservice/build.gradle @@ -14,8 +14,8 @@ description = 'Ad Service' group = "adservice" version = "0.1.0-SNAPSHOT" -def opentelemetryVersion = "1.19.0" -def opentelemetryInstrumentationAlphaVersion = "1.19.1-alpha" +def opentelemetryVersion = "1.20.1" +def opentelemetryInstrumentationAlphaVersion = "1.20.2-alpha" def grpcVersion = "1.45.1" def jacksonVersion = "2.13.2" def protocVersion = "3.20.0" @@ -47,7 +47,8 @@ dependencies { "io.opentelemetry:opentelemetry-sdk", "io.opentelemetry.instrumentation:opentelemetry-instrumentation-annotations", "org.apache.logging.log4j:log4j-core:2.17.2", - "io.sentry:sentry:6.9.1" + "io.sentry:sentry:6.9.2", + "io.sentry:sentry-opentelemetry-core:6.9.2" runtimeOnly "com.fasterxml.jackson.core:jackson-core:${jacksonVersion}", "com.fasterxml.jackson.core:jackson-databind:${jacksonVersion}", diff --git a/src/adservice/src/main/java/hipstershop/AdService.java b/src/adservice/src/main/java/hipstershop/AdService.java index 6b97165b61..602140a931 100644 --- a/src/adservice/src/main/java/hipstershop/AdService.java +++ b/src/adservice/src/main/java/hipstershop/AdService.java @@ -43,6 +43,7 @@ import java.util.Random; import io.sentry.Instrumenter; +import io.sentry.opentelemetry.OpenTelemetryLinkErrorEventProcessor; import io.sentry.Sentry; import org.apache.logging.log4j.Level; import org.apache.logging.log4j.LogManager; @@ -251,11 +252,13 @@ public static void main(String[] args) throws IOException, InterruptedException // This is required for the Sentry Java Agent to actually perform instrumentation options.setInstrumenter(Instrumenter.OTEL); + options.addEventProcessor(new OpenTelemetryLinkErrorEventProcessor()); + // Send all transactions to Sentry options.setTracesSampleRate(1.0); // Enable this to see more logs -// options.setDebug(true); + // options.setDebug(true); }); // Start the RPC server. You shouldn't see any output from gRPC before this.