refactor: make internals easier to test and add unit tests #2
4 changed files with 107 additions and 101 deletions
25
pkg/perfdata/internals.go
Normal file
25
pkg/perfdata/internals.go
Normal file
|
@ -0,0 +1,25 @@
|
|||
package perfdata // import nocternity.net/gomonop/pkg/perfdata
|
||||
|
||||
import (
|
||||
"regexp"
|
||||
)
|
||||
|
||||
// Flags indicating which elements of performance data have been set.
|
||||
type perfDataBits int
|
||||
|
||||
const (
|
||||
PDatWarn perfDataBits = 1 << iota
|
||||
PDatCrit
|
||||
PDatMin
|
||||
PDatMax
|
||||
)
|
||||
|
||||
// Regexps used to check values and ranges in performance data records.
|
||||
var (
|
||||
// Common value check regexp.
|
||||
vcRegexp = `^-?(0(\.\d*)?|[1-9]\d*(\.\d*)?|\.\d+)$`
|
||||
// Compiled value check regexp.
|
||||
valueCheck = regexp.MustCompile(vcRegexp)
|
||||
// Compiled range min value check.
|
||||
rangeMinCheck = regexp.MustCompile(vcRegexp + `|^~$`)
|
||||
)
|
|
@ -4,110 +4,9 @@ package perfdata // import nocternity.net/gomonop/pkg/perfdata
|
|||
|
||||
import (
|
||||
"fmt"
|
||||
"regexp"
|
||||
"strings"
|
||||
)
|
||||
|
||||
// Units of measurement, which may be used to qualify the performance data.
|
||||
type UnitOfMeasurement int
|
||||
|
||||
const (
|
||||
UomNone UnitOfMeasurement = iota
|
||||
UomSeconds
|
||||
UomPercent
|
||||
UomBytes
|
||||
UomKilobytes
|
||||
UomMegabytes
|
||||
UomGigabytes
|
||||
UomTerabytes
|
||||
UomCounter
|
||||
)
|
||||
|
||||
func (u UnitOfMeasurement) String() string {
|
||||
return [...]string{"", "s", "%", "B", "KB", "MB", "GB", "TB", "c"}[u]
|
||||
}
|
||||
|
||||
// Flags indicating which elements of performance data have been set.
|
||||
type perfDataBits int
|
||||
|
||||
const (
|
||||
PDatWarn perfDataBits = 1 << iota
|
||||
PDatCrit
|
||||
PDatMin
|
||||
PDatMax
|
||||
)
|
||||
|
||||
// Regexps used to check values and ranges in performance data records.
|
||||
var (
|
||||
// Common value check regexp.
|
||||
vcRegexp = `^-?(0(\.\d*)?|[1-9]\d*(\.\d*)?|\.\d+)$`
|
||||
// Compiled value check regexp.
|
||||
valueCheck = regexp.MustCompile(vcRegexp)
|
||||
// Compiled range min value check.
|
||||
rangeMinCheck = regexp.MustCompile(vcRegexp + `|^~$`)
|
||||
)
|
||||
|
||||
// Performance data range.
|
||||
type PDRange struct {
|
||||
start string
|
||||
end string
|
||||
inside bool
|
||||
}
|
||||
|
||||
// Creates a performance data range from -inf to 0 and from the specified
|
||||
// value to +inf.
|
||||
func PDRMax(max string) *PDRange {
|
||||
if !valueCheck.MatchString(max) {
|
||||
panic("invalid performance data range maximum value")
|
||||
}
|
||||
pdRange := &PDRange{}
|
||||
pdRange.start = "0"
|
||||
pdRange.end = max
|
||||
return pdRange
|
||||
}
|
||||
|
||||
// Creates a performance data range from -inf to the specified minimal value
|
||||
// and from the specified maximal value to +inf.
|
||||
func PDRMinMax(min, max string) *PDRange {
|
||||
if !valueCheck.MatchString(max) {
|
||||
panic("invalid performance data range maximum value")
|
||||
}
|
||||
if !rangeMinCheck.MatchString(min) {
|
||||
panic("invalid performance data range minimum value")
|
||||
}
|
||||
pdRange := &PDRange{}
|
||||
pdRange.start = min
|
||||
pdRange.end = max
|
||||
return pdRange
|
||||
}
|
||||
|
||||
// Inverts the range.
|
||||
func (r *PDRange) Inside() *PDRange {
|
||||
r.inside = true
|
||||
return r
|
||||
}
|
||||
|
||||
// Generates the range's string representation so it can be sent to the
|
||||
// monitoring system.
|
||||
func (r *PDRange) String() string {
|
||||
var start, inside string
|
||||
|
||||
switch r.start {
|
||||
case "":
|
||||
start = "~"
|
||||
case "0":
|
||||
start = ""
|
||||
default:
|
||||
start = r.start
|
||||
}
|
||||
|
||||
if r.inside {
|
||||
inside = "@"
|
||||
}
|
||||
|
||||
return inside + start + ":" + r.end
|
||||
}
|
||||
|
||||
// Performance data, including a label, units, a value, warning/critical
|
||||
// ranges and min/max boundaries.
|
||||
type PerfData struct {
|
||||
|
|
62
pkg/perfdata/range.go
Normal file
62
pkg/perfdata/range.go
Normal file
|
@ -0,0 +1,62 @@
|
|||
package perfdata // import nocternity.net/gomonop/pkg/perfdata
|
||||
|
||||
// Performance data range.
|
||||
type PDRange struct {
|
||||
start string
|
||||
end string
|
||||
inside bool
|
||||
}
|
||||
|
||||
// Creates a performance data range from -inf to 0 and from the specified
|
||||
// value to +inf.
|
||||
func PDRMax(max string) *PDRange {
|
||||
if !valueCheck.MatchString(max) {
|
||||
panic("invalid performance data range maximum value")
|
||||
}
|
||||
pdRange := &PDRange{}
|
||||
pdRange.start = "0"
|
||||
pdRange.end = max
|
||||
return pdRange
|
||||
}
|
||||
|
||||
// Creates a performance data range from -inf to the specified minimal value
|
||||
// and from the specified maximal value to +inf.
|
||||
func PDRMinMax(min, max string) *PDRange {
|
||||
if !valueCheck.MatchString(max) {
|
||||
panic("invalid performance data range maximum value")
|
||||
}
|
||||
if !rangeMinCheck.MatchString(min) {
|
||||
panic("invalid performance data range minimum value")
|
||||
}
|
||||
pdRange := &PDRange{}
|
||||
pdRange.start = min
|
||||
pdRange.end = max
|
||||
return pdRange
|
||||
}
|
||||
|
||||
// Inverts the range.
|
||||
func (r *PDRange) Inside() *PDRange {
|
||||
r.inside = true
|
||||
return r
|
||||
}
|
||||
|
||||
// Generates the range's string representation so it can be sent to the
|
||||
// monitoring system.
|
||||
func (r *PDRange) String() string {
|
||||
var start, inside string
|
||||
|
||||
switch r.start {
|
||||
case "":
|
||||
start = "~"
|
||||
case "0":
|
||||
start = ""
|
||||
default:
|
||||
start = r.start
|
||||
}
|
||||
|
||||
if r.inside {
|
||||
inside = "@"
|
||||
}
|
||||
|
||||
return inside + start + ":" + r.end
|
||||
}
|
20
pkg/perfdata/units.go
Normal file
20
pkg/perfdata/units.go
Normal file
|
@ -0,0 +1,20 @@
|
|||
package perfdata // import nocternity.net/gomonop/pkg/perfdata
|
||||
|
||||
// Units of measurement, which may be used to qualify the performance data.
|
||||
type UnitOfMeasurement int
|
||||
|
||||
const (
|
||||
UomNone UnitOfMeasurement = iota
|
||||
UomSeconds
|
||||
UomPercent
|
||||
UomBytes
|
||||
UomKilobytes
|
||||
UomMegabytes
|
||||
UomGigabytes
|
||||
UomTerabytes
|
||||
UomCounter
|
||||
)
|
||||
|
||||
func (u UnitOfMeasurement) String() string {
|
||||
return [...]string{"", "s", "%", "B", "KB", "MB", "GB", "TB", "c"}[u]
|
||||
}
|
Loading…
Reference in a new issue