mirror of
https://github.com/czlonkowski/n8n-mcp.git
synced 2026-01-30 06:22:04 +00:00
257 lines
11 KiB
JavaScript
257 lines
11 KiB
JavaScript
"use strict";
|
|
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
if (k2 === undefined) k2 = k;
|
|
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
}
|
|
Object.defineProperty(o, k2, desc);
|
|
}) : (function(o, m, k, k2) {
|
|
if (k2 === undefined) k2 = k;
|
|
o[k2] = m[k];
|
|
}));
|
|
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
}) : function(o, v) {
|
|
o["default"] = v;
|
|
});
|
|
var __importStar = (this && this.__importStar) || (function () {
|
|
var ownKeys = function(o) {
|
|
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
var ar = [];
|
|
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
return ar;
|
|
};
|
|
return ownKeys(o);
|
|
};
|
|
return function (mod) {
|
|
if (mod && mod.__esModule) return mod;
|
|
var result = {};
|
|
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
__setModuleDefault(result, mod);
|
|
return result;
|
|
};
|
|
})();
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
exports.telemetry = exports.TelemetryManager = void 0;
|
|
const supabase_js_1 = require("@supabase/supabase-js");
|
|
const config_manager_1 = require("./config-manager");
|
|
const event_tracker_1 = require("./event-tracker");
|
|
const batch_processor_1 = require("./batch-processor");
|
|
const performance_monitor_1 = require("./performance-monitor");
|
|
const telemetry_types_1 = require("./telemetry-types");
|
|
const telemetry_error_1 = require("./telemetry-error");
|
|
const logger_1 = require("../utils/logger");
|
|
class TelemetryManager {
|
|
constructor() {
|
|
this.supabase = null;
|
|
this.isInitialized = false;
|
|
if (TelemetryManager.instance) {
|
|
throw new Error('Use TelemetryManager.getInstance() instead of new TelemetryManager()');
|
|
}
|
|
this.configManager = config_manager_1.TelemetryConfigManager.getInstance();
|
|
this.errorAggregator = new telemetry_error_1.TelemetryErrorAggregator();
|
|
this.performanceMonitor = new performance_monitor_1.TelemetryPerformanceMonitor();
|
|
this.eventTracker = new event_tracker_1.TelemetryEventTracker(() => this.configManager.getUserId(), () => this.isEnabled());
|
|
this.batchProcessor = new batch_processor_1.TelemetryBatchProcessor(null, () => this.isEnabled());
|
|
}
|
|
static getInstance() {
|
|
if (!TelemetryManager.instance) {
|
|
TelemetryManager.instance = new TelemetryManager();
|
|
}
|
|
return TelemetryManager.instance;
|
|
}
|
|
ensureInitialized() {
|
|
if (!this.isInitialized && this.configManager.isEnabled()) {
|
|
this.initialize();
|
|
}
|
|
}
|
|
initialize() {
|
|
if (!this.configManager.isEnabled()) {
|
|
logger_1.logger.debug('Telemetry disabled by user preference');
|
|
return;
|
|
}
|
|
const supabaseUrl = process.env.SUPABASE_URL || telemetry_types_1.TELEMETRY_BACKEND.URL;
|
|
const supabaseAnonKey = process.env.SUPABASE_ANON_KEY || telemetry_types_1.TELEMETRY_BACKEND.ANON_KEY;
|
|
try {
|
|
this.supabase = (0, supabase_js_1.createClient)(supabaseUrl, supabaseAnonKey, {
|
|
auth: {
|
|
persistSession: false,
|
|
autoRefreshToken: false,
|
|
},
|
|
realtime: {
|
|
params: {
|
|
eventsPerSecond: 1,
|
|
},
|
|
},
|
|
});
|
|
this.batchProcessor = new batch_processor_1.TelemetryBatchProcessor(this.supabase, () => this.isEnabled());
|
|
this.batchProcessor.start();
|
|
this.isInitialized = true;
|
|
logger_1.logger.debug('Telemetry initialized successfully');
|
|
}
|
|
catch (error) {
|
|
const telemetryError = new telemetry_error_1.TelemetryError(telemetry_error_1.TelemetryErrorType.INITIALIZATION_ERROR, 'Failed to initialize telemetry', { error: error instanceof Error ? error.message : String(error) });
|
|
this.errorAggregator.record(telemetryError);
|
|
telemetryError.log();
|
|
this.isInitialized = false;
|
|
}
|
|
}
|
|
trackToolUsage(toolName, success, duration) {
|
|
this.ensureInitialized();
|
|
this.performanceMonitor.startOperation('trackToolUsage');
|
|
this.eventTracker.trackToolUsage(toolName, success, duration);
|
|
this.eventTracker.updateToolSequence(toolName);
|
|
this.performanceMonitor.endOperation('trackToolUsage');
|
|
}
|
|
async trackWorkflowCreation(workflow, validationPassed) {
|
|
this.ensureInitialized();
|
|
this.performanceMonitor.startOperation('trackWorkflowCreation');
|
|
try {
|
|
await this.eventTracker.trackWorkflowCreation(workflow, validationPassed);
|
|
await this.flush();
|
|
}
|
|
catch (error) {
|
|
const telemetryError = error instanceof telemetry_error_1.TelemetryError
|
|
? error
|
|
: new telemetry_error_1.TelemetryError(telemetry_error_1.TelemetryErrorType.UNKNOWN_ERROR, 'Failed to track workflow', { error: String(error) });
|
|
this.errorAggregator.record(telemetryError);
|
|
}
|
|
finally {
|
|
this.performanceMonitor.endOperation('trackWorkflowCreation');
|
|
}
|
|
}
|
|
async trackWorkflowMutation(data) {
|
|
this.ensureInitialized();
|
|
if (!this.isEnabled()) {
|
|
logger_1.logger.debug('Telemetry disabled, skipping mutation tracking');
|
|
return;
|
|
}
|
|
this.performanceMonitor.startOperation('trackWorkflowMutation');
|
|
try {
|
|
const { mutationTracker } = await Promise.resolve().then(() => __importStar(require('./mutation-tracker.js')));
|
|
const userId = this.configManager.getUserId();
|
|
const mutationRecord = await mutationTracker.processMutation(data, userId);
|
|
if (mutationRecord) {
|
|
this.eventTracker.enqueueMutation(mutationRecord);
|
|
const queueSize = this.eventTracker.getMutationQueueSize();
|
|
if (queueSize >= 2) {
|
|
await this.flushMutations();
|
|
}
|
|
}
|
|
}
|
|
catch (error) {
|
|
const telemetryError = error instanceof telemetry_error_1.TelemetryError
|
|
? error
|
|
: new telemetry_error_1.TelemetryError(telemetry_error_1.TelemetryErrorType.UNKNOWN_ERROR, 'Failed to track workflow mutation', { error: String(error) });
|
|
this.errorAggregator.record(telemetryError);
|
|
logger_1.logger.debug('Error tracking workflow mutation:', error);
|
|
}
|
|
finally {
|
|
this.performanceMonitor.endOperation('trackWorkflowMutation');
|
|
}
|
|
}
|
|
trackError(errorType, context, toolName, errorMessage) {
|
|
this.ensureInitialized();
|
|
this.eventTracker.trackError(errorType, context, toolName, errorMessage);
|
|
}
|
|
trackEvent(eventName, properties) {
|
|
this.ensureInitialized();
|
|
this.eventTracker.trackEvent(eventName, properties);
|
|
}
|
|
trackSessionStart() {
|
|
this.ensureInitialized();
|
|
this.eventTracker.trackSessionStart();
|
|
}
|
|
trackSearchQuery(query, resultsFound, searchType) {
|
|
this.eventTracker.trackSearchQuery(query, resultsFound, searchType);
|
|
}
|
|
trackValidationDetails(nodeType, errorType, details) {
|
|
this.eventTracker.trackValidationDetails(nodeType, errorType, details);
|
|
}
|
|
trackToolSequence(previousTool, currentTool, timeDelta) {
|
|
this.eventTracker.trackToolSequence(previousTool, currentTool, timeDelta);
|
|
}
|
|
trackNodeConfiguration(nodeType, propertiesSet, usedDefaults) {
|
|
this.eventTracker.trackNodeConfiguration(nodeType, propertiesSet, usedDefaults);
|
|
}
|
|
trackPerformanceMetric(operation, duration, metadata) {
|
|
this.eventTracker.trackPerformanceMetric(operation, duration, metadata);
|
|
}
|
|
async flush() {
|
|
this.ensureInitialized();
|
|
if (!this.isEnabled() || !this.supabase)
|
|
return;
|
|
this.performanceMonitor.startOperation('flush');
|
|
const events = this.eventTracker.getEventQueue();
|
|
const workflows = this.eventTracker.getWorkflowQueue();
|
|
const mutations = this.eventTracker.getMutationQueue();
|
|
this.eventTracker.clearEventQueue();
|
|
this.eventTracker.clearWorkflowQueue();
|
|
this.eventTracker.clearMutationQueue();
|
|
try {
|
|
await this.batchProcessor.flush(events, workflows, mutations);
|
|
}
|
|
catch (error) {
|
|
const telemetryError = error instanceof telemetry_error_1.TelemetryError
|
|
? error
|
|
: new telemetry_error_1.TelemetryError(telemetry_error_1.TelemetryErrorType.NETWORK_ERROR, 'Failed to flush telemetry', { error: String(error) }, true);
|
|
this.errorAggregator.record(telemetryError);
|
|
telemetryError.log();
|
|
}
|
|
finally {
|
|
const duration = this.performanceMonitor.endOperation('flush');
|
|
if (duration > 100) {
|
|
logger_1.logger.debug(`Telemetry flush took ${duration.toFixed(2)}ms`);
|
|
}
|
|
}
|
|
}
|
|
async flushMutations() {
|
|
this.ensureInitialized();
|
|
if (!this.isEnabled() || !this.supabase)
|
|
return;
|
|
const mutations = this.eventTracker.getMutationQueue();
|
|
this.eventTracker.clearMutationQueue();
|
|
if (mutations.length > 0) {
|
|
await this.batchProcessor.flush([], [], mutations);
|
|
}
|
|
}
|
|
isEnabled() {
|
|
return this.isInitialized && this.configManager.isEnabled();
|
|
}
|
|
disable() {
|
|
this.configManager.disable();
|
|
this.batchProcessor.stop();
|
|
this.isInitialized = false;
|
|
this.supabase = null;
|
|
}
|
|
enable() {
|
|
this.configManager.enable();
|
|
this.initialize();
|
|
}
|
|
getStatus() {
|
|
return this.configManager.getStatus();
|
|
}
|
|
getMetrics() {
|
|
return {
|
|
status: this.isEnabled() ? 'enabled' : 'disabled',
|
|
initialized: this.isInitialized,
|
|
tracking: this.eventTracker.getStats(),
|
|
processing: this.batchProcessor.getMetrics(),
|
|
errors: this.errorAggregator.getStats(),
|
|
performance: this.performanceMonitor.getDetailedReport(),
|
|
overhead: this.performanceMonitor.getTelemetryOverhead()
|
|
};
|
|
}
|
|
static resetInstance() {
|
|
TelemetryManager.instance = undefined;
|
|
global.__telemetryManager = undefined;
|
|
}
|
|
}
|
|
exports.TelemetryManager = TelemetryManager;
|
|
const globalAny = global;
|
|
if (!globalAny.__telemetryManager) {
|
|
globalAny.__telemetryManager = TelemetryManager.getInstance();
|
|
}
|
|
exports.telemetry = globalAny.__telemetryManager;
|
|
//# sourceMappingURL=telemetry-manager.js.map
|