unary

package
v1.0.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Mar 7, 2026 License: MIT Imports: 9 Imported by: 0

Documentation

Overview

Package unary provides a production-ready execution pipeline for gRPC unary RPCs.

It wraps user handlers with admission control, panic recovery, deadline enforcement, retry/restart supervision, and error classification — all configured through functional options.

Quick Start

handler := unary.New(
    unary.WithAdmissionLimit(100),
)
server := grpc.NewServer(
    grpc.UnaryInterceptor(handler.UnaryServerInterceptor()),
)

Features

  • Automatic panic recovery with stack trace preservation
  • Configurable admission control (concurrency limiting)
  • Supervisor retry/restart/escalation policies
  • Deadline enforcement (before-admission, after-admission, ignore)
  • Prometheus and OpenTelemetry metrics via WithMetricsSink
  • Graceful shutdown coordination via WithShutdown
  • Consistent gRPC error code mapping

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

This section is empty.

Types

type Option

type Option func(*Options)

func WithAdmissionLimit

func WithAdmissionLimit(n int) Option

WithAdmissionLimit sets the maximum number of concurrent executions.

This is the recommended way to configure admission control. No internal imports required.

unary.New(unary.WithAdmissionLimit(100))  // max 100 concurrent
unary.New(unary.WithAdmissionLimit(-1))   // unlimited (default)
unary.New(unary.WithAdmissionLimit(0))    // reject all

func WithAdmissionLimiter

func WithAdmissionLimiter(l *admission.Limiter) Option

WithAdmissionLimiter sets a custom admission limiter.

Prefer WithAdmissionLimit(n) for simple capacity configuration. Use this for advanced cases requiring a pre-built limiter:

import "github.com/abhipray-cpu/grip/admission"

unary.WithAdmissionLimiter(admission.NewLimiter(100))

func WithDefaultDeadline

func WithDefaultDeadline(d time.Duration) Option

func WithMetricsSink

func WithMetricsSink(s metrics.Sink) Option

WithMetricsSink sets a custom metrics sink.

The sink must implement the metrics.Sink interface. Use the public packages for built-in implementations:

import "github.com/abhipray-cpu/grip/metrics"
import "github.com/abhipray-cpu/grip/metrics/prommetrics"

unary.WithMetricsSink(metrics.Noop())
unary.WithMetricsSink(prommetrics.New(prommetrics.DefaultOptions()))

func WithShutdown

func WithShutdown(s *lifecycle.Shutdown) Option

WithShutdown sets a custom shutdown coordinator.

Use the public lifecycle package:

import "github.com/abhipray-cpu/grip/lifecycle"

sd := lifecycle.NewShutdown()
unary.WithShutdown(sd)

func WithShutdownCoordinator

func WithShutdownCoordinator(sc core.ShutdownCoordinator) Option

WithShutdownCoordinator sets a shutdown coordinator using the public interface.

This accepts core.ShutdownCoordinator, which can be satisfied by lifecycle.NewShutdown() from the public lifecycle package.

Note: internally the coordinator must be a *lifecycle.Shutdown. Use WithShutdown for type-safe usage.

func WithSupervisorPolicy

func WithSupervisorPolicy(p supervisor.SupervisorPolicy) Option

type Options

type Options struct {
	// Core
	SupervisorPolicy supervisor.SupervisorPolicy
	MetricsSink      metrics.Sink
	Shutdown         *lifecycle.Shutdown

	// Admission (fast gate)
	AdmissionLimiter *admission.Limiter

	// Defaults
	DefaultDeadline time.Duration
}

Options holds the configuration for a unary handler.

External consumers should use the With* option functions instead of constructing this struct directly, since some fields use internal types.

func DefaultOptions

func DefaultOptions() Options

type Unary

type Unary struct {
	// contains filtered or unexported fields
}

func New

func New(opts ...Option) *Unary

func (*Unary) Execute

func (u *Unary) Execute(
	ctx context.Context,
	exec core.Execution,
	fn func(context.Context) error,
) error

func (*Unary) UnaryServerInterceptor

func (u *Unary) UnaryServerInterceptor() grpc.UnaryServerInterceptor

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL