@ahmedhegazee/nestjs-telescope
Version:
Advanced observability and monitoring solution for NestJS applications with ML-powered analytics, enterprise features, and production-ready scaling
127 lines (126 loc) • 3.91 kB
TypeScript
import { OnModuleInit } from '@nestjs/common';
import { Observable } from 'rxjs';
import { TelescopeEntry } from '../interfaces/telescope-entry.interface';
import { TelescopeConfig } from '../interfaces/telescope-config.interface';
export interface ScalingNode {
id: string;
hostname: string;
port: number;
status: 'active' | 'inactive' | 'unhealthy';
load: number;
memoryUsage: number;
cpuUsage: number;
lastHeartbeat: Date;
capabilities: string[];
version: string;
}
export interface ScalingConfig {
enabled: boolean;
clusterMode: boolean;
nodeId: string;
discovery: {
method: 'redis' | 'consul' | 'kubernetes' | 'manual';
interval: number;
timeout: number;
};
loadBalancing: {
strategy: 'round-robin' | 'least-loaded' | 'consistent-hash' | 'random';
healthCheckInterval: number;
failoverEnabled: boolean;
};
dataDistribution: {
sharding: boolean;
shardKey: string;
replicationFactor: number;
consistencyLevel: 'eventual' | 'strong' | 'quorum';
};
communication: {
protocol: 'http' | 'grpc' | 'redis-pubsub';
timeout: number;
retries: number;
compression: boolean;
};
}
export interface LoadBalancingResult {
targetNode: ScalingNode;
strategy: string;
loadFactor: number;
latency: number;
}
export interface ClusterHealth {
totalNodes: number;
activeNodes: number;
unhealthyNodes: number;
averageLoad: number;
dataDistribution: {
balanced: boolean;
variance: number;
recommendations: string[];
};
performance: {
averageResponseTime: number;
throughput: number;
errorRate: number;
};
}
export declare class HorizontalScalingService implements OnModuleInit {
private readonly telescopeConfig;
private readonly logger;
private readonly nodes;
private readonly nodeSubject;
private readonly healthSubject;
private readonly loadBalancer;
private readonly loadBalancerCounters;
private readonly nodeLoadHistory;
private readonly config;
private readonly localNode;
private heartbeatInterval;
private discoveryInterval;
constructor(telescopeConfig: TelescopeConfig);
onModuleInit(): Promise<void>;
private getDefaultScalingConfig;
private createLocalNode;
private initializeScaling;
private initializeLoadBalancer;
private startHeartbeat;
private startDiscovery;
private sendHeartbeat;
private updateLocalNodeMetrics;
private getCpuUsage;
private calculateLoad;
private broadcastHeartbeat;
private broadcastViaRedis;
private broadcastViaHttp;
private broadcastViaGrpc;
private discoverNodes;
private discoverNodesViaRedis;
private discoverNodesViaConsul;
private discoverNodesViaKubernetes;
private updateNodeHealth;
private markNodeUnhealthy;
private cleanupInactiveNodes;
private startHealthMonitoring;
routeEntry(entry: TelescopeEntry): Promise<LoadBalancingResult>;
private selectTargetNode;
private roundRobinSelection;
private getRoundRobinIndex;
private leastLoadedSelection;
private consistentHashSelection;
private hashString;
private randomSelection;
private measureLatency;
getClusterHealth(): Promise<ClusterHealth>;
private analyzeDataDistribution;
private measureClusterPerformance;
private calculateThroughput;
private calculateErrorRate;
getNodeUpdates(): Observable<ScalingNode>;
getClusterHealthUpdates(): Observable<ClusterHealth>;
getNodes(): ScalingNode[];
getActiveNodes(): ScalingNode[];
getNodeById(nodeId: string): ScalingNode | undefined;
isLocalNode(nodeId: string): boolean;
getLocalNode(): ScalingNode;
shutdown(): Promise<void>;
private notifyShutdown;
}