buildr/internal/rpc/v1/health_server.go

53 lines
1.2 KiB
Go
Raw Permalink Normal View History

2023-04-11 20:30:48 +00:00
package v1
import (
"context"
"log/slog"
2023-04-11 20:30:48 +00:00
"time"
"buf.build/gen/go/grpc/grpc/connectrpc/go/grpc/health/v1/healthv1connect"
v1 "buf.build/gen/go/grpc/grpc/protocolbuffers/go/grpc/health/v1"
"connectrpc.com/connect"
2023-04-11 20:30:48 +00:00
)
2023-06-22 16:06:56 +00:00
const healthCheckInterval = 100 * time.Millisecond
var _ healthv1connect.HealthHandler = (*healthServer)(nil)
2023-04-11 20:30:48 +00:00
func NewHealthServer(logger *slog.Logger) healthv1connect.HealthHandler {
2023-04-11 20:30:48 +00:00
return &healthServer{
logger: logger,
}
}
type healthServer struct {
logger *slog.Logger
}
func (h *healthServer) Check(context.Context, *connect.Request[v1.HealthCheckRequest]) (*connect.Response[v1.HealthCheckResponse], error) {
resp := &v1.HealthCheckResponse{
2023-04-11 20:30:48 +00:00
Status: v1.HealthCheckResponse_SERVING,
}
return connect.NewResponse(resp), nil
2023-04-11 20:30:48 +00:00
}
func (h *healthServer) Watch(ctx context.Context, _ *connect.Request[v1.HealthCheckRequest], stream *connect.ServerStream[v1.HealthCheckResponse]) error {
2023-06-22 16:06:56 +00:00
ticker := time.NewTicker(healthCheckInterval)
2023-04-11 20:30:48 +00:00
defer ticker.Stop()
select {
case <-ticker.C:
err := stream.Send(&v1.HealthCheckResponse{
2023-04-11 20:30:48 +00:00
Status: v1.HealthCheckResponse_SERVING,
})
if err != nil {
h.logger.Error("Failed to send response", slog.String("err", err.Error()))
}
return nil
case <-ctx.Done():
2023-04-11 20:30:48 +00:00
return nil
}
}