From 0ec05352e9f1eaa6eb8cb134b165db3d0ef8e613 Mon Sep 17 00:00:00 2001 From: Alexandre HEIM Date: Wed, 25 Jun 2025 14:35:33 +0200 Subject: [PATCH] add prefix --- README.md | 10 +++++++- example/echoService/cmd/main.go | 2 +- example/echoService/echoService.go | 36 +++++++++++++++-------------- example/echoService/pingEndpoint.go | 23 ++++++++++++++++++ plugis.go | 32 ++++++++++++++++++++++--- plugisservice.go | 3 ++- servicerunner.go | 17 +++++++++----- 7 files changed, 94 insertions(+), 29 deletions(-) create mode 100644 example/echoService/pingEndpoint.go diff --git a/README.md b/README.md index ed823a5..0612bb1 100644 --- a/README.md +++ b/README.md @@ -18,4 +18,12 @@ The `plugis.go` file defines the `PlugisIntf` interface, which specifies the fun The `example/echoService/echoService.go` file is a minimal service implementation sample. -The `example/echoService/cmd/main.go` file is a sample of ServiceRunner usage. \ No newline at end of file +The `example/echoService/cmd/main.go` file is a sample of ServiceRunner usage. + +# How to declare a service + +```go + + + +``` \ No newline at end of file diff --git a/example/echoService/cmd/main.go b/example/echoService/cmd/main.go index f39c885..048461d 100644 --- a/example/echoService/cmd/main.go +++ b/example/echoService/cmd/main.go @@ -24,7 +24,7 @@ func main() { } defer nc.Close() - runner := plugisservice.NewServiceRunner(nc, logger) + runner := plugisservice.NewServiceRunner(nc, logger, "integrator.customer.instance") runner.Start(ctx, echoservice.NewEchoService()) diff --git a/example/echoService/echoService.go b/example/echoService/echoService.go index 2524b86..6404d54 100644 --- a/example/echoService/echoService.go +++ b/example/echoService/echoService.go @@ -72,23 +72,25 @@ func (svc *EchoService) Run(ctx context.Context) error { defer func() { service.Stop() }() + /* + pingEndpoint := nats_service.EndpointConfig{ + Name: "ping", + Handler: func(ctx context.Context, request micro.Request) (any, error) { + data := request.Data() + _ = data + return "ping: " + string(data), err + }, + MaxConcurrency: 10, + RequestTimeout: 2 * time.Second, + Metadata: map[string]string{ + "description": "ping", + "version": "0.0.1", + }, + } - echoEndpoint := nats_service.EndpointConfig{ - Name: "ping", - Handler: func(ctx context.Context, request micro.Request) (any, error) { - data := request.Data() - _ = data - return "ping: " + string(data), err - }, - MaxConcurrency: 10, - RequestTimeout: 2 * time.Second, - Metadata: map[string]string{ - "description": "ping", - "version": "0.0.1", - }, - } + */ - err = service.AddEndpoint(ctx, echoEndpoint) + err = service.AddEndpoint(ctx, pingEndpoint) if err != nil { return err } @@ -117,9 +119,9 @@ func (svc *EchoService) Version() string { // Metadata returns the metadata of the service. func (svc *EchoService) Metadata() plugisservice.Metadata { - meta, err := plugisservice.NewServiceMetadata(svc.Prefix(), time.Now()) + serviceMetadata, err := plugisservice.NewServiceMetadata(svc.Prefix(), time.Now()) if err != nil { svc.Logger().Error("NewServiceMetadata", "error", err) } - return meta + return serviceMetadata.Meta() } diff --git a/example/echoService/pingEndpoint.go b/example/echoService/pingEndpoint.go new file mode 100644 index 0000000..10307e6 --- /dev/null +++ b/example/echoService/pingEndpoint.go @@ -0,0 +1,23 @@ +package echoservice + +import ( + "context" + "github.com/nats-io/nats.go/micro" + nats_service "github.com/telemac/plugisservice/pkg/nats-service" + "time" +) + +var pingEndpoint = nats_service.EndpointConfig{ + Name: "ping", + Handler: func(ctx context.Context, request micro.Request) (any, error) { + data := request.Data() + _ = data + return "ping: " + string(data), nil + }, + MaxConcurrency: 10, + RequestTimeout: 2 * time.Second, + Metadata: map[string]string{ + "description": "ping", + "version": "0.0.1", + }, +} diff --git a/plugis.go b/plugis.go index 4df1b14..ac55bf3 100644 --- a/plugis.go +++ b/plugis.go @@ -13,7 +13,6 @@ import ( "github.com/telemac/goutils/net" "github.com/telemac/goutils/task" - //"github.com/go-viper/mapstructure/v2" "github.com/nats-io/nats.go" "github.com/synadia-io/orbit.go/natsext" ) @@ -26,6 +25,7 @@ var _ PlugisIntf = (*Plugis)(nil) type Plugis struct { logger *slog.Logger nc *nats.Conn + prefix string } var ( @@ -78,7 +78,12 @@ func (plugis *Plugis) Publish(topic string, payload []byte) error { // Prefix returns the prefix for the Plugis instance. func (plugis *Plugis) Prefix() string { - return "integrator.customer.location" + return plugis.prefix +} + +// SetPrefix sets the prefix for the Plugis instance. +func (plugis *Plugis) SetPrefix(prefix string) { + plugis.prefix = prefix } // Request sends a request to the nats connection. @@ -191,7 +196,7 @@ func NewServiceMetadata(prefix string, startedAt time.Time) (*ServiceMetadata, e meta.Platform += " (docker)" } - meta.StartedAt = startedAt.String() + meta.StartedAt = startedAt.Format(time.RFC3339) meta.Hostname, err = os.Hostname() if err != nil { return nil, err @@ -203,3 +208,24 @@ func NewServiceMetadata(prefix string, startedAt time.Time) (*ServiceMetadata, e return &meta, nil } + +//func (smd *ServiceMetadata) Meta() Metadata { +// var meta Metadata +// err := mapstructure.Decode(smd, &meta) +// if err != nil { +// return Metadata{} +// } +// return meta +//} + +func (smd *ServiceMetadata) Meta() Metadata { + data, err := json.Marshal(smd) + if err != nil { + return Metadata{} + } + var meta Metadata + if err := json.Unmarshal(data, &meta); err != nil { + return Metadata{} + } + return meta +} diff --git a/plugisservice.go b/plugisservice.go index 88d82d1..8ad1b1a 100644 --- a/plugisservice.go +++ b/plugisservice.go @@ -29,6 +29,7 @@ type PlugisIntf interface { Logger() *slog.Logger SetNats(*nats.Conn) Nats() *nats.Conn + SetPrefix(prefix string) Prefix() string Publish(topic string, payload []byte) error Request(subj string, data []byte, timeout time.Duration) (*nats.Msg, error) @@ -43,7 +44,7 @@ type ServiceInfo struct { Description string `json:"description"` Version string `json:"version"` Type string `json:"type"` - Metadata Metadata `json:"metadata"` + Metadata Metadata `json:"metadata"` // contains at least ServiceMetadata fields Endpoints []Endpoint `json:"endpoints"` } diff --git a/servicerunner.go b/servicerunner.go index bd040bc..314dcb6 100644 --- a/servicerunner.go +++ b/servicerunner.go @@ -11,12 +11,13 @@ import ( // ServiceRunner is a struct that runs one or more services. type ServiceRunner struct { - wg sync.WaitGroup - log *slog.Logger - nc *nats.Conn + wg sync.WaitGroup + log *slog.Logger + nc *nats.Conn + prefix string } -func NewServiceRunner(nc *nats.Conn, log *slog.Logger) *ServiceRunner { +func NewServiceRunner(nc *nats.Conn, log *slog.Logger, prefix string) *ServiceRunner { if log == nil { log = slog.Default() } @@ -24,9 +25,11 @@ func NewServiceRunner(nc *nats.Conn, log *slog.Logger) *ServiceRunner { log.Error("failed to connect to nats") return nil } + // TODO : handle empty prefix return &ServiceRunner{ - nc: nc, - log: log, + nc: nc, + log: log, + prefix: prefix, } } @@ -37,6 +40,8 @@ func (sr *ServiceRunner) Start(ctx context.Context, svc PlugisServiceIntf) { defer sr.wg.Done() svc.SetLogger(sr.log) svc.SetNats(sr.nc) + // TODO : handle empty prefix + svc.SetPrefix(sr.prefix) serviceType := fmt.Sprintf("%T", svc) err := svc.Run(ctx) if err != nil {