/
container_linux.go
84 lines (70 loc) · 1.89 KB
/
container_linux.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
package collector
import (
"context"
"time"
"github.com/Faione/easyxporter"
docker "github.com/fsouza/go-dockerclient"
"github.com/prometheus/client_golang/prometheus"
"github.com/sirupsen/logrus"
)
const (
containerInfoCollectorSubsystem = "container"
timeout = 10
)
type containerInfoCollector struct {
containerTotal *prometheus.Desc
containerCount *prometheus.Desc
cli *docker.Client
}
func NewContainerInfoCollector(logger *logrus.Logger) (easyxporter.Collector, error) {
cli, err := docker.NewClientFromEnv()
if err != nil {
return nil, err
}
return &containerInfoCollector{
containerTotal: prometheus.NewDesc(
prometheus.BuildFQName(easyxporter.GetNameSpace(), containerInfoCollectorSubsystem, "total"),
"Container total count from docker",
nil, nil,
),
containerCount: prometheus.NewDesc(
prometheus.BuildFQName(easyxporter.GetNameSpace(), containerInfoCollectorSubsystem, "count"),
"Container count from docker",
[]string{"state"}, nil,
),
cli: cli,
}, nil
}
func (c *containerInfoCollector) Update(ch chan<- prometheus.Metric) error {
ctx, cancel := context.WithTimeout(context.Background(), timeout*time.Second)
defer cancel()
containers, err := c.cli.ListContainers(docker.ListContainersOptions{All: true, Context: ctx})
if err != nil {
return err
}
stateMap := make(map[string]float64)
for _, container := range containers {
if _, ok := stateMap[container.State]; !ok {
stateMap[container.State] = 1
} else {
stateMap[container.State] += 1
}
}
for state, v := range stateMap {
ch <- prometheus.MustNewConstMetric(
c.containerCount,
prometheus.GaugeValue,
v,
state,
)
}
ch <- prometheus.MustNewConstMetric(
c.containerTotal,
prometheus.GaugeValue,
float64(len(containers)),
)
return nil
}
func init() {
easyxporter.RegisterCollector(containerInfoCollectorSubsystem, true, NewContainerInfoCollector)
}