Skip to content

Commit dfac1d4

Browse files
committed
Add container disk io bytes
1 parent e4147ff commit dfac1d4

File tree

1 file changed

+39
-17
lines changed

1 file changed

+39
-17
lines changed

main.go

+39-17
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,11 @@ const (
2121
)
2222

2323
var (
24-
knownContainerIDs map[string]prometheus.Labels
25-
knownContainerNetworks map[string]prometheus.Labels
26-
knownContainerInfos map[string]prometheus.Labels
27-
knownDataNames map[string]prometheus.Labels
24+
knownContainerIDs map[string]prometheus.Labels
25+
knownContainerNetworks map[string]prometheus.Labels
26+
knownContainerDiskStats map[string]prometheus.Labels
27+
knownContainerInfos map[string]prometheus.Labels
28+
knownDataNames map[string]prometheus.Labels
2829

2930
pids *prometheus.GaugeVec
3031
cpuUsageUser *prometheus.GaugeVec
@@ -42,18 +43,15 @@ var (
4243
networkReceiveDropped *prometheus.GaugeVec
4344
networkTransmitDropped *prometheus.GaugeVec
4445

45-
containerInfo *prometheus.GaugeVec
46+
diskIOBytes *prometheus.GaugeVec
4647

47-
dataFree *prometheus.GaugeVec
48-
dataAvailable *prometheus.GaugeVec
49-
dataSize *prometheus.GaugeVec
50-
dataInodesFree *prometheus.GaugeVec
51-
dataInodes *prometheus.GaugeVec
48+
containerInfo *prometheus.GaugeVec
5249
)
5350

5451
func setup() {
5552
containerLabels := []string{"container_name", "compose_project", "compose_service"}
5653
containerNetworkLabels := append(containerLabels, "interface")
54+
containerDiskLabels := append(containerLabels, "op")
5755
containerInfoLabels := []string{
5856
"container_id",
5957
"container_name",
@@ -131,6 +129,11 @@ func setup() {
131129
Help: "Container network transmit drops",
132130
}, containerNetworkLabels)
133131

132+
diskIOBytes = prometheus.NewGaugeVec(prometheus.GaugeOpts{
133+
Name: containerPrefix + "disk_io_bytes",
134+
Help: "Container disk IO bytes",
135+
}, containerDiskLabels)
136+
134137
containerInfo = prometheus.NewGaugeVec(prometheus.GaugeOpts{
135138
Name: containerPrefix + "info",
136139
Help: "Container info",
@@ -152,12 +155,15 @@ func setup() {
152155
prometheus.MustRegister(networkReceiveDropped)
153156
prometheus.MustRegister(networkTransmitDropped)
154157

158+
prometheus.MustRegister(diskIOBytes)
159+
155160
prometheus.MustRegister(containerInfo)
156161
}
157162

158163
func updateContainers(docker *client.Client) {
159164
newKnownContainerIDs := make(map[string]prometheus.Labels)
160165
newKnownContainerNetworks := make(map[string]prometheus.Labels)
166+
newKnownContainerDiskStats := make(map[string]prometheus.Labels)
161167
newKnownContainerInfos := make(map[string]prometheus.Labels)
162168
containers, err := docker.ContainerList(context.Background(), types.ContainerListOptions{})
163169
if err != nil {
@@ -219,6 +225,19 @@ func updateContainers(docker *client.Client) {
219225
networkTransmitDropped.With(labels).Set(float64(net.TxDropped))
220226
}
221227

228+
// Disk IO
229+
for _, stat := range stats.BlkioStats.IoServiceBytesRecursive {
230+
labels := prometheus.Labels{
231+
"container_name": strings.TrimPrefix(container.Names[0], "/"),
232+
"compose_project": container.Labels["com.docker.compose.project"],
233+
"compose_service": container.Labels["com.docker.compose.service"],
234+
"op": stat.Op,
235+
}
236+
newKnownContainerDiskStats[container.ID+"bytes"+stat.Op] = labels
237+
238+
diskIOBytes.With(labels).Set(float64(stat.Value))
239+
}
240+
222241
// Container info
223242
{
224243
labels := prometheus.Labels{
@@ -264,6 +283,11 @@ func updateContainers(docker *client.Client) {
264283
networkTransmitDropped.Delete(labels)
265284
}
266285
}
286+
for id, labels := range knownContainerDiskStats {
287+
if newKnownContainerDiskStats[id] == nil {
288+
diskIOBytes.Delete(labels)
289+
}
290+
}
267291
for id, labels := range knownContainerInfos {
268292
if newKnownContainerInfos[id] == nil {
269293
containerInfo.Delete(labels)
@@ -274,20 +298,18 @@ func updateContainers(docker *client.Client) {
274298
knownContainerInfos = newKnownContainerInfos
275299
}
276300

277-
func updateMetrics(docker *client.Client) {
278-
for {
279-
updateContainers(docker)
280-
}
281-
}
282-
283301
func main() {
284302
docker, err := client.NewClientWithOpts(client.FromEnv)
285303
if err != nil {
286304
panic(err)
287305
}
288306

289307
setup()
290-
go updateMetrics(docker)
308+
go func() {
309+
for {
310+
updateContainers(docker)
311+
}
312+
}()
291313

292314
http.Handle("/metrics", promhttp.Handler())
293315
http.ListenAndServe(":8080", nil)

0 commit comments

Comments
 (0)