Skip to content

Commit 4c8648b

Browse files
Count submits & failures
1 parent 2b1fa6a commit 4c8648b

File tree

2 files changed

+72
-19
lines changed

2 files changed

+72
-19
lines changed

lib/base_logger.js

Lines changed: 54 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
const http = require('http');
44
const https = require('https');
55
const os = require('os');
6-
const url_lib = require('url');
6+
const urls = require('url');
77
const usage_loggers = require('./usage_loggers');
88
const zlib = require('zlib');
99

@@ -49,12 +49,40 @@ class BaseLogger {
4949
this._enabled = false;
5050
}
5151

52-
// mark immutable properties
52+
// parse and cache url properties
53+
if (this._url != null) {
54+
try {
55+
const target = urls.parse(this._url);
56+
this._url_library = target.protocol === 'https' ? https : http;
57+
this._url_options = {
58+
host: target.host.split(':')[0],
59+
port: target.port,
60+
path: target.path,
61+
method: 'POST',
62+
headers: {'Content-Encoding': this._skip_compression ? 'identity' : 'deflated'}
63+
};
64+
} catch (e) {
65+
this._url = null;
66+
this._url_library = null;
67+
this._url_options = null;
68+
this._enabled = false;
69+
}
70+
}
71+
72+
// finalize internal properties
5373
this._enableable = (this._queue !== null) || (this._url !== null);
74+
this._submit_failures = new Uint32Array(new SharedArrayBuffer(Int32Array.BYTES_PER_ELEMENT));
75+
this._submit_successes = new Uint32Array(new SharedArrayBuffer(Int32Array.BYTES_PER_ELEMENT));
76+
77+
// mark immutable properties
5478
Object.defineProperty(this, '_agent', {configurable: false, writable: false});
5579
Object.defineProperty(this, '_host', {configurable: false, writable: false});
5680
Object.defineProperty(this, '_queue', {configurable: false, writable: false});
81+
Object.defineProperty(this, '_submit_failures', {configurable: false, writable: false});
82+
Object.defineProperty(this, '_submit_successes', {configurable: false, writable: false});
5783
Object.defineProperty(this, '_url', {configurable: false, writable: false});
84+
Object.defineProperty(this, '_url_library', {configurable: false, writable: false});
85+
Object.defineProperty(this, '_url_options', {configurable: false, writable: false});
5886
Object.defineProperty(this, '_version', {configurable: false, writable: false});
5987
}
6088

@@ -157,23 +185,19 @@ class BaseLogger {
157185
} else {
158186
return new Promise((resolve, reject) => {
159187
try {
160-
const target = url_lib.parse(this._url);
161-
const options = {
162-
host: target.host.split(':')[0],
163-
port: target.port,
164-
path: target.path,
165-
method: 'POST',
166-
headers: {'Content-Encoding': this._skip_compression ? 'identity' : 'deflated'}
167-
};
168-
const lib = target.protocol === 'https' ? https : http;
169-
const request = lib.request(options, (response) => {
188+
const request = this._url_library.request(this._url_options, (response) => {
170189
if (response.statusCode === 204) {
190+
Atomics.add(this._submit_successes, 0, 1);
171191
resolve(true);
172192
} else {
173-
resolve(true); // todo count as error
193+
Atomics.add(this._submit_failures, 0, 1);
194+
resolve(true);
174195
}
175196
});
176-
request.on('error', () => resolve(true)); // todo count as error
197+
request.on('error', () => {
198+
Atomics.add(this._submit_failures, 0, 1);
199+
resolve(true);
200+
});
177201
if (this._skip_compression) {
178202
request.write(msg);
179203
request.end();
@@ -184,12 +208,27 @@ class BaseLogger {
184208
});
185209
}
186210
} catch (e) {
187-
resolve(true); // todo count as error
211+
Atomics.add(this._submit_failures, 0, 1);
212+
resolve(true);
188213
}
189214
});
190215
}
191216
}
192217

218+
/**
219+
* Returns count of submissions that failed.
220+
*/
221+
get submit_failures() {
222+
return Atomics.load(this._submit_failures, 0);
223+
}
224+
225+
/**
226+
* Returns count of submissions that succeeded.
227+
*/
228+
get submit_successes() {
229+
return Atomics.load(this._submit_successes, 0);
230+
}
231+
193232
/**
194233
* Returns url destination where messages are sent.
195234
*/

test/base_logger_spec.js

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -161,7 +161,10 @@ describe('BaseLogger', () => {
161161
];
162162
const msg = JSON.stringify(message);
163163
expect(parseable(msg)).to.be.true;
164-
return logger.submit(msg);
164+
logger.submit(msg).then(() => {
165+
expect(logger.submit_failures).to.equal(0);
166+
expect(logger.submit_successes).to.equal(1);
167+
});
165168
});
166169

167170
it('submits to demo url via http', () => {
@@ -175,7 +178,10 @@ describe('BaseLogger', () => {
175178
];
176179
const msg = JSON.stringify(message);
177180
expect(parseable(msg)).to.be.true;
178-
return logger.submit(msg);
181+
logger.submit(msg).then(() => {
182+
expect(logger.submit_failures).to.equal(0);
183+
expect(logger.submit_successes).to.equal(1);
184+
});
179185
});
180186

181187
it('submits to demo url without compression', () => {
@@ -191,15 +197,21 @@ describe('BaseLogger', () => {
191197
];
192198
const msg = JSON.stringify(message);
193199
expect(parseable(msg)).to.be.true;
194-
return logger.submit(msg);
200+
logger.submit(msg).then(() => {
201+
expect(logger.submit_failures).to.equal(0);
202+
expect(logger.submit_successes).to.equal(1);
203+
});
195204
});
196205

197206
it('submits to denied url', () => {
198207
for (let url of helper.MOCK_URLS_DENIED) {
199208
const logger = new BaseLogger(MOCK_AGENT, {url: url});
200209
expect(logger.enableable).to.be.true;
201210
expect(logger.enabled).to.be.true;
202-
expect(logger.submit('{}')).to.be.fulfilled;
211+
logger.submit('{}').then(() => {
212+
expect(logger.submit_failures).to.equal(1);
213+
expect(logger.submit_successes).to.equal(0);
214+
});
203215
}
204216
});
205217

@@ -215,6 +227,8 @@ describe('BaseLogger', () => {
215227
expect(queue.length).to.equal(1);
216228
expect(logger.submit('{}')).to.be.fulfilled;
217229
expect(queue.length).to.equal(2);
230+
expect(logger.submit_failures).to.equal(0);
231+
expect(logger.submit_successes).to.equal(0);
218232
});
219233

220234
it('silently ignores unexpected option classes', () => {

0 commit comments

Comments
 (0)