onasty/mailer/main.go(view raw)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 |
package main
import (
"errors"
"fmt"
"log/slog"
"net/http"
"os"
"os/signal"
"strings"
"syscall"
"github.com/nats-io/nats.go"
"github.com/nats-io/nats.go/micro"
"github.com/olexsmir/onasty/internal/logger"
"github.com/olexsmir/onasty/internal/transport/http/httpserver"
_ "embed"
)
//go:embed version
var _version string
var version = strings.Trim(_version, "\n")
func main() {
if err := run(); err != nil {
fmt.Fprintf(os.Stderr, "error: %v\n", err)
os.Exit(1)
}
}
func run() error {
cfg := NewConfig()
nc, err := nats.Connect(cfg.NatsURL)
if err != nil {
return err
}
logger, err := logger.NewCustomLogger(cfg.LogLevel, cfg.LogFormat, cfg.LogShowLine)
if err != nil {
return err
}
slog.SetDefault(logger)
//nolint:exhaustruct
svc, err := micro.AddService(nc, micro.Config{
Name: "mailer",
Version: version,
})
if err != nil {
return err
}
mg := NewMailgun(cfg.MailgunFrom, cfg.MailgunDomain, cfg.MailgunAPIKey)
service := NewService(cfg.AppURL, mg)
handlers := NewHandlers(service)
if err := handlers.RegisterAll(svc); err != nil {
return err
}
if cfg.MetricsEnabled {
srv := httpserver.NewServer(cfg.MetricsPort, MetricsHandler())
go func() {
slog.Info("starting metrics server", "port", cfg.MetricsPort)
if err := srv.Start(); !errors.Is(err, http.ErrServerClosed) {
slog.Error("failed to start metrics server", "error", err)
}
}()
}
slog.Info("the service is listening")
// graceful shutdown
quitCh := make(chan os.Signal, 1)
signal.Notify(quitCh, syscall.SIGINT, syscall.SIGTERM)
<-quitCh
slog.Info("stopping the service")
if err := svc.Stop(); err != nil {
return err
}
if err := nc.Drain(); err != nil {
return err
}
return nil
}
|