@opentelemetry/instrumentation-http 0.32.0 → 0.33.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 +2 -0
- package/build/src/http.d.ts +7 -0
- package/build/src/http.js +51 -16
- package/build/src/http.js.map +1 -1
- package/build/src/utils.d.ts +22 -0
- package/build/src/utils.js +52 -1
- 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 +10 -8
package/README.md
CHANGED
|
@@ -3,6 +3,8 @@
|
|
|
3
3
|
[![NPM Published Version][npm-img]][npm-url]
|
|
4
4
|
[![Apache License][license-image]][license-image]
|
|
5
5
|
|
|
6
|
+
**Note: This is an experimental package under active development. New releases may include breaking changes.**
|
|
7
|
+
|
|
6
8
|
This module provides automatic instrumentation for [`http`](https://nodejs.org/api/http.html) and [`https`](https://nodejs.org/api/https.html).
|
|
7
9
|
|
|
8
10
|
For automatic instrumentation see the
|
package/build/src/http.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
/// <reference types="node" />
|
|
2
|
+
import { MeterProvider } from '@opentelemetry/api-metrics';
|
|
2
3
|
import type * as http from 'http';
|
|
3
4
|
import * as url from 'url';
|
|
4
5
|
import { Func, Http, HttpInstrumentationConfig, HttpRequestArgs, Https } from './types';
|
|
@@ -11,7 +12,11 @@ export declare class HttpInstrumentation extends InstrumentationBase<Http> {
|
|
|
11
12
|
private readonly _spanNotEnded;
|
|
12
13
|
private readonly _version;
|
|
13
14
|
private _headerCapture;
|
|
15
|
+
private _httpServerDurationHistogram;
|
|
16
|
+
private _httpClientDurationHistogram;
|
|
14
17
|
constructor(config?: HttpInstrumentationConfig);
|
|
18
|
+
setMeterProvider(meterProvider: MeterProvider): void;
|
|
19
|
+
private _updateMetricInstruments;
|
|
15
20
|
private _getConfig;
|
|
16
21
|
setConfig(config?: HttpInstrumentationConfig): void;
|
|
17
22
|
init(): [InstrumentationNodeModuleDefinition<Https>, InstrumentationNodeModuleDefinition<Http>];
|
|
@@ -38,6 +43,8 @@ export declare class HttpInstrumentation extends InstrumentationBase<Http> {
|
|
|
38
43
|
* @param request The original request object.
|
|
39
44
|
* @param options The arguments to the original function.
|
|
40
45
|
* @param span representing the current operation
|
|
46
|
+
* @param startTime representing the start time of the request to calculate duration in Metric
|
|
47
|
+
* @param metricAttributes metric attributes
|
|
41
48
|
*/
|
|
42
49
|
private _traceClientRequest;
|
|
43
50
|
private _incomingRequestFunction;
|
package/build/src/http.js
CHANGED
|
@@ -17,6 +17,7 @@ exports.HttpInstrumentation = void 0;
|
|
|
17
17
|
* limitations under the License.
|
|
18
18
|
*/
|
|
19
19
|
const api_1 = require("@opentelemetry/api");
|
|
20
|
+
const api_metrics_1 = require("@opentelemetry/api-metrics");
|
|
20
21
|
const core_1 = require("@opentelemetry/core");
|
|
21
22
|
const semver = require("semver");
|
|
22
23
|
const url = require("url");
|
|
@@ -34,6 +35,23 @@ class HttpInstrumentation extends instrumentation_1.InstrumentationBase {
|
|
|
34
35
|
this._spanNotEnded = new WeakSet();
|
|
35
36
|
this._version = process.versions.node;
|
|
36
37
|
this._headerCapture = this._createHeaderCapture();
|
|
38
|
+
this._updateMetricInstruments();
|
|
39
|
+
}
|
|
40
|
+
setMeterProvider(meterProvider) {
|
|
41
|
+
super.setMeterProvider(meterProvider);
|
|
42
|
+
this._updateMetricInstruments();
|
|
43
|
+
}
|
|
44
|
+
_updateMetricInstruments() {
|
|
45
|
+
this._httpServerDurationHistogram = this.meter.createHistogram('http.server.duration', {
|
|
46
|
+
description: 'measures the duration of the inbound HTTP requests',
|
|
47
|
+
unit: 'ms',
|
|
48
|
+
valueType: api_metrics_1.ValueType.DOUBLE
|
|
49
|
+
});
|
|
50
|
+
this._httpClientDurationHistogram = this.meter.createHistogram('http.client.duration', {
|
|
51
|
+
description: 'measures the duration of the outbound HTTP requests',
|
|
52
|
+
unit: 'ms',
|
|
53
|
+
valueType: api_metrics_1.ValueType.DOUBLE
|
|
54
|
+
});
|
|
37
55
|
}
|
|
38
56
|
_getConfig() {
|
|
39
57
|
return this._config;
|
|
@@ -171,8 +189,10 @@ class HttpInstrumentation extends instrumentation_1.InstrumentationBase {
|
|
|
171
189
|
* @param request The original request object.
|
|
172
190
|
* @param options The arguments to the original function.
|
|
173
191
|
* @param span representing the current operation
|
|
192
|
+
* @param startTime representing the start time of the request to calculate duration in Metric
|
|
193
|
+
* @param metricAttributes metric attributes
|
|
174
194
|
*/
|
|
175
|
-
_traceClientRequest(request, hostname, span) {
|
|
195
|
+
_traceClientRequest(request, hostname, span, startTime, metricAttributes) {
|
|
176
196
|
if (this._getConfig().requestHook) {
|
|
177
197
|
this._callRequestHook(span, request);
|
|
178
198
|
}
|
|
@@ -184,6 +204,7 @@ class HttpInstrumentation extends instrumentation_1.InstrumentationBase {
|
|
|
184
204
|
request.prependListener('response', (response) => {
|
|
185
205
|
const responseAttributes = utils.getOutgoingRequestAttributesOnResponse(response);
|
|
186
206
|
span.setAttributes(responseAttributes);
|
|
207
|
+
metricAttributes = Object.assign(metricAttributes, utils.getOutgoingRequestMetricAttributesOnResponse(responseAttributes));
|
|
187
208
|
if (this._getConfig().responseHook) {
|
|
188
209
|
this._callResponseHook(span, response);
|
|
189
210
|
}
|
|
@@ -204,26 +225,26 @@ class HttpInstrumentation extends instrumentation_1.InstrumentationBase {
|
|
|
204
225
|
if (this._getConfig().applyCustomAttributesOnSpan) {
|
|
205
226
|
(0, instrumentation_1.safeExecuteInTheMiddle)(() => this._getConfig().applyCustomAttributesOnSpan(span, request, response), () => { }, true);
|
|
206
227
|
}
|
|
207
|
-
this._closeHttpSpan(span);
|
|
228
|
+
this._closeHttpSpan(span, api_1.SpanKind.CLIENT, startTime, metricAttributes);
|
|
208
229
|
});
|
|
209
230
|
response.on('error', (error) => {
|
|
210
231
|
this._diag.debug('outgoingRequest on error()', error);
|
|
211
232
|
utils.setSpanWithError(span, error);
|
|
212
233
|
const code = utils.parseResponseStatus(api_1.SpanKind.CLIENT, response.statusCode);
|
|
213
234
|
span.setStatus({ code, message: error.message });
|
|
214
|
-
this._closeHttpSpan(span);
|
|
235
|
+
this._closeHttpSpan(span, api_1.SpanKind.CLIENT, startTime, metricAttributes);
|
|
215
236
|
});
|
|
216
237
|
});
|
|
217
238
|
request.on('close', () => {
|
|
218
239
|
this._diag.debug('outgoingRequest on request close()');
|
|
219
240
|
if (!request.aborted) {
|
|
220
|
-
this._closeHttpSpan(span);
|
|
241
|
+
this._closeHttpSpan(span, api_1.SpanKind.CLIENT, startTime, metricAttributes);
|
|
221
242
|
}
|
|
222
243
|
});
|
|
223
244
|
request.on('error', (error) => {
|
|
224
245
|
this._diag.debug('outgoingRequest on request error()', error);
|
|
225
246
|
utils.setSpanWithError(span, error);
|
|
226
|
-
this._closeHttpSpan(span);
|
|
247
|
+
this._closeHttpSpan(span, api_1.SpanKind.CLIENT, startTime, metricAttributes);
|
|
227
248
|
});
|
|
228
249
|
this._diag.debug('http.ClientRequest return request');
|
|
229
250
|
return request;
|
|
@@ -255,14 +276,17 @@ class HttpInstrumentation extends instrumentation_1.InstrumentationBase {
|
|
|
255
276
|
});
|
|
256
277
|
}
|
|
257
278
|
const headers = request.headers;
|
|
279
|
+
const spanAttributes = utils.getIncomingRequestAttributes(request, {
|
|
280
|
+
component: component,
|
|
281
|
+
serverName: instrumentation._getConfig().serverName,
|
|
282
|
+
hookAttributes: instrumentation._callStartSpanHook(request, instrumentation._getConfig().startIncomingSpanHook),
|
|
283
|
+
});
|
|
258
284
|
const spanOptions = {
|
|
259
285
|
kind: api_1.SpanKind.SERVER,
|
|
260
|
-
attributes:
|
|
261
|
-
component: component,
|
|
262
|
-
serverName: instrumentation._getConfig().serverName,
|
|
263
|
-
hookAttributes: instrumentation._callStartSpanHook(request, instrumentation._getConfig().startIncomingSpanHook),
|
|
264
|
-
}),
|
|
286
|
+
attributes: spanAttributes,
|
|
265
287
|
};
|
|
288
|
+
const startTime = (0, core_1.hrTime)();
|
|
289
|
+
let metricAttributes = utils.getIncomingRequestMetricAttributes(spanAttributes);
|
|
266
290
|
const ctx = api_1.propagation.extract(api_1.ROOT_CONTEXT, headers);
|
|
267
291
|
const span = instrumentation._startHttpSpan(`${component.toLocaleUpperCase()} ${method}`, spanOptions, ctx);
|
|
268
292
|
const rpcMetadata = {
|
|
@@ -288,11 +312,12 @@ class HttpInstrumentation extends instrumentation_1.InstrumentationBase {
|
|
|
288
312
|
const returned = (0, instrumentation_1.safeExecuteInTheMiddle)(() => response.end.apply(this, arguments), error => {
|
|
289
313
|
if (error) {
|
|
290
314
|
utils.setSpanWithError(span, error);
|
|
291
|
-
instrumentation._closeHttpSpan(span);
|
|
315
|
+
instrumentation._closeHttpSpan(span, api_1.SpanKind.SERVER, startTime, metricAttributes);
|
|
292
316
|
throw error;
|
|
293
317
|
}
|
|
294
318
|
});
|
|
295
319
|
const attributes = utils.getIncomingRequestAttributesOnResponse(request, response);
|
|
320
|
+
metricAttributes = Object.assign(metricAttributes, utils.getIncomingRequestMetricAttributesOnResponse(attributes));
|
|
296
321
|
instrumentation._headerCapture.server.captureResponseHeaders(span, header => response.getHeader(header));
|
|
297
322
|
span
|
|
298
323
|
.setAttributes(attributes)
|
|
@@ -300,13 +325,13 @@ class HttpInstrumentation extends instrumentation_1.InstrumentationBase {
|
|
|
300
325
|
if (instrumentation._getConfig().applyCustomAttributesOnSpan) {
|
|
301
326
|
(0, instrumentation_1.safeExecuteInTheMiddle)(() => instrumentation._getConfig().applyCustomAttributesOnSpan(span, request, response), () => { }, true);
|
|
302
327
|
}
|
|
303
|
-
instrumentation._closeHttpSpan(span);
|
|
328
|
+
instrumentation._closeHttpSpan(span, api_1.SpanKind.SERVER, startTime, metricAttributes);
|
|
304
329
|
return returned;
|
|
305
330
|
};
|
|
306
331
|
return (0, instrumentation_1.safeExecuteInTheMiddle)(() => original.apply(this, [event, ...args]), error => {
|
|
307
332
|
if (error) {
|
|
308
333
|
utils.setSpanWithError(span, error);
|
|
309
|
-
instrumentation._closeHttpSpan(span);
|
|
334
|
+
instrumentation._closeHttpSpan(span, api_1.SpanKind.SERVER, startTime, metricAttributes);
|
|
310
335
|
throw error;
|
|
311
336
|
}
|
|
312
337
|
});
|
|
@@ -350,6 +375,8 @@ class HttpInstrumentation extends instrumentation_1.InstrumentationBase {
|
|
|
350
375
|
hostname,
|
|
351
376
|
hookAttributes: instrumentation._callStartSpanHook(optionsParsed, instrumentation._getConfig().startOutgoingSpanHook),
|
|
352
377
|
});
|
|
378
|
+
const startTime = (0, core_1.hrTime)();
|
|
379
|
+
const metricAttributes = utils.getOutgoingRequestMetricAttributes(attributes);
|
|
353
380
|
const spanOptions = {
|
|
354
381
|
kind: api_1.SpanKind.CLIENT,
|
|
355
382
|
attributes,
|
|
@@ -373,13 +400,13 @@ class HttpInstrumentation extends instrumentation_1.InstrumentationBase {
|
|
|
373
400
|
const request = (0, instrumentation_1.safeExecuteInTheMiddle)(() => original.apply(this, [optionsParsed, ...args]), error => {
|
|
374
401
|
if (error) {
|
|
375
402
|
utils.setSpanWithError(span, error);
|
|
376
|
-
instrumentation._closeHttpSpan(span);
|
|
403
|
+
instrumentation._closeHttpSpan(span, api_1.SpanKind.CLIENT, startTime, metricAttributes);
|
|
377
404
|
throw error;
|
|
378
405
|
}
|
|
379
406
|
});
|
|
380
407
|
instrumentation._diag.debug(`${component} instrumentation outgoingRequest`);
|
|
381
408
|
api_1.context.bind(parentContext, request);
|
|
382
|
-
return instrumentation._traceClientRequest(request, hostname, span);
|
|
409
|
+
return instrumentation._traceClientRequest(request, hostname, span, startTime, metricAttributes);
|
|
383
410
|
});
|
|
384
411
|
};
|
|
385
412
|
}
|
|
@@ -405,12 +432,20 @@ class HttpInstrumentation extends instrumentation_1.InstrumentationBase {
|
|
|
405
432
|
this._spanNotEnded.add(span);
|
|
406
433
|
return span;
|
|
407
434
|
}
|
|
408
|
-
_closeHttpSpan(span) {
|
|
435
|
+
_closeHttpSpan(span, spanKind, startTime, metricAttributes) {
|
|
409
436
|
if (!this._spanNotEnded.has(span)) {
|
|
410
437
|
return;
|
|
411
438
|
}
|
|
412
439
|
span.end();
|
|
413
440
|
this._spanNotEnded.delete(span);
|
|
441
|
+
// Record metrics
|
|
442
|
+
const duration = (0, core_1.hrTimeToMilliseconds)((0, core_1.hrTimeDuration)(startTime, (0, core_1.hrTime)()));
|
|
443
|
+
if (spanKind === api_1.SpanKind.SERVER) {
|
|
444
|
+
this._httpServerDurationHistogram.record(duration, metricAttributes);
|
|
445
|
+
}
|
|
446
|
+
else if (spanKind === api_1.SpanKind.CLIENT) {
|
|
447
|
+
this._httpClientDurationHistogram.record(duration, metricAttributes);
|
|
448
|
+
}
|
|
414
449
|
}
|
|
415
450
|
_callResponseHook(span, response) {
|
|
416
451
|
(0, instrumentation_1.safeExecuteInTheMiddle)(() => this._getConfig().responseHook(span, response), () => { }, true);
|
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 );\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 const { hostname, port } = utils.extractHostnameAndPort(optionsParsed);\n\n const attributes = utils.getOutgoingRequestAttributes(optionsParsed, {\n component,\n port,\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 HrTime,\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 { Histogram, MeterProvider, MetricAttributes, ValueType } from '@opentelemetry/api-metrics';\nimport { hrTime, hrTimeDuration, hrTimeToMilliseconds, 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 private _httpServerDurationHistogram!: Histogram;\n private _httpClientDurationHistogram!: Histogram;\n\n constructor(config?: HttpInstrumentationConfig) {\n super(\n '@opentelemetry/instrumentation-http',\n VERSION,\n config\n );\n this._headerCapture = this._createHeaderCapture();\n this._updateMetricInstruments();\n }\n\n override setMeterProvider(meterProvider: MeterProvider) {\n super.setMeterProvider(meterProvider);\n this._updateMetricInstruments();\n }\n\n private _updateMetricInstruments() {\n this._httpServerDurationHistogram = this.meter.createHistogram('http.server.duration', {\n description: 'measures the duration of the inbound HTTP requests',\n unit: 'ms',\n valueType: ValueType.DOUBLE\n });\n this._httpClientDurationHistogram = this.meter.createHistogram('http.client.duration', {\n description: 'measures the duration of the outbound HTTP requests',\n unit: 'ms',\n valueType: ValueType.DOUBLE\n });\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 * @param startTime representing the start time of the request to calculate duration in Metric\n * @param metricAttributes metric attributes\n */\n private _traceClientRequest(\n request: http.ClientRequest,\n hostname: string,\n span: Span,\n startTime: HrTime,\n metricAttributes: MetricAttributes\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 );\n span.setAttributes(responseAttributes);\n metricAttributes = Object.assign(metricAttributes, utils.getOutgoingRequestMetricAttributesOnResponse(responseAttributes));\n\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, SpanKind.CLIENT, startTime, metricAttributes);\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, SpanKind.CLIENT, startTime, metricAttributes);\n });\n }\n );\n request.on('close', () => {\n this._diag.debug('outgoingRequest on request close()');\n if (!request.aborted) {\n this._closeHttpSpan(span, SpanKind.CLIENT, startTime, metricAttributes);\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, SpanKind.CLIENT, startTime, metricAttributes);\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 spanAttributes = 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 const spanOptions: SpanOptions = {\n kind: SpanKind.SERVER,\n attributes: spanAttributes,\n };\n\n const startTime = hrTime();\n let metricAttributes: MetricAttributes = utils.getIncomingRequestMetricAttributes(spanAttributes);\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, SpanKind.SERVER, startTime, metricAttributes);\n throw error;\n }\n }\n );\n\n const attributes = utils.getIncomingRequestAttributesOnResponse(\n request,\n response\n );\n metricAttributes = Object.assign(metricAttributes, utils.getIncomingRequestMetricAttributesOnResponse(attributes));\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, SpanKind.SERVER, startTime, metricAttributes);\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, SpanKind.SERVER, startTime, metricAttributes);\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 const { hostname, port } = utils.extractHostnameAndPort(optionsParsed);\n\n const attributes = utils.getOutgoingRequestAttributes(optionsParsed, {\n component,\n port,\n hostname,\n hookAttributes: instrumentation._callStartSpanHook(\n optionsParsed,\n instrumentation._getConfig().startOutgoingSpanHook\n ),\n });\n\n const startTime = hrTime();\n const metricAttributes: MetricAttributes = utils.getOutgoingRequestMetricAttributes(attributes);\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, SpanKind.CLIENT, startTime, metricAttributes);\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 startTime,\n metricAttributes\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, spanKind: SpanKind, startTime: HrTime, metricAttributes: MetricAttributes) {\n if (!this._spanNotEnded.has(span)) {\n return;\n }\n\n span.end();\n this._spanNotEnded.delete(span);\n\n // Record metrics\n const duration = hrTimeToMilliseconds(hrTimeDuration(startTime, hrTime()));\n if (spanKind === SpanKind.SERVER) {\n this._httpServerDurationHistogram.record(duration, metricAttributes);\n } else if (spanKind === SpanKind.CLIENT) {\n this._httpClientDurationHistogram.record(duration, metricAttributes);\n }\n }\n\n private _callResponseHook(\n span: Span,\n response: http.IncomingMessage | http.ServerResponse\n ) {\n safeExecuteInTheMiddle(\n () => this._getConfig().responseHook!(span, response),\n () => { },\n true\n );\n }\n\n private _callRequestHook(\n span: Span,\n request: http.ClientRequest | http.IncomingMessage\n ) {\n safeExecuteInTheMiddle(\n () => this._getConfig().requestHook!(span, request),\n () => { },\n true\n );\n }\n\n private _callStartSpanHook(\n request: http.IncomingMessage | http.RequestOptions,\n hookFunc: Function | undefined,\n ) {\n if (typeof hookFunc === 'function') {\n return safeExecuteInTheMiddle(\n () => hookFunc(request),\n () => { },\n true\n );\n }\n }\n\n private _createHeaderCapture() {\n const config = this._getConfig();\n\n return {\n client: {\n captureRequestHeaders: 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/utils.d.ts
CHANGED
|
@@ -2,6 +2,7 @@ import { SpanAttributes, SpanStatusCode, Span, SpanKind } from '@opentelemetry/a
|
|
|
2
2
|
import { IncomingHttpHeaders, IncomingMessage, OutgoingHttpHeaders, RequestOptions, ServerResponse } from 'http';
|
|
3
3
|
import * as url from 'url';
|
|
4
4
|
import { Err, IgnoreMatcher, ParsedRequestOptions } from './types';
|
|
5
|
+
import { MetricAttributes } from '@opentelemetry/api-metrics';
|
|
5
6
|
/**
|
|
6
7
|
* Get an absolute url
|
|
7
8
|
*/
|
|
@@ -76,6 +77,11 @@ export declare const getOutgoingRequestAttributes: (requestOptions: ParsedReques
|
|
|
76
77
|
port: string | number;
|
|
77
78
|
hookAttributes?: SpanAttributes;
|
|
78
79
|
}) => SpanAttributes;
|
|
80
|
+
/**
|
|
81
|
+
* Returns outgoing request Metric attributes scoped to the request data
|
|
82
|
+
* @param {SpanAttributes} spanAttributes the span attributes
|
|
83
|
+
*/
|
|
84
|
+
export declare const getOutgoingRequestMetricAttributes: (spanAttributes: SpanAttributes) => MetricAttributes;
|
|
79
85
|
/**
|
|
80
86
|
* Returns attributes related to the kind of HTTP protocol used
|
|
81
87
|
* @param {string} [kind] Kind of HTTP protocol used: "1.0", "1.1", "2", "SPDY" or "QUIC".
|
|
@@ -87,6 +93,11 @@ export declare const getAttributesFromHttpKind: (kind?: string | undefined) => S
|
|
|
87
93
|
* @param {{ hostname: string }} options used to pass data needed to create attributes
|
|
88
94
|
*/
|
|
89
95
|
export declare const getOutgoingRequestAttributesOnResponse: (response: IncomingMessage) => SpanAttributes;
|
|
96
|
+
/**
|
|
97
|
+
* Returns outgoing request Metric attributes scoped to the response data
|
|
98
|
+
* @param {SpanAttributes} spanAttributes the span attributes
|
|
99
|
+
*/
|
|
100
|
+
export declare const getOutgoingRequestMetricAttributesOnResponse: (spanAttributes: SpanAttributes) => MetricAttributes;
|
|
90
101
|
/**
|
|
91
102
|
* Returns incoming request attributes scoped to the request data
|
|
92
103
|
* @param {IncomingMessage} request the request object
|
|
@@ -97,10 +108,21 @@ export declare const getIncomingRequestAttributes: (request: IncomingMessage, op
|
|
|
97
108
|
serverName?: string;
|
|
98
109
|
hookAttributes?: SpanAttributes;
|
|
99
110
|
}) => SpanAttributes;
|
|
111
|
+
/**
|
|
112
|
+
* Returns incoming request Metric attributes scoped to the request data
|
|
113
|
+
* @param {SpanAttributes} spanAttributes the span attributes
|
|
114
|
+
* @param {{ component: string }} options used to pass data needed to create attributes
|
|
115
|
+
*/
|
|
116
|
+
export declare const getIncomingRequestMetricAttributes: (spanAttributes: SpanAttributes) => MetricAttributes;
|
|
100
117
|
/**
|
|
101
118
|
* Returns incoming request attributes scoped to the response data
|
|
102
119
|
* @param {(ServerResponse & { socket: Socket; })} response the response object
|
|
103
120
|
*/
|
|
104
121
|
export declare const getIncomingRequestAttributesOnResponse: (request: IncomingMessage, response: ServerResponse) => SpanAttributes;
|
|
122
|
+
/**
|
|
123
|
+
* Returns incoming request Metric attributes scoped to the request data
|
|
124
|
+
* @param {SpanAttributes} spanAttributes the span attributes
|
|
125
|
+
*/
|
|
126
|
+
export declare const getIncomingRequestMetricAttributesOnResponse: (spanAttributes: SpanAttributes) => MetricAttributes;
|
|
105
127
|
export declare function headerCapture(type: 'request' | 'response', headers: string[]): (span: Span, getHeader: (key: string) => undefined | string | string[] | number) => void;
|
|
106
128
|
//# sourceMappingURL=utils.d.ts.map
|
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.extractHostnameAndPort = exports.isValidOptionsType = exports.getRequestInfo = exports.isCompressed = exports.setResponseContentLengthAttribute = exports.setRequestContentLengthAttribute = exports.setSpanWithError = exports.isIgnored = exports.satisfiesPattern = exports.parseResponseStatus = exports.getAbsoluteUrl = void 0;
|
|
3
|
+
exports.headerCapture = exports.getIncomingRequestMetricAttributesOnResponse = exports.getIncomingRequestAttributesOnResponse = exports.getIncomingRequestMetricAttributes = exports.getIncomingRequestAttributes = exports.getOutgoingRequestMetricAttributesOnResponse = exports.getOutgoingRequestAttributesOnResponse = exports.getAttributesFromHttpKind = exports.getOutgoingRequestMetricAttributes = exports.getOutgoingRequestAttributes = exports.extractHostnameAndPort = 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
|
*
|
|
@@ -286,6 +286,18 @@ const getOutgoingRequestAttributes = (requestOptions, options) => {
|
|
|
286
286
|
return Object.assign(attributes, options.hookAttributes);
|
|
287
287
|
};
|
|
288
288
|
exports.getOutgoingRequestAttributes = getOutgoingRequestAttributes;
|
|
289
|
+
/**
|
|
290
|
+
* Returns outgoing request Metric attributes scoped to the request data
|
|
291
|
+
* @param {SpanAttributes} spanAttributes the span attributes
|
|
292
|
+
*/
|
|
293
|
+
const getOutgoingRequestMetricAttributes = (spanAttributes) => {
|
|
294
|
+
const metricAttributes = {};
|
|
295
|
+
metricAttributes[semantic_conventions_1.SemanticAttributes.HTTP_METHOD] = spanAttributes[semantic_conventions_1.SemanticAttributes.HTTP_METHOD];
|
|
296
|
+
metricAttributes[semantic_conventions_1.SemanticAttributes.NET_PEER_NAME] = spanAttributes[semantic_conventions_1.SemanticAttributes.NET_PEER_NAME];
|
|
297
|
+
//TODO: http.url attribute, it should susbtitute any parameters to avoid high cardinality.
|
|
298
|
+
return metricAttributes;
|
|
299
|
+
};
|
|
300
|
+
exports.getOutgoingRequestMetricAttributes = getOutgoingRequestMetricAttributes;
|
|
289
301
|
/**
|
|
290
302
|
* Returns attributes related to the kind of HTTP protocol used
|
|
291
303
|
* @param {string} [kind] Kind of HTTP protocol used: "1.0", "1.1", "2", "SPDY" or "QUIC".
|
|
@@ -325,6 +337,18 @@ const getOutgoingRequestAttributesOnResponse = (response) => {
|
|
|
325
337
|
return Object.assign(attributes, httpKindAttributes);
|
|
326
338
|
};
|
|
327
339
|
exports.getOutgoingRequestAttributesOnResponse = getOutgoingRequestAttributesOnResponse;
|
|
340
|
+
/**
|
|
341
|
+
* Returns outgoing request Metric attributes scoped to the response data
|
|
342
|
+
* @param {SpanAttributes} spanAttributes the span attributes
|
|
343
|
+
*/
|
|
344
|
+
const getOutgoingRequestMetricAttributesOnResponse = (spanAttributes) => {
|
|
345
|
+
const metricAttributes = {};
|
|
346
|
+
metricAttributes[semantic_conventions_1.SemanticAttributes.NET_PEER_PORT] = spanAttributes[semantic_conventions_1.SemanticAttributes.NET_PEER_PORT];
|
|
347
|
+
metricAttributes[semantic_conventions_1.SemanticAttributes.HTTP_STATUS_CODE] = spanAttributes[semantic_conventions_1.SemanticAttributes.HTTP_STATUS_CODE];
|
|
348
|
+
metricAttributes[semantic_conventions_1.SemanticAttributes.HTTP_FLAVOR] = spanAttributes[semantic_conventions_1.SemanticAttributes.HTTP_FLAVOR];
|
|
349
|
+
return metricAttributes;
|
|
350
|
+
};
|
|
351
|
+
exports.getOutgoingRequestMetricAttributesOnResponse = getOutgoingRequestMetricAttributesOnResponse;
|
|
328
352
|
/**
|
|
329
353
|
* Returns incoming request attributes scoped to the request data
|
|
330
354
|
* @param {IncomingMessage} request the request object
|
|
@@ -347,6 +371,7 @@ const getIncomingRequestAttributes = (request, options) => {
|
|
|
347
371
|
[semantic_conventions_1.SemanticAttributes.HTTP_HOST]: host,
|
|
348
372
|
[semantic_conventions_1.SemanticAttributes.NET_HOST_NAME]: hostname,
|
|
349
373
|
[semantic_conventions_1.SemanticAttributes.HTTP_METHOD]: method,
|
|
374
|
+
[semantic_conventions_1.SemanticAttributes.HTTP_SCHEME]: options.component,
|
|
350
375
|
};
|
|
351
376
|
if (typeof ips === 'string') {
|
|
352
377
|
attributes[semantic_conventions_1.SemanticAttributes.HTTP_CLIENT_IP] = ips.split(',')[0];
|
|
@@ -365,6 +390,21 @@ const getIncomingRequestAttributes = (request, options) => {
|
|
|
365
390
|
return Object.assign(attributes, httpKindAttributes, options.hookAttributes);
|
|
366
391
|
};
|
|
367
392
|
exports.getIncomingRequestAttributes = getIncomingRequestAttributes;
|
|
393
|
+
/**
|
|
394
|
+
* Returns incoming request Metric attributes scoped to the request data
|
|
395
|
+
* @param {SpanAttributes} spanAttributes the span attributes
|
|
396
|
+
* @param {{ component: string }} options used to pass data needed to create attributes
|
|
397
|
+
*/
|
|
398
|
+
const getIncomingRequestMetricAttributes = (spanAttributes) => {
|
|
399
|
+
const metricAttributes = {};
|
|
400
|
+
metricAttributes[semantic_conventions_1.SemanticAttributes.HTTP_SCHEME] = spanAttributes[semantic_conventions_1.SemanticAttributes.HTTP_SCHEME];
|
|
401
|
+
metricAttributes[semantic_conventions_1.SemanticAttributes.HTTP_METHOD] = spanAttributes[semantic_conventions_1.SemanticAttributes.HTTP_METHOD];
|
|
402
|
+
metricAttributes[semantic_conventions_1.SemanticAttributes.NET_HOST_NAME] = spanAttributes[semantic_conventions_1.SemanticAttributes.NET_HOST_NAME];
|
|
403
|
+
metricAttributes[semantic_conventions_1.SemanticAttributes.HTTP_FLAVOR] = spanAttributes[semantic_conventions_1.SemanticAttributes.HTTP_FLAVOR];
|
|
404
|
+
//TODO: http.target attribute, it should susbtitute any parameters to avoid high cardinality.
|
|
405
|
+
return metricAttributes;
|
|
406
|
+
};
|
|
407
|
+
exports.getIncomingRequestMetricAttributes = getIncomingRequestMetricAttributes;
|
|
368
408
|
/**
|
|
369
409
|
* Returns incoming request attributes scoped to the response data
|
|
370
410
|
* @param {(ServerResponse & { socket: Socket; })} response the response object
|
|
@@ -390,6 +430,17 @@ const getIncomingRequestAttributesOnResponse = (request, response) => {
|
|
|
390
430
|
return attributes;
|
|
391
431
|
};
|
|
392
432
|
exports.getIncomingRequestAttributesOnResponse = getIncomingRequestAttributesOnResponse;
|
|
433
|
+
/**
|
|
434
|
+
* Returns incoming request Metric attributes scoped to the request data
|
|
435
|
+
* @param {SpanAttributes} spanAttributes the span attributes
|
|
436
|
+
*/
|
|
437
|
+
const getIncomingRequestMetricAttributesOnResponse = (spanAttributes) => {
|
|
438
|
+
const metricAttributes = {};
|
|
439
|
+
metricAttributes[semantic_conventions_1.SemanticAttributes.HTTP_STATUS_CODE] = spanAttributes[semantic_conventions_1.SemanticAttributes.HTTP_STATUS_CODE];
|
|
440
|
+
metricAttributes[semantic_conventions_1.SemanticAttributes.NET_HOST_PORT] = spanAttributes[semantic_conventions_1.SemanticAttributes.NET_HOST_PORT];
|
|
441
|
+
return metricAttributes;
|
|
442
|
+
};
|
|
443
|
+
exports.getIncomingRequestMetricAttributesOnResponse = getIncomingRequestMetricAttributesOnResponse;
|
|
393
444
|
function headerCapture(type, headers) {
|
|
394
445
|
const normalizedHeaders = new Map(headers.map(header => [header.toLowerCase(), header.toLowerCase().replace(/-/g, '_')]));
|
|
395
446
|
return (span, getHeader) => {
|
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 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 span.recordException(error);\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 const hostname = optionsParsed.host || (optionsParsed.port != null ? `${optionsParsed.hostname}${optionsParsed.port}` : optionsParsed.hostname);\n origin = `${optionsParsed.protocol || 'http:'}//${hostname}`;\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\nexport const extractHostnameAndPort = (\n requestOptions: Pick<ParsedRequestOptions, 'hostname' | 'host' | 'port' | 'protocol'>\n): { hostname: string, port: number | string } => {\n if (requestOptions.hostname && requestOptions.port) {\n return {hostname: requestOptions.hostname, port: requestOptions.port};\n }\n const matches = requestOptions.host?.match(/^([^:/ ]+)(:\\d{1,5})?/) || null;\n const hostname = requestOptions.hostname || (matches === null ? 'localhost' : matches[1]);\n let port = requestOptions.port;\n if (!port) {\n if (matches && matches[2]) {\n // remove the leading \":\". The extracted port would be something like \":8080\"\n port = matches[2].substring(1);\n } else {\n port = requestOptions.protocol === 'https:' ? '443' : '80';\n }\n }\n return {hostname, port};\n};\n\n/**\n * Returns outgoing request attributes scoped to the options passed to the request\n * @param {ParsedRequestOptions} requestOptions the same options used to make the request\n * @param {{ component: string, hostname: string, hookAttributes?: SpanAttributes }} options used to pass data needed to create attributes\n */\nexport const getOutgoingRequestAttributes = (\n requestOptions: ParsedRequestOptions,\n options: { component: string; hostname: string; port: string | number, hookAttributes?: SpanAttributes }\n): SpanAttributes => {\n const hostname = options.hostname;\n const port = options.port;\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 [SemanticAttributes.HTTP_HOST]: requestOptions.headers?.host ?? `${hostname}:${port}`,\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): 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 };\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';\nimport { MetricAttributes } from '@opentelemetry/api-metrics';\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 span.recordException(error);\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 const hostname = optionsParsed.host || (optionsParsed.port != null ? `${optionsParsed.hostname}${optionsParsed.port}` : optionsParsed.hostname);\n origin = `${optionsParsed.protocol || 'http:'}//${hostname}`;\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\nexport const extractHostnameAndPort = (\n requestOptions: Pick<ParsedRequestOptions, 'hostname' | 'host' | 'port' | 'protocol'>\n): { hostname: string, port: number | string } => {\n if (requestOptions.hostname && requestOptions.port) {\n return { hostname: requestOptions.hostname, port: requestOptions.port };\n }\n const matches = requestOptions.host?.match(/^([^:/ ]+)(:\\d{1,5})?/) || null;\n const hostname = requestOptions.hostname || (matches === null ? 'localhost' : matches[1]);\n let port = requestOptions.port;\n if (!port) {\n if (matches && matches[2]) {\n // remove the leading \":\". The extracted port would be something like \":8080\"\n port = matches[2].substring(1);\n } else {\n port = requestOptions.protocol === 'https:' ? '443' : '80';\n }\n }\n return { hostname, port };\n};\n\n/**\n * Returns outgoing request attributes scoped to the options passed to the request\n * @param {ParsedRequestOptions} requestOptions the same options used to make the request\n * @param {{ component: string, hostname: string, hookAttributes?: SpanAttributes }} options used to pass data needed to create attributes\n */\nexport const getOutgoingRequestAttributes = (\n requestOptions: ParsedRequestOptions,\n options: { component: string; hostname: string; port: string | number, hookAttributes?: SpanAttributes }\n): SpanAttributes => {\n const hostname = options.hostname;\n const port = options.port;\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 [SemanticAttributes.HTTP_HOST]: requestOptions.headers?.host ?? `${hostname}:${port}`,\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 outgoing request Metric attributes scoped to the request data\n * @param {SpanAttributes} spanAttributes the span attributes\n */\nexport const getOutgoingRequestMetricAttributes = (\n spanAttributes: SpanAttributes\n): MetricAttributes => {\n const metricAttributes: MetricAttributes = {};\n metricAttributes[SemanticAttributes.HTTP_METHOD] = spanAttributes[SemanticAttributes.HTTP_METHOD];\n metricAttributes[SemanticAttributes.NET_PEER_NAME] = spanAttributes[SemanticAttributes.NET_PEER_NAME];\n //TODO: http.url attribute, it should susbtitute any parameters to avoid high cardinality.\n return metricAttributes;\n};\n\n/**\n * Returns attributes related to the kind of HTTP protocol used\n * @param {string} [kind] Kind of HTTP protocol used: \"1.0\", \"1.1\", \"2\", \"SPDY\" or \"QUIC\".\n */\nexport const 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): 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 };\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 outgoing request Metric attributes scoped to the response data\n * @param {SpanAttributes} spanAttributes the span attributes\n */\nexport const getOutgoingRequestMetricAttributesOnResponse = (\n spanAttributes: SpanAttributes\n): MetricAttributes => {\n const metricAttributes: MetricAttributes = {};\n metricAttributes[SemanticAttributes.NET_PEER_PORT] = spanAttributes[SemanticAttributes.NET_PEER_PORT];\n metricAttributes[SemanticAttributes.HTTP_STATUS_CODE] = spanAttributes[SemanticAttributes.HTTP_STATUS_CODE];\n metricAttributes[SemanticAttributes.HTTP_FLAVOR] = spanAttributes[SemanticAttributes.HTTP_FLAVOR];\n return metricAttributes;\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 [SemanticAttributes.HTTP_SCHEME]: options.component,\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 Metric attributes scoped to the request data\n * @param {SpanAttributes} spanAttributes the span attributes\n * @param {{ component: string }} options used to pass data needed to create attributes\n */\nexport const getIncomingRequestMetricAttributes = (\n spanAttributes: SpanAttributes\n): MetricAttributes => {\n const metricAttributes: MetricAttributes = {};\n metricAttributes[SemanticAttributes.HTTP_SCHEME] = spanAttributes[SemanticAttributes.HTTP_SCHEME];\n metricAttributes[SemanticAttributes.HTTP_METHOD] = spanAttributes[SemanticAttributes.HTTP_METHOD];\n metricAttributes[SemanticAttributes.NET_HOST_NAME] = spanAttributes[SemanticAttributes.NET_HOST_NAME];\n metricAttributes[SemanticAttributes.HTTP_FLAVOR] = spanAttributes[SemanticAttributes.HTTP_FLAVOR];\n //TODO: http.target attribute, it should susbtitute any parameters to avoid high cardinality.\n return metricAttributes;\n};\n\n/**\n * Returns incoming request attributes scoped to the response data\n * @param {(ServerResponse & { socket: Socket; })} response the response object\n */\nexport const getIncomingRequestAttributesOnResponse = (\n request: IncomingMessage,\n response: ServerResponse\n): 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\n/**\n * Returns incoming request Metric attributes scoped to the request data\n * @param {SpanAttributes} spanAttributes the span attributes\n */\nexport const getIncomingRequestMetricAttributesOnResponse = (\n spanAttributes: SpanAttributes\n): MetricAttributes => {\n const metricAttributes: MetricAttributes = {};\n metricAttributes[SemanticAttributes.HTTP_STATUS_CODE] = spanAttributes[SemanticAttributes.HTTP_STATUS_CODE];\n metricAttributes[SemanticAttributes.NET_HOST_PORT] = spanAttributes[SemanticAttributes.NET_HOST_PORT];\n return metricAttributes;\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.33.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.33.0';\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@opentelemetry/instrumentation-http",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.33.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",
|
|
@@ -46,9 +46,9 @@
|
|
|
46
46
|
},
|
|
47
47
|
"devDependencies": {
|
|
48
48
|
"@opentelemetry/api": "^1.0.0",
|
|
49
|
-
"@opentelemetry/context-async-hooks": "1.
|
|
50
|
-
"@opentelemetry/sdk-trace-base": "1.
|
|
51
|
-
"@opentelemetry/sdk-trace-node": "1.
|
|
49
|
+
"@opentelemetry/context-async-hooks": "1.7.0",
|
|
50
|
+
"@opentelemetry/sdk-trace-base": "1.7.0",
|
|
51
|
+
"@opentelemetry/sdk-trace-node": "1.7.0",
|
|
52
52
|
"@types/got": "9.6.12",
|
|
53
53
|
"@types/mocha": "9.1.1",
|
|
54
54
|
"@types/node": "18.6.5",
|
|
@@ -74,11 +74,13 @@
|
|
|
74
74
|
"@opentelemetry/api": "^1.0.0"
|
|
75
75
|
},
|
|
76
76
|
"dependencies": {
|
|
77
|
-
"@opentelemetry/
|
|
78
|
-
"@opentelemetry/
|
|
79
|
-
"@opentelemetry/
|
|
77
|
+
"@opentelemetry/api-metrics": "0.33.0",
|
|
78
|
+
"@opentelemetry/core": "1.7.0",
|
|
79
|
+
"@opentelemetry/instrumentation": "0.33.0",
|
|
80
|
+
"@opentelemetry/sdk-metrics": "0.33.0",
|
|
81
|
+
"@opentelemetry/semantic-conventions": "1.7.0",
|
|
80
82
|
"semver": "^7.3.5"
|
|
81
83
|
},
|
|
82
84
|
"homepage": "https://github.com/open-telemetry/opentelemetry-js/tree/main/experimental/packages/opentelemetry-instrumentation-http",
|
|
83
|
-
"gitHead": "
|
|
85
|
+
"gitHead": "ad88c3d9aa0100fe259b93f4b660e84417b757ac"
|
|
84
86
|
}
|