Skip to content

Commit 7f72d96

Browse files
authored
Delete gRPC MetricsQueryService, metricsquery.proto and related code (#6616)
## Which problem is this PR solving? - No code in Jaeger was dependent on having a gRPC endpoint for reading metrics. UI's Monitor tab uses JSON endpoint. - This code is just a pass-through proxy to the underlying metrics storage with which we communicate using OpenMetrics API. ## Description of the changes - Delete unnecessary code and proto-gen types. - 🛑 This is a breaking change: the gRPC `MetricsQueryService` endpoint is removed. ## How was this change tested? - CI --------- Signed-off-by: Yuri Shkuro <[email protected]>
1 parent 5caf4e4 commit 7f72d96

File tree

11 files changed

+38
-3393
lines changed

11 files changed

+38
-3393
lines changed

.github/workflows/ci-lint-checks.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -86,10 +86,10 @@ jobs:
8686
go-version: 1.23.x
8787

8888
- name: Verify Protobuf types are up to date
89-
run: make proto && git diff --name-status --exit-code
89+
run: make proto && { if git status --porcelain | grep '??'; then exit 1; else git diff --name-status --exit-code; fi }
9090

9191
- name: Verify Thrift types are up to date
92-
run: make thrift && git diff --name-status --exit-code
92+
run: make thrift && { if git status --porcelain | grep '??'; then exit 1; else git diff --name-status --exit-code; fi }
9393

9494
- name: Verify Mockery types are up to date
9595
run: make generate-mocks && { if git status --porcelain | grep '??'; then exit 1; else git diff --name-status --exit-code; fi }

Makefile.Protobuf.mk

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -98,8 +98,6 @@ patch-api-v2:
9898
proto-openmetrics:
9999
$(call print_caption, Processing OpenMetrics Protos)
100100
$(foreach file,$(OPENMETRICS_PROTO_FILES),$(call proto_compile, proto-gen/api_v2/metrics, $(file)))
101-
@# TODO why is this file included in model/proto/metrics/ in the first place?
102-
rm proto-gen/api_v2/metrics/otelmetric.pb.go
103101

104102
.PHONY: proto-storage-v1
105103
proto-storage-v1:

cmd/anonymizer/app/query/query_test.go

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ import (
1818
"github.com/jaegertracing/jaeger-idl/proto-gen/api_v2"
1919
"github.com/jaegertracing/jaeger/cmd/query/app"
2020
"github.com/jaegertracing/jaeger/cmd/query/app/querysvc"
21-
"github.com/jaegertracing/jaeger/plugin/metricstore/disabled"
2221
"github.com/jaegertracing/jaeger/storage/spanstore"
2322
spanstoremocks "github.com/jaegertracing/jaeger/storage/spanstore/mocks"
2423
dependencyStoreMocks "github.com/jaegertracing/jaeger/storage_v2/depstore/mocks"
@@ -58,15 +57,13 @@ type testServer struct {
5857
func newTestServer(t *testing.T) *testServer {
5958
spanReader := &spanstoremocks.Reader{}
6059
traceReader := v1adapter.NewTraceReader(spanReader)
61-
metricsReader, err := disabled.NewMetricsReader()
62-
require.NoError(t, err)
6360

6461
q := querysvc.NewQueryService(
6562
traceReader,
6663
&dependencyStoreMocks.Reader{},
6764
querysvc.QueryServiceOptions{},
6865
)
69-
h := app.NewGRPCHandler(q, metricsReader, app.GRPCHandlerOptions{})
66+
h := app.NewGRPCHandler(q, app.GRPCHandlerOptions{})
7067

7168
server := grpc.NewServer()
7269
api_v2.RegisterQueryServiceServer(server, h)

cmd/jaeger/internal/extension/jaegerquery/server_test.go

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -245,7 +245,6 @@ func TestServerStart(t *testing.T) {
245245
ExpectedServices: []string{
246246
"jaeger.api_v2.QueryService",
247247
"jaeger.api_v3.QueryService",
248-
"jaeger.api_v2.metrics.MetricsQueryService",
249248
"grpc.health.v1.Health",
250249
},
251250
}.Execute(t)

cmd/query/app/grpc_handler.go

Lines changed: 10 additions & 151 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,6 @@ import (
1717
"github.com/jaegertracing/jaeger/cmd/query/app/querysvc"
1818
_ "github.com/jaegertracing/jaeger/pkg/gogocodec" // force gogo codec registration
1919
"github.com/jaegertracing/jaeger/pkg/jtracer"
20-
"github.com/jaegertracing/jaeger/plugin/metricstore/disabled"
21-
"github.com/jaegertracing/jaeger/proto-gen/api_v2/metrics"
22-
"github.com/jaegertracing/jaeger/storage/metricstore"
2320
"github.com/jaegertracing/jaeger/storage/spanstore"
2421
)
2522

@@ -30,20 +27,16 @@ const (
3027
)
3128

3229
var (
33-
errGRPCMetricsQueryDisabled = status.Error(codes.Unimplemented, "metrics querying is currently disabled")
34-
errNilRequest = status.Error(codes.InvalidArgument, "a nil argument is not allowed")
35-
errUninitializedTraceID = status.Error(codes.InvalidArgument, "uninitialized TraceID is not allowed")
36-
errMissingServiceNames = status.Error(codes.InvalidArgument, "please provide at least one service name")
37-
errMissingQuantile = status.Error(codes.InvalidArgument, "please provide a quantile between (0, 1]")
30+
errNilRequest = status.Error(codes.InvalidArgument, "a nil argument is not allowed")
31+
errUninitializedTraceID = status.Error(codes.InvalidArgument, "uninitialized TraceID is not allowed")
3832
)
3933

4034
// GRPCHandler implements the gRPC endpoint of the query service.
4135
type GRPCHandler struct {
42-
queryService *querysvc.QueryService
43-
metricsQueryService querysvc.MetricsQueryService
44-
logger *zap.Logger
45-
tracer *jtracer.JTracer
46-
nowFn func() time.Time
36+
queryService *querysvc.QueryService
37+
logger *zap.Logger
38+
tracer *jtracer.JTracer
39+
nowFn func() time.Time
4740
}
4841

4942
// GRPCHandlerOptions contains optional members of GRPCHandler.
@@ -55,7 +48,6 @@ type GRPCHandlerOptions struct {
5548

5649
// NewGRPCHandler returns a GRPCHandler.
5750
func NewGRPCHandler(queryService *querysvc.QueryService,
58-
metricsQueryService querysvc.MetricsQueryService,
5951
options GRPCHandlerOptions,
6052
) *GRPCHandler {
6153
if options.Logger == nil {
@@ -71,11 +63,10 @@ func NewGRPCHandler(queryService *querysvc.QueryService,
7163
}
7264

7365
return &GRPCHandler{
74-
queryService: queryService,
75-
metricsQueryService: metricsQueryService,
76-
logger: options.Logger,
77-
tracer: options.Tracer,
78-
nowFn: options.NowFn,
66+
queryService: queryService,
67+
logger: options.Logger,
68+
tracer: options.Tracer,
69+
nowFn: options.NowFn,
7970
}
8071
}
8172

@@ -248,135 +239,3 @@ func (g *GRPCHandler) GetDependencies(ctx context.Context, r *api_v2.GetDependen
248239

249240
return &api_v2.GetDependenciesResponse{Dependencies: dependencies}, nil
250241
}
251-
252-
// GetLatencies is the gRPC handler to fetch latency metrics.
253-
func (g *GRPCHandler) GetLatencies(ctx context.Context, r *metrics.GetLatenciesRequest) (*metrics.GetMetricsResponse, error) {
254-
bqp, err := g.newBaseQueryParameters(r)
255-
if err := g.handleErr("failed to build parameters", err); err != nil {
256-
return nil, err
257-
}
258-
// Check for cases where clients do not provide the Quantile, which defaults to the float64's zero value.
259-
if r.Quantile == 0 {
260-
return nil, errMissingQuantile
261-
}
262-
queryParams := metricstore.LatenciesQueryParameters{
263-
BaseQueryParameters: bqp,
264-
Quantile: r.Quantile,
265-
}
266-
m, err := g.metricsQueryService.GetLatencies(ctx, &queryParams)
267-
if err := g.handleErr("failed to fetch latencies", err); err != nil {
268-
return nil, err
269-
}
270-
return &metrics.GetMetricsResponse{Metrics: *m}, nil
271-
}
272-
273-
// GetCallRates is the gRPC handler to fetch call rate metrics.
274-
func (g *GRPCHandler) GetCallRates(ctx context.Context, r *metrics.GetCallRatesRequest) (*metrics.GetMetricsResponse, error) {
275-
bqp, err := g.newBaseQueryParameters(r)
276-
if err := g.handleErr("failed to build parameters", err); err != nil {
277-
return nil, err
278-
}
279-
queryParams := metricstore.CallRateQueryParameters{
280-
BaseQueryParameters: bqp,
281-
}
282-
m, err := g.metricsQueryService.GetCallRates(ctx, &queryParams)
283-
if err := g.handleErr("failed to fetch call rates", err); err != nil {
284-
return nil, err
285-
}
286-
return &metrics.GetMetricsResponse{Metrics: *m}, nil
287-
}
288-
289-
// GetErrorRates is the gRPC handler to fetch error rate metrics.
290-
func (g *GRPCHandler) GetErrorRates(ctx context.Context, r *metrics.GetErrorRatesRequest) (*metrics.GetMetricsResponse, error) {
291-
bqp, err := g.newBaseQueryParameters(r)
292-
if err := g.handleErr("failed to build parameters", err); err != nil {
293-
return nil, err
294-
}
295-
queryParams := metricstore.ErrorRateQueryParameters{
296-
BaseQueryParameters: bqp,
297-
}
298-
m, err := g.metricsQueryService.GetErrorRates(ctx, &queryParams)
299-
if err := g.handleErr("failed to fetch error rates", err); err != nil {
300-
return nil, err
301-
}
302-
return &metrics.GetMetricsResponse{Metrics: *m}, nil
303-
}
304-
305-
// GetMinStepDuration is the gRPC handler to fetch the minimum step duration supported by the underlying metrics store.
306-
func (g *GRPCHandler) GetMinStepDuration(ctx context.Context, _ *metrics.GetMinStepDurationRequest) (*metrics.GetMinStepDurationResponse, error) {
307-
minStep, err := g.metricsQueryService.GetMinStepDuration(ctx, &metricstore.MinStepDurationQueryParameters{})
308-
if err := g.handleErr("failed to fetch min step duration", err); err != nil {
309-
return nil, err
310-
}
311-
return &metrics.GetMinStepDurationResponse{MinStep: minStep}, nil
312-
}
313-
314-
func (g *GRPCHandler) handleErr(msg string, err error) error {
315-
if err == nil {
316-
return nil
317-
}
318-
g.logger.Error(msg, zap.Error(err))
319-
320-
// Avoid wrapping "expected" errors with an "Internal Server" error.
321-
if errors.Is(err, disabled.ErrDisabled) {
322-
return errGRPCMetricsQueryDisabled
323-
}
324-
if _, ok := status.FromError(err); ok {
325-
return err
326-
}
327-
328-
// Received an "unexpected" error.
329-
return status.Errorf(codes.Internal, "%s: %v", msg, err)
330-
}
331-
332-
func (g *GRPCHandler) newBaseQueryParameters(r any) (bqp metricstore.BaseQueryParameters, err error) {
333-
if r == nil {
334-
return bqp, errNilRequest
335-
}
336-
var baseRequest *metrics.MetricsQueryBaseRequest
337-
switch v := r.(type) {
338-
case *metrics.GetLatenciesRequest:
339-
baseRequest = v.BaseRequest
340-
case *metrics.GetCallRatesRequest:
341-
baseRequest = v.BaseRequest
342-
case *metrics.GetErrorRatesRequest:
343-
baseRequest = v.BaseRequest
344-
}
345-
if baseRequest == nil || len(baseRequest.ServiceNames) == 0 {
346-
return bqp, errMissingServiceNames
347-
}
348-
349-
// Copy non-nullable params.
350-
bqp.GroupByOperation = baseRequest.GroupByOperation
351-
bqp.ServiceNames = baseRequest.ServiceNames
352-
353-
// Initialize nullable params with defaults.
354-
defaultEndTime := g.nowFn()
355-
bqp.EndTime = &defaultEndTime
356-
bqp.Lookback = &defaultMetricsQueryLookbackDuration
357-
bqp.RatePer = &defaultMetricsQueryRateDuration
358-
bqp.SpanKinds = defaultMetricsSpanKinds
359-
bqp.Step = &defaultMetricsQueryStepDuration
360-
361-
// ... and override defaults with any provided request params.
362-
if baseRequest.EndTime != nil {
363-
bqp.EndTime = baseRequest.EndTime
364-
}
365-
if baseRequest.Lookback != nil {
366-
bqp.Lookback = baseRequest.Lookback
367-
}
368-
if baseRequest.Step != nil {
369-
bqp.Step = baseRequest.Step
370-
}
371-
if baseRequest.RatePer != nil {
372-
bqp.RatePer = baseRequest.RatePer
373-
}
374-
if len(baseRequest.SpanKinds) > 0 {
375-
spanKinds := make([]string, len(baseRequest.SpanKinds))
376-
for i, v := range baseRequest.SpanKinds {
377-
spanKinds[i] = v.String()
378-
}
379-
bqp.SpanKinds = spanKinds
380-
}
381-
return bqp, nil
382-
}

0 commit comments

Comments
 (0)