Skip to content

Commit 7741623

Browse files
committed
RUM-9501 prevent sending Logs from NDK crash
1 parent 3403e7b commit 7741623

File tree

5 files changed

+59
-433
lines changed

5 files changed

+59
-433
lines changed

dd-sdk-android-core/src/main/kotlin/com/datadog/android/core/internal/DatadogCore.kt

Lines changed: 2 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,6 @@ import com.datadog.android.core.internal.utils.scheduleSafe
3939
import com.datadog.android.core.thread.FlushableExecutorService
4040
import com.datadog.android.error.internal.CrashReportsFeature
4141
import com.datadog.android.internal.telemetry.InternalTelemetryEvent
42-
import com.datadog.android.ndk.internal.NdkCrashHandler
4342
import com.datadog.android.privacy.TrackingConsent
4443
import com.google.gson.JsonObject
4544
import java.io.File
@@ -135,16 +134,8 @@ internal class DatadogCore(
135134
features[feature.name] = sdkFeature
136135
sdkFeature.initialize(context, instanceId)
137136

138-
when (feature.name) {
139-
Feature.LOGS_FEATURE_NAME -> {
140-
coreFeature.ndkCrashHandler
141-
.handleNdkCrash(this, NdkCrashHandler.ReportTarget.LOGS)
142-
}
143-
144-
Feature.RUM_FEATURE_NAME -> {
145-
coreFeature.ndkCrashHandler
146-
.handleNdkCrash(this, NdkCrashHandler.ReportTarget.RUM)
147-
}
137+
if (feature.name == Feature.RUM_FEATURE_NAME) {
138+
coreFeature.ndkCrashHandler.handleNdkCrash(this)
148139
}
149140
}
150141

dd-sdk-android-core/src/main/kotlin/com/datadog/android/ndk/internal/DatadogNdkCrashHandler.kt

Lines changed: 11 additions & 136 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ import com.datadog.android.core.internal.persistence.file.existsSafe
1818
import com.datadog.android.core.internal.persistence.file.listFilesSafe
1919
import com.datadog.android.core.internal.persistence.file.readTextSafe
2020
import com.datadog.android.core.internal.utils.executeSafe
21-
import com.datadog.android.log.LogAttributes
2221
import com.google.gson.JsonObject
2322
import java.io.File
2423
import java.util.Locale
@@ -44,9 +43,6 @@ internal class DatadogNdkCrashHandler(
4443
internal var lastNetworkInfo: NetworkInfo? = null
4544
internal var lastNdkCrashLog: NdkCrashLog? = null
4645

47-
internal var processedForLogs = false
48-
internal var processedForRum = false
49-
5046
// region NdkCrashHandler
5147

5248
override fun prepareData() {
@@ -55,12 +51,9 @@ internal class DatadogNdkCrashHandler(
5551
}
5652
}
5753

58-
override fun handleNdkCrash(
59-
sdkCore: FeatureSdkCore,
60-
reportTarget: NdkCrashHandler.ReportTarget
61-
) {
54+
override fun handleNdkCrash(sdkCore: FeatureSdkCore) {
6255
dataPersistenceExecutorService.executeSafe("NDK crash report ", internalLogger) {
63-
checkAndHandleNdkCrashReport(sdkCore, reportTarget)
56+
checkAndHandleNdkCrashReport(sdkCore)
6457
}
6558
}
6659

@@ -136,27 +129,13 @@ internal class DatadogNdkCrashHandler(
136129
}
137130

138131
@WorkerThread
139-
private fun checkAndHandleNdkCrashReport(
140-
sdkCore: FeatureSdkCore,
141-
reportTarget: NdkCrashHandler.ReportTarget
142-
) {
132+
private fun checkAndHandleNdkCrashReport(sdkCore: FeatureSdkCore) {
143133
if (lastNdkCrashLog != null) {
144134
handleNdkCrashLog(
145135
sdkCore,
146136
lastNdkCrashLog,
147-
lastRumViewEvent,
148-
lastUserInfo,
149-
lastNetworkInfo,
150-
reportTarget
137+
lastRumViewEvent
151138
)
152-
}
153-
154-
when (reportTarget) {
155-
NdkCrashHandler.ReportTarget.RUM -> processedForRum = true
156-
NdkCrashHandler.ReportTarget.LOGS -> processedForLogs = true
157-
}
158-
159-
if (processedForRum && processedForLogs) {
160139
clearAllReferences()
161140
}
162141
}
@@ -172,86 +151,21 @@ internal class DatadogNdkCrashHandler(
172151
private fun handleNdkCrashLog(
173152
sdkCore: FeatureSdkCore,
174153
ndkCrashLog: NdkCrashLog?,
175-
lastViewEvent: JsonObject?,
176-
lastUserInfo: UserInfo?,
177-
lastNetworkInfo: NetworkInfo?,
178-
reportTarget: NdkCrashHandler.ReportTarget
154+
lastViewEvent: JsonObject?
179155
) {
180156
if (ndkCrashLog == null) {
181157
return
182158
}
183159
val errorLogMessage = LOG_CRASH_MSG.format(Locale.US, ndkCrashLog.signalName)
184160

185-
when (reportTarget) {
186-
NdkCrashHandler.ReportTarget.RUM -> {
187-
if (lastViewEvent != null) {
188-
sendCrashRumEvent(
189-
sdkCore,
190-
errorLogMessage,
191-
ndkCrashLog,
192-
lastViewEvent
193-
)
194-
}
195-
}
196-
197-
NdkCrashHandler.ReportTarget.LOGS -> {
198-
sendCrashLogEvent(
199-
sdkCore,
200-
errorLogMessage,
201-
generateLogAttributes(lastViewEvent, ndkCrashLog),
202-
ndkCrashLog,
203-
lastNetworkInfo,
204-
lastUserInfo
205-
)
206-
}
207-
}
208-
}
209-
210-
private fun generateLogAttributes(
211-
lastRumViewEvent: JsonObject?,
212-
ndkCrashLog: NdkCrashLog
213-
): Map<String, String> {
214-
val logAttributes = if (lastRumViewEvent != null) {
215-
val (applicationId, sessionId, viewId) = try {
216-
val extractId = { property: String ->
217-
lastRumViewEvent.getAsJsonObject(property)
218-
.getAsJsonPrimitive("id")
219-
.asString
220-
}
221-
val applicationId = extractId("application")
222-
val sessionId = extractId("session")
223-
val viewId = extractId("view")
224-
Triple(applicationId, sessionId, viewId)
225-
} catch (@Suppress("TooGenericExceptionCaught") e: Exception) {
226-
internalLogger.log(
227-
InternalLogger.Level.WARN,
228-
InternalLogger.Target.MAINTAINER,
229-
{ WARN_CANNOT_READ_VIEW_INFO_DATA },
230-
e
231-
)
232-
Triple(null, null, null)
233-
}
234-
if (applicationId != null && sessionId != null && viewId != null) {
235-
mapOf(
236-
LogAttributes.RUM_SESSION_ID to sessionId,
237-
LogAttributes.RUM_APPLICATION_ID to applicationId,
238-
LogAttributes.RUM_VIEW_ID to viewId,
239-
LogAttributes.ERROR_STACK to ndkCrashLog.stacktrace,
240-
LogAttributes.ERROR_SOURCE_TYPE to nativeCrashSourceType
241-
)
242-
} else {
243-
mapOf(
244-
LogAttributes.ERROR_STACK to ndkCrashLog.stacktrace,
245-
LogAttributes.ERROR_SOURCE_TYPE to nativeCrashSourceType
246-
)
247-
}
248-
} else {
249-
mapOf(
250-
LogAttributes.ERROR_STACK to ndkCrashLog.stacktrace,
251-
LogAttributes.ERROR_SOURCE_TYPE to nativeCrashSourceType
161+
if (lastViewEvent != null) {
162+
sendCrashRumEvent(
163+
sdkCore,
164+
errorLogMessage,
165+
ndkCrashLog,
166+
lastViewEvent
252167
)
253168
}
254-
return logAttributes
255169
}
256170

257171
@Suppress("StringLiteralDuplication")
@@ -285,38 +199,6 @@ internal class DatadogNdkCrashHandler(
285199
}
286200
}
287201

288-
@Suppress("StringLiteralDuplication")
289-
@WorkerThread
290-
private fun sendCrashLogEvent(
291-
sdkCore: FeatureSdkCore,
292-
errorLogMessage: String,
293-
logAttributes: Map<String, String>,
294-
ndkCrashLog: NdkCrashLog,
295-
lastNetworkInfo: NetworkInfo?,
296-
lastUserInfo: UserInfo?
297-
) {
298-
val logsFeature = sdkCore.getFeature(Feature.LOGS_FEATURE_NAME)
299-
if (logsFeature != null) {
300-
logsFeature.sendEvent(
301-
mapOf(
302-
"loggerName" to LOGGER_NAME,
303-
"type" to "ndk_crash",
304-
"message" to errorLogMessage,
305-
"attributes" to logAttributes,
306-
"timestamp" to ndkCrashLog.timestamp,
307-
"networkInfo" to lastNetworkInfo,
308-
"userInfo" to lastUserInfo
309-
)
310-
)
311-
} else {
312-
internalLogger.log(
313-
InternalLogger.Level.INFO,
314-
InternalLogger.Target.USER,
315-
{ INFO_LOGS_FEATURE_NOT_REGISTERED }
316-
)
317-
}
318-
}
319-
320202
@SuppressWarnings("TooGenericExceptionCaught")
321203
private fun clearCrashLog() {
322204
if (ndkCrashDataDirectory.existsSafe(internalLogger)) {
@@ -349,16 +231,9 @@ internal class DatadogNdkCrashHandler(
349231
internal const val USER_INFO_FILE_NAME = "user_information"
350232
internal const val NETWORK_INFO_FILE_NAME = "network_information"
351233

352-
internal const val LOGGER_NAME = "ndk_crash"
353-
354234
internal const val LOG_CRASH_MSG = "NDK crash detected with signal: %s"
355235
internal const val ERROR_READ_NDK_DIR = "Error while trying to read the NDK crash directory"
356236

357-
internal const val WARN_CANNOT_READ_VIEW_INFO_DATA =
358-
"Cannot read application, session, view IDs data from view event."
359-
360-
internal const val INFO_LOGS_FEATURE_NOT_REGISTERED =
361-
"Logs feature is not registered, won't report NDK crash info as log."
362237
internal const val INFO_RUM_FEATURE_NOT_REGISTERED =
363238
"RUM feature is not registered, won't report NDK crash info as RUM error."
364239

dd-sdk-android-core/src/main/kotlin/com/datadog/android/ndk/internal/NdkCrashHandler.kt

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,5 @@ internal interface NdkCrashHandler {
1414

1515
fun prepareData()
1616

17-
fun handleNdkCrash(sdkCore: FeatureSdkCore, reportTarget: ReportTarget)
18-
19-
enum class ReportTarget {
20-
RUM,
21-
LOGS
22-
}
17+
fun handleNdkCrash(sdkCore: FeatureSdkCore)
2318
}

dd-sdk-android-core/src/test/kotlin/com/datadog/android/core/DatadogCoreTest.kt

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -182,12 +182,11 @@ internal class DatadogCoreTest {
182182
testedCore.registerFeature(mockFeature)
183183

184184
// Then
185-
verify(testedCore.coreFeature.ndkCrashHandler)
186-
.handleNdkCrash(testedCore, NdkCrashHandler.ReportTarget.RUM)
185+
verify(testedCore.coreFeature.ndkCrashHandler).handleNdkCrash(testedCore)
187186
}
188187

189188
@Test
190-
fun `M handle NDK crash for Logs W registerFeature() {Logs feature}`(
189+
fun `M do nothing W registerFeature() {Logs feature}`(
191190
@Mock mockFeature: Feature
192191
) {
193192
// Given
@@ -199,8 +198,7 @@ internal class DatadogCoreTest {
199198
testedCore.registerFeature(mockFeature)
200199

201200
// Then
202-
verify(testedCore.coreFeature.ndkCrashHandler)
203-
.handleNdkCrash(testedCore, NdkCrashHandler.ReportTarget.LOGS)
201+
verifyNoInteractions(testedCore.coreFeature.ndkCrashHandler)
204202
}
205203

206204
@Test

0 commit comments

Comments
 (0)