diff --git a/cachet/component.go b/cachet/component.go new file mode 100644 index 0000000..a6cd677 --- /dev/null +++ b/cachet/component.go @@ -0,0 +1,18 @@ +package cachet + +import ( + "time" +) + +type Component struct { + Id int `json:"id"` + Name string `json:"name"` + Description string `json:"description"` + Status int `json:"status"` + Link *string `json:"link"` + Order *int `json:"order"` + Group_id *int `json:"group_id"` + Created_at *time.Time `json:"created_at"` + Updated_at *time.Time `json:"updated_at"` + Deleted_at *time.Time `json:"deleted_at"` +} \ No newline at end of file diff --git a/cachet/incident.go b/cachet/incident.go new file mode 100644 index 0000000..c4a177e --- /dev/null +++ b/cachet/incident.go @@ -0,0 +1,17 @@ +package cachet + +import ( + "time" +) + +type Incident struct { + Id int `json:"id"` + Name string `json:"name"` + Message string `json:"message"` + Status int `json:"status"`// 4? + Human_status string `json:"human_status"` + Component *Component `json:"component"` + Component_id *int `json:"component_id"` + Created_at *time.Time `json:"created_at"` + Updated_at *time.Time `json:"updated_at"` +} \ No newline at end of file diff --git a/cachet/metrics.go b/cachet/metrics.go index 791be75..ac34e56 100644 --- a/cachet/metrics.go +++ b/cachet/metrics.go @@ -33,8 +33,8 @@ func SendMetric(metricId int, delay int64) { defer resp.Body.Close() - body, _ := ioutil.ReadAll(resp.Body) - fmt.Println(strconv.Itoa(resp.StatusCode) + " " + string(body)) + _, _ = ioutil.ReadAll(resp.Body) + // fmt.Println(strconv.Itoa(resp.StatusCode) + " " + string(body)) if resp.StatusCode != 200 { fmt.Println("Could not log data point!") diff --git a/cachet/monitor.go b/cachet/monitor.go index 81d24a3..e023cbb 100644 --- a/cachet/monitor.go +++ b/cachet/monitor.go @@ -11,37 +11,70 @@ const timeout = time.Duration(time.Second) type Monitor struct { Url string `json:"url"` MetricId int `json:"metric_id"` + Threshold float32 `json:"threshold"` + ComponentId *int `json:"component_id"` + ExpectedStatusCode int `json:"expected_status_code"` + + History []bool `json:"-"` + Incident *Incident `json:"-"` } func (monitor *Monitor) Run() { reqStart := getMs() - err := monitor.doRequest() + isUp := monitor.doRequest() lag := getMs() - reqStart - failed := false - if err != nil { - failed = true + if len(monitor.History) >= 10 { + monitor.History = monitor.History[len(monitor.History)-9:] } + monitor.History = append(monitor.History, isUp) + monitor.AnalyseData() - if failed == true { - fmt.Println("Req failed") + if isUp == true { + SendMetric(monitor.MetricId, lag) + return } - - SendMetric(1, lag) } -func (monitor *Monitor) doRequest() error { +func (monitor *Monitor) doRequest() bool { client := &http.Client{ Timeout: timeout, } - resp, err := client.Get(monitor.Url) // http://127.0.0.1:1337 + resp, err := client.Get(monitor.Url) if err != nil { - return err + return false } defer resp.Body.Close() - return nil + return resp.StatusCode == monitor.ExpectedStatusCode +} + +func (monitor *Monitor) AnalyseData() { + // look at the past few incidents + if len(monitor.History) != 10 { + // not enough data + return + } + + numDown := 0 + for _, wasUp := range monitor.History { + if wasUp == false { + numDown++ + } + } + + t := (float32(numDown) / float32(len(monitor.History))) * 100 + fmt.Printf("%s %.2f%% Down. Threshold: %.2f%%\n", monitor.Url, t, monitor.Threshold) + if t > monitor.Threshold && monitor.Incident == nil { + // is down, create an incident + fmt.Println("Creating incident...") + monitor.Incident = &Incident{} + } else if t < monitor.Threshold && monitor.Incident != nil { + // was down, created an incident, its now ok, make it resolved. + fmt.Println("Updating incident to resolved...") + monitor.Incident = nil + } } func getMs() int64 { diff --git a/main.go b/main.go index 1534a72..c3ce774 100644 --- a/main.go +++ b/main.go @@ -6,10 +6,17 @@ import ( ) func main() { - monitors := []cachet.Monitor{ - cachet.Monitor{ + monitors := []*cachet.Monitor{ + /*&cachet.Monitor{ Url: "https://nodegear.io/ping", MetricId: 1, + Threshold: 80.0, + },*/ + &cachet.Monitor{ + Url: "http://localhost:1337", + MetricId: 1, + Threshold: 80.0, + ExpectedStatusCode: 200, }, }