1
0
Fork 0
mirror of https://github.com/arangodb/kube-arangodb.git synced 2024-12-14 11:57:37 +00:00
kube-arangodb/pkg/deployment/metrics.go

139 lines
4.7 KiB
Go
Raw Normal View History

2018-08-31 14:08:21 +00:00
//
// DISCLAIMER
//
2021-10-09 14:47:18 +00:00
// Copyright 2016-2021 ArangoDB GmbH, Cologne, Germany
2018-08-31 14:08:21 +00:00
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
// Copyright holder is ArangoDB GmbH, Cologne, Germany
//
package deployment
2021-12-07 03:11:54 +00:00
import (
"sync"
api "github.com/arangodb/kube-arangodb/pkg/apis/deployment/v1"
"github.com/arangodb/kube-arangodb/pkg/util/metrics"
"github.com/prometheus/client_golang/prometheus"
)
2018-08-31 14:08:21 +00:00
const (
// Component name for metrics of this package
metricsComponent = "deployment"
)
2021-12-07 03:11:54 +00:00
func init() {
localInventory = inventory{
deployments: map[string]map[string]*Deployment{},
deploymentsMetric: metrics.NewDescription("arangodb_operator_deployments", "Number of active deployments", []string{"namespace", "deployment"}, nil),
deploymentMetricsMembersMetric: metrics.NewDescription("arango_operator_deployment_members", "List of members", []string{"namespace", "deployment", "role", "id"}, nil),
deploymentAgencyStateMetric: metrics.NewDescription("arango_operator_deployment_agency_state", "Reachability of agency", []string{"namespace", "deployment"}, nil),
deploymentShardLeadersMetric: metrics.NewDescription("arango_operator_deployment_shard_leaders", "Deployment leader shards distribution", []string{"namespace", "deployment", "database", "collection", "shard", "server"}, nil),
deploymentShardsMetric: metrics.NewDescription("arango_operator_deployment_shards", "Deployment shards distribution", []string{"namespace", "deployment", "database", "collection", "shard", "server"}, nil),
}
prometheus.MustRegister(&localInventory)
}
var localInventory inventory
var _ prometheus.Collector = &inventory{}
type inventory struct {
lock sync.Mutex
deployments map[string]map[string]*Deployment
deploymentsMetric, deploymentMetricsMembersMetric, deploymentAgencyStateMetric, deploymentShardsMetric, deploymentShardLeadersMetric metrics.Description
}
func (i *inventory) Describe(descs chan<- *prometheus.Desc) {
i.lock.Lock()
defer i.lock.Unlock()
metrics.NewPushDescription(descs).Push(i.deploymentsMetric, i.deploymentMetricsMembersMetric, i.deploymentAgencyStateMetric, i.deploymentShardLeadersMetric, i.deploymentShardsMetric)
}
func (i *inventory) Collect(m chan<- prometheus.Metric) {
i.lock.Lock()
defer i.lock.Unlock()
p := metrics.NewPushMetric(m)
for _, deployments := range i.deployments {
for _, deployment := range deployments {
p.Push(i.deploymentsMetric.Gauge(1, deployment.GetNamespace(), deployment.GetName()))
spec := deployment.GetSpec()
status, _ := deployment.GetStatus()
for _, member := range status.Members.AsList() {
p.Push(i.deploymentMetricsMembersMetric.Gauge(1, deployment.GetNamespace(), deployment.GetName(), member.Group.AsRole(), member.Member.ID))
}
if spec.Mode.Get().HasAgents() {
agency, agencyOk := deployment.GetAgencyCache()
if !agencyOk {
p.Push(i.deploymentAgencyStateMetric.Gauge(0, deployment.GetNamespace(), deployment.GetName()))
continue
}
p.Push(i.deploymentAgencyStateMetric.Gauge(1, deployment.GetNamespace(), deployment.GetName()))
if spec.Mode.Get() == api.DeploymentModeCluster {
for db, collections := range agency.Current.Collections {
for collection, shards := range collections {
for shard, details := range shards {
for id, server := range details.Servers {
name := "UNKNOWN"
if _, ok := agency.Plan.Collections[db]; ok {
if _, ok := agency.Plan.Collections[db][collection]; ok {
name = agency.Plan.Collections[db][collection].GetName(name)
}
}
m := []string{
deployment.GetNamespace(),
deployment.GetName(),
db,
name,
shard,
server,
}
if id == 0 {
p.Push(i.deploymentShardLeadersMetric.Gauge(1, m...))
}
p.Push(i.deploymentShardsMetric.Gauge(1, m...))
}
}
}
}
}
}
}
}
}
func (i *inventory) Add(d *Deployment) {
i.lock.Lock()
defer i.lock.Unlock()
name, namespace := d.GetName(), d.GetNamespace()
if _, ok := i.deployments[namespace]; !ok {
i.deployments[namespace] = map[string]*Deployment{}
}
i.deployments[namespace][name] = d
}