Skip to main content

Slow Rendering Instrumentation

Generates: Events

Automatically detects slow and frozen UI renders (jank).

How It Works

The slow rendering instrumentation periodically polls for frame metrics (by default every 1 second) to detect when the application user interface is slow or frozen. This helps identify UI "jank" that affects user experience.

Configuration

Slow rendering detection is enabled by default when using the Android agent. You can configure it during SDK initialization:

PulseSDK.INSTANCE.initialize(
application = this,
endpointBaseUrl = "https://your-backend.com",
) {
slowRendering {
enabled(true) // Enabled by default
}
}

What Gets Tracked

  • Slow Renders: Frame rendering takes more than 16ms
  • Frozen Renders: Frame rendering takes more than 700ms
  • Frame count (number of slow/frozen frames in the polling period)
  • Period (polling interval in seconds)

Generated Telemetry

Type: Log Record (Event)
Body: Slow or frozen render detection message
pulse.type: app.jank.slow or app.jank.frozen

Attributes

Slow Rendering Attributes

AttributeDescriptionExampleAlways Present
pulse.typeInstrumentation type"app.jank.slow", "app.jank.frozen"✅ Yes
app.jank.thresholdThreshold in seconds0.016 (16ms), 0.7 (700ms)✅ Yes
app.jank.frame_countNumber of slow/frozen frames3, 1✅ Yes
app.jank.periodPeriod in seconds1.0✅ Yes
screen.nameCurrent screen/activity name"MainActivity"⚠️ If available
session.idSession identifier"f40364c92b85ec0c19c35a65be42b97f"✅ Yes

Note: All slow rendering events include global attributes (service, device, OS, session, network carrier, etc.) in the resources object. See Global Attributes for complete list.

Sample Payload: Slow Render

{
"body": "Slow render detected",
"date": "2025-11-27T08:41:00.000000Z",
"id": "0iiPdg5oW57kWey8dHienFjlP9S",
"timestamp": "2025-11-27T08:41:00.000000Z",
"attributes": {
"pulse.type": "app.jank.slow",
"app.jank.threshold": 0.016,
"app.jank.frame_count": 3,
"app.jank.period": 1.0,
"screen.name": "MainActivity",
"session.id": "f40364c92b85ec0c19c35a65be42b97f"
},
"resources": {
"android.os.api_level": "36",
"app.build_id": "1",
"app.build_name": "1.0_1",
"device.manufacturer": "Google",
"device.model.identifier": "sdk_gphone64_arm64",
"device.model.name": "sdk_gphone64_arm64",
"os.description": "BE2A.250530.026.D1",
"os.name": "Android",
"os.type": "linux",
"os.version": "16",
"rum.sdk.version": "0.16.0-alpha-SNAPSHOT",
"service.name": "PulseReactNativeOtelExample",
"service.version": "1.0_1",
"telemetry.sdk.language": "java",
"telemetry.sdk.name": "opentelemetry",
"telemetry.sdk.version": "1.54.1"
}
}

Sample Payload: Frozen Render

{
"body": "Frozen render detected",
"date": "2025-11-27T08:42:00.000000Z",
"id": "0iiPdg5oW57kWey8dHienFjlP9S",
"timestamp": "2025-11-27T08:42:00.000000Z",
"attributes": {
"pulse.type": "app.jank.frozen",
"app.jank.threshold": 0.7,
"app.jank.frame_count": 1,
"app.jank.period": 1.0,
"screen.name": "MainActivity",
"session.id": "f40364c92b85ec0c19c35a65be42b97f"
},
"resources": {
"android.os.api_level": "36",
"app.build_id": "1",
"app.build_name": "1.0_1",
"device.manufacturer": "Google",
"device.model.identifier": "sdk_gphone64_arm64",
"device.model.name": "sdk_gphone64_arm64",
"os.description": "BE2A.250530.026.D1",
"os.name": "Android",
"os.type": "linux",
"os.version": "16",
"rum.sdk.version": "0.16.0-alpha-SNAPSHOT",
"service.name": "PulseReactNativeOtelExample",
"service.version": "1.0_1",
"telemetry.sdk.language": "java",
"telemetry.sdk.name": "opentelemetry",
"telemetry.sdk.version": "1.54.1"
}
}

Thresholds

  • Slow Render: > 16ms (60 FPS target is ~16.67ms per frame)
  • Frozen Render: > 700ms (significant UI freeze)

Best Practices

  1. Monitor jank rates: Track slow render frequency to identify UI performance issues
  2. Optimize rendering: Reduce layout complexity and avoid heavy operations on the main thread
  3. Review frame counts: Higher app.jank.frame_count values indicate more severe performance issues