datasource/mongo/util.go (68 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 mongo import ( "context" "github.com/apache/servicecomb-service-center/datasource" "github.com/apache/servicecomb-service-center/pkg/util" pb "github.com/go-chassis/cari/discovery" "github.com/go-chassis/foundation/gopool" ) type InstanceSlice []*pb.MicroServiceInstance func (s InstanceSlice) Len() int { return len(s) } func (s InstanceSlice) Swap(i, j int) { s[i], s[j] = s[j], s[i] } func (s InstanceSlice) Less(i, j int) bool { return s[i].InstanceId < s[j].InstanceId } func statistics(ctx context.Context, withShared bool) (*pb.Statistics, error) { result := &pb.Statistics{ Services: &pb.StService{}, Instances: &pb.StInstance{}, Apps: &pb.StApp{}, } services, err := GetAllMicroServicesByDomainProject(ctx) if err != nil { return nil, err } var svcIDs []string var svcKeys []*pb.MicroServiceKey for _, svc := range services { svcIDs = append(svcIDs, svc.ServiceId) svcKeys = append(svcKeys, datasource.TransServiceToKey(util.ParseDomainProject(ctx), svc)) } svcIDToNonVerKey := datasource.SetStaticServices(result, svcKeys, svcIDs, withShared) respGetInstanceCountByDomain := make(chan datasource.GetInstanceCountByDomainResponse, 1) gopool.Go(func(_ context.Context) { getInstanceCountByDomain(ctx, svcIDToNonVerKey, respGetInstanceCountByDomain) }) instances, err := GetInstances(ctx) if err != nil { return nil, err } var instIDs []string for _, inst := range instances { instIDs = append(instIDs, inst.Instance.ServiceId) } datasource.SetStaticInstances(result, svcIDToNonVerKey, instIDs) data := <-respGetInstanceCountByDomain close(respGetInstanceCountByDomain) if data.Err != nil { return nil, data.Err } result.Instances.CountByDomain = data.CountByDomain return result, nil } func getInstanceCountByDomain(ctx context.Context, svcIDToNonVerKey map[string]string, resp chan datasource.GetInstanceCountByDomainResponse) { ret := datasource.GetInstanceCountByDomainResponse{} for sid := range svcIDToNonVerKey { num, err := CountInstance(ctx, sid) if err != nil { ret.Err = err return } ret.CountByDomain = ret.CountByDomain + num } resp <- ret }