Skip to content
Merged
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 apm-agent-benchmarks/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@
</dependency>
<!--
we can't add elastic-apm-agent as it causes shading problems:
java.util.ServiceConfigurationError: org.stagemonitor.configuration.ConfigurationOptionProvider: co.elastic.apm.agent.impl.context.web.WebConfiguration not a subtype
java.util.ServiceConfigurationError: org.stagemonitor.configuration.ConfigurationOptionProvider: co.elastic.apm.agent.tracer.configuration.WebConfiguration not a subtype
-->
<dependency>
<groupId>${project.groupId}</groupId>
Expand Down
1 change: 0 additions & 1 deletion apm-agent-core/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,6 @@
<dependency>
<groupId>org.stagemonitor</groupId>
<artifactId>stagemonitor-configuration</artifactId>
<version>0.87.3</version>
</dependency>
<dependency>
<groupId>org.ow2.asm</groupId>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
*/
package co.elastic.apm.agent.bci.bytebuddy;

import co.elastic.apm.agent.configuration.converter.ByteValue;
import co.elastic.apm.agent.tracer.configuration.ByteValue;
import co.elastic.apm.agent.sdk.weakconcurrent.WeakConcurrent;
import co.elastic.apm.agent.sdk.weakconcurrent.WeakMap;
import co.elastic.apm.agent.util.ExecutorUtils;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,16 +19,16 @@
package co.elastic.apm.agent.configuration;

import co.elastic.apm.agent.bci.ElasticApmAgent;
import co.elastic.apm.agent.configuration.converter.ListValueConverter;
import co.elastic.apm.agent.configuration.converter.RoundedDoubleConverter;
import co.elastic.apm.agent.configuration.converter.TimeDuration;
import co.elastic.apm.agent.configuration.converter.TimeDurationValueConverter;
import co.elastic.apm.agent.tracer.configuration.ListValueConverter;
import co.elastic.apm.agent.tracer.configuration.RoundedDoubleConverter;
import co.elastic.apm.agent.tracer.configuration.TimeDuration;
import co.elastic.apm.agent.tracer.configuration.TimeDurationValueConverter;
import co.elastic.apm.agent.configuration.validation.RegexValidator;
import co.elastic.apm.agent.impl.transaction.Span;
import co.elastic.apm.agent.matcher.MethodMatcher;
import co.elastic.apm.agent.matcher.MethodMatcherValueConverter;
import co.elastic.apm.agent.common.util.WildcardMatcher;
import co.elastic.apm.agent.matcher.WildcardMatcherValueConverter;
import co.elastic.apm.agent.tracer.configuration.WildcardMatcherValueConverter;
import co.elastic.apm.agent.sdk.logging.Logger;
import co.elastic.apm.agent.sdk.logging.LoggerFactory;
import org.stagemonitor.configuration.ConfigurationOption;
Expand Down Expand Up @@ -59,7 +59,7 @@
import static co.elastic.apm.agent.configuration.validation.RangeValidator.isInRange;
import static co.elastic.apm.agent.logging.LoggingConfiguration.AGENT_HOME_PLACEHOLDER;

