Skip to content

Commit

Permalink
Move packages and rename resource to resources
Browse files Browse the repository at this point in the history
  • Loading branch information
jonathanmos committed Feb 11, 2024
1 parent 89e0be1 commit 11c1fc4
Show file tree
Hide file tree
Showing 16 changed files with 87 additions and 63 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,6 @@ import androidx.annotation.MainThread
import androidx.annotation.VisibleForTesting
import com.datadog.android.api.InternalLogger
import com.datadog.android.sessionreplay.internal.LifecycleCallback
import com.datadog.android.sessionreplay.internal.RecordWriter
import com.datadog.android.sessionreplay.internal.ResourcesFeature
import com.datadog.android.sessionreplay.internal.SessionReplayLifecycleCallback
import com.datadog.android.sessionreplay.internal.async.RecordedDataQueueHandler
import com.datadog.android.sessionreplay.internal.processor.MutationResolver
Expand All @@ -31,6 +29,8 @@ import com.datadog.android.sessionreplay.internal.recorder.WindowCallbackInterce
import com.datadog.android.sessionreplay.internal.recorder.WindowInspector
import com.datadog.android.sessionreplay.internal.recorder.callback.OnWindowRefreshedCallback
import com.datadog.android.sessionreplay.internal.recorder.mapper.MapperTypeWrapper
import com.datadog.android.sessionreplay.internal.storage.RecordWriter
import com.datadog.android.sessionreplay.internal.storage.ResourcesWriter
import com.datadog.android.sessionreplay.internal.utils.RumContextProvider
import com.datadog.android.sessionreplay.internal.utils.TimeProvider

