@nivinjoseph/n-eda
Version:
Event Driven Architecture framework
306 lines (242 loc) • 12.2 kB
text/typescript
// import { given } from "@nivinjoseph/n-defensive";
// import { ProfilerTrace, Profiler } from "@nivinjoseph/n-util";
// export class ConsumerProfiler
// {
// private readonly _eventTraces = new Array<ProfilerTrace>();
// private readonly _eventProcessings: { [name: string]: number; } = {};
// private readonly _eventRetries: { [name: string]: number; } = {};
// private readonly _eventFailures: { [name: string]: number; } = {};
// private _fetchPartitionWriteIndexProfiler: Profiler | null = null;
// private _fetchConsumerPartitionReadIndexProfiler: Profiler | null = null;
// private _incrementConsumerPartitionReadIndexProfiler: Profiler | null = null;
// private _retrieveEventProfiler: Profiler | null = null;
// private _batchRetrieveEventsProfiler: Profiler | null = null;
// private _decompressEventProfiler: Profiler | null = null;
// private _deserializeEventProfiler: Profiler | null = null;
// private _eventProfiler: { name: string; id: string; profiler: Profiler } | null = null;
// private static readonly _eventQueuePressure = new Array<{ time: number, count: number }>();
// private static _startTime: number;
// private static _eventQueuePressureInterval: NodeJS.Timeout;
// public static initialize()
// {
// ConsumerProfiler._startTime = Date.now();
// ConsumerProfiler.trackEventQueuePressure();
// ConsumerProfiler._eventQueuePressureInterval = setInterval(() => ConsumerProfiler.trackEventQueuePressure(),
// 60000);
// }
// private static trackEventQueuePressure(): void
// {
// const handleCount = (<any>process)._getActiveHandles().length;
// ConsumerProfiler._eventQueuePressure.push({ time: Date.now(), count: handleCount });
// }
// public fetchPartitionWriteIndexStarted(): void
// {
// this._fetchPartitionWriteIndexProfiler = new Profiler("fetchPartitionWriteIndex");
// }
// public fetchPartitionWriteIndexEnded(): void
// {
// given(this, "this")
// .ensure(t => t._fetchPartitionWriteIndexProfiler != null);
// this._fetchPartitionWriteIndexProfiler!.trace("$fetchPartitionWriteIndex");
// this._eventTraces.push(this._fetchPartitionWriteIndexProfiler!.traces[1]);
// this._fetchPartitionWriteIndexProfiler = null;
// }
// public fetchConsumerPartitionReadIndexStarted(): void
// {
// this._fetchConsumerPartitionReadIndexProfiler = new Profiler("fetchConsumerPartitionReadIndex");
// }
// public fetchConsumerPartitionReadIndexEnded(): void
// {
// given(this, "this")
// .ensure(t => t._fetchConsumerPartitionReadIndexProfiler != null);
// this._fetchConsumerPartitionReadIndexProfiler!.trace("$fetchConsumerPartitionReadIndex");
// this._eventTraces.push(this._fetchConsumerPartitionReadIndexProfiler!.traces[1]);
// this._fetchConsumerPartitionReadIndexProfiler = null;
// }
// public incrementConsumerPartitionReadIndexStarted(): void
// {
// this._incrementConsumerPartitionReadIndexProfiler = new Profiler("incrementConsumerPartitionReadIndex");
// }
// public incrementConsumerPartitionReadIndexEnded(): void
// {
// given(this, "this")
// .ensure(t => t._incrementConsumerPartitionReadIndexProfiler != null);
// this._incrementConsumerPartitionReadIndexProfiler!.trace("$incrementConsumerPartitionReadIndex");
// this._eventTraces.push(this._incrementConsumerPartitionReadIndexProfiler!.traces[1]);
// this._incrementConsumerPartitionReadIndexProfiler = null;
// }
// public retrieveEventStarted(): void
// {
// this._retrieveEventProfiler = new Profiler("retrieveEvent");
// }
// public retrieveEventEnded(): void
// {
// given(this, "this")
// .ensure(t => t._retrieveEventProfiler != null);
// this._retrieveEventProfiler!.trace("$retrieveEvent");
// this._eventTraces.push(this._retrieveEventProfiler!.traces[1]);
// this._retrieveEventProfiler = null;
// }
// public batchRetrieveEventsStarted(): void
// {
// this._batchRetrieveEventsProfiler = new Profiler("batchRetrieveEvents");
// }
// public batchRetrieveEventsEnded(): void
// {
// given(this, "this")
// .ensure(t => t._batchRetrieveEventsProfiler != null);
// this._batchRetrieveEventsProfiler!.trace("$batchRetrieveEvents");
// this._eventTraces.push(this._batchRetrieveEventsProfiler!.traces[1]);
// this._batchRetrieveEventsProfiler = null;
// }
// public decompressEventStarted(): void
// {
// this._decompressEventProfiler = new Profiler("decompressEvent");
// }
// public decompressEventEnded(): void
// {
// given(this, "this")
// .ensure(t => t._decompressEventProfiler != null);
// this._decompressEventProfiler!.trace("$decompressEvent");
// this._eventTraces.push(this._decompressEventProfiler!.traces[1]);
// this._decompressEventProfiler = null;
// }
// public deserializeEventStarted(): void
// {
// this._deserializeEventProfiler = new Profiler("deserializeEvent");
// }
// public deserializeEventEnded(): void
// {
// given(this, "this")
// .ensure(t => t._deserializeEventProfiler != null);
// this._deserializeEventProfiler!.trace("$deserializeEvent");
// this._eventTraces.push(this._deserializeEventProfiler!.traces[1]);
// this._deserializeEventProfiler = null;
// }
// public eventProcessingStarted(eventName: string, eventId: string): void
// {
// given(eventName, "eventName").ensureHasValue().ensureIsString();
// given(eventId, "eventId").ensureHasValue().ensureIsString();
// this._eventProfiler = { name: eventName, id: eventId, profiler: new Profiler("eventProcessing") };
// if (!this._eventProcessings[eventName])
// this._eventProcessings[eventName] = 0;
// this._eventProcessings[eventName]++;
// }
// public eventProcessingEnded(eventName: string, eventId: string): void
// {
// given(eventName, "eventName").ensureHasValue().ensureIsString();
// given(eventId, "eventId").ensureHasValue().ensureIsString();
// given(this, "this")
// .ensure(t => t._eventProfiler != null && t._eventProfiler.name === eventName && t._eventProfiler.id === eventId);
// this._eventProfiler!.profiler.trace(eventName);
// this._eventTraces.push(this._eventProfiler!.profiler.traces[1]);
// this._eventProfiler = null;
// }
// public eventRetried(eventName: string): void
// {
// given(eventName, "eventName").ensureHasValue().ensureIsString();
// if (!this._eventRetries[eventName])
// this._eventRetries[eventName] = 0;
// this._eventRetries[eventName]++;
// }
// public eventFailed(eventName: string): void
// {
// given(eventName, "eventName").ensureHasValue().ensureIsString();
// if (!this._eventFailures[eventName])
// this._eventFailures[eventName] = 0;
// this._eventFailures[eventName]++;
// }
// public static aggregate(consumerName: string , consumerProfilers: ReadonlyArray<ConsumerProfiler>): void
// {
// given(consumerName, "consumerName").ensureHasValue().ensureIsString();
// given(consumerProfilers, "consumerProfilers").ensureHasValue().ensureIsArray().ensure(t => t.length > 0);
// const endTime = Date.now();
// clearInterval(ConsumerProfiler._eventQueuePressureInterval);
// ConsumerProfiler.trackEventQueuePressure();
// const eventTraces = new Array<ProfilerTrace>();
// const eventProcessings: { [name: string]: number; } = { };
// const eventRetries: { [name: string]: number; } = { };
// const eventFailures: { [name: string]: number; } = {};
// consumerProfilers.forEach((profiler) =>
// {
// eventTraces.push(...profiler._eventTraces);
// Object.entries(profiler._eventProcessings).forEach((entry) =>
// {
// const key = entry[0];
// const value = entry[1];
// if (eventProcessings[key])
// eventProcessings[key] += value;
// else
// eventProcessings[key] = value;
// });
// Object.entries(profiler._eventRetries).forEach((entry) =>
// {
// const key = entry[0];
// const value = entry[1];
// if (eventRetries[key])
// eventRetries[key] += value;
// else
// eventRetries[key] = value;
// });
// Object.entries(profiler._eventFailures).forEach((entry) =>
// {
// const key = entry[0];
// const value = entry[1];
// if (eventFailures[key])
// eventFailures[key] += value;
// else
// eventFailures[key] = value;
// });
// });
// let totalEventCount = 0;
// let totalEventsProcessingTime = 0;
// let totalEventAverage = 0;
// let groupCount = 0;
// const messages = new Array<any>();
// eventTraces.groupBy(t => t.message)
// .forEach((group) =>
// {
// const eventCount = group.values.length;
// const eventsProcessingTime = group.values.reduce((acc, t) => acc + t.diffMs, 0);
// const eventAverage = eventsProcessingTime / eventCount;
// if (!group.key.startsWith("$"))
// {
// totalEventCount += eventCount;
// totalEventsProcessingTime += eventsProcessingTime;
// totalEventAverage += eventAverage;
// groupCount++;
// }
// const diffs = group.values.map(t => t.diffMs).orderBy();
// messages.push({
// name: group.key,
// procesings: eventProcessings[group.key] ?? null,
// retries: eventRetries[group.key] ?? null,
// failures: eventFailures[group.key] ?? null,
// processed: eventCount,
// totalPT: eventsProcessingTime,
// averagePT: Math.floor(eventAverage),
// minPT: Math.min(...diffs),
// maxPT: Math.max(...diffs),
// medianPT: group.values.length % 2 === 0
// ? Math.floor((diffs[(diffs.length / 2) - 1] + diffs[diffs.length / 2]) / 2)
// : diffs[Math.floor(diffs.length / 2) - 1]
// });
// });
// console.log(`[${consumerName}] AGGREGATE (does not include $events)`);
// console.table({
// startTime: (new Date(ConsumerProfiler._startTime)).toString().split("GMT")[0].trim(),
// enfTime: (new Date(endTime)).toString().split("GMT")[0].trim(),
// consumer: consumerName,
// totalEventsProcessed: totalEventCount,
// totalPT: totalEventsProcessingTime,
// averagePT: groupCount === 0 ? 0 : Math.floor(totalEventAverage / groupCount)
// });
// console.log(`[${consumerName}] DETAILS`);
// console.table(messages.orderBy(t => t.name));
// console.log(`[${consumerName}] EVENT QUEUE PRESSURE`);
// console.table(ConsumerProfiler._eventQueuePressure.map(t => ({
// time: (new Date(t.time)).toString().split("GMT")[0].trim(),
// count: t.count
// })));
// }
// }