@@ -4,12 +4,13 @@ import (
4
4
"context"
5
5
"errors"
6
6
"fmt"
7
- "io/ioutil"
8
7
"net/http"
8
+ "os"
9
9
"path/filepath"
10
10
"sync"
11
11
"time"
12
12
13
+ "github.com/bufbuild/connect-go"
13
14
"github.com/fsnotify/fsnotify"
14
15
"github.com/go-kit/log"
15
16
"github.com/go-kit/log/level"
@@ -20,11 +21,15 @@ import (
20
21
"github.com/prometheus/client_golang/prometheus/promhttp"
21
22
"github.com/prometheus/prometheus/model/labels"
22
23
"github.com/prometheus/prometheus/promql/parser"
24
+ "golang.org/x/net/http2"
25
+ "golang.org/x/net/http2/h2c"
23
26
"sigs.k8s.io/yaml"
24
27
25
28
"github.com/pyrra-dev/pyrra/kubernetes/api/v1alpha1"
26
29
"github.com/pyrra-dev/pyrra/openapi"
27
30
openapiserver "github.com/pyrra-dev/pyrra/openapi/server/go"
31
+ "github.com/pyrra-dev/pyrra/proto/objectives/v1alpha1"
32
+ "github.com/pyrra-dev/pyrra/proto/objectives/v1alpha1/objectivesv1alpha1connect"
28
33
"github.com/pyrra-dev/pyrra/slo"
29
34
)
30
35
@@ -170,7 +175,7 @@ func cmdFilesystem(logger log.Logger, reg *prometheus.Registry, promClient api.C
170
175
level .Debug (logger ).Log ("msg" , "reading" , "file" , f )
171
176
reconcilesTotal .Inc ()
172
177
173
- bytes , err := ioutil .ReadFile (f )
178
+ bytes , err := os .ReadFile (f )
174
179
if err != nil {
175
180
reconcilesErrors .Inc ()
176
181
return fmt .Errorf ("failed to read file %q: %w" , f , err )
@@ -212,7 +217,7 @@ func cmdFilesystem(logger log.Logger, reg *prometheus.Registry, promClient api.C
212
217
_ , file := filepath .Split (f )
213
218
path := filepath .Join (prometheusFolder , file )
214
219
215
- if err := ioutil .WriteFile (path , bytes , 0o644 ); err != nil {
220
+ if err := os .WriteFile (path , bytes , 0o644 ); err != nil {
216
221
reconcilesErrors .Inc ()
217
222
return fmt .Errorf ("failed to write file %q: %w" , path , err )
218
223
}
@@ -268,14 +273,21 @@ func cmdFilesystem(logger log.Logger, reg *prometheus.Registry, promClient api.C
268
273
})
269
274
}
270
275
{
271
- router := openapiserver .NewRouter (
272
- openapiserver .NewObjectivesApiController (& FilesystemObjectiveServer {
273
- objectives : objectives ,
274
- }),
275
- )
276
- router .Handle ("/metrics" , promhttp .HandlerFor (reg , promhttp.HandlerOpts {}))
277
-
278
- server := http.Server {Addr : ":9444" , Handler : router }
276
+ //router := openapiserver.NewRouter(
277
+ // openapiserver.NewObjectivesApiController(&FilesystemObjectiveServer{
278
+ // objectives: objectives,
279
+ // }),
280
+ //)
281
+ mux := http .NewServeMux ()
282
+ mux .Handle (objectivesv1alpha1connect .NewObjectiveBackendServiceHandler (& connectFilesystemObjectiveServer {
283
+ objectives : objectives ,
284
+ }))
285
+ mux .Handle ("/metrics" , promhttp .HandlerFor (reg , promhttp.HandlerOpts {}))
286
+
287
+ server := http.Server {
288
+ Addr : ":9444" ,
289
+ Handler : h2c .NewHandler (mux , & http2.Server {}),
290
+ }
279
291
280
292
gr .Add (func () error {
281
293
level .Info (logger ).Log ("msg" , "starting up HTTP API" , "address" , server .Addr )
@@ -296,6 +308,36 @@ type FilesystemObjectiveServer struct {
296
308
objectives * Objectives
297
309
}
298
310
311
+ type connectFilesystemObjectiveServer struct {
312
+ objectives * Objectives
313
+ }
314
+
315
+ func (s * connectFilesystemObjectiveServer ) ListObjectives (ctx context.Context , req * connect.Request [objectivesv1alpha1.ListObjectivesRequest ]) (* connect.Response [objectivesv1alpha1.ListObjectivesResponse ], error ) {
316
+ var matchers []* labels.Matcher
317
+ if expr := req .Msg .Expr ; expr != "" {
318
+ var err error
319
+ matchers , err = parser .ParseMetricSelector (expr )
320
+ if err != nil {
321
+ return nil , connect .NewError (connect .CodeFailedPrecondition , fmt .Errorf ("failed to parse expr: %w" , err ))
322
+ }
323
+ }
324
+
325
+ matchingObjectives := s .objectives .Match (matchers )
326
+ objectives := make ([]* objectivesv1alpha1.Objective , 0 , len (matchingObjectives ))
327
+ for _ , o := range matchingObjectives {
328
+ objectives = append (objectives , & objectivesv1alpha1.Objective {
329
+ Labels : o .Labels .Map (),
330
+ Description : o .Description ,
331
+ Target : o .Target ,
332
+ Window : time .Duration (o .Window ).Milliseconds (),
333
+ })
334
+ }
335
+
336
+ return connect.NewResponse [objectivesv1alpha1.ListObjectivesResponse ](& objectivesv1alpha1.ListObjectivesResponse {
337
+ Objectives : objectives ,
338
+ }), nil
339
+ }
340
+
299
341
func (f FilesystemObjectiveServer ) ListObjectives (ctx context.Context , query string ) (openapiserver.ImplResponse , error ) {
300
342
var matchers []* labels.Matcher
301
343
if query != "" {
0 commit comments