forked from experimental-platform/platform-monitoring
/
monitoring.go
91 lines (77 loc) · 2.01 KB
/
monitoring.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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
package main
import (
"bitbucket.org/bertimus9/systemstat"
"flag"
"fmt"
"github.com/codegangsta/martini-contrib/render"
"github.com/fsouza/go-dockerclient"
"github.com/go-martini/martini"
"net/http"
"strconv"
"time"
)
type MonitorSample struct {
Name string `json:"name"`
CpuPct float64 `json:"cpu_percent,omitempty"`
MemUsed uint64 `json:"mem_used"`
MemTotal uint64 `json:"mem_total"`
}
func getSystemMonitorSample() MonitorSample {
cpuSample := systemstat.GetCPUSample()
idle := float64(cpuSample.Idle)
total := float64(cpuSample.Total)
memSample := systemstat.GetMemSample()
var stat MonitorSample
stat.Name = "system"
stat.CpuPct = (total - idle) * 100.0 / total
stat.MemTotal = memSample.MemTotal
stat.MemUsed = memSample.MemUsed
return stat
}
func getContainerMonitorSample(name string) (MonitorSample, error) {
var stat MonitorSample
dockerStats := make(chan *docker.Stats)
errC := make(chan error, 1)
stopOperation := make(chan bool)
go func() {
errC <- client.Stats(docker.StatsOptions{name, dockerStats, false, stopOperation, time.Minute})
close(errC)
}()
statsResult, ok := <-dockerStats
if !ok {
return stat, <-errC
}
stat.Name = name
stat.MemTotal = statsResult.MemoryStats.Limit
stat.MemUsed = statsResult.MemoryStats.Usage
return stat, nil
}
var client *docker.Client
func main() {
var port int
flag.IntVar(&port, "port", 3001, "server port")
flag.Parse()
fmt.Println("Port: ", port)
endpoint := "unix:///var/run/docker.sock"
var err error
client, err = docker.NewClient(endpoint)
if err != nil {
panic(err)
}
m := martini.Classic()
m.Use(render.Renderer())
m.Get("/", func(r render.Render) {
r.JSON(http.StatusOK, getSystemMonitorSample())
})
m.Get("/:name", func(args martini.Params, r render.Render) {
name := args["name"]
sample, err := getContainerMonitorSample(name)
if err == nil {
r.JSON(http.StatusOK, sample)
} else {
r.JSON(http.StatusBadRequest, err)
}
})
http.Handle("/", m)
http.ListenAndServe(":"+strconv.Itoa(port), nil)
}