Skip to content

Commit

Permalink
Add pprof entry
Browse files Browse the repository at this point in the history
  • Loading branch information
dongxuny committed Mar 17, 2022
1 parent acc32f6 commit a534ef0
Show file tree
Hide file tree
Showing 6 changed files with 162 additions and 70 deletions.
63 changes: 40 additions & 23 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,9 @@ All instances could be configured via YAML or Code.
| Swagger | Builtin swagger UI handler. |
| Docs | Builtin [RapiDoc](https://github.com/mrin9/RapiDoc) instance which can be used to replace swagger and RK TV. |
| CommonService | List of common APIs. |
| StaticFileHandler | A Web UI shows files could be downloaded from server, currently support source of local and pkger. |
| StaticFileHandler | A Web UI shows files could be downloaded from server, currently support source of local and embed.FS. |
| PProf | PProf web UI. |


## Supported middlewares
All middlewares could be configured via YAML or Code.
Expand Down Expand Up @@ -557,27 +559,32 @@ In order to make swagger UI and RK tv work under JWT without JWT token, we need
jwt:
...
ignore:
- "/sw"
- "/sw"
```
| name | description | type | default value |
|----------------------------------|-------------------------------------------------------------|----------|------------------------|
| fiber.middleware.jwt.enabled | Enable JWT middleware | boolean | false |
| fiber.middleware.jwt.ignore | Provide ignoring path prefix. | []string | [] |
| fiber.middleware.jwt.signingKey | Required, Provide signing key. | string | "" |
| fiber.middleware.jwt.signingKeys | Provide signing keys as scheme of <key>:<value>. | []string | [] |
| fiber.middleware.jwt.signingAlgo | Provide signing algorithm. | string | HS256 |
| fiber.middleware.jwt.tokenLookup | Provide token lookup scheme, please see bellow description. | string | "header:Authorization" |
| fiber.middleware.jwt.authScheme | Provide auth scheme. | string | Bearer |
The supported scheme of **tokenLookup**
| name | description | type | default value |
|------------------------------------------------|----------------------------------------------------------------------------------|----------|------------------------|
| fiber.middleware.jwt.enabled | Optional, Enable JWT middleware | boolean | false |
| fiber.middleware.jwt.ignore | Optional, Provide ignoring path prefix. | []string | [] |
| fiber.middleware.jwt.signerEntry | Optional, Provide signerEntry name. | string | "" |
| fiber.middleware.jwt.symmetric.algorithm | Required if symmetric specified. One of HS256, HS384, HS512 | string | "" |
| fiber.middleware.jwt.symmetric.token | Optional, raw token for signing and verification | string | "" |
| fiber.middleware.jwt.symmetric.tokenPath | Optional, path of token file | string | "" |
| fiber.middleware.jwt.asymmetric.algorithm | Required if symmetric specified. One of RS256, RS384, RS512, ES256, ES384, ES512 | string | "" |
| fiber.middleware.jwt.asymmetric.privateKey | Optional, raw private key file for signing | string | "" |
| fiber.middleware.jwt.asymmetric.privateKeyPath | Optional, private key file path for signing | string | "" |
| fiber.middleware.jwt.asymmetric.publicKey | Optional, raw public key file for verification | string | "" |
| fiber.middleware.jwt.asymmetric.publicKeyPath | Optional, public key file path for verification | string | "" |
| fiber.middleware.jwt.tokenLookup | Provide token lookup scheme, please see bellow description. | string | "header:Authorization" |
| fiber.middleware.jwt.authScheme | Provide auth scheme. | string | Bearer |
The supported scheme of **tokenLookup**
```
// Optional. Default value "header:Authorization".
// Possible values:
// - "header:<name>"
// - "query:<name>"
// - "cookie:<name>"
// Multiply sources example:
// - "header: Authorization,cookie: myowncookie"
```
Expand Down Expand Up @@ -625,7 +632,7 @@ The supported scheme of **tokenLookup**
#logger:
# - name: my-logger # Required
# description: "Description of entry" # Optional
# locale: "*::*::*::*" # Optional, default: "*::*::*::*"
# domain: "*" # Optional, default: "*"
# zap: # Optional
# level: info # Optional, default: info
# development: true # Optional, default: true
Expand Down Expand Up @@ -670,7 +677,7 @@ The supported scheme of **tokenLookup**
#event:
# - name: my-event # Required
# description: "Description of entry" # Optional
# locale: "*::*::*::*" # Optional, default: "*::*::*::*"
# domain: "*" # Optional, default: "*"
# encoding: console # Optional, default: console
# outputPaths: ["stdout"] # Optional, default: [stdout]
# lumberjack: # Optional, default: nil
Expand All @@ -694,14 +701,14 @@ The supported scheme of **tokenLookup**
#cert:
# - name: my-cert # Required
# description: "Description of entry" # Optional, default: ""
# locale: "*::*::*::*" # Optional, default: *::*::*::*
# domain: "*" # Optional, default: "*"
# caPath: "certs/ca.pem" # Optional, default: ""
# certPemPath: "certs/server-cert.pem" # Optional, default: ""
# keyPemPath: "certs/server-key.pem" # Optional, default: ""
#config:
# - name: my-config # Required
# description: "Description of entry" # Optional, default: ""
# locale: "*::*::*::*" # Optional, default: *::*::*::*
# domain: "*" # Optional, default: "*"
# path: "config/config.yaml" # Optional
# envPrefix: "" # Optional, default: ""
# content: # Optional, defualt: empty map
Expand Down Expand Up @@ -735,6 +742,9 @@ fiber:
# path: "/static" # Optional, default: /static
# sourceType: local # Optional, options: local, embed.FS can be used either, need to specify in code
# sourcePath: "." # Optional, full path of source directory
# pprof:
# enabled: true # Optional, default: false
# path: "/pprof" # Optional, default: /pprof
# prom:
# enabled: true # Optional, default: false
# path: "" # Optional, default: "/metrics"
Expand Down Expand Up @@ -795,11 +805,18 @@ fiber:
# reqPerSec: 0 # Optional, default: 1000000
# jwt:
# enabled: true # Optional, default: false
# signingKey: "my-secret" # Required
# ignore: [""] # Optional, default: []
# signingKeys: # Optional
# - "key:value"
# signingAlgo: "" # Optional, default: "HS256"
# ignore: [ "" ] # Optional, default: []
# signerEntry: "" # Optional, default: ""
# symmetric: # Optional
# algorithm: "" # Required, default: ""
# token: "" # Optional, default: ""
# tokenPath: "" # Optional, default: ""
# asymmetric: # Optional
# algorithm: "" # Required, default: ""
# privateKey: "" # Optional, default: ""
# privateKeyPath: "" # Optional, default: ""
# publicKey: "" # Optional, default: ""
# publicKeyPath: "" # Optional, default: ""
# tokenLookup: "header:<name>" # Optional, default: "header:Authorization"
# authScheme: "Bearer" # Optional, default: "Bearer"
# secure:
Expand Down
59 changes: 57 additions & 2 deletions boot/fiber_entry.go
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@ import (
"go.uber.org/zap"
"net"
"net/http"
"net/http/pprof"
"path"
"strconv"
"strings"
Expand Down Expand Up @@ -78,7 +79,9 @@ type BootFiber struct {
CommonService rkentry.BootCommonService `yaml:"commonService" json:"commonService"`
Prom rkentry.BootProm `yaml:"prom" json:"prom"`
Static rkentry.BootStaticFileHandler `yaml:"static" json:"static"`
Middleware struct {
PProf rkentry.BootPProf `yaml:"pprof" json:"pprof"`

Middleware struct {
Ignore []string `yaml:"ignore" json:"ignore"`
Logging rkmidlog.BootConfig `yaml:"logging" json:"logging"`
Prom rkmidprom.BootConfig `yaml:"prom" json:"prom"`
Expand Down Expand Up @@ -112,7 +115,9 @@ type FiberEntry struct {
PromEntry *rkentry.PromEntry `json:"-" yaml:"-"`
StaticFileEntry *rkentry.StaticFileHandlerEntry `json:"-" yaml:"-"`
DocsEntry *rkentry.DocsEntry `json:"-" yaml:"-"`
bootstrapLogOnce sync.Once `json:"-" yaml:"-"`
PProfEntry *rkentry.PProfEntry `json:"-" yaml:"-"`

bootstrapLogOnce sync.Once `json:"-" yaml:"-"`
}

// RegisterFiberEntryYAML register fiber entries with provided config file (Must YAML file).
Expand Down Expand Up @@ -180,6 +185,9 @@ func RegisterFiberEntryYAML(raw []byte) map[string]rkentry.Entry {
// Register static file handler
staticEntry := rkentry.RegisterStaticFileHandlerEntry(&element.Static, rkentry.WithNameStaticFileHandlerEntry(element.Name))

// Register pprof entry
pprofEntry := rkentry.RegisterPProfEntry(&element.PProf, rkentry.WithNamePProfEntry(element.Name))

inters := make([]fiber.Handler, 0)

// add global path ignorance
Expand Down Expand Up @@ -269,6 +277,8 @@ func RegisterFiberEntryYAML(raw []byte) map[string]rkentry.Entry {
WithCommonServiceEntry(commonServiceEntry),
WithSwEntry(swEntry),
WithStaticFileHandlerEntry(staticEntry),
WithPProfEntry(pprofEntry),

WithMiddleware(inters...))

res[name] = entry
Expand Down Expand Up @@ -376,6 +386,24 @@ func (entry *FiberEntry) Bootstrap(ctx context.Context) {
entry.DocsEntry.Bootstrap(ctx)
}

// Is pprof enabled?
if entry.IsPProfEnabled() {
entry.App.Get(path.Join(entry.PProfEntry.Path), adaptor.HTTPHandlerFunc(pprof.Index))

entry.App.Get(path.Join(entry.PProfEntry.Path, "cmdline"), adaptor.HTTPHandlerFunc(pprof.Cmdline))
entry.App.Get(path.Join(entry.PProfEntry.Path, "profile"), adaptor.HTTPHandlerFunc(pprof.Profile))
entry.App.Get(path.Join(entry.PProfEntry.Path, "symbol"), adaptor.HTTPHandlerFunc(pprof.Symbol))
entry.App.Get(path.Join(entry.PProfEntry.Path, "trace"), adaptor.HTTPHandlerFunc(pprof.Trace))
entry.App.Get(path.Join(entry.PProfEntry.Path, "allocs"), adaptor.HTTPHandlerFunc(pprof.Handler("allocs").ServeHTTP))
entry.App.Get(path.Join(entry.PProfEntry.Path, "block"), adaptor.HTTPHandlerFunc(pprof.Handler("block").ServeHTTP))
entry.App.Get(path.Join(entry.PProfEntry.Path, "goroutine"), adaptor.HTTPHandlerFunc(pprof.Handler("goroutine").ServeHTTP))
entry.App.Get(path.Join(entry.PProfEntry.Path, "heap"), adaptor.HTTPHandlerFunc(pprof.Handler("heap").ServeHTTP))
entry.App.Get(path.Join(entry.PProfEntry.Path, "mutex"), adaptor.HTTPHandlerFunc(pprof.Handler("mutex").ServeHTTP))
entry.App.Get(path.Join(entry.PProfEntry.Path, "threadcreate"), adaptor.HTTPHandlerFunc(pprof.Handler("threadcreate").ServeHTTP))

entry.PProfEntry.Bootstrap(ctx)
}

go entry.startServer(event, logger)

entry.bootstrapLogOnce.Do(func() {
Expand Down Expand Up @@ -406,6 +434,9 @@ func (entry *FiberEntry) Bootstrap(ctx context.Context) {

entry.LoggerEntry.Info(fmt.Sprintf("CommonSreviceEntry: %s", strings.Join(handlers, ", ")))
}
if entry.IsPProfEnabled() {
entry.LoggerEntry.Info(fmt.Sprintf("PProfEntry: %s://localhost:%d%s", scheme, entry.Port, entry.PProfEntry.Path))
}
entry.EventEntry.Finish(event)
})
}
Expand Down Expand Up @@ -468,6 +499,10 @@ func (entry *FiberEntry) Interrupt(ctx context.Context) {
entry.DocsEntry.Interrupt(ctx)
}

if entry.IsPProfEnabled() {
entry.PProfEntry.Interrupt(ctx)
}

if entry.App != nil {
if err := entry.App.Shutdown(); err != nil && err != http.ErrServerClosed {
event.AddErr(err)
Expand Down Expand Up @@ -513,6 +548,7 @@ func (entry *FiberEntry) MarshalJSON() ([]byte, error) {
"commonServiceEntry": entry.CommonServiceEntry,
"promEntry": entry.PromEntry,
"staticFileHandlerEntry": entry.StaticFileEntry,
"pprofEntry": entry.PProfEntry,
}

if entry.CertEntry != nil {
Expand Down Expand Up @@ -571,6 +607,11 @@ func (entry *FiberEntry) IsDocsEnabled() bool {
return entry.DocsEntry != nil
}

// IsPProfEnabled Is pprof entry enabled?
func (entry *FiberEntry) IsPProfEnabled() bool {
return entry.PProfEntry != nil
}

// IsPromEnabled Is prometheus entry enabled?
func (entry *FiberEntry) IsPromEnabled() bool {
return entry.PromEntry != nil
Expand Down Expand Up @@ -633,6 +674,13 @@ func (entry *FiberEntry) logBasicInfo(operation string, ctx context.Context) (rk
zap.String("docsPath", entry.DocsEntry.Path))
}

// add pprofEntry info
if entry.IsPProfEnabled() {
event.AddPayloads(
zap.Bool("pprofEnabled", true),
zap.String("pprofPath", entry.PProfEntry.Path))
}

// add PromEntry info
if entry.IsPromEnabled() {
event.AddPayloads(
Expand Down Expand Up @@ -713,6 +761,13 @@ func WithSwEntry(sw *rkentry.SWEntry) FiberEntryOption {
}
}

// WithPProfEntry provide rkentry.PProfEntry.
func WithPProfEntry(p *rkentry.PProfEntry) FiberEntryOption {
return func(entry *FiberEntry) {
entry.PProfEntry = p
}
}

// WithCommonServiceEntry provide CommonServiceEntry.
func WithCommonServiceEntry(commonServiceEntry *rkentry.CommonServiceEntry) FiberEntryOption {
return func(entry *FiberEntry) {
Expand Down
Loading

0 comments on commit a534ef0

Please sign in to comment.