Skip to content

Commit b998433

Browse files
authored
feat(remix): Vendor in opentelemetry-instrumentation-remix (#16145)
Resolves: #15739 - Removed Remix v1-related instrumentation code from the original implementation while vendoring in. - Also, FormData entries for manual instrumentation are aligned with OTEL use. Resolves: #16140
1 parent f55018f commit b998433

File tree

6 files changed

+402
-38
lines changed

6 files changed

+402
-38
lines changed

packages/remix/package.json

+2-1
Original file line numberDiff line numberDiff line change
@@ -65,14 +65,15 @@
6565
},
6666
"dependencies": {
6767
"@opentelemetry/api": "^1.9.0",
68+
"@opentelemetry/instrumentation": "^0.57.2",
69+
"@opentelemetry/semantic-conventions": "^1.30.0",
6870
"@remix-run/router": "1.x",
6971
"@sentry/cli": "^2.43.0",
7072
"@sentry/core": "9.18.0",
7173
"@sentry/node": "9.18.0",
7274
"@sentry/opentelemetry": "9.18.0",
7375
"@sentry/react": "9.18.0",
7476
"glob": "^10.3.4",
75-
"opentelemetry-instrumentation-remix": "0.8.0",
7677
"yargs": "^17.6.0"
7778
},
7879
"devDependencies": {

packages/remix/src/server/errors.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,7 @@ export async function errorHandleDataFunction(
134134
const options = getClient()?.getOptions() as RemixOptions | undefined;
135135

136136
if (options?.sendDefaultPii && options.captureActionFormDataKeys) {
137-
await storeFormDataKeys(args, span);
137+
await storeFormDataKeys(args, span, options.captureActionFormDataKeys);
138138
}
139139
}
140140

packages/remix/src/server/integrations/opentelemetry.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
import type { Client, IntegrationFn, Span } from '@sentry/core';
22
import { defineIntegration, SEMANTIC_ATTRIBUTE_SENTRY_OP, SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN } from '@sentry/core';
33
import { generateInstrumentOnce, getClient, spanToJSON } from '@sentry/node';
4-
import { RemixInstrumentation } from 'opentelemetry-instrumentation-remix';
54
import type { RemixOptions } from '../../utils/remixOptions';
5+
import { RemixInstrumentation } from '../../vendor/instrumentation';
66

77
const INTEGRATION_NAME = 'Remix';
88

packages/remix/src/utils/utils.ts

+17-2
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,11 @@ type ServerRouteManifest = ServerBuild['routes'];
1010
/**
1111
*
1212
*/
13-
export async function storeFormDataKeys(args: LoaderFunctionArgs | ActionFunctionArgs, span: Span): Promise<void> {
13+
export async function storeFormDataKeys(
14+
args: LoaderFunctionArgs | ActionFunctionArgs,
15+
span: Span,
16+
formDataKeys?: Record<string, string | boolean> | undefined,
17+
): Promise<void> {
1418
try {
1519
// We clone the request for Remix be able to read the FormData later.
1620
const clonedRequest = args.request.clone();
@@ -21,7 +25,18 @@ export async function storeFormDataKeys(args: LoaderFunctionArgs | ActionFunctio
2125
const formData = await clonedRequest.formData();
2226

2327
formData.forEach((value, key) => {
24-
span.setAttribute(`remix.action_form_data.${key}`, typeof value === 'string' ? value : '[non-string value]');
28+
let attrKey = key;
29+
30+
if (formDataKeys?.[key]) {
31+
if (typeof formDataKeys[key] === 'string') {
32+
attrKey = formDataKeys[key] as string;
33+
}
34+
35+
span.setAttribute(
36+
`remix.action_form_data.${attrKey}`,
37+
typeof value === 'string' ? value : '[non-string value]',
38+
);
39+
}
2540
});
2641
} catch (e) {
2742
DEBUG_BUILD && logger.warn('Failed to read FormData from request', e);

0 commit comments

Comments
 (0)