diff --git a/internal/monitors/monitor_info.go b/internal/monitors/monitor_info.go index 6222026..d909960 100644 --- a/internal/monitors/monitor_info.go +++ b/internal/monitors/monitor_info.go @@ -34,11 +34,14 @@ func GetMonitorInfo(httpClient *http.Client, apiKey string, monitorId string) er monitorConfig := resp.GetMonitor() var monitor Monitor + var regions []monitorv1.Region switch { case monitorConfig.HasHttp(): monitor = httpMonitorToLocal(monitorConfig.GetHttp()) + regions = monitorConfig.GetHttp().GetRegions() case monitorConfig.HasTcp(): monitor = tcpMonitorToLocal(monitorConfig.GetTcp()) + regions = monitorConfig.GetTcp().GetRegions() default: return fmt.Errorf("unknown monitor type") } @@ -80,7 +83,17 @@ func GetMonitorInfo(httpClient *http.Client, apiKey string, monitorId string) er } data = append(data, []string{"Frequency", monitor.Periodicity}) - data = append(data, []string{"Locations", strings.Join(monitor.Regions, ",")}) + + // Group regions by provider and display each provider on its own row + regionGroups := groupRegionsByProvider(regions) + providers := []string{"Fly.io", "Koyeb", "Railway"} + for _, provider := range providers { + codes := regionGroups[provider] + if len(codes) > 0 { + data = append(data, []string{fmt.Sprintf("Locations (%s)", provider), strings.Join(codes, ", ")}) + } + } + data = append(data, []string{"Active", fmt.Sprintf("%t", monitor.Active)}) data = append(data, []string{"Public", fmt.Sprintf("%t", monitor.Public)}) diff --git a/internal/monitors/monitors.go b/internal/monitors/monitors.go index 1ac8e70..1e7bf73 100644 --- a/internal/monitors/monitors.go +++ b/internal/monitors/monitors.go @@ -5,6 +5,7 @@ import ( "encoding/json" "fmt" "net/http" + "strings" monitorv1 "buf.build/gen/go/openstatus/api/protocolbuffers/go/openstatus/monitor/v1" "buf.build/gen/go/openstatus/api/connectrpc/gosimple/openstatus/monitor/v1/monitorv1connect" @@ -100,6 +101,7 @@ func httpMethodToString(m monitorv1.HTTPMethod) string { // regionToString converts SDK Region enum to string func regionToString(r monitorv1.Region) string { switch r { + // Fly.io regions case monitorv1.Region_REGION_FLY_AMS: return "ams" case monitorv1.Region_REGION_FLY_ARN: @@ -136,6 +138,22 @@ func regionToString(r monitorv1.Region) string { return "syd" case monitorv1.Region_REGION_FLY_YYZ: return "yyz" + // Koyeb regions + case monitorv1.Region_REGION_KOYEB_SFO: + return "sfo" + case monitorv1.Region_REGION_KOYEB_WAS: + return "was" + case monitorv1.Region_REGION_KOYEB_FRA: + return "fra" + case monitorv1.Region_REGION_KOYEB_PAR: + return "par" + case monitorv1.Region_REGION_KOYEB_SIN: + return "sin" + case monitorv1.Region_REGION_KOYEB_TYO: + return "tyo" + // Railway regions + case monitorv1.Region_REGION_RAILWAY_US_WEST2: + return "us-west2" default: return r.String() } @@ -145,11 +163,32 @@ func regionToString(r monitorv1.Region) string { func regionsToStrings(regions []monitorv1.Region) []string { result := make([]string, len(regions)) for i, r := range regions { - result[i] = r.String() + result[i] = regionToString(r) } return result } +// groupRegionsByProvider categorizes regions into Fly.io, Koyeb, and Railway groups +func groupRegionsByProvider(regions []monitorv1.Region) map[string][]string { + groups := map[string][]string{ + "Fly.io": {}, + "Koyeb": {}, + "Railway": {}, + } + for _, r := range regions { + code := regionToString(r) + switch { + case strings.HasPrefix(r.String(), "REGION_FLY_"): + groups["Fly.io"] = append(groups["Fly.io"], code) + case strings.HasPrefix(r.String(), "REGION_KOYEB_"): + groups["Koyeb"] = append(groups["Koyeb"], code) + case strings.HasPrefix(r.String(), "REGION_RAILWAY_"): + groups["Railway"] = append(groups["Railway"], code) + } + } + return groups +} + // Inverse converter functions (config types → SDK types) // stringToPeriodicity converts config.Frequency to SDK Periodicity