diff --git a/sdk/monitor/azure-monitor-opentelemetry-autoconfigure/CHANGELOG.md b/sdk/monitor/azure-monitor-opentelemetry-autoconfigure/CHANGELOG.md index f0e4bdcee1ec..8cc7f09b553b 100644 --- a/sdk/monitor/azure-monitor-opentelemetry-autoconfigure/CHANGELOG.md +++ b/sdk/monitor/azure-monitor-opentelemetry-autoconfigure/CHANGELOG.md @@ -3,7 +3,7 @@ ## 1.0.0-beta.4 (Unreleased) ### Features Added - +- Support for parsing AAD Audience from the connection string ([#44482](https://github.com/Azure/azure-sdk-for-java/pull/44482)) ### Breaking Changes ### Bugs Fixed diff --git a/sdk/monitor/azure-monitor-opentelemetry-autoconfigure/src/main/java/com/azure/monitor/opentelemetry/autoconfigure/AzureMonitorExporterBuilder.java b/sdk/monitor/azure-monitor-opentelemetry-autoconfigure/src/main/java/com/azure/monitor/opentelemetry/autoconfigure/AzureMonitorExporterBuilder.java index c8d1c6c43fd6..7e18596dd26d 100644 --- a/sdk/monitor/azure-monitor-opentelemetry-autoconfigure/src/main/java/com/azure/monitor/opentelemetry/autoconfigure/AzureMonitorExporterBuilder.java +++ b/sdk/monitor/azure-monitor-opentelemetry-autoconfigure/src/main/java/com/azure/monitor/opentelemetry/autoconfigure/AzureMonitorExporterBuilder.java @@ -52,8 +52,6 @@ class AzureMonitorExporterBuilder { private static final ClientLogger LOGGER = new ClientLogger(AzureMonitorExporterBuilder.class); - private static final String APPLICATIONINSIGHTS_AUTHENTICATION_SCOPE = "https://monitor.azure.com//.default"; - private static final String STATSBEAT_LONG_INTERVAL_SECONDS_PROPERTY_NAME = "STATSBEAT_LONG_INTERVAL_SECONDS_PROPERTY_NAME"; private static final String STATSBEAT_SHORT_INTERVAL_SECONDS_PROPERTY_NAME @@ -183,7 +181,7 @@ private HttpPipeline createHttpPipeline() { policies.add(new CookiePolicy()); if (exporterOptions.credential != null) { policies.add(new BearerTokenAuthenticationPolicy(exporterOptions.credential, - APPLICATIONINSIGHTS_AUTHENTICATION_SCOPE)); + getConnectionString().getAadAudienceWithScope())); } if (exporterOptions.retryOptions != null) { diff --git a/sdk/monitor/azure-monitor-opentelemetry-autoconfigure/src/main/java/com/azure/monitor/opentelemetry/autoconfigure/implementation/configuration/ConnectionString.java b/sdk/monitor/azure-monitor-opentelemetry-autoconfigure/src/main/java/com/azure/monitor/opentelemetry/autoconfigure/implementation/configuration/ConnectionString.java index 30a6d1a77326..59131ac5af4d 100644 --- a/sdk/monitor/azure-monitor-opentelemetry-autoconfigure/src/main/java/com/azure/monitor/opentelemetry/autoconfigure/implementation/configuration/ConnectionString.java +++ b/sdk/monitor/azure-monitor-opentelemetry-autoconfigure/src/main/java/com/azure/monitor/opentelemetry/autoconfigure/implementation/configuration/ConnectionString.java @@ -19,14 +19,16 @@ public final class ConnectionString { private final URL profilerEndpoint; private final String originalString; + private final String aadAudience; ConnectionString(String instrumentationKey, URL ingestionEndpoint, URL liveEndpoint, URL profilerEndpoint, - String originalString) { + String originalString, String aadAudience) { this.instrumentationKey = instrumentationKey; this.ingestionEndpoint = ingestionEndpoint.toExternalForm(); this.liveEndpoint = liveEndpoint; this.profilerEndpoint = profilerEndpoint; this.originalString = originalString; + this.aadAudience = aadAudience; } public static ConnectionString parse(String connectionString) { @@ -54,4 +56,8 @@ public URL getProfilerEndpoint() { public String getOriginalString() { return originalString; } + + public String getAadAudienceWithScope() { + return "https://" + aadAudience + "//.default"; + } } diff --git a/sdk/monitor/azure-monitor-opentelemetry-autoconfigure/src/main/java/com/azure/monitor/opentelemetry/autoconfigure/implementation/configuration/ConnectionStringBuilder.java b/sdk/monitor/azure-monitor-opentelemetry-autoconfigure/src/main/java/com/azure/monitor/opentelemetry/autoconfigure/implementation/configuration/ConnectionStringBuilder.java index 5c8c7ab63089..5b4f1d6262d2 100644 --- a/sdk/monitor/azure-monitor-opentelemetry-autoconfigure/src/main/java/com/azure/monitor/opentelemetry/autoconfigure/implementation/configuration/ConnectionStringBuilder.java +++ b/sdk/monitor/azure-monitor-opentelemetry-autoconfigure/src/main/java/com/azure/monitor/opentelemetry/autoconfigure/implementation/configuration/ConnectionStringBuilder.java @@ -16,6 +16,7 @@ class ConnectionStringBuilder { // visible for testing static final int CONNECTION_STRING_MAX_LENGTH = 4096; + static final String DEFAULT_AAD_AUDIENCE = "monitor.azure.com"; private String originalString; @@ -24,6 +25,7 @@ class ConnectionStringBuilder { private URL ingestionEndpoint; private URL liveEndpoint; private URL profilerEndpoint; + private String aadAudience; ConnectionStringBuilder() { try { @@ -33,6 +35,7 @@ class ConnectionStringBuilder { } catch (MalformedURLException e) { throw new IllegalStateException("ConnectionString.Defaults are invalid", e); } + aadAudience = DEFAULT_AAD_AUDIENCE; } ConnectionStringBuilder setConnectionString(String connectionString) { @@ -43,7 +46,7 @@ ConnectionStringBuilder setConnectionString(String connectionString) { ConnectionString build() { return new ConnectionString(instrumentationKey, ingestionEndpoint, liveEndpoint, profilerEndpoint, - originalString); + originalString, aadAudience); } private static Map getKeyValuePairs(String connectionString) { @@ -95,6 +98,12 @@ private void mapToConnectionConfiguration(Map kvps) { setProfilerEndpoint("https://" + EndpointPrefixes.PROFILER_ENDPOINT_PREFIX + "." + suffix); } + // set aad audience + String aadAudience = kvps.get(Keywords.AAD_AUDIENCE); + if (!CoreUtils.isNullOrEmpty(aadAudience)) { + setAadAudience(aadAudience); + } + // set explicit endpoints String liveEndpoint = kvps.get(Keywords.LIVE_ENDPOINT); if (!CoreUtils.isNullOrEmpty(liveEndpoint)) { @@ -124,6 +133,10 @@ void setProfilerEndpoint(String profilerEndpoint) { this.profilerEndpoint = toUrlOrThrow(profilerEndpoint, Keywords.PROFILER_ENDPOINT); } + void setAadAudience(String aadAudience) { + this.aadAudience = aadAudience; + } + private static URL toUrlOrThrow(String url, String field) { if (!url.endsWith("/")) { url += "/"; @@ -155,6 +168,7 @@ private Keywords() { static final String INGESTION_ENDPOINT = "IngestionEndpoint"; static final String LIVE_ENDPOINT = "LiveEndpoint"; static final String PROFILER_ENDPOINT = "ProfilerEndpoint"; + static final String AAD_AUDIENCE = "AADAudience"; } // visible for testing diff --git a/sdk/monitor/azure-monitor-opentelemetry-autoconfigure/src/test/java/com/azure/monitor/opentelemetry/autoconfigure/implementation/configuration/ConnectionStringParsingTests.java b/sdk/monitor/azure-monitor-opentelemetry-autoconfigure/src/test/java/com/azure/monitor/opentelemetry/autoconfigure/implementation/configuration/ConnectionStringParsingTests.java index 3de321f1f23a..a49f560b680a 100644 --- a/sdk/monitor/azure-monitor-opentelemetry-autoconfigure/src/test/java/com/azure/monitor/opentelemetry/autoconfigure/implementation/configuration/ConnectionStringParsingTests.java +++ b/sdk/monitor/azure-monitor-opentelemetry-autoconfigure/src/test/java/com/azure/monitor/opentelemetry/autoconfigure/implementation/configuration/ConnectionStringParsingTests.java @@ -73,6 +73,25 @@ void suffixSupportsPort() throws Exception { assertThat(parsed.getLiveEndpoint()).isEqualTo(expectedLiveEndpoint); } + @Test + void canParseAadAudience() { + String ikey = "fake-ikey"; + String aadAudience = "test-audience"; + String cs = "InstrumentationKey=" + ikey + ";AADAudience=" + aadAudience; + ConnectionString parsed = ConnectionString.parse(cs); + assertThat(parsed.getInstrumentationKey()).isEqualTo(ikey); + assertThat(parsed.getAadAudienceWithScope()).isEqualTo("https://test-audience//.default"); + } + + @Test + void defaultAadAudience() { + String ikey = "fake-ikey"; + String cs = "InstrumentationKey=" + ikey; + ConnectionString parsed = ConnectionString.parse(cs); + assertThat(parsed.getInstrumentationKey()).isEqualTo(ikey); + assertThat(parsed.getAadAudienceWithScope()).isEqualTo("https://monitor.azure.com//.default"); + } + @Test void ikeyWithExplicitEndpoints() throws Exception { String ikey = "fake-ikey";