github.com/netdata/go.d.plugin@v0.58.1/modules/docker/charts.go (about) 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/go.d.plugin/agent/module" 10 ) 11 12 const ( 13 prioContainersState = module.Priority + iota 14 prioContainersHealthy 15 16 prioContainerState 17 prioContainerHealthStatus 18 prioContainerWritableLayerSize 19 20 prioImagesCount 21 prioImagesSize 22 ) 23 24 var summaryCharts = module.Charts{ 25 containersStateChart.Copy(), 26 containersHealthyChart.Copy(), 27 28 imagesCountChart.Copy(), 29 imagesSizeChart.Copy(), 30 } 31 32 var ( 33 containersStateChart = module.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: module.Stacked, 41 Dims: module.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 = module.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: module.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 = module.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: module.Stacked, 73 Dims: module.Dims{ 74 {ID: "images_active", Name: "active"}, 75 {ID: "images_dangling", Name: "dangling"}, 76 }, 77 } 78 imagesSizeChart = module.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: module.Dims{ 86 {ID: "images_size", Name: "size"}, 87 }, 88 } 89 ) 90 91 var ( 92 containerChartsTmpl = module.Charts{ 93 containerStateChartTmpl.Copy(), 94 containerHealthStatusChartTmpl.Copy(), 95 containerWritableLayerSizeChartTmpl.Copy(), 96 } 97 98 containerStateChartTmpl = module.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: module.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 = module.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: module.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 = module.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: module.Dims{ 138 {ID: "container_%s_size_rw", Name: "writable_layer"}, 139 }, 140 } 141 ) 142 143 func (d *Docker) addContainerCharts(name, image string) { 144 charts := containerChartsTmpl.Copy() 145 if !d.CollectContainerSize { 146 _ = charts.Remove(containerWritableLayerSizeChartTmpl.ID) 147 } 148 149 for _, chart := range *charts { 150 chart.ID = fmt.Sprintf(chart.ID, name) 151 chart.Labels = []module.Label{ 152 {Key: "container_name", Value: name}, 153 {Key: "image", Value: image}, 154 } 155 for _, dim := range chart.Dims { 156 dim.ID = fmt.Sprintf(dim.ID, name) 157 } 158 } 159 160 if err := d.Charts().Add(*charts...); err != nil { 161 d.Warning(err) 162 } 163 } 164 165 func (d *Docker) removeContainerCharts(name string) { 166 px := fmt.Sprintf("container_%s", name) 167 168 for _, chart := range *d.Charts() { 169 if strings.HasPrefix(chart.ID, px) { 170 chart.MarkRemove() 171 chart.MarkNotCreated() 172 } 173 } 174 }