Skip to content

Commit

Permalink
RUMM-2138 make SDK Features simple classes
Browse files Browse the repository at this point in the history
  • Loading branch information
xgouchet committed May 9, 2022
1 parent fbcc3d1 commit ca7a978
Show file tree
Hide file tree
Showing 53 changed files with 821 additions and 858 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@
* Copyright 2016-Present Datadog, Inc.
*/

@file:Suppress("DEPRECATION")

package com.datadog.android.ndk

import android.util.Log
Expand Down
6 changes: 5 additions & 1 deletion dd-sdk-android/apiSurface
Original file line number Diff line number Diff line change
Expand Up @@ -280,7 +280,7 @@ data class com.datadog.android.log.model.LogEvent
fun fromJson(kotlin.String): Status
data class com.datadog.android.plugin.DatadogContext
constructor(DatadogRumContext? = null)
interface com.datadog.android.plugin.DatadogPlugin : com.datadog.android.privacy.TrackingConsentProviderCallback
DEPRECATED interface com.datadog.android.plugin.DatadogPlugin : com.datadog.android.privacy.TrackingConsentProviderCallback
fun register(DatadogPluginConfig)
fun unregister()
fun onContextChanged(DatadogContext)
Expand Down Expand Up @@ -1502,6 +1502,8 @@ interface com.datadog.android.v2.api.SDKCore
fun setTrackingConsent(com.datadog.android.privacy.TrackingConsent)
fun setUserInfo(com.datadog.android.core.model.UserInfo)
fun stop()
fun clearAllData()
fun flushStoredData()
interface com.datadog.android.v2.api.SDKFeature
interface com.datadog.android.v2.api.SDKFeatureConfiguration
fun register(SDKCore)
Expand All @@ -1516,7 +1518,9 @@ class com.datadog.android.v2.core.DatadogCore : com.datadog.android.v2.api.SDKCo
override fun getVerbosity(): Int
override fun setTrackingConsent(com.datadog.android.privacy.TrackingConsent)
override fun setUserInfo(com.datadog.android.core.model.UserInfo)
override fun clearAllData()
override fun stop()
override fun flushStoredData()
companion object
class com.datadog.android.webview.DatadogEventBridge
constructor()
Expand Down
32 changes: 6 additions & 26 deletions dd-sdk-android/src/main/kotlin/com/datadog/android/Datadog.kt
Original file line number Diff line number Diff line change
Expand Up @@ -9,22 +9,15 @@ package com.datadog.android
import android.content.Context
import com.datadog.android.core.configuration.Configuration
import com.datadog.android.core.configuration.Credentials
import com.datadog.android.core.internal.CoreFeature
import com.datadog.android.core.internal.utils.devLogger
import com.datadog.android.core.model.UserInfo
import com.datadog.android.error.internal.CrashReportsFeature
import com.datadog.android.log.internal.LogsFeature
import com.datadog.android.privacy.TrackingConsent
import com.datadog.android.rum.GlobalRum
import com.datadog.android.rum.internal.RumFeature
import com.datadog.android.rum.internal.monitor.DatadogRumMonitor
import com.datadog.android.tracing.internal.TracingFeature
import com.datadog.android.v2.api.NoOpSDKCore
import com.datadog.android.v2.api.SDKCore
import com.datadog.android.v2.core.DatadogCore
import com.datadog.android.webview.internal.log.WebViewLogsFeature
import com.datadog.android.webview.internal.rum.WebViewRumFeature
import java.lang.IllegalArgumentException
import java.util.concurrent.atomic.AtomicBoolean

