apollo-backend/internal/cmdutil/cmdutil.go
2022-11-02 01:56:13 -04:00

79 lines
1.7 KiB
Go

package cmdutil
import (
"context"
"fmt"
"os"
"time"
"github.com/DataDog/datadog-go/statsd"
faktory "github.com/contribsys/faktory/client"
"github.com/go-redis/redis/v8"
"github.com/jackc/pgx/v4/pgxpool"
"go.uber.org/zap"
)
func NewLogger(service string) *zap.Logger {
env := os.Getenv("ENV")
logger, _ := zap.NewProduction(zap.Fields(
zap.String("env", env),
zap.String("service", service),
))
if env == "" || env == "development" {
logger, _ = zap.NewDevelopment()
}
return logger
}
func NewStatsdClient(tags ...string) (*statsd.Client, error) {
if env := os.Getenv("ENV"); env != "" {
tags = append(tags, fmt.Sprintf("env:%s", env))
}
return statsd.New(os.Getenv("STATSD_URL"), statsd.WithTags(tags))
}
func NewRedisClient(ctx context.Context, maxConns int) (*redis.Client, error) {
opt, err := redis.ParseURL(os.Getenv("REDIS_URL"))
if err != nil {
return nil, err
}
opt.PoolSize = maxConns
client := redis.NewClient(opt)
if err := client.Ping(ctx).Err(); err != nil {
return nil, err
}
return client, nil
}
func NewDatabasePool(ctx context.Context, maxConns int) (*pgxpool.Pool, error) {
if maxConns == 0 {
maxConns = 1
}
url := fmt.Sprintf(
"%s?pool_max_conns=%d&pool_min_conns=%d",
os.Getenv("DATABASE_CONNECTION_POOL_URL"),
maxConns,
2,
)
config, err := pgxpool.ParseConfig(url)
if err != nil {
return nil, err
}
// Setting the build statement cache to nil helps this work with pgbouncer
config.ConnConfig.BuildStatementCache = nil
config.ConnConfig.PreferSimpleProtocol = true
config.MaxConnLifetime = 1 * time.Hour
config.MaxConnIdleTime = 30 * time.Second
return pgxpool.ConnectConfig(ctx, config)
}
func NewFaktoryPool(maxConns int) (*faktory.Pool, error) {
return faktory.NewPool(maxConns)
}