3
0
corteza/compose/start.go
Denis Arh aea9741a2b Improve logging, migrate to zap, use requestID
- migrate from log to go.uber.org/zap package
 - add requestID header with sticky log field
 - push logging via context to REST controllers & HTTP middleware
 - enhance request/resnpose logging
 - add service logging framework
 - add ZapProfiler for db query profiling
2019-05-07 21:18:23 +02:00

83 lines
1.9 KiB
Go

package service
import (
"context"
"fmt"
"net"
"net/http"
"github.com/pkg/errors"
"github.com/titpetric/factory/resputil"
"go.uber.org/zap"
migrate "github.com/crusttech/crust/compose/db"
"github.com/crusttech/crust/compose/internal/service"
"github.com/crusttech/crust/internal/auth"
"github.com/crusttech/crust/internal/db"
"github.com/crusttech/crust/internal/logger"
"github.com/crusttech/crust/internal/mail"
"github.com/crusttech/crust/internal/metrics"
)
func Init(ctx context.Context) (err error) {
// validate configuration
if err = flags.Validate(); err != nil {
return
}
mail.SetupDialer(flags.smtp)
if err = InitDatabase(ctx); err != nil {
return
}
// configure resputil options
resputil.SetConfig(resputil.Options{
Pretty: flags.http.Pretty,
Trace: flags.http.Tracing,
Logger: func(err error) {},
})
// Use JWT secret for hmac signer for now
auth.DefaultSigner = auth.HmacSigner(flags.jwt.Secret)
auth.DefaultJwtHandler, err = auth.JWT(flags.jwt.Secret, flags.jwt.Expiry)
if err != nil {
return err
}
// Don't change this to init(), it needs Database
return service.Init()
}
func InitDatabase(ctx context.Context) error {
// start/configure database connection
db, err := db.TryToConnect(ctx, "compose", flags.db.DSN, flags.db.Profiler)
if err != nil {
return errors.Wrap(err, "could not connect to database")
}
// migrate database schema
if err := migrate.Migrate(db); err != nil {
return err
}
return nil
}
func StartRestAPI(ctx context.Context) error {
logger.Default().Info("Starting HTTP server", zap.String("address", flags.http.Addr))
listener, err := net.Listen("tcp", flags.http.Addr)
if err != nil {
return errors.Wrap(err, fmt.Sprintf("Can't listen on addr %s", flags.http.Addr))
}
if flags.monitor.Interval > 0 {
go metrics.NewMonitor(flags.monitor.Interval)
}
go http.Serve(listener, Routes(ctx))
<-ctx.Done()
return nil
}