| @@ -1,12 +1,15 @@ | |||||
| package engine | package engine | ||||
| import ( | import ( | ||||
| "bytes" | |||||
| "encoding/json" | |||||
| "io/ioutil" | |||||
| "net/http" | |||||
| "strconv" | "strconv" | ||||
| "strings" | "strings" | ||||
| "time" | "time" | ||||
| "github.com/toolkits/pkg/logger" | "github.com/toolkits/pkg/logger" | ||||
| "github.com/toolkits/pkg/net/httplib" | |||||
| "github.com/didi/nightingale/v5/src/models" | "github.com/didi/nightingale/v5/src/models" | ||||
| "github.com/didi/nightingale/v5/src/pkg/ibex" | "github.com/didi/nightingale/v5/src/pkg/ibex" | ||||
| @@ -14,6 +17,39 @@ import ( | |||||
| "github.com/didi/nightingale/v5/src/server/memsto" | "github.com/didi/nightingale/v5/src/server/memsto" | ||||
| ) | ) | ||||
| func PostJSON(url string, timeout time.Duration, v interface{}) (response []byte, code int, err error) { | |||||
| var bs []byte | |||||
| bs, err = json.Marshal(v) | |||||
| if err != nil { | |||||
| return | |||||
| } | |||||
| bf := bytes.NewBuffer(bs) | |||||
| client := http.Client{ | |||||
| Timeout: timeout, | |||||
| } | |||||
| req, err := http.NewRequest("POST", url, bf) | |||||
| req.Header.Set("Content-Type", "application/json") | |||||
| var resp *http.Response | |||||
| resp, err = client.Do(req) | |||||
| if err != nil { | |||||
| return | |||||
| } | |||||
| code = resp.StatusCode | |||||
| if resp.Body != nil { | |||||
| defer resp.Body.Close() | |||||
| response, err = ioutil.ReadAll(resp.Body) | |||||
| } | |||||
| return | |||||
| } | |||||
| func callback(event *models.AlertCurEvent) { | func callback(event *models.AlertCurEvent) { | ||||
| urls := strings.Fields(event.Callbacks) | urls := strings.Fields(event.Callbacks) | ||||
| for _, url := range urls { | for _, url := range urls { | ||||
| @@ -21,8 +57,10 @@ func callback(event *models.AlertCurEvent) { | |||||
| continue | continue | ||||
| } | } | ||||
| if strings.HasPrefix(url, "${ibex}") && !event.IsRecovered { | |||||
| handleIbex(url, event) | |||||
| if strings.HasPrefix(url, "${ibex}") { | |||||
| if !event.IsRecovered { | |||||
| handleIbex(url, event) | |||||
| } | |||||
| continue | continue | ||||
| } | } | ||||
| @@ -30,7 +68,7 @@ func callback(event *models.AlertCurEvent) { | |||||
| url = "http://" + url | url = "http://" + url | ||||
| } | } | ||||
| resp, code, err := httplib.PostJSON(url, 5*time.Second, event, map[string]string{}) | |||||
| resp, code, err := PostJSON(url, 5*time.Second, event) | |||||
| if err != nil { | if err != nil { | ||||
| logger.Errorf("event_callback(rule_id=%d url=%s) fail, resp: %s, err: %v, code: %d", event.RuleId, url, string(resp), err, code) | logger.Errorf("event_callback(rule_id=%d url=%s) fail, resp: %s, err: %v, code: %d", event.RuleId, url, string(resp), err, code) | ||||
| } else { | } else { | ||||