// Go port of Coda Hale's Metrics library // // // // Coda Hale's original work: package metrics import ( "os" "runtime/metrics" "strings" "sync/atomic" ) // Enabled is checked by the constructor functions for all of the // standard metrics. If it is true, the metric returned is a stub. // // This global kill-switch helps quantify the observer effect and makes // for less cluttered pprof profiles. var Enabled = false // callbacks - storing list of callbacks as type []func() // use metrics.AddCallback to add your function to metrics collection loop (to avoid multiple goroutines collecting metrics) var callbacks atomic.Value func init() { metrics.All() callbacks.Store([]func(){}) } // Calling Load method // EnabledExpensive is a soft-flag meant for external packages to check if costly // metrics gathering is allowed or not. The goal is to separate standard metrics // for health monitoring and debug metrics that might impact runtime performance. var EnabledExpensive = false // enablerFlags is the CLI flag names to use to enable metrics collections. var enablerFlags = []string{"metrics"} // expensiveEnablerFlags is the CLI flag names to use to enable metrics collections. var expensiveEnablerFlags = []string{"metrics.expensive"} // Init enables or disables the metrics system. Since we need this to run before // any other code gets to create meters and timers, we'll actually do an ugly hack // and peek into the command line args for the metrics flag. func init() { for _, arg := range os.Args { flag := strings.TrimLeft(arg, "-") for _, enabler := range enablerFlags { if !Enabled && flag == enabler { Enabled = true } } for _, enabler := range expensiveEnablerFlags { if !EnabledExpensive && flag == enabler { EnabledExpensive = true } } } }