Expand All @@ -55,7 +55,7 @@ internal class SessionReplayRecorder : OnWindowRefreshedCallback, Recorder {

constructor(
appContext: Application,
resourcesFeature: ResourcesFeature,
resourcesWriter: ResourcesWriter,
rumContextProvider: RumContextProvider,
privacy: SessionReplayPrivacy,
recordWriter: RecordWriter,
Expand All @@ -72,7 +72,7 @@ internal class SessionReplayRecorder : OnWindowRefreshedCallback, Recorder {
)

val processor = RecordedDataProcessor(
resourcesFeature,
resourcesWriter,
recordWriter,
MutationResolver(internalLogger)
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,26 +12,28 @@ import com.datadog.android.api.feature.StorageBackedFeature
import com.datadog.android.api.net.RequestFactory
import com.datadog.android.api.storage.FeatureStorageConfiguration
import com.datadog.android.sessionreplay.internal.net.ResourceRequestFactory
import com.datadog.android.sessionreplay.internal.storage.NoOpResourceWriter
import com.datadog.android.sessionreplay.internal.storage.SessionReplayResourceWriter
import com.datadog.android.sessionreplay.internal.storage.NoOpResourcesWriter
import com.datadog.android.sessionreplay.internal.storage.ResourcesWriter
import com.datadog.android.sessionreplay.internal.storage.SessionReplayResourcesWriter
import java.util.concurrent.atomic.AtomicBoolean

/**
* Session Replay feature class, which needs to be registered with Datadog SDK instance.
* Session Replay Resources feature class, which needs to be registered with Session Replay Feature.
*/
internal class ResourcesFeature(
private val sdkCore: FeatureSdkCore
private val sdkCore: FeatureSdkCore,
customEndpointUrl: String?
) : StorageBackedFeature {

internal var dataWriter: ResourceWriter = NoOpResourceWriter()
internal var dataWriter: ResourcesWriter = NoOpResourcesWriter()
internal val initialized = AtomicBoolean(false)

// region Feature

override val name: String = SESSION_REPLAY_RESOURCES_FEATURE_NAME

override val requestFactory: RequestFactory = ResourceRequestFactory(
customEndpointUrl = null,
customEndpointUrl = customEndpointUrl,
internalLogger = sdkCore.internalLogger
)

Expand All @@ -44,20 +46,20 @@ internal class ResourcesFeature(
STORAGE_CONFIGURATION

override fun onStop() {
dataWriter = NoOpResourceWriter()
dataWriter = NoOpResourcesWriter()
initialized.set(false)
}

private fun createResourceWriter(): ResourceWriter {
return SessionReplayResourceWriter(sdkCore)
private fun createResourceWriter(): ResourcesWriter {
return SessionReplayResourcesWriter(sdkCore)
}

// endregion

internal companion object {

/**
* Session Replay storage configuration with the following parameters:
* Session Replay Resources storage configuration with the following parameters:
* max item size = 10 MB,
* max items per batch = 500,
* max batch size = 10 MB, SR intake batch limit is 10MB
Expand All @@ -70,5 +72,6 @@ internal class ResourcesFeature(
)

internal const val SESSION_REPLAY_RESOURCES_FEATURE_NAME = "session-replay-resources"
internal const val RESOURCES_ENDPOINT_ENABLED = false
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -22,11 +22,15 @@ import com.datadog.android.sessionreplay.NoOpRecorder
import com.datadog.android.sessionreplay.Recorder
import com.datadog.android.sessionreplay.SessionReplayPrivacy
import com.datadog.android.sessionreplay.SessionReplayRecorder
import com.datadog.android.sessionreplay.internal.ResourcesFeature.Companion.RESOURCES_ENDPOINT_ENABLED
import com.datadog.android.sessionreplay.internal.net.BatchesToSegmentsMapper
import com.datadog.android.sessionreplay.internal.net.SegmentRequestFactory
import com.datadog.android.sessionreplay.internal.recorder.OptionSelectorDetector
import com.datadog.android.sessionreplay.internal.recorder.mapper.MapperTypeWrapper
import com.datadog.android.sessionreplay.internal.storage.NoOpRecordWriter
import com.datadog.android.sessionreplay.internal.storage.NoOpResourcesWriter
import com.datadog.android.sessionreplay.internal.storage.RecordWriter
import com.datadog.android.sessionreplay.internal.storage.ResourcesWriter
import com.datadog.android.sessionreplay.internal.storage.SessionReplayRecordWriter
import com.datadog.android.sessionreplay.internal.time.SessionReplayTimeProvider
import java.util.Locale
Expand All @@ -38,10 +42,10 @@ import java.util.concurrent.atomic.AtomicReference
*/
internal class SessionReplayFeature(
private val sdkCore: FeatureSdkCore,
customEndpointUrl: String?,
private val customEndpointUrl: String?,
internal val privacy: SessionReplayPrivacy,
private val rateBasedSampler: Sampler,
private val sessionReplayRecorderProvider: (ResourcesFeature, RecordWriter, Application) -> Recorder
private val sessionReplayRecorderProvider: (ResourcesWriter, RecordWriter, Application) -> Recorder
) : StorageBackedFeature, FeatureEventReceiver {

private val currentRumSessionId = AtomicReference<String>()
Expand All @@ -58,10 +62,10 @@ internal class SessionReplayFeature(
customEndpointUrl,
privacy,
RateBasedSampler(sampleRate),
{ resourcesFeature, recordWriter, application ->
{ resourceWriter, recordWriter, application ->
SessionReplayRecorder(
application,
resourcesFeature = resourcesFeature,
resourcesWriter = resourceWriter,
rumContextProvider = SessionReplayRumContextProvider(sdkCore),
privacy = privacy,
recordWriter = recordWriter,
Expand All @@ -73,10 +77,10 @@ internal class SessionReplayFeature(
}
)

internal lateinit var appContext: Context
internal lateinit var resourcesFeature: ResourcesFeature
private lateinit var appContext: Context
private var isRecording = AtomicBoolean(false)
internal var sessionReplayRecorder: Recorder = NoOpRecorder()
internal var resourcesWriter: ResourcesWriter = NoOpResourcesWriter()
internal var dataWriter: RecordWriter = NoOpRecordWriter()
internal val initialized = AtomicBoolean(false)

Expand All @@ -95,10 +99,12 @@ internal class SessionReplayFeature(
}

this.appContext = appContext
this.resourcesFeature = registerResourceFeature(sdkCore)
sdkCore.setEventReceiver(SESSION_REPLAY_FEATURE_NAME, this)
if (RESOURCES_ENDPOINT_ENABLED) {
registerResourceFeature(sdkCore)
}
dataWriter = createDataWriter()
sessionReplayRecorder = sessionReplayRecorderProvider(resourcesFeature, dataWriter, appContext)
sessionReplayRecorder = sessionReplayRecorderProvider(resourcesWriter, dataWriter, appContext)
@Suppress("ThreadSafety") // TODO REPLAY-1861 can be called from any thread
sessionReplayRecorder.registerCallbacks()
initialized.set(true)
Expand All @@ -125,6 +131,7 @@ internal class SessionReplayFeature(
stopRecording()
sessionReplayRecorder.unregisterCallbacks()
sessionReplayRecorder.stopProcessingRecords()
resourcesWriter = NoOpResourcesWriter()
dataWriter = NoOpRecordWriter()
sessionReplayRecorder = NoOpRecorder()
initialized.set(false)
Expand Down Expand Up @@ -251,7 +258,8 @@ internal class SessionReplayFeature(

private fun registerResourceFeature(sdkCore: SdkCore): ResourcesFeature {
val resourcesFeature = ResourcesFeature(
sdkCore = sdkCore as FeatureSdkCore
sdkCore = sdkCore as FeatureSdkCore,
customEndpointUrl = customEndpointUrl
)
sdkCore.registerFeature(resourcesFeature)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,13 +11,8 @@ import com.google.gson.JsonObject
internal data class EnrichedResource(
internal val resource: ByteArray,
internal val applicationId: String,
internal val filename: String,
internal val metadata: JsonObject = JsonObject().apply {
this.addProperty(APPLICATION_ID_KEY, applicationId)
this.addProperty(FILENAME_KEY, filename)
}
internal val filename: String
) {

override fun equals(other: Any?): Boolean {
if (this === other) return true
if (javaClass != other?.javaClass) return false
Expand All @@ -41,3 +36,12 @@ internal data class EnrichedResource(
internal const val FILENAME_KEY = "filename"
}
}

internal fun EnrichedResource.asJsonByteArray(): ByteArray {
val applicationId = this.applicationId
val filename = this.filename
val jsonObject = JsonObject()
jsonObject.addProperty(EnrichedResource.APPLICATION_ID_KEY, applicationId)
jsonObject.addProperty(EnrichedResource.FILENAME_KEY, filename)
return jsonObject.toString().toByteArray(Charsets.UTF_8)
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,21 +8,21 @@ package com.datadog.android.sessionreplay.internal.processor

import android.content.res.Configuration
import androidx.annotation.WorkerThread
import com.datadog.android.sessionreplay.internal.RecordWriter
import com.datadog.android.sessionreplay.internal.ResourcesFeature
import com.datadog.android.sessionreplay.internal.async.ResourceRecordedDataQueueItem
import com.datadog.android.sessionreplay.internal.async.SnapshotRecordedDataQueueItem
import com.datadog.android.sessionreplay.internal.async.TouchEventRecordedDataQueueItem
import com.datadog.android.sessionreplay.internal.recorder.Node
import com.datadog.android.sessionreplay.internal.recorder.SystemInformation
import com.datadog.android.sessionreplay.internal.storage.RecordWriter
import com.datadog.android.sessionreplay.internal.storage.ResourcesWriter
import com.datadog.android.sessionreplay.internal.utils.SessionReplayRumContext
import com.datadog.android.sessionreplay.model.MobileSegment
import java.util.LinkedList
import java.util.concurrent.TimeUnit

@Suppress("TooManyFunctions")
internal class RecordedDataProcessor(
private val resourcesFeature: ResourcesFeature,
private val resourcesWriter: ResourcesWriter,
private val writer: RecordWriter,
private val mutationResolver: MutationResolver,
private val nodeFlattener: NodeFlattener = NodeFlattener()
Expand All @@ -42,7 +42,7 @@ internal class RecordedDataProcessor(
filename = item.identifier
)

resourcesFeature.dataWriter.write(enrichedResource)
resourcesWriter.write(enrichedResource)
}

@WorkerThread
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@

package com.datadog.android.sessionreplay.internal.storage

import com.datadog.android.sessionreplay.internal.RecordWriter
import com.datadog.android.sessionreplay.internal.processor.EnrichedRecord

internal class NoOpRecordWriter : RecordWriter {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,9 @@

package com.datadog.android.sessionreplay.internal.storage

import com.datadog.android.sessionreplay.internal.ResourceWriter
import com.datadog.android.sessionreplay.internal.processor.EnrichedResource

internal class NoOpResourceWriter : ResourceWriter {
internal class NoOpResourcesWriter : ResourcesWriter {
override fun write(enrichedResource: EnrichedResource) {
// no-op
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
* Copyright 2016-Present Datadog, Inc.
*/

package com.datadog.android.sessionreplay.internal
package com.datadog.android.sessionreplay.internal.storage

import com.datadog.android.sessionreplay.internal.processor.EnrichedRecord

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

package com.datadog.android.sessionreplay.internal
package com.datadog.android.sessionreplay.internal.storage

import com.datadog.android.sessionreplay.internal.processor.EnrichedResource

internal interface ResourceWriter {
internal interface ResourcesWriter {
/**
* Writes the resource to disk.
* @param enrichedResource to write
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@ package com.datadog.android.sessionreplay.internal.storage
import com.datadog.android.api.feature.FeatureSdkCore
import com.datadog.android.api.storage.RawBatchEvent
import com.datadog.android.sessionreplay.internal.RecordCallback
import com.datadog.android.sessionreplay.internal.RecordWriter
import com.datadog.android.sessionreplay.internal.SessionReplayFeature
import com.datadog.android.sessionreplay.internal.processor.EnrichedRecord

Expand Down Expand Up @@ -43,13 +42,13 @@ internal class SessionReplayRecordWriter(
}

private fun resolveForceNewBatch(record: EnrichedRecord): Boolean {
val newRumContextId = resoleRumContextId(record)
val newRumContextId = resolveRumContextId(record)
val forceNewBatch = lastRumContextId != newRumContextId
lastRumContextId = newRumContextId
return forceNewBatch
}

private fun resoleRumContextId(record: EnrichedRecord): String {
private fun resolveRumContextId(record: EnrichedRecord): String {
return "${record.applicationId}-${record.sessionId}-${record.viewId}"
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,17 +8,17 @@ package com.datadog.android.sessionreplay.internal.storage

import com.datadog.android.api.feature.FeatureSdkCore
import com.datadog.android.api.storage.RawBatchEvent
import com.datadog.android.sessionreplay.internal.ResourceWriter
import com.datadog.android.sessionreplay.internal.ResourcesFeature.Companion.SESSION_REPLAY_RESOURCES_FEATURE_NAME
import com.datadog.android.sessionreplay.internal.processor.EnrichedResource
import com.datadog.android.sessionreplay.internal.processor.asJsonByteArray

internal class SessionReplayResourceWriter(
internal class SessionReplayResourcesWriter(
private val sdkCore: FeatureSdkCore
) : ResourceWriter {
) : ResourcesWriter {
override fun write(enrichedResource: EnrichedResource) {
sdkCore.getFeature(SESSION_REPLAY_RESOURCES_FEATURE_NAME)?.withWriteContext() { _, eventBatchWriter ->
synchronized(this) {
val serializedMetadata = enrichedResource.metadata.toString().toByteArray(Charsets.UTF_8)
val serializedMetadata = enrichedResource.asJsonByteArray()
@Suppress("ThreadSafety") // called from the worker thread
eventBatchWriter.write(
event = RawBatchEvent(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,11 +12,11 @@ import android.view.View
import android.view.Window
import com.datadog.android.api.InternalLogger
import com.datadog.android.sessionreplay.internal.LifecycleCallback
import com.datadog.android.sessionreplay.internal.RecordWriter
import com.datadog.android.sessionreplay.internal.async.RecordedDataQueueHandler
import com.datadog.android.sessionreplay.internal.recorder.ViewOnDrawInterceptor
import com.datadog.android.sessionreplay.internal.recorder.WindowCallbackInterceptor
import com.datadog.android.sessionreplay.internal.recorder.WindowInspector
import com.datadog.android.sessionreplay.internal.storage.RecordWriter
import com.datadog.android.sessionreplay.internal.utils.RumContextProvider
import com.datadog.android.sessionreplay.internal.utils.TimeProvider
import com.datadog.android.sessionreplay.utils.config.ApplicationContextTestConfiguration
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,8 @@ import android.content.Context
import com.datadog.android.api.InternalLogger
import com.datadog.android.api.feature.FeatureSdkCore
import com.datadog.android.sessionreplay.forge.ForgeConfigurator
import com.datadog.android.sessionreplay.internal.storage.NoOpResourceWriter
import com.datadog.android.sessionreplay.internal.storage.NoOpResourcesWriter
import com.datadog.android.sessionreplay.internal.storage.ResourcesWriter
import com.datadog.tools.unit.extensions.TestConfigurationExtension
import fr.xgouchet.elmyr.junit5.ForgeConfiguration
import fr.xgouchet.elmyr.junit5.ForgeExtension
Expand Down Expand Up @@ -50,7 +51,8 @@ internal class ResourcesFeatureTest {
.thenReturn(mockInternalLogger)

testedFeature = ResourcesFeature(
sdkCore = mockSdkCore
sdkCore = mockSdkCore,
customEndpointUrl = null
)
}

Expand All @@ -60,7 +62,7 @@ internal class ResourcesFeatureTest {
testedFeature.onStop()

// Then
assertThat(testedFeature.dataWriter).isInstanceOf(NoOpResourceWriter::class.java)
assertThat(testedFeature.dataWriter).isInstanceOf(NoOpResourcesWriter::class.java)
assertThat(testedFeature.initialized).isFalse
}

Expand All @@ -70,7 +72,7 @@ internal class ResourcesFeatureTest {
testedFeature.onInitialize(mockContext)

// Then
assertThat(testedFeature.dataWriter).isInstanceOf(ResourceWriter::class.java)
assertThat(testedFeature.dataWriter).isInstanceOf(ResourcesWriter::class.java)
assertThat(testedFeature.initialized).isTrue
}
}

0 comments on commit 11c1fc4

Please sign in to comment.