53 lines
1.2 KiB
Go
53 lines
1.2 KiB
Go
package v1
|
|
|
|
import (
|
|
"context"
|
|
"log/slog"
|
|
"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"
|
|
)
|
|
|
|
const healthCheckInterval = 100 * time.Millisecond
|
|
|
|
var _ healthv1connect.HealthHandler = (*healthServer)(nil)
|
|
|
|
func NewHealthServer(logger *slog.Logger) healthv1connect.HealthHandler {
|
|
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{
|
|
Status: v1.HealthCheckResponse_SERVING,
|
|
}
|
|
|
|
return connect.NewResponse(resp), nil
|
|
}
|
|
|
|
func (h *healthServer) Watch(ctx context.Context, _ *connect.Request[v1.HealthCheckRequest], stream *connect.ServerStream[v1.HealthCheckResponse]) error {
|
|
ticker := time.NewTicker(healthCheckInterval)
|
|
|
|
defer ticker.Stop()
|
|
|
|
select {
|
|
case <-ticker.C:
|
|
err := stream.Send(&v1.HealthCheckResponse{
|
|
Status: v1.HealthCheckResponse_SERVING,
|
|
})
|
|
if err != nil {
|
|
h.logger.Error("Failed to send response", slog.String("err", err.Error()))
|
|
}
|
|
return nil
|
|
case <-ctx.Done():
|
|
return nil
|
|
}
|
|
}
|