Skip to content

Commit d67656d

Browse files
committed
Add support for metrics api
1 parent 6aa8abe commit d67656d

File tree

6 files changed

+597
-1
lines changed

6 files changed

+597
-1
lines changed
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
// Copyright (C) 2019-2024, Ava Labs, Inc. All rights reserved.
2+
// See the file LICENSE for licensing terms.
3+
4+
package connecthandler
5+
6+
import (
7+
"context"
8+
9+
"connectrpc.com/connect"
10+
"github.com/prometheus/client_golang/prometheus"
11+
12+
metricsv1 "github.com/ava-labs/avalanchego/proto/pb/metrics/v1"
13+
dto "github.com/prometheus/client_model/go"
14+
)
15+
16+
type ConnectMetricsService struct {
17+
Service prometheus.Gatherer
18+
}
19+
20+
func NewConnectMetricsService(service prometheus.Gatherer) *ConnectMetricsService {
21+
return &ConnectMetricsService{
22+
Service: service,
23+
}
24+
}
25+
26+
func (s *ConnectMetricsService) GetMetrics(_ context.Context, _ *connect.Request[metricsv1.MetricsRequest]) (
27+
*connect.Response[metricsv1.MetricsReply], error) {
28+
mfs, err := s.Service.Gather()
29+
if err != nil {
30+
return nil, connect.NewError(connect.CodeInternal, err)
31+
}
32+
33+
var metricsProtoList []*metricsv1.Metric
34+
35+
for _, mf := range mfs {
36+
for _, m := range mf.Metric {
37+
labels := make(map[string]string, len(m.Label))
38+
for _, label := range m.Label {
39+
labels[label.GetName()] = label.GetValue()
40+
}
41+
42+
var value float64
43+
switch mf.GetType() {
44+
case dto.MetricType_COUNTER:
45+
if m.Counter != nil {
46+
value = m.Counter.GetValue()
47+
}
48+
case dto.MetricType_GAUGE:
49+
if m.Gauge != nil {
50+
value = m.Gauge.GetValue()
51+
}
52+
default:
53+
// Skip histograms, summaries, and untyped metrics
54+
continue
55+
}
56+
57+
metricsProtoList = append(metricsProtoList, &metricsv1.Metric{
58+
Name: mf.GetName(),
59+
Type: mf.GetType().String(),
60+
Help: mf.GetHelp(),
61+
Value: value,
62+
Labels: labels,
63+
})
64+
}
65+
}
66+
67+
return connect.NewResponse(&metricsv1.MetricsReply{
68+
Metrics: metricsProtoList,
69+
}), nil
70+
}

node/node.go

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ import (
5151
"github.com/ava-labs/avalanchego/proto/pb/admin/v1/adminv1connect"
5252
"github.com/ava-labs/avalanchego/proto/pb/health/v1/healthv1connect"
5353
"github.com/ava-labs/avalanchego/proto/pb/info/v1/infov1connect"
54+
"github.com/ava-labs/avalanchego/proto/pb/metrics/v1/metricsv1connect"
5455
"github.com/ava-labs/avalanchego/snow"
5556
"github.com/ava-labs/avalanchego/snow/networking/benchlist"
5657
"github.com/ava-labs/avalanchego/snow/networking/router"
@@ -85,6 +86,7 @@ import (
8586
adminconnect "github.com/ava-labs/avalanchego/api/admin/connecthandler"
8687
healthconnect "github.com/ava-labs/avalanchego/api/health/connecthandler"
8788
infoconnect "github.com/ava-labs/avalanchego/api/info/connecthandler"
89+
metricsconnect "github.com/ava-labs/avalanchego/api/metrics/connecthandler"
8890
databasefactory "github.com/ava-labs/avalanchego/database/factory"
8991
avmconfig "github.com/ava-labs/avalanchego/vms/avm/config"
9092
platformconfig "github.com/ava-labs/avalanchego/vms/platformvm/config"
@@ -792,7 +794,7 @@ func (n *Node) initDatabase() error {
792794
rawExpectedGenesisHash := hashing.ComputeHash256(n.Config.GenesisBytes)
793795

794796
rawGenesisHash, err := n.DB.Get(genesisHashKey)
795-
if err == database.ErrNotFound {
797+
if errors.Is(err, database.ErrNotFound) {
796798
rawGenesisHash = rawExpectedGenesisHash
797799
err = n.DB.Put(genesisHashKey, rawGenesisHash)
798800
}
@@ -1285,6 +1287,20 @@ func (n *Node) initMetricsAPI() error {
12851287

12861288
n.Log.Info("initializing metrics API")
12871289

1290+
metricsServicePattern, metricsServiceHandler := metricsv1connect.NewMetricsServiceHandler(
1291+
metricsconnect.NewConnectMetricsService(n.MetricsGatherer),
1292+
)
1293+
1294+
reflectionPattern, reflectionHandler := grpcreflect.NewHandlerV1(
1295+
grpcreflect.NewStaticReflector(metricsv1connect.MetricsServiceName),
1296+
)
1297+
1298+
mux := http.NewServeMux()
1299+
mux.Handle(reflectionPattern, reflectionHandler)
1300+
mux.Handle(metricsServicePattern, metricsServiceHandler)
1301+
1302+
n.APIServer.AddHeaderRoute("metrics", mux)
1303+
12881304
return n.APIServer.AddRoute(
12891305
promhttp.HandlerFor(
12901306
n.MetricsGatherer,

proto/metrics/v1/service.proto

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
syntax = "proto3";
2+
package metrics.v1;
3+
4+
option go_package = "github.com/ava-labs/avalanchego/proto/pb/metrics/v1;metricsv1";
5+
6+
service MetricsService {
7+
rpc GetMetrics (MetricsRequest) returns (MetricsReply);
8+
}
9+
10+
message MetricsRequest {}
11+
12+
message MetricsReply {
13+
repeated Metric metrics = 1;
14+
}
15+
16+
message Metric {
17+
string name = 1;
18+
string type = 2;
19+
string help = 3;
20+
double value = 4;
21+
map<string, string> labels = 5;
22+
}

proto/pb/metrics/v1/metricsv1connect/service.connect.go

Lines changed: 112 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)