Skip to content

Commit

Permalink
Merge pull request #851 from embrace-io/network-api-delegate
Browse files Browse the repository at this point in the history
Extract network request api delegate
  • Loading branch information
fractalwrench committed May 17, 2024
2 parents 88dceb2 + a6a0365 commit 2bb5ea3
Show file tree
Hide file tree
Showing 14 changed files with 538 additions and 217 deletions.
2 changes: 1 addition & 1 deletion embrace-android-sdk/config/detekt/baseline.xml
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,6 @@
<ID>DataClassShouldBeImmutable:LegacyExceptionError.kt$LegacyExceptionError$@Json(name = "c") var occurrences: Int = 0</ID>
<ID>DataClassShouldBeImmutable:LegacyExceptionError.kt$LegacyExceptionError$@Json(name = "rep") var exceptionErrors: MutableList&lt;LegacyExceptionErrorInfo&gt; = mutableListOf()</ID>
<ID>LongParameterList:FakeModuleInitBootstrapper.kt$( fakeEmbLogger: FakeEmbLogger = FakeEmbLogger(), fakeInitModule: FakeInitModule = FakeInitModule(), fakeOpenTelemetryModule: FakeOpenTelemetryModule = FakeOpenTelemetryModule(), coreModuleSupplier: CoreModuleSupplier = { _, _, _ -&gt; FakeCoreModule() }, systemServiceModuleSupplier: SystemServiceModuleSupplier = { _, _ -&gt; FakeSystemServiceModule() }, androidServicesModuleSupplier: AndroidServicesModuleSupplier = { _, _, _ -&gt; FakeAndroidServicesModule() }, workerThreadModuleSupplier: WorkerThreadModuleSupplier = { _ -&gt; FakeWorkerThreadModule() }, storageModuleSupplier: StorageModuleSupplier = { _, _, _ -&gt; FakeStorageModule() }, essentialServiceModuleSupplier: EssentialServiceModuleSupplier = { _, _, _, _, _, _, _, _, _, _ -&gt; FakeEssentialServiceModule() }, dataSourceModuleSupplier: DataSourceModuleSupplier = { _, _, _, _, _, _, _, _ -&gt; FakeDataSourceModule() }, dataCaptureServiceModuleSupplier: DataCaptureServiceModuleSupplier = { _, _, _, _, _, _, _ -&gt; FakeDataCaptureServiceModule() }, deliveryModuleSupplier: DeliveryModuleSupplier = { _, _, _, _, _ -&gt; FakeDeliveryModule() }, anrModuleSupplier: AnrModuleSupplier = { _, _, _, _ -&gt; FakeAnrModule() }, customerLogModuleSupplier: CustomerLogModuleSupplier = { _, _, _, _, _, _, _, _ -&gt; FakeCustomerLogModule() }, nativeModuleSupplier: NativeModuleSupplier = { _, _, _, _, _, _, _ -&gt; FakeNativeModule() }, dataContainerModuleSupplier: DataContainerModuleSupplier = { _, _, _, _, _ -&gt; FakeDataContainerModule() }, sessionModuleSupplier: SessionModuleSupplier = { _, _, _, _, _, _, _, _, _, _, _, _, _ -&gt; FakeSessionModule() }, crashModuleSupplier: CrashModuleSupplier = { _, _, _, _, _, _, _, _, _, _, _ -&gt; FakeCrashModule() }, payloadModuleSupplier: PayloadModuleSupplier = { _, _, _, _, _, _, _, _, _ -&gt; FakePayloadModule() } )</ID>
<ID>TooManyFunctions:EmbraceImpl.kt$EmbraceImpl : UserApiSessionApi</ID>
<ID>TooManyFunctions:EmbraceImpl.kt$EmbraceImpl : UserApiSessionApiNetworkRequestApiLogsApi</ID>
</CurrentIssues>
</SmellBaseline>
Original file line number Diff line number Diff line change
Expand Up @@ -285,21 +285,21 @@ public void recordNetworkRequest(@NonNull EmbraceNetworkRequest networkRequest)
@Override
public void logInfo(@NonNull String message) {
if (verifyNonNullParameters("logInfo", message)) {
logMessage(message, Severity.INFO);
impl.logInfo(message);
}
}

