@sentry/node 10.60.0 → 10.62.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.
Files changed (182) hide show
  1. package/build/cjs/index.js +2 -0
  2. package/build/cjs/index.js.map +1 -1
  3. package/build/cjs/integrations/fs/index.js +8 -17
  4. package/build/cjs/integrations/fs/index.js.map +1 -1
  5. package/build/cjs/integrations/fs/vendored/instrumentation.js +110 -161
  6. package/build/cjs/integrations/fs/vendored/instrumentation.js.map +1 -1
  7. package/build/cjs/integrations/node-fetch/vendored/undici.js +1 -2
  8. package/build/cjs/integrations/node-fetch/vendored/undici.js.map +1 -1
  9. package/build/cjs/integrations/tracing/amqplib/index.js +2 -10
  10. package/build/cjs/integrations/tracing/amqplib/index.js.map +1 -1
  11. package/build/cjs/integrations/tracing/amqplib/vendored/instrumentation.js +117 -0
  12. package/build/cjs/integrations/tracing/amqplib/vendored/instrumentation.js.map +1 -0
  13. package/build/cjs/integrations/tracing/amqplib/vendored/patches.js +185 -0
  14. package/build/cjs/integrations/tracing/amqplib/vendored/patches.js.map +1 -0
  15. package/build/cjs/integrations/tracing/amqplib/vendored/semconv.js +21 -1
  16. package/build/cjs/integrations/tracing/amqplib/vendored/semconv.js.map +1 -1
  17. package/build/cjs/integrations/tracing/amqplib/vendored/types.js +0 -6
  18. package/build/cjs/integrations/tracing/amqplib/vendored/types.js.map +1 -1
  19. package/build/cjs/integrations/tracing/amqplib/vendored/utils.js +71 -80
  20. package/build/cjs/integrations/tracing/amqplib/vendored/utils.js.map +1 -1
  21. package/build/cjs/integrations/tracing/dataloader/vendored/instrumentation.js +5 -6
  22. package/build/cjs/integrations/tracing/dataloader/vendored/instrumentation.js.map +1 -1
  23. package/build/cjs/integrations/tracing/firebase/firebase.js +1 -24
  24. package/build/cjs/integrations/tracing/firebase/firebase.js.map +1 -1
  25. package/build/cjs/integrations/tracing/firebase/otel/firebaseInstrumentation.js +3 -11
  26. package/build/cjs/integrations/tracing/firebase/otel/firebaseInstrumentation.js.map +1 -1
  27. package/build/cjs/integrations/tracing/firebase/otel/patches/firestore.js +33 -72
  28. package/build/cjs/integrations/tracing/firebase/otel/patches/firestore.js.map +1 -1
  29. package/build/cjs/integrations/tracing/firebase/otel/patches/functions.js +46 -105
  30. package/build/cjs/integrations/tracing/firebase/otel/patches/functions.js.map +1 -1
  31. package/build/cjs/integrations/tracing/kafka/vendored/utils.js +2 -2
  32. package/build/cjs/integrations/tracing/kafka/vendored/utils.js.map +1 -1
  33. package/build/cjs/integrations/tracing/knex/vendored/instrumentation.js +1 -2
  34. package/build/cjs/integrations/tracing/knex/vendored/instrumentation.js.map +1 -1
  35. package/build/cjs/integrations/tracing/mongo/vendored/utils.js +1 -2
  36. package/build/cjs/integrations/tracing/mongo/vendored/utils.js.map +1 -1
  37. package/build/cjs/integrations/tracing/mongoose/vendored/mongoose.js +1 -2
  38. package/build/cjs/integrations/tracing/mongoose/vendored/mongoose.js.map +1 -1
  39. package/build/cjs/integrations/tracing/mysql2/vendored/instrumentation.js +1 -2
  40. package/build/cjs/integrations/tracing/mysql2/vendored/instrumentation.js.map +1 -1
  41. package/build/cjs/integrations/tracing/postgres/vendored/instrumentation.js +2 -3
  42. package/build/cjs/integrations/tracing/postgres/vendored/instrumentation.js.map +1 -1
  43. package/build/cjs/integrations/tracing/postgres/vendored/utils.js +1 -2
  44. package/build/cjs/integrations/tracing/postgres/vendored/utils.js.map +1 -1
  45. package/build/cjs/integrations/tracing/redis/index.js +6 -2
  46. package/build/cjs/integrations/tracing/redis/index.js.map +1 -1
  47. package/build/cjs/integrations/tracing/redis/vendored/ioredis-instrumentation.js +2 -3
  48. package/build/cjs/integrations/tracing/redis/vendored/ioredis-instrumentation.js.map +1 -1
  49. package/build/cjs/integrations/tracing/redis/vendored/redis-instrumentation.js +3 -4
  50. package/build/cjs/integrations/tracing/redis/vendored/redis-instrumentation.js.map +1 -1
  51. package/build/cjs/integrations/tracing/tedious/vendored/instrumentation.js +1 -2
  52. package/build/cjs/integrations/tracing/tedious/vendored/instrumentation.js.map +1 -1
  53. package/build/cjs/integrations/tracing/vercelai/index.js +3 -0
  54. package/build/cjs/integrations/tracing/vercelai/index.js.map +1 -1
  55. package/build/esm/index.js +1 -1
  56. package/build/esm/integrations/fs/index.js +9 -18
  57. package/build/esm/integrations/fs/index.js.map +1 -1
  58. package/build/esm/integrations/fs/vendored/instrumentation.js +111 -162
  59. package/build/esm/integrations/fs/vendored/instrumentation.js.map +1 -1
  60. package/build/esm/integrations/node-fetch/vendored/undici.js +2 -3
  61. package/build/esm/integrations/node-fetch/vendored/undici.js.map +1 -1
  62. package/build/esm/integrations/tracing/amqplib/index.js +3 -11
  63. package/build/esm/integrations/tracing/amqplib/index.js.map +1 -1
  64. package/build/esm/integrations/tracing/amqplib/vendored/instrumentation.js +115 -0
  65. package/build/esm/integrations/tracing/amqplib/vendored/instrumentation.js.map +1 -0
  66. package/build/esm/integrations/tracing/amqplib/vendored/patches.js +177 -0
  67. package/build/esm/integrations/tracing/amqplib/vendored/patches.js.map +1 -0
  68. package/build/esm/integrations/tracing/amqplib/vendored/semconv.js +12 -2
  69. package/build/esm/integrations/tracing/amqplib/vendored/semconv.js.map +1 -1
  70. package/build/esm/integrations/tracing/amqplib/vendored/types.js +1 -6
  71. package/build/esm/integrations/tracing/amqplib/vendored/types.js.map +1 -1
  72. package/build/esm/integrations/tracing/amqplib/vendored/utils.js +68 -78
  73. package/build/esm/integrations/tracing/amqplib/vendored/utils.js.map +1 -1
  74. package/build/esm/integrations/tracing/dataloader/vendored/instrumentation.js +6 -7
  75. package/build/esm/integrations/tracing/dataloader/vendored/instrumentation.js.map +1 -1
  76. package/build/esm/integrations/tracing/firebase/firebase.js +3 -26
  77. package/build/esm/integrations/tracing/firebase/firebase.js.map +1 -1
  78. package/build/esm/integrations/tracing/firebase/otel/firebaseInstrumentation.js +3 -11
  79. package/build/esm/integrations/tracing/firebase/otel/firebaseInstrumentation.js.map +1 -1
  80. package/build/esm/integrations/tracing/firebase/otel/patches/firestore.js +34 -73
  81. package/build/esm/integrations/tracing/firebase/otel/patches/firestore.js.map +1 -1
  82. package/build/esm/integrations/tracing/firebase/otel/patches/functions.js +47 -106
  83. package/build/esm/integrations/tracing/firebase/otel/patches/functions.js.map +1 -1
  84. package/build/esm/integrations/tracing/kafka/vendored/utils.js +4 -4
  85. package/build/esm/integrations/tracing/kafka/vendored/utils.js.map +1 -1
  86. package/build/esm/integrations/tracing/knex/vendored/instrumentation.js +2 -3
  87. package/build/esm/integrations/tracing/knex/vendored/instrumentation.js.map +1 -1
  88. package/build/esm/integrations/tracing/mongo/vendored/utils.js +2 -3
  89. package/build/esm/integrations/tracing/mongo/vendored/utils.js.map +1 -1
  90. package/build/esm/integrations/tracing/mongoose/vendored/mongoose.js +2 -3
  91. package/build/esm/integrations/tracing/mongoose/vendored/mongoose.js.map +1 -1
  92. package/build/esm/integrations/tracing/mysql2/vendored/instrumentation.js +2 -3
  93. package/build/esm/integrations/tracing/mysql2/vendored/instrumentation.js.map +1 -1
  94. package/build/esm/integrations/tracing/postgres/vendored/instrumentation.js +3 -4
  95. package/build/esm/integrations/tracing/postgres/vendored/instrumentation.js.map +1 -1
  96. package/build/esm/integrations/tracing/postgres/vendored/utils.js +2 -3
  97. package/build/esm/integrations/tracing/postgres/vendored/utils.js.map +1 -1
  98. package/build/esm/integrations/tracing/redis/index.js +6 -2
  99. package/build/esm/integrations/tracing/redis/index.js.map +1 -1
  100. package/build/esm/integrations/tracing/redis/vendored/ioredis-instrumentation.js +3 -4
  101. package/build/esm/integrations/tracing/redis/vendored/ioredis-instrumentation.js.map +1 -1
  102. package/build/esm/integrations/tracing/redis/vendored/redis-instrumentation.js +4 -5
  103. package/build/esm/integrations/tracing/redis/vendored/redis-instrumentation.js.map +1 -1
  104. package/build/esm/integrations/tracing/tedious/vendored/instrumentation.js +2 -3
  105. package/build/esm/integrations/tracing/tedious/vendored/instrumentation.js.map +1 -1
  106. package/build/esm/integrations/tracing/vercelai/index.js +3 -0
  107. package/build/esm/integrations/tracing/vercelai/index.js.map +1 -1
  108. package/build/esm/package.json +1 -1
  109. package/build/types/index.d.ts +1 -1
  110. package/build/types/index.d.ts.map +1 -1
  111. package/build/types/integrations/fs/index.d.ts +2 -14
  112. package/build/types/integrations/fs/index.d.ts.map +1 -1
  113. package/build/types/integrations/fs/vendored/instrumentation.d.ts +2 -10
  114. package/build/types/integrations/fs/vendored/instrumentation.d.ts.map +1 -1
  115. package/build/types/integrations/fs/vendored/types.d.ts +1 -2
  116. package/build/types/integrations/fs/vendored/types.d.ts.map +1 -1
  117. package/build/types/integrations/node-fetch/vendored/undici.d.ts.map +1 -1
  118. package/build/types/integrations/tracing/amqplib/index.d.ts +1 -1
  119. package/build/types/integrations/tracing/amqplib/index.d.ts.map +1 -1
  120. package/build/types/integrations/tracing/amqplib/vendored/instrumentation.d.ts +11 -0
  121. package/build/types/integrations/tracing/amqplib/vendored/instrumentation.d.ts.map +1 -0
  122. package/build/types/integrations/tracing/amqplib/vendored/patches.d.ts +11 -0
  123. package/build/types/integrations/tracing/amqplib/vendored/patches.d.ts.map +1 -0
  124. package/build/types/integrations/tracing/amqplib/vendored/semconv.d.ts +25 -37
  125. package/build/types/integrations/tracing/amqplib/vendored/semconv.d.ts.map +1 -1
  126. package/build/types/integrations/tracing/amqplib/vendored/types.d.ts +0 -81
  127. package/build/types/integrations/tracing/amqplib/vendored/types.d.ts.map +1 -1
  128. package/build/types/integrations/tracing/amqplib/vendored/utils.d.ts +16 -9
  129. package/build/types/integrations/tracing/amqplib/vendored/utils.d.ts.map +1 -1
  130. package/build/types/integrations/tracing/dataloader/vendored/instrumentation.d.ts.map +1 -1
  131. package/build/types/integrations/tracing/firebase/firebase.d.ts.map +1 -1
  132. package/build/types/integrations/tracing/firebase/otel/firebaseInstrumentation.d.ts +4 -9
  133. package/build/types/integrations/tracing/firebase/otel/firebaseInstrumentation.d.ts.map +1 -1
  134. package/build/types/integrations/tracing/firebase/otel/patches/firestore.d.ts +2 -5
  135. package/build/types/integrations/tracing/firebase/otel/patches/firestore.d.ts.map +1 -1
  136. package/build/types/integrations/tracing/firebase/otel/patches/functions.d.ts +3 -8
  137. package/build/types/integrations/tracing/firebase/otel/patches/functions.d.ts.map +1 -1
  138. package/build/types/integrations/tracing/firebase/otel/types.d.ts +0 -20
  139. package/build/types/integrations/tracing/firebase/otel/types.d.ts.map +1 -1
  140. package/build/types/integrations/tracing/kafka/vendored/utils.d.ts.map +1 -1
  141. package/build/types/integrations/tracing/knex/vendored/instrumentation.d.ts.map +1 -1
  142. package/build/types/integrations/tracing/mongo/vendored/utils.d.ts.map +1 -1
  143. package/build/types/integrations/tracing/mongoose/vendored/mongoose.d.ts.map +1 -1
  144. package/build/types/integrations/tracing/mysql2/vendored/instrumentation.d.ts.map +1 -1
  145. package/build/types/integrations/tracing/postgres/vendored/instrumentation.d.ts.map +1 -1
  146. package/build/types/integrations/tracing/postgres/vendored/utils.d.ts.map +1 -1
  147. package/build/types/integrations/tracing/redis/index.d.ts.map +1 -1
  148. package/build/types/integrations/tracing/redis/vendored/ioredis-instrumentation.d.ts.map +1 -1
  149. package/build/types/integrations/tracing/redis/vendored/redis-instrumentation.d.ts.map +1 -1
  150. package/build/types/integrations/tracing/tedious/vendored/instrumentation.d.ts.map +1 -1
  151. package/build/types/integrations/tracing/vercelai/index.d.ts +0 -1
  152. package/build/types/integrations/tracing/vercelai/index.d.ts.map +1 -1
  153. package/build/types-ts3.8/index.d.ts +1 -1
  154. package/build/types-ts3.8/integrations/fs/index.d.ts +2 -14
  155. package/build/types-ts3.8/integrations/fs/vendored/instrumentation.d.ts +2 -10
  156. package/build/types-ts3.8/integrations/fs/vendored/types.d.ts +1 -2
  157. package/build/types-ts3.8/integrations/tracing/amqplib/index.d.ts +1 -1
  158. package/build/types-ts3.8/integrations/tracing/amqplib/vendored/instrumentation.d.ts +11 -0
  159. package/build/types-ts3.8/integrations/tracing/amqplib/vendored/patches.d.ts +11 -0
  160. package/build/types-ts3.8/integrations/tracing/amqplib/vendored/semconv.d.ts +25 -37
  161. package/build/types-ts3.8/integrations/tracing/amqplib/vendored/types.d.ts +0 -81
  162. package/build/types-ts3.8/integrations/tracing/amqplib/vendored/utils.d.ts +16 -9
  163. package/build/types-ts3.8/integrations/tracing/firebase/otel/firebaseInstrumentation.d.ts +4 -9
  164. package/build/types-ts3.8/integrations/tracing/firebase/otel/patches/firestore.d.ts +2 -5
  165. package/build/types-ts3.8/integrations/tracing/firebase/otel/patches/functions.d.ts +3 -8
  166. package/build/types-ts3.8/integrations/tracing/firebase/otel/types.d.ts +0 -20
  167. package/build/types-ts3.8/integrations/tracing/vercelai/index.d.ts +0 -1
  168. package/package.json +5 -5
  169. package/build/cjs/integrations/tracing/amqplib/vendored/amqplib.js +0 -452
  170. package/build/cjs/integrations/tracing/amqplib/vendored/amqplib.js.map +0 -1
  171. package/build/cjs/integrations/tracing/amqplib/vendored/semconv-obsolete.js +0 -24
  172. package/build/cjs/integrations/tracing/amqplib/vendored/semconv-obsolete.js.map +0 -1
  173. package/build/esm/integrations/tracing/amqplib/vendored/amqplib.js +0 -450
  174. package/build/esm/integrations/tracing/amqplib/vendored/amqplib.js.map +0 -1
  175. package/build/esm/integrations/tracing/amqplib/vendored/semconv-obsolete.js +0 -13
  176. package/build/esm/integrations/tracing/amqplib/vendored/semconv-obsolete.js.map +0 -1
  177. package/build/types/integrations/tracing/amqplib/vendored/amqplib.d.ts +0 -26
  178. package/build/types/integrations/tracing/amqplib/vendored/amqplib.d.ts.map +0 -1
  179. package/build/types/integrations/tracing/amqplib/vendored/semconv-obsolete.d.ts +0 -63
  180. package/build/types/integrations/tracing/amqplib/vendored/semconv-obsolete.d.ts.map +0 -1
  181. package/build/types-ts3.8/integrations/tracing/amqplib/vendored/amqplib.d.ts +0 -26
  182. package/build/types-ts3.8/integrations/tracing/amqplib/vendored/semconv-obsolete.d.ts +0 -63
