k8s.io/apiserver@v0.31.1/pkg/storage/cacher/metrics/metrics.go (about)

     1  /*
     2  Copyright 2021 The Kubernetes Authors.
     3  
     4  Licensed under the Apache License, Version 2.0 (the "License");
     5  you may not use this file except in compliance with the License.
     6  You may obtain a copy of the License at
     7  
     8      http://www.apache.org/licenses/LICENSE-2.0
     9  
    10  Unless required by applicable law or agreed to in writing, software
    11  distributed under the License is distributed on an "AS IS" BASIS,
    12  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    13  See the License for the specific language governing permissions and
    14  limitations under the License.
    15  */
    16  
    17  package metrics
    18  
    19  import (
    20  	"sync"
    21  
    22  	compbasemetrics "k8s.io/component-base/metrics"
    23  	"k8s.io/component-base/metrics/legacyregistry"
    24  )
    25  
    26  const (
    27  	namespace = "apiserver"
    28  	subsystem = "watch_cache"
    29  )
    30  
    31  /*
    32   * By default, all the following metrics are defined as falling under
    33   * ALPHA stability level https://github.com/kubernetes/enhancements/blob/master/keps/sig-instrumentation/1209-metrics-stability/kubernetes-control-plane-metrics-stability.md#stability-classes)
    34   *
    35   * Promoting the stability level of the metric is a responsibility of the component owner, since it
    36   * involves explicitly acknowledging support for the metric across multiple releases, in accordance with
    37   * the metric stability policy.
    38   */
    39  var (
    40  	listCacheCount = compbasemetrics.NewCounterVec(
    41  		&compbasemetrics.CounterOpts{
    42  			Namespace:      namespace,
    43  			Name:           "cache_list_total",
    44  			Help:           "Number of LIST requests served from watch cache",
    45  			StabilityLevel: compbasemetrics.ALPHA,
    46  		},
    47  		[]string{"resource_prefix", "index"},
    48  	)
    49  	listCacheNumFetched = compbasemetrics.NewCounterVec(
    50  		&compbasemetrics.CounterOpts{
    51  			Namespace:      namespace,
    52  			Name:           "cache_list_fetched_objects_total",
    53  			Help:           "Number of objects read from watch cache in the course of serving a LIST request",
    54  			StabilityLevel: compbasemetrics.ALPHA,
    55  		},
    56  		[]string{"resource_prefix", "index"},
    57  	)
    58  	listCacheNumReturned = compbasemetrics.NewCounterVec(
    59  		&compbasemetrics.CounterOpts{
    60  			Namespace:      namespace,
    61  			Name:           "cache_list_returned_objects_total",
    62  			Help:           "Number of objects returned for a LIST request from watch cache",
    63  			StabilityLevel: compbasemetrics.ALPHA,
    64  		},
    65  		[]string{"resource_prefix"},
    66  	)
    67  	InitCounter = compbasemetrics.NewCounterVec(
    68  		&compbasemetrics.CounterOpts{
    69  			Namespace:      namespace,
    70  			Name:           "init_events_total",
    71  			Help:           "Counter of init events processed in watch cache broken by resource type.",
    72  			StabilityLevel: compbasemetrics.ALPHA,
    73  		},
    74  		[]string{"resource"},
    75  	)
    76  
    77  	EventsReceivedCounter = compbasemetrics.NewCounterVec(
    78  		&compbasemetrics.CounterOpts{
    79  			Namespace:      namespace,
    80  			Subsystem:      subsystem,
    81  			Name:           "events_received_total",
    82  			Help:           "Counter of events received in watch cache broken by resource type.",
    83  			StabilityLevel: compbasemetrics.ALPHA,
    84  		},
    85  		[]string{"resource"},
    86  	)
    87  
    88  	EventsCounter = compbasemetrics.NewCounterVec(
    89  		&compbasemetrics.CounterOpts{
    90  			Namespace:      namespace,
    91  			Subsystem:      subsystem,
    92  			Name:           "events_dispatched_total",
    93  			Help:           "Counter of events dispatched in watch cache broken by resource type.",
    94  			StabilityLevel: compbasemetrics.ALPHA,
    95  		},
    96  		[]string{"resource"},
    97  	)
    98  
    99  	TerminatedWatchersCounter = compbasemetrics.NewCounterVec(
   100  		&compbasemetrics.CounterOpts{
   101  			Namespace:      namespace,
   102  			Name:           "terminated_watchers_total",
   103  			Help:           "Counter of watchers closed due to unresponsiveness broken by resource type.",
   104  			StabilityLevel: compbasemetrics.ALPHA,
   105  		},
   106  		[]string{"resource"},
   107  	)
   108  
   109  	watchCacheResourceVersion = compbasemetrics.NewGaugeVec(
   110  		&compbasemetrics.GaugeOpts{
   111  			Namespace:      namespace,
   112  			Subsystem:      subsystem,
   113  			Name:           "resource_version",
   114  			Help:           "Current resource version of watch cache broken by resource type.",
   115  			StabilityLevel: compbasemetrics.ALPHA,
   116  		},
   117  		[]string{"resource"},
   118  	)
   119  
   120  	watchCacheCapacityIncreaseTotal = compbasemetrics.NewCounterVec(
   121  		&compbasemetrics.CounterOpts{
   122  			Subsystem:      subsystem,
   123  			Name:           "capacity_increase_total",
   124  			Help:           "Total number of watch cache capacity increase events broken by resource type.",
   125  			StabilityLevel: compbasemetrics.ALPHA,
   126  		},
   127  		[]string{"resource"},
   128  	)
   129  
   130  	watchCacheCapacityDecreaseTotal = compbasemetrics.NewCounterVec(
   131  		&compbasemetrics.CounterOpts{
   132  			Subsystem:      subsystem,
   133  			Name:           "capacity_decrease_total",
   134  			Help:           "Total number of watch cache capacity decrease events broken by resource type.",
   135  			StabilityLevel: compbasemetrics.ALPHA,
   136  		},
   137  		[]string{"resource"},
   138  	)
   139  
   140  	WatchCacheCapacity = compbasemetrics.NewGaugeVec(
   141  		&compbasemetrics.GaugeOpts{
   142  			Subsystem:      subsystem,
   143  			Name:           "capacity",
   144  			Help:           "Total capacity of watch cache broken by resource type.",
   145  			StabilityLevel: compbasemetrics.ALPHA,
   146  		},
   147  		[]string{"resource"},
   148  	)
   149  
   150  	WatchCacheInitializations = compbasemetrics.NewCounterVec(
   151  		&compbasemetrics.CounterOpts{
   152  			Namespace:      namespace,
   153  			Subsystem:      subsystem,
   154  			Name:           "initializations_total",
   155  			Help:           "Counter of watch cache initializations broken by resource type.",
   156  			StabilityLevel: compbasemetrics.ALPHA,
   157  		},
   158  		[]string{"resource"},
   159  	)
   160  
   161  	WatchCacheReadWait = compbasemetrics.NewHistogramVec(
   162  		&compbasemetrics.HistogramOpts{
   163  			Namespace:      namespace,
   164  			Subsystem:      subsystem,
   165  			Name:           "read_wait_seconds",
   166  			Help:           "Histogram of time spent waiting for a watch cache to become fresh.",
   167  			StabilityLevel: compbasemetrics.ALPHA,
   168  			Buckets:        []float64{0.005, 0.025, 0.05, 0.1, 0.2, 0.4, 0.6, 0.8, 1.0, 1.25, 1.5, 2, 3},
   169  		}, []string{"resource"})
   170  
   171  	ConsistentReadTotal = compbasemetrics.NewCounterVec(
   172  		&compbasemetrics.CounterOpts{
   173  			Namespace:      namespace,
   174  			Subsystem:      subsystem,
   175  			Name:           "consistent_read_total",
   176  			Help:           "Counter for consistent reads from cache.",
   177  			StabilityLevel: compbasemetrics.ALPHA,
   178  		}, []string{"resource", "success", "fallback"})
   179  )
   180  
   181  var registerMetrics sync.Once
   182  
   183  // Register all metrics.
   184  func Register() {
   185  	// Register the metrics.
   186  	registerMetrics.Do(func() {
   187  		legacyregistry.MustRegister(listCacheCount)
   188  		legacyregistry.MustRegister(listCacheNumFetched)
   189  		legacyregistry.MustRegister(listCacheNumReturned)
   190  		legacyregistry.MustRegister(InitCounter)
   191  		legacyregistry.MustRegister(EventsReceivedCounter)
   192  		legacyregistry.MustRegister(EventsCounter)
   193  		legacyregistry.MustRegister(TerminatedWatchersCounter)
   194  		legacyregistry.MustRegister(watchCacheResourceVersion)
   195  		legacyregistry.MustRegister(watchCacheCapacityIncreaseTotal)
   196  		legacyregistry.MustRegister(watchCacheCapacityDecreaseTotal)
   197  		legacyregistry.MustRegister(WatchCacheCapacity)
   198  		legacyregistry.MustRegister(WatchCacheInitializations)
   199  		legacyregistry.MustRegister(WatchCacheReadWait)
   200  		legacyregistry.MustRegister(ConsistentReadTotal)
   201  	})
   202  }
   203  
   204  // RecordListCacheMetrics notes various metrics of the cost to serve a LIST request
   205  func RecordListCacheMetrics(resourcePrefix, indexName string, numFetched, numReturned int) {
   206  	listCacheCount.WithLabelValues(resourcePrefix, indexName).Inc()
   207  	listCacheNumFetched.WithLabelValues(resourcePrefix, indexName).Add(float64(numFetched))
   208  	listCacheNumReturned.WithLabelValues(resourcePrefix).Add(float64(numReturned))
   209  }
   210  
   211  // RecordResourceVersion sets the current resource version for a given resource type.
   212  func RecordResourceVersion(resourcePrefix string, resourceVersion uint64) {
   213  	watchCacheResourceVersion.WithLabelValues(resourcePrefix).Set(float64(resourceVersion))
   214  }
   215  
   216  // RecordsWatchCacheCapacityChange record watchCache capacity resize(increase or decrease) operations.
   217  func RecordsWatchCacheCapacityChange(objType string, old, new int) {
   218  	WatchCacheCapacity.WithLabelValues(objType).Set(float64(new))
   219  	if old < new {
   220  		watchCacheCapacityIncreaseTotal.WithLabelValues(objType).Inc()
   221  		return
   222  	}
   223  	watchCacheCapacityDecreaseTotal.WithLabelValues(objType).Inc()
   224  }