Skip to content

Commit 7d15b04

Browse files
author
Thibault Richard
committed
Use 'State' as status
1 parent 71bcd07 commit 7d15b04

File tree

3 files changed

+52
-9
lines changed

3 files changed

+52
-9
lines changed

api.go

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,16 @@ func HandleEvent(c *gin.Context) {
2828
return
2929
}
3030

31+
status, err := extractStatus(data)
32+
if err != nil {
33+
logrus.WithError(err).WithField("body", data).Error("Fail to extract status while handling state event")
34+
c.JSON(400, gin.H{"message": err.Error()})
35+
return
36+
}
37+
3138
event := types.Event{
3239
ID: ID,
33-
Status: types.StatusOK,
40+
Status: status,
3441
Timestamp: time.Now(),
3542
Value: data,
3643
}
@@ -45,17 +52,32 @@ func HandleEvent(c *gin.Context) {
4552

4653
func extractHostAndService(obj map[string]interface{}) (string, error) {
4754
host := obj["Host"]
55+
if host == nil {
56+
host = obj["Node"]
57+
}
4858
if host == nil {
4959
return "", errors.New("Property 'Host' not found")
5060
}
5161
service := obj["Service"]
5262
if service == nil {
53-
return "", errors.New("Property 'Host' not found")
63+
return "", errors.New("Property 'Service' not found")
5464
}
5565

5666
return service.(string) + "/" + host.(string), nil
5767
}
5868

69+
func extractStatus(obj map[string]interface{}) (string, error) {
70+
status := obj["Status"]
71+
if status == nil {
72+
status = obj["State"]
73+
}
74+
if status == nil {
75+
return "", errors.New("Property 'Status' not found")
76+
}
77+
78+
return status.(string), nil
79+
}
80+
5981
// Health return all events with status 500 if at least one event is in error
6082
func Health(c *gin.Context) {
6183
mutex.RLock()

types/events.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,10 @@ func (e Event) GetService() string {
2525
return e.Value["Service"].(string)
2626
}
2727

28+
func (e Event) GetStatus() string {
29+
return e.Value["Status"].(string)
30+
}
31+
2832
func (e Event) ToBytes() ([]byte, error) {
2933
bytes, err := json.Marshal(e)
3034
if err != nil {

watcher.go

Lines changed: 24 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,38 +7,55 @@ import (
77
"github.com/thbkrkr/toctoc/types"
88
)
99

10+
var (
11+
healthTimeoutDuration = time.Second * time.Duration(healthTimeout)
12+
)
13+
1014
func Watch() {
1115
tick := time.NewTicker(time.Second * time.Duration(watchTick))
1216
for range tick.C {
17+
mutex.Lock()
1318
for ns := range events {
1419
for _, event := range events[ns] {
15-
if time.Since(event.Timestamp) > time.Second*time.Duration(healthTimeout) {
20+
if isKO(event) {
1621
alert(ns, event)
1722
}
1823
}
1924
}
25+
mutex.Unlock()
2026
}
2127
}
2228

23-
func alert(ns string, event types.Event) {
24-
mutex.Lock()
25-
defer mutex.Unlock()
29+
func isKO(event types.Event) bool {
30+
if event.Status == types.StatusKO {
31+
return true
32+
}
33+
if time.Since(event.Timestamp).Seconds() > float64(healthTimeout) {
34+
return true
35+
}
36+
return false
37+
}
2638

39+
func alert(ns string, event types.Event) {
2740
event.Status = types.StatusKO
2841
events[ns][event.ID] = event
2942

3043
log.WithField("ns", ns).WithField("ID", event.ID).Errorf("No event since %d seconds", healthTimeout)
3144

3245
if kafkaAlerter {
33-
sendAlertToKafka(event)
46+
go sendAlertToKafka(event)
3447
}
3548
}
3649

3750
func sendAlertToKafka(event types.Event) {
38-
bytes, err := event.ToBytes()
51+
msg, err := event.ToBytes()
3952
if err != nil {
4053
log.WithField("Event", event).Errorf("Fail to marshal alert event")
4154
return
4255
}
43-
go q.Send(bytes)
56+
_, _, err = q.Send(msg)
57+
if err != nil {
58+
log.WithField("Event", event).Errorf("Fail to send event to kafka")
59+
return
60+
}
4461
}

0 commit comments

Comments
 (0)