@opentelemetry/instrumentation-http 0.27.0 → 0.28.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 +9 -8
- package/build/src/http.js +34 -22
- package/build/src/http.js.map +1 -1
- package/build/src/types.d.ts +18 -2
- package/build/src/types.js.map +1 -1
- package/build/src/utils.d.ts +5 -12
- package/build/src/utils.js +27 -56
- package/build/src/utils.js.map +1 -1
- package/build/src/version.d.ts +1 -1
- package/build/src/version.js +1 -1
- package/build/src/version.js.map +1 -1
- package/package.json +22 -20
package/README.md
CHANGED
|
@@ -1,8 +1,6 @@
|
|
|
1
1
|
# OpenTelemetry HTTP and HTTPS Instrumentation for Node.js
|
|
2
2
|
|
|
3
3
|
[![NPM Published Version][npm-img]][npm-url]
|
|
4
|
-
[![dependencies][dependencies-image]][dependencies-url]
|
|
5
|
-
[![devDependencies][devDependencies-image]][devDependencies-url]
|
|
6
4
|
[![Apache License][license-image]][license-image]
|
|
7
5
|
|
|
8
6
|
This module provides automatic instrumentation for [`http`](https://nodejs.org/api/http.html) and [`https`](https://nodejs.org/api/https.html).
|
|
@@ -52,13 +50,20 @@ Http instrumentation has few options available to choose from. You can set the f
|
|
|
52
50
|
| [`responseHook`](https://github.com/open-telemetry/opentelemetry-js/blob/main/experimental/packages/opentelemetry-instrumentation-http/src/types.ts#L95) | `HttpResponseCustomAttributeFunction` | Function for adding custom attributes before response is handled |
|
|
53
51
|
| [`startIncomingSpanHook`](https://github.com/open-telemetry/opentelemetry-js/blob/main/experimental/packages/opentelemetry-instrumentation-http/src/types.ts#L97) | `StartIncomingSpanCustomAttributeFunction` | Function for adding custom attributes before a span is started in incomingRequest |
|
|
54
52
|
| [`startOutgoingSpanHook`](https://github.com/open-telemetry/opentelemetry-js/blob/main/experimental/packages/opentelemetry-instrumentation-http/src/types.ts#L99) | `StartOutgoingSpanCustomAttributeFunction` | Function for adding custom attributes before a span is started in outgoingRequest |
|
|
55
|
-
|
|
|
56
|
-
|
|
|
53
|
+
| `ignoreIncomingRequestHook` | `IgnoreIncomingRequestFunction` | Http instrumentation will not trace all incoming requests that matched with custom function |
|
|
54
|
+
| `ignoreOutgoingRequestHook` | `IgnoreOutgoingRequestFunction` | Http instrumentation will not trace all outgoing requests that matched with custom function |
|
|
57
55
|
| [`serverName`](https://github.com/open-telemetry/opentelemetry-js/blob/main/experimental/packages/opentelemetry-instrumentation-http/src/types.ts#L101) | `string` | The primary server name of the matched virtual host. |
|
|
58
56
|
| [`requireParentforOutgoingSpans`](https://github.com/open-telemetry/opentelemetry-js/blob/main/experimental/packages/opentelemetry-instrumentation-http/src/types.ts#L103) | Boolean | Require that is a parent span to create new span for outgoing requests. |
|
|
59
57
|
| [`requireParentforIncomingSpans`](https://github.com/open-telemetry/opentelemetry-js/blob/main/experimental/packages/opentelemetry-instrumentation-http/src/types.ts#L105) | Boolean | Require that is a parent span to create new span for incoming requests. |
|
|
60
58
|
| [`headersToSpanAttributes`](https://github.com/open-telemetry/opentelemetry-js/blob/main/experimental/packages/opentelemetry-instrumentation-http/src/types.ts#L107) | `object` | List of case insensitive HTTP headers to convert to span attributes. Client (outgoing requests, incoming responses) and server (incoming requests, outgoing responses) headers will be converted to span attributes in the form of `http.{request\|response}.header.header_name`, e.g. `http.response.header.content_length` |
|
|
61
59
|
|
|
60
|
+
The following options are deprecated:
|
|
61
|
+
|
|
62
|
+
| Options | Type | Description |
|
|
63
|
+
| ------- | ---- | ----------- |
|
|
64
|
+
| `ignoreIncomingPaths` | `IgnoreMatcher[]` | Http instrumentation will not trace all incoming requests that match paths |
|
|
65
|
+
| `ignoreOutgoingUrls` | `IgnoreMatcher[]` | Http instrumentation will not trace all outgoing requests that match urls |
|
|
66
|
+
|
|
62
67
|
## Useful links
|
|
63
68
|
|
|
64
69
|
- For more information on OpenTelemetry, visit: <https://opentelemetry.io/>
|
|
@@ -72,9 +77,5 @@ Apache 2.0 - See [LICENSE][license-url] for more information.
|
|
|
72
77
|
[discussions-url]: https://github.com/open-telemetry/opentelemetry-js/discussions
|
|
73
78
|
[license-url]: https://github.com/open-telemetry/opentelemetry-js/blob/main/LICENSE
|
|
74
79
|
[license-image]: https://img.shields.io/badge/license-Apache_2.0-green.svg?style=flat
|
|
75
|
-
[dependencies-image]: https://status.david-dm.org/gh/open-telemetry/opentelemetry-js.svg?path=packages%2Fopentelemetry-instrumentation-http
|
|
76
|
-
[dependencies-url]: https://david-dm.org/open-telemetry/opentelemetry-js?path=packages%2Fopentelemetry-instrumentation-http
|
|
77
|
-
[devDependencies-image]: https://status.david-dm.org/gh/open-telemetry/opentelemetry-js.svg?path=packages%2Fopentelemetry-instrumentation-http&type=dev
|
|
78
|
-
[devDependencies-url]: https://david-dm.org/open-telemetry/opentelemetry-js?path=packages%2Fopentelemetry-instrumentation-http&type=dev
|
|
79
80
|
[npm-url]: https://www.npmjs.com/package/@opentelemetry/instrumentation-http
|
|
80
81
|
[npm-img]: https://badge.fury.io/js/%40opentelemetry%2Finstrumentation-http.svg
|
package/build/src/http.js
CHANGED
|
@@ -48,15 +48,15 @@ class HttpInstrumentation extends instrumentation_1.InstrumentationBase {
|
|
|
48
48
|
_getHttpInstrumentation() {
|
|
49
49
|
return new instrumentation_1.InstrumentationNodeModuleDefinition('http', ['*'], moduleExports => {
|
|
50
50
|
this._diag.debug(`Applying patch for http@${this._version}`);
|
|
51
|
-
if (instrumentation_1.isWrapped(moduleExports.request)) {
|
|
51
|
+
if ((0, instrumentation_1.isWrapped)(moduleExports.request)) {
|
|
52
52
|
this._unwrap(moduleExports, 'request');
|
|
53
53
|
}
|
|
54
54
|
this._wrap(moduleExports, 'request', this._getPatchOutgoingRequestFunction('http'));
|
|
55
|
-
if (instrumentation_1.isWrapped(moduleExports.get)) {
|
|
55
|
+
if ((0, instrumentation_1.isWrapped)(moduleExports.get)) {
|
|
56
56
|
this._unwrap(moduleExports, 'get');
|
|
57
57
|
}
|
|
58
58
|
this._wrap(moduleExports, 'get', this._getPatchOutgoingGetFunction(moduleExports.request));
|
|
59
|
-
if (instrumentation_1.isWrapped(moduleExports.Server.prototype.emit)) {
|
|
59
|
+
if ((0, instrumentation_1.isWrapped)(moduleExports.Server.prototype.emit)) {
|
|
60
60
|
this._unwrap(moduleExports.Server.prototype, 'emit');
|
|
61
61
|
}
|
|
62
62
|
this._wrap(moduleExports.Server.prototype, 'emit', this._getPatchIncomingRequestFunction('http'));
|
|
@@ -73,15 +73,15 @@ class HttpInstrumentation extends instrumentation_1.InstrumentationBase {
|
|
|
73
73
|
_getHttpsInstrumentation() {
|
|
74
74
|
return new instrumentation_1.InstrumentationNodeModuleDefinition('https', ['*'], moduleExports => {
|
|
75
75
|
this._diag.debug(`Applying patch for https@${this._version}`);
|
|
76
|
-
if (instrumentation_1.isWrapped(moduleExports.request)) {
|
|
76
|
+
if ((0, instrumentation_1.isWrapped)(moduleExports.request)) {
|
|
77
77
|
this._unwrap(moduleExports, 'request');
|
|
78
78
|
}
|
|
79
79
|
this._wrap(moduleExports, 'request', this._getPatchHttpsOutgoingRequestFunction('https'));
|
|
80
|
-
if (instrumentation_1.isWrapped(moduleExports.get)) {
|
|
80
|
+
if ((0, instrumentation_1.isWrapped)(moduleExports.get)) {
|
|
81
81
|
this._unwrap(moduleExports, 'get');
|
|
82
82
|
}
|
|
83
83
|
this._wrap(moduleExports, 'get', this._getPatchHttpsOutgoingGetFunction(moduleExports.request));
|
|
84
|
-
if (instrumentation_1.isWrapped(moduleExports.Server.prototype.emit)) {
|
|
84
|
+
if ((0, instrumentation_1.isWrapped)(moduleExports.Server.prototype.emit)) {
|
|
85
85
|
this._unwrap(moduleExports.Server.prototype, 'emit');
|
|
86
86
|
}
|
|
87
87
|
this._wrap(moduleExports.Server.prototype, 'emit', this._getPatchIncomingRequestFunction('https'));
|
|
@@ -198,17 +198,19 @@ class HttpInstrumentation extends instrumentation_1.InstrumentationBase {
|
|
|
198
198
|
status = { code: api_1.SpanStatusCode.ERROR };
|
|
199
199
|
}
|
|
200
200
|
else {
|
|
201
|
-
status = utils.parseResponseStatus(response.statusCode);
|
|
201
|
+
status = { code: utils.parseResponseStatus(api_1.SpanKind.CLIENT, response.statusCode) };
|
|
202
202
|
}
|
|
203
203
|
span.setStatus(status);
|
|
204
204
|
if (this._getConfig().applyCustomAttributesOnSpan) {
|
|
205
|
-
instrumentation_1.safeExecuteInTheMiddle(() => this._getConfig().applyCustomAttributesOnSpan(span, request, response), () => { }, true);
|
|
205
|
+
(0, instrumentation_1.safeExecuteInTheMiddle)(() => this._getConfig().applyCustomAttributesOnSpan(span, request, response), () => { }, true);
|
|
206
206
|
}
|
|
207
207
|
this._closeHttpSpan(span);
|
|
208
208
|
});
|
|
209
209
|
response.on('error', (error) => {
|
|
210
210
|
this._diag.debug('outgoingRequest on error()', error);
|
|
211
|
-
utils.setSpanWithError(span, error
|
|
211
|
+
utils.setSpanWithError(span, error);
|
|
212
|
+
const code = utils.parseResponseStatus(api_1.SpanKind.CLIENT, response.statusCode);
|
|
213
|
+
span.setStatus({ code, message: error.message });
|
|
212
214
|
this._closeHttpSpan(span);
|
|
213
215
|
});
|
|
214
216
|
});
|
|
@@ -220,7 +222,7 @@ class HttpInstrumentation extends instrumentation_1.InstrumentationBase {
|
|
|
220
222
|
});
|
|
221
223
|
request.on('error', (error) => {
|
|
222
224
|
this._diag.debug('outgoingRequest on request error()', error);
|
|
223
|
-
utils.setSpanWithError(span, error
|
|
225
|
+
utils.setSpanWithError(span, error);
|
|
224
226
|
this._closeHttpSpan(span);
|
|
225
227
|
});
|
|
226
228
|
this._diag.debug('http.ClientRequest return request');
|
|
@@ -240,8 +242,13 @@ class HttpInstrumentation extends instrumentation_1.InstrumentationBase {
|
|
|
240
242
|
: '/';
|
|
241
243
|
const method = request.method || 'GET';
|
|
242
244
|
instrumentation._diag.debug(`${component} instrumentation incomingRequest`);
|
|
243
|
-
if (utils.isIgnored(pathname, instrumentation._getConfig().ignoreIncomingPaths, (e) => instrumentation._diag.error('caught ignoreIncomingPaths error: ', e))
|
|
244
|
-
|
|
245
|
+
if (utils.isIgnored(pathname, instrumentation._getConfig().ignoreIncomingPaths, (e) => instrumentation._diag.error('caught ignoreIncomingPaths error: ', e)) ||
|
|
246
|
+
(0, instrumentation_1.safeExecuteInTheMiddle)(() => { var _a, _b; return (_b = (_a = instrumentation._getConfig()).ignoreIncomingRequestHook) === null || _b === void 0 ? void 0 : _b.call(_a, request); }, (e) => {
|
|
247
|
+
if (e != null) {
|
|
248
|
+
instrumentation._diag.error('caught ignoreIncomingRequestHook error: ', e);
|
|
249
|
+
}
|
|
250
|
+
}, true)) {
|
|
251
|
+
return api_1.context.with((0, core_1.suppressTracing)(api_1.context.active()), () => {
|
|
245
252
|
api_1.context.bind(api_1.context.active(), request);
|
|
246
253
|
api_1.context.bind(api_1.context.active(), response);
|
|
247
254
|
return original.apply(this, [event, ...args]);
|
|
@@ -262,7 +269,7 @@ class HttpInstrumentation extends instrumentation_1.InstrumentationBase {
|
|
|
262
269
|
type: core_2.RPCType.HTTP,
|
|
263
270
|
span,
|
|
264
271
|
};
|
|
265
|
-
return api_1.context.with(core_2.setRPCMetadata(api_1.trace.setSpan(ctx, span), rpcMetadata), () => {
|
|
272
|
+
return api_1.context.with((0, core_2.setRPCMetadata)(api_1.trace.setSpan(ctx, span), rpcMetadata), () => {
|
|
266
273
|
api_1.context.bind(api_1.context.active(), request);
|
|
267
274
|
api_1.context.bind(api_1.context.active(), response);
|
|
268
275
|
if (instrumentation._getConfig().requestHook) {
|
|
@@ -278,7 +285,7 @@ class HttpInstrumentation extends instrumentation_1.InstrumentationBase {
|
|
|
278
285
|
response.end = function (..._args) {
|
|
279
286
|
response.end = originalEnd;
|
|
280
287
|
// Cannot pass args of type ResponseEndArgs,
|
|
281
|
-
const returned = instrumentation_1.safeExecuteInTheMiddle(() => response.end.apply(this, arguments), error => {
|
|
288
|
+
const returned = (0, instrumentation_1.safeExecuteInTheMiddle)(() => response.end.apply(this, arguments), error => {
|
|
282
289
|
if (error) {
|
|
283
290
|
utils.setSpanWithError(span, error);
|
|
284
291
|
instrumentation._closeHttpSpan(span);
|
|
@@ -289,14 +296,14 @@ class HttpInstrumentation extends instrumentation_1.InstrumentationBase {
|
|
|
289
296
|
instrumentation._headerCapture.server.captureResponseHeaders(span, header => response.getHeader(header));
|
|
290
297
|
span
|
|
291
298
|
.setAttributes(attributes)
|
|
292
|
-
.setStatus(utils.parseResponseStatus(response.statusCode));
|
|
299
|
+
.setStatus({ code: utils.parseResponseStatus(api_1.SpanKind.SERVER, response.statusCode) });
|
|
293
300
|
if (instrumentation._getConfig().applyCustomAttributesOnSpan) {
|
|
294
|
-
instrumentation_1.safeExecuteInTheMiddle(() => instrumentation._getConfig().applyCustomAttributesOnSpan(span, request, response), () => { }, true);
|
|
301
|
+
(0, instrumentation_1.safeExecuteInTheMiddle)(() => instrumentation._getConfig().applyCustomAttributesOnSpan(span, request, response), () => { }, true);
|
|
295
302
|
}
|
|
296
303
|
instrumentation._closeHttpSpan(span);
|
|
297
304
|
return returned;
|
|
298
305
|
};
|
|
299
|
-
return instrumentation_1.safeExecuteInTheMiddle(() => original.apply(this, [event, ...args]), error => {
|
|
306
|
+
return (0, instrumentation_1.safeExecuteInTheMiddle)(() => original.apply(this, [event, ...args]), error => {
|
|
300
307
|
if (error) {
|
|
301
308
|
utils.setSpanWithError(span, error);
|
|
302
309
|
instrumentation._closeHttpSpan(span);
|
|
@@ -328,7 +335,12 @@ class HttpInstrumentation extends instrumentation_1.InstrumentationBase {
|
|
|
328
335
|
optionsParsed.protocol === 'https:') {
|
|
329
336
|
return original.apply(this, [optionsParsed, ...args]);
|
|
330
337
|
}
|
|
331
|
-
if (utils.isIgnored(origin + pathname, instrumentation._getConfig().ignoreOutgoingUrls, (e) => instrumentation._diag.error('caught ignoreOutgoingUrls error: ', e))
|
|
338
|
+
if (utils.isIgnored(origin + pathname, instrumentation._getConfig().ignoreOutgoingUrls, (e) => instrumentation._diag.error('caught ignoreOutgoingUrls error: ', e)) ||
|
|
339
|
+
(0, instrumentation_1.safeExecuteInTheMiddle)(() => { var _a, _b; return (_b = (_a = instrumentation._getConfig()).ignoreOutgoingRequestHook) === null || _b === void 0 ? void 0 : _b.call(_a, optionsParsed); }, (e) => {
|
|
340
|
+
if (e != null) {
|
|
341
|
+
instrumentation._diag.error('caught ignoreOutgoingRequestHook error: ', e);
|
|
342
|
+
}
|
|
343
|
+
}, true)) {
|
|
332
344
|
return original.apply(this, [optionsParsed, ...args]);
|
|
333
345
|
}
|
|
334
346
|
const operationName = `${component.toUpperCase()} ${method}`;
|
|
@@ -360,7 +372,7 @@ class HttpInstrumentation extends instrumentation_1.InstrumentationBase {
|
|
|
360
372
|
if (typeof cb === 'function') {
|
|
361
373
|
args[args.length - 1] = api_1.context.bind(parentContext, cb);
|
|
362
374
|
}
|
|
363
|
-
const request = instrumentation_1.safeExecuteInTheMiddle(() => original.apply(this, [optionsParsed, ...args]), error => {
|
|
375
|
+
const request = (0, instrumentation_1.safeExecuteInTheMiddle)(() => original.apply(this, [optionsParsed, ...args]), error => {
|
|
364
376
|
if (error) {
|
|
365
377
|
utils.setSpanWithError(span, error);
|
|
366
378
|
instrumentation._closeHttpSpan(span);
|
|
@@ -403,14 +415,14 @@ class HttpInstrumentation extends instrumentation_1.InstrumentationBase {
|
|
|
403
415
|
this._spanNotEnded.delete(span);
|
|
404
416
|
}
|
|
405
417
|
_callResponseHook(span, response) {
|
|
406
|
-
instrumentation_1.safeExecuteInTheMiddle(() => this._getConfig().responseHook(span, response), () => { }, true);
|
|
418
|
+
(0, instrumentation_1.safeExecuteInTheMiddle)(() => this._getConfig().responseHook(span, response), () => { }, true);
|
|
407
419
|
}
|
|
408
420
|
_callRequestHook(span, request) {
|
|
409
|
-
instrumentation_1.safeExecuteInTheMiddle(() => this._getConfig().requestHook(span, request), () => { }, true);
|
|
421
|
+
(0, instrumentation_1.safeExecuteInTheMiddle)(() => this._getConfig().requestHook(span, request), () => { }, true);
|
|
410
422
|
}
|
|
411
423
|
_callStartSpanHook(request, hookFunc) {
|
|
412
424
|
if (typeof hookFunc === 'function') {
|
|
413
|
-
return instrumentation_1.safeExecuteInTheMiddle(() => hookFunc(request), () => { }, true);
|
|
425
|
+
return (0, instrumentation_1.safeExecuteInTheMiddle)(() => hookFunc(request), () => { }, true);
|
|
414
426
|
}
|
|
415
427
|
}
|
|
416
428
|
_createHeaderCapture() {
|
package/build/src/http.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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 INVALID_SPAN_CONTEXT,\n propagation,\n ROOT_CONTEXT,\n Span,\n SpanKind,\n SpanOptions,\n SpanStatus,\n SpanStatusCode,\n trace,\n} from '@opentelemetry/api';\nimport { suppressTracing } from '@opentelemetry/core';\nimport type * as http from 'http';\nimport type * as https from 'https';\nimport { Socket } from 'net';\nimport * as semver from 'semver';\nimport * as url from 'url';\nimport {\n Err,\n Func,\n Http,\n HttpInstrumentationConfig,\n HttpRequestArgs,\n Https,\n ResponseEndArgs,\n} from './types';\nimport * as utils from './utils';\nimport { VERSION } from './version';\nimport {\n InstrumentationBase,\n InstrumentationNodeModuleDefinition,\n isWrapped,\n safeExecuteInTheMiddle,\n} from '@opentelemetry/instrumentation';\nimport { RPCMetadata, RPCType, setRPCMetadata } from '@opentelemetry/core';\n\n/**\n * Http instrumentation instrumentation for Opentelemetry\n */\nexport class HttpInstrumentation extends InstrumentationBase<Http> {\n /** keep track on spans not ended */\n private readonly _spanNotEnded: WeakSet<Span> = new WeakSet<Span>();\n private readonly _version = process.versions.node;\n private _headerCapture;\n\n constructor(config?: HttpInstrumentationConfig) {\n super(\n '@opentelemetry/instrumentation-http',\n VERSION,\n config\n );\n\n this._headerCapture = this._createHeaderCapture();\n }\n\n private _getConfig(): HttpInstrumentationConfig {\n return this._config;\n }\n\n override setConfig(config?: HttpInstrumentationConfig): void {\n super.setConfig(config);\n this._headerCapture = this._createHeaderCapture();\n }\n\n init(): [InstrumentationNodeModuleDefinition<Https>, InstrumentationNodeModuleDefinition<Http>] {\n return [this._getHttpsInstrumentation(), this._getHttpInstrumentation()];\n }\n\n private _getHttpInstrumentation() {\n return new InstrumentationNodeModuleDefinition<Http>(\n 'http',\n ['*'],\n moduleExports => {\n this._diag.debug(`Applying patch for http@${this._version}`);\n if (isWrapped(moduleExports.request)) {\n this._unwrap(moduleExports, 'request');\n }\n this._wrap(\n moduleExports,\n 'request',\n this._getPatchOutgoingRequestFunction('http')\n );\n if (isWrapped(moduleExports.get)) {\n this._unwrap(moduleExports, 'get');\n }\n this._wrap(\n moduleExports,\n 'get',\n this._getPatchOutgoingGetFunction(moduleExports.request)\n );\n if (isWrapped(moduleExports.Server.prototype.emit)) {\n this._unwrap(moduleExports.Server.prototype, 'emit');\n }\n this._wrap(\n moduleExports.Server.prototype,\n 'emit',\n this._getPatchIncomingRequestFunction('http')\n );\n return moduleExports;\n },\n moduleExports => {\n if (moduleExports === undefined) return;\n this._diag.debug(`Removing patch for http@${this._version}`);\n\n this._unwrap(moduleExports, 'request');\n this._unwrap(moduleExports, 'get');\n this._unwrap(moduleExports.Server.prototype, 'emit');\n }\n );\n }\n\n private _getHttpsInstrumentation() {\n return new InstrumentationNodeModuleDefinition<Https>(\n 'https',\n ['*'],\n moduleExports => {\n this._diag.debug(`Applying patch for https@${this._version}`);\n if (isWrapped(moduleExports.request)) {\n this._unwrap(moduleExports, 'request');\n }\n this._wrap(\n moduleExports,\n 'request',\n this._getPatchHttpsOutgoingRequestFunction('https')\n );\n if (isWrapped(moduleExports.get)) {\n this._unwrap(moduleExports, 'get');\n }\n this._wrap(\n moduleExports,\n 'get',\n this._getPatchHttpsOutgoingGetFunction(moduleExports.request)\n );\n if (isWrapped(moduleExports.Server.prototype.emit)) {\n this._unwrap(moduleExports.Server.prototype, 'emit');\n }\n this._wrap(\n moduleExports.Server.prototype,\n 'emit',\n this._getPatchIncomingRequestFunction('https')\n );\n return moduleExports;\n },\n moduleExports => {\n if (moduleExports === undefined) return;\n this._diag.debug(`Removing patch for https@${this._version}`);\n\n this._unwrap(moduleExports, 'request');\n this._unwrap(moduleExports, 'get');\n this._unwrap(moduleExports.Server.prototype, 'emit');\n }\n );\n }\n\n /**\n * Creates spans for incoming requests, restoring spans' context if applied.\n */\n protected _getPatchIncomingRequestFunction(component: 'http' | 'https') {\n return (original: (event: string, ...args: unknown[]) => boolean): (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 protected _getPatchOutgoingRequestFunction(component: 'http' | 'https') {\n return (original: Func<http.ClientRequest>): Func<http.ClientRequest> => {\n return this._outgoingRequestFunction(component, original);\n };\n }\n\n protected _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 options The arguments to the original function.\n * @param span representing the current operation\n */\n private _traceClientRequest(\n request: http.ClientRequest,\n hostname: string,\n span: Span\n ): http.ClientRequest {\n if (this._getConfig().requestHook) {\n this._callRequestHook(span, request);\n }\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 const responseAttributes = utils.getOutgoingRequestAttributesOnResponse(\n response,\n { hostname }\n );\n span.setAttributes(responseAttributes);\n if (this._getConfig().responseHook) {\n this._callResponseHook(span, response);\n }\n\n this._headerCapture.client.captureRequestHeaders(span, header => request.getHeader(header));\n this._headerCapture.client.captureResponseHeaders(span, header => response.headers[header]);\n\n context.bind(context.active(), response);\n this._diag.debug('outgoingRequest on response()');\n response.on('end', () => {\n this._diag.debug('outgoingRequest on end()');\n let status: SpanStatus;\n\n if (response.aborted && !response.complete) {\n status = { code: SpanStatusCode.ERROR };\n } else {\n status = utils.parseResponseStatus(response.statusCode);\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(span);\n });\n response.on('error', (error: Err) => {\n this._diag.debug('outgoingRequest on error()', error);\n utils.setSpanWithError(span, error, response);\n this._closeHttpSpan(span);\n });\n }\n );\n request.on('close', () => {\n this._diag.debug('outgoingRequest on request close()');\n if (!request.aborted) {\n this._closeHttpSpan(span);\n }\n });\n request.on('error', (error: Err) => {\n this._diag.debug('outgoingRequest on request error()', error);\n utils.setSpanWithError(span, error, request);\n this._closeHttpSpan(span);\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 pathname = request.url\n ? url.parse(request.url).pathname || '/'\n : '/';\n const method = request.method || 'GET';\n\n instrumentation._diag.debug(`${component} instrumentation incomingRequest`);\n\n if (\n utils.isIgnored(\n pathname,\n instrumentation._getConfig().ignoreIncomingPaths,\n (e: Error) => instrumentation._diag.error('caught ignoreIncomingPaths error: ', e)\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 spanOptions: SpanOptions = {\n kind: SpanKind.SERVER,\n attributes: utils.getIncomingRequestAttributes(request, {\n component: component,\n serverName: instrumentation._getConfig().serverName,\n hookAttributes: instrumentation._callStartSpanHook(\n request,\n instrumentation._getConfig().startIncomingSpanHook\n ),\n }),\n };\n\n const ctx = propagation.extract(ROOT_CONTEXT, headers);\n const span = instrumentation._startHttpSpan(\n `${component.toLocaleUpperCase()} ${method}`,\n spanOptions,\n ctx\n );\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(span, header => request.headers[header]);\n\n // Wraps end (inspired by:\n // https://github.com/GoogleCloudPlatform/cloud-trace-nodejs/blob/master/src/instrumentations/instrumentation-connect.ts#L75)\n const originalEnd = response.end;\n response.end = function (\n this: http.ServerResponse,\n ..._args: ResponseEndArgs\n ) {\n response.end = originalEnd;\n // Cannot pass args of type ResponseEndArgs,\n const returned = safeExecuteInTheMiddle(\n () => response.end.apply(this, arguments as never),\n error => {\n if (error) {\n utils.setSpanWithError(span, error);\n instrumentation._closeHttpSpan(span);\n throw error;\n }\n }\n );\n\n const attributes = utils.getIncomingRequestAttributesOnResponse(\n request,\n response\n );\n\n instrumentation._headerCapture.server.captureResponseHeaders(span, header => response.getHeader(header));\n\n span\n .setAttributes(attributes)\n .setStatus(utils.parseResponseStatus(response.statusCode));\n\n if (instrumentation._getConfig().applyCustomAttributesOnSpan) {\n safeExecuteInTheMiddle(\n () =>\n instrumentation._getConfig().applyCustomAttributesOnSpan!(\n span,\n request,\n response\n ),\n () => {},\n true\n );\n }\n\n instrumentation._closeHttpSpan(span);\n return returned;\n };\n\n return safeExecuteInTheMiddle(\n () => original.apply(this, [event, ...args]),\n error => {\n if (error) {\n utils.setSpanWithError(span, error);\n instrumentation._closeHttpSpan(span);\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 (!utils.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 { origin, pathname, method, optionsParsed } = utils.getRequestInfo(\n options,\n extraOptions\n );\n /**\n * Node 8's https module directly call the http one so to avoid creating\n * 2 span for the same request we need to check that the protocol is correct\n * See: https://github.com/nodejs/node/blob/v8.17.0/lib/https.js#L245\n */\n if (\n component === 'http' &&\n semver.lt(process.version, '9.0.0') &&\n optionsParsed.protocol === 'https:'\n ) {\n return original.apply(this, [optionsParsed, ...args]);\n }\n\n if (\n utils.isIgnored(\n origin + pathname,\n instrumentation._getConfig().ignoreOutgoingUrls,\n (e: Error) => instrumentation._diag.error('caught ignoreOutgoingUrls error: ', e)\n )\n ) {\n return original.apply(this, [optionsParsed, ...args]);\n }\n\n const operationName = `${component.toUpperCase()} ${method}`;\n\n const hostname =\n optionsParsed.hostname ||\n optionsParsed.host?.replace(/^(.*)(:[0-9]{1,5})/, '$1') ||\n 'localhost';\n const attributes = utils.getOutgoingRequestAttributes(optionsParsed, {\n component,\n hostname,\n hookAttributes: instrumentation._callStartSpanHook(\n optionsParsed,\n instrumentation._getConfig().startOutgoingSpanHook\n ),\n });\n\n const spanOptions: SpanOptions = {\n kind: SpanKind.CLIENT,\n attributes,\n };\n const span = instrumentation._startHttpSpan(operationName, spanOptions);\n\n const parentContext = context.active();\n const requestContext = trace.setSpan(parentContext, span);\n\n if (!optionsParsed.headers) {\n 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 () => original.apply(this, [optionsParsed, ...args]),\n error => {\n if (error) {\n utils.setSpanWithError(span, error);\n instrumentation._closeHttpSpan(span);\n throw error;\n }\n }\n );\n\n instrumentation._diag.debug(`${component} instrumentation outgoingRequest`);\n context.bind(parentContext, request);\n return instrumentation._traceClientRequest(\n request,\n hostname,\n span\n );\n });\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(span: Span) {\n if (!this._spanNotEnded.has(span)) {\n return;\n }\n\n span.end();\n this._spanNotEnded.delete(span);\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: utils.headerCapture('request', config.headersToSpanAttributes?.client?.requestHeaders ?? []),\n captureResponseHeaders: utils.headerCapture('response', config.headersToSpanAttributes?.client?.responseHeaders ?? [])\n },\n server: {\n captureRequestHeaders: utils.headerCapture('request', config.headersToSpanAttributes?.server?.requestHeaders ?? []),\n captureResponseHeaders: utils.headerCapture('response', config.headersToSpanAttributes?.server?.responseHeaders ?? []),\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 INVALID_SPAN_CONTEXT,\n propagation,\n ROOT_CONTEXT,\n Span,\n SpanKind,\n SpanOptions,\n SpanStatus,\n SpanStatusCode,\n trace,\n} from '@opentelemetry/api';\nimport { suppressTracing } from '@opentelemetry/core';\nimport type * as http from 'http';\nimport type * as https from 'https';\nimport { Socket } from 'net';\nimport * as semver from 'semver';\nimport * as url from 'url';\nimport {\n Err,\n Func,\n Http,\n HttpInstrumentationConfig,\n HttpRequestArgs,\n Https,\n ResponseEndArgs,\n} from './types';\nimport * as utils from './utils';\nimport { VERSION } from './version';\nimport {\n InstrumentationBase,\n InstrumentationNodeModuleDefinition,\n isWrapped,\n safeExecuteInTheMiddle,\n} from '@opentelemetry/instrumentation';\nimport { RPCMetadata, RPCType, setRPCMetadata } from '@opentelemetry/core';\n\n/**\n * Http instrumentation instrumentation for Opentelemetry\n */\nexport class HttpInstrumentation extends InstrumentationBase<Http> {\n /** keep track on spans not ended */\n private readonly _spanNotEnded: WeakSet<Span> = new WeakSet<Span>();\n private readonly _version = process.versions.node;\n private _headerCapture;\n\n constructor(config?: HttpInstrumentationConfig) {\n super(\n '@opentelemetry/instrumentation-http',\n VERSION,\n config\n );\n\n this._headerCapture = this._createHeaderCapture();\n }\n\n private _getConfig(): HttpInstrumentationConfig {\n return this._config;\n }\n\n override setConfig(config?: HttpInstrumentationConfig): void {\n super.setConfig(config);\n this._headerCapture = this._createHeaderCapture();\n }\n\n init(): [InstrumentationNodeModuleDefinition<Https>, InstrumentationNodeModuleDefinition<Http>] {\n return [this._getHttpsInstrumentation(), this._getHttpInstrumentation()];\n }\n\n private _getHttpInstrumentation() {\n return new InstrumentationNodeModuleDefinition<Http>(\n 'http',\n ['*'],\n moduleExports => {\n this._diag.debug(`Applying patch for http@${this._version}`);\n if (isWrapped(moduleExports.request)) {\n this._unwrap(moduleExports, 'request');\n }\n this._wrap(\n moduleExports,\n 'request',\n this._getPatchOutgoingRequestFunction('http')\n );\n if (isWrapped(moduleExports.get)) {\n this._unwrap(moduleExports, 'get');\n }\n this._wrap(\n moduleExports,\n 'get',\n this._getPatchOutgoingGetFunction(moduleExports.request)\n );\n if (isWrapped(moduleExports.Server.prototype.emit)) {\n this._unwrap(moduleExports.Server.prototype, 'emit');\n }\n this._wrap(\n moduleExports.Server.prototype,\n 'emit',\n this._getPatchIncomingRequestFunction('http')\n );\n return moduleExports;\n },\n moduleExports => {\n if (moduleExports === undefined) return;\n this._diag.debug(`Removing patch for http@${this._version}`);\n\n this._unwrap(moduleExports, 'request');\n this._unwrap(moduleExports, 'get');\n this._unwrap(moduleExports.Server.prototype, 'emit');\n }\n );\n }\n\n private _getHttpsInstrumentation() {\n return new InstrumentationNodeModuleDefinition<Https>(\n 'https',\n ['*'],\n moduleExports => {\n this._diag.debug(`Applying patch for https@${this._version}`);\n if (isWrapped(moduleExports.request)) {\n this._unwrap(moduleExports, 'request');\n }\n this._wrap(\n moduleExports,\n 'request',\n this._getPatchHttpsOutgoingRequestFunction('https')\n );\n if (isWrapped(moduleExports.get)) {\n this._unwrap(moduleExports, 'get');\n }\n this._wrap(\n moduleExports,\n 'get',\n this._getPatchHttpsOutgoingGetFunction(moduleExports.request)\n );\n if (isWrapped(moduleExports.Server.prototype.emit)) {\n this._unwrap(moduleExports.Server.prototype, 'emit');\n }\n this._wrap(\n moduleExports.Server.prototype,\n 'emit',\n this._getPatchIncomingRequestFunction('https')\n );\n return moduleExports;\n },\n moduleExports => {\n if (moduleExports === undefined) return;\n this._diag.debug(`Removing patch for https@${this._version}`);\n\n this._unwrap(moduleExports, 'request');\n this._unwrap(moduleExports, 'get');\n this._unwrap(moduleExports.Server.prototype, 'emit');\n }\n );\n }\n\n /**\n * Creates spans for incoming requests, restoring spans' context if applied.\n */\n protected _getPatchIncomingRequestFunction(component: 'http' | 'https') {\n return (original: (event: string, ...args: unknown[]) => boolean): (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 protected _getPatchOutgoingRequestFunction(component: 'http' | 'https') {\n return (original: Func<http.ClientRequest>): Func<http.ClientRequest> => {\n return this._outgoingRequestFunction(component, original);\n };\n }\n\n protected _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 options The arguments to the original function.\n * @param span representing the current operation\n */\n private _traceClientRequest(\n request: http.ClientRequest,\n hostname: string,\n span: Span\n ): http.ClientRequest {\n if (this._getConfig().requestHook) {\n this._callRequestHook(span, request);\n }\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 const responseAttributes = utils.getOutgoingRequestAttributesOnResponse(\n response,\n { hostname }\n );\n span.setAttributes(responseAttributes);\n if (this._getConfig().responseHook) {\n this._callResponseHook(span, response);\n }\n\n this._headerCapture.client.captureRequestHeaders(span, header => request.getHeader(header));\n this._headerCapture.client.captureResponseHeaders(span, header => response.headers[header]);\n\n context.bind(context.active(), response);\n this._diag.debug('outgoingRequest on response()');\n response.on('end', () => {\n this._diag.debug('outgoingRequest on end()');\n let status: SpanStatus;\n\n if (response.aborted && !response.complete) {\n status = { code: SpanStatusCode.ERROR };\n } else {\n status = { code: utils.parseResponseStatus(SpanKind.CLIENT, response.statusCode) };\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(span);\n });\n response.on('error', (error: Err) => {\n this._diag.debug('outgoingRequest on error()', error);\n utils.setSpanWithError(span, error);\n const code = utils.parseResponseStatus(SpanKind.CLIENT, response.statusCode);\n span.setStatus({ code, message: error.message });\n this._closeHttpSpan(span);\n });\n }\n );\n request.on('close', () => {\n this._diag.debug('outgoingRequest on request close()');\n if (!request.aborted) {\n this._closeHttpSpan(span);\n }\n });\n request.on('error', (error: Err) => {\n this._diag.debug('outgoingRequest on request error()', error);\n utils.setSpanWithError(span, error);\n this._closeHttpSpan(span);\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 pathname = request.url\n ? url.parse(request.url).pathname || '/'\n : '/';\n const method = request.method || 'GET';\n\n instrumentation._diag.debug(`${component} instrumentation incomingRequest`);\n\n if (\n utils.isIgnored(\n pathname,\n instrumentation._getConfig().ignoreIncomingPaths,\n (e: unknown) => instrumentation._diag.error('caught ignoreIncomingPaths error: ', e)\n ) ||\n safeExecuteInTheMiddle(\n () => instrumentation._getConfig().ignoreIncomingRequestHook?.(request),\n (e: unknown) => {\n if (e != null) {\n instrumentation._diag.error('caught ignoreIncomingRequestHook error: ', e);\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 spanOptions: SpanOptions = {\n kind: SpanKind.SERVER,\n attributes: utils.getIncomingRequestAttributes(request, {\n component: component,\n serverName: instrumentation._getConfig().serverName,\n hookAttributes: instrumentation._callStartSpanHook(\n request,\n instrumentation._getConfig().startIncomingSpanHook\n ),\n }),\n };\n\n const ctx = propagation.extract(ROOT_CONTEXT, headers);\n const span = instrumentation._startHttpSpan(\n `${component.toLocaleUpperCase()} ${method}`,\n spanOptions,\n ctx\n );\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(span, header => request.headers[header]);\n\n // Wraps end (inspired by:\n // https://github.com/GoogleCloudPlatform/cloud-trace-nodejs/blob/master/src/instrumentations/instrumentation-connect.ts#L75)\n const originalEnd = response.end;\n response.end = function (\n this: http.ServerResponse,\n ..._args: ResponseEndArgs\n ) {\n response.end = originalEnd;\n // Cannot pass args of type ResponseEndArgs,\n const returned = safeExecuteInTheMiddle(\n () => response.end.apply(this, arguments as never),\n error => {\n if (error) {\n utils.setSpanWithError(span, error);\n instrumentation._closeHttpSpan(span);\n throw error;\n }\n }\n );\n\n const attributes = utils.getIncomingRequestAttributesOnResponse(\n request,\n response\n );\n\n instrumentation._headerCapture.server.captureResponseHeaders(span, header => response.getHeader(header));\n\n span\n .setAttributes(attributes)\n .setStatus({ code: utils.parseResponseStatus(SpanKind.SERVER, response.statusCode) });\n\n if (instrumentation._getConfig().applyCustomAttributesOnSpan) {\n safeExecuteInTheMiddle(\n () =>\n instrumentation._getConfig().applyCustomAttributesOnSpan!(\n span,\n request,\n response\n ),\n () => {},\n true\n );\n }\n\n instrumentation._closeHttpSpan(span);\n return returned;\n };\n\n return safeExecuteInTheMiddle(\n () => original.apply(this, [event, ...args]),\n error => {\n if (error) {\n utils.setSpanWithError(span, error);\n instrumentation._closeHttpSpan(span);\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 (!utils.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 { origin, pathname, method, optionsParsed } = utils.getRequestInfo(\n options,\n extraOptions\n );\n /**\n * Node 8's https module directly call the http one so to avoid creating\n * 2 span for the same request we need to check that the protocol is correct\n * See: https://github.com/nodejs/node/blob/v8.17.0/lib/https.js#L245\n */\n if (\n component === 'http' &&\n semver.lt(process.version, '9.0.0') &&\n optionsParsed.protocol === 'https:'\n ) {\n return original.apply(this, [optionsParsed, ...args]);\n }\n\n if (\n utils.isIgnored(\n origin + pathname,\n instrumentation._getConfig().ignoreOutgoingUrls,\n (e: unknown) => instrumentation._diag.error('caught ignoreOutgoingUrls error: ', e)\n ) ||\n safeExecuteInTheMiddle(\n () => instrumentation._getConfig().ignoreOutgoingRequestHook?.(optionsParsed),\n (e: unknown) => {\n if (e != null) {\n instrumentation._diag.error('caught ignoreOutgoingRequestHook error: ', e);\n }\n },\n true\n )\n ) {\n return original.apply(this, [optionsParsed, ...args]);\n }\n\n const operationName = `${component.toUpperCase()} ${method}`;\n\n const hostname =\n optionsParsed.hostname ||\n optionsParsed.host?.replace(/^(.*)(:[0-9]{1,5})/, '$1') ||\n 'localhost';\n const attributes = utils.getOutgoingRequestAttributes(optionsParsed, {\n component,\n hostname,\n hookAttributes: instrumentation._callStartSpanHook(\n optionsParsed,\n instrumentation._getConfig().startOutgoingSpanHook\n ),\n });\n\n const spanOptions: SpanOptions = {\n kind: SpanKind.CLIENT,\n attributes,\n };\n const span = instrumentation._startHttpSpan(operationName, spanOptions);\n\n const parentContext = context.active();\n const requestContext = trace.setSpan(parentContext, span);\n\n if (!optionsParsed.headers) {\n 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 () => original.apply(this, [optionsParsed, ...args]),\n error => {\n if (error) {\n utils.setSpanWithError(span, error);\n instrumentation._closeHttpSpan(span);\n throw error;\n }\n }\n );\n\n instrumentation._diag.debug(`${component} instrumentation outgoingRequest`);\n context.bind(parentContext, request);\n return instrumentation._traceClientRequest(\n request,\n hostname,\n span\n );\n });\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(span: Span) {\n if (!this._spanNotEnded.has(span)) {\n return;\n }\n\n span.end();\n this._spanNotEnded.delete(span);\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: utils.headerCapture('request', config.headersToSpanAttributes?.client?.requestHeaders ?? []),\n captureResponseHeaders: utils.headerCapture('response', config.headersToSpanAttributes?.client?.responseHeaders ?? [])\n },\n server: {\n captureRequestHeaders: utils.headerCapture('request', config.headersToSpanAttributes?.server?.requestHeaders ?? []),\n captureResponseHeaders: utils.headerCapture('response', config.headersToSpanAttributes?.server?.responseHeaders ?? []),\n }\n };\n }\n}\n"]}
|
package/build/src/types.d.ts
CHANGED
|
@@ -20,6 +20,12 @@ export declare type ResponseEndArgs = [((() => void) | undefined)?] | [unknown,
|
|
|
20
20
|
export interface HttpCustomAttributeFunction {
|
|
21
21
|
(span: Span, request: ClientRequest | IncomingMessage, response: IncomingMessage | ServerResponse): void;
|
|
22
22
|
}
|
|
23
|
+
export interface IgnoreIncomingRequestFunction {
|
|
24
|
+
(request: IncomingMessage): boolean;
|
|
25
|
+
}
|
|
26
|
+
export interface IgnoreOutgoingRequestFunction {
|
|
27
|
+
(request: RequestOptions): boolean;
|
|
28
|
+
}
|
|
23
29
|
export interface HttpRequestCustomAttributeFunction {
|
|
24
30
|
(span: Span, request: ClientRequest | IncomingMessage): void;
|
|
25
31
|
}
|
|
@@ -36,10 +42,20 @@ export interface StartOutgoingSpanCustomAttributeFunction {
|
|
|
36
42
|
* Options available for the HTTP instrumentation (see [documentation](https://github.com/open-telemetry/opentelemetry-js/tree/main/packages/opentelemetry-instrumentation-http#http-instrumentation-options))
|
|
37
43
|
*/
|
|
38
44
|
export interface HttpInstrumentationConfig extends InstrumentationConfig {
|
|
39
|
-
/**
|
|
45
|
+
/**
|
|
46
|
+
* Not trace all incoming requests that match paths
|
|
47
|
+
* @deprecated use `ignoreIncomingRequestHook` instead
|
|
48
|
+
*/
|
|
40
49
|
ignoreIncomingPaths?: IgnoreMatcher[];
|
|
41
|
-
/** Not trace all
|
|
50
|
+
/** Not trace all incoming requests that matched with custom function */
|
|
51
|
+
ignoreIncomingRequestHook?: IgnoreIncomingRequestFunction;
|
|
52
|
+
/**
|
|
53
|
+
* Not trace all outgoing requests that match urls
|
|
54
|
+
* @deprecated use `ignoreOutgoingRequestHook` instead
|
|
55
|
+
*/
|
|
42
56
|
ignoreOutgoingUrls?: IgnoreMatcher[];
|
|
57
|
+
/** Not trace all outgoing requests that matched with custom function */
|
|
58
|
+
ignoreOutgoingRequestHook?: IgnoreOutgoingRequestFunction;
|
|
43
59
|
/** Function for adding custom attributes after response is handled */
|
|
44
60
|
applyCustomAttributesOnSpan?: HttpCustomAttributeFunction;
|
|
45
61
|
/** Function for adding custom attributes before request is handled */
|
package/build/src/types.js.map
CHANGED
|
@@ -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 {
|
|
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 {\n Span,\n SpanAttributes,\n } from '@opentelemetry/api';\nimport type * as http from 'http';\nimport type * as https from 'https';\nimport {\n ClientRequest,\n get,\n IncomingMessage,\n request,\n ServerResponse,\n RequestOptions,\n} from 'http';\nimport * as url from 'url';\nimport { InstrumentationConfig } from '@opentelemetry/instrumentation';\n\nexport type IgnoreMatcher = string | RegExp | ((url: string) => boolean);\nexport type HttpCallback = (res: IncomingMessage) => void;\nexport type RequestFunction = typeof request;\nexport type GetFunction = typeof get;\n\nexport type HttpCallbackOptional = HttpCallback | undefined;\n\n// from node 10+\nexport type RequestSignature = [http.RequestOptions, HttpCallbackOptional] &\n HttpCallback;\n\nexport type HttpRequestArgs = Array<HttpCallbackOptional | RequestSignature>;\n\nexport type ParsedRequestOptions =\n | (http.RequestOptions & Partial<url.UrlWithParsedQuery>)\n | http.RequestOptions;\nexport type Http = typeof http;\nexport type Https = typeof https;\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type Func<T> = (...args: any[]) => T;\nexport type ResponseEndArgs =\n | [((() => void) | undefined)?]\n | [unknown, ((() => void) | undefined)?]\n | [unknown, string, ((() => void) | undefined)?];\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 ): SpanAttributes;\n}\n\nexport interface StartOutgoingSpanCustomAttributeFunction {\n (request: RequestOptions ): SpanAttributes;\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 /**\n * Not trace all incoming requests that match paths\n * @deprecated use `ignoreIncomingRequestHook` instead\n */\n ignoreIncomingPaths?: IgnoreMatcher[];\n /** Not trace all incoming requests that matched with custom function */\n ignoreIncomingRequestHook?: IgnoreIncomingRequestFunction;\n /**\n * Not trace all outgoing requests that match urls\n * @deprecated use `ignoreOutgoingRequestHook` instead\n */\n ignoreOutgoingUrls?: IgnoreMatcher[];\n /** Not trace all outgoing requests that matched with custom function */\n ignoreOutgoingRequestHook?: IgnoreOutgoingRequestFunction;\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\nexport interface Err extends Error {\n errno?: number;\n code?: string;\n path?: string;\n syscall?: string;\n stack?: string;\n}\n"]}
|
package/build/src/utils.d.ts
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
import {
|
|
3
|
-
import { ClientRequest, IncomingHttpHeaders, IncomingMessage, OutgoingHttpHeaders, RequestOptions, ServerResponse } from 'http';
|
|
1
|
+
import { SpanAttributes, SpanStatusCode, Span, SpanKind } from '@opentelemetry/api';
|
|
2
|
+
import { IncomingHttpHeaders, IncomingMessage, OutgoingHttpHeaders, RequestOptions, ServerResponse } from 'http';
|
|
4
3
|
import * as url from 'url';
|
|
5
4
|
import { Err, IgnoreMatcher, ParsedRequestOptions } from './types';
|
|
6
5
|
/**
|
|
@@ -10,12 +9,7 @@ export declare const getAbsoluteUrl: (requestUrl: ParsedRequestOptions | null, h
|
|
|
10
9
|
/**
|
|
11
10
|
* Parse status code from HTTP response. [More details](https://github.com/open-telemetry/opentelemetry-specification/blob/master/specification/data-http.md#status)
|
|
12
11
|
*/
|
|
13
|
-
export declare const parseResponseStatus: (
|
|
14
|
-
/**
|
|
15
|
-
* Returns whether the Expect header is on the given options object.
|
|
16
|
-
* @param options Options for http.request.
|
|
17
|
-
*/
|
|
18
|
-
export declare const hasExpectHeader: (options: RequestOptions) => boolean;
|
|
12
|
+
export declare const parseResponseStatus: (kind: SpanKind, statusCode?: number | undefined) => SpanStatusCode;
|
|
19
13
|
/**
|
|
20
14
|
* Check whether the given obj match pattern
|
|
21
15
|
* @param constant e.g URL of request
|
|
@@ -30,14 +24,13 @@ export declare const satisfiesPattern: (constant: string, pattern: IgnoreMatcher
|
|
|
30
24
|
* @param [onException] callback for doing something when an exception has
|
|
31
25
|
* occurred
|
|
32
26
|
*/
|
|
33
|
-
export declare const isIgnored: (constant: string, list?: IgnoreMatcher[] | undefined, onException?: ((error:
|
|
27
|
+
export declare const isIgnored: (constant: string, list?: IgnoreMatcher[] | undefined, onException?: ((error: unknown) => void) | undefined) => boolean;
|
|
34
28
|
/**
|
|
35
29
|
* Sets the span with the error passed in params
|
|
36
30
|
* @param {Span} span the span that need to be set
|
|
37
31
|
* @param {Error} error error that will be set to span
|
|
38
|
-
* @param {(IncomingMessage | ClientRequest)} [obj] used for enriching the status by checking the statusCode.
|
|
39
32
|
*/
|
|
40
|
-
export declare const setSpanWithError: (span: Span, error: Err
|
|
33
|
+
export declare const setSpanWithError: (span: Span, error: Err) => void;
|
|
41
34
|
/**
|
|
42
35
|
* Adds attributes for request content-length and content-encoding HTTP headers
|
|
43
36
|
* @param { IncomingMessage } Request object whose headers will be analyzed
|
package/build/src/utils.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.headerCapture = exports.getIncomingRequestAttributesOnResponse = exports.getIncomingRequestAttributes = exports.getOutgoingRequestAttributesOnResponse = exports.getAttributesFromHttpKind = exports.getOutgoingRequestAttributes = exports.isValidOptionsType = exports.getRequestInfo = exports.isCompressed = exports.setResponseContentLengthAttribute = exports.setRequestContentLengthAttribute = exports.setSpanWithError = exports.isIgnored = exports.satisfiesPattern = exports.
|
|
3
|
+
exports.headerCapture = exports.getIncomingRequestAttributesOnResponse = exports.getIncomingRequestAttributes = exports.getOutgoingRequestAttributesOnResponse = exports.getAttributesFromHttpKind = exports.getOutgoingRequestAttributes = exports.isValidOptionsType = exports.getRequestInfo = exports.isCompressed = exports.setResponseContentLengthAttribute = exports.setRequestContentLengthAttribute = exports.setSpanWithError = exports.isIgnored = exports.satisfiesPattern = exports.parseResponseStatus = exports.getAbsoluteUrl = void 0;
|
|
4
4
|
/*
|
|
5
5
|
* Copyright The OpenTelemetry Authors
|
|
6
6
|
*
|
|
@@ -44,30 +44,17 @@ exports.getAbsoluteUrl = getAbsoluteUrl;
|
|
|
44
44
|
/**
|
|
45
45
|
* Parse status code from HTTP response. [More details](https://github.com/open-telemetry/opentelemetry-specification/blob/master/specification/data-http.md#status)
|
|
46
46
|
*/
|
|
47
|
-
const parseResponseStatus = (statusCode) => {
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
return { code: api_1.SpanStatusCode.OK };
|
|
47
|
+
const parseResponseStatus = (kind, statusCode) => {
|
|
48
|
+
const upperBound = kind === api_1.SpanKind.CLIENT ? 400 : 500;
|
|
49
|
+
// 1xx, 2xx, 3xx are OK on client and server
|
|
50
|
+
// 4xx is OK on server
|
|
51
|
+
if (statusCode && statusCode >= 100 && statusCode < upperBound) {
|
|
52
|
+
return api_1.SpanStatusCode.UNSET;
|
|
54
53
|
}
|
|
55
54
|
// All other codes are error
|
|
56
|
-
return
|
|
55
|
+
return api_1.SpanStatusCode.ERROR;
|
|
57
56
|
};
|
|
58
57
|
exports.parseResponseStatus = parseResponseStatus;
|
|
59
|
-
/**
|
|
60
|
-
* Returns whether the Expect header is on the given options object.
|
|
61
|
-
* @param options Options for http.request.
|
|
62
|
-
*/
|
|
63
|
-
const hasExpectHeader = (options) => {
|
|
64
|
-
if (!options.headers) {
|
|
65
|
-
return false;
|
|
66
|
-
}
|
|
67
|
-
const keys = Object.keys(options.headers);
|
|
68
|
-
return !!keys.find(key => key.toLowerCase() === 'expect');
|
|
69
|
-
};
|
|
70
|
-
exports.hasExpectHeader = hasExpectHeader;
|
|
71
58
|
/**
|
|
72
59
|
* Check whether the given obj match pattern
|
|
73
60
|
* @param constant e.g URL of request
|
|
@@ -104,7 +91,7 @@ const isIgnored = (constant, list, onException) => {
|
|
|
104
91
|
// Try/catch outside the loop for failing fast
|
|
105
92
|
try {
|
|
106
93
|
for (const pattern of list) {
|
|
107
|
-
if (exports.satisfiesPattern(constant, pattern)) {
|
|
94
|
+
if ((0, exports.satisfiesPattern)(constant, pattern)) {
|
|
108
95
|
return true;
|
|
109
96
|
}
|
|
110
97
|
}
|
|
@@ -121,30 +108,14 @@ exports.isIgnored = isIgnored;
|
|
|
121
108
|
* Sets the span with the error passed in params
|
|
122
109
|
* @param {Span} span the span that need to be set
|
|
123
110
|
* @param {Error} error error that will be set to span
|
|
124
|
-
* @param {(IncomingMessage | ClientRequest)} [obj] used for enriching the status by checking the statusCode.
|
|
125
111
|
*/
|
|
126
|
-
const setSpanWithError = (span, error
|
|
112
|
+
const setSpanWithError = (span, error) => {
|
|
127
113
|
const message = error.message;
|
|
128
114
|
span.setAttributes({
|
|
129
115
|
[AttributeNames_1.AttributeNames.HTTP_ERROR_NAME]: error.name,
|
|
130
116
|
[AttributeNames_1.AttributeNames.HTTP_ERROR_MESSAGE]: message,
|
|
131
117
|
});
|
|
132
|
-
|
|
133
|
-
span.setStatus({ code: api_1.SpanStatusCode.ERROR, message });
|
|
134
|
-
return;
|
|
135
|
-
}
|
|
136
|
-
let status;
|
|
137
|
-
if (obj.statusCode) {
|
|
138
|
-
status = exports.parseResponseStatus(obj.statusCode);
|
|
139
|
-
}
|
|
140
|
-
else if (obj.aborted) {
|
|
141
|
-
status = { code: api_1.SpanStatusCode.ERROR };
|
|
142
|
-
}
|
|
143
|
-
else {
|
|
144
|
-
status = { code: api_1.SpanStatusCode.ERROR };
|
|
145
|
-
}
|
|
146
|
-
status.message = message;
|
|
147
|
-
span.setStatus(status);
|
|
118
|
+
span.setStatus({ code: api_1.SpanStatusCode.ERROR, message });
|
|
148
119
|
};
|
|
149
120
|
exports.setSpanWithError = setSpanWithError;
|
|
150
121
|
/**
|
|
@@ -156,7 +127,7 @@ const setRequestContentLengthAttribute = (request, attributes) => {
|
|
|
156
127
|
const length = getContentLength(request.headers);
|
|
157
128
|
if (length === null)
|
|
158
129
|
return;
|
|
159
|
-
if (exports.isCompressed(request.headers)) {
|
|
130
|
+
if ((0, exports.isCompressed)(request.headers)) {
|
|
160
131
|
attributes[semantic_conventions_1.SemanticAttributes.HTTP_REQUEST_CONTENT_LENGTH] = length;
|
|
161
132
|
}
|
|
162
133
|
else {
|
|
@@ -173,7 +144,7 @@ const setResponseContentLengthAttribute = (response, attributes) => {
|
|
|
173
144
|
const length = getContentLength(response.headers);
|
|
174
145
|
if (length === null)
|
|
175
146
|
return;
|
|
176
|
-
if (exports.isCompressed(response.headers)) {
|
|
147
|
+
if ((0, exports.isCompressed)(response.headers)) {
|
|
177
148
|
attributes[semantic_conventions_1.SemanticAttributes.HTTP_RESPONSE_CONTENT_LENGTH] = length;
|
|
178
149
|
}
|
|
179
150
|
else {
|
|
@@ -202,6 +173,7 @@ exports.isCompressed = isCompressed;
|
|
|
202
173
|
* @param [extraOptions] additional options for the request
|
|
203
174
|
*/
|
|
204
175
|
const getRequestInfo = (options, extraOptions) => {
|
|
176
|
+
var _a;
|
|
205
177
|
let pathname = '/';
|
|
206
178
|
let origin = '';
|
|
207
179
|
let optionsParsed;
|
|
@@ -241,18 +213,17 @@ const getRequestInfo = (options, extraOptions) => {
|
|
|
241
213
|
}
|
|
242
214
|
origin = `${optionsParsed.protocol || 'http:'}//${optionsParsed.host || `${optionsParsed.hostname}:${optionsParsed.port}`}`;
|
|
243
215
|
}
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
}
|
|
216
|
+
const headers = (_a = optionsParsed.headers) !== null && _a !== void 0 ? _a : {};
|
|
217
|
+
optionsParsed.headers = Object.keys(headers).reduce((normalizedHeader, key) => {
|
|
218
|
+
normalizedHeader[key.toLowerCase()] = headers[key];
|
|
219
|
+
return normalizedHeader;
|
|
220
|
+
}, {});
|
|
250
221
|
// some packages return method in lowercase..
|
|
251
222
|
// ensure upperCase for consistency
|
|
252
223
|
const method = optionsParsed.method
|
|
253
224
|
? optionsParsed.method.toUpperCase()
|
|
254
225
|
: 'GET';
|
|
255
|
-
return { origin, pathname, method, optionsParsed };
|
|
226
|
+
return { origin, pathname, method, optionsParsed, };
|
|
256
227
|
};
|
|
257
228
|
exports.getRequestInfo = getRequestInfo;
|
|
258
229
|
/**
|
|
@@ -282,7 +253,7 @@ const getOutgoingRequestAttributes = (requestOptions, options) => {
|
|
|
282
253
|
const headers = requestOptions.headers || {};
|
|
283
254
|
const userAgent = headers['user-agent'];
|
|
284
255
|
const attributes = {
|
|
285
|
-
[semantic_conventions_1.SemanticAttributes.HTTP_URL]: exports.getAbsoluteUrl(requestOptions, headers, `${options.component}:`),
|
|
256
|
+
[semantic_conventions_1.SemanticAttributes.HTTP_URL]: (0, exports.getAbsoluteUrl)(requestOptions, headers, `${options.component}:`),
|
|
286
257
|
[semantic_conventions_1.SemanticAttributes.HTTP_METHOD]: method,
|
|
287
258
|
[semantic_conventions_1.SemanticAttributes.HTTP_TARGET]: requestOptions.path || '/',
|
|
288
259
|
[semantic_conventions_1.SemanticAttributes.NET_PEER_NAME]: hostname,
|
|
@@ -324,12 +295,12 @@ const getOutgoingRequestAttributesOnResponse = (response, options) => {
|
|
|
324
295
|
[semantic_conventions_1.SemanticAttributes.NET_PEER_PORT]: remotePort,
|
|
325
296
|
[semantic_conventions_1.SemanticAttributes.HTTP_HOST]: `${options.hostname}:${remotePort}`,
|
|
326
297
|
};
|
|
327
|
-
exports.setResponseContentLengthAttribute(response, attributes);
|
|
298
|
+
(0, exports.setResponseContentLengthAttribute)(response, attributes);
|
|
328
299
|
if (statusCode) {
|
|
329
300
|
attributes[semantic_conventions_1.SemanticAttributes.HTTP_STATUS_CODE] = statusCode;
|
|
330
301
|
attributes[AttributeNames_1.AttributeNames.HTTP_STATUS_TEXT] = (statusMessage || '').toUpperCase();
|
|
331
302
|
}
|
|
332
|
-
const httpKindAttributes = exports.getAttributesFromHttpKind(httpVersion);
|
|
303
|
+
const httpKindAttributes = (0, exports.getAttributesFromHttpKind)(httpVersion);
|
|
333
304
|
return Object.assign(attributes, httpKindAttributes);
|
|
334
305
|
};
|
|
335
306
|
exports.getOutgoingRequestAttributesOnResponse = getOutgoingRequestAttributesOnResponse;
|
|
@@ -351,7 +322,7 @@ const getIncomingRequestAttributes = (request, options) => {
|
|
|
351
322
|
'localhost';
|
|
352
323
|
const serverName = options.serverName;
|
|
353
324
|
const attributes = {
|
|
354
|
-
[semantic_conventions_1.SemanticAttributes.HTTP_URL]: exports.getAbsoluteUrl(requestUrl, headers, `${options.component}:`),
|
|
325
|
+
[semantic_conventions_1.SemanticAttributes.HTTP_URL]: (0, exports.getAbsoluteUrl)(requestUrl, headers, `${options.component}:`),
|
|
355
326
|
[semantic_conventions_1.SemanticAttributes.HTTP_HOST]: host,
|
|
356
327
|
[semantic_conventions_1.SemanticAttributes.NET_HOST_NAME]: hostname,
|
|
357
328
|
[semantic_conventions_1.SemanticAttributes.HTTP_METHOD]: method,
|
|
@@ -368,8 +339,8 @@ const getIncomingRequestAttributes = (request, options) => {
|
|
|
368
339
|
if (userAgent !== undefined) {
|
|
369
340
|
attributes[semantic_conventions_1.SemanticAttributes.HTTP_USER_AGENT] = userAgent;
|
|
370
341
|
}
|
|
371
|
-
exports.setRequestContentLengthAttribute(request, attributes);
|
|
372
|
-
const httpKindAttributes = exports.getAttributesFromHttpKind(httpVersion);
|
|
342
|
+
(0, exports.setRequestContentLengthAttribute)(request, attributes);
|
|
343
|
+
const httpKindAttributes = (0, exports.getAttributesFromHttpKind)(httpVersion);
|
|
373
344
|
return Object.assign(attributes, httpKindAttributes, options.hookAttributes);
|
|
374
345
|
};
|
|
375
346
|
exports.getIncomingRequestAttributes = getIncomingRequestAttributes;
|
|
@@ -383,7 +354,7 @@ const getIncomingRequestAttributesOnResponse = (request, response) => {
|
|
|
383
354
|
const { socket } = request;
|
|
384
355
|
const { statusCode, statusMessage } = response;
|
|
385
356
|
const { localAddress, localPort, remoteAddress, remotePort } = socket;
|
|
386
|
-
const rpcMetadata = core_1.getRPCMetadata(api_1.context.active());
|
|
357
|
+
const rpcMetadata = (0, core_1.getRPCMetadata)(api_1.context.active());
|
|
387
358
|
const attributes = {
|
|
388
359
|
[semantic_conventions_1.SemanticAttributes.NET_HOST_IP]: localAddress,
|
|
389
360
|
[semantic_conventions_1.SemanticAttributes.NET_HOST_PORT]: localPort,
|
package/build/src/utils.js.map
CHANGED
|
@@ -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 SpanAttributes,\n SpanStatusCode,\n Span,\n SpanStatus,\n context,\n} from '@opentelemetry/api';\nimport {\n NetTransportValues,\n SemanticAttributes,\n} from '@opentelemetry/semantic-conventions';\nimport {\n ClientRequest,\n IncomingHttpHeaders,\n IncomingMessage,\n OutgoingHttpHeaders,\n RequestOptions,\n ServerResponse,\n} from 'http';\nimport { getRPCMetadata, RPCType } from '@opentelemetry/core';\nimport * as url from 'url';\nimport { AttributeNames } from './enums/AttributeNames';\nimport { Err, IgnoreMatcher, ParsedRequestOptions } from './types';\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 * 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 statusCode: number | undefined,\n): Omit<SpanStatus, 'message'> => {\n\n if(statusCode === undefined) {\n return { code: SpanStatusCode.ERROR };\n }\n\n // 1xx, 2xx, 3xx are OK\n if (statusCode >= 100 && statusCode < 400) {\n return { code: SpanStatusCode.OK };\n }\n\n // All other codes are error\n return { code: SpanStatusCode.ERROR };\n};\n\n/**\n * Returns whether the Expect header is on the given options object.\n * @param options Options for http.request.\n */\nexport const hasExpectHeader = (options: RequestOptions): boolean => {\n if (!options.headers) {\n return false;\n }\n\n const keys = Object.keys(options.headers);\n return !!keys.find(key => key.toLowerCase() === 'expect');\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 * Check whether the given request is ignored by configuration\n * It will not re-throw exceptions from `list` provided by the client\n * @param constant e.g URL of request\n * @param [list] List of ignore patterns\n * @param [onException] callback for doing something when an exception has\n * occurred\n */\nexport const isIgnored = (\n constant: string,\n list?: IgnoreMatcher[],\n onException?: (error: Error) => void\n): boolean => {\n if (!list) {\n // No ignored urls - trace everything\n return false;\n }\n // Try/catch outside the loop for failing fast\n try {\n for (const pattern of list) {\n if (satisfiesPattern(constant, pattern)) {\n return true;\n }\n }\n } catch (e) {\n if (onException) {\n onException(e);\n }\n }\n\n return false;\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 {(IncomingMessage | ClientRequest)} [obj] used for enriching the status by checking the statusCode.\n */\nexport const setSpanWithError = (\n span: Span,\n error: Err,\n obj?: IncomingMessage | ClientRequest\n): void => {\n const message = error.message;\n\n span.setAttributes({\n [AttributeNames.HTTP_ERROR_NAME]: error.name,\n [AttributeNames.HTTP_ERROR_MESSAGE]: message,\n });\n\n if (!obj) {\n span.setStatus({ code: SpanStatusCode.ERROR, message });\n return;\n }\n\n let status: SpanStatus;\n if ((obj as IncomingMessage).statusCode) {\n status = parseResponseStatus((obj as IncomingMessage).statusCode);\n } else if ((obj as ClientRequest).aborted) {\n status = { code: SpanStatusCode.ERROR };\n } else {\n status = { code: SpanStatusCode.ERROR };\n }\n\n status.message = message;\n\n span.setStatus(status);\n};\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 { SpanAttributes } SpanAttributes object to be modified\n */\nexport const setRequestContentLengthAttribute = (\n request: IncomingMessage,\n attributes: SpanAttributes\n): void => {\n const length = getContentLength(request.headers);\n if (length === null) return;\n\n if (isCompressed(request.headers)) {\n attributes[SemanticAttributes.HTTP_REQUEST_CONTENT_LENGTH] = length;\n } else {\n attributes[\n SemanticAttributes.HTTP_REQUEST_CONTENT_LENGTH_UNCOMPRESSED\n ] = 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 { SpanAttributes } SpanAttributes object to be modified\n */\nexport const setResponseContentLengthAttribute = (\n response: IncomingMessage,\n attributes: SpanAttributes\n): void => {\n const length = getContentLength(response.headers);\n if (length === null) return;\n\n if (isCompressed(response.headers)) {\n attributes[SemanticAttributes.HTTP_RESPONSE_CONTENT_LENGTH] = length;\n } else {\n attributes[\n SemanticAttributes.HTTP_RESPONSE_CONTENT_LENGTH_UNCOMPRESSED\n ] = 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 * Makes sure options is an url object\n * return an object with default value and parsed options\n * @param options original options for the request\n * @param [extraOptions] additional options for the request\n */\nexport const getRequestInfo = (\n options: url.URL | RequestOptions | string,\n extraOptions?: RequestOptions\n): { origin: string; pathname: string; method: string; optionsParsed: RequestOptions; } => {\n let pathname = '/';\n let origin = '';\n let optionsParsed: RequestOptions;\n if (typeof options === 'string') {\n optionsParsed = url.parse(options);\n pathname = (optionsParsed as url.UrlWithStringQuery).pathname || '/';\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 pathname = (options as url.URL).pathname;\n if (!pathname && optionsParsed.path) {\n pathname = url.parse(optionsParsed.path).pathname || '/';\n }\n origin = `${optionsParsed.protocol || 'http:'}//${\n optionsParsed.host || `${optionsParsed.hostname}:${optionsParsed.port}`\n }`;\n }\n\n if (hasExpectHeader(optionsParsed)) {\n optionsParsed.headers = Object.assign({}, optionsParsed.headers);\n } else if (!optionsParsed.headers) {\n optionsParsed.headers = {};\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 };\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\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?: SpanAttributes }} options used to pass data needed to create attributes\n */\nexport const getOutgoingRequestAttributes = (\n requestOptions: ParsedRequestOptions,\n options: { component: string; hostname: string; hookAttributes?: SpanAttributes }\n): SpanAttributes => {\n const host = requestOptions.host;\n const hostname =\n requestOptions.hostname ||\n host?.replace(/^(.*)(:[0-9]{1,5})/, '$1') ||\n 'localhost';\n const requestMethod = requestOptions.method;\n const method = requestMethod ? requestMethod.toUpperCase() : 'GET';\n const headers = requestOptions.headers || {};\n const userAgent = headers['user-agent'];\n const attributes: SpanAttributes = {\n [SemanticAttributes.HTTP_URL]: getAbsoluteUrl(\n requestOptions,\n headers,\n `${options.component}:`\n ),\n [SemanticAttributes.HTTP_METHOD]: method,\n [SemanticAttributes.HTTP_TARGET]: requestOptions.path || '/',\n [SemanticAttributes.NET_PEER_NAME]: hostname,\n };\n\n if (userAgent !== undefined) {\n attributes[SemanticAttributes.HTTP_USER_AGENT] = userAgent;\n }\n return Object.assign(attributes, options.hookAttributes);\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 getAttributesFromHttpKind = (kind?: string): SpanAttributes => {\n const attributes: SpanAttributes = {};\n if (kind) {\n attributes[SemanticAttributes.HTTP_FLAVOR] = kind;\n if (kind.toUpperCase() !== 'QUIC') {\n attributes[SemanticAttributes.NET_TRANSPORT] = NetTransportValues.IP_TCP;\n } else {\n attributes[SemanticAttributes.NET_TRANSPORT] = NetTransportValues.IP_UDP;\n }\n }\n return attributes;\n};\n\n/**\n * Returns outgoing request attributes scoped to the response data\n * @param {IncomingMessage} response the response object\n * @param {{ hostname: string }} options used to pass data needed to create attributes\n */\nexport const getOutgoingRequestAttributesOnResponse = (\n response: IncomingMessage,\n options: { hostname: string }\n): SpanAttributes => {\n const { statusCode, statusMessage, httpVersion, socket } = response;\n const { remoteAddress, remotePort } = socket;\n const attributes: SpanAttributes = {\n [SemanticAttributes.NET_PEER_IP]: remoteAddress,\n [SemanticAttributes.NET_PEER_PORT]: remotePort,\n [SemanticAttributes.HTTP_HOST]: `${options.hostname}:${remotePort}`,\n };\n setResponseContentLengthAttribute(response, attributes);\n\n if (statusCode) {\n attributes[SemanticAttributes.HTTP_STATUS_CODE] = statusCode;\n attributes[AttributeNames.HTTP_STATUS_TEXT] = (\n statusMessage || ''\n ).toUpperCase();\n }\n\n const httpKindAttributes = getAttributesFromHttpKind(httpVersion);\n return Object.assign(attributes, httpKindAttributes);\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?: SpanAttributes }} options used to pass data needed to create attributes\n */\nexport const getIncomingRequestAttributes = (\n request: IncomingMessage,\n options: { component: string; serverName?: string; hookAttributes?: SpanAttributes }\n): SpanAttributes => {\n const headers = request.headers;\n const userAgent = headers['user-agent'];\n const ips = headers['x-forwarded-for'];\n const method = request.method || 'GET';\n const httpVersion = request.httpVersion;\n const requestUrl = request.url ? url.parse(request.url) : null;\n const host = requestUrl?.host || headers.host;\n const hostname =\n requestUrl?.hostname ||\n host?.replace(/^(.*)(:[0-9]{1,5})/, '$1') ||\n 'localhost';\n const serverName = options.serverName;\n const attributes: SpanAttributes = {\n [SemanticAttributes.HTTP_URL]: getAbsoluteUrl(\n requestUrl,\n headers,\n `${options.component}:`\n ),\n [SemanticAttributes.HTTP_HOST]: host,\n [SemanticAttributes.NET_HOST_NAME]: hostname,\n [SemanticAttributes.HTTP_METHOD]: method,\n };\n\n if (typeof ips === 'string') {\n attributes[SemanticAttributes.HTTP_CLIENT_IP] = ips.split(',')[0];\n }\n\n if (typeof serverName === 'string') {\n attributes[SemanticAttributes.HTTP_SERVER_NAME] = serverName;\n }\n\n if (requestUrl) {\n attributes[SemanticAttributes.HTTP_TARGET] = requestUrl.pathname || '/';\n }\n\n if (userAgent !== undefined) {\n attributes[SemanticAttributes.HTTP_USER_AGENT] = userAgent;\n }\n setRequestContentLengthAttribute(request, attributes);\n\n const httpKindAttributes = getAttributesFromHttpKind(httpVersion);\n return Object.assign(attributes, httpKindAttributes, options.hookAttributes);\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): SpanAttributes => {\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 const { localAddress, localPort, remoteAddress, remotePort } = socket;\n const rpcMetadata = getRPCMetadata(context.active());\n\n const attributes: SpanAttributes = {\n [SemanticAttributes.NET_HOST_IP]: localAddress,\n [SemanticAttributes.NET_HOST_PORT]: localPort,\n [SemanticAttributes.NET_PEER_IP]: remoteAddress,\n [SemanticAttributes.NET_PEER_PORT]: remotePort,\n [SemanticAttributes.HTTP_STATUS_CODE]: statusCode,\n [AttributeNames.HTTP_STATUS_TEXT]: (statusMessage || '').toUpperCase(),\n };\n\n if (rpcMetadata?.type === RPCType.HTTP && rpcMetadata.route !== undefined) {\n attributes[SemanticAttributes.HTTP_ROUTE] = rpcMetadata.route;\n }\n return attributes;\n};\n\nexport function headerCapture(type: 'request' | 'response', headers: string[]) {\n const normalizedHeaders = new Map(headers.map(header => [header.toLowerCase(), header.toLowerCase().replace(/-/g, '_')]));\n\n return (span: Span, getHeader: (key: string) => undefined | string | string[] | number) => {\n for (const [capturedHeader, normalizedHeader] of normalizedHeaders) {\n const value = getHeader(capturedHeader);\n \n if (value === undefined) {\n continue;\n }\n\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"]}
|
|
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 SpanAttributes,\n SpanStatusCode,\n Span,\n context,\n SpanKind,\n} from '@opentelemetry/api';\nimport {\n NetTransportValues,\n SemanticAttributes,\n} from '@opentelemetry/semantic-conventions';\nimport {\n IncomingHttpHeaders,\n IncomingMessage,\n OutgoingHttpHeaders,\n RequestOptions,\n ServerResponse,\n} from 'http';\nimport { getRPCMetadata, RPCType } from '@opentelemetry/core';\nimport * as url from 'url';\nimport { AttributeNames } from './enums/AttributeNames';\nimport { Err, IgnoreMatcher, ParsedRequestOptions } from './types';\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 = (kind: SpanKind, statusCode?: number): 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 * Check whether the given request is ignored by configuration\n * It will not re-throw exceptions from `list` provided by the client\n * @param constant e.g URL of request\n * @param [list] List of ignore patterns\n * @param [onException] callback for doing something when an exception has\n * occurred\n */\nexport const isIgnored = (\n constant: string,\n list?: IgnoreMatcher[],\n onException?: (error: unknown) => void\n): boolean => {\n if (!list) {\n // No ignored urls - trace everything\n return false;\n }\n // Try/catch outside the loop for failing fast\n try {\n for (const pattern of list) {\n if (satisfiesPattern(constant, pattern)) {\n return true;\n }\n }\n } catch (e) {\n if (onException) {\n onException(e);\n }\n }\n\n return false;\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 */\nexport const setSpanWithError = (\n span: Span,\n error: Err\n): void => {\n const message = error.message;\n\n span.setAttributes({\n [AttributeNames.HTTP_ERROR_NAME]: error.name,\n [AttributeNames.HTTP_ERROR_MESSAGE]: message,\n });\n\n span.setStatus({ code: SpanStatusCode.ERROR, message });\n};\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 { SpanAttributes } SpanAttributes object to be modified\n */\nexport const setRequestContentLengthAttribute = (\n request: IncomingMessage,\n attributes: SpanAttributes\n): void => {\n const length = getContentLength(request.headers);\n if (length === null) return;\n\n if (isCompressed(request.headers)) {\n attributes[SemanticAttributes.HTTP_REQUEST_CONTENT_LENGTH] = length;\n } else {\n attributes[\n SemanticAttributes.HTTP_REQUEST_CONTENT_LENGTH_UNCOMPRESSED\n ] = 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 { SpanAttributes } SpanAttributes object to be modified\n */\nexport const setResponseContentLengthAttribute = (\n response: IncomingMessage,\n attributes: SpanAttributes\n): void => {\n const length = getContentLength(response.headers);\n if (length === null) return;\n\n if (isCompressed(response.headers)) {\n attributes[SemanticAttributes.HTTP_RESPONSE_CONTENT_LENGTH] = length;\n } else {\n attributes[\n SemanticAttributes.HTTP_RESPONSE_CONTENT_LENGTH_UNCOMPRESSED\n ] = 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 * Makes sure options is an url object\n * return an object with default value and parsed options\n * @param options original options for the request\n * @param [extraOptions] additional options for the request\n */\nexport const getRequestInfo = (\n options: url.URL | RequestOptions | string,\n extraOptions?: RequestOptions\n): { origin: string; pathname: string; method: string; optionsParsed: RequestOptions; } => {\n let pathname = '/';\n let origin = '';\n let optionsParsed: RequestOptions;\n if (typeof options === 'string') {\n optionsParsed = url.parse(options);\n pathname = (optionsParsed as url.UrlWithStringQuery).pathname || '/';\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 pathname = (options as url.URL).pathname;\n if (!pathname && optionsParsed.path) {\n pathname = url.parse(optionsParsed.path).pathname || '/';\n }\n origin = `${optionsParsed.protocol || 'http:'}//${\n optionsParsed.host || `${optionsParsed.hostname}:${optionsParsed.port}`\n }`;\n }\n\n const headers = optionsParsed.headers ?? {};\n optionsParsed.headers = Object.keys(headers).reduce((normalizedHeader, key) => {\n normalizedHeader[key.toLowerCase()] = headers[key];\n return normalizedHeader;\n }, {} as OutgoingHttpHeaders);\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, };\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\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?: SpanAttributes }} options used to pass data needed to create attributes\n */\nexport const getOutgoingRequestAttributes = (\n requestOptions: ParsedRequestOptions,\n options: { component: string; hostname: string; hookAttributes?: SpanAttributes }\n): SpanAttributes => {\n const host = requestOptions.host;\n const hostname =\n requestOptions.hostname ||\n host?.replace(/^(.*)(:[0-9]{1,5})/, '$1') ||\n 'localhost';\n const requestMethod = requestOptions.method;\n const method = requestMethod ? requestMethod.toUpperCase() : 'GET';\n const headers = requestOptions.headers || {};\n const userAgent = headers['user-agent'];\n const attributes: SpanAttributes = {\n [SemanticAttributes.HTTP_URL]: getAbsoluteUrl(\n requestOptions,\n headers,\n `${options.component}:`\n ),\n [SemanticAttributes.HTTP_METHOD]: method,\n [SemanticAttributes.HTTP_TARGET]: requestOptions.path || '/',\n [SemanticAttributes.NET_PEER_NAME]: hostname,\n };\n\n if (userAgent !== undefined) {\n attributes[SemanticAttributes.HTTP_USER_AGENT] = userAgent;\n }\n return Object.assign(attributes, options.hookAttributes);\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 getAttributesFromHttpKind = (kind?: string): SpanAttributes => {\n const attributes: SpanAttributes = {};\n if (kind) {\n attributes[SemanticAttributes.HTTP_FLAVOR] = kind;\n if (kind.toUpperCase() !== 'QUIC') {\n attributes[SemanticAttributes.NET_TRANSPORT] = NetTransportValues.IP_TCP;\n } else {\n attributes[SemanticAttributes.NET_TRANSPORT] = NetTransportValues.IP_UDP;\n }\n }\n return attributes;\n};\n\n/**\n * Returns outgoing request attributes scoped to the response data\n * @param {IncomingMessage} response the response object\n * @param {{ hostname: string }} options used to pass data needed to create attributes\n */\nexport const getOutgoingRequestAttributesOnResponse = (\n response: IncomingMessage,\n options: { hostname: string }\n): SpanAttributes => {\n const { statusCode, statusMessage, httpVersion, socket } = response;\n const { remoteAddress, remotePort } = socket;\n const attributes: SpanAttributes = {\n [SemanticAttributes.NET_PEER_IP]: remoteAddress,\n [SemanticAttributes.NET_PEER_PORT]: remotePort,\n [SemanticAttributes.HTTP_HOST]: `${options.hostname}:${remotePort}`,\n };\n setResponseContentLengthAttribute(response, attributes);\n\n if (statusCode) {\n attributes[SemanticAttributes.HTTP_STATUS_CODE] = statusCode;\n attributes[AttributeNames.HTTP_STATUS_TEXT] = (\n statusMessage || ''\n ).toUpperCase();\n }\n\n const httpKindAttributes = getAttributesFromHttpKind(httpVersion);\n return Object.assign(attributes, httpKindAttributes);\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?: SpanAttributes }} options used to pass data needed to create attributes\n */\nexport const getIncomingRequestAttributes = (\n request: IncomingMessage,\n options: { component: string; serverName?: string; hookAttributes?: SpanAttributes }\n): SpanAttributes => {\n const headers = request.headers;\n const userAgent = headers['user-agent'];\n const ips = headers['x-forwarded-for'];\n const method = request.method || 'GET';\n const httpVersion = request.httpVersion;\n const requestUrl = request.url ? url.parse(request.url) : null;\n const host = requestUrl?.host || headers.host;\n const hostname =\n requestUrl?.hostname ||\n host?.replace(/^(.*)(:[0-9]{1,5})/, '$1') ||\n 'localhost';\n const serverName = options.serverName;\n const attributes: SpanAttributes = {\n [SemanticAttributes.HTTP_URL]: getAbsoluteUrl(\n requestUrl,\n headers,\n `${options.component}:`\n ),\n [SemanticAttributes.HTTP_HOST]: host,\n [SemanticAttributes.NET_HOST_NAME]: hostname,\n [SemanticAttributes.HTTP_METHOD]: method,\n };\n\n if (typeof ips === 'string') {\n attributes[SemanticAttributes.HTTP_CLIENT_IP] = ips.split(',')[0];\n }\n\n if (typeof serverName === 'string') {\n attributes[SemanticAttributes.HTTP_SERVER_NAME] = serverName;\n }\n\n if (requestUrl) {\n attributes[SemanticAttributes.HTTP_TARGET] = requestUrl.pathname || '/';\n }\n\n if (userAgent !== undefined) {\n attributes[SemanticAttributes.HTTP_USER_AGENT] = userAgent;\n }\n setRequestContentLengthAttribute(request, attributes);\n\n const httpKindAttributes = getAttributesFromHttpKind(httpVersion);\n return Object.assign(attributes, httpKindAttributes, options.hookAttributes);\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): SpanAttributes => {\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 const { localAddress, localPort, remoteAddress, remotePort } = socket;\n const rpcMetadata = getRPCMetadata(context.active());\n\n const attributes: SpanAttributes = {\n [SemanticAttributes.NET_HOST_IP]: localAddress,\n [SemanticAttributes.NET_HOST_PORT]: localPort,\n [SemanticAttributes.NET_PEER_IP]: remoteAddress,\n [SemanticAttributes.NET_PEER_PORT]: remotePort,\n [SemanticAttributes.HTTP_STATUS_CODE]: statusCode,\n [AttributeNames.HTTP_STATUS_TEXT]: (statusMessage || '').toUpperCase(),\n };\n\n if (rpcMetadata?.type === RPCType.HTTP && rpcMetadata.route !== undefined) {\n attributes[SemanticAttributes.HTTP_ROUTE] = rpcMetadata.route;\n }\n return attributes;\n};\n\nexport function headerCapture(type: 'request' | 'response', headers: string[]) {\n const normalizedHeaders = new Map(headers.map(header => [header.toLowerCase(), header.toLowerCase().replace(/-/g, '_')]));\n\n return (span: Span, getHeader: (key: string) => undefined | string | string[] | number) => {\n for (const [capturedHeader, normalizedHeader] of normalizedHeaders) {\n const value = getHeader(capturedHeader);\n\n if (value === undefined) {\n continue;\n }\n\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"]}
|
package/build/src/version.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare const VERSION = "0.
|
|
1
|
+
export declare const VERSION = "0.28.0";
|
|
2
2
|
//# sourceMappingURL=version.d.ts.map
|
package/build/src/version.js
CHANGED
package/build/src/version.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;GAcG;;;AAEH,4DAA4D;AAC/C,QAAA,OAAO,GAAG,QAAQ,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.
|
|
1
|
+
{"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;GAcG;;;AAEH,4DAA4D;AAC/C,QAAA,OAAO,GAAG,QAAQ,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.28.0';\n"]}
|
package/package.json
CHANGED
|
@@ -1,22 +1,24 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@opentelemetry/instrumentation-http",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.28.0",
|
|
4
4
|
"description": "OpenTelemetry http/https automatic instrumentation package.",
|
|
5
5
|
"main": "build/src/index.js",
|
|
6
6
|
"types": "build/src/index.d.ts",
|
|
7
7
|
"repository": "open-telemetry/opentelemetry-js",
|
|
8
8
|
"scripts": {
|
|
9
|
+
"prepublishOnly": "npm run compile",
|
|
9
10
|
"compile": "tsc --build",
|
|
10
11
|
"clean": "tsc --build --clean",
|
|
11
12
|
"test": "nyc ts-mocha -p tsconfig.json test/**/*.test.ts",
|
|
12
13
|
"tdd": "npm run test -- --watch-extensions ts --watch",
|
|
13
14
|
"lint": "eslint . --ext .ts",
|
|
14
15
|
"lint:fix": "eslint . --ext .ts --fix",
|
|
15
|
-
"codecov": "nyc report --reporter=json && codecov -f coverage/*.json -p
|
|
16
|
+
"codecov": "nyc report --reporter=json && codecov -f coverage/*.json -p ../../../",
|
|
16
17
|
"version": "node ../../../scripts/version-update.js",
|
|
17
18
|
"watch": "tsc --build --watch",
|
|
18
|
-
"precompile": "lerna run version --scope $(npm pkg get name) --include-
|
|
19
|
-
"prewatch": "node ../../../scripts/version-update.js"
|
|
19
|
+
"precompile": "lerna run version --scope $(npm pkg get name) --include-dependencies",
|
|
20
|
+
"prewatch": "node ../../../scripts/version-update.js",
|
|
21
|
+
"peer-api-check": "node ../../../scripts/peer-api-check.js"
|
|
20
22
|
},
|
|
21
23
|
"keywords": [
|
|
22
24
|
"opentelemetry",
|
|
@@ -29,7 +31,7 @@
|
|
|
29
31
|
"author": "OpenTelemetry Authors",
|
|
30
32
|
"license": "Apache-2.0",
|
|
31
33
|
"engines": {
|
|
32
|
-
"node": ">=8.
|
|
34
|
+
"node": ">=8.12.0"
|
|
33
35
|
},
|
|
34
36
|
"files": [
|
|
35
37
|
"build/src/**/*.js",
|
|
@@ -43,22 +45,22 @@
|
|
|
43
45
|
"access": "public"
|
|
44
46
|
},
|
|
45
47
|
"devDependencies": {
|
|
46
|
-
"@opentelemetry/api": "^1.0.
|
|
47
|
-
"@opentelemetry/context-async-hooks": "1.0
|
|
48
|
-
"@opentelemetry/sdk-trace-base": "1.0
|
|
49
|
-
"@opentelemetry/sdk-trace-node": "1.0
|
|
48
|
+
"@opentelemetry/api": "^1.0.0",
|
|
49
|
+
"@opentelemetry/context-async-hooks": "1.2.0",
|
|
50
|
+
"@opentelemetry/sdk-trace-base": "1.2.0",
|
|
51
|
+
"@opentelemetry/sdk-trace-node": "1.2.0",
|
|
50
52
|
"@types/got": "9.6.12",
|
|
51
53
|
"@types/mocha": "8.2.3",
|
|
52
|
-
"@types/node": "14.17.
|
|
54
|
+
"@types/node": "14.17.33",
|
|
53
55
|
"@types/request-promise-native": "1.0.18",
|
|
54
|
-
"@types/semver": "7.3.
|
|
55
|
-
"@types/sinon": "10.0.
|
|
56
|
-
"@types/superagent": "4.1.
|
|
57
|
-
"axios": "0.
|
|
56
|
+
"@types/semver": "7.3.9",
|
|
57
|
+
"@types/sinon": "10.0.6",
|
|
58
|
+
"@types/superagent": "4.1.13",
|
|
59
|
+
"axios": "0.24.0",
|
|
58
60
|
"codecov": "3.8.3",
|
|
59
61
|
"got": "9.6.0",
|
|
60
62
|
"mocha": "7.2.0",
|
|
61
|
-
"nock": "
|
|
63
|
+
"nock": "13.0.11",
|
|
62
64
|
"nyc": "15.1.0",
|
|
63
65
|
"request": "2.88.2",
|
|
64
66
|
"request-promise-native": "1.0.9",
|
|
@@ -66,16 +68,16 @@
|
|
|
66
68
|
"sinon": "12.0.1",
|
|
67
69
|
"superagent": "6.1.0",
|
|
68
70
|
"ts-mocha": "8.0.0",
|
|
69
|
-
"typescript": "4.
|
|
71
|
+
"typescript": "4.4.4"
|
|
70
72
|
},
|
|
71
73
|
"peerDependencies": {
|
|
72
74
|
"@opentelemetry/api": "^1.0.0"
|
|
73
75
|
},
|
|
74
76
|
"dependencies": {
|
|
75
|
-
"@opentelemetry/core": "1.0
|
|
76
|
-
"@opentelemetry/instrumentation": "0.
|
|
77
|
-
"@opentelemetry/semantic-conventions": "1.0
|
|
77
|
+
"@opentelemetry/core": "1.2.0",
|
|
78
|
+
"@opentelemetry/instrumentation": "0.28.0",
|
|
79
|
+
"@opentelemetry/semantic-conventions": "1.2.0",
|
|
78
80
|
"semver": "^7.3.5"
|
|
79
81
|
},
|
|
80
|
-
"gitHead": "
|
|
82
|
+
"gitHead": "a0a670a03fd35b0799bee8cc466f79e93b5b6dd2"
|
|
81
83
|
}
|