Skip to content

Bump upstream version #304

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 10 commits into from
Apr 29, 2024
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 android-sdk-ktx/metadata/notice.properties
Original file line number Diff line number Diff line change
@@ -1 +1 @@
dependencies.hash=AFDBF157F73953F0B7829B5B718072E7
dependencies.hash=4335DC6BB998D19BBBD590A9B2803A50
4 changes: 3 additions & 1 deletion android-sdk/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -41,10 +41,12 @@ shadowJar {
dependencies {
api libs.opentelemetry.sdk
api libs.opentelemetry.android
api libs.opentelemetry.events
api libs.opentelemetry.api.incubator
api libs.stagemonitor.configuration
api libs.okhttp
implementation project(':android-common')
implementation libs.opentelemetry.android.instrumentation.api
implementation libs.opentelemetry.android.instrumentation.lifecycle
implementation libs.androidx.lifecycle
implementation libs.weaklockfree
implementation libs.opentelemetry.exporter.otlp
Expand Down
2 changes: 1 addition & 1 deletion android-sdk/metadata/notice.properties
Original file line number Diff line number Diff line change
@@ -1 +1 @@
dependencies.hash=77B4570CA3D2C0BA9C3541561D0679C0
dependencies.hash=A0177AAB7C169836786E530C6453B8A1
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
import android.app.Application;
import android.content.Context;

import androidx.annotation.NonNull;
import androidx.annotation.RestrictTo;
import androidx.lifecycle.ProcessLifecycleOwner;

Expand All @@ -42,7 +43,7 @@
import co.elastic.apm.android.sdk.connectivity.Connectivity;
import co.elastic.apm.android.sdk.connectivity.opentelemetry.SignalConfiguration;
import co.elastic.apm.android.sdk.connectivity.opentelemetry.exporters.VisitableExporters;
import co.elastic.apm.android.sdk.features.persistence.SignalDiskExporter;
import co.elastic.apm.android.sdk.features.persistence.SignalFromDiskExporter;
import co.elastic.apm.android.sdk.instrumentation.Instrumentations;
import co.elastic.apm.android.sdk.internal.api.filter.ComposableFilter;
import co.elastic.apm.android.sdk.internal.configuration.Configurations;
Expand All @@ -67,17 +68,18 @@
import co.elastic.apm.android.sdk.session.SessionManager;
import io.opentelemetry.android.OpenTelemetryRum;
import io.opentelemetry.android.config.OtelRumConfig;
import io.opentelemetry.android.features.diskbuffering.DiskBufferingConfiguration;
import io.opentelemetry.android.instrumentation.activity.VisibleScreenTracker;
import io.opentelemetry.android.instrumentation.lifecycle.AndroidLifecycleInstrumentationBuilder;
import io.opentelemetry.android.instrumentation.startup.AppStartupTimer;
import io.opentelemetry.api.GlobalOpenTelemetry;
import io.opentelemetry.api.OpenTelemetry;
import io.opentelemetry.api.common.Attributes;
import io.opentelemetry.api.events.GlobalEventEmitterProvider;
import io.opentelemetry.api.incubator.events.GlobalEventLoggerProvider;
import io.opentelemetry.sdk.logs.LogRecordProcessor;
import io.opentelemetry.sdk.logs.SdkLoggerProviderBuilder;
import io.opentelemetry.sdk.logs.data.LogRecordData;
import io.opentelemetry.sdk.logs.internal.SdkEventEmitterProvider;
import io.opentelemetry.sdk.logs.internal.SdkEventLoggerProvider;
import io.opentelemetry.sdk.metrics.SdkMeterProviderBuilder;
import io.opentelemetry.sdk.metrics.data.MetricData;
import io.opentelemetry.sdk.resources.Resource;
Expand Down Expand Up @@ -205,7 +207,7 @@ public static void resetForTest() {
ConnectionHttpAttributesVisitor.resetForTest();
ServiceManager.resetForTest();
GlobalOpenTelemetry.resetForTest();
GlobalEventEmitterProvider.resetForTest();
GlobalEventLoggerProvider.resetForTest();
instance = null;
}

Expand Down Expand Up @@ -281,9 +283,8 @@ private void initializeOpentelemetry(Application app, AgentDependenciesInjector
Resource resource = configuration.resource
.merge(Resource.create(resourceAttrs));

OtelRumConfig rumConfig = new OtelRumConfig();
rumConfig.disableNetworkAttributes();
rumConfig.disableNetworkChangeMonitoring();
OtelRumConfig rumConfig = getOtelRumConfig();

OpenTelemetryRum rum = OpenTelemetryRum.builder(app, rumConfig)
.addTracerProviderCustomizer((sdkTracerProviderBuilder, application) -> configureTracerProviderBuilder(sdkTracerProviderBuilder, signalConfiguration, resource, globalAttributesVisitor, sampleRateManager))
.addMeterProviderCustomizer((sdkMeterProviderBuilder, application) -> configureMeterProviderBuilder(sdkMeterProviderBuilder, signalConfiguration, resource, sampleRateManager))
Expand All @@ -302,16 +303,28 @@ private void initializeOpentelemetry(Application app, AgentDependenciesInjector

OpenTelemetry openTelemetry = rum.getOpenTelemetry();
GlobalOpenTelemetry.set(openTelemetry);
GlobalEventEmitterProvider.set(SdkEventEmitterProvider.create(openTelemetry.getLogsBridge(), ntpManager.getClock()));
GlobalEventLoggerProvider.set(SdkEventLoggerProvider.create(openTelemetry.getLogsBridge(), ntpManager.getClock()));

if (persistenceInitializer != null) {
SignalDiskExporter.set(persistenceInitializer.createSignalDiskExporter());
SignalFromDiskExporter.set(persistenceInitializer.createSignalDiskExporter());
configuration.persistenceConfiguration.exportScheduler.onPersistenceEnabled();
} else {
configuration.persistenceConfiguration.exportScheduler.onPersistenceDisabled();
}
}

@NonNull
private static OtelRumConfig getOtelRumConfig() {
OtelRumConfig rumConfig = new OtelRumConfig();
rumConfig.disableNetworkAttributes();
rumConfig.disableNetworkChangeMonitoring();
rumConfig.disableAnrDetection();
rumConfig.disableCrashReporting();
rumConfig.disableSlowRenderingDetection();
rumConfig.setDiskBufferingConfiguration(DiskBufferingConfiguration.builder().setEnabled(false).build());
return rumConfig;
}

private PersistenceInitializer tryInitializePersistence(SignalConfiguration signalConfiguration, AgentDependenciesInjector injector) {
if (configuration.persistenceConfiguration.enabled && signalConfiguration instanceof VisitableExporters) {
Elog.getLogger().debug("Initializing the persistence feature");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,42 +24,42 @@
import java.util.concurrent.TimeUnit;

import co.elastic.apm.android.common.internal.logging.Elog;
import io.opentelemetry.contrib.disk.buffering.LogRecordDiskExporter;
import io.opentelemetry.contrib.disk.buffering.MetricDiskExporter;
import io.opentelemetry.contrib.disk.buffering.SpanDiskExporter;
import io.opentelemetry.contrib.disk.buffering.LogRecordFromDiskExporter;
import io.opentelemetry.contrib.disk.buffering.MetricFromDiskExporter;
import io.opentelemetry.contrib.disk.buffering.SpanFromDiskExporter;

/**
* Entrypoint to read and export previously cached signals.
*/
public final class SignalDiskExporter {
private static SignalDiskExporter instance;
private final SpanDiskExporter spanDiskExporter;
private final MetricDiskExporter metricDiskExporter;
private final LogRecordDiskExporter logRecordDiskExporter;
public final class SignalFromDiskExporter {
private static SignalFromDiskExporter instance;
private final SpanFromDiskExporter spanDiskExporter;
private final MetricFromDiskExporter metricDiskExporter;
private final LogRecordFromDiskExporter logRecordDiskExporter;
private final long exportTimeoutInMillis;

public static SignalDiskExporter get() {
Elog.getLogger().debug("Getting SignalDiskExporter");
public static SignalFromDiskExporter get() {
Elog.getLogger().debug("Getting SignalFromDiskExporter");
if (instance == null) {
Elog.getLogger().debug("Returning noop SignalDiskExporter");
return new SignalDiskExporter(null, null, null, 0);
Elog.getLogger().debug("Returning noop SignalFromDiskExporter");
return new SignalFromDiskExporter(null, null, null, 0);
}
return instance;
}

public static void set(SignalDiskExporter signalDiskExporter) {
Elog.getLogger().debug("Setting SignalDiskExporter");
public static void set(SignalFromDiskExporter signalFromDiskExporter) {
Elog.getLogger().debug("Setting SignalFromDiskExporter");
if (instance != null) {
throw new IllegalStateException("An instance is already set. You can only set it once.");
}
instance = signalDiskExporter;
instance = signalFromDiskExporter;
}

public static void resetForTesting() {
instance = null;
}

SignalDiskExporter(SpanDiskExporter spanDiskExporter, MetricDiskExporter metricDiskExporter, LogRecordDiskExporter logRecordDiskExporter, long exportTimeoutInMillis) {
SignalFromDiskExporter(SpanFromDiskExporter spanDiskExporter, MetricFromDiskExporter metricDiskExporter, LogRecordFromDiskExporter logRecordDiskExporter, long exportTimeoutInMillis) {
this.spanDiskExporter = spanDiskExporter;
this.metricDiskExporter = metricDiskExporter;
this.logRecordDiskExporter = logRecordDiskExporter;
Expand Down Expand Up @@ -110,25 +110,25 @@ public boolean exportBatchOfEach() throws IOException {
}

public static class Builder {
private SpanDiskExporter spanDiskExporter;
private MetricDiskExporter metricDiskExporter;
private LogRecordDiskExporter logRecordDiskExporter;
private SpanFromDiskExporter spanDiskExporter;
private MetricFromDiskExporter metricDiskExporter;
private LogRecordFromDiskExporter logRecordDiskExporter;
private long exportTimeoutInMillis = TimeUnit.SECONDS.toMillis(5);

private Builder() {
}

public Builder setSpanDiskExporter(SpanDiskExporter spanDiskExporter) {
public Builder setSpanFromDiskExporter(SpanFromDiskExporter spanDiskExporter) {
this.spanDiskExporter = spanDiskExporter;
return this;
}

public Builder setMetricDiskExporter(MetricDiskExporter metricDiskExporter) {
public Builder setMetricFromDiskExporter(MetricFromDiskExporter metricDiskExporter) {
this.metricDiskExporter = metricDiskExporter;
return this;
}

public Builder setLogRecordDiskExporter(LogRecordDiskExporter logRecordDiskExporter) {
public Builder setLogRecordFromDiskExporter(LogRecordFromDiskExporter logRecordDiskExporter) {
this.logRecordDiskExporter = logRecordDiskExporter;
return this;
}
Expand All @@ -138,8 +138,8 @@ public Builder setExportTimeoutInMillis(long exportTimeoutInMillis) {
return this;
}

public SignalDiskExporter build() {
return new SignalDiskExporter(spanDiskExporter, metricDiskExporter, logRecordDiskExporter, exportTimeoutInMillis);
public SignalFromDiskExporter build() {
return new SignalFromDiskExporter(spanDiskExporter, metricDiskExporter, logRecordDiskExporter, exportTimeoutInMillis);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@
import java.util.concurrent.atomic.AtomicBoolean;

import co.elastic.apm.android.common.internal.logging.Elog;
import co.elastic.apm.android.sdk.features.persistence.SignalDiskExporter;
import co.elastic.apm.android.sdk.features.persistence.SignalFromDiskExporter;
import co.elastic.apm.android.sdk.features.persistence.scheduler.ExportScheduler;
import co.elastic.apm.android.sdk.internal.services.Service;
import co.elastic.apm.android.sdk.internal.services.ServiceManager;
Expand Down Expand Up @@ -97,9 +97,9 @@ public void runTask() {
lastTimeRunInMillis = timeProvider.getCurrentTimeMillis();
preferencesService.get().store(LAST_TIME_RUN_KEY, lastTimeRunInMillis);
try {
SignalDiskExporter signalDiskExporter = SignalDiskExporter.get();
SignalFromDiskExporter signalFromDiskExporter = SignalFromDiskExporter.get();
while (true) {
if (!signalDiskExporter.exportBatchOfEach()) break;
if (!signalFromDiskExporter.exportBatchOfEach()) break;
}
} catch (IOException e) {
Elog.getLogger().error("A problem happened while exporting signals from disk", e);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@
import co.elastic.apm.android.sdk.ElasticApmAgent;
import co.elastic.apm.android.sdk.logs.ElasticEvents;
import io.opentelemetry.api.common.Attributes;
import io.opentelemetry.api.events.EventEmitter;
import io.opentelemetry.api.incubator.events.EventBuilder;
import io.opentelemetry.semconv.SemanticAttributes;

public final class ElasticExceptionHandler implements Thread.UncaughtExceptionHandler {
Expand Down Expand Up @@ -65,12 +65,13 @@ public void uncaughtException(@NonNull Thread t, @NonNull Throwable e) {
}
}

private void emitCrashEvent(EventEmitter crashReporter, @NonNull Throwable e) {
crashReporter.emit("crash", Attributes.builder()
.put(SemanticAttributes.EXCEPTION_MESSAGE, e.getMessage())
.put(SemanticAttributes.EXCEPTION_STACKTRACE, stackTraceToString(e))
.put(SemanticAttributes.EXCEPTION_TYPE, e.getClass().getName())
.build());
private void emitCrashEvent(EventBuilder crashReporter, @NonNull Throwable e) {
crashReporter.setAttributes(Attributes.builder()
.put(SemanticAttributes.EXCEPTION_MESSAGE, e.getMessage())
.put(SemanticAttributes.EXCEPTION_STACKTRACE, stackTraceToString(e))
.put(SemanticAttributes.EXCEPTION_TYPE, e.getClass().getName())
.build())
.emit();
}

private String stackTraceToString(Throwable throwable) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@
import co.elastic.apm.android.sdk.ElasticApmAgent;
import co.elastic.apm.android.sdk.instrumentation.Instrumentations;
import co.elastic.apm.android.sdk.metrics.ElasticMeters;
import io.opentelemetry.android.instrumentation.ApplicationStateListener;
import io.opentelemetry.android.instrumentation.common.ApplicationStateListener;
import io.opentelemetry.api.metrics.BatchCallback;
import io.opentelemetry.api.metrics.Meter;
import io.opentelemetry.api.metrics.ObservableDoubleMeasurement;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,14 +26,14 @@
import co.elastic.apm.android.sdk.logs.ElasticEvents;
import io.opentelemetry.api.common.AttributeKey;
import io.opentelemetry.api.common.Attributes;
import io.opentelemetry.api.events.EventEmitter;
import io.opentelemetry.api.incubator.events.EventBuilder;

public class ElasticProcessLifecycleObserver implements DefaultLifecycleObserver {
private final EventEmitter lifecycleEventEmitter;
private final EventBuilder lifecycleEventLogger;

@VisibleForTesting
public ElasticProcessLifecycleObserver(EventEmitter lifecycleEventEmitter) {
this.lifecycleEventEmitter = lifecycleEventEmitter;
public ElasticProcessLifecycleObserver(EventBuilder lifecycleEventLogger) {
this.lifecycleEventLogger = lifecycleEventLogger;
}

public ElasticProcessLifecycleObserver() {
Expand Down Expand Up @@ -66,7 +66,8 @@ public void onStop(@NonNull LifecycleOwner owner) {
}

private void emitLifecycleState(String value) {
lifecycleEventEmitter.emit("lifecycle",
Attributes.of(AttributeKey.stringKey("lifecycle.state"), value));
lifecycleEventLogger
.setAttributes(Attributes.of(AttributeKey.stringKey("lifecycle.state"), value))
.emit();
}
}
Loading