Skip to content

Commit a672269

Browse files
committed
export telemetry from ReplayMap
1 parent 2c62d89 commit a672269

File tree

5 files changed

+40
-17
lines changed

5 files changed

+40
-17
lines changed

src/browser/core.js

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,9 @@ function Rollbar(options, client) {
3333
this.tracing = new Tracing(_gWindow(), this.options);
3434
this.tracing.initSession();
3535
}
36+
if (Telemeter) {
37+
this.telemeter = new Telemeter(this.options, this.tracing);
38+
}
3639

3740
if (Recorder && _.isBrowser()) {
3841
const recorderOptions = this.options.recorder;
@@ -41,16 +44,14 @@ function Rollbar(options, client) {
4144
recorder: this.recorder,
4245
api: api,
4346
tracing: this.tracing,
47+
telemeter: this.telemeter,
4448
});
4549

4650
if (recorderOptions.enabled && recorderOptions.autoStart) {
4751
this.recorder.start();
4852
}
4953
}
5054

51-
if (Telemeter) {
52-
this.telemeter = new Telemeter(this.options, this.tracing);
53-
}
5455
this.client =
5556
client ||
5657
new Client(

src/browser/replay/replayMap.js

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ export default class ReplayMap {
1111
#recorder;
1212
#api;
1313
#tracing;
14+
#telemeter;
1415

1516
/**
1617
* Creates a new ReplayMap instance
@@ -20,7 +21,7 @@ export default class ReplayMap {
2021
* @param {Object} props.api - The API instance used to send replay payloads to the backend
2122
* @param {Object} props.tracing - The tracing instance used to create spans and manage context
2223
*/
23-
constructor({ recorder, api, tracing }) {
24+
constructor({ recorder, api, tracing, telemeter }) {
2425
if (!recorder) {
2526
throw new TypeError("Expected 'recorder' to be provided");
2627
}
@@ -37,6 +38,7 @@ export default class ReplayMap {
3738
this.#recorder = recorder;
3839
this.#api = api;
3940
this.#tracing = tracing;
41+
this.#telemeter = telemeter;
4042
}
4143

4244
/**
@@ -51,6 +53,8 @@ export default class ReplayMap {
5153
*/
5254
async _processReplay(replayId, occurrenceUuid) {
5355
try {
56+
this.#telemeter?.exportTelemetrySpan({'rollbar.replay.id': replayId});
57+
5458
const payload = this.#recorder.dump(
5559
this.#tracing,
5660
replayId,

src/rollbar.js

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -167,11 +167,6 @@ Rollbar.prototype._log = function (defaultLevel, item) {
167167
if (telemeter) {
168168
telemeter._captureRollbarItem(item);
169169
item.telemetryEvents = telemeter.copyEvents() || [];
170-
171-
if (telemeter.telemetrySpan) {
172-
telemeter.telemetrySpan.end({'rollbar.replay.id': replayId});
173-
telemeter.telemetrySpan = telemeter.tracing.startSpan('rollbar-telemetry', {});
174-
}
175170
}
176171

177172
this.notifier.log(item, callback);

src/telemetry.js

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,14 @@ Telemeter.prototype.copyEvents = function () {
5050
return events;
5151
};
5252

53+
54+
Telemeter.prototype.exportTelemetrySpan = function (attributes = {}) {
55+
if (this.telemetrySpan) {
56+
this.telemetrySpan.end(attributes);
57+
this.telemetrySpan = this.tracing.startSpan('rollbar-telemetry', {});
58+
}
59+
};
60+
5361
Telemeter.prototype.capture = function (
5462
type,
5563
metadata,

test/replay/integration/e2e.test.js

Lines changed: 23 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import { expect } from 'chai';
77
import sinon from 'sinon';
88

99
import Tracing from '../../../src/tracing/tracing.js';
10+
import Telemeter from '../../../src/telemetry.js';
1011
import Recorder from '../../../src/browser/replay/recorder.js';
1112
import ReplayMap from '../../../src/browser/replay/replayMap.js';
1213
import recorderDefaults from '../../../src/browser/replay/defaults.js';
@@ -37,6 +38,7 @@ const options = {
3738

3839
describe('Session Replay E2E', function () {
3940
let tracing;
41+
let telemeter;
4042
let recorder;
4143
let api;
4244
let transport;
@@ -73,6 +75,7 @@ describe('Session Replay E2E', function () {
7375
urlMock,
7476
truncationMock,
7577
);
78+
telemeter = new Telemeter({}, tracing);
7679

7780
recorder = new Recorder(options.recorder, mockRecordFn);
7881

@@ -82,6 +85,7 @@ describe('Session Replay E2E', function () {
8285
recorder,
8386
api,
8487
tracing,
88+
telemeter,
8589
});
8690

8791
queue = new Queue(rateLimiter, api, logger, { transmit: true }, replayMap);
@@ -146,24 +150,35 @@ describe('Session Replay E2E', function () {
146150
payloads.standardPayload.resourceSpans[0].resource,
147151
);
148152

149-
const span = resourceSpan.scopeSpans[0].spans[0];
150-
expect(span).to.have.property('name', 'rrweb-replay-recording');
151-
expect(span).to.have.property('events');
152-
expect(span.events).to.be.an('array');
153-
expect(span).to.have.property('attributes').that.is.an('array');
154-
expect(span.attributes).to.have.lengthOf(2);
153+
const span_t = resourceSpan.scopeSpans[0].spans[0]; // telemetry span
154+
const span_r = resourceSpan.scopeSpans[0].spans[1]; // recording span
155155

156-
expect(span.attributes).to.deep.include({
156+
expect(span_r).to.have.property('name', 'rrweb-replay-recording');
157+
expect(span_r).to.have.property('events');
158+
expect(span_r.events).to.be.an('array');
159+
expect(span_r).to.have.property('attributes').that.is.an('array');
160+
expect(span_r.attributes).to.have.lengthOf(2);
161+
162+
expect(span_r.attributes).to.deep.include({
157163
key: 'rollbar.replay.id',
158164
value: { stringValue: expectedReplayId },
159165
});
160166

161-
const sessionIdAttr = span.attributes.find(
167+
const sessionIdAttr = span_r.attributes.find(
162168
(attr) => attr.key === 'session.id',
163169
);
164170
expect(sessionIdAttr).to.exist;
165171
expect(sessionIdAttr.value.stringValue).to.match(/^[0-9a-fA-F]{32}$/);
166172

173+
expect(span_t).to.have.property('name', 'rollbar-telemetry');
174+
expect(span_t.attributes).to.deep.include({
175+
key: 'rollbar.replay.id',
176+
value: { stringValue: expectedReplayId },
177+
});
178+
expect(sessionIdAttr).to.deep.equal(
179+
span_t.attributes.find((attr) => attr.key === 'session.id'),
180+
);
181+
167182
const transportArgs = transport.post.lastCall.args;
168183
expect(transportArgs[1].path).to.include('/api/1/session/');
169184

0 commit comments

Comments
 (0)