Rework components

main v0.1.0
René Jochum 2 years ago
parent b66a165a75
commit 3b1b9bc0e0
Signed by: jochum
GPG Key ID: F7D906F5E51E8E5E

10
.gitignore vendored

@ -0,0 +1,10 @@
.env
.DS_STORE
.task/
!.gitkeep
go.work
go.work.sum

@ -11,9 +11,9 @@ type Component interface {
Name() string
Priority() int
Initialized() bool
Init(components *Components, cli *cli.Context) error
Init(components *Registry, cli *cli.Context) error
Stop() error
Flags(r *Components) []cli.Flag
Flags(r *Registry) []cli.Flag
Health(context context.Context) error
WrapHandlerFunc(ctx context.Context, req server.Request, rsp interface{}) error

@ -1,114 +0,0 @@
package logrus
import (
"context"
"fmt"
"os"
"runtime"
"strings"
microLogrus "github.com/go-micro/plugins/v4/logger/logrus"
microLogger "go-micro.dev/v4/logger"
"go-micro.dev/v4/server"
"jochum.dev/jo-micro/components"
"github.com/sirupsen/logrus"
"github.com/urfave/cli/v2"
)
// caller returns string presentation of log caller which is formatted as
// `/path/to/file.go:line_number`. e.g. `/internal/app/api.go:25`
func caller() func(*runtime.Frame) (function string, file string) {
return func(f *runtime.Frame) (function string, file string) {
return "", fmt.Sprintf("%s:%d", f.File, f.Line)
}
}
const Name = "logrus"
type LogrusComponet struct {
initialized bool
logger *logrus.Logger
}
func New() *LogrusComponet {
return &LogrusComponet{initialized: false}
}
func Must(ctx context.Context) *LogrusComponet {
return components.Must(ctx).Must(Name).(*LogrusComponet)
}
func MustReg(cReg *components.Components) *LogrusComponet {
return cReg.Must(Name).(*LogrusComponet)
}
func (c *LogrusComponet) Name() string {
return Name
}
func (c *LogrusComponet) Priority() int {
return 0
}
func (c *LogrusComponet) Initialized() bool {
return c.initialized
}
func (c *LogrusComponet) Init(components *components.Components, cli *cli.Context) error {
if c.initialized {
return nil
}
lvl, err := logrus.ParseLevel(cli.String(fmt.Sprintf("%s_loglevel", strings.ToLower(components.FlagPrefix()))))
if err != nil {
return err
}
c.logger = logrus.New()
c.logger.Out = os.Stdout
c.logger.Level = lvl
c.logger.SetReportCaller(true)
c.logger.SetFormatter(&logrus.JSONFormatter{
CallerPrettyfier: caller(),
FieldMap: logrus.FieldMap{
logrus.FieldKeyFile: "caller",
},
})
microLogger.DefaultLogger = microLogrus.NewLogger(microLogrus.WithLogger(c.logger))
c.initialized = true
return nil
}
func (c *LogrusComponet) Stop() error {
c.initialized = false
c.logger = nil
return nil
}
func (c *LogrusComponet) Flags(r *components.Components, flags []cli.Flag) []cli.Flag {
return []cli.Flag{
&cli.StringFlag{
Name: fmt.Sprintf("%s_loglevel", strings.ToLower(r.FlagPrefix())),
Value: "info",
Usage: "Logrus log level default 'info', {panic,fatal,error,warn,info,debug,trace} available",
EnvVars: []string{fmt.Sprintf("%s_LOG_LEVEL", strings.ToUpper(r.FlagPrefix()))},
},
}
}
func (c *LogrusComponet) Health(context context.Context) error {
return nil
}
func (c *LogrusComponet) WrapHandlerFunc(ctx context.Context, req server.Request, rsp interface{}) error {
return nil
}
func (c *LogrusComponet) Logger() *logrus.Logger {
return c.logger
}

@ -0,0 +1,29 @@
package components
import (
"fmt"
"github.com/urfave/cli/v2"
"go-micro.dev/v4/logger"
)
func FilterDuplicateFlags(flags []cli.Flag) []cli.Flag {
flagMap := make(map[string]cli.Flag, 0)
for _, f := range flags {
if _, ok := flagMap[f.Names()[0]]; !ok {
flagMap[f.Names()[0]] = f
} else {
logger.Warn(fmt.Sprintf("Duplicated flag '%s' found", f.Names()[0]))
}
}
result := make([]cli.Flag, len(flagMap))
i := 0
for _, f := range flagMap {
result[i] = f
i += 1
}
return result
}

@ -3,8 +3,6 @@ module jochum.dev/jo-micro/components
go 1.19
require (
github.com/go-micro/plugins/v4/logger/logrus v1.1.0
github.com/sirupsen/logrus v1.8.1
github.com/urfave/cli/v2 v2.16.3
go-micro.dev/v4 v4.8.1
)
@ -17,11 +15,16 @@ require (
github.com/cloudflare/circl v1.2.0 // indirect
github.com/cpuguy83/go-md2man/v2 v2.0.2 // indirect
github.com/emirpasic/gods v1.18.1 // indirect
github.com/evanphx/json-patch/v5 v5.6.0 // indirect
github.com/felixge/httpsnoop v1.0.3 // indirect
github.com/fsnotify/fsnotify v1.5.4 // indirect
github.com/go-acme/lego/v4 v4.8.0 // indirect
github.com/go-git/gcfg v1.5.0 // indirect
github.com/go-git/go-billy/v5 v5.3.1 // indirect
github.com/go-git/go-git/v5 v5.4.2 // indirect
github.com/gobwas/ws v1.1.0 // indirect
github.com/golang/protobuf v1.5.2 // indirect
github.com/google/go-cmp v0.5.8 // indirect
github.com/google/uuid v1.3.0 // indirect
github.com/imdario/mergo v0.3.13 // indirect
github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 // indirect
@ -34,6 +37,7 @@ require (
github.com/pkg/errors v0.9.1 // indirect
github.com/russross/blackfriday/v2 v2.1.0 // indirect
github.com/sergi/go-diff v1.2.0 // indirect
github.com/stretchr/testify v1.8.0 // indirect
github.com/xanzy/ssh-agent v0.3.2 // indirect
github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 // indirect
golang.org/x/crypto v0.0.0-20220924013350-4ba4fb4dd9e7 // indirect

@ -29,15 +29,15 @@ github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs
github.com/emirpasic/gods v1.12.0/go.mod h1:YfzfFFoVP/catgzJb4IKIqXjX78Ha8FMSDh3ymbK86o=
github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc=
github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ=
github.com/evanphx/json-patch/v5 v5.5.0 h1:bAmFiUJ+o0o2B4OiTFeE3MqCOtyo+jjPP9iZ0VRxYUc=
github.com/felixge/httpsnoop v1.0.1 h1:lvB5Jl89CsZtGIWuTcDM1E/vkVs49/Ml7JJe07l8SPQ=
github.com/evanphx/json-patch/v5 v5.6.0 h1:b91NhWfaz02IuVxO9faSllyAtNXHMPkC5J8sJCLunww=
github.com/felixge/httpsnoop v1.0.3 h1:s/nj+GCswXYzN5v2DpNMuMQYe+0DDwt5WVCU6CWBdXk=
github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc=
github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
github.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI=
github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU=
github.com/gliderlabs/ssh v0.2.2 h1:6zsha5zo/TWhRhwqCD3+EarCAgZ2yN28ipRnGPnwkI0=
github.com/gliderlabs/ssh v0.2.2/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0=
github.com/go-acme/lego/v4 v4.4.0 h1:uHhU5LpOYQOdp3aDU+XY2bajseu8fuExphTL1Ss6/Fc=
github.com/go-acme/lego/v4 v4.8.0 h1:XienkuT6ZKHe0DE/LXeGP4ZY+ft+7ZMlqtiJ7XJs2pI=
github.com/go-git/gcfg v1.5.0 h1:Q5ViNfGF8zFgyJWPqYwA7qGFoMTEiBmdlkcfRmpIMa4=
github.com/go-git/gcfg v1.5.0/go.mod h1:5m20vg6GwYabIxaOonVkTdrILxQMpEShl1xiMF4ua+E=
github.com/go-git/go-billy/v5 v5.2.0/go.mod h1:pmpqyWchKfYfrkb/UVH4otLvyi/5gJlGI4Hb3ZqZ3W0=
@ -47,17 +47,16 @@ github.com/go-git/go-git-fixtures/v4 v4.2.1 h1:n9gGL1Ct/yIw+nfsfr8s4+sbhT+Ncu2Su
github.com/go-git/go-git-fixtures/v4 v4.2.1/go.mod h1:K8zd3kDUAykwTdDCr+I0per6Y6vMiRR/nnVTBtavnB0=
github.com/go-git/go-git/v5 v5.4.2 h1:BXyZu9t0VkbiHtqrsvdq39UDhGJTl1h55VW6CSC4aY4=
github.com/go-git/go-git/v5 v5.4.2/go.mod h1:gQ1kArt6d+n+BGd+/B/I74HwRTLhth2+zti4ihgckDc=
github.com/go-micro/plugins/v4/logger/logrus v1.1.0 h1:qCWt1eW2GiQnwivrBBcPRZbCwQ51A5SGUXptpxmGcuQ=
github.com/go-micro/plugins/v4/logger/logrus v1.1.0/go.mod h1:aNJaayU7YKqlxwM91B3NixYpGgtCk1HiSgwuvCb7co0=
github.com/gobwas/httphead v0.1.0 h1:exrUm0f4YX0L7EBwZHuCF4GDp8aJfVeBrlLQrs6NqWU=
github.com/gobwas/pool v0.2.1 h1:xfeeEhW7pwmX8nuLVlqbzVc7udMDrwetjEv+TZIz1og=
github.com/gobwas/ws v1.0.4 h1:5eXU1CZhpQdq5kXbKb+sECH5Ia5KiO6CYzIzdlVx6Bs=
github.com/gobwas/ws v1.1.0 h1:7RFti/xnNkMJnrK7D1yQ/iCIB5OrrY/54/H930kIbHA=
github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw=
github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU=
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg=
github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I=
github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/gorilla/handlers v1.5.1 h1:9lRY6j8DEeeBT10CvO9hGW0gmky0BprnvDI5vfhUHH4=
@ -103,15 +102,13 @@ github.com/sergi/go-diff v1.2.0 h1:XU+rvMAioB0UC3q1MFrIQy4Vo5/4VsRDQQXHsEya6xQ=
github.com/sergi/go-diff v1.2.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM=
github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q=
github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=
github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE=
github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY=
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk=
github.com/urfave/cli/v2 v2.16.3 h1:gHoFIwpPjoyIMbJp/VFd+/vuD0dAgFK4B6DpEMFJfQk=
github.com/urfave/cli/v2 v2.16.3/go.mod h1:1CNUng3PtjQMtRzJO4FMXBQvkGtuYRxxiR9xMa7jMwI=
github.com/xanzy/ssh-agent v0.3.0/go.mod h1:3s9xbODqPuuhK9JV1R321M/FlMZSBvE5aY6eAcqrDh0=
@ -187,7 +184,6 @@ golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE=
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=

@ -4,11 +4,10 @@ import (
"context"
"sort"
"github.com/urfave/cli/v2"
"go-micro.dev/v4"
"go-micro.dev/v4/errors"
"go-micro.dev/v4/server"
"github.com/urfave/cli/v2"
)
var (
@ -23,17 +22,17 @@ type HealthInfo struct {
type HealthInfoMap map[string]HealthInfo
type ComponentsKey struct{}
type RegistryKey struct{}
type Components struct {
type Registry struct {
components map[string]Component
service micro.Service
flagPrefix string
}
func Context(ctx context.Context) (*Components, error) {
c, ok := ctx.Value(ComponentsKey{}).(*Components)
func Context(ctx context.Context) (*Registry, error) {
c, ok := ctx.Value(RegistryKey{}).(*Registry)
if !ok {
return nil, errorRetrievingComponents
}
@ -45,7 +44,7 @@ func Context(ctx context.Context) (*Components, error) {
return c, nil
}
func Must(ctx context.Context) *Components {
func Must(ctx context.Context) *Registry {
c, err := Context(ctx)
if err != nil {
panic(err)
@ -54,23 +53,23 @@ func Must(ctx context.Context) *Components {
return c
}
func New(service micro.Service, flagPrefix string, components ...Component) *Components {
com := &Components{service: service, flagPrefix: flagPrefix, components: make(map[string]Component)}
func New(service micro.Service, flagPrefix string, components ...Component) *Registry {
com := &Registry{service: service, flagPrefix: flagPrefix, components: make(map[string]Component)}
com.Add(components...)
return com
}
func (c *Components) Service() micro.Service {
func (c *Registry) Service() micro.Service {
return c.service
}
func (c *Components) FlagPrefix() string {
func (c *Registry) FlagPrefix() string {
return c.flagPrefix
}
func (c *Components) Add(components ...Component) {
func (c *Registry) Add(components ...Component) {
for _, component := range components {
if component == nil {
continue
@ -84,7 +83,7 @@ func (c *Components) Add(components ...Component) {
}
}
func (c *Components) Get(name string) (Component, error) {
func (c *Registry) Get(name string) (Component, error) {
if component, ok := c.components[name]; ok {
return component, nil
}
@ -92,7 +91,7 @@ func (c *Components) Get(name string) (Component, error) {
return nil, errors.InternalServerError("COMPONENT_NOT_FOUND", "component '%s' has not been found", name)
}
func (c *Components) Must(name string) Component {
func (c *Registry) Must(name string) Component {
component, err := c.Get(name)
if err != nil {
panic(err)
@ -101,7 +100,7 @@ func (c *Components) Must(name string) Component {
return component
}
func (c *Components) AppendFlags(flags []cli.Flag) []cli.Flag {
func (c *Registry) AppendFlags(flags []cli.Flag) []cli.Flag {
for _, component := range c.components {
flags = append(flags, component.Flags(c)...)
}
@ -109,7 +108,7 @@ func (c *Components) AppendFlags(flags []cli.Flag) []cli.Flag {
return flags
}
func (c *Components) Initialized() bool {
func (c *Registry) Initialized() bool {
for _, component := range c.components {
if !component.Initialized() {
return false
@ -119,7 +118,7 @@ func (c *Components) Initialized() bool {
return true
}
func (c *Components) Init(context *cli.Context) error {
func (c *Registry) Init(context *cli.Context) error {
// Sort Components by Priority ASC
components := make([]Component, len(c.components))
for _, com := range c.components {
@ -147,7 +146,7 @@ func (c *Components) Init(context *cli.Context) error {
return nil
}
func (c *Components) Stop() error {
func (c *Registry) Stop() error {
// Sort Components by Priority DESC
components := make([]Component, len(c.components))
for _, com := range c.components {
@ -175,7 +174,7 @@ func (c *Components) Stop() error {
return nil
}
func (c *Components) Health(context context.Context) HealthInfoMap {
func (c *Registry) Health(context context.Context) HealthInfoMap {
result := make(HealthInfoMap, len(c.components))
for _, component := range c.components {
@ -192,10 +191,10 @@ func (c *Components) Health(context context.Context) HealthInfoMap {
return result
}
func (c *Components) WrapHandler() server.HandlerWrapper {
func (c *Registry) WrapHandler() server.HandlerWrapper {
return func(h server.HandlerFunc) server.HandlerFunc {
return func(ctx context.Context, req server.Request, rsp interface{}) error {
ctx = context.WithValue(ctx, ComponentsKey{}, c)
ctx = context.WithValue(ctx, RegistryKey{}, c)
for _, component := range c.components {
if err := component.WrapHandlerFunc(ctx, req, rsp); err != nil {
Loading…
Cancel
Save