Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Faster trace id generation #824

Merged
merged 12 commits into from
Mar 3, 2020
23 changes: 14 additions & 9 deletions packages/opentelemetry-core/src/platform/browser/id.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,24 +21,29 @@ declare type WindowWithMsCrypto = Window & {
const cryptoLib = window.crypto || (window as WindowWithMsCrypto).msCrypto;

const SPAN_ID_BYTES = 8;
const spanBytesArray = new Uint8Array(SPAN_ID_BYTES);
const TRACE_ID_BYTES = 16;

/** Returns a random 16-byte trace ID formatted as a 32-char hex string. */
export function randomTraceId(): string {
return randomSpanId() + randomSpanId();
return randomId(TRACE_ID_BYTES);
}

/** Returns a random 8-byte span ID formatted as a 16-char hex string. */
export function randomSpanId(): string {
let spanId = '';
cryptoLib.getRandomValues(spanBytesArray);
for (let i = 0; i < SPAN_ID_BYTES; i++) {
const hexStr = spanBytesArray[i].toString(16);
return randomId(SPAN_ID_BYTES);
}

const randomBytesArray = new Uint8Array(TRACE_ID_BYTES);
function randomId(byteLength: number): string {
let id = '';
cryptoLib.getRandomValues(randomBytesArray);
for (let i = 0; i < byteLength; i++) {
const hexStr = randomBytesArray[i].toString(16);

// Zero pad bytes whose hex values are single digit.
if (hexStr.length === 1) spanId += '0';
if (hexStr.length === 1) id += '0';

spanId += hexStr;
id += hexStr;
}
return spanId;
return id;
}
3 changes: 2 additions & 1 deletion packages/opentelemetry-core/src/platform/node/id.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,13 +17,14 @@
import * as crypto from 'crypto';

const SPAN_ID_BYTES = 8;
const TRACE_ID_BYTES = 16;

/**
* Returns a random 16-byte trace ID formatted/encoded as a 32 lowercase hex
* characters corresponding to 128 bits.
*/
export function randomTraceId(): string {
return randomSpanId() + randomSpanId();
return crypto.randomBytes(TRACE_ID_BYTES).toString('hex');
}

/**
Expand Down