data layer
This commit is contained in:
33
data-layer/workers/internal/apperr/apperr.go
Normal file
33
data-layer/workers/internal/apperr/apperr.go
Normal file
@@ -0,0 +1,33 @@
|
||||
// Package apperr defines AppError, the single error type used across the
|
||||
// worker. Job handlers wrap any underlying driver error before returning so
|
||||
// river retry/log lines stay consistent with the api service.
|
||||
package apperr
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
)
|
||||
|
||||
type AppError struct {
|
||||
Message string
|
||||
Err error
|
||||
}
|
||||
|
||||
func (e *AppError) Error() string {
|
||||
if e.Err != nil {
|
||||
return fmt.Sprintf("%s: %v", e.Message, e.Err)
|
||||
}
|
||||
return e.Message
|
||||
}
|
||||
|
||||
func (e *AppError) Unwrap() error { return e.Err }
|
||||
|
||||
func As(err error) (*AppError, bool) {
|
||||
var ae *AppError
|
||||
if errors.As(err, &ae) {
|
||||
return ae, true
|
||||
}
|
||||
return nil, false
|
||||
}
|
||||
|
||||
func Wrap(msg string, err error) *AppError { return &AppError{Message: msg, Err: err} }
|
||||
37
data-layer/workers/internal/config/config.go
Normal file
37
data-layer/workers/internal/config/config.go
Normal file
@@ -0,0 +1,37 @@
|
||||
// Package config loads runtime configuration for the analytics worker.
|
||||
package config
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"time"
|
||||
|
||||
"github.com/caarlos0/env/v11"
|
||||
)
|
||||
|
||||
type Config struct {
|
||||
HTTPAddr string `env:"WORKER_HTTP_ADDR" envDefault:":4001"`
|
||||
LogLevel string `env:"WORKER_LOG_LEVEL" envDefault:"info"`
|
||||
ShutdownTimeout time.Duration `env:"WORKER_SHUTDOWN_TIMEOUT_SECONDS" envDefault:"60s"`
|
||||
|
||||
// river queue tuning
|
||||
MaxWorkers int `env:"WORKER_MAX_WORKERS" envDefault:"50"`
|
||||
ComputeTraitsEvery time.Duration `env:"WORKER_COMPUTE_TRAITS_EVERY" envDefault:"1h"`
|
||||
RefreshSegmentEvery time.Duration `env:"WORKER_REFRESH_SEGMENT_EVERY" envDefault:"1h"`
|
||||
|
||||
// Shared infra ----------------------------------------------------------
|
||||
PostgresDSN string `env:"POSTGRES_DSN,required"`
|
||||
RedisAddr string `env:"REDIS_ADDR" envDefault:"localhost:6379"`
|
||||
|
||||
ClickHouseAddr string `env:"CLICKHOUSE_ADDR" envDefault:"localhost:9000"`
|
||||
ClickHouseDB string `env:"CLICKHOUSE_DB" envDefault:"cdp"`
|
||||
ClickHouseUser string `env:"CLICKHOUSE_USER" envDefault:"default"`
|
||||
ClickHousePassword string `env:"CLICKHOUSE_PASSWORD"`
|
||||
}
|
||||
|
||||
func Load() (*Config, error) {
|
||||
cfg := &Config{}
|
||||
if err := env.Parse(cfg); err != nil {
|
||||
return nil, fmt.Errorf("config load: %w", err)
|
||||
}
|
||||
return cfg, nil
|
||||
}
|
||||
0
data-layer/workers/internal/handler/.gitkeep
Normal file
0
data-layer/workers/internal/handler/.gitkeep
Normal file
0
data-layer/workers/internal/job/.gitkeep
Normal file
0
data-layer/workers/internal/job/.gitkeep
Normal file
0
data-layer/workers/internal/repo/.gitkeep
Normal file
0
data-layer/workers/internal/repo/.gitkeep
Normal file
Reference in New Issue
Block a user