Skip to content

Commit fa9e376

Browse files
committed
chore(http): remove x-opentelemetry-outgoing-request header #1547
1 parent 3309ea4 commit fa9e376

File tree

20 files changed

+6
-268
lines changed

20 files changed

+6
-268
lines changed

packages/opentelemetry-exporter-collector/src/platform/node/CollectorExporterNodeBase.ts

+1-3
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,7 @@ export abstract class CollectorExporterNodeBase<
3131
ExportItem,
3232
ServiceRequest
3333
> {
34-
DEFAULT_HEADERS: Record<string, string> = {
35-
[collectorTypes.OT_REQUEST_HEADER]: '1',
36-
};
34+
DEFAULT_HEADERS: Record<string, string> = {};
3735
headers: Record<string, string>;
3836
constructor(config: CollectorExporterConfigBase = {}) {
3937
super(config);

packages/opentelemetry-exporter-collector/src/types.ts

-3
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,6 @@
1717
import { SpanKind, Logger, Attributes } from '@opentelemetry/api';
1818
import * as api from '@opentelemetry/api';
1919

20-
// header to prevent instrumentation on request
21-
export const OT_REQUEST_HEADER = 'x-opentelemetry-outgoing-request';
22-
2320
/* eslint-disable @typescript-eslint/no-namespace */
2421
export namespace opentelemetryProto {
2522
export namespace collector {

packages/opentelemetry-exporter-jaeger/src/jaeger.ts

-2
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@ import { ReadableSpan, SpanExporter } from '@opentelemetry/tracing';
2020
import { Socket } from 'dgram';
2121
import { spanToThrift } from './transform';
2222
import * as jaegerTypes from './types';
23-
import { OT_REQUEST_HEADER } from './utils';
2423

2524
/**
2625
* Format and sends span information to Jaeger Exporter.
@@ -54,7 +53,6 @@ export class JaegerExporter implements SpanExporter {
5453
localConfig.host = localConfig.host || process.env.JAEGER_AGENT_HOST;
5554
if (localConfig.endpoint) {
5655
this._sender = new jaegerTypes.HTTPSender(localConfig);
57-
this._sender._httpOptions.headers[OT_REQUEST_HEADER] = 1;
5856
} else {
5957
this._sender = localConfig.endpoint = new jaegerTypes.UDPSender(
6058
localConfig

packages/opentelemetry-exporter-jaeger/src/utils.ts

-17
This file was deleted.

packages/opentelemetry-exporter-jaeger/test/jaeger.test.ts

+1-7
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@ import { ThriftProcess } from '../src/types';
2222
import { ReadableSpan } from '@opentelemetry/tracing';
2323
import { TraceFlags } from '@opentelemetry/api';
2424
import { Resource } from '@opentelemetry/resources';
25-
import { OT_REQUEST_HEADER } from '../src/utils';
2625
import * as nock from 'nock';
2726

2827
describe('JaegerExporter', () => {
@@ -156,12 +155,11 @@ describe('JaegerExporter', () => {
156155
});
157156
});
158157

159-
it('should use httpSender if config.endpoint is setten and set x-opentelemetry-outgoing-request header', done => {
158+
it('should use httpSender if config.endpoint is setten', done => {
160159
const mockedEndpoint = 'http://testendpoint';
161160
nock(mockedEndpoint)
162161
.post('/')
163162
.reply(function () {
164-
assert.strictEqual(this.req.headers[OT_REQUEST_HEADER], 1);
165163
assert.strictEqual(
166164
this.req.headers['content-type'],
167165
'application/x-thrift'
@@ -174,10 +172,6 @@ describe('JaegerExporter', () => {
174172
endpoint: mockedEndpoint,
175173
});
176174
assert.strictEqual(exporter['_sender'].constructor.name, 'HTTPSender');
177-
assert.strictEqual(
178-
exporter['_sender']._httpOptions.headers[OT_REQUEST_HEADER],
179-
1
180-
);
181175
const spanContext = {
182176
traceId: 'd4cda95b652f4a1592b449d5929fda1b',
183177
spanId: '6e0c63257de34c92',

packages/opentelemetry-exporter-zipkin/src/platform/browser/util.ts

-2
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717
import * as api from '@opentelemetry/api';
1818
import { ExportResult } from '@opentelemetry/core';
1919
import * as zipkinTypes from '../../types';
20-
import { OT_REQUEST_HEADER } from '../../utils';
2120

2221
/**
2322
* Prepares send function that will send spans to the remote Zipkin service.
@@ -33,7 +32,6 @@ export function prepareSend(
3332
xhrHeaders = {
3433
Accept: 'application/json',
3534
'Content-Type': 'application/json',
36-
[OT_REQUEST_HEADER]: '1',
3735
...headers,
3836
};
3937
}

packages/opentelemetry-exporter-zipkin/src/platform/node/util.ts

-2
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@ import * as http from 'http';
2020
import * as https from 'https';
2121
import * as url from 'url';
2222
import * as zipkinTypes from '../../types';
23-
import { OT_REQUEST_HEADER } from '../../utils';
2423

2524
/**
2625
* Prepares send function that will send spans to the remote Zipkin service.
@@ -37,7 +36,6 @@ export function prepareSend(
3736
method: 'POST',
3837
headers: {
3938
'Content-Type': 'application/json',
40-
[OT_REQUEST_HEADER]: 1,
4139
...headers,
4240
},
4341
},

packages/opentelemetry-exporter-zipkin/src/utils.ts

-17
This file was deleted.

packages/opentelemetry-exporter-zipkin/test/node/zipkin.test.ts

-21
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@ import * as api from '@opentelemetry/api';
2626
import { Resource } from '@opentelemetry/resources';
2727
import { ZipkinExporter } from '../../src';
2828
import * as zipkinTypes from '../../src/types';
29-
import { OT_REQUEST_HEADER } from '../../src/utils';
3029
import { TraceFlags } from '@opentelemetry/api';
3130
import { SERVICE_RESOURCE } from '@opentelemetry/resources';
3231

@@ -254,26 +253,6 @@ describe('Zipkin Exporter - node', () => {
254253
});
255254
});
256255

257-
it(`should send '${OT_REQUEST_HEADER}' header`, () => {
258-
const scope = nock('https://localhost:9411')
259-
.post('/api/v2/spans')
260-
.reply(function (uri, requestBody, cb) {
261-
assert.ok(this.req.headers[OT_REQUEST_HEADER]);
262-
cb(null, [200, 'Ok']);
263-
});
264-
265-
const exporter = new ZipkinExporter({
266-
serviceName: 'my-service',
267-
logger: new NoopLogger(),
268-
url: 'https://localhost:9411/api/v2/spans',
269-
});
270-
271-
exporter.export([getReadableSpan()], (result: ExportResult) => {
272-
scope.done();
273-
assert.strictEqual(result, ExportResult.SUCCESS);
274-
});
275-
});
276-
277256
it('should return FailedNonRetryable with 4xx', () => {
278257
const scope = nock('http://localhost:9411')
279258
.post('/api/v2/spans')

packages/opentelemetry-grpc-utils/test/grpcUtils.test.ts

-16
Original file line numberDiff line numberDiff line change
@@ -769,22 +769,6 @@ export const runTests = (
769769
done();
770770
});
771771
});
772-
773-
methodList.map(method => {
774-
const metadata = new grpc.Metadata();
775-
metadata.set('x-opentelemetry-outgoing-request', '1');
776-
describe(`Test should not create spans for grpc remote method ${method.description} when metadata has otel header`, () => {
777-
before(() => {
778-
method.metadata = metadata;
779-
});
780-
781-
after(() => {
782-
delete method.metadata;
783-
});
784-
785-
runTest(method, provider, false);
786-
});
787-
});
788772
});
789773

790774
describe('Test filtering requests using options', () => {

packages/opentelemetry-plugin-grpc-js/src/client/utils.ts

-4
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@ import {
2929
grpcStatusCodeToSpanStatus,
3030
grpcStatusCodeToCanonicalCode,
3131
CALL_SPAN_ENDED,
32-
containsOtelMetadata,
3332
methodIsIgnored,
3433
} from '../utils';
3534
import { EventEmitter } from 'events';
@@ -77,9 +76,6 @@ export function getPatchedClientMethods(
7776
const name = `grpc.${original.path.replace('/', '')}`;
7877
const args = [...arguments];
7978
const metadata = getMetadata.call(plugin, original, args);
80-
if (containsOtelMetadata(metadata)) {
81-
return original.apply(this, args);
82-
}
8379
const span = plugin.tracer.startSpan(name, {
8480
kind: SpanKind.CLIENT,
8581
});

packages/opentelemetry-plugin-grpc-js/src/server/patchServer.ts

+1-2
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ import {
3333
import { RpcAttribute } from '@opentelemetry/semantic-conventions';
3434
import { clientStreamAndUnaryHandler } from './clientStreamAndUnary';
3535
import { serverStreamAndBidiHandler } from './serverStreamAndBidi';
36-
import { containsOtelMetadata, methodIsIgnored } from '../utils';
36+
import { methodIsIgnored } from '../utils';
3737

3838
type ServerRegisterFunction = typeof grpcJs.Server.prototype.register;
3939

@@ -142,7 +142,6 @@ function shouldNotTraceServerCall(
142142
): boolean {
143143
const parsedName = methodName.split('/');
144144
return (
145-
containsOtelMetadata(metadata) ||
146145
methodIsIgnored(
147146
parsedName[parsedName.length - 1] || methodName,
148147
ignoreGrpcMethods

packages/opentelemetry-plugin-grpc-js/src/utils.ts

-13
Original file line numberDiff line numberDiff line change
@@ -25,11 +25,6 @@ import { IgnoreMatcher } from './types';
2525
*/
2626
export const CALL_SPAN_ENDED = Symbol('opentelemetry call span ended');
2727

28-
/**
29-
* Metadata key used to denote an outgoing opentelemetry request.
30-
*/
31-
const OTEL_OUTGOING_REQUEST_KEY = 'x-opentelemetry-outgoing-request';
32-
3328
/**
3429
* Convert a grpc status code to an opentelemetry Canonical code. For now, the enums are exactly the same
3530
* @param status
@@ -51,14 +46,6 @@ export const grpcStatusCodeToSpanStatus = (status: number): Status => {
5146
return { code: status };
5247
};
5348

54-
/**
55-
* Returns true if the metadata contains
56-
* the opentelemetry outgoing request header.
57-
*/
58-
export const containsOtelMetadata = (metadata: grpcTypes.Metadata): boolean => {
59-
return metadata.get(OTEL_OUTGOING_REQUEST_KEY).length > 0;
60-
};
61-
6249
/**
6350
* Returns true if methodName matches pattern
6451
* @param methodName the name of the method

packages/opentelemetry-plugin-grpc/src/grpc.ts

+3-10
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,6 @@ import {
4343
_grpcStatusCodeToCanonicalCode,
4444
_grpcStatusCodeToSpanStatus,
4545
_methodIsIgnored,
46-
_containsOtelMetadata,
4746
} from './utils';
4847
import { VERSION } from './version';
4948

@@ -237,12 +236,9 @@ export class GrpcPlugin extends BasePlugin<grpc> {
237236
name: string
238237
): boolean {
239238
const parsedName = name.split('/');
240-
return (
241-
_containsOtelMetadata(call.metadata) ||
242-
_methodIsIgnored(
243-
parsedName[parsedName.length - 1] || name,
244-
this._config.ignoreGrpcMethods
245-
)
239+
return _methodIsIgnored(
240+
parsedName[parsedName.length - 1] || name,
241+
this._config.ignoreGrpcMethods
246242
);
247243
}
248244

@@ -391,9 +387,6 @@ export class GrpcPlugin extends BasePlugin<grpc> {
391387
const name = `grpc.${original.path.replace('/', '')}`;
392388
const args = Array.prototype.slice.call(arguments);
393389
const metadata = plugin._getMetadata(original, args);
394-
if (_containsOtelMetadata(metadata)) {
395-
return original.apply(this, args);
396-
}
397390
const span = plugin._tracer.startSpan(name, {
398391
kind: SpanKind.CLIENT,
399392
});

packages/opentelemetry-plugin-grpc/src/utils.ts

-15
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,6 @@ import { CanonicalCode, Status } from '@opentelemetry/api';
1818
import * as grpcTypes from 'grpc'; // For types only
1919
import { IgnoreMatcher } from './types';
2020

21-
/**
22-
* Metadata key used to denote an outgoing opentelemetry request.
23-
*/
24-
const _otRequestHeader = 'x-opentelemetry-outgoing-request';
25-
2621
// Equivalent to lodash _.findIndex
2722
export const findIndex: <T>(args: T[], fn: (arg: T) => boolean) => number = (
2823
args,
@@ -55,16 +50,6 @@ export const _grpcStatusCodeToSpanStatus = (status: number): Status => {
5550
return { code: status };
5651
};
5752

58-
/**
59-
* Returns true if the metadata contains
60-
* the opentelemetry outgoing request header.
61-
*/
62-
export const _containsOtelMetadata = (
63-
metadata: grpcTypes.Metadata
64-
): boolean => {
65-
return metadata.get(_otRequestHeader).length > 0;
66-
};
67-
6853
/**
6954
* Returns true if methodName matches pattern
7055
* @param methodName the name of the method

packages/opentelemetry-plugin-http/src/http.ts

-8
Original file line numberDiff line numberDiff line change
@@ -398,15 +398,7 @@ export class HttpPlugin extends BasePlugin<Http> {
398398
extraOptions
399399
);
400400

401-
if (utils.isOpenTelemetryRequest(optionsParsed)) {
402-
// clone the headers so delete will not modify the user's object
403-
optionsParsed.headers = Object.assign({}, optionsParsed.headers);
404-
delete optionsParsed.headers[utils.OT_REQUEST_HEADER];
405-
return original.apply(this, [optionsParsed, ...args]);
406-
}
407-
408401
if (
409-
utils.isOpenTelemetryRequest(optionsParsed) ||
410402
utils.isIgnored(
411403
origin + pathname,
412404
plugin._config.ignoreOutgoingUrls,

packages/opentelemetry-plugin-http/src/utils.ts

-24
Original file line numberDiff line numberDiff line change
@@ -35,12 +35,6 @@ import {
3535
SpecialHttpStatusCodeMapping,
3636
} from './types';
3737

38-
/**
39-
* Specific header used by exporters to "mark" outgoing request to avoid creating
40-
* spans for request that export them which would create a infinite loop.
41-
*/
42-
export const OT_REQUEST_HEADER = 'x-opentelemetry-outgoing-request';
43-
4438
export const HTTP_STATUS_SPECIAL_CASES: SpecialHttpStatusCodeMapping = {
4539
401: CanonicalCode.UNAUTHENTICATED,
4640
403: CanonicalCode.PERMISSION_DENIED,
@@ -301,24 +295,6 @@ export const isValidOptionsType = (options: unknown): boolean => {
301295
return type === 'string' || (type === 'object' && !Array.isArray(options));
302296
};
303297

304-
/**
305-
* Check whether the given request should be ignored
306-
* Use case: Typically, exporter `SpanExporter` can use http module to send spans.
307-
* This will also generate spans (from the http-plugin) that will be sended through the exporter
308-
* and here we have loop.
309-
*
310-
* TODO: Refactor this logic when a solution is found in
311-
* https://github.com/open-telemetry/opentelemetry-specification/issues/530
312-
*
313-
*
314-
* @param {RequestOptions} options
315-
*/
316-
export const isOpenTelemetryRequest = (
317-
options: RequestOptions
318-
): options is { headers: {} } & RequestOptions => {
319-
return !!(options && options.headers && options.headers[OT_REQUEST_HEADER]);
320-
};
321-
322298
/**
323299
* Returns outgoing request attributes scoped to the options passed to the request
324300
* @param {ParsedRequestOptions} requestOptions the same options used to make the request

0 commit comments

Comments
 (0)