Documentation
¶
Index ¶
- Variables
- func GetJSON[T any](c *Client, ctx context.Context, url string) (T, error)
- func Permanent(err error) error
- func PostJSON[T any](c *Client, ctx context.Context, url string, body any) (T, error)
- func WithPriority(ctx context.Context) context.Context
- type AdaptiveTimeoutConfig
- type AdaptiveTimeoutPolicy
- type Backoff
- type BulkheadConfig
- type BulkheadPolicy
- func (b *BulkheadPolicy) Close()
- func (b *BulkheadPolicy) Denied() uint64
- func (b *BulkheadPolicy) Execute(ctx context.Context, req *http.Request, next PolicyFunc) (*http.Response, error)
- func (b *BulkheadPolicy) InFlight() uint32
- func (b *BulkheadPolicy) WithLogger(l *slog.Logger) *BulkheadPolicy
- func (b *BulkheadPolicy) WithMetrics(m MetricsRecorder) *BulkheadPolicy
- type CacheConfig
- type CachePolicy
- type CircuitBreakerPolicy
- func (cb *CircuitBreakerPolicy) Execute(ctx context.Context, req *http.Request, next PolicyFunc) (*http.Response, error)
- func (cb *CircuitBreakerPolicy) State() State
- func (cb *CircuitBreakerPolicy) WithHooks(h Hooks) *CircuitBreakerPolicy
- func (cb *CircuitBreakerPolicy) WithLogger(l *slog.Logger) *CircuitBreakerPolicy
- func (cb *CircuitBreakerPolicy) WithMetrics(m MetricsRecorder) *CircuitBreakerPolicy
- func (cb *CircuitBreakerPolicy) WithName(name string) *CircuitBreakerPolicy
- type CircuitConfig
- type Client
- func (c *Client) Close() error
- func (c *Client) Delete(ctx context.Context, url string) (*http.Response, error)
- func (c *Client) Do(req *http.Request) (*http.Response, error)
- func (c *Client) DoWithContext(ctx context.Context, req *http.Request) (*http.Response, error)
- func (c *Client) Get(ctx context.Context, url string) (*http.Response, error)
- func (c *Client) Head(ctx context.Context, url string) (*http.Response, error)
- func (c *Client) HealthChecker() *HealthChecker
- func (c *Client) Options(ctx context.Context, url string) (*http.Response, error)
- func (c *Client) Patch(ctx context.Context, url, contentType string, body io.Reader) (*http.Response, error)
- func (c *Client) Post(ctx context.Context, url, contentType string, body io.Reader) (*http.Response, error)
- func (c *Client) Put(ctx context.Context, url, contentType string, body io.Reader) (*http.Response, error)
- func (c *Client) RoundTrip(req *http.Request) (*http.Response, error)
- func (c *Client) Stats() ClientStats
- func (c *Client) Transport() http.RoundTripper
- type ClientStats
- type Counter
- type CounterVec
- type FallbackConfig
- type FallbackPolicy
- type Gauge
- type GaugeVec
- type HealthChecker
- type HealthStatus
- type Histogram
- type HistogramVec
- type Hooks
- type Interceptor
- type Logger
- type MemoryStats
- type MetricsRecorder
- type Option
- func AggressiveConfig() []Option
- func ConservativeConfig() []Option
- func DefaultConfig() []Option
- func ProductionConfig() []Option
- func WithAdaptiveTimeout(cfg AdaptiveTimeoutConfig) Option
- func WithBulkhead(cfg BulkheadConfig) Option
- func WithCache(cfg CacheConfig) Option
- func WithCircuitBreaker(cfg CircuitConfig) Option
- func WithCustomLogger(l Logger) Option
- func WithDebug() Option
- func WithFallback(cfg FallbackConfig) Option
- func WithHTTPClient(hc *http.Client) Option
- func WithHooks(h Hooks) Option
- func WithInterceptor(i Interceptor) Option
- func WithLogger(l *slog.Logger) Option
- func WithMaxBodySize(n int64) Option
- func WithMetrics(r MetricsRecorder) Option
- func WithPolicy(p Policy) Option
- func WithRateLimit(cfg RateLimitConfig) Option
- func WithRequestID(header string) Option
- func WithRequestIDPolicy(p *RequestIDPolicy) Option
- func WithRequestLog(cfg RequestLogConfig) Option
- func WithRetry(cfg RetryConfig) Option
- func WithRetryBudget(budget float64, window time.Duration) Option
- func WithSingleflight() Option
- func WithTimeout(cfg TimeoutConfig) Option
- func WithTimeoutMap(rules map[string]time.Duration) Option
- type PermanentError
- type Policy
- type PolicyFunc
- type PrometheusConfig
- type PrometheusRecorder
- func (r *PrometheusRecorder) RecordBulkheadDenied(method, url string)
- func (r *PrometheusRecorder) RecordCircuitStateChange(name string, from, to State)
- func (r *PrometheusRecorder) RecordFallback(method, url string)
- func (r *PrometheusRecorder) RecordRateLimitDenied(method, url string)
- func (r *PrometheusRecorder) RecordRequest(method, url string, status int, duration time.Duration)
- func (r *PrometheusRecorder) RecordRetry(method, url string, attempt int)
- func (r *PrometheusRecorder) RecordTimeout(method, url string)
- type RateLimitConfig
- type RateLimitPolicy
- func (r *RateLimitPolicy) AvailableTokens() int
- func (r *RateLimitPolicy) Close()
- func (r *RateLimitPolicy) Execute(ctx context.Context, req *http.Request, next PolicyFunc) (*http.Response, error)
- func (r *RateLimitPolicy) WithLogger(l *slog.Logger) *RateLimitPolicy
- func (r *RateLimitPolicy) WithMetrics(m MetricsRecorder) *RateLimitPolicy
- type RequestError
- type RequestIDPolicy
- type RequestLogConfig
- type RequestLogger
- type RetryBudget
- type RetryConfig
- type RetryPolicy
- func (r *RetryPolicy) Execute(ctx context.Context, req *http.Request, next PolicyFunc) (*http.Response, error)
- func (r *RetryPolicy) WithBudget(b *RetryBudget) *RetryPolicy
- func (r *RetryPolicy) WithHooks(h Hooks) *RetryPolicy
- func (r *RetryPolicy) WithLogger(l *slog.Logger) *RetryPolicy
- func (r *RetryPolicy) WithMetrics(m MetricsRecorder) *RetryPolicy
- type SingleflightConfig
- type SingleflightPolicy
- type State
- type TimeoutConfig
- type TimeoutMapPolicy
- type TimeoutPolicy
Examples ¶
Constants ¶
This section is empty.
Variables ¶
var ( ErrCircuitOpen = errors.New("ambatukam: circuit breaker is open") ErrMaxRetries = errors.New("ambatukam: max retries exceeded") ErrNilRequest = errors.New("ambatukam: nil request") ErrTimeout = errors.New("ambatukam: per-attempt timeout exceeded") ErrBulkheadFull = errors.New("ambatukam: bulkhead full") ErrRateLimited = errors.New("ambatukam: rate limited") ErrFallback = errors.New("ambatukam: fallback failed") )
Functions ¶
func GetJSON ¶
Example ¶
ExampleGetJSON demonstrates the typed JSON helper.
srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json")
fmt.Fprint(w, `{"name":"alice","age":30}`)
}))
defer srv.Close()
client := ambatukam.New()
defer client.Close()
u, err := ambatukam.GetJSON[testUser](client, context.Background(), srv.URL)
if err != nil {
fmt.Println("error:", err)
return
}
fmt.Println(u.Name, u.Age)
Output: alice 30
func Permanent ¶
Example ¶
ExamplePermanent demonstrates marking an error as non-retryable.
package main
import (
"errors"
"fmt"
"github.com/farhanturu/ambatukam-go"
)
func main() {
err := ambatukam.Permanent(errors.New("do not retry me"))
fmt.Println(err)
}
Output: permanent: do not retry me
func PostJSON ¶
Example ¶
ExamplePostJSON demonstrates the typed JSON POST helper.
srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json")
w.WriteHeader(201)
fmt.Fprint(w, `{"name":"bob","age":25}`)
}))
defer srv.Close()
client := ambatukam.New()
defer client.Close()
out, err := ambatukam.PostJSON[testUser](client, context.Background(), srv.URL, testUser{Name: "alice", Age: 30})
if err != nil {
fmt.Println("error:", err)
return
}
fmt.Println(out.Name, out.Age)
Output: bob 25
Types ¶
type AdaptiveTimeoutConfig ¶ added in v1.2.5
type AdaptiveTimeoutPolicy ¶ added in v1.2.5
type AdaptiveTimeoutPolicy struct {
// contains filtered or unexported fields
}
func NewAdaptiveTimeout ¶ added in v1.2.5
func NewAdaptiveTimeout(cfg AdaptiveTimeoutConfig) *AdaptiveTimeoutPolicy
func (*AdaptiveTimeoutPolicy) CurrentTimeout ¶ added in v1.2.5
func (at *AdaptiveTimeoutPolicy) CurrentTimeout() time.Duration
func (*AdaptiveTimeoutPolicy) Execute ¶ added in v1.2.5
func (at *AdaptiveTimeoutPolicy) Execute(ctx context.Context, req *http.Request, next PolicyFunc) (*http.Response, error)
func (*AdaptiveTimeoutPolicy) WithMetrics ¶ added in v1.2.5
func (at *AdaptiveTimeoutPolicy) WithMetrics(m MetricsRecorder) *AdaptiveTimeoutPolicy
type BulkheadConfig ¶
type BulkheadPolicy ¶
type BulkheadPolicy struct {
// contains filtered or unexported fields
}
func NewBulkhead ¶
func NewBulkhead(cfg BulkheadConfig) *BulkheadPolicy
Example ¶
ExampleNewBulkhead demonstrates configuring a bulkhead.
package main
import (
"fmt"
"time"
"github.com/farhanturu/ambatukam-go"
)
func main() {
cfg := ambatukam.BulkheadConfig{
MaxConcurrent: 5,
MaxQueue: 10,
QueueTimeout: 100 * time.Millisecond,
}
client := ambatukam.New(ambatukam.WithBulkhead(cfg))
defer client.Close()
fmt.Println("max concurrent:", cfg.MaxConcurrent)
}
Output: max concurrent: 5
func (*BulkheadPolicy) Close ¶ added in v1.2.2
func (b *BulkheadPolicy) Close()
func (*BulkheadPolicy) Denied ¶
func (b *BulkheadPolicy) Denied() uint64
func (*BulkheadPolicy) Execute ¶
func (b *BulkheadPolicy) Execute(ctx context.Context, req *http.Request, next PolicyFunc) (*http.Response, error)
func (*BulkheadPolicy) InFlight ¶
func (b *BulkheadPolicy) InFlight() uint32
func (*BulkheadPolicy) WithLogger ¶
func (b *BulkheadPolicy) WithLogger(l *slog.Logger) *BulkheadPolicy
func (*BulkheadPolicy) WithMetrics ¶ added in v1.2.1
func (b *BulkheadPolicy) WithMetrics(m MetricsRecorder) *BulkheadPolicy
type CacheConfig ¶ added in v1.2.5
type CachePolicy ¶ added in v1.2.5
type CachePolicy struct {
// contains filtered or unexported fields
}
func NewCache ¶ added in v1.2.5
func NewCache(cfg CacheConfig) *CachePolicy
func (*CachePolicy) Execute ¶ added in v1.2.5
func (c *CachePolicy) Execute(ctx context.Context, req *http.Request, next PolicyFunc) (*http.Response, error)
func (*CachePolicy) SetStats ¶ added in v1.2.5
func (c *CachePolicy) SetStats(s *statsRecorder)
type CircuitBreakerPolicy ¶
type CircuitBreakerPolicy struct {
// contains filtered or unexported fields
}
func NewCircuitBreaker ¶
func NewCircuitBreaker(cfg CircuitConfig) *CircuitBreakerPolicy
Example ¶
ExampleNewCircuitBreaker demonstrates configuring the circuit breaker.
package main
import (
"fmt"
"time"
"github.com/farhanturu/ambatukam-go"
)
func main() {
cfg := ambatukam.DefaultCircuitConfig()
cfg.FailureThreshold = 3
cfg.OpenDuration = 10 * time.Second
client := ambatukam.New(ambatukam.WithCircuitBreaker(cfg))
defer client.Close()
fmt.Println("failure threshold:", cfg.FailureThreshold)
}
Output: failure threshold: 3
func (*CircuitBreakerPolicy) Execute ¶
func (cb *CircuitBreakerPolicy) Execute(ctx context.Context, req *http.Request, next PolicyFunc) (*http.Response, error)
func (*CircuitBreakerPolicy) State ¶
func (cb *CircuitBreakerPolicy) State() State
func (*CircuitBreakerPolicy) WithHooks ¶
func (cb *CircuitBreakerPolicy) WithHooks(h Hooks) *CircuitBreakerPolicy
func (*CircuitBreakerPolicy) WithLogger ¶
func (cb *CircuitBreakerPolicy) WithLogger(l *slog.Logger) *CircuitBreakerPolicy
func (*CircuitBreakerPolicy) WithMetrics ¶ added in v1.2.1
func (cb *CircuitBreakerPolicy) WithMetrics(m MetricsRecorder) *CircuitBreakerPolicy
func (*CircuitBreakerPolicy) WithName ¶
func (cb *CircuitBreakerPolicy) WithName(name string) *CircuitBreakerPolicy
type CircuitConfig ¶
type CircuitConfig struct {
ShouldTrip func(resp *http.Response, err error) bool
OpenDuration time.Duration
FailureThreshold uint32
HalfOpenMaxReqs uint32
}
func DefaultCircuitConfig ¶
func DefaultCircuitConfig() CircuitConfig
type Client ¶
type Client struct {
// contains filtered or unexported fields
}
func NewDefaultClient ¶
func NewDefaultClient() *Client
Example ¶
ExampleNewDefaultClient demonstrates the one-call production-default client.
package main
import (
"fmt"
"github.com/farhanturu/ambatukam-go"
)
func main() {
client := ambatukam.NewDefaultClient()
defer client.Close()
fmt.Println("ok")
}
Output: ok
func (*Client) DoWithContext ¶
func (*Client) Get ¶
Example ¶
ExampleClient_Get demonstrates a basic GET request with all three policies.
package main
import (
"context"
"fmt"
"net/http"
"net/http/httptest"
"time"
"github.com/farhanturu/ambatukam-go"
)
func main() {
srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(http.StatusOK)
fmt.Fprint(w, `{"hello":"world"}`)
}))
defer srv.Close()
client := ambatukam.New(
ambatukam.WithTimeout(ambatukam.TimeoutConfig{Timeout: 2 * time.Second}),
ambatukam.WithRetry(ambatukam.DefaultRetryConfig()),
ambatukam.WithCircuitBreaker(ambatukam.DefaultCircuitConfig()),
)
defer client.Close()
resp, err := client.Get(context.Background(), srv.URL)
if err != nil {
fmt.Println("error:", err)
return
}
defer resp.Body.Close()
fmt.Println("status:", resp.StatusCode)
}
Output: status: 200
func (*Client) HealthChecker ¶ added in v1.1.0
func (c *Client) HealthChecker() *HealthChecker
func (*Client) Post ¶
func (c *Client) Post(ctx context.Context, url, contentType string, body io.Reader) (*http.Response, error)
Example ¶
ExampleClient_Post demonstrates a POST with a JSON body.
package main
import (
"context"
"fmt"
"io"
"net/http"
"net/http/httptest"
"strings"
"github.com/farhanturu/ambatukam-go"
)
func main() {
srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
body, _ := io.ReadAll(r.Body)
fmt.Println("server received:", string(body))
w.WriteHeader(http.StatusCreated)
}))
defer srv.Close()
client := ambatukam.New()
defer client.Close()
resp, err := client.Post(
context.Background(),
srv.URL+"/users",
"application/json",
io.NopCloser(strings.NewReader(`{"name":"alice"}`)),
)
if err != nil {
fmt.Println("error:", err)
return
}
defer resp.Body.Close()
fmt.Println("status:", resp.StatusCode)
}
Output: server received: {"name":"alice"} status: 201
func (*Client) RoundTrip ¶
Example ¶
ExampleClient_RoundTrip shows how to use an amba *Client as the Transport of a standard *http.Client.
package main
import (
"fmt"
"net/http"
"net/http/httptest"
"github.com/farhanturu/ambatukam-go"
)
func main() {
srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(200)
}))
defer srv.Close()
amba := ambatukam.New(ambatukam.WithRetry(ambatukam.RetryConfig{MaxRetries: 2}))
defer amba.Close()
hc := &http.Client{Transport: amba.Transport()}
resp, err := hc.Get(srv.URL)
if err != nil {
fmt.Println("error:", err)
return
}
defer resp.Body.Close()
fmt.Println("status:", resp.StatusCode)
}
Output: status: 200
func (*Client) Stats ¶ added in v1.2.5
func (c *Client) Stats() ClientStats
func (*Client) Transport ¶
func (c *Client) Transport() http.RoundTripper
type ClientStats ¶ added in v1.2.5
type CounterVec ¶ added in v1.2.0
type FallbackConfig ¶ added in v1.1.0
type FallbackPolicy ¶ added in v1.1.0
type FallbackPolicy struct {
// contains filtered or unexported fields
}
func NewFallback ¶ added in v1.1.0
func NewFallback(cfg FallbackConfig) *FallbackPolicy
func (*FallbackPolicy) Execute ¶ added in v1.1.0
func (f *FallbackPolicy) Execute(ctx context.Context, req *http.Request, next PolicyFunc) (*http.Response, error)
func (*FallbackPolicy) WithHooks ¶ added in v1.1.0
func (f *FallbackPolicy) WithHooks(h Hooks) *FallbackPolicy
func (*FallbackPolicy) WithMetrics ¶ added in v1.2.1
func (f *FallbackPolicy) WithMetrics(m MetricsRecorder) *FallbackPolicy
type HealthChecker ¶ added in v1.1.0
type HealthChecker struct {
// contains filtered or unexported fields
}
func NewHealthChecker ¶ added in v1.1.0
func NewHealthChecker(c *Client) *HealthChecker
func (*HealthChecker) Close ¶ added in v1.2.1
func (h *HealthChecker) Close()
func (*HealthChecker) Handler ¶ added in v1.1.0
func (h *HealthChecker) Handler() http.HandlerFunc
type HealthStatus ¶ added in v1.1.0
type HistogramVec ¶ added in v1.2.0
type Interceptor ¶ added in v1.2.5
type MemoryStats ¶ added in v1.1.0
type MetricsRecorder ¶ added in v1.1.0
type MetricsRecorder interface {
RecordRequest(method, url string, status int, duration time.Duration)
RecordRetry(method, url string, attempt int)
RecordCircuitStateChange(name string, from, to State)
RecordBulkheadDenied(method, url string)
RecordRateLimitDenied(method, url string)
RecordFallback(method, url string)
RecordTimeout(method, url string)
}
func NewNoopMetricsRecorder ¶ added in v1.1.0
func NewNoopMetricsRecorder() MetricsRecorder
type Option ¶
type Option func(*Client)
func AggressiveConfig ¶
func AggressiveConfig() []Option
func ConservativeConfig ¶
func ConservativeConfig() []Option
func DefaultConfig ¶
func DefaultConfig() []Option
func ProductionConfig ¶
func ProductionConfig() []Option
func WithAdaptiveTimeout ¶ added in v1.2.5
func WithAdaptiveTimeout(cfg AdaptiveTimeoutConfig) Option
func WithBulkhead ¶
func WithBulkhead(cfg BulkheadConfig) Option
func WithCache ¶ added in v1.2.5
func WithCache(cfg CacheConfig) Option
func WithCircuitBreaker ¶
func WithCircuitBreaker(cfg CircuitConfig) Option
func WithCustomLogger ¶ added in v1.2.0
func WithFallback ¶ added in v1.1.0
func WithFallback(cfg FallbackConfig) Option
func WithHTTPClient ¶
Example ¶
ExampleWithHTTPClient demonstrates swapping in a custom *http.Client.
package main
import (
"fmt"
"net/http"
"time"
"github.com/farhanturu/ambatukam-go"
)
func main() {
client := ambatukam.New(
ambatukam.WithHTTPClient(&http.Client{Timeout: 5 * time.Second}),
)
defer client.Close()
fmt.Println("custom http.Client")
}
Output: custom http.Client
func WithInterceptor ¶ added in v1.2.5
func WithInterceptor(i Interceptor) Option
func WithLogger ¶
func WithMaxBodySize ¶ added in v1.2.4
func WithMetrics ¶ added in v1.1.0
func WithMetrics(r MetricsRecorder) Option
func WithPolicy ¶
func WithRateLimit ¶
func WithRateLimit(cfg RateLimitConfig) Option
func WithRequestID ¶
func WithRequestIDPolicy ¶
func WithRequestIDPolicy(p *RequestIDPolicy) Option
func WithRequestLog ¶ added in v1.2.5
func WithRequestLog(cfg RequestLogConfig) Option
func WithRetry ¶
func WithRetry(cfg RetryConfig) Option
func WithRetryBudget ¶ added in v1.2.5
func WithSingleflight ¶ added in v1.1.0
func WithSingleflight() Option
func WithTimeout ¶
func WithTimeout(cfg TimeoutConfig) Option
type PermanentError ¶
type PermanentError struct{ Err error }
func (*PermanentError) Error ¶
func (e *PermanentError) Error() string
func (*PermanentError) Unwrap ¶
func (e *PermanentError) Unwrap() error
type Policy ¶
type Policy interface {
Execute(ctx context.Context, req *http.Request, next PolicyFunc) (*http.Response, error)
}
func Chain ¶
Example ¶
ExampleChain demonstrates manual composition of policies.
package main
import (
"fmt"
"time"
"github.com/farhanturu/ambatukam-go"
)
func main() {
client := ambatukam.New(ambatukam.WithPolicy(ambatukam.Chain(
ambatukam.NewTimeout(ambatukam.TimeoutConfig{Timeout: 2 * time.Second}),
ambatukam.NewRetry(ambatukam.DefaultRetryConfig()),
ambatukam.NewCircuitBreaker(ambatukam.DefaultCircuitConfig()),
)))
defer client.Close()
fmt.Println("chained: ok")
}
Output: chained: ok
type PolicyFunc ¶
type PrometheusConfig ¶ added in v1.2.0
type PrometheusConfig struct {
RequestsTotal CounterVec
RetriesTotal CounterVec
CircuitState GaugeVec
RequestDuration HistogramVec
BulkheadDenied CounterVec
RateLimitDenied CounterVec
FallbacksTotal CounterVec
TimeoutsTotal CounterVec
CircuitTransitions CounterVec
}
type PrometheusRecorder ¶ added in v1.2.0
type PrometheusRecorder struct {
// contains filtered or unexported fields
}
func NewPrometheusRecorder ¶ added in v1.2.0
func NewPrometheusRecorder(cfg PrometheusConfig) *PrometheusRecorder
func (*PrometheusRecorder) RecordBulkheadDenied ¶ added in v1.2.0
func (r *PrometheusRecorder) RecordBulkheadDenied(method, url string)
func (*PrometheusRecorder) RecordCircuitStateChange ¶ added in v1.2.0
func (r *PrometheusRecorder) RecordCircuitStateChange(name string, from, to State)
func (*PrometheusRecorder) RecordFallback ¶ added in v1.2.0
func (r *PrometheusRecorder) RecordFallback(method, url string)
func (*PrometheusRecorder) RecordRateLimitDenied ¶ added in v1.2.0
func (r *PrometheusRecorder) RecordRateLimitDenied(method, url string)
func (*PrometheusRecorder) RecordRequest ¶ added in v1.2.0
func (r *PrometheusRecorder) RecordRequest(method, url string, status int, duration time.Duration)
func (*PrometheusRecorder) RecordRetry ¶ added in v1.2.0
func (r *PrometheusRecorder) RecordRetry(method, url string, attempt int)
func (*PrometheusRecorder) RecordTimeout ¶ added in v1.2.0
func (r *PrometheusRecorder) RecordTimeout(method, url string)
type RateLimitConfig ¶
type RateLimitPolicy ¶
type RateLimitPolicy struct {
// contains filtered or unexported fields
}
func NewRateLimit ¶
func NewRateLimit(cfg RateLimitConfig) *RateLimitPolicy
Example ¶
ExampleNewRateLimit demonstrates building a rate-limit policy directly.
package main
import (
"fmt"
"github.com/farhanturu/ambatukam-go"
)
func main() {
client := ambatukam.New(ambatukam.WithRateLimit(ambatukam.RateLimitConfig{
Rate: 10,
Burst: 5,
}))
defer client.Close()
fmt.Println("rate limited client ready")
}
Output: rate limited client ready
func (*RateLimitPolicy) AvailableTokens ¶ added in v1.2.5
func (r *RateLimitPolicy) AvailableTokens() int
func (*RateLimitPolicy) Close ¶ added in v1.2.2
func (r *RateLimitPolicy) Close()
func (*RateLimitPolicy) Execute ¶
func (r *RateLimitPolicy) Execute(ctx context.Context, req *http.Request, next PolicyFunc) (*http.Response, error)
func (*RateLimitPolicy) WithLogger ¶
func (r *RateLimitPolicy) WithLogger(l *slog.Logger) *RateLimitPolicy
func (*RateLimitPolicy) WithMetrics ¶ added in v1.2.1
func (r *RateLimitPolicy) WithMetrics(m MetricsRecorder) *RateLimitPolicy
type RequestError ¶
type RequestError struct {
Method string
URL string
Err error
Policy string
Status int
Attempts int
}
func (*RequestError) Error ¶
func (e *RequestError) Error() string
func (*RequestError) Unwrap ¶
func (e *RequestError) Unwrap() error
type RequestIDPolicy ¶
type RequestIDPolicy struct {
// contains filtered or unexported fields
}
func NewRequestIDPolicy ¶
func NewRequestIDPolicy() *RequestIDPolicy
Example ¶
ExampleNewRequestIDPolicy demonstrates registering a request-ID policy.
package main
import (
"fmt"
"github.com/farhanturu/ambatukam-go"
)
func main() {
client := ambatukam.New(ambatukam.WithRequestIDPolicy(ambatukam.NewRequestIDPolicy()))
defer client.Close()
fmt.Println("request ID policy enabled")
}
Output: request ID policy enabled
func (*RequestIDPolicy) Execute ¶
func (r *RequestIDPolicy) Execute(ctx context.Context, req *http.Request, next PolicyFunc) (*http.Response, error)
func (*RequestIDPolicy) WithGenerator ¶
func (r *RequestIDPolicy) WithGenerator(gen func() string) *RequestIDPolicy
func (*RequestIDPolicy) WithHeader ¶
func (r *RequestIDPolicy) WithHeader(name string) *RequestIDPolicy
type RequestLogConfig ¶ added in v1.2.5
type RequestLogger ¶ added in v1.2.5
type RequestLogger struct {
// contains filtered or unexported fields
}
func NewRequestLogger ¶ added in v1.2.5
func NewRequestLogger(cfg RequestLogConfig) *RequestLogger
func (*RequestLogger) Wrap ¶ added in v1.2.5
func (rl *RequestLogger) Wrap(next PolicyFunc) PolicyFunc
type RetryBudget ¶ added in v1.2.5
type RetryBudget struct {
// contains filtered or unexported fields
}
func NewRetryBudget ¶ added in v1.2.5
func NewRetryBudget(budget float64, window time.Duration) *RetryBudget
func (*RetryBudget) Allow ¶ added in v1.2.5
func (rb *RetryBudget) Allow() bool
func (*RetryBudget) Stats ¶ added in v1.2.5
func (rb *RetryBudget) Stats() (total, retries int64)
type RetryConfig ¶
type RetryConfig struct {
Backoff Backoff
ShouldRetry func(resp *http.Response, err error) bool
InitialBackoff time.Duration
MaxBackoff time.Duration
Multiplier float64
Jitter float64
MaxRetries int
MaxBodySize int64
}
func DefaultRetryConfig ¶
func DefaultRetryConfig() RetryConfig
type RetryPolicy ¶
type RetryPolicy struct {
// contains filtered or unexported fields
}
func NewRetry ¶
func NewRetry(cfg RetryConfig) *RetryPolicy
Example ¶
ExampleNewRetry demonstrates configuring the retry policy.
package main
import (
"fmt"
"time"
"github.com/farhanturu/ambatukam-go"
)
func main() {
cfg := ambatukam.DefaultRetryConfig()
cfg.MaxRetries = 5
cfg.Backoff = ambatukam.ExponentialBackoff(50*time.Millisecond, time.Second, 2.0, 0.2)
client := ambatukam.New(ambatukam.WithRetry(cfg))
defer client.Close()
fmt.Println("max retries:", cfg.MaxRetries)
}
Output: max retries: 5
func (*RetryPolicy) Execute ¶
func (r *RetryPolicy) Execute(ctx context.Context, req *http.Request, next PolicyFunc) (*http.Response, error)
func (*RetryPolicy) WithBudget ¶ added in v1.2.5
func (r *RetryPolicy) WithBudget(b *RetryBudget) *RetryPolicy
func (*RetryPolicy) WithHooks ¶
func (r *RetryPolicy) WithHooks(h Hooks) *RetryPolicy
func (*RetryPolicy) WithLogger ¶
func (r *RetryPolicy) WithLogger(l *slog.Logger) *RetryPolicy
func (*RetryPolicy) WithMetrics ¶ added in v1.2.1
func (r *RetryPolicy) WithMetrics(m MetricsRecorder) *RetryPolicy
type SingleflightConfig ¶ added in v1.1.0
type SingleflightConfig struct {
Enabled bool
}
type SingleflightPolicy ¶ added in v1.1.0
type SingleflightPolicy struct {
// contains filtered or unexported fields
}
func NewSingleflight ¶ added in v1.1.0
func NewSingleflight() *SingleflightPolicy
func (*SingleflightPolicy) Execute ¶ added in v1.1.0
func (sf *SingleflightPolicy) Execute(ctx context.Context, req *http.Request, next PolicyFunc) (*http.Response, error)
func (*SingleflightPolicy) SetMaxBodySize ¶ added in v1.2.4
func (sf *SingleflightPolicy) SetMaxBodySize(n int64)
type TimeoutConfig ¶
type TimeoutMapPolicy ¶ added in v1.2.0
type TimeoutMapPolicy struct {
// contains filtered or unexported fields
}
func NewTimeoutMap ¶ added in v1.2.0
func NewTimeoutMap(rules map[string]time.Duration) *TimeoutMapPolicy
func (*TimeoutMapPolicy) Execute ¶ added in v1.2.0
func (t *TimeoutMapPolicy) Execute(ctx context.Context, req *http.Request, next PolicyFunc) (*http.Response, error)
func (*TimeoutMapPolicy) WithMetrics ¶ added in v1.2.1
func (t *TimeoutMapPolicy) WithMetrics(m MetricsRecorder) *TimeoutMapPolicy
type TimeoutPolicy ¶
type TimeoutPolicy struct {
// contains filtered or unexported fields
}
func NewTimeout ¶
func NewTimeout(cfg TimeoutConfig) *TimeoutPolicy
Example ¶
ExampleNewTimeout demonstrates configuring the per-attempt timeout.
package main
import (
"fmt"
"time"
"github.com/farhanturu/ambatukam-go"
)
func main() {
client := ambatukam.New(
ambatukam.WithTimeout(ambatukam.TimeoutConfig{Timeout: 500 * time.Millisecond}),
)
defer client.Close()
fmt.Println("timeout: ok")
}
Output: timeout: ok
func (*TimeoutPolicy) Execute ¶
func (t *TimeoutPolicy) Execute(ctx context.Context, req *http.Request, next PolicyFunc) (*http.Response, error)
func (*TimeoutPolicy) WithMetrics ¶ added in v1.2.1
func (t *TimeoutPolicy) WithMetrics(m MetricsRecorder) *TimeoutPolicy