@opentelemetry/instrumentation-http 0.201.1 → 0.203.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.
package/README.md CHANGED
@@ -82,7 +82,7 @@ See the [HTTP semconv migration plan for OpenTelemetry JS instrumentations](http
82
82
  To select which semconv version(s) is emitted from this instrumentation, use the `OTEL_SEMCONV_STABILITY_OPT_IN` environment variable.
83
83
 
84
84
  - `http`: emit the new (stable) v1.23.0+ semantics
85
- - `http/dep`: emit **both** the old v1.7.0 and the new (stable) v1.23.0+ semantics
85
+ - `http/dup`: emit **both** the old v1.7.0 and the new (stable) v1.23.0+ semantics
86
86
  - By default, if `OTEL_SEMCONV_STABILITY_OPT_IN` includes neither of the above tokens, the old v1.7.0 semconv is used.
87
87
 
88
88
  ### Attributes collected
package/build/src/http.js CHANGED
@@ -100,6 +100,7 @@ class HttpInstrumentation extends instrumentation_1.InstrumentationBase {
100
100
  }
101
101
  _getHttpInstrumentation() {
102
102
  return new instrumentation_1.InstrumentationNodeModuleDefinition('http', ['*'], (moduleExports) => {
103
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
103
104
  const isESM = moduleExports[Symbol.toStringTag] === 'Module';
104
105
  if (!this.getConfig().disableOutgoingRequestInstrumentation) {
105
106
  const patchedRequest = this._wrap(moduleExports, 'request', this._getPatchOutgoingRequestFunction('http'));
@@ -107,7 +108,9 @@ class HttpInstrumentation extends instrumentation_1.InstrumentationBase {
107
108
  if (isESM) {
108
109
  // To handle `import http from 'http'`, which returns the default
109
110
  // export, we need to set `module.default.*`.
111
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
110
112
  moduleExports.default.request = patchedRequest;
113
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
111
114
  moduleExports.default.get = patchedGet;
112
115
  }
113
116
  }
@@ -129,6 +132,7 @@ class HttpInstrumentation extends instrumentation_1.InstrumentationBase {
129
132
  }
130
133
  _getHttpsInstrumentation() {
131
134
  return new instrumentation_1.InstrumentationNodeModuleDefinition('https', ['*'], (moduleExports) => {
135
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
132
136
  const isESM = moduleExports[Symbol.toStringTag] === 'Module';
133
137
  if (!this.getConfig().disableOutgoingRequestInstrumentation) {
134
138
  const patchedRequest = this._wrap(moduleExports, 'request', this._getPatchHttpsOutgoingRequestFunction('https'));
@@ -136,7 +140,9 @@ class HttpInstrumentation extends instrumentation_1.InstrumentationBase {
136
140
  if (isESM) {
137
141
  // To handle `import https from 'https'`, which returns the default
138
142
  // export, we need to set `module.default.*`.
143
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
139
144
  moduleExports.default.request = patchedRequest;
145
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
140
146
  moduleExports.default.get = patchedGet;
141
147
  }
142
148
  }
@@ -1 +1 @@
1
- {"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/http.ts"],"names":[],"mappings":";;;AAAA;;;;;;;;;;;;;;GAcG;AACH,4CAe4B;AAC5B,8CAQ6B;AAI7B,2BAA2B;AAE3B,uCAAoC;AACpC,oEAMwC;AACxC,mCAAsC;AACtC,8EAU6C;AAC7C,mCAiBiB;AAGjB;;GAEG;AACH,MAAa,mBAAoB,SAAQ,qCAA8C;IACrF,oCAAoC;IACnB,aAAa,GAAkB,IAAI,OAAO,EAAQ,CAAC;IAC5D,cAAc,CAAC;IAMf,iBAAiB,GAAqB,kCAAgB,CAAC,GAAG,CAAC;IAEnE,YAAY,SAAoC,EAAE;QAChD,KAAK,CAAC,qCAAqC,EAAE,iBAAO,EAAE,MAAM,CAAC,CAAC;QAC9D,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAClD,IAAI,CAAC,iBAAiB,GAAG,IAAA,yCAAuB,EAC9C,MAAM,EACN,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAC1C,CAAC;IACJ,CAAC;IAEkB,wBAAwB;QACzC,IAAI,CAAC,+BAA+B,GAAG,IAAI,CAAC,KAAK,CAAC,eAAe,CAC/D,sBAAsB,EACtB;YACE,WAAW,EAAE,iDAAiD;YAC9D,IAAI,EAAE,IAAI;YACV,SAAS,EAAE,eAAS,CAAC,MAAM;SAC5B,CACF,CAAC;QACF,IAAI,CAAC,+BAA+B,GAAG,IAAI,CAAC,KAAK,CAAC,eAAe,CAC/D,sBAAsB,EACtB;YACE,WAAW,EAAE,kDAAkD;YAC/D,IAAI,EAAE,IAAI;YACV,SAAS,EAAE,eAAS,CAAC,MAAM;SAC5B,CACF,CAAC;QACF,IAAI,CAAC,kCAAkC,GAAG,IAAI,CAAC,KAAK,CAAC,eAAe,CAClE,0DAAmC,EACnC;YACE,WAAW,EAAE,mCAAmC;YAChD,IAAI,EAAE,GAAG;YACT,SAAS,EAAE,eAAS,CAAC,MAAM;YAC3B,MAAM,EAAE;gBACN,wBAAwB,EAAE;oBACxB,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC;oBAChE,GAAG,EAAE,EAAE;iBACR;aACF;SACF,CACF,CAAC;QACF,IAAI,CAAC,kCAAkC,GAAG,IAAI,CAAC,KAAK,CAAC,eAAe,CAClE,0DAAmC,EACnC;YACE,WAAW,EAAE,mCAAmC;YAChD,IAAI,EAAE,GAAG;YACT,SAAS,EAAE,eAAS,CAAC,MAAM;YAC3B,MAAM,EAAE;gBACN,wBAAwB,EAAE;oBACxB,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC;oBAChE,GAAG,EAAE,EAAE;iBACR;aACF;SACF,CACF,CAAC;IACJ,CAAC;IAEO,qBAAqB,CAC3B,UAAkB,EAClB,aAAyB,EACzB,gBAA4B;QAE5B,IAAI,IAAI,CAAC,iBAAiB,GAAG,kCAAgB,CAAC,GAAG,EAAE;YACjD,iCAAiC;YACjC,IAAI,CAAC,+BAA+B,CAAC,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;SACxE;QAED,IAAI,IAAI,CAAC,iBAAiB,GAAG,kCAAgB,CAAC,MAAM,EAAE;YACpD,mCAAmC;YACnC,IAAI,CAAC,kCAAkC,CAAC,MAAM,CAC5C,UAAU,GAAG,IAAI,EACjB,gBAAgB,CACjB,CAAC;SACH;IACH,CAAC;IAEO,qBAAqB,CAC3B,UAAkB,EAClB,aAAyB,EACzB,gBAA4B;QAE5B,IAAI,IAAI,CAAC,iBAAiB,GAAG,kCAAgB,CAAC,GAAG,EAAE;YACjD,iCAAiC;YACjC,IAAI,CAAC,+BAA+B,CAAC,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;SACxE;QAED,IAAI,IAAI,CAAC,iBAAiB,GAAG,kCAAgB,CAAC,MAAM,EAAE;YACpD,mCAAmC;YACnC,IAAI,CAAC,kCAAkC,CAAC,MAAM,CAC5C,UAAU,GAAG,IAAI,EACjB,gBAAgB,CACjB,CAAC;SACH;IACH,CAAC;IAEQ,SAAS,CAAC,SAAoC,EAAE;QACvD,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QACxB,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,oBAAoB,EAAE,CAAC;IACpD,CAAC;IAED,IAAI;QAIF,OAAO,CAAC,IAAI,CAAC,wBAAwB,EAAE,EAAE,IAAI,CAAC,uBAAuB,EAAE,CAAC,CAAC;IAC3E,CAAC;IAEO,uBAAuB;QAC7B,OAAO,IAAI,qDAAmC,CAC5C,MAAM,EACN,CAAC,GAAG,CAAC,EACL,CAAC,aAAmB,EAAQ,EAAE;YAC5B,MAAM,KAAK,GAAI,aAAqB,CAAC,MAAM,CAAC,WAAW,CAAC,KAAK,QAAQ,CAAC;YACtE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,qCAAqC,EAAE;gBAC3D,MAAM,cAAc,GAAG,IAAI,CAAC,KAAK,CAC/B,aAAa,EACb,SAAS,EACT,IAAI,CAAC,gCAAgC,CAAC,MAAM,CAAC,CACP,CAAC;gBACzC,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAC3B,aAAa,EACb,KAAK,EACL,IAAI,CAAC,4BAA4B,CAAC,cAAc,CAAC,CAClD,CAAC;gBACF,IAAI,KAAK,EAAE;oBACT,iEAAiE;oBACjE,6CAA6C;oBAC5C,aAAqB,CAAC,OAAO,CAAC,OAAO,GAAG,cAAc,CAAC;oBACvD,aAAqB,CAAC,OAAO,CAAC,GAAG,GAAG,UAAU,CAAC;iBACjD;aACF;YACD,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,qCAAqC,EAAE;gBAC3D,IAAI,CAAC,KAAK,CACR,aAAa,CAAC,MAAM,CAAC,SAAS,EAC9B,MAAM,EACN,IAAI,CAAC,gCAAgC,CAAC,MAAM,CAAC,CAC9C,CAAC;aACH;YACD,OAAO,aAAa,CAAC;QACvB,CAAC,EACD,CAAC,aAAmB,EAAE,EAAE;YACtB,IAAI,aAAa,KAAK,SAAS;gBAAE,OAAO;YAExC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,qCAAqC,EAAE;gBAC3D,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC;gBACvC,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC;aACpC;YACD,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,qCAAqC,EAAE;gBAC3D,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;aACtD;QACH,CAAC,CACF,CAAC;IACJ,CAAC;IAEO,wBAAwB;QAC9B,OAAO,IAAI,qDAAmC,CAC5C,OAAO,EACP,CAAC,GAAG,CAAC,EACL,CAAC,aAAoB,EAAS,EAAE;YAC9B,MAAM,KAAK,GAAI,aAAqB,CAAC,MAAM,CAAC,WAAW,CAAC,KAAK,QAAQ,CAAC;YACtE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,qCAAqC,EAAE;gBAC3D,MAAM,cAAc,GAAG,IAAI,CAAC,KAAK,CAC/B,aAAa,EACb,SAAS,EACT,IAAI,CAAC,qCAAqC,CAAC,OAAO,CAAC,CACb,CAAC;gBACzC,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAC3B,aAAa,EACb,KAAK,EACL,IAAI,CAAC,iCAAiC,CAAC,cAAc,CAAC,CACvD,CAAC;gBACF,IAAI,KAAK,EAAE;oBACT,mEAAmE;oBACnE,6CAA6C;oBAC5C,aAAqB,CAAC,OAAO,CAAC,OAAO,GAAG,cAAc,CAAC;oBACvD,aAAqB,CAAC,OAAO,CAAC,GAAG,GAAG,UAAU,CAAC;iBACjD;aACF;YACD,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,qCAAqC,EAAE;gBAC3D,IAAI,CAAC,KAAK,CACR,aAAa,CAAC,MAAM,CAAC,SAAS,EAC9B,MAAM,EACN,IAAI,CAAC,gCAAgC,CAAC,OAAO,CAAC,CAC/C,CAAC;aACH;YACD,OAAO,aAAa,CAAC;QACvB,CAAC,EACD,CAAC,aAAoB,EAAE,EAAE;YACvB,IAAI,aAAa,KAAK,SAAS;gBAAE,OAAO;YAExC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,qCAAqC,EAAE;gBAC3D,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC;gBACvC,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC;aACpC;YACD,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,qCAAqC,EAAE;gBAC3D,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;aACtD;QACH,CAAC,CACF,CAAC;IACJ,CAAC;IAED;;OAEG;IACK,gCAAgC,CAAC,SAA2B;QAClE,OAAO,CACL,QAAwD,EACS,EAAE;YACnE,OAAO,IAAI,CAAC,wBAAwB,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;QAC5D,CAAC,CAAC;IACJ,CAAC;IAED;;;OAGG;IACK,gCAAgC,CAAC,SAA2B;QAClE,OAAO,CAAC,QAAkC,EAA4B,EAAE;YACtE,OAAO,IAAI,CAAC,wBAAwB,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;QAC5D,CAAC,CAAC;IACJ,CAAC;IAEO,4BAA4B,CAClC,aAGuB;QAEvB,OAAO,CAAC,SAAmC,EAA4B,EAAE;YACvE,iEAAiE;YACjE,kEAAkE;YAClE,yEAAyE;YACzE,kEAAkE;YAClE,uEAAuE;YACvE,sEAAsE;YACtE,sEAAsE;YACtE,iCAAiC;YACjC,mFAAmF;YACnF,iHAAiH;YACjH,OAAO,SAAS,kBAAkB,CAEhC,OAAU,EAAE,GAAG,IAAqB;gBACpC,MAAM,GAAG,GAAG,aAAa,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,CAAC;gBAC5C,GAAG,CAAC,GAAG,EAAE,CAAC;gBACV,OAAO,GAAG,CAAC;YACb,CAAC,CAAC;QACJ,CAAC,CAAC;IACJ,CAAC;IAED,sCAAsC;IAC9B,qCAAqC,CAAC,SAA2B;QACvE,OAAO,CAAC,QAAkC,EAA4B,EAAE;YACtE,MAAM,eAAe,GAAG,IAAI,CAAC;YAC7B,OAAO,SAAS,oBAAoB;YAClC,sEAAsE;YACtE,OAA4C,EAC5C,GAAG,IAAqB;gBAExB,wDAAwD;gBACxD,IACE,SAAS,KAAK,OAAO;oBACrB,OAAO,OAAO,KAAK,QAAQ;oBAC3B,OAAO,EAAE,WAAW,EAAE,IAAI,KAAK,KAAK,EACpC;oBACA,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;oBACrC,eAAe,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC;iBAC7C;gBACD,OAAO,eAAe,CAAC,gCAAgC,CAAC,SAAS,CAAC,CAChE,QAAQ,CACT,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,CAAC;YACtB,CAAC,CAAC;QACJ,CAAC,CAAC;IACJ,CAAC;IAEO,kBAAkB,CAAC,OAA6B;QACtD,OAAO,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,QAAQ,CAAC;QAChD,OAAO,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,GAAG,CAAC;IACrC,CAAC;IAED,0CAA0C;IAClC,iCAAiC,CACvC,aAIuB;QAEvB,OAAO,CAAC,QAAkC,EAA4B,EAAE;YACtE,MAAM,eAAe,GAAG,IAAI,CAAC;YAC7B,OAAO,SAAS,oBAAoB;YAClC,sEAAsE;YACtE,OAA4C,EAC5C,GAAG,IAAqB;gBAExB,OAAO,eAAe,CAAC,4BAA4B,CAAC,aAAa,CAAC,CAChE,QAAQ,CACT,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,CAAC;YACtB,CAAC,CAAC;QACJ,CAAC,CAAC;IACJ,CAAC;IAED;;;;;;;;OAQG;IACK,mBAAmB,CACzB,OAA2B,EAC3B,IAAU,EACV,SAAiB,EACjB,mBAA+B,EAC/B,sBAAkC;QAElC,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC,WAAW,EAAE;YAChC,IAAI,CAAC,gBAAgB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;SACtC;QAED;;WAEG;QACH,IAAI,gBAAgB,GAAG,KAAK,CAAC;QAE7B;;;;WAIG;QACH,OAAO,CAAC,eAAe,CACrB,UAAU,EACV,CAAC,QAAsD,EAAE,EAAE;YACzD,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC;YAClD,IAAI,OAAO,CAAC,aAAa,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE;gBAC1C,QAAQ,CAAC,MAAM,EAAE,CAAC;aACnB;YACD,MAAM,kBAAkB,GAAG,IAAA,8CAAsC,EAC/D,QAAQ,EACR,IAAI,CAAC,iBAAiB,CACvB,CAAC;YACF,IAAI,CAAC,aAAa,CAAC,kBAAkB,CAAC,CAAC;YACvC,mBAAmB,GAAG,MAAM,CAAC,MAAM,CACjC,mBAAmB,EACnB,IAAA,oDAA4C,EAAC,kBAAkB,CAAC,CACjE,CAAC;YACF,sBAAsB,GAAG,MAAM,CAAC,MAAM,CACpC,sBAAsB,EACtB,IAAA,0DAAkD,EAAC,kBAAkB,CAAC,CACvE,CAAC;YAEF,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC,YAAY,EAAE;gBACjC,IAAI,CAAC,iBAAiB,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;aACxC;YAED,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,qBAAqB,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,CAC9D,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,CAC1B,CAAC;YACF,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,sBAAsB,CAC/C,IAAI,EACJ,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,CACnC,CAAC;YAEF,aAAO,CAAC,IAAI,CAAC,aAAO,CAAC,MAAM,EAAE,EAAE,QAAQ,CAAC,CAAC;YAEzC,MAAM,UAAU,GAAG,GAAG,EAAE;gBACtB,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC;gBAC7C,IAAI,gBAAgB,EAAE;oBACpB,OAAO;iBACR;gBACD,gBAAgB,GAAG,IAAI,CAAC;gBACxB,IAAI,MAAkB,CAAC;gBAEvB,IAAI,QAAQ,CAAC,OAAO,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE;oBAC1C,MAAM,GAAG,EAAE,IAAI,EAAE,oBAAc,CAAC,KAAK,EAAE,CAAC;iBACzC;qBAAM;oBACL,uCAAuC;oBACvC,MAAM,GAAG;wBACP,IAAI,EAAE,IAAA,2BAAmB,EAAC,cAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,UAAU,CAAC;qBAChE,CAAC;iBACH;gBAED,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;gBAEvB,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC,2BAA2B,EAAE;oBAChD,IAAA,wCAAsB,EACpB,GAAG,EAAE,CACH,IAAI,CAAC,SAAS,EAAE,CAAC,2BAA4B,CAC3C,IAAI,EACJ,OAAO,EACP,QAAQ,CACT,EACH,GAAG,EAAE,GAAE,CAAC,EACR,IAAI,CACL,CAAC;iBACH;gBAED,IAAI,CAAC,cAAc,CACjB,IAAI,EACJ,cAAQ,CAAC,MAAM,EACf,SAAS,EACT,mBAAmB,EACnB,sBAAsB,CACvB,CAAC;YACJ,CAAC,CAAC;YAEF,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;YAC/B,QAAQ,CAAC,EAAE,CAAC,qBAAY,EAAE,CAAC,KAAU,EAAE,EAAE;gBACvC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,4BAA4B,EAAE,KAAK,CAAC,CAAC;gBACtD,IAAI,gBAAgB,EAAE;oBACpB,OAAO;iBACR;gBACD,gBAAgB,GAAG,IAAI,CAAC;gBACxB,IAAA,wBAAgB,EAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,iBAAiB,CAAC,CAAC;gBACtD,IAAI,CAAC,SAAS,CAAC;oBACb,IAAI,EAAE,oBAAc,CAAC,KAAK;oBAC1B,OAAO,EAAE,KAAK,CAAC,OAAO;iBACvB,CAAC,CAAC;gBACH,IAAI,CAAC,cAAc,CACjB,IAAI,EACJ,cAAQ,CAAC,MAAM,EACf,SAAS,EACT,mBAAmB,EACnB,sBAAsB,CACvB,CAAC;YACJ,CAAC,CAAC,CAAC;QACL,CAAC,CACF,CAAC;QACF,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;YACvB,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,oCAAoC,CAAC,CAAC;YACvD,IAAI,OAAO,CAAC,OAAO,IAAI,gBAAgB,EAAE;gBACvC,OAAO;aACR;YACD,gBAAgB,GAAG,IAAI,CAAC;YACxB,IAAI,CAAC,cAAc,CACjB,IAAI,EACJ,cAAQ,CAAC,MAAM,EACf,SAAS,EACT,mBAAmB,EACnB,sBAAsB,CACvB,CAAC;QACJ,CAAC,CAAC,CAAC;QACH,OAAO,CAAC,EAAE,CAAC,qBAAY,EAAE,CAAC,KAAU,EAAE,EAAE;YACtC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,oCAAoC,EAAE,KAAK,CAAC,CAAC;YAC9D,IAAI,gBAAgB,EAAE;gBACpB,OAAO;aACR;YACD,gBAAgB,GAAG,IAAI,CAAC;YACxB,IAAA,wBAAgB,EAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,iBAAiB,CAAC,CAAC;YAEtD,IAAI,CAAC,cAAc,CACjB,IAAI,EACJ,cAAQ,CAAC,MAAM,EACf,SAAS,EACT,mBAAmB,EACnB,sBAAsB,CACvB,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAC;QACtD,OAAO,OAAO,CAAC;IACjB,CAAC;IAEO,wBAAwB,CAC9B,SAA2B,EAC3B,QAAwD;QAExD,MAAM,eAAe,GAAG,IAAI,CAAC;QAC7B,OAAO,SAAS,eAAe,CAE7B,KAAa,EACb,GAAG,IAAe;YAElB,6BAA6B;YAC7B,IAAI,KAAK,KAAK,SAAS,EAAE;gBACvB,OAAO,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC;aAC/C;YAED,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAyB,CAAC;YAChD,MAAM,QAAQ,GAAG,IAAI,CAAC,CAAC,CAA6C,CAAC;YACrE,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,KAAK,CAAC;YAEvC,eAAe,CAAC,KAAK,CAAC,KAAK,CACzB,GAAG,SAAS,kCAAkC,CAC/C,CAAC;YAEF,IACE,IAAA,wCAAsB,EACpB,GAAG,EAAE,CACH,eAAe,CAAC,SAAS,EAAE,CAAC,yBAAyB,EAAE,CAAC,OAAO,CAAC,EAClE,CAAC,CAAU,EAAE,EAAE;gBACb,IAAI,CAAC,IAAI,IAAI,EAAE;oBACb,eAAe,CAAC,KAAK,CAAC,KAAK,CACzB,0CAA0C,EAC1C,CAAC,CACF,CAAC;iBACH;YACH,CAAC,EACD,IAAI,CACL,EACD;gBACA,OAAO,aAAO,CAAC,IAAI,CAAC,IAAA,sBAAe,EAAC,aAAO,CAAC,MAAM,EAAE,CAAC,EAAE,GAAG,EAAE;oBAC1D,aAAO,CAAC,IAAI,CAAC,aAAO,CAAC,MAAM,EAAE,EAAE,OAAO,CAAC,CAAC;oBACxC,aAAO,CAAC,IAAI,CAAC,aAAO,CAAC,MAAM,EAAE,EAAE,QAAQ,CAAC,CAAC;oBACzC,OAAO,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC;gBAChD,CAAC,CAAC,CAAC;aACJ;YAED,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;YAEhC,MAAM,cAAc,GAAG,IAAA,oCAA4B,EACjD,OAAO,EACP;gBACE,SAAS,EAAE,SAAS;gBACpB,UAAU,EAAE,eAAe,CAAC,SAAS,EAAE,CAAC,UAAU;gBAClD,cAAc,EAAE,eAAe,CAAC,kBAAkB,CAChD,OAAO,EACP,eAAe,CAAC,SAAS,EAAE,CAAC,qBAAqB,CAClD;gBACD,gBAAgB,EAAE,eAAe,CAAC,iBAAiB;gBACnD,8BAA8B,EAC5B,eAAe,CAAC,SAAS,EAAE,CAAC,8BAA8B,IAAI,KAAK;aACtE,EACD,eAAe,CAAC,KAAK,CACtB,CAAC;YAEF,MAAM,WAAW,GAAgB;gBAC/B,IAAI,EAAE,cAAQ,CAAC,MAAM;gBACrB,UAAU,EAAE,cAAc;aAC3B,CAAC;YAEF,MAAM,SAAS,GAAG,IAAA,aAAM,GAAE,CAAC;YAC3B,MAAM,mBAAmB,GACvB,IAAA,0CAAkC,EAAC,cAAc,CAAC,CAAC;YAErD,kEAAkE;YAClE,MAAM,sBAAsB,GAAe;gBACzC,CAAC,+CAAwB,CAAC,EAAE,cAAc,CAAC,+CAAwB,CAAC;gBACpE,CAAC,sCAAe,CAAC,EAAE,cAAc,CAAC,sCAAe,CAAC;aACnD,CAAC;YAEF,uEAAuE;YACvE,IAAI,cAAc,CAAC,oDAA6B,CAAC,EAAE;gBACjD,sBAAsB,CAAC,oDAA6B,CAAC;oBACnD,cAAc,CAAC,oDAA6B,CAAC,CAAC;aACjD;YAED,MAAM,GAAG,GAAG,iBAAW,CAAC,OAAO,CAAC,kBAAY,EAAE,OAAO,CAAC,CAAC;YACvD,MAAM,IAAI,GAAG,eAAe,CAAC,cAAc,CAAC,MAAM,EAAE,WAAW,EAAE,GAAG,CAAC,CAAC;YACtE,MAAM,WAAW,GAAgB;gBAC/B,IAAI,EAAE,cAAO,CAAC,IAAI;gBAClB,IAAI;aACL,CAAC;YAEF,OAAO,aAAO,CAAC,IAAI,CACjB,IAAA,qBAAc,EAAC,WAAK,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,WAAW,CAAC,EACrD,GAAG,EAAE;gBACH,aAAO,CAAC,IAAI,CAAC,aAAO,CAAC,MAAM,EAAE,EAAE,OAAO,CAAC,CAAC;gBACxC,aAAO,CAAC,IAAI,CAAC,aAAO,CAAC,MAAM,EAAE,EAAE,QAAQ,CAAC,CAAC;gBAEzC,IAAI,eAAe,CAAC,SAAS,EAAE,CAAC,WAAW,EAAE;oBAC3C,eAAe,CAAC,gBAAgB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;iBACjD;gBACD,IAAI,eAAe,CAAC,SAAS,EAAE,CAAC,YAAY,EAAE;oBAC5C,eAAe,CAAC,iBAAiB,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;iBACnD;gBAED,eAAe,CAAC,cAAc,CAAC,MAAM,CAAC,qBAAqB,CACzD,IAAI,EACJ,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAClC,CAAC;gBAEF,yEAAyE;gBACzE,IAAI,QAAQ,GAAG,KAAK,CAAC;gBACrB,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;oBACxB,IAAI,QAAQ,EAAE;wBACZ,OAAO;qBACR;oBACD,eAAe,CAAC,uBAAuB,CACrC,OAAO,EACP,QAAQ,EACR,IAAI,EACJ,mBAAmB,EACnB,sBAAsB,EACtB,SAAS,CACV,CAAC;gBACJ,CAAC,CAAC,CAAC;gBACH,QAAQ,CAAC,EAAE,CAAC,qBAAY,EAAE,CAAC,GAAQ,EAAE,EAAE;oBACrC,QAAQ,GAAG,IAAI,CAAC;oBAChB,eAAe,CAAC,sBAAsB,CACpC,IAAI,EACJ,mBAAmB,EACnB,sBAAsB,EACtB,SAAS,EACT,GAAG,CACJ,CAAC;gBACJ,CAAC,CAAC,CAAC;gBAEH,OAAO,IAAA,wCAAsB,EAC3B,GAAG,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,CAAC,EAC5C,KAAK,CAAC,EAAE;oBACN,IAAI,KAAK,EAAE;wBACT,IAAA,wBAAgB,EACd,IAAI,EACJ,KAAK,EACL,eAAe,CAAC,iBAAiB,CAClC,CAAC;wBACF,eAAe,CAAC,cAAc,CAC5B,IAAI,EACJ,cAAQ,CAAC,MAAM,EACf,SAAS,EACT,mBAAmB,EACnB,sBAAsB,CACvB,CAAC;wBACF,MAAM,KAAK,CAAC;qBACb;gBACH,CAAC,CACF,CAAC;YACJ,CAAC,CACF,CAAC;QACJ,CAAC,CAAC;IACJ,CAAC;IAEO,wBAAwB,CAC9B,SAA2B,EAC3B,QAAkC;QAElC,MAAM,eAAe,GAAG,IAAI,CAAC;QAC7B,OAAO,SAAS,eAAe,CAE7B,OAA+C,EAC/C,GAAG,IAAe;YAElB,IAAI,CAAC,IAAA,0BAAkB,EAAC,OAAO,CAAC,EAAE;gBAChC,OAAO,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC;aACjD;YACD,MAAM,YAAY,GAChB,OAAO,IAAI,CAAC,CAAC,CAAC,KAAK,QAAQ;gBAC3B,CAAC,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,YAAY,GAAG,CAAC,GAAG,CAAC;gBACzD,CAAC,CAAE,IAAI,CAAC,KAAK,EAA0B;gBACvC,CAAC,CAAC,SAAS,CAAC;YAChB,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,aAAa,EAAE,GAAG,IAAA,sBAAc,EAC1D,eAAe,CAAC,KAAK,EACrB,OAAO,EACP,YAAY,CACb,CAAC;YAEF,IACE,IAAA,wCAAsB,EACpB,GAAG,EAAE,CACH,eAAe;iBACZ,SAAS,EAAE;iBACX,yBAAyB,EAAE,CAAC,aAAa,CAAC,EAC/C,CAAC,CAAU,EAAE,EAAE;gBACb,IAAI,CAAC,IAAI,IAAI,EAAE;oBACb,eAAe,CAAC,KAAK,CAAC,KAAK,CACzB,0CAA0C,EAC1C,CAAC,CACF,CAAC;iBACH;YACH,CAAC,EACD,IAAI,CACL,EACD;gBACA,OAAO,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,aAAa,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC;aACvD;YAED,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,IAAA,8BAAsB,EAAC,aAAa,CAAC,CAAC;YACjE,MAAM,UAAU,GAAG,IAAA,oCAA4B,EAC7C,aAAa,EACb;gBACE,SAAS;gBACT,IAAI;gBACJ,QAAQ;gBACR,cAAc,EAAE,eAAe,CAAC,kBAAkB,CAChD,aAAa,EACb,eAAe,CAAC,SAAS,EAAE,CAAC,qBAAqB,CAClD;aACF,EACD,eAAe,CAAC,iBAAiB,EACjC,eAAe,CAAC,SAAS,EAAE,CAAC,8BAA8B,IAAI,KAAK,CACpE,CAAC;YAEF,MAAM,SAAS,GAAG,IAAA,aAAM,GAAE,CAAC;YAC3B,MAAM,mBAAmB,GACvB,IAAA,0CAAkC,EAAC,UAAU,CAAC,CAAC;YAEjD,oFAAoF;YACpF,MAAM,sBAAsB,GAAe;gBACzC,CAAC,+CAAwB,CAAC,EAAE,UAAU,CAAC,+CAAwB,CAAC;gBAChE,CAAC,0CAAmB,CAAC,EAAE,UAAU,CAAC,0CAAmB,CAAC;gBACtD,CAAC,uCAAgB,CAAC,EAAE,UAAU,CAAC,uCAAgB,CAAC;aACjD,CAAC;YAEF,iEAAiE;YACjE,IAAI,UAAU,CAAC,qDAA8B,CAAC,EAAE;gBAC9C,sBAAsB,CAAC,qDAA8B,CAAC;oBACpD,UAAU,CAAC,qDAA8B,CAAC,CAAC;aAC9C;YAED,uEAAuE;YACvE,IAAI,UAAU,CAAC,oDAA6B,CAAC,EAAE;gBAC7C,sBAAsB,CAAC,oDAA6B,CAAC;oBACnD,UAAU,CAAC,oDAA6B,CAAC,CAAC;aAC7C;YAED,MAAM,WAAW,GAAgB;gBAC/B,IAAI,EAAE,cAAQ,CAAC,MAAM;gBACrB,UAAU;aACX,CAAC;YACF,MAAM,IAAI,GAAG,eAAe,CAAC,cAAc,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;YAEjE,MAAM,aAAa,GAAG,aAAO,CAAC,MAAM,EAAE,CAAC;YACvC,MAAM,cAAc,GAAG,WAAK,CAAC,OAAO,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;YAE1D,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE;gBAC1B,aAAa,CAAC,OAAO,GAAG,EAAE,CAAC;aAC5B;iBAAM;gBACL,oEAAoE;gBACpE,oCAAoC;gBACpC,aAAa,CAAC,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,aAAa,CAAC,OAAO,CAAC,CAAC;aAClE;YACD,iBAAW,CAAC,MAAM,CAAC,cAAc,EAAE,aAAa,CAAC,OAAO,CAAC,CAAC;YAE1D,OAAO,aAAO,CAAC,IAAI,CAAC,cAAc,EAAE,GAAG,EAAE;gBACvC;;;mBAGG;gBACH,MAAM,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;gBACjC,IAAI,OAAO,EAAE,KAAK,UAAU,EAAE;oBAC5B,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,aAAO,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC;iBACzD;gBAED,MAAM,OAAO,GAAuB,IAAA,wCAAsB,EACxD,GAAG,EAAE;oBACH,IAAI,UAAU,EAAE;wBACd,qGAAqG;wBACrG,qGAAqG;wBACrG,uBAAuB;wBACvB,OAAO,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC;qBACjD;yBAAM;wBACL,OAAO,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,aAAa,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC;qBACvD;gBACH,CAAC,EACD,KAAK,CAAC,EAAE;oBACN,IAAI,KAAK,EAAE;wBACT,IAAA,wBAAgB,EAAC,IAAI,EAAE,KAAK,EAAE,eAAe,CAAC,iBAAiB,CAAC,CAAC;wBAEjE,eAAe,CAAC,cAAc,CAC5B,IAAI,EACJ,cAAQ,CAAC,MAAM,EACf,SAAS,EACT,mBAAmB,EACnB,sBAAsB,CACvB,CAAC;wBACF,MAAM,KAAK,CAAC;qBACb;gBACH,CAAC,CACF,CAAC;gBAEF,eAAe,CAAC,KAAK,CAAC,KAAK,CACzB,GAAG,SAAS,kCAAkC,CAC/C,CAAC;gBACF,aAAO,CAAC,IAAI,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;gBACrC,OAAO,eAAe,CAAC,mBAAmB,CACxC,OAAO,EACP,IAAI,EACJ,SAAS,EACT,mBAAmB,EACnB,sBAAsB,CACvB,CAAC;YACJ,CAAC,CAAC,CAAC;QACL,CAAC,CAAC;IACJ,CAAC;IAEO,uBAAuB,CAC7B,OAA6B,EAC7B,QAA6B,EAC7B,IAAU,EACV,mBAA+B,EAC/B,sBAAkC,EAClC,SAAiB;QAEjB,MAAM,UAAU,GAAG,IAAA,8CAAsC,EACvD,OAAO,EACP,QAAQ,EACR,IAAI,CAAC,iBAAiB,CACvB,CAAC;QACF,mBAAmB,GAAG,MAAM,CAAC,MAAM,CACjC,mBAAmB,EACnB,IAAA,oDAA4C,EAAC,UAAU,CAAC,CACzD,CAAC;QACF,sBAAsB,GAAG,MAAM,CAAC,MAAM,CACpC,sBAAsB,EACtB,IAAA,0DAAkD,EAAC,UAAU,CAAC,CAC/D,CAAC;QAEF,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,sBAAsB,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,CAC/D,QAAQ,CAAC,SAAS,CAAC,MAAM,CAAC,CAC3B,CAAC;QAEF,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC,SAAS,CAAC;YACvC,IAAI,EAAE,IAAA,2BAAmB,EAAC,cAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,UAAU,CAAC;SAChE,CAAC,CAAC;QAEH,MAAM,KAAK,GAAG,UAAU,CAAC,sCAAe,CAAC,CAAC;QAC1C,IAAI,KAAK,EAAE;YACT,IAAI,CAAC,UAAU,CAAC,GAAG,OAAO,CAAC,MAAM,IAAI,KAAK,IAAI,KAAK,EAAE,CAAC,CAAC;SACxD;QAED,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC,2BAA2B,EAAE;YAChD,IAAA,wCAAsB,EACpB,GAAG,EAAE,CACH,IAAI,CAAC,SAAS,EAAE,CAAC,2BAA4B,CAC3C,IAAI,EACJ,OAAO,EACP,QAAQ,CACT,EACH,GAAG,EAAE,GAAE,CAAC,EACR,IAAI,CACL,CAAC;SACH;QAED,IAAI,CAAC,cAAc,CACjB,IAAI,EACJ,cAAQ,CAAC,MAAM,EACf,SAAS,EACT,mBAAmB,EACnB,sBAAsB,CACvB,CAAC;IACJ,CAAC;IAEO,sBAAsB,CAC5B,IAAU,EACV,mBAA+B,EAC/B,sBAAkC,EAClC,SAAiB,EACjB,KAAU;QAEV,IAAA,wBAAgB,EAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,iBAAiB,CAAC,CAAC;QACtD,wCAAwC;QACxC,IAAI,CAAC,cAAc,CACjB,IAAI,EACJ,cAAQ,CAAC,MAAM,EACf,SAAS,EACT,mBAAmB,EACnB,sBAAsB,CACvB,CAAC;IACJ,CAAC;IAEO,cAAc,CACpB,IAAY,EACZ,OAAoB,EACpB,GAAG,GAAG,aAAO,CAAC,MAAM,EAAE;QAEtB;;;WAGG;QACH,MAAM,aAAa,GACjB,OAAO,CAAC,IAAI,KAAK,cAAQ,CAAC,MAAM;YAC9B,CAAC,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,6BAA6B;YAChD,CAAC,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,6BAA6B,CAAC;QAErD,IAAI,IAAU,CAAC;QACf,MAAM,WAAW,GAAG,WAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAEvC,IAAI,aAAa,KAAK,IAAI,IAAI,WAAW,KAAK,SAAS,EAAE;YACvD,IAAI,GAAG,WAAK,CAAC,eAAe,CAAC,0BAAoB,CAAC,CAAC;SACpD;aAAM,IAAI,aAAa,KAAK,IAAI,IAAI,WAAW,EAAE,WAAW,EAAE,CAAC,QAAQ,EAAE;YACxE,IAAI,GAAG,WAAW,CAAC;SACpB;aAAM;YACL,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC;SAClD;QACD,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC7B,OAAO,IAAI,CAAC;IACd,CAAC;IAEO,cAAc,CACpB,IAAU,EACV,QAAkB,EAClB,SAAiB,EACjB,mBAA+B,EAC/B,sBAAkC;QAElC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;YACjC,OAAO;SACR;QAED,IAAI,CAAC,GAAG,EAAE,CAAC;QACX,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAEhC,iBAAiB;QACjB,MAAM,QAAQ,GAAG,IAAA,2BAAoB,EAAC,IAAA,qBAAc,EAAC,SAAS,EAAE,IAAA,aAAM,GAAE,CAAC,CAAC,CAAC;QAC3E,IAAI,QAAQ,KAAK,cAAQ,CAAC,MAAM,EAAE;YAChC,IAAI,CAAC,qBAAqB,CACxB,QAAQ,EACR,mBAAmB,EACnB,sBAAsB,CACvB,CAAC;SACH;aAAM,IAAI,QAAQ,KAAK,cAAQ,CAAC,MAAM,EAAE;YACvC,IAAI,CAAC,qBAAqB,CACxB,QAAQ,EACR,mBAAmB,EACnB,sBAAsB,CACvB,CAAC;SACH;IACH,CAAC;IAEO,iBAAiB,CACvB,IAAU,EACV,QAAoD;QAEpD,IAAA,wCAAsB,EACpB,GAAG,EAAE,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,YAAa,CAAC,IAAI,EAAE,QAAQ,CAAC,EACpD,GAAG,EAAE,GAAE,CAAC,EACR,IAAI,CACL,CAAC;IACJ,CAAC;IAEO,gBAAgB,CACtB,IAAU,EACV,OAAkD;QAElD,IAAA,wCAAsB,EACpB,GAAG,EAAE,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,WAAY,CAAC,IAAI,EAAE,OAAO,CAAC,EAClD,GAAG,EAAE,GAAE,CAAC,EACR,IAAI,CACL,CAAC;IACJ,CAAC;IAEO,kBAAkB,CACxB,OAAmD,EACnD,QAA8B;QAE9B,IAAI,OAAO,QAAQ,KAAK,UAAU,EAAE;YAClC,OAAO,IAAA,wCAAsB,EAC3B,GAAG,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,EACvB,GAAG,EAAE,GAAE,CAAC,EACR,IAAI,CACL,CAAC;SACH;IACH,CAAC;IAEO,oBAAoB;QAC1B,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;QAEhC,OAAO;YACL,MAAM,EAAE;gBACN,qBAAqB,EAAE,IAAA,qBAAa,EAClC,SAAS,EACT,MAAM,CAAC,uBAAuB,EAAE,MAAM,EAAE,cAAc,IAAI,EAAE,CAC7D;gBACD,sBAAsB,EAAE,IAAA,qBAAa,EACnC,UAAU,EACV,MAAM,CAAC,uBAAuB,EAAE,MAAM,EAAE,eAAe,IAAI,EAAE,CAC9D;aACF;YACD,MAAM,EAAE;gBACN,qBAAqB,EAAE,IAAA,qBAAa,EAClC,SAAS,EACT,MAAM,CAAC,uBAAuB,EAAE,MAAM,EAAE,cAAc,IAAI,EAAE,CAC7D;gBACD,sBAAsB,EAAE,IAAA,qBAAa,EACnC,UAAU,EACV,MAAM,CAAC,uBAAuB,EAAE,MAAM,EAAE,eAAe,IAAI,EAAE,CAC9D;aACF;SACF,CAAC;IACJ,CAAC;CACF;AAt9BD,kDAs9BC","sourcesContent":["/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport {\n context,\n HrTime,\n INVALID_SPAN_CONTEXT,\n propagation,\n ROOT_CONTEXT,\n Span,\n SpanKind,\n SpanOptions,\n SpanStatus,\n SpanStatusCode,\n trace,\n Histogram,\n Attributes,\n ValueType,\n} from '@opentelemetry/api';\nimport {\n hrTime,\n hrTimeDuration,\n hrTimeToMilliseconds,\n suppressTracing,\n RPCMetadata,\n RPCType,\n setRPCMetadata,\n} from '@opentelemetry/core';\nimport type * as http from 'http';\nimport type * as https from 'https';\nimport { Socket } from 'net';\nimport * as url from 'url';\nimport { HttpInstrumentationConfig } from './types';\nimport { VERSION } from './version';\nimport {\n InstrumentationBase,\n InstrumentationNodeModuleDefinition,\n SemconvStability,\n semconvStabilityFromStr,\n safeExecuteInTheMiddle,\n} from '@opentelemetry/instrumentation';\nimport { errorMonitor } from 'events';\nimport {\n ATTR_HTTP_REQUEST_METHOD,\n ATTR_HTTP_RESPONSE_STATUS_CODE,\n ATTR_NETWORK_PROTOCOL_VERSION,\n ATTR_HTTP_ROUTE,\n ATTR_SERVER_ADDRESS,\n ATTR_SERVER_PORT,\n ATTR_URL_SCHEME,\n METRIC_HTTP_CLIENT_REQUEST_DURATION,\n METRIC_HTTP_SERVER_REQUEST_DURATION,\n} from '@opentelemetry/semantic-conventions';\nimport {\n extractHostnameAndPort,\n getIncomingRequestAttributes,\n getIncomingRequestAttributesOnResponse,\n getIncomingRequestMetricAttributes,\n getIncomingRequestMetricAttributesOnResponse,\n getIncomingStableRequestMetricAttributesOnResponse,\n getOutgoingRequestAttributes,\n getOutgoingRequestAttributesOnResponse,\n getOutgoingRequestMetricAttributes,\n getOutgoingRequestMetricAttributesOnResponse,\n getOutgoingStableRequestMetricAttributesOnResponse,\n getRequestInfo,\n headerCapture,\n isValidOptionsType,\n parseResponseStatus,\n setSpanWithError,\n} from './utils';\nimport { Err, Func, Http, HttpRequestArgs, Https } from './internal-types';\n\n/**\n * `node:http` and `node:https` instrumentation for OpenTelemetry\n */\nexport class HttpInstrumentation extends InstrumentationBase<HttpInstrumentationConfig> {\n /** keep track on spans not ended */\n private readonly _spanNotEnded: WeakSet<Span> = new WeakSet<Span>();\n private _headerCapture;\n declare private _oldHttpServerDurationHistogram: Histogram;\n declare private _stableHttpServerDurationHistogram: Histogram;\n declare private _oldHttpClientDurationHistogram: Histogram;\n declare private _stableHttpClientDurationHistogram: Histogram;\n\n private _semconvStability: SemconvStability = SemconvStability.OLD;\n\n constructor(config: HttpInstrumentationConfig = {}) {\n super('@opentelemetry/instrumentation-http', VERSION, config);\n this._headerCapture = this._createHeaderCapture();\n this._semconvStability = semconvStabilityFromStr(\n 'http',\n process.env.OTEL_SEMCONV_STABILITY_OPT_IN\n );\n }\n\n protected override _updateMetricInstruments() {\n this._oldHttpServerDurationHistogram = this.meter.createHistogram(\n 'http.server.duration',\n {\n description: 'Measures the duration of inbound HTTP requests.',\n unit: 'ms',\n valueType: ValueType.DOUBLE,\n }\n );\n this._oldHttpClientDurationHistogram = this.meter.createHistogram(\n 'http.client.duration',\n {\n description: 'Measures the duration of outbound HTTP requests.',\n unit: 'ms',\n valueType: ValueType.DOUBLE,\n }\n );\n this._stableHttpServerDurationHistogram = this.meter.createHistogram(\n METRIC_HTTP_SERVER_REQUEST_DURATION,\n {\n description: 'Duration of HTTP server 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 this._stableHttpClientDurationHistogram = this.meter.createHistogram(\n METRIC_HTTP_CLIENT_REQUEST_DURATION,\n {\n description: 'Duration of HTTP client 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 _recordServerDuration(\n durationMs: number,\n oldAttributes: Attributes,\n stableAttributes: Attributes\n ) {\n if (this._semconvStability & SemconvStability.OLD) {\n // old histogram is counted in MS\n this._oldHttpServerDurationHistogram.record(durationMs, oldAttributes);\n }\n\n if (this._semconvStability & SemconvStability.STABLE) {\n // stable histogram is counted in S\n this._stableHttpServerDurationHistogram.record(\n durationMs / 1000,\n stableAttributes\n );\n }\n }\n\n private _recordClientDuration(\n durationMs: number,\n oldAttributes: Attributes,\n stableAttributes: Attributes\n ) {\n if (this._semconvStability & SemconvStability.OLD) {\n // old histogram is counted in MS\n this._oldHttpClientDurationHistogram.record(durationMs, oldAttributes);\n }\n\n if (this._semconvStability & SemconvStability.STABLE) {\n // stable histogram is counted in S\n this._stableHttpClientDurationHistogram.record(\n durationMs / 1000,\n stableAttributes\n );\n }\n }\n\n override setConfig(config: HttpInstrumentationConfig = {}): void {\n super.setConfig(config);\n this._headerCapture = this._createHeaderCapture();\n }\n\n init(): [\n InstrumentationNodeModuleDefinition,\n InstrumentationNodeModuleDefinition,\n ] {\n return [this._getHttpsInstrumentation(), this._getHttpInstrumentation()];\n }\n\n private _getHttpInstrumentation() {\n return new InstrumentationNodeModuleDefinition(\n 'http',\n ['*'],\n (moduleExports: Http): Http => {\n const isESM = (moduleExports as any)[Symbol.toStringTag] === 'Module';\n if (!this.getConfig().disableOutgoingRequestInstrumentation) {\n const patchedRequest = this._wrap(\n moduleExports,\n 'request',\n this._getPatchOutgoingRequestFunction('http')\n ) as unknown as Func<http.ClientRequest>;\n const patchedGet = this._wrap(\n moduleExports,\n 'get',\n this._getPatchOutgoingGetFunction(patchedRequest)\n );\n if (isESM) {\n // To handle `import http from 'http'`, which returns the default\n // export, we need to set `module.default.*`.\n (moduleExports as any).default.request = patchedRequest;\n (moduleExports as any).default.get = patchedGet;\n }\n }\n if (!this.getConfig().disableIncomingRequestInstrumentation) {\n this._wrap(\n moduleExports.Server.prototype,\n 'emit',\n this._getPatchIncomingRequestFunction('http')\n );\n }\n return moduleExports;\n },\n (moduleExports: Http) => {\n if (moduleExports === undefined) return;\n\n if (!this.getConfig().disableOutgoingRequestInstrumentation) {\n this._unwrap(moduleExports, 'request');\n this._unwrap(moduleExports, 'get');\n }\n if (!this.getConfig().disableIncomingRequestInstrumentation) {\n this._unwrap(moduleExports.Server.prototype, 'emit');\n }\n }\n );\n }\n\n private _getHttpsInstrumentation() {\n return new InstrumentationNodeModuleDefinition(\n 'https',\n ['*'],\n (moduleExports: Https): Https => {\n const isESM = (moduleExports as any)[Symbol.toStringTag] === 'Module';\n if (!this.getConfig().disableOutgoingRequestInstrumentation) {\n const patchedRequest = this._wrap(\n moduleExports,\n 'request',\n this._getPatchHttpsOutgoingRequestFunction('https')\n ) as unknown as Func<http.ClientRequest>;\n const patchedGet = this._wrap(\n moduleExports,\n 'get',\n this._getPatchHttpsOutgoingGetFunction(patchedRequest)\n );\n if (isESM) {\n // To handle `import https from 'https'`, which returns the default\n // export, we need to set `module.default.*`.\n (moduleExports as any).default.request = patchedRequest;\n (moduleExports as any).default.get = patchedGet;\n }\n }\n if (!this.getConfig().disableIncomingRequestInstrumentation) {\n this._wrap(\n moduleExports.Server.prototype,\n 'emit',\n this._getPatchIncomingRequestFunction('https')\n );\n }\n return moduleExports;\n },\n (moduleExports: Https) => {\n if (moduleExports === undefined) return;\n\n if (!this.getConfig().disableOutgoingRequestInstrumentation) {\n this._unwrap(moduleExports, 'request');\n this._unwrap(moduleExports, 'get');\n }\n if (!this.getConfig().disableIncomingRequestInstrumentation) {\n this._unwrap(moduleExports.Server.prototype, 'emit');\n }\n }\n );\n }\n\n /**\n * Creates spans for incoming requests, restoring spans' context if applied.\n */\n private _getPatchIncomingRequestFunction(component: 'http' | 'https') {\n return (\n original: (event: string, ...args: unknown[]) => boolean\n ): ((this: unknown, event: string, ...args: unknown[]) => boolean) => {\n return this._incomingRequestFunction(component, original);\n };\n }\n\n /**\n * Creates spans for outgoing requests, sending spans' context for distributed\n * tracing.\n */\n private _getPatchOutgoingRequestFunction(component: 'http' | 'https') {\n return (original: Func<http.ClientRequest>): Func<http.ClientRequest> => {\n return this._outgoingRequestFunction(component, original);\n };\n }\n\n private _getPatchOutgoingGetFunction(\n clientRequest: (\n options: http.RequestOptions | string | url.URL,\n ...args: HttpRequestArgs\n ) => http.ClientRequest\n ) {\n return (_original: Func<http.ClientRequest>): Func<http.ClientRequest> => {\n // Re-implement http.get. This needs to be done (instead of using\n // getPatchOutgoingRequestFunction to patch it) because we need to\n // set the trace context header before the returned http.ClientRequest is\n // ended. The Node.js docs state that the only differences between\n // request and get are that (1) get defaults to the HTTP GET method and\n // (2) the returned request object is ended immediately. The former is\n // already true (at least in supported Node versions up to v10), so we\n // simply follow the latter. Ref:\n // https://nodejs.org/dist/latest/docs/api/http.html#http_http_get_options_callback\n // https://github.com/googleapis/cloud-trace-nodejs/blob/master/src/instrumentations/instrumentation-http.ts#L198\n return function outgoingGetRequest<\n T extends http.RequestOptions | string | url.URL,\n >(options: T, ...args: HttpRequestArgs): http.ClientRequest {\n const req = clientRequest(options, ...args);\n req.end();\n return req;\n };\n };\n }\n\n /** Patches HTTPS outgoing requests */\n private _getPatchHttpsOutgoingRequestFunction(component: 'http' | 'https') {\n return (original: Func<http.ClientRequest>): Func<http.ClientRequest> => {\n const instrumentation = this;\n return function httpsOutgoingRequest(\n // eslint-disable-next-line node/no-unsupported-features/node-builtins\n options: https.RequestOptions | string | URL,\n ...args: HttpRequestArgs\n ): http.ClientRequest {\n // Makes sure options will have default HTTPS parameters\n if (\n component === 'https' &&\n typeof options === 'object' &&\n options?.constructor?.name !== 'URL'\n ) {\n options = Object.assign({}, options);\n instrumentation._setDefaultOptions(options);\n }\n return instrumentation._getPatchOutgoingRequestFunction(component)(\n original\n )(options, ...args);\n };\n };\n }\n\n private _setDefaultOptions(options: https.RequestOptions) {\n options.protocol = options.protocol || 'https:';\n options.port = options.port || 443;\n }\n\n /** Patches HTTPS outgoing get requests */\n private _getPatchHttpsOutgoingGetFunction(\n clientRequest: (\n // eslint-disable-next-line node/no-unsupported-features/node-builtins\n options: http.RequestOptions | string | URL,\n ...args: HttpRequestArgs\n ) => http.ClientRequest\n ) {\n return (original: Func<http.ClientRequest>): Func<http.ClientRequest> => {\n const instrumentation = this;\n return function httpsOutgoingRequest(\n // eslint-disable-next-line node/no-unsupported-features/node-builtins\n options: https.RequestOptions | string | URL,\n ...args: HttpRequestArgs\n ): http.ClientRequest {\n return instrumentation._getPatchOutgoingGetFunction(clientRequest)(\n original\n )(options, ...args);\n };\n };\n }\n\n /**\n * Attach event listeners to a client request to end span and add span attributes.\n *\n * @param request The original request object.\n * @param span representing the current operation\n * @param startTime representing the start time of the request to calculate duration in Metric\n * @param oldMetricAttributes metric attributes for old semantic conventions\n * @param stableMetricAttributes metric attributes for new semantic conventions\n */\n private _traceClientRequest(\n request: http.ClientRequest,\n span: Span,\n startTime: HrTime,\n oldMetricAttributes: Attributes,\n stableMetricAttributes: Attributes\n ): http.ClientRequest {\n if (this.getConfig().requestHook) {\n this._callRequestHook(span, request);\n }\n\n /**\n * Determines if the request has errored or the response has ended/errored.\n */\n let responseFinished = false;\n\n /*\n * User 'response' event listeners can be added before our listener,\n * force our listener to be the first, so response emitter is bound\n * before any user listeners are added to it.\n */\n request.prependListener(\n 'response',\n (response: http.IncomingMessage & { aborted?: boolean }) => {\n this._diag.debug('outgoingRequest on response()');\n if (request.listenerCount('response') <= 1) {\n response.resume();\n }\n const responseAttributes = getOutgoingRequestAttributesOnResponse(\n response,\n this._semconvStability\n );\n span.setAttributes(responseAttributes);\n oldMetricAttributes = Object.assign(\n oldMetricAttributes,\n getOutgoingRequestMetricAttributesOnResponse(responseAttributes)\n );\n stableMetricAttributes = Object.assign(\n stableMetricAttributes,\n getOutgoingStableRequestMetricAttributesOnResponse(responseAttributes)\n );\n\n if (this.getConfig().responseHook) {\n this._callResponseHook(span, response);\n }\n\n this._headerCapture.client.captureRequestHeaders(span, header =>\n request.getHeader(header)\n );\n this._headerCapture.client.captureResponseHeaders(\n span,\n header => response.headers[header]\n );\n\n context.bind(context.active(), response);\n\n const endHandler = () => {\n this._diag.debug('outgoingRequest on end()');\n if (responseFinished) {\n return;\n }\n responseFinished = true;\n let status: SpanStatus;\n\n if (response.aborted && !response.complete) {\n status = { code: SpanStatusCode.ERROR };\n } else {\n // behaves same for new and old semconv\n status = {\n code: parseResponseStatus(SpanKind.CLIENT, response.statusCode),\n };\n }\n\n span.setStatus(status);\n\n if (this.getConfig().applyCustomAttributesOnSpan) {\n safeExecuteInTheMiddle(\n () =>\n this.getConfig().applyCustomAttributesOnSpan!(\n span,\n request,\n response\n ),\n () => {},\n true\n );\n }\n\n this._closeHttpSpan(\n span,\n SpanKind.CLIENT,\n startTime,\n oldMetricAttributes,\n stableMetricAttributes\n );\n };\n\n response.on('end', endHandler);\n response.on(errorMonitor, (error: Err) => {\n this._diag.debug('outgoingRequest on error()', error);\n if (responseFinished) {\n return;\n }\n responseFinished = true;\n setSpanWithError(span, error, this._semconvStability);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error.message,\n });\n this._closeHttpSpan(\n span,\n SpanKind.CLIENT,\n startTime,\n oldMetricAttributes,\n stableMetricAttributes\n );\n });\n }\n );\n request.on('close', () => {\n this._diag.debug('outgoingRequest on request close()');\n if (request.aborted || responseFinished) {\n return;\n }\n responseFinished = true;\n this._closeHttpSpan(\n span,\n SpanKind.CLIENT,\n startTime,\n oldMetricAttributes,\n stableMetricAttributes\n );\n });\n request.on(errorMonitor, (error: Err) => {\n this._diag.debug('outgoingRequest on request error()', error);\n if (responseFinished) {\n return;\n }\n responseFinished = true;\n setSpanWithError(span, error, this._semconvStability);\n\n this._closeHttpSpan(\n span,\n SpanKind.CLIENT,\n startTime,\n oldMetricAttributes,\n stableMetricAttributes\n );\n });\n\n this._diag.debug('http.ClientRequest return request');\n return request;\n }\n\n private _incomingRequestFunction(\n component: 'http' | 'https',\n original: (event: string, ...args: unknown[]) => boolean\n ) {\n const instrumentation = this;\n return function incomingRequest(\n this: unknown,\n event: string,\n ...args: unknown[]\n ): boolean {\n // Only traces request events\n if (event !== 'request') {\n return original.apply(this, [event, ...args]);\n }\n\n const request = args[0] as http.IncomingMessage;\n const response = args[1] as http.ServerResponse & { socket: Socket };\n const method = request.method || 'GET';\n\n instrumentation._diag.debug(\n `${component} instrumentation incomingRequest`\n );\n\n if (\n safeExecuteInTheMiddle(\n () =>\n instrumentation.getConfig().ignoreIncomingRequestHook?.(request),\n (e: unknown) => {\n if (e != null) {\n instrumentation._diag.error(\n 'caught ignoreIncomingRequestHook error: ',\n e\n );\n }\n },\n true\n )\n ) {\n return context.with(suppressTracing(context.active()), () => {\n context.bind(context.active(), request);\n context.bind(context.active(), response);\n return original.apply(this, [event, ...args]);\n });\n }\n\n const headers = request.headers;\n\n const spanAttributes = getIncomingRequestAttributes(\n request,\n {\n component: component,\n serverName: instrumentation.getConfig().serverName,\n hookAttributes: instrumentation._callStartSpanHook(\n request,\n instrumentation.getConfig().startIncomingSpanHook\n ),\n semconvStability: instrumentation._semconvStability,\n enableSyntheticSourceDetection:\n instrumentation.getConfig().enableSyntheticSourceDetection || false,\n },\n instrumentation._diag\n );\n\n const spanOptions: SpanOptions = {\n kind: SpanKind.SERVER,\n attributes: spanAttributes,\n };\n\n const startTime = hrTime();\n const oldMetricAttributes =\n getIncomingRequestMetricAttributes(spanAttributes);\n\n // request method and url.scheme are both required span attributes\n const stableMetricAttributes: Attributes = {\n [ATTR_HTTP_REQUEST_METHOD]: spanAttributes[ATTR_HTTP_REQUEST_METHOD],\n [ATTR_URL_SCHEME]: spanAttributes[ATTR_URL_SCHEME],\n };\n\n // recommended if and only if one was sent, same as span recommendation\n if (spanAttributes[ATTR_NETWORK_PROTOCOL_VERSION]) {\n stableMetricAttributes[ATTR_NETWORK_PROTOCOL_VERSION] =\n spanAttributes[ATTR_NETWORK_PROTOCOL_VERSION];\n }\n\n const ctx = propagation.extract(ROOT_CONTEXT, headers);\n const span = instrumentation._startHttpSpan(method, spanOptions, ctx);\n const rpcMetadata: RPCMetadata = {\n type: RPCType.HTTP,\n span,\n };\n\n return context.with(\n setRPCMetadata(trace.setSpan(ctx, span), rpcMetadata),\n () => {\n context.bind(context.active(), request);\n context.bind(context.active(), response);\n\n if (instrumentation.getConfig().requestHook) {\n instrumentation._callRequestHook(span, request);\n }\n if (instrumentation.getConfig().responseHook) {\n instrumentation._callResponseHook(span, response);\n }\n\n instrumentation._headerCapture.server.captureRequestHeaders(\n span,\n header => request.headers[header]\n );\n\n // After 'error', no further events other than 'close' should be emitted.\n let hasError = false;\n response.on('close', () => {\n if (hasError) {\n return;\n }\n instrumentation._onServerResponseFinish(\n request,\n response,\n span,\n oldMetricAttributes,\n stableMetricAttributes,\n startTime\n );\n });\n response.on(errorMonitor, (err: Err) => {\n hasError = true;\n instrumentation._onServerResponseError(\n span,\n oldMetricAttributes,\n stableMetricAttributes,\n startTime,\n err\n );\n });\n\n return safeExecuteInTheMiddle(\n () => original.apply(this, [event, ...args]),\n error => {\n if (error) {\n setSpanWithError(\n span,\n error,\n instrumentation._semconvStability\n );\n instrumentation._closeHttpSpan(\n span,\n SpanKind.SERVER,\n startTime,\n oldMetricAttributes,\n stableMetricAttributes\n );\n throw error;\n }\n }\n );\n }\n );\n };\n }\n\n private _outgoingRequestFunction(\n component: 'http' | 'https',\n original: Func<http.ClientRequest>\n ): Func<http.ClientRequest> {\n const instrumentation = this;\n return function outgoingRequest(\n this: unknown,\n options: url.URL | http.RequestOptions | string,\n ...args: unknown[]\n ): http.ClientRequest {\n if (!isValidOptionsType(options)) {\n return original.apply(this, [options, ...args]);\n }\n const extraOptions =\n typeof args[0] === 'object' &&\n (typeof options === 'string' || options instanceof url.URL)\n ? (args.shift() as http.RequestOptions)\n : undefined;\n const { method, invalidUrl, optionsParsed } = getRequestInfo(\n instrumentation._diag,\n options,\n extraOptions\n );\n\n if (\n safeExecuteInTheMiddle(\n () =>\n instrumentation\n .getConfig()\n .ignoreOutgoingRequestHook?.(optionsParsed),\n (e: unknown) => {\n if (e != null) {\n instrumentation._diag.error(\n 'caught ignoreOutgoingRequestHook error: ',\n e\n );\n }\n },\n true\n )\n ) {\n return original.apply(this, [optionsParsed, ...args]);\n }\n\n const { hostname, port } = extractHostnameAndPort(optionsParsed);\n const attributes = getOutgoingRequestAttributes(\n optionsParsed,\n {\n component,\n port,\n hostname,\n hookAttributes: instrumentation._callStartSpanHook(\n optionsParsed,\n instrumentation.getConfig().startOutgoingSpanHook\n ),\n },\n instrumentation._semconvStability,\n instrumentation.getConfig().enableSyntheticSourceDetection || false\n );\n\n const startTime = hrTime();\n const oldMetricAttributes: Attributes =\n getOutgoingRequestMetricAttributes(attributes);\n\n // request method, server address, and server port are both required span attributes\n const stableMetricAttributes: Attributes = {\n [ATTR_HTTP_REQUEST_METHOD]: attributes[ATTR_HTTP_REQUEST_METHOD],\n [ATTR_SERVER_ADDRESS]: attributes[ATTR_SERVER_ADDRESS],\n [ATTR_SERVER_PORT]: attributes[ATTR_SERVER_PORT],\n };\n\n // required if and only if one was sent, same as span requirement\n if (attributes[ATTR_HTTP_RESPONSE_STATUS_CODE]) {\n stableMetricAttributes[ATTR_HTTP_RESPONSE_STATUS_CODE] =\n attributes[ATTR_HTTP_RESPONSE_STATUS_CODE];\n }\n\n // recommended if and only if one was sent, same as span recommendation\n if (attributes[ATTR_NETWORK_PROTOCOL_VERSION]) {\n stableMetricAttributes[ATTR_NETWORK_PROTOCOL_VERSION] =\n attributes[ATTR_NETWORK_PROTOCOL_VERSION];\n }\n\n const spanOptions: SpanOptions = {\n kind: SpanKind.CLIENT,\n attributes,\n };\n const span = instrumentation._startHttpSpan(method, spanOptions);\n\n const parentContext = context.active();\n const requestContext = trace.setSpan(parentContext, span);\n\n if (!optionsParsed.headers) {\n optionsParsed.headers = {};\n } else {\n // Make a copy of the headers object to avoid mutating an object the\n // caller might have a reference to.\n optionsParsed.headers = Object.assign({}, optionsParsed.headers);\n }\n propagation.inject(requestContext, optionsParsed.headers);\n\n return context.with(requestContext, () => {\n /*\n * The response callback is registered before ClientRequest is bound,\n * thus it is needed to bind it before the function call.\n */\n const cb = args[args.length - 1];\n if (typeof cb === 'function') {\n args[args.length - 1] = context.bind(parentContext, cb);\n }\n\n const request: http.ClientRequest = safeExecuteInTheMiddle(\n () => {\n if (invalidUrl) {\n // we know that the url is invalid, there's no point in injecting context as it will fail validation.\n // Passing in what the user provided will give the user an error that matches what they'd see without\n // the instrumentation.\n return original.apply(this, [options, ...args]);\n } else {\n return original.apply(this, [optionsParsed, ...args]);\n }\n },\n error => {\n if (error) {\n setSpanWithError(span, error, instrumentation._semconvStability);\n\n instrumentation._closeHttpSpan(\n span,\n SpanKind.CLIENT,\n startTime,\n oldMetricAttributes,\n stableMetricAttributes\n );\n throw error;\n }\n }\n );\n\n instrumentation._diag.debug(\n `${component} instrumentation outgoingRequest`\n );\n context.bind(parentContext, request);\n return instrumentation._traceClientRequest(\n request,\n span,\n startTime,\n oldMetricAttributes,\n stableMetricAttributes\n );\n });\n };\n }\n\n private _onServerResponseFinish(\n request: http.IncomingMessage,\n response: http.ServerResponse,\n span: Span,\n oldMetricAttributes: Attributes,\n stableMetricAttributes: Attributes,\n startTime: HrTime\n ) {\n const attributes = getIncomingRequestAttributesOnResponse(\n request,\n response,\n this._semconvStability\n );\n oldMetricAttributes = Object.assign(\n oldMetricAttributes,\n getIncomingRequestMetricAttributesOnResponse(attributes)\n );\n stableMetricAttributes = Object.assign(\n stableMetricAttributes,\n getIncomingStableRequestMetricAttributesOnResponse(attributes)\n );\n\n this._headerCapture.server.captureResponseHeaders(span, header =>\n response.getHeader(header)\n );\n\n span.setAttributes(attributes).setStatus({\n code: parseResponseStatus(SpanKind.SERVER, response.statusCode),\n });\n\n const route = attributes[ATTR_HTTP_ROUTE];\n if (route) {\n span.updateName(`${request.method || 'GET'} ${route}`);\n }\n\n if (this.getConfig().applyCustomAttributesOnSpan) {\n safeExecuteInTheMiddle(\n () =>\n this.getConfig().applyCustomAttributesOnSpan!(\n span,\n request,\n response\n ),\n () => {},\n true\n );\n }\n\n this._closeHttpSpan(\n span,\n SpanKind.SERVER,\n startTime,\n oldMetricAttributes,\n stableMetricAttributes\n );\n }\n\n private _onServerResponseError(\n span: Span,\n oldMetricAttributes: Attributes,\n stableMetricAttributes: Attributes,\n startTime: HrTime,\n error: Err\n ) {\n setSpanWithError(span, error, this._semconvStability);\n // TODO get error attributes for metrics\n this._closeHttpSpan(\n span,\n SpanKind.SERVER,\n startTime,\n oldMetricAttributes,\n stableMetricAttributes\n );\n }\n\n private _startHttpSpan(\n name: string,\n options: SpanOptions,\n ctx = context.active()\n ) {\n /*\n * If a parent is required but not present, we use a `NoopSpan` to still\n * propagate context without recording it.\n */\n const requireParent =\n options.kind === SpanKind.CLIENT\n ? this.getConfig().requireParentforOutgoingSpans\n : this.getConfig().requireParentforIncomingSpans;\n\n let span: Span;\n const currentSpan = trace.getSpan(ctx);\n\n if (requireParent === true && currentSpan === undefined) {\n span = trace.wrapSpanContext(INVALID_SPAN_CONTEXT);\n } else if (requireParent === true && currentSpan?.spanContext().isRemote) {\n span = currentSpan;\n } else {\n span = this.tracer.startSpan(name, options, ctx);\n }\n this._spanNotEnded.add(span);\n return span;\n }\n\n private _closeHttpSpan(\n span: Span,\n spanKind: SpanKind,\n startTime: HrTime,\n oldMetricAttributes: Attributes,\n stableMetricAttributes: Attributes\n ) {\n if (!this._spanNotEnded.has(span)) {\n return;\n }\n\n span.end();\n this._spanNotEnded.delete(span);\n\n // Record metrics\n const duration = hrTimeToMilliseconds(hrTimeDuration(startTime, hrTime()));\n if (spanKind === SpanKind.SERVER) {\n this._recordServerDuration(\n duration,\n oldMetricAttributes,\n stableMetricAttributes\n );\n } else if (spanKind === SpanKind.CLIENT) {\n this._recordClientDuration(\n duration,\n oldMetricAttributes,\n stableMetricAttributes\n );\n }\n }\n\n private _callResponseHook(\n span: Span,\n response: http.IncomingMessage | http.ServerResponse\n ) {\n safeExecuteInTheMiddle(\n () => this.getConfig().responseHook!(span, response),\n () => {},\n true\n );\n }\n\n private _callRequestHook(\n span: Span,\n request: http.ClientRequest | http.IncomingMessage\n ) {\n safeExecuteInTheMiddle(\n () => this.getConfig().requestHook!(span, request),\n () => {},\n true\n );\n }\n\n private _callStartSpanHook(\n request: http.IncomingMessage | http.RequestOptions,\n hookFunc: Function | undefined\n ) {\n if (typeof hookFunc === 'function') {\n return safeExecuteInTheMiddle(\n () => hookFunc(request),\n () => {},\n true\n );\n }\n }\n\n private _createHeaderCapture() {\n const config = this.getConfig();\n\n return {\n client: {\n captureRequestHeaders: headerCapture(\n 'request',\n config.headersToSpanAttributes?.client?.requestHeaders ?? []\n ),\n captureResponseHeaders: headerCapture(\n 'response',\n config.headersToSpanAttributes?.client?.responseHeaders ?? []\n ),\n },\n server: {\n captureRequestHeaders: headerCapture(\n 'request',\n config.headersToSpanAttributes?.server?.requestHeaders ?? []\n ),\n captureResponseHeaders: headerCapture(\n 'response',\n config.headersToSpanAttributes?.server?.responseHeaders ?? []\n ),\n },\n };\n }\n}\n"]}
1
+ {"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/http.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport {\n context,\n HrTime,\n INVALID_SPAN_CONTEXT,\n propagation,\n ROOT_CONTEXT,\n Span,\n SpanKind,\n SpanOptions,\n SpanStatus,\n SpanStatusCode,\n trace,\n Histogram,\n Attributes,\n ValueType,\n} from '@opentelemetry/api';\nimport {\n hrTime,\n hrTimeDuration,\n hrTimeToMilliseconds,\n suppressTracing,\n RPCMetadata,\n RPCType,\n setRPCMetadata,\n} from '@opentelemetry/core';\nimport type * as http from 'http';\nimport type * as https from 'https';\nimport { Socket } from 'net';\nimport * as url from 'url';\nimport { HttpInstrumentationConfig } from './types';\nimport { VERSION } from './version';\nimport {\n InstrumentationBase,\n InstrumentationNodeModuleDefinition,\n SemconvStability,\n semconvStabilityFromStr,\n safeExecuteInTheMiddle,\n} from '@opentelemetry/instrumentation';\nimport { errorMonitor } from 'events';\nimport {\n ATTR_HTTP_REQUEST_METHOD,\n ATTR_HTTP_RESPONSE_STATUS_CODE,\n ATTR_NETWORK_PROTOCOL_VERSION,\n ATTR_HTTP_ROUTE,\n ATTR_SERVER_ADDRESS,\n ATTR_SERVER_PORT,\n ATTR_URL_SCHEME,\n METRIC_HTTP_CLIENT_REQUEST_DURATION,\n METRIC_HTTP_SERVER_REQUEST_DURATION,\n} from '@opentelemetry/semantic-conventions';\nimport {\n extractHostnameAndPort,\n getIncomingRequestAttributes,\n getIncomingRequestAttributesOnResponse,\n getIncomingRequestMetricAttributes,\n getIncomingRequestMetricAttributesOnResponse,\n getIncomingStableRequestMetricAttributesOnResponse,\n getOutgoingRequestAttributes,\n getOutgoingRequestAttributesOnResponse,\n getOutgoingRequestMetricAttributes,\n getOutgoingRequestMetricAttributesOnResponse,\n getOutgoingStableRequestMetricAttributesOnResponse,\n getRequestInfo,\n headerCapture,\n isValidOptionsType,\n parseResponseStatus,\n setSpanWithError,\n} from './utils';\nimport { Err, Func, Http, HttpRequestArgs, Https } from './internal-types';\n\n/**\n * `node:http` and `node:https` instrumentation for OpenTelemetry\n */\nexport class HttpInstrumentation extends InstrumentationBase<HttpInstrumentationConfig> {\n /** keep track on spans not ended */\n private readonly _spanNotEnded: WeakSet<Span> = new WeakSet<Span>();\n private _headerCapture;\n declare private _oldHttpServerDurationHistogram: Histogram;\n declare private _stableHttpServerDurationHistogram: Histogram;\n declare private _oldHttpClientDurationHistogram: Histogram;\n declare private _stableHttpClientDurationHistogram: Histogram;\n\n private _semconvStability: SemconvStability = SemconvStability.OLD;\n\n constructor(config: HttpInstrumentationConfig = {}) {\n super('@opentelemetry/instrumentation-http', VERSION, config);\n this._headerCapture = this._createHeaderCapture();\n this._semconvStability = semconvStabilityFromStr(\n 'http',\n process.env.OTEL_SEMCONV_STABILITY_OPT_IN\n );\n }\n\n protected override _updateMetricInstruments() {\n this._oldHttpServerDurationHistogram = this.meter.createHistogram(\n 'http.server.duration',\n {\n description: 'Measures the duration of inbound HTTP requests.',\n unit: 'ms',\n valueType: ValueType.DOUBLE,\n }\n );\n this._oldHttpClientDurationHistogram = this.meter.createHistogram(\n 'http.client.duration',\n {\n description: 'Measures the duration of outbound HTTP requests.',\n unit: 'ms',\n valueType: ValueType.DOUBLE,\n }\n );\n this._stableHttpServerDurationHistogram = this.meter.createHistogram(\n METRIC_HTTP_SERVER_REQUEST_DURATION,\n {\n description: 'Duration of HTTP server 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 this._stableHttpClientDurationHistogram = this.meter.createHistogram(\n METRIC_HTTP_CLIENT_REQUEST_DURATION,\n {\n description: 'Duration of HTTP client 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 _recordServerDuration(\n durationMs: number,\n oldAttributes: Attributes,\n stableAttributes: Attributes\n ) {\n if (this._semconvStability & SemconvStability.OLD) {\n // old histogram is counted in MS\n this._oldHttpServerDurationHistogram.record(durationMs, oldAttributes);\n }\n\n if (this._semconvStability & SemconvStability.STABLE) {\n // stable histogram is counted in S\n this._stableHttpServerDurationHistogram.record(\n durationMs / 1000,\n stableAttributes\n );\n }\n }\n\n private _recordClientDuration(\n durationMs: number,\n oldAttributes: Attributes,\n stableAttributes: Attributes\n ) {\n if (this._semconvStability & SemconvStability.OLD) {\n // old histogram is counted in MS\n this._oldHttpClientDurationHistogram.record(durationMs, oldAttributes);\n }\n\n if (this._semconvStability & SemconvStability.STABLE) {\n // stable histogram is counted in S\n this._stableHttpClientDurationHistogram.record(\n durationMs / 1000,\n stableAttributes\n );\n }\n }\n\n override setConfig(config: HttpInstrumentationConfig = {}): void {\n super.setConfig(config);\n this._headerCapture = this._createHeaderCapture();\n }\n\n init(): [\n InstrumentationNodeModuleDefinition,\n InstrumentationNodeModuleDefinition,\n ] {\n return [this._getHttpsInstrumentation(), this._getHttpInstrumentation()];\n }\n\n private _getHttpInstrumentation() {\n return new InstrumentationNodeModuleDefinition(\n 'http',\n ['*'],\n (moduleExports: Http): Http => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const isESM = (moduleExports as any)[Symbol.toStringTag] === 'Module';\n if (!this.getConfig().disableOutgoingRequestInstrumentation) {\n const patchedRequest = this._wrap(\n moduleExports,\n 'request',\n this._getPatchOutgoingRequestFunction('http')\n ) as unknown as Func<http.ClientRequest>;\n const patchedGet = this._wrap(\n moduleExports,\n 'get',\n this._getPatchOutgoingGetFunction(patchedRequest)\n );\n if (isESM) {\n // To handle `import http from 'http'`, which returns the default\n // export, we need to set `module.default.*`.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (moduleExports as any).default.request = patchedRequest;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (moduleExports as any).default.get = patchedGet;\n }\n }\n if (!this.getConfig().disableIncomingRequestInstrumentation) {\n this._wrap(\n moduleExports.Server.prototype,\n 'emit',\n this._getPatchIncomingRequestFunction('http')\n );\n }\n return moduleExports;\n },\n (moduleExports: Http) => {\n if (moduleExports === undefined) return;\n\n if (!this.getConfig().disableOutgoingRequestInstrumentation) {\n this._unwrap(moduleExports, 'request');\n this._unwrap(moduleExports, 'get');\n }\n if (!this.getConfig().disableIncomingRequestInstrumentation) {\n this._unwrap(moduleExports.Server.prototype, 'emit');\n }\n }\n );\n }\n\n private _getHttpsInstrumentation() {\n return new InstrumentationNodeModuleDefinition(\n 'https',\n ['*'],\n (moduleExports: Https): Https => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const isESM = (moduleExports as any)[Symbol.toStringTag] === 'Module';\n if (!this.getConfig().disableOutgoingRequestInstrumentation) {\n const patchedRequest = this._wrap(\n moduleExports,\n 'request',\n this._getPatchHttpsOutgoingRequestFunction('https')\n ) as unknown as Func<http.ClientRequest>;\n const patchedGet = this._wrap(\n moduleExports,\n 'get',\n this._getPatchHttpsOutgoingGetFunction(patchedRequest)\n );\n if (isESM) {\n // To handle `import https from 'https'`, which returns the default\n // export, we need to set `module.default.*`.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (moduleExports as any).default.request = patchedRequest;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (moduleExports as any).default.get = patchedGet;\n }\n }\n if (!this.getConfig().disableIncomingRequestInstrumentation) {\n this._wrap(\n moduleExports.Server.prototype,\n 'emit',\n this._getPatchIncomingRequestFunction('https')\n );\n }\n return moduleExports;\n },\n (moduleExports: Https) => {\n if (moduleExports === undefined) return;\n\n if (!this.getConfig().disableOutgoingRequestInstrumentation) {\n this._unwrap(moduleExports, 'request');\n this._unwrap(moduleExports, 'get');\n }\n if (!this.getConfig().disableIncomingRequestInstrumentation) {\n this._unwrap(moduleExports.Server.prototype, 'emit');\n }\n }\n );\n }\n\n /**\n * Creates spans for incoming requests, restoring spans' context if applied.\n */\n private _getPatchIncomingRequestFunction(component: 'http' | 'https') {\n return (\n original: (event: string, ...args: unknown[]) => boolean\n ): ((this: unknown, event: string, ...args: unknown[]) => boolean) => {\n return this._incomingRequestFunction(component, original);\n };\n }\n\n /**\n * Creates spans for outgoing requests, sending spans' context for distributed\n * tracing.\n */\n private _getPatchOutgoingRequestFunction(component: 'http' | 'https') {\n return (original: Func<http.ClientRequest>): Func<http.ClientRequest> => {\n return this._outgoingRequestFunction(component, original);\n };\n }\n\n private _getPatchOutgoingGetFunction(\n clientRequest: (\n options: http.RequestOptions | string | url.URL,\n ...args: HttpRequestArgs\n ) => http.ClientRequest\n ) {\n return (_original: Func<http.ClientRequest>): Func<http.ClientRequest> => {\n // Re-implement http.get. This needs to be done (instead of using\n // getPatchOutgoingRequestFunction to patch it) because we need to\n // set the trace context header before the returned http.ClientRequest is\n // ended. The Node.js docs state that the only differences between\n // request and get are that (1) get defaults to the HTTP GET method and\n // (2) the returned request object is ended immediately. The former is\n // already true (at least in supported Node versions up to v10), so we\n // simply follow the latter. Ref:\n // https://nodejs.org/dist/latest/docs/api/http.html#http_http_get_options_callback\n // https://github.com/googleapis/cloud-trace-nodejs/blob/master/src/instrumentations/instrumentation-http.ts#L198\n return function outgoingGetRequest<\n T extends http.RequestOptions | string | url.URL,\n >(options: T, ...args: HttpRequestArgs): http.ClientRequest {\n const req = clientRequest(options, ...args);\n req.end();\n return req;\n };\n };\n }\n\n /** Patches HTTPS outgoing requests */\n private _getPatchHttpsOutgoingRequestFunction(component: 'http' | 'https') {\n return (original: Func<http.ClientRequest>): Func<http.ClientRequest> => {\n const instrumentation = this;\n return function httpsOutgoingRequest(\n // eslint-disable-next-line node/no-unsupported-features/node-builtins\n options: https.RequestOptions | string | URL,\n ...args: HttpRequestArgs\n ): http.ClientRequest {\n // Makes sure options will have default HTTPS parameters\n if (\n component === 'https' &&\n typeof options === 'object' &&\n options?.constructor?.name !== 'URL'\n ) {\n options = Object.assign({}, options);\n instrumentation._setDefaultOptions(options);\n }\n return instrumentation._getPatchOutgoingRequestFunction(component)(\n original\n )(options, ...args);\n };\n };\n }\n\n private _setDefaultOptions(options: https.RequestOptions) {\n options.protocol = options.protocol || 'https:';\n options.port = options.port || 443;\n }\n\n /** Patches HTTPS outgoing get requests */\n private _getPatchHttpsOutgoingGetFunction(\n clientRequest: (\n // eslint-disable-next-line node/no-unsupported-features/node-builtins\n options: http.RequestOptions | string | URL,\n ...args: HttpRequestArgs\n ) => http.ClientRequest\n ) {\n return (original: Func<http.ClientRequest>): Func<http.ClientRequest> => {\n const instrumentation = this;\n return function httpsOutgoingRequest(\n // eslint-disable-next-line node/no-unsupported-features/node-builtins\n options: https.RequestOptions | string | URL,\n ...args: HttpRequestArgs\n ): http.ClientRequest {\n return instrumentation._getPatchOutgoingGetFunction(clientRequest)(\n original\n )(options, ...args);\n };\n };\n }\n\n /**\n * Attach event listeners to a client request to end span and add span attributes.\n *\n * @param request The original request object.\n * @param span representing the current operation\n * @param startTime representing the start time of the request to calculate duration in Metric\n * @param oldMetricAttributes metric attributes for old semantic conventions\n * @param stableMetricAttributes metric attributes for new semantic conventions\n */\n private _traceClientRequest(\n request: http.ClientRequest,\n span: Span,\n startTime: HrTime,\n oldMetricAttributes: Attributes,\n stableMetricAttributes: Attributes\n ): http.ClientRequest {\n if (this.getConfig().requestHook) {\n this._callRequestHook(span, request);\n }\n\n /**\n * Determines if the request has errored or the response has ended/errored.\n */\n let responseFinished = false;\n\n /*\n * User 'response' event listeners can be added before our listener,\n * force our listener to be the first, so response emitter is bound\n * before any user listeners are added to it.\n */\n request.prependListener(\n 'response',\n (response: http.IncomingMessage & { aborted?: boolean }) => {\n this._diag.debug('outgoingRequest on response()');\n if (request.listenerCount('response') <= 1) {\n response.resume();\n }\n const responseAttributes = getOutgoingRequestAttributesOnResponse(\n response,\n this._semconvStability\n );\n span.setAttributes(responseAttributes);\n oldMetricAttributes = Object.assign(\n oldMetricAttributes,\n getOutgoingRequestMetricAttributesOnResponse(responseAttributes)\n );\n stableMetricAttributes = Object.assign(\n stableMetricAttributes,\n getOutgoingStableRequestMetricAttributesOnResponse(responseAttributes)\n );\n\n if (this.getConfig().responseHook) {\n this._callResponseHook(span, response);\n }\n\n this._headerCapture.client.captureRequestHeaders(span, header =>\n request.getHeader(header)\n );\n this._headerCapture.client.captureResponseHeaders(\n span,\n header => response.headers[header]\n );\n\n context.bind(context.active(), response);\n\n const endHandler = () => {\n this._diag.debug('outgoingRequest on end()');\n if (responseFinished) {\n return;\n }\n responseFinished = true;\n let status: SpanStatus;\n\n if (response.aborted && !response.complete) {\n status = { code: SpanStatusCode.ERROR };\n } else {\n // behaves same for new and old semconv\n status = {\n code: parseResponseStatus(SpanKind.CLIENT, response.statusCode),\n };\n }\n\n span.setStatus(status);\n\n if (this.getConfig().applyCustomAttributesOnSpan) {\n safeExecuteInTheMiddle(\n () =>\n this.getConfig().applyCustomAttributesOnSpan!(\n span,\n request,\n response\n ),\n () => {},\n true\n );\n }\n\n this._closeHttpSpan(\n span,\n SpanKind.CLIENT,\n startTime,\n oldMetricAttributes,\n stableMetricAttributes\n );\n };\n\n response.on('end', endHandler);\n response.on(errorMonitor, (error: Err) => {\n this._diag.debug('outgoingRequest on error()', error);\n if (responseFinished) {\n return;\n }\n responseFinished = true;\n setSpanWithError(span, error, this._semconvStability);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error.message,\n });\n this._closeHttpSpan(\n span,\n SpanKind.CLIENT,\n startTime,\n oldMetricAttributes,\n stableMetricAttributes\n );\n });\n }\n );\n request.on('close', () => {\n this._diag.debug('outgoingRequest on request close()');\n if (request.aborted || responseFinished) {\n return;\n }\n responseFinished = true;\n this._closeHttpSpan(\n span,\n SpanKind.CLIENT,\n startTime,\n oldMetricAttributes,\n stableMetricAttributes\n );\n });\n request.on(errorMonitor, (error: Err) => {\n this._diag.debug('outgoingRequest on request error()', error);\n if (responseFinished) {\n return;\n }\n responseFinished = true;\n setSpanWithError(span, error, this._semconvStability);\n\n this._closeHttpSpan(\n span,\n SpanKind.CLIENT,\n startTime,\n oldMetricAttributes,\n stableMetricAttributes\n );\n });\n\n this._diag.debug('http.ClientRequest return request');\n return request;\n }\n\n private _incomingRequestFunction(\n component: 'http' | 'https',\n original: (event: string, ...args: unknown[]) => boolean\n ) {\n const instrumentation = this;\n return function incomingRequest(\n this: unknown,\n event: string,\n ...args: unknown[]\n ): boolean {\n // Only traces request events\n if (event !== 'request') {\n return original.apply(this, [event, ...args]);\n }\n\n const request = args[0] as http.IncomingMessage;\n const response = args[1] as http.ServerResponse & { socket: Socket };\n const method = request.method || 'GET';\n\n instrumentation._diag.debug(\n `${component} instrumentation incomingRequest`\n );\n\n if (\n safeExecuteInTheMiddle(\n () =>\n instrumentation.getConfig().ignoreIncomingRequestHook?.(request),\n (e: unknown) => {\n if (e != null) {\n instrumentation._diag.error(\n 'caught ignoreIncomingRequestHook error: ',\n e\n );\n }\n },\n true\n )\n ) {\n return context.with(suppressTracing(context.active()), () => {\n context.bind(context.active(), request);\n context.bind(context.active(), response);\n return original.apply(this, [event, ...args]);\n });\n }\n\n const headers = request.headers;\n\n const spanAttributes = getIncomingRequestAttributes(\n request,\n {\n component: component,\n serverName: instrumentation.getConfig().serverName,\n hookAttributes: instrumentation._callStartSpanHook(\n request,\n instrumentation.getConfig().startIncomingSpanHook\n ),\n semconvStability: instrumentation._semconvStability,\n enableSyntheticSourceDetection:\n instrumentation.getConfig().enableSyntheticSourceDetection || false,\n },\n instrumentation._diag\n );\n\n const spanOptions: SpanOptions = {\n kind: SpanKind.SERVER,\n attributes: spanAttributes,\n };\n\n const startTime = hrTime();\n const oldMetricAttributes =\n getIncomingRequestMetricAttributes(spanAttributes);\n\n // request method and url.scheme are both required span attributes\n const stableMetricAttributes: Attributes = {\n [ATTR_HTTP_REQUEST_METHOD]: spanAttributes[ATTR_HTTP_REQUEST_METHOD],\n [ATTR_URL_SCHEME]: spanAttributes[ATTR_URL_SCHEME],\n };\n\n // recommended if and only if one was sent, same as span recommendation\n if (spanAttributes[ATTR_NETWORK_PROTOCOL_VERSION]) {\n stableMetricAttributes[ATTR_NETWORK_PROTOCOL_VERSION] =\n spanAttributes[ATTR_NETWORK_PROTOCOL_VERSION];\n }\n\n const ctx = propagation.extract(ROOT_CONTEXT, headers);\n const span = instrumentation._startHttpSpan(method, spanOptions, ctx);\n const rpcMetadata: RPCMetadata = {\n type: RPCType.HTTP,\n span,\n };\n\n return context.with(\n setRPCMetadata(trace.setSpan(ctx, span), rpcMetadata),\n () => {\n context.bind(context.active(), request);\n context.bind(context.active(), response);\n\n if (instrumentation.getConfig().requestHook) {\n instrumentation._callRequestHook(span, request);\n }\n if (instrumentation.getConfig().responseHook) {\n instrumentation._callResponseHook(span, response);\n }\n\n instrumentation._headerCapture.server.captureRequestHeaders(\n span,\n header => request.headers[header]\n );\n\n // After 'error', no further events other than 'close' should be emitted.\n let hasError = false;\n response.on('close', () => {\n if (hasError) {\n return;\n }\n instrumentation._onServerResponseFinish(\n request,\n response,\n span,\n oldMetricAttributes,\n stableMetricAttributes,\n startTime\n );\n });\n response.on(errorMonitor, (err: Err) => {\n hasError = true;\n instrumentation._onServerResponseError(\n span,\n oldMetricAttributes,\n stableMetricAttributes,\n startTime,\n err\n );\n });\n\n return safeExecuteInTheMiddle(\n () => original.apply(this, [event, ...args]),\n error => {\n if (error) {\n setSpanWithError(\n span,\n error,\n instrumentation._semconvStability\n );\n instrumentation._closeHttpSpan(\n span,\n SpanKind.SERVER,\n startTime,\n oldMetricAttributes,\n stableMetricAttributes\n );\n throw error;\n }\n }\n );\n }\n );\n };\n }\n\n private _outgoingRequestFunction(\n component: 'http' | 'https',\n original: Func<http.ClientRequest>\n ): Func<http.ClientRequest> {\n const instrumentation = this;\n return function outgoingRequest(\n this: unknown,\n options: url.URL | http.RequestOptions | string,\n ...args: unknown[]\n ): http.ClientRequest {\n if (!isValidOptionsType(options)) {\n return original.apply(this, [options, ...args]);\n }\n const extraOptions =\n typeof args[0] === 'object' &&\n (typeof options === 'string' || options instanceof url.URL)\n ? (args.shift() as http.RequestOptions)\n : undefined;\n const { method, invalidUrl, optionsParsed } = getRequestInfo(\n instrumentation._diag,\n options,\n extraOptions\n );\n\n if (\n safeExecuteInTheMiddle(\n () =>\n instrumentation\n .getConfig()\n .ignoreOutgoingRequestHook?.(optionsParsed),\n (e: unknown) => {\n if (e != null) {\n instrumentation._diag.error(\n 'caught ignoreOutgoingRequestHook error: ',\n e\n );\n }\n },\n true\n )\n ) {\n return original.apply(this, [optionsParsed, ...args]);\n }\n\n const { hostname, port } = extractHostnameAndPort(optionsParsed);\n const attributes = getOutgoingRequestAttributes(\n optionsParsed,\n {\n component,\n port,\n hostname,\n hookAttributes: instrumentation._callStartSpanHook(\n optionsParsed,\n instrumentation.getConfig().startOutgoingSpanHook\n ),\n },\n instrumentation._semconvStability,\n instrumentation.getConfig().enableSyntheticSourceDetection || false\n );\n\n const startTime = hrTime();\n const oldMetricAttributes: Attributes =\n getOutgoingRequestMetricAttributes(attributes);\n\n // request method, server address, and server port are both required span attributes\n const stableMetricAttributes: Attributes = {\n [ATTR_HTTP_REQUEST_METHOD]: attributes[ATTR_HTTP_REQUEST_METHOD],\n [ATTR_SERVER_ADDRESS]: attributes[ATTR_SERVER_ADDRESS],\n [ATTR_SERVER_PORT]: attributes[ATTR_SERVER_PORT],\n };\n\n // required if and only if one was sent, same as span requirement\n if (attributes[ATTR_HTTP_RESPONSE_STATUS_CODE]) {\n stableMetricAttributes[ATTR_HTTP_RESPONSE_STATUS_CODE] =\n attributes[ATTR_HTTP_RESPONSE_STATUS_CODE];\n }\n\n // recommended if and only if one was sent, same as span recommendation\n if (attributes[ATTR_NETWORK_PROTOCOL_VERSION]) {\n stableMetricAttributes[ATTR_NETWORK_PROTOCOL_VERSION] =\n attributes[ATTR_NETWORK_PROTOCOL_VERSION];\n }\n\n const spanOptions: SpanOptions = {\n kind: SpanKind.CLIENT,\n attributes,\n };\n const span = instrumentation._startHttpSpan(method, spanOptions);\n\n const parentContext = context.active();\n const requestContext = trace.setSpan(parentContext, span);\n\n if (!optionsParsed.headers) {\n optionsParsed.headers = {};\n } else {\n // Make a copy of the headers object to avoid mutating an object the\n // caller might have a reference to.\n optionsParsed.headers = Object.assign({}, optionsParsed.headers);\n }\n propagation.inject(requestContext, optionsParsed.headers);\n\n return context.with(requestContext, () => {\n /*\n * The response callback is registered before ClientRequest is bound,\n * thus it is needed to bind it before the function call.\n */\n const cb = args[args.length - 1];\n if (typeof cb === 'function') {\n args[args.length - 1] = context.bind(parentContext, cb);\n }\n\n const request: http.ClientRequest = safeExecuteInTheMiddle(\n () => {\n if (invalidUrl) {\n // we know that the url is invalid, there's no point in injecting context as it will fail validation.\n // Passing in what the user provided will give the user an error that matches what they'd see without\n // the instrumentation.\n return original.apply(this, [options, ...args]);\n } else {\n return original.apply(this, [optionsParsed, ...args]);\n }\n },\n error => {\n if (error) {\n setSpanWithError(span, error, instrumentation._semconvStability);\n\n instrumentation._closeHttpSpan(\n span,\n SpanKind.CLIENT,\n startTime,\n oldMetricAttributes,\n stableMetricAttributes\n );\n throw error;\n }\n }\n );\n\n instrumentation._diag.debug(\n `${component} instrumentation outgoingRequest`\n );\n context.bind(parentContext, request);\n return instrumentation._traceClientRequest(\n request,\n span,\n startTime,\n oldMetricAttributes,\n stableMetricAttributes\n );\n });\n };\n }\n\n private _onServerResponseFinish(\n request: http.IncomingMessage,\n response: http.ServerResponse,\n span: Span,\n oldMetricAttributes: Attributes,\n stableMetricAttributes: Attributes,\n startTime: HrTime\n ) {\n const attributes = getIncomingRequestAttributesOnResponse(\n request,\n response,\n this._semconvStability\n );\n oldMetricAttributes = Object.assign(\n oldMetricAttributes,\n getIncomingRequestMetricAttributesOnResponse(attributes)\n );\n stableMetricAttributes = Object.assign(\n stableMetricAttributes,\n getIncomingStableRequestMetricAttributesOnResponse(attributes)\n );\n\n this._headerCapture.server.captureResponseHeaders(span, header =>\n response.getHeader(header)\n );\n\n span.setAttributes(attributes).setStatus({\n code: parseResponseStatus(SpanKind.SERVER, response.statusCode),\n });\n\n const route = attributes[ATTR_HTTP_ROUTE];\n if (route) {\n span.updateName(`${request.method || 'GET'} ${route}`);\n }\n\n if (this.getConfig().applyCustomAttributesOnSpan) {\n safeExecuteInTheMiddle(\n () =>\n this.getConfig().applyCustomAttributesOnSpan!(\n span,\n request,\n response\n ),\n () => {},\n true\n );\n }\n\n this._closeHttpSpan(\n span,\n SpanKind.SERVER,\n startTime,\n oldMetricAttributes,\n stableMetricAttributes\n );\n }\n\n private _onServerResponseError(\n span: Span,\n oldMetricAttributes: Attributes,\n stableMetricAttributes: Attributes,\n startTime: HrTime,\n error: Err\n ) {\n setSpanWithError(span, error, this._semconvStability);\n // TODO get error attributes for metrics\n this._closeHttpSpan(\n span,\n SpanKind.SERVER,\n startTime,\n oldMetricAttributes,\n stableMetricAttributes\n );\n }\n\n private _startHttpSpan(\n name: string,\n options: SpanOptions,\n ctx = context.active()\n ) {\n /*\n * If a parent is required but not present, we use a `NoopSpan` to still\n * propagate context without recording it.\n */\n const requireParent =\n options.kind === SpanKind.CLIENT\n ? this.getConfig().requireParentforOutgoingSpans\n : this.getConfig().requireParentforIncomingSpans;\n\n let span: Span;\n const currentSpan = trace.getSpan(ctx);\n\n if (requireParent === true && currentSpan === undefined) {\n span = trace.wrapSpanContext(INVALID_SPAN_CONTEXT);\n } else if (requireParent === true && currentSpan?.spanContext().isRemote) {\n span = currentSpan;\n } else {\n span = this.tracer.startSpan(name, options, ctx);\n }\n this._spanNotEnded.add(span);\n return span;\n }\n\n private _closeHttpSpan(\n span: Span,\n spanKind: SpanKind,\n startTime: HrTime,\n oldMetricAttributes: Attributes,\n stableMetricAttributes: Attributes\n ) {\n if (!this._spanNotEnded.has(span)) {\n return;\n }\n\n span.end();\n this._spanNotEnded.delete(span);\n\n // Record metrics\n const duration = hrTimeToMilliseconds(hrTimeDuration(startTime, hrTime()));\n if (spanKind === SpanKind.SERVER) {\n this._recordServerDuration(\n duration,\n oldMetricAttributes,\n stableMetricAttributes\n );\n } else if (spanKind === SpanKind.CLIENT) {\n this._recordClientDuration(\n duration,\n oldMetricAttributes,\n stableMetricAttributes\n );\n }\n }\n\n private _callResponseHook(\n span: Span,\n response: http.IncomingMessage | http.ServerResponse\n ) {\n safeExecuteInTheMiddle(\n () => this.getConfig().responseHook!(span, response),\n () => {},\n true\n );\n }\n\n private _callRequestHook(\n span: Span,\n request: http.ClientRequest | http.IncomingMessage\n ) {\n safeExecuteInTheMiddle(\n () => this.getConfig().requestHook!(span, request),\n () => {},\n true\n );\n }\n\n private _callStartSpanHook(\n request: http.IncomingMessage | http.RequestOptions,\n hookFunc: Function | undefined\n ) {\n if (typeof hookFunc === 'function') {\n return safeExecuteInTheMiddle(\n () => hookFunc(request),\n () => {},\n true\n );\n }\n }\n\n private _createHeaderCapture() {\n const config = this.getConfig();\n\n return {\n client: {\n captureRequestHeaders: headerCapture(\n 'request',\n config.headersToSpanAttributes?.client?.requestHeaders ?? []\n ),\n captureResponseHeaders: headerCapture(\n 'response',\n config.headersToSpanAttributes?.client?.responseHeaders ?? []\n ),\n },\n server: {\n captureRequestHeaders: headerCapture(\n 'request',\n config.headersToSpanAttributes?.server?.requestHeaders ?? []\n ),\n captureResponseHeaders: headerCapture(\n 'response',\n config.headersToSpanAttributes?.server?.responseHeaders ?? []\n ),\n },\n };\n }\n}\n"]}
@@ -1,3 +1,3 @@
1
1
  export { HttpInstrumentation } from './http';
2
- export { HttpCustomAttributeFunction, HttpInstrumentationConfig, HttpRequestCustomAttributeFunction, HttpResponseCustomAttributeFunction, IgnoreIncomingRequestFunction, IgnoreOutgoingRequestFunction, StartIncomingSpanCustomAttributeFunction, StartOutgoingSpanCustomAttributeFunction, } from './types';
2
+ export type { HttpCustomAttributeFunction, HttpInstrumentationConfig, HttpRequestCustomAttributeFunction, HttpResponseCustomAttributeFunction, IgnoreIncomingRequestFunction, IgnoreOutgoingRequestFunction, StartIncomingSpanCustomAttributeFunction, StartOutgoingSpanCustomAttributeFunction, } from './types';
3
3
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;GAcG;;;AAEH,+BAA6C;AAApC,2GAAA,mBAAmB,OAAA","sourcesContent":["/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nexport { HttpInstrumentation } from './http';\nexport {\n HttpCustomAttributeFunction,\n HttpInstrumentationConfig,\n HttpRequestCustomAttributeFunction,\n HttpResponseCustomAttributeFunction,\n IgnoreIncomingRequestFunction,\n IgnoreOutgoingRequestFunction,\n StartIncomingSpanCustomAttributeFunction,\n StartOutgoingSpanCustomAttributeFunction,\n} from './types';\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;GAcG;;;AAEH,+BAA6C;AAApC,2GAAA,mBAAmB,OAAA","sourcesContent":["/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nexport { HttpInstrumentation } from './http';\nexport type {\n HttpCustomAttributeFunction,\n HttpInstrumentationConfig,\n HttpRequestCustomAttributeFunction,\n HttpResponseCustomAttributeFunction,\n IgnoreIncomingRequestFunction,\n IgnoreOutgoingRequestFunction,\n StartIncomingSpanCustomAttributeFunction,\n StartOutgoingSpanCustomAttributeFunction,\n} from './types';\n"]}
@@ -24,7 +24,7 @@ export interface StartOutgoingSpanCustomAttributeFunction {
24
24
  (request: RequestOptions): Attributes;
25
25
  }
26
26
  /**
27
- * Options available for the HTTP instrumentation (see [documentation](https://github.com/open-telemetry/opentelemetry-js/tree/main/packages/opentelemetry-instrumentation-http#http-instrumentation-options))
27
+ * Options available for the HTTP instrumentation (see [documentation](https://github.com/open-telemetry/opentelemetry-js/tree/main/experimental/packages/opentelemetry-instrumentation-http#http-instrumentation-options))
28
28
  */
29
29
  export interface HttpInstrumentationConfig extends InstrumentationConfig {
30
30
  /** Not trace all incoming requests that matched with custom function */
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"","sourcesContent":["/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { Span, Attributes } from '@opentelemetry/api';\nimport {\n ClientRequest,\n IncomingMessage,\n ServerResponse,\n RequestOptions,\n} from 'http';\nimport { InstrumentationConfig } from '@opentelemetry/instrumentation';\n\nexport interface HttpCustomAttributeFunction {\n (\n span: Span,\n request: ClientRequest | IncomingMessage,\n response: IncomingMessage | ServerResponse\n ): void;\n}\n\nexport interface IgnoreIncomingRequestFunction {\n (request: IncomingMessage): boolean;\n}\n\nexport interface IgnoreOutgoingRequestFunction {\n (request: RequestOptions): boolean;\n}\n\nexport interface HttpRequestCustomAttributeFunction {\n (span: Span, request: ClientRequest | IncomingMessage): void;\n}\n\nexport interface HttpResponseCustomAttributeFunction {\n (span: Span, response: IncomingMessage | ServerResponse): void;\n}\n\nexport interface StartIncomingSpanCustomAttributeFunction {\n (request: IncomingMessage): Attributes;\n}\n\nexport interface StartOutgoingSpanCustomAttributeFunction {\n (request: RequestOptions): Attributes;\n}\n\n/**\n * Options available for the HTTP instrumentation (see [documentation](https://github.com/open-telemetry/opentelemetry-js/tree/main/packages/opentelemetry-instrumentation-http#http-instrumentation-options))\n */\nexport interface HttpInstrumentationConfig extends InstrumentationConfig {\n /** Not trace all incoming requests that matched with custom function */\n ignoreIncomingRequestHook?: IgnoreIncomingRequestFunction;\n /** Not trace all outgoing requests that matched with custom function */\n ignoreOutgoingRequestHook?: IgnoreOutgoingRequestFunction;\n /** If set to true, incoming requests will not be instrumented at all. */\n disableIncomingRequestInstrumentation?: boolean;\n /** If set to true, outgoing requests will not be instrumented at all. */\n disableOutgoingRequestInstrumentation?: boolean;\n /** Function for adding custom attributes after response is handled */\n applyCustomAttributesOnSpan?: HttpCustomAttributeFunction;\n /** Function for adding custom attributes before request is handled */\n requestHook?: HttpRequestCustomAttributeFunction;\n /** Function for adding custom attributes before response is handled */\n responseHook?: HttpResponseCustomAttributeFunction;\n /** Function for adding custom attributes before a span is started in incomingRequest */\n startIncomingSpanHook?: StartIncomingSpanCustomAttributeFunction;\n /** Function for adding custom attributes before a span is started in outgoingRequest */\n startOutgoingSpanHook?: StartOutgoingSpanCustomAttributeFunction;\n /** The primary server name of the matched virtual host. */\n serverName?: string;\n /** Require parent to create span for outgoing requests */\n requireParentforOutgoingSpans?: boolean;\n /** Require parent to create span for incoming requests */\n requireParentforIncomingSpans?: boolean;\n /** Map the following HTTP headers to span attributes. */\n headersToSpanAttributes?: {\n client?: { requestHeaders?: string[]; responseHeaders?: string[] };\n server?: { requestHeaders?: string[]; responseHeaders?: string[] };\n };\n /**\n * Enable automatic population of synthetic source type based on the user-agent header\n * @experimental\n **/\n enableSyntheticSourceDetection?: boolean;\n}\n"]}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"","sourcesContent":["/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { Span, Attributes } from '@opentelemetry/api';\nimport {\n ClientRequest,\n IncomingMessage,\n ServerResponse,\n RequestOptions,\n} from 'http';\nimport { InstrumentationConfig } from '@opentelemetry/instrumentation';\n\nexport interface HttpCustomAttributeFunction {\n (\n span: Span,\n request: ClientRequest | IncomingMessage,\n response: IncomingMessage | ServerResponse\n ): void;\n}\n\nexport interface IgnoreIncomingRequestFunction {\n (request: IncomingMessage): boolean;\n}\n\nexport interface IgnoreOutgoingRequestFunction {\n (request: RequestOptions): boolean;\n}\n\nexport interface HttpRequestCustomAttributeFunction {\n (span: Span, request: ClientRequest | IncomingMessage): void;\n}\n\nexport interface HttpResponseCustomAttributeFunction {\n (span: Span, response: IncomingMessage | ServerResponse): void;\n}\n\nexport interface StartIncomingSpanCustomAttributeFunction {\n (request: IncomingMessage): Attributes;\n}\n\nexport interface StartOutgoingSpanCustomAttributeFunction {\n (request: RequestOptions): Attributes;\n}\n\n/**\n * Options available for the HTTP instrumentation (see [documentation](https://github.com/open-telemetry/opentelemetry-js/tree/main/experimental/packages/opentelemetry-instrumentation-http#http-instrumentation-options))\n */\nexport interface HttpInstrumentationConfig extends InstrumentationConfig {\n /** Not trace all incoming requests that matched with custom function */\n ignoreIncomingRequestHook?: IgnoreIncomingRequestFunction;\n /** Not trace all outgoing requests that matched with custom function */\n ignoreOutgoingRequestHook?: IgnoreOutgoingRequestFunction;\n /** If set to true, incoming requests will not be instrumented at all. */\n disableIncomingRequestInstrumentation?: boolean;\n /** If set to true, outgoing requests will not be instrumented at all. */\n disableOutgoingRequestInstrumentation?: boolean;\n /** Function for adding custom attributes after response is handled */\n applyCustomAttributesOnSpan?: HttpCustomAttributeFunction;\n /** Function for adding custom attributes before request is handled */\n requestHook?: HttpRequestCustomAttributeFunction;\n /** Function for adding custom attributes before response is handled */\n responseHook?: HttpResponseCustomAttributeFunction;\n /** Function for adding custom attributes before a span is started in incomingRequest */\n startIncomingSpanHook?: StartIncomingSpanCustomAttributeFunction;\n /** Function for adding custom attributes before a span is started in outgoingRequest */\n startOutgoingSpanHook?: StartOutgoingSpanCustomAttributeFunction;\n /** The primary server name of the matched virtual host. */\n serverName?: string;\n /** Require parent to create span for outgoing requests */\n requireParentforOutgoingSpans?: boolean;\n /** Require parent to create span for incoming requests */\n requireParentforIncomingSpans?: boolean;\n /** Map the following HTTP headers to span attributes. */\n headersToSpanAttributes?: {\n client?: { requestHeaders?: string[]; responseHeaders?: string[] };\n server?: { requestHeaders?: string[]; responseHeaders?: string[] };\n };\n /**\n * Enable automatic population of synthetic source type based on the user-agent header\n * @experimental\n **/\n enableSyntheticSourceDetection?: boolean;\n}\n"]}
@@ -24,6 +24,7 @@ const instrumentation_1 = require("@opentelemetry/instrumentation");
24
24
  const url = require("url");
25
25
  const AttributeNames_1 = require("./enums/AttributeNames");
26
26
  const internal_types_1 = require("./internal-types");
27
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
27
28
  const forwardedParse = require("forwarded-parse");
28
29
  /**
29
30
  * Get an absolute url
@@ -246,7 +247,7 @@ const getRequestInfo = (logger, options, extraOptions) => {
246
247
  const parsedUrl = new URL(optionsParsed.path, origin);
247
248
  pathname = parsedUrl.pathname || '/';
248
249
  }
249
- catch (e) {
250
+ catch {
250
251
  pathname = '/';
251
252
  }
252
253
  }
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport {\n Attributes,\n SpanStatusCode,\n Span,\n context,\n SpanKind,\n DiagLogger,\n AttributeValue,\n} from '@opentelemetry/api';\nimport {\n ATTR_CLIENT_ADDRESS,\n ATTR_ERROR_TYPE,\n ATTR_HTTP_REQUEST_METHOD,\n ATTR_HTTP_REQUEST_METHOD_ORIGINAL,\n ATTR_HTTP_RESPONSE_STATUS_CODE,\n ATTR_HTTP_ROUTE,\n ATTR_NETWORK_PEER_ADDRESS,\n ATTR_NETWORK_PEER_PORT,\n ATTR_NETWORK_PROTOCOL_VERSION,\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} from '@opentelemetry/semantic-conventions';\nimport {\n ATTR_HTTP_CLIENT_IP,\n ATTR_HTTP_FLAVOR,\n ATTR_HTTP_HOST,\n ATTR_HTTP_METHOD,\n ATTR_HTTP_REQUEST_CONTENT_LENGTH,\n ATTR_HTTP_REQUEST_CONTENT_LENGTH_UNCOMPRESSED,\n ATTR_HTTP_RESPONSE_CONTENT_LENGTH,\n ATTR_HTTP_RESPONSE_CONTENT_LENGTH_UNCOMPRESSED,\n ATTR_HTTP_SCHEME,\n ATTR_HTTP_SERVER_NAME,\n ATTR_HTTP_STATUS_CODE,\n ATTR_HTTP_TARGET,\n ATTR_HTTP_URL,\n ATTR_HTTP_USER_AGENT,\n ATTR_NET_HOST_IP,\n ATTR_NET_HOST_NAME,\n ATTR_NET_HOST_PORT,\n ATTR_NET_PEER_IP,\n ATTR_NET_PEER_NAME,\n ATTR_NET_PEER_PORT,\n ATTR_NET_TRANSPORT,\n NET_TRANSPORT_VALUE_IP_TCP,\n NET_TRANSPORT_VALUE_IP_UDP,\n ATTR_USER_AGENT_SYNTHETIC_TYPE,\n USER_AGENT_SYNTHETIC_TYPE_VALUE_BOT,\n USER_AGENT_SYNTHETIC_TYPE_VALUE_TEST,\n} from './semconv';\nimport {\n IncomingHttpHeaders,\n IncomingMessage,\n OutgoingHttpHeader,\n OutgoingHttpHeaders,\n RequestOptions,\n ServerResponse,\n} from 'http';\nimport { getRPCMetadata, RPCType } from '@opentelemetry/core';\nimport { SemconvStability } from '@opentelemetry/instrumentation';\nimport * as url from 'url';\nimport { AttributeNames } from './enums/AttributeNames';\nimport { Err, IgnoreMatcher, ParsedRequestOptions } from './internal-types';\nimport { SYNTHETIC_BOT_NAMES, SYNTHETIC_TEST_NAMES } from './internal-types';\nimport forwardedParse = require('forwarded-parse');\n\n/**\n * Get an absolute url\n */\nexport const getAbsoluteUrl = (\n requestUrl: ParsedRequestOptions | null,\n headers: IncomingHttpHeaders | OutgoingHttpHeaders,\n fallbackProtocol = 'http:'\n): string => {\n const reqUrlObject = requestUrl || {};\n const protocol = reqUrlObject.protocol || fallbackProtocol;\n const port = (reqUrlObject.port || '').toString();\n const path = reqUrlObject.path || '/';\n let host =\n reqUrlObject.host || reqUrlObject.hostname || headers.host || 'localhost';\n\n // if there is no port in host and there is a port\n // it should be displayed if it's not 80 and 443 (default ports)\n if (\n (host as string).indexOf(':') === -1 &&\n port &&\n port !== '80' &&\n port !== '443'\n ) {\n host += `:${port}`;\n }\n\n return `${protocol}//${host}${path}`;\n};\n\n/**\n * Parse status code from HTTP response. [More details](https://github.com/open-telemetry/opentelemetry-specification/blob/master/specification/data-http.md#status)\n */\nexport const parseResponseStatus = (\n kind: SpanKind,\n statusCode?: number\n): SpanStatusCode => {\n const upperBound = kind === SpanKind.CLIENT ? 400 : 500;\n // 1xx, 2xx, 3xx are OK on client and server\n // 4xx is OK on server\n if (statusCode && statusCode >= 100 && statusCode < upperBound) {\n return SpanStatusCode.UNSET;\n }\n\n // All other codes are error\n return SpanStatusCode.ERROR;\n};\n\n/**\n * Check whether the given obj match pattern\n * @param constant e.g URL of request\n * @param pattern Match pattern\n */\nexport const satisfiesPattern = (\n constant: string,\n pattern: IgnoreMatcher\n): boolean => {\n if (typeof pattern === 'string') {\n return pattern === constant;\n } else if (pattern instanceof RegExp) {\n return pattern.test(constant);\n } else if (typeof pattern === 'function') {\n return pattern(constant);\n } else {\n throw new TypeError('Pattern is in unsupported datatype');\n }\n};\n\n/**\n * Sets the span with the error passed in params\n * @param {Span} span the span that need to be set\n * @param {Error} error error that will be set to span\n * @param {SemconvStability} semconvStability determines which semconv version to use\n */\nexport const setSpanWithError = (\n span: Span,\n error: Err,\n semconvStability: SemconvStability\n): void => {\n const message = error.message;\n\n if (semconvStability & SemconvStability.OLD) {\n span.setAttribute(AttributeNames.HTTP_ERROR_NAME, error.name);\n span.setAttribute(AttributeNames.HTTP_ERROR_MESSAGE, message);\n }\n\n if (semconvStability & SemconvStability.STABLE) {\n span.setAttribute(ATTR_ERROR_TYPE, error.name);\n }\n\n span.setStatus({ code: SpanStatusCode.ERROR, message });\n span.recordException(error);\n};\n/**\n * Adds attributes for request content-length and content-encoding HTTP headers\n * @param { IncomingMessage } Request object whose headers will be analyzed\n * @param { Attributes } Attributes object to be modified\n */\nexport const setRequestContentLengthAttribute = (\n request: IncomingMessage,\n attributes: Attributes\n): void => {\n const length = getContentLength(request.headers);\n if (length === null) return;\n\n if (isCompressed(request.headers)) {\n attributes[ATTR_HTTP_REQUEST_CONTENT_LENGTH] = length;\n } else {\n attributes[ATTR_HTTP_REQUEST_CONTENT_LENGTH_UNCOMPRESSED] = length;\n }\n};\n\n/**\n * Adds attributes for response content-length and content-encoding HTTP headers\n * @param { IncomingMessage } Response object whose headers will be analyzed\n * @param { Attributes } Attributes object to be modified\n *\n * @deprecated this is for an older version of semconv. It is retained for compatibility using OTEL_SEMCONV_STABILITY_OPT_IN\n */\nexport const setResponseContentLengthAttribute = (\n response: IncomingMessage,\n attributes: Attributes\n): void => {\n const length = getContentLength(response.headers);\n if (length === null) return;\n\n if (isCompressed(response.headers)) {\n attributes[ATTR_HTTP_RESPONSE_CONTENT_LENGTH] = length;\n } else {\n attributes[ATTR_HTTP_RESPONSE_CONTENT_LENGTH_UNCOMPRESSED] = length;\n }\n};\n\nfunction getContentLength(\n headers: OutgoingHttpHeaders | IncomingHttpHeaders\n): number | null {\n const contentLengthHeader = headers['content-length'];\n if (contentLengthHeader === undefined) return null;\n\n const contentLength = parseInt(contentLengthHeader as string, 10);\n if (isNaN(contentLength)) return null;\n\n return contentLength;\n}\n\nexport const isCompressed = (\n headers: OutgoingHttpHeaders | IncomingHttpHeaders\n): boolean => {\n const encoding = headers['content-encoding'];\n\n return !!encoding && encoding !== 'identity';\n};\n\n/**\n * Mimics Node.js conversion of URL strings to RequestOptions expected by\n * `http.request` and `https.request` APIs.\n *\n * See https://github.com/nodejs/node/blob/2505e217bba05fc581b572c685c5cf280a16c5a3/lib/internal/url.js#L1415-L1437\n *\n * @param stringUrl\n * @throws TypeError if the URL is not valid.\n */\nfunction stringUrlToHttpOptions(\n stringUrl: string\n): RequestOptions & { pathname: string } {\n // This is heavily inspired by Node.js handling of the same situation, trying\n // to follow it as closely as possible while keeping in mind that we only\n // deal with string URLs, not URL objects.\n const {\n hostname,\n pathname,\n port,\n username,\n password,\n search,\n protocol,\n hash,\n href,\n origin,\n host,\n } = new URL(stringUrl);\n\n const options: RequestOptions & {\n pathname: string;\n hash: string;\n search: string;\n href: string;\n origin: string;\n } = {\n protocol: protocol,\n hostname:\n hostname && hostname[0] === '[' ? hostname.slice(1, -1) : hostname,\n hash: hash,\n search: search,\n pathname: pathname,\n path: `${pathname || ''}${search || ''}`,\n href: href,\n origin: origin,\n host: host,\n };\n if (port !== '') {\n options.port = Number(port);\n }\n if (username || password) {\n options.auth = `${decodeURIComponent(username)}:${decodeURIComponent(\n password\n )}`;\n }\n return options;\n}\n\n/**\n * Makes sure options is an url object\n * return an object with default value and parsed options\n * @param logger component logger\n * @param options original options for the request\n * @param [extraOptions] additional options for the request\n */\nexport const getRequestInfo = (\n logger: DiagLogger,\n options: url.URL | RequestOptions | string,\n extraOptions?: RequestOptions\n): {\n origin: string;\n pathname: string;\n method: string;\n invalidUrl: boolean;\n optionsParsed: RequestOptions;\n} => {\n let pathname: string;\n let origin: string;\n let optionsParsed: RequestOptions;\n let invalidUrl = false;\n if (typeof options === 'string') {\n try {\n const convertedOptions = stringUrlToHttpOptions(options);\n optionsParsed = convertedOptions;\n pathname = convertedOptions.pathname || '/';\n } catch (e) {\n invalidUrl = true;\n logger.verbose(\n 'Unable to parse URL provided to HTTP request, using fallback to determine path. Original error:',\n e\n );\n // for backward compatibility with how url.parse() behaved.\n optionsParsed = {\n path: options,\n };\n pathname = optionsParsed.path || '/';\n }\n\n origin = `${optionsParsed.protocol || 'http:'}//${optionsParsed.host}`;\n if (extraOptions !== undefined) {\n Object.assign(optionsParsed, extraOptions);\n }\n } else if (options instanceof url.URL) {\n optionsParsed = {\n protocol: options.protocol,\n hostname:\n typeof options.hostname === 'string' && options.hostname.startsWith('[')\n ? options.hostname.slice(1, -1)\n : options.hostname,\n path: `${options.pathname || ''}${options.search || ''}`,\n };\n if (options.port !== '') {\n optionsParsed.port = Number(options.port);\n }\n if (options.username || options.password) {\n optionsParsed.auth = `${options.username}:${options.password}`;\n }\n pathname = options.pathname;\n origin = options.origin;\n if (extraOptions !== undefined) {\n Object.assign(optionsParsed, extraOptions);\n }\n } else {\n optionsParsed = Object.assign(\n { protocol: options.host ? 'http:' : undefined },\n options\n );\n\n const hostname =\n optionsParsed.host ||\n (optionsParsed.port != null\n ? `${optionsParsed.hostname}${optionsParsed.port}`\n : optionsParsed.hostname);\n origin = `${optionsParsed.protocol || 'http:'}//${hostname}`;\n\n pathname = (options as url.URL).pathname;\n if (!pathname && optionsParsed.path) {\n try {\n const parsedUrl = new URL(optionsParsed.path, origin);\n pathname = parsedUrl.pathname || '/';\n } catch (e) {\n pathname = '/';\n }\n }\n }\n\n // some packages return method in lowercase..\n // ensure upperCase for consistency\n const method = optionsParsed.method\n ? optionsParsed.method.toUpperCase()\n : 'GET';\n\n return { origin, pathname, method, optionsParsed, invalidUrl };\n};\n\n/**\n * Makes sure options is of type string or object\n * @param options for the request\n */\nexport const isValidOptionsType = (options: unknown): boolean => {\n if (!options) {\n return false;\n }\n\n const type = typeof options;\n return type === 'string' || (type === 'object' && !Array.isArray(options));\n};\n\nexport const extractHostnameAndPort = (\n requestOptions: Pick<\n ParsedRequestOptions,\n 'hostname' | 'host' | 'port' | 'protocol'\n >\n): { hostname: string; port: number | string } => {\n if (requestOptions.hostname && requestOptions.port) {\n return { hostname: requestOptions.hostname, port: requestOptions.port };\n }\n const matches = requestOptions.host?.match(/^([^:/ ]+)(:\\d{1,5})?/) || null;\n const hostname =\n requestOptions.hostname || (matches === null ? 'localhost' : matches[1]);\n let port = requestOptions.port;\n if (!port) {\n if (matches && matches[2]) {\n // remove the leading \":\". The extracted port would be something like \":8080\"\n port = matches[2].substring(1);\n } else {\n port = requestOptions.protocol === 'https:' ? '443' : '80';\n }\n }\n return { hostname, port };\n};\n\n/**\n * Returns outgoing request attributes scoped to the options passed to the request\n * @param {ParsedRequestOptions} requestOptions the same options used to make the request\n * @param {{ component: string, hostname: string, hookAttributes?: Attributes }} options used to pass data needed to create attributes\n * @param {SemconvStability} semconvStability determines which semconv version to use\n */\nexport const getOutgoingRequestAttributes = (\n requestOptions: ParsedRequestOptions,\n options: {\n component: string;\n hostname: string;\n port: string | number;\n hookAttributes?: Attributes;\n },\n semconvStability: SemconvStability,\n enableSyntheticSourceDetection: boolean\n): Attributes => {\n const hostname = options.hostname;\n const port = options.port;\n const method = requestOptions.method ?? 'GET';\n const normalizedMethod = normalizeMethod(method);\n const headers = requestOptions.headers || {};\n const userAgent = headers['user-agent'];\n const urlFull = getAbsoluteUrl(\n requestOptions,\n headers,\n `${options.component}:`\n );\n\n const oldAttributes: Attributes = {\n [ATTR_HTTP_URL]: urlFull,\n [ATTR_HTTP_METHOD]: method,\n [ATTR_HTTP_TARGET]: requestOptions.path || '/',\n [ATTR_NET_PEER_NAME]: hostname,\n [ATTR_HTTP_HOST]: headers.host ?? `${hostname}:${port}`,\n };\n\n const newAttributes: Attributes = {\n // Required attributes\n [ATTR_HTTP_REQUEST_METHOD]: normalizedMethod,\n [ATTR_SERVER_ADDRESS]: hostname,\n [ATTR_SERVER_PORT]: Number(port),\n [ATTR_URL_FULL]: urlFull,\n [ATTR_USER_AGENT_ORIGINAL]: userAgent,\n // leaving out protocol version, it is not yet negotiated\n // leaving out protocol name, it is only required when protocol version is set\n // retries and redirects not supported\n\n // Opt-in attributes left off for now\n };\n\n // conditionally required if request method required case normalization\n if (method !== normalizedMethod) {\n newAttributes[ATTR_HTTP_REQUEST_METHOD_ORIGINAL] = method;\n }\n\n if (enableSyntheticSourceDetection && userAgent) {\n newAttributes[ATTR_USER_AGENT_SYNTHETIC_TYPE] = getSyntheticType(userAgent);\n }\n if (userAgent !== undefined) {\n oldAttributes[ATTR_HTTP_USER_AGENT] = userAgent;\n }\n\n switch (semconvStability) {\n case SemconvStability.STABLE:\n return Object.assign(newAttributes, options.hookAttributes);\n case SemconvStability.OLD:\n return Object.assign(oldAttributes, options.hookAttributes);\n }\n\n return Object.assign(oldAttributes, newAttributes, options.hookAttributes);\n};\n\n/**\n * Returns outgoing request Metric attributes scoped to the request data\n * @param {Attributes} spanAttributes the span attributes\n */\nexport const getOutgoingRequestMetricAttributes = (\n spanAttributes: Attributes\n): Attributes => {\n const metricAttributes: Attributes = {};\n metricAttributes[ATTR_HTTP_METHOD] = spanAttributes[ATTR_HTTP_METHOD];\n metricAttributes[ATTR_NET_PEER_NAME] = spanAttributes[ATTR_NET_PEER_NAME];\n //TODO: http.url attribute, it should substitute any parameters to avoid high cardinality.\n return metricAttributes;\n};\n\n/**\n * Returns attributes related to the kind of HTTP protocol used\n * @param {string} [kind] Kind of HTTP protocol used: \"1.0\", \"1.1\", \"2\", \"SPDY\" or \"QUIC\".\n */\nexport const setAttributesFromHttpKind = (\n kind: string | undefined,\n attributes: Attributes\n): void => {\n if (kind) {\n attributes[ATTR_HTTP_FLAVOR] = kind;\n if (kind.toUpperCase() !== 'QUIC') {\n attributes[ATTR_NET_TRANSPORT] = NET_TRANSPORT_VALUE_IP_TCP;\n } else {\n attributes[ATTR_NET_TRANSPORT] = NET_TRANSPORT_VALUE_IP_UDP;\n }\n }\n};\n\n/**\n * Returns the type of synthetic source based on the user agent\n * @param {OutgoingHttpHeader} userAgent the user agent string\n */\nconst getSyntheticType = (\n userAgent: OutgoingHttpHeader\n): AttributeValue | undefined => {\n const userAgentString: string = String(userAgent).toLowerCase();\n for (const name of SYNTHETIC_TEST_NAMES) {\n if (userAgentString.includes(name)) {\n return USER_AGENT_SYNTHETIC_TYPE_VALUE_TEST;\n }\n }\n for (const name of SYNTHETIC_BOT_NAMES) {\n if (userAgentString.includes(name)) {\n return USER_AGENT_SYNTHETIC_TYPE_VALUE_BOT;\n }\n }\n return;\n};\n\n/**\n * Returns outgoing request attributes scoped to the response data\n * @param {IncomingMessage} response the response object\n * @param {SemconvStability} semconvStability determines which semconv version to use\n */\nexport const getOutgoingRequestAttributesOnResponse = (\n response: IncomingMessage,\n semconvStability: SemconvStability\n): Attributes => {\n const { statusCode, statusMessage, httpVersion, socket } = response;\n const oldAttributes: Attributes = {};\n const stableAttributes: Attributes = {};\n\n if (statusCode != null) {\n stableAttributes[ATTR_HTTP_RESPONSE_STATUS_CODE] = statusCode;\n }\n\n if (socket) {\n const { remoteAddress, remotePort } = socket;\n oldAttributes[ATTR_NET_PEER_IP] = remoteAddress;\n oldAttributes[ATTR_NET_PEER_PORT] = remotePort;\n\n // Recommended\n stableAttributes[ATTR_NETWORK_PEER_ADDRESS] = remoteAddress;\n stableAttributes[ATTR_NETWORK_PEER_PORT] = remotePort;\n stableAttributes[ATTR_NETWORK_PROTOCOL_VERSION] = response.httpVersion;\n }\n setResponseContentLengthAttribute(response, oldAttributes);\n\n if (statusCode) {\n oldAttributes[ATTR_HTTP_STATUS_CODE] = statusCode;\n oldAttributes[AttributeNames.HTTP_STATUS_TEXT] = (\n statusMessage || ''\n ).toUpperCase();\n }\n\n setAttributesFromHttpKind(httpVersion, oldAttributes);\n\n switch (semconvStability) {\n case SemconvStability.STABLE:\n return stableAttributes;\n case SemconvStability.OLD:\n return oldAttributes;\n }\n\n return Object.assign(oldAttributes, stableAttributes);\n};\n\n/**\n * Returns outgoing request Metric attributes scoped to the response data\n * @param {Attributes} spanAttributes the span attributes\n */\nexport const getOutgoingRequestMetricAttributesOnResponse = (\n spanAttributes: Attributes\n): Attributes => {\n const metricAttributes: Attributes = {};\n metricAttributes[ATTR_NET_PEER_PORT] = spanAttributes[ATTR_NET_PEER_PORT];\n metricAttributes[ATTR_HTTP_STATUS_CODE] =\n spanAttributes[ATTR_HTTP_STATUS_CODE];\n metricAttributes[ATTR_HTTP_FLAVOR] = spanAttributes[ATTR_HTTP_FLAVOR];\n\n return metricAttributes;\n};\n\nexport const getOutgoingStableRequestMetricAttributesOnResponse = (\n spanAttributes: Attributes\n): Attributes => {\n const metricAttributes: Attributes = {};\n\n if (spanAttributes[ATTR_NETWORK_PROTOCOL_VERSION]) {\n metricAttributes[ATTR_NETWORK_PROTOCOL_VERSION] =\n spanAttributes[ATTR_NETWORK_PROTOCOL_VERSION];\n }\n\n if (spanAttributes[ATTR_HTTP_RESPONSE_STATUS_CODE]) {\n metricAttributes[ATTR_HTTP_RESPONSE_STATUS_CODE] =\n spanAttributes[ATTR_HTTP_RESPONSE_STATUS_CODE];\n }\n return metricAttributes;\n};\n\nfunction parseHostHeader(\n hostHeader: string,\n proto?: string\n): { host: string; port?: string } {\n const parts = hostHeader.split(':');\n\n // no semicolon implies ipv4 dotted syntax or host name without port\n // x.x.x.x\n // example.com\n if (parts.length === 1) {\n if (proto === 'http') {\n return { host: parts[0], port: '80' };\n }\n\n if (proto === 'https') {\n return { host: parts[0], port: '443' };\n }\n\n return { host: parts[0] };\n }\n\n // single semicolon implies ipv4 dotted syntax or host name with port\n // x.x.x.x:yyyy\n // example.com:yyyy\n if (parts.length === 2) {\n return {\n host: parts[0],\n port: parts[1],\n };\n }\n\n // more than 2 parts implies ipv6 syntax with multiple colons\n // [x:x:x:x:x:x:x:x]\n // [x:x:x:x:x:x:x:x]:yyyy\n if (parts[0].startsWith('[')) {\n if (parts[parts.length - 1].endsWith(']')) {\n if (proto === 'http') {\n return { host: hostHeader, port: '80' };\n }\n\n if (proto === 'https') {\n return { host: hostHeader, port: '443' };\n }\n } else if (parts[parts.length - 2].endsWith(']')) {\n return {\n host: parts.slice(0, -1).join(':'),\n port: parts[parts.length - 1],\n };\n }\n }\n\n // if nothing above matches just return the host header\n return { host: hostHeader };\n}\n\n/**\n * Get server.address and port according to http semconv 1.27\n * https://github.com/open-telemetry/semantic-conventions/blob/bf0a2c1134f206f034408b201dbec37960ed60ec/docs/http/http-spans.md#setting-serveraddress-and-serverport-attributes\n */\nfunction getServerAddress(\n request: IncomingMessage,\n component: 'http' | 'https'\n): { host: string; port?: string } | null {\n const forwardedHeader = request.headers['forwarded'];\n if (forwardedHeader) {\n for (const entry of parseForwardedHeader(forwardedHeader)) {\n if (entry.host) {\n return parseHostHeader(entry.host, entry.proto);\n }\n }\n }\n\n const xForwardedHost = request.headers['x-forwarded-host'];\n if (typeof xForwardedHost === 'string') {\n if (typeof request.headers['x-forwarded-proto'] === 'string') {\n return parseHostHeader(\n xForwardedHost,\n request.headers['x-forwarded-proto']\n );\n }\n\n if (Array.isArray(request.headers['x-forwarded-proto'])) {\n return parseHostHeader(\n xForwardedHost,\n request.headers['x-forwarded-proto'][0]\n );\n }\n\n return parseHostHeader(xForwardedHost);\n } else if (\n Array.isArray(xForwardedHost) &&\n typeof xForwardedHost[0] === 'string' &&\n xForwardedHost[0].length > 0\n ) {\n if (typeof request.headers['x-forwarded-proto'] === 'string') {\n return parseHostHeader(\n xForwardedHost[0],\n request.headers['x-forwarded-proto']\n );\n }\n\n if (Array.isArray(request.headers['x-forwarded-proto'])) {\n return parseHostHeader(\n xForwardedHost[0],\n request.headers['x-forwarded-proto'][0]\n );\n }\n\n return parseHostHeader(xForwardedHost[0]);\n }\n\n const host = request.headers['host'];\n if (typeof host === 'string' && host.length > 0) {\n return parseHostHeader(host, component);\n }\n\n return null;\n}\n\n/**\n * Get server.address and port according to http semconv 1.27\n * https://github.com/open-telemetry/semantic-conventions/blob/bf0a2c1134f206f034408b201dbec37960ed60ec/docs/http/http-spans.md#setting-serveraddress-and-serverport-attributes\n */\nexport function getRemoteClientAddress(\n request: IncomingMessage\n): string | null {\n const forwardedHeader = request.headers['forwarded'];\n if (forwardedHeader) {\n for (const entry of parseForwardedHeader(forwardedHeader)) {\n if (entry.for) {\n return entry.for;\n }\n }\n }\n\n const xForwardedFor = request.headers['x-forwarded-for'];\n if (typeof xForwardedFor === 'string') {\n return xForwardedFor;\n } else if (Array.isArray(xForwardedFor)) {\n return xForwardedFor[0];\n }\n\n const remote = request.socket.remoteAddress;\n if (remote) {\n return remote;\n }\n\n return null;\n}\n\nfunction getInfoFromIncomingMessage(\n component: 'http' | 'https',\n request: IncomingMessage,\n logger: DiagLogger\n): { pathname?: string; search?: string; toString: () => string } {\n try {\n if (request.headers.host) {\n return new URL(\n request.url ?? '/',\n `${component}://${request.headers.host}`\n );\n } else {\n const unsafeParsedUrl = new URL(\n request.url ?? '/',\n // using localhost as a workaround to still use the URL constructor for parsing\n `${component}://localhost`\n );\n // since we use localhost as a workaround, ensure we hide the rest of the properties to avoid\n // our workaround leaking though.\n return {\n pathname: unsafeParsedUrl.pathname,\n search: unsafeParsedUrl.search,\n toString: function () {\n // we cannot use the result of unsafeParsedUrl.toString as it's potentially wrong.\n return unsafeParsedUrl.pathname + unsafeParsedUrl.search;\n },\n };\n }\n } catch (e) {\n // something is wrong, use undefined - this *should* never happen, logging\n // for troubleshooting in case it does happen.\n logger.verbose('Unable to get URL from request', e);\n return {};\n }\n}\n\n/**\n * Returns incoming request attributes scoped to the request data\n * @param {IncomingMessage} request the request object\n * @param {{ component: string, serverName?: string, hookAttributes?: Attributes }} options used to pass data needed to create attributes\n * @param {SemconvStability} semconvStability determines which semconv version to use\n */\nexport const getIncomingRequestAttributes = (\n request: IncomingMessage,\n options: {\n component: 'http' | 'https';\n serverName?: string;\n hookAttributes?: Attributes;\n semconvStability: SemconvStability;\n enableSyntheticSourceDetection: boolean;\n },\n logger: DiagLogger\n): Attributes => {\n const headers = request.headers;\n const userAgent = headers['user-agent'];\n const ips = headers['x-forwarded-for'];\n const httpVersion = request.httpVersion;\n const host = headers.host;\n const hostname = host?.replace(/^(.*)(:[0-9]{1,5})/, '$1') || 'localhost';\n\n const method = request.method;\n const normalizedMethod = normalizeMethod(method);\n\n const serverAddress = getServerAddress(request, options.component);\n const serverName = options.serverName;\n const remoteClientAddress = getRemoteClientAddress(request);\n\n const newAttributes: Attributes = {\n [ATTR_HTTP_REQUEST_METHOD]: normalizedMethod,\n [ATTR_URL_SCHEME]: options.component,\n [ATTR_SERVER_ADDRESS]: serverAddress?.host,\n [ATTR_NETWORK_PEER_ADDRESS]: request.socket.remoteAddress,\n [ATTR_NETWORK_PEER_PORT]: request.socket.remotePort,\n [ATTR_NETWORK_PROTOCOL_VERSION]: request.httpVersion,\n [ATTR_USER_AGENT_ORIGINAL]: userAgent,\n };\n\n const parsedUrl = getInfoFromIncomingMessage(\n options.component,\n request,\n logger\n );\n\n if (parsedUrl?.pathname != null) {\n newAttributes[ATTR_URL_PATH] = parsedUrl.pathname;\n }\n\n if (parsedUrl.search) {\n // Remove leading '?' from URL search (https://developer.mozilla.org/en-US/docs/Web/API/URL/search).\n newAttributes[ATTR_URL_QUERY] = parsedUrl.search.slice(1);\n }\n\n if (remoteClientAddress != null) {\n newAttributes[ATTR_CLIENT_ADDRESS] = remoteClientAddress.split(',')[0];\n }\n\n if (serverAddress?.port != null) {\n newAttributes[ATTR_SERVER_PORT] = Number(serverAddress.port);\n }\n\n // conditionally required if request method required case normalization\n if (method !== normalizedMethod) {\n newAttributes[ATTR_HTTP_REQUEST_METHOD_ORIGINAL] = method;\n }\n\n if (options.enableSyntheticSourceDetection && userAgent) {\n newAttributes[ATTR_USER_AGENT_SYNTHETIC_TYPE] = getSyntheticType(userAgent);\n }\n const oldAttributes: Attributes = {\n [ATTR_HTTP_URL]: parsedUrl.toString(),\n [ATTR_HTTP_HOST]: host,\n [ATTR_NET_HOST_NAME]: hostname,\n [ATTR_HTTP_METHOD]: method,\n [ATTR_HTTP_SCHEME]: options.component,\n };\n\n if (typeof ips === 'string') {\n oldAttributes[ATTR_HTTP_CLIENT_IP] = ips.split(',')[0];\n }\n\n if (typeof serverName === 'string') {\n oldAttributes[ATTR_HTTP_SERVER_NAME] = serverName;\n }\n\n if (parsedUrl?.pathname) {\n oldAttributes[ATTR_HTTP_TARGET] =\n parsedUrl?.pathname + parsedUrl?.search || '/';\n }\n\n if (userAgent !== undefined) {\n oldAttributes[ATTR_HTTP_USER_AGENT] = userAgent;\n }\n setRequestContentLengthAttribute(request, oldAttributes);\n setAttributesFromHttpKind(httpVersion, oldAttributes);\n\n switch (options.semconvStability) {\n case SemconvStability.STABLE:\n return Object.assign(newAttributes, options.hookAttributes);\n case SemconvStability.OLD:\n return Object.assign(oldAttributes, options.hookAttributes);\n }\n\n return Object.assign(oldAttributes, newAttributes, options.hookAttributes);\n};\n\n/**\n * Returns incoming request Metric attributes scoped to the request data\n * @param {Attributes} spanAttributes the span attributes\n * @param {{ component: string }} options used to pass data needed to create attributes\n */\nexport const getIncomingRequestMetricAttributes = (\n spanAttributes: Attributes\n): Attributes => {\n const metricAttributes: Attributes = {};\n metricAttributes[ATTR_HTTP_SCHEME] = spanAttributes[ATTR_HTTP_SCHEME];\n metricAttributes[ATTR_HTTP_METHOD] = spanAttributes[ATTR_HTTP_METHOD];\n metricAttributes[ATTR_NET_HOST_NAME] = spanAttributes[ATTR_NET_HOST_NAME];\n metricAttributes[ATTR_HTTP_FLAVOR] = spanAttributes[ATTR_HTTP_FLAVOR];\n //TODO: http.target attribute, it should substitute any parameters to avoid high cardinality.\n return metricAttributes;\n};\n\n/**\n * Returns incoming request attributes scoped to the response data\n * @param {(ServerResponse & { socket: Socket; })} response the response object\n */\nexport const getIncomingRequestAttributesOnResponse = (\n request: IncomingMessage,\n response: ServerResponse,\n semconvStability: SemconvStability\n): Attributes => {\n // take socket from the request,\n // since it may be detached from the response object in keep-alive mode\n const { socket } = request;\n const { statusCode, statusMessage } = response;\n\n const newAttributes: Attributes = {\n [ATTR_HTTP_RESPONSE_STATUS_CODE]: statusCode,\n };\n\n const rpcMetadata = getRPCMetadata(context.active());\n const oldAttributes: Attributes = {};\n if (socket) {\n const { localAddress, localPort, remoteAddress, remotePort } = socket;\n oldAttributes[ATTR_NET_HOST_IP] = localAddress;\n oldAttributes[ATTR_NET_HOST_PORT] = localPort;\n oldAttributes[ATTR_NET_PEER_IP] = remoteAddress;\n oldAttributes[ATTR_NET_PEER_PORT] = remotePort;\n }\n oldAttributes[ATTR_HTTP_STATUS_CODE] = statusCode;\n oldAttributes[AttributeNames.HTTP_STATUS_TEXT] = (\n statusMessage || ''\n ).toUpperCase();\n\n if (rpcMetadata?.type === RPCType.HTTP && rpcMetadata.route !== undefined) {\n oldAttributes[ATTR_HTTP_ROUTE] = rpcMetadata.route;\n newAttributes[ATTR_HTTP_ROUTE] = rpcMetadata.route;\n }\n\n switch (semconvStability) {\n case SemconvStability.STABLE:\n return newAttributes;\n case SemconvStability.OLD:\n return oldAttributes;\n }\n\n return Object.assign(oldAttributes, newAttributes);\n};\n\n/**\n * Returns incoming request Metric attributes scoped to the request data\n * @param {Attributes} spanAttributes the span attributes\n */\nexport const getIncomingRequestMetricAttributesOnResponse = (\n spanAttributes: Attributes\n): Attributes => {\n const metricAttributes: Attributes = {};\n metricAttributes[ATTR_HTTP_STATUS_CODE] =\n spanAttributes[ATTR_HTTP_STATUS_CODE];\n metricAttributes[ATTR_NET_HOST_PORT] = spanAttributes[ATTR_NET_HOST_PORT];\n if (spanAttributes[ATTR_HTTP_ROUTE] !== undefined) {\n metricAttributes[ATTR_HTTP_ROUTE] = spanAttributes[ATTR_HTTP_ROUTE];\n }\n return metricAttributes;\n};\n\n/**\n * Returns incoming stable request Metric attributes scoped to the request data\n * @param {Attributes} spanAttributes the span attributes\n */\nexport const getIncomingStableRequestMetricAttributesOnResponse = (\n spanAttributes: Attributes\n): Attributes => {\n const metricAttributes: Attributes = {};\n if (spanAttributes[ATTR_HTTP_ROUTE] !== undefined) {\n metricAttributes[ATTR_HTTP_ROUTE] = spanAttributes[ATTR_HTTP_ROUTE];\n }\n\n // required if and only if one was sent, same as span requirement\n if (spanAttributes[ATTR_HTTP_RESPONSE_STATUS_CODE]) {\n metricAttributes[ATTR_HTTP_RESPONSE_STATUS_CODE] =\n spanAttributes[ATTR_HTTP_RESPONSE_STATUS_CODE];\n }\n return metricAttributes;\n};\n\nexport function headerCapture(type: 'request' | 'response', headers: string[]) {\n const normalizedHeaders = new Map<string, string>();\n for (let i = 0, len = headers.length; i < len; i++) {\n const capturedHeader = headers[i].toLowerCase();\n normalizedHeaders.set(capturedHeader, capturedHeader.replace(/-/g, '_'));\n }\n\n return (\n span: Span,\n getHeader: (key: string) => undefined | string | string[] | number\n ) => {\n for (const capturedHeader of normalizedHeaders.keys()) {\n const value = getHeader(capturedHeader);\n\n if (value === undefined) {\n continue;\n }\n\n const normalizedHeader = normalizedHeaders.get(capturedHeader);\n const key = `http.${type}.header.${normalizedHeader}`;\n\n if (typeof value === 'string') {\n span.setAttribute(key, [value]);\n } else if (Array.isArray(value)) {\n span.setAttribute(key, value);\n } else {\n span.setAttribute(key, [value]);\n }\n }\n };\n}\n\nconst KNOWN_METHODS = new Set([\n // methods from https://www.rfc-editor.org/rfc/rfc9110.html#name-methods\n 'GET',\n 'HEAD',\n 'POST',\n 'PUT',\n 'DELETE',\n 'CONNECT',\n 'OPTIONS',\n 'TRACE',\n\n // PATCH from https://www.rfc-editor.org/rfc/rfc5789.html\n 'PATCH',\n]);\n\nfunction normalizeMethod(method?: string | null) {\n if (method == null) {\n return 'GET';\n }\n\n const upper = method.toUpperCase();\n if (KNOWN_METHODS.has(upper)) {\n return upper;\n }\n\n return '_OTHER';\n}\n\nfunction parseForwardedHeader(header: string): Record<string, string>[] {\n try {\n return forwardedParse(header);\n } catch {\n return [];\n }\n}\n"]}
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport {\n Attributes,\n SpanStatusCode,\n Span,\n context,\n SpanKind,\n DiagLogger,\n AttributeValue,\n} from '@opentelemetry/api';\nimport {\n ATTR_CLIENT_ADDRESS,\n ATTR_ERROR_TYPE,\n ATTR_HTTP_REQUEST_METHOD,\n ATTR_HTTP_REQUEST_METHOD_ORIGINAL,\n ATTR_HTTP_RESPONSE_STATUS_CODE,\n ATTR_HTTP_ROUTE,\n ATTR_NETWORK_PEER_ADDRESS,\n ATTR_NETWORK_PEER_PORT,\n ATTR_NETWORK_PROTOCOL_VERSION,\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} from '@opentelemetry/semantic-conventions';\nimport {\n ATTR_HTTP_CLIENT_IP,\n ATTR_HTTP_FLAVOR,\n ATTR_HTTP_HOST,\n ATTR_HTTP_METHOD,\n ATTR_HTTP_REQUEST_CONTENT_LENGTH,\n ATTR_HTTP_REQUEST_CONTENT_LENGTH_UNCOMPRESSED,\n ATTR_HTTP_RESPONSE_CONTENT_LENGTH,\n ATTR_HTTP_RESPONSE_CONTENT_LENGTH_UNCOMPRESSED,\n ATTR_HTTP_SCHEME,\n ATTR_HTTP_SERVER_NAME,\n ATTR_HTTP_STATUS_CODE,\n ATTR_HTTP_TARGET,\n ATTR_HTTP_URL,\n ATTR_HTTP_USER_AGENT,\n ATTR_NET_HOST_IP,\n ATTR_NET_HOST_NAME,\n ATTR_NET_HOST_PORT,\n ATTR_NET_PEER_IP,\n ATTR_NET_PEER_NAME,\n ATTR_NET_PEER_PORT,\n ATTR_NET_TRANSPORT,\n NET_TRANSPORT_VALUE_IP_TCP,\n NET_TRANSPORT_VALUE_IP_UDP,\n ATTR_USER_AGENT_SYNTHETIC_TYPE,\n USER_AGENT_SYNTHETIC_TYPE_VALUE_BOT,\n USER_AGENT_SYNTHETIC_TYPE_VALUE_TEST,\n} from './semconv';\nimport {\n IncomingHttpHeaders,\n IncomingMessage,\n OutgoingHttpHeader,\n OutgoingHttpHeaders,\n RequestOptions,\n ServerResponse,\n} from 'http';\nimport { getRPCMetadata, RPCType } from '@opentelemetry/core';\nimport { SemconvStability } from '@opentelemetry/instrumentation';\nimport * as url from 'url';\nimport { AttributeNames } from './enums/AttributeNames';\nimport { Err, IgnoreMatcher, ParsedRequestOptions } from './internal-types';\nimport { SYNTHETIC_BOT_NAMES, SYNTHETIC_TEST_NAMES } from './internal-types';\n// eslint-disable-next-line @typescript-eslint/no-require-imports\nimport forwardedParse = require('forwarded-parse');\n\n/**\n * Get an absolute url\n */\nexport const getAbsoluteUrl = (\n requestUrl: ParsedRequestOptions | null,\n headers: IncomingHttpHeaders | OutgoingHttpHeaders,\n fallbackProtocol = 'http:'\n): string => {\n const reqUrlObject = requestUrl || {};\n const protocol = reqUrlObject.protocol || fallbackProtocol;\n const port = (reqUrlObject.port || '').toString();\n const path = reqUrlObject.path || '/';\n let host =\n reqUrlObject.host || reqUrlObject.hostname || headers.host || 'localhost';\n\n // if there is no port in host and there is a port\n // it should be displayed if it's not 80 and 443 (default ports)\n if (\n (host as string).indexOf(':') === -1 &&\n port &&\n port !== '80' &&\n port !== '443'\n ) {\n host += `:${port}`;\n }\n\n return `${protocol}//${host}${path}`;\n};\n\n/**\n * Parse status code from HTTP response. [More details](https://github.com/open-telemetry/opentelemetry-specification/blob/master/specification/data-http.md#status)\n */\nexport const parseResponseStatus = (\n kind: SpanKind,\n statusCode?: number\n): SpanStatusCode => {\n const upperBound = kind === SpanKind.CLIENT ? 400 : 500;\n // 1xx, 2xx, 3xx are OK on client and server\n // 4xx is OK on server\n if (statusCode && statusCode >= 100 && statusCode < upperBound) {\n return SpanStatusCode.UNSET;\n }\n\n // All other codes are error\n return SpanStatusCode.ERROR;\n};\n\n/**\n * Check whether the given obj match pattern\n * @param constant e.g URL of request\n * @param pattern Match pattern\n */\nexport const satisfiesPattern = (\n constant: string,\n pattern: IgnoreMatcher\n): boolean => {\n if (typeof pattern === 'string') {\n return pattern === constant;\n } else if (pattern instanceof RegExp) {\n return pattern.test(constant);\n } else if (typeof pattern === 'function') {\n return pattern(constant);\n } else {\n throw new TypeError('Pattern is in unsupported datatype');\n }\n};\n\n/**\n * Sets the span with the error passed in params\n * @param {Span} span the span that need to be set\n * @param {Error} error error that will be set to span\n * @param {SemconvStability} semconvStability determines which semconv version to use\n */\nexport const setSpanWithError = (\n span: Span,\n error: Err,\n semconvStability: SemconvStability\n): void => {\n const message = error.message;\n\n if (semconvStability & SemconvStability.OLD) {\n span.setAttribute(AttributeNames.HTTP_ERROR_NAME, error.name);\n span.setAttribute(AttributeNames.HTTP_ERROR_MESSAGE, message);\n }\n\n if (semconvStability & SemconvStability.STABLE) {\n span.setAttribute(ATTR_ERROR_TYPE, error.name);\n }\n\n span.setStatus({ code: SpanStatusCode.ERROR, message });\n span.recordException(error);\n};\n/**\n * Adds attributes for request content-length and content-encoding HTTP headers\n * @param { IncomingMessage } Request object whose headers will be analyzed\n * @param { Attributes } Attributes object to be modified\n */\nexport const setRequestContentLengthAttribute = (\n request: IncomingMessage,\n attributes: Attributes\n): void => {\n const length = getContentLength(request.headers);\n if (length === null) return;\n\n if (isCompressed(request.headers)) {\n attributes[ATTR_HTTP_REQUEST_CONTENT_LENGTH] = length;\n } else {\n attributes[ATTR_HTTP_REQUEST_CONTENT_LENGTH_UNCOMPRESSED] = length;\n }\n};\n\n/**\n * Adds attributes for response content-length and content-encoding HTTP headers\n * @param { IncomingMessage } Response object whose headers will be analyzed\n * @param { Attributes } Attributes object to be modified\n *\n * @deprecated this is for an older version of semconv. It is retained for compatibility using OTEL_SEMCONV_STABILITY_OPT_IN\n */\nexport const setResponseContentLengthAttribute = (\n response: IncomingMessage,\n attributes: Attributes\n): void => {\n const length = getContentLength(response.headers);\n if (length === null) return;\n\n if (isCompressed(response.headers)) {\n attributes[ATTR_HTTP_RESPONSE_CONTENT_LENGTH] = length;\n } else {\n attributes[ATTR_HTTP_RESPONSE_CONTENT_LENGTH_UNCOMPRESSED] = length;\n }\n};\n\nfunction getContentLength(\n headers: OutgoingHttpHeaders | IncomingHttpHeaders\n): number | null {\n const contentLengthHeader = headers['content-length'];\n if (contentLengthHeader === undefined) return null;\n\n const contentLength = parseInt(contentLengthHeader as string, 10);\n if (isNaN(contentLength)) return null;\n\n return contentLength;\n}\n\nexport const isCompressed = (\n headers: OutgoingHttpHeaders | IncomingHttpHeaders\n): boolean => {\n const encoding = headers['content-encoding'];\n\n return !!encoding && encoding !== 'identity';\n};\n\n/**\n * Mimics Node.js conversion of URL strings to RequestOptions expected by\n * `http.request` and `https.request` APIs.\n *\n * See https://github.com/nodejs/node/blob/2505e217bba05fc581b572c685c5cf280a16c5a3/lib/internal/url.js#L1415-L1437\n *\n * @param stringUrl\n * @throws TypeError if the URL is not valid.\n */\nfunction stringUrlToHttpOptions(\n stringUrl: string\n): RequestOptions & { pathname: string } {\n // This is heavily inspired by Node.js handling of the same situation, trying\n // to follow it as closely as possible while keeping in mind that we only\n // deal with string URLs, not URL objects.\n const {\n hostname,\n pathname,\n port,\n username,\n password,\n search,\n protocol,\n hash,\n href,\n origin,\n host,\n } = new URL(stringUrl);\n\n const options: RequestOptions & {\n pathname: string;\n hash: string;\n search: string;\n href: string;\n origin: string;\n } = {\n protocol: protocol,\n hostname:\n hostname && hostname[0] === '[' ? hostname.slice(1, -1) : hostname,\n hash: hash,\n search: search,\n pathname: pathname,\n path: `${pathname || ''}${search || ''}`,\n href: href,\n origin: origin,\n host: host,\n };\n if (port !== '') {\n options.port = Number(port);\n }\n if (username || password) {\n options.auth = `${decodeURIComponent(username)}:${decodeURIComponent(\n password\n )}`;\n }\n return options;\n}\n\n/**\n * Makes sure options is an url object\n * return an object with default value and parsed options\n * @param logger component logger\n * @param options original options for the request\n * @param [extraOptions] additional options for the request\n */\nexport const getRequestInfo = (\n logger: DiagLogger,\n options: url.URL | RequestOptions | string,\n extraOptions?: RequestOptions\n): {\n origin: string;\n pathname: string;\n method: string;\n invalidUrl: boolean;\n optionsParsed: RequestOptions;\n} => {\n let pathname: string;\n let origin: string;\n let optionsParsed: RequestOptions;\n let invalidUrl = false;\n if (typeof options === 'string') {\n try {\n const convertedOptions = stringUrlToHttpOptions(options);\n optionsParsed = convertedOptions;\n pathname = convertedOptions.pathname || '/';\n } catch (e) {\n invalidUrl = true;\n logger.verbose(\n 'Unable to parse URL provided to HTTP request, using fallback to determine path. Original error:',\n e\n );\n // for backward compatibility with how url.parse() behaved.\n optionsParsed = {\n path: options,\n };\n pathname = optionsParsed.path || '/';\n }\n\n origin = `${optionsParsed.protocol || 'http:'}//${optionsParsed.host}`;\n if (extraOptions !== undefined) {\n Object.assign(optionsParsed, extraOptions);\n }\n } else if (options instanceof url.URL) {\n optionsParsed = {\n protocol: options.protocol,\n hostname:\n typeof options.hostname === 'string' && options.hostname.startsWith('[')\n ? options.hostname.slice(1, -1)\n : options.hostname,\n path: `${options.pathname || ''}${options.search || ''}`,\n };\n if (options.port !== '') {\n optionsParsed.port = Number(options.port);\n }\n if (options.username || options.password) {\n optionsParsed.auth = `${options.username}:${options.password}`;\n }\n pathname = options.pathname;\n origin = options.origin;\n if (extraOptions !== undefined) {\n Object.assign(optionsParsed, extraOptions);\n }\n } else {\n optionsParsed = Object.assign(\n { protocol: options.host ? 'http:' : undefined },\n options\n );\n\n const hostname =\n optionsParsed.host ||\n (optionsParsed.port != null\n ? `${optionsParsed.hostname}${optionsParsed.port}`\n : optionsParsed.hostname);\n origin = `${optionsParsed.protocol || 'http:'}//${hostname}`;\n\n pathname = (options as url.URL).pathname;\n if (!pathname && optionsParsed.path) {\n try {\n const parsedUrl = new URL(optionsParsed.path, origin);\n pathname = parsedUrl.pathname || '/';\n } catch {\n pathname = '/';\n }\n }\n }\n\n // some packages return method in lowercase..\n // ensure upperCase for consistency\n const method = optionsParsed.method\n ? optionsParsed.method.toUpperCase()\n : 'GET';\n\n return { origin, pathname, method, optionsParsed, invalidUrl };\n};\n\n/**\n * Makes sure options is of type string or object\n * @param options for the request\n */\nexport const isValidOptionsType = (options: unknown): boolean => {\n if (!options) {\n return false;\n }\n\n const type = typeof options;\n return type === 'string' || (type === 'object' && !Array.isArray(options));\n};\n\nexport const extractHostnameAndPort = (\n requestOptions: Pick<\n ParsedRequestOptions,\n 'hostname' | 'host' | 'port' | 'protocol'\n >\n): { hostname: string; port: number | string } => {\n if (requestOptions.hostname && requestOptions.port) {\n return { hostname: requestOptions.hostname, port: requestOptions.port };\n }\n const matches = requestOptions.host?.match(/^([^:/ ]+)(:\\d{1,5})?/) || null;\n const hostname =\n requestOptions.hostname || (matches === null ? 'localhost' : matches[1]);\n let port = requestOptions.port;\n if (!port) {\n if (matches && matches[2]) {\n // remove the leading \":\". The extracted port would be something like \":8080\"\n port = matches[2].substring(1);\n } else {\n port = requestOptions.protocol === 'https:' ? '443' : '80';\n }\n }\n return { hostname, port };\n};\n\n/**\n * Returns outgoing request attributes scoped to the options passed to the request\n * @param {ParsedRequestOptions} requestOptions the same options used to make the request\n * @param {{ component: string, hostname: string, hookAttributes?: Attributes }} options used to pass data needed to create attributes\n * @param {SemconvStability} semconvStability determines which semconv version to use\n */\nexport const getOutgoingRequestAttributes = (\n requestOptions: ParsedRequestOptions,\n options: {\n component: string;\n hostname: string;\n port: string | number;\n hookAttributes?: Attributes;\n },\n semconvStability: SemconvStability,\n enableSyntheticSourceDetection: boolean\n): Attributes => {\n const hostname = options.hostname;\n const port = options.port;\n const method = requestOptions.method ?? 'GET';\n const normalizedMethod = normalizeMethod(method);\n const headers = requestOptions.headers || {};\n const userAgent = headers['user-agent'];\n const urlFull = getAbsoluteUrl(\n requestOptions,\n headers,\n `${options.component}:`\n );\n\n const oldAttributes: Attributes = {\n [ATTR_HTTP_URL]: urlFull,\n [ATTR_HTTP_METHOD]: method,\n [ATTR_HTTP_TARGET]: requestOptions.path || '/',\n [ATTR_NET_PEER_NAME]: hostname,\n [ATTR_HTTP_HOST]: headers.host ?? `${hostname}:${port}`,\n };\n\n const newAttributes: Attributes = {\n // Required attributes\n [ATTR_HTTP_REQUEST_METHOD]: normalizedMethod,\n [ATTR_SERVER_ADDRESS]: hostname,\n [ATTR_SERVER_PORT]: Number(port),\n [ATTR_URL_FULL]: urlFull,\n [ATTR_USER_AGENT_ORIGINAL]: userAgent,\n // leaving out protocol version, it is not yet negotiated\n // leaving out protocol name, it is only required when protocol version is set\n // retries and redirects not supported\n\n // Opt-in attributes left off for now\n };\n\n // conditionally required if request method required case normalization\n if (method !== normalizedMethod) {\n newAttributes[ATTR_HTTP_REQUEST_METHOD_ORIGINAL] = method;\n }\n\n if (enableSyntheticSourceDetection && userAgent) {\n newAttributes[ATTR_USER_AGENT_SYNTHETIC_TYPE] = getSyntheticType(userAgent);\n }\n if (userAgent !== undefined) {\n oldAttributes[ATTR_HTTP_USER_AGENT] = userAgent;\n }\n\n switch (semconvStability) {\n case SemconvStability.STABLE:\n return Object.assign(newAttributes, options.hookAttributes);\n case SemconvStability.OLD:\n return Object.assign(oldAttributes, options.hookAttributes);\n }\n\n return Object.assign(oldAttributes, newAttributes, options.hookAttributes);\n};\n\n/**\n * Returns outgoing request Metric attributes scoped to the request data\n * @param {Attributes} spanAttributes the span attributes\n */\nexport const getOutgoingRequestMetricAttributes = (\n spanAttributes: Attributes\n): Attributes => {\n const metricAttributes: Attributes = {};\n metricAttributes[ATTR_HTTP_METHOD] = spanAttributes[ATTR_HTTP_METHOD];\n metricAttributes[ATTR_NET_PEER_NAME] = spanAttributes[ATTR_NET_PEER_NAME];\n //TODO: http.url attribute, it should substitute any parameters to avoid high cardinality.\n return metricAttributes;\n};\n\n/**\n * Returns attributes related to the kind of HTTP protocol used\n * @param {string} [kind] Kind of HTTP protocol used: \"1.0\", \"1.1\", \"2\", \"SPDY\" or \"QUIC\".\n */\nexport const setAttributesFromHttpKind = (\n kind: string | undefined,\n attributes: Attributes\n): void => {\n if (kind) {\n attributes[ATTR_HTTP_FLAVOR] = kind;\n if (kind.toUpperCase() !== 'QUIC') {\n attributes[ATTR_NET_TRANSPORT] = NET_TRANSPORT_VALUE_IP_TCP;\n } else {\n attributes[ATTR_NET_TRANSPORT] = NET_TRANSPORT_VALUE_IP_UDP;\n }\n }\n};\n\n/**\n * Returns the type of synthetic source based on the user agent\n * @param {OutgoingHttpHeader} userAgent the user agent string\n */\nconst getSyntheticType = (\n userAgent: OutgoingHttpHeader\n): AttributeValue | undefined => {\n const userAgentString: string = String(userAgent).toLowerCase();\n for (const name of SYNTHETIC_TEST_NAMES) {\n if (userAgentString.includes(name)) {\n return USER_AGENT_SYNTHETIC_TYPE_VALUE_TEST;\n }\n }\n for (const name of SYNTHETIC_BOT_NAMES) {\n if (userAgentString.includes(name)) {\n return USER_AGENT_SYNTHETIC_TYPE_VALUE_BOT;\n }\n }\n return;\n};\n\n/**\n * Returns outgoing request attributes scoped to the response data\n * @param {IncomingMessage} response the response object\n * @param {SemconvStability} semconvStability determines which semconv version to use\n */\nexport const getOutgoingRequestAttributesOnResponse = (\n response: IncomingMessage,\n semconvStability: SemconvStability\n): Attributes => {\n const { statusCode, statusMessage, httpVersion, socket } = response;\n const oldAttributes: Attributes = {};\n const stableAttributes: Attributes = {};\n\n if (statusCode != null) {\n stableAttributes[ATTR_HTTP_RESPONSE_STATUS_CODE] = statusCode;\n }\n\n if (socket) {\n const { remoteAddress, remotePort } = socket;\n oldAttributes[ATTR_NET_PEER_IP] = remoteAddress;\n oldAttributes[ATTR_NET_PEER_PORT] = remotePort;\n\n // Recommended\n stableAttributes[ATTR_NETWORK_PEER_ADDRESS] = remoteAddress;\n stableAttributes[ATTR_NETWORK_PEER_PORT] = remotePort;\n stableAttributes[ATTR_NETWORK_PROTOCOL_VERSION] = response.httpVersion;\n }\n setResponseContentLengthAttribute(response, oldAttributes);\n\n if (statusCode) {\n oldAttributes[ATTR_HTTP_STATUS_CODE] = statusCode;\n oldAttributes[AttributeNames.HTTP_STATUS_TEXT] = (\n statusMessage || ''\n ).toUpperCase();\n }\n\n setAttributesFromHttpKind(httpVersion, oldAttributes);\n\n switch (semconvStability) {\n case SemconvStability.STABLE:\n return stableAttributes;\n case SemconvStability.OLD:\n return oldAttributes;\n }\n\n return Object.assign(oldAttributes, stableAttributes);\n};\n\n/**\n * Returns outgoing request Metric attributes scoped to the response data\n * @param {Attributes} spanAttributes the span attributes\n */\nexport const getOutgoingRequestMetricAttributesOnResponse = (\n spanAttributes: Attributes\n): Attributes => {\n const metricAttributes: Attributes = {};\n metricAttributes[ATTR_NET_PEER_PORT] = spanAttributes[ATTR_NET_PEER_PORT];\n metricAttributes[ATTR_HTTP_STATUS_CODE] =\n spanAttributes[ATTR_HTTP_STATUS_CODE];\n metricAttributes[ATTR_HTTP_FLAVOR] = spanAttributes[ATTR_HTTP_FLAVOR];\n\n return metricAttributes;\n};\n\nexport const getOutgoingStableRequestMetricAttributesOnResponse = (\n spanAttributes: Attributes\n): Attributes => {\n const metricAttributes: Attributes = {};\n\n if (spanAttributes[ATTR_NETWORK_PROTOCOL_VERSION]) {\n metricAttributes[ATTR_NETWORK_PROTOCOL_VERSION] =\n spanAttributes[ATTR_NETWORK_PROTOCOL_VERSION];\n }\n\n if (spanAttributes[ATTR_HTTP_RESPONSE_STATUS_CODE]) {\n metricAttributes[ATTR_HTTP_RESPONSE_STATUS_CODE] =\n spanAttributes[ATTR_HTTP_RESPONSE_STATUS_CODE];\n }\n return metricAttributes;\n};\n\nfunction parseHostHeader(\n hostHeader: string,\n proto?: string\n): { host: string; port?: string } {\n const parts = hostHeader.split(':');\n\n // no semicolon implies ipv4 dotted syntax or host name without port\n // x.x.x.x\n // example.com\n if (parts.length === 1) {\n if (proto === 'http') {\n return { host: parts[0], port: '80' };\n }\n\n if (proto === 'https') {\n return { host: parts[0], port: '443' };\n }\n\n return { host: parts[0] };\n }\n\n // single semicolon implies ipv4 dotted syntax or host name with port\n // x.x.x.x:yyyy\n // example.com:yyyy\n if (parts.length === 2) {\n return {\n host: parts[0],\n port: parts[1],\n };\n }\n\n // more than 2 parts implies ipv6 syntax with multiple colons\n // [x:x:x:x:x:x:x:x]\n // [x:x:x:x:x:x:x:x]:yyyy\n if (parts[0].startsWith('[')) {\n if (parts[parts.length - 1].endsWith(']')) {\n if (proto === 'http') {\n return { host: hostHeader, port: '80' };\n }\n\n if (proto === 'https') {\n return { host: hostHeader, port: '443' };\n }\n } else if (parts[parts.length - 2].endsWith(']')) {\n return {\n host: parts.slice(0, -1).join(':'),\n port: parts[parts.length - 1],\n };\n }\n }\n\n // if nothing above matches just return the host header\n return { host: hostHeader };\n}\n\n/**\n * Get server.address and port according to http semconv 1.27\n * https://github.com/open-telemetry/semantic-conventions/blob/bf0a2c1134f206f034408b201dbec37960ed60ec/docs/http/http-spans.md#setting-serveraddress-and-serverport-attributes\n */\nfunction getServerAddress(\n request: IncomingMessage,\n component: 'http' | 'https'\n): { host: string; port?: string } | null {\n const forwardedHeader = request.headers['forwarded'];\n if (forwardedHeader) {\n for (const entry of parseForwardedHeader(forwardedHeader)) {\n if (entry.host) {\n return parseHostHeader(entry.host, entry.proto);\n }\n }\n }\n\n const xForwardedHost = request.headers['x-forwarded-host'];\n if (typeof xForwardedHost === 'string') {\n if (typeof request.headers['x-forwarded-proto'] === 'string') {\n return parseHostHeader(\n xForwardedHost,\n request.headers['x-forwarded-proto']\n );\n }\n\n if (Array.isArray(request.headers['x-forwarded-proto'])) {\n return parseHostHeader(\n xForwardedHost,\n request.headers['x-forwarded-proto'][0]\n );\n }\n\n return parseHostHeader(xForwardedHost);\n } else if (\n Array.isArray(xForwardedHost) &&\n typeof xForwardedHost[0] === 'string' &&\n xForwardedHost[0].length > 0\n ) {\n if (typeof request.headers['x-forwarded-proto'] === 'string') {\n return parseHostHeader(\n xForwardedHost[0],\n request.headers['x-forwarded-proto']\n );\n }\n\n if (Array.isArray(request.headers['x-forwarded-proto'])) {\n return parseHostHeader(\n xForwardedHost[0],\n request.headers['x-forwarded-proto'][0]\n );\n }\n\n return parseHostHeader(xForwardedHost[0]);\n }\n\n const host = request.headers['host'];\n if (typeof host === 'string' && host.length > 0) {\n return parseHostHeader(host, component);\n }\n\n return null;\n}\n\n/**\n * Get server.address and port according to http semconv 1.27\n * https://github.com/open-telemetry/semantic-conventions/blob/bf0a2c1134f206f034408b201dbec37960ed60ec/docs/http/http-spans.md#setting-serveraddress-and-serverport-attributes\n */\nexport function getRemoteClientAddress(\n request: IncomingMessage\n): string | null {\n const forwardedHeader = request.headers['forwarded'];\n if (forwardedHeader) {\n for (const entry of parseForwardedHeader(forwardedHeader)) {\n if (entry.for) {\n return entry.for;\n }\n }\n }\n\n const xForwardedFor = request.headers['x-forwarded-for'];\n if (typeof xForwardedFor === 'string') {\n return xForwardedFor;\n } else if (Array.isArray(xForwardedFor)) {\n return xForwardedFor[0];\n }\n\n const remote = request.socket.remoteAddress;\n if (remote) {\n return remote;\n }\n\n return null;\n}\n\nfunction getInfoFromIncomingMessage(\n component: 'http' | 'https',\n request: IncomingMessage,\n logger: DiagLogger\n): { pathname?: string; search?: string; toString: () => string } {\n try {\n if (request.headers.host) {\n return new URL(\n request.url ?? '/',\n `${component}://${request.headers.host}`\n );\n } else {\n const unsafeParsedUrl = new URL(\n request.url ?? '/',\n // using localhost as a workaround to still use the URL constructor for parsing\n `${component}://localhost`\n );\n // since we use localhost as a workaround, ensure we hide the rest of the properties to avoid\n // our workaround leaking though.\n return {\n pathname: unsafeParsedUrl.pathname,\n search: unsafeParsedUrl.search,\n toString: function () {\n // we cannot use the result of unsafeParsedUrl.toString as it's potentially wrong.\n return unsafeParsedUrl.pathname + unsafeParsedUrl.search;\n },\n };\n }\n } catch (e) {\n // something is wrong, use undefined - this *should* never happen, logging\n // for troubleshooting in case it does happen.\n logger.verbose('Unable to get URL from request', e);\n return {};\n }\n}\n\n/**\n * Returns incoming request attributes scoped to the request data\n * @param {IncomingMessage} request the request object\n * @param {{ component: string, serverName?: string, hookAttributes?: Attributes }} options used to pass data needed to create attributes\n * @param {SemconvStability} semconvStability determines which semconv version to use\n */\nexport const getIncomingRequestAttributes = (\n request: IncomingMessage,\n options: {\n component: 'http' | 'https';\n serverName?: string;\n hookAttributes?: Attributes;\n semconvStability: SemconvStability;\n enableSyntheticSourceDetection: boolean;\n },\n logger: DiagLogger\n): Attributes => {\n const headers = request.headers;\n const userAgent = headers['user-agent'];\n const ips = headers['x-forwarded-for'];\n const httpVersion = request.httpVersion;\n const host = headers.host;\n const hostname = host?.replace(/^(.*)(:[0-9]{1,5})/, '$1') || 'localhost';\n\n const method = request.method;\n const normalizedMethod = normalizeMethod(method);\n\n const serverAddress = getServerAddress(request, options.component);\n const serverName = options.serverName;\n const remoteClientAddress = getRemoteClientAddress(request);\n\n const newAttributes: Attributes = {\n [ATTR_HTTP_REQUEST_METHOD]: normalizedMethod,\n [ATTR_URL_SCHEME]: options.component,\n [ATTR_SERVER_ADDRESS]: serverAddress?.host,\n [ATTR_NETWORK_PEER_ADDRESS]: request.socket.remoteAddress,\n [ATTR_NETWORK_PEER_PORT]: request.socket.remotePort,\n [ATTR_NETWORK_PROTOCOL_VERSION]: request.httpVersion,\n [ATTR_USER_AGENT_ORIGINAL]: userAgent,\n };\n\n const parsedUrl = getInfoFromIncomingMessage(\n options.component,\n request,\n logger\n );\n\n if (parsedUrl?.pathname != null) {\n newAttributes[ATTR_URL_PATH] = parsedUrl.pathname;\n }\n\n if (parsedUrl.search) {\n // Remove leading '?' from URL search (https://developer.mozilla.org/en-US/docs/Web/API/URL/search).\n newAttributes[ATTR_URL_QUERY] = parsedUrl.search.slice(1);\n }\n\n if (remoteClientAddress != null) {\n newAttributes[ATTR_CLIENT_ADDRESS] = remoteClientAddress.split(',')[0];\n }\n\n if (serverAddress?.port != null) {\n newAttributes[ATTR_SERVER_PORT] = Number(serverAddress.port);\n }\n\n // conditionally required if request method required case normalization\n if (method !== normalizedMethod) {\n newAttributes[ATTR_HTTP_REQUEST_METHOD_ORIGINAL] = method;\n }\n\n if (options.enableSyntheticSourceDetection && userAgent) {\n newAttributes[ATTR_USER_AGENT_SYNTHETIC_TYPE] = getSyntheticType(userAgent);\n }\n const oldAttributes: Attributes = {\n [ATTR_HTTP_URL]: parsedUrl.toString(),\n [ATTR_HTTP_HOST]: host,\n [ATTR_NET_HOST_NAME]: hostname,\n [ATTR_HTTP_METHOD]: method,\n [ATTR_HTTP_SCHEME]: options.component,\n };\n\n if (typeof ips === 'string') {\n oldAttributes[ATTR_HTTP_CLIENT_IP] = ips.split(',')[0];\n }\n\n if (typeof serverName === 'string') {\n oldAttributes[ATTR_HTTP_SERVER_NAME] = serverName;\n }\n\n if (parsedUrl?.pathname) {\n oldAttributes[ATTR_HTTP_TARGET] =\n parsedUrl?.pathname + parsedUrl?.search || '/';\n }\n\n if (userAgent !== undefined) {\n oldAttributes[ATTR_HTTP_USER_AGENT] = userAgent;\n }\n setRequestContentLengthAttribute(request, oldAttributes);\n setAttributesFromHttpKind(httpVersion, oldAttributes);\n\n switch (options.semconvStability) {\n case SemconvStability.STABLE:\n return Object.assign(newAttributes, options.hookAttributes);\n case SemconvStability.OLD:\n return Object.assign(oldAttributes, options.hookAttributes);\n }\n\n return Object.assign(oldAttributes, newAttributes, options.hookAttributes);\n};\n\n/**\n * Returns incoming request Metric attributes scoped to the request data\n * @param {Attributes} spanAttributes the span attributes\n * @param {{ component: string }} options used to pass data needed to create attributes\n */\nexport const getIncomingRequestMetricAttributes = (\n spanAttributes: Attributes\n): Attributes => {\n const metricAttributes: Attributes = {};\n metricAttributes[ATTR_HTTP_SCHEME] = spanAttributes[ATTR_HTTP_SCHEME];\n metricAttributes[ATTR_HTTP_METHOD] = spanAttributes[ATTR_HTTP_METHOD];\n metricAttributes[ATTR_NET_HOST_NAME] = spanAttributes[ATTR_NET_HOST_NAME];\n metricAttributes[ATTR_HTTP_FLAVOR] = spanAttributes[ATTR_HTTP_FLAVOR];\n //TODO: http.target attribute, it should substitute any parameters to avoid high cardinality.\n return metricAttributes;\n};\n\n/**\n * Returns incoming request attributes scoped to the response data\n * @param {(ServerResponse & { socket: Socket; })} response the response object\n */\nexport const getIncomingRequestAttributesOnResponse = (\n request: IncomingMessage,\n response: ServerResponse,\n semconvStability: SemconvStability\n): Attributes => {\n // take socket from the request,\n // since it may be detached from the response object in keep-alive mode\n const { socket } = request;\n const { statusCode, statusMessage } = response;\n\n const newAttributes: Attributes = {\n [ATTR_HTTP_RESPONSE_STATUS_CODE]: statusCode,\n };\n\n const rpcMetadata = getRPCMetadata(context.active());\n const oldAttributes: Attributes = {};\n if (socket) {\n const { localAddress, localPort, remoteAddress, remotePort } = socket;\n oldAttributes[ATTR_NET_HOST_IP] = localAddress;\n oldAttributes[ATTR_NET_HOST_PORT] = localPort;\n oldAttributes[ATTR_NET_PEER_IP] = remoteAddress;\n oldAttributes[ATTR_NET_PEER_PORT] = remotePort;\n }\n oldAttributes[ATTR_HTTP_STATUS_CODE] = statusCode;\n oldAttributes[AttributeNames.HTTP_STATUS_TEXT] = (\n statusMessage || ''\n ).toUpperCase();\n\n if (rpcMetadata?.type === RPCType.HTTP && rpcMetadata.route !== undefined) {\n oldAttributes[ATTR_HTTP_ROUTE] = rpcMetadata.route;\n newAttributes[ATTR_HTTP_ROUTE] = rpcMetadata.route;\n }\n\n switch (semconvStability) {\n case SemconvStability.STABLE:\n return newAttributes;\n case SemconvStability.OLD:\n return oldAttributes;\n }\n\n return Object.assign(oldAttributes, newAttributes);\n};\n\n/**\n * Returns incoming request Metric attributes scoped to the request data\n * @param {Attributes} spanAttributes the span attributes\n */\nexport const getIncomingRequestMetricAttributesOnResponse = (\n spanAttributes: Attributes\n): Attributes => {\n const metricAttributes: Attributes = {};\n metricAttributes[ATTR_HTTP_STATUS_CODE] =\n spanAttributes[ATTR_HTTP_STATUS_CODE];\n metricAttributes[ATTR_NET_HOST_PORT] = spanAttributes[ATTR_NET_HOST_PORT];\n if (spanAttributes[ATTR_HTTP_ROUTE] !== undefined) {\n metricAttributes[ATTR_HTTP_ROUTE] = spanAttributes[ATTR_HTTP_ROUTE];\n }\n return metricAttributes;\n};\n\n/**\n * Returns incoming stable request Metric attributes scoped to the request data\n * @param {Attributes} spanAttributes the span attributes\n */\nexport const getIncomingStableRequestMetricAttributesOnResponse = (\n spanAttributes: Attributes\n): Attributes => {\n const metricAttributes: Attributes = {};\n if (spanAttributes[ATTR_HTTP_ROUTE] !== undefined) {\n metricAttributes[ATTR_HTTP_ROUTE] = spanAttributes[ATTR_HTTP_ROUTE];\n }\n\n // required if and only if one was sent, same as span requirement\n if (spanAttributes[ATTR_HTTP_RESPONSE_STATUS_CODE]) {\n metricAttributes[ATTR_HTTP_RESPONSE_STATUS_CODE] =\n spanAttributes[ATTR_HTTP_RESPONSE_STATUS_CODE];\n }\n return metricAttributes;\n};\n\nexport function headerCapture(type: 'request' | 'response', headers: string[]) {\n const normalizedHeaders = new Map<string, string>();\n for (let i = 0, len = headers.length; i < len; i++) {\n const capturedHeader = headers[i].toLowerCase();\n normalizedHeaders.set(capturedHeader, capturedHeader.replace(/-/g, '_'));\n }\n\n return (\n span: Span,\n getHeader: (key: string) => undefined | string | string[] | number\n ) => {\n for (const capturedHeader of normalizedHeaders.keys()) {\n const value = getHeader(capturedHeader);\n\n if (value === undefined) {\n continue;\n }\n\n const normalizedHeader = normalizedHeaders.get(capturedHeader);\n const key = `http.${type}.header.${normalizedHeader}`;\n\n if (typeof value === 'string') {\n span.setAttribute(key, [value]);\n } else if (Array.isArray(value)) {\n span.setAttribute(key, value);\n } else {\n span.setAttribute(key, [value]);\n }\n }\n };\n}\n\nconst KNOWN_METHODS = new Set([\n // methods from https://www.rfc-editor.org/rfc/rfc9110.html#name-methods\n 'GET',\n 'HEAD',\n 'POST',\n 'PUT',\n 'DELETE',\n 'CONNECT',\n 'OPTIONS',\n 'TRACE',\n\n // PATCH from https://www.rfc-editor.org/rfc/rfc5789.html\n 'PATCH',\n]);\n\nfunction normalizeMethod(method?: string | null) {\n if (method == null) {\n return 'GET';\n }\n\n const upper = method.toUpperCase();\n if (KNOWN_METHODS.has(upper)) {\n return upper;\n }\n\n return '_OTHER';\n}\n\nfunction parseForwardedHeader(header: string): Record<string, string>[] {\n try {\n return forwardedParse(header);\n } catch {\n return [];\n }\n}\n"]}
@@ -1,2 +1,2 @@
1
- export declare const VERSION = "0.201.1";
1
+ export declare const VERSION = "0.203.0";
2
2
  //# sourceMappingURL=version.d.ts.map
@@ -17,5 +17,5 @@
17
17
  Object.defineProperty(exports, "__esModule", { value: true });
18
18
  exports.VERSION = void 0;
19
19
  // this is autogenerated file, see scripts/version-update.js
20
- exports.VERSION = '0.201.1';
20
+ exports.VERSION = '0.203.0';
21
21
  //# sourceMappingURL=version.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;GAcG;;;AAEH,4DAA4D;AAC/C,QAAA,OAAO,GAAG,SAAS,CAAC","sourcesContent":["/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n// this is autogenerated file, see scripts/version-update.js\nexport const VERSION = '0.201.1';\n"]}
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;GAcG;;;AAEH,4DAA4D;AAC/C,QAAA,OAAO,GAAG,SAAS,CAAC","sourcesContent":["/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n// this is autogenerated file, see scripts/version-update.js\nexport const VERSION = '0.203.0';\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@opentelemetry/instrumentation-http",
3
- "version": "0.201.1",
3
+ "version": "0.203.0",
4
4
  "description": "OpenTelemetry instrumentation for `node:http` and `node:https` http client and server modules",
5
5
  "main": "build/src/index.js",
6
6
  "types": "build/src/index.d.ts",
@@ -64,7 +64,7 @@
64
64
  "mocha": "11.1.0",
65
65
  "nock": "13.5.6",
66
66
  "nyc": "17.1.0",
67
- "sinon": "15.1.2",
67
+ "sinon": "18.0.1",
68
68
  "superagent": "10.1.1",
69
69
  "typescript": "5.0.4"
70
70
  },
@@ -73,11 +73,11 @@
73
73
  },
74
74
  "dependencies": {
75
75
  "@opentelemetry/core": "2.0.1",
76
- "@opentelemetry/instrumentation": "0.201.1",
76
+ "@opentelemetry/instrumentation": "0.203.0",
77
77
  "@opentelemetry/semantic-conventions": "^1.29.0",
78
78
  "forwarded-parse": "2.1.2"
79
79
  },
80
80
  "homepage": "https://github.com/open-telemetry/opentelemetry-js/tree/main/experimental/packages/opentelemetry-instrumentation-http",
81
81
  "sideEffects": false,
82
- "gitHead": "9dbd1e446be0ecc7c22b00051c5cfb2612d9b0f2"
82
+ "gitHead": "93187f022457da152becc03dd00db8b2500702db"
83
83
  }