From 30f169f3588c22513cc44707c3fc5e6692b8f486 Mon Sep 17 00:00:00 2001 From: Alexander Dinauer Date: Tue, 17 Dec 2024 10:57:32 +0100 Subject: [PATCH] POTEL 64 - `sentry-opentelemetry-agentless` module (#3961) * add agentless module for OpenTelemetry setup without any agent * convert to api dep * changelog --- .craft.yml | 1 + .github/ISSUE_TEMPLATE/bug_report_java.yml | 1 + CHANGELOG.md | 9 ++++ .../sentry-opentelemetry-agentless/README.md | 54 +++++++++++++++++++ .../build.gradle.kts | 18 +++++++ .../opentelemetry/agent/AgentlessMarker.java | 3 ++ .../build.gradle.kts | 9 +--- .../java/io/sentry/samples/console/Main.java | 3 ++ .../build.gradle.kts | 3 +- .../build.gradle.kts | 3 +- settings.gradle.kts | 1 + 11 files changed, 93 insertions(+), 12 deletions(-) create mode 100644 sentry-opentelemetry/sentry-opentelemetry-agentless/README.md create mode 100644 sentry-opentelemetry/sentry-opentelemetry-agentless/build.gradle.kts create mode 100644 sentry-opentelemetry/sentry-opentelemetry-agentless/src/main/java/io/sentry/opentelemetry/agent/AgentlessMarker.java diff --git a/.craft.yml b/.craft.yml index 3d0a878a4c..72373fa343 100644 --- a/.craft.yml +++ b/.craft.yml @@ -44,6 +44,7 @@ targets: maven:io.sentry:sentry-opentelemetry-agent: maven:io.sentry:sentry-opentelemetry-agentcustomization: maven:io.sentry:sentry-opentelemetry-core: +# maven:io.sentry:sentry-opentelemetry-agentless: maven:io.sentry:sentry-apollo: maven:io.sentry:sentry-jdbc: maven:io.sentry:sentry-graphql: diff --git a/.github/ISSUE_TEMPLATE/bug_report_java.yml b/.github/ISSUE_TEMPLATE/bug_report_java.yml index f95244f5b1..98521cdd7a 100644 --- a/.github/ISSUE_TEMPLATE/bug_report_java.yml +++ b/.github/ISSUE_TEMPLATE/bug_report_java.yml @@ -15,6 +15,7 @@ body: - sentry-apollo-3 - sentry-kotlin-extensions - sentry-opentelemetry-agent + - sentry-opentelemetry-agentless - sentry-opentelemetry-core - sentry-servlet - sentry-servlet-jakarta diff --git a/CHANGELOG.md b/CHANGELOG.md index a702e6a5e7..993d02a397 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,14 @@ # Changelog +## Unreleased + +### Features + +- Add `sentry-opentelemetry-agentless` module ([#3961](https://github.com/getsentry/sentry-java/pull/3961)) + - This module can be added as a dependency when using Sentry with OpenTelemetry but don't want to use our Agent. It takes care of configuring OpenTelemetry for use with Sentry. + - To enable the auto configuration of it, please set `-Dotel.java.global-autoconfigure.enabled=true` on the `java` command, when starting your application. + - You may also want to set `OTEL_LOGS_EXPORTER=none;OTEL_METRICS_EXPORTER=none;OTEL_TRACES_EXPORTER=none` env vars to not have the log flooded with error messages regarding OpenTelemetry features we don't use. + ## 8.0.0-rc.2 ### Fixes diff --git a/sentry-opentelemetry/sentry-opentelemetry-agentless/README.md b/sentry-opentelemetry/sentry-opentelemetry-agentless/README.md new file mode 100644 index 0000000000..9ce3319bae --- /dev/null +++ b/sentry-opentelemetry/sentry-opentelemetry-agentless/README.md @@ -0,0 +1,54 @@ +# sentry-opentelemetry-agentless + +*NOTE: Our OpenTelemetry modules are still experimental. Any feedback is welcome.* + +## How to use it + +Add the latest `sentry-opentelemetry-agentless` module as a dependency and add a `sentry.properties` +configuration file to your project that could look like this: + +```properties +# NOTE: Replace the test DSN below with YOUR OWN DSN to see the events from this app in your Sentry project/dashboard +dsn=https://502f25099c204a2fbf4cb16edc5975d1@o447951.ingest.sentry.io/5428563 +traces-sample-rate=1.0 +``` + +For more details on configuring Sentry via `sentry.properties` please see the +[docs page](https://docs.sentry.io/platforms/java/configuration/). + +As an alternative to the `SENTRY_PROPERTIES_FILE` environment variable you can provide individual +settings as environment variables (e.g. `SENTRY_DSN=...`) or you may initialize `Sentry` inside +your target application. If you do so, please make sure to apply OpenTelemetry specific options, e.g. +like this: + +``` +Sentry.init( + options -> { + options.setDsn("..."); + ... + OpenTelemetryUtil.applyOpenTelemetryOptions(options, false); + } +) +``` + +## Getting rid of exporter error messages + +In case you are using this module without needing to use any OpenTelemetry exporters you can add +the following environment variables to turn off exporters and stop seeing error messages about +servers not being reachable in the logs. + +Example log message: +``` +ERROR io.opentelemetry.exporter.internal.grpc.OkHttpGrpcExporter - Failed to export spans. The request could not be executed. Full error message: Failed to connect to localhost/[0:0:0:0:0:0:0:1]:4317 +ERROR io.opentelemetry.exporter.internal.grpc.OkHttpGrpcExporter - Failed to export metrics. The request could not be executed. Full error message: Failed to connect to localhost/[0:0:0:0:0:0:0:1]:4317 +``` + +### Traces + +To turn off exporting of traces you can set `OTEL_TRACES_EXPORTER=none` +see [OpenTelemetry GitHub](https://github.com/open-telemetry/opentelemetry-java/tree/main/sdk-extensions/autoconfigure#otlp-exporter-span-metric-and-log-exporters) + +### Metrics + +To turn off exporting of metrics you can set `OTEL_METRICS_EXPORTER=none` +see [OpenTelemetry GitHub](https://github.com/open-telemetry/opentelemetry-java/tree/main/sdk-extensions/autoconfigure#otlp-exporter-span-metric-and-log-exporters) diff --git a/sentry-opentelemetry/sentry-opentelemetry-agentless/build.gradle.kts b/sentry-opentelemetry/sentry-opentelemetry-agentless/build.gradle.kts new file mode 100644 index 0000000000..4630bf00b4 --- /dev/null +++ b/sentry-opentelemetry/sentry-opentelemetry-agentless/build.gradle.kts @@ -0,0 +1,18 @@ +plugins { + `java-library` +} + +configure { + sourceCompatibility = JavaVersion.VERSION_1_8 + targetCompatibility = JavaVersion.VERSION_1_8 +} + +dependencies { + api(projects.sentry) + api(projects.sentryOpentelemetry.sentryOpentelemetryBootstrap) + implementation(projects.sentryOpentelemetry.sentryOpentelemetryAgentcustomization) + api(Config.Libs.OpenTelemetry.otelSdk) + api(Config.Libs.OpenTelemetry.otelSemconv) + api(Config.Libs.OpenTelemetry.otelSemconvIncubating) + api(Config.Libs.OpenTelemetry.otelExtensionAutoconfigure) +} diff --git a/sentry-opentelemetry/sentry-opentelemetry-agentless/src/main/java/io/sentry/opentelemetry/agent/AgentlessMarker.java b/sentry-opentelemetry/sentry-opentelemetry-agentless/src/main/java/io/sentry/opentelemetry/agent/AgentlessMarker.java new file mode 100644 index 0000000000..ddb5101c29 --- /dev/null +++ b/sentry-opentelemetry/sentry-opentelemetry-agentless/src/main/java/io/sentry/opentelemetry/agent/AgentlessMarker.java @@ -0,0 +1,3 @@ +package io.sentry.opentelemetry.agent; + +public final class AgentlessMarker {} diff --git a/sentry-samples/sentry-samples-console-opentelemetry-noagent/build.gradle.kts b/sentry-samples/sentry-samples-console-opentelemetry-noagent/build.gradle.kts index 6d33de11cd..100490935f 100644 --- a/sentry-samples/sentry-samples-console-opentelemetry-noagent/build.gradle.kts +++ b/sentry-samples/sentry-samples-console-opentelemetry-noagent/build.gradle.kts @@ -14,12 +14,5 @@ configure { } dependencies { - implementation(projects.sentry) - - implementation(projects.sentryOpentelemetry.sentryOpentelemetryAgentcustomization) - implementation(projects.sentryOpentelemetry.sentryOpentelemetryBootstrap) - implementation(Config.Libs.OpenTelemetry.otelSdk) - implementation(Config.Libs.OpenTelemetry.otelExtensionAutoconfigure) - implementation(Config.Libs.OpenTelemetry.otelSemconv) - implementation(Config.Libs.OpenTelemetry.otelSemconvIncubating) + implementation(projects.sentryOpentelemetry.sentryOpentelemetryAgentless) } diff --git a/sentry-samples/sentry-samples-console-opentelemetry-noagent/src/main/java/io/sentry/samples/console/Main.java b/sentry-samples/sentry-samples-console-opentelemetry-noagent/src/main/java/io/sentry/samples/console/Main.java index c27aad737b..91e76978fb 100644 --- a/sentry-samples/sentry-samples-console-opentelemetry-noagent/src/main/java/io/sentry/samples/console/Main.java +++ b/sentry-samples/sentry-samples-console-opentelemetry-noagent/src/main/java/io/sentry/samples/console/Main.java @@ -14,6 +14,7 @@ import io.sentry.SentryEvent; import io.sentry.SentryLevel; import io.sentry.SpanStatus; +import io.sentry.opentelemetry.OpenTelemetryUtil; import io.sentry.protocol.Message; import io.sentry.protocol.User; import java.util.Collections; @@ -28,6 +29,8 @@ public static void main(String[] args) throws InterruptedException { options.setDsn( "https://502f25099c204a2fbf4cb16edc5975d1@o447951.ingest.sentry.io/5428563"); + OpenTelemetryUtil.applyOpenTelemetryOptions(options, false); + // All events get assigned to the release. See more at // https://docs.sentry.io/workflow/releases/ options.setRelease("io.sentry.samples.console@3.0.0+1"); diff --git a/sentry-samples/sentry-samples-spring-boot-jakarta-opentelemetry-noagent/build.gradle.kts b/sentry-samples/sentry-samples-spring-boot-jakarta-opentelemetry-noagent/build.gradle.kts index dfa17eb952..d73938fef8 100644 --- a/sentry-samples/sentry-samples-spring-boot-jakarta-opentelemetry-noagent/build.gradle.kts +++ b/sentry-samples/sentry-samples-spring-boot-jakarta-opentelemetry-noagent/build.gradle.kts @@ -53,8 +53,7 @@ dependencies { implementation(projects.sentryGraphql22) implementation(projects.sentryQuartz) implementation(Config.Libs.springBoot3StarterOpenTelemetry) - implementation(projects.sentryOpentelemetry.sentryOpentelemetryBootstrap) - implementation(projects.sentryOpentelemetry.sentryOpentelemetryAgentcustomization) + implementation(projects.sentryOpentelemetry.sentryOpentelemetryAgentless) // database query tracing implementation(projects.sentryJdbc) diff --git a/sentry-samples/sentry-samples-spring-boot-opentelemetry-noagent/build.gradle.kts b/sentry-samples/sentry-samples-spring-boot-opentelemetry-noagent/build.gradle.kts index a7a879f0dd..59687ccc26 100644 --- a/sentry-samples/sentry-samples-spring-boot-opentelemetry-noagent/build.gradle.kts +++ b/sentry-samples/sentry-samples-spring-boot-opentelemetry-noagent/build.gradle.kts @@ -53,8 +53,7 @@ dependencies { implementation(projects.sentryGraphql) implementation(projects.sentryQuartz) implementation(Config.Libs.springBoot3StarterOpenTelemetry) - implementation(projects.sentryOpentelemetry.sentryOpentelemetryBootstrap) - implementation(projects.sentryOpentelemetry.sentryOpentelemetryAgentcustomization) + implementation(projects.sentryOpentelemetry.sentryOpentelemetryAgentless) // database query tracing implementation(projects.sentryJdbc) diff --git a/settings.gradle.kts b/settings.gradle.kts index 90ae3048f9..75cff85874 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -48,6 +48,7 @@ include( "sentry-opentelemetry:sentry-opentelemetry-core", "sentry-opentelemetry:sentry-opentelemetry-agentcustomization", "sentry-opentelemetry:sentry-opentelemetry-agent", + "sentry-opentelemetry:sentry-opentelemetry-agentless", "sentry-quartz", "sentry-okhttp", "sentry-samples:sentry-samples-android",