github.com/stakater/IngressMonitorController@v1.0.103/pkg/monitors/uptime/uptime-monitor.go (about) 1 package uptime 2 3 import ( 4 "encoding/json" 5 "errors" 6 "strconv" 7 "strings" 8 9 Http "net/http" 10 "net/url" 11 12 log "github.com/sirupsen/logrus" 13 14 "github.com/stakater/IngressMonitorController/pkg/config" 15 "github.com/stakater/IngressMonitorController/pkg/http" 16 "github.com/stakater/IngressMonitorController/pkg/models" 17 ) 18 19 type UpTimeMonitorService struct { 20 apiKey string 21 url string 22 alertContacts string 23 } 24 25 func (monitor *UpTimeMonitorService) Setup(p config.Provider) { 26 monitor.apiKey = p.ApiKey 27 monitor.url = p.ApiURL 28 monitor.alertContacts = p.AlertContacts 29 } 30 31 func (monitor *UpTimeMonitorService) GetByName(name string) (*models.Monitor, error) { 32 33 monitors := monitor.GetAll() 34 35 if monitors != nil { 36 for _, monitor := range monitors { 37 if monitor.Name == name { 38 return &monitor, nil 39 } 40 } 41 } 42 43 errorString := name + " not found" 44 log.Println(errorString) 45 return nil, errors.New(errorString) 46 } 47 48 func (monitor *UpTimeMonitorService) GetAll() []models.Monitor { 49 50 action := "checks/" 51 52 client := http.CreateHttpClient(monitor.url + action) 53 54 headers := make(map[string]string) 55 headers["Authorization"] = "Token " + monitor.apiKey 56 headers["Content-Type"] = "application/json" 57 58 response := client.GetUrl(headers, []byte("")) 59 60 if response.StatusCode == Http.StatusOK { 61 62 var f UptimeMonitorGetMonitorsResponse 63 err := json.Unmarshal(response.Bytes, &f) 64 if err != nil { 65 log.Println("Could not Unmarshal Json Response") 66 } 67 if f.Count == 0 { 68 return []models.Monitor{} 69 } else { 70 return UptimeMonitorMonitorsToBaseMonitorsMapper(f.Monitors) 71 } 72 73 } 74 75 log.Println("GetAllMonitors Request failed. Status Code: " + strconv.Itoa(response.StatusCode)) 76 return nil 77 78 } 79 80 func (monitor *UpTimeMonitorService) Add(m models.Monitor) { 81 82 action := "checks/add-http/" 83 client := http.CreateHttpClient(monitor.url + action) 84 85 headers := make(map[string]string) 86 headers["Authorization"] = "Token " + monitor.apiKey 87 headers["Content-Type"] = "application/json" 88 headers["Accepts"] = "application/json" 89 90 body := make(map[string]interface{}) 91 body["name"] = m.Name 92 unEscapedURL, _ := url.QueryUnescape(m.URL) 93 body["msp_address"] = unEscapedURL 94 95 if val, ok := m.Annotations["uptime.monitor.stakater.com/interval"]; ok { 96 interval, err := strconv.Atoi(val) 97 if nil == err { 98 body["msp_interval"] = interval 99 } 100 } else { 101 body["msp_interval"] = 5 // by default interval check is 5 minutes 102 } 103 104 if val, ok := m.Annotations["uptime.monitor.stakater.com/locations"]; ok { 105 body["locations"] = strings.Split(val, ",") 106 } else { 107 body["locations"] = strings.Split("US-East,US-West,GBR", ",") // by default 3 lcoations for a check 108 } 109 110 if val, ok := m.Annotations["uptime.monitor.stakater.com/contacts"]; ok { 111 body["contact_groups"] = strings.Split(val, ",") 112 } else { 113 body["contact_groups"] = strings.Split("Default", ",") // use default use email as a contact 114 } 115 jsonBody, err := json.Marshal(body) 116 if err == nil { 117 log.Println(string(jsonBody)) 118 response := client.PostUrl(headers, jsonBody) 119 120 if response.StatusCode == Http.StatusOK { 121 var f UptimeMonitorMonitorResponse 122 123 err := json.Unmarshal(response.Bytes, &f) 124 if err != nil { 125 log.Println("Failed to Unmarshal Response Json Object") 126 } 127 128 if f.Errors == false { 129 log.Println("Monitor Added: " + m.Name) 130 } else { 131 log.Print("Monitor couldn't be added: " + m.Name + 132 "Response: ") 133 log.Println(string(response.Bytes)) 134 } 135 } else { 136 log.Printf("AddMonitor Request failed. Status Code: " + strconv.Itoa(response.StatusCode) + string(response.Bytes)) 137 } 138 } else { 139 log.Println(err.Error()) 140 } 141 } 142 143 func (monitor *UpTimeMonitorService) Update(m models.Monitor) { 144 145 action := "checks/" + m.ID + "/" 146 client := http.CreateHttpClient(monitor.url + action) 147 148 headers := make(map[string]string) 149 headers["Authorization"] = "Token " + monitor.apiKey 150 headers["Content-Type"] = "application/json" 151 152 body := make(map[string]interface{}) 153 body["name"] = m.Name 154 unEscapedURL, _ := url.QueryUnescape(m.URL) 155 body["msp_address"] = unEscapedURL 156 157 if val, ok := m.Annotations["uptime.monitor.stakater.com/interval"]; ok { 158 interval, err := strconv.Atoi(val) 159 if nil == err { 160 body["msp_interval"] = interval 161 } 162 } else { 163 body["msp_interval"] = 5 // by default interval check is 5 minutes 164 } 165 166 if val, ok := m.Annotations["uptime.monitor.stakater.com/locations"]; ok { 167 body["locations"] = strings.Split(val, ",") 168 } else { 169 body["locations"] = strings.Split("US-East,US-West,GBR", ",") // by default 3 lcoations for a check 170 } 171 172 if val, ok := m.Annotations["uptime.monitor.stakater.com/contacts"]; ok { 173 body["contact_groups"] = strings.Split(val, ",") 174 } else { 175 body["contact_groups"] = strings.Split("Default", ",") // use default use email as a contact 176 } 177 jsonBody, err := json.Marshal(body) 178 log.Println(string(jsonBody)) 179 if err == nil { 180 response := client.PutUrl(headers, jsonBody) 181 182 if response.StatusCode == Http.StatusOK { 183 var f UptimeMonitorMonitorResponse 184 err := json.Unmarshal(response.Bytes, &f) 185 if err != nil { 186 log.Println("Failed to Unmarshal Response Json Object") 187 } 188 if f.Errors == false { 189 log.Println("Monitor Updated: " + m.Name) 190 } else { 191 log.Println("Monitor couldn't be updated: " + m.Name) 192 } 193 } else { 194 log.Println("UpdateMonitor Request failed. Status Code: " + strconv.Itoa(response.StatusCode)) 195 } 196 } else { 197 log.Println("Failed to Marshal JSON Object") 198 } 199 } 200 201 func (monitor *UpTimeMonitorService) Remove(m models.Monitor) { 202 action := "checks/" + m.ID + "/" 203 204 client := http.CreateHttpClient(monitor.url + action) 205 206 headers := make(map[string]string) 207 headers["Authorization"] = "Token " + monitor.apiKey 208 headers["Content-Type"] = "application/json" 209 210 response := client.DeleteUrl(headers, []byte("")) 211 212 if response.StatusCode == Http.StatusOK { 213 var f UptimeMonitorMonitorResponse 214 json.Unmarshal(response.Bytes, &f) 215 216 if f.Errors == false { 217 log.Println("Monitor Removed: " + m.Name) 218 } else { 219 log.Println("Monitor couldn't be removed: " + m.Name) 220 } 221 } else { 222 log.Println("RemoveMonitor Request failed. Status Code: " + strconv.Itoa(response.StatusCode)) 223 } 224 }