/**
Expand All @@ -33,7 +26,7 @@ import java.util.concurrent.atomic.AtomicBoolean
@Suppress("TooManyFunctions")
object Datadog {

private var globalSDKCore: SDKCore = NoOpSDKCore()
internal var globalSDKCore: SDKCore = NoOpSDKCore()

internal val initialized = AtomicBoolean(false)

Expand Down Expand Up @@ -88,12 +81,7 @@ object Datadog {
*/
@JvmStatic
fun clearAllData() {
LogsFeature.clearAllData()
CrashReportsFeature.clearAllData()
RumFeature.clearAllData()
TracingFeature.clearAllData()
WebViewLogsFeature.clearAllData()
WebViewRumFeature.clearAllData()
globalSDKCore.clearAllData()
}

// Stop all Datadog work (for test purposes).
Expand All @@ -120,15 +108,7 @@ object Datadog {
it.stopKeepAliveCallback()
it.drainExecutorService()
}
// We need to drain and shutdown the executors first to make sure we avoid duplicated
// data due to async operations.
CoreFeature.drainAndShutdownExecutors()
LogsFeature.flushStoredData()
TracingFeature.flushStoredData()
RumFeature.flushStoredData()
CrashReportsFeature.flushStoredData()
WebViewLogsFeature.flushStoredData()
WebViewRumFeature.flushStoredData()
globalSDKCore.flushStoredData()
}
}

