Update dependencies, enhance NATS consumer configuration, and improve error handling in message processing. Introduce telemetry support with OpenTelemetry for tracing and metrics. Refactor README to include new configuration options and update tests for improved coverage of error scenarios.

This commit is contained in:
windyboy
2025-11-15 09:01:24 +08:00
parent 31839cf21f
commit 359e7694ab
31 changed files with 1326 additions and 667 deletions
-60
View File
@@ -1,60 +0,0 @@
package di
import (
"caatsm/internal/adapter/parser"
"caatsm/internal/app"
"caatsm/internal/infra/config"
"caatsm/internal/infra/log"
"caatsm/internal/infra/nats"
"caatsm/internal/infra/postgres"
"errors"
)
// InitializeAppWithConfig wires dependencies using the provided config.
func InitializeAppWithConfig(cfg *config.Config) (*app.MessageProcessor, *nats.Consumer, error) {
if cfg == nil {
return nil, nil, errors.New("config is required")
}
logger, err := log.ProvideLogger(cfg)
if err != nil {
return nil, nil, err
}
pool, err := postgres.ProvideDB(cfg)
if err != nil {
return nil, nil, err
}
repo, err := postgres.ProvideRepository(pool, logger)
if err != nil {
return nil, nil, err
}
conn, err := nats.ProvideNATSConn(cfg, logger)
{
if err != nil {
return nil, nil, err
}
}
js, err := nats.ProvideJetStream(conn, cfg, logger)
if err != nil {
return nil, nil, err
}
publisher, err := nats.ProvidePublisher(js, cfg, logger)
if err != nil {
return nil, nil, err
}
messageParser := parser.ProvideParser()
processor := app.NewMessageProcessor(messageParser, repo, publisher, logger)
consumer, err := nats.ProvideConsumer(conn, js, processor, cfg, logger)
if err != nil {
return nil, nil, err
}
return processor, consumer, nil
}
+52 -19
View File
@@ -16,30 +16,63 @@ import (
// InitializeApp initializes the application with all dependencies
func InitializeApp() (*app.MessageProcessor, *nats.Consumer, error) {
wire.Build(
// Config
config.ProvideConfig,
comps, err := buildAppComponents()
if err != nil {
return nil, nil, err
}
return comps.Processor, comps.Consumer, nil
}
// InitializeAppWithConfig wires dependencies using a pre-loaded configuration.
func InitializeAppWithConfig(cfg *config.Config) (*app.MessageProcessor, *nats.Consumer, error) {
comps, err := buildAppComponentsWithConfig(cfg)
if err != nil {
return nil, nil, err
}
return comps.Processor, comps.Consumer, nil
}
var runtimeSet = wire.NewSet(
// Logger
log.ProvideLogger,
// Database
postgres.ProvideDB,
postgres.ProvideRepository,
// Logger
log.ProvideLogger,
// NATS
nats.ProvideNATSConn,
nats.ProvideJetStream,
nats.ProvidePublisher,
// Database
postgres.ProvideDB,
postgres.ProvideRepository,
// Parser
parser.ProvideParser,
// NATS
nats.ProvideNATSConn,
nats.ProvideJetStream,
nats.ProvidePublisher,
// App
app.NewMessageProcessor,
// Parser
parser.ProvideParser,
// Consumer
nats.ProvideConsumer,
)
// App
app.NewMessageProcessor,
func buildAppComponents() (*appComponents, error) {
wire.Build(
config.ProvideConfig,
runtimeSet,
wire.Struct(new(appComponents), "*"),
)
return nil, nil
}
// Consumer
nats.ProvideConsumer,
func buildAppComponentsWithConfig(cfg *config.Config) (*appComponents, error) {
wire.Build(
runtimeSet,
wire.Struct(new(appComponents), "*"),
)
return nil, nil, nil
return nil, nil
}
type appComponents struct {
Processor *app.MessageProcessor
Consumer *nats.Consumer
}
+103 -32
View File
@@ -1,5 +1,6 @@
// Code generated by Wire. DO NOT EDIT.
//go:generate go run -mod=mod github.com/google/wire/cmd/wire
//go:build !wireinject
// +build !wireinject
@@ -12,44 +13,114 @@ import (
"caatsm/internal/infra/log"
"caatsm/internal/infra/nats"
"caatsm/internal/infra/postgres"
"github.com/google/wire"
)
// Injectors from wire.go:
func buildAppComponents() (*appComponents, error) {
parserParser := parser.ProvideParser()
configConfig, err := config.ProvideConfig()
if err != nil {
return nil, err
}
pool, err := postgres.ProvideDB(configConfig)
if err != nil {
return nil, err
}
logger, err := log.ProvideLogger(configConfig)
if err != nil {
return nil, err
}
repository, err := postgres.ProvideRepository(pool, logger)
if err != nil {
return nil, err
}
conn, err := nats.ProvideNATSConn(configConfig, logger)
if err != nil {
return nil, err
}
jetStreamContext, err := nats.ProvideJetStream(conn, configConfig, logger)
if err != nil {
return nil, err
}
publisher, err := nats.ProvidePublisher(jetStreamContext, configConfig, logger)
if err != nil {
return nil, err
}
messageProcessor := app.NewMessageProcessor(parserParser, repository, publisher, logger)
consumer, err := nats.ProvideConsumer(conn, jetStreamContext, messageProcessor, configConfig, logger)
if err != nil {
return nil, err
}
diAppComponents := &appComponents{
Processor: messageProcessor,
Consumer: consumer,
}
return diAppComponents, nil
}
func buildAppComponentsWithConfig(cfg *config.Config) (*appComponents, error) {
parserParser := parser.ProvideParser()
pool, err := postgres.ProvideDB(cfg)
if err != nil {
return nil, err
}
logger, err := log.ProvideLogger(cfg)
if err != nil {
return nil, err
}
repository, err := postgres.ProvideRepository(pool, logger)
if err != nil {
return nil, err
}
conn, err := nats.ProvideNATSConn(cfg, logger)
if err != nil {
return nil, err
}
jetStreamContext, err := nats.ProvideJetStream(conn, cfg, logger)
if err != nil {
return nil, err
}
publisher, err := nats.ProvidePublisher(jetStreamContext, cfg, logger)
if err != nil {
return nil, err
}
messageProcessor := app.NewMessageProcessor(parserParser, repository, publisher, logger)
consumer, err := nats.ProvideConsumer(conn, jetStreamContext, messageProcessor, cfg, logger)
if err != nil {
return nil, err
}
diAppComponents := &appComponents{
Processor: messageProcessor,
Consumer: consumer,
}
return diAppComponents, nil
}
// wire.go:
// InitializeApp initializes the application with all dependencies
func InitializeApp() (*app.MessageProcessor, *nats.Consumer, error) {
configConfig, err := config.ProvideConfig()
comps, err := buildAppComponents()
if err != nil {
return nil, nil, err
}
zapLogger, err := log.ProvideLogger(configConfig)
if err != nil {
return nil, nil, err
}
pgxpoolPool, err := postgres.ProvideDB(configConfig)
if err != nil {
return nil, nil, err
}
adapterRepository, err := postgres.ProvideRepository(pgxpoolPool, zapLogger)
if err != nil {
return nil, nil, err
}
natsConn, err := nats.ProvideNATSConn(configConfig, zapLogger)
if err != nil {
return nil, nil, err
}
natsJetStreamContext, err := nats.ProvideJetStream(natsConn, configConfig, zapLogger)
if err != nil {
return nil, nil, err
}
adapterPublisher, err := nats.ProvidePublisher(natsJetStreamContext, configConfig, zapLogger)
if err != nil {
return nil, nil, err
}
parserParser := parser.ProvideParser()
appMessageProcessor := app.NewMessageProcessor(parserParser, adapterRepository, adapterPublisher, zapLogger)
natsConsumer, err := nats.ProvideConsumer(natsConn, natsJetStreamContext, appMessageProcessor, configConfig, zapLogger)
if err != nil {
return nil, nil, err
}
return appMessageProcessor, natsConsumer, nil
return comps.Processor, comps.Consumer, nil
}
// InitializeAppWithConfig wires dependencies using a pre-loaded configuration.
func InitializeAppWithConfig(cfg *config.Config) (*app.MessageProcessor, *nats.Consumer, error) {
comps, err := buildAppComponentsWithConfig(cfg)
if err != nil {
return nil, nil, err
}
return comps.Processor, comps.Consumer, nil
}
var runtimeSet = wire.NewSet(log.ProvideLogger, postgres.ProvideDB, postgres.ProvideRepository, nats.ProvideNATSConn, nats.ProvideJetStream, nats.ProvidePublisher, parser.ProvideParser, app.NewMessageProcessor, nats.ProvideConsumer)
type appComponents struct {
Processor *app.MessageProcessor
Consumer *nats.Consumer
}