Skip to content

Commit f63626f

Browse files
authored
Merge pull request #120 from Jontified/add-wt-metrics
Add watchtower client number of backup metrics
2 parents a50893d + a7f7f06 commit f63626f

File tree

5 files changed

+147
-34
lines changed

5 files changed

+147
-34
lines changed

collectors/log.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,9 @@ var (
1919
// paymentLogger is a logger for lndmon's payments monitor.
2020
paymentLogger btclog.Logger
2121

22+
// watchtowerLogger is a logger for lndmon's watchtower client.
23+
watchtowerLogger btclog.Logger
24+
2225
noOpShutdownFunc = func() {}
2326
)
2427

@@ -52,6 +55,7 @@ func initLogRotator(logFile string, maxLogFileSize, maxLogFiles int) error {
5255
Logger = logManager.GenSubLogger("LNDMON", noOpShutdownFunc)
5356
htlcLogger = logManager.GenSubLogger("HTLC", noOpShutdownFunc)
5457
paymentLogger = logManager.GenSubLogger("PMNT", noOpShutdownFunc)
58+
watchtowerLogger = logManager.GenSubLogger("WTCL", noOpShutdownFunc)
5559

5660
// Set log level.
5761
// TODO: consider making this configurable.

collectors/prometheus.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,7 @@ func NewPrometheusExporter(cfg *PrometheusConfig, lnd *lndclient.LndServices,
118118
NewPeerCollector(lnd.Client, errChan),
119119
NewInfoCollector(lnd.Client, errChan),
120120
NewStateCollector(lnd, errChan, monitoringCfg.ProgramStartTime),
121+
NewWtClientCollector(lnd, errChan),
121122
}
122123

123124
if !monitoringCfg.DisableHtlc {
@@ -189,7 +190,7 @@ func (p *PrometheusExporter) Start() error {
189190
}
190191

191192
// Finally, we'll launch the HTTP server that Prometheus will use to
192-
// scape our metrics.
193+
// scrape our metrics.
193194
go func() {
194195
errorLogger := log.New(
195196
os.Stdout, "promhttp",

collectors/wt_client_collector.go

Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
package collectors
2+
3+
import (
4+
"context"
5+
"encoding/hex"
6+
"fmt"
7+
"strings"
8+
9+
"github.com/lightninglabs/lndclient"
10+
"github.com/prometheus/client_golang/prometheus"
11+
)
12+
13+
// WtClientCollector is a collector that will export watchtower client-related
14+
// metrics.
15+
type WtClientCollector struct {
16+
lnd *lndclient.LndServices
17+
18+
numBackupsDesc *prometheus.Desc
19+
numPendingBackupsDesc *prometheus.Desc
20+
21+
// errChan is a channel that we send any errors that we encounter into.
22+
// This channel should be buffered so that it does not block sending.
23+
errChan chan<- error
24+
}
25+
26+
// NewWtClientCollector returns a new instance of the WalletCollector.
27+
func NewWtClientCollector(lnd *lndclient.LndServices,
28+
errChan chan<- error) *WtClientCollector {
29+
30+
return &WtClientCollector{
31+
lnd: lnd,
32+
numBackupsDesc: prometheus.NewDesc(
33+
"lnd_wt_client_num_backups",
34+
"watchtower client number of backups",
35+
[]string{
36+
"tower_pubkey",
37+
}, nil,
38+
),
39+
numPendingBackupsDesc: prometheus.NewDesc(
40+
"lnd_wt_client_num_pending_backups",
41+
"watchtower client number of pending backups",
42+
[]string{
43+
"tower_pubkey",
44+
}, nil,
45+
),
46+
47+
errChan: errChan,
48+
}
49+
}
50+
51+
// Describe sends the superset of all possible descriptors of metrics
52+
// collected by this Collector to the provided channel and returns once the
53+
// last descriptor has been sent.
54+
//
55+
// NOTE: Part of the prometheus.Collector interface.
56+
func (c *WtClientCollector) Describe(ch chan<- *prometheus.Desc) {
57+
ch <- c.numBackupsDesc
58+
ch <- c.numPendingBackupsDesc
59+
}
60+
61+
// Collect is called by the Prometheus registry when collecting metrics.
62+
//
63+
// NOTE: Part of the prometheus.Collector interface.
64+
func (c *WtClientCollector) Collect(ch chan<- prometheus.Metric) {
65+
towers, err := c.lnd.WtClient.ListTowers(
66+
context.Background(), true, false,
67+
)
68+
if err != nil {
69+
// If the watchtower client is not active, we'll just return.
70+
if strings.Contains(
71+
err.Error(), "watchtower client not active",
72+
) {
73+
74+
watchtowerLogger.Debug("Watchtower client not active")
75+
return
76+
}
77+
78+
c.errChan <- fmt.Errorf("WtClientCollector ListTowers failed "+
79+
"with: %v", err)
80+
return
81+
}
82+
83+
for _, tower := range towers {
84+
if tower == nil {
85+
continue
86+
}
87+
var (
88+
pubkey = hex.EncodeToString(tower.Pubkey)
89+
numBackups uint32
90+
numPendingBackups uint32
91+
)
92+
for _, sessionInfo := range tower.SessionInfo {
93+
for _, session := range sessionInfo.Sessions {
94+
numBackups += session.NumBackups
95+
numPendingBackups += session.NumPendingBackups
96+
}
97+
}
98+
99+
ch <- prometheus.MustNewConstMetric(
100+
c.numBackupsDesc, prometheus.GaugeValue,
101+
float64(numBackups), pubkey,
102+
)
103+
ch <- prometheus.MustNewConstMetric(
104+
c.numPendingBackupsDesc, prometheus.GaugeValue,
105+
float64(numPendingBackups), pubkey,
106+
)
107+
}
108+
}

go.mod

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,10 @@ module github.com/lightninglabs/lndmon
22

33
require (
44
github.com/btcsuite/btcd/btcutil v1.1.5
5-
github.com/btcsuite/btclog v0.0.0-20241003133417-09c4e92e319c
5+
github.com/btcsuite/btclog/v2 v2.0.1-0.20250110154127-3ae4bf1cb318
66
github.com/jessevdk/go-flags v1.5.0
7-
github.com/jrick/logrotate v1.1.2
8-
github.com/lightninglabs/lndclient v0.19.0-4
9-
github.com/lightningnetwork/lnd v0.19.0-beta.rc2.0.20250423092132-a35ace7371af
7+
github.com/lightninglabs/lndclient v0.19.0-13
8+
github.com/lightningnetwork/lnd v0.19.0-beta
109
github.com/prometheus/client_golang v1.18.0
1110
github.com/stretchr/testify v1.10.0
1211
google.golang.org/grpc v1.59.0
@@ -24,7 +23,7 @@ require (
2423
github.com/btcsuite/btcd/btcec/v2 v2.3.4 // indirect
2524
github.com/btcsuite/btcd/btcutil/psbt v1.1.8 // indirect
2625
github.com/btcsuite/btcd/chaincfg/chainhash v1.1.0 // indirect
27-
github.com/btcsuite/btclog/v2 v2.0.1-0.20250110154127-3ae4bf1cb318 // indirect
26+
github.com/btcsuite/btclog v0.0.0-20241003133417-09c4e92e319c // indirect
2827
github.com/btcsuite/btcwallet v0.16.13 // indirect
2928
github.com/btcsuite/btcwallet/wallet/txauthor v1.3.5 // indirect
3029
github.com/btcsuite/btcwallet/wallet/txrules v1.2.2 // indirect
@@ -54,7 +53,7 @@ require (
5453
github.com/go-errors/errors v1.0.1 // indirect
5554
github.com/go-logr/logr v1.4.2 // indirect
5655
github.com/go-logr/stdr v1.2.2 // indirect
57-
github.com/go-viper/mapstructure/v2 v2.2.1 // indirect
56+
github.com/go-viper/mapstructure/v2 v2.4.0 // indirect
5857
github.com/gogo/protobuf v1.3.2 // indirect
5958
github.com/golang-jwt/jwt/v4 v4.5.2 // indirect
6059
github.com/golang-migrate/migrate/v4 v4.17.0 // indirect
@@ -83,6 +82,7 @@ require (
8382
github.com/jackc/pgx/v5 v5.5.4 // indirect
8483
github.com/jackc/puddle/v2 v2.2.1 // indirect
8584
github.com/jonboulle/clockwork v0.2.2 // indirect
85+
github.com/jrick/logrotate v1.1.2 // indirect
8686
github.com/json-iterator/go v1.1.12 // indirect
8787
github.com/juju/loggo v0.0.0-20210728185423-eebad3a902c4 // indirect
8888
github.com/kkdai/bstream v1.0.0 // indirect
@@ -99,7 +99,7 @@ require (
9999
github.com/lightningnetwork/lnd/queue v1.1.1 // indirect
100100
github.com/lightningnetwork/lnd/sqldb v1.0.9 // indirect
101101
github.com/lightningnetwork/lnd/ticker v1.1.1 // indirect
102-
github.com/lightningnetwork/lnd/tlv v1.3.0 // indirect
102+
github.com/lightningnetwork/lnd/tlv v1.3.1 // indirect
103103
github.com/lightningnetwork/lnd/tor v1.1.6 // indirect
104104
github.com/ltcsuite/ltcd v0.0.0-20190101042124-f37f8bf35796 // indirect
105105
github.com/mattn/go-isatty v0.0.20 // indirect
@@ -154,14 +154,14 @@ require (
154154
go.uber.org/atomic v1.7.0 // indirect
155155
go.uber.org/multierr v1.6.0 // indirect
156156
go.uber.org/zap v1.17.0 // indirect
157-
golang.org/x/crypto v0.35.0 // indirect
157+
golang.org/x/crypto v0.36.0 // indirect
158158
golang.org/x/exp v0.0.0-20240325151524-a685a6edb6d8 // indirect
159159
golang.org/x/mod v0.17.0 // indirect
160-
golang.org/x/net v0.36.0 // indirect
161-
golang.org/x/sync v0.11.0 // indirect
162-
golang.org/x/sys v0.30.0 // indirect
163-
golang.org/x/term v0.29.0 // indirect
164-
golang.org/x/text v0.22.0 // indirect
160+
golang.org/x/net v0.38.0 // indirect
161+
golang.org/x/sync v0.12.0 // indirect
162+
golang.org/x/sys v0.31.0 // indirect
163+
golang.org/x/term v0.30.0 // indirect
164+
golang.org/x/text v0.23.0 // indirect
165165
golang.org/x/time v0.3.0 // indirect
166166
golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d // indirect
167167
google.golang.org/genproto v0.0.0-20231016165738-49dd2c1f3d0b // indirect

go.sum

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -156,8 +156,8 @@ github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre
156156
github.com/go-sql-driver/mysql v1.6.0 h1:BCTh4TKNUYmOmMUcQ3IipzF5prigylS7XXjEkfCHuOE=
157157
github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
158158
github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
159-
github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss=
160-
github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM=
159+
github.com/go-viper/mapstructure/v2 v2.4.0 h1:EBsztssimR/CONLSZZ04E8qAkxNYq4Qp9LvH92wZUgs=
160+
github.com/go-viper/mapstructure/v2 v2.4.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM=
161161
github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
162162
github.com/gofrs/uuid v4.0.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM=
163163
github.com/gofrs/uuid v4.2.0+incompatible h1:yyYWMnhkhrKwwr8gAOcOCYxOOscHgDS9yZgBrnJfGa0=
@@ -325,8 +325,8 @@ github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw=
325325
github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
326326
github.com/lightninglabs/gozmq v0.0.0-20191113021534-d20a764486bf h1:HZKvJUHlcXI/f/O0Avg7t8sqkPo78HFzjmeYFl6DPnc=
327327
github.com/lightninglabs/gozmq v0.0.0-20191113021534-d20a764486bf/go.mod h1:vxmQPeIQxPf6Jf9rM8R+B4rKBqLA2AjttNxkFBL2Plk=
328-
github.com/lightninglabs/lndclient v0.19.0-4 h1:U+koisg716/i51kf5ENI5+9a1joXcPXeJYl3q0s4/co=
329-
github.com/lightninglabs/lndclient v0.19.0-4/go.mod h1:LP3FM3JGBdvOX8Lum9x1r7q54oiftoqaq4EYhtpp/fk=
328+
github.com/lightninglabs/lndclient v0.19.0-13 h1:ULt1sWHnK5neYXAIpTZjIXlJfH9j8VPisQVMWKxpkjs=
329+
github.com/lightninglabs/lndclient v0.19.0-13/go.mod h1:h09BgfNjNZFG8ivRIhTT4Dsmm1kzZ+3YkuW0ehde4eQ=
330330
github.com/lightninglabs/neutrino v0.16.1 h1:5Kz4ToxncEVkpKC6fwUjXKtFKJhuxlG3sBB3MdJTJjs=
331331
github.com/lightninglabs/neutrino v0.16.1/go.mod h1:L+5UAccpUdyM7yDgmQySgixf7xmwBgJtOfs/IP26jCs=
332332
github.com/lightninglabs/neutrino/cache v1.1.2 h1:C9DY/DAPaPxbFC+xNNEI/z1SJY9GS3shmlu5hIQ798g=
@@ -335,8 +335,8 @@ github.com/lightninglabs/protobuf-go-hex-display v1.30.0-hex-display h1:pRdza2wl
335335
github.com/lightninglabs/protobuf-go-hex-display v1.30.0-hex-display/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
336336
github.com/lightningnetwork/lightning-onion v1.2.1-0.20240712235311-98bd56499dfb h1:yfM05S8DXKhuCBp5qSMZdtSwvJ+GFzl94KbXMNB1JDY=
337337
github.com/lightningnetwork/lightning-onion v1.2.1-0.20240712235311-98bd56499dfb/go.mod h1:c0kvRShutpj3l6B9WtTsNTBUtjSmjZXbJd9ZBRQOSKI=
338-
github.com/lightningnetwork/lnd v0.19.0-beta.rc2.0.20250423092132-a35ace7371af h1:+t8N7kmI7YVu7Hzv8pPiMVCTjnSRi/qOxbAkXa5rn+0=
339-
github.com/lightningnetwork/lnd v0.19.0-beta.rc2.0.20250423092132-a35ace7371af/go.mod h1:nCkZ6G6twxDKn31117M0BNfN5JSAmJVAHNTwYrn31BQ=
338+
github.com/lightningnetwork/lnd v0.19.0-beta h1:/8i2UdARiEpI2iAmPoSDcwZSSEuWqXyfsMxz/mLGbdw=
339+
github.com/lightningnetwork/lnd v0.19.0-beta/go.mod h1:hu6zo1zcznx7nViiFlJY8qGDwwGw5LNLdGJ7ICz5Ysc=
340340
github.com/lightningnetwork/lnd/clock v1.1.1 h1:OfR3/zcJd2RhH0RU+zX/77c0ZiOnIMsDIBjgjWdZgA0=
341341
github.com/lightningnetwork/lnd/clock v1.1.1/go.mod h1:mGnAhPyjYZQJmebS7aevElXKTFDuO+uNFFfMXK1W8xQ=
342342
github.com/lightningnetwork/lnd/fn/v2 v2.0.8 h1:r2SLz7gZYQPVc3IZhU82M66guz3Zk2oY+Rlj9QN5S3g=
@@ -351,8 +351,8 @@ github.com/lightningnetwork/lnd/sqldb v1.0.9 h1:7OHi+Hui823mB/U9NzCdlZTAGSVdDCbj
351351
github.com/lightningnetwork/lnd/sqldb v1.0.9/go.mod h1:OG09zL/PHPaBJefp4HsPz2YLUJ+zIQHbpgCtLnOx8I4=
352352
github.com/lightningnetwork/lnd/ticker v1.1.1 h1:J/b6N2hibFtC7JLV77ULQp++QLtCwT6ijJlbdiZFbSM=
353353
github.com/lightningnetwork/lnd/ticker v1.1.1/go.mod h1:waPTRAAcwtu7Ji3+3k+u/xH5GHovTsCoSVpho0KDvdA=
354-
github.com/lightningnetwork/lnd/tlv v1.3.0 h1:exS/KCPEgpOgviIttfiXAPaUqw2rHQrnUOpP7HPBPiY=
355-
github.com/lightningnetwork/lnd/tlv v1.3.0/go.mod h1:pJuiBj1ecr1WWLOtcZ+2+hu9Ey25aJWFIsjmAoPPnmc=
354+
github.com/lightningnetwork/lnd/tlv v1.3.1 h1:o7CZg06y+rJZfUMAo0WzBLr0pgBWCzrt0f9gpujYUzk=
355+
github.com/lightningnetwork/lnd/tlv v1.3.1/go.mod h1:pJuiBj1ecr1WWLOtcZ+2+hu9Ey25aJWFIsjmAoPPnmc=
356356
github.com/lightningnetwork/lnd/tor v1.1.6 h1:WHUumk7WgU6BUFsqHuqszI9P6nfhMeIG+rjJBlVE6OE=
357357
github.com/lightningnetwork/lnd/tor v1.1.6/go.mod h1:qSRB8llhAK+a6kaTPWOLLXSZc6Hg8ZC0mq1sUQ/8JfI=
358358
github.com/ltcsuite/ltcd v0.0.0-20190101042124-f37f8bf35796 h1:sjOGyegMIhvgfq5oaue6Td+hxZuf3tDC8lAPrFldqFw=
@@ -546,8 +546,8 @@ golang.org/x/crypto v0.0.0-20201203163018-be400aefbc4c/go.mod h1:jdWPYTVW3xRLrWP
546546
golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
547547
golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
548548
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
549-
golang.org/x/crypto v0.35.0 h1:b15kiHdrGCHrP6LvwaQ3c03kgNhhiMgvlhxHQhmg2Xs=
550-
golang.org/x/crypto v0.35.0/go.mod h1:dy7dXNW32cAb/6/PRuTNsix8T+vJAqvuIy5Bli/x0YQ=
549+
golang.org/x/crypto v0.36.0 h1:AnAEvhDddvBdpY+uR+MyHmuZzzNqXSe/GvuDeob5L34=
550+
golang.org/x/crypto v0.36.0/go.mod h1:Y4J0ReaxCR1IMaabaSMugxJES1EpwhBHhv2bDHklZvc=
551551
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
552552
golang.org/x/exp v0.0.0-20240325151524-a685a6edb6d8 h1:aAcj0Da7eBAtrTp03QXWvm88pSyOt+UgdZw2BFZ+lEw=
553553
golang.org/x/exp v0.0.0-20240325151524-a685a6edb6d8/go.mod h1:CQ1k9gNrJ50XIzaKCRR2hssIjF07kZFEiieALBM/ARQ=
@@ -580,8 +580,8 @@ golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwY
580580
golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
581581
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
582582
golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
583-
golang.org/x/net v0.36.0 h1:vWF2fRbw4qslQsQzgFqZff+BItCvGFQqKzKIzx1rmoA=
584-
golang.org/x/net v0.36.0/go.mod h1:bFmbeoIPfrw4sMHNhb4J9f6+tPziuGjq7Jk/38fxi1I=
583+
golang.org/x/net v0.38.0 h1:vRMAPTMaeGqVhG5QyLJHqNDwecKTomGeqbnfZyKlBI8=
584+
golang.org/x/net v0.38.0/go.mod h1:ivrbrMbzFq5J41QOQh0siUuly180yBYtLp+CKbEaFx8=
585585
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
586586
golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
587587
golang.org/x/oauth2 v0.14.0 h1:P0Vrf/2538nmC0H+pEQ3MNFRRnVR7RlqyVw+bvm26z0=
@@ -594,8 +594,8 @@ golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJ
594594
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
595595
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
596596
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
597-
golang.org/x/sync v0.11.0 h1:GGz8+XQP4FvTTrjZPzNKTMFtSXH80RAzG+5ghFPgK9w=
598-
golang.org/x/sync v0.11.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
597+
golang.org/x/sync v0.12.0 h1:MHc5BpPuC30uJk597Ri8TV3CNZcTLu6B6z4lJy+g6Jw=
598+
golang.org/x/sync v0.12.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=
599599
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
600600
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
601601
golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
@@ -624,22 +624,22 @@ golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBc
624624
golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
625625
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
626626
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
627-
golang.org/x/sys v0.30.0 h1:QjkSwP/36a20jFYWkSue1YwXzLmsV5Gfq7Eiy72C1uc=
628-
golang.org/x/sys v0.30.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
627+
golang.org/x/sys v0.31.0 h1:ioabZlmFYtWhL+TRYpcnNlLwhyxaM9kWTDEmfnprqik=
628+
golang.org/x/sys v0.31.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
629629
golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
630630
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
631631
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
632-
golang.org/x/term v0.29.0 h1:L6pJp37ocefwRRtYPKSWOWzOtWSxVajvz2ldH/xi3iU=
633-
golang.org/x/term v0.29.0/go.mod h1:6bl4lRlvVuDgSf3179VpIxBF0o10JUpXWOnI7nErv7s=
632+
golang.org/x/term v0.30.0 h1:PQ39fJZ+mfadBm0y5WlL4vlM7Sx1Hgf13sMIY2+QS9Y=
633+
golang.org/x/term v0.30.0/go.mod h1:NYYFdzHoI5wRh/h5tDMdMqCqPJZEuNqVR5xJLd/n67g=
634634
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
635635
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
636636
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
637637
golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
638638
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
639639
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
640640
golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ=
641-
golang.org/x/text v0.22.0 h1:bofq7m3/HAFvbF51jz3Q9wLg3jkvSPuiZu/pD1XwgtM=
642-
golang.org/x/text v0.22.0/go.mod h1:YRoo4H8PVmsu+E3Ou7cqLVH8oXWIHVoX0jqUWALQhfY=
641+
golang.org/x/text v0.23.0 h1:D71I7dUrlY+VX0gQShAThNGHFxZ13dGLBHQLVl1mJlY=
642+
golang.org/x/text v0.23.0/go.mod h1:/BLNzu4aZCJ1+kcD0DNRotWKage4q2rGVAg4o22unh4=
643643
golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4=
644644
golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
645645
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=

0 commit comments

Comments
 (0)