{"version":3,"file":"undici.js","sourceRoot":"","sources":["../../src/undici.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\nimport * as diagch from 'diagnostics_channel';\nimport { URL } from 'url';\n\nimport {\n  InstrumentationBase,\n  safeExecuteInTheMiddle,\n} from '@opentelemetry/instrumentation';\nimport {\n  Attributes,\n  context,\n  Histogram,\n  HrTime,\n  INVALID_SPAN_CONTEXT,\n  propagation,\n  Span,\n  SpanKind,\n  SpanStatusCode,\n  trace,\n  ValueType,\n} from '@opentelemetry/api';\nimport {\n  hrTime,\n  hrTimeDuration,\n  hrTimeToMilliseconds,\n} from '@opentelemetry/core';\nimport {\n  ATTR_ERROR_TYPE,\n  ATTR_HTTP_REQUEST_METHOD,\n  ATTR_HTTP_REQUEST_METHOD_ORIGINAL,\n  ATTR_HTTP_RESPONSE_STATUS_CODE,\n  ATTR_NETWORK_PEER_ADDRESS,\n  ATTR_NETWORK_PEER_PORT,\n  ATTR_SERVER_ADDRESS,\n  ATTR_SERVER_PORT,\n  ATTR_URL_FULL,\n  ATTR_URL_PATH,\n  ATTR_URL_QUERY,\n  ATTR_URL_SCHEME,\n  ATTR_USER_AGENT_ORIGINAL,\n  METRIC_HTTP_CLIENT_REQUEST_DURATION,\n} from '@opentelemetry/semantic-conventions';\n\n/** @knipignore */\nimport { PACKAGE_NAME, PACKAGE_VERSION } from './version';\n\nimport {\n  ListenerRecord,\n  RequestHeadersMessage,\n  RequestMessage,\n  RequestTrailersMessage,\n  ResponseHeadersMessage,\n} from './internal-types';\nimport { UndiciInstrumentationConfig, UndiciRequest } from './types';\n\ninterface InstrumentationRecord {\n  span: Span;\n  attributes: Attributes;\n  startTime: HrTime;\n}\n\n// A combination of https://github.com/elastic/apm-agent-nodejs and\n// https://github.com/gadget-inc/opentelemetry-instrumentations/blob/main/packages/opentelemetry-instrumentation-undici/src/index.ts\nexport class UndiciInstrumentation extends InstrumentationBase<UndiciInstrumentationConfig> {\n  // Keep ref to avoid https://github.com/nodejs/node/issues/42170 bug and for\n  // unsubscribing.\n  declare private _channelSubs: Array<ListenerRecord>;\n  private _recordFromReq = new WeakMap<UndiciRequest, InstrumentationRecord>();\n\n  declare private _httpClientDurationHistogram: Histogram;\n\n  constructor(config: UndiciInstrumentationConfig = {}) {\n    super(PACKAGE_NAME, PACKAGE_VERSION, config);\n  }\n\n  // No need to instrument files/modules\n  protected override init() {\n    return undefined;\n  }\n\n  override disable(): void {\n    super.disable();\n    this._channelSubs.forEach(sub => sub.unsubscribe());\n    this._channelSubs.length = 0;\n  }\n\n  override enable(): void {\n    // \"enabled\" handling is currently a bit messy with InstrumentationBase.\n    // If constructed with `{enabled: false}`, this `.enable()` is still called,\n    // and `this.getConfig().enabled !== this.isEnabled()`, creating confusion.\n    //\n    // For now, this class will setup for instrumenting if `.enable()` is\n    // called, but use `this.getConfig().enabled` to determine if\n    // instrumentation should be generated. This covers the more likely common\n    // case of config being given a construction time, rather than later via\n    // `instance.enable()`, `.disable()`, or `.setConfig()` calls.\n    super.enable();\n\n    // This method is called by the super-class constructor before ours is\n    // called. So we need to ensure the property is initalized.\n    this._channelSubs = this._channelSubs || [];\n\n    // Avoid to duplicate subscriptions\n    if (this._channelSubs.length > 0) {\n      return;\n    }\n\n    this.subscribeToChannel(\n      'undici:request:create',\n      this.onRequestCreated.bind(this)\n    );\n    this.subscribeToChannel(\n      'undici:client:sendHeaders',\n      this.onRequestHeaders.bind(this)\n    );\n    this.subscribeToChannel(\n      'undici:request:headers',\n      this.onResponseHeaders.bind(this)\n    );\n    this.subscribeToChannel('undici:request:trailers', this.onDone.bind(this));\n    this.subscribeToChannel('undici:request:error', this.onError.bind(this));\n  }\n\n  protected override _updateMetricInstruments() {\n    this._httpClientDurationHistogram = this.meter.createHistogram(\n      METRIC_HTTP_CLIENT_REQUEST_DURATION,\n      {\n        description: 'Measures the duration of outbound HTTP requests.',\n        unit: 's',\n        valueType: ValueType.DOUBLE,\n        advice: {\n          explicitBucketBoundaries: [\n            0.005, 0.01, 0.025, 0.05, 0.075, 0.1, 0.25, 0.5, 0.75, 1, 2.5, 5,\n            7.5, 10,\n          ],\n        },\n      }\n    );\n  }\n\n  private subscribeToChannel(\n    diagnosticChannel: string,\n    onMessage: (message: any, name: string | symbol) => void\n  ) {\n    // `diagnostics_channel` had a ref counting bug until v18.19.0.\n    // https://github.com/nodejs/node/pull/47520\n    const [major, minor] = process.version\n      .replace('v', '')\n      .split('.')\n      .map(n => Number(n));\n    const useNewSubscribe = major > 18 || (major === 18 && minor >= 19);\n\n    let unsubscribe: () => void;\n    if (useNewSubscribe) {\n      diagch.subscribe?.(diagnosticChannel, onMessage);\n      unsubscribe = () => diagch.unsubscribe?.(diagnosticChannel, onMessage);\n    } else {\n      const channel = diagch.channel(diagnosticChannel);\n      channel.subscribe(onMessage);\n      unsubscribe = () => channel.unsubscribe(onMessage);\n    }\n\n    this._channelSubs.push({\n      name: diagnosticChannel,\n      unsubscribe,\n    });\n  }\n\n  private parseRequestHeaders(request: UndiciRequest) {\n    const result = new Map<string, string | string[]>();\n\n    if (Array.isArray(request.headers)) {\n      // headers are an array [k1, v2, k2, v2] (undici v6+)\n      // values could be string or a string[] for multiple values\n      for (let i = 0; i < request.headers.length; i += 2) {\n        const key = request.headers[i];\n        const value = request.headers[i + 1];\n\n        // Key should always be a string, but the types don't know that, and let's be safe\n        if (typeof key === 'string') {\n          result.set(key.toLowerCase(), value);\n        }\n      }\n    } else if (typeof request.headers === 'string') {\n      // headers are a raw string (undici v5)\n      // headers could be repeated in several lines for multiple values\n      const headers = request.headers.split('\\r\\n');\n      for (const line of headers) {\n        if (!line) {\n          continue;\n        }\n        const colonIndex = line.indexOf(':');\n        if (colonIndex === -1) {\n          // Invalid header? Probably this can't happen, but again let's be safe.\n          continue;\n        }\n        const key = line.substring(0, colonIndex).toLowerCase();\n        const value = line.substring(colonIndex + 1).trim();\n        const allValues = result.get(key);\n\n        if (allValues && Array.isArray(allValues)) {\n          allValues.push(value);\n        } else if (allValues) {\n          result.set(key, [allValues, value]);\n        } else {\n          result.set(key, value);\n        }\n      }\n    }\n    return result;\n  }\n\n  // This is the 1st message we receive for each request (fired after request creation). Here we will\n  // create the span and populate some atttributes, then link the span to the request for further\n  // span processing\n  private onRequestCreated({ request }: RequestMessage): void {\n    // Ignore if:\n    // - instrumentation is disabled\n    // - ignored by config\n    // - method is 'CONNECT'\n    const config = this.getConfig();\n    const enabled = config.enabled !== false;\n    const shouldIgnoreReq = safeExecuteInTheMiddle(\n      () =>\n        !enabled ||\n        request.method === 'CONNECT' ||\n        config.ignoreRequestHook?.(request),\n      e => e && this._diag.error('caught ignoreRequestHook error: ', e),\n      true\n    );\n\n    if (shouldIgnoreReq) {\n      return;\n    }\n\n    const startTime = hrTime();\n    let requestUrl;\n    try {\n      requestUrl = new URL(request.path, request.origin);\n    } catch (err) {\n      this._diag.warn('could not determine url.full:', err);\n      // Skip instrumenting this request.\n      return;\n    }\n    const urlScheme = requestUrl.protocol.replace(':', '');\n    const requestMethod = this.getRequestMethod(request.method);\n    const attributes: Attributes = {\n      [ATTR_HTTP_REQUEST_METHOD]: requestMethod,\n      [ATTR_HTTP_REQUEST_METHOD_ORIGINAL]: request.method,\n      [ATTR_URL_FULL]: requestUrl.toString(),\n      [ATTR_URL_PATH]: requestUrl.pathname,\n      [ATTR_URL_QUERY]: requestUrl.search,\n      [ATTR_URL_SCHEME]: urlScheme,\n    };\n\n    const schemePorts: Record<string, string> = { https: '443', http: '80' };\n    const serverAddress = requestUrl.hostname;\n    const serverPort = requestUrl.port || schemePorts[urlScheme];\n\n    attributes[ATTR_SERVER_ADDRESS] = serverAddress;\n    if (serverPort && !isNaN(Number(serverPort))) {\n      attributes[ATTR_SERVER_PORT] = Number(serverPort);\n    }\n\n    // Get user agent from headers\n    const headersMap = this.parseRequestHeaders(request);\n    const userAgentValues = headersMap.get('user-agent');\n\n    if (userAgentValues) {\n      // NOTE: having multiple user agents is not expected so\n      // we're going to take last one like `curl` does\n      // ref: https://curl.se/docs/manpage.html#-A\n      const userAgent = Array.isArray(userAgentValues)\n        ? userAgentValues[userAgentValues.length - 1]\n        : userAgentValues;\n      attributes[ATTR_USER_AGENT_ORIGINAL] = userAgent;\n    }\n\n    // Get attributes from the hook if present\n    const hookAttributes = safeExecuteInTheMiddle(\n      () => config.startSpanHook?.(request),\n      e => e && this._diag.error('caught startSpanHook error: ', e),\n      true\n    );\n    if (hookAttributes) {\n      Object.entries(hookAttributes).forEach(([key, val]) => {\n        attributes[key] = val;\n      });\n    }\n\n    // Check if parent span is required via config and:\n    // - if a parent is required but not present, we use a `NoopSpan` to still\n    //   propagate context without recording it.\n    // - create a span otherwise\n    const activeCtx = context.active();\n    const currentSpan = trace.getSpan(activeCtx);\n    let span: Span;\n\n    if (\n      config.requireParentforSpans &&\n      (!currentSpan || !trace.isSpanContextValid(currentSpan.spanContext()))\n    ) {\n      span = trace.wrapSpanContext(INVALID_SPAN_CONTEXT);\n    } else {\n      span = this.tracer.startSpan(\n        requestMethod === '_OTHER' ? 'HTTP' : requestMethod,\n        {\n          kind: SpanKind.CLIENT,\n          attributes: attributes,\n        },\n        activeCtx\n      );\n    }\n\n    // Execute the request hook if defined\n    safeExecuteInTheMiddle(\n      () => config.requestHook?.(span, request),\n      e => e && this._diag.error('caught requestHook error: ', e),\n      true\n    );\n\n    // Context propagation goes last so no hook can tamper\n    // the propagation headers\n    const requestContext = trace.setSpan(context.active(), span);\n    const addedHeaders: Record<string, string> = {};\n    propagation.inject(requestContext, addedHeaders);\n\n    const headerEntries = Object.entries(addedHeaders);\n\n    for (let i = 0; i < headerEntries.length; i++) {\n      const [k, v] = headerEntries[i];\n\n      if (typeof request.addHeader === 'function') {\n        request.addHeader(k, v);\n      } else if (typeof request.headers === 'string') {\n        request.headers += `${k}: ${v}\\r\\n`;\n      } else if (Array.isArray(request.headers)) {\n        // undici@6.11.0 accidentally, briefly removed `request.addHeader()`.\n        request.headers.push(k, v);\n      }\n    }\n    this._recordFromReq.set(request, { span, attributes, startTime });\n  }\n\n  // This is the 2nd message we receive for each request. It is fired when connection with\n  // the remote is established and about to send the first byte. Here we do have info about the\n  // remote address and port so we can populate some `network.*` attributes into the span\n  private onRequestHeaders({ request, socket }: RequestHeadersMessage): void {\n    const record = this._recordFromReq.get(request as UndiciRequest);\n\n    if (!record) {\n      return;\n    }\n\n    const config = this.getConfig();\n    const { span } = record;\n    const { remoteAddress, remotePort } = socket;\n    const spanAttributes: Attributes = {\n      [ATTR_NETWORK_PEER_ADDRESS]: remoteAddress,\n      [ATTR_NETWORK_PEER_PORT]: remotePort,\n    };\n\n    // After hooks have been processed (which may modify request headers)\n    // we can collect the headers based on the configuration\n    if (config.headersToSpanAttributes?.requestHeaders) {\n      const headersToAttribs = new Set(\n        config.headersToSpanAttributes.requestHeaders.map(n => n.toLowerCase())\n      );\n      const headersMap = this.parseRequestHeaders(request);\n\n      for (const [name, value] of headersMap.entries()) {\n        if (headersToAttribs.has(name)) {\n          const attrValue = Array.isArray(value) ? value : [value];\n          spanAttributes[`http.request.header.${name}`] = attrValue;\n        }\n      }\n    }\n\n    span.setAttributes(spanAttributes);\n  }\n\n  // This is the 3rd message we get for each request and it's fired when the server\n  // headers are received, body may not be accessible yet.\n  // From the response headers we can set the status and content length\n  private onResponseHeaders({\n    request,\n    response,\n  }: ResponseHeadersMessage): void {\n    const record = this._recordFromReq.get(request);\n\n    if (!record) {\n      return;\n    }\n\n    const { span, attributes } = record;\n    const spanAttributes: Attributes = {\n      [ATTR_HTTP_RESPONSE_STATUS_CODE]: response.statusCode,\n    };\n\n    const config = this.getConfig();\n\n    // Execute the response hook if defined\n    safeExecuteInTheMiddle(\n      () => config.responseHook?.(span, { request, response }),\n      e => e && this._diag.error('caught responseHook error: ', e),\n      true\n    );\n\n    if (config.headersToSpanAttributes?.responseHeaders) {\n      const headersToAttribs = new Set();\n      config.headersToSpanAttributes?.responseHeaders.forEach(name =>\n        headersToAttribs.add(name.toLowerCase())\n      );\n\n      for (let idx = 0; idx < response.headers.length; idx = idx + 2) {\n        const name = response.headers[idx].toString().toLowerCase();\n        const value = response.headers[idx + 1];\n\n        if (headersToAttribs.has(name)) {\n          const attrName = `http.response.header.${name}`;\n          if (!Object.hasOwn(spanAttributes, attrName)) {\n            spanAttributes[attrName] = [value.toString()];\n          } else {\n            (spanAttributes[attrName] as string[]).push(value.toString());\n          }\n        }\n      }\n    }\n\n    span.setAttributes(spanAttributes);\n    span.setStatus({\n      code:\n        response.statusCode >= 400\n          ? SpanStatusCode.ERROR\n          : SpanStatusCode.UNSET,\n    });\n    record.attributes = Object.assign(attributes, spanAttributes);\n  }\n\n  // This is the last event we receive if the request went without any errors\n  private onDone({ request }: RequestTrailersMessage): void {\n    const record = this._recordFromReq.get(request);\n\n    if (!record) {\n      return;\n    }\n    const { span, attributes, startTime } = record;\n\n    // End the span\n    span.end();\n    this._recordFromReq.delete(request);\n\n    // Record metrics\n    this.recordRequestDuration(attributes, startTime);\n  }\n\n  // This is the event we get when something is wrong in the request like\n  // - invalid options when calling `fetch` global API or any undici method for request\n  // - connectivity errors such as unreachable host\n  // - requests aborted through an `AbortController.signal`\n  // NOTE: server errors are considered valid responses and it's the lib consumer\n  // who should deal with that.\n  private onError({ request, error }: any): void {\n    const record = this._recordFromReq.get(request);\n\n    if (!record) {\n      return;\n    }\n\n    const { span, attributes, startTime } = record;\n\n    // Per OTel HTTP spec: if the request was intentionally cancelled via an\n    // AbortController signal, it SHOULD NOT be treated as an error.\n    // Span status should be left unset and error.type should not be set.\n    // https://opentelemetry.io/docs/specs/semconv/http/http-spans/#http-client\n    const isAbort =\n      error.name === 'AbortError' ||\n      (typeof DOMException !== 'undefined' &&\n        error instanceof DOMException &&\n        error.code === DOMException.ABORT_ERR);\n\n    if (isAbort) {\n      span.end();\n    } else {\n      span.recordException(error);\n      span.setStatus({\n        code: SpanStatusCode.ERROR,\n        message: error.message,\n      });\n      span.end();\n\n      attributes[ATTR_ERROR_TYPE] = error.message;\n    }\n\n    this._recordFromReq.delete(request);\n    this.recordRequestDuration(attributes, startTime);\n  }\n\n  private recordRequestDuration(attributes: Attributes, startTime: HrTime) {\n    // Time to record metrics\n    const metricsAttributes: Attributes = {};\n    // Get the attribs already in span attributes\n    const keysToCopy = [\n      ATTR_HTTP_RESPONSE_STATUS_CODE,\n      ATTR_HTTP_REQUEST_METHOD,\n      ATTR_SERVER_ADDRESS,\n      ATTR_SERVER_PORT,\n      ATTR_URL_SCHEME,\n      ATTR_ERROR_TYPE,\n    ];\n    keysToCopy.forEach(key => {\n      if (key in attributes) {\n        metricsAttributes[key] = attributes[key];\n      }\n    });\n\n    // Take the duration and record it\n    const durationSeconds =\n      hrTimeToMilliseconds(hrTimeDuration(startTime, hrTime())) / 1000;\n    this._httpClientDurationHistogram.record(\n      durationSeconds,\n      metricsAttributes\n    );\n  }\n\n  private getRequestMethod(original: string): string {\n    const knownMethods = {\n      CONNECT: true,\n      OPTIONS: true,\n      HEAD: true,\n      GET: true,\n      POST: true,\n      PUT: true,\n      PATCH: true,\n      DELETE: true,\n      TRACE: true,\n      // QUERY from https://datatracker.ietf.org/doc/draft-ietf-httpbis-safe-method-w-body/\n      QUERY: true,\n    };\n\n    if (original.toUpperCase() in knownMethods) {\n      return original.toUpperCase();\n    }\n\n    return '_OTHER';\n  }\n}\n"]}