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
| Attribute | Description | Example | Always Present |
|---|---|---|---|
pulse.type | Instrumentation type | "app.jank.slow", "app.jank.frozen" | ✅ Yes |
app.jank.threshold | Threshold in seconds | 0.016 (16ms), 0.7 (700ms) | ✅ Yes |
app.jank.frame_count | Number of slow/frozen frames | 3, 1 | ✅ Yes |
app.jank.period | Period in seconds | 1.0 | ✅ Yes |
screen.name | Current screen/activity name | "MainActivity" | ⚠️ If available |
session.id | Session identifier | "f40364c92b85ec0c19c35a65be42b97f" | ✅ Yes |
Note: All slow rendering events include global attributes (service, device, OS, session, network carrier, etc.) in the
resourcesobject. 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
- Monitor jank rates: Track slow render frequency to identify UI performance issues
- Optimize rendering: Reduce layout complexity and avoid heavy operations on the main thread
- Review frame counts: Higher
app.jank.frame_countvalues indicate more severe performance issues