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

     1  // SPDX-License-Identifier: GPL-3.0-or-later
     2  
     3  package snmp
     4  
     5  import (
     6  	"fmt"
     7  	"strings"
     8  
     9  	"github.com/netdata/go.d.plugin/agent/module"
    10  )
    11  
    12  func newCharts(configs []ChartConfig) (*module.Charts, error) {
    13  	charts := &module.Charts{}
    14  	for _, cfg := range configs {
    15  		if len(cfg.IndexRange) == 2 {
    16  			cs, err := newChartsFromIndexRange(cfg)
    17  			if err != nil {
    18  				return nil, err
    19  			}
    20  			if err := charts.Add(*cs...); err != nil {
    21  				return nil, err
    22  			}
    23  		} else {
    24  			chart, err := newChart(cfg)
    25  			if err != nil {
    26  				return nil, err
    27  			}
    28  			if err = charts.Add(chart); err != nil {
    29  				return nil, err
    30  			}
    31  		}
    32  	}
    33  	return charts, nil
    34  }
    35  
    36  func newChartsFromIndexRange(cfg ChartConfig) (*module.Charts, error) {
    37  	var addPrio int
    38  	charts := &module.Charts{}
    39  	for i := cfg.IndexRange[0]; i <= cfg.IndexRange[1]; i++ {
    40  		chart, err := newChartWithOIDIndex(i, cfg)
    41  		if err != nil {
    42  			return nil, err
    43  		}
    44  		chart.Priority += addPrio
    45  		addPrio += 1
    46  		if err = charts.Add(chart); err != nil {
    47  			return nil, err
    48  		}
    49  	}
    50  	return charts, nil
    51  }
    52  
    53  func newChartWithOIDIndex(oidIndex int, cfg ChartConfig) (*module.Chart, error) {
    54  	chart, err := newChart(cfg)
    55  	if err != nil {
    56  		return nil, err
    57  	}
    58  
    59  	chart.ID = fmt.Sprintf("%s_%d", chart.ID, oidIndex)
    60  	chart.Title = fmt.Sprintf("%s %d", chart.Title, oidIndex)
    61  	for _, dim := range chart.Dims {
    62  		dim.ID = fmt.Sprintf("%s.%d", dim.ID, oidIndex)
    63  	}
    64  
    65  	return chart, nil
    66  }
    67  
    68  func newChart(cfg ChartConfig) (*module.Chart, error) {
    69  	chart := &module.Chart{
    70  		ID:       cfg.ID,
    71  		Title:    cfg.Title,
    72  		Units:    cfg.Units,
    73  		Fam:      cfg.Family,
    74  		Ctx:      fmt.Sprintf("snmp.%s", cfg.ID),
    75  		Type:     module.ChartType(cfg.Type),
    76  		Priority: cfg.Priority,
    77  	}
    78  
    79  	if chart.Title == "" {
    80  		chart.Title = "Untitled chart"
    81  	}
    82  	if chart.Units == "" {
    83  		chart.Units = "num"
    84  	}
    85  	if chart.Priority < module.Priority {
    86  		chart.Priority += module.Priority
    87  	}
    88  
    89  	seen := make(map[string]struct{})
    90  	var a string
    91  	for _, cfg := range cfg.Dimensions {
    92  		if cfg.Algorithm != "" {
    93  			seen[cfg.Algorithm] = struct{}{}
    94  			a = cfg.Algorithm
    95  		}
    96  		dim := &module.Dim{
    97  			ID:   strings.TrimPrefix(cfg.OID, "."),
    98  			Name: cfg.Name,
    99  			Algo: module.DimAlgo(cfg.Algorithm),
   100  			Mul:  cfg.Multiplier,
   101  			Div:  cfg.Divisor,
   102  		}
   103  		if err := chart.AddDim(dim); err != nil {
   104  			return nil, err
   105  		}
   106  	}
   107  	if len(seen) == 1 && a != "" && len(chart.Dims) > 1 {
   108  		for _, d := range chart.Dims {
   109  			if d.Algo == "" {
   110  				d.Algo = module.DimAlgo(a)
   111  			}
   112  		}
   113  	}
   114  
   115  	return chart, nil
   116  }