Skip to content

Datadog Sink

The Datadog sink sends session data as a custom RUM action using your existing @datadog/browser-rum client. WriteTrack doesn’t bundle the Datadog SDK — you provide your initialized client.

You need @datadog/browser-rum v3.0.0 or later already initialized in your application.

Terminal window
npm i @datadog/browser-rum
import { WriteTrack, datadog } from 'writetrack';
import { datadogRum } from '@datadog/browser-rum';
// Initialize Datadog RUM (your existing setup)
datadogRum.init({
applicationId: '...',
clientToken: '...',
site: 'datadoghq.com',
});
const tracker = new WriteTrack({
target: textarea,
userId: 'u_abc123',
});
tracker.pipe(
datadog({
client: datadogRum,
})
);
tracker.start();
OptionTypeDefaultDescription
clientDatadogClientInitialized Datadog RUM client Required
actionNamestring'writetrack_session'Custom action name
tagsRecord<string, string>{}Extra tags to include in the action context

The sink calls client.addAction(actionName, context) with the following context:

Context FieldSourceDescription
durationmetadata.durationSession duration in ms
keystrokeCountsession.events.lengthTotal keystroke events
qualityLevelquality.qualityLevelPOOR / FAIR / GOOD / EXCELLENT
targetElementmetadata.targetElementElement type (e.g. textarea)
schemaVersionversionSchema version
userIdmetadata.userIdUser ID (if provided)
contentIdmetadata.contentIdContent ID (if provided)
custommetadata.customCustom metadata (if provided)

Any tags you pass in options are merged into the context object.

tracker.pipe(
datadog({
client: datadogRum,
actionName: 'typing_session_captured',
tags: {
team: 'content-integrity',
env: 'production',
},
})
);

Once data flows, you can find sessions in the Datadog RUM Explorer:

  • Action name: writetrack_session (or your custom name)
  • Filter by quality: @context.qualityLevel:EXCELLENT
  • Filter by user: @context.userId:u_abc123
tracker.on('pipe:error', (err, sink) => {
console.error('Datadog sink failed:', err);
});

The Datadog addAction call is synchronous under the hood. If the client throws, the error is caught and emitted as a pipe:error event without affecting other sinks.