check

package module
v1.0.0-rc2 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jun 11, 2026 License: GPL-2.0 Imports: 14 Imported by: 27

README

go-check

go-check is a Golang library to help with development of monitoring plugins for tools like Icinga.

See the documentation on pkg.go.dev for more details and examples.

Usage

Simple Example

go-check includes everything to quickly create a CLI monitoring plugin:

package main

import (
    "fmt"

    "github.com/NETWAYS/go-check"
)

func main() {
    // Global configuration of the plugin
    config := check.NewConfig()
    config.Name = "check_test"
    config.Readme = `Test Plugin`
    config.Version = "1.0.0"

    // Command line arguments
    _ = config.FlagSet.StringP("hostname", "H", "localhost", "Hostname to check")

    config.ParseArguments()

    // Handle exit with the desired exit code
    check.Exit(check.OK, fmt.Sprintf("Everything is fine - answer=%d", 42))
    // Output:
    // [OK] - Everything is fine - answer=42
}

Return Codes

The library provides predefined return or exit codes:

check.OK
check.Warning
check.Critical
check.Unknown

// These exit codes implement the Stringer interface
fmt.Println(check.OK)

To convert an integer or string into an exit code

unknown, err := NewStatus(3)

warning, err := NewStatusFromString("Warning")

See also: https://www.monitoring-plugins.org/doc/guidelines.html#AEN74

Exit

The Exit function can be used to cause an exit with the given status code.

check.Exit(check.OK, fmt.Sprintf("Everything is fine - value=%d", 42)) // OK, 0

// With perfdata
check.Exit(check.Critical, "CRITICAL", "|", "percent_packet_loss=100") // CRITICAL, 2

ExitError can be used to cause an exit with the given error.

err := fmt.Errorf("connection to %s has been timed out", "localhost:12345")

check.ExitError(err)
// UNKNOWN, 3

Timeout Handling

HandleTimeout is a helper for a goroutine, to wait for signals and timeout, and exit with a proper code.

checkPluginTimeoutInSeconds := 10

go check.HandleTimeout(checkPluginTimeoutInSeconds)

Thresholds

Threshold objects represent monitoring plugin thresholds that have methods to evaluate if a given input is within the range.

They can be created with the ParseThreshold parser.

warnThreshold, err := check.ParseThreshold("~:3")

if err != nil {
    // Handle the error
}

if warnThreshold.DoesViolate(3.6) {
    fmt.Println("Not great, not terrible.")
}

See also: https://www.monitoring-plugins.org/doc/guidelines.html#THRESHOLDFORMAT

Performance data

The Perfdata object represents monitoring plugin performance data that relates to the actual execution of a host or service check.

var pl perfdata.PerfdataList

pl.Add(&perfdata.Perfdata{
    Label: "process.cpu.percent",
    Value: 25,
    Uom:   "%",
    Warn:  50,
    Crit:  90,
    Min:   0,
    Max:   100})

fmt.Println(pl.String())

See also: https://www.monitoring-plugins.org/doc/guidelines.html#AEN197

WorstState

The WorstState helper can be used to determine the worst exit status from a set of exit states.

allStates = []check.Status{check.OK, check.Critical, check.Warning, check.Unknown}

rc := result.WorstState(allStates...)

Overall and Partial Results

The Overall and PartialResult objects can be used to represent a simple parent-child relationship.

An Overall can contain multiple subchecks. The final exit of the Overall will be automatically determined by the worst state of a PartialResult.

o := Overall{}
o.Add(0, "Something is OK")

pr := PartialResult{
    Output: "My Subcheck",
}

if err := pr.SetState(check.OK); err != nil {
  fmt.Printf(%s, err)
}

o.AddSubcheck(pr)

fmt.Println(o.GetOutput())

// states: ok=1
// [OK] Something is OK
// \_ [OK] My Subcheck

Human-readable bytes

ParseBytes is a helper that can be used to parse string containering IEC or SI bytes into the number of bytes.

b, err := ParseBytes("2MiB")
// uint64 2 * 1024 * 1024

b, err := ParseBytes("1MB")
// uint64 1000 * 1000

BytesIEC and BytesSI can be used to format a byte value with human-readable string output.

b := convert.BytesIEC(999)

fmt.Println(b)
// "999B"

b := convert.BytesIEC(999 * 1024)

fmt.Println(b)
// "999KiB"

b := convert.BytesIEC(999 * 1024 * 1024 * 1024 * 1024)

fmt.Println(b)
// "999TiB"

b := convert.BytesSI(999)

fmt.Println(b)
// "999B"

b := convert.BytesSI(999 * 1000)

fmt.Println(b)
// "999KB"

b := convert.BytesSI(999 * 1000 * 1000 * 1000 * 1000)

fmt.Println(b)
// "999TB"

Examples

A few plugins using go-check:

License

Copyright (c) 2020 NETWAYS GmbH

This library is distributed under the GPL-2.0 or newer license found in the COPYING file.

Documentation

Index

Examples

Constants

View Source
const (
	// OKString means everything is fine
	OKString = "OK"
	// WarningString means there is a problem the admin should review
	WarningString = "WARNING"
	// CriticalString means there is a problem that requires immediate action
	CriticalString = "CRITICAL"
	// UnknownString means the status can not be determined, probably due to an error or something missing
	UnknownString = "UNKNOWN"
)

Variables

