Skip to content

Commit

Permalink
feat(exporter-collector): log upstream error #1459
Browse files Browse the repository at this point in the history
  • Loading branch information
vmarchaud committed Oct 24, 2020
1 parent dc8082a commit ef79804
Show file tree
Hide file tree
Showing 5 changed files with 59 additions and 32 deletions.
25 changes: 15 additions & 10 deletions packages/opentelemetry-exporter-collector/src/platform/node/util.ts
Original file line number Diff line number Diff line change
Expand Up @@ -50,16 +50,21 @@ export function sendWithHttp<ExportItem, ServiceRequest>(

const request = parsedUrl.protocol === 'http:' ? http.request : https.request;
const req = request(options, (res: http.IncomingMessage) => {
if (res.statusCode && res.statusCode < 299) {
collector.logger.debug(`statusCode: ${res.statusCode}`);
onSuccess();
} else {
const error = new collectorTypes.CollectorExporterError(
res.statusMessage,
res.statusCode
);
onError(error);
}
let data = '';
res.on('data', chunk => (data += chunk));
res.on('end', () => {
if (res.statusCode && res.statusCode < 299) {
collector.logger.debug(`statusCode: ${res.statusCode}`, data);
onSuccess();
} else {
const error = new collectorTypes.CollectorExporterError(
res.statusMessage,
res.statusCode,
data
);
onError(error);
}
});
});

req.on('error', (error: Error) => {
Expand Down
4 changes: 3 additions & 1 deletion packages/opentelemetry-exporter-collector/src/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -310,9 +310,11 @@ export namespace opentelemetryProto {
export class CollectorExporterError extends Error {
readonly code?: number;
readonly name: string = 'CollectorExporterError';
readonly data?: string;

constructor(message?: string, code?: number) {
constructor(message?: string, code?: number, data?: string) {
super(message);
this.data = data;
this.code = code;
}
}
Expand Down
20 changes: 20 additions & 0 deletions packages/opentelemetry-exporter-collector/test/helper.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ import { InstrumentationLibrary } from '@opentelemetry/core';
import * as assert from 'assert';
import { opentelemetryProto } from '../src/types';
import * as collectorTypes from '../src/types';
import { Stream } from 'stream';

const meterProvider = new MeterProvider({
interval: 30000,
Expand Down Expand Up @@ -666,3 +667,22 @@ export function ensureHeadersContain(
);
});
}

export class MockedResponse extends Stream {
constructor(private _code: number, private _msg?: string) {
super();
}

send(data: string) {
this.emit('data', data);
this.emit('end');
}

get statusCode() {
return this._code;
}

get statusMessage() {
return this._msg;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ import {
mockValueRecorder,
ensureValueRecorderIsCorrect,
ensureObserverIsCorrect,
MockedResponse,
} from '../helper';
import { MetricRecord } from '@opentelemetry/metrics';

Expand All @@ -40,14 +41,6 @@ const fakeRequest = {
write: function () {},
};

const mockRes = {
statusCode: 200,
};

const mockResError = {
statusCode: 400,
};

const address = 'localhost:1501';

describe('CollectorMetricExporter - node with json over http', () => {
Expand Down Expand Up @@ -178,9 +171,11 @@ describe('CollectorMetricExporter - node with json over http', () => {
collectorExporter.export(metrics, responseSpy);

setTimeout(() => {
const mockRes = new MockedResponse(200);
const args = spyRequest.args[0];
const callback = args[1];
callback(mockRes);
mockRes.send('success');
setTimeout(() => {
const response: any = spyLoggerDebug.args[1][0];
assert.strictEqual(response, 'statusCode: 200');
Expand All @@ -205,12 +200,17 @@ describe('CollectorMetricExporter - node with json over http', () => {
collectorExporter.export(metrics, responseSpy);

setTimeout(() => {
const mockRes = new MockedResponse(400);
const args = spyRequest.args[0];
const callback = args[1];
callback(mockResError);
callback(mockRes);
mockRes.send('failed');
setTimeout(() => {
const response = spyLoggerError.args[0][0] as string;
assert.ok(response.includes('"code":"400"'));
const error = JSON.parse(
spyLoggerError.args[0][0]
) as collectorTypes.CollectorExporterError;
assert.strictEqual(error.code, '400');
assert.strictEqual(error.data, 'failed');
assert.strictEqual(responseSpy.args[0][0], 1);
done();
});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ import * as sinon from 'sinon';
import { CollectorTraceExporter } from '../../src/platform/node';
import { CollectorExporterConfigBase } from '../../src/types';
import * as collectorTypes from '../../src/types';
import { MockedResponse } from '../helper';

import {
ensureExportTraceServiceRequestIsSet,
Expand All @@ -36,13 +37,6 @@ const fakeRequest = {
write: function () {},
};

const mockRes = {
statusCode: 200,
};

const mockResError = {
statusCode: 400,
};
const address = 'localhost:1501';

describe('CollectorTraceExporter - node with json over http', () => {
Expand Down Expand Up @@ -144,9 +138,11 @@ describe('CollectorTraceExporter - node with json over http', () => {
collectorExporter.export(spans, responseSpy);

setTimeout(() => {
const mockRes = new MockedResponse(200);
const args = spyRequest.args[0];
const callback = args[1];
callback(mockRes);
mockRes.send('success');
setTimeout(() => {
const response: any = spyLoggerDebug.args[1][0];
assert.strictEqual(response, 'statusCode: 200');
Expand All @@ -171,13 +167,17 @@ describe('CollectorTraceExporter - node with json over http', () => {
collectorExporter.export(spans, responseSpy);

setTimeout(() => {
const mockResError = new MockedResponse(400);
const args = spyRequest.args[0];
const callback = args[1];
callback(mockResError);
mockResError.send('failed');
setTimeout(() => {
const response = spyLoggerError.args[0][0] as string;

assert.ok(response.includes('"code":"400"'));
const error = JSON.parse(
spyLoggerError.args[0][0]
) as collectorTypes.CollectorExporterError;
assert.strictEqual(error.code, '400');
assert.strictEqual(error.data, 'failed');
assert.strictEqual(responseSpy.args[0][0], 1);
done();
});
Expand Down

0 comments on commit ef79804

Please sign in to comment.