Skip to content

Commit

Permalink
General enhancements (#384)
Browse files Browse the repository at this point in the history
* Enhancing default processor factory

* Canceling gate timeout tasks

* Clean up

* Setting global apm server connectivity config

* Using context compat to test permission

* Preparing to support network change for different api levels

* Renaming

* Delegating providing network type

* Creating NetworkApi23QueryManager

* Providing network capabilities

* Created NetworkApi21QueryManager

* Updating NetworkApi21QueryManager

* Choosing proper NetworkQueryManager

* Adding header

* Updating docs and tests for 21 compatibility support

* Setting kotlin jvm-default=all

* Setting kotlin jvm-default=all for java libs

* Clean up

* Clean up

* Updating dependencies

* Replacing deprecated semconv fields
  • Loading branch information
LikeTheSalad authored Jan 28, 2025
1 parent 306c5da commit 5232147
Show file tree
Hide file tree
Showing 42 changed files with 569 additions and 191 deletions.
2 changes: 1 addition & 1 deletion NOTICE
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,9 @@ Copyright 2018-2022 Elasticsearch B.V.

This product includes software licensed under the 'Apache License Version 2.0' license from the following sources:

- Android Support Library Annotations (https://developer.android.com/jetpack/androidx/releases/annotation#1.4.0)
- Byte Buddy (without dependencies)
- Byte Buddy Gradle plugin
- Core (https://developer.android.com/jetpack/androidx/releases/core#1.15.0)
- Kotlin Stdlib (https://kotlinlang.org/)
- OpenTelemetry Java (https://github.com/open-telemetry/opentelemetry-java)
- OpenTelemetry Java Contrib (https://github.com/open-telemetry/opentelemetry-java-contrib)
Expand Down
2 changes: 1 addition & 1 deletion android-api/metadata/notice.properties
Original file line number Diff line number Diff line change
@@ -1 +1 @@
dependencies.hash=C4EDFC20A44F37F2CBB62F2446E01DA8
dependencies.hash=1E17F5641C5CF6F9415E423B7E4DAFF4
2 changes: 1 addition & 1 deletion android-common/metadata/notice.properties
Original file line number Diff line number Diff line change
@@ -1 +1 @@
dependencies.hash=067D73F0C266736CAADED6F77C2EC811
dependencies.hash=A88DCE3A12A459568879FBD82058DF9A
1 change: 0 additions & 1 deletion android-common/src/main/resources/META-INF/NOTICE
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@ Copyright 2018-2022 Elasticsearch B.V.

This product includes software licensed under the 'Apache License Version 2.0' license from the following sources:

- Android Support Library Annotations (https://developer.android.com/jetpack/androidx/releases/annotation#1.4.0)
- Kotlin Stdlib (https://kotlinlang.org/)

-------------------------------------------------------------------------------
Expand Down
10 changes: 0 additions & 10 deletions android-plugin/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -14,16 +14,6 @@ dependencies {
buildConfig {
packageName("${group}.generated")
buildConfigField("String", "SDK_DEPENDENCY_URI", "\"$group:android-sdk:$version\"")
buildConfigField(
"String",
"OTEL_OKHTTP_LIBRARY_URI",
"\"${libs.opentelemetry.android.okhttpLib.get()}\""
)
buildConfigField(
"String",
"OTEL_OKHTTP_AGENT_URI",
"\"${libs.opentelemetry.android.okhttpAgent.get()}\""
)
}

licensesConfig {
Expand Down
2 changes: 1 addition & 1 deletion android-plugin/metadata/notice.properties
Original file line number Diff line number Diff line change
@@ -1 +1 @@
dependencies.hash=902A29423B971754030D7233FFCAA958
dependencies.hash=88FF60992EFCED0C408A073B7361D003
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,6 @@ internal class ApmAndroidAgentPlugin : Plugin<Project> {
Elog.init(GradleLoggerFactory())
addByteBuddyPlugin()
addSdkDependency()
addInstrumentationDependency()
}

private fun addByteBuddyPlugin() {
Expand All @@ -43,9 +42,4 @@ internal class ApmAndroidAgentPlugin : Plugin<Project> {
private fun addSdkDependency() {
project.dependencies.add("implementation", BuildConfig.SDK_DEPENDENCY_URI)
}

private fun addInstrumentationDependency() {
project.dependencies.add("implementation", BuildConfig.OTEL_OKHTTP_LIBRARY_URI)
project.dependencies.add("byteBuddy", BuildConfig.OTEL_OKHTTP_AGENT_URI)
}
}
3 changes: 2 additions & 1 deletion android-sdk/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -30,9 +30,10 @@ dependencies {
implementation(libs.stagemonitor.configuration)
implementation(project(":android-common"))
implementation(libs.opentelemetry.exporter.otlp)
implementation(libs.opentelemetry.semconv)
implementation(libs.bundles.opentelemetry.semconv)
implementation(libs.opentelemetry.diskBuffering)
implementation(libs.androidx.annotations)
implementation(libs.androidx.core)
implementation(libs.dsl.json)
testImplementation(libs.wireMock)
testImplementation(libs.opentelemetry.testing)
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=AB9B95B767BE37A6FD85815FAEBD0F3F
dependencies.hash=599652E88D43F2C4A92843B10443411F
Original file line number Diff line number Diff line change
Expand Up @@ -24,10 +24,11 @@ import co.elastic.otel.android.exporters.ExporterProvider
import co.elastic.otel.android.exporters.configuration.ExportProtocol
import co.elastic.otel.android.features.apmserver.ApmServerAuthentication
import co.elastic.otel.android.features.apmserver.ApmServerConnectivity
import co.elastic.otel.android.features.apmserver.ApmServerConnectivityManager
import co.elastic.otel.android.interceptor.Interceptor
import co.elastic.otel.android.internal.api.ManagedElasticOtelAgent
import co.elastic.otel.android.internal.features.apmserver.ApmServerConnectivityManager
import co.elastic.otel.android.internal.features.apmserver.ApmServerExporterProvider
import co.elastic.otel.android.internal.features.centralconfig.CentralConfigurationConnectivity
import co.elastic.otel.android.internal.features.centralconfig.CentralConfigurationManager
import co.elastic.otel.android.internal.features.clock.ElasticClockManager
import co.elastic.otel.android.internal.features.conditionaldrop.ConditionalDropManager
Expand Down Expand Up @@ -72,7 +73,20 @@ class ElasticApmAgent private constructor(
return openTelemetry
}

fun getApmServerConnectivityManager(): ApmServerConnectivityManager {
fun setApmServerConnectivity(connectivity: ApmServerConnectivity) {
apmServerConnectivityManager.setConnectivityConfiguration(connectivity)
val currentCentralConnectivityConfig =
centralConfigurationManager.getConnectivityConfiguration()
centralConfigurationManager.setConnectivityConfiguration(
CentralConfigurationConnectivity.fromApmServerConfig(
currentCentralConnectivityConfig.serviceName,
currentCentralConnectivityConfig.serviceDeployment,
connectivity
)
)
}

internal fun getApmServerConnectivityManager(): ApmServerConnectivityManager {
return apmServerConnectivityManager
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ import co.elastic.otel.android.internal.services.network.data.NetworkType
import co.elastic.otel.android.session.SessionProvider
import io.opentelemetry.api.common.AttributeKey
import io.opentelemetry.api.common.Attributes
import io.opentelemetry.semconv.SemanticAttributes
import io.opentelemetry.semconv.incubating.NetworkIncubatingAttributes

internal class CommonAttributesInterceptor(
private val serviceManager: ServiceManager,
Expand All @@ -39,13 +39,13 @@ internal class CommonAttributesInterceptor(
val builder = Attributes.builder().putAll(item)
val networkType = networkService.getType()

builder.put(SemanticAttributes.NETWORK_CONNECTION_TYPE, networkType.name)
builder.put(NetworkIncubatingAttributes.NETWORK_CONNECTION_TYPE, networkType.name)
sessionProvider.getSession()?.getId()?.let { builder.put(SESSION_ID_ATTRIBUTE_KEY, it) }

if (networkType is NetworkType.Cell) {
networkType.subTypeName?.let {
builder.put(
SemanticAttributes.NETWORK_CONNECTION_SUBTYPE,
NetworkIncubatingAttributes.NETWORK_CONNECTION_SUBTYPE,
it
)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ import co.elastic.otel.android.internal.services.ServiceManager
import co.elastic.otel.android.internal.services.network.NetworkService
import io.opentelemetry.api.common.AttributeKey
import io.opentelemetry.api.common.Attributes
import io.opentelemetry.semconv.SemanticAttributes
import io.opentelemetry.semconv.incubating.NetworkIncubatingAttributes

internal class SpanAttributesInterceptor(serviceManager: ServiceManager) : Interceptor<Attributes> {
private val networkService: NetworkService by lazy {
Expand All @@ -37,10 +37,10 @@ internal class SpanAttributesInterceptor(serviceManager: ServiceManager) : Inter
builder.put(TRANSACTION_TYPE_ATTRIBUTE_KEY, TRANSACTION_TYPE_VALUE)

if (carrierInfo != null) {
builder.put(SemanticAttributes.NETWORK_CARRIER_NAME, carrierInfo.name)
builder.put(SemanticAttributes.NETWORK_CARRIER_MCC, carrierInfo.mcc)
builder.put(SemanticAttributes.NETWORK_CARRIER_MNC, carrierInfo.mnc)
builder.put(SemanticAttributes.NETWORK_CARRIER_ICC, carrierInfo.icc)
builder.put(NetworkIncubatingAttributes.NETWORK_CARRIER_NAME, carrierInfo.name)
builder.put(NetworkIncubatingAttributes.NETWORK_CARRIER_MCC, carrierInfo.mcc)
builder.put(NetworkIncubatingAttributes.NETWORK_CARRIER_MNC, carrierInfo.mnc)
builder.put(NetworkIncubatingAttributes.NETWORK_CARRIER_ICC, carrierInfo.icc)
}

return builder.build()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -50,10 +50,6 @@ internal open class ConnectivityConfigurationHolder(initialValue: ConnectivityCo
listeners.addIfAbsent(listener)
}

fun removeListener(listener: Listener) = synchronized(setLock) {
listeners.remove(listener)
}

interface Listener {
fun onConnectivityConfigurationChange()
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,11 +16,12 @@
* specific language governing permissions and limitations
* under the License.
*/
package co.elastic.otel.android.features.apmserver
package co.elastic.otel.android.internal.features.apmserver

import co.elastic.otel.android.features.apmserver.ApmServerConnectivity
import co.elastic.otel.android.internal.connectivity.ConnectivityConfigurationHolder

class ApmServerConnectivityManager internal constructor(
internal class ApmServerConnectivityManager internal constructor(
private val connectivityConfigurationHolder: ConnectivityHolder
) {
fun setConnectivityConfiguration(configuration: ApmServerConnectivity) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@ package co.elastic.otel.android.internal.features.apmserver
import co.elastic.otel.android.exporters.ExporterProvider
import co.elastic.otel.android.exporters.configuration.ExporterConfiguration
import co.elastic.otel.android.features.apmserver.ApmServerConnectivity
import co.elastic.otel.android.features.apmserver.ApmServerConnectivityManager
import co.elastic.otel.android.internal.connectivity.ConnectivityConfigurationHolder
import co.elastic.otel.android.internal.opentelemetry.exporters.configurable.ConfigurableExporterProvider
import co.elastic.otel.android.provider.Provider
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,8 @@ package co.elastic.otel.android.internal.features.centralconfig

import androidx.annotation.WorkerThread
import co.elastic.otel.android.common.internal.logging.Elog
import co.elastic.otel.android.features.apmserver.ApmServerConnectivityManager
import co.elastic.otel.android.internal.connectivity.ConnectivityConfigurationHolder
import co.elastic.otel.android.internal.features.apmserver.ApmServerConnectivityManager
import co.elastic.otel.android.internal.features.exportergate.ExporterGateManager
import co.elastic.otel.android.internal.services.ServiceManager
import co.elastic.otel.android.internal.time.SystemTimeProvider
Expand All @@ -45,7 +45,6 @@ internal class CentralConfigurationManager private constructor(
}

fun setConnectivityConfiguration(configuration: CentralConfigurationConnectivity) {
connectivityHolder.unlinkFromExportersConfig()
connectivityHolder.set(configuration)
}

Expand Down Expand Up @@ -145,44 +144,24 @@ internal class CentralConfigurationManager private constructor(
}

internal class ConnectivityHolder(
connectivity: CentralConfigurationConnectivity,
private val apmServerConnectivityHolder: ApmServerConnectivityManager.ConnectivityHolder,
private val serviceName: String,
private val serviceDeployment: String?
) : ConnectivityConfigurationHolder(connectivity), ConnectivityConfigurationHolder.Listener {
connectivity: CentralConfigurationConnectivity
) : ConnectivityConfigurationHolder(connectivity) {

companion object {
fun fromApmServerConfig(
serviceName: String,
serviceDeployment: String?,
apmServerConfigurationManager: ApmServerConnectivityManager.ConnectivityHolder
): ConnectivityHolder {
val instance = ConnectivityHolder(
return ConnectivityHolder(
CentralConfigurationConnectivity.fromApmServerConfig(
serviceName,
serviceDeployment,
apmServerConfigurationManager.getConnectivityConfiguration()
), apmServerConfigurationManager, serviceName, serviceDeployment
)
)
apmServerConfigurationManager.addListener(instance)
return instance
}
}

internal fun unlinkFromExportersConfig() {
apmServerConnectivityHolder.removeListener(this)
}

override fun onConnectivityConfigurationChange() {
// On apm server exporters config change.
set(
CentralConfigurationConnectivity.fromApmServerConfig(
serviceName,
serviceDeployment,
apmServerConnectivityHolder.getConnectivityConfiguration()
)
)
}
}

override fun onConfigChange() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ import io.opentelemetry.sdk.metrics.data.MetricData
import io.opentelemetry.sdk.metrics.export.MetricExporter
import io.opentelemetry.sdk.trace.data.SpanData
import io.opentelemetry.sdk.trace.export.SpanExporter
import java.util.concurrent.ScheduledFuture
import java.util.concurrent.TimeUnit
import java.util.concurrent.atomic.AtomicBoolean

Expand Down Expand Up @@ -60,6 +61,9 @@ internal class ExporterGateManager(
private val spanGateOpen = AtomicBoolean(false)
private val logGateOpen = AtomicBoolean(false)
private val metricGateOpen = AtomicBoolean(false)
private var spanTimeoutTask: ScheduledFuture<*>? = null
private var logTimeoutTask: ScheduledFuture<*>? = null
private var metricTimeoutTask: ScheduledFuture<*>? = null

companion object {
private const val SPAN_QUEUE_ID = 1
Expand Down Expand Up @@ -129,6 +133,8 @@ internal class ExporterGateManager(
}

private fun onSpanGateOpen() {
spanTimeoutTask?.cancel(false)
spanTimeoutTask = null
spanExporter.setDelegate(delegateSpanExporter)
backgroundWorkService.submit {
val items = spanGateQueue.getEnqueuedItems()
Expand All @@ -141,6 +147,8 @@ internal class ExporterGateManager(
}

private fun onLogRecordGateOpen() {
logTimeoutTask?.cancel(false)
logTimeoutTask = null
logRecordExporter.setDelegate(delegateLogRecordExporter)
backgroundWorkService.submit {
val items = logRecordGateQueue.getEnqueuedItems()
Expand All @@ -153,6 +161,8 @@ internal class ExporterGateManager(
}

private fun onMetricGateOpen() {
metricTimeoutTask?.cancel(false)
metricTimeoutTask = null
metricExporter.setDelegate(delegateMetricExporter)
backgroundWorkService.submit {
val items = metricGateQueue.getEnqueuedItems()
Expand All @@ -165,19 +175,19 @@ internal class ExporterGateManager(
}

private fun onSpanQueueStarted() {
backgroundWorkService.scheduleOnce(gateLatchTimeout) {
spanTimeoutTask = backgroundWorkService.scheduleOnce(gateLatchTimeout) {
spanGateQueue.forceOpenGate("Timeout")
}
}

private fun onLogRecordQueueStarted() {
backgroundWorkService.scheduleOnce(gateLatchTimeout) {
logTimeoutTask = backgroundWorkService.scheduleOnce(gateLatchTimeout) {
logRecordGateQueue.forceOpenGate("Timeout")
}
}

private fun onMetricQueueStarted() {
backgroundWorkService.scheduleOnce(gateLatchTimeout) {
metricTimeoutTask = backgroundWorkService.scheduleOnce(gateLatchTimeout) {
metricGateQueue.forceOpenGate("Timeout")
}
}
Expand Down
Loading

0 comments on commit 5232147

Please sign in to comment.