mirror of
https://github.com/grafana/grafana.git
synced 2025-02-25 18:55:37 -06:00
Storage: Query stats within a namespace (#97403)
This commit is contained in:
parent
3724ffd858
commit
8165258a2d
@ -132,7 +132,7 @@ type rowsWrapper struct {
|
|||||||
err error
|
err error
|
||||||
}
|
}
|
||||||
|
|
||||||
func (a *dashboardSqlAccess) GetResourceStats(ctx context.Context, minCount int) ([]resource.ResourceStats, error) {
|
func (a *dashboardSqlAccess) GetResourceStats(ctx context.Context, namespace string, minCount int) ([]resource.ResourceStats, error) {
|
||||||
return nil, fmt.Errorf("not implemented")
|
return nil, fmt.Errorf("not implemented")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -109,7 +109,7 @@ func (s *cdkBackend) getPath(key *ResourceKey, rv int64) string {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// GetResourceStats implements Backend.
|
// GetResourceStats implements Backend.
|
||||||
func (s *cdkBackend) GetResourceStats(ctx context.Context, minCount int) ([]ResourceStats, error) {
|
func (s *cdkBackend) GetResourceStats(ctx context.Context, namespace string, minCount int) ([]ResourceStats, error) {
|
||||||
return nil, fmt.Errorf("not implemented")
|
return nil, fmt.Errorf("not implemented")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -179,7 +179,7 @@ func (s *searchSupport) init(ctx context.Context) error {
|
|||||||
group := errgroup.Group{}
|
group := errgroup.Group{}
|
||||||
group.SetLimit(s.initWorkers)
|
group.SetLimit(s.initWorkers)
|
||||||
|
|
||||||
stats, err := s.storage.GetResourceStats(ctx, s.initMinSize)
|
stats, err := s.storage.GetResourceStats(ctx, "", s.initMinSize)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
@ -95,7 +95,8 @@ type StorageBackend interface {
|
|||||||
// For HA setups, this will be more events than the local WriteEvent above!
|
// For HA setups, this will be more events than the local WriteEvent above!
|
||||||
WatchWriteEvents(ctx context.Context) (<-chan *WrittenEvent, error)
|
WatchWriteEvents(ctx context.Context) (<-chan *WrittenEvent, error)
|
||||||
|
|
||||||
GetResourceStats(ctx context.Context, minCount int) ([]ResourceStats, error)
|
// Get resource stats within the storage backend. When namespace is empty, it will apply to all
|
||||||
|
GetResourceStats(ctx context.Context, namespace string, minCount int) ([]ResourceStats, error)
|
||||||
}
|
}
|
||||||
|
|
||||||
type ResourceStats struct {
|
type ResourceStats struct {
|
||||||
|
@ -122,12 +122,13 @@ func (b *backend) Stop(_ context.Context) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// GetResourceStats implements Backend.
|
// GetResourceStats implements Backend.
|
||||||
func (b *backend) GetResourceStats(ctx context.Context, minCount int) ([]resource.ResourceStats, error) {
|
func (b *backend) GetResourceStats(ctx context.Context, namespace string, minCount int) ([]resource.ResourceStats, error) {
|
||||||
_, span := b.tracer.Start(ctx, tracePrefix+".GetResourceStats")
|
_, span := b.tracer.Start(ctx, tracePrefix+".GetResourceStats")
|
||||||
defer span.End()
|
defer span.End()
|
||||||
|
|
||||||
req := &sqlStatsRequest{
|
req := &sqlStatsRequest{
|
||||||
SQLTemplate: sqltemplate.New(b.dialect),
|
SQLTemplate: sqltemplate.New(b.dialect),
|
||||||
|
Namespace: namespace,
|
||||||
MinCount: minCount, // not used in query... yet?
|
MinCount: minCount, // not used in query... yet?
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -5,6 +5,10 @@ SELECT
|
|||||||
COUNT(*),
|
COUNT(*),
|
||||||
MAX({{ .Ident "resource_version" }})
|
MAX({{ .Ident "resource_version" }})
|
||||||
FROM {{ .Ident "resource" }}
|
FROM {{ .Ident "resource" }}
|
||||||
|
{{ if .Namespace }}
|
||||||
|
WHERE 1 = 1
|
||||||
|
AND {{ .Ident "namespace" }} = {{ .Arg .Namespace }}
|
||||||
|
{{ end}}
|
||||||
GROUP BY
|
GROUP BY
|
||||||
{{ .Ident "namespace" }},
|
{{ .Ident "namespace" }},
|
||||||
{{ .Ident "group" }},
|
{{ .Ident "group" }},
|
||||||
|
@ -74,7 +74,8 @@ func (r sqlResourceRequest) Validate() error {
|
|||||||
|
|
||||||
type sqlStatsRequest struct {
|
type sqlStatsRequest struct {
|
||||||
sqltemplate.SQLTemplate
|
sqltemplate.SQLTemplate
|
||||||
MinCount int
|
Namespace string
|
||||||
|
MinCount int
|
||||||
}
|
}
|
||||||
|
|
||||||
func (r sqlStatsRequest) Validate() error {
|
func (r sqlStatsRequest) Validate() error {
|
||||||
|
@ -228,6 +228,14 @@ func TestUnifiedStorageQueries(t *testing.T) {
|
|||||||
MinCount: 10, // Not yet used in query (only response filter)
|
MinCount: 10, // Not yet used in query (only response filter)
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
Name: "query-namespace",
|
||||||
|
Data: &sqlStatsRequest{
|
||||||
|
SQLTemplate: mocks.NewTestingSQLTemplate(),
|
||||||
|
Namespace: "default",
|
||||||
|
MinCount: 10, // Not yet used in query (only response filter)
|
||||||
|
},
|
||||||
|
},
|
||||||
},
|
},
|
||||||
}})
|
}})
|
||||||
}
|
}
|
||||||
|
@ -98,7 +98,7 @@ func TestIntegrationBackendHappyPath(t *testing.T) {
|
|||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
require.Greater(t, rv3, rv2)
|
require.Greater(t, rv3, rv2)
|
||||||
|
|
||||||
stats, err := backend.GetResourceStats(ctx, 0)
|
stats, err := backend.GetResourceStats(ctx, "", 0)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
require.Len(t, stats, 1)
|
require.Len(t, stats, 1)
|
||||||
require.Equal(t, int64(3), stats[0].Count)
|
require.Equal(t, int64(3), stats[0].Count)
|
||||||
|
14
pkg/storage/unified/sql/testdata/mysql--resource_stats-query-namespace.sql
vendored
Executable file
14
pkg/storage/unified/sql/testdata/mysql--resource_stats-query-namespace.sql
vendored
Executable file
@ -0,0 +1,14 @@
|
|||||||
|
SELECT
|
||||||
|
`namespace`,
|
||||||
|
`group`,
|
||||||
|
`resource`,
|
||||||
|
COUNT(*),
|
||||||
|
MAX(`resource_version`)
|
||||||
|
FROM `resource`
|
||||||
|
WHERE 1 = 1
|
||||||
|
AND `namespace` = 'default'
|
||||||
|
GROUP BY
|
||||||
|
`namespace`,
|
||||||
|
`group`,
|
||||||
|
`resource`
|
||||||
|
;
|
14
pkg/storage/unified/sql/testdata/postgres--resource_stats-query-namespace.sql
vendored
Executable file
14
pkg/storage/unified/sql/testdata/postgres--resource_stats-query-namespace.sql
vendored
Executable file
@ -0,0 +1,14 @@
|
|||||||
|
SELECT
|
||||||
|
"namespace",
|
||||||
|
"group",
|
||||||
|
"resource",
|
||||||
|
COUNT(*),
|
||||||
|
MAX("resource_version")
|
||||||
|
FROM "resource"
|
||||||
|
WHERE 1 = 1
|
||||||
|
AND "namespace" = 'default'
|
||||||
|
GROUP BY
|
||||||
|
"namespace",
|
||||||
|
"group",
|
||||||
|
"resource"
|
||||||
|
;
|
14
pkg/storage/unified/sql/testdata/sqlite--resource_stats-query-namespace.sql
vendored
Executable file
14
pkg/storage/unified/sql/testdata/sqlite--resource_stats-query-namespace.sql
vendored
Executable file
@ -0,0 +1,14 @@
|
|||||||
|
SELECT
|
||||||
|
"namespace",
|
||||||
|
"group",
|
||||||
|
"resource",
|
||||||
|
COUNT(*),
|
||||||
|
MAX("resource_version")
|
||||||
|
FROM "resource"
|
||||||
|
WHERE 1 = 1
|
||||||
|
AND "namespace" = 'default'
|
||||||
|
GROUP BY
|
||||||
|
"namespace",
|
||||||
|
"group",
|
||||||
|
"resource"
|
||||||
|
;
|
Loading…
Reference in New Issue
Block a user