github.com/netdata/go.d.plugin@v0.58.1/modules/scaleio/charts.go (about)

     1  // SPDX-License-Identifier: GPL-3.0-or-later
     2  
     3  package scaleio
     4  
     5  import (
     6  	"fmt"
     7  
     8  	"github.com/netdata/go.d.plugin/modules/scaleio/client"
     9  
    10  	"github.com/netdata/go.d.plugin/agent/module"
    11  )
    12  
    13  type (
    14  	// Charts is an alias for module.Charts.
    15  	Charts = module.Charts
    16  	// Dims is an alias for module.Dims.
    17  	Dims = module.Dims
    18  	// Vars is an alias for module.Vars.
    19  	Vars = module.Vars
    20  )
    21  
    22  var (
    23  	prioStoragePool = module.Priority + len(systemCharts) + 10
    24  	prioSdc         = prioStoragePool + len(storagePoolCharts) + 10
    25  )
    26  
    27  var systemCharts = Charts{
    28  	// Capacity
    29  	{
    30  		ID:    "system_capacity_total",
    31  		Title: "Total Capacity",
    32  		Units: "KiB",
    33  		Fam:   "capacity",
    34  		Ctx:   "scaleio.system_capacity_total",
    35  		Dims: Dims{
    36  			{ID: "system_capacity_max_capacity", Name: "total"},
    37  		},
    38  	},
    39  	{
    40  		ID:    "system_capacity_in_use",
    41  		Title: "Capacity In Use",
    42  		Units: "KiB",
    43  		Fam:   "capacity",
    44  		Ctx:   "scaleio.system_capacity_in_use",
    45  		Dims: Dims{
    46  			{ID: "system_capacity_in_use", Name: "in_use"},
    47  		},
    48  	},
    49  	{
    50  		ID:    "system_capacity_usage",
    51  		Title: "Capacity Usage",
    52  		Units: "KiB",
    53  		Fam:   "capacity",
    54  		Type:  module.Stacked,
    55  		Ctx:   "scaleio.system_capacity_usage",
    56  		Dims: Dims{
    57  			{ID: "system_capacity_thick_in_use", Name: "thick"},
    58  			{ID: "system_capacity_decreased", Name: "decreased"},
    59  			{ID: "system_capacity_thin_in_use", Name: "thin"},
    60  			{ID: "system_capacity_snapshot", Name: "snapshot"},
    61  			{ID: "system_capacity_spare", Name: "spare"},
    62  			{ID: "system_capacity_unused", Name: "unused"},
    63  		},
    64  	},
    65  	{
    66  		ID:    "system_capacity_available_volume_allocation",
    67  		Title: "Available For Volume Allocation",
    68  		Units: "KiB",
    69  		Fam:   "capacity",
    70  		Ctx:   "scaleio.system_capacity_available_volume_allocation",
    71  		Dims: Dims{
    72  			{ID: "system_capacity_available_for_volume_allocation", Name: "available"},
    73  		},
    74  	},
    75  	{
    76  		ID:    "system_capacity_health_state",
    77  		Title: "Capacity Health State",
    78  		Units: "KiB",
    79  		Fam:   "health",
    80  		Type:  module.Stacked,
    81  		Ctx:   "scaleio.system_capacity_health_state",
    82  		Dims: Dims{
    83  			{ID: "system_capacity_protected", Name: "protected"},
    84  			{ID: "system_capacity_degraded", Name: "degraded"},
    85  			{ID: "system_capacity_in_maintenance", Name: "in_maintenance"},
    86  			{ID: "system_capacity_failed", Name: "failed"},
    87  			{ID: "system_capacity_unreachable_unused", Name: "unavailable"},
    88  		},
    89  	},
    90  	// I/O Workload BW
    91  	{
    92  		ID:    "system_workload_primary_bandwidth_total",
    93  		Title: "Primary Backend Bandwidth Total (Read and Write)",
    94  		Units: "KiB/s",
    95  		Fam:   "workload",
    96  		Ctx:   "scaleio.system_workload_primary_bandwidth_total",
    97  		Dims: Dims{
    98  			{ID: "system_backend_primary_bandwidth_read_write", Name: "total", Div: 1000},
    99  		},
   100  	},
   101  	{
   102  		ID:    "system_workload_primary_bandwidth",
   103  		Title: "Primary Backend Bandwidth",
   104  		Units: "KiB/s",
   105  		Fam:   "workload",
   106  		Ctx:   "scaleio.system_workload_primary_bandwidth",
   107  		Type:  module.Area,
   108  		Dims: Dims{
   109  			{ID: "system_backend_primary_bandwidth_read", Name: "read", Div: 1000},
   110  			{ID: "system_backend_primary_bandwidth_write", Name: "write", Mul: -1, Div: 1000},
   111  		},
   112  	},
   113  	// I/O Workload IOPS
   114  	{
   115  		ID:    "system_workload_primary_iops_total",
   116  		Title: "Primary Backend IOPS Total (Read and Write)",
   117  		Units: "iops/s",
   118  		Fam:   "workload",
   119  		Ctx:   "scaleio.system_workload_primary_iops_total",
   120  		Dims: Dims{
   121  			{ID: "system_backend_primary_iops_read_write", Name: "total", Div: 1000},
   122  		},
   123  	},
   124  	{
   125  		ID:    "system_workload_primary_iops",
   126  		Title: "Primary Backend IOPS",
   127  		Units: "iops/s",
   128  		Fam:   "workload",
   129  		Ctx:   "scaleio.system_workload_primary_iops",
   130  		Type:  module.Area,
   131  		Dims: Dims{
   132  			{ID: "system_backend_primary_iops_read", Name: "read", Div: 1000},
   133  			{ID: "system_backend_primary_iops_write", Name: "write", Mul: -1, Div: 1000},
   134  		},
   135  	},
   136  	{
   137  		ID:    "system_workload_primary_io_size_total",
   138  		Title: "Primary Backend I/O Size Total (Read and Write)",
   139  		Units: "KiB",
   140  		Fam:   "workload",
   141  		Ctx:   "scaleio.system_workload_primary_io_size_total",
   142  		Dims: Dims{
   143  			{ID: "system_backend_primary_io_size_read_write", Name: "io_size", Div: 1000},
   144  		},
   145  	},
   146  	// Rebalance
   147  	{
   148  		ID:    "system_rebalance",
   149  		Title: "Rebalance",
   150  		Units: "KiB/s",
   151  		Fam:   "rebalance",
   152  		Type:  module.Area,
   153  		Ctx:   "scaleio.system_rebalance",
   154  		Dims: Dims{
   155  			{ID: "system_rebalance_bandwidth_read", Name: "read", Div: 1000},
   156  			{ID: "system_rebalance_bandwidth_write", Name: "write", Mul: -1, Div: 1000},
   157  		},
   158  	},
   159  	{
   160  		ID:    "system_rebalance_left",
   161  		Title: "Rebalance Pending Capacity",
   162  		Units: "KiB",
   163  		Fam:   "rebalance",
   164  		Ctx:   "scaleio.system_rebalance_left",
   165  		Dims: Dims{
   166  			{ID: "system_rebalance_pending_capacity_in_Kb", Name: "left"},
   167  		},
   168  	},
   169  	{
   170  		ID:    "system_rebalance_time_until_finish",
   171  		Title: "Rebalance Approximate Time Until Finish",
   172  		Units: "seconds",
   173  		Fam:   "rebalance",
   174  		Ctx:   "scaleio.system_rebalance_time_until_finish",
   175  		Dims: Dims{
   176  			{ID: "system_rebalance_time_until_finish", Name: "time"},
   177  		},
   178  	},
   179  	// Rebuild
   180  	{
   181  		ID:    "system_rebuild",
   182  		Title: "Rebuild Bandwidth Total (Forward, Backward and Normal)",
   183  		Units: "KiB/s",
   184  		Fam:   "rebuild",
   185  		Ctx:   "scaleio.system_rebuild",
   186  		Type:  module.Area,
   187  		Dims: Dims{
   188  			{ID: "system_rebuild_total_bandwidth_read", Name: "read", Div: 1000},
   189  			{ID: "system_rebuild_total_bandwidth_write", Name: "write", Mul: -1, Div: 1000},
   190  		},
   191  	},
   192  	{
   193  		ID:    "system_rebuild_left",
   194  		Title: "Rebuild Pending Capacity Total (Forward, Backward and Normal)",
   195  		Units: "KiB",
   196  		Fam:   "rebuild",
   197  		Ctx:   "scaleio.system_rebuild_left",
   198  		Dims: Dims{
   199  			{ID: "system_rebuild_total_pending_capacity_in_Kb", Name: "left"},
   200  		},
   201  	},
   202  	// Components
   203  	{
   204  		ID:    "system_defined_components",
   205  		Title: "Components",
   206  		Units: "components",
   207  		Fam:   "components",
   208  		Ctx:   "scaleio.system_defined_components",
   209  		Dims: Dims{
   210  			{ID: "system_num_of_devices", Name: "devices"},
   211  			{ID: "system_num_of_fault_sets", Name: "fault_sets"},
   212  			{ID: "system_num_of_protection_domains", Name: "protection_domains"},
   213  			{ID: "system_num_of_rfcache_devices", Name: "rfcache_devices"},
   214  			{ID: "system_num_of_sdc", Name: "sdc"},
   215  			{ID: "system_num_of_sds", Name: "sds"},
   216  			{ID: "system_num_of_snapshots", Name: "snapshots"},
   217  			{ID: "system_num_of_storage_pools", Name: "storage_pools"},
   218  			{ID: "system_num_of_volumes", Name: "volumes"},
   219  			{ID: "system_num_of_vtrees", Name: "vtrees"},
   220  		},
   221  	},
   222  	{
   223  		ID:    "system_components_volumes_by_type",
   224  		Title: "Volumes By Type",
   225  		Units: "volumes",
   226  		Fam:   "components",
   227  		Ctx:   "scaleio.system_components_volumes_by_type",
   228  		Type:  module.Stacked,
   229  		Dims: Dims{
   230  			{ID: "system_num_of_thick_base_volumes", Name: "thick"},
   231  			{ID: "system_num_of_thin_base_volumes", Name: "thin"},
   232  		},
   233  	},
   234  	{
   235  		ID:    "system_components_volumes_by_mapping",
   236  		Title: "Volumes By Mapping",
   237  		Units: "volumes",
   238  		Fam:   "components",
   239  		Ctx:   "scaleio.system_components_volumes_by_mapping",
   240  		Type:  module.Stacked,
   241  		Dims: Dims{
   242  			{ID: "system_num_of_mapped_volumes", Name: "mapped"},
   243  			{ID: "system_num_of_unmapped_volumes", Name: "unmapped"},
   244  		},
   245  	},
   246  }
   247  
   248  var storagePoolCharts = Charts{
   249  	{
   250  		ID:    "storage_pool_%s_capacity_total",
   251  		Title: "Total Capacity",
   252  		Units: "KiB",
   253  		Fam:   "pool %s",
   254  		Ctx:   "scaleio.storage_pool_capacity_total",
   255  		Dims: Dims{
   256  			{ID: "storage_pool_%s_capacity_max_capacity", Name: "total"},
   257  		},
   258  	},
   259  	{
   260  		ID:    "storage_pool_%s_capacity_in_use",
   261  		Title: "Capacity In Use",
   262  		Units: "KiB",
   263  		Fam:   "pool %s",
   264  		Ctx:   "scaleio.storage_pool_capacity_in_use",
   265  		Dims: Dims{
   266  			{ID: "storage_pool_%s_capacity_in_use", Name: "in_use"},
   267  		},
   268  	},
   269  	{
   270  		ID:    "storage_pool_%s_capacity_usage",
   271  		Title: "Capacity Usage",
   272  		Units: "KiB",
   273  		Fam:   "pool %s",
   274  		Type:  module.Stacked,
   275  		Ctx:   "scaleio.storage_pool_capacity_usage",
   276  		Dims: Dims{
   277  			{ID: "storage_pool_%s_capacity_thick_in_use", Name: "thick"},
   278  			{ID: "storage_pool_%s_capacity_decreased", Name: "decreased"},
   279  			{ID: "storage_pool_%s_capacity_thin_in_use", Name: "thin"},
   280  			{ID: "storage_pool_%s_capacity_snapshot", Name: "snapshot"},
   281  			{ID: "storage_pool_%s_capacity_spare", Name: "spare"},
   282  			{ID: "storage_pool_%s_capacity_unused", Name: "unused"},
   283  		},
   284  	},
   285  	{
   286  		ID:    "storage_pool_%s_capacity_utilization",
   287  		Title: "Capacity Utilization",
   288  		Units: "percentage",
   289  		Fam:   "pool %s",
   290  		Ctx:   "scaleio.storage_pool_capacity_utilization",
   291  		Dims: Dims{
   292  			{ID: "storage_pool_%s_capacity_utilization", Name: "used", Div: 100},
   293  		},
   294  		Vars: Vars{
   295  			{ID: "storage_pool_%s_capacity_alert_high_threshold"},
   296  			{ID: "storage_pool_%s_capacity_alert_critical_threshold"},
   297  		},
   298  	},
   299  	{
   300  		ID:    "storage_pool_%s_capacity_available_volume_allocation",
   301  		Title: "Available For Volume Allocation",
   302  		Units: "KiB",
   303  		Fam:   "pool %s",
   304  		Ctx:   "scaleio.storage_pool_capacity_available_volume_allocation",
   305  		Dims: Dims{
   306  			{ID: "storage_pool_%s_capacity_available_for_volume_allocation", Name: "available"},
   307  		},
   308  	},
   309  	{
   310  		ID:    "storage_pool_%s_capacity_health_state",
   311  		Title: "Capacity Health State",
   312  		Units: "KiB",
   313  		Fam:   "pool %s",
   314  		Type:  module.Stacked,
   315  		Ctx:   "scaleio.storage_pool_capacity_health_state",
   316  		Dims: Dims{
   317  			{ID: "storage_pool_%s_capacity_protected", Name: "protected"},
   318  			{ID: "storage_pool_%s_capacity_degraded", Name: "degraded"},
   319  			{ID: "storage_pool_%s_capacity_in_maintenance", Name: "in_maintenance"},
   320  			{ID: "storage_pool_%s_capacity_failed", Name: "failed"},
   321  			{ID: "storage_pool_%s_capacity_unreachable_unused", Name: "unavailable"},
   322  		},
   323  	},
   324  	{
   325  		ID:    "storage_pool_%s_components",
   326  		Title: "Components",
   327  		Units: "components",
   328  		Fam:   "pool %s",
   329  		Ctx:   "scaleio.storage_pool_components",
   330  		Dims: Dims{
   331  			{ID: "storage_pool_%s_num_of_devices", Name: "devices"},
   332  			{ID: "storage_pool_%s_num_of_snapshots", Name: "snapshots"},
   333  			{ID: "storage_pool_%s_num_of_volumes", Name: "volumes"},
   334  			{ID: "storage_pool_%s_num_of_vtrees", Name: "vtrees"},
   335  		},
   336  	},
   337  }
   338  
   339  func newStoragePoolCharts(pool client.StoragePool) *Charts {
   340  	charts := storagePoolCharts.Copy()
   341  	for i, chart := range *charts {
   342  		chart.ID = fmt.Sprintf(chart.ID, pool.ID)
   343  		chart.Fam = fmt.Sprintf(chart.Fam, pool.Name)
   344  		chart.Priority = prioStoragePool + i
   345  		for _, dim := range chart.Dims {
   346  			dim.ID = fmt.Sprintf(dim.ID, pool.ID)
   347  		}
   348  		for _, v := range chart.Vars {
   349  			v.ID = fmt.Sprintf(v.ID, pool.ID)
   350  		}
   351  	}
   352  	return charts
   353  }
   354  
   355  var sdcCharts = Charts{
   356  	{
   357  		ID:    "sdc_%s_mdm_connection_state",
   358  		Title: "MDM Connection State",
   359  		Units: "boolean",
   360  		Fam:   "sdc %s",
   361  		Ctx:   "scaleio.sdc_mdm_connection_state",
   362  		Dims: Dims{
   363  			{ID: "sdc_%s_mdm_connection_state", Name: "connected"},
   364  		},
   365  	},
   366  	{
   367  		ID:    "sdc_%s_bandwidth",
   368  		Title: "Bandwidth",
   369  		Units: "KiB/s",
   370  		Fam:   "sdc %s",
   371  		Ctx:   "scaleio.sdc_bandwidth",
   372  		Type:  module.Area,
   373  		Dims: Dims{
   374  			{ID: "sdc_%s_bandwidth_read", Name: "read", Div: 1000},
   375  			{ID: "sdc_%s_bandwidth_write", Name: "write", Mul: -1, Div: 1000},
   376  		},
   377  	},
   378  	{
   379  		ID:    "sdc_%s_iops",
   380  		Title: "IOPS",
   381  		Units: "iops/s",
   382  		Fam:   "sdc %s",
   383  		Ctx:   "scaleio.sdc_iops",
   384  		Type:  module.Area,
   385  		Dims: Dims{
   386  			{ID: "sdc_%s_iops_read", Name: "read", Div: 1000},
   387  			{ID: "sdc_%s_iops_write", Name: "write", Mul: -1, Div: 1000},
   388  		},
   389  	},
   390  	{
   391  		ID:    "sdc_%s_io_size",
   392  		Title: "I/O Size",
   393  		Units: "KiB",
   394  		Fam:   "sdc %s",
   395  		Ctx:   "scaleio.sdc_io_size",
   396  		Type:  module.Area,
   397  		Dims: Dims{
   398  			{ID: "sdc_%s_io_size_read", Name: "read", Div: 1000},
   399  			{ID: "sdc_%s_io_size_write", Name: "write", Mul: -1, Div: 1000},
   400  		},
   401  	},
   402  	{
   403  		ID:    "sdc_%s_num_of_mapped_volumed",
   404  		Title: "Mapped Volumes",
   405  		Units: "volumes",
   406  		Fam:   "sdc %s",
   407  		Ctx:   "scaleio.sdc_num_of_mapped_volumed",
   408  		Dims: Dims{
   409  			{ID: "sdc_%s_num_of_mapped_volumes", Name: "mapped"},
   410  		},
   411  	},
   412  }
   413  
   414  func newSdcCharts(sdc client.Sdc) *Charts {
   415  	charts := sdcCharts.Copy()
   416  	for i, chart := range *charts {
   417  		chart.ID = fmt.Sprintf(chart.ID, sdc.ID)
   418  		chart.Fam = fmt.Sprintf(chart.Fam, sdc.SdcIp)
   419  		chart.Priority = prioSdc + i
   420  		for _, dim := range chart.Dims {
   421  			dim.ID = fmt.Sprintf(dim.ID, sdc.ID)
   422  		}
   423  	}
   424  	return charts
   425  }
   426  
   427  // TODO: remove stale charts?
   428  func (s *ScaleIO) updateCharts() {
   429  	s.updateStoragePoolCharts()
   430  	s.updateSdcCharts()
   431  }
   432  
   433  func (s *ScaleIO) updateStoragePoolCharts() {
   434  	for _, pool := range s.discovered.pool {
   435  		if s.charted[pool.ID] {
   436  			continue
   437  		}
   438  		s.charted[pool.ID] = true
   439  		s.addStoragePoolCharts(pool)
   440  	}
   441  }
   442  
   443  func (s *ScaleIO) updateSdcCharts() {
   444  	for _, sdc := range s.discovered.sdc {
   445  		if s.charted[sdc.ID] {
   446  			continue
   447  		}
   448  		s.charted[sdc.ID] = true
   449  		s.addSdcCharts(sdc)
   450  	}
   451  }
   452  
   453  func (s *ScaleIO) addStoragePoolCharts(pool client.StoragePool) {
   454  	charts := newStoragePoolCharts(pool)
   455  	if err := s.Charts().Add(*charts...); err != nil {
   456  		s.Warningf("couldn't add charts for storage pool '%s(%s)': %v", pool.ID, pool.Name, err)
   457  	}
   458  }
   459  
   460  func (s *ScaleIO) addSdcCharts(sdc client.Sdc) {
   461  	charts := newSdcCharts(sdc)
   462  	if err := s.Charts().Add(*charts...); err != nil {
   463  		s.Warningf("couldn't add charts for sdc '%s(%s)': %v", sdc.ID, sdc.SdcIp, err)
   464  	}
   465  }