mirror of
https://github.com/TwiN/gatus.git
synced 2024-11-25 17:33:19 +01:00
70 lines
2.8 KiB
Go
70 lines
2.8 KiB
Go
package memory
|
|
|
|
import (
|
|
"log"
|
|
"time"
|
|
|
|
"github.com/TwinProduction/gatus/core"
|
|
)
|
|
|
|
const (
|
|
numberOfHoursInTenDays = 10 * 24
|
|
sevenDays = 7 * 24 * time.Hour
|
|
)
|
|
|
|
// processUptimeAfterResult processes the result by extracting the relevant from the result and recalculating the uptime
|
|
// if necessary
|
|
func processUptimeAfterResult(uptime *core.Uptime, result *core.Result) {
|
|
// XXX: Remove this on v3.0.0
|
|
if len(uptime.SuccessfulExecutionsPerHour) != 0 || len(uptime.TotalExecutionsPerHour) != 0 {
|
|
migrateUptimeToHourlyStatistics(uptime)
|
|
}
|
|
if uptime.HourlyStatistics == nil {
|
|
uptime.HourlyStatistics = make(map[int64]*core.HourlyUptimeStatistics)
|
|
}
|
|
unixTimestampFlooredAtHour := result.Timestamp.Truncate(time.Hour).Unix()
|
|
hourlyStats, _ := uptime.HourlyStatistics[unixTimestampFlooredAtHour]
|
|
if hourlyStats == nil {
|
|
hourlyStats = &core.HourlyUptimeStatistics{}
|
|
uptime.HourlyStatistics[unixTimestampFlooredAtHour] = hourlyStats
|
|
}
|
|
if result.Success {
|
|
hourlyStats.SuccessfulExecutions++
|
|
}
|
|
hourlyStats.TotalExecutions++
|
|
hourlyStats.TotalExecutionsResponseTime += uint64(result.Duration.Milliseconds())
|
|
// Clean up only when we're starting to have too many useless keys
|
|
// Note that this is only triggered when there are more entries than there should be after
|
|
// 10 days, despite the fact that we are deleting everything that's older than 7 days.
|
|
// This is to prevent re-iterating on every `processUptimeAfterResult` as soon as the uptime has been logged for 7 days.
|
|
if len(uptime.HourlyStatistics) > numberOfHoursInTenDays {
|
|
sevenDaysAgo := time.Now().Add(-(sevenDays + time.Hour)).Unix()
|
|
for hourlyUnixTimestamp := range uptime.HourlyStatistics {
|
|
if sevenDaysAgo > hourlyUnixTimestamp {
|
|
delete(uptime.HourlyStatistics, hourlyUnixTimestamp)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// XXX: Remove this on v3.0.0
|
|
// Deprecated
|
|
func migrateUptimeToHourlyStatistics(uptime *core.Uptime) {
|
|
log.Println("[migrateUptimeToHourlyStatistics] Got", len(uptime.SuccessfulExecutionsPerHour), "entries for successful executions and", len(uptime.TotalExecutionsPerHour), "entries for total executions")
|
|
uptime.HourlyStatistics = make(map[int64]*core.HourlyUptimeStatistics)
|
|
for hourlyUnixTimestamp, totalExecutions := range uptime.TotalExecutionsPerHour {
|
|
if totalExecutions == 0 {
|
|
log.Println("[migrateUptimeToHourlyStatistics] Skipping entry at", hourlyUnixTimestamp, "because total number of executions is 0")
|
|
continue
|
|
}
|
|
uptime.HourlyStatistics[hourlyUnixTimestamp] = &core.HourlyUptimeStatistics{
|
|
TotalExecutions: totalExecutions,
|
|
SuccessfulExecutions: uptime.SuccessfulExecutionsPerHour[hourlyUnixTimestamp],
|
|
TotalExecutionsResponseTime: 0,
|
|
}
|
|
}
|
|
log.Println("[migrateUptimeToHourlyStatistics] Migrated", len(uptime.HourlyStatistics), "entries")
|
|
uptime.SuccessfulExecutionsPerHour = nil
|
|
uptime.TotalExecutionsPerHour = nil
|
|
}
|