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  }