refactor: remove otel #140

Merged
Kichiyaki merged 1 commits from refactor/remove-otel into master 2022-12-20 07:27:13 +00:00
53 changed files with 87 additions and 1622 deletions

View File

@ -7,8 +7,6 @@ import (
"time"
"github.com/kelseyhightower/envconfig"
"github.com/uptrace/bun/extra/bunotel"
"github.com/uptrace/bun/driver/pgdriver"
"github.com/uptrace/bun"
@ -33,14 +31,13 @@ func NewBunDB() (*bun.DB, error) {
}
db := bun.NewDB(newSQLDB(cfg), pgdialect.New())
ctx, cancel := context.WithTimeout(context.Background(), dbPingTimeout)
defer cancel()
if err := db.PingContext(ctx); err != nil {
return nil, fmt.Errorf("db.PingContext: %w", err)
}
db.AddQueryHook(bunotel.NewQueryHook())
return db, nil
}

View File

@ -8,8 +8,6 @@ import (
"syscall"
"time"
"gitea.dwysokinski.me/twhelp/core/internal/msg/msgotel"
"gitea.dwysokinski.me/twhelp/core/internal/msg"
"gitea.dwysokinski.me/twhelp/core/cmd/twhelp/internal"
@ -26,8 +24,6 @@ import (
)
const (
otelShutdownTimeout = 5 * time.Second
otelServiceNamePrefix = "twhelp.consumer."
routerCloseTimeout = 30 * time.Second
maxRetries = 3
retryInitialInterval = 3 * time.Second
@ -58,7 +54,6 @@ func newServerCommand() *cli.Command {
return runConsumer(
c,
"ServerConsumer",
"server",
func(
c *cli.Context,
router *message.Router,
@ -84,7 +79,6 @@ func newTribeCommand() *cli.Command {
return runConsumer(
c,
"TribeConsumer",
"tribe",
func(
c *cli.Context,
router *message.Router,
@ -118,7 +112,6 @@ func newPlayerCommand() *cli.Command {
return runConsumer(
c,
"PlayerConsumer",
"player",
func(
c *cli.Context,
router *message.Router,
@ -153,7 +146,6 @@ func newVillageCommand() *cli.Command {
return runConsumer(
c,
"VillageConsumer",
"village",
func(
c *cli.Context,
router *message.Router,
@ -179,7 +171,6 @@ func newEnnoblementCommand() *cli.Command {
return runConsumer(
c,
"EnnoblementConsumer",
"ennoblement",
func(
c *cli.Context,
router *message.Router,
@ -208,17 +199,7 @@ type registerHandlersFunc func(
bunDB *bun.DB,
) error
func runConsumer(c *cli.Context, name, serviceNameSuffix string, registerHandlers registerHandlersFunc) error {
shutdown, err := internal.InitOTEL(otelServiceNamePrefix+serviceNameSuffix, c.App.Version)
if err != nil {
return fmt.Errorf("internal.InitOTEL: %w", err)
}
defer func() {
ctx, cancel := context.WithTimeout(c.Context, otelShutdownTimeout)
defer cancel()
_ = shutdown(ctx)
}()
func runConsumer(c *cli.Context, name string, registerHandlers registerHandlersFunc) error {
logger := zap.L()
bunDB, err := internal.NewBunDB()
@ -297,12 +278,8 @@ func newRouter(logger watermill.LoggerAdapter) (*message.Router, error) {
if err != nil {
return nil, fmt.Errorf("message.NewRouter: %w", err)
}
router.AddMiddleware(msgotel.Middleware())
router.AddMiddleware(middleware.Recoverer)
router.AddMiddleware(newRetryMiddleware(logger).Middleware)
router.AddPublisherDecorators(func(pub message.Publisher) (message.Publisher, error) {
return msgotel.NewPublisherDecorator(pub), nil
})
return router, nil
}

View File

@ -5,8 +5,6 @@ import (
"fmt"
"time"
"gitea.dwysokinski.me/twhelp/core/internal/msg/msgotel"
"gitea.dwysokinski.me/twhelp/core/internal/msg"
"gitea.dwysokinski.me/twhelp/core/cmd/twhelp/internal"
@ -18,9 +16,7 @@ import (
)
const (
otelShutdownTimeout = 5 * time.Second
otelServiceNamePrefix = "twhelp.job."
jobTimeout = 30 * time.Second
jobTimeout = 30 * time.Second
)
func New() *cli.Command {
@ -60,7 +56,6 @@ func newUpdateDataCommand() *cli.Command {
Action: func(c *cli.Context) error {
return runJob(
c,
"update.data",
func(ctx context.Context, job *service.Job) error {
if err := job.UpdateData(ctx); err != nil {
return fmt.Errorf("Job.UpdateData: %w", err)
@ -79,7 +74,6 @@ func newUpdateEnnoblementsCommand() *cli.Command {
Action: func(c *cli.Context) error {
return runJob(
c,
"update.ennoblements",
func(ctx context.Context, job *service.Job) error {
if err := job.UpdateEnnoblements(ctx); err != nil {
return fmt.Errorf("Job.UpdateEnnoblements: %w", err)
@ -98,7 +92,6 @@ func newCreateSnapshotsCommand() *cli.Command {
Action: func(c *cli.Context) error {
return runJob(
c,
"update.snapshots",
func(ctx context.Context, job *service.Job) error {
if err := job.CreateSnapshots(ctx); err != nil {
return fmt.Errorf("Job.CreateSnapshots: %w", err)
@ -112,17 +105,7 @@ func newCreateSnapshotsCommand() *cli.Command {
type runJobFunc func(ctx context.Context, job *service.Job) error
func runJob(c *cli.Context, otelSuffix string, fn runJobFunc) error {
shutdown, err := internal.InitOTEL(otelServiceNamePrefix+otelSuffix, c.App.Version)
if err != nil {
return fmt.Errorf("internal.InitOTEL: %w", err)
}
defer func() {
ctx, cancel := context.WithTimeout(c.Context, otelShutdownTimeout)
defer cancel()
_ = shutdown(ctx)
}()
func runJob(c *cli.Context, fn runJobFunc) error {
db, err := internal.NewBunDB()
if err != nil {
return fmt.Errorf("internal.NewBunDB: %w", err)
@ -135,10 +118,6 @@ func runJob(c *cli.Context, otelSuffix string, fn runJobFunc) error {
if err != nil {
return fmt.Errorf("internal.NewAMQPPublisher: %w", err)
}
decoratedPublisher := msgotel.NewPublisherDecorator(publisher)
defer func() {
_ = decoratedPublisher.Close()
}()
marshaler := internal.NewCommandEventMarshaler()
ctx, cancel := context.WithTimeout(c.Context, jobTimeout)
@ -147,9 +126,9 @@ func runJob(c *cli.Context, otelSuffix string, fn runJobFunc) error {
err = fn(ctx, service.NewJob(
service.NewVersion(bundb.NewVersion(db)),
service.NewServer(bundb.NewServer(db), internal.NewTWClient(c.App.Version)),
msg.NewServerPublisher(decoratedPublisher, marshaler),
msg.NewEnnoblementPublisher(decoratedPublisher, marshaler),
msg.NewSnapshotPublisher(decoratedPublisher, marshaler),
msg.NewServerPublisher(publisher, marshaler),
msg.NewEnnoblementPublisher(publisher, marshaler),
msg.NewSnapshotPublisher(publisher, marshaler),
))
if err != nil {
return err

View File

@ -1,126 +0,0 @@
package internal
import (
"context"
"fmt"
"time"
"go.opentelemetry.io/otel/exporters/stdout/stdouttrace"
"go.opentelemetry.io/otel/propagation"
"go.opentelemetry.io/otel"
"go.opentelemetry.io/otel/sdk/resource"
semconv "go.opentelemetry.io/otel/semconv/v1.12.0"
"github.com/kelseyhightower/envconfig"
"go.opentelemetry.io/otel/exporters/jaeger"
sdktrace "go.opentelemetry.io/otel/sdk/trace"
)
type otelConfig struct {
Enabled bool `envconfig:"ENABLED" default:"false"`
DeploymentEnvironment string `envconfig:"DEPLOYMENT_ENVIRONMENT" default:"local"`
}
func InitOTEL(serviceName, version string) (func(ctx context.Context) error, error) {
var cfg otelConfig
if err := envconfig.Process("OTEL", &cfg); err != nil {
return nil, fmt.Errorf("envconfig.Process: %w", err)
}
if !cfg.Enabled {
return noopShutdown, nil
}
tp, err := newTracerProvider(serviceName, version, cfg.DeploymentEnvironment)
if err != nil {
return nil, fmt.Errorf("newTracerProvider: %w", err)
}
otel.SetTracerProvider(tp)
otel.SetTextMapPropagator(propagation.NewCompositeTextMapPropagator(propagation.TraceContext{}, propagation.Baggage{}))
return tp.Shutdown, nil
}
type tracesConfig struct {
Exporter string `envconfig:"EXPORTER" default:"stdout"`
SamplerArg float64 `envconfig:"SAMPLER_ARG" default:"0.1"` // Value passed to the sampler
}
func newTracerProvider(serviceName, version, deploymentEnvironment string) (*sdktrace.TracerProvider, error) {
var cfg tracesConfig
if err := envconfig.Process("OTEL_TRACES", &cfg); err != nil {
return nil, fmt.Errorf("envconfig.Process: %w", err)
}
exp, err := newTraceExporter(cfg.Exporter)
if err != nil {
return nil, fmt.Errorf("newTraceExporter: %w", err)
}
tp := sdktrace.NewTracerProvider(
sdktrace.WithBatcher(exp),
sdktrace.WithSampler(sdktrace.TraceIDRatioBased(cfg.SamplerArg)),
sdktrace.WithResource(
resource.NewWithAttributes(
semconv.SchemaURL,
semconv.ServiceNameKey.String(serviceName),
semconv.ServiceVersionKey.String(version),
semconv.DeploymentEnvironmentKey.String(deploymentEnvironment),
),
),
)
return tp, nil
}
func newTraceExporter(exporter string) (sdktrace.SpanExporter, error) {
switch exporter {
case "stdout":
return newStdoutTraceExporter()
case "jaeger":
return newJaegerTraceExporter()
default:
return nil, fmt.Errorf("unsupported exporter: %s", exporter)
}
}
type jaegerTraceExporterConfig struct {
AgentHost string `envconfig:"AGENT_HOST" required:"true"`
AgentPort string `envconfig:"AGENT_PORT" default:"6831"`
ReconnectingInterval time.Duration `envconfig:"RECONNECTING_INTERVAL" default:"2s"`
}
func newJaegerTraceExporter() (*jaeger.Exporter, error) {
var cfg jaegerTraceExporterConfig
if err := envconfig.Process("OTEL_JAEGER", &cfg); err != nil {
return nil, fmt.Errorf("envconfig.Process: %w", err)
}
exp, err := jaeger.New(
jaeger.WithAgentEndpoint(
jaeger.WithAgentHost(cfg.AgentHost),
jaeger.WithAgentPort(cfg.AgentPort),
jaeger.WithAttemptReconnectingInterval(cfg.ReconnectingInterval),
),
)
if err != nil {
return nil, fmt.Errorf("jaeger.New: %w", err)
}
return exp, nil
}
func newStdoutTraceExporter() (*stdouttrace.Exporter, error) {
exp, err := stdouttrace.New(stdouttrace.WithPrettyPrint())
if err != nil {
return nil, fmt.Errorf("stdouttrace.New: %w", err)
}
return exp, nil
}
func noopShutdown(ctx context.Context) error {
return nil
}

View File

@ -14,8 +14,6 @@ import (
"gitea.dwysokinski.me/Kichiyaki/chizap"
"gitea.dwysokinski.me/twhelp/core/internal/router/meta"
"gitea.dwysokinski.me/twhelp/core/internal/router/rest"
"github.com/riandyrn/otelchi"
"github.com/kelseyhightower/envconfig"
"gitea.dwysokinski.me/twhelp/core/internal/bundb"
@ -32,8 +30,6 @@ import (
)
const (
serviceName = "twhelp.api"
otelShutdownTimeout = 5 * time.Second
defaultPort = "9234"
readTimeout = 2 * time.Second
readHeaderTimeout = 2 * time.Second
@ -48,16 +44,6 @@ func New() *cli.Command {
Name: "serve",
Usage: "Runs the http server",
Action: func(c *cli.Context) error {
shutdown, err := internal.InitOTEL(serviceName, c.App.Version)
if err != nil {
return fmt.Errorf("internal.InitOTEL: %w", err)
}
defer func() {
ctx, cancel := context.WithTimeout(c.Context, otelShutdownTimeout)
defer cancel()
_ = shutdown(ctx)
}()
db, err := internal.NewBunDB()
if err != nil {
return fmt.Errorf("internal.NewBunDB: %w", err)
@ -182,7 +168,6 @@ func newAPIConfig() (apiConfig, error) {
func getChiMiddlewares(logger *zap.Logger) chi.Middlewares {
return chi.Middlewares{
middleware.RealIP,
otelchi.Middleware(serviceName, otelchi.WithFilter(omitMetaEndpoints)),
chizap.Logger(logger, chizap.WithFilter(omitMetaEndpoints)),
middleware.Recoverer,
}

View File

@ -5,8 +5,6 @@ import (
"time"
"gitea.dwysokinski.me/twhelp/core/internal/tw"
"go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp"
"go.opentelemetry.io/otel/propagation"
)
const (
@ -17,10 +15,6 @@ func NewTWClient(version string) *tw.Client {
return tw.NewClient(
tw.WithHTTPClient(&http.Client{
Timeout: twClientTimeout,
Transport: otelhttp.NewTransport(
http.DefaultTransport,
otelhttp.WithPropagators(propagation.NewCompositeTextMapPropagator()),
),
}),
tw.WithUserAgent("tribalwarshelp/"+version),
)

14
go.mod
View File

@ -16,7 +16,6 @@ require (
github.com/jackc/pgerrcode v0.0.0-20220416144525-469b46aa5efa
github.com/kelseyhightower/envconfig v1.4.0
github.com/ory/dockertest/v3 v3.9.1
github.com/riandyrn/otelchi v0.5.0
github.com/stretchr/testify v1.8.1
github.com/swaggo/http-swagger v1.3.3
github.com/swaggo/swag v1.8.8
@ -24,14 +23,7 @@ require (
github.com/uptrace/bun/dbfixture v1.1.9
github.com/uptrace/bun/dialect/pgdialect v1.1.9
github.com/uptrace/bun/driver/pgdriver v1.1.9
github.com/uptrace/bun/extra/bunotel v1.1.9
github.com/urfave/cli/v2 v2.23.7
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.37.0
go.opentelemetry.io/otel v1.11.2
go.opentelemetry.io/otel/exporters/jaeger v1.11.2
go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.11.2
go.opentelemetry.io/otel/sdk v1.11.2
go.opentelemetry.io/otel/trace v1.11.2
go.uber.org/zap v1.24.0
)
@ -48,9 +40,6 @@ require (
github.com/docker/docker v20.10.7+incompatible // indirect
github.com/docker/go-connections v0.4.0 // indirect
github.com/docker/go-units v0.4.0 // indirect
github.com/felixge/httpsnoop v1.0.3 // indirect
github.com/go-logr/logr v1.2.3 // indirect
github.com/go-logr/stdr v1.2.2 // indirect
github.com/go-openapi/jsonpointer v0.19.5 // indirect
github.com/go-openapi/jsonreference v0.20.0 // indirect
github.com/go-openapi/spec v0.20.6 // indirect
@ -77,15 +66,12 @@ require (
github.com/sirupsen/logrus v1.8.1 // indirect
github.com/swaggo/files v0.0.0-20220610200504-28940afbdbfe // indirect
github.com/tmthrgd/go-hex v0.0.0-20190904060850-447a3041c3bc // indirect
github.com/uptrace/opentelemetry-go-extra/otelsql v0.1.17 // indirect
github.com/vmihailenco/msgpack/v5 v5.3.5 // indirect
github.com/vmihailenco/tagparser/v2 v2.0.0 // indirect
github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f // indirect
github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect
github.com/xeipuuv/gojsonschema v1.2.0 // indirect
github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 // indirect
go.opentelemetry.io/contrib v1.0.0 // indirect
go.opentelemetry.io/otel/metric v0.34.0 // indirect
go.uber.org/atomic v1.9.0 // indirect
go.uber.org/multierr v1.7.0 // indirect
golang.org/x/crypto v0.3.0 // indirect

40
go.sum
View File

@ -50,28 +50,16 @@ github.com/docker/go-units v0.4.0 h1:3uh0PgVws3nIA0Q+MwDC8yjEPf9zjRfZZWXZYDct3Tw
github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk=
github.com/elliotchance/phpserialize v1.3.3 h1:hV4QVmGdCiYgoBbw+ADt6fNgyZ2mYX0OgpnON1adTCM=
github.com/elliotchance/phpserialize v1.3.3/go.mod h1:gt7XX9+ETUcLXbtTKEuyrqW3lcLUAeS/AnGZ2e49TZs=
github.com/felixge/httpsnoop v1.0.2/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U=
github.com/felixge/httpsnoop v1.0.3 h1:s/nj+GCswXYzN5v2DpNMuMQYe+0DDwt5WVCU6CWBdXk=
github.com/felixge/httpsnoop v1.0.3/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U=
github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k=
github.com/garsue/watermillzap v1.1.1 h1:qReFh5goSOoub8x0cc+iSaaeIMJF0m66nmdesqG7VBg=
github.com/garsue/watermillzap v1.1.1/go.mod h1:6wdF9VgwK7JMANUtlpUUfNwkrFRWQ4G+U/dgBcWpvTA=
github.com/go-chi/chi v4.0.2+incompatible/go.mod h1:eB3wogJHnLi3x/kFX2A+IbTBlXxmMeXJVKy9tTv1XzQ=
github.com/go-chi/chi/v5 v5.0.7/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8=
github.com/go-chi/chi/v5 v5.0.8 h1:lD+NLqFcAi1ovnVZpsnObHGW4xb4J8lNmoYVfECH1Y0=
github.com/go-chi/chi/v5 v5.0.8/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8=
github.com/go-chi/cors v1.2.1 h1:xEC8UT3Rlp2QuWNEr4Fs/c2EAGVKBwy/1vHx3bppil4=
github.com/go-chi/cors v1.2.1/go.mod h1:sSbTewc+6wYHBBCW7ytsFSn836hqM7JxpglAy2Vzc58=
github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=
github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
github.com/go-logr/logr v1.2.1/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
github.com/go-logr/logr v1.2.3 h1:2DntVwHkVopvECVRSlL5PSo9eG+cAkDCuckLubN+rq0=
github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
github.com/go-logr/stdr v1.2.0/go.mod h1:YkVgnZu1ZjjL7xTxrfm/LLZBfkhTqSR1ydtm6jTKKwI=
github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg=
github.com/go-openapi/jsonpointer v0.19.5 h1:gZr+CIYByUqjcgeLXnQu2gHYQC9o73G2XUeOFYEICuY=
github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg=
@ -97,7 +85,6 @@ github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMyw
github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=
github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
@ -182,8 +169,6 @@ github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R
github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
github.com/rabbitmq/amqp091-go v1.2.0 h1:1pHBxAsQh54R9eX/xo679fUEAfv3loMqi0pvRFOj2nk=
github.com/rabbitmq/amqp091-go v1.2.0/go.mod h1:ogQDLSOACsLPsIq0NpbtiifNZi2YOz0VTJ0kHRghqbM=
github.com/riandyrn/otelchi v0.5.0 h1:MJgGWsK8678BEgcFK0bXN0KCT+cmZenrLbfwcVdmMno=
github.com/riandyrn/otelchi v0.5.0/go.mod h1:TdZGrioq34o3UK86q/3v220f4Zv/UOlffx74hSWlZsQ=
github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk=
@ -198,7 +183,6 @@ github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnIn
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
github.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c=
github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
@ -226,10 +210,6 @@ github.com/uptrace/bun/dialect/pgdialect v1.1.9 h1:V23SU89WfjqtePLFPRXVXCwmSyYb0
github.com/uptrace/bun/dialect/pgdialect v1.1.9/go.mod h1:+ux7PjC4NYsNMdGE9b2ERxCi2jJai8Z8zniXFExq0Ns=
github.com/uptrace/bun/driver/pgdriver v1.1.9 h1:Dy9g/EpgOG15RP3mDAuJd/hnfXAUdBsfxpg9On27M+Y=
github.com/uptrace/bun/driver/pgdriver v1.1.9/go.mod h1:YnPHzR4fT24PXrBTcadclXfdtkR9dYouqk2HwOiKf2g=
github.com/uptrace/bun/extra/bunotel v1.1.9 h1:LVZ09KKJGfleDQ4rtVSFcpG4iNUvwvuJyQLA21tyNRA=
github.com/uptrace/bun/extra/bunotel v1.1.9/go.mod h1:Vzax3Xl5s3+ZDnz5NHHTz9Qa9UMabvGVdn0YksALhHo=
github.com/uptrace/opentelemetry-go-extra/otelsql v0.1.17 h1:LJgQBGDf/u2RxdAiQvb47lZ0PuQYZutJgjmxLPaFKLU=
github.com/uptrace/opentelemetry-go-extra/otelsql v0.1.17/go.mod h1:Ohf26FVZL1ckvgqrwLoZfb8SRwlCe6otyKlpolfdflI=
github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0=
github.com/urfave/cli/v2 v2.23.7 h1:YHDQ46s3VghFHFf1DdF+Sh7H4RqhcM+t0TmZRJx4oJY=
github.com/urfave/cli/v2 v2.23.7/go.mod h1:GHupkWPMM0M/sj1a2b4wUrWBPzazNrIjouW6fmdJLxc=
@ -249,25 +229,6 @@ github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 h1:bAn7/zixMGCfxrRT
github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673/go.mod h1:N3UwUGtsrSj3ccvlPHLoLsHnpR27oXr4ZE984MbSER8=
github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
go.opentelemetry.io/contrib v1.0.0 h1:khwDCxdSspjOLmFnvMuSHd/5rPzbTx0+l6aURwtQdfE=
go.opentelemetry.io/contrib v1.0.0/go.mod h1:EH4yDYeNoaTqn/8yCWQmfNB78VHfGX2Jt2bvnvzBlGM=
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.37.0 h1:yt2NKzK7Vyo6h0+X8BA4FpreZQTlVEIarnsBP/H5mzs=
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.37.0/go.mod h1:+ARmXlUlc51J7sZeCBkBJNdHGySrdOzgzxp6VWRWM1U=
go.opentelemetry.io/otel v1.3.0/go.mod h1:PWIKzi6JCp7sM0k9yZ43VX+T345uNbAkDKwHVjb2PTs=
go.opentelemetry.io/otel v1.11.2 h1:YBZcQlsVekzFsFbjygXMOXSs6pialIZxcjfO/mBDmR0=
go.opentelemetry.io/otel v1.11.2/go.mod h1:7p4EUV+AqgdlNV9gL97IgUZiVR3yrFXYo53f9BM3tRI=
go.opentelemetry.io/otel/exporters/jaeger v1.11.2 h1:ES8/j2+aB+3/BUw51ioxa50V9btN1eew/2J7N7n1tsE=
go.opentelemetry.io/otel/exporters/jaeger v1.11.2/go.mod h1:nwcF/DK4Hk0auZ/a5vw20uMsaJSXbzeeimhN5f9d0Lc=
go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.11.2 h1:BhEVgvuE1NWLLuMLvC6sif791F45KFHi5GhOs1KunZU=
go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.11.2/go.mod h1:bx//lU66dPzNT+Y0hHA12ciKoMOH9iixEwCqC1OeQWQ=
go.opentelemetry.io/otel/metric v0.34.0 h1:MCPoQxcg/26EuuJwpYN1mZTeCYAUGx8ABxfW07YkjP8=
go.opentelemetry.io/otel/metric v0.34.0/go.mod h1:ZFuI4yQGNCupurTXCwkeD/zHBt+C2bR7bw5JqUm/AP8=
go.opentelemetry.io/otel/sdk v1.3.0/go.mod h1:rIo4suHNhQwBIPg9axF8V9CA72Wz2mKF1teNrup8yzs=
go.opentelemetry.io/otel/sdk v1.11.2 h1:GF4JoaEx7iihdMFu30sOyRx52HDHOkl9xQ8SMqNXUiU=
go.opentelemetry.io/otel/sdk v1.11.2/go.mod h1:wZ1WxImwpq+lVRo4vsmSOxdd+xwoUJ6rqyLc3SyX9aU=
go.opentelemetry.io/otel/trace v1.3.0/go.mod h1:c/VDhno8888bvQYmbYLqe41/Ldmr/KKunbvWM4/fEjk=
go.opentelemetry.io/otel/trace v1.11.2 h1:Xf7hWSF2Glv0DE3MH7fBHvtpSBsjcBUe5MYAmZM/+y0=
go.opentelemetry.io/otel/trace v1.11.2/go.mod h1:4N+yC7QEz7TTsG9BSRLNAa63eg5E06ObSbKPmxQ/pKA=
go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ=
go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE=
@ -319,7 +280,6 @@ golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7w
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210906170528-6f6e22806c34/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20211116061358-0a5406a5449c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=

View File

@ -7,11 +7,9 @@ import (
"gitea.dwysokinski.me/twhelp/core/internal/domain"
"github.com/uptrace/bun"
"go.opentelemetry.io/otel"
)
var (
tracer = otel.Tracer("gitea.dwysokinski.me/twhelp/core/internal/bundb")
tribeMetaColumns = []string{"id", "name", "tag", "profile_url"}
playerMetaColumns = []string{"id", "name", "profile_url"}
villageMetaColumns = []string{"id", "name", "x", "y", "continent", "profile_url"}

View File

@ -9,7 +9,6 @@ import (
"gitea.dwysokinski.me/twhelp/core/internal/bundb/internal/model"
"gitea.dwysokinski.me/twhelp/core/internal/domain"
"github.com/uptrace/bun"
"go.opentelemetry.io/otel/codes"
)
type Ennoblement struct {
@ -21,9 +20,6 @@ func NewEnnoblement(db *bun.DB) *Ennoblement {
}
func (e *Ennoblement) Create(ctx context.Context, params ...domain.CreateEnnoblementParams) error {
ctx, span := tracer.Start(ctx, "Ennoblement.Create")
defer span.End()
if len(params) == 0 {
return nil
}
@ -37,8 +33,6 @@ func (e *Ennoblement) Create(ctx context.Context, params ...domain.CreateEnnoble
Returning("NULL").
Ignore().
Exec(ctx); err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
return fmt.Errorf("something went wrong while inserting ennoblements into the db: %w", err)
}
@ -49,8 +43,6 @@ func (e *Ennoblement) List(
ctx context.Context,
params domain.ListEnnoblementsParams,
) ([]domain.EnnoblementWithRelations, int64, error) {
ctx, span := tracer.Start(ctx, "Ennoblement.List")
defer span.End()
var ennoblements []model.Ennoblement
var count int
@ -65,8 +57,6 @@ func (e *Ennoblement) List(
Apply(paramsApplier.applyPagination)
base, err = paramsApplier.applySort(base)
if err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
return nil, 0, fmt.Errorf("listEnnoblementsParamsApplier.applySort: %w", err)
}
@ -82,8 +72,6 @@ func (e *Ennoblement) List(
err = q.Scan(ctx)
}
if err != nil && !errors.Is(err, sql.ErrNoRows) {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
return nil, 0, fmt.Errorf("couldn't select ennoblements from the db: %w", err)
}

View File

@ -8,8 +8,6 @@ import (
"time"
"gitea.dwysokinski.me/twhelp/core/internal/bundb/internal/model"
"go.opentelemetry.io/otel/codes"
"gitea.dwysokinski.me/twhelp/core/internal/domain"
"github.com/uptrace/bun"
)
@ -23,9 +21,6 @@ func NewPlayer(db *bun.DB) *Player {
}
func (p *Player) CreateOrUpdate(ctx context.Context, params ...domain.CreatePlayerParams) error {
ctx, span := tracer.Start(ctx, "Player.CreateOrUpdate")
defer span.End()
if len(params) == 0 {
return nil
}
@ -54,8 +49,6 @@ func (p *Player) CreateOrUpdate(ctx context.Context, params ...domain.CreatePlay
Apply(appendODSetClauses).
Returning("NULL").
Exec(ctx); err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
return fmt.Errorf("something went wrong while inserting players into the db: %w", err)
}
@ -63,9 +56,6 @@ func (p *Player) CreateOrUpdate(ctx context.Context, params ...domain.CreatePlay
}
func (p *Player) Delete(ctx context.Context, serverKey string, ids ...int64) error {
ctx, span := tracer.Start(ctx, "Player.Delete")
defer span.End()
if len(ids) == 0 {
return nil
}
@ -79,8 +69,6 @@ func (p *Player) Delete(ctx context.Context, serverKey string, ids ...int64) err
Set("tribe_id = NULL").
Returning("NULL").
Exec(ctx); err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
return fmt.Errorf("couldn't delete players: %w", err)
}
@ -88,9 +76,6 @@ func (p *Player) Delete(ctx context.Context, serverKey string, ids ...int64) err
}
func (p *Player) List(ctx context.Context, params domain.ListPlayersParams) ([]domain.PlayerWithRelations, int64, error) {
ctx, span := tracer.Start(ctx, "Player.List")
defer span.End()
var players []model.Player
var count int
var err error
@ -104,8 +89,6 @@ func (p *Player) List(ctx context.Context, params domain.ListPlayersParams) ([]d
Apply(paramsApplier.applyPagination)
base, err = paramsApplier.applySort(base)
if err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
return nil, 0, fmt.Errorf("listPlayersParamsApplier.applySort: %w", err)
}
@ -121,8 +104,6 @@ func (p *Player) List(ctx context.Context, params domain.ListPlayersParams) ([]d
err = q.Scan(ctx)
}
if err != nil && !errors.Is(err, sql.ErrNoRows) {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
return nil, 0, fmt.Errorf("couldn't select players from the db: %w", err)
}

View File

@ -7,7 +7,6 @@ import (
"gitea.dwysokinski.me/twhelp/core/internal/bundb/internal/model"
"gitea.dwysokinski.me/twhelp/core/internal/domain"
"github.com/uptrace/bun"
"go.opentelemetry.io/otel/codes"
)
type PlayerSnapshot struct {
@ -19,9 +18,6 @@ func NewPlayerSnapshot(db *bun.DB) *PlayerSnapshot {
}
func (p *PlayerSnapshot) Create(ctx context.Context, params ...domain.CreatePlayerSnapshotParams) error {
ctx, span := tracer.Start(ctx, "PlayerSnapshot.Create")
defer span.End()
if len(params) == 0 {
return nil
}
@ -35,8 +31,6 @@ func (p *PlayerSnapshot) Create(ctx context.Context, params ...domain.CreatePlay
Model(&snapshots).
Returning("NULL").
Exec(ctx); err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
return fmt.Errorf("something went wrong while inserting player snapshots into the db: %w", err)
}

View File

@ -8,10 +8,6 @@ import (
"time"
"gitea.dwysokinski.me/twhelp/core/internal/bundb/internal/model"
"go.opentelemetry.io/otel/attribute"
"go.opentelemetry.io/otel/codes"
"go.opentelemetry.io/otel/trace"
"gitea.dwysokinski.me/twhelp/core/internal/domain"
"github.com/uptrace/bun"
)
@ -25,9 +21,6 @@ func NewServer(db *bun.DB) *Server {
}
func (s *Server) CreateOrUpdate(ctx context.Context, params ...domain.CreateServerParams) ([]domain.Server, error) {
ctx, span := tracer.Start(ctx, "Server.CreateOrUpdate")
defer span.End()
if len(params) == 0 {
return nil, nil
}
@ -51,8 +44,6 @@ func (s *Server) CreateOrUpdate(ctx context.Context, params ...domain.CreateServ
Set("open = EXCLUDED.open").
Returning("*").
Exec(ctx); err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
return nil, fmt.Errorf("something went wrong while inserting servers into the db: %w", err)
}
@ -65,9 +56,6 @@ func (s *Server) CreateOrUpdate(ctx context.Context, params ...domain.CreateServ
}
func (s *Server) List(ctx context.Context, params domain.ListServersParams) ([]domain.Server, int64, error) {
ctx, span := tracer.Start(ctx, "Server.List")
defer span.End()
var servers []model.Server
var count int
var err error
@ -82,8 +70,6 @@ func (s *Server) List(ctx context.Context, params domain.ListServersParams) ([]d
err = q.Scan(ctx)
}
if err != nil && !errors.Is(err, sql.ErrNoRows) {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
return nil, 0, fmt.Errorf("couldn't select servers from the db: %w", err)
}
@ -96,14 +82,7 @@ func (s *Server) List(ctx context.Context, params domain.ListServersParams) ([]d
}
func (s *Server) Update(ctx context.Context, key string, params domain.UpdateServerParams) (domain.Server, error) {
ctx, span := tracer.Start(ctx, "Server.Update", trace.WithAttributes(
attribute.String("server.key", key),
))
defer span.End()
if params.IsZero() {
span.RecordError(domain.ErrNothingToUpdate)
span.SetStatus(codes.Error, domain.ErrNothingToUpdate.Error())
return domain.Server{}, domain.ErrNothingToUpdate
}
@ -116,8 +95,6 @@ func (s *Server) Update(ctx context.Context, key string, params domain.UpdateSer
Returning("*").
Exec(ctx)
if err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
return domain.Server{}, fmt.Errorf("couldn't update server (key=%s): %w", key, err)
}
if affected, _ := res.RowsAffected(); affected == 0 {

View File

@ -8,10 +8,6 @@ import (
"time"
"gitea.dwysokinski.me/twhelp/core/internal/bundb/internal/model"
"go.opentelemetry.io/otel/attribute"
"go.opentelemetry.io/otel/codes"
"go.opentelemetry.io/otel/trace"
"gitea.dwysokinski.me/twhelp/core/internal/domain"
"github.com/uptrace/bun"
)
@ -25,9 +21,6 @@ func NewTribe(db *bun.DB) *Tribe {
}
func (t *Tribe) CreateOrUpdate(ctx context.Context, params ...domain.CreateTribeParams) error {
ctx, span := tracer.Start(ctx, "Tribe.CreateOrUpdate")
defer span.End()
if len(params) == 0 {
return nil
}
@ -57,8 +50,6 @@ func (t *Tribe) CreateOrUpdate(ctx context.Context, params ...domain.CreateTribe
Apply(appendODSetClauses).
Returning("NULL").
Exec(ctx); err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
return fmt.Errorf("something went wrong while inserting tribes into the db: %w", err)
}
@ -66,9 +57,6 @@ func (t *Tribe) CreateOrUpdate(ctx context.Context, params ...domain.CreateTribe
}
func (t *Tribe) Delete(ctx context.Context, serverKey string, ids ...int64) error {
ctx, span := tracer.Start(ctx, "Tribe.Delete")
defer span.End()
if len(ids) == 0 {
return nil
}
@ -81,8 +69,6 @@ func (t *Tribe) Delete(ctx context.Context, serverKey string, ids ...int64) erro
Set("deleted_at = ?", time.Now()).
Returning("NULL").
Exec(ctx); err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
return fmt.Errorf("couldn't delete tribes: %w", err)
}
@ -90,12 +76,6 @@ func (t *Tribe) Delete(ctx context.Context, serverKey string, ids ...int64) erro
}
func (t *Tribe) UpdateDominance(ctx context.Context, serverKey string, numPlayerVillages int64) error {
ctx, span := tracer.Start(ctx, "Tribe.UpdateDominance", trace.WithAttributes(
attribute.String("server.key", serverKey),
attribute.Int64("server.num_player_villages", numPlayerVillages),
))
defer span.End()
q := t.db.NewUpdate().
Model(&model.Tribe{}).
Returning("NULL").
@ -107,8 +87,6 @@ func (t *Tribe) UpdateDominance(ctx context.Context, serverKey string, numPlayer
q = q.Set("dominance = 0")
}
if _, err := q.Exec(ctx); err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
return fmt.Errorf("couldn't update dominance (server=%s): %w", serverKey, err)
}
@ -116,9 +94,6 @@ func (t *Tribe) UpdateDominance(ctx context.Context, serverKey string, numPlayer
}
func (t *Tribe) List(ctx context.Context, params domain.ListTribesParams) ([]domain.Tribe, int64, error) {
ctx, span := tracer.Start(ctx, "Tribe.List")
defer span.End()
var tribes []model.Tribe
var count int
var err error
@ -129,8 +104,6 @@ func (t *Tribe) List(ctx context.Context, params domain.ListTribesParams) ([]dom
q, err = listTribesParamsApplier{params}.apply(q)
if err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
return nil, 0, fmt.Errorf("listTribesParamsApplier.apply: %w", err)
}
@ -140,8 +113,6 @@ func (t *Tribe) List(ctx context.Context, params domain.ListTribesParams) ([]dom
err = q.Scan(ctx)
}
if err != nil && !errors.Is(err, sql.ErrNoRows) {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
return nil, 0, fmt.Errorf("couldn't select tribes from the db: %w", err)
}

View File

@ -7,7 +7,6 @@ import (
"gitea.dwysokinski.me/twhelp/core/internal/bundb/internal/model"
"gitea.dwysokinski.me/twhelp/core/internal/domain"
"github.com/uptrace/bun"
"go.opentelemetry.io/otel/codes"
)
type TribeChange struct {
@ -19,9 +18,6 @@ func NewTribeChange(db *bun.DB) *TribeChange {
}
func (t *TribeChange) Create(ctx context.Context, params ...domain.CreateTribeChangeParams) error {
ctx, span := tracer.Start(ctx, "TribeChange.Create")
defer span.End()
if len(params) == 0 {
return nil
}
@ -35,8 +31,6 @@ func (t *TribeChange) Create(ctx context.Context, params ...domain.CreateTribeCh
Model(&tcs).
Returning("NULL").
Exec(ctx); err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
return fmt.Errorf("something went wrong while inserting tribe changes into the db: %w", err)
}

View File

@ -7,7 +7,6 @@ import (
"gitea.dwysokinski.me/twhelp/core/internal/bundb/internal/model"
"gitea.dwysokinski.me/twhelp/core/internal/domain"
"github.com/uptrace/bun"
"go.opentelemetry.io/otel/codes"
)
type TribeSnapshot struct {
@ -19,9 +18,6 @@ func NewTribeSnapshot(db *bun.DB) *TribeSnapshot {
}
func (t *TribeSnapshot) Create(ctx context.Context, params ...domain.CreateTribeSnapshotParams) error {
ctx, span := tracer.Start(ctx, "TribeSnapshot.Create")
defer span.End()
if len(params) == 0 {
return nil
}
@ -35,8 +31,6 @@ func (t *TribeSnapshot) Create(ctx context.Context, params ...domain.CreateTribe
Model(&snapshots).
Returning("NULL").
Exec(ctx); err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
return fmt.Errorf("something went wrong while inserting tribe snapshots into the db: %w", err)
}

View File

@ -8,10 +8,6 @@ import (
"gitea.dwysokinski.me/twhelp/core/internal/bundb/internal/model"
"gitea.dwysokinski.me/twhelp/core/internal/domain"
"go.opentelemetry.io/otel/attribute"
"go.opentelemetry.io/otel/codes"
"go.opentelemetry.io/otel/trace"
"github.com/uptrace/bun"
)
@ -24,9 +20,6 @@ func NewVersion(db *bun.DB) *Version {
}
func (v *Version) List(ctx context.Context, params domain.ListVersionsParams) ([]domain.Version, int64, error) {
ctx, span := tracer.Start(ctx, "Version.List")
defer span.End()
var versions []model.Version
var count int
var err error
@ -40,8 +33,6 @@ func (v *Version) List(ctx context.Context, params domain.ListVersionsParams) ([
err = q.Scan(ctx)
}
if err != nil && !errors.Is(err, sql.ErrNoRows) {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
return nil, 0, fmt.Errorf("couldn't select versions from the db: %w", err)
}
@ -54,19 +45,12 @@ func (v *Version) List(ctx context.Context, params domain.ListVersionsParams) ([
}
func (v *Version) GetByCode(ctx context.Context, code string) (domain.Version, error) {
ctx, span := tracer.Start(ctx, "Version.GetByCode", trace.WithAttributes(
attribute.String("version.code", code),
))
defer span.End()
var version model.Version
if err := v.db.NewSelect().
Model(&version).
Where("code = ?", code).
Scan(ctx); err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
if errors.Is(err, sql.ErrNoRows) {
return domain.Version{}, domain.VersionNotFoundError{VerCode: code}
}

View File

@ -7,8 +7,6 @@ import (
"fmt"
"gitea.dwysokinski.me/twhelp/core/internal/bundb/internal/model"
"go.opentelemetry.io/otel/codes"
"gitea.dwysokinski.me/twhelp/core/internal/domain"
"github.com/uptrace/bun"
)
@ -22,9 +20,6 @@ func NewVillage(db *bun.DB) *Village {
}
func (v *Village) CreateOrUpdate(ctx context.Context, params ...domain.CreateVillageParams) error {
ctx, span := tracer.Start(ctx, "Village.CreateOrUpdate")
defer span.End()
if len(params) == 0 {
return nil
}
@ -46,8 +41,6 @@ func (v *Village) CreateOrUpdate(ctx context.Context, params ...domain.CreateVil
Set("profile_url = EXCLUDED.profile_url").
Returning("NULL").
Exec(ctx); err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
return fmt.Errorf("something went wrong while inserting villages into the db: %w", err)
}
@ -55,9 +48,6 @@ func (v *Village) CreateOrUpdate(ctx context.Context, params ...domain.CreateVil
}
func (v *Village) List(ctx context.Context, params domain.ListVillagesParams) ([]domain.VillageWithRelations, int64, error) {
ctx, span := tracer.Start(ctx, "Village.List")
defer span.End()
var villages []model.Village
var count int
var err error
@ -82,8 +72,6 @@ func (v *Village) List(ctx context.Context, params domain.ListVillagesParams) ([
err = q.Scan(ctx)
}
if err != nil && !errors.Is(err, sql.ErrNoRows) {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
return nil, 0, fmt.Errorf("couldn't select villages from the db: %w", err)
}

View File

@ -4,10 +4,8 @@ import (
"context"
"fmt"
"github.com/ThreeDotsLabs/watermill"
"go.opentelemetry.io/otel/codes"
"gitea.dwysokinski.me/twhelp/core/internal/msg/internal/model"
"github.com/ThreeDotsLabs/watermill"
"github.com/ThreeDotsLabs/watermill/message"
)
@ -51,24 +49,15 @@ func (e *EnnoblementConsumer) Register(router *message.Router) {
}
func (e *EnnoblementConsumer) refresh(msg *message.Message) error {
ctx, span := tracer.Start(msg.Context(), "EnnoblementConsumer.refresh")
defer span.End()
var payload model.RefreshEnnoblementsCmdPayload
if err := e.marshaler.Unmarshal(msg, &payload); err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
e.logger.Error("invalid payload, dropping message", err, watermill.LogFields{
"handler_name": message.HandlerNameFromCtx(ctx),
"handler_name": message.HandlerNameFromCtx(msg.Context()),
})
return nil
}
span.SetAttributes(payload.OTELAttributes()...)
if err := e.svc.Refresh(ctx, payload.Key, payload.URL); err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
if err := e.svc.Refresh(msg.Context(), payload.Key, payload.URL); err != nil {
return fmt.Errorf("EnnoblementService.Refresh: %w", err)
}

View File

@ -5,10 +5,8 @@ import (
"fmt"
"time"
"github.com/ThreeDotsLabs/watermill"
"go.opentelemetry.io/otel/codes"
"gitea.dwysokinski.me/twhelp/core/internal/msg/internal/model"
"github.com/ThreeDotsLabs/watermill"
"github.com/ThreeDotsLabs/watermill/message"
)
@ -71,34 +69,26 @@ func (p *PlayerConsumer) Register(router *message.Router) {
}
func (p *PlayerConsumer) refresh(msg *message.Message) ([]*message.Message, error) {
ctx, span := tracer.Start(msg.Context(), "PlayerConsumer.refresh")
defer span.End()
var payload model.ServerRefreshedEvPayload
if err := p.marshaler.Unmarshal(msg, &payload); err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
p.logger.Error("invalid payload, dropping message", err, watermill.LogFields{
"handler_name": message.HandlerNameFromCtx(ctx),
"handler_name": message.HandlerNameFromCtx(msg.Context()),
})
return nil, nil
}
span.SetAttributes(payload.OTELAttributes()...)
if !payload.Open {
p.logger.Debug("server is closed, dropping message", watermill.LogFields{
"handler_name": message.HandlerNameFromCtx(ctx),
"handler_name": message.HandlerNameFromCtx(msg.Context()),
"server_key": payload.Key,
"version_code": payload.VersionCode,
})
return nil, nil
}
numPlayers, err := p.svc.Refresh(ctx, payload.Key, payload.URL)
numPlayers, err := p.svc.Refresh(msg.Context(), payload.Key, payload.URL)
if err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
return nil, fmt.Errorf("PlayerService.Refresh: %w", err)
}
@ -116,24 +106,15 @@ func (p *PlayerConsumer) refresh(msg *message.Message) ([]*message.Message, erro
}
func (p *PlayerConsumer) createSnapshots(msg *message.Message) ([]*message.Message, error) {
ctx, span := tracer.Start(msg.Context(), "PlayerConsumer.createSnapshots")
defer span.End()
var payload model.CreateSnapshotsCmdPayload
if err := p.marshaler.Unmarshal(msg, &payload); err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
p.logger.Error("invalid payload, dropping message", err, watermill.LogFields{
"handler_name": message.HandlerNameFromCtx(ctx),
"handler_name": message.HandlerNameFromCtx(msg.Context()),
})
return nil, nil
}
span.SetAttributes(payload.OTELAttributes()...)
if err := p.snapshotSvc.Create(ctx, payload.Key, payload.Date); err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
if err := p.snapshotSvc.Create(msg.Context(), payload.Key, payload.Date); err != nil {
return nil, fmt.Errorf("PlayerSnapshotService.Create: %w", err)
}

View File

@ -4,10 +4,8 @@ import (
"context"
"fmt"
"github.com/ThreeDotsLabs/watermill"
"go.opentelemetry.io/otel/codes"
"gitea.dwysokinski.me/twhelp/core/internal/msg/internal/model"
"github.com/ThreeDotsLabs/watermill"
"gitea.dwysokinski.me/twhelp/core/internal/domain"
"github.com/ThreeDotsLabs/watermill/message"
@ -102,25 +100,16 @@ func (s *ServerConsumer) Register(router *message.Router) {
}
func (s *ServerConsumer) refresh(msg *message.Message) ([]*message.Message, error) {
ctx, span := tracer.Start(msg.Context(), "ServerConsumer.refresh")
defer span.End()
var payload model.RefreshServersCmdPayload
if err := s.marshaler.Unmarshal(msg, &payload); err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
s.logger.Error("invalid payload, dropping message", err, watermill.LogFields{
"handler_name": message.HandlerNameFromCtx(ctx),
"handler_name": message.HandlerNameFromCtx(msg.Context()),
})
return nil, nil
}
span.SetAttributes(payload.OTELAttributes()...)
servers, err := s.svc.Refresh(ctx, payload.Host, payload.VersionCode)
servers, err := s.svc.Refresh(msg.Context(), payload.Host, payload.VersionCode)
if err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
return nil, fmt.Errorf("ServerService.Refresh: %w", err)
}
@ -133,8 +122,6 @@ func (s *ServerConsumer) refresh(msg *message.Message) ([]*message.Message, erro
VersionCode: srv.VersionCode,
})
if err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
return nil, fmt.Errorf("marshaler.Marshal: %w", err)
}
events = append(events, ev)
@ -144,33 +131,24 @@ func (s *ServerConsumer) refresh(msg *message.Message) ([]*message.Message, erro
}
func (s *ServerConsumer) updateInfoAndConfig(msg *message.Message) error {
ctx, span := tracer.Start(msg.Context(), "ServerConsumer.updateInfoAndConfig")
defer span.End()
var payload model.ServerRefreshedEvPayload
if err := s.marshaler.Unmarshal(msg, &payload); err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
s.logger.Error("invalid payload, dropping message", err, watermill.LogFields{
"handler_name": message.HandlerNameFromCtx(ctx),
"handler_name": message.HandlerNameFromCtx(msg.Context()),
})
return nil
}
span.SetAttributes(payload.OTELAttributes()...)
if !payload.Open {
s.logger.Debug("server is closed, dropping message", watermill.LogFields{
"handler_name": message.HandlerNameFromCtx(ctx),
"handler_name": message.HandlerNameFromCtx(msg.Context()),
"server_key": payload.Key,
"version_code": payload.VersionCode,
})
return nil
}
if err := s.svc.UpdateInfoAndConfig(ctx, payload.Key, payload.URL); err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
if err := s.svc.UpdateInfoAndConfig(msg.Context(), payload.Key, payload.URL); err != nil {
return fmt.Errorf("ServerService.UpdateInfoAndConfig: %w", err)
}
@ -178,24 +156,15 @@ func (s *ServerConsumer) updateInfoAndConfig(msg *message.Message) error {
}
func (s *ServerConsumer) updateNumPlayers(msg *message.Message) error {
ctx, span := tracer.Start(msg.Context(), "ServerConsumer.updateNumPlayers")
defer span.End()
var payload model.PlayersRefreshedEvPayload
if err := s.marshaler.Unmarshal(msg, &payload); err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
s.logger.Error("invalid payload, dropping message", err, watermill.LogFields{
"handler_name": message.HandlerNameFromCtx(ctx),
"handler_name": message.HandlerNameFromCtx(msg.Context()),
})
return nil
}
span.SetAttributes(payload.OTELAttributes()...)
if err := s.svc.UpdateNumPlayers(ctx, payload.Key, payload.NumPlayers); err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
if err := s.svc.UpdateNumPlayers(msg.Context(), payload.Key, payload.NumPlayers); err != nil {
return fmt.Errorf("ServerService.UpdateNumPlayers: %w", err)
}
@ -203,22 +172,15 @@ func (s *ServerConsumer) updateNumPlayers(msg *message.Message) error {
}
func (s *ServerConsumer) updateNumTribes(msg *message.Message) error {
ctx, span := tracer.Start(msg.Context(), "ServerConsumer.updateNumTribes")
defer span.End()
var payload model.TribesRefreshedEvPayload
if err := s.marshaler.Unmarshal(msg, &payload); err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
s.logger.Error("invalid payload, dropping message", err, watermill.LogFields{
"handler_name": message.HandlerNameFromCtx(ctx),
"handler_name": message.HandlerNameFromCtx(msg.Context()),
})
return nil
}
span.SetAttributes(payload.OTELAttributes()...)
if err := s.svc.UpdateNumTribes(ctx, payload.Key, payload.NumTribes); err != nil {
if err := s.svc.UpdateNumTribes(msg.Context(), payload.Key, payload.NumTribes); err != nil {
return fmt.Errorf("ServerService.UpdateNumTribes: %w", err)
}
@ -226,24 +188,15 @@ func (s *ServerConsumer) updateNumTribes(msg *message.Message) error {
}
func (s *ServerConsumer) updateNumVillages(msg *message.Message) error {
ctx, span := tracer.Start(msg.Context(), "ServerConsumer.updateNumVillages")
defer span.End()
var payload model.VillagesRefreshedEvPayload
if err := s.marshaler.Unmarshal(msg, &payload); err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
s.logger.Error("invalid payload, dropping message", err, watermill.LogFields{
"handler_name": message.HandlerNameFromCtx(ctx),
"handler_name": message.HandlerNameFromCtx(msg.Context()),
})
return nil
}
span.SetAttributes(payload.OTELAttributes()...)
if err := s.svc.UpdateNumVillages(ctx, payload.Key, payload.NumVillages); err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
if err := s.svc.UpdateNumVillages(msg.Context(), payload.Key, payload.NumVillages); err != nil {
return fmt.Errorf("ServerService.UpdateNumVillages: %w", err)
}
@ -251,24 +204,15 @@ func (s *ServerConsumer) updateNumVillages(msg *message.Message) error {
}
func (s *ServerConsumer) updatePlayerSnapshotsCreatedAt(msg *message.Message) error {
ctx, span := tracer.Start(msg.Context(), "ServerConsumer.updatePlayerSnapshotsCreatedAt")
defer span.End()
var payload model.SnapshotsCreatedEvPayload
if err := s.marshaler.Unmarshal(msg, &payload); err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
s.logger.Error("invalid payload, dropping message", err, watermill.LogFields{
"handler_name": message.HandlerNameFromCtx(ctx),
"handler_name": message.HandlerNameFromCtx(msg.Context()),
})
return nil
}
span.SetAttributes(payload.OTELAttributes()...)
if err := s.svc.UpdatePlayerSnapshotsCreatedAt(ctx, payload.Key); err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
if err := s.svc.UpdatePlayerSnapshotsCreatedAt(msg.Context(), payload.Key); err != nil {
return fmt.Errorf("ServerService.UpdatePlayerSnapshotsCreatedAt: %w", err)
}
@ -276,24 +220,15 @@ func (s *ServerConsumer) updatePlayerSnapshotsCreatedAt(msg *message.Message) er
}
func (s *ServerConsumer) updateTribeSnapshotsCreatedAt(msg *message.Message) error {
ctx, span := tracer.Start(msg.Context(), "ServerConsumer.updateTribeSnapshotsCreatedAt")
defer span.End()
var payload model.SnapshotsCreatedEvPayload
if err := s.marshaler.Unmarshal(msg, &payload); err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
s.logger.Error("invalid payload, dropping message", err, watermill.LogFields{
"handler_name": message.HandlerNameFromCtx(ctx),
"handler_name": message.HandlerNameFromCtx(msg.Context()),
})
return nil
}
span.SetAttributes(payload.OTELAttributes()...)
if err := s.svc.UpdateTribeSnapshotsCreatedAt(ctx, payload.Key); err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
if err := s.svc.UpdateTribeSnapshotsCreatedAt(msg.Context(), payload.Key); err != nil {
return fmt.Errorf("ServerService.UpdateTribeSnapshotsCreatedAt: %w", err)
}

View File

@ -5,10 +5,8 @@ import (
"fmt"
"time"
"github.com/ThreeDotsLabs/watermill"
"go.opentelemetry.io/otel/codes"
"gitea.dwysokinski.me/twhelp/core/internal/msg/internal/model"
"github.com/ThreeDotsLabs/watermill"
"github.com/ThreeDotsLabs/watermill/message"
)
@ -79,34 +77,25 @@ func (t *TribeConsumer) Register(router *message.Router) {
}
func (t *TribeConsumer) refresh(msg *message.Message) ([]*message.Message, error) {
ctx, span := tracer.Start(msg.Context(), "TribeConsumer.refresh")
defer span.End()
var payload model.ServerRefreshedEvPayload
if err := t.marshaler.Unmarshal(msg, &payload); err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
t.logger.Error("invalid payload, dropping message", err, watermill.LogFields{
"handler_name": message.HandlerNameFromCtx(ctx),
"handler_name": message.HandlerNameFromCtx(msg.Context()),
})
return nil, nil
}
span.SetAttributes(payload.OTELAttributes()...)
if !payload.Open {
t.logger.Debug("server is closed, dropping message", watermill.LogFields{
"handler_name": message.HandlerNameFromCtx(ctx),
"handler_name": message.HandlerNameFromCtx(msg.Context()),
"server_key": payload.Key,
"version_code": payload.VersionCode,
})
return nil, nil
}
numTribes, err := t.svc.Refresh(ctx, payload.Key, payload.URL)
numTribes, err := t.svc.Refresh(msg.Context(), payload.Key, payload.URL)
if err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
return nil, fmt.Errorf("TribeService.Refresh: %w", err)
}
@ -117,8 +106,6 @@ func (t *TribeConsumer) refresh(msg *message.Message) ([]*message.Message, error
NumTribes: numTribes,
})
if err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
return nil, fmt.Errorf("marshaler.Marshal: %w", err)
}
@ -126,24 +113,15 @@ func (t *TribeConsumer) refresh(msg *message.Message) ([]*message.Message, error
}
func (t *TribeConsumer) updateDominance(msg *message.Message) error {
ctx, span := tracer.Start(msg.Context(), "TribeConsumer.updateDominance")
defer span.End()
var payload model.VillagesRefreshedEvPayload
if err := t.marshaler.Unmarshal(msg, &payload); err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
t.logger.Error("invalid payload, dropping message", err, watermill.LogFields{
"handler_name": message.HandlerNameFromCtx(ctx),
"handler_name": message.HandlerNameFromCtx(msg.Context()),
})
return nil
}
span.SetAttributes(payload.OTELAttributes()...)
if err := t.svc.UpdateDominance(ctx, payload.Key, payload.NumPlayerVillages); err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
if err := t.svc.UpdateDominance(msg.Context(), payload.Key, payload.NumPlayerVillages); err != nil {
return fmt.Errorf("TribeService.UpdateDominance: %w", err)
}
@ -151,24 +129,15 @@ func (t *TribeConsumer) updateDominance(msg *message.Message) error {
}
func (t *TribeConsumer) createSnapshots(msg *message.Message) ([]*message.Message, error) {
ctx, span := tracer.Start(msg.Context(), "TribeConsumer.createSnapshots")
defer span.End()
var payload model.CreateSnapshotsCmdPayload
if err := t.marshaler.Unmarshal(msg, &payload); err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
t.logger.Error("invalid payload, dropping message", err, watermill.LogFields{
"handler_name": message.HandlerNameFromCtx(ctx),
"handler_name": message.HandlerNameFromCtx(msg.Context()),
})
return nil, nil
}
span.SetAttributes(payload.OTELAttributes()...)
if err := t.snapshotSvc.Create(ctx, payload.Key, payload.Date); err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
if err := t.snapshotSvc.Create(msg.Context(), payload.Key, payload.Date); err != nil {
return nil, fmt.Errorf("TribeSnapshotService.Create: %w", err)
}

View File

@ -4,10 +4,8 @@ import (
"context"
"fmt"
"github.com/ThreeDotsLabs/watermill"
"go.opentelemetry.io/otel/codes"
"gitea.dwysokinski.me/twhelp/core/internal/msg/internal/model"
"github.com/ThreeDotsLabs/watermill"
"gitea.dwysokinski.me/twhelp/core/internal/domain"
@ -55,34 +53,25 @@ func (v *VillageConsumer) Register(router *message.Router) {
}
func (v *VillageConsumer) refresh(msg *message.Message) ([]*message.Message, error) {
ctx, span := tracer.Start(msg.Context(), "VillageConsumer.refresh")
defer span.End()
var payload model.ServerRefreshedEvPayload
if err := v.marshaler.Unmarshal(msg, &payload); err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
v.logger.Error("invalid payload, dropping message", err, watermill.LogFields{
"handler_name": message.HandlerNameFromCtx(ctx),
"handler_name": message.HandlerNameFromCtx(msg.Context()),
})
return nil, nil
}
span.SetAttributes(payload.OTELAttributes()...)
if !payload.Open {
v.logger.Debug("server is closed, dropping message", watermill.LogFields{
"handler_name": message.HandlerNameFromCtx(ctx),
"handler_name": message.HandlerNameFromCtx(msg.Context()),
"server_key": payload.Key,
"version_code": payload.VersionCode,
})
return nil, nil
}
res, err := v.svc.Refresh(ctx, payload.Key, payload.URL)
res, err := v.svc.Refresh(msg.Context(), payload.Key, payload.URL)
if err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
return nil, fmt.Errorf("VillageService.Refresh: %w", err)
}
@ -96,8 +85,6 @@ func (v *VillageConsumer) refresh(msg *message.Message) ([]*message.Message, err
NumBonusVillages: res.NumBonusVillages,
})
if err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
return nil, fmt.Errorf("marshaler.Marshal: %w", err)
}

View File

@ -1,17 +1,7 @@
package model
import "go.opentelemetry.io/otel/attribute"
type RefreshEnnoblementsCmdPayload struct {
Key string
URL string
VersionCode string
}
func (p RefreshEnnoblementsCmdPayload) OTELAttributes() []attribute.KeyValue {
return []attribute.KeyValue{
attribute.String("payload.server.key", p.Key),
attribute.String("payload.server.url", p.URL),
attribute.String("payload.version.code", p.VersionCode),
}
}

View File

@ -1,19 +1,8 @@
package model
import "go.opentelemetry.io/otel/attribute"
type PlayersRefreshedEvPayload struct {
Key string
URL string
VersionCode string
NumPlayers int64
}
func (p PlayersRefreshedEvPayload) OTELAttributes() []attribute.KeyValue {
return []attribute.KeyValue{
attribute.String("payload.server.key", p.Key),
attribute.String("payload.server.url", p.URL),
attribute.String("payload.version.code", p.VersionCode),
attribute.Int64("payload.server.num_players", p.NumPlayers),
}
}

View File

@ -1,31 +1,13 @@
package model
import "go.opentelemetry.io/otel/attribute"
type RefreshServersCmdPayload struct {
Host string
VersionCode string
}
func (p RefreshServersCmdPayload) OTELAttributes() []attribute.KeyValue {
return []attribute.KeyValue{
attribute.String("payload.version.host", p.Host),
attribute.String("payload.version.code", p.VersionCode),
}
}
type ServerRefreshedEvPayload struct {
Key string
URL string
Open bool
VersionCode string
}
func (p ServerRefreshedEvPayload) OTELAttributes() []attribute.KeyValue {
return []attribute.KeyValue{
attribute.String("payload.server.key", p.Key),
attribute.String("payload.server.url", p.URL),
attribute.Bool("payload.server.open", p.Open),
attribute.String("payload.version.code", p.VersionCode),
}
}

View File

@ -2,8 +2,6 @@ package model
import (
"time"
"go.opentelemetry.io/otel/attribute"
)
type CreateSnapshotsCmdPayload struct {
@ -12,21 +10,7 @@ type CreateSnapshotsCmdPayload struct {
Date time.Time
}
func (p CreateSnapshotsCmdPayload) OTELAttributes() []attribute.KeyValue {
return []attribute.KeyValue{
attribute.String("payload.server.key", p.Key),
attribute.String("payload.version.code", p.VersionCode),
}
}
type SnapshotsCreatedEvPayload struct {
Key string
VersionCode string
}
func (p SnapshotsCreatedEvPayload) OTELAttributes() []attribute.KeyValue {
return []attribute.KeyValue{
attribute.String("payload.server.key", p.Key),
attribute.String("payload.version.code", p.VersionCode),
}
}

View File

@ -1,19 +1,8 @@
package model
import "go.opentelemetry.io/otel/attribute"
type TribesRefreshedEvPayload struct {
Key string
URL string
VersionCode string
NumTribes int64
}
func (p TribesRefreshedEvPayload) OTELAttributes() []attribute.KeyValue {
return []attribute.KeyValue{
attribute.String("payload.server.key", p.Key),
attribute.String("payload.server.url", p.URL),
attribute.String("payload.version.code", p.VersionCode),
attribute.Int64("payload.server.num_tribes", p.NumTribes),
}
}

View File

@ -1,7 +1,5 @@
package model
import "go.opentelemetry.io/otel/attribute"
type VillagesRefreshedEvPayload struct {
Key string
URL string
@ -11,15 +9,3 @@ type VillagesRefreshedEvPayload struct {
NumBarbarianVillages int64
NumBonusVillages int64
}
func (p VillagesRefreshedEvPayload) OTELAttributes() []attribute.KeyValue {
return []attribute.KeyValue{
attribute.String("payload.server.key", p.Key),
attribute.String("payload.server.url", p.URL),
attribute.String("payload.version.code", p.VersionCode),
attribute.Int64("payload.server.num_villages", p.NumVillages),
attribute.Int64("payload.server.num_player_villages", p.NumPlayerVillages),
attribute.Int64("payload.server.num_barbarian_villages", p.NumBarbarianVillages),
attribute.Int64("payload.server.num_bonus_villages", p.NumBonusVillages),
}
}

View File

@ -1,7 +1,5 @@
package msg
import "go.opentelemetry.io/otel"
//go:generate counterfeiter -generate
const (
@ -16,7 +14,3 @@ const (
villagesEventRefreshed = "villages.event.refreshed"
ennoblementsCmdRefresh = "ennoblements.cmd.refresh"
)
var (
tracer = otel.Tracer("gitea.dwysokinski.me/twhelp/core/internal/msg")
)

View File

@ -1,60 +0,0 @@
package msgotel
import (
"go.opentelemetry.io/otel"
"go.opentelemetry.io/otel/attribute"
"go.opentelemetry.io/otel/propagation"
"go.opentelemetry.io/otel/trace"
)
// config represents the configuration options available for subscriber
// middlewares and publisher decorators.
type config struct {
tracer trace.Tracer
spanAttributes []attribute.KeyValue
propagators propagation.TextMapPropagator
}
// Option provides a convenience wrapper for simple options that can be
// represented as functions.
type Option func(*config)
func newConfig(opts ...Option) config {
cfg := config{
tracer: newTracer(otel.GetTracerProvider()),
propagators: otel.GetTextMapPropagator(),
}
for _, opt := range opts {
opt(&cfg)
}
return cfg
}
// WithSpanAttributes includes the given attributes to the generated Spans.
func WithSpanAttributes(attributes ...attribute.KeyValue) Option {
return func(c *config) {
c.spanAttributes = attributes
}
}
// WithTracerProvider specifies a tracer provider to use for creating a tracer.
// If this option isn't specified, then the global TracerProvider is used.
func WithTracerProvider(provider trace.TracerProvider) Option {
return func(c *config) {
if provider != nil {
c.tracer = newTracer(provider)
}
}
}
// WithPropagators configures specific propagators.
// If this option isn't specified, then the global TextMapPropagator is used.
func WithPropagators(p propagation.TextMapPropagator) Option {
return func(c *config) {
if p != nil {
c.propagators = p
}
}
}

View File

@ -1,70 +0,0 @@
package msgotel
import (
"github.com/ThreeDotsLabs/watermill/message"
"go.opentelemetry.io/otel/codes"
"go.opentelemetry.io/otel/propagation"
semconv "go.opentelemetry.io/otel/semconv/v1.12.0"
"go.opentelemetry.io/otel/trace"
)
// Middleware defines a middleware that will add tracing.
func Middleware(options ...Option) message.HandlerMiddleware {
return func(h message.HandlerFunc) message.HandlerFunc {
return HandlerDecorator(h, options...)
}
}
// HandlerDecorator decorates a watermill HandlerFunc to add tracing when a message is received.
func HandlerDecorator(h message.HandlerFunc, options ...Option) message.HandlerFunc {
cfg := newConfig(options...)
spanStartOpts := []trace.SpanStartOption{
trace.WithSpanKind(trace.SpanKindConsumer),
trace.WithAttributes(cfg.spanAttributes...),
}
return func(msg *message.Message) ([]*message.Message, error) {
topic := message.SubscribeTopicFromCtx(msg.Context())
handlerName := message.HandlerNameFromCtx(msg.Context())
ctx, span := cfg.tracer.Start(
cfg.propagators.Extract(msg.Context(), propagation.MapCarrier(msg.Metadata)),
handlerName+" - "+topic+" process",
spanStartOpts...,
)
defer span.End()
span.SetAttributes(
semconv.MessagingDestinationKindTopic,
semconv.MessagingDestinationKey.String(topic),
semconv.MessagingOperationReceive,
)
msg.SetContext(ctx)
msgs, err := h(msg)
if err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
}
for _, m := range msgs {
m.SetContext(trace.ContextWithSpan(m.Context(), span))
}
return msgs, err
}
}
// NoPublishHandlerDecorator decorates a watermill NoPublishHandlerFunc to add tracing when a message is received.
func NoPublishHandlerDecorator(h message.NoPublishHandlerFunc, options ...Option) message.NoPublishHandlerFunc {
decoratedHandler := HandlerDecorator(func(msg *message.Message) ([]*message.Message, error) {
return nil, h(msg)
}, options...)
return func(msg *message.Message) error {
_, err := decoratedHandler(msg)
return err
}
}

View File

@ -1,122 +0,0 @@
package msgotel_test
import (
"context"
"sync/atomic"
"testing"
"time"
"go.opentelemetry.io/otel/trace"
"github.com/stretchr/testify/assert"
"github.com/ThreeDotsLabs/watermill/message"
"github.com/stretchr/testify/require"
"gitea.dwysokinski.me/twhelp/core/internal/msg/msgotel"
"github.com/ThreeDotsLabs/watermill"
"github.com/ThreeDotsLabs/watermill/pubsub/gochannel"
"go.opentelemetry.io/otel/propagation"
sdktrace "go.opentelemetry.io/otel/sdk/trace"
"go.opentelemetry.io/otel/sdk/trace/tracetest"
)
func TestMiddleware(t *testing.T) {
t.Parallel()
pubSub := gochannel.NewGoChannel(gochannel.Config{Persistent: true}, watermill.NopLogger{})
t.Cleanup(func() {
_ = pubSub.Close()
})
sr := tracetest.NewSpanRecorder()
provider := sdktrace.NewTracerProvider(sdktrace.WithSpanProcessor(sr))
propagators := propagation.NewCompositeTextMapPropagator(propagation.TraceContext{}, propagation.Baggage{})
msgotelOpts := []msgotel.Option{msgotel.WithTracerProvider(provider), msgotel.WithPropagators(propagators)}
decoratedPublisher := msgotel.NewPublisherDecorator(pubSub, msgotelOpts...)
t.Cleanup(func() {
_ = decoratedPublisher.Close()
})
router, err := message.NewRouter(message.RouterConfig{}, watermill.NopLogger{})
require.NoError(t, err)
t.Cleanup(func() {
_ = router.Close()
})
router.AddPublisherDecorators(func(pub message.Publisher) (message.Publisher, error) {
return msgotel.NewPublisherDecorator(pub, msgotelOpts...), nil
})
waitCh := make(chan struct{})
router.AddMiddleware(func(h message.HandlerFunc) message.HandlerFunc {
var counter int32
return func(msg *message.Message) ([]*message.Message, error) {
if message.HandlerNameFromCtx(msg.Context()) == "TestHandler2" && atomic.AddInt32(&counter, 1) == 2 {
defer func() {
close(waitCh)
}()
}
return h(msg)
}
}, msgotel.Middleware(msgotelOpts...))
router.AddHandler(
"TestHandler1",
"test_subscribe",
pubSub,
"test_publish",
pubSub,
func(msg *message.Message) ([]*message.Message, error) {
return []*message.Message{
message.NewMessage(watermill.NewUUID(), message.Payload("test")),
message.NewMessage(watermill.NewUUID(), message.Payload("test")),
}, nil
},
)
router.AddNoPublisherHandler(
"TestHandler2",
"test_publish",
pubSub,
func(msg *message.Message) error {
return nil
},
)
go func() {
require.NoError(t, router.Run(context.Background()))
}()
<-router.Running()
assert.NoError(t, decoratedPublisher.Publish(
"test_subscribe",
message.NewMessage(watermill.NewUUID(), message.Payload("test")),
))
select {
case <-waitCh:
case <-time.After(time.Second):
t.Fatal("timeout")
}
spans := sr.Ended()
require.Len(t, spans, 6)
assert.Equal(t, "gochannel.GoChannel - test_subscribe send", spans[0].Name())
assert.Equal(t, trace.SpanKindProducer, spans[0].SpanKind())
assert.Equal(t, "TestHandler1 - test_subscribe process", spans[1].Name())
assert.Equal(t, trace.SpanKindConsumer, spans[1].SpanKind())
assert.Equal(t, spans[0].SpanContext().TraceID(), spans[1].SpanContext().TraceID())
assert.Equal(t, "gochannel.GoChannel - test_publish send", spans[2].Name())
assert.Equal(t, trace.SpanKindProducer, spans[2].SpanKind())
assert.Equal(t, spans[0].SpanContext().TraceID(), spans[2].SpanContext().TraceID())
assert.Equal(t, "gochannel.GoChannel - test_publish send", spans[3].Name())
assert.Equal(t, trace.SpanKindProducer, spans[3].SpanKind())
assert.Equal(t, spans[0].SpanContext().TraceID(), spans[3].SpanContext().TraceID())
assert.Equal(t, "TestHandler2 - test_publish process", spans[4].Name())
assert.Equal(t, trace.SpanKindConsumer, spans[4].SpanKind())
assert.Equal(t, spans[0].SpanContext().TraceID(), spans[4].SpanContext().TraceID())
assert.Equal(t, "TestHandler2 - test_publish process", spans[5].Name())
assert.Equal(t, trace.SpanKindConsumer, spans[5].SpanKind())
assert.Equal(t, spans[0].SpanContext().TraceID(), spans[5].SpanContext().TraceID())
}

View File

@ -1,11 +0,0 @@
package msgotel
import (
"go.opentelemetry.io/otel/trace"
)
const instrumentationName = "gitea.dwysokinski.me/twhelp/core/internal/msg/msgotel"
func newTracer(provider trace.TracerProvider) trace.Tracer {
return provider.Tracer(instrumentationName)
}

View File

@ -1,95 +0,0 @@
package msgotel
import (
"fmt"
"strings"
"go.opentelemetry.io/otel/codes"
"go.opentelemetry.io/otel/propagation"
"github.com/ThreeDotsLabs/watermill/message"
"go.opentelemetry.io/otel/attribute"
semconv "go.opentelemetry.io/otel/semconv/v1.12.0"
"go.opentelemetry.io/otel/trace"
)
// PublisherDecorator decorates a standard watermill publisher to add tracing capabilities.
type PublisherDecorator struct {
pub message.Publisher
publisherName string
spanAttributes []attribute.KeyValue
tracer trace.Tracer
propagators propagation.TextMapPropagator
}
// NewPublisherDecorator instantiates a PublisherDecorator with a default name.
func NewPublisherDecorator(pub message.Publisher, options ...Option) *PublisherDecorator {
return NewNamedPublisherDecorator(structName(pub), pub, options...)
}
// NewNamedPublisherDecorator instantiates a PublisherDecorator with a provided name.
func NewNamedPublisherDecorator(name string, pub message.Publisher, opts ...Option) *PublisherDecorator {
cfg := newConfig(opts...)
return &PublisherDecorator{
pub: pub,
publisherName: name,
spanAttributes: cfg.spanAttributes,
tracer: cfg.tracer,
propagators: cfg.propagators,
}
}
// Publish implements the watermill Publisher interface and creates traces.
// Publishing of messages is delegated to the decorated Publisher.
func (p *PublisherDecorator) Publish(topic string, messages ...*message.Message) error {
if len(messages) == 0 {
return nil
}
publisherName := message.PublisherNameFromCtx(messages[0].Context())
if publisherName == "" {
publisherName = p.publisherName
}
_, span := p.tracer.Start(
messages[0].Context(),
publisherName+" - "+topic+" send",
trace.WithSpanKind(trace.SpanKindProducer),
trace.WithAttributes(p.spanAttributes...),
)
defer span.End()
span.SetAttributes(
semconv.MessagingDestinationKindTopic,
semconv.MessagingDestinationKey.String(topic),
semconv.MessagingOperationProcess,
)
for _, msg := range messages {
msg.SetContext(trace.ContextWithSpan(msg.Context(), span))
p.propagators.Inject(msg.Context(), propagation.MapCarrier(msg.Metadata))
}
err := p.pub.Publish(topic, messages...)
if err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
return err
}
return nil
}
// Close implements the watermill Publisher interface.
func (p *PublisherDecorator) Close() error {
return p.pub.Close()
}
func structName(v any) string {
if s, ok := v.(fmt.Stringer); ok {
return s.String()
}
s := fmt.Sprintf("%T", v)
// trim the pointer marker, if any
return strings.TrimLeft(s, "*")
}

View File

@ -1,78 +0,0 @@
package msgotel_test
import (
"context"
"testing"
"time"
"go.opentelemetry.io/otel/attribute"
semconv "go.opentelemetry.io/otel/semconv/v1.12.0"
"go.opentelemetry.io/otel/propagation"
sdktrace "go.opentelemetry.io/otel/sdk/trace"
"go.opentelemetry.io/otel/sdk/trace/tracetest"
"go.opentelemetry.io/otel/trace"
"github.com/ThreeDotsLabs/watermill/message"
"github.com/ThreeDotsLabs/watermill/message/subscriber"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"gitea.dwysokinski.me/twhelp/core/internal/msg/msgotel"
"github.com/ThreeDotsLabs/watermill"
"github.com/ThreeDotsLabs/watermill/pubsub/gochannel"
)
func TestPublisherDecorator(t *testing.T) {
t.Parallel()
pubSub := gochannel.NewGoChannel(gochannel.Config{Persistent: true}, watermill.NopLogger{})
t.Cleanup(func() {
_ = pubSub.Close()
})
sr := tracetest.NewSpanRecorder()
provider := sdktrace.NewTracerProvider(sdktrace.WithSpanProcessor(sr))
propagators := propagation.NewCompositeTextMapPropagator(propagation.TraceContext{}, propagation.Baggage{})
decoratedPublisher := msgotel.NewPublisherDecorator(
pubSub,
msgotel.WithTracerProvider(provider),
msgotel.WithPropagators(propagators),
msgotel.WithSpanAttributes(attribute.Bool("test", true)),
)
t.Cleanup(func() {
_ = decoratedPublisher.Close()
})
msgs := []*message.Message{
message.NewMessage(watermill.NewUUID(), message.Payload("msg 1")),
message.NewMessage(watermill.NewUUID(), message.Payload("msg 2")),
message.NewMessage(watermill.NewUUID(), message.Payload("msg 3")),
}
assert.NoError(t, decoratedPublisher.Publish("topic", msgs...))
spans := sr.Ended()
require.Len(t, spans, 1)
assert.Equal(t, "gochannel.GoChannel - topic send", spans[0].Name())
assert.Equal(t, trace.SpanKindProducer, spans[0].SpanKind())
assert.Equal(t, []attribute.KeyValue{
attribute.Bool("test", true),
semconv.MessagingDestinationKindTopic,
semconv.MessagingDestinationKey.String("topic"),
semconv.MessagingOperationProcess,
}, spans[0].Attributes())
msgsCh, err := pubSub.Subscribe(context.Background(), "topic")
require.NoError(t, err)
receivedMsgs, _ := subscriber.BulkRead(msgsCh, len(msgs), time.Second)
require.Len(t, receivedMsgs, len(msgs))
for _, msg := range receivedMsgs {
ctx := propagators.Extract(context.Background(), propagation.MapCarrier(msg.Metadata))
spanCtx := trace.SpanContextFromContext(ctx)
assert.Equal(t, spans[0].SpanContext().TraceID(), spanCtx.TraceID())
assert.Equal(t, spans[0].SpanContext().SpanID(), spanCtx.SpanID())
assert.Equal(t, spans[0].SpanContext().IsSampled(), spanCtx.IsSampled())
}
}

View File

@ -7,7 +7,6 @@ import (
"gitea.dwysokinski.me/twhelp/core/internal/domain"
"gitea.dwysokinski.me/twhelp/core/internal/msg/internal/model"
"github.com/ThreeDotsLabs/watermill/message"
"go.opentelemetry.io/otel/codes"
)
type EnnoblementPublisher struct {
@ -20,9 +19,6 @@ func NewEnnoblementPublisher(publisher message.Publisher, marshaler CommandEvent
}
func (e *EnnoblementPublisher) CmdRefresh(ctx context.Context, payloads ...domain.RefreshEnnoblementsCmdPayload) error {
ctx, span := tracer.Start(ctx, "EnnoblementPublisher.CmdRefresh")
defer span.End()
msgs := make([]*message.Message, 0, len(payloads))
for _, p := range payloads {
msg, err := e.marshaler.Marshal(model.RefreshEnnoblementsCmdPayload{
@ -31,8 +27,6 @@ func (e *EnnoblementPublisher) CmdRefresh(ctx context.Context, payloads ...domai
VersionCode: p.VersionCode,
})
if err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
return fmt.Errorf("marshaler.Marshal: %w", err)
}
msg.SetContext(ctx)
@ -40,8 +34,6 @@ func (e *EnnoblementPublisher) CmdRefresh(ctx context.Context, payloads ...domai
}
if err := e.publisher.Publish(ennoblementsCmdRefresh, msgs...); err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
return fmt.Errorf("publisher.Publish: %w", err)
}

View File

@ -4,10 +4,8 @@ import (
"context"
"fmt"
"gitea.dwysokinski.me/twhelp/core/internal/msg/internal/model"
"go.opentelemetry.io/otel/codes"
"gitea.dwysokinski.me/twhelp/core/internal/domain"
"gitea.dwysokinski.me/twhelp/core/internal/msg/internal/model"
"github.com/ThreeDotsLabs/watermill/message"
)
@ -22,9 +20,6 @@ func NewServerPublisher(publisher message.Publisher, marshaler CommandEventMarsh
}
func (s *ServerPublisher) CmdRefresh(ctx context.Context, payloads ...domain.RefreshServersCmdPayload) error {
ctx, span := tracer.Start(ctx, "EnnoblementPublisher.CmdRefresh")
defer span.End()
msgs := make([]*message.Message, 0, len(payloads))
for _, p := range payloads {
msg, err := s.marshaler.Marshal(model.RefreshServersCmdPayload{
@ -32,8 +27,6 @@ func (s *ServerPublisher) CmdRefresh(ctx context.Context, payloads ...domain.Ref
VersionCode: p.VersionCode,
})
if err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
return fmt.Errorf("marshaler.Marshal: %w", err)
}
msg.SetContext(ctx)
@ -41,8 +34,6 @@ func (s *ServerPublisher) CmdRefresh(ctx context.Context, payloads ...domain.Ref
}
if err := s.publisher.Publish(serversCmdRefresh, msgs...); err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
return fmt.Errorf("publisher.Publish: %w", err)
}

View File

@ -7,7 +7,6 @@ import (
"gitea.dwysokinski.me/twhelp/core/internal/domain"
"gitea.dwysokinski.me/twhelp/core/internal/msg/internal/model"
"github.com/ThreeDotsLabs/watermill/message"
"go.opentelemetry.io/otel/codes"
)
type SnapshotPublisher struct {
@ -20,19 +19,12 @@ func NewSnapshotPublisher(publisher message.Publisher, marshaler CommandEventMar
}
func (s *SnapshotPublisher) CmdCreatePlayers(ctx context.Context, payloads ...domain.CreateSnapshotsCmdPayload) error {
ctx, span := tracer.Start(ctx, "SnapshotPublisher.CmdCreatePlayers")
defer span.End()
msgs, err := s.marshalCreateSnapshotsCmdPayloads(ctx, payloads...)
if err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
return err
}
if err = s.publisher.Publish(playersCmdCreateSnapshots, msgs...); err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
return fmt.Errorf("publisher.Publish: %w", err)
}
@ -40,19 +32,12 @@ func (s *SnapshotPublisher) CmdCreatePlayers(ctx context.Context, payloads ...do
}
func (s *SnapshotPublisher) CmdCreateTribes(ctx context.Context, payloads ...domain.CreateSnapshotsCmdPayload) error {
ctx, span := tracer.Start(ctx, "SnapshotPublisher.CmdCreateTribes")
defer span.End()
msgs, err := s.marshalCreateSnapshotsCmdPayloads(ctx, payloads...)
if err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
return err
}
if err = s.publisher.Publish(tribesCmdCreateSnapshots, msgs...); err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
return fmt.Errorf("publisher.Publish: %w", err)
}

View File

@ -6,12 +6,8 @@ import (
"fmt"
"time"
"gitea.dwysokinski.me/twhelp/core/internal/tw"
"go.opentelemetry.io/otel/attribute"
"go.opentelemetry.io/otel/codes"
"go.opentelemetry.io/otel/trace"
"gitea.dwysokinski.me/twhelp/core/internal/domain"
"gitea.dwysokinski.me/twhelp/core/internal/tw"
)
const (
@ -48,16 +44,8 @@ func NewEnnoblement(repo EnnoblementRepository, client EnnoblementGetter) *Ennob
}
func (e *Ennoblement) Refresh(ctx context.Context, key, url string) error {
ctx, span := tracer.Start(ctx, "Ennoblement.Refresh", trace.WithAttributes(
attribute.String("server.key", key),
attribute.String("server.url", url),
))
defer span.End()
latestEnnoblement, err := e.getLatestEnnoblement(ctx, key)
if err != nil && !errors.Is(err, errEnnoblementNotFound) {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
return fmt.Errorf("EnnoblementService.getLatestEnnoblements: %w", err)
}
@ -66,12 +54,8 @@ func (e *Ennoblement) Refresh(ctx context.Context, key, url string) error {
since = latestEnnoblement.CreatedAt
}
span.SetAttributes(attribute.Int64("since", since.Unix()))
ennoblements, err := e.client.GetEnnoblements(ctx, url, since)
if err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
return fmt.Errorf("TWClient.GetEnnoblements: %w", err)
}
@ -97,8 +81,6 @@ func (e *Ennoblement) Refresh(ctx context.Context, key, url string) error {
})
}
if err = e.repo.Create(ctx, params...); err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
return fmt.Errorf("EnnoblementRepository.Create: %w", err)
}
}
@ -110,9 +92,6 @@ func (e *Ennoblement) List(
ctx context.Context,
params domain.ListEnnoblementsParams,
) ([]domain.EnnoblementWithRelations, int64, error) {
ctx, span := tracer.Start(ctx, "Ennoblement.List")
defer span.End()
if len(params.Sort) == 0 {
params.Sort = []domain.EnnoblementSort{
{
@ -123,15 +102,12 @@ func (e *Ennoblement) List(
}
if len(params.Sort) > ennoblementSortMaxLen {
err := domain.ValidationError{
return nil, 0, domain.ValidationError{
Field: "sort",
Err: domain.MaxLengthError{
Max: ennoblementSortMaxLen,
},
}
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
return nil, 0, err
}
if params.Pagination.Limit == 0 {
@ -139,15 +115,11 @@ func (e *Ennoblement) List(
}
if err := validatePagination(params.Pagination, ennoblementMaxLimit); err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
return nil, 0, fmt.Errorf("validatePagination: %w", err)
}
ennoblements, count, err := e.repo.List(ctx, params)
if err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
return nil, 0, fmt.Errorf("EnnoblementRepository.List: %w", err)
}
@ -155,11 +127,6 @@ func (e *Ennoblement) List(
}
func (e *Ennoblement) getLatestEnnoblement(ctx context.Context, key string) (domain.EnnoblementWithRelations, error) {
ctx, span := tracer.Start(ctx, "Ennoblement.getLatestEnnoblement", trace.WithAttributes(
attribute.String("server.key", key),
))
defer span.End()
ennoblements, _, err := e.repo.List(ctx, domain.ListEnnoblementsParams{
ServerKeys: []string{key},
Pagination: domain.Pagination{
@ -171,12 +138,9 @@ func (e *Ennoblement) getLatestEnnoblement(ctx context.Context, key string) (dom
Count: false,
})
if err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
return domain.EnnoblementWithRelations{}, fmt.Errorf("EnnoblementRepository.List: %w", err)
}
if len(ennoblements) == 0 {
span.RecordError(errEnnoblementNotFound)
return domain.EnnoblementWithRelations{}, errEnnoblementNotFound
}

View File

@ -1,34 +0,0 @@
package service
import "gitea.dwysokinski.me/twhelp/core/internal/domain"
func validatePagination(p domain.Pagination, maxLimit int32) error {
if p.Limit < 1 {
return domain.ValidationError{
Field: "limit",
Err: domain.MinError{
Min: 1,
},
}
}
if p.Limit > maxLimit {
return domain.ValidationError{
Field: "limit",
Err: domain.MaxError{
Max: int(maxLimit),
},
}
}
if p.Offset < 0 {
return domain.ValidationError{
Field: "offset",
Err: domain.MinError{
Min: 0,
},
}
}
return nil
}

View File

@ -6,7 +6,6 @@ import (
"time"
"gitea.dwysokinski.me/twhelp/core/internal/domain"
"go.opentelemetry.io/otel/codes"
)
type VersionLister interface {
@ -55,13 +54,8 @@ func NewJob(
}
func (j *Job) UpdateData(ctx context.Context) error {
ctx, span := tracer.Start(ctx, "Job.UpdateData")
defer span.End()
versions, _, err := j.versionSvc.List(ctx, domain.ListVersionsParams{Count: false})
if err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
return fmt.Errorf("VersionService.List: %w", err)
}
@ -75,8 +69,6 @@ func (j *Job) UpdateData(ctx context.Context) error {
err = j.serverPublisher.CmdRefresh(ctx, payloads...)
if err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
return fmt.Errorf("ServerPublisher.CmdRefresh: %w", err)
}
@ -84,9 +76,6 @@ func (j *Job) UpdateData(ctx context.Context) error {
}
func (j *Job) UpdateEnnoblements(ctx context.Context) error {
ctx, span := tracer.Start(ctx, "Job.UpdateEnnoblements")
defer span.End()
servers, _, err := j.serverSvc.List(ctx, domain.ListServersParams{
Special: domain.NullBool{
Bool: false,
@ -101,8 +90,6 @@ func (j *Job) UpdateEnnoblements(ctx context.Context) error {
},
})
if err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
return fmt.Errorf("ServerService.List: %w", err)
}
@ -117,8 +104,6 @@ func (j *Job) UpdateEnnoblements(ctx context.Context) error {
err = j.ennoblementPublisher.CmdRefresh(ctx, payloads...)
if err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
return fmt.Errorf("EnnoblementPublisher.CmdRefresh: %w", err)
}
@ -126,13 +111,8 @@ func (j *Job) UpdateEnnoblements(ctx context.Context) error {
}
func (j *Job) CreateSnapshots(ctx context.Context) error {
ctx, span := tracer.Start(ctx, "Job.CreateSnapshots")
defer span.End()
versions, _, err := j.versionSvc.List(ctx, domain.ListVersionsParams{Count: false})
if err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
return fmt.Errorf("VersionService.List: %w", err)
}
@ -143,20 +123,14 @@ func (j *Job) CreateSnapshots(ctx context.Context) error {
verWithLoc.loc, err = time.LoadLocation(v.Timezone)
if err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
return fmt.Errorf("time.LoadLocation (timezone=%s): %w", v.Timezone, err)
}
if err = j.publishCreatePlayerSnapshotsCmds(ctx, verWithLoc); err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
return fmt.Errorf("couldn't send update snapshots cmds (version=%s): %w", v.Code, err)
}
if err = j.publishCreateTribeSnapshotsCmds(ctx, verWithLoc); err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
return fmt.Errorf("couldn't send update snapshots cmds (version=%s): %w", v.Code, err)
}
}
@ -199,9 +173,6 @@ func (j *Job) publishCreateSnapshotsCmds(
publish func(ctx context.Context, payloads ...domain.CreateSnapshotsCmdPayload) error,
setDate func(params domain.ListServersParams, date time.Time) domain.ListServersParams,
) error {
ctx, span := tracer.Start(ctx, "Job.publishCreateSnapshotsCmds")
defer span.End()
year, month, day := time.Now().In(v.loc).Date()
servers, _, err := j.serverSvc.List(ctx, setDate(domain.ListServersParams{
@ -219,15 +190,11 @@ func (j *Job) publishCreateSnapshotsCmds(
VersionCodes: []string{v.Code},
}, time.Date(year, month, day, 0, 0, 0, 0, v.loc)))
if err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
return fmt.Errorf("ServerService.List: %w", err)
}
date := time.Date(year, month, day, 0, 0, 0, 0, time.UTC)
if err = publish(ctx, newCreateSnapshotsCmdPayloads(servers, date)...); err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
return fmt.Errorf("SnapshotPublisher.CmdCreatePlayers: %w", err)
}

View File

@ -8,9 +8,6 @@ import (
"gitea.dwysokinski.me/twhelp/core/internal/domain"
"gitea.dwysokinski.me/twhelp/core/internal/tw"
"go.opentelemetry.io/otel/attribute"
"go.opentelemetry.io/otel/codes"
"go.opentelemetry.io/otel/trace"
)
const (
@ -47,28 +44,16 @@ func NewPlayer(repo PlayerRepository, tribeChangeSvc TribeChangeCreator, client
}
func (p *Player) Refresh(ctx context.Context, key, url string) (int64, error) {
ctx, span := tracer.Start(ctx, "Player.Refresh", trace.WithAttributes(
attribute.String("server.key", key),
attribute.String("server.url", url),
))
defer span.End()
players, err := p.client.GetPlayers(ctx, url)
if err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
return 0, fmt.Errorf("TWClient.GetPlayers: %w", err)
}
if err = p.createOrUpdate(ctx, key, players); err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
return 0, err
}
if err = p.delete(ctx, key, players); err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
return 0, err
}
@ -76,11 +61,6 @@ func (p *Player) Refresh(ctx context.Context, key, url string) (int64, error) {
}
func (p *Player) createOrUpdate(ctx context.Context, key string, players []tw.Player) error {
ctx, span := tracer.Start(ctx, "Player.createOrUpdate", trace.WithAttributes(
attribute.String("server.key", key),
))
defer span.End()
for i := 0; i < len(players); i += playerChunkSize {
end := i + playerChunkSize
if end > len(players) {
@ -88,8 +68,6 @@ func (p *Player) createOrUpdate(ctx context.Context, key string, players []tw.Pl
}
if err := p.createOrUpdateChunk(ctx, key, players[i:end]); err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
return err
}
}
@ -149,11 +127,6 @@ func (p *Player) createOrUpdateChunk(ctx context.Context, key string, chunk []tw
}
func (p *Player) delete(ctx context.Context, key string, players []tw.Player) error {
ctx, span := tracer.Start(ctx, "Player.delete", trace.WithAttributes(
attribute.String("server.key", key),
))
defer span.End()
//nolint:prealloc
var playersToDelete []int64
var tribeChanges []domain.CreateTribeChangeParams
@ -178,8 +151,6 @@ func (p *Player) delete(ctx context.Context, key string, players []tw.Player) er
},
})
if err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
return fmt.Errorf("PlayerRepository.List: %w", err)
}
@ -211,14 +182,10 @@ func (p *Player) delete(ctx context.Context, key string, players []tw.Player) er
}
if err := p.repo.Delete(ctx, key, playersToDelete...); err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
return fmt.Errorf("PlayerRepository.Delete: %w", err)
}
if err := p.tribeChangeSvc.Create(ctx, tribeChanges...); err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
return fmt.Errorf("TribeChangeService.Create: %w", err)
}
@ -226,9 +193,6 @@ func (p *Player) delete(ctx context.Context, key string, players []tw.Player) er
}
func (p *Player) List(ctx context.Context, params domain.ListPlayersParams) ([]domain.PlayerWithRelations, int64, error) {
ctx, span := tracer.Start(ctx, "Player.List")
defer span.End()
if len(params.Sort) == 0 {
params.Sort = []domain.PlayerSort{
{
@ -239,15 +203,12 @@ func (p *Player) List(ctx context.Context, params domain.ListPlayersParams) ([]d
}
if len(params.Sort) > playerSortMaxLen {
err := domain.ValidationError{
return nil, 0, domain.ValidationError{
Field: "sort",
Err: domain.MaxLengthError{
Max: playerSortMaxLen,
},
}
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
return nil, 0, err
}
if params.Pagination.Limit == 0 {
@ -255,15 +216,11 @@ func (p *Player) List(ctx context.Context, params domain.ListPlayersParams) ([]d
}
if err := validatePagination(params.Pagination, playerMaxLimit); err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
return nil, 0, fmt.Errorf("validatePagination: %w", err)
}
players, count, err := p.repo.List(ctx, params)
if err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
return nil, 0, fmt.Errorf("PlayerRepository.List: %w", err)
}
@ -276,12 +233,6 @@ func (p *Player) GetByServerKeyAndID(
id int64,
includeTribe bool,
) (domain.PlayerWithRelations, error) {
ctx, span := tracer.Start(ctx, "Player.GetByServerKeyAndID", trace.WithAttributes(
attribute.String("server.key", serverKey),
attribute.Int64("player.id", id),
))
defer span.End()
players, _, err := p.repo.List(ctx, domain.ListPlayersParams{
IDs: []int64{id},
ServerKeys: []string{serverKey},
@ -291,17 +242,12 @@ func (p *Player) GetByServerKeyAndID(
},
})
if err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
return domain.PlayerWithRelations{}, fmt.Errorf("PlayerRepository.List: %w", err)
}
if len(players) == 0 {
err = domain.PlayerNotFoundError{
return domain.PlayerWithRelations{}, domain.PlayerNotFoundError{
ID: id,
}
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
return domain.PlayerWithRelations{}, err
}
return players[0], nil

View File

@ -6,9 +6,6 @@ import (
"time"
"gitea.dwysokinski.me/twhelp/core/internal/domain"
"go.opentelemetry.io/otel/attribute"
"go.opentelemetry.io/otel/codes"
"go.opentelemetry.io/otel/trace"
)
//counterfeiter:generate -o internal/mock/player_lister.gen.go . PlayerLister
@ -31,11 +28,6 @@ func NewPlayerSnapshot(repo PlayerSnapshotRepository, playerSvc PlayerLister) *P
}
func (p *PlayerSnapshot) Create(ctx context.Context, key string, date time.Time) error {
ctx, span := tracer.Start(ctx, "PlayerSnapshot.Create", trace.WithAttributes(
attribute.String("server.key", key),
))
defer span.End()
var lastID int64
for {
players, _, err := p.playerSvc.List(ctx, domain.ListPlayersParams{
@ -56,8 +48,6 @@ func (p *PlayerSnapshot) Create(ctx context.Context, key string, date time.Time)
},
})
if err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
return fmt.Errorf("PlayerRepository.List: %w", err)
}
@ -76,8 +66,6 @@ func (p *PlayerSnapshot) Create(ctx context.Context, key string, date time.Time)
}
if err = p.repo.Create(ctx, params...); err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
return fmt.Errorf("PlayerSnapshotRepository.Create: %w", err)
}

View File

@ -7,9 +7,6 @@ import (
"gitea.dwysokinski.me/twhelp/core/internal/domain"
"gitea.dwysokinski.me/twhelp/core/internal/tw"
"go.opentelemetry.io/otel/attribute"
"go.opentelemetry.io/otel/codes"
"go.opentelemetry.io/otel/trace"
)
const (
@ -41,16 +38,8 @@ func NewServer(repo ServerRepository, client OpenServerConfigInfoGetter) *Server
}
func (s *Server) Refresh(ctx context.Context, host, versionCode string) ([]domain.Server, error) {
ctx, span := tracer.Start(ctx, "Server.Refresh", trace.WithAttributes(
attribute.String("version.code", versionCode),
attribute.String("version.host", host),
))
defer span.End()
openServers, err := s.client.GetOpenServers(ctx, host)
if err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
return nil, fmt.Errorf("TWClient.GetOpenServers: %w", err)
}
@ -60,8 +49,6 @@ func (s *Server) Refresh(ctx context.Context, host, versionCode string) ([]domai
Count: false,
})
if err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
return nil, fmt.Errorf("ServerRepository.List: %w", err)
}
@ -71,8 +58,6 @@ func (s *Server) Refresh(ctx context.Context, host, versionCode string) ([]domai
Count: false,
})
if err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
return nil, fmt.Errorf("ServerRepository.List: %w", err)
}
@ -104,8 +89,6 @@ func (s *Server) Refresh(ctx context.Context, host, versionCode string) ([]domai
upsertedServers, err := s.repo.CreateOrUpdate(ctx, params...)
if err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
return nil, fmt.Errorf("ServerRepository.CreateOrUpdate: %w", err)
}
@ -113,30 +96,18 @@ func (s *Server) Refresh(ctx context.Context, host, versionCode string) ([]domai
}
func (s *Server) UpdateInfoAndConfig(ctx context.Context, key, url string) error {
ctx, span := tracer.Start(ctx, "Server.UpdateInfoAndConfig", trace.WithAttributes(
attribute.String("server.key", key),
attribute.String("server.url", url),
))
defer span.End()
cfg, err := s.client.GetServerConfig(ctx, url)
if err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
return fmt.Errorf("TWClient.GetServerConfig: %w", err)
}
buildingInfo, err := s.client.GetBuildingInfo(ctx, url)
if err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
return fmt.Errorf("TWClient.GetBuildingInfo: %w", err)
}
unitInfo, err := s.client.GetUnitInfo(ctx, url)
if err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
return fmt.Errorf("TWClient.GetUnitInfo: %w", err)
}
@ -155,8 +126,6 @@ func (s *Server) UpdateInfoAndConfig(ctx context.Context, key, url string) error
},
})
if err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
return fmt.Errorf("ServerRepository.Update: %w", err)
}
@ -164,12 +133,6 @@ func (s *Server) UpdateInfoAndConfig(ctx context.Context, key, url string) error
}
func (s *Server) UpdateNumPlayers(ctx context.Context, key string, numPlayers int64) error {
ctx, span := tracer.Start(ctx, "Server.UpdateNumPlayers", trace.WithAttributes(
attribute.String("server.key", key),
attribute.Int64("server.num_players", numPlayers),
))
defer span.End()
_, err := s.repo.Update(ctx, key, domain.UpdateServerParams{
NumPlayers: domain.NullInt64{
Valid: true,
@ -178,21 +141,12 @@ func (s *Server) UpdateNumPlayers(ctx context.Context, key string, numPlayers in
PlayerDataUpdatedAt: time.Now(),
})
if err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
return fmt.Errorf("ServerRepository.Update: %w", err)
}
return nil
}
func (s *Server) UpdateNumTribes(ctx context.Context, key string, numTribes int64) error {
ctx, span := tracer.Start(ctx, "Server.UpdateNumTribes", trace.WithAttributes(
attribute.String("server.key", key),
attribute.Int64("server.num_tribes", numTribes),
))
defer span.End()
_, err := s.repo.Update(ctx, key, domain.UpdateServerParams{
NumTribes: domain.NullInt64{
Valid: true,
@ -201,21 +155,12 @@ func (s *Server) UpdateNumTribes(ctx context.Context, key string, numTribes int6
TribeDataUpdatedAt: time.Now(),
})
if err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
return fmt.Errorf("ServerRepository.Update: %w", err)
}
return nil
}
func (s *Server) UpdateNumVillages(ctx context.Context, key string, numVillages int64) error {
ctx, span := tracer.Start(ctx, "Server.UpdateNumVillages", trace.WithAttributes(
attribute.String("server.key", key),
attribute.Int64("server.num_villages", numVillages),
))
defer span.End()
_, err := s.repo.Update(ctx, key, domain.UpdateServerParams{
NumVillages: domain.NullInt64{
Valid: true,
@ -224,68 +169,42 @@ func (s *Server) UpdateNumVillages(ctx context.Context, key string, numVillages
VillageDataUpdatedAt: time.Now(),
})
if err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
return fmt.Errorf("ServerRepository.Update: %w", err)
}
return nil
}
func (s *Server) UpdatePlayerSnapshotsCreatedAt(ctx context.Context, key string) error {
ctx, span := tracer.Start(ctx, "Server.SetPlayerSnapshotsCreatedAtToNow", trace.WithAttributes(
attribute.String("server.key", key),
))
defer span.End()
_, err := s.repo.Update(ctx, key, domain.UpdateServerParams{
PlayerSnapshotsCreatedAt: time.Now(),
})
if err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
return fmt.Errorf("ServerRepository.Update: %w", err)
}
return nil
}
func (s *Server) UpdateTribeSnapshotsCreatedAt(ctx context.Context, key string) error {
ctx, span := tracer.Start(ctx, "Server.SetTribeSnapshotsCreatedAtToNow", trace.WithAttributes(
attribute.String("server.key", key),
))
defer span.End()
_, err := s.repo.Update(ctx, key, domain.UpdateServerParams{
TribeSnapshotsCreatedAt: time.Now(),
})
if err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
return fmt.Errorf("ServerRepository.Update: %w", err)
}
return nil
}
func (s *Server) List(ctx context.Context, params domain.ListServersParams) ([]domain.Server, int64, error) {
ctx, span := tracer.Start(ctx, "Server.List")
defer span.End()
if params.Pagination.Limit == 0 {
params.Pagination.Limit = serverMaxLimit
}
if err := validatePagination(params.Pagination, serverMaxLimit); err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
return nil, 0, fmt.Errorf("validatePagination: %w", err)
}
servers, count, err := s.repo.List(ctx, params)
if err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
return nil, 0, fmt.Errorf("ServerRepository.List: %w", err)
}
@ -293,12 +212,6 @@ func (s *Server) List(ctx context.Context, params domain.ListServersParams) ([]d
}
func (s *Server) GetNormalByVersionCodeAndKey(ctx context.Context, versionCode, key string) (domain.Server, error) {
ctx, span := tracer.Start(ctx, "Server.GetNormalByVersionCodeAndKey", trace.WithAttributes(
attribute.String("version.code", versionCode),
attribute.String("server.key", key),
))
defer span.End()
servers, _, err := s.repo.List(ctx, domain.ListServersParams{
Special: domain.NullBool{
Bool: false,
@ -311,17 +224,12 @@ func (s *Server) GetNormalByVersionCodeAndKey(ctx context.Context, versionCode,
},
})
if err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
return domain.Server{}, fmt.Errorf("ServerRepository.List: %w", err)
}
if len(servers) == 0 {
err = domain.ServerNotFoundError{
return domain.Server{}, domain.ServerNotFoundError{
Key: key,
}
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
return domain.Server{}, err
}
return servers[0], nil

View File

@ -1,9 +1,36 @@
package service
import "go.opentelemetry.io/otel"
import "gitea.dwysokinski.me/twhelp/core/internal/domain"
//go:generate counterfeiter -generate
var (
tracer = otel.Tracer("gitea.dwysokinski.me/twhelp/core/internal/service")
)
func validatePagination(p domain.Pagination, maxLimit int32) error {
if p.Limit < 1 {
return domain.ValidationError{
Field: "limit",
Err: domain.MinError{
Min: 1,
},
}
}
if p.Limit > maxLimit {
return domain.ValidationError{
Field: "limit",
Err: domain.MaxError{
Max: int(maxLimit),
},
}
}
if p.Offset < 0 {
return domain.ValidationError{
Field: "offset",
Err: domain.MinError{
Min: 0,
},
}
}
return nil
}

View File

@ -8,9 +8,6 @@ import (
"gitea.dwysokinski.me/twhelp/core/internal/domain"
"gitea.dwysokinski.me/twhelp/core/internal/tw"
"go.opentelemetry.io/otel/attribute"
"go.opentelemetry.io/otel/codes"
"go.opentelemetry.io/otel/trace"
)
const (
@ -43,28 +40,16 @@ func NewTribe(repo TribeRepository, client TribeGetter) *Tribe {
}
func (t *Tribe) Refresh(ctx context.Context, key, url string) (int64, error) {
ctx, span := tracer.Start(ctx, "Tribe.Refresh", trace.WithAttributes(
attribute.String("server.key", key),
attribute.String("server.url", url),
))
defer span.End()
tribes, err := t.client.GetTribes(ctx, url)
if err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
return 0, fmt.Errorf("TWClient.GetTribes: %w", err)
}
if err = t.createOrUpdate(ctx, key, tribes); err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
return 0, err
}
if err = t.delete(ctx, key, tribes); err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
return 0, err
}
@ -72,11 +57,6 @@ func (t *Tribe) Refresh(ctx context.Context, key, url string) (int64, error) {
}
func (t *Tribe) createOrUpdate(ctx context.Context, key string, tribes []tw.Tribe) error {
ctx, span := tracer.Start(ctx, "Tribe.createOrUpdate", trace.WithAttributes(
attribute.String("server.key", key),
))
defer span.End()
for i := 0; i < len(tribes); i += tribeChunkSize {
end := i + tribeChunkSize
if end > len(tribes) {
@ -84,8 +64,6 @@ func (t *Tribe) createOrUpdate(ctx context.Context, key string, tribes []tw.Trib
}
if err := t.createOrUpdateChunk(ctx, key, tribes[i:end]); err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
return err
}
}
@ -131,11 +109,6 @@ func (t *Tribe) createOrUpdateChunk(ctx context.Context, key string, chunk []tw.
}
func (t *Tribe) delete(ctx context.Context, key string, tribes []tw.Tribe) error {
ctx, span := tracer.Start(ctx, "Tribe.delete", trace.WithAttributes(
attribute.String("server.key", key),
))
defer span.End()
//nolint:prealloc
var tribesToDelete []int64
var lastID int64
@ -158,8 +131,6 @@ func (t *Tribe) delete(ctx context.Context, key string, tribes []tw.Tribe) error
},
})
if err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
return fmt.Errorf("TribeRepository.List: %w", err)
}
@ -181,8 +152,6 @@ func (t *Tribe) delete(ctx context.Context, key string, tribes []tw.Tribe) error
}
if err := t.repo.Delete(ctx, key, tribesToDelete...); err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
return fmt.Errorf("TribeRepository.Delete: %w", err)
}
@ -190,34 +159,20 @@ func (t *Tribe) delete(ctx context.Context, key string, tribes []tw.Tribe) error
}
func (t *Tribe) UpdateDominance(ctx context.Context, serverKey string, numPlayerVillages int64) error {
ctx, span := tracer.Start(ctx, "Tribe.UpdateDominance", trace.WithAttributes(
attribute.String("server.key", serverKey),
attribute.Int64("server.num_player_villages", numPlayerVillages),
))
defer span.End()
if err := t.repo.UpdateDominance(ctx, serverKey, numPlayerVillages); err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
return fmt.Errorf("TribeRepository.UpdateDominance: %w", err)
}
return nil
}
func (t *Tribe) List(ctx context.Context, params domain.ListTribesParams) ([]domain.Tribe, int64, error) {
ctx, span := tracer.Start(ctx, "Tribe.List")
defer span.End()
if len(params.Tags) > tribeTagMaxLen {
err := domain.ValidationError{
return nil, 0, domain.ValidationError{
Field: "tag",
Err: domain.MaxLengthError{
Max: tribeTagMaxLen,
},
}
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
return nil, 0, err
}
if len(params.Sort) == 0 {
@ -230,15 +185,12 @@ func (t *Tribe) List(ctx context.Context, params domain.ListTribesParams) ([]dom
}
if len(params.Sort) > tribeSortMaxLen {
err := domain.ValidationError{
return nil, 0, domain.ValidationError{
Field: "sort",
Err: domain.MaxLengthError{
Max: tribeSortMaxLen,
},
}
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
return nil, 0, err
}
if params.Pagination.Limit == 0 {
@ -246,15 +198,11 @@ func (t *Tribe) List(ctx context.Context, params domain.ListTribesParams) ([]dom
}
if err := validatePagination(params.Pagination, tribeMaxLimit); err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
return nil, 0, fmt.Errorf("validatePagination: %w", err)
}
tribes, count, err := t.repo.List(ctx, params)
if err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
return nil, 0, fmt.Errorf("TribeRepository.List: %w", err)
}
@ -262,12 +210,6 @@ func (t *Tribe) List(ctx context.Context, params domain.ListTribesParams) ([]dom
}
func (t *Tribe) GetByServerKeyAndID(ctx context.Context, serverKey string, id int64) (domain.Tribe, error) {
ctx, span := tracer.Start(ctx, "Tribe.GetByServerKeyAndID", trace.WithAttributes(
attribute.String("server.key", serverKey),
attribute.Int64("tribe.id", id),
))
defer span.End()
tribes, _, err := t.repo.List(ctx, domain.ListTribesParams{
IDs: []int64{id},
ServerKeys: []string{serverKey},
@ -276,17 +218,12 @@ func (t *Tribe) GetByServerKeyAndID(ctx context.Context, serverKey string, id in
},
})
if err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
return domain.Tribe{}, fmt.Errorf("TribeRepository.List: %w", err)
}
if len(tribes) == 0 {
err = domain.TribeNotFoundError{
return domain.Tribe{}, domain.TribeNotFoundError{
ID: id,
}
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
return domain.Tribe{}, err
}
return tribes[0], nil

View File

@ -5,7 +5,6 @@ import (
"fmt"
"gitea.dwysokinski.me/twhelp/core/internal/domain"
"go.opentelemetry.io/otel/codes"
)
const (
@ -26,9 +25,6 @@ func NewTribeChange(repo TribeChangeRepository) *TribeChange {
}
func (t *TribeChange) Create(ctx context.Context, params ...domain.CreateTribeChangeParams) error {
ctx, span := tracer.Start(ctx, "TribeChange.Create")
defer span.End()
for i := 0; i < len(params); i += tribeChangeChunkSize {
end := i + tribeChangeChunkSize
if end > len(params) {
@ -38,8 +34,6 @@ func (t *TribeChange) Create(ctx context.Context, params ...domain.CreateTribeCh
chunk := params[i:end]
if err := t.repo.Create(ctx, chunk...); err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
return fmt.Errorf("TribeChangeRepository.Create: %w", err)
}
}

View File

@ -6,9 +6,6 @@ import (
"time"
"gitea.dwysokinski.me/twhelp/core/internal/domain"
"go.opentelemetry.io/otel/attribute"
"go.opentelemetry.io/otel/codes"
"go.opentelemetry.io/otel/trace"
)
//counterfeiter:generate -o internal/mock/tribe_lister.gen.go . TribeLister
@ -31,11 +28,6 @@ func NewTribeSnapshot(repo TribeSnapshotRepository, tribeSvc TribeLister) *Tribe
}
func (t *TribeSnapshot) Create(ctx context.Context, key string, date time.Time) error {
ctx, span := tracer.Start(ctx, "TribeSnapshot.Create", trace.WithAttributes(
attribute.String("server.key", key),
))
defer span.End()
var lastID int64
for {
tribes, _, err := t.tribeSvc.List(ctx, domain.ListTribesParams{
@ -56,8 +48,6 @@ func (t *TribeSnapshot) Create(ctx context.Context, key string, date time.Time)
},
})
if err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
return fmt.Errorf("TribeRepository.List: %w", err)
}
@ -78,8 +68,6 @@ func (t *TribeSnapshot) Create(ctx context.Context, key string, date time.Time)
}
if err = t.repo.Create(ctx, params...); err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
return fmt.Errorf("TribeSnapshotRepository.Create: %w", err)
}

View File

@ -5,9 +5,6 @@ import (
"fmt"
"gitea.dwysokinski.me/twhelp/core/internal/domain"
"go.opentelemetry.io/otel/attribute"
"go.opentelemetry.io/otel/codes"
"go.opentelemetry.io/otel/trace"
)
type VersionRepository interface {
@ -24,31 +21,17 @@ func NewVersion(repo VersionRepository) *Version {
}
func (v *Version) List(ctx context.Context, params domain.ListVersionsParams) ([]domain.Version, int64, error) {
ctx, span := tracer.Start(ctx, "Version.List")
defer span.End()
versions, count, err := v.repo.List(ctx, params)
if err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
return nil, 0, fmt.Errorf("VersionRepository.List: %w", err)
}
return versions, count, nil
}
func (v *Version) GetByCode(ctx context.Context, code string) (domain.Version, error) {
ctx, span := tracer.Start(ctx, "Version.GetByCode", trace.WithAttributes(
attribute.String("version.code", code),
))
defer span.End()
version, err := v.repo.GetByCode(ctx, code)
if err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
return domain.Version{}, fmt.Errorf("VersionRepository.GetByCode: %w", err)
}
return version, nil
}

View File

@ -6,9 +6,6 @@ import (
"gitea.dwysokinski.me/twhelp/core/internal/domain"
"gitea.dwysokinski.me/twhelp/core/internal/tw"
"go.opentelemetry.io/otel/attribute"
"go.opentelemetry.io/otel/codes"
"go.opentelemetry.io/otel/trace"
)
const (
@ -37,16 +34,8 @@ func NewVillage(repo VillageRepository, client VillageGetter) *Village {
}
func (v *Village) Refresh(ctx context.Context, key, url string) (domain.RefreshVillagesResult, error) {
ctx, span := tracer.Start(ctx, "Village.Refresh", trace.WithAttributes(
attribute.String("server.key", key),
attribute.String("server.url", url),
))
defer span.End()
villages, err := v.client.GetVillages(ctx, url)
if err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
return domain.RefreshVillagesResult{}, fmt.Errorf("TWClient.GetVillages: %w", err)
}
@ -86,8 +75,6 @@ func (v *Village) Refresh(ctx context.Context, key, url string) (domain.RefreshV
}
}
if err := v.repo.CreateOrUpdate(ctx, params...); err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
return domain.RefreshVillagesResult{}, fmt.Errorf("VillageRepository.CreateOrUpdate: %w", err)
}
}
@ -96,23 +83,16 @@ func (v *Village) Refresh(ctx context.Context, key, url string) (domain.RefreshV
}
func (v *Village) List(ctx context.Context, params domain.ListVillagesParams) ([]domain.VillageWithRelations, int64, error) {
ctx, span := tracer.Start(ctx, "Village.List")
defer span.End()
if params.Pagination.Limit == 0 {
params.Pagination.Limit = villageMaxLimit
}
if err := validatePagination(params.Pagination, villageMaxLimit); err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
return nil, 0, fmt.Errorf("validatePagination: %w", err)
}
villages, count, err := v.repo.List(ctx, params)
if err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
return nil, 0, fmt.Errorf("VillageRepository.List: %w", err)
}
@ -125,12 +105,6 @@ func (v *Village) GetByServerKeyAndID(
id int64,
includePlayer, includePlayerTribe bool,
) (domain.VillageWithRelations, error) {
ctx, span := tracer.Start(ctx, "Village.GetByServerKeyAndID", trace.WithAttributes(
attribute.String("server.key", serverKey),
attribute.Int64("village.id", id),
))
defer span.End()
villages, _, err := v.repo.List(ctx, domain.ListVillagesParams{
IDs: []int64{id},
ServerKeys: []string{serverKey},
@ -141,17 +115,12 @@ func (v *Village) GetByServerKeyAndID(
},
})
if err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
return domain.VillageWithRelations{}, fmt.Errorf("VillageRepository.List: %w", err)
}
if len(villages) == 0 {
err = domain.VillageNotFoundError{
return domain.VillageWithRelations{}, domain.VillageNotFoundError{
ID: id,
}
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
return domain.VillageWithRelations{}, err
}
return villages[0], nil

View File

@ -15,9 +15,6 @@ import (
"time"
"github.com/elliotchance/phpserialize"
"go.opentelemetry.io/otel/attribute"
"go.opentelemetry.io/otel/codes"
"go.opentelemetry.io/otel/trace"
)
const (
@ -97,15 +94,8 @@ type Server struct {
}
func (c *Client) GetOpenServers(ctx context.Context, baseURL string) ([]Server, error) {
ctx, span := tracer.Start(ctx, "Client.GetOpenServers", trace.WithAttributes(
attribute.String("base_url", baseURL),
))
defer span.End()
resp, err := c.get(ctx, buildURL(baseURL, endpointGetServers))
if err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
return nil, fmt.Errorf("c.get: %w", err)
}
defer func() {
@ -114,15 +104,11 @@ func (c *Client) GetOpenServers(ctx context.Context, baseURL string) ([]Server,
b, err := io.ReadAll(resp.Body)
if err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
return nil, fmt.Errorf("couldn't read response body: %w", err)
}
m, err := phpserialize.UnmarshalAssociativeArray(b)
if err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
return nil, fmt.Errorf("phpserialize.UnmarshalAssociativeArray: %w", err)
}
@ -130,18 +116,12 @@ func (c *Client) GetOpenServers(ctx context.Context, baseURL string) ([]Server,
for key, val := range m {
keyStr, ok := key.(string)
if !ok || keyStr == "" {
err = fmt.Errorf("%w: %v", ErrInvalidServerKey, key)
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
return nil, err
return nil, fmt.Errorf("%w: %v", ErrInvalidServerKey, key)
}
urlStr, ok := val.(string)
if !ok || urlStr == "" {
err = fmt.Errorf("%w: %v", ErrInvalidServerURL, val)
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
return nil, err
return nil, fmt.Errorf("%w: %v", ErrInvalidServerURL, val)
}
servers = append(servers, Server{
@ -154,16 +134,9 @@ func (c *Client) GetOpenServers(ctx context.Context, baseURL string) ([]Server,
}
func (c *Client) GetServerConfig(ctx context.Context, baseURL string) (ServerConfig, error) {
ctx, span := tracer.Start(ctx, "Client.GetServerConfig", trace.WithAttributes(
attribute.String("base_url", baseURL),
))
defer span.End()
var cfg ServerConfig
if err := c.getXML(ctx, buildURL(baseURL, endpointConfig), &cfg); err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
return ServerConfig{}, fmt.Errorf("c.getXML: %w", err)
}
@ -171,16 +144,9 @@ func (c *Client) GetServerConfig(ctx context.Context, baseURL string) (ServerCon
}
func (c *Client) GetBuildingInfo(ctx context.Context, baseURL string) (BuildingInfo, error) {
ctx, span := tracer.Start(ctx, "Client.GetBuildingInfo", trace.WithAttributes(
attribute.String("base_url", baseURL),
))
defer span.End()
var info BuildingInfo
if err := c.getXML(ctx, buildURL(baseURL, endpointBuildingInfo), &info); err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
return BuildingInfo{}, fmt.Errorf("c.getXML: %w", err)
}
@ -188,16 +154,9 @@ func (c *Client) GetBuildingInfo(ctx context.Context, baseURL string) (BuildingI
}
func (c *Client) GetUnitInfo(ctx context.Context, baseURL string) (UnitInfo, error) {
ctx, span := tracer.Start(ctx, "Client.GetUnitInfo", trace.WithAttributes(
attribute.String("base_url", baseURL),
))
defer span.End()
var info UnitInfo
if err := c.getXML(ctx, buildURL(baseURL, endpointUnitInfo), &info); err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
return UnitInfo{}, fmt.Errorf("c.getXML: %w", err)
}
@ -205,22 +164,13 @@ func (c *Client) GetUnitInfo(ctx context.Context, baseURL string) (UnitInfo, err
}
func (c *Client) GetTribes(ctx context.Context, baseURL string) ([]Tribe, error) {
ctx, span := tracer.Start(ctx, "Client.GetTribes", trace.WithAttributes(
attribute.String("base_url", baseURL),
))
defer span.End()
od, err := c.getOD(ctx, baseURL, true)
if err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
return nil, fmt.Errorf("c.getOD: %w", err)
}
records, err := c.getCSV(ctx, buildURL(baseURL, endpointTribes), fieldsPerRecordTribe)
if err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
return nil, fmt.Errorf("c.getCSV: %w", err)
}
@ -228,8 +178,6 @@ func (c *Client) GetTribes(ctx context.Context, baseURL string) ([]Tribe, error)
for _, rec := range records {
tribe, err := parseTribeRecord(rec, od, baseURL)
if err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
return nil, fmt.Errorf("parseTribeRecord: %w", err)
}
@ -244,22 +192,13 @@ func (c *Client) GetTribes(ctx context.Context, baseURL string) ([]Tribe, error)
}
func (c *Client) GetPlayers(ctx context.Context, baseURL string) ([]Player, error) {
ctx, span := tracer.Start(ctx, "Client.GetPlayers", trace.WithAttributes(
attribute.String("base_url", baseURL),
))
defer span.End()
od, err := c.getOD(ctx, baseURL, false)
if err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
return nil, fmt.Errorf("c.getOD: %w", err)
}
records, err := c.getCSV(ctx, buildURL(baseURL, endpointPlayers), fieldsPerRecordPlayer)
if err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
return nil, fmt.Errorf("c.getCSV: %w", err)
}
@ -267,8 +206,6 @@ func (c *Client) GetPlayers(ctx context.Context, baseURL string) ([]Player, erro
for _, rec := range records {
player, err := parsePlayerRecord(rec, od, baseURL)
if err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
return nil, fmt.Errorf("parsePlayerRecord: %w", err)
}
@ -283,12 +220,6 @@ func (c *Client) GetPlayers(ctx context.Context, baseURL string) ([]Player, erro
}
func (c *Client) getOD(ctx context.Context, baseURL string, tribe bool) (map[int64]OpponentsDefeated, error) {
ctx, span := tracer.Start(ctx, "Client.getOD", trace.WithAttributes(
attribute.String("base_url", baseURL),
attribute.Bool("tribe", tribe),
))
defer span.End()
m := make(map[int64]OpponentsDefeated)
urls := buildODURLs(baseURL, tribe)
@ -299,16 +230,12 @@ func (c *Client) getOD(ctx context.Context, baseURL string, tribe bool) (map[int
records, err := c.getCSV(ctx, u, fieldsPerRecordOD)
if err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
return nil, fmt.Errorf("c.getCSV: %w", err)
}
for _, rec := range records {
parsed, err := parseODRecord(rec)
if err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
return nil, fmt.Errorf("parseODRecord: %w", err)
}
@ -337,15 +264,8 @@ func (c *Client) getOD(ctx context.Context, baseURL string, tribe bool) (map[int
}
func (c *Client) GetVillages(ctx context.Context, baseURL string) ([]Village, error) {
ctx, span := tracer.Start(ctx, "Client.GetVillages", trace.WithAttributes(
attribute.String("base_url", baseURL),
))
defer span.End()
records, err := c.getCSV(ctx, buildURL(baseURL, endpointVillages), fieldsPerRecordVillage)
if err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
return nil, fmt.Errorf("c.getCSV: %w", err)
}
@ -353,8 +273,6 @@ func (c *Client) GetVillages(ctx context.Context, baseURL string) ([]Village, er
for _, rec := range records {
village, err := parseVillageRecord(rec, baseURL)
if err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
return nil, fmt.Errorf("parseVillageRecord: %w", err)
}
@ -369,16 +287,8 @@ func (c *Client) GetVillages(ctx context.Context, baseURL string) ([]Village, er
}
func (c *Client) GetEnnoblements(ctx context.Context, baseURL string, since time.Time) ([]Ennoblement, error) {
ctx, span := tracer.Start(ctx, "Client.GetEnnoblements", trace.WithAttributes(
attribute.String("base_url", baseURL),
attribute.Int64("since", since.Unix()),
))
defer span.End()
records, err := c.getCSV(ctx, buildEnnoblementURL(baseURL, since), fieldsPerRecordEnnoblement)
if err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
return nil, fmt.Errorf("c.getCSV: %w", err)
}
@ -388,8 +298,6 @@ func (c *Client) GetEnnoblements(ctx context.Context, baseURL string, since time
createdAt, err := parseTimestamp(rec[1])
if err != nil {
err = NewParseError(err, rec, "ennoblement.CreatedAt")
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
return nil, err
}
@ -404,8 +312,6 @@ func (c *Client) GetEnnoblements(ctx context.Context, baseURL string, since time
for _, rec := range records {
ennoblement, err := parseEnnoblementRecord(rec)
if err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
return nil, fmt.Errorf("parseEnnoblementRecord: %w", err)
}

View File

@ -2,12 +2,6 @@ package tw
import (
"time"
"go.opentelemetry.io/otel"
)
var (
tracer = otel.Tracer("gitea.dwysokinski.me/twhelp/core/internal/tw")
)
type OpponentsDefeated struct {