Skip to content

Commit dcf54ac

Browse files
authored
fix: limit max nodes in symbolization queries (#4629)
* fix: limit max nodes in symbolization queries
1 parent 8e5a68b commit dcf54ac

File tree

5 files changed

+16
-9
lines changed

5 files changed

+16
-9
lines changed

pkg/frontend/readpath/queryfrontend/query_frontend.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@ func (q *QueryFrontend) Query(
120120
if shouldSymbolize && originalQuery.QueryType == queryv1.QueryType_QUERY_TREE {
121121
modifiedQueries[i].QueryType = queryv1.QueryType_QUERY_PPROF
122122
modifiedQueries[i].Pprof = &queryv1.PprofQuery{
123-
MaxNodes: 0,
123+
MaxNodes: originalQuery.Tree.GetMaxNodes(),
124124
}
125125
modifiedQueries[i].Tree = nil
126126
}
@@ -299,7 +299,7 @@ func (q *QueryFrontend) processAndSymbolizeProfiles(
299299

300300
// Convert back to tree if originally a tree
301301
if i < len(originalQueries) && originalQueries[i].QueryType == queryv1.QueryType_QUERY_TREE {
302-
treeBytes, err := model.TreeFromBackendProfile(&prof, originalQueries[i].Tree.MaxNodes)
302+
treeBytes, err := model.TreeFromBackendProfile(&prof, originalQueries[i].Tree.GetMaxNodes())
303303
if err != nil {
304304
return fmt.Errorf("failed to build tree: %w", err)
305305
}

pkg/pyroscope/modules_experimental.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -369,6 +369,7 @@ func (f *Pyroscope) initQueryBackendClient() (services.Service, error) {
369369
c, err := querybackendclient.New(
370370
f.Cfg.QueryBackend.Address,
371371
f.Cfg.QueryBackend.GRPCClientConfig,
372+
f.Cfg.QueryBackend.ClientTimeout,
372373
)
373374
if err != nil {
374375
return nil, err

pkg/querybackend/backend.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"context"
55
"flag"
66
"fmt"
7+
"time"
78

89
"github.com/go-kit/log"
910
"github.com/grafana/dskit/grpcclient"
@@ -20,10 +21,12 @@ import (
2021
type Config struct {
2122
Address string `yaml:"address"`
2223
GRPCClientConfig grpcclient.Config `yaml:"grpc_client_config" doc:"description=Configures the gRPC client used to communicate between the query-frontends and the query-schedulers."`
24+
ClientTimeout time.Duration `yaml:"client_timeout"`
2325
}
2426

2527
func (cfg *Config) RegisterFlags(f *flag.FlagSet) {
2628
f.StringVar(&cfg.Address, "query-backend.address", "localhost:9095", "")
29+
f.DurationVar(&cfg.ClientTimeout, "query-backend.client-timeout", 30*time.Second, "Timeout for query-backend client requests.")
2730
cfg.GRPCClientConfig.RegisterFlagsWithPrefix("query-backend.grpc-client-config", f)
2831
}
2932

pkg/querybackend/client/client.go

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ package querybackendclient
22

33
import (
44
"context"
5+
"fmt"
6+
"time"
57

68
"github.com/grafana/dskit/grpcclient"
79
"github.com/grafana/dskit/services"
@@ -15,8 +17,8 @@ type Client struct {
1517
grpcClient queryv1.QueryBackendServiceClient
1618
}
1719

18-
func New(address string, grpcClientConfig grpcclient.Config, dialOpts ...grpc.DialOption) (*Client, error) {
19-
conn, err := dial(address, grpcClientConfig, dialOpts...)
20+
func New(address string, grpcClientConfig grpcclient.Config, timeout time.Duration, dialOpts ...grpc.DialOption) (*Client, error) {
21+
conn, err := dial(address, grpcClientConfig, timeout, dialOpts...)
2022
if err != nil {
2123
return nil, err
2224
}
@@ -26,14 +28,15 @@ func New(address string, grpcClientConfig grpcclient.Config, dialOpts ...grpc.Di
2628
return &c, nil
2729
}
2830

29-
func dial(address string, grpcClientConfig grpcclient.Config, dialOpts ...grpc.DialOption) (*grpc.ClientConn, error) {
31+
func dial(address string, grpcClientConfig grpcclient.Config, timeout time.Duration, dialOpts ...grpc.DialOption) (*grpc.ClientConn, error) {
3032
options, err := grpcClientConfig.DialOption(nil, nil, nil)
3133
if err != nil {
3234
return nil, err
3335
}
3436
// TODO: https://github.com/grpc/grpc-proto/blob/master/grpc/service_config/service_config.proto
37+
serviceConfig := fmt.Sprintf(grpcServiceConfigTemplate, timeout.Seconds())
3538
options = append(options,
36-
grpc.WithDefaultServiceConfig(grpcServiceConfig),
39+
grpc.WithDefaultServiceConfig(serviceConfig),
3740
grpc.WithMaxCallAttempts(500),
3841
)
3942
options = append(options, dialOpts...)
@@ -48,7 +51,7 @@ func (b *Client) Invoke(ctx context.Context, req *queryv1.InvokeRequest) (*query
4851
return b.grpcClient.Invoke(ctx, req)
4952
}
5053

51-
const grpcServiceConfig = `{
54+
const grpcServiceConfigTemplate = `{
5255
"loadBalancingPolicy":"round_robin",
5356
"methodConfig": [{
5457
"name": [{"service": ""}],
@@ -63,6 +66,6 @@ const grpcServiceConfig = `{
6366
"RESOURCE_EXHAUSTED"
6467
]
6568
},
66-
"timeout": "20s"
69+
"timeout": "%.0fs"
6770
}]
6871
}`

pkg/querybackend/client/client_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ func Test_Concurrency(t *testing.T) {
9494
resolver.Register(&multiResolverBuilder{targets: addresses})
9595
backendAddress := "multi:///"
9696

97-
cl, err := New(backendAddress, grpcClientCfg, dialOpt)
97+
cl, err := New(backendAddress, grpcClientCfg, 30*time.Second, dialOpt)
9898
require.NoError(t, err)
9999

100100
for i := 0; i < nServers; i++ {

0 commit comments

Comments
 (0)