@sentry/node 10.0.0-alpha.1 → 10.0.0-beta.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/cjs/index.js +2 -0
- package/build/cjs/index.js.map +1 -1
- package/build/cjs/integrations/tracing/fastify/index.js +57 -11
- package/build/cjs/integrations/tracing/fastify/index.js.map +1 -1
- package/build/cjs/integrations/tracing/firebase/firebase.js +32 -0
- package/build/cjs/integrations/tracing/firebase/firebase.js.map +1 -0
- package/build/cjs/integrations/tracing/firebase/otel/firebaseInstrumentation.js +41 -0
- package/build/cjs/integrations/tracing/firebase/otel/firebaseInstrumentation.js.map +1 -0
- package/build/cjs/integrations/tracing/firebase/otel/patches/firestore.js +295 -0
- package/build/cjs/integrations/tracing/firebase/otel/patches/firestore.js.map +1 -0
- package/build/cjs/integrations/tracing/index.js +3 -0
- package/build/cjs/integrations/tracing/index.js.map +1 -1
- package/build/cjs/integrations/tracing/vercelai/instrumentation.js +15 -2
- package/build/cjs/integrations/tracing/vercelai/instrumentation.js.map +1 -1
- package/build/esm/index.js +1 -0
- package/build/esm/index.js.map +1 -1
- package/build/esm/integrations/tracing/fastify/index.js +57 -11
- package/build/esm/integrations/tracing/fastify/index.js.map +1 -1
- package/build/esm/integrations/tracing/firebase/firebase.js +29 -0
- package/build/esm/integrations/tracing/firebase/firebase.js.map +1 -0
- package/build/esm/integrations/tracing/firebase/otel/firebaseInstrumentation.js +39 -0
- package/build/esm/integrations/tracing/firebase/otel/firebaseInstrumentation.js.map +1 -0
- package/build/esm/integrations/tracing/firebase/otel/patches/firestore.js +292 -0
- package/build/esm/integrations/tracing/firebase/otel/patches/firestore.js.map +1 -0
- package/build/esm/integrations/tracing/index.js +3 -0
- package/build/esm/integrations/tracing/index.js.map +1 -1
- package/build/esm/integrations/tracing/vercelai/instrumentation.js +16 -3
- package/build/esm/integrations/tracing/vercelai/instrumentation.js.map +1 -1
- package/build/esm/package.json +1 -1
- package/build/types/index.d.ts +1 -0
- package/build/types/index.d.ts.map +1 -1
- package/build/types/integrations/tracing/fastify/index.d.ts +38 -2
- package/build/types/integrations/tracing/fastify/index.d.ts.map +1 -1
- package/build/types/integrations/tracing/firebase/firebase.d.ts +6 -0
- package/build/types/integrations/tracing/firebase/firebase.d.ts.map +1 -0
- package/build/types/integrations/tracing/firebase/index.d.ts +2 -0
- package/build/types/integrations/tracing/firebase/index.d.ts.map +1 -0
- package/build/types/integrations/tracing/firebase/otel/firebaseInstrumentation.d.ts +19 -0
- package/build/types/integrations/tracing/firebase/otel/firebaseInstrumentation.d.ts.map +1 -0
- package/build/types/integrations/tracing/firebase/otel/index.d.ts +3 -0
- package/build/types/integrations/tracing/firebase/otel/index.d.ts.map +1 -0
- package/build/types/integrations/tracing/firebase/otel/patches/firestore.d.ts +23 -0
- package/build/types/integrations/tracing/firebase/otel/patches/firestore.d.ts.map +1 -0
- package/build/types/integrations/tracing/firebase/otel/types.d.ts +86 -0
- package/build/types/integrations/tracing/firebase/otel/types.d.ts.map +1 -0
- package/build/types/integrations/tracing/index.d.ts.map +1 -1
- package/build/types/integrations/tracing/vercelai/instrumentation.d.ts.map +1 -1
- package/build/types-ts3.8/index.d.ts +1 -0
- package/build/types-ts3.8/integrations/tracing/fastify/index.d.ts +38 -2
- package/build/types-ts3.8/integrations/tracing/firebase/firebase.d.ts +6 -0
- package/build/types-ts3.8/integrations/tracing/firebase/index.d.ts +2 -0
- package/build/types-ts3.8/integrations/tracing/firebase/otel/firebaseInstrumentation.d.ts +19 -0
- package/build/types-ts3.8/integrations/tracing/firebase/otel/index.d.ts +3 -0
- package/build/types-ts3.8/integrations/tracing/firebase/otel/patches/firestore.d.ts +23 -0
- package/build/types-ts3.8/integrations/tracing/firebase/otel/types.d.ts +86 -0
- package/package.json +5 -5
|
@@ -0,0 +1,292 @@
|
|
|
1
|
+
import * as net from 'node:net';
|
|
2
|
+
import { SpanKind, context, trace, diag } from '@opentelemetry/api';
|
|
3
|
+
import { InstrumentationNodeModuleDefinition, InstrumentationNodeModuleFile, isWrapped, safeExecuteInTheMiddle } from '@opentelemetry/instrumentation';
|
|
4
|
+
import { ATTR_DB_OPERATION_NAME, ATTR_DB_NAMESPACE, ATTR_DB_COLLECTION_NAME, ATTR_DB_SYSTEM_NAME, ATTR_SERVER_ADDRESS, ATTR_SERVER_PORT } from '@opentelemetry/semantic-conventions';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
*
|
|
8
|
+
* @param tracer - Opentelemetry Tracer
|
|
9
|
+
* @param firestoreSupportedVersions - supported version of firebase/firestore
|
|
10
|
+
* @param wrap - reference to native instrumentation wrap function
|
|
11
|
+
* @param unwrap - reference to native instrumentation wrap function
|
|
12
|
+
*/
|
|
13
|
+
function patchFirestore(
|
|
14
|
+
tracer,
|
|
15
|
+
firestoreSupportedVersions,
|
|
16
|
+
wrap,
|
|
17
|
+
unwrap,
|
|
18
|
+
config,
|
|
19
|
+
) {
|
|
20
|
+
// eslint-disable-next-line @typescript-eslint/no-empty-function
|
|
21
|
+
const defaultFirestoreSpanCreationHook = () => {};
|
|
22
|
+
|
|
23
|
+
let firestoreSpanCreationHook = defaultFirestoreSpanCreationHook;
|
|
24
|
+
const configFirestoreSpanCreationHook = config.firestoreSpanCreationHook;
|
|
25
|
+
|
|
26
|
+
if (typeof configFirestoreSpanCreationHook === 'function') {
|
|
27
|
+
firestoreSpanCreationHook = (span) => {
|
|
28
|
+
safeExecuteInTheMiddle(
|
|
29
|
+
() => configFirestoreSpanCreationHook(span),
|
|
30
|
+
error => {
|
|
31
|
+
if (!error) {
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
diag.error(error?.message);
|
|
35
|
+
},
|
|
36
|
+
true,
|
|
37
|
+
);
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
const moduleFirestoreCJS = new InstrumentationNodeModuleDefinition(
|
|
42
|
+
'@firebase/firestore',
|
|
43
|
+
firestoreSupportedVersions,
|
|
44
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
45
|
+
(moduleExports) => wrapMethods(moduleExports, wrap, unwrap, tracer, firestoreSpanCreationHook),
|
|
46
|
+
);
|
|
47
|
+
const files = [
|
|
48
|
+
'@firebase/firestore/dist/lite/index.node.cjs.js',
|
|
49
|
+
'@firebase/firestore/dist/lite/index.node.mjs.js',
|
|
50
|
+
'@firebase/firestore/dist/lite/index.rn.esm2017.js',
|
|
51
|
+
'@firebase/firestore/dist/lite/index.cjs.js',
|
|
52
|
+
];
|
|
53
|
+
|
|
54
|
+
for (const file of files) {
|
|
55
|
+
moduleFirestoreCJS.files.push(
|
|
56
|
+
new InstrumentationNodeModuleFile(
|
|
57
|
+
file,
|
|
58
|
+
firestoreSupportedVersions,
|
|
59
|
+
moduleExports => wrapMethods(moduleExports, wrap, unwrap, tracer, firestoreSpanCreationHook),
|
|
60
|
+
moduleExports => unwrapMethods(moduleExports, unwrap),
|
|
61
|
+
),
|
|
62
|
+
);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
return moduleFirestoreCJS;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
function wrapMethods(
|
|
69
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
70
|
+
moduleExports,
|
|
71
|
+
wrap,
|
|
72
|
+
unwrap,
|
|
73
|
+
tracer,
|
|
74
|
+
firestoreSpanCreationHook,
|
|
75
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
76
|
+
) {
|
|
77
|
+
unwrapMethods(moduleExports, unwrap);
|
|
78
|
+
|
|
79
|
+
wrap(moduleExports, 'addDoc', patchAddDoc(tracer, firestoreSpanCreationHook));
|
|
80
|
+
wrap(moduleExports, 'getDocs', patchGetDocs(tracer, firestoreSpanCreationHook));
|
|
81
|
+
wrap(moduleExports, 'setDoc', patchSetDoc(tracer, firestoreSpanCreationHook));
|
|
82
|
+
wrap(moduleExports, 'deleteDoc', patchDeleteDoc(tracer, firestoreSpanCreationHook));
|
|
83
|
+
|
|
84
|
+
return moduleExports;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
function unwrapMethods(
|
|
88
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
89
|
+
moduleExports,
|
|
90
|
+
unwrap,
|
|
91
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
92
|
+
) {
|
|
93
|
+
for (const method of ['addDoc', 'getDocs', 'setDoc', 'deleteDoc']) {
|
|
94
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
|
|
95
|
+
if (isWrapped(moduleExports[method])) {
|
|
96
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-argument
|
|
97
|
+
unwrap(moduleExports, method);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
return moduleExports;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
function patchAddDoc(
|
|
104
|
+
tracer,
|
|
105
|
+
firestoreSpanCreationHook,
|
|
106
|
+
)
|
|
107
|
+
|
|
108
|
+
{
|
|
109
|
+
return function addDoc(original) {
|
|
110
|
+
return function (
|
|
111
|
+
reference,
|
|
112
|
+
data,
|
|
113
|
+
) {
|
|
114
|
+
const span = startDBSpan(tracer, 'addDoc', reference);
|
|
115
|
+
firestoreSpanCreationHook(span);
|
|
116
|
+
return executeContextWithSpan(span, () => {
|
|
117
|
+
return original(reference, data);
|
|
118
|
+
});
|
|
119
|
+
};
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
function patchDeleteDoc(
|
|
124
|
+
tracer,
|
|
125
|
+
firestoreSpanCreationHook,
|
|
126
|
+
)
|
|
127
|
+
|
|
128
|
+
{
|
|
129
|
+
return function deleteDoc(original) {
|
|
130
|
+
return function (reference) {
|
|
131
|
+
const span = startDBSpan(tracer, 'deleteDoc', reference.parent || reference);
|
|
132
|
+
firestoreSpanCreationHook(span);
|
|
133
|
+
return executeContextWithSpan(span, () => {
|
|
134
|
+
return original(reference);
|
|
135
|
+
});
|
|
136
|
+
};
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
function patchGetDocs(
|
|
141
|
+
tracer,
|
|
142
|
+
firestoreSpanCreationHook,
|
|
143
|
+
)
|
|
144
|
+
|
|
145
|
+
{
|
|
146
|
+
return function getDocs(original) {
|
|
147
|
+
return function (
|
|
148
|
+
reference,
|
|
149
|
+
) {
|
|
150
|
+
const span = startDBSpan(tracer, 'getDocs', reference);
|
|
151
|
+
firestoreSpanCreationHook(span);
|
|
152
|
+
return executeContextWithSpan(span, () => {
|
|
153
|
+
return original(reference);
|
|
154
|
+
});
|
|
155
|
+
};
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
function patchSetDoc(
|
|
160
|
+
tracer,
|
|
161
|
+
firestoreSpanCreationHook,
|
|
162
|
+
)
|
|
163
|
+
|
|
164
|
+
{
|
|
165
|
+
return function setDoc(original) {
|
|
166
|
+
return function (
|
|
167
|
+
reference,
|
|
168
|
+
data,
|
|
169
|
+
options,
|
|
170
|
+
) {
|
|
171
|
+
const span = startDBSpan(tracer, 'setDoc', reference.parent || reference);
|
|
172
|
+
firestoreSpanCreationHook(span);
|
|
173
|
+
|
|
174
|
+
return executeContextWithSpan(span, () => {
|
|
175
|
+
return typeof options !== 'undefined' ? original(reference, data, options) : original(reference, data);
|
|
176
|
+
});
|
|
177
|
+
};
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
function executeContextWithSpan(span, callback) {
|
|
182
|
+
return context.with(trace.setSpan(context.active(), span), () => {
|
|
183
|
+
return safeExecuteInTheMiddle(
|
|
184
|
+
() => {
|
|
185
|
+
return callback();
|
|
186
|
+
},
|
|
187
|
+
err => {
|
|
188
|
+
if (err) {
|
|
189
|
+
span.recordException(err);
|
|
190
|
+
}
|
|
191
|
+
span.end();
|
|
192
|
+
},
|
|
193
|
+
true,
|
|
194
|
+
);
|
|
195
|
+
});
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
function startDBSpan(
|
|
199
|
+
tracer,
|
|
200
|
+
spanName,
|
|
201
|
+
reference,
|
|
202
|
+
) {
|
|
203
|
+
const span = tracer.startSpan(`${spanName} ${reference.path}`, { kind: SpanKind.CLIENT });
|
|
204
|
+
addAttributes(span, reference);
|
|
205
|
+
span.setAttribute(ATTR_DB_OPERATION_NAME, spanName);
|
|
206
|
+
return span;
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
/**
|
|
210
|
+
* Gets the server address and port attributes from the Firestore settings.
|
|
211
|
+
* It's best effort to extract the address and port from the settings, especially for IPv6.
|
|
212
|
+
* @param span - The span to set attributes on.
|
|
213
|
+
* @param settings - The Firestore settings containing host information.
|
|
214
|
+
*/
|
|
215
|
+
function getPortAndAddress(settings)
|
|
216
|
+
|
|
217
|
+
{
|
|
218
|
+
let address;
|
|
219
|
+
let port;
|
|
220
|
+
|
|
221
|
+
if (typeof settings.host === 'string') {
|
|
222
|
+
if (settings.host.startsWith('[')) {
|
|
223
|
+
// IPv6 addresses can be enclosed in square brackets, e.g., [2001:db8::1]:8080
|
|
224
|
+
if (settings.host.endsWith(']')) {
|
|
225
|
+
// IPv6 with square brackets without port
|
|
226
|
+
address = settings.host.replace(/^\[|\]$/g, '');
|
|
227
|
+
} else if (settings.host.includes(']:')) {
|
|
228
|
+
// IPv6 with square brackets with port
|
|
229
|
+
const lastColonIndex = settings.host.lastIndexOf(':');
|
|
230
|
+
if (lastColonIndex !== -1) {
|
|
231
|
+
address = settings.host.slice(1, lastColonIndex).replace(/^\[|\]$/g, '');
|
|
232
|
+
port = settings.host.slice(lastColonIndex + 1);
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
} else {
|
|
236
|
+
// IPv4 or IPv6 without square brackets
|
|
237
|
+
// If it's an IPv6 address without square brackets, we assume it does not have a port.
|
|
238
|
+
if (net.isIPv6(settings.host)) {
|
|
239
|
+
address = settings.host;
|
|
240
|
+
}
|
|
241
|
+
// If it's an IPv4 address, we can extract the port if it exists.
|
|
242
|
+
else {
|
|
243
|
+
const lastColonIndex = settings.host.lastIndexOf(':');
|
|
244
|
+
if (lastColonIndex !== -1) {
|
|
245
|
+
address = settings.host.slice(0, lastColonIndex);
|
|
246
|
+
port = settings.host.slice(lastColonIndex + 1);
|
|
247
|
+
} else {
|
|
248
|
+
address = settings.host;
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
return {
|
|
254
|
+
address: address,
|
|
255
|
+
port: port ? parseInt(port, 10) : undefined,
|
|
256
|
+
};
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
function addAttributes(
|
|
260
|
+
span,
|
|
261
|
+
reference,
|
|
262
|
+
) {
|
|
263
|
+
const firestoreApp = reference.firestore.app;
|
|
264
|
+
const firestoreOptions = firestoreApp.options;
|
|
265
|
+
const json = reference.firestore.toJSON() || {};
|
|
266
|
+
const settings = json.settings || {};
|
|
267
|
+
|
|
268
|
+
const attributes = {
|
|
269
|
+
[ATTR_DB_COLLECTION_NAME]: reference.path,
|
|
270
|
+
[ATTR_DB_NAMESPACE]: firestoreApp.name,
|
|
271
|
+
[ATTR_DB_SYSTEM_NAME]: 'firebase.firestore',
|
|
272
|
+
'firebase.firestore.type': reference.type,
|
|
273
|
+
'firebase.firestore.options.projectId': firestoreOptions.projectId,
|
|
274
|
+
'firebase.firestore.options.appId': firestoreOptions.appId,
|
|
275
|
+
'firebase.firestore.options.messagingSenderId': firestoreOptions.messagingSenderId,
|
|
276
|
+
'firebase.firestore.options.storageBucket': firestoreOptions.storageBucket,
|
|
277
|
+
};
|
|
278
|
+
|
|
279
|
+
const { address, port } = getPortAndAddress(settings);
|
|
280
|
+
|
|
281
|
+
if (address) {
|
|
282
|
+
attributes[ATTR_SERVER_ADDRESS] = address;
|
|
283
|
+
}
|
|
284
|
+
if (port) {
|
|
285
|
+
attributes[ATTR_SERVER_PORT] = port;
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
span.setAttributes(attributes);
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
export { getPortAndAddress, patchFirestore };
|
|
292
|
+
//# sourceMappingURL=firestore.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"firestore.js","sources":["../../../../../../../src/integrations/tracing/firebase/otel/patches/firestore.ts"],"sourcesContent":["import * as net from 'node:net';\nimport type { Span, Tracer } from '@opentelemetry/api';\nimport { context, diag, SpanKind, trace } from '@opentelemetry/api';\nimport {\n InstrumentationNodeModuleDefinition,\n InstrumentationNodeModuleFile,\n isWrapped,\n safeExecuteInTheMiddle,\n} from '@opentelemetry/instrumentation';\nimport {\n ATTR_DB_COLLECTION_NAME,\n ATTR_DB_NAMESPACE,\n ATTR_DB_OPERATION_NAME,\n ATTR_DB_SYSTEM_NAME,\n ATTR_SERVER_ADDRESS,\n ATTR_SERVER_PORT,\n} from '@opentelemetry/semantic-conventions';\nimport type { SpanAttributes } from '@sentry/core';\nimport type { unwrap as shimmerUnwrap, wrap as shimmerWrap } from 'shimmer';\nimport type { FirebaseInstrumentation } from '../firebaseInstrumentation';\nimport type {\n AddDocType,\n CollectionReference,\n DeleteDocType,\n DocumentData,\n DocumentReference,\n FirebaseApp,\n FirebaseInstrumentationConfig,\n FirebaseOptions,\n FirestoreSettings,\n FirestoreSpanCreationHook,\n GetDocsType,\n PartialWithFieldValue,\n QuerySnapshot,\n SetDocType,\n SetOptions,\n WithFieldValue,\n} from '../types';\n\n/**\n *\n * @param tracer - Opentelemetry Tracer\n * @param firestoreSupportedVersions - supported version of firebase/firestore\n * @param wrap - reference to native instrumentation wrap function\n * @param unwrap - reference to native instrumentation wrap function\n */\nexport function patchFirestore(\n tracer: Tracer,\n firestoreSupportedVersions: string[],\n wrap: typeof shimmerWrap,\n unwrap: typeof shimmerUnwrap,\n config: FirebaseInstrumentationConfig,\n): InstrumentationNodeModuleDefinition {\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n const defaultFirestoreSpanCreationHook: FirestoreSpanCreationHook = () => {};\n\n let firestoreSpanCreationHook: FirestoreSpanCreationHook = defaultFirestoreSpanCreationHook;\n const configFirestoreSpanCreationHook = config.firestoreSpanCreationHook;\n\n if (typeof configFirestoreSpanCreationHook === 'function') {\n firestoreSpanCreationHook = (span: Span) => {\n safeExecuteInTheMiddle(\n () => configFirestoreSpanCreationHook(span),\n error => {\n if (!error) {\n return;\n }\n diag.error(error?.message);\n },\n true,\n );\n };\n }\n\n const moduleFirestoreCJS = new InstrumentationNodeModuleDefinition(\n '@firebase/firestore',\n firestoreSupportedVersions,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (moduleExports: any) => wrapMethods(moduleExports, wrap, unwrap, tracer, firestoreSpanCreationHook),\n );\n const files: string[] = [\n '@firebase/firestore/dist/lite/index.node.cjs.js',\n '@firebase/firestore/dist/lite/index.node.mjs.js',\n '@firebase/firestore/dist/lite/index.rn.esm2017.js',\n '@firebase/firestore/dist/lite/index.cjs.js',\n ];\n\n for (const file of files) {\n moduleFirestoreCJS.files.push(\n new InstrumentationNodeModuleFile(\n file,\n firestoreSupportedVersions,\n moduleExports => wrapMethods(moduleExports, wrap, unwrap, tracer, firestoreSpanCreationHook),\n moduleExports => unwrapMethods(moduleExports, unwrap),\n ),\n );\n }\n\n return moduleFirestoreCJS;\n}\n\nfunction wrapMethods(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n moduleExports: any,\n wrap: typeof shimmerWrap,\n unwrap: typeof shimmerUnwrap,\n tracer: Tracer,\n firestoreSpanCreationHook: FirestoreSpanCreationHook,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n): any {\n unwrapMethods(moduleExports, unwrap);\n\n wrap(moduleExports, 'addDoc', patchAddDoc(tracer, firestoreSpanCreationHook));\n wrap(moduleExports, 'getDocs', patchGetDocs(tracer, firestoreSpanCreationHook));\n wrap(moduleExports, 'setDoc', patchSetDoc(tracer, firestoreSpanCreationHook));\n wrap(moduleExports, 'deleteDoc', patchDeleteDoc(tracer, firestoreSpanCreationHook));\n\n return moduleExports;\n}\n\nfunction unwrapMethods(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n moduleExports: any,\n unwrap: typeof shimmerUnwrap,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n): any {\n for (const method of ['addDoc', 'getDocs', 'setDoc', 'deleteDoc']) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n if (isWrapped(moduleExports[method])) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n unwrap(moduleExports, method);\n }\n }\n return moduleExports;\n}\n\nfunction patchAddDoc<AppModelType, DbModelType extends DocumentData>(\n tracer: Tracer,\n firestoreSpanCreationHook: FirestoreSpanCreationHook,\n): (\n original: AddDocType<AppModelType, DbModelType>,\n) => (\n this: FirebaseInstrumentation,\n reference: CollectionReference<AppModelType, DbModelType>,\n data: WithFieldValue<AppModelType>,\n) => Promise<DocumentReference<AppModelType, DbModelType>> {\n return function addDoc(original: AddDocType<AppModelType, DbModelType>) {\n return function (\n reference: CollectionReference<AppModelType, DbModelType>,\n data: WithFieldValue<AppModelType>,\n ): Promise<DocumentReference<AppModelType, DbModelType>> {\n const span = startDBSpan(tracer, 'addDoc', reference);\n firestoreSpanCreationHook(span);\n return executeContextWithSpan<Promise<DocumentReference<AppModelType, DbModelType>>>(span, () => {\n return original(reference, data);\n });\n };\n };\n}\n\nfunction patchDeleteDoc<AppModelType, DbModelType extends DocumentData>(\n tracer: Tracer,\n firestoreSpanCreationHook: FirestoreSpanCreationHook,\n): (\n original: DeleteDocType<AppModelType, DbModelType>,\n) => (this: FirebaseInstrumentation, reference: DocumentReference<AppModelType, DbModelType>) => Promise<void> {\n return function deleteDoc(original: DeleteDocType<AppModelType, DbModelType>) {\n return function (reference: DocumentReference<AppModelType, DbModelType>): Promise<void> {\n const span = startDBSpan(tracer, 'deleteDoc', reference.parent || reference);\n firestoreSpanCreationHook(span);\n return executeContextWithSpan<Promise<void>>(span, () => {\n return original(reference);\n });\n };\n };\n}\n\nfunction patchGetDocs<AppModelType, DbModelType extends DocumentData>(\n tracer: Tracer,\n firestoreSpanCreationHook: FirestoreSpanCreationHook,\n): (\n original: GetDocsType<AppModelType, DbModelType>,\n) => (\n this: FirebaseInstrumentation,\n reference: CollectionReference<AppModelType, DbModelType>,\n) => Promise<QuerySnapshot<AppModelType, DbModelType>> {\n return function getDocs(original: GetDocsType<AppModelType, DbModelType>) {\n return function (\n reference: CollectionReference<AppModelType, DbModelType>,\n ): Promise<QuerySnapshot<AppModelType, DbModelType>> {\n const span = startDBSpan(tracer, 'getDocs', reference);\n firestoreSpanCreationHook(span);\n return executeContextWithSpan<Promise<QuerySnapshot<AppModelType, DbModelType>>>(span, () => {\n return original(reference);\n });\n };\n };\n}\n\nfunction patchSetDoc<AppModelType, DbModelType extends DocumentData>(\n tracer: Tracer,\n firestoreSpanCreationHook: FirestoreSpanCreationHook,\n): (\n original: SetDocType<AppModelType, DbModelType>,\n) => (\n this: FirebaseInstrumentation,\n reference: DocumentReference<AppModelType, DbModelType>,\n data: WithFieldValue<AppModelType> & PartialWithFieldValue<AppModelType>,\n options?: SetOptions,\n) => Promise<void> {\n return function setDoc(original: SetDocType<AppModelType, DbModelType>) {\n return function (\n reference: DocumentReference<AppModelType, DbModelType>,\n data: WithFieldValue<AppModelType> & PartialWithFieldValue<AppModelType>,\n options?: SetOptions,\n ): Promise<void> {\n const span = startDBSpan(tracer, 'setDoc', reference.parent || reference);\n firestoreSpanCreationHook(span);\n\n return executeContextWithSpan<Promise<void>>(span, () => {\n return typeof options !== 'undefined' ? original(reference, data, options) : original(reference, data);\n });\n };\n };\n}\n\nfunction executeContextWithSpan<T>(span: Span, callback: () => T): T {\n return context.with(trace.setSpan(context.active(), span), () => {\n return safeExecuteInTheMiddle(\n (): T => {\n return callback();\n },\n err => {\n if (err) {\n span.recordException(err);\n }\n span.end();\n },\n true,\n );\n });\n}\n\nfunction startDBSpan<AppModelType, DbModelType extends DocumentData>(\n tracer: Tracer,\n spanName: string,\n reference: CollectionReference<AppModelType, DbModelType> | DocumentReference<AppModelType, DbModelType>,\n): Span {\n const span = tracer.startSpan(`${spanName} ${reference.path}`, { kind: SpanKind.CLIENT });\n addAttributes(span, reference);\n span.setAttribute(ATTR_DB_OPERATION_NAME, spanName);\n return span;\n}\n\n/**\n * Gets the server address and port attributes from the Firestore settings.\n * It's best effort to extract the address and port from the settings, especially for IPv6.\n * @param span - The span to set attributes on.\n * @param settings - The Firestore settings containing host information.\n */\nexport function getPortAndAddress(settings: FirestoreSettings): {\n address?: string;\n port?: number;\n} {\n let address: string | undefined;\n let port: string | undefined;\n\n if (typeof settings.host === 'string') {\n if (settings.host.startsWith('[')) {\n // IPv6 addresses can be enclosed in square brackets, e.g., [2001:db8::1]:8080\n if (settings.host.endsWith(']')) {\n // IPv6 with square brackets without port\n address = settings.host.replace(/^\\[|\\]$/g, '');\n } else if (settings.host.includes(']:')) {\n // IPv6 with square brackets with port\n const lastColonIndex = settings.host.lastIndexOf(':');\n if (lastColonIndex !== -1) {\n address = settings.host.slice(1, lastColonIndex).replace(/^\\[|\\]$/g, '');\n port = settings.host.slice(lastColonIndex + 1);\n }\n }\n } else {\n // IPv4 or IPv6 without square brackets\n // If it's an IPv6 address without square brackets, we assume it does not have a port.\n if (net.isIPv6(settings.host)) {\n address = settings.host;\n }\n // If it's an IPv4 address, we can extract the port if it exists.\n else {\n const lastColonIndex = settings.host.lastIndexOf(':');\n if (lastColonIndex !== -1) {\n address = settings.host.slice(0, lastColonIndex);\n port = settings.host.slice(lastColonIndex + 1);\n } else {\n address = settings.host;\n }\n }\n }\n }\n return {\n address: address,\n port: port ? parseInt(port, 10) : undefined,\n };\n}\n\nfunction addAttributes<AppModelType, DbModelType extends DocumentData>(\n span: Span,\n reference: CollectionReference<AppModelType, DbModelType> | DocumentReference<AppModelType, DbModelType>,\n): void {\n const firestoreApp: FirebaseApp = reference.firestore.app;\n const firestoreOptions: FirebaseOptions = firestoreApp.options;\n const json: { settings?: FirestoreSettings } = reference.firestore.toJSON() || {};\n const settings: FirestoreSettings = json.settings || {};\n\n const attributes: SpanAttributes = {\n [ATTR_DB_COLLECTION_NAME]: reference.path,\n [ATTR_DB_NAMESPACE]: firestoreApp.name,\n [ATTR_DB_SYSTEM_NAME]: 'firebase.firestore',\n 'firebase.firestore.type': reference.type,\n 'firebase.firestore.options.projectId': firestoreOptions.projectId,\n 'firebase.firestore.options.appId': firestoreOptions.appId,\n 'firebase.firestore.options.messagingSenderId': firestoreOptions.messagingSenderId,\n 'firebase.firestore.options.storageBucket': firestoreOptions.storageBucket,\n };\n\n const { address, port } = getPortAndAddress(settings);\n\n if (address) {\n attributes[ATTR_SERVER_ADDRESS] = address;\n }\n if (port) {\n attributes[ATTR_SERVER_PORT] = port;\n }\n\n span.setAttributes(attributes);\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -3,6 +3,7 @@ import { instrumentAmqplib, amqplibIntegration } from './amqplib.js';
|
|
|
3
3
|
import { instrumentConnect, connectIntegration } from './connect.js';
|
|
4
4
|
import { instrumentExpress, expressIntegration } from './express.js';
|
|
5
5
|
import { instrumentFastify, instrumentFastifyV3, fastifyIntegration } from './fastify/index.js';
|
|
6
|
+
import { instrumentFirebase, firebaseIntegration } from './firebase/firebase.js';
|
|
6
7
|
import { instrumentGenericPool, genericPoolIntegration } from './genericPool.js';
|
|
7
8
|
import { instrumentGraphql, graphqlIntegration } from './graphql.js';
|
|
8
9
|
import { instrumentHapi, hapiIntegration } from './hapi/index.js';
|
|
@@ -47,6 +48,7 @@ function getAutoPerformanceIntegrations() {
|
|
|
47
48
|
vercelAIIntegration(),
|
|
48
49
|
openAIIntegration(),
|
|
49
50
|
postgresJsIntegration(),
|
|
51
|
+
firebaseIntegration(),
|
|
50
52
|
];
|
|
51
53
|
}
|
|
52
54
|
|
|
@@ -79,6 +81,7 @@ function getOpenTelemetryInstrumentationToPreload() {
|
|
|
79
81
|
instrumentVercelAi,
|
|
80
82
|
instrumentOpenAi,
|
|
81
83
|
instrumentPostgresJs,
|
|
84
|
+
instrumentFirebase,
|
|
82
85
|
];
|
|
83
86
|
}
|
|
84
87
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../../src/integrations/tracing/index.ts"],"sourcesContent":["import type { Integration } from '@sentry/core';\nimport { instrumentOtelHttp } from '../http';\nimport { amqplibIntegration, instrumentAmqplib } from './amqplib';\nimport { connectIntegration, instrumentConnect } from './connect';\nimport { expressIntegration, instrumentExpress } from './express';\nimport { fastifyIntegration, instrumentFastify, instrumentFastifyV3 } from './fastify';\nimport { genericPoolIntegration, instrumentGenericPool } from './genericPool';\nimport { graphqlIntegration, instrumentGraphql } from './graphql';\nimport { hapiIntegration, instrumentHapi } from './hapi';\nimport { instrumentKafka, kafkaIntegration } from './kafka';\nimport { instrumentKoa, koaIntegration } from './koa';\nimport { instrumentLruMemoizer, lruMemoizerIntegration } from './lrumemoizer';\nimport { instrumentMongo, mongoIntegration } from './mongo';\nimport { instrumentMongoose, mongooseIntegration } from './mongoose';\nimport { instrumentMysql, mysqlIntegration } from './mysql';\nimport { instrumentMysql2, mysql2Integration } from './mysql2';\nimport { instrumentOpenAi, openAIIntegration } from './openai';\nimport { instrumentPostgres, postgresIntegration } from './postgres';\nimport { instrumentPostgresJs, postgresJsIntegration } from './postgresjs';\nimport { prismaIntegration } from './prisma';\nimport { instrumentRedis, redisIntegration } from './redis';\nimport { instrumentTedious, tediousIntegration } from './tedious';\nimport { instrumentVercelAi, vercelAIIntegration } from './vercelai';\n\n/**\n * With OTEL, all performance integrations will be added, as OTEL only initializes them when the patched package is actually required.\n */\nexport function getAutoPerformanceIntegrations(): Integration[] {\n return [\n expressIntegration(),\n fastifyIntegration(),\n graphqlIntegration(),\n mongoIntegration(),\n mongooseIntegration(),\n mysqlIntegration(),\n mysql2Integration(),\n redisIntegration(),\n postgresIntegration(),\n prismaIntegration(),\n hapiIntegration(),\n koaIntegration(),\n connectIntegration(),\n tediousIntegration(),\n genericPoolIntegration(),\n kafkaIntegration(),\n amqplibIntegration(),\n lruMemoizerIntegration(),\n vercelAIIntegration(),\n openAIIntegration(),\n postgresJsIntegration(),\n ];\n}\n\n/**\n * Get a list of methods to instrument OTEL, when preload instrumentation.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function getOpenTelemetryInstrumentationToPreload(): (((options?: any) => void) & { id: string })[] {\n return [\n instrumentOtelHttp,\n instrumentExpress,\n instrumentConnect,\n instrumentFastify,\n instrumentFastifyV3,\n instrumentHapi,\n instrumentKafka,\n instrumentKoa,\n instrumentLruMemoizer,\n instrumentMongo,\n instrumentMongoose,\n instrumentMysql,\n instrumentMysql2,\n instrumentPostgres,\n instrumentHapi,\n instrumentGraphql,\n instrumentRedis,\n instrumentTedious,\n instrumentGenericPool,\n instrumentAmqplib,\n instrumentVercelAi,\n instrumentOpenAi,\n instrumentPostgresJs,\n ];\n}\n"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../../src/integrations/tracing/index.ts"],"sourcesContent":["import type { Integration } from '@sentry/core';\nimport { instrumentOtelHttp } from '../http';\nimport { amqplibIntegration, instrumentAmqplib } from './amqplib';\nimport { connectIntegration, instrumentConnect } from './connect';\nimport { expressIntegration, instrumentExpress } from './express';\nimport { fastifyIntegration, instrumentFastify, instrumentFastifyV3 } from './fastify';\nimport { firebaseIntegration, instrumentFirebase } from './firebase';\nimport { genericPoolIntegration, instrumentGenericPool } from './genericPool';\nimport { graphqlIntegration, instrumentGraphql } from './graphql';\nimport { hapiIntegration, instrumentHapi } from './hapi';\nimport { instrumentKafka, kafkaIntegration } from './kafka';\nimport { instrumentKoa, koaIntegration } from './koa';\nimport { instrumentLruMemoizer, lruMemoizerIntegration } from './lrumemoizer';\nimport { instrumentMongo, mongoIntegration } from './mongo';\nimport { instrumentMongoose, mongooseIntegration } from './mongoose';\nimport { instrumentMysql, mysqlIntegration } from './mysql';\nimport { instrumentMysql2, mysql2Integration } from './mysql2';\nimport { instrumentOpenAi, openAIIntegration } from './openai';\nimport { instrumentPostgres, postgresIntegration } from './postgres';\nimport { instrumentPostgresJs, postgresJsIntegration } from './postgresjs';\nimport { prismaIntegration } from './prisma';\nimport { instrumentRedis, redisIntegration } from './redis';\nimport { instrumentTedious, tediousIntegration } from './tedious';\nimport { instrumentVercelAi, vercelAIIntegration } from './vercelai';\n\n/**\n * With OTEL, all performance integrations will be added, as OTEL only initializes them when the patched package is actually required.\n */\nexport function getAutoPerformanceIntegrations(): Integration[] {\n return [\n expressIntegration(),\n fastifyIntegration(),\n graphqlIntegration(),\n mongoIntegration(),\n mongooseIntegration(),\n mysqlIntegration(),\n mysql2Integration(),\n redisIntegration(),\n postgresIntegration(),\n prismaIntegration(),\n hapiIntegration(),\n koaIntegration(),\n connectIntegration(),\n tediousIntegration(),\n genericPoolIntegration(),\n kafkaIntegration(),\n amqplibIntegration(),\n lruMemoizerIntegration(),\n vercelAIIntegration(),\n openAIIntegration(),\n postgresJsIntegration(),\n firebaseIntegration(),\n ];\n}\n\n/**\n * Get a list of methods to instrument OTEL, when preload instrumentation.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function getOpenTelemetryInstrumentationToPreload(): (((options?: any) => void) & { id: string })[] {\n return [\n instrumentOtelHttp,\n instrumentExpress,\n instrumentConnect,\n instrumentFastify,\n instrumentFastifyV3,\n instrumentHapi,\n instrumentKafka,\n instrumentKoa,\n instrumentLruMemoizer,\n instrumentMongo,\n instrumentMongoose,\n instrumentMysql,\n instrumentMysql2,\n instrumentPostgres,\n instrumentHapi,\n instrumentGraphql,\n instrumentRedis,\n instrumentTedious,\n instrumentGenericPool,\n instrumentAmqplib,\n instrumentVercelAi,\n instrumentOpenAi,\n instrumentPostgresJs,\n instrumentFirebase,\n ];\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAyBA;AACA;AACA;AACO,SAAS,8BAA8B,GAAkB;AAChE,EAAE,OAAO;AACT,IAAI,kBAAkB,EAAE;AACxB,IAAI,kBAAkB,EAAE;AACxB,IAAI,kBAAkB,EAAE;AACxB,IAAI,gBAAgB,EAAE;AACtB,IAAI,mBAAmB,EAAE;AACzB,IAAI,gBAAgB,EAAE;AACtB,IAAI,iBAAiB,EAAE;AACvB,IAAI,gBAAgB,EAAE;AACtB,IAAI,mBAAmB,EAAE;AACzB,IAAI,iBAAiB,EAAE;AACvB,IAAI,eAAe,EAAE;AACrB,IAAI,cAAc,EAAE;AACpB,IAAI,kBAAkB,EAAE;AACxB,IAAI,kBAAkB,EAAE;AACxB,IAAI,sBAAsB,EAAE;AAC5B,IAAI,gBAAgB,EAAE;AACtB,IAAI,kBAAkB,EAAE;AACxB,IAAI,sBAAsB,EAAE;AAC5B,IAAI,mBAAmB,EAAE;AACzB,IAAI,iBAAiB,EAAE;AACvB,IAAI,qBAAqB,EAAE;AAC3B,IAAI,mBAAmB,EAAE;AACzB,GAAG;AACH;;AAEA;AACA;AACA;AACA;AACO,SAAS,wCAAwC,GAAmD;AAC3G,EAAE,OAAO;AACT,IAAI,kBAAkB;AACtB,IAAI,iBAAiB;AACrB,IAAI,iBAAiB;AACrB,IAAI,iBAAiB;AACrB,IAAI,mBAAmB;AACvB,IAAI,cAAc;AAClB,IAAI,eAAe;AACnB,IAAI,aAAa;AACjB,IAAI,qBAAqB;AACzB,IAAI,eAAe;AACnB,IAAI,kBAAkB;AACtB,IAAI,eAAe;AACnB,IAAI,gBAAgB;AACpB,IAAI,kBAAkB;AACtB,IAAI,cAAc;AAClB,IAAI,iBAAiB;AACrB,IAAI,eAAe;AACnB,IAAI,iBAAiB;AACrB,IAAI,qBAAqB;AACzB,IAAI,iBAAiB;AACrB,IAAI,kBAAkB;AACtB,IAAI,gBAAgB;AACpB,IAAI,oBAAoB;AACxB,IAAI,kBAAkB;AACtB,GAAG;AACH;;;;"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { InstrumentationBase, InstrumentationNodeModuleDefinition } from '@opentelemetry/instrumentation';
|
|
2
|
-
import { SDK_VERSION, getCurrentScope } from '@sentry/core';
|
|
2
|
+
import { SDK_VERSION, getCurrentScope, handleCallbackErrors, addNonEnumerableProperty, getActiveSpan } from '@sentry/core';
|
|
3
3
|
import { INTEGRATION_NAME } from './constants.js';
|
|
4
4
|
|
|
5
5
|
// List of patched methods
|
|
@@ -115,8 +115,21 @@ class SentryVercelAiInstrumentation extends InstrumentationBase {
|
|
|
115
115
|
recordOutputs,
|
|
116
116
|
};
|
|
117
117
|
|
|
118
|
-
|
|
119
|
-
|
|
118
|
+
return handleCallbackErrors(
|
|
119
|
+
() => {
|
|
120
|
+
// @ts-expect-error we know that the method exists
|
|
121
|
+
return originalMethod.apply(this, args);
|
|
122
|
+
},
|
|
123
|
+
error => {
|
|
124
|
+
// This error bubbles up to unhandledrejection handler (if not handled before),
|
|
125
|
+
// where we do not know the active span anymore
|
|
126
|
+
// So to circumvent this, we set the active span on the error object
|
|
127
|
+
// which is picked up by the unhandledrejection handler
|
|
128
|
+
if (error && typeof error === 'object') {
|
|
129
|
+
addNonEnumerableProperty(error, '_sentry_active_span', getActiveSpan());
|
|
130
|
+
}
|
|
131
|
+
},
|
|
132
|
+
);
|
|
120
133
|
};
|
|
121
134
|
}
|
|
122
135
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"instrumentation.js","sources":["../../../../../src/integrations/tracing/vercelai/instrumentation.ts"],"sourcesContent":["import type { InstrumentationConfig, InstrumentationModuleDefinition } from '@opentelemetry/instrumentation';\nimport { InstrumentationBase, InstrumentationNodeModuleDefinition } from '@opentelemetry/instrumentation';\nimport { getCurrentScope, SDK_VERSION } from '@sentry/core';\nimport { INTEGRATION_NAME } from './constants';\nimport type { TelemetrySettings, VercelAiIntegration } from './types';\n\n// List of patched methods\n// From: https://sdk.vercel.ai/docs/ai-sdk-core/telemetry#collected-data\nconst INSTRUMENTED_METHODS = [\n 'generateText',\n 'streamText',\n 'generateObject',\n 'streamObject',\n 'embed',\n 'embedMany',\n] as const;\n\ninterface MethodFirstArg extends Record<string, unknown> {\n experimental_telemetry?: TelemetrySettings;\n}\n\ntype MethodArgs = [MethodFirstArg, ...unknown[]];\n\ntype PatchedModuleExports = Record<(typeof INSTRUMENTED_METHODS)[number], (...args: MethodArgs) => unknown> &\n Record<string, unknown>;\n\ninterface RecordingOptions {\n recordInputs?: boolean;\n recordOutputs?: boolean;\n}\n\n/**\n * Determines whether to record inputs and outputs for Vercel AI telemetry based on the configuration hierarchy.\n *\n * The order of precedence is:\n * 1. The vercel ai integration options\n * 2. The experimental_telemetry options in the vercel ai method calls\n * 3. When telemetry is explicitly enabled (isEnabled: true), default to recording\n * 4. Otherwise, use the sendDefaultPii option from client options\n */\nexport function determineRecordingSettings(\n integrationRecordingOptions: RecordingOptions | undefined,\n methodTelemetryOptions: RecordingOptions,\n telemetryExplicitlyEnabled: boolean | undefined,\n defaultRecordingEnabled: boolean,\n): { recordInputs: boolean; recordOutputs: boolean } {\n const recordInputs =\n integrationRecordingOptions?.recordInputs !== undefined\n ? integrationRecordingOptions.recordInputs\n : methodTelemetryOptions.recordInputs !== undefined\n ? methodTelemetryOptions.recordInputs\n : telemetryExplicitlyEnabled === true\n ? true // When telemetry is explicitly enabled, default to recording inputs\n : defaultRecordingEnabled;\n\n const recordOutputs =\n integrationRecordingOptions?.recordOutputs !== undefined\n ? integrationRecordingOptions.recordOutputs\n : methodTelemetryOptions.recordOutputs !== undefined\n ? methodTelemetryOptions.recordOutputs\n : telemetryExplicitlyEnabled === true\n ? true // When telemetry is explicitly enabled, default to recording inputs\n : defaultRecordingEnabled;\n\n return { recordInputs, recordOutputs };\n}\n\n/**\n * This detects is added by the Sentry Vercel AI Integration to detect if the integration should\n * be enabled.\n *\n * It also patches the `ai` module to enable Vercel AI telemetry automatically for all methods.\n */\nexport class SentryVercelAiInstrumentation extends InstrumentationBase {\n private _isPatched = false;\n private _callbacks: (() => void)[] = [];\n\n public constructor(config: InstrumentationConfig = {}) {\n super('@sentry/instrumentation-vercel-ai', SDK_VERSION, config);\n }\n\n /**\n * Initializes the instrumentation by defining the modules to be patched.\n */\n public init(): InstrumentationModuleDefinition {\n const module = new InstrumentationNodeModuleDefinition('ai', ['>=3.0.0 <5'], this._patch.bind(this));\n return module;\n }\n\n /**\n * Call the provided callback when the module is patched.\n * If it has already been patched, the callback will be called immediately.\n */\n public callWhenPatched(callback: () => void): void {\n if (this._isPatched) {\n callback();\n } else {\n this._callbacks.push(callback);\n }\n }\n\n /**\n * Patches module exports to enable Vercel AI telemetry.\n */\n private _patch(moduleExports: PatchedModuleExports): unknown {\n this._isPatched = true;\n\n this._callbacks.forEach(callback => callback());\n this._callbacks = [];\n\n function generatePatch(originalMethod: (...args: MethodArgs) => unknown) {\n return (...args: MethodArgs) => {\n const existingExperimentalTelemetry = args[0].experimental_telemetry || {};\n const isEnabled = existingExperimentalTelemetry.isEnabled;\n\n const client = getCurrentScope().getClient();\n const integration = client?.getIntegrationByName<VercelAiIntegration>(INTEGRATION_NAME);\n const integrationOptions = integration?.options;\n const shouldRecordInputsAndOutputs = integration ? Boolean(client?.getOptions().sendDefaultPii) : false;\n\n const { recordInputs, recordOutputs } = determineRecordingSettings(\n integrationOptions,\n existingExperimentalTelemetry,\n isEnabled,\n shouldRecordInputsAndOutputs,\n );\n\n args[0].experimental_telemetry = {\n ...existingExperimentalTelemetry,\n isEnabled: isEnabled !== undefined ? isEnabled : true,\n recordInputs,\n recordOutputs,\n };\n\n // @ts-expect-error we know that the method exists\n return originalMethod.apply(this, args);\n };\n }\n\n // Is this an ESM module?\n // https://tc39.es/ecma262/#sec-module-namespace-objects\n if (Object.prototype.toString.call(moduleExports) === '[object Module]') {\n // In ESM we take the usual route and just replace the exports we want to instrument\n for (const method of INSTRUMENTED_METHODS) {\n moduleExports[method] = generatePatch(moduleExports[method]);\n }\n\n return moduleExports;\n } else {\n // In CJS we can't replace the exports in the original module because they\n // don't have setters, so we create a new object with the same properties\n const patchedModuleExports = INSTRUMENTED_METHODS.reduce((acc, curr) => {\n acc[curr] = generatePatch(moduleExports[curr]);\n return acc;\n }, {} as PatchedModuleExports);\n\n return { ...moduleExports, ...patchedModuleExports };\n }\n }\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"instrumentation.js","sources":["../../../../../src/integrations/tracing/vercelai/instrumentation.ts"],"sourcesContent":["import type { InstrumentationConfig, InstrumentationModuleDefinition } from '@opentelemetry/instrumentation';\nimport { InstrumentationBase, InstrumentationNodeModuleDefinition } from '@opentelemetry/instrumentation';\nimport {\n addNonEnumerableProperty,\n getActiveSpan,\n getCurrentScope,\n handleCallbackErrors,\n SDK_VERSION,\n} from '@sentry/core';\nimport { INTEGRATION_NAME } from './constants';\nimport type { TelemetrySettings, VercelAiIntegration } from './types';\n\n// List of patched methods\n// From: https://sdk.vercel.ai/docs/ai-sdk-core/telemetry#collected-data\nconst INSTRUMENTED_METHODS = [\n 'generateText',\n 'streamText',\n 'generateObject',\n 'streamObject',\n 'embed',\n 'embedMany',\n] as const;\n\ninterface MethodFirstArg extends Record<string, unknown> {\n experimental_telemetry?: TelemetrySettings;\n}\n\ntype MethodArgs = [MethodFirstArg, ...unknown[]];\n\ntype PatchedModuleExports = Record<(typeof INSTRUMENTED_METHODS)[number], (...args: MethodArgs) => unknown> &\n Record<string, unknown>;\n\ninterface RecordingOptions {\n recordInputs?: boolean;\n recordOutputs?: boolean;\n}\n\n/**\n * Determines whether to record inputs and outputs for Vercel AI telemetry based on the configuration hierarchy.\n *\n * The order of precedence is:\n * 1. The vercel ai integration options\n * 2. The experimental_telemetry options in the vercel ai method calls\n * 3. When telemetry is explicitly enabled (isEnabled: true), default to recording\n * 4. Otherwise, use the sendDefaultPii option from client options\n */\nexport function determineRecordingSettings(\n integrationRecordingOptions: RecordingOptions | undefined,\n methodTelemetryOptions: RecordingOptions,\n telemetryExplicitlyEnabled: boolean | undefined,\n defaultRecordingEnabled: boolean,\n): { recordInputs: boolean; recordOutputs: boolean } {\n const recordInputs =\n integrationRecordingOptions?.recordInputs !== undefined\n ? integrationRecordingOptions.recordInputs\n : methodTelemetryOptions.recordInputs !== undefined\n ? methodTelemetryOptions.recordInputs\n : telemetryExplicitlyEnabled === true\n ? true // When telemetry is explicitly enabled, default to recording inputs\n : defaultRecordingEnabled;\n\n const recordOutputs =\n integrationRecordingOptions?.recordOutputs !== undefined\n ? integrationRecordingOptions.recordOutputs\n : methodTelemetryOptions.recordOutputs !== undefined\n ? methodTelemetryOptions.recordOutputs\n : telemetryExplicitlyEnabled === true\n ? true // When telemetry is explicitly enabled, default to recording inputs\n : defaultRecordingEnabled;\n\n return { recordInputs, recordOutputs };\n}\n\n/**\n * This detects is added by the Sentry Vercel AI Integration to detect if the integration should\n * be enabled.\n *\n * It also patches the `ai` module to enable Vercel AI telemetry automatically for all methods.\n */\nexport class SentryVercelAiInstrumentation extends InstrumentationBase {\n private _isPatched = false;\n private _callbacks: (() => void)[] = [];\n\n public constructor(config: InstrumentationConfig = {}) {\n super('@sentry/instrumentation-vercel-ai', SDK_VERSION, config);\n }\n\n /**\n * Initializes the instrumentation by defining the modules to be patched.\n */\n public init(): InstrumentationModuleDefinition {\n const module = new InstrumentationNodeModuleDefinition('ai', ['>=3.0.0 <5'], this._patch.bind(this));\n return module;\n }\n\n /**\n * Call the provided callback when the module is patched.\n * If it has already been patched, the callback will be called immediately.\n */\n public callWhenPatched(callback: () => void): void {\n if (this._isPatched) {\n callback();\n } else {\n this._callbacks.push(callback);\n }\n }\n\n /**\n * Patches module exports to enable Vercel AI telemetry.\n */\n private _patch(moduleExports: PatchedModuleExports): unknown {\n this._isPatched = true;\n\n this._callbacks.forEach(callback => callback());\n this._callbacks = [];\n\n function generatePatch(originalMethod: (...args: MethodArgs) => unknown) {\n return (...args: MethodArgs) => {\n const existingExperimentalTelemetry = args[0].experimental_telemetry || {};\n const isEnabled = existingExperimentalTelemetry.isEnabled;\n\n const client = getCurrentScope().getClient();\n const integration = client?.getIntegrationByName<VercelAiIntegration>(INTEGRATION_NAME);\n const integrationOptions = integration?.options;\n const shouldRecordInputsAndOutputs = integration ? Boolean(client?.getOptions().sendDefaultPii) : false;\n\n const { recordInputs, recordOutputs } = determineRecordingSettings(\n integrationOptions,\n existingExperimentalTelemetry,\n isEnabled,\n shouldRecordInputsAndOutputs,\n );\n\n args[0].experimental_telemetry = {\n ...existingExperimentalTelemetry,\n isEnabled: isEnabled !== undefined ? isEnabled : true,\n recordInputs,\n recordOutputs,\n };\n\n return handleCallbackErrors(\n () => {\n // @ts-expect-error we know that the method exists\n return originalMethod.apply(this, args);\n },\n error => {\n // This error bubbles up to unhandledrejection handler (if not handled before),\n // where we do not know the active span anymore\n // So to circumvent this, we set the active span on the error object\n // which is picked up by the unhandledrejection handler\n if (error && typeof error === 'object') {\n addNonEnumerableProperty(error, '_sentry_active_span', getActiveSpan());\n }\n },\n );\n };\n }\n\n // Is this an ESM module?\n // https://tc39.es/ecma262/#sec-module-namespace-objects\n if (Object.prototype.toString.call(moduleExports) === '[object Module]') {\n // In ESM we take the usual route and just replace the exports we want to instrument\n for (const method of INSTRUMENTED_METHODS) {\n moduleExports[method] = generatePatch(moduleExports[method]);\n }\n\n return moduleExports;\n } else {\n // In CJS we can't replace the exports in the original module because they\n // don't have setters, so we create a new object with the same properties\n const patchedModuleExports = INSTRUMENTED_METHODS.reduce((acc, curr) => {\n acc[curr] = generatePatch(moduleExports[curr]);\n return acc;\n }, {} as PatchedModuleExports);\n\n return { ...moduleExports, ...patchedModuleExports };\n }\n }\n}\n"],"names":[],"mappings":"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"}
|
package/build/esm/package.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"type":"module","version":"10.0.0-
|
|
1
|
+
{"type":"module","version":"10.0.0-beta.0","sideEffects":false}
|
package/build/types/index.d.ts
CHANGED
|
@@ -25,6 +25,7 @@ export { amqplibIntegration } from './integrations/tracing/amqplib';
|
|
|
25
25
|
export { vercelAIIntegration } from './integrations/tracing/vercelai';
|
|
26
26
|
export { openAIIntegration } from './integrations/tracing/openai';
|
|
27
27
|
export { launchDarklyIntegration, buildLaunchDarklyFlagUsedHandler, openFeatureIntegration, OpenFeatureIntegrationHook, statsigIntegration, unleashIntegration, } from './integrations/featureFlagShims';
|
|
28
|
+
export { firebaseIntegration } from './integrations/tracing/firebase';
|
|
28
29
|
export { init, getDefaultIntegrations, getDefaultIntegrationsWithoutPerformance, initWithoutDefaultIntegrations, } from './sdk';
|
|
29
30
|
export { initOpenTelemetry, preloadOpenTelemetry } from './sdk/initOtel';
|
|
30
31
|
export { getAutoPerformanceIntegrations } from './integrations/tracing';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,0BAA0B,EAAE,MAAM,2BAA2B,CAAC;AACvE,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,wBAAwB,EAAE,MAAM,gCAAgC,CAAC;AACnH,OAAO,EAAE,kBAAkB,EAAE,wBAAwB,EAAE,MAAM,gCAAgC,CAAC;AAC9F,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AACpE,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAChE,OAAO,EAAE,sBAAsB,EAAE,MAAM,oCAAoC,CAAC;AAC5E,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAChE,OAAO,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AACtE,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAChE,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAChE,OAAO,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AACtE,OAAO,EAAE,qBAAqB,EAAE,MAAM,mCAAmC,CAAC;AAC1E,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AACrF,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAClF,OAAO,EAAE,kBAAkB,EAAE,wBAAwB,EAAE,MAAM,gCAAgC,CAAC;AAC9F,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AACpE,OAAO,EAAE,sBAAsB,EAAE,MAAM,oCAAoC,CAAC;AAC5E,OAAO,EAAE,qBAAqB,EAAE,MAAM,mCAAmC,CAAC;AAC1E,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AACpE,OAAO,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AACtE,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,EACL,uBAAuB,EACvB,gCAAgC,EAChC,sBAAsB,EACtB,0BAA0B,EAC1B,kBAAkB,EAClB,kBAAkB,GACnB,MAAM,iCAAiC,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,40 @@
|
|
|
1
1
|
import type { Instrumentation, InstrumentationConfig } from '@opentelemetry/instrumentation';
|
|
2
2
|
import type { FastifyInstance, FastifyReply, FastifyRequest } from './types';
|
|
3
3
|
import { FastifyInstrumentationV3 } from './v3/instrumentation';
|
|
4
|
+
/**
|
|
5
|
+
* Options for the Fastify integration.
|
|
6
|
+
*
|
|
7
|
+
* `shouldHandleError` - Callback method deciding whether error should be captured and sent to Sentry
|
|
8
|
+
* This is used on Fastify v5 where Sentry handles errors in the diagnostics channel.
|
|
9
|
+
* Fastify v3 and v4 use `setupFastifyErrorHandler` instead.
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
*
|
|
13
|
+
* ```javascript
|
|
14
|
+
* Sentry.init({
|
|
15
|
+
* integrations: [
|
|
16
|
+
* Sentry.fastifyIntegration({
|
|
17
|
+
* shouldHandleError(_error, _request, reply) {
|
|
18
|
+
* return reply.statusCode >= 500;
|
|
19
|
+
* },
|
|
20
|
+
* });
|
|
21
|
+
* },
|
|
22
|
+
* });
|
|
23
|
+
* ```
|
|
24
|
+
*
|
|
25
|
+
*/
|
|
26
|
+
interface FastifyIntegrationOptions {
|
|
27
|
+
/**
|
|
28
|
+
* Callback method deciding whether error should be captured and sent to Sentry
|
|
29
|
+
* This is used on Fastify v5 where Sentry handles errors in the diagnostics channel.
|
|
30
|
+
* Fastify v3 and v4 use `setupFastifyErrorHandler` instead.
|
|
31
|
+
*
|
|
32
|
+
* @param error Captured Fastify error
|
|
33
|
+
* @param request Fastify request (or any object containing at least method, routeOptions.url, and routerPath)
|
|
34
|
+
* @param reply Fastify reply (or any object containing at least statusCode)
|
|
35
|
+
*/
|
|
36
|
+
shouldHandleError: (error: Error, request: FastifyRequest, reply: FastifyReply) => boolean;
|
|
37
|
+
}
|
|
4
38
|
interface FastifyHandlerOptions {
|
|
5
39
|
/**
|
|
6
40
|
* Callback method deciding whether error should be captured and sent to Sentry
|
|
@@ -11,6 +45,7 @@ interface FastifyHandlerOptions {
|
|
|
11
45
|
*
|
|
12
46
|
* @example
|
|
13
47
|
*
|
|
48
|
+
*
|
|
14
49
|
* ```javascript
|
|
15
50
|
* setupFastifyErrorHandler(app, {
|
|
16
51
|
* shouldHandleError(_error, _request, reply) {
|
|
@@ -19,6 +54,7 @@ interface FastifyHandlerOptions {
|
|
|
19
54
|
* });
|
|
20
55
|
* ```
|
|
21
56
|
*
|
|
57
|
+
*
|
|
22
58
|
* If using TypeScript, you can cast the request and reply to get full type safety.
|
|
23
59
|
*
|
|
24
60
|
* ```typescript
|
|
@@ -38,7 +74,7 @@ interface FastifyHandlerOptions {
|
|
|
38
74
|
export declare const instrumentFastifyV3: ((options?: unknown) => FastifyInstrumentationV3) & {
|
|
39
75
|
id: string;
|
|
40
76
|
};
|
|
41
|
-
export declare const instrumentFastify: ((options?: unknown) => Instrumentation<InstrumentationConfig &
|
|
77
|
+
export declare const instrumentFastify: ((options?: unknown) => Instrumentation<InstrumentationConfig & FastifyIntegrationOptions>) & {
|
|
42
78
|
id: string;
|
|
43
79
|
};
|
|
44
80
|
/**
|
|
@@ -57,7 +93,7 @@ export declare const instrumentFastify: ((options?: unknown) => Instrumentation<
|
|
|
57
93
|
* })
|
|
58
94
|
* ```
|
|
59
95
|
*/
|
|
60
|
-
export declare const fastifyIntegration: () => import("@sentry/core").Integration;
|
|
96
|
+
export declare const fastifyIntegration: (options?: Partial<FastifyIntegrationOptions> | undefined) => import("@sentry/core").Integration;
|
|
61
97
|
/**
|
|
62
98
|
* Add an Fastify error handler to capture errors to Sentry.
|
|
63
99
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/integrations/tracing/fastify/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AAe7F,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,wBAAwB,EAAE,MAAM,sBAAsB,CAAC;AAEhE,UAAU,qBAAqB;IAC7B
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/integrations/tracing/fastify/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AAe7F,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,wBAAwB,EAAE,MAAM,sBAAsB,CAAC;AAEhE;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,UAAU,yBAAyB;IACjC;;;;;;;;OAQG;IACH,iBAAiB,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,cAAc,EAAE,KAAK,EAAE,YAAY,KAAK,OAAO,CAAC;CAC5F;AAED,UAAU,qBAAqB;IAC7B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAgCG;IACH,iBAAiB,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,cAAc,EAAE,KAAK,EAAE,YAAY,KAAK,OAAO,CAAC;CAC5F;AAMD,eAAO,MAAM,mBAAmB;;CAAoF,CAAC;AA0CrH,eAAO,MAAM,iBAAiB;;CAmC5B,CAAC;AAsBH;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,kBAAkB,kGAE9B,CAAC;AAaF;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,eAAe,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,qBAAqB,CAAC,GAAG,IAAI,CAoBjH"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { FirebaseInstrumentation } from './otel';
|
|
2
|
+
export declare const instrumentFirebase: ((options?: unknown) => FirebaseInstrumentation) & {
|
|
3
|
+
id: string;
|
|
4
|
+
};
|
|
5
|
+
export declare const firebaseIntegration: () => import("@sentry/core").Integration;
|
|
6
|
+
//# sourceMappingURL=firebase.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"firebase.d.ts","sourceRoot":"","sources":["../../../../../src/integrations/tracing/firebase/firebase.ts"],"names":[],"mappings":"AAIA,OAAO,EAAsC,uBAAuB,EAAE,MAAM,QAAQ,CAAC;AAYrF,eAAO,MAAM,kBAAkB;;CAAsF,CAAC;AAWtH,eAAO,MAAM,mBAAmB,0CAA0C,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/integrations/tracing/firebase/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { type InstrumentationNodeModuleDefinition, InstrumentationBase } from '@opentelemetry/instrumentation';
|
|
2
|
+
import type { FirebaseInstrumentationConfig } from './types';
|
|
3
|
+
/**
|
|
4
|
+
* Instrumentation for Firebase services, specifically Firestore.
|
|
5
|
+
*/
|
|
6
|
+
export declare class FirebaseInstrumentation extends InstrumentationBase<FirebaseInstrumentationConfig> {
|
|
7
|
+
constructor(config?: FirebaseInstrumentationConfig);
|
|
8
|
+
/**
|
|
9
|
+
* sets config
|
|
10
|
+
* @param config
|
|
11
|
+
*/
|
|
12
|
+
setConfig(config?: FirebaseInstrumentationConfig): void;
|
|
13
|
+
/**
|
|
14
|
+
*
|
|
15
|
+
* @protected
|
|
16
|
+
*/
|
|
17
|
+
protected init(): InstrumentationNodeModuleDefinition | InstrumentationNodeModuleDefinition[] | void;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=firebaseInstrumentation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"firebaseInstrumentation.d.ts","sourceRoot":"","sources":["../../../../../../src/integrations/tracing/firebase/otel/firebaseInstrumentation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,mCAAmC,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AAG/G,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,SAAS,CAAC;AAK7D;;GAEG;AACH,qBAAa,uBAAwB,SAAQ,mBAAmB,CAAC,6BAA6B,CAAC;gBAC1E,MAAM,GAAE,6BAAoE;IAI/F;;;OAGG;IACa,SAAS,CAAC,MAAM,GAAE,6BAAkC,GAAG,IAAI;IAI3E;;;OAGG;IAEH,SAAS,CAAC,IAAI,IAAI,mCAAmC,GAAG,mCAAmC,EAAE,GAAG,IAAI;CAOrG"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../src/integrations/tracing/firebase/otel/index.ts"],"names":[],"mappings":"AACA,cAAc,2BAA2B,CAAC;AAC1C,cAAc,SAAS,CAAC"}
|