|
@@ -69,45 +69,83 @@ func doStartRule(rs *RuleState) error {
|
|
|
return nil
|
|
|
}
|
|
|
|
|
|
-func getRuleStatus(name string) (string, error) {
|
|
|
+func getAllRulesWithStatus() ([]map[string]interface{}, error) {
|
|
|
+ names, err := ruleProcessor.GetAllRules()
|
|
|
+ if err != nil {
|
|
|
+ return nil, err
|
|
|
+ }
|
|
|
+ result := make([]map[string]interface{}, len(names))
|
|
|
+ for i, name := range names {
|
|
|
+ s, err := getRuleState(name)
|
|
|
+ if err != nil {
|
|
|
+ return nil, err
|
|
|
+ }
|
|
|
+ result[i] = map[string]interface{}{
|
|
|
+ "id": name,
|
|
|
+ "status": s,
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return result, nil
|
|
|
+}
|
|
|
+
|
|
|
+func getRuleState(name string) (string, error) {
|
|
|
+ if rs, ok := registry.Load(name); ok {
|
|
|
+ return doGetRuleState(rs)
|
|
|
+ } else {
|
|
|
+ return "", fmt.Errorf("Rule %s is not found", name)
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+func doGetRuleState(rs *RuleState) (string, error) {
|
|
|
result := ""
|
|
|
+ if !rs.Triggered {
|
|
|
+ result = "Stopped: canceled manually."
|
|
|
+ return result, nil
|
|
|
+ }
|
|
|
+ c := (*rs.Topology).GetContext()
|
|
|
+ if c != nil {
|
|
|
+ err := c.Err()
|
|
|
+ switch err {
|
|
|
+ case nil:
|
|
|
+ result = "Running"
|
|
|
+ case context.Canceled:
|
|
|
+ result = "Stopped: canceled by error."
|
|
|
+ case context.DeadlineExceeded:
|
|
|
+ result = "Stopped: deadline exceed."
|
|
|
+ default:
|
|
|
+ result = fmt.Sprintf("Stopped: %v.", err)
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ result = "Stopped: no context found."
|
|
|
+ }
|
|
|
+ return result, nil
|
|
|
+}
|
|
|
+
|
|
|
+func getRuleStatus(name string) (string, error) {
|
|
|
if rs, ok := registry.Load(name); ok {
|
|
|
- if !rs.Triggered {
|
|
|
- result = "Stopped: canceled manually."
|
|
|
- return result, nil
|
|
|
+ result, err := doGetRuleState(rs)
|
|
|
+ if err != nil {
|
|
|
+ return "", err
|
|
|
}
|
|
|
- c := (*rs.Topology).GetContext()
|
|
|
- if c != nil {
|
|
|
- err := c.Err()
|
|
|
- switch err {
|
|
|
- case nil:
|
|
|
- keys, values := (*rs.Topology).GetMetrics()
|
|
|
- metrics := "{"
|
|
|
- for i, key := range keys {
|
|
|
- value := values[i]
|
|
|
- switch value.(type) {
|
|
|
- case string:
|
|
|
- metrics += fmt.Sprintf("\"%s\":%q,", key, value)
|
|
|
- default:
|
|
|
- metrics += fmt.Sprintf("\"%s\":%v,", key, value)
|
|
|
- }
|
|
|
- }
|
|
|
- metrics = metrics[:len(metrics)-1] + "}"
|
|
|
- dst := &bytes.Buffer{}
|
|
|
- if err = json.Indent(dst, []byte(metrics), "", " "); err != nil {
|
|
|
- result = metrics
|
|
|
- } else {
|
|
|
- result = dst.String()
|
|
|
+ if result == "Running" {
|
|
|
+ keys, values := (*rs.Topology).GetMetrics()
|
|
|
+ metrics := "{"
|
|
|
+ for i, key := range keys {
|
|
|
+ value := values[i]
|
|
|
+ switch value.(type) {
|
|
|
+ case string:
|
|
|
+ metrics += fmt.Sprintf("\"%s\":%q,", key, value)
|
|
|
+ default:
|
|
|
+ metrics += fmt.Sprintf("\"%s\":%v,", key, value)
|
|
|
}
|
|
|
- case context.Canceled:
|
|
|
- result = "Stopped: canceled by error."
|
|
|
- case context.DeadlineExceeded:
|
|
|
- result = "Stopped: deadline exceed."
|
|
|
- default:
|
|
|
- result = fmt.Sprintf("Stopped: %v.", err)
|
|
|
}
|
|
|
- } else {
|
|
|
- result = "Stopped: no context found."
|
|
|
+ metrics = metrics[:len(metrics)-1] + "}"
|
|
|
+ dst := &bytes.Buffer{}
|
|
|
+ if err = json.Indent(dst, []byte(metrics), "", " "); err != nil {
|
|
|
+ result = metrics
|
|
|
+ } else {
|
|
|
+ result = dst.String()
|
|
|
+ }
|
|
|
}
|
|
|
return result, nil
|
|
|
} else {
|