Allow duplicate service names as long as they're in a different group (#13)

This commit is contained in:
TwinProduction 2020-11-30 08:44:58 -05:00
parent f034bd15de
commit 43504913b4
4 changed files with 21 additions and 13 deletions

View File

@ -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),
} }

View File

@ -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{})

View File

@ -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;'>&#10003;</span>"; return "<span class='status badge badge-success' style='width: 5%' onmouseenter='showTooltip(\""+serviceStatusIndex+"\", "+index+", this)' onmouseleave='fadeTooltip()' onclick='userClickedStatus = !userClickedStatus;'>&#10003;</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>"

View File

@ -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()