rpcserver+monitoring/config: enable Prometheus monitoring.

Start the Prometheus exporter in rpcserver.go if monitoring is enabled through the
build tag. Also allow users to specify what address they want the Prometheus
exporter to be listening on.
This commit is contained in:
Valentine Wallace 2019-05-31 00:59:27 -07:00
parent 1f6485e7e9
commit f5eeb05e0a
No known key found for this signature in database
GPG Key ID: F88EC43B95E601B8
5 changed files with 95 additions and 10 deletions

@ -313,6 +313,8 @@ type config struct {
Workers *lncfg.Workers `group:"workers" namespace:"workers"`
Caches *lncfg.Caches `group:"caches" namespace:"caches"`
Prometheus lncfg.Prometheus `group:"prometheus" namespace:"prometheus"`
}
// loadConfig initializes and parses the config using a config file and command
@ -407,6 +409,7 @@ func loadConfig() (*config, error) {
RejectCacheSize: channeldb.DefaultRejectCacheSize,
ChannelCacheSize: channeldb.DefaultChannelCacheSize,
},
Prometheus: lncfg.DefaultPrometheus(),
}
// Pre-parse the command line options to pick up an alternative config

19
lncfg/monitoring_off.go Normal file

@ -0,0 +1,19 @@
// +build !monitoring
package lncfg
// Prometheus configures the Prometheus exporter when monitoring is enabled.
// Monitoring is currently disabled.
type Prometheus struct{}
// DefaultPrometheus is the default configuration for the Prometheus metrics
// exporter when monitoring is enabled. Monitoring is currently disabled.
func DefaultPrometheus() Prometheus {
return Prometheus{}
}
// Enabled returns whether or not Prometheus monitoring is enabled. Monitoring
// is currently disabled, so Enabled will always return false.
func (p *Prometheus) Enabled() bool {
return false
}

30
lncfg/monitoring_on.go Normal file

@ -0,0 +1,30 @@
// +build monitoring
package lncfg
// Prometheus is the set of configuration data that specifies the listening
// address of the Prometheus exporter.
type Prometheus struct {
// Listen is the listening address that we should use to allow the main
// Prometheus server to scrape our metrics.
Listen string `long:"listen" description:"the interface we should listen on for Prometheus"`
// Enable indicates whether to export lnd gRPC performance metrics to
// Prometheus. Default is false.
Enable bool `long:"enable" description:"enable Prometheus exporting of lnd gRPC performance metrics."`
}
// DefaultPrometheus is the default configuration for the Prometheus metrics
// exporter.
func DefaultPrometheus() Prometheus {
return Prometheus{
Listen: "127.0.0.1:8989",
Enable: false,
}
}
// Enabled returns whether or not Prometheus monitoring is enabled. Monitoring
// is disabled by default, but may be enabled by the user.
func (p *Prometheus) Enabled() bool {
return p.Enable
}

4
log.go

