Skip to content

Commit 4d5c897

Browse files
committed
Isolate benchmarking code because npm run is erroneous and sadly runs other code too
We now have more isolated and more accurate values ```shell Benchmarking Database Total Runs: 20000 Warm up runs: 2500 databaseRunSelect1AsyncAwait RAM Untraced(209.906kB) vs Traced (224.453kB): increase by (14.547kB) or 6.93% RAM Untraced(209.906kB) vs Traced+OTEL(243.211kB): increase by (33.305kB) or 15.87% Time Untraced(901.139µs) vs Traced (918.845µs): increase by (17.706µs) or 1.96% Time Untraced(901.139µs) vs Traced+OTEL(1.019ms): increase by (118.223µs) or 13.12% databaseRunSelect1Callback RAM Untraced(209.789kB) vs Traced (224.641kB): increase by (14.852kB) or 7.08% RAM Untraced(209.789kB) vs Traced+OTEL(242.500kB): increase by (32.711kB) or 15.59% Time Untraced(902.862µs) vs Traced (920.289µs): increase by (17.427µs) or 1.93% Time Untraced(902.862µs) vs Traced+OTEL(1.027ms): increase by (124.280µs) or 13.77% databaseRunTransactionAsyncTxRunUpdate RAM Untraced(309.352kB) vs Traced (323.734kB): increase by (14.383kB) or 4.65% RAM Untraced(309.352kB) vs Traced+OTEL(324.258kB): increase by (14.906kB) or 4.82% Time Untraced(1.508ms) vs Traced (1.516ms): increase by (7.340µs) or 0.49% Time Untraced(1.508ms) vs Traced+OTEL(1.679ms): increase by (170.989µs) or 11.34% databaseRunTransactionAsyncTxRun RAM Untraced(299.117kB) vs Traced (311.320kB): increase by (12.203kB) or 4.08% RAM Untraced(299.117kB) vs Traced+OTEL(313.602kB): increase by (14.484kB) or 4.84% Time Untraced(1.460ms) vs Traced (1.469ms): increase by (8.468µs) or 0.58% Time Untraced(1.460ms) vs Traced+OTEL(1.679ms): increase by (219.068µs) or 15.00% ✔ Database runs compared (403854ms) Benchmark getTracer tracerProvider Total Runs: 20000 Warm up runs: 2500 withNullTracerProviderUnsetGlobalTracerProvider RAM (2.273kB) TimeSpent (12.171µs) withTracerDefinedTracerProvider RAM (2.695kB) TimeSpent (14.074µs) withTracerRegisteredGlobally RAM (2.727kB) TimeSpent (14.413µs) ```
1 parent fbc460b commit 4d5c897

File tree

5 files changed

+170
-30
lines changed

5 files changed

+170
-30
lines changed

observability-test/benchmark.ts renamed to observability-benchmark/benchmark.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ const lessComparator = (a, b) => {
2626
* a map of functionNames to the percentiles of RAM usage and time spent.
2727
*/
2828
export async function runBenchmarks(runners: Function[], done: Function) {
29-
const nRuns = 10000;
29+
const nRuns = 20000;
3030
const nWarmups = Math.round(nRuns / 8);
3131
const benchmarkValues = {_totalRuns: nRuns, _warmRuns: nWarmups};
3232

observability-test/comparisons.ts renamed to observability-benchmark/comparisons.ts

+166-28
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,15 @@ const {
3434
} = require('@opentelemetry/sdk-trace-node');
3535
const {SimpleSpanProcessor} = require('@opentelemetry/sdk-trace-base');
3636
import {humanizeBytes, humanizeTime, runBenchmarks} from './benchmark';
37+
const {diag, DiagConsoleLogger, DiagLogLevel} = require('@opentelemetry/api');
38+
// diag.setLogger(new DiagConsoleLogger(), DiagLogLevel.DEBUG);
3739

38-
const {ObservabilityOptions} = require('../src/instrument');
40+
const {
41+
getTracer,
42+
startTrace,
43+
traceConfig,
44+
ObservabilityOptions,
45+
} = require('../src/instrument');
3946

4047
const selectSql = 'SELECT 1';
4148
const updateSql = 'UPDATE FOO SET BAR=1 WHERE BAZ=2';
@@ -124,6 +131,16 @@ async function setup(
124131
});
125132
}
126133

