kubernetes 监控注册项
kubernetes 监控注册项的初始化
实际上,kubernetes按照不同组件,将监控指标进行分组,称之为subsystem
const kubeServiceAccountSubsystem = "serviceaccount"
var (
// 这个是一个简单Counter
// LegacyTokensTotal is the number of legacy tokens used against apiserver.
legacyTokensTotal = metrics.NewCounter(
&metrics.CounterOpts{
Subsystem: kubeServiceAccountSubsystem,
Name: "legacy_tokens_total",
Help: "Cumulative legacy service account tokens used",
StabilityLevel: metrics.ALPHA,
},
)
// ...
)
var registerMetricsOnce sync.Once
func RegisterMetrics() {
registerMetricsOnce.Do(func() {
// 这里注册Counter
legacyregistry.MustRegister(legacyTokensTotal)
legacyregistry.MustRegister(staleTokensTotal)
legacyregistry.MustRegister(validTokensTotal)
})
}
- legacyregistry.MustRegister(legacyTokensTotal)
var (
// 初始化全局注册表
defaultRegistry = metrics.NewKubeRegistry()
// 调用的这里函数注册
// MustRegister registers registerable metrics but uses the global registry.
MustRegister = defaultRegistry.MustRegister
)
- metrics.NewKubeRegistry()
// BuildVersion is a helper function that can be easily mocked.
var BuildVersion = version.Get
func newKubeRegistry(v apimachineryversion.Info) *kubeRegistry {
r := &kubeRegistry{
PromRegistry: prometheus.NewRegistry(),
version: parseVersion(v),
hiddenCollectors: make(map[string]Registerable),
resettables: make([]resettable, 0),
}
registriesLock.Lock()
defer registriesLock.Unlock()
registries = append(registries, r)
return r
}
// NewKubeRegistry creates a new vanilla Registry without any Collectors
// pre-registered.
func NewKubeRegistry() KubeRegistry {
r := newKubeRegistry(BuildVersion())
return r
}
注册Collectors
Collector就是Prometheus中的基本的Counter, Gauge etc.
通常写demo的时候,要将Collector对象注册进prometheus.Registry中
但是kubernetes对监控项做了一个封装:
// Registerable is an interface for a collector metric which we
// will register with KubeRegistry.
type Registerable interface {
prometheus.Collector
// Create will mark deprecated state for the collector
Create(version *semver.Version) bool
// ClearState will clear all the states marked by Create.
ClearState()
// FQName returns the fully-qualified metric name of the collector.
FQName() string
}
所以当注册到prometheus时,实际上注册的是Registerable对象:
// MustRegister works like Register but registers any number of
// Collectors and panics upon the first registration that causes an
// error.
func (kr *kubeRegistry) MustRegister(cs ...Registerable) {
metrics := make([]prometheus.Collector, 0, len(cs))
for _, c := range cs {
if c.Create(&kr.version) {
metrics = append(metrics, c)
kr.addResettable(c)
} else {
kr.trackHiddenCollector(c)
}
}
kr.PromRegistry.MustRegister(metrics...)
}