-
Notifications
You must be signed in to change notification settings - Fork 104
/
cluster_ping.go
99 lines (83 loc) · 2.49 KB
/
cluster_ping.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
package gocb
import (
"time"
"github.com/couchbase/gocbcore/v9"
"github.com/google/uuid"
)
// Ping will ping a list of services and verify they are active and
// responding in an acceptable period of time.
func (c *Cluster) Ping(opts *PingOptions) (*PingResult, error) {
if opts == nil {
opts = &PingOptions{}
}
startTime := time.Now()
defer valueRecord(c.meter, meterValueServiceKV, "ping", startTime)
span := createSpan(c.tracer, opts.ParentSpan, "ping", "kv")
defer span.End()
provider, err := c.getDiagnosticsProvider()
if err != nil {
return nil, err
}
return ping(provider, opts, c.timeoutsConfig, span)
}
func ping(provider diagnosticsProvider, opts *PingOptions, timeouts TimeoutsConfig, parentSpan RequestSpan) (*PingResult, error) {
services := opts.ServiceTypes
gocbcoreServices := make([]gocbcore.ServiceType, len(services))
for i, svc := range services {
gocbcoreServices[i] = gocbcore.ServiceType(svc)
}
coreopts := gocbcore.PingOptions{
ServiceTypes: gocbcoreServices,
TraceContext: parentSpan.Context(),
}
now := time.Now()
timeout := opts.Timeout
if timeout == 0 {
coreopts.KVDeadline = now.Add(timeouts.KVTimeout)
coreopts.CapiDeadline = now.Add(timeouts.ViewTimeout)
coreopts.N1QLDeadline = now.Add(timeouts.QueryTimeout)
coreopts.CbasDeadline = now.Add(timeouts.AnalyticsTimeout)
coreopts.FtsDeadline = now.Add(timeouts.SearchTimeout)
coreopts.MgmtDeadline = now.Add(timeouts.ManagementTimeout)
} else {
coreopts.KVDeadline = now.Add(timeout)
coreopts.CapiDeadline = now.Add(timeout)
coreopts.N1QLDeadline = now.Add(timeout)
coreopts.CbasDeadline = now.Add(timeout)
coreopts.FtsDeadline = now.Add(timeout)
coreopts.MgmtDeadline = now.Add(timeout)
}
id := opts.ReportID
if id == "" {
id = uuid.New().String()
}
result, err := provider.Ping(coreopts)
if err != nil {
return nil, err
}
reportSvcs := make(map[ServiceType][]EndpointPingReport)
for svcType, svc := range result.Services {
st := ServiceType(svcType)
svcs := make([]EndpointPingReport, len(svc))
for i, rep := range svc {
var errStr string
if rep.Error != nil {
errStr = rep.Error.Error()
}
svcs[i] = EndpointPingReport{
ID: rep.ID,
Remote: rep.Endpoint,
State: PingState(rep.State),
Error: errStr,
Namespace: rep.Scope,
Latency: rep.Latency,
}
}
reportSvcs[st] = svcs
}
return &PingResult{
ID: id,
sdk: Identifier() + " " + "gocbcore/" + gocbcore.Version(),
Services: reportSvcs,
}, nil
}