Merge pull request #133410 from richabanker/delete-label-values

Wrapper for prom client's DeleteLabelValues()
This commit is contained in:
Kubernetes Prow Robot
2025-10-08 07:01:02 -07:00
committed by GitHub
2 changed files with 394 additions and 0 deletions

View File

@@ -161,6 +161,17 @@ func (v *GaugeVec) WithLabelValuesChecked(lvs ...string) (GaugeMetric, error) {
return v.GetMetricWithLabelValues(lvs...)
}
func (v *GaugeVec) DeleteLabelValuesChecked(lvs ...string) (bool, error) {
if !v.IsCreated() {
if v.IsHidden() {
return false, nil
}
return false, errNotRegistered
}
return v.GaugeVec.DeleteLabelValues(lvs...), nil
}
// Default Prometheus Vec behavior is that member extraction results in creation of a new element
// if one with the unique label values is not found in the underlying stored metricMap.
// This means that if this function is called but the underlying metric is not registered
@@ -184,6 +195,14 @@ func (v *GaugeVec) WithLabelValues(lvs ...string) GaugeMetric {
panic(err)
}
func (v *GaugeVec) DeleteLabelValues(lvs ...string) bool {
ans, err := v.DeleteLabelValuesChecked(lvs...)
if err == nil || ErrIsNotRegistered(err) {
return ans
}
panic(err)
}
func (v *GaugeVec) WithChecked(labels map[string]string) (GaugeMetric, error) {
if !v.IsCreated() {
if v.IsHidden() {

View File

@@ -593,3 +593,378 @@ func TestGaugeWithLabelValueAllowList(t *testing.T) {
})
}
}
func TestGaugeVecDeleteLabelValues(t *testing.T) {
version := apimachineryversion.Info{
Major: "1",
Minor: "15",
GitVersion: "v1.15.0-alpha-1.12345",
}
var tests = []struct {
desc string
opts *GaugeOpts
labels []string
expectMetricExists bool
expectDelete bool
}{
// Non-deprecated metrics
{
desc: "ALPHA metric non deprecated",
opts: &GaugeOpts{
Namespace: "namespace",
Name: "metric_delete_table",
Subsystem: "subsystem",
Help: "gauge help",
StabilityLevel: ALPHA,
},
labels: []string{"label_a", "label_b"},
expectMetricExists: true,
expectDelete: true,
},
{
desc: "BETA metric non deprecated",
opts: &GaugeOpts{
Namespace: "namespace",
Name: "metric_delete_table",
Subsystem: "subsystem",
Help: "gauge help",
StabilityLevel: BETA,
},
labels: []string{"label_a", "label_b"},
expectMetricExists: true,
expectDelete: true,
},
{
desc: "STABLE metric non deprecated",
opts: &GaugeOpts{
Namespace: "namespace",
Name: "metric_delete_table",
Subsystem: "subsystem",
Help: "gauge help",
StabilityLevel: STABLE,
},
labels: []string{"label_a", "label_b"},
expectMetricExists: true,
expectDelete: true,
},
// Deprecated metrics
{
desc: "ALPHA metric deprecated",
opts: &GaugeOpts{
Namespace: "namespace",
Name: "metric_delete_table",
Subsystem: "subsystem",
Help: "gauge help",
StabilityLevel: ALPHA,
DeprecatedVersion: "1.15.0",
},
labels: []string{"label_a", "label_b"},
expectMetricExists: false,
expectDelete: false,
},
{
desc: "BETA metric deprecated",
opts: &GaugeOpts{
Namespace: "namespace",
Name: "metric_delete_table",
Subsystem: "subsystem",
Help: "gauge help",
StabilityLevel: BETA,
DeprecatedVersion: "1.15.0",
},
labels: []string{"label_a", "label_b"},
expectMetricExists: true,
expectDelete: true,
},
{
desc: "STABLE metric deprecated",
opts: &GaugeOpts{
Namespace: "namespace",
Name: "metric_delete_table",
Subsystem: "subsystem",
Help: "gauge help",
StabilityLevel: STABLE,
DeprecatedVersion: "1.15.0",
},
labels: []string{"label_a", "label_b"},
expectMetricExists: true,
expectDelete: true,
},
// Hidden metrics
{
desc: "ALPHA metric hidden",
opts: &GaugeOpts{
Namespace: "namespace",
Name: "metric_delete_table",
Subsystem: "subsystem",
Help: "gauge help",
StabilityLevel: ALPHA,
DeprecatedVersion: "1.14.0",
},
labels: []string{"label_a", "label_b"},
expectMetricExists: false,
expectDelete: false,
},
{
desc: "BETA metric hidden",
opts: &GaugeOpts{
Namespace: "namespace",
Name: "metric_delete_table",
Subsystem: "subsystem",
Help: "gauge help",
StabilityLevel: BETA,
DeprecatedVersion: "1.14.0",
},
labels: []string{"label_a", "label_b"},
expectMetricExists: false,
expectDelete: false,
},
{
desc: "STABLE metric hidden",
opts: &GaugeOpts{
Namespace: "namespace",
Name: "metric_delete_table",
Subsystem: "subsystem",
Help: "gauge help",
StabilityLevel: STABLE,
DeprecatedVersion: "1.12.0",
},
labels: []string{"label_a", "label_b"},
expectMetricExists: false,
expectDelete: false,
},
}
for _, test := range tests {
t.Run(test.desc, func(t *testing.T) {
registry := newKubeRegistry(version)
gv := NewGaugeVec(test.opts, test.labels)
registry.MustRegister(gv)
gv.WithLabelValues("foo", "bar").Set(42)
ms, err := registry.Gather()
require.NoError(t, err)
found := false
for _, mf := range ms {
if *mf.Name == BuildFQName(test.opts.Namespace, test.opts.Subsystem, test.opts.Name) {
for _, m := range mf.GetMetric() {
for _, l := range m.Label {
if *l.Name == "label_a" && *l.Value == "foo" {
found = true
}
}
}
}
}
assert.Equal(t, test.expectMetricExists, found, "Metric existence mismatch before deletion")
deleted := gv.DeleteLabelValues("foo", "bar")
assert.Equal(t, test.expectDelete, deleted, "DeleteLabelValues return mismatch")
// Confirm it no longer exists
ms, err = registry.Gather()
require.NoError(t, err)
found = false
for _, mf := range ms {
if *mf.Name == BuildFQName(test.opts.Namespace, test.opts.Subsystem, test.opts.Name) {
for _, m := range mf.GetMetric() {
for _, l := range m.Label {
if *l.Name == "label_a" && *l.Value == "foo" {
found = true
}
}
}
}
}
assert.False(t, found, "Metric with label values should not exist after deletion")
})
}
}
func TestGaugeVecDeleteLabelValuesChecked(t *testing.T) {
version := apimachineryversion.Info{
Major: "1",
Minor: "15",
GitVersion: "v1.15.0-alpha-1.12345",
}
var tests = []struct {
desc string
opts *GaugeOpts
labels []string
expectMetricExists bool
expectDelete bool
}{
// Non-deprecated metrics
{
desc: "ALPHA metric non deprecated",
opts: &GaugeOpts{
Namespace: "namespace",
Name: "metric_delete_checked_table",
Subsystem: "subsystem",
Help: "gauge help",
StabilityLevel: ALPHA,
},
labels: []string{"label_a", "label_b"},
expectMetricExists: true,
expectDelete: true,
},
{
desc: "BETA metric non deprecated",
opts: &GaugeOpts{
Namespace: "namespace",
Name: "metric_delete_checked_table",
Subsystem: "subsystem",
Help: "gauge help",
StabilityLevel: BETA,
},
labels: []string{"label_a", "label_b"},
expectMetricExists: true,
expectDelete: true,
},
{
desc: "STABLE metric non deprecated",
opts: &GaugeOpts{
Namespace: "namespace",
Name: "metric_delete_checked_table",
Subsystem: "subsystem",
Help: "gauge help",
StabilityLevel: STABLE,
},
labels: []string{"label_a", "label_b"},
expectMetricExists: true,
expectDelete: true,
},
// Deprecated metrics
{
desc: "ALPHA metric deprecated",
opts: &GaugeOpts{
Namespace: "namespace",
Name: "metric_delete_checked_table",
Subsystem: "subsystem",
Help: "gauge help",
StabilityLevel: ALPHA,
DeprecatedVersion: "1.15.0",
},
labels: []string{"label_a", "label_b"},
expectMetricExists: false,
expectDelete: false,
},
{
desc: "BETA metric deprecated",
opts: &GaugeOpts{
Namespace: "namespace",
Name: "metric_delete_checked_table",
Subsystem: "subsystem",
Help: "gauge help",
StabilityLevel: BETA,
DeprecatedVersion: "1.15.0",
},
labels: []string{"label_a", "label_b"},
expectMetricExists: true,
expectDelete: true,
},
{
desc: "STABLE metric deprecated",
opts: &GaugeOpts{
Namespace: "namespace",
Name: "metric_delete_checked_table",
Subsystem: "subsystem",
Help: "gauge help",
StabilityLevel: STABLE,
DeprecatedVersion: "1.15.0",
},
labels: []string{"label_a", "label_b"},
expectMetricExists: true,
expectDelete: true,
},
// Hidden metrics
{
desc: "ALPHA metric hidden",
opts: &GaugeOpts{
Namespace: "namespace",
Name: "metric_delete_checked_table",
Subsystem: "subsystem",
Help: "gauge help",
StabilityLevel: ALPHA,
DeprecatedVersion: "1.14.0",
},
labels: []string{"label_a", "label_b"},
expectMetricExists: false,
expectDelete: false,
},
{
desc: "BETA metric hidden",
opts: &GaugeOpts{
Namespace: "namespace",
Name: "metric_delete_checked_table",
Subsystem: "subsystem",
Help: "gauge help",
StabilityLevel: BETA,
DeprecatedVersion: "1.14.0",
},
labels: []string{"label_a", "label_b"},
expectMetricExists: false,
expectDelete: false,
},
{
desc: "STABLE metric hidden",
opts: &GaugeOpts{
Namespace: "namespace",
Name: "metric_delete_checked_table",
Subsystem: "subsystem",
Help: "gauge help",
StabilityLevel: STABLE,
DeprecatedVersion: "1.12.0",
},
labels: []string{"label_a", "label_b"},
expectMetricExists: false,
expectDelete: false,
},
}
for _, test := range tests {
t.Run(test.desc, func(t *testing.T) {
registry := newKubeRegistry(version)
gv := NewGaugeVec(test.opts, test.labels)
registry.MustRegister(gv)
gv.WithLabelValues("foo", "bar").Set(42)
ms, err := registry.Gather()
require.NoError(t, err)
found := false
for _, mf := range ms {
if *mf.Name == BuildFQName(test.opts.Namespace, test.opts.Subsystem, test.opts.Name) {
for _, m := range mf.GetMetric() {
for _, l := range m.Label {
if *l.Name == "label_a" && *l.Value == "foo" {
found = true
}
}
}
}
}
assert.Equal(t, test.expectMetricExists, found, "Metric existence mismatch before deletion")
deleted, err := gv.DeleteLabelValuesChecked("foo", "bar")
assert.Equal(t, test.expectDelete, deleted, "DeleteLabelValuesChecked return mismatch")
require.NoError(t, err, "DeleteLabelValuesChecked should not return error")
// Confirm it no longer exists
ms, err = registry.Gather()
require.NoError(t, err)
found = false
for _, mf := range ms {
if *mf.Name == BuildFQName(test.opts.Namespace, test.opts.Subsystem, test.opts.Name) {
for _, m := range mf.GetMetric() {
for _, l := range m.Label {
if *l.Name == "label_a" && *l.Value == "foo" {
found = true
}
}
}
}
}
assert.False(t, found, "Metric with label values should not exist after deletion")
})
}
}