134+
interface percentiles {
135+
p50: number;
136+
p50_s: string;
137+
}
138+
139+
interface description {
140+
ram: percentiles;
141+
timeSpent: percentiles;
142+
}
143+
127144
describe('Benchmarking Database', () => {
128145
if (!process.env.SPANNER_RUN_BENCHMARKS) {
129146
console.log(
@@ -207,23 +224,6 @@ describe('Benchmarking Database', () => {
207224
});
208225
},
209226

210-
/*
211-
async function databaseGetTransactionAsync() {
212-
const tx = await database.getTransction();
213-
214-
try {
215-
await tx!.begin();
216-
return await tx!.runUpdate(updateSql);
217-
} catch (e) {
218-
console.log(e);
219-
return null;
220-
} finally {
221-
console.log('tx.end');
222-
tx!.end();
223-
console.log('exiting');
224-
}
225-
},
226-
*/
227227
async function databaseRunTransactionAsyncTxRunUpdate() {
228228
const withTx = async tx => {
229229
await tx!.begin();
@@ -274,16 +274,6 @@ describe('Benchmarking Database', () => {
274274
});
275275
}
276276

277-
interface percentiles {
278-
p50: number;
279-
p50_s: string;
280-
}
281-
282-
interface description {
283-
ram: percentiles;
284-
timeSpent: percentiles;
285-
}
286-
287277
it('Database runs compared', async () => {
288278
const traced = await setItUp(true);
289279
const untraced = await setItUp(false);
@@ -327,3 +317,151 @@ describe('Benchmarking Database', () => {
327317
function percentDiff(orig, fresh) {
328318
return ((Number(fresh) - Number(orig)) * 100.0) / Number(orig);
329319
}
320+
321+
describe('Benchmark getTracer', () => {
322+
it('No tracerProvider/global tracerProvider', async () => {
323+
console.log('tracerProvider');
324+
const results = await benchmarkStartTrace();
325+
326+
console.log(
327+
`Total Runs: ${results['_totalRuns']}\nWarm up runs: ${results['_warmRuns']}`
328+
);
329+
330+
for (const method in results) {
331+
const values = results[method];
332+
if (typeof values !== 'object') {
333+
continue;
334+
}
335+
const desc = values as description;
336+
const ram = desc.ram;
337+
const timeSpent = desc!.timeSpent;
338+
console.log(`${method}`);
339+
console.log(`\tRAM (${ram.p50_s})`);
340+
console.log(`\tTimeSpent (${timeSpent.p50_s})`);
341+
}
342+
});
343+
});
344+
345+
function benchmarkGetTracer(): Promise<Map<string, unknown>> {
346+
const customTracerProvider = new NodeTracerProvider();
347+
let trapDoorCalled = false;
348+
349+
const runners: Function[] = [
350+
function getTracerNullTracerProviderUnsetGlobalTracerProvider() {
351+
return getTracer(null);
352+
},
353+
354+
function getTracerDefinedTracerProvider() {
355+
return getTracer(customTracerProvider);
356+
},
357+
358+
function getTracerRegisteredGlobally() {
359+
if (!trapDoorCalled) {
360+
customTracerProvider.register();
361+
trapDoorCalled = true;
362+
}
363+
return getTracer(null);
364+
},
365+
];
366+
367+
return new Promise(resolve => {
368+
runBenchmarks(runners, results => {
369+
resolve(results);
370+
});
371+
});
372+
}
373+
374+
function benchmarkStartSpan(): Promise<Map<string, unknown>> {
375+
const customTracerProvider = new NodeTracerProvider();
376+
let trapDoorCalled = false;
377+
378+
const runners: Function[] = [
379+
function withNullTracerProviderUnsetGlobalTracerProvider() {
380+
return new Promise(resolve => {
381+
getTracer(null).startActiveSpan('aSpan', {}, span => {
382+
resolve(span);
383+
});
384+
});
385+
},
386+
387+
function withTracerDefinedTracerProvider() {
388+
return new Promise(resolve => {
389+
getTracer(customTracerProvider).startActiveSpan('aSpan', {}, span => {
390+
resolve(span);
391+
});
392+
});
393+
},
394+
395+
function getTracerRegisteredGlobally() {
396+
if (!trapDoorCalled) {
397+
customTracerProvider.register();
398+
trapDoorCalled = true;
399+
}
400+
return new Promise(resolve => {
401+
getTracer(null).startActiveSpan('aSpan', {}, span => {
402+
resolve(span);
403+
});
404+
});
405+
},
406+
];
407+
408+
return new Promise(resolve => {
409+
runBenchmarks(runners, results => {
410+
resolve(results);
411+
});
412+
});
413+
}
414+
415+
function benchmarkStartTrace(): Promise<Map<string, unknown>> {
416+
const customTracerProvider = new NodeTracerProvider();
417+
let trapDoorCalled = false;
418+
419+
const runners: Function[] = [
420+
async function withNullTracerProviderUnsetGlobalTracerProvider() {
421+
const promise = new Promise((resolve, reject) => {
422+
const opts: typeof traceConfig = {
423+
opts: {tracerProvider: null},
424+
};
425+
startTrace('aspan', null, span => {
426+
span.end();
427+
resolve(span);
428+
});
429+
});
430+
return promise;
431+
},
432+
433+
function withTracerDefinedTracerProvider() {
434+
return new Promise(resolve => {
435+
const opts: typeof traceConfig = {
436+
opts: {tracerProvider: customTracerProvider},
437+
};
438+
startTrace('aspan', opts, span => {
439+
span.end();
440+
resolve(span);
441+
});
442+
});
443+
},
444+
445+
function withTracerRegisteredGlobally() {
446+
if (!trapDoorCalled) {
447+
customTracerProvider.register();
448+
trapDoorCalled = true;
449+
}
450+
return new Promise(resolve => {
451+
const opts: typeof traceConfig = {
452+
opts: {tracerProvider: null},
453+
};
454+
startTrace('aspan', opts, span => {
455+
span.end();
456+
resolve(span);
457+
});
458+
});
459+
},
460+
];
461+
462+
return new Promise(resolve => {
463+
runBenchmarks(runners, results => {
464+
resolve(results);
465+
});
466+
});
467+
}

observability-test/spanner.ts

-1
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,6 @@ const {
4545
AsyncHooksContextManager,
4646
} = require('@opentelemetry/context-async-hooks');
4747
import {promisify} from '@google-cloud/promisify';
48-
import {runBenchmarks} from './benchmark';
4948

5049
const {ObservabilityOptions} = require('../src/instrument');
5150
import {SessionPool} from '../src/session-pool';

package.json

+2
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
"samples-test-with-archived": "cd samples/ && npm link ../ && npm test-with-archived && cd ../",
3434
"samples-test": "cd samples/ && npm link ../ && npm test && cd ../",
3535
"system-test": "mocha build/system-test --timeout 1600000",
36+
"observability-benchmark": "mocha build/observability-benchmark --timeout 1600000",
3637
"observability-test": "mocha build/observability-test --timeout 1600000",
3738
"cleanup": "mocha scripts/cleanup.js --timeout 30000",
3839
"test": "mocha build/test build/test/common build/observability-test",
@@ -43,6 +44,7 @@
4344
"prepare": "npm run compile-protos && npm run compile",
4445
"pretest": "npm run compile",
4546
"presystem-test": "npm run compile",
47+
"preobservability-benchmark": "npm run compile",
4648
"preobservability-test": "npm run compile",
4749
"proto": "compileProtos src",
4850
"docs-test": "linkinator docs",

tsconfig.json

+1
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
"test/**/*.ts",
2121
"system-test/*.ts",
2222
"benchmark/*.ts",
23+
"observability-benchmark/*.ts",
2324
"observability-test/*.ts"
2425
]
2526
}

0 commit comments

Comments
 (0)