Skip to content

Commit 496ef84

Browse files
committed
feat: add metrics
Signed-off-by: Armando Ruocco <[email protected]>
1 parent 3fa8072 commit 496ef84

File tree

5 files changed

+164
-36
lines changed

5 files changed

+164
-36
lines changed

go.mod

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -7,27 +7,28 @@ require (
77
github.com/cloudnative-pg/api v1.26.0
88
github.com/cloudnative-pg/barman-cloud v0.3.1
99
github.com/cloudnative-pg/cloudnative-pg v1.26.0
10-
github.com/cloudnative-pg/cnpg-i v0.2.1
10+
github.com/cloudnative-pg/cnpg-i v0.2.2-0.20250723093238-963c368523c2
1111
github.com/cloudnative-pg/cnpg-i-machinery v0.4.0
1212
github.com/cloudnative-pg/machinery v0.3.0
1313
github.com/onsi/ginkgo/v2 v2.23.4
1414
github.com/onsi/gomega v1.37.0
1515
github.com/spf13/cobra v1.9.1
1616
github.com/spf13/viper v1.20.1
17-
google.golang.org/grpc v1.73.0
17+
google.golang.org/grpc v1.74.2
1818
gopkg.in/yaml.v3 v3.0.1
1919
k8s.io/api v0.33.2
2020
k8s.io/apiextensions-apiserver v0.33.2
2121
k8s.io/apimachinery v0.33.2
2222
k8s.io/client-go v0.33.2
23+
k8s.io/component-base v0.33.2
2324
k8s.io/utils v0.0.0-20250604170112-4c0f3b243397
2425
sigs.k8s.io/controller-runtime v0.21.0
2526
sigs.k8s.io/kustomize/api v0.20.0
2627
sigs.k8s.io/kustomize/kyaml v0.20.0
2728
)
2829

