Kubernetes metrics 简单分析

289 阅读1分钟

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...)
}