Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Support for AAD Audience in connection string (for sovereign cloud) #4121

Draft
wants to merge 3 commits into
base: main
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/build-common.yml
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ on:
required: false

env:
EXPORTER_VERSION: 1.0.0-beta.1 # to be updated with the latest version
EXPORTER_VERSION: 1.0.0-beta.4 # to be updated with the latest version

jobs:
spotless:
Expand Down
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
# CHANGELOG
## Version 3.7.2 GA (Unreleased)
* Support for using the AAD Audience from the connection string ([#4121](https://github.com/microsoft/ApplicationInsights-Java/pull/4121))

## Version 3.7.1 GA (02/26/2025)

Expand Down
2 changes: 1 addition & 1 deletion agent/agent-tooling/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ dependencies {
implementation(project(":agent:agent-profiler:agent-diagnostics"))
implementation(project(":etw:java"))

implementation("com.azure:azure-monitor-opentelemetry-autoconfigure:1.0.0-beta.3")
implementation("com.azure:azure-monitor-opentelemetry-autoconfigure:1.0.0-beta.4")
compileOnly("io.opentelemetry.javaagent:opentelemetry-javaagent-bootstrap")
compileOnly("io.opentelemetry.javaagent:opentelemetry-javaagent-tooling")
compileOnly("io.opentelemetry.javaagent:opentelemetry-javaagent-tooling-java9")
Expand Down
2 changes: 1 addition & 1 deletion agent/agent-tooling/gradle.lockfile
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ com.azure:azure-core-http-netty:1.15.7=runtimeClasspath
com.azure:azure-core:1.54.1=runtimeClasspath
com.azure:azure-identity:1.15.3=runtimeClasspath
com.azure:azure-json:1.3.0=runtimeClasspath
com.azure:azure-monitor-opentelemetry-autoconfigure:1.0.0-beta.3=runtimeClasspath
com.azure:azure-monitor-opentelemetry-autoconfigure:1.0.0-beta.4=runtimeClasspath
com.azure:azure-sdk-bom:1.2.31=runtimeClasspath
com.azure:azure-storage-blob:12.29.0=runtimeClasspath
com.azure:azure-storage-common:12.28.0=runtimeClasspath
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,9 +37,6 @@

public class LazyHttpClient implements HttpClient {

private static final String APPLICATIONINSIGHTS_AUTHENTICATION_SCOPE =
"https://monitor.azure.com//.default";

private static final HttpClient INSTANCE = new LazyHttpClient();

public static final CountDownLatch safeToInitLatch = new CountDownLatch(1);
Expand Down Expand Up @@ -113,16 +110,18 @@ private static HttpClient init() {
}

public static HttpPipeline newHttpPipeLineWithDefaultRedirect(
@Nullable Configuration.AadAuthentication aadConfiguration) {
return newHttpPipeLine(aadConfiguration, new RedirectPolicy(new DefaultRedirectStrategy()));
@Nullable Configuration.AadAuthentication aadConfiguration, String aadAudienceWithScope) {
return newHttpPipeLine(
aadConfiguration, aadAudienceWithScope, new RedirectPolicy(new DefaultRedirectStrategy()));
}

public static HttpPipeline newHttpPipeLine(
@Nullable Configuration.AadAuthentication aadConfiguration,
String aadAudienceWithScope,
HttpPipelinePolicy... additionalPolicies) {
List<HttpPipelinePolicy> policies = new ArrayList<>();
if (aadConfiguration != null && aadConfiguration.enabled) {
policies.add(getAuthenticationPolicy(aadConfiguration));
policies.add(getAuthenticationPolicy(aadConfiguration, aadAudienceWithScope));
}
policies.addAll(asList(additionalPolicies));
// Add Logging Policy. Can be enabled using AZURE_LOG_LEVEL.
Expand All @@ -144,31 +143,31 @@ public Mono<HttpResponse> send(HttpRequest request, Context context) {
}

private static HttpPipelinePolicy getAuthenticationPolicy(
Configuration.AadAuthentication configuration) {
Configuration.AadAuthentication configuration, String aadAudienceWithScope) {
switch (configuration.type) {
case UAMI:
return getAuthenticationPolicyWithUami(configuration);
return getAuthenticationPolicyWithUami(configuration, aadAudienceWithScope);
case SAMI:
return getAuthenticationPolicyWithSami();
return getAuthenticationPolicyWithSami(aadAudienceWithScope);
case VSCODE:
return getAuthenticationPolicyWithVsCode();
return getAuthenticationPolicyWithVsCode(aadAudienceWithScope);
case CLIENTSECRET:
return getAuthenticationPolicyWithClientSecret(configuration);
return getAuthenticationPolicyWithClientSecret(configuration, aadAudienceWithScope);
}
throw new IllegalStateException(
"Invalid Authentication Type used in AAD Authentication: " + configuration.type);
}

private static HttpPipelinePolicy getAuthenticationPolicyWithUami(
Configuration.AadAuthentication configuration) {
Configuration.AadAuthentication configuration, String aadAudienceWithScope) {
ManagedIdentityCredentialBuilder managedIdentityCredential =
new ManagedIdentityCredentialBuilder().clientId(configuration.clientId);
return new BearerTokenAuthenticationPolicy(
managedIdentityCredential.build(), APPLICATIONINSIGHTS_AUTHENTICATION_SCOPE);
managedIdentityCredential.build(), aadAudienceWithScope);
}

private static HttpPipelinePolicy getAuthenticationPolicyWithClientSecret(
Configuration.AadAuthentication configuration) {
Configuration.AadAuthentication configuration, String aadAudienceWithScope) {
ClientSecretCredentialBuilder credential =
new ClientSecretCredentialBuilder()
.tenantId(configuration.tenantId)
Expand All @@ -177,21 +176,18 @@ private static HttpPipelinePolicy getAuthenticationPolicyWithClientSecret(
if (configuration.authorityHost != null) {
credential.authorityHost(configuration.authorityHost);
}
return new BearerTokenAuthenticationPolicy(
credential.build(), APPLICATIONINSIGHTS_AUTHENTICATION_SCOPE);
return new BearerTokenAuthenticationPolicy(credential.build(), aadAudienceWithScope);
}

private static HttpPipelinePolicy getAuthenticationPolicyWithVsCode() {
private static HttpPipelinePolicy getAuthenticationPolicyWithVsCode(String aadAudienceWithScope) {
VisualStudioCodeCredential visualStudioCodeCredential =
new VisualStudioCodeCredentialBuilder().build();
return new BearerTokenAuthenticationPolicy(
visualStudioCodeCredential, APPLICATIONINSIGHTS_AUTHENTICATION_SCOPE);
return new BearerTokenAuthenticationPolicy(visualStudioCodeCredential, aadAudienceWithScope);
}

private static HttpPipelinePolicy getAuthenticationPolicyWithSami() {
private static HttpPipelinePolicy getAuthenticationPolicyWithSami(String aadAudienceWithScope) {
ManagedIdentityCredential managedIdentityCredential =
new ManagedIdentityCredentialBuilder().build();
return new BearerTokenAuthenticationPolicy(
managedIdentityCredential, APPLICATIONINSIGHTS_AUTHENTICATION_SCOPE);
return new BearerTokenAuthenticationPolicy(managedIdentityCredential, aadAudienceWithScope);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -201,7 +201,10 @@ public void customize(AutoConfigurationCustomizer autoConfiguration) {
if (telemetryClient.getConnectionString() != null) {
statsbeatModule.start(
AzureMonitorHelper.createStatsbeatTelemetryItemExporter(
LazyHttpClient.newHttpPipeLine(null), statsbeatModule, tempDir),
LazyHttpClient.newHttpPipeLine(
null, telemetryClient.getConnectionString().getAadAudienceWithScope()),
statsbeatModule,
tempDir),
telemetryClient::getStatsbeatConnectionString,
telemetryClient::getInstrumentationKey,
configuration.internal.statsbeat.disabledAll,
Expand All @@ -224,7 +227,9 @@ public void customize(AutoConfigurationCustomizer autoConfiguration) {
if (configuration.preview.liveMetrics.enabled) {
quickPulse =
QuickPulse.create(
LazyHttpClient.newHttpPipeLineWithDefaultRedirect(configuration.authentication),
LazyHttpClient.newHttpPipeLineWithDefaultRedirect(
configuration.authentication,
telemetryClient.getConnectionString().getAadAudienceWithScope()),
() -> {
ConnectionString connectionString = telemetryClient.getConnectionString();
return connectionString == null ? null : connectionString.getLiveEndpoint();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -121,6 +121,7 @@ private synchronized void performInit() {
httpPipeline =
LazyHttpClient.newHttpPipeLine(
telemetryClient.getAadAuthentication(),
telemetryClient.getConnectionString().getAadAudienceWithScope(),
new RedirectPolicy(
new DefaultRedirectStrategy(
3,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -227,6 +227,7 @@ private BatchItemProcessor initBatchItemProcessor(
HttpPipeline httpPipeline =
LazyHttpClient.newHttpPipeLine(
aadAuthentication,
connectionString.getAadAudienceWithScope(),
new NetworkStatsbeatHttpPipelinePolicy(statsbeatModule.getNetworkStatsbeat()));
// TODO (heya) refactor the following by using AzureMonitorHelper.createTelemetryItemExporter by
// passing in getNonessentialStatsbeat
Expand Down
Loading