From 1a4dd16648299abc11720f8044281646828981a3 Mon Sep 17 00:00:00 2001 From: Marcin Grzejszczak Date: Thu, 9 May 2024 14:54:03 +0200 Subject: [PATCH 01/12] WIP --- build.gradle | 2 +- micrometer-core/build.gradle | 3 + micrometer-observation/build.gradle | 5 + .../micrometer/observation/Observations.java | 59 +++++++++ .../observation/aop/ObservedAspect.java | 6 + .../observation/aop/ObservedAspectTests.java | 3 +- .../src/test/resources/META-INF/aop.xml | 17 +++ micrometer-test-ctw/build.gradle | 19 +++ .../io/micrometer/test/ctw/MeasuredClass.java | 36 ++++++ .../test/ctw/MeasuredClassTest.java | 114 ++++++++++++++++++ .../src/test/resources/logback.xml | 31 +++++ settings.gradle | 2 +- 12 files changed, 294 insertions(+), 3 deletions(-) create mode 100644 micrometer-observation/src/main/java/io/micrometer/observation/Observations.java create mode 100644 micrometer-observation/src/test/resources/META-INF/aop.xml create mode 100644 micrometer-test-ctw/build.gradle create mode 100644 micrometer-test-ctw/src/main/java/io/micrometer/test/ctw/MeasuredClass.java create mode 100644 micrometer-test-ctw/src/test/java/io/micrometer/test/ctw/MeasuredClassTest.java create mode 100644 micrometer-test-ctw/src/test/resources/logback.xml diff --git a/build.gradle b/build.gradle index 7a19a5fc25..9cdb412203 100644 --- a/build.gradle +++ b/build.gradle @@ -337,7 +337,7 @@ subprojects { check.dependsOn("testModules") - if (!(project.name in [])) { // add projects here that do not exist in the previous minor so should be excluded from japicmp + if (!(project.name in ['micrometer-test-ctw'])) { // add projects here that do not exist in the previous minor so should be excluded from japicmp apply plugin: 'me.champeau.gradle.japicmp' apply plugin: 'de.undercouch.download' diff --git a/micrometer-core/build.gradle b/micrometer-core/build.gradle index 71472d0bb2..49a6580e52 100644 --- a/micrometer-core/build.gradle +++ b/micrometer-core/build.gradle @@ -1,6 +1,7 @@ plugins { alias(libs.plugins.kotlin19) id 'me.champeau.mrjar' version "0.1.1" + id 'io.freefair.aspectj.post-compile-weaving' version '8.6' } description 'Core module of Micrometer containing instrumentation API and implementation' @@ -81,6 +82,8 @@ dependencies { } // Aspects + implementation "org.aspectj:aspectjrt:${libs.versions.aspectjweaver.get()}" + java11Implementation "org.aspectj:aspectjrt:${libs.versions.aspectjweaver.get()}" optionalApi 'org.aspectj:aspectjweaver' // instrumentation options diff --git a/micrometer-observation/build.gradle b/micrometer-observation/build.gradle index 972a124084..62579977ae 100644 --- a/micrometer-observation/build.gradle +++ b/micrometer-observation/build.gradle @@ -1,3 +1,7 @@ +plugins { + id 'io.freefair.aspectj.post-compile-weaving' version '8.6' +} + description 'Module containing Observation related code' jar { @@ -21,6 +25,7 @@ dependencies { optionalApi 'javax.servlet:javax.servlet-api' // Aspects + implementation "org.aspectj:aspectjrt:${libs.versions.aspectjweaver.get()}" optionalApi 'org.aspectj:aspectjweaver' // log monitoring diff --git a/micrometer-observation/src/main/java/io/micrometer/observation/Observations.java b/micrometer-observation/src/main/java/io/micrometer/observation/Observations.java new file mode 100644 index 0000000000..010ec04cee --- /dev/null +++ b/micrometer-observation/src/main/java/io/micrometer/observation/Observations.java @@ -0,0 +1,59 @@ +/* + * Copyright 2024 VMware, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package io.micrometer.observation; + +/** + * Generator of observations bound to a static global registry. For use especially in + * places where dependency injection of {@link ObservationRegistry} is not possible for an + * instrumented type. + * + * @author Marcin Grzejszczak + * @since 1.14.0 + */ +public final class Observations { + + private static final ObservationRegistry initialRegistry = ObservationRegistry.create(); + + private static ObservationRegistry globalRegistry = initialRegistry; + + private Observations() { + throw new UnsupportedOperationException("You can't instantiate a utility class"); + } + + /** + * Sets a registry as the global registry. + * @param registry Registry to set. + */ + public static void setRegistry(ObservationRegistry registry) { + globalRegistry = registry; + } + + /** + * Resets registry to the original, empty one. + */ + public static void resetRegistry() { + globalRegistry = initialRegistry; + } + + /** + * Retrieves the current global instance. + * @return Global registry. + */ + public static ObservationRegistry getGlobalRegistry() { + return globalRegistry; + } + +} diff --git a/micrometer-observation/src/main/java/io/micrometer/observation/aop/ObservedAspect.java b/micrometer-observation/src/main/java/io/micrometer/observation/aop/ObservedAspect.java index 8976077d67..bb6f7d72a3 100644 --- a/micrometer-observation/src/main/java/io/micrometer/observation/aop/ObservedAspect.java +++ b/micrometer-observation/src/main/java/io/micrometer/observation/aop/ObservedAspect.java @@ -19,6 +19,7 @@ import io.micrometer.common.lang.Nullable; import io.micrometer.observation.Observation; import io.micrometer.observation.ObservationRegistry; +import io.micrometer.observation.Observations; import io.micrometer.observation.annotation.Observed; import io.micrometer.observation.ObservationConvention; import org.aspectj.lang.ProceedingJoinPoint; @@ -84,6 +85,11 @@ public class ObservedAspect { private final Predicate shouldSkip; + // For Compile Time Weaving + public ObservedAspect() { + this(Observations.getGlobalRegistry(), null, DONT_SKIP_ANYTHING); + } + public ObservedAspect(ObservationRegistry registry) { this(registry, null, DONT_SKIP_ANYTHING); } diff --git a/micrometer-observation/src/test/java/io/micrometer/observation/aop/ObservedAspectTests.java b/micrometer-observation/src/test/java/io/micrometer/observation/aop/ObservedAspectTests.java index 262280107b..eb1f1ecd61 100644 --- a/micrometer-observation/src/test/java/io/micrometer/observation/aop/ObservedAspectTests.java +++ b/micrometer-observation/src/test/java/io/micrometer/observation/aop/ObservedAspectTests.java @@ -364,7 +364,8 @@ void skipPredicateShouldTakeEffectForClass() { void ignoreClassLevelAnnotationIfMethodLevelPresent() { registry.observationConfig().observationHandler(new ObservationTextPublisher()); - AspectJProxyFactory pf = new AspectJProxyFactory(new ObservedClassLevelAnnotatedService()); + ObservedClassLevelAnnotatedService annotatedService = new ObservedClassLevelAnnotatedService(); + AspectJProxyFactory pf = new AspectJProxyFactory(annotatedService); pf.addAspect(new ObservedAspect(registry)); ObservedClassLevelAnnotatedService service = pf.getProxy(); diff --git a/micrometer-observation/src/test/resources/META-INF/aop.xml b/micrometer-observation/src/test/resources/META-INF/aop.xml new file mode 100644 index 0000000000..e6d2594ad3 --- /dev/null +++ b/micrometer-observation/src/test/resources/META-INF/aop.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + diff --git a/micrometer-test-ctw/build.gradle b/micrometer-test-ctw/build.gradle new file mode 100644 index 0000000000..21c30280bb --- /dev/null +++ b/micrometer-test-ctw/build.gradle @@ -0,0 +1,19 @@ +plugins { + id 'java' + id 'io.freefair.aspectj.post-compile-weaving' version '8.6' +} + +description 'AspectJ compile-time weaving test for Micrometer aspects' + +dependencies { + implementation project(':micrometer-core') + aspect project(':micrometer-core') + aspect project(':micrometer-observation') + + testImplementation 'org.junit.jupiter:junit-jupiter' + testImplementation 'org.assertj:assertj-core' +} + +test { + useJUnitPlatform() +} diff --git a/micrometer-test-ctw/src/main/java/io/micrometer/test/ctw/MeasuredClass.java b/micrometer-test-ctw/src/main/java/io/micrometer/test/ctw/MeasuredClass.java new file mode 100644 index 0000000000..83ae3b80c0 --- /dev/null +++ b/micrometer-test-ctw/src/main/java/io/micrometer/test/ctw/MeasuredClass.java @@ -0,0 +1,36 @@ +/* + * Copyright 2024 VMware, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package io.micrometer.test.ctw; + +import io.micrometer.core.annotation.Counted; +import io.micrometer.core.annotation.Timed; +import io.micrometer.observation.annotation.Observed; + +public class MeasuredClass { + + @Timed + public void timedMethod() { + } + + @Counted + public void countedMethod() { + } + + @Observed + public void observedMethod() { + } + +} diff --git a/micrometer-test-ctw/src/test/java/io/micrometer/test/ctw/MeasuredClassTest.java b/micrometer-test-ctw/src/test/java/io/micrometer/test/ctw/MeasuredClassTest.java new file mode 100644 index 0000000000..1da773670e --- /dev/null +++ b/micrometer-test-ctw/src/test/java/io/micrometer/test/ctw/MeasuredClassTest.java @@ -0,0 +1,114 @@ +/* + * Copyright 2024 VMware, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package io.micrometer.test.ctw; + +import io.micrometer.core.aop.TimedAspect; +import io.micrometer.core.instrument.Counter; +import io.micrometer.core.instrument.MeterRegistry; +import io.micrometer.core.instrument.Metrics; +import io.micrometer.core.instrument.Timer; +import io.micrometer.core.instrument.observation.DefaultMeterObservationHandler; +import io.micrometer.core.instrument.simple.SimpleMeterRegistry; +import io.micrometer.observation.ObservationRegistry; +import io.micrometer.observation.Observations; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import java.util.Collection; + +import static org.assertj.core.api.BDDAssertions.then; + +class MeasuredClassTest { + + MeterRegistry registry = new SimpleMeterRegistry(); + + ObservationRegistry observationRegistry = ObservationRegistry.create(); + + MeasuredClass measured = new MeasuredClass(); + + @BeforeEach + void setUp() { + observationRegistry.observationConfig().observationHandler(new DefaultMeterObservationHandler(registry)); + // Global registry must be used because aspect gets created for us + Metrics.addRegistry(registry); + Observations.setRegistry(observationRegistry); + } + + @AfterEach + void cleanUp() { + Metrics.removeRegistry(registry); + Observations.resetRegistry(); + } + + @Test + void shouldWrapMethodWithTimedAspectThroughCTW() { + // when + measured.timedMethod(); + // then + Collection timers = registry.find(TimedAspect.DEFAULT_METRIC_NAME) + .tag("class", MeasuredClass.class.getName()) + .tag("method", "timedMethod") + .timers(); + then(timers).hasSize(1); + Timer timer = timers.iterator().next(); + then(timer.count()).isEqualTo(1); + + // when + measured.timedMethod(); + // then + then(timer.count()).isEqualTo(2); + } + + @Test + void shouldWrapMethodWithCountedAspectThroughCTW() { + // when + measured.countedMethod(); + // then + Collection counters = registry.find("method.counted") + .tag("class", MeasuredClass.class.getName()) + .tag("method", "countedMethod") + .counters(); + then(counters).hasSize(1); + Counter counter = counters.iterator().next(); + then(counter.count()).isEqualTo(1); + + // when + measured.countedMethod(); + // then + then(counter.count()).isEqualTo(2); + } + + @Test + void shouldWrapMethodWithObservedAspectThroughCTW() { + // when + measured.observedMethod(); + // then + Collection timers = registry.find("method.observed") + .tag("class", MeasuredClass.class.getName()) + .tag("method", "observedMethod") + .timers(); + then(timers).hasSize(1); + Timer timer = timers.iterator().next(); + then(timer.count()).isEqualTo(1); + + // when + measured.observedMethod(); + // then + then(timer.count()).isEqualTo(2); + } + +} diff --git a/micrometer-test-ctw/src/test/resources/logback.xml b/micrometer-test-ctw/src/test/resources/logback.xml new file mode 100644 index 0000000000..9240fdf2fb --- /dev/null +++ b/micrometer-test-ctw/src/test/resources/logback.xml @@ -0,0 +1,31 @@ + + + + + + + %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + + + + diff --git a/settings.gradle b/settings.gradle index 1f4a3ecaa0..59dd7eac13 100644 --- a/settings.gradle +++ b/settings.gradle @@ -31,7 +31,7 @@ include 'micrometer-commons', 'micrometer-core', 'micrometer-observation' project(":micrometer-samples-$sample").projectDir = new File(rootProject.projectDir, "samples/micrometer-samples-$sample") } -include 'micrometer-test', 'micrometer-observation-test' +include 'micrometer-test', 'micrometer-observation-test', 'micrometer-test-ctw' ['atlas', 'prometheus', 'prometheus-simpleclient', 'datadog', 'elastic', 'ganglia', 'graphite', 'health', 'jmx', 'influx', 'otlp', 'statsd', 'new-relic', 'cloudwatch2', 'signalfx', 'wavefront', 'dynatrace', 'azure-monitor', 'humio', 'appoptics', 'kairos', 'stackdriver', 'opentsdb'].each { sys -> include "micrometer-registry-$sys" From 29b003f812e45d1d59866c41cf0d9582d50e2713 Mon Sep 17 00:00:00 2001 From: Marcin Grzejszczak Date: Fri, 10 May 2024 09:47:14 +0200 Subject: [PATCH 02/12] Fixed checkstyle issues --- .../src/test/resources/META-INF/aop.xml | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/micrometer-observation/src/test/resources/META-INF/aop.xml b/micrometer-observation/src/test/resources/META-INF/aop.xml index e6d2594ad3..d71df04ae8 100644 --- a/micrometer-observation/src/test/resources/META-INF/aop.xml +++ b/micrometer-observation/src/test/resources/META-INF/aop.xml @@ -1,4 +1,21 @@ - + + + + + + + + + + + + + + + diff --git a/micrometer-test-aspectj-ltw/src/test/java/io/micrometer/test/ltw/MeasuredClassTest.java b/micrometer-test-aspectj-ltw/src/test/java/io/micrometer/test/ltw/MeasuredClassTest.java new file mode 100644 index 0000000000..51f8ba2a45 --- /dev/null +++ b/micrometer-test-aspectj-ltw/src/test/java/io/micrometer/test/ltw/MeasuredClassTest.java @@ -0,0 +1,170 @@ +/* + * Copyright 2024 VMware, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package io.micrometer.test.ltw; + +import io.micrometer.core.aop.TimedAspect; +import io.micrometer.core.instrument.Counter; +import io.micrometer.core.instrument.MeterRegistry; +import io.micrometer.core.instrument.Metrics; +import io.micrometer.core.instrument.Timer; +import io.micrometer.core.instrument.observation.DefaultMeterObservationHandler; +import io.micrometer.core.instrument.simple.SimpleMeterRegistry; +import io.micrometer.observation.ObservationRegistry; +import io.micrometer.observation.Observations; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import java.util.Collection; + +import static org.assertj.core.api.BDDAssertions.then; + +class MeasuredClassTest { + + MeterRegistry registry = new SimpleMeterRegistry(); + + ObservationRegistry observationRegistry = ObservationRegistry.create(); + + MeasuredClass measured = new MeasuredClass(); + + @BeforeEach + void setUp() { + observationRegistry.observationConfig().observationHandler(new DefaultMeterObservationHandler(registry)); + // Global registry must be used because aspect gets created for us + Metrics.addRegistry(registry); + Observations.setRegistry(observationRegistry); + } + + @AfterEach + void cleanUp() { + Metrics.removeRegistry(registry); + Observations.resetRegistry(); + } + + @Test + void shouldWrapMethodWithTimedAspectThroughLTW() { + // when + measured.timedMethod(); + // then + Collection timers = registry.find(TimedAspect.DEFAULT_METRIC_NAME) + .tag("class", MeasuredClass.class.getName()) + .tag("method", "timedMethod") + .timers(); + then(timers).hasSize(1); + Timer timer = timers.iterator().next(); + then(timer.count()).isEqualTo(1); + + // when + measured.timedMethod(); + // then + then(timer.count()).isEqualTo(2); + } + + @Test + void shouldWrapMethodWithCountedAspectThroughLTW() { + // when + measured.countedMethod(); + // then + Collection counters = registry.find("method.counted") + .tag("class", MeasuredClass.class.getName()) + .tag("method", "countedMethod") + .counters(); + then(counters).hasSize(1); + Counter counter = counters.iterator().next(); + then(counter.count()).isEqualTo(1); + + // when + measured.countedMethod(); + // then + then(counter.count()).isEqualTo(2); + } + + @Test + void shouldWrapMethodWithObservedAspectThroughLTW() { + // when + measured.observedMethod(); + // then + Collection timers = registry.find("method.observed") + .tag("class", MeasuredClass.class.getName()) + .tag("method", "observedMethod") + .timers(); + then(timers).hasSize(1); + Timer timer = timers.iterator().next(); + then(timer.count()).isEqualTo(1); + + // when + measured.observedMethod(); + // then + then(timer.count()).isEqualTo(2); + } + + @Test + void shouldWrapMethodWithClassLevelTimedAspectThroughLTW() { + // when + measured.classLevelTimedMethod(); + // then + Collection timers = registry.find(TimedAspect.DEFAULT_METRIC_NAME) + .tag("class", MeasuredClass.class.getName()) + .tag("method", "classLevelTimedMethod") + .timers(); + then(timers).hasSize(1); + Timer timer = timers.iterator().next(); + then(timer.count()).isEqualTo(1); + + // when + measured.classLevelTimedMethod(); + // then + then(timer.count()).isEqualTo(2); + } + + @Test + void shouldWrapMethodWithClassLevelCountedAspectThroughLTW() { + // when + measured.classLevelCountedMethod(); + // then + Collection counters = registry.find("method.counted") + .tag("class", MeasuredClass.class.getName()) + .tag("method", "classLevelCountedMethod") + .counters(); + then(counters).hasSize(1); + Counter counter = counters.iterator().next(); + then(counter.count()).isEqualTo(1); + + // when + measured.classLevelCountedMethod(); + // then + then(counter.count()).isEqualTo(2); + } + + @Test + void shouldWrapMethodWithClassLevelObservedAspectThroughLTW() { + // when + measured.classLevelObservedMethod(); + // then + Collection timers = registry.find("method.observed") + .tag("class", MeasuredClass.class.getName()) + .tag("method", "classLevelObservedMethod") + .timers(); + then(timers).hasSize(1); + Timer timer = timers.iterator().next(); + then(timer.count()).isEqualTo(1); + + // when + measured.classLevelObservedMethod(); + // then + then(timer.count()).isEqualTo(2); + } +} diff --git a/micrometer-test-aspectj-ltw/src/test/resources/logback.xml b/micrometer-test-aspectj-ltw/src/test/resources/logback.xml new file mode 100644 index 0000000000..9240fdf2fb --- /dev/null +++ b/micrometer-test-aspectj-ltw/src/test/resources/logback.xml @@ -0,0 +1,31 @@ + + + + + + + %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + + + + diff --git a/settings.gradle b/settings.gradle index 59dd7eac13..03ba8db956 100644 --- a/settings.gradle +++ b/settings.gradle @@ -31,7 +31,7 @@ include 'micrometer-commons', 'micrometer-core', 'micrometer-observation' project(":micrometer-samples-$sample").projectDir = new File(rootProject.projectDir, "samples/micrometer-samples-$sample") } -include 'micrometer-test', 'micrometer-observation-test', 'micrometer-test-ctw' +include 'micrometer-test', 'micrometer-observation-test', 'micrometer-test-aspectj-ltw', 'micrometer-test-aspectj-ctw' ['atlas', 'prometheus', 'prometheus-simpleclient', 'datadog', 'elastic', 'ganglia', 'graphite', 'health', 'jmx', 'influx', 'otlp', 'statsd', 'new-relic', 'cloudwatch2', 'signalfx', 'wavefront', 'dynatrace', 'azure-monitor', 'humio', 'appoptics', 'kairos', 'stackdriver', 'opentsdb'].each { sys -> include "micrometer-registry-$sys" From 34b3bcf4bd7bc92d69d681d5ae8e2d6936b26e60 Mon Sep 17 00:00:00 2001 From: Marcin Grzejszczak Date: Mon, 13 May 2024 09:39:41 +0200 Subject: [PATCH 04/12] WIP --- build.gradle | 4 ++++ .../java/io/micrometer/observation/Observations.java | 9 +++++---- .../java/io/micrometer/test/ctw/MeasuredClassTest.java | 1 + .../java/io/micrometer/test/ltw/MeasuredClassTest.java | 1 + 4 files changed, 11 insertions(+), 4 deletions(-) diff --git a/build.gradle b/build.gradle index 3190b3af14..1d714b0e52 100644 --- a/build.gradle +++ b/build.gradle @@ -408,6 +408,10 @@ subprojects { description = 'Application monitoring instrumentation facade' repositories { + maven { + url 'https://repo.spring.io/snapshot/' + content { includeGroup 'io.springframework' } + } mavenCentral() } diff --git a/micrometer-observation/src/main/java/io/micrometer/observation/Observations.java b/micrometer-observation/src/main/java/io/micrometer/observation/Observations.java index 090cfea73c..2d12808334 100644 --- a/micrometer-observation/src/main/java/io/micrometer/observation/Observations.java +++ b/micrometer-observation/src/main/java/io/micrometer/observation/Observations.java @@ -32,8 +32,8 @@ public final class Observations { private static final ObservationRegistry initialRegistry = ObservationRegistry.create(); - private static final DelegatingObservationRegistry globalRegistry = - new DelegatingObservationRegistry(initialRegistry); + private static final DelegatingObservationRegistry globalRegistry = new DelegatingObservationRegistry( + initialRegistry); private Observations() { throw new UnsupportedOperationException("You can't instantiate a utility class"); @@ -41,7 +41,6 @@ private Observations() { /** * Sets a registry as the global registry. - * * @param registry Registry to set. */ public static void setRegistry(ObservationRegistry registry) { @@ -57,7 +56,6 @@ public static void resetRegistry() { /** * Retrieves the current global instance. - * * @return Global registry. */ public static ObservationRegistry getGlobalRegistry() { @@ -65,6 +63,7 @@ public static ObservationRegistry getGlobalRegistry() { } private static final class DelegatingObservationRegistry implements ObservationRegistry { + private final AtomicReference delegate = new AtomicReference<>(ObservationRegistry.NOOP); DelegatingObservationRegistry(ObservationRegistry delegate) { @@ -101,5 +100,7 @@ public ObservationConfig observationConfig() { public boolean isNoop() { return delegate.get().isNoop(); } + } + } diff --git a/micrometer-test-aspectj-ctw/src/test/java/io/micrometer/test/ctw/MeasuredClassTest.java b/micrometer-test-aspectj-ctw/src/test/java/io/micrometer/test/ctw/MeasuredClassTest.java index 4d069b0036..f5897d92b7 100644 --- a/micrometer-test-aspectj-ctw/src/test/java/io/micrometer/test/ctw/MeasuredClassTest.java +++ b/micrometer-test-aspectj-ctw/src/test/java/io/micrometer/test/ctw/MeasuredClassTest.java @@ -167,4 +167,5 @@ void shouldWrapMethodWithClassLevelObservedAspectThroughCTW() { // then then(timer.count()).isEqualTo(2); } + } diff --git a/micrometer-test-aspectj-ltw/src/test/java/io/micrometer/test/ltw/MeasuredClassTest.java b/micrometer-test-aspectj-ltw/src/test/java/io/micrometer/test/ltw/MeasuredClassTest.java index 51f8ba2a45..dfcdb703fe 100644 --- a/micrometer-test-aspectj-ltw/src/test/java/io/micrometer/test/ltw/MeasuredClassTest.java +++ b/micrometer-test-aspectj-ltw/src/test/java/io/micrometer/test/ltw/MeasuredClassTest.java @@ -167,4 +167,5 @@ void shouldWrapMethodWithClassLevelObservedAspectThroughLTW() { // then then(timer.count()).isEqualTo(2); } + } From 037305d908612b4cb4adbac53bc3f1d62212d36d Mon Sep 17 00:00:00 2001 From: Marcin Grzejszczak Date: Wed, 15 May 2024 13:29:11 +0200 Subject: [PATCH 05/12] Moved to spring snapshots, moved modules around --- build.gradle | 3 ++- .../micrometer-test-aspectj-ctw}/build.gradle | 0 .../io/micrometer/test/ctw/MeasuredClass.java | 0 .../io/micrometer/test/ctw/package-info.java | 21 +++++++++++++++++++ .../test/ctw/MeasuredClassTest.java | 0 .../src/test/resources/logback.xml | 0 .../micrometer-test-aspectj-ltw}/build.gradle | 0 .../io/micrometer/test/ltw/MeasuredClass.java | 0 .../io/micrometer/test/ltw/package-info.java | 21 +++++++++++++++++++ .../src/main/resources/META-INF/aop.xml | 0 .../test/ltw/MeasuredClassTest.java | 0 .../src/test/resources/logback.xml | 0 12 files changed, 44 insertions(+), 1 deletion(-) rename {micrometer-test-aspectj-ctw => tests/micrometer-test-aspectj-ctw}/build.gradle (100%) rename {micrometer-test-aspectj-ctw => tests/micrometer-test-aspectj-ctw}/src/main/java/io/micrometer/test/ctw/MeasuredClass.java (100%) create mode 100644 tests/micrometer-test-aspectj-ctw/src/main/java/io/micrometer/test/ctw/package-info.java rename {micrometer-test-aspectj-ctw => tests/micrometer-test-aspectj-ctw}/src/test/java/io/micrometer/test/ctw/MeasuredClassTest.java (100%) rename {micrometer-test-aspectj-ctw => tests/micrometer-test-aspectj-ctw}/src/test/resources/logback.xml (100%) rename {micrometer-test-aspectj-ltw => tests/micrometer-test-aspectj-ltw}/build.gradle (100%) rename {micrometer-test-aspectj-ltw => tests/micrometer-test-aspectj-ltw}/src/main/java/io/micrometer/test/ltw/MeasuredClass.java (100%) create mode 100644 tests/micrometer-test-aspectj-ltw/src/main/java/io/micrometer/test/ltw/package-info.java rename {micrometer-test-aspectj-ltw => tests/micrometer-test-aspectj-ltw}/src/main/resources/META-INF/aop.xml (100%) rename {micrometer-test-aspectj-ltw => tests/micrometer-test-aspectj-ltw}/src/test/java/io/micrometer/test/ltw/MeasuredClassTest.java (100%) rename {micrometer-test-aspectj-ltw => tests/micrometer-test-aspectj-ltw}/src/test/resources/logback.xml (100%) diff --git a/build.gradle b/build.gradle index 1d714b0e52..947d3fde81 100644 --- a/build.gradle +++ b/build.gradle @@ -408,9 +408,10 @@ subprojects { description = 'Application monitoring instrumentation facade' repositories { + // mavenLocal() maven { url 'https://repo.spring.io/snapshot/' - content { includeGroup 'io.springframework' } + content { includeGroup 'org.springframework' } } mavenCentral() } diff --git a/micrometer-test-aspectj-ctw/build.gradle b/tests/micrometer-test-aspectj-ctw/build.gradle similarity index 100% rename from micrometer-test-aspectj-ctw/build.gradle rename to tests/micrometer-test-aspectj-ctw/build.gradle diff --git a/micrometer-test-aspectj-ctw/src/main/java/io/micrometer/test/ctw/MeasuredClass.java b/tests/micrometer-test-aspectj-ctw/src/main/java/io/micrometer/test/ctw/MeasuredClass.java similarity index 100% rename from micrometer-test-aspectj-ctw/src/main/java/io/micrometer/test/ctw/MeasuredClass.java rename to tests/micrometer-test-aspectj-ctw/src/main/java/io/micrometer/test/ctw/MeasuredClass.java diff --git a/tests/micrometer-test-aspectj-ctw/src/main/java/io/micrometer/test/ctw/package-info.java b/tests/micrometer-test-aspectj-ctw/src/main/java/io/micrometer/test/ctw/package-info.java new file mode 100644 index 0000000000..4aa89e5f1d --- /dev/null +++ b/tests/micrometer-test-aspectj-ctw/src/main/java/io/micrometer/test/ctw/package-info.java @@ -0,0 +1,21 @@ +/* + * Copyright 2024 VMware, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +@NonNullApi +@NonNullFields +package io.micrometer.test.ctw; + +import io.micrometer.common.lang.NonNullApi; +import io.micrometer.common.lang.NonNullFields; diff --git a/micrometer-test-aspectj-ctw/src/test/java/io/micrometer/test/ctw/MeasuredClassTest.java b/tests/micrometer-test-aspectj-ctw/src/test/java/io/micrometer/test/ctw/MeasuredClassTest.java similarity index 100% rename from micrometer-test-aspectj-ctw/src/test/java/io/micrometer/test/ctw/MeasuredClassTest.java rename to tests/micrometer-test-aspectj-ctw/src/test/java/io/micrometer/test/ctw/MeasuredClassTest.java diff --git a/micrometer-test-aspectj-ctw/src/test/resources/logback.xml b/tests/micrometer-test-aspectj-ctw/src/test/resources/logback.xml similarity index 100% rename from micrometer-test-aspectj-ctw/src/test/resources/logback.xml rename to tests/micrometer-test-aspectj-ctw/src/test/resources/logback.xml diff --git a/micrometer-test-aspectj-ltw/build.gradle b/tests/micrometer-test-aspectj-ltw/build.gradle similarity index 100% rename from micrometer-test-aspectj-ltw/build.gradle rename to tests/micrometer-test-aspectj-ltw/build.gradle diff --git a/micrometer-test-aspectj-ltw/src/main/java/io/micrometer/test/ltw/MeasuredClass.java b/tests/micrometer-test-aspectj-ltw/src/main/java/io/micrometer/test/ltw/MeasuredClass.java similarity index 100% rename from micrometer-test-aspectj-ltw/src/main/java/io/micrometer/test/ltw/MeasuredClass.java rename to tests/micrometer-test-aspectj-ltw/src/main/java/io/micrometer/test/ltw/MeasuredClass.java diff --git a/tests/micrometer-test-aspectj-ltw/src/main/java/io/micrometer/test/ltw/package-info.java b/tests/micrometer-test-aspectj-ltw/src/main/java/io/micrometer/test/ltw/package-info.java new file mode 100644 index 0000000000..9be98388a7 --- /dev/null +++ b/tests/micrometer-test-aspectj-ltw/src/main/java/io/micrometer/test/ltw/package-info.java @@ -0,0 +1,21 @@ +/* + * Copyright 2024 VMware, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +@NonNullApi +@NonNullFields +package io.micrometer.test.ltw; + +import io.micrometer.common.lang.NonNullApi; +import io.micrometer.common.lang.NonNullFields; diff --git a/micrometer-test-aspectj-ltw/src/main/resources/META-INF/aop.xml b/tests/micrometer-test-aspectj-ltw/src/main/resources/META-INF/aop.xml similarity index 100% rename from micrometer-test-aspectj-ltw/src/main/resources/META-INF/aop.xml rename to tests/micrometer-test-aspectj-ltw/src/main/resources/META-INF/aop.xml diff --git a/micrometer-test-aspectj-ltw/src/test/java/io/micrometer/test/ltw/MeasuredClassTest.java b/tests/micrometer-test-aspectj-ltw/src/test/java/io/micrometer/test/ltw/MeasuredClassTest.java similarity index 100% rename from micrometer-test-aspectj-ltw/src/test/java/io/micrometer/test/ltw/MeasuredClassTest.java rename to tests/micrometer-test-aspectj-ltw/src/test/java/io/micrometer/test/ltw/MeasuredClassTest.java diff --git a/micrometer-test-aspectj-ltw/src/test/resources/logback.xml b/tests/micrometer-test-aspectj-ltw/src/test/resources/logback.xml similarity index 100% rename from micrometer-test-aspectj-ltw/src/test/resources/logback.xml rename to tests/micrometer-test-aspectj-ltw/src/test/resources/logback.xml From 14a08ed059642c522db3d766172b84ff9f028115 Mon Sep 17 00:00:00 2001 From: Marcin Grzejszczak Date: Wed, 15 May 2024 13:43:03 +0200 Subject: [PATCH 06/12] Downgrades aspectjweaver to the last requiring jdk11 to build --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index b89b185348..eb91f2afad 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -3,7 +3,7 @@ activemq-artemis = "2.34.0" application-insights = "2.6.4" archunit = "1.3.0" asmForPlugins = "7.3.1" -aspectjweaver = "1.9.22.1" +aspectjweaver = "1.9.20.1" assertj = "3.26.0" awaitility = "4.2.1" caffeine = "2.9.3" From 9e782617b13d3d9d340885f0edee0a5e060ff854 Mon Sep 17 00:00:00 2001 From: Marcin Grzejszczak Date: Mon, 20 May 2024 11:34:50 +0200 Subject: [PATCH 07/12] Removed snapshot references --- build.gradle | 5 ----- 1 file changed, 5 deletions(-) diff --git a/build.gradle b/build.gradle index 947d3fde81..3190b3af14 100644 --- a/build.gradle +++ b/build.gradle @@ -408,11 +408,6 @@ subprojects { description = 'Application monitoring instrumentation facade' repositories { - // mavenLocal() - maven { - url 'https://repo.spring.io/snapshot/' - content { includeGroup 'org.springframework' } - } mavenCentral() } From 440f998a68b9d328dbf157aee1e616a207982892 Mon Sep 17 00:00:00 2001 From: Marcin Grzejszczak Date: Mon, 20 May 2024 11:41:58 +0200 Subject: [PATCH 08/12] Update micrometer-observation/build.gradle Co-authored-by: Robert Mihaly --- micrometer-observation/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/micrometer-observation/build.gradle b/micrometer-observation/build.gradle index 62579977ae..d5440c4aff 100644 --- a/micrometer-observation/build.gradle +++ b/micrometer-observation/build.gradle @@ -1,5 +1,5 @@ plugins { - id 'io.freefair.aspectj.post-compile-weaving' version '8.6' + alias(libs.plugins.aspectj) } description 'Module containing Observation related code' From 42c986870200e852d9a916759becaeb99df4f3f2 Mon Sep 17 00:00:00 2001 From: Marcin Grzejszczak Date: Mon, 20 May 2024 11:42:24 +0200 Subject: [PATCH 09/12] Apply suggestions from code review Co-authored-by: Robert Mihaly --- micrometer-observation/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/micrometer-observation/build.gradle b/micrometer-observation/build.gradle index d5440c4aff..5137de900b 100644 --- a/micrometer-observation/build.gradle +++ b/micrometer-observation/build.gradle @@ -25,7 +25,7 @@ dependencies { optionalApi 'javax.servlet:javax.servlet-api' // Aspects - implementation "org.aspectj:aspectjrt:${libs.versions.aspectjweaver.get()}" + implementation libs.aspectjrt optionalApi 'org.aspectj:aspectjweaver' // log monitoring From 1d0c2c91670ad7898dac940ea39806c6b6124d73 Mon Sep 17 00:00:00 2001 From: Marcin Grzejszczak Date: Mon, 20 May 2024 11:43:22 +0200 Subject: [PATCH 10/12] Removed aop.xml from micrometer obs test resources --- .../src/test/resources/META-INF/aop.xml | 34 ------------------- 1 file changed, 34 deletions(-) delete mode 100644 micrometer-observation/src/test/resources/META-INF/aop.xml diff --git a/micrometer-observation/src/test/resources/META-INF/aop.xml b/micrometer-observation/src/test/resources/META-INF/aop.xml deleted file mode 100644 index d71df04ae8..0000000000 --- a/micrometer-observation/src/test/resources/META-INF/aop.xml +++ /dev/null @@ -1,34 +0,0 @@ - - - - - - - - - - - - From 706ef1a00516236b8a12ad8c00f5646bde582b38 Mon Sep 17 00:00:00 2001 From: Marcin Grzejszczak Date: Tue, 21 May 2024 14:05:57 +0200 Subject: [PATCH 11/12] Made aspectj deps optional --- micrometer-core/build.gradle | 7 ++++--- micrometer-observation/build.gradle | 4 ++-- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/micrometer-core/build.gradle b/micrometer-core/build.gradle index b4ccfec351..4e18fb1e95 100644 --- a/micrometer-core/build.gradle +++ b/micrometer-core/build.gradle @@ -82,9 +82,8 @@ dependencies { } // Aspects - implementation libs.aspectjrt - java11Implementation libs.aspectjrt - optionalApi 'org.aspectj:aspectjweaver' + optionalApi libs.aspectjrt + java11RuntimeOnly libs.aspectjrt // instrumentation options optionalApi 'io.dropwizard.metrics:metrics-core' // TODO move dropwizard out of core module? DropwizardMeterRegistry for e.g. JMX registry @@ -212,6 +211,8 @@ dependencies { testImplementation 'io.grpc:grpc-inprocess' testImplementation 'io.grpc:grpc-testing-proto' testImplementation 'com.squareup.retrofit2:retrofit' + + testImplementation 'org.aspectj:aspectjweaver' } task shenandoahTest(type: Test) { diff --git a/micrometer-observation/build.gradle b/micrometer-observation/build.gradle index 5137de900b..cf3017ca23 100644 --- a/micrometer-observation/build.gradle +++ b/micrometer-observation/build.gradle @@ -25,8 +25,7 @@ dependencies { optionalApi 'javax.servlet:javax.servlet-api' // Aspects - implementation libs.aspectjrt - optionalApi 'org.aspectj:aspectjweaver' + optionalApi libs.aspectjrt // log monitoring testImplementation 'ch.qos.logback:logback-classic' @@ -47,4 +46,5 @@ dependencies { testImplementation 'org.assertj:assertj-core' testImplementation 'org.awaitility:awaitility' + testImplementation 'org.aspectj:aspectjweaver' } From a1c9d3fc996a25757c0f1a6b65d3286719069528 Mon Sep 17 00:00:00 2001 From: Marcin Grzejszczak Date: Mon, 10 Jun 2024 17:48:51 +0200 Subject: [PATCH 12/12] Not deploying aspectj tests --- build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index 3190b3af14..e70271d10a 100644 --- a/build.gradle +++ b/build.gradle @@ -126,7 +126,7 @@ subprojects { javadoc { - if (project.name.contains('samples')) { + if (project.name.contains('samples') || project.name.contains("-test-aspectj")) { enabled = false } else { configure(options) { @@ -289,7 +289,7 @@ subprojects { } // Do not publish some modules - if (!['samples', 'benchmarks', 'micrometer-osgi-test', 'concurrency-tests'].find { project.name.contains(it) }) { + if (!['samples', 'benchmarks', 'micrometer-osgi-test', 'concurrency-tests', 'micrometer-test-aspectj-ctw', 'micrometer-test-aspectj-ltw'].find { project.name.contains(it) }) { apply plugin: 'com.netflix.nebula.maven-publish' apply plugin: 'com.netflix.nebula.maven-manifest' apply plugin: 'com.netflix.nebula.maven-developer'