...
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
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
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