Documentation
¶
Index ¶
- Constants
- Variables
- func AddGetPipelineDocFunc(f GetPipelineDocFunc)
- func AddHeaders(req *http.Request, headers map[string][]string)
- func AddHealthIndicator(hi HealthIndicator)
- func AddPropagationKey(key string)
- func AddPropagationKeys(keys ...string)
- func AddShutdownHook(hook func())
- func AddXDesc(code string, desc string)
- func ArgKeyVal(args []string) map[string][]string
- func BearerAuth(delegate http.Handler, getExpectedToken func() string) http.HandlerFunc
- func BootstrapServer(args []string)
- func BuildRollingLogFileWriter(p NewRollingLogFileParam) *lumberjack.Logger
- func ChainValidationError(parentField string, e error) error
- func ClientSkipTlsSecureCheck()
- func ConfigureLogging(rail Rail) error
- func ConsulBootstrap(rail Rail) error
- func ConsulBootstrapCondition(rail Rail) (bool, error)
- func ContainsProp(prop string) bool
- func CustomFormatter() logrus.Formatter
- func Debug(args ...interface{})
- func DebugTimeOp(r Rail, start time.Time, name string)
- func Debugf(format string, args ...interface{})
- func DefaultHealthCheck(ctx *gin.Context)
- func DefaultMetricDesc(matcher *regexp.Regexp) []metrics.Description
- func DefaultReadConfig(args []string, rail Rail)
- func DefaultRecovery(c *gin.Context, e interface{})
- func DeregisterConsulService() error
- func DispatchErrMsgJson(c *gin.Context, msg string)
- func DispatchJson(c *gin.Context, body interface{})
- func DispatchJsonCode(c *gin.Context, code int, body interface{})
- func EnableBasicAuth(f func(username string, password string, url string, method string) bool)
- func Error(args ...interface{})
- func Errorf(format string, args ...interface{})
- func ExtractArgValue(args []string, predicate util.Predicate[string]) string
- func Fatal(args ...interface{})
- func Fatalf(format string, args ...interface{})
- func FilterMetricDesc(nameFilter func(name string) bool, ...) []metrics.Description
- func GetConfIntSlice(prop string) []int
- func GetConsulClient() *api.Client
- func GetCtxInt(ctx context.Context, key string) (int, bool)
- func GetCtxStr(ctx context.Context, key string) (string, bool)
- func GetEnv(key string) string
- func GetEnvElse(key string, defVal string) string
- func GetLocalIPV4() string
- func GetPropBool(prop string) bool
- func GetPropDur(prop string, unit time.Duration) time.Duration
- func GetPropInt(prop string) int
- func GetPropIntSlice(prop string) []int
- func GetPropStr(prop string) string
- func GetPropStrMap(prop string) map[string]string
- func GetPropStrSlice(prop string) []string
- func GetPropagationKeys() []string
- func GuessConfigFilePath(args []string) string
- func HandleEndpointResult(inb Inbound, rail Rail, result any, err error)
- func HasProp(prop string) bool
- func HasScheduledJobs() bool
- func Info(args ...interface{})
- func Infof(format string, args ...interface{})
- func InitConsulClient() error
- func IsConsulClientInitialized() bool
- func IsConsulServiceRegistered() bool
- func IsDebugLevel() bool
- func IsLocalAddress(address string) bool
- func IsNoneErr(err error) bool
- func IsProdMode() bool
- func IsShuttingDown() bool
- func JoinQueryParam(queryParams map[string][]string) string
- func LTimeOp(start time.Time, name string)
- func LoadConfigFromFile(configFile string, r Rail) error
- func LoadConfigFromReader(reader io.Reader, r Rail) error
- func LoadConfigFromStr(s string, r Rail) error
- func LoadPropagationKeys(r Rail)
- func ManualBootstrapPrometheus()
- func ManualPprofRegister()
- func MarkServerShuttingDown()
- func MustBind(rail Rail, c *gin.Context, ptr any)
- func MustCompile(fs embed.FS, s string) *template.Template
- func NewDeleteRequest(url string) (*http.Request, error)
- func NewGetRequest(url string) (*http.Request, error)
- func NewHeadRequest(url string) (*http.Request, error)
- func NewOptionsRequest(url string) (*http.Request, error)
- func NewPostRequest(url string, body io.Reader) (*http.Request, error)
- func NewPromCounter(name string) prometheus.Counter
- func NewPromHisto(name string) prometheus.Histogram
- func NewPromHistoVec(name string, labels []string) *prometheus.HistogramVec
- func NewPutRequest(url string, body io.Reader) (*http.Request, error)
- func OverwriteConf(args []string)
- func PTimeOp(start time.Time, name string)
- func ParseBearer(authorization string) (string, bool)
- func ParseLogLevel(logLevel string) (logrus.Level, bool)
- func PerfLogExclPath(path string)
- func PerfMiddleware() gin.HandlerFunc
- func PostJobExec(hook PostJobHook)
- func PostJson(url string, json string) (*http.Response, error)
- func PostServerBootstrapped(callback func(rail Rail) error)
- func PreConfiguredFormatter() logrus.Formatter
- func PreJobExec(hook PreJobHook)
- func PreProcessGin(preProcessor GinPreProcessor)
- func PreServerBootstrap(callback func(rail Rail) error)
- func PrepareWebStaticFs(fs embed.FS, dir string)
- func PrometheusBootstrap(rail Rail) error
- func PrometheusBootstrapCondition(rail Rail) (bool, error)
- func PrometheusHandler() http.Handler
- func RawAny(url string, handler RawTRouteHandler, extra ...util.StrPair)
- func RegisterBootstrapCallback(bootstrapComponent ComponentBootstrap)
- func RegisterConsulService() error
- func ResolveArg(arg string) string
- func ResolveServerHost(address string) string
- func ScheduleCron(job Job) error
- func SchedulerBootstrap(rail Rail) error
- func SendGet(url string, headers map[string][]string) (*http.Response, error)
- func SendPost(url string, body io.Reader) (*http.Response, error)
- func ServeStatic(inb *Inbound, fs embed.FS, file string)
- func ServeTempl(inb *Inbound, fs embed.FS, tmplName string, data any)
- func SetDefProp(prop string, defVal any)
- func SetDefaultTimeout(ttl time.Duration)
- func SetEnv(key string, val string)
- func SetErrLogHandler(handler ErrorLogHandler) bool
- func SetLogLevel(level string)
- func SetProp(prop string, val any)
- func SetResultBodyBuilder(rbb ResultBodyBuilder) error
- func Shutdown()
- func SprintMemStats(ms runtime.MemStats) string
- func StartSchedulerAsync()
- func StartSchedulerBlocking()
- func StopScheduler()
- func SubscribeServerChanges(rail Rail, name string, cbk func()) error
- func TimeOp(r Rail, start time.Time, name string)
- func TraceLogger(ctx context.Context) *logrus.Entry
- func TraceMiddleware() gin.HandlerFunc
- func TraceRequest(ctx context.Context, req *http.Request) *http.Request
- func Tracef(format string, args ...interface{})
- func UnmarshalFromProp(ptr any)
- func UnmarshalFromPropKey(key string, ptr any)
- func UsePropagationKeys(forEach func(key string))
- func Validate(target any) error
- func ValidateIntRule(ival int64, rule string, fname string, param string) error
- func ValidateRule(field reflect.StructField, value reflect.Value, rule string, ruleParam string) error
- func Warn(args ...interface{})
- func Warnf(format string, args ...interface{})
- func WebServerBootstrap(rail Rail) error
- func WebServerBootstrapCondition(rail Rail) (bool, error)
- type CTFormatter
- type ComponentBootstrap
- type ConsulApiImpl
- func (c ConsulApiImpl) CatalogFetchServiceNames(rail Rail) (map[string][]string, error)
- func (c ConsulApiImpl) CatalogFetchServiceNodes(rail Rail, name string) ([]*api.CatalogService, error)
- func (c ConsulApiImpl) DeregisterService(serviceId string) error
- func (c ConsulApiImpl) RegisterService(registration *api.AgentServiceRegistration) error
- type ConsulServerList
- func (s *ConsulServerList) IsSubscribed(rail Rail, service string) bool
- func (s *ConsulServerList) ListServers(rail Rail, name string) []Server
- func (s *ConsulServerList) PollInstance(rail Rail, name string) error
- func (s *ConsulServerList) PollInstances(rail Rail) error
- func (s *ConsulServerList) Subscribe(rail Rail, service string) error
- func (s *ConsulServerList) Unsubscribe(rail Rail, service string) error
- func (s *ConsulServerList) UnsubscribeAll(rail Rail) error
- type ErrorLog
- type ErrorLogHandler
- type GetPipelineDocFunc
- type GinPreProcessor
- type GnResp
- type HardcodedServiceRegistry
- type HealthIndicator
- type HealthStatus
- type HistTimer
- type HttpRoute
- type HttpRouteDoc
- type Inbound
- func (i *Inbound) AddHeader(k string, v string)
- func (i *Inbound) Engine() any
- func (i *Inbound) HandleResult(result any, err error)
- func (i *Inbound) Header(k string) string
- func (i *Inbound) Query(k string) string
- func (i *Inbound) Rail() Rail
- func (i *Inbound) SetHeader(k string, v string)
- func (i *Inbound) Status(status int)
- func (i *Inbound) Unwrap() (http.ResponseWriter, *http.Request)
- type Job
- type JobExecStats
- type JobInf
- type JsonDesc
- type LazyRouteDecl
- func Delete[Res any](url string, handler TRouteHandler[Res]) *LazyRouteDecl
- func Get[Res any](url string, handler TRouteHandler[Res]) *LazyRouteDecl
- func IDelete[Req any, Res any](url string, handler MappedTRouteHandler[Req, Res]) *LazyRouteDecl
- func IGet[Req any, Res any](url string, handler MappedTRouteHandler[Req, Res]) *LazyRouteDecl
- func IPost[Req any, Res any](url string, handler MappedTRouteHandler[Req, Res]) *LazyRouteDecl
- func IPut[Req any, Res any](url string, handler MappedTRouteHandler[Req, Res]) *LazyRouteDecl
- func NewLazyRouteDecl(url string, method string, handler func(c *gin.Context)) *LazyRouteDecl
- func Post[Res any](url string, handler TRouteHandler[Res]) *LazyRouteDecl
- func Put[Res any](url string, handler TRouteHandler[Res]) *LazyRouteDecl
- func RawDelete(url string, handler RawTRouteHandler) *LazyRouteDecl
- func RawGet(url string, handler RawTRouteHandler) *LazyRouteDecl
- func RawPost(url string, handler RawTRouteHandler) *LazyRouteDecl
- func RawPut(url string, handler RawTRouteHandler) *LazyRouteDecl
- func (g *LazyRouteDecl) Desc(desc string) *LazyRouteDecl
- func (g *LazyRouteDecl) DocHeader(headerName string, desc string) *LazyRouteDecl
- func (g *LazyRouteDecl) DocHeaderReq(v any) *LazyRouteDecl
- func (g *LazyRouteDecl) DocJsonReq(v any) *LazyRouteDecl
- func (g *LazyRouteDecl) DocJsonResp(v any) *LazyRouteDecl
- func (g *LazyRouteDecl) DocQueryParam(queryName string, desc string) *LazyRouteDecl
- func (g *LazyRouteDecl) DocQueryReq(v any) *LazyRouteDecl
- func (g *LazyRouteDecl) Extra(key string, value any) *LazyRouteDecl
- func (g *LazyRouteDecl) Prepend(baseUrl string)
- func (g *LazyRouteDecl) Protected() *LazyRouteDecl
- func (g *LazyRouteDecl) Public() *LazyRouteDecl
- func (g *LazyRouteDecl) Resource(resource string) *LazyRouteDecl
- func (g *LazyRouteDecl) Scope(scope string) *LazyRouteDecl
- type LocalCache
- type MappedTRouteHandler
- type MetricsCollector
- type MisoErr
- type NewRollingLogFileParam
- type OrderedShutdownHook
- type PageRes
- type Paging
- type ParamDoc
- type PipelineDoc
- type PostJobHook
- type PreJobHook
- type PropagationKeys
- type Rail
- func (r Rail) Context() context.Context
- func (r Rail) CtxValInt(key string) int
- func (r Rail) CtxValStr(key string) string
- func (r Rail) CtxValue(key string) any
- func (r Rail) Debug(args ...interface{})
- func (r Rail) Debugf(format string, args ...interface{})
- func (r Rail) Debugln(args ...interface{})
- func (r Rail) Error(args ...interface{})
- func (r Rail) Errorf(format string, args ...interface{})
- func (r Rail) Errorln(args ...interface{})
- func (r Rail) Fatal(args ...interface{})
- func (r Rail) Fatalf(format string, args ...interface{})
- func (r Rail) Fatalln(args ...interface{})
- func (r Rail) Info(args ...interface{})
- func (r Rail) Infof(format string, args ...interface{})
- func (r Rail) Infoln(args ...interface{})
- func (r Rail) IsDone() bool
- func (r Rail) NextSpan() Rail
- func (r Rail) Panic(args ...interface{})
- func (r Rail) Panicf(format string, args ...interface{})
- func (r Rail) Panicln(args ...interface{})
- func (r Rail) Print(args ...interface{})
- func (r Rail) Printf(format string, args ...interface{})
- func (r Rail) Println(args ...interface{})
- func (r Rail) SpanId() string
- func (r Rail) TraceId() string
- func (r Rail) Tracef(format string, args ...interface{})
- func (r Rail) Warn(args ...interface{})
- func (r Rail) Warnf(format string, args ...interface{})
- func (r Rail) Warnln(args ...interface{})
- func (r Rail) WithCancel() (Rail, context.CancelFunc)
- func (r Rail) WithCtxVal(key string, val any) Rail
- type RawTRouteHandler
- type Resp
- type RespUnwrapper
- type ResultBodyBuilder
- type RoutingGroup
- type Server
- type ServerChangeListenerMap
- type ServerList
- type ServerListServiceRegistry
- type ServerSelector
- type ServiceRegistry
- type TBucket
- type TClient
- func (t *TClient) AddHeader(k string, v string) *TClient
- func (t *TClient) AddHeaders(headers map[string]string) *TClient
- func (t *TClient) AddQueryParams(k string, v ...string) *TClient
- func (t *TClient) Delete() *TResponse
- func (t *TClient) EnableServiceDiscovery(serviceName string) *TClient
- func (t *TClient) EnableTracing() *TClient
- func (t *TClient) Get() *TResponse
- func (t *TClient) Head() *TResponse
- func (t *TClient) Http() *TClient
- func (t *TClient) Https() *TClient
- func (t *TClient) Options() *TResponse
- func (t *TClient) Post(body io.Reader) *TResponse
- func (t *TClient) PostBytes(body []byte) *TResponse
- func (t *TClient) PostForm(data url.Values) *TResponse
- func (t *TClient) PostJson(body any) *TResponse
- func (t *TClient) Put(body io.Reader) *TResponse
- func (t *TClient) PutBytes(body []byte) *TResponse
- func (t *TClient) PutJson(body any) *TResponse
- func (t *TClient) Require2xx() *TClient
- func (t *TClient) SetContentType(ct string) *TClient
- func (t *TClient) SetHeaders(k string, v ...string) *TClient
- func (t *TClient) UseClient(client *http.Client) *TClient
- type TResponse
- type TRouteHandler
- type TTLCache
- type TickRunner
- type TreePath
- type ValidationError
- type VecTimer
Constants ¶
const ( TagApiDocDesc = "desc" TagApiDocXDesc = "xdesc" )
const ( // Service registration status - passing. ConsulStatusPassing = "passing" // Zero value for empty serviceId ServiceIdNil = "nil" )
const ( ServiceStatusUp = "UP" ServiceStatusDown = "DOWN" )
const ( LOOPBACK_LOCALHOST = "localhost" LOOPBACK_127 = "127.0.0.1" LOCAL_IP_ANY = "0.0.0.0" )
const ( // whether production mode is turned on (true/false) PropProdMode = "mode.production" /* ------------------------------------ Prop for App ------------------------------------ */ PropAppName = "app.name" /* ------------------------------------ Prop for Consul ------------------------------------ */ PropConsulEnabled = "consul.enabled" PropConsuleRegisterName = "consul.registerName" PropConsulRegisterAddress = "consul.registerAddress" PropConsulAddress = "consul.consulAddress" PropConsulHealthcheckUrl = "consul.healthCheckUrl" PropConsulHealthCheckInterval = "consul.healthCheckInterval" PropConsulHealthcheckTimeout = "consul.healthCheckTimeout" PropConsulHealthCheckFailedDeregAfter = "consul.healthCheckFailedDeregisterAfter" PropConsulRegisterDefaultHealthcheck = "consul.registerDefaultHealthCheck" PropConsulFetchServerInterval = "consul.fetchServerInterval" PropConsulDeregisterUrl = "consul.deregisterUrl" PropConsulEnableDeregisterUrl = "consul.enableDeregisterUrl" PropConsulMetadata = "consul.metadata" /* ------------------------------------ Prop for ServiceDiscovery ------------------------------------ */ PropSDSubscrbe = "service-discovery.subscribe" PropServerEnabled = "server.enabled" PropServerHost = "server.host" PropServerPort = "server.port" PropServerGracefulShutdownTimeSec = "server.gracefulShutdownTimeSec" PropServerPerfEnabled = "server.perf.enabled" PropServerRequestLogEnabled = "server.request-log.enabled" PropServerPropagateInboundTrace = "server.trace.inbound.propagate" PropServerRequestValidateEnabled = "server.validate.request.enabled" PropServerPprofEnabled = "server.pprof.enabled" PropServerGenerateEndpointDocEnabled = "server.generate-endpoint-doc.enabled" PropServerGenerateEndpointDocFile = "server.generate-endpoint-doc.file" PropServerRequestAutoMapHeader = "server.request.mapping.header" PropServerGinValidationDisabled = "server.gin.validation.disabled" PropTracingPropagationKeys = "tracing.propagation.keys" PropLoggingLevel = "logging.level" PropLoggingRollingFile = "logging.rolling.file" PropLoggingRollingFileMaxAge = "logging.file.max-age" PropLoggingRollingFileMaxSize = "logging.file.max-size" PropLoggingRollingFileMaxBackups = "logging.file.max-backups" PropLoggingRollingFileRotateDaily = "logging.file.rotate-daily" PropMetricsEnabled = "metrics.enabled" PropMetricsRoute = "metrics.route" PropMetricsAuthEnabled = "metrics.auth.enabled" PropMetricsAuthBearer = "metrics.auth.bearer" PropMetricsEnableMemStatsLogJob = "metrics.memstat.log.job.enabled" PropMetricsMemStatsLogJobCron = "metrics.memstat.log.job.cron" PropConfigExtraFiles = "config.extra.files" )
const ( // Components like database that are essential and must be ready before anything else. BootstrapOrderL1 = -20 // Components that are bootstraped before the web server, such as metrics stuff. BootstrapOrderL2 = -15 // The web server or anything similar, bootstraping web server doesn't really mean that we will receive inbound requests. BootstrapOrderL3 = -10 // Components that introduce inbound requests or job scheduling. // // When these components bootstrap, the server is considered truly running. // For example, service registration (for service discovery), MQ broker connection and so on. BootstrapOrderL4 = -5 ExtraDesc = "miso-Desc" ExtraScope = "miso-Scope" ExtraResource = "miso-Resource" ExtraQueryParam = "miso-QueryParam" ExtraHeaderParam = "miso-HeaderParam" ExtraJsonRequest = "miso-JsonRequest" ExtraJsonResponse = "miso-JsonResponse" ScopePublic = "PUBLIC" ScopeProtected = "PROTECTED" TagQueryParam = "form" TagHeaderParam = "header" )
const ( XTraceId = "X-B3-TraceId" XSpanId = "X-B3-SpanId" )
const ( TagValidationV1 = "validation" // name of validation tag TagValidationV2 = "valid" // name of validation tag (v2) ValidMaxLen = "maxLen" // max length of a string, array, slice, e.g., `valid:"maxLen:10"` ValidNotEmpty = "notEmpty" // not empty, supports string, array, slice, map ValidNotNil = "notNil" // not nil, only validates slice, map, pointer, func // must be one of the values listed, e.g., 'valid:"member:PUBLIC|PROTECTED"', means that the tag value must be either PUBLIC or PROTECTED. // only string type is supported. ValidMember = "member" ValidPositive = "positive" // greater than 0, only supports int... or string type ValidPositiveOrZero = "positiveOrZero" // greater than or equal to 0, only supports int... or string type ValidNegative = "negative" // less than 0, only supports int... or string type ValidNegativeOrZero = "negativeOrZero" // less than or equal to 0, only supports int... or string type ValidNotZero = "notZero" // not zero, only supports int... or string type Validated = "validated" // mark a nested struct or pointer validated, nil pointer is ignored, one may combine "notNil,validated" )
const (
Bearer = "Bearer"
)
const (
ConsulMetaRegisterTime = "miso-register_time"
)
const (
DefaultPageLimit = 30
)
const (
ErrCodeGeneric = "XXXX"
)
Variables ¶
var ( // Select Server randomly. RandomServerSelector ServerSelector = func(servers []Server) int { return rand.Int() % len(servers) } // Property based ServiceRegistry PropBasedServiceRegistry = HardcodedServiceRegistry{} // ServerList based ServiceRegistry // // Server selection can be customized by replacing the Rule. DynamicServiceRegistry = ServerListServiceRegistry{Rule: RandomServerSelector} ErrMissingServiceName = errors.New("service name is required") ErrServiceInstanceNotFound = errors.New("unable to find any available service instance") ErrServerListNotFound = errors.New("fail to find ServerList implemnetation") // Get ServerList implementation GetServerList func() ServerList )
var ( ValidateWalkTagCallbackDeprecated = util.WalkTagCallback{ Tag: TagValidationV1, OnWalked: validateOnWalked, } ValidateWalkTagCallback = util.WalkTagCallback{ Tag: TagValidationV2, OnWalked: validateOnWalked, } )
var (
ApiDocTypeAlias = map[string]string{
"ETime": "int64",
"*ETime": "int64",
"*miso.ETime": "int64",
"*util.ETime": "int64",
}
)
var ( // Api for Consul. ConsulApi = ConsulApiImpl{} )
var (
MetricsMemoryMatcher = regexp.MustCompile(`^/memory/.*`)
)
var (
MisoDefaultClient *http.Client
)
Functions ¶
func AddGetPipelineDocFunc ¶ added in v0.1.0
func AddGetPipelineDocFunc(f GetPipelineDocFunc)
Register func to supply PipelineDoc.
func AddHealthIndicator ¶ added in v0.0.6
func AddHealthIndicator(hi HealthIndicator)
Add health indicator.
func AddPropagationKeys ¶ added in v0.0.27
func AddPropagationKeys(keys ...string)
Add propagation key for tracing
func AddShutdownHook ¶
func AddShutdownHook(hook func())
Register shutdown hook, hook should never panic
func AddXDesc ¶ added in v0.1.1
Associate xdesc value with the code appeared in field tag `xdesc:"..."`.
func BearerAuth ¶ added in v0.0.20
func BearerAuth(delegate http.Handler, getExpectedToken func() string) http.HandlerFunc
func BootstrapServer ¶
func BootstrapServer(args []string)
Bootstrap server
This func will attempt to create http server, connect to MySQL, Redis or Consul based on the configuration loaded.
It also handles service registration/de-registration on Consul before Gin bootstraped and after SIGTERM/INTERRUPT signals are received.
Graceful shutdown for the http server is also enabled and can be configured through props.
To configure server, MySQL, Redis, Consul and so on, see PROPS_* in prop.go.
It's also possible to register callbacks that are triggered before/after server bootstrap
server.PreServerBootstrap(func(c Rail) error {
// do something right after configuration being loaded, but server hasn't been bootstraped yet
});
server.PostServerBootstrapped(func(c Rail) error {
// do something after the server bootstrap
});
// start the server
server.BootstrapServer(os.Args)
func BuildRollingLogFileWriter ¶
func BuildRollingLogFileWriter(p NewRollingLogFileParam) *lumberjack.Logger
Create rolling file based logger
func ChainValidationError ¶
func ClientSkipTlsSecureCheck ¶ added in v0.0.4
func ClientSkipTlsSecureCheck()
Disable TLS certificate check.
func ConfigureLogging ¶
Configure logging level and output target based on loaded configuration.
func ConsulBootstrap ¶
func ConsulBootstrapCondition ¶ added in v0.0.8
func DebugTimeOp ¶
Run timer for named operation and print result in log
e.g.,
defer DebugTimeOp(ec, time.Now(), "someOperation")
func DefaultHealthCheck ¶
Create a default health check endpoint that simply doesn't nothing except returing 200
func DefaultMetricDesc ¶ added in v0.0.13
func DefaultMetricDesc(matcher *regexp.Regexp) []metrics.Description
func DefaultReadConfig ¶
Default way to read config file.
Repetitively calling this method overides previously loaded config.
You can also use ReadConfig to load your custom configFile. This func is essentially:
LoadConfigFromFile(GuessConfigFilePath(args))
Notice that the loaded configuration can be overriden by the cli arguments as well by using `KEY=VALUE` syntax.
func DeregisterConsulService ¶ added in v0.0.28
func DeregisterConsulService() error
Deregister current service
func DispatchErrMsgJson ¶
Dispatch error response in json format
func DispatchJsonCode ¶ added in v0.0.18
Dispatch a json response
func EnableBasicAuth ¶ added in v0.0.30
Enable Basic authorization globally for all registered endpoints.
func ExtractArgValue ¶
Parse CLI Arg to extract a value from arg, [key]=[value]
e.g.,
To look for 'configFile=?'.
path := ExtractArgValue(args, func(key string) bool { return key == "configFile" }).
func FilterMetricDesc ¶ added in v0.0.13
func GetConsulClient ¶
Get the already created consul client.
InitConsulClient() must be called before this func.
If the client is not already created, this func will panic.
func GetCtxStr ¶
Get value from context as a string
int*, unit*, float* types are formatted as string, other types are returned as empty string
func GetEnvElse ¶
Get environment variable with default value
func GetPropDur ¶ added in v0.0.14
Get prop as time.Duration
func GetPropStr ¶
Get prop as string
If the value is an argument that can be expanded, the actual value will be resolved if possible.
e.g, for "name" : "${secretName}".
This func will attempt to resolve the actual value for '${secretName}'.
func GetPropStrMap ¶ added in v0.0.14
Get prop as string based map.
func GetPropStrSlice ¶ added in v0.0.3
Get prop as string slice
func GuessConfigFilePath ¶
Guess config file path.
It first looks for the arg that matches the pattern "configFile=/path/to/configFile". If none is found, it's by default 'conf.yml'.
func HandleEndpointResult ¶ added in v0.0.23
Handle endpoint's result using the configured EndpointResultHandler.
func HasScheduledJobs ¶ added in v0.0.9
func HasScheduledJobs() bool
Whether scheduler is initialized
func InitConsulClient ¶ added in v0.0.14
func InitConsulClient() error
Get or init new consul client
For the first time that the consul client is initialized, this func will look for prop:
"consul.consulAddress"
func IsConsulClientInitialized ¶
func IsConsulClientInitialized() bool
Check whether consul client is initialized
func IsConsulServiceRegistered ¶ added in v0.0.13
func IsConsulServiceRegistered() bool
Check if current instance is registered on consul.
func IsLocalAddress ¶
Check whether the address is local (localhost/127.0.0.1)
func JoinQueryParam ¶
Join query parameters
func LTimeOp ¶
Run timer for named operation and print result
e.g.,
defer LTimeOp(ec, time.Now(), "someOperation")
func LoadConfigFromFile ¶
Load config from file.
Calling this method overides previously loaded config.
func LoadConfigFromReader ¶ added in v0.0.29
Load config from io Reader.
It's the caller's responsibility to close the provided reader.
Calling this method overides previously loaded config.
func LoadConfigFromStr ¶ added in v0.1.1
Load config from string.
Calling this method overides previously loaded config.
func LoadPropagationKeys ¶ added in v0.0.7
func LoadPropagationKeys(r Rail)
Read property and find propagation keys .
This func looks for following property.
"tracing.propagation.keys"
func ManualBootstrapPrometheus ¶ added in v0.0.13
func ManualBootstrapPrometheus()
Caller wants to bootstrap prometheus manually.
This is mainly used for gateway that implements handler for all endpoints.
func ManualPprofRegister ¶ added in v0.0.15
func ManualPprofRegister()
Registrer pprof debug endpoint manually.
func NewDeleteRequest ¶
Create DELETE request
func NewOptionsRequest ¶
Create OPTIONS request
func NewPostRequest ¶
Create POST request
func NewPromCounter ¶ added in v0.0.6
func NewPromCounter(name string) prometheus.Counter
Create new Counter.
The Counter with this name is automatically registered to the prometheus.DefaultRegisterer.
func NewPromHisto ¶ added in v0.0.13
func NewPromHisto(name string) prometheus.Histogram
Create new Histogram.
The created Histogram is automatically registered to the prometheus.DefaultRegisterer.
func NewPromHistoVec ¶ added in v0.0.13
func NewPromHistoVec(name string, labels []string) *prometheus.HistogramVec
Create new HistogramVec.
The HistogramVec is automatically registered to the prometheus.DefaultRegisterer.
func NewPutRequest ¶
Create PUT request
func OverwriteConf ¶ added in v0.0.31
func OverwriteConf(args []string)
Overwrite existing conf using environment and cli args.
func PTimeOp ¶
Run timer for named operation and print result in log
e.g.,
defer PTimeOp(time.Now(), "someOperation")
func ParseBearer ¶ added in v0.0.13
func PerfLogExclPath ¶
func PerfLogExclPath(path string)
Ask PerfMiddleware to stop measuring perf of provided path
func PerfMiddleware ¶
func PerfMiddleware() gin.HandlerFunc
Perf Middleware that calculates how much time each request takes
func PostJobExec ¶ added in v0.0.8
func PostJobExec(hook PostJobHook)
Callback triggered after job execution.
Other callbacks will still be executed even if one of them returns error.
Callback will be ignored, if the scheduler is already running.
func PostServerBootstrapped ¶
Add listener that is invoked when server is finally bootstrapped
This usually means all server components are started, such as MySQL connection, Redis Connection and so on.
Caller is free to call PostServerBootstrapped inside another PostServerBootstrapped callback.
func PreConfiguredFormatter ¶
Get pre-configured TextFormatter for logrus
func PreJobExec ¶ added in v0.0.8
func PreJobExec(hook PreJobHook)
Callback triggered before job execution.
The job and other callbacks will still be executed even if one of the callback returns error.
Callback will be ignored, if the scheduler is already running.
func PreProcessGin ¶ added in v0.0.16
func PreProcessGin(preProcessor GinPreProcessor)
Process *gin.Engine before the web server starts, particularly useful when trying to add middleware.
func PreServerBootstrap ¶
Add listener that is invoked before the server is fully bootstrapped
This usually means that the configuration is loaded, and the logging is configured, but the server components are not yet initialized.
Caller is free to call PostServerBootstrapped or PreServerBootstrap inside another PreServerBootstrap callback.
func PrepareWebStaticFs ¶ added in v0.0.29
Prepare to serve static files in embedded fs.
Static files are all served by paths with prefix '/static'.
Notice that index.html must be renamed to index.htm or else it won't work.
If you are using Angular framework, you may add extra build param as follows. The idea is still the same for other frameworks.
ng build --baseHref=/static/
func PrometheusBootstrap ¶
func PrometheusBootstrapCondition ¶ added in v0.0.8
func PrometheusHandler ¶
Default handler for prometheus metrics.
func RawAny ¶
func RawAny(url string, handler RawTRouteHandler, extra ...util.StrPair)
Register ANY request route (raw version)
func RegisterBootstrapCallback ¶
func RegisterBootstrapCallback(bootstrapComponent ComponentBootstrap)
Register server component bootstrap callback
When such callback is invoked, configuration should be fully loaded, the callback is free to read the loaded configuration and decide whether or not the server component should be initialized, e.g., by checking if the enable flag is true.
func RegisterConsulService ¶ added in v0.0.28
func RegisterConsulService() error
Register current instance as a service
If we have already registered before, current method call will be ignored.
This func looks for following prop:
"server.port" "consul.registerName" "consul.healthCheckInterval" "consul.registerAddress" "consul.healthCheckUrl" "consul.healthCheckTimeout" "consul.healthCheckFailedDeregisterAfter"
func ResolveArg ¶
Resolve argument, e.g., for arg like '${someArg}', it will in fact look for 'someArg' in os.Env
func ResolveServerHost ¶
Resolve server host, use IPV4 if the given address is empty or '0.0.0.0'
func ScheduleCron ¶
add a cron job to scheduler, note that the cron expression includes second, e.g., '*/1 * * * * *'
this func doesn't start the scheduler
func SchedulerBootstrap ¶
func ServeTempl ¶ added in v0.0.29
func SetDefaultTimeout ¶ added in v0.0.6
Set default http client timeout
func SetErrLogHandler ¶ added in v0.0.33
func SetErrLogHandler(handler ErrorLogHandler) bool
Setup error log handler.
ErrorLogHnadler is invoked when ERROR level log is printed, the log messages passed to handler are buffered, but handler should never block for a long time (i.e., process as fast as possible). If the buffer is full, latest error log messages are simply dropped.
ErrorLogHandler can only be set once.
func SetLogLevel ¶ added in v0.0.8
func SetLogLevel(level string)
func SetResultBodyBuilder ¶ added in v0.0.25
func SetResultBodyBuilder(rbb ResultBodyBuilder) error
Replace the default ResultBodyBuilder
func SprintMemStats ¶ added in v0.0.13
func StartSchedulerBlocking ¶
func StartSchedulerBlocking()
Start scheduler and block current routine
func SubscribeServerChanges ¶ added in v0.0.19
Subscribe to changes to service instances.
Callback is triggered asynchronously.
func TimeOp ¶
Run timer for named operation and print result in log
e.g.,
defer TimeOp(ec, time.Now(), "someOperation")
func TraceLogger ¶
Return logger with tracing infomation
func TraceRequest ¶
Wraper request with tracing key/value pairs on http headers
func UnmarshalFromPropKey ¶ added in v0.0.22
Unmarshal configuration from a speicific key.
func UsePropagationKeys ¶ added in v0.0.25
func UsePropagationKeys(forEach func(key string))
func Validate ¶
Validate target object based on the validation rules specified by tags 'valid:"[RULE]"'.
Available Rules:
- maxLen
- notEmpty
- notNil
- positive
- positiveOrZero
- negative
- negativeOrZero
- notZero
- validated
func ValidateIntRule ¶
func ValidateRule ¶
func WebServerBootstrap ¶
func WebServerBootstrapCondition ¶ added in v0.0.8
Types ¶
type CTFormatter ¶
type CTFormatter struct {
}
type ComponentBootstrap ¶
type ComponentBootstrap struct {
// name of the component.
Name string
// the actual bootstrap function.
Bootstrap func(rail Rail) error
// check whether component should be bootstraped
Condition func(rail Rail) (bool, error)
// order of which the components are bootstraped, natural order, it's by default 15.
Order int
}
type ConsulApiImpl ¶ added in v0.0.6
type ConsulApiImpl struct{}
func (ConsulApiImpl) CatalogFetchServiceNames ¶ added in v0.0.6
func (c ConsulApiImpl) CatalogFetchServiceNames(rail Rail) (map[string][]string, error)
Fetch all registered services, this method always call Consul instead of reading from cache
func (ConsulApiImpl) CatalogFetchServiceNodes ¶ added in v0.0.6
func (c ConsulApiImpl) CatalogFetchServiceNodes(rail Rail, name string) ([]*api.CatalogService, error)
Fetch registered service by name, this method always call Consul instead of reading from cache
func (ConsulApiImpl) DeregisterService ¶ added in v0.0.6
func (c ConsulApiImpl) DeregisterService(serviceId string) error
func (ConsulApiImpl) RegisterService ¶ added in v0.0.12
func (c ConsulApiImpl) RegisterService(registration *api.AgentServiceRegistration) error
type ConsulServerList ¶ added in v0.0.28
Holder of a list of ServiceHolder
func (*ConsulServerList) IsSubscribed ¶ added in v0.0.28
func (s *ConsulServerList) IsSubscribed(rail Rail, service string) bool
func (*ConsulServerList) ListServers ¶ added in v0.0.28
func (s *ConsulServerList) ListServers(rail Rail, name string) []Server
func (*ConsulServerList) PollInstance ¶ added in v0.0.28
func (s *ConsulServerList) PollInstance(rail Rail, name string) error
Fetch and cache services nodes.
func (*ConsulServerList) PollInstances ¶ added in v0.0.28
func (s *ConsulServerList) PollInstances(rail Rail) error
func (*ConsulServerList) Subscribe ¶ added in v0.0.28
func (s *ConsulServerList) Subscribe(rail Rail, service string) error
func (*ConsulServerList) Unsubscribe ¶ added in v0.0.28
func (s *ConsulServerList) Unsubscribe(rail Rail, service string) error
func (*ConsulServerList) UnsubscribeAll ¶ added in v0.0.28
func (s *ConsulServerList) UnsubscribeAll(rail Rail) error
type ErrorLogHandler ¶ added in v0.0.33
type ErrorLogHandler func(el *ErrorLog)
type GetPipelineDocFunc ¶ added in v0.1.0
type GetPipelineDocFunc func() []PipelineDoc
type GinPreProcessor ¶ added in v0.0.16
Preprocessor of *gin.Engine.
type GnResp ¶
type GnResp[T any] struct { ErrorCode string `json:"errorCode" desc:"error code"` Msg string `json:"msg" desc:"message"` Error bool `json:"error" desc:"whether the request was successful"` Data T `json:"data" desc:"response data"` }
Generic version of Resp
type HardcodedServiceRegistry ¶ added in v0.0.14
type HardcodedServiceRegistry struct {
}
Service registry backed by loaded configuration.
func (HardcodedServiceRegistry) ListServers ¶ added in v0.0.14
func (r HardcodedServiceRegistry) ListServers(rail Rail, service string) ([]Server, error)
func (HardcodedServiceRegistry) ResolveUrl ¶ added in v0.0.14
type HealthIndicator ¶ added in v0.0.6
type HealthIndicator struct {
Name string // name of the indicator
CheckHealth func(rail Rail) bool // Check health
}
Indicator of health status
type HealthStatus ¶ added in v0.0.6
type HistTimer ¶ added in v0.0.13
type HistTimer struct {
// contains filtered or unexported fields
}
Timer based on prometheus.Histogram.
Duration is measured in millisecond.
Use NewHistTimer to create a new one, and each timer can only be used for once.
func NewHistTimer ¶ added in v0.0.13
func NewHistTimer(hist prometheus.Histogram) *HistTimer
Create new timer that is backed by a prometheus.Histogram. Each timer can only be used for once.
func (*HistTimer) ObserveDuration ¶ added in v0.0.13
type HttpRoute ¶
type HttpRoute struct {
Url string
Method string
Extra map[string][]any
Desc string // description of the route (metadata).
Scope string // the documented access scope of the route, it maybe "PUBLIC" or something else (metadata).
Resource string // the documented resource that the route should be bound to (metadata).
Headers []ParamDoc // the documented header parameters that will be used by the endpoint (metadata).
QueryParams []ParamDoc // the documented query parameters that will used by the endpoint (metadata).
JsonRequestVal any // the documented json request value that is expected by the endpoint (metadata).
JsonResponseVal any // the documented json response value that will be returned by the endpoint (metadata).
}
type HttpRouteDoc ¶ added in v0.0.23
type HttpRouteDoc struct {
Url string
Method string
Extra map[string][]any
Desc string // description of the route (metadata).
Scope string // the documented access scope of the route, it maybe "PUBLIC" or something else (metadata).
Resource string // the documented resource that the route should be bound to (metadata).
Headers []ParamDoc // the documented header parameters that will be used by the endpoint (metadata).
QueryParams []ParamDoc // the documented query parameters that will used by the endpoint (metadata).
JsonRequestDesc []JsonDesc // the documented json request type that is expected by the endpoint (metadata).
JsonResponseDesc []JsonDesc // the documented json response type that will be returned by the endpoint (metadata).
Curl string // curl demo
JsonReqTsDef string // json request type def in ts
JsonRespTsDef string // json response type def in ts
NgHttpClientDemo string // angular http client demo
MisoTClientDemo string // miso TClient demo
}
type Inbound ¶ added in v0.0.26
type Inbound struct {
// contains filtered or unexported fields
}
Inbound request context.
Inbound hides the underlying engine (e.g., *gin.Context) using .Engine() method. In most cases, you should not attempt to cast the engine explictly, it's possible that miso will replace the engine in future release.
However, you should be able to satisfy most of your need by calling .Unwrap(), that returns the underlying http.ResponseWriter, *http.Request.
Use miso.Rail for tracing (not just logs), pass it around your application code and the code calling miso's methods course.
func (*Inbound) HandleResult ¶ added in v0.0.26
Handle the result using universally configured handler.
The result or error is written back to the client. In most cases, caller must exit the handler after calling this method. Theoritically, this method is only useful for RawGet, RawPut, RawPost, RawDelete. Other methods, such as IGet, IPost, Post, Put or Delete, handle the results automatically in exactly the same way.
E.g.,
miso.RawGet("/dir/info", func(inb *miso.Inbound) {
// ... do something
if err != nil {
inb.HandleResult(nil, err) // something goes wrong
return
}
// return result back to the client
inb.HandleResult(result, err)
})
type Job ¶ added in v0.0.8
type Job struct {
Name string // name of the job.
Cron string // cron expr.
CronWithSeconds bool // whether cron expr contains the second field.
Run func(Rail) error // actual job execution logic.
LogJobExec bool // whether job execution should be logged, error msg is always logged and is not affected by this option.
TriggeredOnBoostrapped bool // whether job should be triggered when server is fully bootstrapped
}
type JobExecStats ¶ added in v0.0.8
type JsonDesc ¶ added in v0.1.0
func BuildJsonDesc ¶ added in v0.1.0
type LazyRouteDecl ¶ added in v0.0.23
type LazyRouteDecl struct {
Url string
Method string
Handler func(c *gin.Context)
RegisterFunc func(extra ...util.StrPair)
Extras []util.StrPair
}
Lazy route declaration
func Delete ¶
func Delete[Res any](url string, handler TRouteHandler[Res]) *LazyRouteDecl
Register DELETE request.
The result and error are automatically wrapped to miso.Resp (see miso.SetResultBodyBuilder func) and serialized to json.
func Get ¶
func Get[Res any](url string, handler TRouteHandler[Res]) *LazyRouteDecl
Register GET request.
The result and error are automatically wrapped to miso.Resp (see miso.SetResultBodyBuilder func) and serialized to json.
func IDelete ¶
func IDelete[Req any, Res any](url string, handler MappedTRouteHandler[Req, Res]) *LazyRouteDecl
Register DELETE request.
Req type should be a struct, where all fields are automatically mapped from the request using 'json' tag or 'form' tag (for form-data, query param) or 'header' tag (only supports string/*string).
Res type should be a struct. By default both Res value and error (if not nil) will be wrapped inside miso.Resp and serialized to json. Wrapping to miso.Resp is customizable using miso.SetResultBodyBuilder func.
With both Req and Res type declared, miso will automatically parse these two types using reflect and generate an API documentation describing the endpoint.
func IGet ¶
func IGet[Req any, Res any](url string, handler MappedTRouteHandler[Req, Res]) *LazyRouteDecl
Register GET request.
Req type should be a struct, where all fields are automatically mapped from the request using 'form' tag (for form-data, query param) or 'header' tag (only supports string/*string).
Res type should be a struct. By default both Res value and error (if not nil) will be wrapped inside miso.Resp and serialized to json. Wrapping to miso.Resp is customizable using miso.SetResultBodyBuilder func.
With both Req and Res type declared, miso will automatically parse these two types using reflect and generate an API documentation describing the endpoint.
func IPost ¶
func IPost[Req any, Res any](url string, handler MappedTRouteHandler[Req, Res]) *LazyRouteDecl
Register POST request.
Req type should be a struct, where all fields are automatically mapped from the request using 'json' tag or 'form' tag (for form-data, query param) or 'header' tag (only supports string/*string).
Res type should be a struct. By default both Res value and error (if not nil) will be wrapped inside miso.Resp and serialized to json. Wrapping to miso.Resp is customizable using miso.SetResultBodyBuilder func.
With both Req and Res type declared, miso will automatically parse these two types using reflect and generate an API documentation describing the endpoint.
func IPut ¶
func IPut[Req any, Res any](url string, handler MappedTRouteHandler[Req, Res]) *LazyRouteDecl
Register PUT request.
Req type should be a struct, where all fields are automatically mapped from the request using 'json' tag or 'form' tag (for form-data, query param) or 'header' tag (only supports string/*string).
Res type should be a struct. By default both Res value and error (if not nil) will be wrapped inside miso.Resp and serialized to json. Wrapping to miso.Resp is customizable using miso.SetResultBodyBuilder func.
With both Req and Res type declared, miso will automatically parse these two types using reflect and generate an API documentation describing the endpoint.
func NewLazyRouteDecl ¶ added in v0.0.23
func NewLazyRouteDecl(url string, method string, handler func(c *gin.Context)) *LazyRouteDecl
func Post ¶
func Post[Res any](url string, handler TRouteHandler[Res]) *LazyRouteDecl
Register POST request.
The result and error are automatically wrapped to miso.Resp (see miso.SetResultBodyBuilder func) and serialized to json.
func Put ¶
func Put[Res any](url string, handler TRouteHandler[Res]) *LazyRouteDecl
Register PUT request.
The result and error are automatically wrapped to miso.Resp (see miso.SetResultBodyBuilder func) and serialized to json.
func RawDelete ¶
func RawDelete(url string, handler RawTRouteHandler) *LazyRouteDecl
Register DELETE request route (raw version)
func RawGet ¶
func RawGet(url string, handler RawTRouteHandler) *LazyRouteDecl
Register GET request route (raw version)
func RawPost ¶
func RawPost(url string, handler RawTRouteHandler) *LazyRouteDecl
Register POST request route (raw version)
func RawPut ¶
func RawPut(url string, handler RawTRouteHandler) *LazyRouteDecl
Register PUT request route (raw version)
func (*LazyRouteDecl) Desc ¶ added in v0.0.23
func (g *LazyRouteDecl) Desc(desc string) *LazyRouteDecl
Add endpoint description (only serves as metadata that maybe used by some plugins).
func (*LazyRouteDecl) DocHeader ¶ added in v0.0.23
func (g *LazyRouteDecl) DocHeader(headerName string, desc string) *LazyRouteDecl
Document header parameter that the endpoint will use (only serves as metadata that maybe used by some plugins).
func (*LazyRouteDecl) DocHeaderReq ¶ added in v0.0.26
func (g *LazyRouteDecl) DocHeaderReq(v any) *LazyRouteDecl
Document header parameters that the endpoint expects (only serves as metadata that maybe used by some plugins).
func (*LazyRouteDecl) DocJsonReq ¶ added in v0.0.23
func (g *LazyRouteDecl) DocJsonReq(v any) *LazyRouteDecl
Document json request that the endpoint expects (only serves as metadata that maybe used by some plugins).
func (*LazyRouteDecl) DocJsonResp ¶ added in v0.0.23
func (g *LazyRouteDecl) DocJsonResp(v any) *LazyRouteDecl
Document json response that the endpoint returns (only serves as metadata that maybe used by some plugins).
func (*LazyRouteDecl) DocQueryParam ¶ added in v0.0.23
func (g *LazyRouteDecl) DocQueryParam(queryName string, desc string) *LazyRouteDecl
Document query parameter that the endpoint will use (only serves as metadata that maybe used by some plugins).
func (*LazyRouteDecl) DocQueryReq ¶ added in v0.0.25
func (g *LazyRouteDecl) DocQueryReq(v any) *LazyRouteDecl
Document query parameters that the endpoint expects (only serves as metadata that maybe used by some plugins).
func (*LazyRouteDecl) Extra ¶ added in v0.0.23
func (g *LazyRouteDecl) Extra(key string, value any) *LazyRouteDecl
Add extra info to endpoint's metadata.
func (*LazyRouteDecl) Prepend ¶ added in v0.0.23
func (g *LazyRouteDecl) Prepend(baseUrl string)
func (*LazyRouteDecl) Protected ¶ added in v0.0.23
func (g *LazyRouteDecl) Protected() *LazyRouteDecl
Documents that the endpoint requires protection (only serves as metadata that maybe used by some plugins).
func (*LazyRouteDecl) Public ¶ added in v0.0.23
func (g *LazyRouteDecl) Public() *LazyRouteDecl
Mark endpoint publicly accessible (only serves as metadata that maybe used by some plugins).
func (*LazyRouteDecl) Resource ¶ added in v0.0.23
func (g *LazyRouteDecl) Resource(resource string) *LazyRouteDecl
Record the resource that the endppoint should be bound to (only serves as metadata that maybe used by some plugins).
func (*LazyRouteDecl) Scope ¶ added in v0.1.4
func (g *LazyRouteDecl) Scope(scope string) *LazyRouteDecl
Document the access scope of the endpoint (only serves as metadata that maybe used by some plugins).
type LocalCache ¶
Simple local map-based cache.
This should not be a long-live object.
func NewLocalCache ¶
func NewLocalCache[T any]() LocalCache[T]
create new LocalCache with key of type string and value of type T.
type MappedTRouteHandler ¶
Traced and parameters mapped route handler.
Req type should be a struct, where all fields are automatically mapped from the request using 'json' tag or 'form' tag (for form-data, query param) or 'header' tag (only supports string/*string).
Res type should be a struct. By default both Res value and error (if not nil) will be wrapped inside miso.Resp and serialized to json. Wrapping to miso.Resp is customizable using miso.SetResultBodyBuilder func.
With both Req and Res type declared, miso will automatically parse these two types using reflect and generate an API documentation describing the endpoint.
type MetricsCollector ¶ added in v0.0.13
type MetricsCollector struct {
Desc []metrics.Description
Samples []metrics.Sample
SampleMap map[string]*metrics.Sample
// contains filtered or unexported fields
}
Collector of runtime/metrics.
Use NewMetricsCollector() to create a new collector, the collector is thread-safe. Periodically call Read() to load metrics from runtime. Once the metrics are loaded, you can either use Value() or MemStats() func to access the values that you are interested in.
func NewMetricsCollector ¶ added in v0.0.13
func NewMetricsCollector(descs []metrics.Description) MetricsCollector
Create new MetricsCollector.
MetricsCollector only supports Uint64 metrics, those that are not Uint64 kind, are simply ignored.
func (*MetricsCollector) MemStats ¶ added in v0.0.13
func (m *MetricsCollector) MemStats() runtime.MemStats
func (*MetricsCollector) Read ¶ added in v0.0.13
func (m *MetricsCollector) Read()
func (*MetricsCollector) Value ¶ added in v0.0.13
func (m *MetricsCollector) Value(name string) uint64
type MisoErr ¶ added in v0.0.3
type MisoErr struct {
Code string // error code.
Msg string // error message returned to the client requested to the endpoint.
InternalMsg string // internal message that is only logged on server.
}
Miso Error.
Use NewErrf(...) to instantiate.
func (*MisoErr) Is ¶ added in v0.0.25
Implements *MisoErr Is check.
Returns true, if both are *MisoErr and the code matches.
WithInternalMsg always create new error, so we can basically reuse the same error created using 'miso.NewErrf(...).WithCode(...)'
var ErrIllegalArgument = miso.NewErrf(...).WithCode(...) var e1 = ErrIllegalArgument.WithInternalMsg(...) var e2 = ErrIllegalArgument.WithInternalMsg(...) errors.Is(e1, ErrIllegalArgument) errors.Is(e2, ErrIllegalArgument)
type NewRollingLogFileParam ¶
type OrderedShutdownHook ¶ added in v0.0.23
type OrderedShutdownHook struct {
Hook func()
Order int
}
type Paging ¶
type Paging struct {
Limit int `json:"limit" desc:"page limit"`
Page int `json:"page" desc:"page number, 1-based"`
Total int `json:"total" desc:"total count"`
}
func (Paging) ToRespPage ¶
type PipelineDoc ¶ added in v0.0.33
type PostJobHook ¶ added in v0.0.8
type PostJobHook func(rail Rail, inf JobInf, stats JobExecStats) error
Hook triggered after job's execution.
type PreJobHook ¶ added in v0.0.8
Hook triggered before job's execution.
type PropagationKeys ¶
type PropagationKeys struct {
// contains filtered or unexported fields
}
type Rail ¶
type Rail struct {
// contains filtered or unexported fields
}
Rail, an object that carries trace infromation along with the execution.
func BuildRail ¶
Build Rail from gin.Context.
This func creates new Rail for the first time by setting up proper traceId and spanId.
It can also recognize that a traceId (and spanId) was previously created, and do attempt to reuse these tracing values, such that the Rail acts as if it's the previous one, this is especially useful when we are recovering from a panic. In most cases, we should only call BuildRail for once.
However, if the Rail has attempted to overwrite it's spanId (i.e., creating new span), this newly created spanId will not be reflected on the Rail created here. But this should be fine, because new span is usually created for async operation.
func (Rail) WithCancel ¶
func (r Rail) WithCancel() (Rail, context.CancelFunc)
Create new Rail with context's CancelFunc
type RawTRouteHandler ¶
type RawTRouteHandler func(inb *Inbound)
Raw version of traced route handler.
type Resp ¶
type Resp struct {
ErrorCode string `json:"errorCode" desc:"error code"`
Msg string `json:"msg" desc:"message"`
Error bool `json:"error" desc:"whether the request was successful"`
Data interface{} `json:"data" desc:"response data"`
}
Web Endpoint's Resp
type RespUnwrapper ¶ added in v0.0.25
type RespUnwrapper interface {
Unwrap() Resp
}
type ResultBodyBuilder ¶ added in v0.0.8
type ResultBodyBuilder struct {
// wrap error in json, the returned object will be serialized to json.
ErrJsonBuilder func(rail Rail, url string, err error) any
// wrap payload object, the returned object will be serialized to json.
PayloadJsonBuilder func(payload any) any
// build empty ok response object, the returned object will be serialized to json.
OkJsonBuilder func() any
}
type RoutingGroup ¶ added in v0.0.4
func BaseRoute ¶ added in v0.0.4
func BaseRoute(baseUrl string) *RoutingGroup
Group routes together to share the same base url.
func GroupRoute ¶ added in v0.0.23
func GroupRoute(baseUrl string, grouped ...TreePath) *RoutingGroup
Group routes together to share the same base url.
func (*RoutingGroup) Group ¶ added in v0.0.4
func (rg *RoutingGroup) Group(grouped ...TreePath) *RoutingGroup
Group routes, routes are immediately registered
func (*RoutingGroup) Prepend ¶ added in v0.0.23
func (rg *RoutingGroup) Prepend(baseUrl string)
type Server ¶ added in v0.0.14
func SelectAnyServer ¶ added in v0.0.22
Select one Server randomly.
This func internally calls SelectServer with RandomServerSelector.
func SelectServer ¶ added in v0.0.14
Select one Server based on the provided selector.
GetServerList() is internally called to obtain current ServerList implementation.
If none is found and the service is not subscribed yet in the ServerList, this func subscribes to the service and polls the service instances immediately.
If ServerList indeed doesn't find any available instance for the service, ErrServiceInstanceNotFound is returned.
func (*Server) ServerAddress ¶ added in v0.0.14
Build server address with host and port concatenated, e.g., 'localhost:8080'
type ServerChangeListenerMap ¶ added in v0.0.19
type ServerChangeListenerMap struct {
Listeners map[string][]func()
Pool *util.AsyncPool
sync.RWMutex
}
func (*ServerChangeListenerMap) SubscribeChange ¶ added in v0.0.28
func (s *ServerChangeListenerMap) SubscribeChange(name string, cbk func())
func (*ServerChangeListenerMap) TriggerListeners ¶ added in v0.0.28
func (s *ServerChangeListenerMap) TriggerListeners(name string)
type ServerList ¶ added in v0.0.14
type ServerList interface {
PollInstances(rail Rail) error
PollInstance(rail Rail, name string) error
ListServers(rail Rail, name string) []Server
IsSubscribed(rail Rail, service string) bool
Subscribe(rail Rail, service string) error
Unsubscribe(rail Rail, service string) error
UnsubscribeAll(rail Rail) error
}
type ServerListServiceRegistry ¶ added in v0.0.28
type ServerListServiceRegistry struct {
Rule ServerSelector
}
func (ServerListServiceRegistry) ListServers ¶ added in v0.0.28
func (c ServerListServiceRegistry) ListServers(rail Rail, service string) ([]Server, error)
func (ServerListServiceRegistry) ResolveUrl ¶ added in v0.0.28
type ServerSelector ¶ added in v0.0.14
Server selector, returns index of the selected one.
type ServiceRegistry ¶
type ServiceRegistry interface {
ResolveUrl(rail Rail, service string, relativeUrl string) (string, error)
ListServers(rail Rail, service string) ([]Server, error)
}
func GetServiceRegistry ¶
func GetServiceRegistry() ServiceRegistry
Get service registry.
Service registry initialization is lazy, don't store the retunred value in global var.
type TBucket ¶ added in v0.0.22
type TBucket[T any] struct { // contains filtered or unexported fields }
func NewTBucket ¶ added in v0.0.22
type TClient ¶
type TClient struct {
Url string // request url (absolute or relative)
Headers map[string][]string // request headers
Ctx context.Context // context provided by caller
QueryParam map[string][]string // query parameters
Rail Rail // rail
// contains filtered or unexported fields
}
Helper type for sending HTTP requests
Provides convenients methods to build requests, use http.Client and propagate tracing information
func NewDynTClient ¶
Create new defualt TClient with EnableServiceDiscovery(), EnableTracing(), and Require2xx() turned on.
The provided relUrl should be a relative url starting with '/'.
func (*TClient) AddHeader ¶
Append header, subsequent method calls doesn't override previously appended headers
func (*TClient) AddHeaders ¶
Append headers, subsequent method calls doesn't override previously appended headers
func (*TClient) AddQueryParams ¶
Append Query Parameters, subsequent method calls doesn't override previously appended parameters
func (*TClient) EnableServiceDiscovery ¶
Enable service discovery
func (*TClient) EnableTracing ¶
Enable tracing by putting propagation key/value pairs on http headers.
func (*TClient) Http ¶ added in v0.0.5
Append 'http://' protocol.
If service discovery is enabled, or the url contains http protocol already, this will be skipped.
func (*TClient) Https ¶ added in v0.0.5
Append 'https://' protocol.
If service discovery is enabled, or the url contains http protocol already, this will be skipped.
func (*TClient) PostJson ¶
Send POST request with JSON.
Use simple types like struct instad of pointer for body.
func (*TClient) Require2xx ¶ added in v0.0.8
Requires response to have 2xx status code, if not, the *TResponse will contain error built for this specific reason.
func (*TClient) SetContentType ¶
Set Content-Type
func (*TClient) SetHeaders ¶
Overwrite header
type TResponse ¶
type TResponse struct {
Rail Rail
Ctx context.Context
Resp *http.Response
RespHeader http.Header
StatusCode int
Err error
}
Helper type for handling HTTP responses
func (*TResponse) Bytes ¶ added in v0.0.3
Read response as []bytes.
Response is always closed automatically.
If response body is somehow empty, *miso.NoneErr is returned.
func (*TResponse) Json ¶ added in v0.0.3
Read response as JSON object.
Response is always closed automatically.
If response body is somehow empty, *miso.NoneErr is returned.
func (*TResponse) Require2xx ¶
Check if it's 2xx, else return error
type TRouteHandler ¶
Traced route handler.
Res type should be a struct. By default both Res value and error (if not nil) will be wrapped inside miso.Resp and serialized to json. Wrapping to miso.Resp is customizable using miso.SetResultBodyBuilder func.
With Res type declared, miso will automatically parse the Res type using reflect and generate an API documentation describing the endpoint.
type TTLCache ¶ added in v0.0.3
type TTLCache[T any] interface { TryGet(key string) (T, bool) Get(key string, elseGet func() (T, bool)) (T, bool) Put(key string, t T) Del(key string) Size() int Exists(key string) bool PutIfAbsent(key string, t T) bool // Register callback to be invoked when entry is evicted. // // Callback may be invoked with locks obtained, callback should not block currnet goroutine. // Callback should not call any method on TTLCache, deadlock is almost guaranteed. OnEvicted(f func(key string, t T)) Keys() []string }
Time-based Cache.
func NewTTLCache ¶ added in v0.0.3
Create new TTLCache.
Each k/v is associated with a timestamp. Each time a key lookup occurs, it checks whether the k/v is still valid by comparing the timestamp with time.Now().
If the k/v is no longer 'alive', or the cache doesn't have the key, supplier func for the value is called, and the returned value is then cached. I.e., each k/v is evicted only at key lookup, there is no secret go-routine running to do the clean-up, the overhead for maintaining the cache is relatively small.
For the max size, TTLCache will try it's best to maintain it, but it's quite possible that all values in the cache are 'alive'. Whenever the max size is violated, the cache will simply drop the 'least recently put' item.
The returned TTLCache can be used concurrently.
type TickRunner ¶ added in v0.0.14
type TickRunner struct {
// contains filtered or unexported fields
}
Runner that triggers run on every tick.
Create TickRunner using func NewTickRunner(...).
func NewTickRuner ¶ added in v0.0.14
func NewTickRuner(freq time.Duration, run func()) *TickRunner
func (*TickRunner) Start ¶ added in v0.0.14
func (t *TickRunner) Start()
func (*TickRunner) Stop ¶ added in v0.0.14
func (t *TickRunner) Stop()
type ValidationError ¶
Validation Error
func (*ValidationError) Error ¶
func (ve *ValidationError) Error() string
type VecTimer ¶ added in v0.0.13
type VecTimer struct {
// contains filtered or unexported fields
}
Timer based on prometheus.HistogramVec.
Duration is measured in millisecond.
Use NewVecTimer to create a new one, and each timer can only be used for once.
func NewVecTimer ¶ added in v0.0.13
func NewVecTimer(vec *prometheus.HistogramVec) *VecTimer
Create new timer that is back by prometheus HistogramVec. Each timer can only be used for once.