mirror of
https://github.com/fnproject/fn.git
synced 2022-10-28 21:29:17 +03:00
* fn: latency metrics for various call states
This complements the API latency metrics available
on LB agent. In this case, we would like to measure
calls that have finished with the following status:
"completed"
"canceled"
"timeouts"
"errors"
"server_busy"
and while measuring this latency, we subtract the
amount of time actual function execution took. This
is not precise, but an approximation mostly suitable
for trending.
Going forward, we could also subtract UDS wait time and/or
docker pull latency from this latency as an enhancement
to this PR.
69 lines
2.6 KiB
Go
69 lines
2.6 KiB
Go
package runnerpool
|
|
|
|
import (
|
|
"context"
|
|
"crypto/tls"
|
|
"io"
|
|
"net/http"
|
|
"time"
|
|
|
|
"github.com/fnproject/fn/api/common"
|
|
"github.com/fnproject/fn/api/models"
|
|
)
|
|
|
|
// Placer implements a placement strategy for calls that are load-balanced
|
|
// across runners in a pool
|
|
type Placer interface {
|
|
PlaceCall(ctx context.Context, rp RunnerPool, call RunnerCall) error
|
|
GetPlacerConfig() PlacerConfig
|
|
}
|
|
|
|
// RunnerPool is the abstraction for getting an ordered list of runners to try for a call
|
|
type RunnerPool interface {
|
|
// returns an error for unrecoverable errors that should not be retried
|
|
Runners(ctx context.Context, call RunnerCall) ([]Runner, error)
|
|
Shutdown(ctx context.Context) error
|
|
}
|
|
|
|
// MTLSRunnerFactory represents a factory method for constructing runners using mTLS
|
|
type MTLSRunnerFactory func(addr string, tlsConf *tls.Config) (Runner, error)
|
|
|
|
// RunnerStatus is general information on Runner health as returned by Runner::Status() call
|
|
type RunnerStatus struct {
|
|
ActiveRequestCount int32 // Number of active running requests on Runner
|
|
RequestsReceived uint64 // Number of requests received by Runner
|
|
RequestsHandled uint64 // Number of requests handled without NACK by Runner
|
|
KdumpsOnDisk uint64 // Number of kdumps on disk
|
|
StatusFailed bool // True if Status execution failed
|
|
Cached bool // True if Status was provided from cache
|
|
StatusId string // Call ID for Status
|
|
Details string // General/Debug Log information
|
|
ErrorCode int32 // If StatusFailed, then error code is set
|
|
ErrorStr string // Error details if StatusFailed and ErrorCode is set
|
|
CreatedAt common.DateTime // Status creation date at Runner
|
|
StartedAt common.DateTime // Status execution date at Runner
|
|
CompletedAt common.DateTime // Status completion date at Runner
|
|
}
|
|
|
|
// Runner is the interface to invoke the execution of a function call on a specific runner
|
|
type Runner interface {
|
|
TryExec(ctx context.Context, call RunnerCall) (bool, error)
|
|
Status(ctx context.Context) (*RunnerStatus, error)
|
|
Close(ctx context.Context) error
|
|
Address() string
|
|
}
|
|
|
|
// RunnerCall provides access to the necessary details of request in order for it to be
|
|
// processed by a RunnerPool
|
|
type RunnerCall interface {
|
|
SlotHashId() string
|
|
Extensions() map[string]string
|
|
RequestBody() io.ReadCloser
|
|
ResponseWriter() http.ResponseWriter
|
|
StdErr() io.ReadWriteCloser
|
|
Model() *models.Call
|
|
// For metrics/stats, add special accounting for time spent in customer code
|
|
AddUserExecutionTime(dur time.Duration)
|
|
GetUserExecutionTime() *time.Duration
|
|
}
|