Skip to content

Commit 6b3125d

Browse files
committed
Attach fid to captureError in telemetry
1 parent 836a427 commit 6b3125d

File tree

5 files changed

+33
-3
lines changed

5 files changed

+33
-3
lines changed

packages/telemetry/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@
7171
"peerDependencies": {
7272
"@firebase/app": "0.x",
7373
"@firebase/app-types": "0.x",
74+
"@firebase/installations": "0.x",
7475
"@types/react": "17.x || 18.x || 19.x",
7576
"react": "17.x || 18.x || 19.x"
7677
},

packages/telemetry/src/api.test.ts

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,8 @@ const fakeTelemetry: Telemetry = {
6767
appId: APP_ID
6868
}
6969
},
70-
loggerProvider: fakeLoggerProvider
70+
loggerProvider: fakeLoggerProvider,
71+
fid: 'fid-1234'
7172
};
7273

7374
describe('Top level API', () => {
@@ -123,6 +124,7 @@ describe('Top level API', () => {
123124
expect(log.severityNumber).to.equal(SeverityNumber.ERROR);
124125
expect(log.body).to.equal('This is a test error');
125126
expect(log.attributes).to.deep.equal({
127+
'user.id': 'fid-1234',
126128
'error.type': 'TestError',
127129
'error.stack': '...stack trace...',
128130
'app.version': 'unset'
@@ -140,6 +142,7 @@ describe('Top level API', () => {
140142
expect(log.severityNumber).to.equal(SeverityNumber.ERROR);
141143
expect(log.body).to.equal('error with no stack');
142144
expect(log.attributes).to.deep.equal({
145+
'user.id': 'fid-1234',
143146
'error.type': 'Error',
144147
'error.stack': 'No stack trace available',
145148
'app.version': 'unset'
@@ -191,6 +194,7 @@ describe('Top level API', () => {
191194
await provider.shutdown();
192195

193196
expect(emittedLogs[0].attributes).to.deep.equal({
197+
'user.id': 'fid-1234',
194198
'error.type': 'TestError',
195199
'error.stack': '...stack trace...',
196200
'app.version': 'unset',
@@ -216,6 +220,7 @@ describe('Top level API', () => {
216220
expect(emittedLogs.length).to.equal(1);
217221
const log = emittedLogs[0];
218222
expect(log.attributes).to.deep.equal({
223+
'user.id': 'fid-1234',
219224
'error.type': 'TestError',
220225
'error.stack': '...stack trace...',
221226
'app.version': 'unset',
@@ -263,6 +268,16 @@ describe('Top level API', () => {
263268

264269
function getFakeApp(): FirebaseApp {
265270
registerTelemetry();
271+
_registerComponent(
272+
new Component(
273+
'installations-internal',
274+
() => ({
275+
getId: () => Promise.resolve('fid-1234'),
276+
getToken: () => Promise.resolve('token-5678')
277+
}),
278+
ComponentType.PRIVATE
279+
)
280+
);
266281
_registerComponent(
267282
new Component(
268283
'app-check-internal',
@@ -281,7 +296,7 @@ function getFakeApp(): FirebaseApp {
281296
// @ts-ignore
282297
() => {
283298
return {
284-
triggerHeartbeat: () => {}
299+
triggerHeartbeat: () => { }
285300
};
286301
},
287302
ComponentType.PUBLIC

packages/telemetry/src/api.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,12 @@ export function captureError(
100100
}
101101
customAttributes['app.version'] = appVersion;
102102

103+
// Set firebase installation ID ("FID") if available, which
104+
// represents the "user" who experienced the error.
105+
if (telemetry.fid) {
106+
customAttributes['user.id'] = telemetry.fid;
107+
}
108+
103109
if (error instanceof Error) {
104110
logger.emit({
105111
severityNumber: SeverityNumber.ERROR,

packages/telemetry/src/public-types.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,13 @@ export interface Telemetry {
3333

3434
/** The {@link LoggerProvider} this {@link Telemetry} instance uses. */
3535
loggerProvider: LoggerProvider;
36+
37+
/**
38+
* The Firebase Installation ID.
39+
*
40+
* @internal
41+
*/
42+
fid?: string;
3643
}
3744

3845
/**

packages/telemetry/src/service.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,12 @@
1818
import { _FirebaseService, FirebaseApp } from '@firebase/app';
1919
import { Telemetry, TelemetryOptions } from './public-types';
2020
import { LoggerProvider } from '@opentelemetry/sdk-logs';
21+
import { getInstallations, getId } from '@firebase/installations';
2122

2223
export class TelemetryService implements Telemetry, _FirebaseService {
2324
private _options?: TelemetryOptions;
2425

25-
constructor(public app: FirebaseApp, public loggerProvider: LoggerProvider) {}
26+
constructor(public app: FirebaseApp, public loggerProvider: LoggerProvider) { }
2627

2728
_delete(): Promise<void> {
2829
return Promise.resolve();

0 commit comments

Comments
 (0)