@uphold/opentelemetry-instrumentation-connect-node 0.1.1 → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/interceptor.js +1 -1
- package/dist/interceptor.js.map +1 -1
- package/package.json +1 -1
package/dist/interceptor.js
CHANGED
|
@@ -90,7 +90,7 @@ const createEndSpanWithError = (config, kind) => {
|
|
|
90
90
|
};
|
|
91
91
|
};
|
|
92
92
|
const carrierSetterAndGetter = {
|
|
93
|
-
get: (carrier, key) => carrier.get(key)
|
|
93
|
+
get: (carrier, key) => carrier.get(key) ?? undefined,
|
|
94
94
|
keys: (carrier) => Array.from(carrier.keys()),
|
|
95
95
|
set: (carrier, key, value) => carrier.set(key, value)
|
|
96
96
|
};
|
package/dist/interceptor.js.map
CHANGED
|
@@ -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 createInterceptor = (\n config: ConnectNodeInstrumentationConfig,\n diag: DiagLogger,\n tracer: Tracer,\n kind: RpcKind\n) => {\n const startSpan = createStartSpan(config, tracer, kind);\n const endSpanWithSuccess = createEndSpanWithSuccess(config, kind);\n const endSpanWithError = createEndSpanWithError(config, kind);\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 let ctx = context.active();\n const span = startSpan(req);\n\n if (kind === 'server') {\n ctx = propagation.extract(ctx, req.header, carrierSetterAndGetter);\n } else {\n propagation.inject(ctx, req.header, carrierSetterAndGetter);\n }\n\n try {\n return await context.with(trace.setSpan(ctx, span), async () => {\n next = context.bind(ctx, next);\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"]}
|
|
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 createInterceptor = (\n config: ConnectNodeInstrumentationConfig,\n diag: DiagLogger,\n tracer: Tracer,\n kind: RpcKind\n) => {\n const startSpan = createStartSpan(config, tracer, kind);\n const endSpanWithSuccess = createEndSpanWithSuccess(config, kind);\n const endSpanWithError = createEndSpanWithError(config, kind);\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 let ctx = context.active();\n const span = startSpan(req);\n\n if (kind === 'server') {\n ctx = propagation.extract(ctx, req.header, carrierSetterAndGetter);\n } else {\n propagation.inject(ctx, req.header, carrierSetterAndGetter);\n }\n\n try {\n return await context.with(trace.setSpan(ctx, span), async () => {\n next = context.bind(ctx, next);\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"]}
|
package/package.json
CHANGED