@uphold/opentelemetry-instrumentation-connect-node 0.2.1 → 1.0.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.
@@ -1 +1 @@
1
- {"version":3,"file":"interceptor.d.ts","sourceRoot":"","sources":["../src/interceptor.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,gCAAgC,EAAE,MAAM,SAAS,CAAC;AAC3D,OAAO,EAAE,UAAU,EAAkB,MAAM,EAA+B,MAAM,oBAAoB,CAAC;AACrG,OAAO,EAAE,gBAAgB,EAAqB,MAAM,kBAAkB,CAAC;AA6HvE,eAAO,MAAM,uBAAuB,GAAI,QAAQ,gCAAgC,EAAE,MAAM,UAAU,EAAE,QAAQ,MAAM,MAKxG,MAAM,gBAAgB,KAAG,gBAwClC,CAAC;AAEF,eAAO,MAAM,uBAAuB,GAAI,QAAQ,gCAAgC,EAAE,MAAM,UAAU,EAAE,QAAQ,MAAM,MAKxG,MAAM,gBAAgB,KAAG,gBAwClC,CAAC"}
1
+ {"version":3,"file":"interceptor.d.ts","sourceRoot":"","sources":["../src/interceptor.ts"],"names":[],"mappings":"AAeA,OAAO,EAAE,gCAAgC,EAAE,MAAM,SAAS,CAAC;AAC3D,OAAO,EAAE,UAAU,EAAkB,MAAM,EAA+B,MAAM,oBAAoB,CAAC;AACrG,OAAO,EAAE,gBAAgB,EAAqB,MAAM,kBAAkB,CAAC;AA6IvE,eAAO,MAAM,uBAAuB,GAAI,QAAQ,gCAAgC,EAAE,MAAM,UAAU,EAAE,QAAQ,MAAM,MAKxG,MAAM,gBAAgB,KAAG,gBAwClC,CAAC;AAEF,eAAO,MAAM,uBAAuB,GAAI,QAAQ,gCAAgC,EAAE,MAAM,UAAU,EAAE,QAAQ,MAAM,MAKxG,MAAM,gBAAgB,KAAG,gBAwClC,CAAC"}
@@ -1,7 +1,9 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.createServerInterceptor = exports.createClientInterceptor = void 0;
4
+ const semcov_1 = require("./semcov");
4
5
  const incubating_1 = require("@opentelemetry/semantic-conventions/incubating");
6
+ const semantic_conventions_1 = require("@opentelemetry/semantic-conventions");
5
7
  const api_1 = require("@opentelemetry/api");
6
8
  const utils_1 = require("./utils");
7
9
  const lodash_1 = require("lodash");
@@ -13,14 +15,16 @@ const createMetadataAttributesExtractor = (config, kind, phase) => {
13
15
  return () => ({});
14
16
  }
15
17
  // See: https://opentelemetry.io/docs/specs/semconv/rpc/
16
- return (span, metadata) => {
17
- const rpcSystem = span.attributes?.[incubating_1.ATTR_RPC_SYSTEM];
18
+ return (metadata) => {
18
19
  const attributes = {};
19
- if (rpcSystem && metadata) {
20
+ if (metadata) {
20
21
  for (const [key, mappedKey] of mappings) {
21
22
  const value = metadata.get(key);
22
23
  if (value != null) {
23
- attributes[`grpc.${rpcSystem}.${phase}.metadata.${mappedKey}`] = value;
24
+ const attributeKey = phase === 'request'
25
+ ? (0, incubating_1.ATTR_RPC_REQUEST_METADATA)(mappedKey)
26
+ : (0, incubating_1.ATTR_RPC_RESPONSE_METADATA)(mappedKey);
27
+ attributes[attributeKey] = value;
24
28
  }
25
29
  }
26
30
  }
@@ -35,17 +39,19 @@ const createStartSpan = (config, tracer, kind) => {
35
39
  const fullName = `${req.service.typeName}/${req.method.name}`;
36
40
  const url = parseUrl(req.url);
37
41
  const rpcSystem = (0, utils_1.resolveRpcSystem)(req.header);
42
+ const rpcSystemName = (0, utils_1.resolveRpcSystemName)(req.header);
38
43
  const span = tracer.startSpan(fullName, {
39
44
  attributes: {
40
45
  [incubating_1.ATTR_RPC_METHOD]: req.method.name,
41
- [incubating_1.ATTR_RPC_SERVICE]: req.service.typeName,
42
- [incubating_1.ATTR_RPC_SYSTEM]: rpcSystem,
43
- [incubating_1.ATTR_SERVER_ADDRESS]: url.hostname,
44
- [incubating_1.ATTR_SERVER_PORT]: url.port || undefined
46
+ [semcov_1.ATTR_RPC_SERVICE]: req.service.typeName,
47
+ [semcov_1.ATTR_RPC_SYSTEM]: rpcSystem,
48
+ [incubating_1.ATTR_RPC_SYSTEM_NAME]: rpcSystemName,
49
+ [semantic_conventions_1.ATTR_SERVER_ADDRESS]: url.hostname,
50
+ [semantic_conventions_1.ATTR_SERVER_PORT]: url.port || undefined
45
51
  },
46
52
  kind: (0, utils_1.rpcKindToSpanKind)(kind)
47
53
  });
48
- span.setAttributes(extractMetadata(span, req.header));
54
+ span.setAttributes(extractMetadata(req.header));
49
55
  return span;
50
56
  };
51
57
  };
@@ -56,12 +62,17 @@ const createEndSpanWithSuccess = (config, kind) => {
56
62
  if (span.ended) {
57
63
  return;
58
64
  }
59
- const rpcSystem = span.attributes[incubating_1.ATTR_RPC_SYSTEM];
65
+ const rpcSystemName = span.attributes?.[incubating_1.ATTR_RPC_SYSTEM_NAME];
60
66
  span.setStatus({ code: api_1.SpanStatusCode.OK });
61
- if (rpcSystem === 'grpc') {
62
- span.setAttribute(incubating_1.ATTR_RPC_GRPC_STATUS_CODE, 0);
67
+ if (rpcSystemName === 'grpc') {
68
+ span.setAttribute(incubating_1.ATTR_RPC_RESPONSE_STATUS_CODE, 0);
69
+ span.setAttribute(semcov_1.ATTR_RPC_GRPC_STATUS_CODE, 0);
63
70
  }
64
- span.setAttributes(extractMetadata(span, res.header));
71
+ else if (rpcSystemName === 'connectrpc') {
72
+ span.setAttribute(incubating_1.ATTR_RPC_RESPONSE_STATUS_CODE, 'ok');
73
+ span.setAttribute(semcov_1.ATTR_RPC_CONNECT_RPC_ERROR_CODE, 'ok');
74
+ }
75
+ span.setAttributes(extractMetadata(res.header));
65
76
  span.end();
66
77
  };
67
78
  };
@@ -74,15 +85,19 @@ const createEndSpanWithError = (config, kind) => {
74
85
  }
75
86
  const error = err instanceof Error ? err : undefined;
76
87
  const connectError = (0, utils_1.isConnectError)(error) ? error : undefined;
77
- const rpcSystem = span.attributes[incubating_1.ATTR_RPC_SYSTEM];
88
+ const rpcSystemName = span.attributes?.[incubating_1.ATTR_RPC_SYSTEM_NAME];
78
89
  span.setStatus({ code: api_1.SpanStatusCode.ERROR, message: error?.message });
79
- if (rpcSystem === 'grpc') {
80
- span.setAttribute(incubating_1.ATTR_RPC_GRPC_STATUS_CODE, connectError?.code ?? 2);
90
+ if (rpcSystemName === 'grpc') {
91
+ const statusCode = connectError?.code ?? 2;
92
+ span.setAttribute(incubating_1.ATTR_RPC_RESPONSE_STATUS_CODE, statusCode);
93
+ span.setAttribute(semcov_1.ATTR_RPC_GRPC_STATUS_CODE, statusCode);
81
94
  }
82
- else if (rpcSystem === 'connect_rpc') {
83
- span.setAttribute(incubating_1.ATTR_RPC_CONNECT_RPC_ERROR_CODE, (0, utils_1.errorCodeToString)(connectError?.code));
95
+ else if (rpcSystemName === 'connectrpc') {
96
+ const statusCode = (0, utils_1.errorCodeToString)(connectError?.code);
97
+ span.setAttribute(incubating_1.ATTR_RPC_RESPONSE_STATUS_CODE, statusCode);
98
+ span.setAttribute(semcov_1.ATTR_RPC_CONNECT_RPC_ERROR_CODE, statusCode);
84
99
  }
85
- span.setAttributes(extractMetadata(span, connectError?.metadata));
100
+ span.setAttributes(extractMetadata(connectError?.metadata));
86
101
  if (error) {
87
102
  span.recordException(error);
88
103
  }
@@ -1 +1 @@
1
- {"version":3,"file":"interceptor.js","sourceRoot":"","sources":["../src/interceptor.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n ATTR_RPC_CONNECT_RPC_ERROR_CODE,\n ATTR_RPC_GRPC_STATUS_CODE,\n ATTR_RPC_METHOD,\n ATTR_RPC_SERVICE,\n ATTR_RPC_SYSTEM,\n ATTR_SERVER_ADDRESS,\n ATTR_SERVER_PORT\n} from '@opentelemetry/semantic-conventions/incubating';\nimport { ConnectError, StreamRequest, StreamResponse, UnaryRequest, UnaryResponse } from '@connectrpc/connect';\nimport { ConnectNodeInstrumentationConfig } from './types';\nimport { DiagLogger, SpanStatusCode, Tracer, context, propagation, trace } from '@opentelemetry/api';\nimport { InterceptorAnyFn, RpcKind, RpcPhase } from './internal-types';\nimport { Span } from '@opentelemetry/sdk-trace-base';\nimport { errorCodeToString, isConnectError, resolveRpcSystem, rpcKindToSpanKind } from './utils';\nimport { memoize } from 'lodash';\nimport { safeExecuteInTheMiddle } from '@opentelemetry/instrumentation';\n\nconst createMetadataAttributesExtractor = (\n config: ConnectNodeInstrumentationConfig,\n kind: RpcKind,\n phase: RpcPhase\n) => {\n const metadataToSpanAttributes = config.metadataToSpanAttributes?.[kind]?.[phase] ?? [];\n const mappings = new Map(\n metadataToSpanAttributes.map(value => [value.toLowerCase(), value.toLowerCase().replace(/-/g, '_')])\n );\n\n if (mappings.size === 0) {\n return () => ({});\n }\n\n // See: https://opentelemetry.io/docs/specs/semconv/rpc/\n return (span: Span, metadata?: Headers) => {\n const rpcSystem = span.attributes?.[ATTR_RPC_SYSTEM];\n const attributes: Record<string, string> = {};\n\n if (rpcSystem && metadata) {\n for (const [key, mappedKey] of mappings) {\n const value = metadata.get(key);\n\n if (value != null) {\n attributes[`grpc.${rpcSystem}.${phase}.metadata.${mappedKey}`] = value;\n }\n }\n }\n\n return attributes;\n };\n};\n\nconst createStartSpan = (config: ConnectNodeInstrumentationConfig, tracer: Tracer, kind: RpcKind) => {\n const extractMetadata = createMetadataAttributesExtractor(config, kind, 'request');\n const parseUrl = memoize((url: string) => new URL(url));\n\n // See: https://opentelemetry.io/docs/specs/semconv/rpc/\n return (req: UnaryRequest | StreamRequest) => {\n const fullName = `${req.service.typeName}/${req.method.name}`;\n const url = parseUrl(req.url);\n const rpcSystem = resolveRpcSystem(req.header);\n\n const span = tracer.startSpan(fullName, {\n attributes: {\n [ATTR_RPC_METHOD]: req.method.name,\n [ATTR_RPC_SERVICE]: req.service.typeName,\n [ATTR_RPC_SYSTEM]: rpcSystem,\n [ATTR_SERVER_ADDRESS]: url.hostname,\n [ATTR_SERVER_PORT]: url.port || undefined\n },\n kind: rpcKindToSpanKind(kind)\n });\n\n span.setAttributes(extractMetadata(span as Span, req.header));\n\n return span;\n };\n};\n\nconst createEndSpanWithSuccess = (config: ConnectNodeInstrumentationConfig, kind: RpcKind) => {\n const extractMetadata = createMetadataAttributesExtractor(config, kind, 'response');\n\n // See: https://opentelemetry.io/docs/specs/semconv/rpc/\n return (span: Span, res: UnaryResponse | StreamResponse) => {\n if (span.ended) {\n return;\n }\n\n const rpcSystem = span.attributes[ATTR_RPC_SYSTEM];\n\n span.setStatus({ code: SpanStatusCode.OK });\n\n if (rpcSystem === 'grpc') {\n span.setAttribute(ATTR_RPC_GRPC_STATUS_CODE, 0);\n }\n\n span.setAttributes(extractMetadata(span as Span, res.header));\n span.end();\n };\n};\n\nconst createEndSpanWithError = (config: ConnectNodeInstrumentationConfig, kind: RpcKind) => {\n const extractMetadata = createMetadataAttributesExtractor(config, kind, 'response');\n\n // See: https://opentelemetry.io/docs/specs/semconv/rpc/\n return (span: Span, err: unknown) => {\n if (span.ended) {\n return;\n }\n\n const error = err instanceof Error ? (err as Error) : undefined;\n const connectError = isConnectError(error) ? (error as ConnectError) : undefined;\n const rpcSystem = span.attributes[ATTR_RPC_SYSTEM];\n\n span.setStatus({ code: SpanStatusCode.ERROR, message: error?.message });\n\n if (rpcSystem === 'grpc') {\n span.setAttribute(ATTR_RPC_GRPC_STATUS_CODE, connectError?.code ?? 2);\n } else if (rpcSystem === 'connect_rpc') {\n span.setAttribute(ATTR_RPC_CONNECT_RPC_ERROR_CODE, errorCodeToString(connectError?.code));\n }\n\n span.setAttributes(extractMetadata(span as Span, connectError?.metadata));\n\n if (error) {\n span.recordException(error);\n }\n\n span.end();\n };\n};\n\nconst carrierSetterAndGetter = {\n get: (carrier: Headers, key: string) => carrier.get(key) ?? undefined,\n keys: (carrier: Headers) => Array.from(carrier.keys()),\n set: (carrier: Headers, key: string, value: string) => carrier.set(key, value)\n};\n\nexport const createClientInterceptor = (config: ConnectNodeInstrumentationConfig, diag: DiagLogger, tracer: Tracer) => {\n const startSpan = createStartSpan(config, tracer, 'client');\n const endSpanWithSuccess = createEndSpanWithSuccess(config, 'client');\n const endSpanWithError = createEndSpanWithError(config, 'client');\n\n return (next: InterceptorAnyFn): InterceptorAnyFn =>\n async req => {\n // Only unary requests are supported due to a bug in Node.js async context propagation on generator functions.\n // See https://github.com/open-telemetry/opentelemetry-js/issues/2951 and https://github.com/nodejs/node/issues/42237\n if (req.method.methodKind !== 'unary') {\n return await next(req);\n }\n\n const shouldIgnoreRequest = safeExecuteInTheMiddle(\n () => config.ignoreRequest?.(req) === true,\n (err: unknown) => {\n if (err != null) {\n diag.error('caught ignoreRequest error: ', err);\n }\n },\n true\n );\n\n if (shouldIgnoreRequest) {\n return await next(req);\n }\n\n const span = startSpan(req);\n\n try {\n return await context.with(trace.setSpan(context.active(), span), async () => {\n propagation.inject(context.active(), req.header, carrierSetterAndGetter);\n\n const res = await next(req);\n\n endSpanWithSuccess(span as Span, res);\n\n return res;\n });\n } catch (err) {\n endSpanWithError(span as Span, err);\n\n throw err;\n }\n };\n};\n\nexport const createServerInterceptor = (config: ConnectNodeInstrumentationConfig, diag: DiagLogger, tracer: Tracer) => {\n const startSpan = createStartSpan(config, tracer, 'server');\n const endSpanWithSuccess = createEndSpanWithSuccess(config, 'server');\n const endSpanWithError = createEndSpanWithError(config, 'server');\n\n return (next: InterceptorAnyFn): InterceptorAnyFn =>\n async req => {\n // Only unary requests are supported due to a bug in Node.js async context propagation on generator functions.\n // See https://github.com/open-telemetry/opentelemetry-js/issues/2951 and https://github.com/nodejs/node/issues/42237\n if (req.method.methodKind !== 'unary') {\n return await next(req);\n }\n\n const shouldIgnoreRequest = safeExecuteInTheMiddle(\n () => config.ignoreRequest?.(req) === true,\n (err: unknown) => {\n if (err != null) {\n diag.error('caught ignoreRequest error: ', err);\n }\n },\n true\n );\n\n if (shouldIgnoreRequest) {\n return await next(req);\n }\n\n return await context.with(propagation.extract(context.active(), req.header, carrierSetterAndGetter), async () => {\n const span = startSpan(req);\n\n try {\n return await context.with(trace.setSpan(context.active(), span), async () => {\n const res = await next(req);\n\n endSpanWithSuccess(span as Span, res);\n\n return res;\n });\n } catch (err) {\n endSpanWithError(span as Span, err);\n\n throw err;\n }\n });\n };\n};\n"]}
1
+ {"version":3,"file":"interceptor.js","sourceRoot":"","sources":["../src/interceptor.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n ATTR_RPC_CONNECT_RPC_ERROR_CODE,\n ATTR_RPC_GRPC_STATUS_CODE,\n ATTR_RPC_SERVICE,\n ATTR_RPC_SYSTEM\n} from './semcov';\nimport {\n ATTR_RPC_METHOD,\n ATTR_RPC_RESPONSE_STATUS_CODE,\n ATTR_RPC_SYSTEM_NAME,\n ATTR_RPC_REQUEST_METADATA as rpcRequestMetadataAttributeKey,\n ATTR_RPC_RESPONSE_METADATA as rpcResponseMetadataAttributeKey\n} from '@opentelemetry/semantic-conventions/incubating';\nimport { ATTR_SERVER_ADDRESS, ATTR_SERVER_PORT } from '@opentelemetry/semantic-conventions';\nimport { ConnectError, StreamRequest, StreamResponse, UnaryRequest, UnaryResponse } from '@connectrpc/connect';\nimport { ConnectNodeInstrumentationConfig } from './types';\nimport { DiagLogger, SpanStatusCode, Tracer, context, propagation, trace } from '@opentelemetry/api';\nimport { InterceptorAnyFn, RpcKind, RpcPhase } from './internal-types';\nimport { Span } from '@opentelemetry/sdk-trace-base';\nimport { errorCodeToString, isConnectError, resolveRpcSystem, resolveRpcSystemName, rpcKindToSpanKind } from './utils';\nimport { memoize } from 'lodash';\nimport { safeExecuteInTheMiddle } from '@opentelemetry/instrumentation';\n\nconst createMetadataAttributesExtractor = (\n config: ConnectNodeInstrumentationConfig,\n kind: RpcKind,\n phase: RpcPhase\n) => {\n const metadataToSpanAttributes = config.metadataToSpanAttributes?.[kind]?.[phase] ?? [];\n const mappings = new Map(\n metadataToSpanAttributes.map(value => [value.toLowerCase(), value.toLowerCase().replace(/-/g, '_')])\n );\n\n if (mappings.size === 0) {\n return () => ({});\n }\n\n // See: https://opentelemetry.io/docs/specs/semconv/rpc/\n return (metadata?: Headers) => {\n const attributes: Record<string, string> = {};\n\n if (metadata) {\n for (const [key, mappedKey] of mappings) {\n const value = metadata.get(key);\n\n if (value != null) {\n const attributeKey =\n phase === 'request'\n ? rpcRequestMetadataAttributeKey(mappedKey)\n : rpcResponseMetadataAttributeKey(mappedKey);\n\n attributes[attributeKey] = value;\n }\n }\n }\n\n return attributes;\n };\n};\n\nconst createStartSpan = (config: ConnectNodeInstrumentationConfig, tracer: Tracer, kind: RpcKind) => {\n const extractMetadata = createMetadataAttributesExtractor(config, kind, 'request');\n const parseUrl = memoize((url: string) => new URL(url));\n\n // See: https://opentelemetry.io/docs/specs/semconv/rpc/\n return (req: UnaryRequest | StreamRequest) => {\n const fullName = `${req.service.typeName}/${req.method.name}`;\n const url = parseUrl(req.url);\n const rpcSystem = resolveRpcSystem(req.header);\n const rpcSystemName = resolveRpcSystemName(req.header);\n\n const span = tracer.startSpan(fullName, {\n attributes: {\n [ATTR_RPC_METHOD]: req.method.name,\n [ATTR_RPC_SERVICE]: req.service.typeName,\n [ATTR_RPC_SYSTEM]: rpcSystem,\n [ATTR_RPC_SYSTEM_NAME]: rpcSystemName,\n [ATTR_SERVER_ADDRESS]: url.hostname,\n [ATTR_SERVER_PORT]: url.port || undefined\n },\n kind: rpcKindToSpanKind(kind)\n });\n\n span.setAttributes(extractMetadata(req.header));\n\n return span;\n };\n};\n\nconst createEndSpanWithSuccess = (config: ConnectNodeInstrumentationConfig, kind: RpcKind) => {\n const extractMetadata = createMetadataAttributesExtractor(config, kind, 'response');\n\n // See: https://opentelemetry.io/docs/specs/semconv/rpc/\n return (span: Span, res: UnaryResponse | StreamResponse) => {\n if (span.ended) {\n return;\n }\n\n const rpcSystemName = span.attributes?.[ATTR_RPC_SYSTEM_NAME];\n\n span.setStatus({ code: SpanStatusCode.OK });\n\n if (rpcSystemName === 'grpc') {\n span.setAttribute(ATTR_RPC_RESPONSE_STATUS_CODE, 0);\n span.setAttribute(ATTR_RPC_GRPC_STATUS_CODE, 0);\n } else if (rpcSystemName === 'connectrpc') {\n span.setAttribute(ATTR_RPC_RESPONSE_STATUS_CODE, 'ok');\n span.setAttribute(ATTR_RPC_CONNECT_RPC_ERROR_CODE, 'ok');\n }\n\n span.setAttributes(extractMetadata(res.header));\n span.end();\n };\n};\n\nconst createEndSpanWithError = (config: ConnectNodeInstrumentationConfig, kind: RpcKind) => {\n const extractMetadata = createMetadataAttributesExtractor(config, kind, 'response');\n\n // See: https://opentelemetry.io/docs/specs/semconv/rpc/\n return (span: Span, err: unknown) => {\n if (span.ended) {\n return;\n }\n\n const error = err instanceof Error ? (err as Error) : undefined;\n const connectError = isConnectError(error) ? (error as ConnectError) : undefined;\n const rpcSystemName = span.attributes?.[ATTR_RPC_SYSTEM_NAME];\n\n span.setStatus({ code: SpanStatusCode.ERROR, message: error?.message });\n\n if (rpcSystemName === 'grpc') {\n const statusCode = connectError?.code ?? 2;\n\n span.setAttribute(ATTR_RPC_RESPONSE_STATUS_CODE, statusCode);\n span.setAttribute(ATTR_RPC_GRPC_STATUS_CODE, statusCode);\n } else if (rpcSystemName === 'connectrpc') {\n const statusCode = errorCodeToString(connectError?.code);\n\n span.setAttribute(ATTR_RPC_RESPONSE_STATUS_CODE, statusCode);\n span.setAttribute(ATTR_RPC_CONNECT_RPC_ERROR_CODE, statusCode);\n }\n\n span.setAttributes(extractMetadata(connectError?.metadata));\n\n if (error) {\n span.recordException(error);\n }\n\n span.end();\n };\n};\n\nconst carrierSetterAndGetter = {\n get: (carrier: Headers, key: string) => carrier.get(key) ?? undefined,\n keys: (carrier: Headers) => Array.from(carrier.keys()),\n set: (carrier: Headers, key: string, value: string) => carrier.set(key, value)\n};\n\nexport const createClientInterceptor = (config: ConnectNodeInstrumentationConfig, diag: DiagLogger, tracer: Tracer) => {\n const startSpan = createStartSpan(config, tracer, 'client');\n const endSpanWithSuccess = createEndSpanWithSuccess(config, 'client');\n const endSpanWithError = createEndSpanWithError(config, 'client');\n\n return (next: InterceptorAnyFn): InterceptorAnyFn =>\n async req => {\n // Only unary requests are supported due to a bug in Node.js async context propagation on generator functions.\n // See https://github.com/open-telemetry/opentelemetry-js/issues/2951 and https://github.com/nodejs/node/issues/42237\n if (req.method.methodKind !== 'unary') {\n return await next(req);\n }\n\n const shouldIgnoreRequest = safeExecuteInTheMiddle(\n () => config.ignoreRequest?.(req) === true,\n (err: unknown) => {\n if (err != null) {\n diag.error('caught ignoreRequest error: ', err);\n }\n },\n true\n );\n\n if (shouldIgnoreRequest) {\n return await next(req);\n }\n\n const span = startSpan(req);\n\n try {\n return await context.with(trace.setSpan(context.active(), span), async () => {\n propagation.inject(context.active(), req.header, carrierSetterAndGetter);\n\n const res = await next(req);\n\n endSpanWithSuccess(span as Span, res);\n\n return res;\n });\n } catch (err) {\n endSpanWithError(span as Span, err);\n\n throw err;\n }\n };\n};\n\nexport const createServerInterceptor = (config: ConnectNodeInstrumentationConfig, diag: DiagLogger, tracer: Tracer) => {\n const startSpan = createStartSpan(config, tracer, 'server');\n const endSpanWithSuccess = createEndSpanWithSuccess(config, 'server');\n const endSpanWithError = createEndSpanWithError(config, 'server');\n\n return (next: InterceptorAnyFn): InterceptorAnyFn =>\n async req => {\n // Only unary requests are supported due to a bug in Node.js async context propagation on generator functions.\n // See https://github.com/open-telemetry/opentelemetry-js/issues/2951 and https://github.com/nodejs/node/issues/42237\n if (req.method.methodKind !== 'unary') {\n return await next(req);\n }\n\n const shouldIgnoreRequest = safeExecuteInTheMiddle(\n () => config.ignoreRequest?.(req) === true,\n (err: unknown) => {\n if (err != null) {\n diag.error('caught ignoreRequest error: ', err);\n }\n },\n true\n );\n\n if (shouldIgnoreRequest) {\n return await next(req);\n }\n\n return await context.with(propagation.extract(context.active(), req.header, carrierSetterAndGetter), async () => {\n const span = startSpan(req);\n\n try {\n return await context.with(trace.setSpan(context.active(), span), async () => {\n const res = await next(req);\n\n endSpanWithSuccess(span as Span, res);\n\n return res;\n });\n } catch (err) {\n endSpanWithError(span as Span, err);\n\n throw err;\n }\n });\n };\n};\n"]}
@@ -0,0 +1,5 @@
1
+ export declare const ATTR_RPC_CONNECT_RPC_ERROR_CODE = "rpc.connect_rpc.error_code";
2
+ export declare const ATTR_RPC_GRPC_STATUS_CODE = "rpc.grpc.status_code";
3
+ export declare const ATTR_RPC_SERVICE = "rpc.service";
4
+ export declare const ATTR_RPC_SYSTEM = "rpc.system";
5
+ //# sourceMappingURL=semcov.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"semcov.d.ts","sourceRoot":"","sources":["../src/semcov.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,+BAA+B,+BAA+B,CAAC;AAC5E,eAAO,MAAM,yBAAyB,yBAAyB,CAAC;AAChE,eAAO,MAAM,gBAAgB,gBAAgB,CAAC;AAC9C,eAAO,MAAM,eAAe,eAAe,CAAC"}
package/dist/semcov.js ADDED
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ATTR_RPC_SYSTEM = exports.ATTR_RPC_SERVICE = exports.ATTR_RPC_GRPC_STATUS_CODE = exports.ATTR_RPC_CONNECT_RPC_ERROR_CODE = void 0;
4
+ // Deprecated semantic convention attributes kept for backward compatibility with v1.29.
5
+ exports.ATTR_RPC_CONNECT_RPC_ERROR_CODE = 'rpc.connect_rpc.error_code';
6
+ exports.ATTR_RPC_GRPC_STATUS_CODE = 'rpc.grpc.status_code';
7
+ exports.ATTR_RPC_SERVICE = 'rpc.service';
8
+ exports.ATTR_RPC_SYSTEM = 'rpc.system';
9
+ //# sourceMappingURL=semcov.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"semcov.js","sourceRoot":"","sources":["../src/semcov.ts"],"names":[],"mappings":";;;AAAA,wFAAwF;AAC3E,QAAA,+BAA+B,GAAG,4BAA4B,CAAC;AAC/D,QAAA,yBAAyB,GAAG,sBAAsB,CAAC;AACnD,QAAA,gBAAgB,GAAG,aAAa,CAAC;AACjC,QAAA,eAAe,GAAG,YAAY,CAAC","sourcesContent":["// Deprecated semantic convention attributes kept for backward compatibility with v1.29.\nexport const ATTR_RPC_CONNECT_RPC_ERROR_CODE = 'rpc.connect_rpc.error_code';\nexport const ATTR_RPC_GRPC_STATUS_CODE = 'rpc.grpc.status_code';\nexport const ATTR_RPC_SERVICE = 'rpc.service';\nexport const ATTR_RPC_SYSTEM = 'rpc.system';\n"]}
package/dist/utils.d.ts CHANGED
@@ -3,6 +3,7 @@ import { RpcKind, RpcSystem } from './internal-types';
3
3
  import { SpanKind } from '@opentelemetry/api';
4
4
  export declare const isConnectError: (err: unknown) => err is ConnectError;
5
5
  export declare const resolveRpcSystem: (header: Headers) => RpcSystem;
6
+ export declare const resolveRpcSystemName: (header: Headers) => "grpc" | "connectrpc" | undefined;
6
7
  export declare const errorCodeToString: (code?: number) => "internal" | "unknown" | "canceled" | "ok" | "aborted" | "unavailable" | "already_exists" | "data_loss" | "deadline_exceeded" | "failed_precondition" | "invalid_argument" | "not_found" | "out_of_range" | "permission_denied" | "resource_exhausted" | "unauthenticated" | "unimplemented";
7
8
  export declare const rpcKindToSpanKind: (kind: RpcKind) => SpanKind.INTERNAL | SpanKind.SERVER | SpanKind.CLIENT;
8
9
  //# sourceMappingURL=utils.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAE9C,eAAO,MAAM,cAAc,GAAI,KAAK,OAAO,KAAG,GAAG,IAAI,YAUpD,CAAC;AAEF,eAAO,MAAM,gBAAgB,GAAI,QAAQ,OAAO,KAAG,SAUlD,CAAC;AAEF,eAAO,MAAM,iBAAiB,GAAI,OAAO,MAAM,iSAuC9C,CAAC;AAEF,eAAO,MAAM,iBAAiB,GAAI,MAAM,OAAO,0DAS9C,CAAC"}
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAE9C,eAAO,MAAM,cAAc,GAAI,KAAK,OAAO,KAAG,GAAG,IAAI,YAUpD,CAAC;AAEF,eAAO,MAAM,gBAAgB,GAAI,QAAQ,OAAO,KAAG,SAUlD,CAAC;AAEF,eAAO,MAAM,oBAAoB,GAAI,QAAQ,OAAO,sCAQnD,CAAC;AAEF,eAAO,MAAM,iBAAiB,GAAI,OAAO,MAAM,iSAuC9C,CAAC;AAEF,eAAO,MAAM,iBAAiB,GAAI,MAAM,OAAO,0DAS9C,CAAC"}
package/dist/utils.js CHANGED
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.rpcKindToSpanKind = exports.errorCodeToString = exports.resolveRpcSystem = exports.isConnectError = void 0;
3
+ exports.rpcKindToSpanKind = exports.errorCodeToString = exports.resolveRpcSystemName = exports.resolveRpcSystem = exports.isConnectError = void 0;
4
4
  const api_1 = require("@opentelemetry/api");
5
5
  const isConnectError = (err) => {
6
6
  const connectErr = err;
@@ -21,6 +21,14 @@ const resolveRpcSystem = (header) => {
21
21
  return undefined;
22
22
  };
23
23
  exports.resolveRpcSystem = resolveRpcSystem;
24
+ const resolveRpcSystemName = (header) => {
25
+ const rpcSystem = (0, exports.resolveRpcSystem)(header);
26
+ if (rpcSystem === 'connect_rpc') {
27
+ return 'connectrpc';
28
+ }
29
+ return rpcSystem;
30
+ };
31
+ exports.resolveRpcSystemName = resolveRpcSystemName;
24
32
  const errorCodeToString = (code) => {
25
33
  switch (code) {
26
34
  case 0:
package/dist/utils.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":";;;AAEA,4CAA8C;AAEvC,MAAM,cAAc,GAAG,CAAC,GAAY,EAAuB,EAAE;IAClE,MAAM,UAAU,GAAG,GAAmB,CAAC;IAEvC,OAAO,CACL,UAAU,IAAI,IAAI;QAClB,OAAO,UAAU,CAAC,OAAO,KAAK,QAAQ;QACtC,OAAO,UAAU,CAAC,UAAU,KAAK,QAAQ;QACzC,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC;QACjC,UAAU,CAAC,QAAQ,YAAY,OAAO,CACvC,CAAC;AACJ,CAAC,CAAC;AAVW,QAAA,cAAc,kBAUzB;AAEK,MAAM,gBAAgB,GAAG,CAAC,MAAe,EAAa,EAAE;IAC7D,IAAI,MAAM,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE,UAAU,CAAC,kBAAkB,CAAC,EAAE,CAAC;QAC/D,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,IAAI,MAAM,CAAC,GAAG,CAAC,0BAA0B,CAAC,EAAE,CAAC;QAC3C,OAAO,aAAa,CAAC;IACvB,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC,CAAC;AAVW,QAAA,gBAAgB,oBAU3B;AAEK,MAAM,iBAAiB,GAAG,CAAC,IAAa,EAAE,EAAE;IACjD,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,CAAC;YACJ,OAAO,IAAI,CAAC;QACd,KAAK,CAAC;YACJ,OAAO,UAAU,CAAC;QACpB,KAAK,CAAC;YACJ,OAAO,SAAS,CAAC;QACnB,KAAK,CAAC;YACJ,OAAO,kBAAkB,CAAC;QAC5B,KAAK,CAAC;YACJ,OAAO,mBAAmB,CAAC;QAC7B,KAAK,CAAC;YACJ,OAAO,WAAW,CAAC;QACrB,KAAK,CAAC;YACJ,OAAO,gBAAgB,CAAC;QAC1B,KAAK,CAAC;YACJ,OAAO,mBAAmB,CAAC;QAC7B,KAAK,CAAC;YACJ,OAAO,oBAAoB,CAAC;QAC9B,KAAK,CAAC;YACJ,OAAO,qBAAqB,CAAC;QAC/B,KAAK,EAAE;YACL,OAAO,SAAS,CAAC;QACnB,KAAK,EAAE;YACL,OAAO,cAAc,CAAC;QACxB,KAAK,EAAE;YACL,OAAO,eAAe,CAAC;QACzB,KAAK,EAAE;YACL,OAAO,UAAU,CAAC;QACpB,KAAK,EAAE;YACL,OAAO,aAAa,CAAC;QACvB,KAAK,EAAE;YACL,OAAO,WAAW,CAAC;QACrB,KAAK,EAAE;YACL,OAAO,iBAAiB,CAAC;QAC3B;YACE,OAAO,SAAS,CAAC;IACrB,CAAC;AACH,CAAC,CAAC;AAvCW,QAAA,iBAAiB,qBAuC5B;AAEK,MAAM,iBAAiB,GAAG,CAAC,IAAa,EAAE,EAAE;IACjD,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,QAAQ;YACX,OAAO,cAAQ,CAAC,MAAM,CAAC;QACzB,KAAK,QAAQ;YACX,OAAO,cAAQ,CAAC,MAAM,CAAC;QACzB;YACE,OAAO,cAAQ,CAAC,QAAQ,CAAC;IAC7B,CAAC;AACH,CAAC,CAAC;AATW,QAAA,iBAAiB,qBAS5B","sourcesContent":["import type { ConnectError } from '@connectrpc/connect';\nimport { RpcKind, RpcSystem } from './internal-types';\nimport { SpanKind } from '@opentelemetry/api';\n\nexport const isConnectError = (err: unknown): err is ConnectError => {\n const connectErr = err as ConnectError;\n\n return (\n connectErr != null &&\n typeof connectErr.message === 'string' &&\n typeof connectErr.rawMessage === 'string' &&\n Number.isInteger(connectErr.code) &&\n connectErr.metadata instanceof Headers\n );\n};\n\nexport const resolveRpcSystem = (header: Headers): RpcSystem => {\n if (header.get('Content-Type')?.startsWith('application/grpc')) {\n return 'grpc';\n }\n\n if (header.has('Connect-Protocol-Version')) {\n return 'connect_rpc';\n }\n\n return undefined;\n};\n\nexport const errorCodeToString = (code?: number) => {\n switch (code) {\n case 0:\n return 'ok';\n case 1:\n return 'canceled';\n case 2:\n return 'unknown';\n case 3:\n return 'invalid_argument';\n case 4:\n return 'deadline_exceeded';\n case 5:\n return 'not_found';\n case 6:\n return 'already_exists';\n case 7:\n return 'permission_denied';\n case 8:\n return 'resource_exhausted';\n case 9:\n return 'failed_precondition';\n case 10:\n return 'aborted';\n case 11:\n return 'out_of_range';\n case 12:\n return 'unimplemented';\n case 13:\n return 'internal';\n case 14:\n return 'unavailable';\n case 15:\n return 'data_loss';\n case 16:\n return 'unauthenticated';\n default:\n return 'unknown';\n }\n};\n\nexport const rpcKindToSpanKind = (kind: RpcKind) => {\n switch (kind) {\n case 'client':\n return SpanKind.CLIENT;\n case 'server':\n return SpanKind.SERVER;\n default:\n return SpanKind.INTERNAL;\n }\n};\n"]}
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":";;;AAEA,4CAA8C;AAEvC,MAAM,cAAc,GAAG,CAAC,GAAY,EAAuB,EAAE;IAClE,MAAM,UAAU,GAAG,GAAmB,CAAC;IAEvC,OAAO,CACL,UAAU,IAAI,IAAI;QAClB,OAAO,UAAU,CAAC,OAAO,KAAK,QAAQ;QACtC,OAAO,UAAU,CAAC,UAAU,KAAK,QAAQ;QACzC,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC;QACjC,UAAU,CAAC,QAAQ,YAAY,OAAO,CACvC,CAAC;AACJ,CAAC,CAAC;AAVW,QAAA,cAAc,kBAUzB;AAEK,MAAM,gBAAgB,GAAG,CAAC,MAAe,EAAa,EAAE;IAC7D,IAAI,MAAM,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE,UAAU,CAAC,kBAAkB,CAAC,EAAE,CAAC;QAC/D,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,IAAI,MAAM,CAAC,GAAG,CAAC,0BAA0B,CAAC,EAAE,CAAC;QAC3C,OAAO,aAAa,CAAC;IACvB,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC,CAAC;AAVW,QAAA,gBAAgB,oBAU3B;AAEK,MAAM,oBAAoB,GAAG,CAAC,MAAe,EAAE,EAAE;IACtD,MAAM,SAAS,GAAG,IAAA,wBAAgB,EAAC,MAAM,CAAC,CAAC;IAE3C,IAAI,SAAS,KAAK,aAAa,EAAE,CAAC;QAChC,OAAO,YAAY,CAAC;IACtB,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC,CAAC;AARW,QAAA,oBAAoB,wBAQ/B;AAEK,MAAM,iBAAiB,GAAG,CAAC,IAAa,EAAE,EAAE;IACjD,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,CAAC;YACJ,OAAO,IAAI,CAAC;QACd,KAAK,CAAC;YACJ,OAAO,UAAU,CAAC;QACpB,KAAK,CAAC;YACJ,OAAO,SAAS,CAAC;QACnB,KAAK,CAAC;YACJ,OAAO,kBAAkB,CAAC;QAC5B,KAAK,CAAC;YACJ,OAAO,mBAAmB,CAAC;QAC7B,KAAK,CAAC;YACJ,OAAO,WAAW,CAAC;QACrB,KAAK,CAAC;YACJ,OAAO,gBAAgB,CAAC;QAC1B,KAAK,CAAC;YACJ,OAAO,mBAAmB,CAAC;QAC7B,KAAK,CAAC;YACJ,OAAO,oBAAoB,CAAC;QAC9B,KAAK,CAAC;YACJ,OAAO,qBAAqB,CAAC;QAC/B,KAAK,EAAE;YACL,OAAO,SAAS,CAAC;QACnB,KAAK,EAAE;YACL,OAAO,cAAc,CAAC;QACxB,KAAK,EAAE;YACL,OAAO,eAAe,CAAC;QACzB,KAAK,EAAE;YACL,OAAO,UAAU,CAAC;QACpB,KAAK,EAAE;YACL,OAAO,aAAa,CAAC;QACvB,KAAK,EAAE;YACL,OAAO,WAAW,CAAC;QACrB,KAAK,EAAE;YACL,OAAO,iBAAiB,CAAC;QAC3B;YACE,OAAO,SAAS,CAAC;IACrB,CAAC;AACH,CAAC,CAAC;AAvCW,QAAA,iBAAiB,qBAuC5B;AAEK,MAAM,iBAAiB,GAAG,CAAC,IAAa,EAAE,EAAE;IACjD,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,QAAQ;YACX,OAAO,cAAQ,CAAC,MAAM,CAAC;QACzB,KAAK,QAAQ;YACX,OAAO,cAAQ,CAAC,MAAM,CAAC;QACzB;YACE,OAAO,cAAQ,CAAC,QAAQ,CAAC;IAC7B,CAAC;AACH,CAAC,CAAC;AATW,QAAA,iBAAiB,qBAS5B","sourcesContent":["import type { ConnectError } from '@connectrpc/connect';\nimport { RpcKind, RpcSystem } from './internal-types';\nimport { SpanKind } from '@opentelemetry/api';\n\nexport const isConnectError = (err: unknown): err is ConnectError => {\n const connectErr = err as ConnectError;\n\n return (\n connectErr != null &&\n typeof connectErr.message === 'string' &&\n typeof connectErr.rawMessage === 'string' &&\n Number.isInteger(connectErr.code) &&\n connectErr.metadata instanceof Headers\n );\n};\n\nexport const resolveRpcSystem = (header: Headers): RpcSystem => {\n if (header.get('Content-Type')?.startsWith('application/grpc')) {\n return 'grpc';\n }\n\n if (header.has('Connect-Protocol-Version')) {\n return 'connect_rpc';\n }\n\n return undefined;\n};\n\nexport const resolveRpcSystemName = (header: Headers) => {\n const rpcSystem = resolveRpcSystem(header);\n\n if (rpcSystem === 'connect_rpc') {\n return 'connectrpc';\n }\n\n return rpcSystem;\n};\n\nexport const errorCodeToString = (code?: number) => {\n switch (code) {\n case 0:\n return 'ok';\n case 1:\n return 'canceled';\n case 2:\n return 'unknown';\n case 3:\n return 'invalid_argument';\n case 4:\n return 'deadline_exceeded';\n case 5:\n return 'not_found';\n case 6:\n return 'already_exists';\n case 7:\n return 'permission_denied';\n case 8:\n return 'resource_exhausted';\n case 9:\n return 'failed_precondition';\n case 10:\n return 'aborted';\n case 11:\n return 'out_of_range';\n case 12:\n return 'unimplemented';\n case 13:\n return 'internal';\n case 14:\n return 'unavailable';\n case 15:\n return 'data_loss';\n case 16:\n return 'unauthenticated';\n default:\n return 'unknown';\n }\n};\n\nexport const rpcKindToSpanKind = (kind: RpcKind) => {\n switch (kind) {\n case 'client':\n return SpanKind.CLIENT;\n case 'server':\n return SpanKind.SERVER;\n default:\n return SpanKind.INTERNAL;\n }\n};\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@uphold/opentelemetry-instrumentation-connect-node",
3
- "version": "0.2.1",
3
+ "version": "1.0.0",
4
4
  "description": "OpenTelemetry instrumentation for `@connectrpc/connect-node` RPC client and server",
5
5
  "main": "dist/index.js",
6
6
  "files": [
@@ -43,7 +43,7 @@
43
43
  },
44
44
  "dependencies": {
45
45
  "@opentelemetry/instrumentation": "^0.211.0",
46
- "@opentelemetry/semantic-conventions": "~1.29.0",
46
+ "@opentelemetry/semantic-conventions": "~1.40.0",
47
47
  "lodash": "^4.17.23"
48
48
  },
49
49
  "peerDependencies": {