Skip to content

Commit 373684e

Browse files
committed
collectors: add StateCollector
1 parent 02ee7ca commit 373684e

File tree

5 files changed

+187
-74
lines changed

5 files changed

+187
-74
lines changed

collectors/prometheus.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,7 @@ func NewPrometheusExporter(cfg *PrometheusConfig, lnd *lndclient.LndServices,
104104
NewWalletCollector(lnd, errChan),
105105
NewPeerCollector(lnd.Client, errChan),
106106
NewInfoCollector(lnd.Client, errChan),
107+
NewStateCollector(lnd, errChan),
107108
}
108109

109110
if !monitoringCfg.DisableHtlc {

collectors/state_collector.go

Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
package collectors
2+
3+
import (
4+
"context"
5+
"fmt"
6+
"sync"
7+
"time"
8+
9+
"github.com/lightninglabs/lndclient"
10+
"github.com/prometheus/client_golang/prometheus"
11+
)
12+
13+
type StateCollector struct {
14+
lnd *lndclient.LndServices
15+
16+
// Use one gauge to track the starting time of LND.
17+
timeToStartDesc *prometheus.Desc
18+
19+
// startTime records a best-effort timestamp of when LND was started.
20+
startTime time.Time
21+
22+
// endTime records when LND makes a transition from RPC_ACTIVE to
23+
// SERVER_ACTIVE.
24+
// If lndmon starts after LND has already reached SERVER_ACTIVE, no
25+
// startup time metric will be emitted.
26+
endTime time.Time
27+
28+
// mutex is a lock for preventing concurrent writes to startTime or
29+
// endTime.
30+
mutex sync.RWMutex
31+
32+
// errChan is a channel that we send any errors that we encounter into.
33+
// This channel should be buffered so that it does not block sends.
34+
errChan chan<- error
35+
}
36+
37+
// NewStateCollector returns a new instance of the StateCollector.
38+
func NewStateCollector(lnd *lndclient.LndServices,
39+
errChan chan<- error) *StateCollector {
40+
41+
sc := &StateCollector{
42+
lnd: lnd,
43+
timeToStartDesc: prometheus.NewDesc(
44+
"lnd_time_to_start_secs",
45+
"time to start in seconds",
46+
nil, nil,
47+
),
48+
startTime: time.Now(),
49+
errChan: errChan,
50+
}
51+
52+
go sc.monitorStateChanges()
53+
return sc
54+
}
55+
56+
// monitorStateChanges checks the state every second to catch fast transitions.
57+
func (s *StateCollector) monitorStateChanges() {
58+
var serverActiveReached bool
59+
60+
for {
61+
state, err := s.lnd.State.GetState(context.Background())
62+
if err != nil {
63+
s.errChan <- fmt.Errorf("StateCollector GetState failed with: %v", err)
64+
continue
65+
}
66+
67+
s.mutex.Lock()
68+
if state == lndclient.WalletStateRPCActive && !s.startTime.IsZero() {
69+
s.endTime = time.Now()
70+
serverActiveReached = true
71+
}
72+
s.mutex.Unlock()
73+
74+
if serverActiveReached {
75+
break
76+
}
77+
time.Sleep(1 * time.Second)
78+
}
79+
}
80+
81+
// Describe sends the super-set of all possible descriptors of metrics
82+
// collected by this Collector to the provided channel and returns once the
83+
// last descriptor has been sent.
84+
//
85+
// NOTE: Part of the prometheus.Collector interface.
86+
func (s *StateCollector) Describe(ch chan<- *prometheus.Desc) {
87+
ch <- s.timeToStartDesc
88+
}
89+
90+
// Collect is called by the Prometheus registry when collecting metrics.
91+
//
92+
// NOTE: Part of the prometheus.Collector interface.
93+
func (s *StateCollector) Collect(ch chan<- prometheus.Metric) {
94+
// Lock for read
95+
s.mutex.RLock()
96+
defer s.mutex.RUnlock()
97+
98+
// We have set both a startTime and endTime, calculate the difference and emit a metric.
99+
if !s.startTime.IsZero() && !s.endTime.IsZero() {
100+
timeToStartInSecs := s.endTime.Sub(s.startTime).Seconds()
101+
ch <- prometheus.MustNewConstMetric(
102+
s.timeToStartDesc, prometheus.GaugeValue, timeToStartInSecs,
103+
)
104+
}
105+
}

go.mod

Lines changed: 24 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@ require (
55
github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f
66
github.com/jessevdk/go-flags v1.5.0
77
github.com/jrick/logrotate v1.0.0
8-
github.com/lightninglabs/lndclient v0.17.0-4
9-
github.com/lightningnetwork/lnd v0.17.3-beta
8+
github.com/lightninglabs/lndclient v0.17.4-4
9+
github.com/lightningnetwork/lnd v0.17.4-beta
1010
github.com/prometheus/client_golang v1.18.0
1111
github.com/stretchr/testify v1.8.4
1212
)
@@ -16,11 +16,11 @@ require (
1616
github.com/aead/siphash v1.0.1 // indirect
1717
github.com/andybalholm/brotli v1.0.3 // indirect
1818
github.com/beorn7/perks v1.0.1 // indirect
19-
github.com/btcsuite/btcd v0.23.5-0.20231215221805-96c9fd8078fd // indirect
19+
github.com/btcsuite/btcd v0.24.1-0.20240123000108-62e6af035ec5 // indirect
2020
github.com/btcsuite/btcd/btcec/v2 v2.3.2 // indirect
2121
github.com/btcsuite/btcd/btcutil/psbt v1.1.8 // indirect
2222
github.com/btcsuite/btcd/chaincfg/chainhash v1.1.0 // indirect
23-
github.com/btcsuite/btcwallet v0.16.10-0.20231129183218-5df09dd43358 // indirect
23+
github.com/btcsuite/btcwallet v0.16.10-0.20240127010340-16b422a2e8bf // indirect
2424
github.com/btcsuite/btcwallet/wallet/txauthor v1.3.2 // indirect
2525
github.com/btcsuite/btcwallet/wallet/txrules v1.2.0 // indirect
2626
github.com/btcsuite/btcwallet/wallet/txsizes v1.2.3 // indirect
@@ -42,26 +42,28 @@ require (
4242
github.com/dustin/go-humanize v1.0.0 // indirect
4343
github.com/fergusstrange/embedded-postgres v1.10.0 // indirect
4444
github.com/go-errors/errors v1.0.1 // indirect
45+
github.com/go-logr/logr v1.3.0 // indirect
46+
github.com/go-logr/stdr v1.2.2 // indirect
4547
github.com/gogo/protobuf v1.3.2 // indirect
4648
github.com/golang-jwt/jwt/v4 v4.4.2 // indirect
4749
github.com/golang/protobuf v1.5.3 // indirect
4850
github.com/golang/snappy v0.0.4 // indirect
4951
github.com/google/btree v1.0.1 // indirect
50-
github.com/google/uuid v1.3.0 // indirect
52+
github.com/google/uuid v1.3.1 // indirect
5153
github.com/gorilla/websocket v1.5.0 // indirect
5254
github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 // indirect
5355
github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 // indirect
5456
github.com/grpc-ecosystem/grpc-gateway v1.16.0 // indirect
5557
github.com/grpc-ecosystem/grpc-gateway/v2 v2.5.0 // indirect
5658
github.com/jackc/chunkreader/v2 v2.0.1 // indirect
57-
github.com/jackc/pgconn v1.14.0 // indirect
59+
github.com/jackc/pgconn v1.14.3 // indirect
5860
github.com/jackc/pgerrcode v0.0.0-20220416144525-469b46aa5efa // indirect
5961
github.com/jackc/pgio v1.0.0 // indirect
6062
github.com/jackc/pgpassfile v1.0.0 // indirect
61-
github.com/jackc/pgproto3/v2 v2.3.2 // indirect
63+
github.com/jackc/pgproto3/v2 v2.3.3 // indirect
6264
github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a // indirect
6365
github.com/jackc/pgtype v1.14.0 // indirect
64-
github.com/jackc/pgx/v4 v4.18.1 // indirect
66+
github.com/jackc/pgx/v4 v4.18.2 // indirect
6567
github.com/jonboulle/clockwork v0.2.2 // indirect
6668
github.com/json-iterator/go v1.1.12 // indirect
6769
github.com/juju/loggo v0.0.0-20210728185423-eebad3a902c4 // indirect
@@ -114,28 +116,31 @@ require (
114116
go.etcd.io/etcd/pkg/v3 v3.5.7 // indirect
115117
go.etcd.io/etcd/raft/v3 v3.5.7 // indirect
116118
go.etcd.io/etcd/server/v3 v3.5.7 // indirect
117-
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.25.0 // indirect
118-
go.opentelemetry.io/otel v1.0.1 // indirect
119+
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.46.0 // indirect
120+
go.opentelemetry.io/otel v1.20.0 // indirect
119121
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.0.1 // indirect
120122
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.0.1 // indirect
123+
go.opentelemetry.io/otel/metric v1.20.0 // indirect
121124
go.opentelemetry.io/otel/sdk v1.0.1 // indirect
122-
go.opentelemetry.io/otel/trace v1.0.1 // indirect
125+
go.opentelemetry.io/otel/trace v1.20.0 // indirect
123126
go.opentelemetry.io/proto/otlp v0.9.0 // indirect
124127
go.uber.org/atomic v1.7.0 // indirect
125128
go.uber.org/multierr v1.6.0 // indirect
126129
go.uber.org/zap v1.17.0 // indirect
127-
golang.org/x/crypto v0.14.0 // indirect
130+
golang.org/x/crypto v0.21.0 // indirect
128131
golang.org/x/exp v0.0.0-20230315142452-642cacee5cc0 // indirect
129132
golang.org/x/mod v0.10.0 // indirect
130-
golang.org/x/net v0.17.0 // indirect
131-
golang.org/x/sys v0.15.0 // indirect
132-
golang.org/x/term v0.13.0 // indirect
133-
golang.org/x/text v0.13.0 // indirect
133+
golang.org/x/net v0.23.0 // indirect
134+
golang.org/x/sys v0.18.0 // indirect
135+
golang.org/x/term v0.18.0 // indirect
136+
golang.org/x/text v0.14.0 // indirect
134137
golang.org/x/time v0.0.0-20220224211638-0e9765cccd65 // indirect
135138
golang.org/x/tools v0.9.1 // indirect
136-
google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1 // indirect
137-
google.golang.org/grpc v1.56.3 // indirect
138-
google.golang.org/protobuf v1.31.0 // indirect
139+
google.golang.org/genproto v0.0.0-20230822172742-b8732ec3820d // indirect
140+
google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d // indirect
141+
google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d // indirect
142+
google.golang.org/grpc v1.59.0 // indirect
143+
google.golang.org/protobuf v1.33.0 // indirect
139144
gopkg.in/errgo.v1 v1.0.1 // indirect
140145
gopkg.in/macaroon-bakery.v2 v2.0.1 // indirect
141146
gopkg.in/macaroon.v2 v2.1.0 // indirect

0 commit comments

Comments
 (0)