mirror of
https://github.com/fnproject/fn.git
synced 2022-10-28 21:29:17 +03:00
* add user syslog writers to app users may specify a syslog url[s] on apps now and all functions under that app will spew their logs out to it. the docs have more information around details there, please review those (swagger and operating/logging.md), tried to implement to spec in some parts and improve others, open to feedback on format though, lots of liberty there. design decision wise, I am looking to the future and ignoring cold containers. the overhead of the connections there will not be worth it, so this feature only works for hot functions, since we're killing cold anyway (even if a user can just straight up exit a hot container). syslog connections will be opened against a container when it starts up, and then the call id that is logged gets swapped out for each call that goes through the container, this cuts down on the cost of opening/closing connections significantly. there are buffers to accumulate logs until we get a `\n` to actually write a syslog line, and a buffer to save some bytes when we're writing the syslog formatting as well. underneath writers re-use the line writer in certain scenarios (swapper). we could likely improve the ease of setting this up, but opening the syslog conns against a container seems worth it, and is a different path than the other func loggers that we create when we make a call object. the Close() stuff is a little tricky, not sure how to make it easier and have the ^ benefits, open to idears. this does add another vector of 'limits' to consider for more strict service operators. one being how many syslog urls can a user add to an app (infinite, atm) and the other being on the order of number of containers per host we could run out of connections in certain scenarios. there may be some utility in having multiple syslog sinks to send to, it could help with debugging at times to send to another destination or if a user is a client w/ someone and both want the function logs, e.g. (have used this for that in the past, specifically). this also doesn't work behind a proxy, which is something i'm open to fixing, but afaict will require a 3rd party dependency (we can pretty much steal what docker does). this is mostly of utility for those of us that work behind a proxy all the time, not really for end users. there are some unit tests. integration tests for this don't sound very fun to maintain. I did test against papertrail with each protocol and it works (and even times out if you're behind a proxy!). closes #337 * add trace to syslog dial
159 lines
5.6 KiB
Go
159 lines
5.6 KiB
Go
package models
|
|
|
|
import (
|
|
"net/http"
|
|
|
|
"github.com/fnproject/fn/api/agent/drivers"
|
|
"github.com/go-openapi/strfmt"
|
|
)
|
|
|
|
const (
|
|
// TypeNone ...
|
|
TypeNone = ""
|
|
// TypeSync ...
|
|
TypeSync = "sync"
|
|
// TypeAsync ...
|
|
TypeAsync = "async"
|
|
)
|
|
|
|
const (
|
|
// FormatDefault ...
|
|
FormatDefault = "default"
|
|
// FormatHTTP ...
|
|
FormatHTTP = "http"
|
|
// FormatJSON ...
|
|
FormatJSON = "json"
|
|
// FormatCloudEvent ...
|
|
FormatCloudEvent = "cloudevent"
|
|
)
|
|
|
|
var possibleStatuses = [...]string{"delayed", "queued", "running", "success", "error", "cancelled"}
|
|
|
|
// Call is a representation of a specific invocation of a route.
|
|
type Call struct {
|
|
// Unique identifier representing a specific call.
|
|
ID string `json:"id" db:"id"`
|
|
|
|
// NOTE: this is stale, retries are not implemented atm, but this is nice, so leaving
|
|
// States and valid transitions.
|
|
//
|
|
// +---------+
|
|
// +---------> delayed <----------------+
|
|
// +----+----+ |
|
|
// | |
|
|
// | |
|
|
// +----v----+ |
|
|
// +---------> queued <----------------+
|
|
// +----+----+ *
|
|
// | *
|
|
// | retry * creates new call
|
|
// +----v----+ *
|
|
// | running | *
|
|
// +--+-+-+--+ |
|
|
// +---------|-|-|-----+-------------+
|
|
// +---|---------+ | +-----|---------+ |
|
|
// | | | | | |
|
|
// +-----v---^-+ +--v-------^+ +--v---^-+
|
|
// | success | | cancelled | | error |
|
|
// +-----------+ +-----------+ +--------+
|
|
//
|
|
// * delayed - has a delay.
|
|
// * queued - Ready to be consumed when it's turn comes.
|
|
// * running - Currently consumed by a runner which will attempt to process it.
|
|
// * success - (or complete? success/error is common javascript terminology)
|
|
// * error - Something went wrong. In this case more information can be obtained
|
|
// by inspecting the "reason" field.
|
|
// - timeout
|
|
// - killed - forcibly killed by worker due to resource restrictions or access
|
|
// violations.
|
|
// - bad_exit - exited with non-zero status due to program termination/crash.
|
|
// * cancelled - cancelled via API. More information in the reason field.
|
|
// - client_request - Request was cancelled by a client.
|
|
Status string `json:"status" db:"status"`
|
|
|
|
// Path of the route that is responsible for this call
|
|
Path string `json:"path" db:"path"`
|
|
|
|
// Name of Docker image to use.
|
|
Image string `json:"image,omitempty" db:"-"`
|
|
|
|
// Number of seconds to wait before queueing the call for consumption for the
|
|
// first time. Must be a positive integer. Calls with a delay start in state
|
|
// "delayed" and transition to "running" after delay seconds.
|
|
Delay int32 `json:"delay,omitempty" db:"-"`
|
|
|
|
// Type indicates whether a task is to be run synchronously or asynchronously.
|
|
Type string `json:"type,omitempty" db:"-"`
|
|
|
|
// Format is the format to pass input into the function.
|
|
Format string `json:"format,omitempty" db:"-"`
|
|
|
|
// Payload for the call. This is only used by async calls, to store their input.
|
|
// TODO should we copy it into here too for debugging sync?
|
|
Payload string `json:"payload,omitempty" db:"-"`
|
|
|
|
// Full request url that spawned this invocation.
|
|
URL string `json:"url,omitempty" db:"-"`
|
|
|
|
// Method of the http request used to make this call.
|
|
Method string `json:"method,omitempty" db:"-"`
|
|
|
|
// Priority of the call. Higher has more priority. 3 levels from 0-2. Calls
|
|
// at same priority are processed in FIFO order.
|
|
Priority *int32 `json:"priority,omitempty" db:"-"`
|
|
|
|
// Maximum runtime in seconds.
|
|
Timeout int32 `json:"timeout,omitempty" db:"-"`
|
|
|
|
// Hot function idle timeout in seconds before termination.
|
|
IdleTimeout int32 `json:"idle_timeout,omitempty" db:"-"`
|
|
|
|
// Memory is the amount of RAM this call is allocated.
|
|
Memory uint64 `json:"memory,omitempty" db:"-"`
|
|
|
|
// CPU as in MilliCPUs where each CPU core is split into 1000 units, specified either
|
|
// *) milliCPUs as "100m" which is 1/10 of a CPU or
|
|
// *) as floating point number "0.1" which is 1/10 of a CPU
|
|
CPUs MilliCPUs `json:"cpus,omitempty" db:"-"`
|
|
|
|
// Config is the set of configuration variables for the call
|
|
Config Config `json:"config,omitempty" db:"-"`
|
|
|
|
// Annotations is the set of annotations for the app/route of the call.
|
|
Annotations Annotations `json:"annotations,omitempty" db:"-"`
|
|
|
|
// Headers are headers from the request that created this call
|
|
Headers http.Header `json:"headers,omitempty" db:"-"`
|
|
|
|
// SyslogURL is a syslog URL to send all logs to.
|
|
SyslogURL string `json:"syslog_url,omitempty" db:"-"`
|
|
|
|
// Time when call completed, whether it was successul or failed. Always in UTC.
|
|
CompletedAt strfmt.DateTime `json:"completed_at,omitempty" db:"completed_at"`
|
|
|
|
// Time when call was submitted. Always in UTC.
|
|
CreatedAt strfmt.DateTime `json:"created_at,omitempty" db:"created_at"`
|
|
|
|
// Time when call started execution. Always in UTC.
|
|
StartedAt strfmt.DateTime `json:"started_at,omitempty" db:"started_at"`
|
|
|
|
// Stats is a list of metrics from this call's execution, possibly empty.
|
|
Stats drivers.Stats `json:"stats,omitempty" db:"stats"`
|
|
|
|
// Error is the reason why the call failed, it is only non-empty if
|
|
// status is equal to "error".
|
|
Error string `json:"error,omitempty" db:"error"`
|
|
|
|
// App this call belongs to.
|
|
AppID string `json:"app_id" db:"app_id"`
|
|
}
|
|
|
|
type CallFilter struct {
|
|
Path string // match
|
|
AppID string // match
|
|
FromTime strfmt.DateTime
|
|
ToTime strfmt.DateTime
|
|
Cursor string
|
|
PerPage int
|
|
}
|