buildr/internal/rpc/v1/health_server.go
Peter 34c431790e
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/tag Build is failing
refactor: use connect-go instead of regular Google gRPC
- support binary name for plugins
- register plugins for container jobs
2023-09-12 18:43:34 +02:00

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
}
}