datasource/etcd/metrics.go (103 lines of code) (raw):

/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You 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. */ package etcd import ( "context" "fmt" "github.com/apache/servicecomb-service-center/datasource" "github.com/apache/servicecomb-service-center/datasource/etcd/path" "github.com/apache/servicecomb-service-center/datasource/etcd/sd" "github.com/apache/servicecomb-service-center/pkg/log" "github.com/go-chassis/cari/discovery" "github.com/little-cui/etcdadpt" ) type MetricsManager struct { } func (m *MetricsManager) Report(ctx context.Context, r datasource.MetricsReporter) error { reportDomains(ctx, r) reportServices(ctx, r) reportSchemas(ctx, r) return nil } func reportDomains(ctx context.Context, r datasource.MetricsReporter) { key := path.GenerateDomainKey("") domainsResp, err := sd.Domain().Search(ctx, etcdadpt.WithCacheOnly(), etcdadpt.WithCountOnly(), etcdadpt.WithStrKey(key), etcdadpt.WithPrefix()) if err != nil { log.Error("query all domains failed", err) return } r.DomainAdd(float64(domainsResp.Count)) } func reportSchemas(ctx context.Context, r datasource.MetricsReporter) { key := path.GetServiceSchemaSummaryRootKey("") schemaKeysResp, err := sd.SchemaSummary().Search(ctx, etcdadpt.WithCacheOnly(), etcdadpt.WithKeyOnly(), etcdadpt.WithStrKey(key), etcdadpt.WithPrefix()) if err != nil { log.Error("query all schemas failed", err) return } for _, keyValue := range schemaKeysResp.Kvs { domainProject, _, _ := path.GetInfoFromSchemaSummaryKV(keyValue.Key) domain, project := path.SplitDomainProject(domainProject) labels := datasource.MetricsLabels{ Domain: domain, Project: project, } r.SchemaAdd(1, labels) } } func reportServices(ctx context.Context, r datasource.MetricsReporter) { key := path.GetServiceRootKey("") servicesResp, err := sd.Service().Search(ctx, etcdadpt.WithCacheOnly(), etcdadpt.WithStrKey(key), etcdadpt.WithPrefix()) if err != nil { log.Error("query all microservices failed", err) return } for _, keyValue := range servicesResp.Kvs { service := keyValue.Value.(*discovery.MicroService) _, domainProject := path.GetInfoFromSvcKV(keyValue.Key) if datasource.IsGlobal(discovery.MicroServiceToKey(domainProject, service)) { continue } domain, project := path.SplitDomainProject(domainProject) frameworkName, frameworkVersion := discovery.ToFrameworkLabel(service) labels := datasource.MetricsLabels{ Domain: domain, Project: project, Framework: frameworkName, FrameworkVersion: frameworkVersion, } r.ServiceAdd(1, labels) reportInstances(ctx, r, domainProject, service) } } func reportInstances(ctx context.Context, r datasource.MetricsReporter, domainProject string, service *discovery.MicroService) { instancesResp, err := sd.Instance().Search(ctx, etcdadpt.WithCacheOnly(), etcdadpt.WithCountOnly(), etcdadpt.WithStrKey(path.GenerateInstanceKey(domainProject, service.ServiceId, "")), etcdadpt.WithPrefix()) if err != nil { log.Error(fmt.Sprintf("query microservice %s isntances failed", service.ServiceId), err) return } if instancesResp.Count == 0 { return } count := float64(instancesResp.Count) domain, project := path.SplitDomainProject(domainProject) frameworkName, frameworkVersion := discovery.ToFrameworkLabel(service) labels := datasource.MetricsLabels{ Domain: domain, Project: project, Framework: frameworkName, FrameworkVersion: frameworkVersion, } r.FrameworkSet(labels) r.InstanceAdd(count, labels) }