...

Source file src/golang.conradwood.net/go-easyops/client/fancy_querier.go

Documentation: golang.conradwood.net/go-easyops/client

     1  package client
     2  
     3  import (
     4  	"context"
     5  	"flag"
     6  	"fmt"
     7  	pb "golang.conradwood.net/apis/registry"
     8  	"golang.conradwood.net/go-easyops/cmdline"
     9  	"golang.conradwood.net/go-easyops/prometheus"
    10  	"golang.conradwood.net/go-easyops/standalone"
    11  	"sync"
    12  	"time"
    13  )
    14  
    15  var (
    16  	query_max_age = flag.Duration("ge_registry_query_cache_duration", time.Duration(5)*time.Second, "effectively a limit on how often a given registry will be queried for a given service")
    17  	keylock       sync.Map
    18  )
    19  
    20  type instance_cache_entry struct {
    21  	lock      sync.Mutex
    22  	res       []*pb.Target
    23  	err       error
    24  	refreshed time.Time
    25  }
    26  
    27  func queryServiceInstances(f_registry, serviceName string) ([]*pb.Target, error) {
    28  	key := f_registry + "_" + serviceName
    29  	ic, _ := keylock.LoadOrStore(key, &instance_cache_entry{})
    30  	ice := ic.(*instance_cache_entry)
    31  	if *dialer_debug {
    32  		fmt.Printf("[go-easyops] Request to resolve service address \"%s\" via registry %s...\n", serviceName, f_registry)
    33  	}
    34  	ice.lock.Lock()
    35  	defer ice.lock.Unlock()
    36  	if (ice.res != nil || ice.err != nil) && time.Since(ice.refreshed) < *query_max_age {
    37  		if *dialer_debug {
    38  			fmt.Printf("[go-easyops] Answering request to Resolve service address \"%s\" via registry %s from cache\n", serviceName, f_registry)
    39  		}
    40  		return ice.res, ice.err
    41  	}
    42  	//	serviceName := f.target
    43  	totalQueryCtr.With(prometheus.Labels{"servicename": serviceName}).Inc()
    44  	if *dialer_debug {
    45  		fmt.Printf("[go-easyops] Resolving service address \"%s\" via registry %s...\n", serviceName, f_registry)
    46  	}
    47  	request := &pb.V2GetTargetRequest{
    48  		ApiType:     pb.Apitype_grpc,
    49  		ServiceName: []string{serviceName},
    50  		Partition:   "",
    51  	}
    52  	var err error
    53  	var list *pb.V2GetTargetResponse
    54  	ctx := context.Background()
    55  	if cmdline.IsStandalone() {
    56  		list, err = standalone.Registry_V2GetTarget(ctx, request)
    57  	} else {
    58  		regClient, xerr := getRegistryClient(f_registry)
    59  		if xerr != nil {
    60  			return nil, xerr
    61  		}
    62  		list, err = regClient.V2GetTarget(ctx, request)
    63  	}
    64  	// error getting stuff from registry
    65  	if err != nil {
    66  		if *dialer_debug {
    67  			fmt.Printf("[go-easyops] error retrieving hosts for %s: %s\n", serviceName, err)
    68  		}
    69  		ice.err = err
    70  		ice.refreshed = time.Now()
    71  		return nil, err
    72  	}
    73  	ice.refreshed = time.Now()
    74  	ice.res = list.Targets
    75  	ice.err = nil
    76  	return list.Targets, nil
    77  }
    78  

View as plain text