package drivers import ( "log/slog" "nixcn-cms/config" "nixcn-cms/logger" "strings" "github.com/spf13/viper" "go.opentelemetry.io/otel/attribute" "gorm.io/driver/postgres" "gorm.io/gorm" "gorm.io/plugin/opentelemetry/tracing" ) func SplitHostPort(url string) (host, port string) { if !strings.Contains(url, ":") { return url, "5432" } split := strings.Split(url, ":") return split[0], split[1] } func Postgres(dsn ExternalDSN) (*gorm.DB, error) { serviceName := viper.GetString("database.service_name") host, port := SplitHostPort(dsn.Host) conn := "host=" + host + " user=" + dsn.Username + " password=" + dsn.Password + " dbname=" + dsn.Name + " port=" + port + " sslmode=disable TimeZone=" + config.TZ() db, err := gorm.Open(postgres.Open(conn), &gorm.Config{ Logger: logger.GormLogger(), }) if err != nil { return nil, err } err = db.Use(tracing.NewPlugin( tracing.WithAttributes( attribute.String("peer.service", serviceName), attribute.String("db.instance", dsn.Name), ), )) if err != nil { slog.Error("[Database] Error starting otel plugin!", "name", serviceName, "err", err) } return db, err }