Skip to content

Commit d5c603b

Browse files
authored
Support parsing AAD Audience from connection string (Azure#44482)
* parse for aad audience * changelog and default test * fix ci * minor
1 parent 9a8bfe3 commit d5c603b

File tree

5 files changed

+43
-6
lines changed

5 files changed

+43
-6
lines changed

sdk/monitor/azure-monitor-opentelemetry-autoconfigure/CHANGELOG.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
## 1.1.0-beta.1 (Unreleased)
44

55
### Features Added
6-
6+
- Support for parsing AAD Audience from the connection string ([#44482](https://github.com/Azure/azure-sdk-for-java/pull/44482))
77
### Breaking Changes
88

99
### Bugs Fixed

sdk/monitor/azure-monitor-opentelemetry-autoconfigure/src/main/java/com/azure/monitor/opentelemetry/autoconfigure/AzureMonitorExporterBuilder.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -52,8 +52,6 @@ class AzureMonitorExporterBuilder {
5252

5353
private static final ClientLogger LOGGER = new ClientLogger(AzureMonitorExporterBuilder.class);
5454

55-
private static final String APPLICATIONINSIGHTS_AUTHENTICATION_SCOPE = "https://monitor.azure.com//.default";
56-
5755
private static final String STATSBEAT_LONG_INTERVAL_SECONDS_PROPERTY_NAME
5856
= "STATSBEAT_LONG_INTERVAL_SECONDS_PROPERTY_NAME";
5957
private static final String STATSBEAT_SHORT_INTERVAL_SECONDS_PROPERTY_NAME
@@ -183,7 +181,7 @@ private HttpPipeline createHttpPipeline() {
183181
policies.add(new CookiePolicy());
184182
if (exporterOptions.credential != null) {
185183
policies.add(new BearerTokenAuthenticationPolicy(exporterOptions.credential,
186-
APPLICATIONINSIGHTS_AUTHENTICATION_SCOPE));
184+
getConnectionString().getAadAudienceWithScope()));
187185
}
188186

189187
if (exporterOptions.retryOptions != null) {

sdk/monitor/azure-monitor-opentelemetry-autoconfigure/src/main/java/com/azure/monitor/opentelemetry/autoconfigure/implementation/configuration/ConnectionString.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,14 +19,16 @@ public final class ConnectionString {
1919
private final URL profilerEndpoint;
2020

2121
private final String originalString;
22+
private final String aadAudience;
2223

2324
ConnectionString(String instrumentationKey, URL ingestionEndpoint, URL liveEndpoint, URL profilerEndpoint,
24-
String originalString) {
25+
String originalString, String aadAudience) {
2526
this.instrumentationKey = instrumentationKey;
2627
this.ingestionEndpoint = ingestionEndpoint.toExternalForm();
2728
this.liveEndpoint = liveEndpoint;
2829
this.profilerEndpoint = profilerEndpoint;
2930
this.originalString = originalString;
31+
this.aadAudience = aadAudience;
3032
}
3133

3234
public static ConnectionString parse(String connectionString) {
@@ -54,4 +56,8 @@ public URL getProfilerEndpoint() {
5456
public String getOriginalString() {
5557
return originalString;
5658
}
59+
60+
public String getAadAudienceWithScope() {
61+
return aadAudience + "/.default";
62+
}
5763
}

sdk/monitor/azure-monitor-opentelemetry-autoconfigure/src/main/java/com/azure/monitor/opentelemetry/autoconfigure/implementation/configuration/ConnectionStringBuilder.java

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ class ConnectionStringBuilder {
1616

1717
// visible for testing
1818
static final int CONNECTION_STRING_MAX_LENGTH = 4096;
19+
static final String DEFAULT_AAD_AUDIENCE = "https://monitor.azure.com/";
1920

2021
private String originalString;
2122

@@ -24,6 +25,7 @@ class ConnectionStringBuilder {
2425
private URL ingestionEndpoint;
2526
private URL liveEndpoint;
2627
private URL profilerEndpoint;
28+
private String aadAudience;
2729

2830
ConnectionStringBuilder() {
2931
try {
@@ -33,6 +35,7 @@ class ConnectionStringBuilder {
3335
} catch (MalformedURLException e) {
3436
throw new IllegalStateException("ConnectionString.Defaults are invalid", e);
3537
}
38+
aadAudience = DEFAULT_AAD_AUDIENCE;
3639
}
3740

3841
ConnectionStringBuilder setConnectionString(String connectionString) {
@@ -43,7 +46,7 @@ ConnectionStringBuilder setConnectionString(String connectionString) {
4346

4447
ConnectionString build() {
4548
return new ConnectionString(instrumentationKey, ingestionEndpoint, liveEndpoint, profilerEndpoint,
46-
originalString);
49+
originalString, aadAudience);
4750
}
4851

4952
private static Map<String, String> getKeyValuePairs(String connectionString) {
@@ -95,6 +98,12 @@ private void mapToConnectionConfiguration(Map<String, String> kvps) {
9598
setProfilerEndpoint("https://" + EndpointPrefixes.PROFILER_ENDPOINT_PREFIX + "." + suffix);
9699
}
97100

101+
// set aad audience
102+
String aadAudience = kvps.get(Keywords.AAD_AUDIENCE);
103+
if (!CoreUtils.isNullOrEmpty(aadAudience)) {
104+
setAadAudience(aadAudience);
105+
}
106+
98107
// set explicit endpoints
99108
String liveEndpoint = kvps.get(Keywords.LIVE_ENDPOINT);
100109
if (!CoreUtils.isNullOrEmpty(liveEndpoint)) {
@@ -124,6 +133,10 @@ void setProfilerEndpoint(String profilerEndpoint) {
124133
this.profilerEndpoint = toUrlOrThrow(profilerEndpoint, Keywords.PROFILER_ENDPOINT);
125134
}
126135

136+
void setAadAudience(String aadAudience) {
137+
this.aadAudience = aadAudience;
138+
}
139+
127140
private static URL toUrlOrThrow(String url, String field) {
128141
if (!url.endsWith("/")) {
129142
url += "/";
@@ -155,6 +168,7 @@ private Keywords() {
155168
static final String INGESTION_ENDPOINT = "IngestionEndpoint";
156169
static final String LIVE_ENDPOINT = "LiveEndpoint";
157170
static final String PROFILER_ENDPOINT = "ProfilerEndpoint";
171+
static final String AAD_AUDIENCE = "AADAudience";
158172
}
159173

160174
// visible for testing

sdk/monitor/azure-monitor-opentelemetry-autoconfigure/src/test/java/com/azure/monitor/opentelemetry/autoconfigure/implementation/configuration/ConnectionStringParsingTests.java

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,25 @@ void suffixSupportsPort() throws Exception {
7373
assertThat(parsed.getLiveEndpoint()).isEqualTo(expectedLiveEndpoint);
7474
}
7575

76+
@Test
77+
void canParseAadAudience() {
78+
String ikey = "fake-ikey";
79+
String aadAudience = "https://test-audience/";
80+
String cs = "InstrumentationKey=" + ikey + ";AADAudience=" + aadAudience;
81+
ConnectionString parsed = ConnectionString.parse(cs);
82+
assertThat(parsed.getInstrumentationKey()).isEqualTo(ikey);
83+
assertThat(parsed.getAadAudienceWithScope()).isEqualTo("https://test-audience//.default");
84+
}
85+
86+
@Test
87+
void defaultAadAudience() {
88+
String ikey = "fake-ikey";
89+
String cs = "InstrumentationKey=" + ikey;
90+
ConnectionString parsed = ConnectionString.parse(cs);
91+
assertThat(parsed.getInstrumentationKey()).isEqualTo(ikey);
92+
assertThat(parsed.getAadAudienceWithScope()).isEqualTo("https://monitor.azure.com//.default");
93+
}
94+
7695
@Test
7796
void ikeyWithExplicitEndpoints() throws Exception {
7897
String ikey = "fake-ikey";

0 commit comments

Comments
 (0)