Skip to content

Commit 9f62a8c

Browse files
committed
add healthy bool
1 parent bf418dc commit 9f62a8c

File tree

3 files changed

+37
-8
lines changed

3 files changed

+37
-8
lines changed

coderd/healthcheck/derp.go

Lines changed: 22 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,8 @@ import (
2626
)
2727

2828
type DERPReport struct {
29-
mu sync.Mutex
29+
mu sync.Mutex
30+
Healthy bool `json:"healthy"`
3031

3132
Regions map[int]*DERPRegionReport `json:"regions"`
3233

@@ -35,17 +36,19 @@ type DERPReport struct {
3536
}
3637

3738
type DERPRegionReport struct {
38-
mu sync.Mutex
39-
Region *tailcfg.DERPRegion `json:"region"`
39+
mu sync.Mutex
40+
Healthy bool `json:"healthy"`
4041

41-
NodeReports []*DERPNodeReport `json:"node_reports"`
42+
Region *tailcfg.DERPRegion `json:"region"`
43+
NodeReports []*DERPNodeReport `json:"node_reports"`
4244
}
4345
type DERPNodeReport struct {
44-
Node *tailcfg.DERPNode `json:"node"`
45-
4646
mu sync.Mutex
4747
clientCounter int
4848

49+
Healthy bool `json:"healthy"`
50+
Node *tailcfg.DERPNode `json:"node"`
51+
4952
CanExchangeMessages bool `json:"can_exchange_messages"`
5053
RoundTripPing time.Duration `json:"round_trip_ping"`
5154
UsesWebsocket bool `json:"uses_websocket"`
@@ -66,6 +69,7 @@ type DERPReportOptions struct {
6669
}
6770

6871
func (r *DERPReport) Run(ctx context.Context, opts *DERPReportOptions) error {
72+
r.Healthy = true
6973
r.Regions = map[int]*DERPRegionReport{}
7074

7175
eg, ctx := errgroup.WithContext(ctx)
@@ -84,6 +88,9 @@ func (r *DERPReport) Run(ctx context.Context, opts *DERPReportOptions) error {
8488

8589
r.mu.Lock()
8690
r.Regions[region.RegionID] = &regionReport
91+
if !regionReport.Healthy {
92+
r.Healthy = false
93+
}
8794
r.mu.Unlock()
8895
return nil
8996
})
@@ -108,14 +115,16 @@ func (r *DERPReport) Run(ctx context.Context, opts *DERPReportOptions) error {
108115
}
109116

110117
func (r *DERPRegionReport) Run(ctx context.Context) error {
118+
r.Healthy = true
111119
r.NodeReports = []*DERPNodeReport{}
112120
eg, ctx := errgroup.WithContext(ctx)
113121

114122
for _, node := range r.Region.Nodes {
115123
node := node
116124
eg.Go(func() error {
117125
nodeReport := DERPNodeReport{
118-
Node: node,
126+
Node: node,
127+
Healthy: true,
119128
}
120129

121130
err := nodeReport.Run(ctx)
@@ -125,6 +134,9 @@ func (r *DERPRegionReport) Run(ctx context.Context) error {
125134

126135
r.mu.Lock()
127136
r.NodeReports = append(r.NodeReports, &nodeReport)
137+
if !nodeReport.Healthy {
138+
r.Healthy = false
139+
}
128140
r.mu.Unlock()
129141
return nil
130142
})
@@ -159,6 +171,9 @@ func (r *DERPNodeReport) Run(ctx context.Context) error {
159171
r.doExchangeMessage(ctx)
160172
r.doSTUNTest(ctx)
161173

174+
if !r.CanExchangeMessages || r.UsesWebsocket || r.STUN.Error != nil {
175+
r.Healthy = false
176+
}
162177
return nil
163178
}
164179

coderd/healthcheck/derp_test.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,8 +58,11 @@ func TestDERP(t *testing.T) {
5858
err := report.Run(ctx, opts)
5959
require.NoError(t, err)
6060

61+
assert.True(t, report.Healthy)
6162
for _, region := range report.Regions {
63+
assert.True(t, region.Healthy)
6264
for _, node := range region.NodeReports {
65+
assert.True(t, node.Healthy)
6366
assert.True(t, node.CanExchangeMessages)
6467
assert.Positive(t, node.RoundTripPing)
6568
assert.Len(t, node.ClientLogs, 2)
@@ -96,8 +99,11 @@ func TestDERP(t *testing.T) {
9699
err := report.Run(ctx, opts)
97100
require.NoError(t, err)
98101

102+
assert.True(t, report.Healthy)
99103
for _, region := range report.Regions {
104+
assert.True(t, region.Healthy)
100105
for _, node := range region.NodeReports {
106+
assert.True(t, node.Healthy)
101107
assert.True(t, node.CanExchangeMessages)
102108
assert.Positive(t, node.RoundTripPing)
103109
assert.Len(t, node.ClientLogs, 2)
@@ -156,8 +162,11 @@ func TestDERP(t *testing.T) {
156162

157163
report.Run(ctx, opts)
158164

165+
assert.False(t, report.Healthy)
159166
for _, region := range report.Regions {
167+
assert.False(t, region.Healthy)
160168
for _, node := range region.NodeReports {
169+
assert.False(t, node.Healthy)
161170
assert.True(t, node.CanExchangeMessages)
162171
assert.Positive(t, node.RoundTripPing)
163172
assert.Len(t, node.ClientLogs, 2)

coderd/healthcheck/healthcheck.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,11 @@ import (
99
)
1010

1111
type Report struct {
12-
Time time.Time `json:"time"`
12+
// Time is the time the report was generated at.
13+
Time time.Time `json:"time"`
14+
// Healthy is true if the report returns no errors.
15+
Healthy bool `json:"pass"`
16+
1317
DERP DERPReport `json:"derp"`
1418

1519
// TODO
@@ -33,5 +37,6 @@ func Run(ctx context.Context, opts *ReportOptions) (*Report, error) {
3337
}
3438

3539
report.Time = time.Now()
40+
report.Healthy = report.DERP.Healthy
3641
return &report, nil
3742
}

0 commit comments

Comments
 (0)