@ -28,6 +28,7 @@ import (
"github.com/lightningnetwork/lnd/lnrpc/signrpc"
"github.com/lightningnetwork/lnd/lnrpc/walletrpc"
"github.com/lightningnetwork/lnd/lnwallet"
"github.com/lightningnetwork/lnd/monitoring"
"github.com/lightningnetwork/lnd/netann"
"github.com/lightningnetwork/lnd/routing"
"github.com/lightningnetwork/lnd/signal"
@ -85,6 +86,7 @@ var (
irpcLog = build.NewSubLogger("IRPC", backendLog.Logger)
chnfLog = build.NewSubLogger("CHNF", backendLog.Logger)
chbuLog = build.NewSubLogger("CHBU", backendLog.Logger)
promLog = build.NewSubLogger("PROM", backendLog.Logger)
)
// Initialize package-global logger variables.
@ -112,6 +114,7 @@ func init() {
invoicesrpc.UseLogger(irpcLog)
channelnotifier.UseLogger(chnfLog)
chanbackup.UseLogger(chbuLog)
monitoring.UseLogger(promLog)
addSubLogger(routerrpc.Subsystem, routerrpc.UseLogger)
}
@ -155,6 +158,7 @@ var subsystemLoggers = map[string]btclog.Logger{
"IRPC": irpcLog,
"CHNF": chnfLog,
"CHBU": chbuLog,
"PROM": promLog,
}
// initLogRotator initializes the logging rotator to write logs to logFile and

@ -28,6 +28,7 @@ import (
"github.com/btcsuite/btcwallet/wallet/txauthor"
"github.com/coreos/bbolt"
"github.com/davecgh/go-spew/spew"
"github.com/grpc-ecosystem/go-grpc-middleware"
proxy "github.com/grpc-ecosystem/grpc-gateway/runtime"
"github.com/lightningnetwork/lnd/autopilot"
"github.com/lightningnetwork/lnd/build"
@ -45,6 +46,7 @@ import (
"github.com/lightningnetwork/lnd/lnwallet"
"github.com/lightningnetwork/lnd/lnwire"
"github.com/lightningnetwork/lnd/macaroons"
"github.com/lightningnetwork/lnd/monitoring"
"github.com/lightningnetwork/lnd/routing"
"github.com/lightningnetwork/lnd/signal"
"github.com/lightningnetwork/lnd/sweep"
@ -531,19 +533,36 @@ func newRPCServer(s *server, macService *macaroons.Service,
}
// If macaroons aren't disabled (a non-nil service), then we'll set up
// our set of interceptors which will allow us handle the macaroon
// authentication in a single location .
// our set of interceptors which will allow us to handle the macaroon
// authentication in a single location.
macUnaryInterceptors := []grpc.UnaryServerInterceptor{}
macStrmInterceptors := []grpc.StreamServerInterceptor{}
if macService != nil {
unaryInterceptor := grpc.UnaryInterceptor(
macService.UnaryServerInterceptor(permissions),
)
streamInterceptor := grpc.StreamInterceptor(
macService.StreamServerInterceptor(permissions),
)
unaryInterceptor := macService.UnaryServerInterceptor(permissions)
macUnaryInterceptors = append(macUnaryInterceptors, unaryInterceptor)
serverOpts = append(serverOpts,
unaryInterceptor, streamInterceptor,
strmInterceptor := macService.StreamServerInterceptor(permissions)
macStrmInterceptors = append(macStrmInterceptors, strmInterceptor)
}
// Get interceptors for Prometheus to gather gRPC performance metrics.
// If monitoring is disabled, GetPromInterceptors() will return empty
// slices.
promUnaryInterceptors, promStrmInterceptors := monitoring.GetPromInterceptors()
// Concatenate the slices of unary and stream interceptors respectively.
unaryInterceptors := append(macUnaryInterceptors, promUnaryInterceptors...)
strmInterceptors := append(macStrmInterceptors, promStrmInterceptors...)
// If any interceptors have been set up, add them to the server options.
if len(unaryInterceptors) != 0 && len(strmInterceptors) != 0 {
chainedUnary := grpc_middleware.WithUnaryServerChain(
unaryInterceptors...,
)
chainedStream := grpc_middleware.WithStreamServerChain(
strmInterceptors...,
)
serverOpts = append(serverOpts, chainedUnary, chainedStream)
}
// Finally, with all the pre-set up complete, we can create the main
@ -616,6 +635,16 @@ func (r *rpcServer) Start() error {
}()
}
// If Prometheus monitoring is enabled, start the Prometheus exporter.
if cfg.Prometheus.Enabled() {
err := monitoring.ExportPrometheusMetrics(
r.grpcServer, cfg.Prometheus,
)
if err != nil {
return err
}
}
// Finally, start the REST proxy for our gRPC server above. We'll ensure
// we direct LND to connect to its loopback address rather than a
// wildcard to prevent certificate issues when accessing the proxy