добавлен фильтр количеста вывода записей на странице История тревог
This commit is contained in:
@@ -158,3 +158,97 @@ export function aggregateChartDataByDaysAverage(
|
||||
|
||||
return dailyData
|
||||
}
|
||||
|
||||
/**
|
||||
* Интерфейс для данных с разделением по типам событий
|
||||
*/
|
||||
export interface SeverityChartDataPoint {
|
||||
timestamp: string
|
||||
critical: number
|
||||
warning: number
|
||||
label?: string
|
||||
}
|
||||
|
||||
/**
|
||||
* Агрегирует данные тревог по дням с разделением по severity
|
||||
* @param alerts - Массив тревог с полями timestamp и severity
|
||||
* @param timePeriod - Период в часах ('24', '72', '168', '720')
|
||||
* @returns Агрегированные данные с разделением по critical/warning
|
||||
*/
|
||||
export function aggregateAlertsBySeverity(
|
||||
alerts: Array<{ timestamp?: string; created_at?: string; severity?: string }>,
|
||||
timePeriod: string
|
||||
): SeverityChartDataPoint[] {
|
||||
if (!Array.isArray(alerts) || alerts.length === 0) {
|
||||
return []
|
||||
}
|
||||
|
||||
// Группируем по дням
|
||||
const dailyMap = new Map<string, { critical: number; warning: number; date: Date }>()
|
||||
|
||||
alerts.forEach(alert => {
|
||||
const timestampField = alert.timestamp || alert.created_at
|
||||
if (!timestampField) return
|
||||
|
||||
const date = new Date(timestampField)
|
||||
const dateKey = date.toISOString().split('T')[0]
|
||||
|
||||
if (!dailyMap.has(dateKey)) {
|
||||
dailyMap.set(dateKey, { critical: 0, warning: 0, date })
|
||||
}
|
||||
|
||||
const entry = dailyMap.get(dateKey)!
|
||||
|
||||
if (alert.severity === 'critical') {
|
||||
entry.critical += 1
|
||||
} else if (alert.severity === 'warning') {
|
||||
entry.warning += 1
|
||||
}
|
||||
})
|
||||
|
||||
// Преобразуем в массив и сортируем по дате
|
||||
const dailyData = Array.from(dailyMap.entries())
|
||||
.sort((a, b) => new Date(a[0]).getTime() - new Date(b[0]).getTime())
|
||||
.map(([dateKey, data]) => {
|
||||
const date = new Date(dateKey)
|
||||
|
||||
// Форматируем подпись в зависимости от периода
|
||||
let label = ''
|
||||
if (timePeriod === '24') {
|
||||
// День - показываем время
|
||||
label = date.toLocaleDateString('ru-RU', {
|
||||
day: '2-digit',
|
||||
month: '2-digit',
|
||||
hour: '2-digit'
|
||||
})
|
||||
} else if (timePeriod === '72') {
|
||||
// 3 дня - показываем день недели и дату
|
||||
label = date.toLocaleDateString('ru-RU', {
|
||||
weekday: 'short',
|
||||
day: '2-digit',
|
||||
month: '2-digit'
|
||||
})
|
||||
} else if (timePeriod === '168') {
|
||||
// Неделя - показываем день недели
|
||||
label = date.toLocaleDateString('ru-RU', {
|
||||
weekday: 'short',
|
||||
day: '2-digit'
|
||||
})
|
||||
} else if (timePeriod === '720') {
|
||||
// Месяц - показываем дату
|
||||
label = date.toLocaleDateString('ru-RU', {
|
||||
day: '2-digit',
|
||||
month: '2-digit'
|
||||
})
|
||||
}
|
||||
|
||||
return {
|
||||
timestamp: date.toISOString(),
|
||||
critical: data.critical,
|
||||
warning: data.warning,
|
||||
label
|
||||
}
|
||||
})
|
||||
|
||||
return dailyData
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user