Skip to content

Commit 49717f6

Browse files
committed
Merge remote-tracking branch 'upstream' into log-service-name
2 parents fe848b3 + 1fd41bc commit 49717f6

File tree

250 files changed

+1534
-1654
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

250 files changed

+1534
-1654
lines changed

CHANGELOG.asciidoc

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ endif::[]
1919
////
2020
2121
=== Unreleased
22-
* Introduce *apm-agent-tracer* module that contains a minimal, zero-dependency `Tracer` API. - {pull}3043[#3043]
2322
2423
[[release-notes-1.37.0]]
2524
==== 1.37.0 - YYYY/MM/DD

apm-agent-core/src/main/java/co/elastic/apm/agent/bci/ElasticApmAgent.java

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,8 @@
3636
import co.elastic.apm.agent.configuration.CoreConfiguration;
3737
import co.elastic.apm.agent.impl.ElasticApmTracer;
3838
import co.elastic.apm.agent.impl.ElasticApmTracerBuilder;
39-
import co.elastic.apm.agent.impl.GlobalTracer;
39+
import co.elastic.apm.agent.impl.Tracer;
40+
import co.elastic.apm.agent.tracer.GlobalTracer;
4041
import co.elastic.apm.agent.logging.ApmServerLogAppender;
4142
import co.elastic.apm.agent.matcher.MethodMatcher;
4243
import co.elastic.apm.agent.sdk.ElasticApmInstrumentation;
@@ -179,7 +180,7 @@ private static void initInstrumentation(ElasticApmTracer tracer, Instrumentation
179180
}
180181

181182
@Nonnull
182-
private static Iterable<ElasticApmInstrumentation> loadInstrumentations(ElasticApmTracer tracer) {
183+
private static Iterable<ElasticApmInstrumentation> loadInstrumentations(Tracer tracer) {
183184
List<ClassLoader> pluginClassLoaders = new ArrayList<>();
184185
pluginClassLoaders.add(PrivilegedActionUtils.getClassLoader(ElasticApmAgent.class));
185186
pluginClassLoaders.addAll(createExternalPluginClassLoaders(tracer.getConfig(CoreConfiguration.class).getPluginsDir()));
@@ -308,7 +309,7 @@ public void onChange(ConfigurationOption configurationOption, Object oldValue, O
308309
}
309310

310311
public static synchronized Future<?> reInitInstrumentation() {
311-
final ElasticApmTracer tracer = GlobalTracer.requireTracerImpl();
312+
final Tracer tracer = TracerAwareInstrumentation.tracer.require(Tracer.class);
312313
if (instrumentation == null) {
313314
throw new IllegalStateException("Can't re-init agent before it has been initialized");
314315
}
@@ -340,7 +341,7 @@ public static boolean openModule(Class<?> classFromTargetModule, ClassLoader ope
340341
static synchronized void doReInitInstrumentation(Iterable<ElasticApmInstrumentation> instrumentations) {
341342
Logger logger = getLogger();
342343
logger.info("Re initializing instrumentation");
343-
AgentBuilder agentBuilder = initAgentBuilder(GlobalTracer.requireTracerImpl(), instrumentation, instrumentations, logger, AgentBuilder.DescriptionStrategy.Default.POOL_ONLY, false);
344+
AgentBuilder agentBuilder = initAgentBuilder(GlobalTracer.get().require(ElasticApmTracer.class), instrumentation, instrumentations, logger, AgentBuilder.DescriptionStrategy.Default.POOL_ONLY, false);
344345

345346
resettableClassFileTransformer = agentBuilder.patchOn(instrumentation, resettableClassFileTransformer);
346347
}
@@ -457,7 +458,7 @@ public DynamicType.Builder<?> transform(DynamicType.Builder<?> builder, TypeDesc
457458
private static Logger getLogger() {
458459
if (logger == null) {
459460
// lazily init logger to allow the tracer builder to init the logging config first
460-
GlobalTracer.requireTracerImpl();
461+
GlobalTracer.get().require(ElasticApmTracer.class);
461462
logger = LoggerFactory.getLogger(ElasticApmAgent.class);
462463
}
463464
// re-using an existing logger avoids running into a JVM bug that leads to a segfault
@@ -646,7 +647,7 @@ public static synchronized void reset() {
646647
if (instrumentation == null) {
647648
return;
648649
}
649-
GlobalTracer.get().stop();
650+
GlobalTracer.get().require(Tracer.class).stop();
650651
GlobalTracer.setNoop();
651652
Exception exception = null;
652653
if (resettableClassFileTransformer != null) {
@@ -788,7 +789,7 @@ public static void ensureInstrumented(final Class<?> classToInstrument,
788789

789790
if (!appliedInstrumentations.contains(instrumentationClasses)) {
790791
synchronized (ElasticApmAgent.class) {
791-
final ElasticApmTracer tracer = GlobalTracer.requireTracerImpl();
792+
final ElasticApmTracer tracer = GlobalTracer.get().require(ElasticApmTracer.class);
792793
if (instrumentation == null) {
793794
throw new IllegalStateException("Agent is not initialized");
794795
}
@@ -896,7 +897,11 @@ private static ElasticApmInstrumentation tryInstantiate(Class<? extends ElasticA
896897
Constructor<? extends ElasticApmInstrumentation> constructor = null;
897898
try {
898899
if (withTracer) {
899-
constructor = instrumentation.getConstructor(ElasticApmTracer.class);
900+
try {
901+
constructor = instrumentation.getConstructor(ElasticApmTracer.class);
902+
} catch (NoSuchMethodException ignored) {
903+
constructor = instrumentation.getConstructor(co.elastic.apm.agent.tracer.Tracer.class);
904+
}
900905
} else {
901906
constructor = instrumentation.getConstructor();
902907
}
@@ -908,7 +913,7 @@ private static ElasticApmInstrumentation tryInstantiate(Class<? extends ElasticA
908913
if (constructor != null) {
909914
try {
910915
if (withTracer) {
911-
instance = constructor.newInstance(GlobalTracer.requireTracerImpl());
916+
instance = constructor.newInstance(GlobalTracer.get().require(ElasticApmTracer.class));
912917
} else {
913918
instance = constructor.newInstance();
914919
}

apm-agent-core/src/main/java/co/elastic/apm/agent/bci/TracerAwareInstrumentation.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,12 @@
1818
*/
1919
package co.elastic.apm.agent.bci;
2020

21-
import co.elastic.apm.agent.impl.ElasticApmTracer;
22-
import co.elastic.apm.agent.impl.GlobalTracer;
23-
import co.elastic.apm.agent.impl.Tracer;
21+
import co.elastic.apm.agent.tracer.GlobalTracer;
2422
import co.elastic.apm.agent.sdk.ElasticApmInstrumentation;
23+
import co.elastic.apm.agent.tracer.Tracer;
2524

2625
/**
27-
* The constructor can optionally have a {@link ElasticApmTracer} parameter.
26+
* The constructor can optionally have a {@link Tracer} parameter.
2827
*/
2928
public abstract class TracerAwareInstrumentation extends ElasticApmInstrumentation {
3029

apm-agent-core/src/main/java/co/elastic/apm/agent/collections/SpanConcurrentHashMap.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
*/
1919
package co.elastic.apm.agent.collections;
2020

21-
import co.elastic.apm.agent.impl.transaction.AbstractSpan;
21+
import co.elastic.apm.agent.tracer.AbstractSpan;
2222

2323
import javax.annotation.Nullable;
2424
import java.util.Iterator;

apm-agent-core/src/main/java/co/elastic/apm/agent/collections/WeakConcurrentProviderImpl.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,11 @@
1818
*/
1919
package co.elastic.apm.agent.collections;
2020

21-
import co.elastic.apm.agent.impl.transaction.AbstractSpan;
2221
import co.elastic.apm.agent.sdk.weakconcurrent.DetachedThreadLocal;
2322
import co.elastic.apm.agent.sdk.weakconcurrent.WeakConcurrent;
2423
import co.elastic.apm.agent.sdk.weakconcurrent.WeakMap;
2524
import co.elastic.apm.agent.sdk.weakconcurrent.WeakSet;
25+
import co.elastic.apm.agent.tracer.AbstractSpan;
2626
import com.blogspot.mydailyjava.weaklockfree.AbstractWeakConcurrentMap;
2727
import com.blogspot.mydailyjava.weaklockfree.WeakConcurrentSet;
2828

apm-agent-core/src/main/java/co/elastic/apm/agent/impl/ElasticApmTracer.java

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,17 +46,21 @@
4646
import co.elastic.apm.agent.sdk.logging.LoggerFactory;
4747
import co.elastic.apm.agent.sdk.weakconcurrent.WeakConcurrent;
4848
import co.elastic.apm.agent.sdk.weakconcurrent.WeakMap;
49+
import co.elastic.apm.agent.tracer.GlobalTracer;
4950
import co.elastic.apm.agent.util.DependencyInjectingServiceLoader;
5051
import co.elastic.apm.agent.util.ExecutorUtils;
5152
import co.elastic.apm.agent.tracer.Scope;
5253
import co.elastic.apm.agent.tracer.dispatch.BinaryHeaderGetter;
5354
import co.elastic.apm.agent.tracer.dispatch.TextHeaderGetter;
55+
import co.elastic.apm.agent.util.PrivilegedActionUtils;
56+
import co.elastic.apm.agent.util.VersionUtils;
5457
import org.stagemonitor.configuration.ConfigurationOption;
5558
import org.stagemonitor.configuration.ConfigurationOptionProvider;
5659
import org.stagemonitor.configuration.ConfigurationRegistry;
5760

5861
import javax.annotation.Nullable;
5962
import java.io.Closeable;
63+
import java.io.File;
6064
import java.util.ArrayList;
6165
import java.util.List;
6266
import java.util.Map;
@@ -77,6 +81,8 @@ public class ElasticApmTracer implements Tracer {
7781

7882
private static final WeakMap<ClassLoader, ServiceInfo> serviceInfoByClassLoader = WeakConcurrent.buildMap();
7983

84+
private static volatile boolean classloaderCheckOk = false;
85+
8086
private final ConfigurationRegistry configurationRegistry;
8187
private final StacktraceConfiguration stacktraceConfiguration;
8288
private final ApmServerClient apmServerClient;
@@ -117,6 +123,49 @@ protected ActiveStack initialValue() {
117123
private final String ephemeralId;
118124
private final MetaDataFuture metaDataFuture;
119125

126+
static {
127+
checkClassloader();
128+
}
129+
130+
private static void checkClassloader() {
131+
ClassLoader cl = PrivilegedActionUtils.getClassLoader(GlobalTracer.class);
132+
133+
// agent currently loaded in the bootstrap CL, which is the current correct location
134+
if (cl == null) {
135+
return;
136+
}
137+
138+
if (classloaderCheckOk) {
139+
return;
140+
}
141+
142+
String agentLocation = PrivilegedActionUtils.getProtectionDomain(GlobalTracer.class).getCodeSource().getLocation().getFile();
143+
if (!agentLocation.endsWith(".jar")) {
144+
// agent is not packaged, thus we assume running tests
145+
classloaderCheckOk = true;
146+
return;
147+
}
148+
149+
String premainClass = VersionUtils.getManifestEntry(new File(agentLocation), "Premain-Class");
150+
if (null == premainClass) {
151+
// packaged within a .jar, but not within an agent jar, thus we assume it's still for testing
152+
classloaderCheckOk = true;
153+
return;
154+
}
155+
156+
if (premainClass.startsWith("co.elastic.apm.agent")) {
157+
// premain class will only be present when packaged as an agent jar
158+
classloaderCheckOk = true;
159+
return;
160+
}
161+
162+
// A packaged agent class has been loaded outside of bootstrap classloader, we are not in the context of
163+
// unit/integration tests, that's likely a setup issue where the agent jar has been added to application
164+
// classpath.
165+
throw new IllegalStateException(String.format("Agent setup error: agent jar file \"%s\" likely referenced in JVM or application classpath", agentLocation));
166+
167+
}
168+
120169
ElasticApmTracer(ConfigurationRegistry configurationRegistry, MetricRegistry metricRegistry, Reporter reporter, ObjectPoolFactory poolFactory,
121170
ApmServerClient apmServerClient, final String ephemeralId, MetaDataFuture metaDataFuture) {
122171
this.metricRegistry = metricRegistry;

0 commit comments

Comments
 (0)