blob: 3644dfb52fdaaa0bfef17201869b24b87f006de5 [file] [log] [blame]
/*
* 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
}