mirror of
https://github.com/TwiN/gatus.git
synced 2024-11-07 16:44:25 +01:00
Allow duplicate service names as long as they're in a different group (#13)
This commit is contained in:
parent
f034bd15de
commit
43504913b4
@ -2,6 +2,9 @@ package core
|
|||||||
|
|
||||||
// ServiceStatus contains the evaluation Results of a Service
|
// ServiceStatus contains the evaluation Results of a Service
|
||||||
type ServiceStatus struct {
|
type ServiceStatus struct {
|
||||||
|
// Name of the service
|
||||||
|
Name string `json:"name,omitempty"`
|
||||||
|
|
||||||
// Group the service is a part of. Used for grouping multiple services together on the front end.
|
// Group the service is a part of. Used for grouping multiple services together on the front end.
|
||||||
Group string `json:"group,omitempty"`
|
Group string `json:"group,omitempty"`
|
||||||
|
|
||||||
@ -12,6 +15,7 @@ type ServiceStatus struct {
|
|||||||
// NewServiceStatus creates a new ServiceStatus
|
// NewServiceStatus creates a new ServiceStatus
|
||||||
func NewServiceStatus(service *Service) *ServiceStatus {
|
func NewServiceStatus(service *Service) *ServiceStatus {
|
||||||
return &ServiceStatus{
|
return &ServiceStatus{
|
||||||
|
Name: service.Name,
|
||||||
Group: service.Group,
|
Group: service.Group,
|
||||||
Results: make([]*Result, 0),
|
Results: make([]*Result, 0),
|
||||||
}
|
}
|
||||||
|
@ -3,15 +3,18 @@ package core
|
|||||||
import "testing"
|
import "testing"
|
||||||
|
|
||||||
func TestNewServiceStatus(t *testing.T) {
|
func TestNewServiceStatus(t *testing.T) {
|
||||||
service := &Service{Group: "test"}
|
service := &Service{Name: "name", Group: "group"}
|
||||||
serviceStatus := NewServiceStatus(service)
|
serviceStatus := NewServiceStatus(service)
|
||||||
|
if serviceStatus.Name != service.Name {
|
||||||
|
t.Errorf("expected %s, got %s", service.Name, serviceStatus.Name)
|
||||||
|
}
|
||||||
if serviceStatus.Group != service.Group {
|
if serviceStatus.Group != service.Group {
|
||||||
t.Errorf("expected %s, got %s", service.Group, serviceStatus.Group)
|
t.Errorf("expected %s, got %s", service.Group, serviceStatus.Group)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestServiceStatus_AddResult(t *testing.T) {
|
func TestServiceStatus_AddResult(t *testing.T) {
|
||||||
service := &Service{Group: "test"}
|
service := &Service{Name: "name", Group: "group"}
|
||||||
serviceStatus := NewServiceStatus(service)
|
serviceStatus := NewServiceStatus(service)
|
||||||
for i := 0; i < 50; i++ {
|
for i := 0; i < 50; i++ {
|
||||||
serviceStatus.AddResult(&Result{})
|
serviceStatus.AddResult(&Result{})
|
||||||
|
@ -219,11 +219,11 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function createStatusBadge(serviceName, index, success) {
|
function createStatusBadge(serviceStatusIndex, index, success) {
|
||||||
if (success) {
|
if (success) {
|
||||||
return "<span class='status badge badge-success' style='width: 5%' onmouseenter='showTooltip(\""+serviceName+"\", "+index+", this)' onmouseleave='fadeTooltip()' onclick='userClickedStatus = !userClickedStatus;'>✓</span>";
|
return "<span class='status badge badge-success' style='width: 5%' onmouseenter='showTooltip(\""+serviceStatusIndex+"\", "+index+", this)' onmouseleave='fadeTooltip()' onclick='userClickedStatus = !userClickedStatus;'>✓</span>";
|
||||||
}
|
}
|
||||||
return "<span class='status badge badge-danger' style='width: 5%' onmouseenter='showTooltip(\""+serviceName+"\", "+index+", this)' onmouseleave='fadeTooltip()' onclick='userClickedStatus = !userClickedStatus;'>X</span>";
|
return "<span class='status badge badge-danger' style='width: 5%' onmouseenter='showTooltip(\""+serviceStatusIndex+"\", "+index+", this)' onmouseleave='fadeTooltip()' onclick='userClickedStatus = !userClickedStatus;'>X</span>";
|
||||||
}
|
}
|
||||||
|
|
||||||
function refreshStatuses() {
|
function refreshStatuses() {
|
||||||
@ -238,17 +238,17 @@
|
|||||||
|
|
||||||
function buildTable() {
|
function buildTable() {
|
||||||
let outputByGroup = {};
|
let outputByGroup = {};
|
||||||
for (let serviceName in serviceStatuses) {
|
for (let serviceStatusIndex in serviceStatuses) {
|
||||||
let serviceStatusOverTime = "";
|
let serviceStatusOverTime = "";
|
||||||
let serviceStatus = serviceStatuses[serviceName];
|
let serviceStatus = serviceStatuses[serviceStatusIndex];
|
||||||
let hostname = serviceStatus.results[serviceStatus.results.length-1].hostname;
|
let hostname = serviceStatus.results[serviceStatus.results.length-1].hostname;
|
||||||
let minResponseTime = null;
|
let minResponseTime = null;
|
||||||
let maxResponseTime = null;
|
let maxResponseTime = null;
|
||||||
let newestTimestamp = null;
|
let newestTimestamp = null;
|
||||||
let oldestTimestamp = null;
|
let oldestTimestamp = null;
|
||||||
for (let key in serviceStatus.results) {
|
for (let resultIndex in serviceStatus.results) {
|
||||||
let serviceResult = serviceStatus.results[key];
|
let serviceResult = serviceStatus.results[resultIndex];
|
||||||
serviceStatusOverTime = createStatusBadge(serviceName, key, serviceResult.success) + serviceStatusOverTime;
|
serviceStatusOverTime = createStatusBadge(serviceStatusIndex, resultIndex, serviceResult.success) + serviceStatusOverTime;
|
||||||
const responseTime = parseInt(serviceResult.duration/1000000);
|
const responseTime = parseInt(serviceResult.duration/1000000);
|
||||||
if (minResponseTime == null || minResponseTime > responseTime) {
|
if (minResponseTime == null || minResponseTime > responseTime) {
|
||||||
minResponseTime = responseTime;
|
minResponseTime = responseTime;
|
||||||
@ -268,7 +268,7 @@
|
|||||||
+ "<div class='container py-3 border-left border-right border-top border-black rounded-0'>"
|
+ "<div class='container py-3 border-left border-right border-top border-black rounded-0'>"
|
||||||
+ " <div class='row mb-2'>"
|
+ " <div class='row mb-2'>"
|
||||||
+ " <div class='col-md-10'>"
|
+ " <div class='col-md-10'>"
|
||||||
+ " <span class='font-weight-bold'>" + serviceName + "</span> <span class='text-secondary font-weight-lighter'>- " + hostname + "</span>"
|
+ " <span class='font-weight-bold'>" + serviceStatus.name + "</span> <span class='text-secondary font-weight-lighter'>- " + hostname + "</span>"
|
||||||
+ " </div>"
|
+ " </div>"
|
||||||
+ " <div class='col-md-2 text-right'>"
|
+ " <div class='col-md-2 text-right'>"
|
||||||
+ " <span class='font-weight-lighter status-min-max-ms'>" + (minResponseTime === maxResponseTime ? minResponseTime : (minResponseTime + "-" + maxResponseTime)) + "ms</span>"
|
+ " <span class='font-weight-lighter status-min-max-ms'>" + (minResponseTime === maxResponseTime ? minResponseTime : (minResponseTime + "-" + maxResponseTime)) + "ms</span>"
|
||||||
|
@ -81,11 +81,12 @@ func monitor(service *core.Service) {
|
|||||||
|
|
||||||
// UpdateServiceStatuses updates the slice of service statuses
|
// UpdateServiceStatuses updates the slice of service statuses
|
||||||
func UpdateServiceStatuses(service *core.Service, result *core.Result) {
|
func UpdateServiceStatuses(service *core.Service, result *core.Result) {
|
||||||
|
key := fmt.Sprintf("%s_%s", service.Group, service.Name)
|
||||||
serviceStatusesMutex.Lock()
|
serviceStatusesMutex.Lock()
|
||||||
serviceStatus, exists := serviceStatuses[service.Name]
|
serviceStatus, exists := serviceStatuses[key]
|
||||||
if !exists {
|
if !exists {
|
||||||
serviceStatus = core.NewServiceStatus(service)
|
serviceStatus = core.NewServiceStatus(service)
|
||||||
serviceStatuses[service.Name] = serviceStatus
|
serviceStatuses[key] = serviceStatus
|
||||||
}
|
}
|
||||||
serviceStatus.AddResult(result)
|
serviceStatus.AddResult(result)
|
||||||
serviceStatusesMutex.Unlock()
|
serviceStatusesMutex.Unlock()
|
||||||
|
Loading…
Reference in New Issue
Block a user