@@ -1,43 +1,8 @@
1
- import { SpanKind, context, trace, diag } from '@opentelemetry/api';
2
- import { InstrumentationNodeModuleDefinition, isWrapped, safeExecuteInTheMiddle } from '@opentelemetry/instrumentation';
1
+ import { InstrumentationNodeModuleDefinition, isWrapped } from '@opentelemetry/instrumentation';
3
2
  import { InstrumentationNodeModuleFile } from '../../../InstrumentationNodeModuleFile.js';
3
+ import { startSpanManual, SPAN_KIND, SPAN_STATUS_ERROR, captureException, flush, SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN } from '@sentry/core';
4
4
 
5
- function patchFunctions(tracer, functionsSupportedVersions, wrap, unwrap, config) {
6
- let requestHook = () => {
7
- };
8
- let responseHook = () => {
9
- };
10
- const errorHook = config.functions?.errorHook;
11
- const configRequestHook = config.functions?.requestHook;
12
- const configResponseHook = config.functions?.responseHook;
13
- if (typeof configResponseHook === "function") {
14
- responseHook = (span, err) => {
15
- safeExecuteInTheMiddle(
16
- () => configResponseHook(span, err),
17
- (error) => {
18
- if (!error) {
19
- return;
20
- }
21
- diag.error(error?.message);
22
- },
23
- true
24
- );
25
- };
26
- }
27
- if (typeof configRequestHook === "function") {
28
- requestHook = (span) => {
29
- safeExecuteInTheMiddle(
30
- () => configRequestHook(span),
31
- (error) => {
32
- if (!error) {
33
- return;
34
- }
35
- diag.error(error?.message);
36
- },
37
- true
38
- );
39
- };
40
- }
5
+ function patchFunctions(functionsSupportedVersions, wrap, unwrap) {
41
6
  const moduleFunctionsCJS = new InstrumentationNodeModuleDefinition("firebase-functions", functionsSupportedVersions);
42
7
  const modulesToInstrument = [
43
8
  { name: "firebase-functions/lib/v2/providers/https.js", triggerType: "function" },
@@ -50,21 +15,14 @@ function patchFunctions(tracer, functionsSupportedVersions, wrap, unwrap, config
50
15
  new InstrumentationNodeModuleFile(
51
16
  name,
52
17
  functionsSupportedVersions,
53
- (moduleExports) => wrapCommonFunctions(
54
- moduleExports,
55
- wrap,
56
- unwrap,
57
- tracer,
58
- { requestHook, responseHook, errorHook },
59
- triggerType
60
- ),
18
+ (moduleExports) => wrapCommonFunctions(moduleExports, wrap, unwrap, triggerType),
61
19
  (moduleExports) => unwrapCommonFunctions(moduleExports, unwrap)
62
20
  )
63
21
  );
64
22
  });
65
23
  return moduleFunctionsCJS;
66
24
  }
