9045b79bc2
This PR modifies how the metrics library handles `Enabled`: previously, the package `init` decided whether to serve real metrics or just dummy-types. This has several drawbacks: - During pkg init, we need to determine whether metrics are enabled or not. So we first hacked in a check if certain geth-specific commandline-flags were enabled. Then we added a similar check for geth-env-vars. Then we almost added a very elaborate check for toml-config-file, plus toml parsing. - Using "real" types and dummy types interchangeably means that everything is hidden behind interfaces. This has a performance penalty, and also it just adds a lot of code. This PR removes the interface stuff, uses concrete types, and allows for the setting of Enabled to happen later. It is still assumed that `metrics.Enable()` is invoked early on. The somewhat 'heavy' operations, such as ticking meters and exp-decay, now checks the enable-flag to prevent resource leak. The change may be large, but it's mostly pretty trivial, and from the last time I gutted the metrics, I ensured that we have fairly good test coverage. --------- Co-authored-by: Felix Lange <fjl@twurst.com>
36 lines
931 B
Go
36 lines
931 B
Go
package metrics
|
|
|
|
// NewHealthcheck constructs a new Healthcheck which will use the given
|
|
// function to update its status.
|
|
func NewHealthcheck(f func(*Healthcheck)) *Healthcheck {
|
|
return &Healthcheck{nil, f}
|
|
}
|
|
|
|
// Healthcheck is the standard implementation of a Healthcheck and
|
|
// stores the status and a function to call to update the status.
|
|
type Healthcheck struct {
|
|
err error
|
|
f func(*Healthcheck)
|
|
}
|
|
|
|
// Check runs the healthcheck function to update the healthcheck's status.
|
|
func (h *Healthcheck) Check() {
|
|
h.f(h)
|
|
}
|
|
|
|
// Error returns the healthcheck's status, which will be nil if it is healthy.
|
|
func (h *Healthcheck) Error() error {
|
|
return h.err
|
|
}
|
|
|
|
// Healthy marks the healthcheck as healthy.
|
|
func (h *Healthcheck) Healthy() {
|
|
h.err = nil
|
|
}
|
|
|
|
// Unhealthy marks the healthcheck as unhealthy. The error is stored and
|
|
// may be retrieved by the Error method.
|
|
func (h *Healthcheck) Unhealthy(err error) {
|
|
h.err = err
|
|
}
|