@Override
public void logWarning(@NonNull String message) {
if (verifyNonNullParameters("logWarning", message)) {
logMessage(message, Severity.WARNING);
impl.logWarning(message);
}
}

@Override
public void logError(@NonNull String message) {
if (verifyNonNullParameters("logError", message)) {
logMessage(message, Severity.ERROR);
impl.logError(message);
}
}

Expand All @@ -313,7 +313,7 @@ public void addBreadcrumb(@NonNull String message) {
@Override
public void logMessage(@NonNull String message, @NonNull Severity severity) {
if (verifyNonNullParameters("logMessage", message, severity)) {
logMessage(message, severity, null);
impl.logMessage(message, severity);
}
}

Expand All @@ -329,14 +329,14 @@ public void logMessage(@NonNull String message,
@Override
public void logException(@NonNull Throwable throwable) {
if (verifyNonNullParameters("logException", throwable)) {
logException(throwable, Severity.ERROR);
impl.logException(throwable);
}
}

@Override
public void logException(@NonNull Throwable throwable, @NonNull Severity severity) {
if (verifyNonNullParameters("logException", throwable, severity)) {
logException(throwable, severity, null);
impl.logException(throwable, severity);
}
}

Expand All @@ -345,7 +345,7 @@ public void logException(@NonNull Throwable throwable,
@NonNull Severity severity,
@Nullable Map<String, ?> properties) {
if (verifyNonNullParameters("logException", throwable, severity)) {
logException(throwable, severity, properties, null);
impl.logException(throwable, severity, properties);
}
}

Expand All @@ -362,14 +362,14 @@ public void logException(@NonNull Throwable throwable,
@Override
public void logCustomStacktrace(@NonNull StackTraceElement[] stacktraceElements) {
if (verifyNonNullParameters("logCustomStacktrace", (Object) stacktraceElements)) {
logCustomStacktrace(stacktraceElements, Severity.ERROR);
impl.logCustomStacktrace(stacktraceElements);
}
}

@Override
public void logCustomStacktrace(@NonNull StackTraceElement[] stacktraceElements, @NonNull Severity severity) {
if (verifyNonNullParameters("logCustomStacktrace", (Object) stacktraceElements, severity)) {
logCustomStacktrace(stacktraceElements, severity, null);
impl.logCustomStacktrace(stacktraceElements, severity);
}
}

Expand All @@ -378,7 +378,7 @@ public void logCustomStacktrace(@NonNull StackTraceElement[] stacktraceElements,
@NonNull Severity severity,
@Nullable Map<String, ?> properties) {
if (verifyNonNullParameters("logCustomStacktrace", (Object) stacktraceElements, severity)) {
logCustomStacktrace(stacktraceElements, severity, properties, null);
impl.logCustomStacktrace(stacktraceElements, severity, properties);
}
}

Expand Down Expand Up @@ -587,7 +587,8 @@ public void logPushNotification(@Nullable String title,
id,
notificationPriority,
messageDeliveredPriority,
PushNotificationBreadcrumb.NotificationType.Builder.notificationTypeFor(hasData, isNotification)
isNotification,
hasData
);
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@ import android.app.Application
import android.app.Application.ActivityLifecycleCallbacks
import android.content.Context
import io.embrace.android.embracesdk.Embrace.LastRunEndState
import io.embrace.android.embracesdk.EventType.Companion.fromSeverity
import io.embrace.android.embracesdk.config.ConfigService
import io.embrace.android.embracesdk.config.behavior.NetworkBehavior
import io.embrace.android.embracesdk.event.EmbraceEventService
Expand All @@ -18,16 +17,14 @@ import io.embrace.android.embracesdk.internal.EmbraceInternalInterface
import io.embrace.android.embracesdk.internal.IdGenerator.Companion.generateW3CTraceparent
import io.embrace.android.embracesdk.internal.Systrace.endSynchronous
import io.embrace.android.embracesdk.internal.Systrace.startSynchronous
import io.embrace.android.embracesdk.internal.api.delegate.LogsApiDelegate
import io.embrace.android.embracesdk.internal.api.delegate.NetworkRequestApiDelegate
import io.embrace.android.embracesdk.internal.api.delegate.SdkCallChecker
import io.embrace.android.embracesdk.internal.api.delegate.SessionApiDelegate
import io.embrace.android.embracesdk.internal.api.delegate.UserApiDelegate
import io.embrace.android.embracesdk.internal.spans.EmbraceTracer
import io.embrace.android.embracesdk.internal.utils.getSafeStackTrace
import io.embrace.android.embracesdk.logging.EmbLogger
import io.embrace.android.embracesdk.network.EmbraceNetworkRequest
import io.embrace.android.embracesdk.payload.PushNotificationBreadcrumb
import io.embrace.android.embracesdk.payload.TapBreadcrumb.TapBreadcrumbType
import io.embrace.android.embracesdk.utils.PropertyUtils.sanitizeProperties
import io.embrace.android.embracesdk.utils.PropertyUtils.normalizeProperties
import io.embrace.android.embracesdk.worker.WorkerName
import io.embrace.android.embracesdk.worker.WorkerThreadModule
import io.opentelemetry.sdk.logs.export.LogRecordExporter
Expand All @@ -47,8 +44,14 @@ internal class EmbraceImpl @JvmOverloads constructor(
private val sdkCallChecker: SdkCallChecker =
SdkCallChecker(bootstrapper.initModule.logger, bootstrapper.initModule.telemetryService),
private val userApiDelegate: UserApiDelegate = UserApiDelegate(bootstrapper, sdkCallChecker),
private val sessionApiDelegate: SessionApiDelegate = SessionApiDelegate(bootstrapper, sdkCallChecker)
) : UserApi by userApiDelegate, SessionApi by sessionApiDelegate {
private val sessionApiDelegate: SessionApiDelegate = SessionApiDelegate(bootstrapper, sdkCallChecker),
private val networkRequestApiDelegate: NetworkRequestApiDelegate =
NetworkRequestApiDelegate(bootstrapper, sdkCallChecker),
private val logsApiDelegate: LogsApiDelegate = LogsApiDelegate(bootstrapper, sdkCallChecker)
) : UserApi by userApiDelegate,
SessionApi by sessionApiDelegate,
NetworkRequestApi by networkRequestApiDelegate,
LogsApi by logsApiDelegate {

@JvmField
val tracer: EmbraceTracer = bootstrapper.openTelemetryModule.embraceTracer
Expand Down Expand Up @@ -335,7 +338,6 @@ internal class EmbraceImpl @JvmOverloads constructor(
* Starts a 'moment'. Moments are used for encapsulating particular activities within
* the app, such as a user adding an item to their shopping cart.
*
*
* The length of time a moment takes to execute is recorded.
*
* @param name a name identifying the moment
Expand All @@ -352,7 +354,6 @@ internal class EmbraceImpl @JvmOverloads constructor(
/**
* Signals the end of a moment with the specified name.
*
*
* The duration of the moment is computed.
*
* @param name the name of the moment to end
Expand Down Expand Up @@ -385,72 +386,6 @@ internal class EmbraceImpl @JvmOverloads constructor(

fun generateW3cTraceparent(): String = generateW3CTraceparent()

fun recordNetworkRequest(request: EmbraceNetworkRequest) {
if (sdkCallChecker.check("record_network_request")) {
logNetworkRequest(request)
}
}

private fun logNetworkRequest(request: EmbraceNetworkRequest) {
if (configService?.networkBehavior?.isUrlEnabled(request.url) == true) {
networkLoggingService?.logNetworkRequest(request)
onActivityReported()
}
}

fun logMessage(message: String, severity: Severity, properties: Map<String, Any>?) {
logMessage(
fromSeverity(severity),
message,
properties,
null,
null,
LogExceptionType.NONE,
null,
null
)
}

fun logException(throwable: Throwable, severity: Severity, properties: Map<String, Any>?, message: String?) {
val exceptionMessage = if (throwable.message != null) throwable.message else ""
logMessage(
fromSeverity(severity),
(
message
?: exceptionMessage
) ?: "",
properties,
throwable.getSafeStackTrace(),
null,
LogExceptionType.HANDLED,
null,
null,
throwable.javaClass.simpleName,
exceptionMessage
)
}

fun logCustomStacktrace(
stacktraceElements: Array<StackTraceElement>,
severity: Severity,
properties: Map<String, Any>?,
message: String?
) {
logMessage(
fromSeverity(severity),
message
?: "",
properties,
stacktraceElements,
null,
LogExceptionType.HANDLED,
null,
null,
null,
message
)
}

@JvmOverloads
fun logMessage(
type: EventType,
Expand All @@ -464,34 +399,23 @@ internal class EmbraceImpl @JvmOverloads constructor(
exceptionName: String? = null,
exceptionMessage: String? = null
) {
if (sdkCallChecker.check("log_message")) {
try {
appFramework?.let {
logMessageService?.log(
message,
type,
logExceptionType,
normalizeProperties(properties, logger),
stackTraceElements,
customStackTrace,
it,
context,
library,
exceptionName,
exceptionMessage
)
}
onActivityReported()
} catch (ex: Exception) {
logger.logDebug("Failed to log message using Embrace SDK.", ex)
}
}
logsApiDelegate.logMessage(
type,
message,
properties,
stackTraceElements,
customStackTrace,
logExceptionType,
context,
library,
exceptionName,
exceptionMessage
)
}

/**
* Logs a breadcrumb.
*
*
* Breadcrumbs track a user's journey through the application and will be shown on the timeline.
*
* @param message the name of the breadcrumb to log
Expand Down Expand Up @@ -541,7 +465,6 @@ internal class EmbraceImpl @JvmOverloads constructor(
/**
* Log the start of a fragment.
*
*
* A matching call to endFragment must be made.
*
* @param name the name of the fragment to log
Expand All @@ -556,7 +479,6 @@ internal class EmbraceImpl @JvmOverloads constructor(
/**
* Log the end of a fragment.
*
*
* A matching call to startFragment must be made before this is called.
*
* @param name the name of the fragment to log
Expand All @@ -568,31 +490,6 @@ internal class EmbraceImpl @JvmOverloads constructor(
return false
}

/**
* Saves captured push notification information into session payload
*
* @param title the title of the notification as a string (or null)
* @param body the body of the notification as a string (or null)
* @param topic the notification topic (if a user subscribed to one), or null
* @param id A unique ID identifying the message
* @param notificationPriority the notificationPriority of the message (as resolved on the device)
* @param messageDeliveredPriority the priority of the message (as resolved on the server)
*/
fun logPushNotification(
title: String?,
body: String?,
topic: String?,
id: String?,
notificationPriority: Int?,
messageDeliveredPriority: Int,
type: PushNotificationBreadcrumb.NotificationType
) {
if (sdkCallChecker.check("log_push_notification")) {
pushNotificationService?.logPushNotification(title, body, topic, id, notificationPriority, messageDeliveredPriority, type)
onActivityReported()
}
}

/**
* Logs that a particular WebView URL was loaded.
*
Expand Down Expand Up @@ -695,7 +592,6 @@ internal class EmbraceImpl @JvmOverloads constructor(
/**
* Logs the fact that a particular view was entered.
*
*
* If the previously logged view has the same name, a duplicate view breadcrumb will not be
* logged.
*
Expand Down Expand Up @@ -745,20 +641,6 @@ internal class EmbraceImpl @JvmOverloads constructor(
}
}

private fun normalizeProperties(properties: Map<String, Any>?, logger: EmbLogger): Map<String, Any>? {
var normalizedProperties: Map<String, Any> = HashMap()
if (properties != null) {
try {
normalizedProperties = sanitizeProperties(properties, logger)
} catch (e: Exception) {
this.logger.logError("Exception occurred while normalizing the properties.", e)
}
return normalizedProperties
} else {
return null
}
}

fun addSpanExporter(spanExporter: SpanExporter) {
if (isStarted()) {
logger.logError("A SpanExporter can only be added before the SDK is started.", null)
Expand Down

0 comments on commit 2bb5ea3

Please sign in to comment.