diff --git a/embrace-android-core/src/main/kotlin/io/embrace/android/embracesdk/internal/logs/attachments/Attachment.kt b/embrace-android-core/src/main/kotlin/io/embrace/android/embracesdk/internal/logs/attachments/Attachment.kt index 0a5923ba46..8c76b8a376 100644 --- a/embrace-android-core/src/main/kotlin/io/embrace/android/embracesdk/internal/logs/attachments/Attachment.kt +++ b/embrace-android-core/src/main/kotlin/io/embrace/android/embracesdk/internal/logs/attachments/Attachment.kt @@ -21,6 +21,7 @@ sealed class Attachment(val id: String) { } abstract val attributes: Map + abstract val errorCode: AttachmentErrorCode? protected fun constructAttributes( id: String, @@ -42,7 +43,7 @@ sealed class Attachment(val id: String) { private val size: Long = bytes.size.toLong() - private val errorCode: AttachmentErrorCode? = when { + override val errorCode: AttachmentErrorCode? = when { !counter() -> OVER_MAX_ATTACHMENTS size > LIMIT_MB -> ATTACHMENT_TOO_LARGE else -> null @@ -64,7 +65,7 @@ sealed class Attachment(val id: String) { counter: () -> Boolean, ) : Attachment(id) { - private val errorCode: AttachmentErrorCode? = when { + override val errorCode: AttachmentErrorCode? = when { !counter() -> OVER_MAX_ATTACHMENTS url.isEmpty() -> UNKNOWN isNotUuid() -> UNKNOWN diff --git a/embrace-android-delivery/src/main/kotlin/io/embrace/android/embracesdk/internal/delivery/SupportedEnvelopeType.kt b/embrace-android-delivery/src/main/kotlin/io/embrace/android/embracesdk/internal/delivery/SupportedEnvelopeType.kt index 6793422ea7..7f753468e3 100644 --- a/embrace-android-delivery/src/main/kotlin/io/embrace/android/embracesdk/internal/delivery/SupportedEnvelopeType.kt +++ b/embrace-android-delivery/src/main/kotlin/io/embrace/android/embracesdk/internal/delivery/SupportedEnvelopeType.kt @@ -15,7 +15,7 @@ enum class SupportedEnvelopeType( CRASH(Envelope.logEnvelopeType, "p1", Endpoint.LOGS), SESSION(Envelope.sessionEnvelopeType, "p3", Endpoint.SESSIONS), - ATTACHMENT(null, "p4", Endpoint.ATTACHMENT), + ATTACHMENT(null, "p4", Endpoint.ATTACHMENTS), LOG(Envelope.logEnvelopeType, "p5", Endpoint.LOGS), BLOB(Envelope.logEnvelopeType, "p7", Endpoint.LOGS); diff --git a/embrace-android-delivery/src/main/kotlin/io/embrace/android/embracesdk/internal/delivery/execution/OkHttpRequestExecutionService.kt b/embrace-android-delivery/src/main/kotlin/io/embrace/android/embracesdk/internal/delivery/execution/OkHttpRequestExecutionService.kt index 747e18ff88..56c29dfc07 100644 --- a/embrace-android-delivery/src/main/kotlin/io/embrace/android/embracesdk/internal/delivery/execution/OkHttpRequestExecutionService.kt +++ b/embrace-android-delivery/src/main/kotlin/io/embrace/android/embracesdk/internal/delivery/execution/OkHttpRequestExecutionService.kt @@ -41,7 +41,7 @@ class OkHttpRequestExecutionService( envelopeType: SupportedEnvelopeType, payloadType: String, ): ExecutionResult { - val multipart = envelopeType.endpoint == Endpoint.ATTACHMENT + val multipart = envelopeType.endpoint == Endpoint.ATTACHMENTS val apiRequest = envelopeType.endpoint.getApiRequestFromEndpoint(multipart) val request = when { multipart -> prepareMultipartRequest(payloadStream, apiRequest) diff --git a/embrace-android-payload/src/main/kotlin/io/embrace/android/embracesdk/internal/comms/api/Endpoint.kt b/embrace-android-payload/src/main/kotlin/io/embrace/android/embracesdk/internal/comms/api/Endpoint.kt index a3bf5eb020..9431b6c9a5 100644 --- a/embrace-android-payload/src/main/kotlin/io/embrace/android/embracesdk/internal/comms/api/Endpoint.kt +++ b/embrace-android-payload/src/main/kotlin/io/embrace/android/embracesdk/internal/comms/api/Endpoint.kt @@ -10,6 +10,6 @@ enum class Endpoint( LOGS("logs", "v2"), SESSIONS("spans", "v2"), CONFIG("config", "v2"), - ATTACHMENT("attachment", "v2"), + ATTACHMENTS("attachments", "v2"), UNKNOWN("unknown", "v1"), } diff --git a/embrace-android-sdk/src/integrationTest/kotlin/io/embrace/android/embracesdk/testframework/server/FakeApiServer.kt b/embrace-android-sdk/src/integrationTest/kotlin/io/embrace/android/embracesdk/testframework/server/FakeApiServer.kt index 7552b3c5e6..430a6fa5d2 100644 --- a/embrace-android-sdk/src/integrationTest/kotlin/io/embrace/android/embracesdk/testframework/server/FakeApiServer.kt +++ b/embrace-android-sdk/src/integrationTest/kotlin/io/embrace/android/embracesdk/testframework/server/FakeApiServer.kt @@ -64,7 +64,7 @@ internal class FakeApiServer( deliveryTracer.onServerReceivedRequest(endpoint.name) return when (endpoint) { Endpoint.LOGS, Endpoint.SESSIONS -> handleEnvelopeRequest(request, endpoint) - Endpoint.ATTACHMENT -> handleAttachmentRequest(request) + Endpoint.ATTACHMENTS -> handleAttachmentRequest(request) // IMPORTANT NOTE: this response is not used until the SDK next starts! Endpoint.CONFIG -> handleConfigRequest(request) @@ -150,7 +150,7 @@ internal class FakeApiServer( "logs" -> Endpoint.LOGS "spans" -> Endpoint.SESSIONS "config" -> Endpoint.CONFIG - "attachment" -> Endpoint.ATTACHMENT + "attachments" -> Endpoint.ATTACHMENTS else -> error("Unsupported path $endpoint") } } diff --git a/embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/internal/api/delegate/LogsApiDelegate.kt b/embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/internal/api/delegate/LogsApiDelegate.kt index 97b8841c4d..de1fb06021 100644 --- a/embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/internal/api/delegate/LogsApiDelegate.kt +++ b/embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/internal/api/delegate/LogsApiDelegate.kt @@ -7,6 +7,9 @@ import io.embrace.android.embracesdk.internal.injection.ModuleInitBootstrapper import io.embrace.android.embracesdk.internal.injection.embraceImplInject import io.embrace.android.embracesdk.internal.logs.attachments.Attachment import io.embrace.android.embracesdk.internal.logs.attachments.Attachment.EmbraceHosted +import io.embrace.android.embracesdk.internal.logs.attachments.AttachmentErrorCode.ATTACHMENT_TOO_LARGE +import io.embrace.android.embracesdk.internal.logs.attachments.AttachmentErrorCode.OVER_MAX_ATTACHMENTS +import io.embrace.android.embracesdk.internal.logs.attachments.AttachmentErrorCode.UNKNOWN import io.embrace.android.embracesdk.internal.payload.PushNotificationBreadcrumb import io.embrace.android.embracesdk.internal.serialization.truncatedStacktrace import io.embrace.android.embracesdk.internal.utils.getSafeStackTrace @@ -31,6 +34,9 @@ internal class LogsApiDelegate( private val attachmentService by embraceImplInject(sdkCallChecker) { bootstrapper.logModule.attachmentService } + private val logger by embraceImplInject(sdkCallChecker) { + bootstrapper.initModule.logger + } override fun logInfo(message: String) = logMessage(message, Severity.INFO) override fun logWarning(message: String) = logMessage(message, Severity.WARNING) @@ -91,6 +97,7 @@ internal class LogsApiDelegate( attachment: ByteArray, ) { val obj = attachmentService?.createAttachment(attachment) ?: return + logAttachmentErrorIfNeeded(obj) logMessageImpl( severity = severity, message = message, @@ -107,6 +114,7 @@ internal class LogsApiDelegate( attachmentUrl: String, ) { val obj = attachmentService?.createAttachment(attachmentId, attachmentUrl) ?: return + logAttachmentErrorIfNeeded(obj) logMessageImpl( severity = severity, message = message, @@ -115,6 +123,18 @@ internal class LogsApiDelegate( ) } + private fun logAttachmentErrorIfNeeded(obj: Attachment) { + if (obj.errorCode != null) { + val msg = when (obj.errorCode) { + ATTACHMENT_TOO_LARGE -> "Supplied attachment exceeds 1Mb limit. This attachment will not be uploaded." + OVER_MAX_ATTACHMENTS -> "A maximum of 5 attachments are allowed per session. This attachment will not be uploaded." + UNKNOWN -> "An unknown error occurred while processing the attachment." + null -> null + } ?: return + logger?.logError(msg, RuntimeException(msg)) + } + } + override fun logException( throwable: Throwable, severity: Severity,