Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
monitoring: add monitoring package for Prometheus metric exports.
- Loading branch information
1 parent
2ccd93a
commit 27c38c8
Showing
5 changed files
with
162 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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) | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,20 @@ | ||
// +build !monitoring | ||
|
||
package monitoring | ||
|
||
import ( | ||
"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) {} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,43 @@ | ||
// +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) { | ||
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) | ||
}() | ||
}) | ||
} |