Skip to content

Commit

Permalink
Add Azure Application Insights connection string support (#3715)
Browse files Browse the repository at this point in the history
Adds a new configuration method to AzureMonitorConfig for connectionString configuration, which is meant to supersede instrumentationKey config. `instrumentationKey` is marked as deprecated and only used by default when connectionString is not set. Users should set the instrumentationKey as part of the connectionString going forward.

See https://learn.microsoft.com/en-us/azure/azure-monitor/app/sdk-connection-string
Resolves gh-3710
  • Loading branch information
cbismuth authored Mar 28, 2023
1 parent fddaf12 commit 9253792
Show file tree
Hide file tree
Showing 7 changed files with 77 additions and 14 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
*/
package io.micrometer.azuremonitor;

import io.micrometer.common.lang.Nullable;
import io.micrometer.core.instrument.config.validate.Validated;
import io.micrometer.core.instrument.step.StepRegistryConfig;

Expand All @@ -38,15 +39,35 @@ default String prefix() {
/**
* default implementation to get the instrumentation key from the config
* @return Instrumentation Key
* @see <a href=
* "https://learn.microsoft.com/en-us/azure/azure-monitor/app/sdk-connection-string">Connection
* strings</a>
* @deprecated use {@link #connectionString()} instead
*/
@Deprecated
default String instrumentationKey() {
return getSecret(this, "instrumentationKey").get();
}

/**
* default implementation to get the connection string from the config
* @return Connection String
*/
@Nullable
default String connectionString() {
return getSecret(this, "connectionString").orElseGet(() -> {
String instrumentationKey = instrumentationKey();
if (instrumentationKey == null) {
return null;
}
return "InstrumentationKey=" + instrumentationKey;
});
}

@Override
default Validated<?> validate() {
return checkAll(this, c -> StepRegistryConfig.validate(c),
check("instrumentationKey", AzureMonitorConfig::instrumentationKey));
check("connectionString", AzureMonitorConfig::connectionString));
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -63,9 +63,9 @@ private AzureMonitorMeterRegistry(AzureMonitorConfig config, Clock clock,
super(config, clock);

config().namingConvention(new AzureMonitorNamingConvention());
if (StringUtils.isEmpty(telemetryConfiguration.getInstrumentationKey())) {
checkRequired("instrumentationKey", AzureMonitorConfig::instrumentationKey).apply(config).orThrow();
telemetryConfiguration.setInstrumentationKey(config.instrumentationKey());
if (StringUtils.isEmpty(telemetryConfiguration.getConnectionString())) {
checkRequired("connectionString", AzureMonitorConfig::connectionString).apply(config).orThrow();
telemetryConfiguration.setConnectionString(config.connectionString());
}

client = new TelemetryClient(telemetryConfiguration);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ class AzureMonitorConfigTest {

@Test
void valid() {
props.put("azuremonitor.instrumentationKey", "secret");
props.put("azuremonitor.connectionString", "secret");

assertThat(config.validate().isValid()).isTrue();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,8 +25,8 @@ class AzureMonitorMeterRegistryCompatibilityKit extends MeterRegistryCompatibili

private final AzureMonitorConfig config = new AzureMonitorConfig() {
@Override
public String instrumentationKey() {
return "fakeKey";
public String connectionString() {
return "InstrumentationKey=fakeKey";
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,9 +43,22 @@ public String get(String key) {
return null;
}

@Override
public String connectionString() {
return "InstrumentationKey=myInstrumentationKey1";
}
};

private final AzureMonitorConfig configWithInstrumentationKey = new AzureMonitorConfig() {
@Override
public String get(String key) {
return null;
}

@SuppressWarnings("deprecation")
@Override
public String instrumentationKey() {
return "myInstrumentationKey";
return "myInstrumentationKey2";
}
};

Expand All @@ -54,11 +67,21 @@ public String instrumentationKey() {
private final AzureMonitorMeterRegistry registry = new AzureMonitorMeterRegistry(config, clock);

@Test
void useTelemetryConfigInstrumentationKeyWhenSet() {
void useTelemetryConfigConnectionStringWhenSet() {
TelemetryConfiguration telemetryConfiguration = TelemetryConfiguration.createDefault();
telemetryConfiguration.setInstrumentationKey("fake");
telemetryConfiguration.setConnectionString("InstrumentationKey=myInstrumentationKey1");
AzureMonitorMeterRegistry.builder(config).telemetryConfiguration(telemetryConfiguration).build();
assertThat(telemetryConfiguration.getInstrumentationKey()).isEqualTo("fake");
assertThat(telemetryConfiguration.getConnectionString()).isEqualTo("InstrumentationKey=myInstrumentationKey1");
}

@Test
void useTelemetryConfigInstrumentationKeyWhenSet() {
TelemetryConfiguration telemetryConfiguration = TelemetryConfiguration.createDefault();
telemetryConfiguration.setInstrumentationKey("myInstrumentationKey2");
AzureMonitorMeterRegistry.builder(configWithInstrumentationKey)
.telemetryConfiguration(telemetryConfiguration)
.build();
assertThat(telemetryConfiguration.getInstrumentationKey()).isEqualTo("myInstrumentationKey2");
}

@Test
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ public static void main(String[] args) {

@Bean
AzureMonitorMeterRegistry azureMonitorMeterRegistry(Environment environment) {
// will need an application property `azure.instrumentationKey` to be set
// will need an application property `azure.connectionString` to be set
return AzureMonitorMeterRegistry.builder(environment::getProperty).build();
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -410,8 +410,27 @@ public String uri() {
public static AzureMonitorMeterRegistry azure(String apiKey) {
return new AzureMonitorMeterRegistry(new AzureMonitorConfig() {
@Override
public String instrumentationKey() {
return apiKey;
public String connectionString() {
return String.format("InstrumentationKey=%s", apiKey);
}

@Override
public String get(String key) {
return null;
}

@Override
public Duration step() {
return Duration.ofSeconds(10);
}
}, Clock.SYSTEM);
}

public static AzureMonitorMeterRegistry azureWithConnectionString(String connectionString) {
return new AzureMonitorMeterRegistry(new AzureMonitorConfig() {
@Override
public String connectionString() {
return connectionString;
}

@Override
Expand Down

0 comments on commit 9253792

Please sign in to comment.