2930
require (
30-
cel.dev/expr v0.23.1 // indirect
31+
cel.dev/expr v0.24.0 // indirect
3132
github.com/antlr4-go/antlr/v4 v4.13.1 // indirect
3233
github.com/beorn7/perks v1.0.1 // indirect
3334
github.com/blang/semver/v4 v4.0.0 // indirect
@@ -91,35 +92,34 @@ require (
9192
github.com/xlab/treeprint v1.2.0 // indirect
9293
go.opentelemetry.io/auto/sdk v1.1.0 // indirect
9394
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.58.0 // indirect
94-
go.opentelemetry.io/otel v1.35.0 // indirect
95+
go.opentelemetry.io/otel v1.36.0 // indirect
9596
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.33.0 // indirect
9697
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.33.0 // indirect
97-
go.opentelemetry.io/otel/metric v1.35.0 // indirect
98-
go.opentelemetry.io/otel/sdk v1.35.0 // indirect
99-
go.opentelemetry.io/otel/trace v1.35.0 // indirect
98+
go.opentelemetry.io/otel/metric v1.36.0 // indirect
99+
go.opentelemetry.io/otel/sdk v1.36.0 // indirect
100+
go.opentelemetry.io/otel/trace v1.36.0 // indirect
100101
go.opentelemetry.io/proto/otlp v1.4.0 // indirect
101102
go.uber.org/automaxprocs v1.6.0 // indirect
102103
go.uber.org/multierr v1.11.0 // indirect
103104
go.uber.org/zap v1.27.0 // indirect
104105
go.yaml.in/yaml/v2 v2.4.2 // indirect
105106
go.yaml.in/yaml/v3 v3.0.3 // indirect
106107
golang.org/x/exp v0.0.0-20241217172543-b2144cdd0a67 // indirect
107-
golang.org/x/net v0.38.0 // indirect
108-
golang.org/x/oauth2 v0.28.0 // indirect
108+
golang.org/x/net v0.40.0 // indirect
109+
golang.org/x/oauth2 v0.30.0 // indirect
109110
golang.org/x/sync v0.14.0 // indirect
110111
golang.org/x/sys v0.33.0 // indirect
111112
golang.org/x/term v0.32.0 // indirect
112113
golang.org/x/text v0.25.0 // indirect
113114
golang.org/x/time v0.9.0 // indirect
114115
golang.org/x/tools v0.31.0 // indirect
115116
gomodules.xyz/jsonpatch/v2 v2.4.0 // indirect
116-
google.golang.org/genproto/googleapis/api v0.0.0-20250324211829-b45e905df463 // indirect
117-
google.golang.org/genproto/googleapis/rpc v0.0.0-20250324211829-b45e905df463 // indirect
117+
google.golang.org/genproto/googleapis/api v0.0.0-20250528174236-200df99c418a // indirect
118+
google.golang.org/genproto/googleapis/rpc v0.0.0-20250528174236-200df99c418a // indirect
118119
google.golang.org/protobuf v1.36.6 // indirect
119120
gopkg.in/evanphx/json-patch.v4 v4.12.0 // indirect
120121
gopkg.in/inf.v0 v0.9.1 // indirect
121122
k8s.io/apiserver v0.33.2 // indirect
122-
k8s.io/component-base v0.33.2 // indirect
123123
k8s.io/klog/v2 v2.130.1 // indirect
124124
k8s.io/kube-openapi v0.0.0-20250318190949-c8a335a9a2ff // indirect
125125
sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.31.2 // indirect

go.sum

Lines changed: 24 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
cel.dev/expr v0.23.1 h1:K4KOtPCJQjVggkARsjG9RWXP6O4R73aHeJMa/dmCQQg=
2-
cel.dev/expr v0.23.1/go.mod h1:hLPLo1W4QUmuYdA72RBX06QTs6MXw941piREPl3Yfiw=
1+
cel.dev/expr v0.24.0 h1:56OvJKSH3hDGL0ml5uSxZmz3/3Pq4tJ+fb1unVLAFcY=
2+
cel.dev/expr v0.24.0/go.mod h1:hLPLo1W4QUmuYdA72RBX06QTs6MXw941piREPl3Yfiw=
33
github.com/antlr4-go/antlr/v4 v4.13.1 h1:SqQKkuVZ+zWkMMNkjy5FZe5mr5WURWnlpmOuzYWrPrQ=
44
github.com/antlr4-go/antlr/v4 v4.13.1/go.mod h1:GKmUxMtwp6ZgGwZSva4eWPC5mS6vUAmOABFgjdkM7Nw=
55
github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio=
@@ -22,8 +22,8 @@ github.com/cloudnative-pg/barman-cloud v0.3.1 h1:kzkY77k2lN/caoyh7ibXDSZjJeSJTNv
2222
github.com/cloudnative-pg/barman-cloud v0.3.1/go.mod h1:4HL3AjY9oEl2Ed0HSkyvTZEQPhwyFOaAnuCz9lfVeYQ=
2323
github.com/cloudnative-pg/cloudnative-pg v1.26.0 h1:X+ayWg6TXqglziSPejKiviPTf/CSh4AmYXx1mrS3i8s=
2424
github.com/cloudnative-pg/cloudnative-pg v1.26.0/go.mod h1:aNh0g7UHKxyka4HYOqLaYDWtZ6tORQ7HbIHLvb79sx8=
25-
github.com/cloudnative-pg/cnpg-i v0.2.1 h1:g96BE1ojdiFtDwtb7tg5wUF9a2kAh0eVg4SkjsO8jnk=
26-
github.com/cloudnative-pg/cnpg-i v0.2.1/go.mod h1:kPfJpPGAKN1/2xvwBcC3WzMP46pj3sKLHLNB8NHr77U=
25+
github.com/cloudnative-pg/cnpg-i v0.2.2-0.20250723093238-963c368523c2 h1:uLooqDE54OE0tBMdwHws1CwD3X4098K9oZyNt3xdQuE=
26+
github.com/cloudnative-pg/cnpg-i v0.2.2-0.20250723093238-963c368523c2/go.mod h1:pJaTIy0d6Yd3CA554AHZD81CJM7/jiDNmk7BFTMb3Fk=
2727
github.com/cloudnative-pg/cnpg-i-machinery v0.4.0 h1:16wQt9qFFqvyxeg+9dPt8ic8dh3PRPq0jCGXVuZyjO4=
2828
github.com/cloudnative-pg/cnpg-i-machinery v0.4.0/go.mod h1:4MCJzbCOsB7ianxlm8rqD+gDpkgVTHoTuglle/i72WA=
2929
github.com/cloudnative-pg/machinery v0.3.0 h1:t1DzXGeK3RUYXS5KWIdIk30oh4EmwxZ+6sWM4wJDBac=
@@ -202,20 +202,20 @@ go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJyS
202202
go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A=
203203
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.58.0 h1:yd02MEjBdJkG3uabWP9apV+OuWRIXGDuJEUJbOHmCFU=
204204
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.58.0/go.mod h1:umTcuxiv1n/s/S6/c2AT/g2CQ7u5C59sHDNmfSwgz7Q=
205-
go.opentelemetry.io/otel v1.35.0 h1:xKWKPxrxB6OtMCbmMY021CqC45J+3Onta9MqjhnusiQ=
206-
go.opentelemetry.io/otel v1.35.0/go.mod h1:UEqy8Zp11hpkUrL73gSlELM0DupHoiq72dR+Zqel/+Y=
205+
go.opentelemetry.io/otel v1.36.0 h1:UumtzIklRBY6cI/lllNZlALOF5nNIzJVb16APdvgTXg=
206+
go.opentelemetry.io/otel v1.36.0/go.mod h1:/TcFMXYjyRNh8khOAO9ybYkqaDBb/70aVwkNML4pP8E=
207207
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.33.0 h1:Vh5HayB/0HHfOQA7Ctx69E/Y/DcQSMPpKANYVMQ7fBA=
208208
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.33.0/go.mod h1:cpgtDBaqD/6ok/UG0jT15/uKjAY8mRA53diogHBg3UI=
209209
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.33.0 h1:5pojmb1U1AogINhN3SurB+zm/nIcusopeBNp42f45QM=
210210
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.33.0/go.mod h1:57gTHJSE5S1tqg+EKsLPlTWhpHMsWlVmer+LA926XiA=
211-
go.opentelemetry.io/otel/metric v1.35.0 h1:0znxYu2SNyuMSQT4Y9WDWej0VpcsxkuklLa4/siN90M=
212-
go.opentelemetry.io/otel/metric v1.35.0/go.mod h1:nKVFgxBZ2fReX6IlyW28MgZojkoAkJGaE8CpgeAU3oE=
213-
go.opentelemetry.io/otel/sdk v1.35.0 h1:iPctf8iprVySXSKJffSS79eOjl9pvxV9ZqOWT0QejKY=
214-
go.opentelemetry.io/otel/sdk v1.35.0/go.mod h1:+ga1bZliga3DxJ3CQGg3updiaAJoNECOgJREo9KHGQg=
215-
go.opentelemetry.io/otel/sdk/metric v1.35.0 h1:1RriWBmCKgkeHEhM7a2uMjMUfP7MsOF5JpUCaEqEI9o=
216-
go.opentelemetry.io/otel/sdk/metric v1.35.0/go.mod h1:is6XYCUMpcKi+ZsOvfluY5YstFnhW0BidkR+gL+qN+w=
217-
go.opentelemetry.io/otel/trace v1.35.0 h1:dPpEfJu1sDIqruz7BHFG3c7528f6ddfSWfFDVt/xgMs=
218-
go.opentelemetry.io/otel/trace v1.35.0/go.mod h1:WUk7DtFp1Aw2MkvqGdwiXYDZZNvA/1J8o6xRXLrIkyc=
211+
go.opentelemetry.io/otel/metric v1.36.0 h1:MoWPKVhQvJ+eeXWHFBOPoBOi20jh6Iq2CcCREuTYufE=
212+
go.opentelemetry.io/otel/metric v1.36.0/go.mod h1:zC7Ks+yeyJt4xig9DEw9kuUFe5C3zLbVjV2PzT6qzbs=
213+
go.opentelemetry.io/otel/sdk v1.36.0 h1:b6SYIuLRs88ztox4EyrvRti80uXIFy+Sqzoh9kFULbs=
214+
go.opentelemetry.io/otel/sdk v1.36.0/go.mod h1:+lC+mTgD+MUWfjJubi2vvXWcVxyr9rmlshZni72pXeY=
215+
go.opentelemetry.io/otel/sdk/metric v1.36.0 h1:r0ntwwGosWGaa0CrSt8cuNuTcccMXERFwHX4dThiPis=
216+
go.opentelemetry.io/otel/sdk/metric v1.36.0/go.mod h1:qTNOhFDfKRwX0yXOqJYegL5WRaW376QbB7P4Pb0qva4=
217+
go.opentelemetry.io/otel/trace v1.36.0 h1:ahxWNuqZjpdiFAyrIoQ4GIiAIhxAunQR6MUoKrsNd4w=
218+
go.opentelemetry.io/otel/trace v1.36.0/go.mod h1:gQ+OnDZzrybY4k4seLzPAWNwVBBVlF2szhehOBB/tGA=
219219
go.opentelemetry.io/proto/otlp v1.4.0 h1:TA9WRvW6zMwP+Ssb6fLoUIuirti1gGbP28GcKG1jgeg=
220220
go.opentelemetry.io/proto/otlp v1.4.0/go.mod h1:PPBWZIP98o2ElSqI35IHfu7hIhSwvc5N38Jw8pXuGFY=
221221
go.uber.org/automaxprocs v1.6.0 h1:O3y2/QNTOdbF+e/dpXNNW7Rx2hZ4sTIPyybbxyNqTUs=
@@ -241,10 +241,10 @@ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn
241241
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
242242
golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
243243
golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
244-
golang.org/x/net v0.38.0 h1:vRMAPTMaeGqVhG5QyLJHqNDwecKTomGeqbnfZyKlBI8=
245-
golang.org/x/net v0.38.0/go.mod h1:ivrbrMbzFq5J41QOQh0siUuly180yBYtLp+CKbEaFx8=
246-
golang.org/x/oauth2 v0.28.0 h1:CrgCKl8PPAVtLnU3c+EDw6x11699EWlsDeWNWKdIOkc=
247-
golang.org/x/oauth2 v0.28.0/go.mod h1:onh5ek6nERTohokkhCD/y2cV4Do3fxFHFuAejCkRWT8=
244+
golang.org/x/net v0.40.0 h1:79Xs7wF06Gbdcg4kdCCIQArK11Z1hr5POQ6+fIYHNuY=
245+
golang.org/x/net v0.40.0/go.mod h1:y0hY0exeL2Pku80/zKK7tpntoX23cqL3Oa6njdgRtds=
246+
golang.org/x/oauth2 v0.30.0 h1:dnDm7JmhM45NNpd8FDDeLhK6FwqbOf4MLCM9zb1BOHI=
247+
golang.org/x/oauth2 v0.30.0/go.mod h1:B++QgG3ZKulg6sRPGD/mqlHQs5rB3Ml9erfeDY7xKlU=
248248
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
249249
golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
250250
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
@@ -275,12 +275,12 @@ golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8T
275275
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
276276
gomodules.xyz/jsonpatch/v2 v2.4.0 h1:Ci3iUJyx9UeRx7CeFN8ARgGbkESwJK+KB9lLcWxY/Zw=
277277
gomodules.xyz/jsonpatch/v2 v2.4.0/go.mod h1:AH3dM2RI6uoBZxn3LVrfvJ3E0/9dG4cSrbuBJT4moAY=
278-
google.golang.org/genproto/googleapis/api v0.0.0-20250324211829-b45e905df463 h1:hE3bRWtU6uceqlh4fhrSnUyjKHMKB9KrTLLG+bc0ddM=
279-
google.golang.org/genproto/googleapis/api v0.0.0-20250324211829-b45e905df463/go.mod h1:U90ffi8eUL9MwPcrJylN5+Mk2v3vuPDptd5yyNUiRR8=
280-
google.golang.org/genproto/googleapis/rpc v0.0.0-20250324211829-b45e905df463 h1:e0AIkUUhxyBKh6ssZNrAMeqhA7RKUj42346d1y02i2g=
281-
google.golang.org/genproto/googleapis/rpc v0.0.0-20250324211829-b45e905df463/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A=
282-
google.golang.org/grpc v1.73.0 h1:VIWSmpI2MegBtTuFt5/JWy2oXxtjJ/e89Z70ImfD2ok=
283-
google.golang.org/grpc v1.73.0/go.mod h1:50sbHOUqWoCQGI8V2HQLJM0B+LMlIUjNSZmow7EVBQc=
278+
google.golang.org/genproto/googleapis/api v0.0.0-20250528174236-200df99c418a h1:SGktgSolFCo75dnHJF2yMvnns6jCmHFJ0vE4Vn2JKvQ=
279+
google.golang.org/genproto/googleapis/api v0.0.0-20250528174236-200df99c418a/go.mod h1:a77HrdMjoeKbnd2jmgcWdaS++ZLZAEq3orIOAEIKiVw=
280+
google.golang.org/genproto/googleapis/rpc v0.0.0-20250528174236-200df99c418a h1:v2PbRU4K3llS09c7zodFpNePeamkAwG3mPrAery9VeE=
281+
google.golang.org/genproto/googleapis/rpc v0.0.0-20250528174236-200df99c418a/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A=
282+
google.golang.org/grpc v1.74.2 h1:WoosgB65DlWVC9FqI82dGsZhWFNBSLjQ84bjROOpMu4=
283+
google.golang.org/grpc v1.74.2/go.mod h1:CtQ+BGjaAIXHs/5YS3i473GqwBBa1zGQNevxdeBEXrM=
284284
google.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY=
285285
google.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY=
286286
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=

internal/cnpgi/instance/manager.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ func Start(ctx context.Context) error {
3535
controllerOptions := ctrl.Options{
3636
Scheme: scheme,
3737
Client: client.Options{
38+
// NOTE WE WILL MODIFY THE GENERATE CLIENT WITH A CUSTOM CACHE
3839
Cache: &client.CacheOptions{
3940
DisableFor: []client.Object{
4041
&corev1.Secret{},

internal/cnpgi/instance/metrics.go

Lines changed: 123 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,123 @@
1+
package instance
2+
3+
import (
4+
"context"
5+
"fmt"
6+
barmancloudv1 "github.com/cloudnative-pg/plugin-barman-cloud/api/v1"
7+
"github.com/cloudnative-pg/plugin-barman-cloud/internal/cnpgi/metadata"
8+
"github.com/cloudnative-pg/plugin-barman-cloud/internal/cnpgi/operator/config"
9+
"sigs.k8s.io/controller-runtime/pkg/client"
10+
"strings"
11+
12+
"github.com/cloudnative-pg/cnpg-i/pkg/metrics"
13+
"github.com/cloudnative-pg/machinery/pkg/log"
14+
)
15+
16+
var (
17+
// Sanitize the plugin name to be a valid Prometheus metric namespace
18+
metricsDomain = strings.NewReplacer(".", "_", "-", "_").Replace(metadata.PluginName)
19+
)
20+
21+
type metricsImpl struct {
22+
// important the client should be one with a underlying cache
23+
Client client.Client
24+
metrics.UnimplementedMetricsServer
25+
}
26+
27+
func buildFqName(name string) string {
28+
// Build the fully qualified name for the metric
29+
return fmt.Sprintf("%s_%s", metricsDomain, strings.NewReplacer(".", "_", "-", "_").Replace(name))
30+
}
31+
32+
var (
33+
firstRecoverabilityPointMetricName = buildFqName("first_recoverability_point")
34+
lastAvailableBackupTimestampMetricName = buildFqName("last_available_backup_timestamp")
35+
testMetricName = buildFqName("test_metric")
36+
)
37+
38+
func (m metricsImpl) GetCapabilities(
39+
ctx context.Context,
40+
_ *metrics.MetricsCapabilitiesRequest,
41+
) (*metrics.MetricsCapabilitiesResult, error) {
42+
contextLogger := log.FromContext(ctx)
43+
contextLogger.Trace("metrics capabilities call received")
44+
45+
return &metrics.MetricsCapabilitiesResult{
46+
Capabilities: []*metrics.MetricsCapability{
47+
{
48+
Type: &metrics.MetricsCapability_Rpc{
49+
Rpc: &metrics.MetricsCapability_RPC{
50+
Type: metrics.MetricsCapability_RPC_TYPE_METRICS,
51+
},
52+
},
53+
},
54+
},
55+
}, nil
56+
}
57+
58+
func (m metricsImpl) Define(
59+
ctx context.Context,
60+
_ *metrics.DefineMetricsRequest,
61+
) (*metrics.DefineMetricsResult, error) {
62+
contextLogger := log.FromContext(ctx)
63+
contextLogger.Trace("metrics define call received")
64+
65+
return &metrics.DefineMetricsResult{
66+
Metrics: []*metrics.Metric{
67+
{
68+
FqName: testMetricName,
69+
Help: "this is a test metric",
70+
VariableLabels: nil,
71+
ConstLabels: map[string]string{"test": "value"},
72+
ValueType: &metrics.MetricType{Type: metrics.MetricType_TYPE_GAUGE},
73+
},
74+
{
75+
FqName: firstRecoverabilityPointMetricName,
76+
Help: "The first point of recoverability for the cluster as a unix timestamp",
77+
},
78+
{
79+
FqName: lastAvailableBackupTimestampMetricName,
80+
Help: "The last available backup as a unix timestamp",
81+
},
82+
},
83+
}, nil
84+
}
85+
86+
func (m metricsImpl) Collect(
87+
ctx context.Context,
88+
req *metrics.CollectMetricsRequest,
89+
) (*metrics.CollectMetricsResult, error) {
90+
contextLogger := log.FromContext(ctx)
91+
contextLogger.Trace("metrics collect call received")
92+
93+
configuration, err := config.NewFromClusterJSON(req.ClusterDefinition)
94+
if err != nil {
95+
contextLogger.Error(err, "while creating configuration from cluster definition")
96+
return nil, fmt.Errorf("while creating configuration from cluster definition: %w", err)
97+
}
98+
99+
var objectStore barmancloudv1.ObjectStore
100+
if err := m.Client.Get(ctx, configuration.GetBarmanObjectKey(), &objectStore); err != nil {
101+
contextLogger.Error(err, "while getting object store", "key", configuration.GetRecoveryBarmanObjectKey())
102+
return nil, err
103+
}
104+
105+
x := objectStore.Status.ServerRecoveryWindow[configuration.ServerName]
106+
107+
return &metrics.CollectMetricsResult{
108+
Metrics: []*metrics.CollectMetric{
109+
{
110+
FqName: testMetricName,
111+
Value: 42.0,
112+
},
113+
{
114+
FqName: firstRecoverabilityPointMetricName,
115+
Value: float64(x.FirstRecoverabilityPoint.Unix()),
116+
},
117+
{
118+
FqName: lastAvailableBackupTimestampMetricName,
119+
Value: float64(x.LastSuccessfulBackupTime.Unix()),
120+
},
121+
},
122+
}, nil
123+
}

internal/cnpgi/instance/start.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55

66
"github.com/cloudnative-pg/cnpg-i-machinery/pkg/pluginhelper/http"
77
"github.com/cloudnative-pg/cnpg-i/pkg/backup"
8+
"github.com/cloudnative-pg/cnpg-i/pkg/metrics"
89
"github.com/cloudnative-pg/cnpg-i/pkg/wal"
910
"google.golang.org/grpc"
1011
"sigs.k8s.io/controller-runtime/pkg/client"
@@ -37,6 +38,9 @@ func (c *CNPGI) Start(ctx context.Context) error {
3738
Client: c.Client,
3839
InstanceName: c.InstanceName,
3940
})
41+
metrics.RegisterMetricsServer(server, &metricsImpl{
42+
Client: c.Client,
43+
})
4044
common.AddHealthCheck(server)
4145
return nil
4246
}

0 commit comments

Comments
 (0)