-
Notifications
You must be signed in to change notification settings - Fork 21
/
Copy pathhealthcheck.go
80 lines (65 loc) · 2.25 KB
/
healthcheck.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
package grpcserver
import (
"context"
"fmt"
"strings"
"github.com/ankorstore/yokai/healthcheck"
"google.golang.org/grpc/codes"
"google.golang.org/grpc/health/grpc_health_v1"
"google.golang.org/grpc/status"
)
// GrpcHealthCheckService is a default gRPC health check server implementation working with the [healthcheck.Checker].
type GrpcHealthCheckService struct {
grpc_health_v1.UnimplementedHealthServer
checker *healthcheck.Checker
}
// NewGrpcHealthCheckService returns a new [GrpcHealthCheckService] instance.
func NewGrpcHealthCheckService(checker *healthcheck.Checker) *GrpcHealthCheckService {
return &GrpcHealthCheckService{
checker: checker,
}
}
// Check performs checks on the registered [healthcheck.CheckerProbe].
func (s *GrpcHealthCheckService) Check(ctx context.Context, in *grpc_health_v1.HealthCheckRequest) (*grpc_health_v1.HealthCheckResponse, error) {
logger := CtxLogger(ctx)
serviceName := strings.ToLower(in.Service)
var kind healthcheck.ProbeKind
switch {
case strings.Contains(serviceName, healthcheck.Liveness.String()):
kind = healthcheck.Liveness
case strings.Contains(serviceName, healthcheck.Readiness.String()):
kind = healthcheck.Readiness
default:
kind = healthcheck.Startup
}
result := s.checker.Check(ctx, kind)
if !result.Success {
evt := logger.Error()
evt.
Str("kind", kind.String()).
Str("caller", serviceName)
for probeName, probeResult := range result.ProbesResults {
evt.Str(probeName, fmt.Sprintf("success: %v, message: %s", probeResult.Success, probeResult.Message))
}
evt.Msg("grpc health check failure")
return &grpc_health_v1.HealthCheckResponse{
Status: grpc_health_v1.HealthCheckResponse_NOT_SERVING,
}, nil
}
logger.
Info().
Str("kind", kind.String()).
Str("caller", serviceName).
Msg("grpc health check success")
return &grpc_health_v1.HealthCheckResponse{
Status: grpc_health_v1.HealthCheckResponse_SERVING,
}, nil
}
// Watch is not implemented.
func (s *GrpcHealthCheckService) Watch(in *grpc_health_v1.HealthCheckRequest, watchServer grpc_health_v1.Health_WatchServer) error {
CtxLogger(watchServer.Context()).
Warn().
Str("caller", in.Service).
Msg("grpc health watch not implemented")
return status.Error(codes.Unimplemented, "watch is not implemented")
}