mirror of
https://github.com/lightningnetwork/lnd.git
synced 2025-08-27 22:21:18 +02:00
monitoring: add monitoring package for Prometheus metric exports.
This commit is contained in:
45
monitoring/log.go
Normal file
45
monitoring/log.go
Normal file
@@ -0,0 +1,45 @@
|
||||
package monitoring
|
||||
|
||||
import (
|
||||
"github.com/btcsuite/btclog"
|
||||
"github.com/lightningnetwork/lnd/build"
|
||||
)
|
||||
|
||||
// log is a logger that is initialized with no output filters. This means the
|
||||
// package will not perform any logging by default until the caller requests
|
||||
// it.
|
||||
var log btclog.Logger
|
||||
|
||||
// The default amount of logging is none.
|
||||
func init() {
|
||||
UseLogger(build.NewSubLogger("PROM", nil))
|
||||
}
|
||||
|
||||
// DisableLog disables all library log output. Logging output is disabled by
|
||||
// default until UseLogger is called.
|
||||
func DisableLog() {
|
||||
UseLogger(btclog.Disabled)
|
||||
}
|
||||
|
||||
// UseLogger uses a specified Logger to output package logging info. This
|
||||
// should be used in preference to SetLogWriter if the caller is also using
|
||||
// btclog.
|
||||
func UseLogger(logger btclog.Logger) {
|
||||
log = logger
|
||||
}
|
||||
|
||||
// logClosure is used to provide a closure over expensive logging operations so
|
||||
// don't have to be performed when the logging level doesn't warrant it.
|
||||
type logClosure func() string
|
||||
|
||||
// String invokes the underlying function and returns the result.
|
||||
func (c logClosure) String() string {
|
||||
return c()
|
||||
}
|
||||
|
||||
// newLogClosure returns a new closure over a function that returns a string
|
||||
// which itself provides a Stringer interface so that it can be used with the
|
||||
// logging system.
|
||||
func newLogClosure(c func() string) logClosure {
|
||||
return logClosure(c)
|
||||
}
|
25
monitoring/monitoring_off.go
Normal file
25
monitoring/monitoring_off.go
Normal file
@@ -0,0 +1,25 @@
|
||||
// +build !monitoring
|
||||
|
||||
package monitoring
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
"google.golang.org/grpc"
|
||||
|
||||
"github.com/lightningnetwork/lnd/lncfg"
|
||||
)
|
||||
|
||||
// GetPromInterceptors returns the set of interceptors for Prometheus
|
||||
// monitoring if monitoring is enabled, else empty slices. Monitoring is
|
||||
// currently disabled.
|
||||
func GetPromInterceptors() ([]grpc.UnaryServerInterceptor, []grpc.StreamServerInterceptor) {
|
||||
return []grpc.UnaryServerInterceptor{}, []grpc.StreamServerInterceptor{}
|
||||
}
|
||||
|
||||
// ExportPrometheusMetrics is required for lnd to compile so that Prometheus
|
||||
// metric exporting can be hidden behind a build tag.
|
||||
func ExportPrometheusMetrics(_ *grpc.Server, _ lncfg.Prometheus) error {
|
||||
return fmt.Errorf("lnd must be built with the monitoring tag to " +
|
||||
"enable exporting Prometheus metrics")
|
||||
}
|
45
monitoring/monitoring_on.go
Normal file
45
monitoring/monitoring_on.go
Normal file
@@ -0,0 +1,45 @@
|
||||
// +build monitoring
|
||||
|
||||
package monitoring
|
||||
|
||||
import (
|
||||
"net/http"
|
||||
"sync"
|
||||
|
||||
"google.golang.org/grpc"
|
||||
|
||||
"github.com/grpc-ecosystem/go-grpc-prometheus"
|
||||
"github.com/lightningnetwork/lnd/lncfg"
|
||||
"github.com/prometheus/client_golang/prometheus/promhttp"
|
||||
)
|
||||
|
||||
var started sync.Once
|
||||
|
||||
// GetPromInterceptors returns the set of interceptors for Prometheus
|
||||
// monitoring.
|
||||
func GetPromInterceptors() ([]grpc.UnaryServerInterceptor, []grpc.StreamServerInterceptor) {
|
||||
unaryInterceptors := []grpc.UnaryServerInterceptor{
|
||||
grpc_prometheus.UnaryServerInterceptor,
|
||||
}
|
||||
streamInterceptors := []grpc.StreamServerInterceptor{
|
||||
grpc_prometheus.StreamServerInterceptor,
|
||||
}
|
||||
return unaryInterceptors, streamInterceptors
|
||||
}
|
||||
|
||||
// ExportPrometheusMetrics sets server options, registers gRPC metrics and
|
||||
// launches the Prometheus exporter on the specified address.
|
||||
func ExportPrometheusMetrics(grpcServer *grpc.Server, cfg lncfg.Prometheus) error {
|
||||
started.Do(func() {
|
||||
log.Infof("Prometheus exporter started on %v/metrics", cfg.Listen)
|
||||
|
||||
grpc_prometheus.Register(grpcServer)
|
||||
|
||||
http.Handle("/metrics", promhttp.Handler())
|
||||
go func() {
|
||||
http.ListenAndServe(cfg.Listen, nil)
|
||||
}()
|
||||
})
|
||||
|
||||
return nil
|
||||
}
|
Reference in New Issue
Block a user