diff --git a/collector/collector.go b/collector/collector.go index 7cfbf4dd..00f5b01f 100644 --- a/collector/collector.go +++ b/collector/collector.go @@ -610,6 +610,7 @@ func pduToSamples(indexOids []int, pdu *gosnmp.SnmpPDU, metric *config.Metric, o if metric.Scale != 0.0 { value *= metric.Scale } + value += metric.Offset sample, err := prometheus.NewConstMetric(prometheus.NewDesc(metric.Name, metric.Help, labelnames, nil), t, value, labelvalues...) diff --git a/collector/collector_test.go b/collector/collector_test.go index e00e0ea1..95703cda 100644 --- a/collector/collector_test.go +++ b/collector/collector_test.go @@ -248,6 +248,41 @@ func TestPduToSample(t *testing.T) { oidToPdu: make(map[string]gosnmp.SnmpPDU), expectedMetrics: []string{`Desc{fqName: "test_metric", help: "Help string", constLabels: {}, variableLabels: []} gauge:{value:42}`}, }, + { + pdu: &gosnmp.SnmpPDU{ + Name: "1.1.1.1.1", + Type: gosnmp.Integer, + Value: 70, + }, + indexOids: []int{}, + metric: &config.Metric{ + Name: "test_metric", + Oid: "1.1.1.1.1", + Type: "gauge", + Help: "Help string", + Offset: -1.0, + }, + oidToPdu: make(map[string]gosnmp.SnmpPDU), + expectedMetrics: []string{`Desc{fqName: "test_metric", help: "Help string", constLabels: {}, variableLabels: []} gauge:{value:69}`}, + }, + { + pdu: &gosnmp.SnmpPDU{ + Name: "1.1.1.1.1", + Type: gosnmp.Integer, + Value: 2, + }, + indexOids: []int{}, + metric: &config.Metric{ + Name: "test_metric", + Oid: "1.1.1.1.1", + Type: "gauge", + Help: "Help string", + Offset: 2.0, + Scale: -1.0, + }, + oidToPdu: make(map[string]gosnmp.SnmpPDU), + expectedMetrics: []string{`Desc{fqName: "test_metric", help: "Help string", constLabels: {}, variableLabels: []} gauge:{value:0}`}, + }, { pdu: &gosnmp.SnmpPDU{ Name: "1.1.1.1.1", diff --git a/config/config.go b/config/config.go index 2cf1beff..f1f896f1 100644 --- a/config/config.go +++ b/config/config.go @@ -191,6 +191,7 @@ type Metric struct { Lookups []*Lookup `yaml:"lookups,omitempty"` RegexpExtracts map[string][]RegexpExtract `yaml:"regex_extracts,omitempty"` EnumValues map[int]string `yaml:"enum_values,omitempty"` + Offset float64 `yaml:"offset,omitempty"` Scale float64 `yaml:"scale,omitempty"` } diff --git a/generator/FORMAT.md b/generator/FORMAT.md index 596b7f7d..8fa6e78c 100644 --- a/generator/FORMAT.md +++ b/generator/FORMAT.md @@ -62,6 +62,7 @@ modules: Temp: # A new metric will be created appending this to the metricName to become metricNameTemp. - regex: '(.*)' # Regex to extract a value from the returned SNMP walks's value. value: '$1' # Parsed as float64, defaults to $1. + offset: 0.0 # Adds the value to the sample. Applied after scale. scale: 0.125 # Scale the sample by this value, for example bits to bytes. enum_values: # Enum for this metric. Only used with the enum types. 0: true diff --git a/generator/README.md b/generator/README.md index a5ff197e..78027c72 100644 --- a/generator/README.md +++ b/generator/README.md @@ -146,6 +146,7 @@ modules: value: '1' # The first entry whose regex matches and whose value parses wins. - regex: '.*' value: '0' + offset: 1.0 # Add the value to the same. Applied after scale. scale: 1.0 # Scale the value of the sample by this value. type: DisplayString # Override the metric type, possible types are: # gauge: An integer with type gauge. diff --git a/generator/config.go b/generator/config.go index 68802cc7..1fe9f742 100644 --- a/generator/config.go +++ b/generator/config.go @@ -29,6 +29,7 @@ type Config struct { type MetricOverrides struct { Ignore bool `yaml:"ignore,omitempty"` RegexpExtracts map[string][]config.RegexpExtract `yaml:"regex_extracts,omitempty"` + Offset float64 `yaml:"offset,omitempty"` Scale float64 `yaml:"scale,omitempty"` Type string `yaml:"type,omitempty"` } diff --git a/generator/generator.yml b/generator/generator.yml index 3e2e76e9..c2f90cbf 100644 --- a/generator/generator.yml +++ b/generator/generator.yml @@ -597,6 +597,10 @@ modules: ignore: true # Lookup metric ifType: type: EnumAsInfo + # Remap enums where 1==true, 2==false to become 0==false, 1==true. + hrDiskStorageRemoveble: + scale: -1.0 + offset: 2.0 # CyberPower # diff --git a/generator/tree.go b/generator/tree.go index d3e30da4..baef60f6 100644 --- a/generator/tree.go +++ b/generator/tree.go @@ -502,6 +502,7 @@ func generateConfigModule(cfg *ModuleConfig, node *Node, nameToNode map[string]* for _, metric := range out.Metrics { if name == metric.Name || name == metric.Oid { metric.RegexpExtracts = params.RegexpExtracts + metric.Offset = params.Offset metric.Scale = params.Scale } } diff --git a/snmp.yml b/snmp.yml index af6e9418..b8e4e6cc 100644 --- a/snmp.yml +++ b/snmp.yml @@ -13225,6 +13225,8 @@ modules: enum_values: 1: "true" 2: "false" + offset: 2 + scale: -1 - name: hrDiskStorageCapacity oid: 1.3.6.1.2.1.25.3.6.1.4 type: gauge