Skip to content

Commit c8fdb4e

Browse files
committed
Add micrometer auto-instrumentation
1 parent bf8a57c commit c8fdb4e

File tree

15 files changed

+156
-3
lines changed

15 files changed

+156
-3
lines changed

agent/agent-bootstrap/src/main/java/com/microsoft/applicationinsights/agent/bootstrap/BytecodeUtil.java

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,9 @@
2323
import java.net.URI;
2424
import java.util.Map;
2525

26+
import io.opentelemetry.auto.bootstrap.instrumentation.aisdk.MicrometerUtil;
27+
import io.opentelemetry.auto.bootstrap.instrumentation.aisdk.MicrometerUtil.MicrometerUtilDelegate;
28+
2629
import static java.util.concurrent.TimeUnit.DAYS;
2730
import static java.util.concurrent.TimeUnit.HOURS;
2831
import static java.util.concurrent.TimeUnit.MINUTES;
@@ -33,9 +36,15 @@ public class BytecodeUtil {
3336

3437
private static BytecodeUtilDelegate delegate;
3538

36-
public static void setDelegate(BytecodeUtilDelegate delegate) {
39+
public static void setDelegate(final BytecodeUtilDelegate delegate) {
3740
if (BytecodeUtil.delegate == null) {
3841
BytecodeUtil.delegate = delegate;
42+
MicrometerUtil.setDelegate(new MicrometerUtilDelegate() {
43+
@Override
44+
public void trackMetric(String name, double value, Integer count, Double min, Double max, Map<String, String> properties) {
45+
delegate.trackMetric(name, value, count, min, max, null, properties);
46+
}
47+
});
3948
}
4049
}
4150

agent/agent-tooling/src/main/java/com/microsoft/applicationinsights/agent/internal/BeforeAgentInstaller.java

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,12 +32,14 @@
3232
import com.google.common.base.Strings;
3333
import com.microsoft.applicationinsights.TelemetryClient;
3434
import com.microsoft.applicationinsights.TelemetryConfiguration;
35+
import com.microsoft.applicationinsights.agent.bootstrap.BytecodeUtil;
3536
import com.microsoft.applicationinsights.agent.bootstrap.MainEntryPoint;
3637
import com.microsoft.applicationinsights.agent.bootstrap.configuration.ConfigurationBuilder.ConfigurationException;
3738
import com.microsoft.applicationinsights.agent.bootstrap.configuration.InstrumentationSettings;
3839
import com.microsoft.applicationinsights.agent.bootstrap.configuration.InstrumentationSettings.FixedRateSampling;
3940
import com.microsoft.applicationinsights.agent.bootstrap.configuration.InstrumentationSettings.JmxMetric;
4041
import com.microsoft.applicationinsights.agent.bootstrap.diagnostics.DiagnosticsHelper;
42+
import com.microsoft.applicationinsights.agent.internal.instrumentation.sdk.BytecodeUtilImpl;
4143
import com.microsoft.applicationinsights.agent.internal.instrumentation.sdk.DependencyTelemetryClassFileTransformer;
4244
import com.microsoft.applicationinsights.agent.internal.instrumentation.sdk.HeartBeatModuleClassFileTransformer;
4345
import com.microsoft.applicationinsights.agent.internal.instrumentation.sdk.PerformanceCounterModuleClassFileTransformer;
@@ -103,6 +105,7 @@ private static void start(Instrumentation instrumentation, File agentJarFile) th
103105
Properties properties = new Properties();
104106
properties.put("additional.bootstrap.package.prefixes", "com.microsoft.applicationinsights.agent.bootstrap");
105107
properties.put("experimental.log.capture.threshold", getThreshold(config, "WARN"));
108+
properties.put("micrometer.step.millis", Integer.toString(getReportingIntervalMillis(config, 60000)));
106109
properties.put("experimental.controller-and-view.spans.enabled", "false");
107110
properties.put("http.server.error.statuses", "400-599");
108111
ConfigOverride.set(properties);
@@ -143,6 +146,8 @@ private static void start(Instrumentation instrumentation, File agentJarFile) th
143146
TelemetryClient telemetryClient = new TelemetryClient();
144147
Global.setTelemetryClient(telemetryClient);
145148
AiAppId.setSupplier(new AppIdSupplier());
149+
// this is currently used by Micrometer instrumentation in addition to 2.x SDK
150+
BytecodeUtil.setDelegate(new BytecodeUtilImpl());
146151
}
147152

148153
@Nullable
@@ -195,6 +200,22 @@ private static String getThreshold(InstrumentationSettings config, String defaul
195200
return threshold;
196201
}
197202

203+
private static int getReportingIntervalMillis(InstrumentationSettings config, int defaultValue) {
204+
Map<String, Object> micrometer = config.preview.instrumentation.get("micrometer");
205+
if (micrometer == null) {
206+
return defaultValue;
207+
}
208+
Object reportingIntervalMillisObj = micrometer.get("reportingIntervalMillis");
209+
if (reportingIntervalMillisObj == null) {
210+
return defaultValue;
211+
}
212+
if (!(reportingIntervalMillisObj instanceof Number)) {
213+
startupLogger.warn("micrometer reportingIntervalMillis must be a number, but found: {}", reportingIntervalMillisObj.getClass());
214+
return defaultValue;
215+
}
216+
return ((Number) reportingIntervalMillisObj).intValue();
217+
}
218+
198219
private static ApplicationInsightsXmlConfiguration buildXmlConfiguration(InstrumentationSettings config) {
199220

200221
ApplicationInsightsXmlConfiguration xmlConfiguration = new ApplicationInsightsXmlConfiguration();

agent/agent-tooling/src/main/java/com/microsoft/applicationinsights/agent/internal/instrumentation/sdk/TelemetryClientClassFileTransformer.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -86,8 +86,6 @@ public class TelemetryClientClassFileTransformer implements ClassFileTransformer
8686
}
8787
// FIXME why isn't this being called for internal TelemetryClient (which is good, but why)?
8888

89-
BytecodeUtil.setDelegate(new BytecodeUtilImpl());
90-
9189
StatusFile.putValueAndWrite("SDKPresent", true);
9290
try {
9391
ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS);

agent/instrumentation/build.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ dependencies {
3636
compile group: 'io.opentelemetry.auto.instrumentation', name: 'instrumentation-log4j-1.1', version: instrumentationVersion
3737
compile group: 'io.opentelemetry.auto.instrumentation', name: 'instrumentation-log4j-2.0', version: instrumentationVersion
3838
compile group: 'io.opentelemetry.auto.instrumentation', name: 'instrumentation-logback-1.0', version: instrumentationVersion
39+
compile group: 'io.opentelemetry.auto.instrumentation', name: 'instrumentation-micrometer-1.0', version: instrumentationVersion
3940
compile group: 'io.opentelemetry.auto.instrumentation', name: 'instrumentation-mongo-3.1', version: instrumentationVersion
4041
compile group: 'io.opentelemetry.auto.instrumentation', name: 'instrumentation-mongo-3.7', version: instrumentationVersion
4142
compile group: 'io.opentelemetry.auto.instrumentation', name: 'instrumentation-mongo-async-3.3', version: instrumentationVersion

settings.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,7 @@ include ':test:smoke:testApps:Netty'
8080
include ':test:smoke:testApps:JMS'
8181
include ':test:smoke:testApps:Kafka'
8282
include ':test:smoke:testApps:SpringCloudStream'
83+
include ':test:smoke:testApps:Micrometer'
8384
include ':test:smoke:testApps:VerifyShading'
8485
include ':test:smoke:testApps:VerifyJava7'
8586

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
{
2+
"instrumentationSettings": {
3+
"connectionString": "InstrumentationKey=00000000-0000-0000-0000-0FEEDDADBEEF;IngestionEndpoint=http://fakeingestion:60606/",
4+
"preview": {
5+
"instrumentation": {
6+
"micrometer": {
7+
"reportingIntervalMillis": 5000
8+
}
9+
}
10+
}
11+
}
12+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
plugins {
2+
id 'java'
3+
id 'org.springframework.boot' version '2.1.7.RELEASE'
4+
}
5+
6+
sourceCompatibility = 1.8
7+
targetCompatibility = 1.8
8+
compileSmokeTestJava.sourceCompatibility = 1.8
9+
compileSmokeTestJava.targetCompatibility = 1.8
10+
11+
ext.testAppArtifactDir = jar.destinationDirectory
12+
ext.testAppArtifactFilename = jar.archiveFileName.get()
13+
14+
dependencies {
15+
compileOnly aiAgentJar // this is just to force building the agent first
16+
17+
compile group: 'org.springframework.boot', name: 'spring-boot-starter-web', version: '2.1.7.RELEASE'
18+
compile group: 'io.micrometer', name: 'micrometer-core', version: '1.4.1'
19+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package com.microsoft.ajl.simple;
2+
3+
import org.springframework.boot.SpringApplication;
4+
import org.springframework.boot.autoconfigure.SpringBootApplication;
5+
6+
@SpringBootApplication
7+
public class SpringBootApp {
8+
9+
public static void main(String[] args) {
10+
11+
SpringApplication.run(SpringBootApp.class, args);
12+
}
13+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package com.microsoft.ajl.simple;
2+
3+
import io.micrometer.core.instrument.Counter;
4+
import io.micrometer.core.instrument.Metrics;
5+
import org.springframework.web.bind.annotation.GetMapping;
6+
import org.springframework.web.bind.annotation.RestController;
7+
8+
@RestController
9+
public class TestController {
10+
11+
private final Counter counter = Metrics.counter("test_counter");
12+
13+
@GetMapping("/")
14+
public String root() {
15+
return "OK";
16+
}
17+
18+
@GetMapping("/test")
19+
public String test() {
20+
counter.increment();
21+
return "OK!";
22+
}
23+
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
management.metrics.export.azuremonitor.instrumentation-key=00000000-0000-0000-0000-000000000000

0 commit comments

Comments
 (0)