Skip to main content
About Dependencies and Package NamesFlashduty Android SDK is fully compatible with the Datadog open-source protocol. In build.gradle, use cloud.flashcat group for dependencies, but in Kotlin/Java code, import classes from the com.datadog.android package. You can seamlessly leverage Datadog ecosystem documentation, examples, and best practices while enjoying Flashduty platform services.
Flashduty Android RUM SDK provides rich advanced configuration options to help you customize data collection and context information based on business needs.
Supported Configuration Scenarios:
  • Enrich user sessions - Add custom views, actions, resources, and error information
  • Protect sensitive data - Mask personally identifiable information and sensitive data
  • Associate user sessions - Link user sessions with internal user identifiers
  • Control data volume - Optimize data collection through sampling and event filtering
  • Enhance context - Add custom attributes to data

Enrich User Sessions

Custom Views

When using ActivityViewTrackingStrategy or FragmentViewTrackingStrategy, the RUM SDK automatically tracks views. You can also manually send custom RUM views when a view becomes visible or interactive.
import com.datadog.android.rum.GlobalRumMonitor

fun onResume() {
    GlobalRumMonitor.get().startView(viewKey, viewName, attributes)
}

fun onPause() {
    GlobalRumMonitor.get().stopView(viewKey, attributes)
}
Parameter Description:
  • viewKey (String) - Unique identifier for the view, same viewKey used for startView() and stopView()
  • viewName (String) - Name of the view
  • attributes (Map<String, Any?>) - Attributes attached to the view (optional)

Custom Actions

In addition to auto-tracked user interactions, you can track specific custom user actions (like clicks, swipes, likes).
import com.datadog.android.rum.GlobalRumMonitor
import com.datadog.android.rum.RumActionType

fun onUserInteraction() {
    GlobalRumMonitor.get().addAction(
        RumActionType.TAP,
        name,
        attributes
    )
}
TypeDescriptionUse Case
RumActionType.TAPTap actionButton, icon taps
RumActionType.SCROLLScroll actionList, page scrolling
RumActionType.SWIPESwipe actionSwipe transitions, gestures
RumActionType.CLICKClick actionGeneral clicks
RumActionType.CUSTOMCustom actionBusiness-specific actions

Custom Resources

In addition to auto-tracked resources, you can manually track specific custom resources (like network requests, third-party library loading).
import com.datadog.android.rum.GlobalRumMonitor
import com.datadog.android.rum.RumResourceKind

fun loadResource() {
    GlobalRumMonitor.get().startResource(resourceKey, method, url, attributes)
}

fun resourceLoadSuccess() {
    GlobalRumMonitor.get().stopResource(
        resourceKey, statusCode, size, 
        RumResourceKind.NATIVE, attributes
    )
}

fun resourceLoadError() {
    GlobalRumMonitor.get().stopResourceWithError(
        resourceKey, statusCode, message, source, throwable
    )
}
TypeDescriptionUse Case
BEACONBeacon requestAnalytics reporting
FETCHFetch requestModern async requests
XHRXHR requestTraditional Ajax
DOCUMENTDocument resourceHTML documents
IMAGEImage resourceImage loading
JSJavaScript resourceJS files
FONTFont resourceFont files
CSSCSS resourceStyle files
MEDIAMedia resourceAudio/video files
NATIVENative resourceNative module loading
OTHEROther resourceUncategorized resources

Custom Errors

To record specific errors, notify the RUM SDK when an exception occurs:
import com.datadog.android.rum.GlobalRumMonitor

GlobalRumMonitor.get().addError(
    message,
    source,
    throwable,
    attributes
)
For more error reporting details, see Android Error Reporting.

Custom Timing

In addition to RUM SDK’s default performance metrics, you can use the addTiming API to measure the duration of key operations. Timing is an offset relative to the current RUM view start time.
import com.datadog.android.rum.GlobalRumMonitor

fun onHeroImageLoaded() {
    GlobalRumMonitor.get().addTiming("hero_image")
}
After setting timing, access it via @view.custom_timings.<timing_name>, e.g., @view.custom_timings.hero_image.

Add User Attributes

The RUM SDK automatically tracks user attributes. You can also add additional custom user attributes like user plan, user group, etc.
import com.datadog.android.rum.GlobalRumMonitor

GlobalRumMonitor.get().setUserInfo(
    id = "1234",
    name = "John Doe",
    email = "john@doe.com",
    extraInfo = mapOf(
        "plan" to "premium",
        "group" to "vip"
    )
)
Custom user attributes can be used to group and filter data in the Insights dashboard, helping you understand usage patterns of different user groups.

Event and Data Management

Clear All Data

Use clearAllData to clear all unsent data currently stored in the SDK:
import com.datadog.android.Datadog

Datadog.clearAllData()

Sampling

You can control the percentage of sessions that collect RUM data:
val rumConfig = RumConfiguration.Builder(applicationId)
    .setSessionSampleRate(80f)  // Collect 80% of sessions
    .build()
Sampled-out sessions will not collect any page views or related telemetry data.
To comply with privacy regulations like GDPR and CCPA, you can set user tracking consent state:
// Set consent state during initialization
Datadog.initialize(this, configuration, TrackingConsent.PENDING)

// Update consent state when user grants permission
Datadog.setTrackingConsent(TrackingConsent.GRANTED)

// Update consent state when user revokes permission
Datadog.setTrackingConsent(TrackingConsent.NOT_GRANTED)
StateBehavior
GRANTEDStart collecting data and send to Flashduty
NOT_GRANTEDDo not collect any data
PENDINGCollect but do not send, wait for user decision

Global Context

Add global context attributes that will be attached to all RUM events:
import com.datadog.android.rum.GlobalRumMonitor

// Add attribute
GlobalRumMonitor.get().addAttribute("user_type", "premium")

// Remove attribute
GlobalRumMonitor.get().removeAttribute("user_type")

Event Mappers

Use Event Mappers to modify or filter events before they are sent:
val rumConfig = RumConfiguration.Builder(applicationId)
    .setViewEventMapper { viewEvent ->
        // Modify view event
        viewEvent.view.url = viewEvent.view.url.replace("sensitive", "redacted")
        viewEvent
    }
    .setActionEventMapper { actionEvent ->
        // Filter specific actions
        if (actionEvent.action.target?.name?.contains("password") == true) {
            null  // Discard this event
        } else {
            actionEvent
        }
    }
    .setErrorEventMapper { errorEvent ->
        // Modify error event
        errorEvent
    }
    .setResourceEventMapper { resourceEvent ->
        // Modify resource event
        resourceEvent
    }
    .build()
View events cannot be discarded (returning null has no effect).