Expand Down Expand Up @@ -194,11 +174,11 @@ object Datadog {
*/
@JvmStatic
fun enableRumDebugging(enable: Boolean) {
// TODO-2138 Move this to the RUM SdkFeature
val rumFeature = ((globalSDKCore as? DatadogCore)?.rumFeature) as? RumFeature
if (enable) {
RumFeature.enableDebugging()
rumFeature?.enableDebugging()
} else {
RumFeature.disableDebugging()
rumFeature?.disableDebugging()
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@
package com.datadog.android

import com.datadog.android.core.configuration.Configuration
import com.datadog.android.core.internal.CoreFeature
import com.datadog.android.core.internal.net.FirstPartyHostDetector
import com.datadog.android.core.internal.net.identifyRequest
import com.datadog.android.core.internal.utils.devLogger
Expand All @@ -20,12 +19,12 @@ import com.datadog.android.rum.RumInterceptor
import com.datadog.android.rum.RumMonitor
import com.datadog.android.rum.RumResourceAttributesProvider
import com.datadog.android.rum.RumResourceKind
import com.datadog.android.rum.internal.RumFeature
import com.datadog.android.rum.tracking.ViewTrackingStrategy
import com.datadog.android.tracing.AndroidTracer
import com.datadog.android.tracing.NoOpTracedRequestListener
import com.datadog.android.tracing.TracedRequestListener
import com.datadog.android.tracing.TracingInterceptor
import com.datadog.android.v2.core.DatadogCore
import io.opentracing.Span
import io.opentracing.Tracer
import java.io.IOException
Expand Down Expand Up @@ -113,7 +112,7 @@ internal constructor(
) : this(
tracedHosts = firstPartyHosts,
tracedRequestListener = tracedRequestListener,
firstPartyHostDetector = CoreFeature.firstPartyHostDetector,
firstPartyHostDetector = getGlobalFirstPartyHostDetector(),
rumResourceAttributesProvider = rumResourceAttributesProvider,
localTracerFactory = { AndroidTracer.Builder().build() }
)
Expand All @@ -135,7 +134,7 @@ internal constructor(
) : this(
tracedHosts = emptyList(),
tracedRequestListener = tracedRequestListener,
firstPartyHostDetector = CoreFeature.firstPartyHostDetector,
firstPartyHostDetector = getGlobalFirstPartyHostDetector(),
rumResourceAttributesProvider = rumResourceAttributesProvider,
localTracerFactory = { AndroidTracer.Builder().build() }
)
Expand All @@ -144,7 +143,8 @@ internal constructor(

/** @inheritdoc */
override fun intercept(chain: Interceptor.Chain): Response {
if (RumFeature.isInitialized()) {
val rumFeature = (Datadog.globalSDKCore as? DatadogCore)?.rumFeature
if (rumFeature != null) {
val request = chain.request()
val url = request.url().toString()
val method = request.method()
Expand All @@ -169,8 +169,8 @@ internal constructor(
throwable: Throwable?
) {
super.onRequestIntercepted(request, span, response, throwable)

if (RumFeature.isInitialized()) {
val rumFeature = (Datadog.globalSDKCore as? DatadogCore)?.rumFeature
if (rumFeature != null) {
if (response != null) {
handleResponse(request, response, span)
} else {
Expand All @@ -181,7 +181,8 @@ internal constructor(

/** @inheritdoc */
override fun canSendSpan(): Boolean {
return !RumFeature.isInitialized()
val rumFeature = (Datadog.globalSDKCore as? DatadogCore)?.rumFeature
return rumFeature == null
}

// endregion
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@
* Copyright 2016-Present Datadog, Inc.
*/

@file:Suppress("DEPRECATION")

package com.datadog.android.core.configuration

import android.os.Build
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,13 +40,14 @@ import com.datadog.android.core.internal.time.NoOpTimeProvider
import com.datadog.android.core.internal.time.TimeProvider
import com.datadog.android.core.internal.utils.devLogger
import com.datadog.android.core.internal.utils.sdkLogger
import com.datadog.android.log.internal.domain.LogGenerator
import com.datadog.android.log.internal.domain.DatadogLogGenerator
import com.datadog.android.log.internal.user.DatadogUserInfoProvider
import com.datadog.android.log.internal.user.MutableUserInfoProvider
import com.datadog.android.log.internal.user.NoOpMutableUserInfoProvider
import com.datadog.android.log.internal.user.UserInfoDeserializer
import com.datadog.android.privacy.TrackingConsent
import com.datadog.android.rum.internal.domain.event.RumEventDeserializer
import com.datadog.android.rum.internal.domain.event.RumEventSourceProvider
import com.datadog.android.rum.internal.ndk.DatadogNdkCrashHandler
import com.datadog.android.rum.internal.ndk.NdkCrashHandler
import com.datadog.android.rum.internal.ndk.NdkCrashLogDeserializer
Expand All @@ -69,51 +70,7 @@ import okhttp3.OkHttpClient
import okhttp3.Protocol
import okhttp3.TlsVersion

internal object CoreFeature {

// region Constants

internal val NETWORK_TIMEOUT_MS = TimeUnit.SECONDS.toMillis(45)
private val THREAD_POOL_MAX_KEEP_ALIVE_MS = TimeUnit.SECONDS.toMillis(5)
private const val CORE_DEFAULT_POOL_SIZE = 1 // Only one thread will be kept alive

// this is a default source to be used when uploading RUM/Logs/Span data, however there is a
// possibility to override it which is useful when SDK is used via bridge, say
// from React Native integration
internal const val DEFAULT_SOURCE_NAME = "android"
internal const val DEFAULT_SDK_VERSION = BuildConfig.SDK_VERSION_NAME
internal const val DEFAULT_APP_VERSION = "?"

internal val RESTRICTED_CIPHER_SUITES = arrayOf(
// TLS 1.3

// these 3 are mandatory to implement by TLS 1.3 RFC
// https://datatracker.ietf.org/doc/html/rfc8446#section-9.1
CipherSuite.TLS_AES_128_GCM_SHA256,
CipherSuite.TLS_AES_256_GCM_SHA384,
CipherSuite.TLS_CHACHA20_POLY1305_SHA256,

// TLS 1.2

// these 4 are FIPS 140-2 compliant by OpenSSL

// GOV DC supports only that one and below
CipherSuite.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
CipherSuite.TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,

CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,
CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,

// these 4 are not listed in OpenSSL (because of CBC), but
// claimed to be FIPS 140-2 compliant in other sources. Keep them for now, can be safely
// dropped once min API is 21 (TODO RUMM-1594).
CipherSuite.TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256,
CipherSuite.TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384,
CipherSuite.TLS_RSA_WITH_AES_128_CBC_SHA256,
CipherSuite.TLS_RSA_WITH_AES_256_CBC_SHA256
)

// endregion
internal class CoreFeature {

internal val initialized = AtomicBoolean(false)
internal var contextRef: WeakReference<Context?> = WeakReference(null)
Expand All @@ -136,8 +93,6 @@ internal object CoreFeature {
internal var sdkVersion: String = DEFAULT_SDK_VERSION
internal var rumApplicationId: String? = null
internal var isMainProcess: Boolean = true
internal var processImportance: Int =
ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND
internal var envName: String = ""
internal var variant: String = ""
internal var batchSize: BatchSize = BatchSize.MEDIUM
Expand Down Expand Up @@ -245,7 +200,7 @@ internal object CoreFeature {
ndkCrashHandler = DatadogNdkCrashHandler(
appContext,
persistenceExecutorService,
LogGenerator(
DatadogLogGenerator(
serviceName,
DatadogNdkCrashHandler.LOGGER_NAME,
networkInfoProvider,
Expand All @@ -261,7 +216,8 @@ internal object CoreFeature {
UserInfoDeserializer(sdkLogger),
sdkLogger,
timeProvider,
BatchFileHandler.create(sdkLogger, localDataEncryption)
BatchFileHandler.create(sdkLogger, localDataEncryption),
RumEventSourceProvider(sourceName)
)
ndkCrashHandler.prepareData()
}
Expand All @@ -279,7 +235,11 @@ internal object CoreFeature {
cacheExpirationMs = TimeUnit.MINUTES.toMillis(30),
minWaitTimeBetweenSyncMs = TimeUnit.MINUTES.toMillis(5),
syncListener = LoggingSyncListener()
).apply { if (!disableKronosBackgroundSync) { syncInBackground() } }
).apply {
if (!disableKronosBackgroundSync) {
syncInBackground()
}
}
}

private fun readApplicationInformation(appContext: Context, credentials: Credentials) {
Expand Down Expand Up @@ -466,4 +426,53 @@ internal object CoreFeature {
}

// endregion

companion object {
internal var processImportance: Int =
ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND

// region Constants

internal val NETWORK_TIMEOUT_MS = TimeUnit.SECONDS.toMillis(45)
private val THREAD_POOL_MAX_KEEP_ALIVE_MS = TimeUnit.SECONDS.toMillis(5)
private const val CORE_DEFAULT_POOL_SIZE = 1 // Only one thread will be kept alive

// this is a default source to be used when uploading RUM/Logs/Span data, however there is a
// possibility to override it which is useful when SDK is used via bridge, say
// from React Native integration
internal const val DEFAULT_SOURCE_NAME = "android"
internal const val DEFAULT_SDK_VERSION = BuildConfig.SDK_VERSION_NAME
internal const val DEFAULT_APP_VERSION = "?"

internal val RESTRICTED_CIPHER_SUITES = arrayOf(
// TLS 1.3

// these 3 are mandatory to implement by TLS 1.3 RFC
// https://datatracker.ietf.org/doc/html/rfc8446#section-9.1
CipherSuite.TLS_AES_128_GCM_SHA256,
CipherSuite.TLS_AES_256_GCM_SHA384,
CipherSuite.TLS_CHACHA20_POLY1305_SHA256,

// TLS 1.2

// these 4 are FIPS 140-2 compliant by OpenSSL

// GOV DC supports only that one and below
CipherSuite.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
CipherSuite.TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,

CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,
CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,

// these 4 are not listed in OpenSSL (because of CBC), but
// claimed to be FIPS 140-2 compliant in other sources. Keep them for now, can be safely
// dropped once min API is 21 (TODO RUMM-1594).
CipherSuite.TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256,
CipherSuite.TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384,
CipherSuite.TLS_RSA_WITH_AES_128_CBC_SHA256,
CipherSuite.TLS_RSA_WITH_AES_256_CBC_SHA256
)

// endregion
}
}
Loading

0 comments on commit ca7a978

Please sign in to comment.