Skip to content
This repository was archived by the owner on Apr 2, 2024. It is now read-only.

Commit 8f47bcd

Browse files
Filter by label key before Exists() for LabelValues() in multi-tenancy mode.
Signed-off-by: Harkishen-Singh <[email protected]> This commit optimizes the LabelValues() for multi-tenancy case by filtering the label name before the expensive Exists() subclause.
1 parent b0a862b commit 8f47bcd

File tree

2 files changed

+8
-9
lines changed

2 files changed

+8
-9
lines changed

pkg/pgmodel/lreader/labels_reader.go

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ const (
4949
EXISTS(
5050
SELECT 1 FROM _prom_catalog.series WHERE (
5151
labels @> array[l.id] AND
52-
labels @>
52+
labels &&
5353
(
5454
SELECT array_agg(id :: INTEGER)
5555
FROM _prom_catalog.label
@@ -59,7 +59,7 @@ EXISTS(
5959
)
6060
`
6161
getLabelNamesForTenant = `SELECT array_agg(distinct l.key) FROM _prom_catalog.label l WHERE %s`
62-
getLabelValuesForTenant = `SELECT array_agg(distinct a.value) FROM (SELECT * FROM _prom_catalog.label l WHERE %s) a WHERE a.key = %s`
62+
getLabelValuesForTenant = `SELECT array_agg(distinct value) FROM (SELECT * FROM _prom_catalog.label l WHERE key = $1 AND ( %s )) a`
6363
)
6464

6565
type labelsReader struct {
@@ -78,13 +78,12 @@ func (lr *labelsReader) LabelValues(labelName string) ([]string, error) {
7878
log.Debug("msg", "no tenants found for LabelValues()")
7979
return []string{}, nil
8080
}
81-
existsClause, args := []string{}, []interface{}{}
82-
for i, tenantName := range validTenants {
83-
existsClause = append(existsClause, fmt.Sprintf(tenantExists, i+1))
81+
existsClause, args := []string{}, []interface{}{labelName}
82+
for _, tenantName := range validTenants {
8483
args = append(args, tenantName)
84+
existsClause = append(existsClause, fmt.Sprintf(tenantExists, len(args)))
8585
}
86-
args = append(args, labelName)
87-
labelValuesQuery := fmt.Sprintf(getLabelValuesForTenant, strings.Join(existsClause, " OR "), fmt.Sprint("$", len(args)))
86+
labelValuesQuery := fmt.Sprintf(getLabelValuesForTenant, strings.Join(existsClause, " OR "))
8887
var labelValues []string
8988
if err := lr.conn.QueryRow(context.Background(), labelValuesQuery, args...).Scan(&labelValues); err != nil {
9089
return nil, fmt.Errorf("error reading label values belonging to a tenant id: %w", err)

pkg/pgmodel/lreader/labels_reader_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -169,8 +169,8 @@ func TestLabelsReaderLabelsValues(t *testing.T) {
169169
name: "Tenant values are filtered when tenant is configured",
170170
sqlQueries: []model.SqlQuery{
171171
{
172-
Sql: "SELECT array_agg(distinct a.value) FROM (SELECT * FROM _prom_catalog.label l WHERE EXISTS( SELECT 1 FROM _prom_catalog.series WHERE ( labels @> array[l.id] AND labels @> ( SELECT array_agg(id :: INTEGER) FROM _prom_catalog.label WHERE key = '__tenant__' AND value = $1 )::int[] ) ) ) a WHERE a.key = $2",
173-
Args: []interface{}{"a", "__tenant__"},
172+
Sql: "SELECT array_agg(distinct value) FROM (SELECT * FROM _prom_catalog.label l WHERE key = $1 AND ( EXISTS( SELECT 1 FROM _prom_catalog.series WHERE ( labels @> array[l.id] AND labels && ( SELECT array_agg(id :: INTEGER) FROM _prom_catalog.label WHERE key = '__tenant__' AND value = $2 )::int[] ) ) )) a",
173+
Args: []interface{}{"__tenant__", "a"},
174174
Results: model.RowResults{{[]string{"a"}}},
175175
},
176176
},

0 commit comments

Comments
 (0)