master
go 175 lines 4.94 KB
Raw
1 // SPDX-License-Identifier: GPL-3.0-or-later
2
3 package docker
4
5 import (
6 "fmt"
7 "strings"
8
9 "github.com/netdata/netdata/go/plugins/plugin/framework/collectorapi"
10 )
11
12 const (
13 prioContainersState = collectorapi.Priority + iota
14 prioContainersHealthy
15
16 prioContainerState
17 prioContainerHealthStatus
18 prioContainerWritableLayerSize
19
20 prioImagesCount
21 prioImagesSize
22 )
23
24 var summaryCharts = collectorapi.Charts{
25 containersStateChart.Copy(),
26 containersHealthyChart.Copy(),
27
28 imagesCountChart.Copy(),
29 imagesSizeChart.Copy(),
30 }
31
32 var (
33 containersStateChart = collectorapi.Chart{
34 ID: "containers_state",
35 Title: "Total number of Docker containers in various states",
36 Units: "containers",
37 Fam: "containers",
38 Ctx: "docker.containers_state",
39 Priority: prioContainersState,
40 Type: collectorapi.Stacked,
41 Dims: collectorapi.Dims{
42 {ID: "containers_state_running", Name: "running"},
43 {ID: "containers_state_paused", Name: "paused"},
44 {ID: "containers_state_exited", Name: "exited"},
45 },
46 }
47 containersHealthyChart = collectorapi.Chart{
48 ID: "healthy_containers",
49 Title: "Total number of Docker containers in various health states",
50 Units: "containers",
51 Fam: "containers",
52 Ctx: "docker.containers_health_status",
53 Priority: prioContainersHealthy,
54 Dims: collectorapi.Dims{
55 {ID: "containers_health_status_healthy", Name: "healthy"},
56 {ID: "containers_health_status_unhealthy", Name: "unhealthy"},
57 {ID: "containers_health_status_not_running_unhealthy", Name: "not_running_unhealthy"},
58 {ID: "containers_health_status_starting", Name: "starting"},
59 {ID: "containers_health_status_none", Name: "no_healthcheck"},
60 },
61 }
62 )
63
64 var (
65 imagesCountChart = collectorapi.Chart{
66 ID: "images_count",
67 Title: "Total number of Docker images in various states",
68 Units: "images",
69 Fam: "images",
70 Ctx: "docker.images",
71 Priority: prioImagesCount,
72 Type: collectorapi.Stacked,
73 Dims: collectorapi.Dims{
74 {ID: "images_active", Name: "active"},
75 {ID: "images_dangling", Name: "dangling"},
76 },
77 }
78 imagesSizeChart = collectorapi.Chart{
79 ID: "images_size",
80 Title: "Total size of all Docker images",
81 Units: "bytes",
82 Fam: "images",
83 Ctx: "docker.images_size",
84 Priority: prioImagesSize,
85 Dims: collectorapi.Dims{
86 {ID: "images_size", Name: "size"},
87 },
88 }
89 )
90
91 var (
92 containerChartsTmpl = collectorapi.Charts{
93 containerStateChartTmpl.Copy(),
94 containerHealthStatusChartTmpl.Copy(),
95 containerWritableLayerSizeChartTmpl.Copy(),
96 }
97
98 containerStateChartTmpl = collectorapi.Chart{
99 ID: "container_%s_state",
100 Title: "Docker container state",
101 Units: "state",
102 Fam: "containers",
103 Ctx: "docker.container_state",
104 Priority: prioContainerState,
105 Dims: collectorapi.Dims{
106 {ID: "container_%s_state_running", Name: "running"},
107 {ID: "container_%s_state_paused", Name: "paused"},
108 {ID: "container_%s_state_exited", Name: "exited"},
109 {ID: "container_%s_state_created", Name: "created"},
110 {ID: "container_%s_state_restarting", Name: "restarting"},
111 {ID: "container_%s_state_removing", Name: "removing"},
112 {ID: "container_%s_state_dead", Name: "dead"},
113 },
114 }
115 containerHealthStatusChartTmpl = collectorapi.Chart{
116 ID: "container_%s_health_status",
117 Title: "Docker container health status",
118 Units: "status",
119 Fam: "containers",
120 Ctx: "docker.container_health_status",
121 Priority: prioContainerHealthStatus,
122 Dims: collectorapi.Dims{
123 {ID: "container_%s_health_status_healthy", Name: "healthy"},
124 {ID: "container_%s_health_status_unhealthy", Name: "unhealthy"},
125 {ID: "container_%s_health_status_not_running_unhealthy", Name: "not_running_unhealthy"},
126 {ID: "container_%s_health_status_starting", Name: "starting"},
127 {ID: "container_%s_health_status_none", Name: "no_healthcheck"},
128 },
129 }
130 containerWritableLayerSizeChartTmpl = collectorapi.Chart{
131 ID: "container_%s_writable_layer_size",
132 Title: "Docker container writable layer size",
133 Units: "bytes",
134 Fam: "containers",
135 Ctx: "docker.container_writeable_layer_size",
136 Priority: prioContainerWritableLayerSize,
137 Dims: collectorapi.Dims{
138 {ID: "container_%s_size_rw", Name: "writable_layer"},
139 },
140 }
141 )
142
143 func (c *Collector) addContainerCharts(name, image string) {
144 charts := containerChartsTmpl.Copy()
145
146 if !c.CollectContainerSize {
147 _ = charts.Remove(containerWritableLayerSizeChartTmpl.ID)
148 }
149
150 for _, chart := range *charts {
151 chart.ID = fmt.Sprintf(chart.ID, name)
152 chart.Labels = []collectorapi.Label{
153 {Key: "container_name", Value: name},
154 {Key: "image", Value: image},
155 }
156 for _, dim := range chart.Dims {
157 dim.ID = fmt.Sprintf(dim.ID, name)
158 }
159 }
160
161 if err := c.Charts().Add(*charts...); err != nil {
162 c.Warning(err)
163 }
164 }
165
166 func (c *Collector) removeContainerCharts(name string) {
167 px := fmt.Sprintf("container_%s", name)
168
169 for _, chart := range *c.Charts() {
170 if strings.HasPrefix(chart.ID, px) {
171 chart.MarkRemove()
172 chart.MarkNotCreated()
173 }
174 }
175 }