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 }