Real User Monitoring
No RUM events yet. Embed the rum.js snippet in your app.
<!-- One-line auto-init (endpoint inferred from script host) -->
<script src="http://YOUR_SOBS_HOST/static/rum.js?app=my-app"></script>
<!-- Feature-complete setup -->
<script src="http://YOUR_SOBS_HOST/static/rum.js"
data-sobs-app="shop-web"
data-sobs-endpoint="http://YOUR_SOBS_HOST/v1/rum"
data-sobs-client-token-url="/internal/sobs/rum-client-token"></script>
<script>
SOBS.init({
endpoint: 'http://YOUR_SOBS_HOST/v1/rum',
appName: 'shop-web',
clientAuthTokenUrl: '/internal/sobs/rum-client-token',
trackSPA: true,
// Trace correlation + propagation
traceparent: window.__TRACEPARENT__ || '',
tracePropagationOrigins: ['https://api.example.com'],
// Breadcrumb sizing
consoleBufferSize: 20,
breadcrumbBufferSize: 40,
// Replay + optional screenshot capture for error events
replay: {
enabled: true,
scriptUrl: 'https://cdn.jsdelivr.net/npm/rrweb@latest/dist/record/rrweb-record.min.js',
maxEvents: 500,
screenshot: {
enabled: true,
scriptUrl: 'https://cdn.jsdelivr.net/npm/html2canvas@1.4.1/dist/html2canvas.min.js',
mimeType: 'image/jpeg',
quality: 0.75,
maxEdge: 1400
},
upload: async function (envelope) {
const resp = await fetch('api/replay/upload', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(envelope)
});
if (!resp.ok) throw new Error('Replay upload failed');
// Expected: { replay: { id, url, provider }, artifact: { type, id, url } }
return resp.json();
}
}
});
// Manual APIs (auto window.onerror/unhandledrejection are already enabled)
SOBS.addBreadcrumb('checkout', 'Clicked Place Order', { step: 'payment' });
SOBS.track('feature-flag', { flag: 'new-checkout', variant: 'B' });
SOBS.setVisualContext({
replay: { id: 'replay-123', url: 'https://example.com/replays/replay-123', provider: 'rrweb' },
artifact: { type: 'screenshot', id: 'shot-123', url: 'https://example.com/artifacts/shot-123.png' },
ttlMs: 15000,
consumeOnce: true
});
try {
throw new Error('Checkout confirmation failed');
} catch (err) {
SOBS.captureException(err, { errorSource: 'checkout-flow' });
}
// Additional helpers:
// SOBS.setTraceParent('00-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa-bbbbbbbbbbbbbbbb-01');
// SOBS.setTraceContext('<trace-id-32-hex>', '<span-id-16-hex>');
// SOBS.setReplayContext({ id: 'replay-123', url: 'https://.../replay-123', provider: 'rrweb' }, { ttlMs: 15000 });
// SOBS.setArtifactContext({ type: 'screenshot', id: 'shot-123', url: 'https://.../shot-123.png' }, { ttlMs: 15000 });
// SOBS.clearVisualContext();
// SOBS.enableReplay({ enabled: true, scriptUrl: 'https://cdn.../rrweb-record.min.js' });
// SOBS.disableReplay();
// SOBS.setReplayUpload(async (envelope) => ({ replay: { id: 'r1', url: 'https://...', provider: 'rrweb' } }));
// SOBS.setClientAuthToken('<short-lived-rum-token>');
</script>