From f17f6d6f8431e8d8d7b25de1b09de36f4df3639c Mon Sep 17 00:00:00 2001 From: Pranav Sharma Date: Wed, 17 Jun 2026 18:07:14 +0000 Subject: [PATCH] Configure OTLP metric export in examples/metrics using autoconfigure Modified the metrics example to export metrics via both the custom GoogleCloudMetricExporter (configured manually) and the OTLP exporter (configured via autoconfigure). Leveraged AutoConfiguredOpenTelemetrySdk to automatically configure the OTLP exporter and automatically inject GCP credentials using the opentelemetry-gcp-auth-extension. The existing code that configures GoogleCloudMetricExporter remains intact and is registered to the SDK via a MeterProvider customizer. TAG=agy CONV=f9409d85-cca6-4364-9198-2552404e15d8 --- examples/metrics/build.gradle | 21 +++++++++- .../metrics/MetricsExporterExample.java | 39 ++++++++++--------- 2 files changed, 40 insertions(+), 20 deletions(-) diff --git a/examples/metrics/build.gradle b/examples/metrics/build.gradle index 24f16f62..c11130a4 100644 --- a/examples/metrics/build.gradle +++ b/examples/metrics/build.gradle @@ -29,16 +29,33 @@ jib { containerizingMode = 'packaged' } -mainClassName = 'com.google.cloud.opentelemetry.example.metrics.MetricsExporterExample' +def autoconf_config = [ + '-Dotel.exporter.otlp.endpoint=https://telemetry.googleapis.com', + '-Dotel.resource.attributes=gcp.project_id=', + '-Dotel.metrics.exporter=otlp', + '-Dotel.logs.exporter=none', + '-Dotel.traces.exporter=none', + '-Dotel.service.name=metrics-example', + '-Dotel.exporter.otlp.protocol=http/protobuf', + '-Dotel.java.global-autoconfigure.enabled=true', +] + +application { + mainClassName = 'com.google.cloud.opentelemetry.example.metrics.MetricsExporterExample' + applicationDefaultJvmArgs = autoconf_config +} description = 'Examples for Cloud Monitoring Exporter' dependencies { implementation(libraries.opentelemetry_api) - implementation(libraries.opentelemetry_sdk_metrics) + implementation(libraries.opentelemetry_sdk) + implementation(libraries.opentelemetry_sdk_autoconf) implementation(libraries.google_cloud_monitoring) implementation project(':exporter-metrics') implementation(libraries.opentelemetry_gcp_resources) + implementation(libraries.opentelemetry_otlp_exporter) + implementation(libraries.opentelemetry_gcp_auth_extension) // required by resource detection implementation(libraries.opentelemetry_autoconfigure_spi) // this helps in debugging as it outputs all export to std out diff --git a/examples/metrics/src/main/java/com/google/cloud/opentelemetry/example/metrics/MetricsExporterExample.java b/examples/metrics/src/main/java/com/google/cloud/opentelemetry/example/metrics/MetricsExporterExample.java index a97df0f0..ec59bc18 100644 --- a/examples/metrics/src/main/java/com/google/cloud/opentelemetry/example/metrics/MetricsExporterExample.java +++ b/examples/metrics/src/main/java/com/google/cloud/opentelemetry/example/metrics/MetricsExporterExample.java @@ -28,20 +28,20 @@ import io.grpc.ManagedChannelBuilder; import io.opentelemetry.api.metrics.LongCounter; import io.opentelemetry.api.metrics.Meter; -import io.opentelemetry.contrib.gcp.resource.GCPResourceProvider; import io.opentelemetry.exporter.logging.LoggingMetricExporter; +import io.opentelemetry.sdk.OpenTelemetrySdk; +import io.opentelemetry.sdk.autoconfigure.AutoConfiguredOpenTelemetrySdk; import io.opentelemetry.sdk.common.CompletableResultCode; import io.opentelemetry.sdk.metrics.SdkMeterProvider; import io.opentelemetry.sdk.metrics.export.MetricExporter; import io.opentelemetry.sdk.metrics.export.PeriodicMetricReader; -import io.opentelemetry.sdk.resources.Resource; import java.io.IOException; import java.time.Duration; import java.util.Random; import java.util.concurrent.TimeUnit; public class MetricsExporterExample { - private static SdkMeterProvider METER_PROVIDER; + private static OpenTelemetrySdk OPEN_TELEMETRY_SDK; private static Meter METER; private static final Random RANDOM = new Random(); @@ -81,25 +81,28 @@ private static MetricConfiguration generateMetricExporterConfig(boolean useDefau } private static void setupMetricExporter(MetricConfiguration metricConfiguration) { - GCPResourceProvider resourceProvider = new GCPResourceProvider(); MetricExporter metricExporter = GoogleCloudMetricExporter.createWithConfiguration(metricConfiguration); MetricExporter metricDebugExporter = LoggingMetricExporter.create(); - METER_PROVIDER = - SdkMeterProvider.builder() - .setResource(Resource.create(resourceProvider.getAttributes())) - .registerMetricReader( - PeriodicMetricReader.builder(metricExporter) - .setInterval(Duration.ofSeconds(30)) - .build()) - .registerMetricReader( - PeriodicMetricReader.builder(metricDebugExporter) - .setInterval(Duration.ofSeconds(30)) - .build()) - .build(); + + OPEN_TELEMETRY_SDK = + AutoConfiguredOpenTelemetrySdk.builder() + .addMeterProviderCustomizer( + (meterProviderBuilder, configProperties) -> + meterProviderBuilder + .registerMetricReader( + PeriodicMetricReader.builder(metricExporter) + .setInterval(Duration.ofSeconds(30)) + .build()) + .registerMetricReader( + PeriodicMetricReader.builder(metricDebugExporter) + .setInterval(Duration.ofSeconds(30)) + .build())) + .build() + .getOpenTelemetrySdk(); METER = - METER_PROVIDER + OPEN_TELEMETRY_SDK .meterBuilder("instrumentation-library-name") .setInstrumentationVersion("semver:1.0.0") .build(); @@ -148,7 +151,7 @@ public static void main(String[] args) throws InterruptedException, IOException } finally { System.out.println("Shutting down the metrics-example application"); - CompletableResultCode resultCode = METER_PROVIDER.shutdown(); + CompletableResultCode resultCode = OPEN_TELEMETRY_SDK.getSdkMeterProvider().shutdown(); // Wait upto 60 seconds for job to complete resultCode.join(60, TimeUnit.SECONDS); if (resultCode.isSuccess()) {