View Source
var (
	PosInf = math.Inf(1)
	NegInf = math.Inf(-1)
)
View Source
var AllowExit = true

AllowExit lets you disable the call to os.Exit() in ExitXxx() functions of this package. This should be used carefully and most likely only for testing.

View Source
var PrintStack = true

PrintStack prints the error stack when recovering from a panic with CatchPanic()

Functions

func BaseExit

func BaseExit(rc Status)

BaseExit exits the process with a given return code.

Can be controlled with the global AllowExit

func BoundaryToString

func BoundaryToString(value float64) (s string)

BoundaryToString returns the string representation of a Threshold boundary.

func CatchPanic

func CatchPanic()

CatchPanic is a general function for defer, to capture any panic that occurred during runtime of a check

The function will recover from the condition and exit with a proper UNKNOWN status, while showing error and the call stack.

Example
defer CatchPanic()

panic("something bad happened")
Output:
[UNKNOWN] - Golang encountered a panic: something bad happened
would exit with code 3

func Exit

func Exit(rc Status, output ...string)

Exit exits the process with a given return code and output Example: OK - everything is fine

Example
Exit(OK, fmt.Sprintf("Everything is fine - value=%d", 42))
Output:
[OK] - Everything is fine - value=42
would exit with code 0

func ExitError

func ExitError(err error)

ExitError exists with an Unknown state while reporting the error

Example
err := fmt.Errorf("connection to %s has been timed out", "localhost:12345")
ExitError(err)
Output:
[UNKNOWN] - connection to localhost:12345 has been timed out (*errors.errorString)
would exit with code 3

func FormatFloat added in v0.3.0

func FormatFloat(value float64) string

FormatFloat returns a string representation of floats, avoiding scientific notation and removes trailing zeros.

func HandleTimeout

func HandleTimeout(timeout int)

HandleTimeout is a helper for a goroutine, to wait for signals and timeout, and exit with a proper code

func LoadFromEnv added in v0.6.0

func LoadFromEnv(config any)

LoadFromEnv can be used to load struct values from 'env' tags. Mainly used to avoid passing secrets via the CLI

type Config struct {
	Token    string `env:"BEARER_TOKEN"`
}

Types

type Config

type Config struct {
	// Name of the monitoring plugin
	Name string
	// README represents the help text for the CLI usage
	Readme string
	// Output for the --version flag
	Version string
	// Default for the --timeout flag
	Timeout int
	// Default for the --verbose flag
	Verbose bool
	// Default for the --debug flag
	Debug bool
	// Enable predefined --version output
	PrintVersion bool
	// Enable predefined default flags for the monitoring plugin
	DefaultFlags bool
	// Enable predefined default functions (e.g. Timeout handler) for the monitoring plugin
	DefaultHelper bool
	// Additional CLI flags for the monitoring plugin
	FlagSet *flag.FlagSet
}

Config represents a configuration for a monitoring plugin's CLI

Example
config := NewConfig()
config.Name = "check_test"
config.Readme = `Test Plugin`
config.Version = "1.0.0"

_ = config.FlagSet.StringP("hostname", "H", "localhost", "Hostname to check")

config.ParseArguments()

// Some checking should be done here

Exit(OK, fmt.Sprintf("Everything is fine - answer=%d", 42))
Output:
[OK] - Everything is fine - answer=42
would exit with code 0

func NewConfig

func NewConfig() *Config

NewConfig returns a Config struct with some defaults

func (*Config) EnableTimeoutHandler

func (c *Config) EnableTimeoutHandler()

EnableTimeoutHandler starts the timeout and signal handler in a goroutine

func (*Config) ParseArguments

func (c *Config) ParseArguments()

ParseArguments parses the command line arguments given by os.Args

func (*Config) ParseArray

func (c *Config) ParseArray(arguments []string)

ParseArray parses a list of command line arguments

type Status added in v1.0.0

type Status int
const (
	OK Status = iota
	Warning
	Critical
	Unknown
)

func NewStatus added in v1.0.0

func NewStatus(status int) (Status, error)

NewStatus returns a state corresponding to its common string representation

func NewStatusFromString added in v1.0.0

func NewStatusFromString(status string) (Status, error)

NewStatusFromString returns a state corresponding to its common string representation

func (Status) String added in v1.0.0

func (s Status) String() string

String returns the string corresponding to a state

type Threshold

type Threshold struct {
	Inside bool
	Lower  float64
	Upper  float64
}

Threshold defines threshold for any numeric value

Format: [@]start:end

Threshold Generate an alert if x... 10 < 0 or > 10, (outside the range of {0 .. 10}) 10: < 10, (outside {10 .. ∞}) ~:10 > 10, (outside the range of {-∞ .. 10}) 10:20 < 10 or > 20, (outside the range of {10 .. 20}) @10:20 ≥ 10 and ≤ 20, (inside the range of {10 .. 20})

Reference: https://www.monitoring-plugins.org/doc/guidelines.html#THRESHOLDFORMAT

func ParseThreshold

func ParseThreshold(spec string) (t *Threshold, err error)

ParseThreshold parses a Threshold from a string.

See Threshold for details.

func (Threshold) DoesViolate

func (t Threshold) DoesViolate(value float64) bool

DoesViolate compares a value against the threshold, and returns true if the value violates the threshold.

func (Threshold) String

func (t Threshold) String() (s string)

String returns the plain representation of the Threshold

Directories

Path Synopsis
examples
check_example command
check_example2 command

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL