@clipwhisperer/common
Version:
ClipWhisperer Common - Shared library providing core utilities, database schemas, authentication, bucket management, and common functionality across all ClipWhisperer microservices
111 lines (99 loc) • 2.63 kB
text/typescript
/**
* Performance Metrics Infrastructure
* Centralized performance tracking system used across all services
*/
export interface PerformanceMetrics {
totalRequests: number;
averageResponseTime: number;
successRate: number;
queueSize: number;
memoryUsage: NodeJS.MemoryUsage;
uptime: number;
}
export interface PerformanceData {
totalRequests: number;
totalResponseTime: number;
successCount: number;
startTime: number;
}
export class PerformanceTracker {
private metrics: PerformanceData = {
totalRequests: 0,
totalResponseTime: 0,
successCount: 0,
startTime: Date.now()
};
/**
* Track a successful request
*/
trackSuccess(responseTime?: number): void {
this.metrics.totalRequests++;
this.metrics.successCount++;
if (responseTime !== undefined) {
this.metrics.totalResponseTime += responseTime;
}
}
/**
* Track a failed request
*/
trackError(responseTime?: number): void {
this.metrics.totalRequests++;
if (responseTime !== undefined) {
this.metrics.totalResponseTime += responseTime;
}
}
/**
* Track a request with timing
*/
async trackRequest<T>(operation: () => Promise<T>): Promise<T> {
const startTime = Date.now();
try {
const result = await operation();
this.trackSuccess(Date.now() - startTime);
return result;
} catch (error) {
this.trackError(Date.now() - startTime);
throw error;
}
}
/**
* Get current performance metrics
*/
getMetrics(): PerformanceMetrics {
const averageResponseTime = this.metrics.totalRequests > 0
? this.metrics.totalResponseTime / this.metrics.totalRequests
: 0;
const successRate = this.metrics.totalRequests > 0
? (this.metrics.successCount / this.metrics.totalRequests) * 100
: 100;
return {
totalRequests: this.metrics.totalRequests,
averageResponseTime,
successRate,
queueSize: 0, // Override in subclasses that have queue access
memoryUsage: process.memoryUsage(),
uptime: Date.now() - this.metrics.startTime
};
}
/**
* Reset metrics
*/
reset(): void {
this.metrics = {
totalRequests: 0,
totalResponseTime: 0,
successCount: 0,
startTime: Date.now()
};
}
/**
* Get raw metrics data
*/
getRawData(): PerformanceData {
return { ...this.metrics };
}
}
/**
* Global performance tracker instance
*/
export const globalPerformanceTracker = new PerformanceTracker();