public class CoreConfiguration extends ConfigurationOptionProvider {
public class CoreConfiguration extends ConfigurationOptionProvider implements co.elastic.apm.agent.tracer.configuration.CoreConfiguration {

public static final int DEFAULT_LONG_FIELD_MAX_LENGTH = 10000;
private final Logger logger = LoggerFactory.getLogger(getClass());
Expand Down Expand Up @@ -847,6 +847,7 @@ public List<ConfigurationOption<?>> getInstrumentationOptions() {
return Arrays.asList(instrument, traceMethods, enabledInstrumentations, disabledInstrumentations, enableExperimentalInstrumentations);
}

@Override
public String getServiceName() {
return serviceName.get();
}
Expand Down Expand Up @@ -895,10 +896,12 @@ public int getLongFieldMaxLength() {
return longFieldMaxLength.get();
}

@Override
public List<WildcardMatcher> getSanitizeFieldNames() {
return sanitizeFieldNames.get();
}

@Override
public boolean isInstrumentationEnabled(String instrumentationGroupName) {
final Collection<String> enabledInstrumentationGroupNames = enabledInstrumentations.get();
final Collection<String> disabledInstrumentationGroupNames = disabledInstrumentations.get();
Expand All @@ -907,6 +910,7 @@ public boolean isInstrumentationEnabled(String instrumentationGroupName) {
(enableExperimentalInstrumentations.get() || !instrumentationGroupName.equals("experimental"));
}

@Override
public boolean isInstrumentationEnabled(Collection<String> instrumentationGroupNames) {
return isGroupEnabled(instrumentationGroupNames) &&
!isGroupDisabled(instrumentationGroupNames);
Expand Down Expand Up @@ -943,10 +947,12 @@ public List<WildcardMatcher> getIgnoreExceptions() {
return ignoreExceptions.get();
}

@Override
public EventType getCaptureBody() {
return captureBody.get();
}

@Override
public boolean isCaptureHeaders() {
return captureHeaders.get();
}
Expand Down Expand Up @@ -1020,6 +1026,7 @@ public int getTracestateSizeLimit() {
return tracestateHeaderSizeLimit.get();
}

@Override
public TimeDuration getSpanMinDuration() {
return spanMinDuration.get();
}
Expand Down Expand Up @@ -1095,6 +1102,7 @@ public CloudProvider getCloudProvider() {
return cloudProvider.get();
}

@Override
public boolean isEnablePublicApiAnnotationInheritance() {
return enablePublicApiAnnotationInheritance.get();
}
Expand All @@ -1107,34 +1115,11 @@ public TraceContinuationStrategy getTraceContinuationStrategy() {
return traceContinuationStrategy.get();
}

@Override
public ActivationMethod getActivationMethod() {
return activationMethod.get();
}

public enum EventType {
/**
* Request bodies will never be reported
*/
OFF,
/**
* Request bodies will only be reported with errors
*/
ERRORS,
/**
* Request bodies will only be reported with request transactions
*/
TRANSACTIONS,
/**
* Request bodies will be reported with both errors and request transactions
*/
ALL;

@Override
public String toString() {
return name().toLowerCase();
}
}

public enum CloudProvider {
AUTO,
AWS,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
*/
package co.elastic.apm.agent.configuration;

import co.elastic.apm.agent.configuration.converter.ListValueConverter;
import co.elastic.apm.agent.tracer.configuration.ListValueConverter;
import org.stagemonitor.configuration.ConfigurationOption;
import org.stagemonitor.configuration.ConfigurationOptionProvider;
import org.stagemonitor.configuration.converter.DoubleValueConverter;
Expand All @@ -29,7 +29,7 @@
import java.util.HashSet;
import java.util.List;

public class MetricsConfiguration extends ConfigurationOptionProvider {
public class MetricsConfiguration extends ConfigurationOptionProvider implements co.elastic.apm.agent.tracer.configuration.MetricsConfiguration {

private static final String METRICS_CATEGORY = "Metrics";

Expand Down Expand Up @@ -101,6 +101,7 @@ public void assertValid(List<Double> buckets) {
.dynamic(false)
.buildWithDefault(false);

@Override
public boolean isDedotCustomMetrics() {
return dedotCustomMetrics.get();
}
Expand All @@ -117,6 +118,7 @@ public boolean isOverheadMetricsEnabled() {
return overheadMetricsEnabled.get();
}

@Override
public List<Double> getCustomMetricsHistogramBoundaries() {
return customMetricsHistogramBoundaries.get();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@
import org.stagemonitor.configuration.ConfigurationOption;
import org.stagemonitor.configuration.ConfigurationOptionProvider;

public class ServerlessConfiguration extends ConfigurationOptionProvider {
public class ServerlessConfiguration extends ConfigurationOptionProvider implements co.elastic.apm.agent.tracer.configuration.ServerlessConfiguration {
public static final String SERVERLESS_CATEGORY = "Serverless";

private final boolean runsOnAwsLambda;
Expand Down Expand Up @@ -50,14 +50,17 @@ public ServerlessConfiguration() {
.buildWithDefault(1000L);


@Override
public String getAwsLambdaHandler() {
return awsLambdaHandler.get();
}

@Override
public long getDataFlushTimeout() {
return dataFlushTimeout.get();
}

@Override
public boolean runsOnAwsLambda() {
return runsOnAwsLambda;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,8 @@
*/
package co.elastic.apm.agent.configuration;

import co.elastic.apm.agent.configuration.converter.TimeDuration;
import co.elastic.apm.agent.configuration.converter.TimeDurationValueConverter;
import co.elastic.apm.agent.tracer.configuration.TimeDuration;
import co.elastic.apm.agent.tracer.configuration.TimeDurationValueConverter;
import org.stagemonitor.configuration.ConfigurationOption;
import org.stagemonitor.configuration.ConfigurationOptionProvider;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
*/
package co.elastic.apm.agent.configuration;

import co.elastic.apm.agent.configuration.converter.TimeDuration;
import co.elastic.apm.agent.tracer.configuration.TimeDuration;
import co.elastic.apm.agent.context.AbstractLifecycleListener;
import co.elastic.apm.agent.impl.ElasticApmTracer;
import co.elastic.apm.agent.impl.stacktrace.StacktraceConfiguration;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,8 @@
import co.elastic.apm.agent.common.JvmRuntimeInfo;
import co.elastic.apm.agent.common.util.WildcardMatcher;
import co.elastic.apm.agent.configuration.CoreConfiguration;
import co.elastic.apm.agent.configuration.MetricsConfiguration;
import co.elastic.apm.agent.configuration.ServerlessConfiguration;
import co.elastic.apm.agent.configuration.ServiceInfo;
import co.elastic.apm.agent.configuration.SpanConfiguration;
import co.elastic.apm.agent.context.ClosableLifecycleListenerAdapter;
Expand Down Expand Up @@ -62,6 +64,7 @@
import java.io.Closeable;
import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
Expand All @@ -82,6 +85,8 @@ public class ElasticApmTracer implements Tracer {

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

private static final Map<Class<?>, Class<? extends ConfigurationOptionProvider>> configs = new HashMap<>();

private static volatile boolean classloaderCheckOk = false;

private final ConfigurationRegistry configurationRegistry;
Expand Down Expand Up @@ -126,6 +131,11 @@ protected ActiveStack initialValue() {

static {
checkClassloader();
configs.put(co.elastic.apm.agent.tracer.configuration.CoreConfiguration.class, CoreConfiguration.class);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[nitpick]
Imo it would be cleaner to adjust the contract of Tracer.getConfig to allow a lookup based on supertypes as long as the supertype is not ambiguous. To implement this for ElasticApmTracer, we would adapt the ConfigurationRegistry to index not only based on the concrete class but also on the supertypes.
This way no maintenance of this manual mapping is required while not worsening the performance.

However, no need to do this now. I'll maybe tackle this when I work on the config framework anyway.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I thought about this, but the constraint is set by ConfigurationRegistry which requires its keys to be suptypes of the provider class. I found it to messy to paste inn, but hopefully the entire configuration handling can be streamlined some day.

configs.put(co.elastic.apm.agent.tracer.configuration.LoggingConfiguration.class, LoggingConfiguration.class);
configs.put(co.elastic.apm.agent.tracer.configuration.MetricsConfiguration.class, MetricsConfiguration.class);
configs.put(co.elastic.apm.agent.tracer.configuration.ReporterConfiguration.class, ReporterConfiguration.class);
configs.put(co.elastic.apm.agent.tracer.configuration.ServerlessConfiguration.class, ServerlessConfiguration.class);
}

private static void checkClassloader() {
Expand Down Expand Up @@ -429,7 +439,9 @@ public ConfigurationRegistry getConfigurationRegistry() {
@SuppressWarnings({"unchecked", "rawtypes"})
public <T> T getConfig(Class<T> configProvider) {
T configuration = null;
if (ConfigurationOptionProvider.class.isAssignableFrom(configProvider)) {
if (configs.containsKey(configProvider)) {
configuration = (T) configurationRegistry.getConfig(configs.get(configProvider));
} else if (ConfigurationOptionProvider.class.isAssignableFrom(configProvider)) {
configuration = (T) configurationRegistry.getConfig((Class) configProvider);
}
if (configuration == null) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,8 @@
*/
package co.elastic.apm.agent.impl.circuitbreaker;

import co.elastic.apm.agent.configuration.converter.TimeDuration;
import co.elastic.apm.agent.configuration.converter.TimeDurationValueConverter;
import co.elastic.apm.agent.tracer.configuration.TimeDuration;
import co.elastic.apm.agent.tracer.configuration.TimeDurationValueConverter;
import org.stagemonitor.configuration.ConfigurationOption;
import org.stagemonitor.configuration.ConfigurationOptionProvider;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,9 +24,9 @@
import co.elastic.apm.agent.configuration.CoreConfiguration;
import org.stagemonitor.configuration.ConfigurationRegistry;

import static co.elastic.apm.agent.configuration.CoreConfiguration.EventType.ALL;
import static co.elastic.apm.agent.configuration.CoreConfiguration.EventType.ERRORS;
import static co.elastic.apm.agent.configuration.CoreConfiguration.EventType.TRANSACTIONS;
import static co.elastic.apm.agent.tracer.configuration.CoreConfiguration.EventType.ALL;
import static co.elastic.apm.agent.tracer.configuration.CoreConfiguration.EventType.ERRORS;
import static co.elastic.apm.agent.tracer.configuration.CoreConfiguration.EventType.TRANSACTIONS;

/**
* This processor redacts the body according to the {@link co.elastic.apm.agent.configuration.CoreConfiguration#captureBody}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,8 @@


import co.elastic.apm.agent.configuration.ActivationMethod;
import co.elastic.apm.agent.configuration.CoreConfiguration;
import co.elastic.apm.agent.tracer.GlobalTracer;
import co.elastic.apm.agent.tracer.configuration.CoreConfiguration;
import co.elastic.apm.agent.util.PrivilegedActionUtils;

import javax.annotation.Nullable;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -103,7 +103,7 @@ public static MetaDataFuture create(ConfigurationRegistry configurationRegistry,

final ServerlessConfiguration serverlessConfiguration = configurationRegistry.getConfig(ServerlessConfiguration.class);
final ServiceFactory serviceFactory = new ServiceFactory();
final Service service = serviceFactory.createService(coreConfiguration, ephemeralId, serverlessConfiguration);
final Service service = serviceFactory.createService(coreConfiguration, ephemeralId, serverlessConfiguration.runsOnAwsLambda());
final ProcessInfo processInformation = ProcessFactory.ForCurrentVM.INSTANCE.getProcessInformation();
if (!configurationRegistry.getConfig(ReporterConfiguration.class).isIncludeProcessArguments()) {
processInformation.getArgv().clear();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,14 +18,13 @@
*/
package co.elastic.apm.agent.impl.metadata;

import co.elastic.apm.agent.configuration.CoreConfiguration;
import co.elastic.apm.agent.configuration.ServerlessConfiguration;
import co.elastic.apm.agent.tracer.configuration.CoreConfiguration;
import co.elastic.apm.agent.util.PrivilegedActionUtils;
import co.elastic.apm.agent.util.VersionUtils;

public class ServiceFactory {

public Service createService(CoreConfiguration coreConfiguration, String ephemeralId, ServerlessConfiguration serverlessConfiguration) {
public Service createService(CoreConfiguration coreConfiguration, String ephemeralId, boolean runsOnAwsLambda) {
Service service = new Service()
.withName(coreConfiguration.getServiceName())
.withVersion(coreConfiguration.getServiceVersion())
Expand All @@ -35,7 +34,7 @@ public Service createService(CoreConfiguration coreConfiguration, String ephemer
.withLanguage(new Language("Java", System.getProperty("java.version")))
.withNode(new Node(coreConfiguration.getServiceNodeName()));

if (serverlessConfiguration.runsOnAwsLambda()) {
if (runsOnAwsLambda) {
augmentServiceForAWSLambda(service);
}
return service;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,8 @@
*/
package co.elastic.apm.agent.impl.stacktrace;

import co.elastic.apm.agent.configuration.converter.TimeDuration;
import co.elastic.apm.agent.configuration.converter.TimeDurationValueConverter;
import co.elastic.apm.agent.tracer.configuration.TimeDuration;
import co.elastic.apm.agent.tracer.configuration.TimeDurationValueConverter;
import org.stagemonitor.configuration.ConfigurationOption;
import org.stagemonitor.configuration.ConfigurationOptionProvider;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
*/
package co.elastic.apm.agent.impl.transaction;

import co.elastic.apm.agent.configuration.converter.RoundedDoubleConverter;
import co.elastic.apm.agent.tracer.configuration.RoundedDoubleConverter;
import co.elastic.apm.agent.sdk.logging.Logger;
import co.elastic.apm.agent.sdk.logging.LoggerFactory;
import co.elastic.apm.agent.tracer.dispatch.HeaderGetter;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@
import co.elastic.apm.agent.common.util.SystemStandardOutputLogger;
import co.elastic.apm.agent.configuration.CoreConfiguration;
import co.elastic.apm.agent.configuration.ServiceInfo;
import co.elastic.apm.agent.configuration.converter.ByteValue;
import co.elastic.apm.agent.tracer.configuration.ByteValue;
import co.elastic.apm.agent.report.ApmServerReporter;
import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.core.Filter;
Expand Down
Loading