diff --git a/android-agent/build.gradle.kts b/android-agent/build.gradle.kts index 5b3781a35..77584617f 100644 --- a/android-agent/build.gradle.kts +++ b/android-agent/build.gradle.kts @@ -67,7 +67,6 @@ dependencies { implementation(project(":instrumentation:anr")) implementation(project(":instrumentation:common-api")) implementation(project(":instrumentation:crash")) - implementation(project(":instrumentation:network")) implementation(project(":instrumentation:slowrendering")) implementation(libs.androidx.core) implementation(libs.androidx.navigation.fragment) diff --git a/android-agent/src/main/AndroidManifest.xml b/android-agent/src/main/AndroidManifest.xml index fa49b6f45..298c8b6e8 100644 --- a/android-agent/src/main/AndroidManifest.xml +++ b/android-agent/src/main/AndroidManifest.xml @@ -1,6 +1,7 @@ + diff --git a/android-agent/src/main/java/io/opentelemetry/android/OpenTelemetryRumBuilder.java b/android-agent/src/main/java/io/opentelemetry/android/OpenTelemetryRumBuilder.java index 97a2e092d..b3b160655 100644 --- a/android-agent/src/main/java/io/opentelemetry/android/OpenTelemetryRumBuilder.java +++ b/android-agent/src/main/java/io/opentelemetry/android/OpenTelemetryRumBuilder.java @@ -22,12 +22,10 @@ import io.opentelemetry.android.instrumentation.common.InstrumentedApplication; import io.opentelemetry.android.instrumentation.crash.CrashReporter; import io.opentelemetry.android.instrumentation.crash.CrashReporterBuilder; -import io.opentelemetry.android.instrumentation.network.CurrentNetworkProvider; -import io.opentelemetry.android.instrumentation.network.NetworkAttributesSpanAppender; -import io.opentelemetry.android.instrumentation.network.NetworkChangeMonitor; import io.opentelemetry.android.instrumentation.slowrendering.SlowRenderingDetector; import io.opentelemetry.android.instrumentation.startup.InitializationEvents; import io.opentelemetry.android.instrumentation.startup.SdkInitializationEvents; +import io.opentelemetry.android.internal.features.networkattrs.NetworkAttributesSpanAppender; import io.opentelemetry.android.internal.features.persistence.DiskManager; import io.opentelemetry.android.internal.features.persistence.SimpleTemporaryFileProvider; import io.opentelemetry.android.internal.processors.GlobalAttributesLogRecordAppender; @@ -100,7 +98,6 @@ public final class OpenTelemetryRumBuilder { (a) -> a; private Resource resource; - @Nullable private CurrentNetworkProvider currentNetworkProvider = null; private InitializationEvents initializationEvents = InitializationEvents.NO_OP; private Consumer anrCustomizer = x -> {}; private Consumer crashReporterCustomizer = x -> {}; @@ -130,18 +127,6 @@ public OpenTelemetryRumBuilder setResource(Resource resource) { return this; } - /** - * Call this to pass an existing CurrentNetworkProvider instance to share with the underlying - * OpenTelemetry Rum instrumentation. - * - * @return {@code this} - */ - public OpenTelemetryRumBuilder setCurrentNetworkProvider( - CurrentNetworkProvider currentNetworkProvider) { - this.currentNetworkProvider = currentNetworkProvider; - return this; - } - /** * Merges a new {@link Resource} with any existing {@link Resource} in this builder. The * resulting {@link Resource} will be attached to all telemetry emitted by the {@link @@ -455,27 +440,17 @@ private void applyConfiguration() { // Network specific attributes if (config.shouldIncludeNetworkAttributes()) { // Add span processor that appends network attributes. - CurrentNetworkProvider currentNetworkProvider = getOrCreateCurrentNetworkProvider(); addTracerProviderCustomizer( (tracerProviderBuilder, app) -> { SpanProcessor networkAttributesSpanAppender = - NetworkAttributesSpanAppender.create(currentNetworkProvider); + NetworkAttributesSpanAppender.create( + ServiceManager.get().getCurrentNetworkProvider()); return tracerProviderBuilder.addSpanProcessor( networkAttributesSpanAppender); }); initializationEvents.currentNetworkProviderInitialized(); } - // Add network change monitor if enabled (default = = true) - if (config.isNetworkChangeMonitoringEnabled()) { - addInstrumentation( - app -> { - NetworkChangeMonitor.create(getOrCreateCurrentNetworkProvider()) - .installOn(app); - initializationEvents.networkMonitorInitialized(); - }); - } - // Add span processor that appends screen attribute(s) if (config.shouldIncludeScreenAttributes()) { addTracerProviderCustomizer( @@ -530,13 +505,6 @@ private void applyConfiguration() { } } - private CurrentNetworkProvider getOrCreateCurrentNetworkProvider() { - if (currentNetworkProvider == null) { - this.currentNetworkProvider = CurrentNetworkProvider.createAndStart(application); - } - return currentNetworkProvider; - } - private SdkTracerProvider buildTracerProvider( SessionId sessionId, Application application, SpanExporter spanExporter) { SdkTracerProviderBuilder tracerProviderBuilder = diff --git a/android-agent/src/main/java/io/opentelemetry/android/config/OtelRumConfig.java b/android-agent/src/main/java/io/opentelemetry/android/config/OtelRumConfig.java index f26ec6271..46b6c861a 100644 --- a/android-agent/src/main/java/io/opentelemetry/android/config/OtelRumConfig.java +++ b/android-agent/src/main/java/io/opentelemetry/android/config/OtelRumConfig.java @@ -7,7 +7,7 @@ import io.opentelemetry.android.ScreenAttributesSpanProcessor; import io.opentelemetry.android.features.diskbuffering.DiskBufferingConfiguration; -import io.opentelemetry.android.instrumentation.network.CurrentNetworkProvider; +import io.opentelemetry.android.internal.services.network.CurrentNetworkProvider; import io.opentelemetry.api.common.Attributes; import java.time.Duration; import java.util.function.Supplier; @@ -28,7 +28,6 @@ public class OtelRumConfig { private boolean includeScreenAttributes = true; private DiskBufferingConfiguration diskBufferingConfiguration = DiskBufferingConfiguration.builder().build(); - private boolean networkChangeMonitoringEnabled = true; private boolean anrDetectionEnabled = true; private boolean slowRenderingDetectionEnabled = true; private Duration slowRenderingDetectionPollInterval = @@ -121,20 +120,6 @@ public OtelRumConfig setDiskBufferingConfiguration( return this; } - /** - * Sets the configuration so that network change monitoring, which is enabled by default, will - * not be started. - */ - public OtelRumConfig disableNetworkChangeMonitoring() { - networkChangeMonitoringEnabled = false; - return this; - } - - /** Returns true if network change monitoring is enabled (default = true). */ - public boolean isNetworkChangeMonitoringEnabled() { - return networkChangeMonitoringEnabled; - } - /** Returns true if ANR (application not responding) detection is enabled (default = true). */ public boolean isAnrDetectionEnabled() { return anrDetectionEnabled; diff --git a/instrumentation/network/src/main/java/io/opentelemetry/android/instrumentation/network/CurrentNetworkAttributesExtractor.java b/android-agent/src/main/java/io/opentelemetry/android/internal/features/networkattrs/CurrentNetworkAttributesExtractor.java similarity index 87% rename from instrumentation/network/src/main/java/io/opentelemetry/android/instrumentation/network/CurrentNetworkAttributesExtractor.java rename to android-agent/src/main/java/io/opentelemetry/android/internal/features/networkattrs/CurrentNetworkAttributesExtractor.java index 0896a6bdb..66eff3110 100644 --- a/instrumentation/network/src/main/java/io/opentelemetry/android/instrumentation/network/CurrentNetworkAttributesExtractor.java +++ b/android-agent/src/main/java/io/opentelemetry/android/internal/features/networkattrs/CurrentNetworkAttributesExtractor.java @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.android.instrumentation.network; +package io.opentelemetry.android.internal.features.networkattrs; import static io.opentelemetry.semconv.incubating.NetworkIncubatingAttributes.NETWORK_CARRIER_ICC; import static io.opentelemetry.semconv.incubating.NetworkIncubatingAttributes.NETWORK_CARRIER_MCC; @@ -13,13 +13,14 @@ import static io.opentelemetry.semconv.incubating.NetworkIncubatingAttributes.NETWORK_CONNECTION_TYPE; import androidx.annotation.Nullable; +import io.opentelemetry.android.internal.services.network.data.CurrentNetwork; import io.opentelemetry.api.common.AttributeKey; import io.opentelemetry.api.common.Attributes; import io.opentelemetry.api.common.AttributesBuilder; -final class CurrentNetworkAttributesExtractor { +public final class CurrentNetworkAttributesExtractor { - Attributes extract(CurrentNetwork network) { + public Attributes extract(CurrentNetwork network) { AttributesBuilder builder = Attributes.builder() .put(NETWORK_CONNECTION_TYPE, network.getState().getHumanName()); diff --git a/instrumentation/network/src/main/java/io/opentelemetry/android/instrumentation/network/NetworkAttributesSpanAppender.java b/android-agent/src/main/java/io/opentelemetry/android/internal/features/networkattrs/NetworkAttributesSpanAppender.java similarity index 88% rename from instrumentation/network/src/main/java/io/opentelemetry/android/instrumentation/network/NetworkAttributesSpanAppender.java rename to android-agent/src/main/java/io/opentelemetry/android/internal/features/networkattrs/NetworkAttributesSpanAppender.java index 05cbdafab..f71e29c2e 100644 --- a/instrumentation/network/src/main/java/io/opentelemetry/android/instrumentation/network/NetworkAttributesSpanAppender.java +++ b/android-agent/src/main/java/io/opentelemetry/android/internal/features/networkattrs/NetworkAttributesSpanAppender.java @@ -3,8 +3,10 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.android.instrumentation.network; +package io.opentelemetry.android.internal.features.networkattrs; +import io.opentelemetry.android.internal.services.network.CurrentNetworkProvider; +import io.opentelemetry.android.internal.services.network.data.CurrentNetwork; import io.opentelemetry.api.common.Attributes; import io.opentelemetry.context.Context; import io.opentelemetry.sdk.trace.ReadWriteSpan; diff --git a/android-agent/src/main/java/io/opentelemetry/android/internal/services/ServiceManager.kt b/android-agent/src/main/java/io/opentelemetry/android/internal/services/ServiceManager.kt index 96f0e4c34..8c0f2732a 100644 --- a/android-agent/src/main/java/io/opentelemetry/android/internal/services/ServiceManager.kt +++ b/android-agent/src/main/java/io/opentelemetry/android/internal/services/ServiceManager.kt @@ -5,7 +5,8 @@ package io.opentelemetry.android.internal.services -import android.content.Context +import android.app.Application +import io.opentelemetry.android.internal.services.network.CurrentNetworkProvider import io.opentelemetry.android.internal.services.periodicwork.PeriodicWorkService /** @@ -18,22 +19,25 @@ interface ServiceManager : Startable { fun getPeriodicWorkService(): PeriodicWorkService + fun getCurrentNetworkProvider(): CurrentNetworkProvider + companion object { private var instance: ServiceManager? = null @JvmStatic - fun initialize(appContext: Context) { + fun initialize(application: Application) { if (instance != null) { return } instance = ServiceManagerImpl( listOf( - Preferences.create(appContext), + Preferences.create(application), CacheStorage( - appContext, + application, ), PeriodicWorkService(), + CurrentNetworkProvider.create(application), ), ) } diff --git a/android-agent/src/main/java/io/opentelemetry/android/internal/services/ServiceManagerImpl.kt b/android-agent/src/main/java/io/opentelemetry/android/internal/services/ServiceManagerImpl.kt index 12f4aeea2..370e4db70 100644 --- a/android-agent/src/main/java/io/opentelemetry/android/internal/services/ServiceManagerImpl.kt +++ b/android-agent/src/main/java/io/opentelemetry/android/internal/services/ServiceManagerImpl.kt @@ -5,6 +5,7 @@ package io.opentelemetry.android.internal.services +import io.opentelemetry.android.internal.services.network.CurrentNetworkProvider import io.opentelemetry.android.internal.services.periodicwork.PeriodicWorkService import java.util.Collections @@ -31,6 +32,10 @@ internal class ServiceManagerImpl(services: List) : ServiceManager { return getService(PeriodicWorkService::class.java) } + override fun getCurrentNetworkProvider(): CurrentNetworkProvider { + return getService(CurrentNetworkProvider::class.java) + } + override fun start() { for (service in services.values) { if (service is Startable) { diff --git a/android-agent/src/main/java/io/opentelemetry/android/internal/services/network/CarrierFinder.java b/android-agent/src/main/java/io/opentelemetry/android/internal/services/network/CarrierFinder.java new file mode 100644 index 000000000..7690e0540 --- /dev/null +++ b/android-agent/src/main/java/io/opentelemetry/android/internal/services/network/CarrierFinder.java @@ -0,0 +1,50 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.android.internal.services.network; + +import android.os.Build; +import android.telephony.TelephonyManager; +import androidx.annotation.RequiresApi; +import io.opentelemetry.android.internal.services.network.data.Carrier; + +/** + * This class is internal and not for public use. Its APIs are unstable and can change at any time. + */ +@RequiresApi(api = Build.VERSION_CODES.P) +public class CarrierFinder { + + private final TelephonyManager telephonyManager; + + public CarrierFinder(TelephonyManager telephonyManager) { + this.telephonyManager = telephonyManager; + } + + public Carrier get() { + int id = telephonyManager.getSimCarrierId(); + String name = null; + String mobileCountryCode = null; + String mobileNetworkCode = null; + String isoCountryCode = null; + CharSequence simCarrierIdName = telephonyManager.getSimCarrierIdName(); + if (validString(simCarrierIdName)) { + name = simCarrierIdName.toString(); + } + String simOperator = telephonyManager.getSimOperator(); + if (validString(simOperator) && simOperator.length() >= 5) { + mobileCountryCode = simOperator.substring(0, 3); + mobileNetworkCode = simOperator.substring(3); + } + String providedIsoCountryCode = telephonyManager.getSimCountryIso(); + if (validString(providedIsoCountryCode)) { + isoCountryCode = providedIsoCountryCode; + } + return new Carrier(id, name, mobileCountryCode, mobileNetworkCode, isoCountryCode); + } + + private boolean validString(CharSequence str) { + return !(str == null || str.length() == 0); + } +} diff --git a/instrumentation/network/src/main/java/io/opentelemetry/android/instrumentation/network/CurrentNetworkProvider.java b/android-agent/src/main/java/io/opentelemetry/android/internal/services/network/CurrentNetworkProvider.java similarity index 74% rename from instrumentation/network/src/main/java/io/opentelemetry/android/instrumentation/network/CurrentNetworkProvider.java rename to android-agent/src/main/java/io/opentelemetry/android/internal/services/network/CurrentNetworkProvider.java index 1968ae36e..2da0fcc9a 100644 --- a/instrumentation/network/src/main/java/io/opentelemetry/android/instrumentation/network/CurrentNetworkProvider.java +++ b/android-agent/src/main/java/io/opentelemetry/android/internal/services/network/CurrentNetworkProvider.java @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.android.instrumentation.network; +package io.opentelemetry.android.internal.services.network; import android.app.Application; import android.content.Context; @@ -15,6 +15,10 @@ import android.util.Log; import androidx.annotation.NonNull; import io.opentelemetry.android.common.RumConstants; +import io.opentelemetry.android.internal.services.Startable; +import io.opentelemetry.android.internal.services.network.data.CurrentNetwork; +import io.opentelemetry.android.internal.services.network.data.NetworkState; +import io.opentelemetry.android.internal.services.network.detector.NetworkDetector; import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; import java.util.function.Supplier; @@ -25,45 +29,41 @@ /** * A provider of {@link CurrentNetwork} information. Registers itself in the Android {@link * ConnectivityManager} and listens for network changes. + * + *

This class is internal and not for public use. Its APIs are unstable and can change at any + * time. */ -public final class CurrentNetworkProvider { +public final class CurrentNetworkProvider implements Startable { - static final CurrentNetwork NO_NETWORK = + public static final CurrentNetwork NO_NETWORK = CurrentNetwork.builder(NetworkState.NO_NETWORK_AVAILABLE).build(); - static final CurrentNetwork UNKNOWN_NETWORK = + public static final CurrentNetwork UNKNOWN_NETWORK = CurrentNetwork.builder(NetworkState.TRANSPORT_UNKNOWN).build(); - /** - * Creates a new {@link CurrentNetworkProvider} instance and registers network callbacks in the - * Android {@link ConnectivityManager}. - */ - public static CurrentNetworkProvider createAndStart(Application application) { - Context context = application.getApplicationContext(); - CurrentNetworkProvider currentNetworkProvider = - new CurrentNetworkProvider(NetworkDetector.create(context)); - currentNetworkProvider.startMonitoring( - CurrentNetworkProvider::createNetworkMonitoringRequest, - (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE)); - return currentNetworkProvider; + public static CurrentNetworkProvider create(Application application) { + return new CurrentNetworkProvider( + NetworkDetector.create(application), + (ConnectivityManager) application.getSystemService(Context.CONNECTIVITY_SERVICE)); } private final NetworkDetector networkDetector; + private final ConnectivityManager connectivityManager; private volatile CurrentNetwork currentNetwork = UNKNOWN_NETWORK; private final List listeners = new CopyOnWriteArrayList<>(); // visible for tests - CurrentNetworkProvider(NetworkDetector networkDetector) { + CurrentNetworkProvider( + NetworkDetector networkDetector, ConnectivityManager connectivityManager) { + this.connectivityManager = connectivityManager; this.networkDetector = networkDetector; } // visible for tests - void startMonitoring( - Supplier createNetworkMonitoringRequest, - ConnectivityManager connectivityManager) { + void startMonitoring(Supplier createNetworkMonitoringRequest) { refreshNetworkStatus(); try { - registerNetworkCallbacks(createNetworkMonitoringRequest, connectivityManager); + registerNetworkCallbacks(createNetworkMonitoringRequest); } catch (Exception e) { // if this fails, we'll go without network change events. Log.w( @@ -73,9 +73,7 @@ void startMonitoring( } } - private void registerNetworkCallbacks( - Supplier createNetworkMonitoringRequest, - ConnectivityManager connectivityManager) { + private void registerNetworkCallbacks(Supplier createNetworkMonitoringRequest) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { connectivityManager.registerDefaultNetworkCallback(new ConnectionMonitor()); } else { @@ -107,11 +105,11 @@ private static NetworkRequest createNetworkMonitoringRequest() { .build(); } - CurrentNetwork getCurrentNetwork() { + public CurrentNetwork getCurrentNetwork() { return currentNetwork; } - void addNetworkChangeListener(NetworkChangeListener listener) { + public void addNetworkChangeListener(NetworkChangeListener listener) { listeners.add(listener); } @@ -121,6 +119,11 @@ private void notifyListeners(CurrentNetwork activeNetwork) { } } + @Override + public void start() { + startMonitoring(CurrentNetworkProvider::createNetworkMonitoringRequest); + } + private final class ConnectionMonitor extends ConnectivityManager.NetworkCallback { @Override diff --git a/android-agent/src/main/java/io/opentelemetry/android/internal/services/network/NetworkChangeListener.java b/android-agent/src/main/java/io/opentelemetry/android/internal/services/network/NetworkChangeListener.java new file mode 100644 index 000000000..c1b46ba7f --- /dev/null +++ b/android-agent/src/main/java/io/opentelemetry/android/internal/services/network/NetworkChangeListener.java @@ -0,0 +1,16 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.android.internal.services.network; + +import io.opentelemetry.android.internal.services.network.data.CurrentNetwork; + +/** + * This class is internal and not for public use. Its APIs are unstable and can change at any time. + */ +public interface NetworkChangeListener { + + void onNetworkChange(CurrentNetwork currentNetwork); +} diff --git a/android-agent/src/main/java/io/opentelemetry/android/internal/services/network/data/Carrier.kt b/android-agent/src/main/java/io/opentelemetry/android/internal/services/network/data/Carrier.kt new file mode 100644 index 000000000..5531892b1 --- /dev/null +++ b/android-agent/src/main/java/io/opentelemetry/android/internal/services/network/data/Carrier.kt @@ -0,0 +1,24 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.android.internal.services.network.data + +import android.os.Build +import android.telephony.TelephonyManager +import androidx.annotation.RequiresApi + +/** + * This class is internal and not for public use. Its APIs are unstable and can change at any time. + */ +@RequiresApi(api = Build.VERSION_CODES.P) +data class Carrier + @JvmOverloads + internal constructor( + val id: Int = TelephonyManager.UNKNOWN_CARRIER_ID, + val name: String? = null, + val mobileCountryCode: String? = null, + val mobileNetworkCode: String? = null, + val isoCountryCode: String? = null, + ) diff --git a/instrumentation/network/src/main/java/io/opentelemetry/android/instrumentation/network/CurrentNetwork.java b/android-agent/src/main/java/io/opentelemetry/android/internal/services/network/data/CurrentNetwork.java similarity index 77% rename from instrumentation/network/src/main/java/io/opentelemetry/android/instrumentation/network/CurrentNetwork.java rename to android-agent/src/main/java/io/opentelemetry/android/internal/services/network/data/CurrentNetwork.java index 87160e0ad..56675b0fc 100644 --- a/instrumentation/network/src/main/java/io/opentelemetry/android/instrumentation/network/CurrentNetwork.java +++ b/android-agent/src/main/java/io/opentelemetry/android/internal/services/network/data/CurrentNetwork.java @@ -3,13 +3,18 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.android.instrumentation.network; +package io.opentelemetry.android.internal.services.network.data; import android.os.Build; import androidx.annotation.Nullable; import java.util.Objects; -/** A value class representing the current network that the device is connected to. */ +/** + * A value class representing the current network that the device is connected to. + * + *

This class is internal and not for public use. Its APIs are unstable and can change at any + * time. + */ public final class CurrentNetwork { @Nullable private final Carrier carrier; @@ -27,36 +32,36 @@ public boolean isOnline() { return getState() != NetworkState.NO_NETWORK_AVAILABLE; } - NetworkState getState() { + public NetworkState getState() { return state; } @Nullable - String getSubType() { + public String getSubType() { return subType; } @SuppressWarnings("NullAway") @Nullable - String getCarrierCountryCode() { + public String getCarrierCountryCode() { return haveCarrier() ? carrier.getMobileCountryCode() : null; } @SuppressWarnings("NullAway") @Nullable - String getCarrierIsoCountryCode() { + public String getCarrierIsoCountryCode() { return haveCarrier() ? carrier.getIsoCountryCode() : null; } @SuppressWarnings("NullAway") @Nullable - String getCarrierNetworkCode() { + public String getCarrierNetworkCode() { return haveCarrier() ? carrier.getMobileNetworkCode() : null; } @SuppressWarnings("NullAway") @Nullable - String getCarrierName() { + public String getCarrierName() { return haveCarrier() ? carrier.getName() : null; } @@ -92,11 +97,11 @@ public String toString() { + '}'; } - static Builder builder(NetworkState state) { + public static Builder builder(NetworkState state) { return new Builder(state); } - static class Builder { + public static class Builder { @Nullable private Carrier carrier; private final NetworkState state; @Nullable private String subType; @@ -105,17 +110,17 @@ private Builder(NetworkState state) { this.state = state; } - Builder carrier(@Nullable Carrier carrier) { + public Builder carrier(@Nullable Carrier carrier) { this.carrier = carrier; return this; } - Builder subType(@Nullable String subType) { + public Builder subType(@Nullable String subType) { this.subType = subType; return this; } - CurrentNetwork build() { + public CurrentNetwork build() { return new CurrentNetwork(this); } } diff --git a/instrumentation/network/src/main/java/io/opentelemetry/android/instrumentation/network/NetworkState.java b/android-agent/src/main/java/io/opentelemetry/android/internal/services/network/data/NetworkState.java similarity index 74% rename from instrumentation/network/src/main/java/io/opentelemetry/android/instrumentation/network/NetworkState.java rename to android-agent/src/main/java/io/opentelemetry/android/internal/services/network/data/NetworkState.java index 4cecea28a..9cfaf66bc 100644 --- a/instrumentation/network/src/main/java/io/opentelemetry/android/instrumentation/network/NetworkState.java +++ b/android-agent/src/main/java/io/opentelemetry/android/internal/services/network/data/NetworkState.java @@ -3,11 +3,14 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.android.instrumentation.network; +package io.opentelemetry.android.internal.services.network.data; import io.opentelemetry.semconv.incubating.NetworkIncubatingAttributes.NetworkConnectionTypeValues; -enum NetworkState { +/** + * This class is internal and not for public use. Its APIs are unstable and can change at any time. + */ +public enum NetworkState { NO_NETWORK_AVAILABLE(NetworkConnectionTypeValues.UNAVAILABLE), TRANSPORT_CELLULAR(NetworkConnectionTypeValues.CELL), TRANSPORT_WIFI(NetworkConnectionTypeValues.WIFI), @@ -21,7 +24,7 @@ enum NetworkState { this.humanName = humanName; } - String getHumanName() { + public String getHumanName() { return humanName; } } diff --git a/instrumentation/network/src/main/java/io/opentelemetry/android/instrumentation/network/NetworkDetector.java b/android-agent/src/main/java/io/opentelemetry/android/internal/services/network/detector/NetworkDetector.java similarity index 72% rename from instrumentation/network/src/main/java/io/opentelemetry/android/instrumentation/network/NetworkDetector.java rename to android-agent/src/main/java/io/opentelemetry/android/internal/services/network/detector/NetworkDetector.java index 34ef36469..27a6483e9 100644 --- a/instrumentation/network/src/main/java/io/opentelemetry/android/instrumentation/network/NetworkDetector.java +++ b/android-agent/src/main/java/io/opentelemetry/android/internal/services/network/detector/NetworkDetector.java @@ -3,14 +3,19 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.android.instrumentation.network; +package io.opentelemetry.android.internal.services.network.detector; import android.content.Context; import android.net.ConnectivityManager; import android.os.Build; import android.telephony.TelephonyManager; +import io.opentelemetry.android.internal.services.network.CarrierFinder; +import io.opentelemetry.android.internal.services.network.data.CurrentNetwork; -interface NetworkDetector { +/** + * This class is internal and not for public use. Its APIs are unstable and can change at any time. + */ +public interface NetworkDetector { CurrentNetwork detectCurrentNetwork(); static NetworkDetector create(Context context) { diff --git a/instrumentation/network/src/main/java/io/opentelemetry/android/instrumentation/network/PostApi28NetworkDetector.java b/android-agent/src/main/java/io/opentelemetry/android/internal/services/network/detector/PostApi28NetworkDetector.java similarity index 87% rename from instrumentation/network/src/main/java/io/opentelemetry/android/instrumentation/network/PostApi28NetworkDetector.java rename to android-agent/src/main/java/io/opentelemetry/android/internal/services/network/detector/PostApi28NetworkDetector.java index 5f79de692..09edde22e 100644 --- a/instrumentation/network/src/main/java/io/opentelemetry/android/instrumentation/network/PostApi28NetworkDetector.java +++ b/android-agent/src/main/java/io/opentelemetry/android/internal/services/network/detector/PostApi28NetworkDetector.java @@ -3,10 +3,10 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.android.instrumentation.network; +package io.opentelemetry.android.internal.services.network.detector; -import static io.opentelemetry.android.instrumentation.network.CurrentNetworkProvider.NO_NETWORK; -import static io.opentelemetry.android.instrumentation.network.CurrentNetworkProvider.UNKNOWN_NETWORK; +import static io.opentelemetry.android.internal.services.network.CurrentNetworkProvider.NO_NETWORK; +import static io.opentelemetry.android.internal.services.network.CurrentNetworkProvider.UNKNOWN_NETWORK; import android.Manifest; import android.annotation.SuppressLint; @@ -18,7 +18,14 @@ import android.telephony.TelephonyManager; import androidx.annotation.RequiresApi; import androidx.core.app.ActivityCompat; +import io.opentelemetry.android.internal.services.network.CarrierFinder; +import io.opentelemetry.android.internal.services.network.data.Carrier; +import io.opentelemetry.android.internal.services.network.data.CurrentNetwork; +import io.opentelemetry.android.internal.services.network.data.NetworkState; +/** + * This class is internal and not for public use. Its APIs are unstable and can change at any time. + */ @RequiresApi(api = Build.VERSION_CODES.P) class PostApi28NetworkDetector implements NetworkDetector { private final ConnectivityManager connectivityManager; diff --git a/instrumentation/network/src/main/java/io/opentelemetry/android/instrumentation/network/SimpleNetworkDetector.java b/android-agent/src/main/java/io/opentelemetry/android/internal/services/network/detector/SimpleNetworkDetector.java similarity index 74% rename from instrumentation/network/src/main/java/io/opentelemetry/android/instrumentation/network/SimpleNetworkDetector.java rename to android-agent/src/main/java/io/opentelemetry/android/internal/services/network/detector/SimpleNetworkDetector.java index 618035ee0..fd0cbaa6d 100644 --- a/instrumentation/network/src/main/java/io/opentelemetry/android/instrumentation/network/SimpleNetworkDetector.java +++ b/android-agent/src/main/java/io/opentelemetry/android/internal/services/network/detector/SimpleNetworkDetector.java @@ -3,14 +3,19 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.android.instrumentation.network; +package io.opentelemetry.android.internal.services.network.detector; -import static io.opentelemetry.android.instrumentation.network.CurrentNetworkProvider.NO_NETWORK; -import static io.opentelemetry.android.instrumentation.network.CurrentNetworkProvider.UNKNOWN_NETWORK; +import static io.opentelemetry.android.internal.services.network.CurrentNetworkProvider.NO_NETWORK; +import static io.opentelemetry.android.internal.services.network.CurrentNetworkProvider.UNKNOWN_NETWORK; import android.net.ConnectivityManager; import android.net.NetworkInfo; +import io.opentelemetry.android.internal.services.network.data.CurrentNetwork; +import io.opentelemetry.android.internal.services.network.data.NetworkState; +/** + * This class is internal and not for public use. Its APIs are unstable and can change at any time. + */ class SimpleNetworkDetector implements NetworkDetector { private final ConnectivityManager connectivityManager; diff --git a/instrumentation/network/src/test/java/io/opentelemetry/android/instrumentation/network/CurrentNetworkAttributesExtractorTest.java b/android-agent/src/test/java/io/opentelemetry/android/internal/features/networkattrs/CurrentNetworkAttributesExtractorTest.java similarity index 81% rename from instrumentation/network/src/test/java/io/opentelemetry/android/instrumentation/network/CurrentNetworkAttributesExtractorTest.java rename to android-agent/src/test/java/io/opentelemetry/android/internal/features/networkattrs/CurrentNetworkAttributesExtractorTest.java index 6a98ae1e4..476bad126 100644 --- a/instrumentation/network/src/test/java/io/opentelemetry/android/instrumentation/network/CurrentNetworkAttributesExtractorTest.java +++ b/android-agent/src/test/java/io/opentelemetry/android/internal/features/networkattrs/CurrentNetworkAttributesExtractorTest.java @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.android.instrumentation.network; +package io.opentelemetry.android.internal.features.networkattrs; import static io.opentelemetry.semconv.incubating.NetworkIncubatingAttributes.NETWORK_CARRIER_ICC; import static io.opentelemetry.semconv.incubating.NetworkIncubatingAttributes.NETWORK_CARRIER_MCC; @@ -14,6 +14,9 @@ import static org.assertj.core.api.Assertions.entry; import android.os.Build; +import io.opentelemetry.android.internal.services.network.data.Carrier; +import io.opentelemetry.android.internal.services.network.data.CurrentNetwork; +import io.opentelemetry.android.internal.services.network.data.NetworkState; import io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions; import org.junit.Test; import org.junit.runner.RunWith; @@ -31,14 +34,7 @@ public void getNetworkAttributes_withCarrier() { CurrentNetwork currentNetwork = CurrentNetwork.builder(NetworkState.TRANSPORT_CELLULAR) .subType("aaa") - .carrier( - Carrier.builder() - .id(206) - .name("ShadyTel") - .isoCountryCode("US") - .mobileCountryCode("usa") - .mobileNetworkCode("omg") - .build()) + .carrier(new Carrier(206, "ShadyTel", "usa", "omg", "US")) .build(); OpenTelemetryAssertions.assertThat(underTest.extract(currentNetwork)) @@ -57,7 +53,7 @@ public void getNetworkAttributes_withoutCarrier() { CurrentNetwork currentNetwork = CurrentNetwork.builder(NetworkState.TRANSPORT_CELLULAR) .subType("aaa") - .carrier(Carrier.builder().id(42).name("ShadyTel").build()) + .carrier(new Carrier(42, "ShadyTel")) .build(); OpenTelemetryAssertions.assertThat(underTest.extract(currentNetwork)) diff --git a/instrumentation/network/src/test/java/io/opentelemetry/android/instrumentation/network/NetworkAttributesSpanAppenderTest.java b/android-agent/src/test/java/io/opentelemetry/android/internal/features/networkattrs/NetworkAttributesSpanAppenderTest.java similarity index 85% rename from instrumentation/network/src/test/java/io/opentelemetry/android/instrumentation/network/NetworkAttributesSpanAppenderTest.java rename to android-agent/src/test/java/io/opentelemetry/android/internal/features/networkattrs/NetworkAttributesSpanAppenderTest.java index 938923390..50e1cb23e 100644 --- a/instrumentation/network/src/test/java/io/opentelemetry/android/instrumentation/network/NetworkAttributesSpanAppenderTest.java +++ b/android-agent/src/test/java/io/opentelemetry/android/internal/features/networkattrs/NetworkAttributesSpanAppenderTest.java @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.android.instrumentation.network; +package io.opentelemetry.android.internal.features.networkattrs; import static io.opentelemetry.semconv.incubating.NetworkIncubatingAttributes.NETWORK_CONNECTION_SUBTYPE; import static io.opentelemetry.semconv.incubating.NetworkIncubatingAttributes.NETWORK_CONNECTION_TYPE; @@ -12,6 +12,9 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; +import io.opentelemetry.android.internal.services.network.CurrentNetworkProvider; +import io.opentelemetry.android.internal.services.network.data.CurrentNetwork; +import io.opentelemetry.android.internal.services.network.data.NetworkState; import io.opentelemetry.api.common.Attributes; import io.opentelemetry.context.Context; import io.opentelemetry.sdk.trace.ReadWriteSpan; diff --git a/android-agent/src/test/java/io/opentelemetry/android/internal/services/ServiceManagerImplTest.kt b/android-agent/src/test/java/io/opentelemetry/android/internal/services/ServiceManagerImplTest.kt index 5bede69ff..e76a7dcc9 100644 --- a/android-agent/src/test/java/io/opentelemetry/android/internal/services/ServiceManagerImplTest.kt +++ b/android-agent/src/test/java/io/opentelemetry/android/internal/services/ServiceManagerImplTest.kt @@ -6,6 +6,7 @@ package io.opentelemetry.android.internal.services import io.opentelemetry.android.internal.services.ServiceManager.Companion.initialize +import io.opentelemetry.android.internal.services.network.CurrentNetworkProvider import io.opentelemetry.android.internal.services.periodicwork.PeriodicWorkService import org.assertj.core.api.Assertions.assertThat import org.junit.Test @@ -28,6 +29,7 @@ class ServiceManagerImplTest { assertThat(serviceManager.getPeriodicWorkService()).isInstanceOf(PeriodicWorkService::class.java) assertThat(serviceManager.getCacheStorage()).isInstanceOf(CacheStorage::class.java) assertThat(serviceManager.getPreferences()).isInstanceOf(Preferences::class.java) + assertThat(serviceManager.getCurrentNetworkProvider()).isInstanceOf(CurrentNetworkProvider::class.java) } @Test diff --git a/instrumentation/network/src/test/java/io/opentelemetry/android/instrumentation/network/CarrierFinderTest.java b/android-agent/src/test/java/io/opentelemetry/android/internal/services/network/CarrierFinderTest.java similarity index 77% rename from instrumentation/network/src/test/java/io/opentelemetry/android/instrumentation/network/CarrierFinderTest.java rename to android-agent/src/test/java/io/opentelemetry/android/internal/services/network/CarrierFinderTest.java index 815e81b01..4d94d512c 100644 --- a/instrumentation/network/src/test/java/io/opentelemetry/android/instrumentation/network/CarrierFinderTest.java +++ b/android-agent/src/test/java/io/opentelemetry/android/internal/services/network/CarrierFinderTest.java @@ -3,27 +3,21 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.android.instrumentation.network; +package io.opentelemetry.android.internal.services.network; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import android.telephony.TelephonyManager; +import io.opentelemetry.android.internal.services.network.data.Carrier; import org.junit.jupiter.api.Test; class CarrierFinderTest { @Test void testSimpleGet() { - Carrier expected = - Carrier.builder() - .id(206) - .name("ShadyTel") - .isoCountryCode("US") - .mobileCountryCode("usa") - .mobileNetworkCode("omg") - .build(); + Carrier expected = new Carrier(206, "ShadyTel", "usa", "omg", "US"); TelephonyManager manager = mock(TelephonyManager.class); when(manager.getSimCarrierId()).thenReturn(expected.getId()); @@ -39,7 +33,7 @@ void testSimpleGet() { @Test void testMostlyInvalid() { - Carrier expected = Carrier.builder().build(); + Carrier expected = new Carrier(); TelephonyManager manager = mock(TelephonyManager.class); when(manager.getSimCarrierId()).thenReturn(-1); diff --git a/instrumentation/network/src/test/java/io/opentelemetry/android/instrumentation/network/CurrentNetworkProviderTest.java b/android-agent/src/test/java/io/opentelemetry/android/internal/services/network/CurrentNetworkProviderTest.java similarity index 87% rename from instrumentation/network/src/test/java/io/opentelemetry/android/instrumentation/network/CurrentNetworkProviderTest.java rename to android-agent/src/test/java/io/opentelemetry/android/internal/services/network/CurrentNetworkProviderTest.java index f9ac963d0..4c7f6a72f 100644 --- a/instrumentation/network/src/test/java/io/opentelemetry/android/instrumentation/network/CurrentNetworkProviderTest.java +++ b/android-agent/src/test/java/io/opentelemetry/android/internal/services/network/CurrentNetworkProviderTest.java @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.android.instrumentation.network; +package io.opentelemetry.android.internal.services.network; import static org.junit.Assert.assertEquals; import static org.mockito.ArgumentMatchers.any; @@ -21,6 +21,9 @@ import android.net.Network; import android.net.NetworkRequest; import android.os.Build; +import io.opentelemetry.android.internal.services.network.data.CurrentNetwork; +import io.opentelemetry.android.internal.services.network.data.NetworkState; +import io.opentelemetry.android.internal.services.network.detector.NetworkDetector; import java.util.concurrent.atomic.AtomicInteger; import org.junit.Assert; import org.junit.Test; @@ -50,8 +53,9 @@ public void lollipop() { .subType("LTE") .build()); - CurrentNetworkProvider currentNetworkProvider = new CurrentNetworkProvider(networkDetector); - currentNetworkProvider.startMonitoring(() -> networkRequest, connectivityManager); + CurrentNetworkProvider currentNetworkProvider = + new CurrentNetworkProvider(networkDetector, connectivityManager); + currentNetworkProvider.startMonitoring(() -> networkRequest); Assert.assertEquals( CurrentNetwork.builder(NetworkState.TRANSPORT_WIFI).build(), @@ -100,8 +104,9 @@ public void modernSdks() { .subType("LTE") .build()); - CurrentNetworkProvider currentNetworkProvider = new CurrentNetworkProvider(networkDetector); - currentNetworkProvider.startMonitoring(() -> networkRequest, connectivityManager); + CurrentNetworkProvider currentNetworkProvider = + new CurrentNetworkProvider(networkDetector, connectivityManager); + currentNetworkProvider.startMonitoring(() -> networkRequest); Assert.assertEquals( CurrentNetwork.builder(NetworkState.TRANSPORT_WIFI).build(), @@ -142,7 +147,8 @@ public void networkDetectorException() { NetworkDetector networkDetector = Mockito.mock(NetworkDetector.class); when(networkDetector.detectCurrentNetwork()).thenThrow(new SecurityException("bug")); - CurrentNetworkProvider currentNetworkProvider = new CurrentNetworkProvider(networkDetector); + CurrentNetworkProvider currentNetworkProvider = + new CurrentNetworkProvider(networkDetector, Mockito.mock()); Assert.assertEquals( CurrentNetworkProvider.UNKNOWN_NETWORK, currentNetworkProvider.refreshNetworkStatus()); @@ -160,9 +166,9 @@ public void networkDetectorExceptionOnCallbackRegistration() { .when(connectivityManager) .registerDefaultNetworkCallback(isA(NetworkCallback.class)); - CurrentNetworkProvider currentNetworkProvider = new CurrentNetworkProvider(networkDetector); - currentNetworkProvider.startMonitoring( - () -> mock(NetworkRequest.class), connectivityManager); + CurrentNetworkProvider currentNetworkProvider = + new CurrentNetworkProvider(networkDetector, connectivityManager); + currentNetworkProvider.startMonitoring(() -> mock(NetworkRequest.class)); Assert.assertEquals( CurrentNetwork.builder(NetworkState.TRANSPORT_WIFI).build(), currentNetworkProvider.refreshNetworkStatus()); @@ -181,8 +187,9 @@ public void networkDetectorExceptionOnCallbackRegistration_lollipop() { .when(connectivityManager) .registerNetworkCallback(eq(networkRequest), isA(NetworkCallback.class)); - CurrentNetworkProvider currentNetworkProvider = new CurrentNetworkProvider(networkDetector); - currentNetworkProvider.startMonitoring(() -> networkRequest, connectivityManager); + CurrentNetworkProvider currentNetworkProvider = + new CurrentNetworkProvider(networkDetector, connectivityManager); + currentNetworkProvider.startMonitoring(() -> networkRequest); Assert.assertEquals( CurrentNetwork.builder(NetworkState.TRANSPORT_WIFI).build(), currentNetworkProvider.refreshNetworkStatus()); @@ -204,8 +211,9 @@ public void shouldNotFailOnImmediateConnectionManagerCall_lollipop() { .when(connectivityManager) .registerNetworkCallback(eq(networkRequest), any(NetworkCallback.class)); - CurrentNetworkProvider currentNetworkProvider = new CurrentNetworkProvider(networkDetector); - currentNetworkProvider.startMonitoring(() -> networkRequest, connectivityManager); + CurrentNetworkProvider currentNetworkProvider = + new CurrentNetworkProvider(networkDetector, connectivityManager); + currentNetworkProvider.startMonitoring(() -> networkRequest); } @Test @@ -224,7 +232,8 @@ public void shouldNotFailOnImmediateConnectionManagerCall() { .when(connectivityManager) .registerDefaultNetworkCallback(any(NetworkCallback.class)); - CurrentNetworkProvider currentNetworkProvider = new CurrentNetworkProvider(networkDetector); - currentNetworkProvider.startMonitoring(() -> networkRequest, connectivityManager); + CurrentNetworkProvider currentNetworkProvider = + new CurrentNetworkProvider(networkDetector, connectivityManager); + currentNetworkProvider.startMonitoring(() -> networkRequest); } } diff --git a/instrumentation/network/src/test/java/io/opentelemetry/android/instrumentation/network/NetworkDetectorTest.java b/android-agent/src/test/java/io/opentelemetry/android/internal/services/network/detector/NetworkDetectorTest.java similarity index 93% rename from instrumentation/network/src/test/java/io/opentelemetry/android/instrumentation/network/NetworkDetectorTest.java rename to android-agent/src/test/java/io/opentelemetry/android/internal/services/network/detector/NetworkDetectorTest.java index b54150765..62aa6c6fe 100644 --- a/instrumentation/network/src/test/java/io/opentelemetry/android/instrumentation/network/NetworkDetectorTest.java +++ b/android-agent/src/test/java/io/opentelemetry/android/internal/services/network/detector/NetworkDetectorTest.java @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.android.instrumentation.network; +package io.opentelemetry.android.internal.services.network.detector; import static org.junit.Assert.assertTrue; diff --git a/instrumentation/network/src/test/java/io/opentelemetry/android/instrumentation/network/PostApi28NetworkDetectorTest.java b/android-agent/src/test/java/io/opentelemetry/android/internal/services/network/detector/PostApi28NetworkDetectorTest.java similarity index 93% rename from instrumentation/network/src/test/java/io/opentelemetry/android/instrumentation/network/PostApi28NetworkDetectorTest.java rename to android-agent/src/test/java/io/opentelemetry/android/internal/services/network/detector/PostApi28NetworkDetectorTest.java index 78507458d..7acb9bea5 100644 --- a/instrumentation/network/src/test/java/io/opentelemetry/android/instrumentation/network/PostApi28NetworkDetectorTest.java +++ b/android-agent/src/test/java/io/opentelemetry/android/internal/services/network/detector/PostApi28NetworkDetectorTest.java @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.android.instrumentation.network; +package io.opentelemetry.android.internal.services.network.detector; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.mock; @@ -15,6 +15,10 @@ import android.net.NetworkCapabilities; import android.os.Build; import android.telephony.TelephonyManager; +import io.opentelemetry.android.internal.services.network.CarrierFinder; +import io.opentelemetry.android.internal.services.network.data.Carrier; +import io.opentelemetry.android.internal.services.network.data.CurrentNetwork; +import io.opentelemetry.android.internal.services.network.data.NetworkState; import org.junit.Assert; import org.junit.Before; import org.junit.Test; @@ -129,7 +133,7 @@ public void vpn() { @Test public void carrierIsSet() { - Carrier carrier = Carrier.builder().name("flib").build(); + Carrier carrier = new Carrier(0, "flib"); when(networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)) .thenReturn(true); when(carrierFinder.get()).thenReturn(carrier); diff --git a/instrumentation/network/src/test/java/io/opentelemetry/android/instrumentation/network/SimpleNetworkDetectorTest.java b/android-agent/src/test/java/io/opentelemetry/android/internal/services/network/detector/SimpleNetworkDetectorTest.java similarity index 95% rename from instrumentation/network/src/test/java/io/opentelemetry/android/instrumentation/network/SimpleNetworkDetectorTest.java rename to android-agent/src/test/java/io/opentelemetry/android/internal/services/network/detector/SimpleNetworkDetectorTest.java index 54ca3fb98..b9c9213ab 100644 --- a/instrumentation/network/src/test/java/io/opentelemetry/android/instrumentation/network/SimpleNetworkDetectorTest.java +++ b/android-agent/src/test/java/io/opentelemetry/android/internal/services/network/detector/SimpleNetworkDetectorTest.java @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.android.instrumentation.network; +package io.opentelemetry.android.internal.services.network.detector; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; @@ -13,6 +13,8 @@ import android.net.NetworkInfo; import android.os.Build; import androidx.test.core.app.ApplicationProvider; +import io.opentelemetry.android.internal.services.network.data.CurrentNetwork; +import io.opentelemetry.android.internal.services.network.data.NetworkState; import org.junit.Assert; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/instrumentation/network/build.gradle.kts b/instrumentation/network/build.gradle.kts index 599795533..651b4afe2 100644 --- a/instrumentation/network/build.gradle.kts +++ b/instrumentation/network/build.gradle.kts @@ -21,7 +21,7 @@ android { dependencies { api(platform(libs.opentelemetry.platform)) api(libs.opentelemetry.api) - api(project(":common")) + api(project(":android-agent")) api(project(":instrumentation:common-api")) implementation(libs.androidx.core) implementation(libs.opentelemetry.semconv.incubating) diff --git a/instrumentation/network/src/main/java/io/opentelemetry/android/instrumentation/network/Carrier.java b/instrumentation/network/src/main/java/io/opentelemetry/android/instrumentation/network/Carrier.java deleted file mode 100644 index 4328d1710..000000000 --- a/instrumentation/network/src/main/java/io/opentelemetry/android/instrumentation/network/Carrier.java +++ /dev/null @@ -1,132 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.android.instrumentation.network; - -import android.os.Build; -import android.telephony.TelephonyManager; -import androidx.annotation.Nullable; -import androidx.annotation.RequiresApi; -import java.util.Objects; - -@RequiresApi(api = Build.VERSION_CODES.P) -final class Carrier { - - private final int id; - private final @Nullable String name; - private final @Nullable String mobileCountryCode; // 3 digits - private final @Nullable String mobileNetworkCode; // 2 or 3 digits - private final @Nullable String isoCountryCode; - - static Builder builder() { - return new Builder(); - } - - Carrier(Builder builder) { - this.id = builder.id; - this.name = builder.name; - this.mobileCountryCode = builder.mobileCountryCode; - this.mobileNetworkCode = builder.mobileNetworkCode; - this.isoCountryCode = builder.isoCountryCode; - } - - int getId() { - return id; - } - - @Nullable - String getName() { - return name; - } - - @Nullable - String getMobileCountryCode() { - return mobileCountryCode; - } - - @Nullable - String getMobileNetworkCode() { - return mobileNetworkCode; - } - - @Nullable - String getIsoCountryCode() { - return isoCountryCode; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - Carrier carrier = (Carrier) o; - return id == carrier.id - && Objects.equals(name, carrier.name) - && Objects.equals(mobileCountryCode, carrier.mobileCountryCode) - && Objects.equals(mobileNetworkCode, carrier.mobileNetworkCode) - && Objects.equals(isoCountryCode, carrier.isoCountryCode); - } - - @Override - public int hashCode() { - return Objects.hash(id, name, mobileCountryCode, mobileNetworkCode, isoCountryCode); - } - - @Override - public String toString() { - return "Carrier{" - + "id=" - + id - + ", name='" - + name - + '\'' - + ", mobileCountryCode='" - + mobileCountryCode - + '\'' - + ", mobileNetworkCode='" - + mobileNetworkCode - + '\'' - + ", isoCountryCode='" - + isoCountryCode - + '\'' - + '}'; - } - - static class Builder { - private int id = TelephonyManager.UNKNOWN_CARRIER_ID; - private @Nullable String name = null; - private @Nullable String mobileCountryCode = null; - private @Nullable String mobileNetworkCode = null; - private @Nullable String isoCountryCode = null; - - Carrier build() { - return new Carrier(this); - } - - Builder id(int id) { - this.id = id; - return this; - } - - Builder name(String name) { - this.name = name; - return this; - } - - Builder mobileCountryCode(String countryCode) { - this.mobileCountryCode = countryCode; - return this; - } - - Builder mobileNetworkCode(String networkCode) { - this.mobileNetworkCode = networkCode; - return this; - } - - Builder isoCountryCode(String isoCountryCode) { - this.isoCountryCode = isoCountryCode; - return this; - } - } -} diff --git a/instrumentation/network/src/main/java/io/opentelemetry/android/instrumentation/network/CarrierFinder.java b/instrumentation/network/src/main/java/io/opentelemetry/android/instrumentation/network/CarrierFinder.java deleted file mode 100644 index 9bb68e07b..000000000 --- a/instrumentation/network/src/main/java/io/opentelemetry/android/instrumentation/network/CarrierFinder.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.android.instrumentation.network; - -import android.os.Build; -import android.telephony.TelephonyManager; -import androidx.annotation.RequiresApi; - -@RequiresApi(api = Build.VERSION_CODES.P) -class CarrierFinder { - - private final TelephonyManager telephonyManager; - - CarrierFinder(TelephonyManager telephonyManager) { - this.telephonyManager = telephonyManager; - } - - Carrier get() { - Carrier.Builder builder = Carrier.builder(); - int id = telephonyManager.getSimCarrierId(); - builder.id(id); - CharSequence name = telephonyManager.getSimCarrierIdName(); - if (validString(name)) { - builder.name(name.toString()); - } - String simOperator = telephonyManager.getSimOperator(); - if (validString(simOperator) && simOperator.length() >= 5) { - String countryCode = simOperator.substring(0, 3); - String networkCode = simOperator.substring(3); - builder.mobileCountryCode(countryCode).mobileNetworkCode(networkCode); - } - String isoCountryCode = telephonyManager.getSimCountryIso(); - if (validString(isoCountryCode)) { - builder.isoCountryCode(isoCountryCode); - } - return builder.build(); - } - - private boolean validString(CharSequence str) { - return !(str == null || str.length() == 0); - } -} diff --git a/instrumentation/network/src/main/java/io/opentelemetry/android/instrumentation/network/NetworkApplicationListener.java b/instrumentation/network/src/main/java/io/opentelemetry/android/instrumentation/network/NetworkApplicationListener.java index 06a33614c..35ba330ef 100644 --- a/instrumentation/network/src/main/java/io/opentelemetry/android/instrumentation/network/NetworkApplicationListener.java +++ b/instrumentation/network/src/main/java/io/opentelemetry/android/instrumentation/network/NetworkApplicationListener.java @@ -8,6 +8,9 @@ import static io.opentelemetry.api.common.AttributeKey.stringKey; import io.opentelemetry.android.instrumentation.common.ApplicationStateListener; +import io.opentelemetry.android.internal.services.network.CurrentNetworkProvider; +import io.opentelemetry.android.internal.services.network.NetworkChangeListener; +import io.opentelemetry.android.internal.services.network.data.CurrentNetwork; import io.opentelemetry.api.common.AttributeKey; import io.opentelemetry.context.Context; import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; diff --git a/instrumentation/network/src/main/java/io/opentelemetry/android/instrumentation/network/NetworkChangeAttributesExtractor.java b/instrumentation/network/src/main/java/io/opentelemetry/android/instrumentation/network/NetworkChangeAttributesExtractor.java index c003352ec..47c50e857 100644 --- a/instrumentation/network/src/main/java/io/opentelemetry/android/instrumentation/network/NetworkChangeAttributesExtractor.java +++ b/instrumentation/network/src/main/java/io/opentelemetry/android/instrumentation/network/NetworkChangeAttributesExtractor.java @@ -8,6 +8,9 @@ import static io.opentelemetry.api.common.AttributeKey.stringKey; import static io.opentelemetry.semconv.incubating.NetworkIncubatingAttributes.NETWORK_CONNECTION_TYPE; +import io.opentelemetry.android.internal.features.networkattrs.CurrentNetworkAttributesExtractor; +import io.opentelemetry.android.internal.services.network.data.CurrentNetwork; +import io.opentelemetry.android.internal.services.network.data.NetworkState; import io.opentelemetry.api.common.AttributeKey; import io.opentelemetry.api.common.AttributesBuilder; import io.opentelemetry.context.Context; diff --git a/instrumentation/network/src/main/java/io/opentelemetry/android/instrumentation/network/NetworkChangeInstrumentation.java b/instrumentation/network/src/main/java/io/opentelemetry/android/instrumentation/network/NetworkChangeInstrumentation.java new file mode 100644 index 000000000..c3b6c3147 --- /dev/null +++ b/instrumentation/network/src/main/java/io/opentelemetry/android/instrumentation/network/NetworkChangeInstrumentation.java @@ -0,0 +1,41 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.android.instrumentation.network; + +import android.app.Application; +import androidx.annotation.NonNull; +import io.opentelemetry.android.OpenTelemetryRum; +import io.opentelemetry.android.instrumentation.AndroidInstrumentation; +import io.opentelemetry.android.internal.services.ServiceManager; +import io.opentelemetry.android.internal.services.network.data.CurrentNetwork; +import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +/** Generates telemetry for when the network status changes. */ +public final class NetworkChangeInstrumentation implements AndroidInstrumentation { + + final List> additionalExtractors = new ArrayList<>(); + + /** Adds an {@link AttributesExtractor} that will extract additional attributes. */ + public NetworkChangeInstrumentation addAttributesExtractor( + AttributesExtractor extractor) { + additionalExtractors.add(extractor); + return this; + } + + @Override + public void install( + @NonNull Application application, @NonNull OpenTelemetryRum openTelemetryRum) { + NetworkChangeMonitor networkChangeMonitor = + new NetworkChangeMonitor( + openTelemetryRum.getOpenTelemetry(), + ServiceManager.get().getCurrentNetworkProvider(), + Collections.unmodifiableList(additionalExtractors)); + networkChangeMonitor.start(); + } +} diff --git a/instrumentation/network/src/main/java/io/opentelemetry/android/instrumentation/network/NetworkChangeListener.java b/instrumentation/network/src/main/java/io/opentelemetry/android/instrumentation/network/NetworkChangeListener.java deleted file mode 100644 index 81e0255e8..000000000 --- a/instrumentation/network/src/main/java/io/opentelemetry/android/instrumentation/network/NetworkChangeListener.java +++ /dev/null @@ -1,11 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.android.instrumentation.network; - -interface NetworkChangeListener { - - void onNetworkChange(CurrentNetwork currentNetwork); -} diff --git a/instrumentation/network/src/main/java/io/opentelemetry/android/instrumentation/network/NetworkChangeMonitor.java b/instrumentation/network/src/main/java/io/opentelemetry/android/instrumentation/network/NetworkChangeMonitor.java index be2cfb73e..331916f51 100644 --- a/instrumentation/network/src/main/java/io/opentelemetry/android/instrumentation/network/NetworkChangeMonitor.java +++ b/instrumentation/network/src/main/java/io/opentelemetry/android/instrumentation/network/NetworkChangeMonitor.java @@ -5,11 +5,11 @@ package io.opentelemetry.android.instrumentation.network; -import io.opentelemetry.android.instrumentation.common.InstrumentedApplication; +import io.opentelemetry.android.internal.services.network.CurrentNetworkProvider; +import io.opentelemetry.android.internal.services.network.data.CurrentNetwork; import io.opentelemetry.api.OpenTelemetry; import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor; import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; -import java.util.ArrayList; import java.util.List; /** @@ -19,34 +19,30 @@ * time. */ public final class NetworkChangeMonitor { - - public static NetworkChangeMonitor create(CurrentNetworkProvider currentNetworkProvider) { - return builder(currentNetworkProvider).build(); - } - - public static NetworkChangeMonitorBuilder builder( - CurrentNetworkProvider currentNetworkProvider) { - return new NetworkChangeMonitorBuilder(currentNetworkProvider); + private final OpenTelemetry openTelemetry; + + public NetworkChangeMonitor( + OpenTelemetry openTelemetry, + CurrentNetworkProvider currentNetworkProvider, + List> additionalExtractors) { + this.openTelemetry = openTelemetry; + this.currentNetworkProvider = currentNetworkProvider; + this.additionalExtractors = additionalExtractors; } private final CurrentNetworkProvider currentNetworkProvider; private final List> additionalExtractors; - NetworkChangeMonitor(NetworkChangeMonitorBuilder builder) { - this.currentNetworkProvider = builder.currentNetworkProvider; - this.additionalExtractors = new ArrayList<>(builder.additionalExtractors); - } - /** - * Installs the network change monitoring instrumentation on the given {@link - * InstrumentedApplication}. + * Installs the network change monitoring instrumentation on the given {@link OpenTelemetry}. */ - public void installOn(InstrumentedApplication instrumentedApplication) { + public void start() { NetworkApplicationListener networkApplicationListener = new NetworkApplicationListener(currentNetworkProvider); - networkApplicationListener.startMonitoring( - buildInstrumenter(instrumentedApplication.getOpenTelemetrySdk())); - instrumentedApplication.registerApplicationStateListener(networkApplicationListener); + networkApplicationListener.startMonitoring(buildInstrumenter(openTelemetry)); + // + // instrumentedApplication.registerApplicationStateListener(networkApplicationListener); + // TODO uncomment in part 3 } private Instrumenter buildInstrumenter(OpenTelemetry openTelemetry) { diff --git a/instrumentation/network/src/main/java/io/opentelemetry/android/instrumentation/network/NetworkChangeMonitorBuilder.java b/instrumentation/network/src/main/java/io/opentelemetry/android/instrumentation/network/NetworkChangeMonitorBuilder.java deleted file mode 100644 index c5c3f69fe..000000000 --- a/instrumentation/network/src/main/java/io/opentelemetry/android/instrumentation/network/NetworkChangeMonitorBuilder.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.android.instrumentation.network; - -import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor; -import java.util.ArrayList; -import java.util.List; - -/** - * A builder of {@link NetworkChangeMonitor}. - * - *

This class is internal and not for public use. Its APIs are unstable and can change at any - * time. - */ -public final class NetworkChangeMonitorBuilder { - - final CurrentNetworkProvider currentNetworkProvider; - final List> additionalExtractors = new ArrayList<>(); - - NetworkChangeMonitorBuilder(CurrentNetworkProvider currentNetworkProvider) { - this.currentNetworkProvider = currentNetworkProvider; - } - - /** Adds an {@link AttributesExtractor} that will extract additional attributes. */ - public NetworkChangeMonitorBuilder addAttributesExtractor( - AttributesExtractor extractor) { - additionalExtractors.add(extractor); - return this; - } - - public NetworkChangeMonitor build() { - return new NetworkChangeMonitor(this); - } -} diff --git a/instrumentation/network/src/test/java/io/opentelemetry/android/instrumentation/network/NetworkChangeMonitorTest.java b/instrumentation/network/src/test/java/io/opentelemetry/android/instrumentation/network/NetworkChangeMonitorTest.java index b39feeca9..8e246b6ca 100644 --- a/instrumentation/network/src/test/java/io/opentelemetry/android/instrumentation/network/NetworkChangeMonitorTest.java +++ b/instrumentation/network/src/test/java/io/opentelemetry/android/instrumentation/network/NetworkChangeMonitorTest.java @@ -16,17 +16,21 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertTrue; import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; import android.os.Build; import io.opentelemetry.android.instrumentation.common.ApplicationStateListener; -import io.opentelemetry.android.instrumentation.common.InstrumentedApplication; -import io.opentelemetry.sdk.OpenTelemetrySdk; +import io.opentelemetry.android.internal.services.network.CurrentNetworkProvider; +import io.opentelemetry.android.internal.services.network.NetworkChangeListener; +import io.opentelemetry.android.internal.services.network.data.Carrier; +import io.opentelemetry.android.internal.services.network.data.CurrentNetwork; +import io.opentelemetry.android.internal.services.network.data.NetworkState; import io.opentelemetry.sdk.testing.junit4.OpenTelemetryRule; import io.opentelemetry.sdk.trace.data.SpanData; +import java.util.Collections; import java.util.List; import org.junit.After; import org.junit.Before; +import org.junit.Ignore; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; @@ -47,15 +51,12 @@ public class NetworkChangeMonitorTest { @Captor ArgumentCaptor networkChangeListenerCaptor; @Mock CurrentNetworkProvider currentNetworkProvider; - @Mock InstrumentedApplication instrumentedApplication; AutoCloseable mocks; @Before public void setUp() { mocks = MockitoAnnotations.openMocks(this); - when(instrumentedApplication.getOpenTelemetrySdk()) - .thenReturn((OpenTelemetrySdk) otelTesting.getOpenTelemetry()); } @After @@ -65,7 +66,7 @@ public void tearDown() throws Exception { @Test public void networkAvailable_wifi() { - NetworkChangeMonitor.create(currentNetworkProvider).installOn(instrumentedApplication); + create().start(); verify(currentNetworkProvider) .addNetworkChangeListener(networkChangeListenerCaptor.capture()); @@ -84,7 +85,7 @@ public void networkAvailable_wifi() { @Test public void networkAvailable_cellular() { - NetworkChangeMonitor.create(currentNetworkProvider).installOn(instrumentedApplication); + create().start(); verify(currentNetworkProvider) .addNetworkChangeListener(networkChangeListenerCaptor.capture()); @@ -93,14 +94,7 @@ public void networkAvailable_cellular() { CurrentNetwork network = CurrentNetwork.builder(NetworkState.TRANSPORT_CELLULAR) .subType("LTE") - .carrier( - Carrier.builder() - .id(206) - .name("ShadyTel") - .isoCountryCode("US") - .mobileCountryCode("usa") - .mobileNetworkCode("omg") - .build()) + .carrier(new Carrier(206, "ShadyTel", "usa", "omg", "US")) .build(); listener.onNetworkChange(network); @@ -121,7 +115,7 @@ public void networkAvailable_cellular() { @Test public void networkLost() { - NetworkChangeMonitor.create(currentNetworkProvider).installOn(instrumentedApplication); + create().start(); verify(currentNetworkProvider) .addNetworkChangeListener(networkChangeListenerCaptor.capture()); @@ -139,15 +133,18 @@ public void networkLost() { } @Test + @Ignore("Reintroduce in part 3") public void noEventsPlease() { - NetworkChangeMonitor.create(currentNetworkProvider).installOn(instrumentedApplication); + create().start(); verify(currentNetworkProvider) .addNetworkChangeListener(networkChangeListenerCaptor.capture()); NetworkChangeListener networkListener = networkChangeListenerCaptor.getValue(); - verify(instrumentedApplication) - .registerApplicationStateListener(applicationStateListenerCaptor.capture()); + // verify(instrumentedApplication) + // + // .registerApplicationStateListener(applicationStateListenerCaptor.capture()); TODO + // uncomment in part 3 ApplicationStateListener applicationListener = applicationStateListenerCaptor.getValue(); applicationListener.onApplicationBackgrounded(); @@ -165,4 +162,9 @@ public void noEventsPlease() { CurrentNetwork.builder(NetworkState.NO_NETWORK_AVAILABLE).build()); assertEquals(1, otelTesting.getSpans().size()); } + + private NetworkChangeMonitor create() { + return new NetworkChangeMonitor( + otelTesting.getOpenTelemetry(), currentNetworkProvider, Collections.emptyList()); + } }