@ahmedhegazee/nestjs-telescope
Version:
Advanced observability and monitoring solution for NestJS applications with ML-powered analytics, enterprise features, and production-ready scaling
165 lines (164 loc) • 4.64 kB
TypeScript
import { OnModuleInit } from "@nestjs/common";
import { Observable } from "rxjs";
import { TelescopeConfig } from "../interfaces/telescope-config.interface";
export interface CacheEntry<T = any> {
key: string;
value: T;
timestamp: Date;
ttl: number;
accessCount: number;
lastAccessed: Date;
size: number;
tags: string[];
priority: "low" | "medium" | "high" | "critical";
version: string;
metadata: Record<string, any>;
}
export interface CacheConfig {
enabled: boolean;
tiers: {
l1: {
enabled: boolean;
type: "memory" | "node-cache";
maxSize: number;
ttl: number;
maxEntries: number;
};
l2: {
enabled: boolean;
type: "redis" | "memcached";
host: string;
port: number;
ttl: number;
maxSize: number;
compression: boolean;
};
l3: {
enabled: boolean;
type: "database" | "file";
ttl: number;
maxSize: number;
};
};
strategies: {
writePolicy: "write-through" | "write-back" | "write-around";
readPolicy: "read-through" | "cache-aside" | "refresh-ahead";
evictionPolicy: "lru" | "lfu" | "fifo" | "random";
compression: boolean;
encryption: boolean;
};
monitoring: {
enabled: boolean;
metricsInterval: number;
hitRateThreshold: number;
sizeThreshold: number;
};
}
export interface CacheMetrics {
hits: number;
misses: number;
hitRate: number;
totalSize: number;
entryCount: number;
evictions: number;
compressions: number;
tierMetrics: {
l1: TierMetrics;
l2: TierMetrics;
l3: TierMetrics;
};
performance: {
averageAccessTime: number;
averageWriteTime: number;
compressionRatio: number;
};
}
export interface TierMetrics {
hits: number;
misses: number;
hitRate: number;
size: number;
entryCount: number;
evictions: number;
}
export interface CacheOperation {
type: "get" | "set" | "delete" | "clear" | "evict";
key: string;
tier: "l1" | "l2" | "l3";
timestamp: Date;
duration: number;
success: boolean;
error: string | undefined;
}
export declare class AdvancedCachingService implements OnModuleInit {
private readonly telescopeConfig;
private readonly logger;
private readonly l1Cache;
private readonly l2Cache;
private readonly l3Cache;
private readonly metrics;
private readonly operationSubject;
private readonly metricsSubject;
private readonly config;
private readonly accessOrder;
private readonly tagIndex;
private monitoringInterval;
constructor(telescopeConfig: TelescopeConfig);
onModuleInit(): Promise<void>;
private getDefaultCacheConfig;
private initializeMetrics;
private initializeCaches;
private initializeL2Cache;
private initializeL3Cache;
private startMonitoring;
get<T>(key: string, options?: {
tier?: "l1" | "l2" | "l3";
tags?: string[];
}): Promise<T | null>;
set<T>(key: string, value: T, options?: {
ttl?: number;
tier?: "l1" | "l2" | "l3";
tags?: string[];
priority?: "low" | "medium" | "high" | "critical";
version?: string;
}): Promise<void>;
delete(key: string, options?: {
tier?: "l1" | "l2" | "l3";
}): Promise<boolean>;
invalidateByTags(tags: string[]): Promise<number>;
clear(tier?: "l1" | "l2" | "l3"): Promise<void>;
private getFromL1;
private getFromL2;
private getFromL3;
private setInL1;
private setInL2;
private setInL3;
private deleteFromL1;
private deleteFromL2;
private deleteFromL3;
private clearL2Cache;
private clearL3Cache;
private writeThrough;
private writeBack;
private writeAround;
private ensureL1Capacity;
private evictFromL1;
private findLeastFrequentlyUsed;
private isExpired;
private calculateSize;
private calculateL1Size;
private updateAccessOrder;
private removeFromAccessOrder;
private updateTagIndex;
private recordOperation;
private updateMetrics;
private checkThresholds;
getMetrics(): CacheMetrics;
getOperations(): Observable<CacheOperation>;
getMetricsUpdates(): Observable<CacheMetrics>;
warmup(keys: string[]): Promise<void>;
optimize(): Promise<void>;
private compressLargeEntries;
shutdown(): Promise<void>;
private persistWriteBackData;
}