Merge pull request #119888 from dgrisonnet/panic-storage-metric

Fix segfault during storage size metric collection
This commit is contained in:
Kubernetes Prow Robot
2023-08-10 20:53:26 -07:00
committed by GitHub
2 changed files with 59 additions and 1 deletions

View File

@@ -85,7 +85,7 @@ var (
[]string{"endpoint"},
)
storageSizeDescription = compbasemetrics.NewDesc("apiserver_storage_size_bytes", "Size of the storage database file physically allocated in bytes.", []string{"cluster"}, nil, compbasemetrics.ALPHA, "")
storageMonitor = &monitorCollector{}
storageMonitor = &monitorCollector{monitorGetter: func() ([]Monitor, error) { return nil, nil }}
etcdEventsReceivedCounts = compbasemetrics.NewCounterVec(
&compbasemetrics.CounterOpts{
Subsystem: "apiserver",

View File

@@ -17,6 +17,7 @@ limitations under the License.
package metrics
import (
"context"
"errors"
"strings"
"testing"
@@ -179,3 +180,60 @@ etcd_request_errors_total{operation="foo",type="bar"} 1
})
}
}
func TestStorageSizeCollector(t *testing.T) {
registry := metrics.NewKubeRegistry()
registry.CustomMustRegister(storageMonitor)
testCases := []struct {
desc string
getterOverride func() ([]Monitor, error)
err error
want string
}{
{
desc: "fake etcd getter",
getterOverride: func() ([]Monitor, error) {
return []Monitor{fakeEtcdMonitor{storageSize: 1e9}}, nil
},
err: nil,
want: `# HELP apiserver_storage_size_bytes [ALPHA] Size of the storage database file physically allocated in bytes.
# TYPE apiserver_storage_size_bytes gauge
apiserver_storage_size_bytes{cluster="etcd-0"} 1e+09
`,
},
{
desc: "getters not configured",
getterOverride: nil,
err: nil,
want: ``,
},
}
for _, test := range testCases {
t.Run(test.desc, func(t *testing.T) {
defer registry.Reset()
if test.getterOverride != nil {
oldGetter := storageMonitor.monitorGetter
defer SetStorageMonitorGetter(oldGetter)
SetStorageMonitorGetter(test.getterOverride)
}
if err := testutil.GatherAndCompare(registry, strings.NewReader(test.want), "apiserver_storage_size_bytes"); err != nil {
t.Fatal(err)
}
})
}
}
type fakeEtcdMonitor struct {
storageSize int64
}
func (m fakeEtcdMonitor) Monitor(_ context.Context) (StorageMetrics, error) {
return StorageMetrics{Size: m.storageSize}, nil
}
func (m fakeEtcdMonitor) Close() error {
return nil
}