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  }