67
- function patchV2Functions(tracer, functionsConfig, triggerType) {
25
+ function patchV2Functions(triggerType) {
68
26
  return function v2FunctionsWrapper(original) {
69
27
  return function(...args) {
70
28
  const handler = typeof args[0] === "function" ? args[0] : args[1];
@@ -74,10 +32,8 @@ function patchV2Functions(tracer, functionsConfig, triggerType) {
74
32
  }
75
33
  const wrappedHandler = async function(...handlerArgs) {
76
34
  const functionName = process.env.FUNCTION_TARGET || process.env.K_SERVICE || "unknown";
77
- const span = tracer.startSpan(`firebase.function.${triggerType}`, {
78
- kind: SpanKind.SERVER
79
- });
80
35
  const attributes = {
36
+ [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: "auto.firebase.otel.functions",
81
37
  "faas.name": functionName,
82
38
  "faas.trigger": triggerType,
83
39
  "faas.provider": "firebase"
@@ -88,27 +44,32 @@ function patchV2Functions(tracer, functionsConfig, triggerType) {
88
44
  if (process.env.EVENTARC_CLOUD_EVENT_SOURCE) {
89
45
  attributes["cloud.event_source"] = process.env.EVENTARC_CLOUD_EVENT_SOURCE;
90
46
  }
91
- span.setAttributes(attributes);
92
- functionsConfig?.requestHook?.(span);
93
- return context.with(trace.setSpan(context.active(), span), async () => {
94
- let error;
95
- let result;
96
- try {
97
- result = await handler.apply(this, handlerArgs);
98
- } catch (e) {
99
- error = e;
100
- }
101
- functionsConfig?.responseHook?.(span, error);
102
- if (error) {
103
- span.recordException(error);
104
- }
105
- span.end();
106
- if (error) {
107
- await functionsConfig?.errorHook?.(span, error);
108
- throw error;
47
+ return startSpanManual(
48
+ {
49
+ name: `firebase.function.${triggerType}`,
50
+ op: "http.request",
51
+ kind: SPAN_KIND.SERVER,
52
+ attributes
53
+ },
54
+ async (span) => {
55
+ try {
56
+ const result = await handler.apply(this, handlerArgs);
57
+ span.end();
58
+ return result;
59
+ } catch (error) {
60
+ span.setStatus({ code: SPAN_STATUS_ERROR });
61
+ captureException(error, {
62
+ mechanism: {
63
+ type: "auto.firebase.otel.functions",
64
+ handled: false
65
+ }
66
+ });
67
+ span.end();
68
+ await flush(2e3);
69
+ throw error;
70
+ }
109
71
  }
110
- return result;
111
- });
72
+ );
112
73
  };
113
74
  if (documentOrOptions) {
114
75
  return original.call(this, documentOrOptions, wrappedHandler);
@@ -118,51 +79,31 @@ function patchV2Functions(tracer, functionsConfig, triggerType) {
118
79
  };
119
80
  };
120
81
  }
121
- function wrapCommonFunctions(moduleExports, wrap, unwrap, tracer, functionsConfig, triggerType) {
82
+ function wrapCommonFunctions(moduleExports, wrap, unwrap, triggerType) {
122
83
  unwrapCommonFunctions(moduleExports, unwrap);
123
84
  switch (triggerType) {
124
85
  case "function":
125
- wrap(moduleExports, "onRequest", patchV2Functions(tracer, functionsConfig, "http.request"));
126
- wrap(moduleExports, "onCall", patchV2Functions(tracer, functionsConfig, "http.call"));
86
+ wrap(moduleExports, "onRequest", patchV2Functions("http.request"));
87
+ wrap(moduleExports, "onCall", patchV2Functions("http.call"));
127
88
  break;
128
89
  case "firestore":
129
- wrap(moduleExports, "onDocumentCreated", patchV2Functions(tracer, functionsConfig, "firestore.document.created"));
130
- wrap(moduleExports, "onDocumentUpdated", patchV2Functions(tracer, functionsConfig, "firestore.document.updated"));
131
- wrap(moduleExports, "onDocumentDeleted", patchV2Functions(tracer, functionsConfig, "firestore.document.deleted"));
132
- wrap(moduleExports, "onDocumentWritten", patchV2Functions(tracer, functionsConfig, "firestore.document.written"));
133
- wrap(
134
- moduleExports,
135
- "onDocumentCreatedWithAuthContext",
136
- patchV2Functions(tracer, functionsConfig, "firestore.document.created")
137
- );
138
- wrap(
139
- moduleExports,
140
- "onDocumentUpdatedWithAuthContext",
141
- patchV2Functions(tracer, functionsConfig, "firestore.document.updated")
142
- );
143
- wrap(
144
- moduleExports,
145
- "onDocumentDeletedWithAuthContext",
146
- patchV2Functions(tracer, functionsConfig, "firestore.document.deleted")
147
- );
148
- wrap(
149
- moduleExports,
150
- "onDocumentWrittenWithAuthContext",
151
- patchV2Functions(tracer, functionsConfig, "firestore.document.written")
152
- );
90
+ wrap(moduleExports, "onDocumentCreated", patchV2Functions("firestore.document.created"));
91
+ wrap(moduleExports, "onDocumentUpdated", patchV2Functions("firestore.document.updated"));
92
+ wrap(moduleExports, "onDocumentDeleted", patchV2Functions("firestore.document.deleted"));
93
+ wrap(moduleExports, "onDocumentWritten", patchV2Functions("firestore.document.written"));
94
+ wrap(moduleExports, "onDocumentCreatedWithAuthContext", patchV2Functions("firestore.document.created"));
95
+ wrap(moduleExports, "onDocumentUpdatedWithAuthContext", patchV2Functions("firestore.document.updated"));
96
+ wrap(moduleExports, "onDocumentDeletedWithAuthContext", patchV2Functions("firestore.document.deleted"));
97
+ wrap(moduleExports, "onDocumentWrittenWithAuthContext", patchV2Functions("firestore.document.written"));
153
98
  break;
154
99
  case "scheduler":
155
- wrap(moduleExports, "onSchedule", patchV2Functions(tracer, functionsConfig, "scheduler.scheduled"));
100
+ wrap(moduleExports, "onSchedule", patchV2Functions("scheduler.scheduled"));
156
101
  break;
157
102
  case "storage":
158
- wrap(moduleExports, "onObjectFinalized", patchV2Functions(tracer, functionsConfig, "storage.object.finalized"));
159
- wrap(moduleExports, "onObjectArchived", patchV2Functions(tracer, functionsConfig, "storage.object.archived"));
160
- wrap(moduleExports, "onObjectDeleted", patchV2Functions(tracer, functionsConfig, "storage.object.deleted"));
161
- wrap(
162
- moduleExports,
163
- "onObjectMetadataUpdated",
164
- patchV2Functions(tracer, functionsConfig, "storage.object.metadataUpdated")
165
- );
103
+ wrap(moduleExports, "onObjectFinalized", patchV2Functions("storage.object.finalized"));
104
+ wrap(moduleExports, "onObjectArchived", patchV2Functions("storage.object.archived"));
105
+ wrap(moduleExports, "onObjectDeleted", patchV2Functions("storage.object.deleted"));
106
+ wrap(moduleExports, "onObjectMetadataUpdated", patchV2Functions("storage.object.metadataUpdated"));
166
107
  break;
167
108
  }
168
109
  return moduleExports;
@@ -1 +1 @@
1
- {"version":3,"file":"functions.js","sources":["../../../../../../../src/integrations/tracing/firebase/otel/patches/functions.ts"],"sourcesContent":["import type { Span, Tracer } from '@opentelemetry/api';\nimport { context, diag, SpanKind, trace } from '@opentelemetry/api';\nimport type { InstrumentationBase } from '@opentelemetry/instrumentation';\nimport { InstrumentationNodeModuleDefinition, isWrapped, safeExecuteInTheMiddle } from '@opentelemetry/instrumentation';\nimport { InstrumentationNodeModuleFile } from '../../../InstrumentationNodeModuleFile';\nimport type { SpanAttributes } from '@sentry/core';\nimport type { FirebaseInstrumentation } from '../firebaseInstrumentation';\nimport type {\n AvailableFirebaseFunctions,\n FirebaseFunctions,\n FirebaseInstrumentationConfig,\n OverloadedParameters,\n RequestHook,\n ResponseHook,\n} from '../types';\n\n/**\n * Patches Firebase Functions v2 to add OpenTelemetry instrumentation\n * @param tracer - Opentelemetry Tracer\n * @param functionsSupportedVersions - supported versions of firebase-functions\n * @param wrap - reference to native instrumentation wrap function\n * @param unwrap - reference to native instrumentation unwrap function\n * @param config - Firebase instrumentation config\n */\nexport function patchFunctions(\n tracer: Tracer,\n functionsSupportedVersions: string[],\n wrap: InstrumentationBase['_wrap'],\n unwrap: InstrumentationBase['_unwrap'],\n config: FirebaseInstrumentationConfig,\n): InstrumentationNodeModuleDefinition {\n let requestHook: RequestHook = () => {};\n let responseHook: ResponseHook = () => {};\n const errorHook = config.functions?.errorHook;\n const configRequestHook = config.functions?.requestHook;\n const configResponseHook = config.functions?.responseHook;\n\n if (typeof configResponseHook === 'function') {\n responseHook = (span: Span, err: unknown) => {\n safeExecuteInTheMiddle(\n () => configResponseHook(span, err),\n error => {\n if (!error) {\n return;\n }\n diag.error(error?.message);\n },\n true,\n );\n };\n }\n if (typeof configRequestHook === 'function') {\n requestHook = (span: Span) => {\n safeExecuteInTheMiddle(\n () => configRequestHook(span),\n error => {\n if (!error) {\n return;\n }\n diag.error(error?.message);\n },\n true,\n );\n };\n }\n\n const moduleFunctionsCJS = new InstrumentationNodeModuleDefinition('firebase-functions', functionsSupportedVersions);\n const modulesToInstrument = [\n { name: 'firebase-functions/lib/v2/providers/https.js', triggerType: 'function' },\n { name: 'firebase-functions/lib/v2/providers/firestore.js', triggerType: 'firestore' },\n { name: 'firebase-functions/lib/v2/providers/scheduler.js', triggerType: 'scheduler' },\n { name: 'firebase-functions/lib/v2/storage.js', triggerType: 'storage' },\n ] as const;\n\n modulesToInstrument.forEach(({ name, triggerType }) => {\n moduleFunctionsCJS.files.push(\n new InstrumentationNodeModuleFile(\n name,\n functionsSupportedVersions,\n moduleExports =>\n wrapCommonFunctions(\n moduleExports,\n wrap,\n unwrap,\n tracer,\n { requestHook, responseHook, errorHook },\n triggerType,\n ),\n moduleExports => unwrapCommonFunctions(moduleExports, unwrap),\n ),\n );\n });\n\n return moduleFunctionsCJS;\n}\n\n/**\n * Patches Cloud Functions for Firebase (v2) to add OpenTelemetry instrumentation\n *\n * @param tracer - Opentelemetry Tracer\n * @param functionsConfig - Firebase instrumentation config\n * @param triggerType - Type of trigger\n * @returns A function that patches the function\n */\nexport function patchV2Functions<T extends FirebaseFunctions = FirebaseFunctions>(\n tracer: Tracer,\n functionsConfig: FirebaseInstrumentationConfig['functions'],\n triggerType: string,\n): (original: T) => (...args: OverloadedParameters<T>) => ReturnType<T> {\n return function v2FunctionsWrapper(original: T): (...args: OverloadedParameters<T>) => ReturnType<T> {\n return function (this: FirebaseInstrumentation, ...args: OverloadedParameters<T>): ReturnType<T> {\n const handler = typeof args[0] === 'function' ? args[0] : args[1];\n const documentOrOptions = typeof args[0] === 'function' ? undefined : args[0];\n\n if (!handler) {\n return original.call(this, ...args);\n }\n\n const wrappedHandler = async function (this: unknown, ...handlerArgs: unknown[]): Promise<unknown> {\n const functionName = process.env.FUNCTION_TARGET || process.env.K_SERVICE || 'unknown';\n const span = tracer.startSpan(`firebase.function.${triggerType}`, {\n kind: SpanKind.SERVER,\n });\n\n const attributes: SpanAttributes = {\n 'faas.name': functionName,\n 'faas.trigger': triggerType,\n 'faas.provider': 'firebase',\n };\n\n if (process.env.GCLOUD_PROJECT) {\n attributes['cloud.project_id'] = process.env.GCLOUD_PROJECT;\n }\n\n if (process.env.EVENTARC_CLOUD_EVENT_SOURCE) {\n attributes['cloud.event_source'] = process.env.EVENTARC_CLOUD_EVENT_SOURCE;\n }\n\n span.setAttributes(attributes);\n functionsConfig?.requestHook?.(span);\n\n // Can be changed to safeExecuteInTheMiddleAsync once following is merged and released\n // https://github.com/open-telemetry/opentelemetry-js/pull/6032\n return context.with(trace.setSpan(context.active(), span), async () => {\n let error: Error | undefined;\n let result: T | undefined;\n\n try {\n result = await handler.apply(this, handlerArgs);\n } catch (e) {\n error = e as Error;\n }\n\n functionsConfig?.responseHook?.(span, error);\n\n if (error) {\n span.recordException(error);\n }\n\n span.end();\n\n if (error) {\n await functionsConfig?.errorHook?.(span, error);\n throw error;\n }\n\n return result;\n });\n };\n\n if (documentOrOptions) {\n return original.call(this, documentOrOptions, wrappedHandler);\n } else {\n return original.call(this, wrappedHandler);\n }\n };\n };\n}\n\nfunction wrapCommonFunctions(\n moduleExports: AvailableFirebaseFunctions,\n wrap: InstrumentationBase<FirebaseInstrumentationConfig>['_wrap'],\n unwrap: InstrumentationBase<FirebaseInstrumentationConfig>['_unwrap'],\n tracer: Tracer,\n functionsConfig: FirebaseInstrumentationConfig['functions'],\n triggerType: 'function' | 'firestore' | 'scheduler' | 'storage',\n): AvailableFirebaseFunctions {\n unwrapCommonFunctions(moduleExports, unwrap);\n\n switch (triggerType) {\n case 'function':\n wrap(moduleExports, 'onRequest', patchV2Functions(tracer, functionsConfig, 'http.request'));\n wrap(moduleExports, 'onCall', patchV2Functions(tracer, functionsConfig, 'http.call'));\n break;\n\n case 'firestore':\n wrap(moduleExports, 'onDocumentCreated', patchV2Functions(tracer, functionsConfig, 'firestore.document.created'));\n wrap(moduleExports, 'onDocumentUpdated', patchV2Functions(tracer, functionsConfig, 'firestore.document.updated'));\n wrap(moduleExports, 'onDocumentDeleted', patchV2Functions(tracer, functionsConfig, 'firestore.document.deleted'));\n wrap(moduleExports, 'onDocumentWritten', patchV2Functions(tracer, functionsConfig, 'firestore.document.written'));\n wrap(\n moduleExports,\n 'onDocumentCreatedWithAuthContext',\n patchV2Functions(tracer, functionsConfig, 'firestore.document.created'),\n );\n wrap(\n moduleExports,\n 'onDocumentUpdatedWithAuthContext',\n patchV2Functions(tracer, functionsConfig, 'firestore.document.updated'),\n );\n\n wrap(\n moduleExports,\n 'onDocumentDeletedWithAuthContext',\n patchV2Functions(tracer, functionsConfig, 'firestore.document.deleted'),\n );\n\n wrap(\n moduleExports,\n 'onDocumentWrittenWithAuthContext',\n patchV2Functions(tracer, functionsConfig, 'firestore.document.written'),\n );\n break;\n\n case 'scheduler':\n wrap(moduleExports, 'onSchedule', patchV2Functions(tracer, functionsConfig, 'scheduler.scheduled'));\n break;\n\n case 'storage':\n wrap(moduleExports, 'onObjectFinalized', patchV2Functions(tracer, functionsConfig, 'storage.object.finalized'));\n wrap(moduleExports, 'onObjectArchived', patchV2Functions(tracer, functionsConfig, 'storage.object.archived'));\n wrap(moduleExports, 'onObjectDeleted', patchV2Functions(tracer, functionsConfig, 'storage.object.deleted'));\n wrap(\n moduleExports,\n 'onObjectMetadataUpdated',\n patchV2Functions(tracer, functionsConfig, 'storage.object.metadataUpdated'),\n );\n break;\n }\n\n return moduleExports;\n}\n\nfunction unwrapCommonFunctions(\n moduleExports: AvailableFirebaseFunctions,\n unwrap: InstrumentationBase<FirebaseInstrumentationConfig>['_unwrap'],\n): AvailableFirebaseFunctions {\n const methods: (keyof AvailableFirebaseFunctions)[] = [\n 'onSchedule',\n 'onRequest',\n 'onCall',\n 'onObjectFinalized',\n 'onObjectArchived',\n 'onObjectDeleted',\n 'onObjectMetadataUpdated',\n 'onDocumentCreated',\n 'onDocumentUpdated',\n 'onDocumentDeleted',\n 'onDocumentWritten',\n 'onDocumentCreatedWithAuthContext',\n 'onDocumentUpdatedWithAuthContext',\n 'onDocumentDeletedWithAuthContext',\n 'onDocumentWrittenWithAuthContext',\n ];\n\n for (const method of methods) {\n if (isWrapped(moduleExports[method])) {\n unwrap(moduleExports, method);\n }\n }\n return moduleExports;\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"functions.js","sources":["../../../../../../../src/integrations/tracing/firebase/otel/patches/functions.ts"],"sourcesContent":["import type { InstrumentationBase } from '@opentelemetry/instrumentation';\nimport { InstrumentationNodeModuleDefinition, isWrapped } from '@opentelemetry/instrumentation';\nimport { InstrumentationNodeModuleFile } from '../../../InstrumentationNodeModuleFile';\nimport type { SpanAttributes } from '@sentry/core';\nimport {\n captureException,\n flush,\n SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN,\n SPAN_KIND,\n SPAN_STATUS_ERROR,\n startSpanManual,\n} from '@sentry/core';\nimport type { FirebaseInstrumentation } from '../firebaseInstrumentation';\nimport type { AvailableFirebaseFunctions, FirebaseFunctions, OverloadedParameters } from '../types';\n\n/**\n * Patches Firebase Functions v2 to add OpenTelemetry instrumentation\n * @param functionsSupportedVersions - supported versions of firebase-functions\n * @param wrap - reference to native instrumentation wrap function\n * @param unwrap - reference to native instrumentation unwrap function\n */\nexport function patchFunctions(\n functionsSupportedVersions: string[],\n wrap: InstrumentationBase['_wrap'],\n unwrap: InstrumentationBase['_unwrap'],\n): InstrumentationNodeModuleDefinition {\n const moduleFunctionsCJS = new InstrumentationNodeModuleDefinition('firebase-functions', functionsSupportedVersions);\n const modulesToInstrument = [\n { name: 'firebase-functions/lib/v2/providers/https.js', triggerType: 'function' },\n { name: 'firebase-functions/lib/v2/providers/firestore.js', triggerType: 'firestore' },\n { name: 'firebase-functions/lib/v2/providers/scheduler.js', triggerType: 'scheduler' },\n { name: 'firebase-functions/lib/v2/storage.js', triggerType: 'storage' },\n ] as const;\n\n modulesToInstrument.forEach(({ name, triggerType }) => {\n moduleFunctionsCJS.files.push(\n new InstrumentationNodeModuleFile(\n name,\n functionsSupportedVersions,\n moduleExports => wrapCommonFunctions(moduleExports, wrap, unwrap, triggerType),\n moduleExports => unwrapCommonFunctions(moduleExports, unwrap),\n ),\n );\n });\n\n return moduleFunctionsCJS;\n}\n\n/**\n * Patches Cloud Functions for Firebase (v2) to add OpenTelemetry instrumentation\n *\n * @param triggerType - Type of trigger\n * @returns A function that patches the function\n */\nexport function patchV2Functions<T extends FirebaseFunctions = FirebaseFunctions>(\n triggerType: string,\n): (original: T) => (...args: OverloadedParameters<T>) => ReturnType<T> {\n return function v2FunctionsWrapper(original: T): (...args: OverloadedParameters<T>) => ReturnType<T> {\n return function (this: FirebaseInstrumentation, ...args: OverloadedParameters<T>): ReturnType<T> {\n const handler = typeof args[0] === 'function' ? args[0] : args[1];\n const documentOrOptions = typeof args[0] === 'function' ? undefined : args[0];\n\n if (!handler) {\n return original.call(this, ...args);\n }\n\n const wrappedHandler = async function (this: unknown, ...handlerArgs: unknown[]): Promise<unknown> {\n const functionName = process.env.FUNCTION_TARGET || process.env.K_SERVICE || 'unknown';\n\n const attributes: SpanAttributes = {\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.firebase.otel.functions',\n 'faas.name': functionName,\n 'faas.trigger': triggerType,\n 'faas.provider': 'firebase',\n };\n\n if (process.env.GCLOUD_PROJECT) {\n attributes['cloud.project_id'] = process.env.GCLOUD_PROJECT;\n }\n\n if (process.env.EVENTARC_CLOUD_EVENT_SOURCE) {\n attributes['cloud.event_source'] = process.env.EVENTARC_CLOUD_EVENT_SOURCE;\n }\n\n // `startSpanManual` to keep the span active but while still allowing us to end it before flushing on error.\n return startSpanManual(\n {\n name: `firebase.function.${triggerType}`,\n op: 'http.request',\n kind: SPAN_KIND.SERVER,\n attributes,\n },\n async span => {\n try {\n const result = await handler.apply(this, handlerArgs);\n span.end();\n return result;\n } catch (error) {\n span.setStatus({ code: SPAN_STATUS_ERROR });\n captureException(error, {\n mechanism: {\n type: 'auto.firebase.otel.functions',\n handled: false,\n },\n });\n span.end();\n await flush(2000);\n throw error;\n }\n },\n );\n };\n\n if (documentOrOptions) {\n return original.call(this, documentOrOptions, wrappedHandler);\n } else {\n return original.call(this, wrappedHandler);\n }\n };\n };\n}\n\nfunction wrapCommonFunctions(\n moduleExports: AvailableFirebaseFunctions,\n wrap: InstrumentationBase['_wrap'],\n unwrap: InstrumentationBase['_unwrap'],\n triggerType: 'function' | 'firestore' | 'scheduler' | 'storage',\n): AvailableFirebaseFunctions {\n unwrapCommonFunctions(moduleExports, unwrap);\n\n switch (triggerType) {\n case 'function':\n wrap(moduleExports, 'onRequest', patchV2Functions('http.request'));\n wrap(moduleExports, 'onCall', patchV2Functions('http.call'));\n break;\n\n case 'firestore':\n wrap(moduleExports, 'onDocumentCreated', patchV2Functions('firestore.document.created'));\n wrap(moduleExports, 'onDocumentUpdated', patchV2Functions('firestore.document.updated'));\n wrap(moduleExports, 'onDocumentDeleted', patchV2Functions('firestore.document.deleted'));\n wrap(moduleExports, 'onDocumentWritten', patchV2Functions('firestore.document.written'));\n wrap(moduleExports, 'onDocumentCreatedWithAuthContext', patchV2Functions('firestore.document.created'));\n wrap(moduleExports, 'onDocumentUpdatedWithAuthContext', patchV2Functions('firestore.document.updated'));\n wrap(moduleExports, 'onDocumentDeletedWithAuthContext', patchV2Functions('firestore.document.deleted'));\n wrap(moduleExports, 'onDocumentWrittenWithAuthContext', patchV2Functions('firestore.document.written'));\n break;\n\n case 'scheduler':\n wrap(moduleExports, 'onSchedule', patchV2Functions('scheduler.scheduled'));\n break;\n\n case 'storage':\n wrap(moduleExports, 'onObjectFinalized', patchV2Functions('storage.object.finalized'));\n wrap(moduleExports, 'onObjectArchived', patchV2Functions('storage.object.archived'));\n wrap(moduleExports, 'onObjectDeleted', patchV2Functions('storage.object.deleted'));\n wrap(moduleExports, 'onObjectMetadataUpdated', patchV2Functions('storage.object.metadataUpdated'));\n break;\n }\n\n return moduleExports;\n}\n\nfunction unwrapCommonFunctions(\n moduleExports: AvailableFirebaseFunctions,\n unwrap: InstrumentationBase['_unwrap'],\n): AvailableFirebaseFunctions {\n const methods: (keyof AvailableFirebaseFunctions)[] = [\n 'onSchedule',\n 'onRequest',\n 'onCall',\n 'onObjectFinalized',\n 'onObjectArchived',\n 'onObjectDeleted',\n 'onObjectMetadataUpdated',\n 'onDocumentCreated',\n 'onDocumentUpdated',\n 'onDocumentDeleted',\n 'onDocumentWritten',\n 'onDocumentCreatedWithAuthContext',\n 'onDocumentUpdatedWithAuthContext',\n 'onDocumentDeletedWithAuthContext',\n 'onDocumentWrittenWithAuthContext',\n ];\n\n for (const method of methods) {\n if (isWrapped(moduleExports[method])) {\n unwrap(moduleExports, method);\n }\n }\n return moduleExports;\n}\n"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
- import { SpanKind, TraceFlags } from '@opentelemetry/api';
2
- import { startInactiveSpan, SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN, SPAN_STATUS_ERROR, propagationContextFromHeaders, getTraceData } from '@sentry/core';
1
+ import { TraceFlags } from '@opentelemetry/api';
2
+ import { startInactiveSpan, SPAN_KIND, SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN, SPAN_STATUS_ERROR, propagationContextFromHeaders, getTraceData } from '@sentry/core';
3
3
  import { MESSAGING_SYSTEM_VALUE_KAFKA, ATTR_MESSAGING_KAFKA_OFFSET, ATTR_MESSAGING_KAFKA_MESSAGE_TOMBSTONE, ATTR_MESSAGING_KAFKA_MESSAGE_KEY, ATTR_MESSAGING_OPERATION_NAME, ATTR_MESSAGING_OPERATION_TYPE, ATTR_MESSAGING_DESTINATION_NAME, ATTR_MESSAGING_SYSTEM, MESSAGING_OPERATION_TYPE_VALUE_RECEIVE, ATTR_ERROR_TYPE, ERROR_TYPE_VALUE_OTHER, MESSAGING_OPERATION_TYPE_VALUE_SEND, ATTR_MESSAGING_DESTINATION_PARTITION_ID } from './semconv.js';
4
4
 
5
5
  const PRODUCER_ORIGIN = "auto.kafkajs.otel.producer";
@@ -38,7 +38,7 @@ function startConsumerSpan({ topic, message, operationType, links, attributes })
38
38
  const operationName = operationType === MESSAGING_OPERATION_TYPE_VALUE_RECEIVE ? "poll" : operationType;
39
39
  return startInactiveSpan({
40
40
  name: `${operationName} ${topic}`,
41
- kind: operationType === MESSAGING_OPERATION_TYPE_VALUE_RECEIVE ? SpanKind.CLIENT : SpanKind.CONSUMER,
41
+ kind: operationType === MESSAGING_OPERATION_TYPE_VALUE_RECEIVE ? SPAN_KIND.CLIENT : SPAN_KIND.CONSUMER,
42
42
  links,
43
43
  attributes: {
44
44
  ...attributes,
@@ -58,7 +58,7 @@ function startConsumerSpan({ topic, message, operationType, links, attributes })
58
58
  function startProducerSpan(topic, message) {
59
59
  const span = startInactiveSpan({
60
60
  name: `send ${topic}`,
61
- kind: SpanKind.PRODUCER,
61
+ kind: SPAN_KIND.PRODUCER,
62
62
  attributes: {
63
63
  [ATTR_MESSAGING_SYSTEM]: MESSAGING_SYSTEM_VALUE_KAFKA,
64
64
  [ATTR_MESSAGING_DESTINATION_NAME]: topic,
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sources":["../../../../../../src/integrations/tracing/kafka/vendored/utils.ts"],"sourcesContent":["/*\n * Copyright The OpenTelemetry Authors, Aspecto\n * SPDX-License-Identifier: Apache-2.0\n *\n * NOTICE from the Sentry authors:\n * - Vendored from: https://github.com/open-telemetry/opentelemetry-js-contrib/tree/15ef7506553f631ea4181391e0c5725a56f0d082/packages/instrumentation-kafkajs\n * - Upstream version: @opentelemetry/instrumentation-kafkajs@0.27.0\n * - Span creation extracted here and migrated to the @sentry/core API; origin folded into span creation\n */\n\nimport { SpanKind, TraceFlags } from '@opentelemetry/api';\nimport type { Span, SpanAttributes, SpanLink } from '@sentry/core';\nimport {\n getTraceData,\n propagationContextFromHeaders,\n SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN,\n SPAN_STATUS_ERROR,\n startInactiveSpan,\n} from '@sentry/core';\nimport type { KafkaMessage, Message } from './kafkajs-types';\nimport {\n ATTR_ERROR_TYPE,\n ATTR_MESSAGING_DESTINATION_NAME,\n ATTR_MESSAGING_DESTINATION_PARTITION_ID,\n ATTR_MESSAGING_KAFKA_MESSAGE_KEY,\n ATTR_MESSAGING_KAFKA_MESSAGE_TOMBSTONE,\n ATTR_MESSAGING_KAFKA_OFFSET,\n ATTR_MESSAGING_OPERATION_NAME,\n ATTR_MESSAGING_OPERATION_TYPE,\n ATTR_MESSAGING_SYSTEM,\n ERROR_TYPE_VALUE_OTHER,\n MESSAGING_OPERATION_TYPE_VALUE_RECEIVE,\n MESSAGING_OPERATION_TYPE_VALUE_SEND,\n MESSAGING_SYSTEM_VALUE_KAFKA,\n} from './semconv';\n\nconst PRODUCER_ORIGIN = 'auto.kafkajs.otel.producer';\nconst CONSUMER_ORIGIN = 'auto.kafkajs.otel.consumer';\n\nexport interface ConsumerSpanOptions {\n topic: string;\n message: KafkaMessage | undefined;\n operationType: string;\n attributes: SpanAttributes;\n links?: SpanLink[];\n}\n\n/**\n * Reads a header value off a kafkajs message as a string. kafkajs delivers headers as `Buffer`s (or\n * arrays of them), so we normalize to a string before handing them to Sentry's trace helpers.\n */\nexport function getHeaderAsString(headers: KafkaMessage['headers'], key: string): string | undefined {\n const value = headers?.[key];\n if (value == null) {\n return undefined;\n }\n return Array.isArray(value) ? value[0]?.toString() : value.toString();\n}\n\n/**\n * Builds a span link to the producer span carried in the message headers, mirroring the upstream\n * behavior of linking each batch-processed message to its originating producer span.\n */\nexport function getLinksFromHeaders(headers: KafkaMessage['headers']): SpanLink[] | undefined {\n const sentryTrace = getHeaderAsString(headers, 'sentry-trace');\n if (!sentryTrace) {\n return undefined;\n }\n\n const { traceId, parentSpanId, sampled } = propagationContextFromHeaders(\n sentryTrace,\n getHeaderAsString(headers, 'baggage'),\n );\n if (!parentSpanId) {\n return undefined;\n }\n\n return [\n {\n context: {\n traceId,\n spanId: parentSpanId,\n isRemote: true,\n traceFlags: sampled ? TraceFlags.SAMPLED : TraceFlags.NONE,\n },\n },\n ];\n}\n\n/** Starts an inactive consumer (process/receive) span carrying the kafkajs messaging attributes. */\nexport function startConsumerSpan({ topic, message, operationType, links, attributes }: ConsumerSpanOptions): Span {\n const operationName =\n operationType === MESSAGING_OPERATION_TYPE_VALUE_RECEIVE\n ? 'poll' // for batch processing spans\n : operationType; // for individual message processing spans\n\n return startInactiveSpan({\n name: `${operationName} ${topic}`,\n kind: operationType === MESSAGING_OPERATION_TYPE_VALUE_RECEIVE ? SpanKind.CLIENT : SpanKind.CONSUMER,\n links,\n attributes: {\n ...attributes,\n [ATTR_MESSAGING_SYSTEM]: MESSAGING_SYSTEM_VALUE_KAFKA,\n [ATTR_MESSAGING_DESTINATION_NAME]: topic,\n [ATTR_MESSAGING_OPERATION_TYPE]: operationType,\n [ATTR_MESSAGING_OPERATION_NAME]: operationName,\n [ATTR_MESSAGING_KAFKA_MESSAGE_KEY]: message?.key ? String(message.key) : undefined,\n [ATTR_MESSAGING_KAFKA_MESSAGE_TOMBSTONE]: message?.key && message.value === null ? true : undefined,\n [ATTR_MESSAGING_KAFKA_OFFSET]: message?.offset,\n // Mirror the upstream behavior of only tagging per-message processing spans (not the batch\n // receiving span, which carries no message) with the auto origin.\n ...(message ? { [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: CONSUMER_ORIGIN } : {}),\n },\n });\n}\n\n/** Starts an inactive producer span and propagates its trace into the message headers. */\nexport function startProducerSpan(topic: string, message: Message): Span {\n const span = startInactiveSpan({\n name: `send ${topic}`,\n kind: SpanKind.PRODUCER,\n attributes: {\n [ATTR_MESSAGING_SYSTEM]: MESSAGING_SYSTEM_VALUE_KAFKA,\n [ATTR_MESSAGING_DESTINATION_NAME]: topic,\n [ATTR_MESSAGING_KAFKA_MESSAGE_KEY]: message.key ? String(message.key) : undefined,\n [ATTR_MESSAGING_KAFKA_MESSAGE_TOMBSTONE]: message.key && message.value === null ? true : undefined,\n [ATTR_MESSAGING_DESTINATION_PARTITION_ID]:\n message.partition !== undefined ? String(message.partition) : undefined,\n [ATTR_MESSAGING_OPERATION_NAME]: 'send',\n [ATTR_MESSAGING_OPERATION_TYPE]: MESSAGING_OPERATION_TYPE_VALUE_SEND,\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: PRODUCER_ORIGIN,\n },\n });\n\n // Propagate the producer span's trace to consumers via the message headers.\n message.headers = message.headers ?? {};\n const traceData = getTraceData({ span });\n if (traceData['sentry-trace']) {\n message.headers['sentry-trace'] = traceData['sentry-trace'];\n }\n if (traceData.baggage) {\n message.headers['baggage'] = traceData.baggage;\n }\n\n return span;\n}\n\n/**\n * Resolves once `sendPromise` settles, ending all `spans` and, on failure, marking them with the\n * error status and `error.type` before re-throwing.\n */\nexport function endSpansOnPromise<T>(spans: Span[], sendPromise: Promise<T>): Promise<T> {\n return Promise.resolve(sendPromise)\n .catch(reason => {\n let errorMessage: string | undefined;\n let errorType: string = ERROR_TYPE_VALUE_OTHER;\n if (typeof reason === 'string' || reason === undefined) {\n errorMessage = reason;\n } else if (typeof reason === 'object' && Object.prototype.hasOwnProperty.call(reason, 'message')) {\n errorMessage = reason.message;\n errorType = reason.constructor.name;\n }\n\n spans.forEach(span => {\n span.setAttribute(ATTR_ERROR_TYPE, errorType);\n span.setStatus({\n code: SPAN_STATUS_ERROR,\n message: errorMessage,\n });\n });\n\n throw reason;\n })\n .finally(() => {\n spans.forEach(span => span.end());\n });\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"utils.js","sources":["../../../../../../src/integrations/tracing/kafka/vendored/utils.ts"],"sourcesContent":["/*\n * Copyright The OpenTelemetry Authors, Aspecto\n * SPDX-License-Identifier: Apache-2.0\n *\n * NOTICE from the Sentry authors:\n * - Vendored from: https://github.com/open-telemetry/opentelemetry-js-contrib/tree/15ef7506553f631ea4181391e0c5725a56f0d082/packages/instrumentation-kafkajs\n * - Upstream version: @opentelemetry/instrumentation-kafkajs@0.27.0\n * - Span creation extracted here and migrated to the @sentry/core API; origin folded into span creation\n */\n\nimport { TraceFlags } from '@opentelemetry/api';\nimport type { Span, SpanAttributes, SpanLink } from '@sentry/core';\nimport {\n getTraceData,\n propagationContextFromHeaders,\n SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN,\n SPAN_KIND,\n SPAN_STATUS_ERROR,\n startInactiveSpan,\n} from '@sentry/core';\nimport type { KafkaMessage, Message } from './kafkajs-types';\nimport {\n ATTR_ERROR_TYPE,\n ATTR_MESSAGING_DESTINATION_NAME,\n ATTR_MESSAGING_DESTINATION_PARTITION_ID,\n ATTR_MESSAGING_KAFKA_MESSAGE_KEY,\n ATTR_MESSAGING_KAFKA_MESSAGE_TOMBSTONE,\n ATTR_MESSAGING_KAFKA_OFFSET,\n ATTR_MESSAGING_OPERATION_NAME,\n ATTR_MESSAGING_OPERATION_TYPE,\n ATTR_MESSAGING_SYSTEM,\n ERROR_TYPE_VALUE_OTHER,\n MESSAGING_OPERATION_TYPE_VALUE_RECEIVE,\n MESSAGING_OPERATION_TYPE_VALUE_SEND,\n MESSAGING_SYSTEM_VALUE_KAFKA,\n} from './semconv';\n\nconst PRODUCER_ORIGIN = 'auto.kafkajs.otel.producer';\nconst CONSUMER_ORIGIN = 'auto.kafkajs.otel.consumer';\n\nexport interface ConsumerSpanOptions {\n topic: string;\n message: KafkaMessage | undefined;\n operationType: string;\n attributes: SpanAttributes;\n links?: SpanLink[];\n}\n\n/**\n * Reads a header value off a kafkajs message as a string. kafkajs delivers headers as `Buffer`s (or\n * arrays of them), so we normalize to a string before handing them to Sentry's trace helpers.\n */\nexport function getHeaderAsString(headers: KafkaMessage['headers'], key: string): string | undefined {\n const value = headers?.[key];\n if (value == null) {\n return undefined;\n }\n return Array.isArray(value) ? value[0]?.toString() : value.toString();\n}\n\n/**\n * Builds a span link to the producer span carried in the message headers, mirroring the upstream\n * behavior of linking each batch-processed message to its originating producer span.\n */\nexport function getLinksFromHeaders(headers: KafkaMessage['headers']): SpanLink[] | undefined {\n const sentryTrace = getHeaderAsString(headers, 'sentry-trace');\n if (!sentryTrace) {\n return undefined;\n }\n\n const { traceId, parentSpanId, sampled } = propagationContextFromHeaders(\n sentryTrace,\n getHeaderAsString(headers, 'baggage'),\n );\n if (!parentSpanId) {\n return undefined;\n }\n\n return [\n {\n context: {\n traceId,\n spanId: parentSpanId,\n isRemote: true,\n traceFlags: sampled ? TraceFlags.SAMPLED : TraceFlags.NONE,\n },\n },\n ];\n}\n\n/** Starts an inactive consumer (process/receive) span carrying the kafkajs messaging attributes. */\nexport function startConsumerSpan({ topic, message, operationType, links, attributes }: ConsumerSpanOptions): Span {\n const operationName =\n operationType === MESSAGING_OPERATION_TYPE_VALUE_RECEIVE\n ? 'poll' // for batch processing spans\n : operationType; // for individual message processing spans\n\n return startInactiveSpan({\n name: `${operationName} ${topic}`,\n kind: operationType === MESSAGING_OPERATION_TYPE_VALUE_RECEIVE ? SPAN_KIND.CLIENT : SPAN_KIND.CONSUMER,\n links,\n attributes: {\n ...attributes,\n [ATTR_MESSAGING_SYSTEM]: MESSAGING_SYSTEM_VALUE_KAFKA,\n [ATTR_MESSAGING_DESTINATION_NAME]: topic,\n [ATTR_MESSAGING_OPERATION_TYPE]: operationType,\n [ATTR_MESSAGING_OPERATION_NAME]: operationName,\n [ATTR_MESSAGING_KAFKA_MESSAGE_KEY]: message?.key ? String(message.key) : undefined,\n [ATTR_MESSAGING_KAFKA_MESSAGE_TOMBSTONE]: message?.key && message.value === null ? true : undefined,\n [ATTR_MESSAGING_KAFKA_OFFSET]: message?.offset,\n // Mirror the upstream behavior of only tagging per-message processing spans (not the batch\n // receiving span, which carries no message) with the auto origin.\n ...(message ? { [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: CONSUMER_ORIGIN } : {}),\n },\n });\n}\n\n/** Starts an inactive producer span and propagates its trace into the message headers. */\nexport function startProducerSpan(topic: string, message: Message): Span {\n const span = startInactiveSpan({\n name: `send ${topic}`,\n kind: SPAN_KIND.PRODUCER,\n attributes: {\n [ATTR_MESSAGING_SYSTEM]: MESSAGING_SYSTEM_VALUE_KAFKA,\n [ATTR_MESSAGING_DESTINATION_NAME]: topic,\n [ATTR_MESSAGING_KAFKA_MESSAGE_KEY]: message.key ? String(message.key) : undefined,\n [ATTR_MESSAGING_KAFKA_MESSAGE_TOMBSTONE]: message.key && message.value === null ? true : undefined,\n [ATTR_MESSAGING_DESTINATION_PARTITION_ID]:\n message.partition !== undefined ? String(message.partition) : undefined,\n [ATTR_MESSAGING_OPERATION_NAME]: 'send',\n [ATTR_MESSAGING_OPERATION_TYPE]: MESSAGING_OPERATION_TYPE_VALUE_SEND,\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: PRODUCER_ORIGIN,\n },\n });\n\n // Propagate the producer span's trace to consumers via the message headers.\n message.headers = message.headers ?? {};\n const traceData = getTraceData({ span });\n if (traceData['sentry-trace']) {\n message.headers['sentry-trace'] = traceData['sentry-trace'];\n }\n if (traceData.baggage) {\n message.headers['baggage'] = traceData.baggage;\n }\n\n return span;\n}\n\n/**\n * Resolves once `sendPromise` settles, ending all `spans` and, on failure, marking them with the\n * error status and `error.type` before re-throwing.\n */\nexport function endSpansOnPromise<T>(spans: Span[], sendPromise: Promise<T>): Promise<T> {\n return Promise.resolve(sendPromise)\n .catch(reason => {\n let errorMessage: string | undefined;\n let errorType: string = ERROR_TYPE_VALUE_OTHER;\n if (typeof reason === 'string' || reason === undefined) {\n errorMessage = reason;\n } else if (typeof reason === 'object' && Object.prototype.hasOwnProperty.call(reason, 'message')) {\n errorMessage = reason.message;\n errorType = reason.constructor.name;\n }\n\n spans.forEach(span => {\n span.setAttribute(ATTR_ERROR_TYPE, errorType);\n span.setStatus({\n code: SPAN_STATUS_ERROR,\n message: errorMessage,\n });\n });\n\n throw reason;\n })\n .finally(() => {\n spans.forEach(span => span.end());\n });\n}\n"],"names":[],"mappings":"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"}
@@ -1,6 +1,5 @@
1
- import { SpanKind } from '@opentelemetry/api';
2
1
  import { InstrumentationBase, InstrumentationNodeModuleDefinition, isWrapped } from '@opentelemetry/instrumentation';
3
- import { SDK_VERSION, getActiveSpan, startSpan, SPAN_STATUS_ERROR, SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN } from '@sentry/core';
2
+ import { SDK_VERSION, getActiveSpan, startSpan, SPAN_KIND, SPAN_STATUS_ERROR, SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN } from '@sentry/core';
4
3
  import { InstrumentationNodeModuleFile } from '../../InstrumentationNodeModuleFile.js';
5
4
  import { ATTR_DB_STATEMENT, ATTR_NET_TRANSPORT, ATTR_NET_PEER_PORT, ATTR_NET_PEER_NAME, ATTR_DB_USER, ATTR_DB_SYSTEM, ATTR_DB_NAME, ATTR_DB_OPERATION, ATTR_DB_SQL_TABLE } from './semconv.js';
6
5
  import { extractTableName, extractDatabaseFromConnectionString, limitLength, extractPortFromConnectionString, extractHostFromConnectionString, mapSystem, getName, getFormatter } from './utils.js';
@@ -92,7 +91,7 @@ class KnexInstrumentation extends InstrumentationBase {
92
91
  return startSpan(
93
92
  {
94
93
  name: getName(name, operation, table),
95
- kind: SpanKind.CLIENT,
94
+ kind: SPAN_KIND.CLIENT,
96
95
  attributes,
97
96
  parentSpan,
98
97
  onlyIfParent: true
@@ -1 +1 @@
1
- {"version":3,"file":"instrumentation.js","sources":["../../../../../../src/integrations/tracing/knex/vendored/instrumentation.ts"],"sourcesContent":["/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n *\n * NOTICE from the Sentry authors:\n * - Vendored from: https://github.com/open-telemetry/opentelemetry-js-contrib/tree/15ef7506553f631ea4181391e0c5725a56f0d082/packages/instrumentation-knex\n * - Upstream version: @opentelemetry/instrumentation-knex@0.62.0\n * - Minor TypeScript strictness adjustments for this repository's compiler settings\n * - Refactored to use Sentry's span APIs instead of OpenTelemetry tracing APIs\n */\n\n/* oxlint-disable typescript/no-deprecated */\n\nimport { SpanKind } from '@opentelemetry/api';\nimport type { InstrumentationConfig } from '@opentelemetry/instrumentation';\nimport { InstrumentationBase, InstrumentationNodeModuleDefinition, isWrapped } from '@opentelemetry/instrumentation';\nimport type { Span, SpanAttributes } from '@sentry/core';\nimport {\n getActiveSpan,\n SDK_VERSION,\n SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN,\n SPAN_STATUS_ERROR,\n startSpan,\n} from '@sentry/core';\nimport { InstrumentationNodeModuleFile } from '../../InstrumentationNodeModuleFile';\nimport {\n ATTR_DB_NAME,\n ATTR_DB_OPERATION,\n ATTR_DB_SQL_TABLE,\n ATTR_DB_STATEMENT,\n ATTR_DB_SYSTEM,\n ATTR_DB_USER,\n ATTR_NET_PEER_NAME,\n ATTR_NET_PEER_PORT,\n ATTR_NET_TRANSPORT,\n} from './semconv';\nimport * as utils from './utils';\n\nconst PACKAGE_NAME = '@sentry/instrumentation-knex';\nconst ORIGIN = 'auto.db.otel.knex';\n\nconst MODULE_NAME = 'knex';\nconst SUPPORTED_VERSIONS = [\n // use \"lib/execution\" for runner.js, \"lib\" for client.js as basepath, latest tested 0.95.6\n '>=0.22.0 <4',\n // use \"lib\" as basepath\n '>=0.10.0 <0.18.0',\n '>=0.19.0 <0.22.0',\n // use \"src\" as basepath\n '>=0.18.0 <0.19.0',\n];\n\n// Max length of the query text captured in the `db.statement` attribute; \"..\" is appended when truncated.\nconst MAX_QUERY_LENGTH = 1022;\n\nconst parentSpanSymbol = Symbol('sentry.instrumentation-knex.parent-span');\n\nexport class KnexInstrumentation extends InstrumentationBase<InstrumentationConfig> {\n public constructor(config: InstrumentationConfig = {}) {\n super(PACKAGE_NAME, SDK_VERSION, config);\n }\n\n public init(): InstrumentationNodeModuleDefinition {\n const module = new InstrumentationNodeModuleDefinition(MODULE_NAME, SUPPORTED_VERSIONS);\n\n module.files.push(\n this._getClientNodeModuleFileInstrumentation('src'),\n this._getClientNodeModuleFileInstrumentation('lib'),\n this._getRunnerNodeModuleFileInstrumentation('src'),\n this._getRunnerNodeModuleFileInstrumentation('lib'),\n this._getRunnerNodeModuleFileInstrumentation('lib/execution'),\n );\n\n return module;\n }\n\n private _getRunnerNodeModuleFileInstrumentation(basePath: string): InstrumentationNodeModuleFile {\n return new InstrumentationNodeModuleFile(\n `knex/${basePath}/runner.js`,\n SUPPORTED_VERSIONS,\n (Runner: any, moduleVersion?: string) => {\n this._ensureWrapped(Runner.prototype, 'query', this._createQueryWrapper(moduleVersion));\n return Runner;\n },\n (Runner: any) => {\n this._unwrap(Runner.prototype, 'query');\n return Runner;\n },\n );\n }\n\n private _getClientNodeModuleFileInstrumentation(basePath: string): InstrumentationNodeModuleFile {\n return new InstrumentationNodeModuleFile(\n `knex/${basePath}/client.js`,\n SUPPORTED_VERSIONS,\n (Client: any) => {\n this._ensureWrapped(Client.prototype, 'queryBuilder', this._storeContext.bind(this));\n this._ensureWrapped(Client.prototype, 'schemaBuilder', this._storeContext.bind(this));\n this._ensureWrapped(Client.prototype, 'raw', this._storeContext.bind(this));\n return Client;\n },\n (Client: any) => {\n this._unwrap(Client.prototype, 'queryBuilder');\n this._unwrap(Client.prototype, 'schemaBuilder');\n this._unwrap(Client.prototype, 'raw');\n return Client;\n },\n );\n }\n\n private _createQueryWrapper(moduleVersion?: string) {\n return function wrapQuery(original: (...args: any[]) => any) {\n return function wrapped_logging_method(this: any, query: any) {\n const config = this.client.config;\n\n const table = utils.extractTableName(this.builder);\n const operation = query?.method;\n const connectionString = config?.connection?.connectionString;\n const name =\n config?.connection?.filename ||\n config?.connection?.database ||\n utils.extractDatabaseFromConnectionString(connectionString);\n\n const attributes: SpanAttributes = {\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: ORIGIN,\n 'knex.version': moduleVersion,\n [ATTR_DB_SYSTEM]: utils.mapSystem(this.client.driverName),\n [ATTR_DB_SQL_TABLE]: table,\n [ATTR_DB_OPERATION]: operation,\n [ATTR_DB_USER]: config?.connection?.user,\n [ATTR_DB_NAME]: name,\n [ATTR_NET_PEER_NAME]: config?.connection?.host ?? utils.extractHostFromConnectionString(connectionString),\n [ATTR_NET_PEER_PORT]: config?.connection?.port ?? utils.extractPortFromConnectionString(connectionString),\n [ATTR_NET_TRANSPORT]: config?.connection?.filename === ':memory:' ? 'inproc' : undefined,\n [ATTR_DB_STATEMENT]: utils.limitLength(query?.sql, MAX_QUERY_LENGTH),\n };\n\n // The query builder captures the span active when it was created (see `_storeContext`).\n // `onlyIfParent` ensures we only instrument queries that run as part of an existing trace.\n const parentSpan: Span | undefined = this.builder[parentSpanSymbol] || getActiveSpan();\n\n const args = arguments;\n return startSpan(\n {\n name: utils.getName(name, operation, table),\n kind: SpanKind.CLIENT,\n attributes,\n parentSpan,\n onlyIfParent: true,\n },\n span =>\n // `Runner.query` returns a real, already-executing Promise, so it is safe to let\n // `startSpan` await it and auto-end the span.\n original.apply(this, args).catch((err: any) => {\n const formatter = utils.getFormatter(this);\n const fullQuery = formatter(query.sql, query.bindings || []);\n const message = err.message.replace(`${fullQuery} - `, '');\n span.setStatus({ code: SPAN_STATUS_ERROR, message });\n throw err;\n }),\n );\n };\n };\n }\n\n private _storeContext(original: (...args: any[]) => any) {\n return function wrapped_logging_method(this: any) {\n const builder = original.apply(this, arguments);\n // Capture the span that is active when the query builder is created. The query often executes\n // in a different async context, so we reuse this span as the parent when the query runs.\n Object.defineProperty(builder, parentSpanSymbol, {\n value: getActiveSpan(),\n });\n return builder;\n };\n }\n\n private _ensureWrapped(obj: any, methodName: string, wrapper: (original: any) => any): void {\n if (isWrapped(obj[methodName])) {\n this._unwrap(obj, methodName);\n }\n this._wrap(obj, methodName, wrapper);\n }\n}\n"],"names":["utils.extractTableName","utils.extractDatabaseFromConnectionString","utils.mapSystem","utils.extractHostFromConnectionString","utils.extractPortFromConnectionString","utils.limitLength","utils.getName","utils.getFormatter"],"mappings":"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"}
1
+ {"version":3,"file":"instrumentation.js","sources":["../../../../../../src/integrations/tracing/knex/vendored/instrumentation.ts"],"sourcesContent":["/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n *\n * NOTICE from the Sentry authors:\n * - Vendored from: https://github.com/open-telemetry/opentelemetry-js-contrib/tree/15ef7506553f631ea4181391e0c5725a56f0d082/packages/instrumentation-knex\n * - Upstream version: @opentelemetry/instrumentation-knex@0.62.0\n * - Minor TypeScript strictness adjustments for this repository's compiler settings\n * - Refactored to use Sentry's span APIs instead of OpenTelemetry tracing APIs\n */\n\n/* oxlint-disable typescript/no-deprecated */\n\nimport type { InstrumentationConfig } from '@opentelemetry/instrumentation';\nimport { InstrumentationBase, InstrumentationNodeModuleDefinition, isWrapped } from '@opentelemetry/instrumentation';\nimport type { Span, SpanAttributes } from '@sentry/core';\nimport {\n getActiveSpan,\n SDK_VERSION,\n SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN,\n SPAN_KIND,\n SPAN_STATUS_ERROR,\n startSpan,\n} from '@sentry/core';\nimport { InstrumentationNodeModuleFile } from '../../InstrumentationNodeModuleFile';\nimport {\n ATTR_DB_NAME,\n ATTR_DB_OPERATION,\n ATTR_DB_SQL_TABLE,\n ATTR_DB_STATEMENT,\n ATTR_DB_SYSTEM,\n ATTR_DB_USER,\n ATTR_NET_PEER_NAME,\n ATTR_NET_PEER_PORT,\n ATTR_NET_TRANSPORT,\n} from './semconv';\nimport * as utils from './utils';\n\nconst PACKAGE_NAME = '@sentry/instrumentation-knex';\nconst ORIGIN = 'auto.db.otel.knex';\n\nconst MODULE_NAME = 'knex';\nconst SUPPORTED_VERSIONS = [\n // use \"lib/execution\" for runner.js, \"lib\" for client.js as basepath, latest tested 0.95.6\n '>=0.22.0 <4',\n // use \"lib\" as basepath\n '>=0.10.0 <0.18.0',\n '>=0.19.0 <0.22.0',\n // use \"src\" as basepath\n '>=0.18.0 <0.19.0',\n];\n\n// Max length of the query text captured in the `db.statement` attribute; \"..\" is appended when truncated.\nconst MAX_QUERY_LENGTH = 1022;\n\nconst parentSpanSymbol = Symbol('sentry.instrumentation-knex.parent-span');\n\nexport class KnexInstrumentation extends InstrumentationBase<InstrumentationConfig> {\n public constructor(config: InstrumentationConfig = {}) {\n super(PACKAGE_NAME, SDK_VERSION, config);\n }\n\n public init(): InstrumentationNodeModuleDefinition {\n const module = new InstrumentationNodeModuleDefinition(MODULE_NAME, SUPPORTED_VERSIONS);\n\n module.files.push(\n this._getClientNodeModuleFileInstrumentation('src'),\n this._getClientNodeModuleFileInstrumentation('lib'),\n this._getRunnerNodeModuleFileInstrumentation('src'),\n this._getRunnerNodeModuleFileInstrumentation('lib'),\n this._getRunnerNodeModuleFileInstrumentation('lib/execution'),\n );\n\n return module;\n }\n\n private _getRunnerNodeModuleFileInstrumentation(basePath: string): InstrumentationNodeModuleFile {\n return new InstrumentationNodeModuleFile(\n `knex/${basePath}/runner.js`,\n SUPPORTED_VERSIONS,\n (Runner: any, moduleVersion?: string) => {\n this._ensureWrapped(Runner.prototype, 'query', this._createQueryWrapper(moduleVersion));\n return Runner;\n },\n (Runner: any) => {\n this._unwrap(Runner.prototype, 'query');\n return Runner;\n },\n );\n }\n\n private _getClientNodeModuleFileInstrumentation(basePath: string): InstrumentationNodeModuleFile {\n return new InstrumentationNodeModuleFile(\n `knex/${basePath}/client.js`,\n SUPPORTED_VERSIONS,\n (Client: any) => {\n this._ensureWrapped(Client.prototype, 'queryBuilder', this._storeContext.bind(this));\n this._ensureWrapped(Client.prototype, 'schemaBuilder', this._storeContext.bind(this));\n this._ensureWrapped(Client.prototype, 'raw', this._storeContext.bind(this));\n return Client;\n },\n (Client: any) => {\n this._unwrap(Client.prototype, 'queryBuilder');\n this._unwrap(Client.prototype, 'schemaBuilder');\n this._unwrap(Client.prototype, 'raw');\n return Client;\n },\n );\n }\n\n private _createQueryWrapper(moduleVersion?: string) {\n return function wrapQuery(original: (...args: any[]) => any) {\n return function wrapped_logging_method(this: any, query: any) {\n const config = this.client.config;\n\n const table = utils.extractTableName(this.builder);\n const operation = query?.method;\n const connectionString = config?.connection?.connectionString;\n const name =\n config?.connection?.filename ||\n config?.connection?.database ||\n utils.extractDatabaseFromConnectionString(connectionString);\n\n const attributes: SpanAttributes = {\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: ORIGIN,\n 'knex.version': moduleVersion,\n [ATTR_DB_SYSTEM]: utils.mapSystem(this.client.driverName),\n [ATTR_DB_SQL_TABLE]: table,\n [ATTR_DB_OPERATION]: operation,\n [ATTR_DB_USER]: config?.connection?.user,\n [ATTR_DB_NAME]: name,\n [ATTR_NET_PEER_NAME]: config?.connection?.host ?? utils.extractHostFromConnectionString(connectionString),\n [ATTR_NET_PEER_PORT]: config?.connection?.port ?? utils.extractPortFromConnectionString(connectionString),\n [ATTR_NET_TRANSPORT]: config?.connection?.filename === ':memory:' ? 'inproc' : undefined,\n [ATTR_DB_STATEMENT]: utils.limitLength(query?.sql, MAX_QUERY_LENGTH),\n };\n\n // The query builder captures the span active when it was created (see `_storeContext`).\n // `onlyIfParent` ensures we only instrument queries that run as part of an existing trace.\n const parentSpan: Span | undefined = this.builder[parentSpanSymbol] || getActiveSpan();\n\n const args = arguments;\n return startSpan(\n {\n name: utils.getName(name, operation, table),\n kind: SPAN_KIND.CLIENT,\n attributes,\n parentSpan,\n onlyIfParent: true,\n },\n span =>\n // `Runner.query` returns a real, already-executing Promise, so it is safe to let\n // `startSpan` await it and auto-end the span.\n original.apply(this, args).catch((err: any) => {\n const formatter = utils.getFormatter(this);\n const fullQuery = formatter(query.sql, query.bindings || []);\n const message = err.message.replace(`${fullQuery} - `, '');\n span.setStatus({ code: SPAN_STATUS_ERROR, message });\n throw err;\n }),\n );\n };\n };\n }\n\n private _storeContext(original: (...args: any[]) => any) {\n return function wrapped_logging_method(this: any) {\n const builder = original.apply(this, arguments);\n // Capture the span that is active when the query builder is created. The query often executes\n // in a different async context, so we reuse this span as the parent when the query runs.\n Object.defineProperty(builder, parentSpanSymbol, {\n value: getActiveSpan(),\n });\n return builder;\n };\n }\n\n private _ensureWrapped(obj: any, methodName: string, wrapper: (original: any) => any): void {\n if (isWrapped(obj[methodName])) {\n this._unwrap(obj, methodName);\n }\n this._wrap(obj, methodName, wrapper);\n }\n}\n"],"names":["utils.extractTableName","utils.extractDatabaseFromConnectionString","utils.mapSystem","utils.extractHostFromConnectionString","utils.extractPortFromConnectionString","utils.limitLength","utils.getName","utils.getFormatter"],"mappings":"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"}
@@ -1,5 +1,4 @@
1
- import { SpanKind } from '@opentelemetry/api';
2
- import { getActiveSpan, startInactiveSpan, SPAN_STATUS_ERROR, withActiveSpan, SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN } from '@sentry/core';
1
+ import { getActiveSpan, startInactiveSpan, SPAN_KIND, SPAN_STATUS_ERROR, withActiveSpan, SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN } from '@sentry/core';
3
2
  import { ATTR_DB_OPERATION, DB_SYSTEM_VALUE_MONGODB, ATTR_NET_PEER_NAME, ATTR_NET_PEER_PORT, ATTR_DB_STATEMENT, ATTR_DB_CONNECTION_STRING, ATTR_DB_MONGODB_COLLECTION, ATTR_DB_NAME, ATTR_DB_SYSTEM } from './semconv.js';
4
3
  import { MongodbCommandType } from './internal-types.js';
5
4
 
@@ -117,7 +116,7 @@ function startMongoSpan(attributes) {
117
116
  return startInactiveSpan({
118
117
  // eslint-disable-next-line typescript/no-deprecated
119
118
  name: `mongodb.${attributes[ATTR_DB_OPERATION] || "command"}`,
120
- kind: SpanKind.CLIENT,
119
+ kind: SPAN_KIND.CLIENT,
121
120
  attributes
122
121
  });
123
122
  }
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sources":["../../../../../../src/integrations/tracing/mongo/vendored/utils.ts"],"sourcesContent":["/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n *\n * NOTICE from the Sentry authors:\n * - Vendored from: https://github.com/open-telemetry/opentelemetry-js-contrib/tree/15ef7506553f631ea4181391e0c5725a56f0d082/packages/instrumentation-mongodb\n * - Upstream version: @opentelemetry/instrumentation-mongodb@0.71.0\n * - Refactored to use Sentry's span APIs instead of OpenTelemetry tracing APIs\n */\n\nimport { SpanKind } from '@opentelemetry/api';\nimport type { Span, SpanAttributes } from '@sentry/core';\nimport {\n getActiveSpan,\n SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN,\n SPAN_STATUS_ERROR,\n startInactiveSpan,\n withActiveSpan,\n} from '@sentry/core';\nimport {\n ATTR_DB_CONNECTION_STRING,\n ATTR_DB_MONGODB_COLLECTION,\n ATTR_DB_NAME,\n ATTR_DB_OPERATION,\n ATTR_DB_STATEMENT,\n ATTR_DB_SYSTEM,\n ATTR_NET_PEER_NAME,\n ATTR_NET_PEER_PORT,\n DB_SYSTEM_VALUE_MONGODB,\n} from './semconv';\nimport type { MongodbNamespace, MongoInternalCommand, MongoInternalTopology } from './internal-types';\nimport { MongodbCommandType } from './internal-types';\n\nconst ORIGIN = 'auto.db.otel.mongo';\n\n/**\n * Replaces values in the command object with '?', hiding PII and helping grouping.\n */\nfunction serializeDbStatement(commandObj: Record<string, unknown>): string {\n return JSON.stringify(scrubStatement(commandObj));\n}\n\nfunction scrubStatement(value: unknown): unknown {\n if (Array.isArray(value)) {\n return value.map(element => scrubStatement(element));\n }\n\n if (isCommandObj(value)) {\n const initial: Record<string, unknown> = {};\n return Object.entries(value)\n .map(([key, element]) => [key, scrubStatement(element)])\n .reduce((prev, current) => {\n if (isCommandEntry(current)) {\n prev[current[0]] = current[1];\n }\n return prev;\n }, initial);\n }\n\n // A value like string or number, possibly contains PII, scrub it\n return '?';\n}\n\nfunction isCommandObj(value: Record<string, unknown> | unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !isBuffer(value);\n}\n\nfunction isBuffer(value: unknown): boolean {\n return typeof Buffer !== 'undefined' && Buffer.isBuffer(value);\n}\n\nfunction isCommandEntry(value: [string, unknown] | unknown): value is [string, unknown] {\n return Array.isArray(value);\n}\n\n/**\n * Get the mongodb command type from the object.\n */\nexport function getCommandType(command: MongoInternalCommand): MongodbCommandType {\n if (command.createIndexes !== undefined) {\n return MongodbCommandType.CREATE_INDEXES;\n } else if (command.findandmodify !== undefined) {\n return MongodbCommandType.FIND_AND_MODIFY;\n } else if (command.ismaster !== undefined) {\n return MongodbCommandType.IS_MASTER;\n } else if (command.count !== undefined) {\n return MongodbCommandType.COUNT;\n } else if (command.aggregate !== undefined) {\n return MongodbCommandType.AGGREGATE;\n } else {\n return MongodbCommandType.UNKNOWN;\n }\n}\n\n/**\n * Determine a span's attributes by fetching related metadata from the v4 connection context.\n */\nexport function getV4SpanAttributes(\n connectionCtx: any,\n ns: MongodbNamespace,\n command?: any,\n operation?: string,\n): SpanAttributes {\n let host, port: undefined | string;\n if (connectionCtx) {\n const hostParts = typeof connectionCtx.address === 'string' ? connectionCtx.address.split(':') : '';\n if (hostParts.length === 2) {\n host = hostParts[0];\n port = hostParts[1];\n }\n }\n let commandObj: Record<string, unknown>;\n if (command?.documents && command.documents[0]) {\n commandObj = command.documents[0];\n } else if (command?.cursors) {\n commandObj = command.cursors;\n } else {\n commandObj = command;\n }\n\n return getSpanAttributes(ns.db, ns.collection, host, port, commandObj, operation);\n}\n\n/**\n * Determine a span's attributes by fetching related metadata from the v3 topology.\n */\nexport function getV3SpanAttributes(\n ns: string,\n topology: MongoInternalTopology,\n command?: MongoInternalCommand,\n operation?: string | undefined,\n): SpanAttributes {\n let host: undefined | string;\n let port: undefined | string;\n if (topology?.s) {\n host = topology.s.options?.host ?? topology.s.host;\n port = (topology.s.options?.port ?? topology.s.port)?.toString();\n if (host == null || port == null) {\n const address = topology.description?.address;\n if (address) {\n const addressSegments = address.split(':');\n host = addressSegments[0];\n port = addressSegments[1];\n }\n }\n }\n\n // The namespace is a combination of the database name and the name of the\n // collection or index, like so: [database-name].[collection-or-index-name].\n // It could be a string or an instance of MongoDBNamespace, as such we\n // always coerce to a string to extract db and collection.\n const [dbName, dbCollection] = ns.toString().split('.');\n const commandObj = command?.query ?? command?.q ?? command;\n\n return getSpanAttributes(dbName, dbCollection, host, port, commandObj, operation);\n}\n\nfunction getSpanAttributes(\n dbName?: string,\n dbCollection?: string,\n host?: undefined | string,\n port?: undefined | string,\n commandObj?: any,\n operation?: string | undefined,\n): SpanAttributes {\n const attributes: SpanAttributes = {\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: ORIGIN,\n // eslint-disable-next-line typescript/no-deprecated\n [ATTR_DB_SYSTEM]: DB_SYSTEM_VALUE_MONGODB,\n // eslint-disable-next-line typescript/no-deprecated\n [ATTR_DB_NAME]: dbName,\n // eslint-disable-next-line typescript/no-deprecated\n [ATTR_DB_MONGODB_COLLECTION]: dbCollection,\n // eslint-disable-next-line typescript/no-deprecated\n [ATTR_DB_OPERATION]: operation,\n // eslint-disable-next-line typescript/no-deprecated\n [ATTR_DB_CONNECTION_STRING]: `mongodb://${host}:${port}/${dbName}`,\n };\n\n if (host && port) {\n // eslint-disable-next-line typescript/no-deprecated\n attributes[ATTR_NET_PEER_NAME] = host;\n const portNumber = parseInt(port, 10);\n if (!isNaN(portNumber)) {\n // eslint-disable-next-line typescript/no-deprecated\n attributes[ATTR_NET_PEER_PORT] = portNumber;\n }\n }\n\n if (commandObj) {\n try {\n // eslint-disable-next-line typescript/no-deprecated\n attributes[ATTR_DB_STATEMENT] = serializeDbStatement(commandObj);\n } catch {\n // ignore serialization errors — the statement is best-effort metadata\n }\n }\n\n return attributes;\n}\n\nexport function startMongoSpan(attributes: SpanAttributes): Span {\n return startInactiveSpan({\n // eslint-disable-next-line typescript/no-deprecated\n name: `mongodb.${attributes[ATTR_DB_OPERATION] || 'command'}`,\n kind: SpanKind.CLIENT,\n attributes,\n });\n}\n\n/**\n * Wraps the result handler so it ends the span (with error status on failure) and runs the\n * original callback re-activated under the parent span — mongodb loses the async context when\n * it invokes the callback on a later tick.\n */\nexport function patchEnd(span: Span | undefined, resultHandler: Function): Function {\n const parentSpan = getActiveSpan();\n let spanEnded = false;\n\n return function patchedEnd(this: {}, ...args: unknown[]) {\n if (!spanEnded) {\n spanEnded = true;\n const error = args[0];\n if (span) {\n if (error instanceof Error) {\n span.setStatus({ code: SPAN_STATUS_ERROR, message: error.message });\n }\n span.end();\n }\n }\n\n return withActiveSpan(parentSpan ?? null, () => resultHandler.apply(this, args));\n };\n}\n\n// The instrumentation only creates spans when there is an active parent span, to avoid emitting\n// orphaned mongodb spans.\nexport function shouldSkipInstrumentation(): boolean {\n return !getActiveSpan();\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"utils.js","sources":["../../../../../../src/integrations/tracing/mongo/vendored/utils.ts"],"sourcesContent":["/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n *\n * NOTICE from the Sentry authors:\n * - Vendored from: https://github.com/open-telemetry/opentelemetry-js-contrib/tree/15ef7506553f631ea4181391e0c5725a56f0d082/packages/instrumentation-mongodb\n * - Upstream version: @opentelemetry/instrumentation-mongodb@0.71.0\n * - Refactored to use Sentry's span APIs instead of OpenTelemetry tracing APIs\n */\n\nimport type { Span, SpanAttributes } from '@sentry/core';\nimport {\n getActiveSpan,\n SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN,\n SPAN_KIND,\n SPAN_STATUS_ERROR,\n startInactiveSpan,\n withActiveSpan,\n} from '@sentry/core';\nimport {\n ATTR_DB_CONNECTION_STRING,\n ATTR_DB_MONGODB_COLLECTION,\n ATTR_DB_NAME,\n ATTR_DB_OPERATION,\n ATTR_DB_STATEMENT,\n ATTR_DB_SYSTEM,\n ATTR_NET_PEER_NAME,\n ATTR_NET_PEER_PORT,\n DB_SYSTEM_VALUE_MONGODB,\n} from './semconv';\nimport type { MongodbNamespace, MongoInternalCommand, MongoInternalTopology } from './internal-types';\nimport { MongodbCommandType } from './internal-types';\n\nconst ORIGIN = 'auto.db.otel.mongo';\n\n/**\n * Replaces values in the command object with '?', hiding PII and helping grouping.\n */\nfunction serializeDbStatement(commandObj: Record<string, unknown>): string {\n return JSON.stringify(scrubStatement(commandObj));\n}\n\nfunction scrubStatement(value: unknown): unknown {\n if (Array.isArray(value)) {\n return value.map(element => scrubStatement(element));\n }\n\n if (isCommandObj(value)) {\n const initial: Record<string, unknown> = {};\n return Object.entries(value)\n .map(([key, element]) => [key, scrubStatement(element)])\n .reduce((prev, current) => {\n if (isCommandEntry(current)) {\n prev[current[0]] = current[1];\n }\n return prev;\n }, initial);\n }\n\n // A value like string or number, possibly contains PII, scrub it\n return '?';\n}\n\nfunction isCommandObj(value: Record<string, unknown> | unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !isBuffer(value);\n}\n\nfunction isBuffer(value: unknown): boolean {\n return typeof Buffer !== 'undefined' && Buffer.isBuffer(value);\n}\n\nfunction isCommandEntry(value: [string, unknown] | unknown): value is [string, unknown] {\n return Array.isArray(value);\n}\n\n/**\n * Get the mongodb command type from the object.\n */\nexport function getCommandType(command: MongoInternalCommand): MongodbCommandType {\n if (command.createIndexes !== undefined) {\n return MongodbCommandType.CREATE_INDEXES;\n } else if (command.findandmodify !== undefined) {\n return MongodbCommandType.FIND_AND_MODIFY;\n } else if (command.ismaster !== undefined) {\n return MongodbCommandType.IS_MASTER;\n } else if (command.count !== undefined) {\n return MongodbCommandType.COUNT;\n } else if (command.aggregate !== undefined) {\n return MongodbCommandType.AGGREGATE;\n } else {\n return MongodbCommandType.UNKNOWN;\n }\n}\n\n/**\n * Determine a span's attributes by fetching related metadata from the v4 connection context.\n */\nexport function getV4SpanAttributes(\n connectionCtx: any,\n ns: MongodbNamespace,\n command?: any,\n operation?: string,\n): SpanAttributes {\n let host, port: undefined | string;\n if (connectionCtx) {\n const hostParts = typeof connectionCtx.address === 'string' ? connectionCtx.address.split(':') : '';\n if (hostParts.length === 2) {\n host = hostParts[0];\n port = hostParts[1];\n }\n }\n let commandObj: Record<string, unknown>;\n if (command?.documents && command.documents[0]) {\n commandObj = command.documents[0];\n } else if (command?.cursors) {\n commandObj = command.cursors;\n } else {\n commandObj = command;\n }\n\n return getSpanAttributes(ns.db, ns.collection, host, port, commandObj, operation);\n}\n\n/**\n * Determine a span's attributes by fetching related metadata from the v3 topology.\n */\nexport function getV3SpanAttributes(\n ns: string,\n topology: MongoInternalTopology,\n command?: MongoInternalCommand,\n operation?: string | undefined,\n): SpanAttributes {\n let host: undefined | string;\n let port: undefined | string;\n if (topology?.s) {\n host = topology.s.options?.host ?? topology.s.host;\n port = (topology.s.options?.port ?? topology.s.port)?.toString();\n if (host == null || port == null) {\n const address = topology.description?.address;\n if (address) {\n const addressSegments = address.split(':');\n host = addressSegments[0];\n port = addressSegments[1];\n }\n }\n }\n\n // The namespace is a combination of the database name and the name of the\n // collection or index, like so: [database-name].[collection-or-index-name].\n // It could be a string or an instance of MongoDBNamespace, as such we\n // always coerce to a string to extract db and collection.\n const [dbName, dbCollection] = ns.toString().split('.');\n const commandObj = command?.query ?? command?.q ?? command;\n\n return getSpanAttributes(dbName, dbCollection, host, port, commandObj, operation);\n}\n\nfunction getSpanAttributes(\n dbName?: string,\n dbCollection?: string,\n host?: undefined | string,\n port?: undefined | string,\n commandObj?: any,\n operation?: string | undefined,\n): SpanAttributes {\n const attributes: SpanAttributes = {\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: ORIGIN,\n // eslint-disable-next-line typescript/no-deprecated\n [ATTR_DB_SYSTEM]: DB_SYSTEM_VALUE_MONGODB,\n // eslint-disable-next-line typescript/no-deprecated\n [ATTR_DB_NAME]: dbName,\n // eslint-disable-next-line typescript/no-deprecated\n [ATTR_DB_MONGODB_COLLECTION]: dbCollection,\n // eslint-disable-next-line typescript/no-deprecated\n [ATTR_DB_OPERATION]: operation,\n // eslint-disable-next-line typescript/no-deprecated\n [ATTR_DB_CONNECTION_STRING]: `mongodb://${host}:${port}/${dbName}`,\n };\n\n if (host && port) {\n // eslint-disable-next-line typescript/no-deprecated\n attributes[ATTR_NET_PEER_NAME] = host;\n const portNumber = parseInt(port, 10);\n if (!isNaN(portNumber)) {\n // eslint-disable-next-line typescript/no-deprecated\n attributes[ATTR_NET_PEER_PORT] = portNumber;\n }\n }\n\n if (commandObj) {\n try {\n // eslint-disable-next-line typescript/no-deprecated\n attributes[ATTR_DB_STATEMENT] = serializeDbStatement(commandObj);\n } catch {\n // ignore serialization errors — the statement is best-effort metadata\n }\n }\n\n return attributes;\n}\n\nexport function startMongoSpan(attributes: SpanAttributes): Span {\n return startInactiveSpan({\n // eslint-disable-next-line typescript/no-deprecated\n name: `mongodb.${attributes[ATTR_DB_OPERATION] || 'command'}`,\n kind: SPAN_KIND.CLIENT,\n attributes,\n });\n}\n\n/**\n * Wraps the result handler so it ends the span (with error status on failure) and runs the\n * original callback re-activated under the parent span — mongodb loses the async context when\n * it invokes the callback on a later tick.\n */\nexport function patchEnd(span: Span | undefined, resultHandler: Function): Function {\n const parentSpan = getActiveSpan();\n let spanEnded = false;\n\n return function patchedEnd(this: {}, ...args: unknown[]) {\n if (!spanEnded) {\n spanEnded = true;\n const error = args[0];\n if (span) {\n if (error instanceof Error) {\n span.setStatus({ code: SPAN_STATUS_ERROR, message: error.message });\n }\n span.end();\n }\n }\n\n return withActiveSpan(parentSpan ?? null, () => resultHandler.apply(this, args));\n };\n}\n\n// The instrumentation only creates spans when there is an active parent span, to avoid emitting\n// orphaned mongodb spans.\nexport function shouldSkipInstrumentation(): boolean {\n return !getActiveSpan();\n}\n"],"names":[],"mappings":"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"}
@@ -1,6 +1,5 @@
1
- import { SpanKind } from '@opentelemetry/api';
2
1
  import { InstrumentationBase, InstrumentationNodeModuleDefinition } from '@opentelemetry/instrumentation';
3
- import { SDK_VERSION, getActiveSpan, startInactiveSpan, withActiveSpan, SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN } from '@sentry/core';
2
+ import { SDK_VERSION, getActiveSpan, startInactiveSpan, SPAN_KIND, withActiveSpan, SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN } from '@sentry/core';
4
3
  import { ATTR_DB_SYSTEM, ATTR_DB_OPERATION } from './semconv.js';
5
4
  import { getAttributesFromCollection, handleCallbackResponse, handlePromiseResponse } from './utils.js';
6
5
 
@@ -203,7 +202,7 @@ class MongooseInstrumentation extends InstrumentationBase {
203
202
  };
204
203
  return startInactiveSpan({
205
204
  name: `mongoose.${modelName}.${operation}`,
206
- kind: SpanKind.CLIENT,
205
+ kind: SPAN_KIND.CLIENT,
207
206
  attributes,
208
207
  parentSpan
209
208
  });