From cb03e828ee22fc08295466895e47df704fd1b555 Mon Sep 17 00:00:00 2001 From: ostiwe Date: Tue, 12 Aug 2025 18:58:09 +0300 Subject: [PATCH] feat: Added uptime calculation method --- dto/service.go | 1 + model/service.go | 28 ++++++++++++++++++++++++++++ transform/service.go | 3 ++- 3 files changed, 31 insertions(+), 1 deletion(-) diff --git a/dto/service.go b/dto/service.go index 6fc0f90..9c38847 100644 --- a/dto/service.go +++ b/dto/service.go @@ -6,4 +6,5 @@ type PublicService struct { Name string `json:"name"` Description string `json:"description"` Statuses []model.Status `json:"statuses"` + Uptime float64 `json:"uptime"` } diff --git a/model/service.go b/model/service.go index 8f84ec5..6e2a0fe 100644 --- a/model/service.go +++ b/model/service.go @@ -1,5 +1,7 @@ package model +import "math" + type HTTPConfig struct { Method string `json:"method"` Headers map[string]string `json:"headers"` @@ -45,3 +47,29 @@ func (s Service) CountLastStatuses(status StatusCode) uint { return count } + +func (s Service) CalculateUptimePercent() float64 { + var uptime float64 + + if len(s.Statuses) == 0 { + return uptime + } + + var countOfOkStatus int + + for i := range s.Statuses { + if s.Statuses[i].Status == StatusOK { + countOfOkStatus++ + } + } + + if countOfOkStatus == 0 { + return uptime + } + + sla := 100 - (float64(len(s.Statuses)) / float64(countOfOkStatus)) + ratio := math.Pow(10, float64(2)) + uptime = math.Round(sla*ratio) / ratio + + return uptime +} diff --git a/transform/service.go b/transform/service.go index 38db7e5..22100f0 100644 --- a/transform/service.go +++ b/transform/service.go @@ -18,7 +18,8 @@ func PublicServices(items ...model.Service) []dto.PublicService { func PublicService(item model.Service) dto.PublicService { return dto.PublicService{ Name: item.Name, - Description: item.Description, + Description: item.PublicDescription, Statuses: item.Statuses, + Uptime: item.CalculateUptimePercent(), } }