analyticsService.ts
Обзор
Файл analyticsService.ts реализует сервис аналитики для сбора, хранения и управления метриками сети, экономическими показателями и метриками валидаторов в блокчейн-системе. Он предоставляет интерфейсы для описания структур данных метрик и класса AnalyticsService, который отвечает за периодический сбор данных, анализ, генерацию системных оповещений, подписку клиентов на обновления и экспорт данных.
Основная функциональность включает:
Инициализацию и хранение исторических и текущих данных метрик.
Периодический сбор и обновление метрик с эмуляцией реальных изменений.
Обнаружение проблем и генерация предупреждений и критических оповещений.
Поддержку подписчиков, которым сервис отправляет обновления в режиме реального времени.
Управление метриками валидаторов.
Оценку общего состояния системы.
Экспорт собранных данных в JSON-формате.
Интерфейсы и типы
MetricPoint
interface MetricPoint {
timestamp: number; // Временная метка в миллисекундах с начала эпохи
value: number; // Значение метрики в заданный момент времени
}
Представляет одну точку данных метрики с временной меткой и числовым значением.
NetworkMetrics
interface NetworkMetrics {
tps: MetricPoint[]; // Транзакций в секунду
blockTime: MetricPoint[]; // Время создания блока (секунды)
consensusTime: MetricPoint[]; // Время достижения консенсуса (секунды)
validatorCount: MetricPoint[]; // Количество активных валидаторов
pendingActions: MetricPoint[]; // Количество ожидающих действий (транзакций)
networkHealth: MetricPoint[]; // Индекс здоровья сети (0-100)
}
Набор метрик, отражающих состояние сети.
EconomicMetrics
interface EconomicMetrics {
manaPrice: MetricPoint[]; // Цена токена MANA
totalValueLocked: MetricPoint[]; // Общая заблокированная стоимость
dailyTransactions: MetricPoint[];// Количество транзакций в день
stakingApr: MetricPoint[]; // Годовая доходность по стейкингу (%)
validatorRewards: MetricPoint[]; // Вознаграждения валидаторов
networkFees: MetricPoint[]; // Суммарные сетевые комиссии
}
Метрики, описывающие экономическое состояние блокчейн-системы.
ValidatorMetrics
interface ValidatorMetrics {
validatorId: string; // Уникальный идентификатор валидатора
uptime: MetricPoint[]; // Время работы в сети (доля)
responseTime: MetricPoint[]; // Время отклика (мс)
blocksValidated: MetricPoint[]; // Количество проверенных блоков
rewards: MetricPoint[]; // Полученные вознаграждения
slashingEvents: number; // Количество событий наказания (слэшинга)
}
Данные по отдельным валидаторам.
SystemAlert
interface SystemAlert {
id: string; // Уникальный идентификатор оповещения
type: 'critical' | 'warning' | 'info'; // Тип оповещения
title: string; // Заголовок
message: string; // Описание проблемы
timestamp: number; // Временная метка создания
resolved: boolean; // Статус решения
category: 'network' | 'economic' | 'validator' | 'security'; // Категория
severity: number; // Важность (1-10)
affectedComponents: string[]; // Затронутые компоненты
}
Структура для системных уведомлений и предупреждений.
Класс AnalyticsService
Описание
AnalyticsService — основной класс для управления всеми метриками и оповещениями. Работает как с историческими, так и с текущими данными, периодически обновляя их и оповещая подписчиков. Сервис реализован как синглтон и экспортируется экземпляр analyticsService.
Свойства
Свойство | Тип | Описание |
|---|---|---|
|
| Метрики сети |
|
| Экономические метрики |
|
| Метрики валидаторов, индексируемые по ID |
|
| Список системных оповещений |
|
| Подписчики на обновления |
| `NodeJS.Timeout \ | null` |
|
| Максимальное число точек метрик (100) |
Конструктор
constructor()
Инициализирует пустые массивы метрик.
Запускает инициализацию исторических данных (
initializeMetrics).Запускает периодический сбор метрик (
startMetricsCollection).
Методы (приватные)
initializeMetrics()
Заполняет массивы метрик историческими данными с временными интервалами в 30 секунд.
Использует генерацию случайных чисел для имитации реальных значений.
startMetricsCollection()
Запускает таймер, который каждые 5 секунд вызывает:
collectNetworkMetrics()collectEconomicMetrics()checkForAlerts()notifySubscribers()
collectNetworkMetrics()
Добавляет новые точки данных в метрики сети с случайными значениями в ожидаемых диапазонах.
collectEconomicMetrics()
Добавляет новые экономические метрики, учитывая предыдущие значения для плавных изменений.
addMetricPoint(metrics: MetricPoint[], point: MetricPoint)
Добавляет точку в массив метрик.
Обрезает массив до
MAX_METRIC_POINTS, убирая старые точки.
checkForAlerts()
Анализирует последние метрики и создает оповещения при обнаружении проблем, таких как:
Критически низкое здоровье сети (<85).
Высокая очередь транзакций (>100).
Медленный консенсус (>5 секунд).
Значительные колебания цены MANA (>20% за 24 часа).
createAlert(alertData: Omit<SystemAlert, 'id' | 'timestamp' | 'resolved'>)
Создает новое оповещение, если аналогичное не существует в последние 5 минут.
Ограничивает общее количество оповещений до 50.
calculatePriceChange24h(): number
Рассчитывает процентное изменение цены MANA за последние 24 часа, исходя из данных с интервалом 30 секунд.
getLatestMetrics()
Возвращает объект с последними значениями основных метрик.
notifySubscribers()
Отправляет обновленные данные всем подписчикам.
Обрабатывает возможные ошибки в колбэках.
Методы (публичные)
subscribe(id: string, callback: (data: any) => void)
Добавляет подписчика с уникальным идентификатором.
Сразу отправляет текущие данные подписчику.
Пример использования:
analyticsService.subscribe('client1', (data) => {
console.log('Обновленные данные:', data);
});
unsubscribe(id: string)
Удаляет подписчика по идентификатору.
getNetworkMetrics(): NetworkMetrics
Возвращает копию текущих сетевых метрик.
getEconomicMetrics(): EconomicMetrics
Возвращает копию текущих экономических метрик.
getAlerts(): SystemAlert[]
Возвращает копию списка оповещений.
resolveAlert(alertId: string)
Помечает оповещение с указанным ID как решённое.
getValidatorMetrics(validatorId: string): ValidatorMetrics | undefined
Возвращает метрики конкретного валидатора по ID.
addValidatorMetrics(validatorId: string, metrics: Partial<ValidatorMetrics>)
Добавляет или обновляет метрики валидатора.
Принимает частичный объект метрик для обновления.
getSystemHealth(): { overall: number; network: number; economic: number; validators: number; }
Рассчитывает и возвращает оценку здоровья системы по четырём категориям:
overall— среднее значение.network— здоровье сети с учётом оповещений.economic— экономическое состояние с учётом цены MANA.validators— состояние валидаторов по количеству.
exportMetrics(timeRange: 'hour' | 'day' | 'week' = 'day'): string
Возвращает JSON-строку с текущими метриками, оповещениями и состоянием системы.
Параметр
timeRangeзадаёт временной интервал для экспорта (по умолчанию — день).
destroy()
Останавливает таймер сбора метрик.
Удаляет всех подписчиков.
Очищает внутренние ресурсы.
Взаимодействие с другими частями системы
analyticsService.tsработает как автономный сервис — он не зависит напрямую от других модулей.Предполагается, что другие части приложения (например, UI-компоненты, API-эндпоинты) подписываются на обновления аналитики через методы
subscribe/unsubscribe.Экспорт данных через
exportMetricsможет использоваться для создания отчетов, логирования или передачи данных во внешние системы.Метрики валидаторов могут обновляться из внешних источников, интегрированных с системой валидаторов.
Важные детали реализации
Для эмуляции данных используется генерация случайных чисел с некоторыми ограничениями, чтобы значения были реалистичными.
Метрики хранятся с ограничением в 100 последних точек для оптимизации памяти.
Оповещения создаются с предотвращением дублирования за период 5 минут.
Подписчики получают данные в полном объёме при подписке и периодически при обновлениях.
Состояние системы оценивается на основе метрик и количества активных предупреждений.
Используется таймер Node.js
setIntervalдля регулярного обновления метрик.
Пример использования
import { analyticsService } from './analyticsService';
// Подписка на обновления
analyticsService.subscribe('dashboard', (data) => {
console.log('Обновленные метрики:', data.latestMetrics);
console.log('Текущие оповещения:', data.alerts);
});
// Получение текущих метрик
const network = analyticsService.getNetworkMetrics();
console.log('TPS:', network.tps[network.tps.length - 1]);
// Разрешение оповещения
const alerts = analyticsService.getAlerts();
if (alerts.length > 0) {
analyticsService.resolveAlert(alerts[0].id);
}
// Экспорт данных за день
const jsonReport = analyticsService.exportMetrics('day');
console.log(jsonReport);
// Очистка сервиса при завершении работы
analyticsService.destroy();
Диаграмма класса AnalyticsService
classDiagram
class AnalyticsService {
-networkMetrics: NetworkMetrics
-economicMetrics: EconomicMetrics
-validatorMetrics: Map~string, ValidatorMetrics~
-alerts: SystemAlert[]
-subscribers: Map~string, function~
-metricsInterval: NodeJS.Timeout | null
-MAX_METRIC_POINTS: number
+constructor()
-initializeMetrics()
-startMetricsCollection()
-collectNetworkMetrics()
-collectEconomicMetrics()
-addMetricPoint(metrics: MetricPoint[], point: MetricPoint)
-checkForAlerts()
-createAlert(alertData)
-calculatePriceChange24h(): number
-getLatestMetrics()
-notifySubscribers()
+subscribe(id: string, callback: function)
+unsubscribe(id: string)
+getNetworkMetrics(): NetworkMetrics
+getEconomicMetrics(): EconomicMetrics
+getAlerts(): SystemAlert[]
+resolveAlert(alertId: string)
+getValidatorMetrics(validatorId: string): ValidatorMetrics | undefined
+addValidatorMetrics(validatorId: string, metrics: Partial~ValidatorMetrics~)
+getSystemHealth(): object
+exportMetrics(timeRange: string): string
+destroy()
}
Данная документация описывает полный функционал файла analyticsService.ts, позволяя разработчикам легко понимать архитектуру, использовать и расширять сервис аналитики.