forked from projecteru2/agent
-
Notifications
You must be signed in to change notification settings - Fork 0
/
monitor.go
69 lines (56 loc) · 2.08 KB
/
monitor.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
package engine
import (
"context"
"time"
log "github.com/Sirupsen/logrus"
types "github.com/docker/docker/api/types"
eventtypes "github.com/docker/docker/api/types/events"
"github.com/projecteru2/agent/common"
"github.com/projecteru2/agent/engine/status"
)
var eventHandler = status.NewEventHandler()
func (e *Engine) initMonitor() (<-chan eventtypes.Message, <-chan error) {
eventHandler.Handle(common.STATUS_START, e.handleContainerStart)
eventHandler.Handle(common.STATUS_DIE, e.handleContainerDie)
ctx := context.Background()
f := getFilter(map[string]string{"type": eventtypes.ContainerEventType})
options := types.EventsOptions{Filters: f}
eventChan, errChan := e.docker.Events(ctx, options)
return eventChan, errChan
}
func (e *Engine) monitor(eventChan <-chan eventtypes.Message) {
log.Info("[monitor] Status watch start")
eventHandler.Watch(eventChan)
}
func (e *Engine) handleContainerStart(event eventtypes.Message) {
log.Debugf("[handleContainerStart] container %s start", event.ID[:common.SHORTID])
container, err := e.detectContainer(event.ID, event.Actor.Attributes)
if err != nil {
log.Errorf("[handleContainerStart] detect container failed %v", err)
return
}
if container.Running {
// 这货会自动退出
e.attach(container)
}
// 发现需要 health check 立刻执行
if container.Healthy {
if err := e.store.DeployContainer(container, e.node); err != nil {
log.Errorf("[handleContainerStart] update deploy status failed %v", err)
}
} else {
go e.checkOneContainer(container, time.Duration(e.config.HealthCheckTimeout)*time.Second)
}
}
func (e *Engine) handleContainerDie(event eventtypes.Message) {
log.Debugf("[handleContainerDie] container %s die", event.ID[:common.SHORTID])
container, err := e.detectContainer(event.ID, event.Actor.Attributes)
if err != nil {
log.Errorf("[handleContainerDie] detect container failed %v", err)
}
if err := e.store.DeployContainer(container, e.node); err != nil {
log.Errorf("[handleContainerDie] update deploy status failed %v", err)
}
e.checker.Del(event.ID)
}
//Destroy by core, data removed by core