Skip to content

Commit f037fb1

Browse files
committed
progress [skip ci]
1 parent feb8e32 commit f037fb1

19 files changed

+366
-102
lines changed

go.mod

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ go 1.21
44

55
// Main dependencies
66
require (
7-
github.com/SentimensRG/ctx v0.0.0-20180729130232-0bfd988c655d
87
github.com/agoda-com/opentelemetry-go/otelslog v0.1.1
98
github.com/agoda-com/opentelemetry-logs-go v0.4.3
109
github.com/brunomvsouza/singleflight v0.4.0
@@ -21,6 +20,7 @@ require (
2120
github.com/spf13/viper v1.18.1
2221
github.com/valyala/fastjson v1.6.4
2322
go.opentelemetry.io/contrib/instrumentation/github.com/gorilla/mux/otelmux v0.48.0
23+
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.48.0
2424
go.opentelemetry.io/contrib/instrumentation/runtime v0.48.0
2525
go.opentelemetry.io/otel v1.23.1
2626
go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.23.1
@@ -29,6 +29,7 @@ require (
2929
go.opentelemetry.io/otel/sdk v1.23.1
3030
go.opentelemetry.io/otel/sdk/metric v1.23.1
3131
go.opentelemetry.io/otel/trace v1.23.1
32+
go.uber.org/multierr v1.11.0
3233
)
3334

3435
// Dev dependencies
@@ -70,7 +71,6 @@ require (
7071
github.com/tilinna/clock v1.0.2 // indirect
7172
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.23.1 // indirect
7273
go.opentelemetry.io/proto/otlp v1.1.0 // indirect
73-
go.uber.org/multierr v1.11.0 // indirect
7474
golang.org/x/crypto v0.19.0 // indirect
7575
golang.org/x/exp v0.0.0-20231206192017-f3f8817b8deb // indirect
7676
golang.org/x/net v0.21.0 // indirect

go.sum

Lines changed: 2 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
github.com/SentimensRG/ctx v0.0.0-20180729130232-0bfd988c655d h1:CbB/Ef3TyBvSSJx2HDSUiw49ONTpaX6BGiI0jJEX6b8=
2-
github.com/SentimensRG/ctx v0.0.0-20180729130232-0bfd988c655d/go.mod h1:cfn0Ycx1ASzCkl8+04zI4hrclf9YQ1QfncxzFiNtQLo=
31
github.com/agoda-com/opentelemetry-go/otelslog v0.1.1 h1:6nV8PZCzySHuh9kP/HZ2OJqGucwQiM+yZRugKDvtzj4=
42
github.com/agoda-com/opentelemetry-go/otelslog v0.1.1/go.mod h1:CSc0veIcY/HsIfH7l5PGtIpRvBttk09QUQlweVkD2PI=
53
github.com/agoda-com/opentelemetry-logs-go v0.4.3 h1:dYAx/q9di+/Pv6HuGq59DFIOjqKT0LTy3PYTIz8ccq8=
@@ -34,9 +32,6 @@ github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ=
3432
github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
3533
github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
3634
github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
37-
github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0=
38-
github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE=
39-
github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78=
4035
github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s=
4136
github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4=
4237
github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA=
@@ -51,8 +46,6 @@ github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaS
5146
github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg=
5247
github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
5348
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
54-
github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
55-
github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
5649
github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
5750
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
5851
github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY=
@@ -75,9 +68,6 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
7568
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
7669
github.com/leodido/go-urn v1.2.4 h1:XlAE/cm/ms7TE/VMVoduSpNBoyc2dOxHs5MZSwAN63Q=
7770
github.com/leodido/go-urn v1.2.4/go.mod h1:7ZrI8mTSeBSHl/UaRyKQW1qZeMgak41ANeCNaVckg+4=
78-
github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I=
79-
github.com/lufia/plan9stats v0.0.0-20231016141302-07b5767bb0ed h1:036IscGBfJsFIgJQzlui7nK1Ncm0tp2ktmPj8xO4N/0=
80-
github.com/lufia/plan9stats v0.0.0-20231016141302-07b5767bb0ed/go.mod h1:ilwx/Dta8jXAgpFYFvSWEMwxmbWXyiUHkd5FwyKhb5k=
8171
github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY=
8272
github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0=
8373
github.com/mediocregopher/radix/v4 v4.1.4 h1:Uze6DEbEAvL+VHXUEu/EDBTkUk5CLct5h3nVSGpc6Ts=
@@ -93,21 +83,13 @@ github.com/pelletier/go-toml/v2 v2.1.1/go.mod h1:tJU2Z3ZkXwnxa4DPO899bsyIoywizdU
9383
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
9484
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=
9585
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
96-
github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE=
97-
github.com/power-devops/perfstat v0.0.0-20221212215047-62379fc7944b h1:0LFwY6Q3gMACTjAbMZBjXAqTOzOwFaj2Ld6cjeQ7Rig=
98-
github.com/power-devops/perfstat v0.0.0-20221212215047-62379fc7944b/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE=
9986
github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M=
10087
github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA=
10188
github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
10289
github.com/sagikazarmark/locafero v0.4.0 h1:HApY1R9zGo4DBgr7dqsTH/JJxLTTsOt7u6keLGt6kNQ=
10390
github.com/sagikazarmark/locafero v0.4.0/go.mod h1:Pe1W6UlPYUk/+wc/6KFhbORCfqzgYEpgQ3O5fPuL3H4=
10491
github.com/sagikazarmark/slog-shim v0.1.0 h1:diDBnUNK9N/354PgrxMywXnAwEr1QZcOr6gto+ugjYE=
10592
github.com/sagikazarmark/slog-shim v0.1.0/go.mod h1:SrcSrq8aKtyuqEI1uvTDTK1arOWRIczQRv+GVI1AkeQ=
106-
github.com/shirou/gopsutil/v3 v3.24.1 h1:R3t6ondCEvmARp3wxODhXMTLC/klMa87h2PHUw5m7QI=
107-
github.com/shirou/gopsutil/v3 v3.24.1/go.mod h1:UU7a2MSBQa+kW1uuDq8DeEBS8kmrnQwsv2b5O513rwU=
108-
github.com/shoenig/go-m1cpu v0.1.6 h1:nxdKQNcEB6vzgA2E2bvzKIYRuNj7XNJ4S/aRSwKzFtM=
109-
github.com/shoenig/go-m1cpu v0.1.6/go.mod h1:1JJMcUBvfNwpq05QDQVAnx3gUHr9IYF7GNg9SUEw2VQ=
110-
github.com/shoenig/test v0.6.4/go.mod h1:byHiCGXqrVaflBLAMq/srcZIHynQPQgeyvkvXnjqq0k=
11193
github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo=
11294
github.com/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0=
11395
github.com/spf13/afero v1.11.0 h1:WJQKhtpdm3v2IzqG8VMqrr6Rf3UYpEF239Jy9wNepM8=
@@ -134,21 +116,12 @@ github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8
134116
github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU=
135117
github.com/tilinna/clock v1.0.2 h1:6BO2tyAC9JbPExKH/z9zl44FLu1lImh3nDNKA0kgrkI=
136118
github.com/tilinna/clock v1.0.2/go.mod h1:ZsP7BcY7sEEz7ktc0IVy8Us6boDrK8VradlKRUGfOao=
137-
github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI=
138-
github.com/tklauser/go-sysconf v0.3.13 h1:GBUpcahXSpR2xN01jhkNAbTLRk2Yzgggk8IM08lq3r4=
139-
github.com/tklauser/go-sysconf v0.3.13/go.mod h1:zwleP4Q4OehZHGn4CYZDipCgg9usW5IJePewFCGVEa0=
140-
github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY=
141-
github.com/tklauser/numcpus v0.7.0 h1:yjuerZP127QG9m5Zh/mSO4wqurYil27tHrqwRoRjpr4=
142-
github.com/tklauser/numcpus v0.7.0/go.mod h1:bb6dMVcj8A42tSE7i32fsIUCbQNllK5iDguyOZRUzAY=
143119
github.com/valyala/fastjson v1.6.4 h1:uAUNq9Z6ymTgGhcm0UynUAB6tlbakBrz6CQFax3BXVQ=
144120
github.com/valyala/fastjson v1.6.4/go.mod h1:CLCAqky6SMuOcxStkYQvblddUtoRxhYMGLrsQns1aXY=
145-
github.com/yusufpapurcu/wmi v1.2.3/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0=
146-
github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0=
147-
github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0=
148121
go.opentelemetry.io/contrib/instrumentation/github.com/gorilla/mux/otelmux v0.48.0 h1:7rkdNoXgScpSUIqBch/VOB24fk9g0wl3Tr5WPtshi9o=
149122
go.opentelemetry.io/contrib/instrumentation/github.com/gorilla/mux/otelmux v0.48.0/go.mod h1:U3t9uswWhDzieXHMNWP6zk87J4HNondiibKMdNLpnMk=
150-
go.opentelemetry.io/contrib/instrumentation/host v0.48.0 h1:eVDLR/hletJcctz4rSWwb3QVzRnEQKuTVi6qAm7fsWs=
151-
go.opentelemetry.io/contrib/instrumentation/host v0.48.0/go.mod h1:dWSGvPpaGKwBh/dpLJs6pczyOc82hBnxa1YTQZCic0I=
123+
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.48.0 h1:doUP+ExOpH3spVTLS0FcWGLnQrPct/hD/bCPbDRUEAU=
124+
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.48.0/go.mod h1:rdENBZMT2OE6Ne/KLwpiXudnAsbdrdBaqBvTN8M8BgA=
152125
go.opentelemetry.io/contrib/instrumentation/runtime v0.48.0 h1:dJlCKeq+zmO5Og4kgxqPvvJrzuD/mygs1g/NYM9dAsU=
153126
go.opentelemetry.io/contrib/instrumentation/runtime v0.48.0/go.mod h1:p+hpBCpLHpuUrR0lHgnHbUnbCBll1IhrcMIlycC+xYs=
154127
go.opentelemetry.io/otel v1.23.1 h1:Za4UzOqJYS+MUczKI320AtqZHZb7EqxO00jAHE0jmQY=
@@ -181,12 +154,6 @@ golang.org/x/net v0.21.0 h1:AQyQV4dYCvJ7vGmJyKki9+PBdyvhkSd8EIx/qb0AYv4=
181154
golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44=
182155
golang.org/x/sync v0.5.0 h1:60k92dhOjHxJkrqnwsfl8KuaHbn/5dl0lUPUklKo3qE=
183156
golang.org/x/sync v0.5.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
184-
golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
185-
golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
186-
golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
187-
golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
188-
golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
189-
golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
190157
golang.org/x/sys v0.17.0 h1:25cE3gD+tdBA7lp7QfhuV+rJiE9YXTcS3VG1SqssI/Y=
191158
golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
192159
golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ=

internal/di/di.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ func New() (*di.Container, error) {
88
contextDiOptions,
99
dbDiOptions,
1010
handlersDiOptions,
11+
httpClientDiOptions,
1112
loggerDiOptions,
1213
mojangDiOptions,
1314
profilesDiOptions,

internal/di/httpClient.go

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package di
2+
3+
import (
4+
"net/http"
5+
6+
"github.com/defval/di"
7+
"go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp"
8+
)
9+
10+
var httpClientDiOptions = di.Options(
11+
di.Provide(newHttpClient),
12+
)
13+
14+
func newHttpClient() *http.Client {
15+
return &http.Client{
16+
Transport: otelhttp.NewTransport(http.DefaultTransport),
17+
}
18+
}

internal/di/mojang.go

Lines changed: 16 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ var mojangDiOptions = di.Options(
2121
di.Provide(newMojangSignedTexturesProvider),
2222
)
2323

24-
func newMojangApi(config *viper.Viper) (*mojang.MojangApi, error) {
24+
func newMojangApi(config *viper.Viper, httpClient *http.Client) (*mojang.MojangApi, error) {
2525
batchUuidsUrl := config.GetString("mojang.batch_uuids_url")
2626
if batchUuidsUrl != "" {
2727
if _, err := url.ParseRequestURI(batchUuidsUrl); err != nil {
@@ -36,8 +36,6 @@ func newMojangApi(config *viper.Viper) (*mojang.MojangApi, error) {
3636
}
3737
}
3838

39-
httpClient := &http.Client{} // TODO: extract to the singleton dependency
40-
4139
return mojang.NewMojangApi(httpClient, batchUuidsUrl, profileUrl), nil
4240
}
4341

@@ -62,21 +60,18 @@ func newMojangTexturesProviderFactory(
6260
func newMojangTexturesProvider(
6361
uuidsProvider mojang.UuidsProvider,
6462
texturesProvider mojang.TexturesProvider,
65-
) *mojang.MojangTexturesProvider {
66-
return &mojang.MojangTexturesProvider{
67-
UuidsProvider: uuidsProvider,
68-
TexturesProvider: texturesProvider,
69-
}
63+
) (*mojang.MojangTexturesProvider, error) {
64+
return mojang.NewMojangTexturesProvider(
65+
uuidsProvider,
66+
texturesProvider,
67+
)
7068
}
7169

7270
func newMojangTexturesUuidsProviderFactory(
7371
batchProvider *mojang.BatchUuidsProvider,
7472
uuidsStorage mojang.MojangUuidsStorage,
75-
) mojang.UuidsProvider {
76-
return &mojang.UuidsProviderWithCache{
77-
Provider: batchProvider,
78-
Storage: uuidsStorage,
79-
}
73+
) (mojang.UuidsProvider, error) {
74+
return mojang.NewUuidsProviderWithCache(batchProvider, uuidsStorage)
8075
}
8176

8277
func newMojangTexturesBatchUUIDsProvider(
@@ -89,20 +84,19 @@ func newMojangTexturesBatchUUIDsProvider(
8984

9085
// TODO: healthcheck is broken
9186

92-
uuidsProvider := mojang.NewBatchUuidsProvider(
87+
return mojang.NewBatchUuidsProvider(
9388
mojangApi.UsernamesToUuids,
9489
config.GetInt("queue.batch_size"),
9590
config.GetDuration("queue.loop_delay"),
9691
config.GetString("queue.strategy") == "full-bus",
9792
)
98-
99-
return uuidsProvider, nil
10093
}
10194

102-
func newMojangSignedTexturesProvider(mojangApi *mojang.MojangApi) mojang.TexturesProvider {
103-
return mojang.NewTexturesProviderWithInMemoryCache(
104-
&mojang.MojangApiTexturesProvider{
105-
MojangApiTexturesEndpoint: mojangApi.UuidToTextures,
106-
},
107-
)
95+
func newMojangSignedTexturesProvider(mojangApi *mojang.MojangApi) (mojang.TexturesProvider, error) {
96+
provider, err := mojang.NewMojangApiTexturesProvider(mojangApi.UuidToTextures)
97+
if err != nil {
98+
return nil, err
99+
}
100+
101+
return mojang.NewTexturesProviderWithInMemoryCache(provider)
108102
}

internal/di/profiles.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,9 @@ func newProfilesManager(r profiles.ProfilesRepository) *profiles.Manager {
1919
func newProfilesProvider(
2020
finder profiles.ProfilesFinder,
2121
mojangProfilesProvider profiles.MojangProfilesProvider,
22-
) *profiles.Provider {
23-
return &profiles.Provider{
24-
ProfilesFinder: finder,
25-
MojangProfilesProvider: mojangProfilesProvider,
26-
}
22+
) (*profiles.Provider, error) {
23+
return profiles.NewProvider(
24+
finder,
25+
mojangProfilesProvider,
26+
)
2727
}

internal/mojang/batch_uuids_provider.go

Lines changed: 62 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,9 @@ import (
66
"sync"
77
"time"
88

9-
"github.com/SentimensRG/ctx/mergectx"
9+
"go.opentelemetry.io/otel"
10+
"go.opentelemetry.io/otel/metric"
11+
"go.uber.org/multierr"
1012

1113
"ely.by/chrly/internal/utils"
1214
)
@@ -23,29 +25,39 @@ type BatchUuidsProvider struct {
2325
fireChan chan any
2426
stopChan chan any
2527
onFirstCall sync.Once
28+
metrics *batchUuidsProviderMetrics
2629
}
2730

2831
func NewBatchUuidsProvider(
2932
endpoint UsernamesToUuidsEndpoint,
3033
batchSize int,
3134
awaitDelay time.Duration,
3235
fireOnFull bool,
33-
) *BatchUuidsProvider {
36+
) (*BatchUuidsProvider, error) {
37+
queue := utils.NewQueue[*job]()
38+
39+
metrics, err := newBatchUuidsProviderMetrics(otel.GetMeterProvider().Meter(ScopeName), queue)
40+
if err != nil {
41+
return nil, err
42+
}
43+
3444
return &BatchUuidsProvider{
3545
UsernamesToUuidsEndpoint: endpoint,
3646
stopChan: make(chan any),
3747
batch: batchSize,
3848
delay: awaitDelay,
3949
fireOnFull: fireOnFull,
40-
queue: utils.NewQueue[*job](),
50+
queue: queue,
4151
fireChan: make(chan any),
42-
}
52+
metrics: metrics,
53+
}, nil
4354
}
4455

4556
type job struct {
46-
Username string
47-
Ctx context.Context
48-
ResultChan chan<- *jobResult
57+
Username string
58+
Ctx context.Context
59+
QueuingTime time.Time
60+
ResultChan chan<- *jobResult
4961
}
5062

5163
type jobResult struct {
@@ -55,7 +67,7 @@ type jobResult struct {
5567

5668
func (p *BatchUuidsProvider) GetUuid(ctx context.Context, username string) (*ProfileInfo, error) {
5769
resultChan := make(chan *jobResult)
58-
n := p.queue.Enqueue(&job{username, ctx, resultChan})
70+
n := p.queue.Enqueue(&job{username, ctx, time.Now(), resultChan})
5971
if p.fireOnFull && n%p.batch == 0 {
6072
p.fireChan <- struct{}{}
6173
}
@@ -92,11 +104,14 @@ func (p *BatchUuidsProvider) startQueue() {
92104
}
93105

94106
func (p *BatchUuidsProvider) fireRequest() {
107+
// Since this method is an aggregator, it uses its own context to manage its lifetime
108+
reqCtx := context.Background()
95109
jobs := make([]*job, 0, p.batch)
96110
n := p.batch
97111
for {
98112
foundJobs, left := p.queue.Dequeue(n)
99113
for i := range foundJobs {
114+
p.metrics.QueueTime.Record(reqCtx, float64(time.Since(foundJobs[i].QueuingTime)))
100115
if foundJobs[i].Ctx.Err() != nil {
101116
// If the job context has already ended, its result will be returned in the GetUuid method
102117
close(foundJobs[i].ResultChan)
@@ -119,14 +134,14 @@ func (p *BatchUuidsProvider) fireRequest() {
119134
return
120135
}
121136

122-
ctx := context.Background()
123137
usernames := make([]string, len(jobs))
124138
for i, job := range jobs {
125139
usernames[i] = job.Username
126-
ctx = mergectx.Join(ctx, job.Ctx)
127140
}
128141

129-
profiles, err := p.UsernamesToUuidsEndpoint(ctx, usernames)
142+
p.metrics.BatchSize.Record(reqCtx, int64(len(usernames)))
143+
144+
profiles, err := p.UsernamesToUuidsEndpoint(reqCtx, usernames)
130145
for _, job := range jobs {
131146
response := &jobResult{}
132147
if err == nil {
@@ -145,3 +160,39 @@ func (p *BatchUuidsProvider) fireRequest() {
145160
close(job.ResultChan)
146161
}
147162
}
163+
164+
func newBatchUuidsProviderMetrics(meter metric.Meter, queue *utils.Queue[*job]) (*batchUuidsProviderMetrics, error) {
165+
m := &batchUuidsProviderMetrics{}
166+
var errors, err error
167+
168+
m.QueueLength, err = meter.Int64ObservableGauge(
169+
"queue.length", // TODO: look for better naming
170+
metric.WithDescription(""), // TODO: description
171+
metric.WithInt64Callback(func(_ context.Context, o metric.Int64Observer) error {
172+
o.Observe(int64(queue.Len()))
173+
return nil
174+
}),
175+
)
176+
errors = multierr.Append(errors, err)
177+
178+
m.QueueTime, err = meter.Float64Histogram(
179+
"queue.duration",
180+
metric.WithDescription(""), // TODO: description
181+
metric.WithUnit("ms"),
182+
)
183+
184+
m.BatchSize, err = meter.Int64Histogram(
185+
"batch.size",
186+
metric.WithDescription(""), // TODO: write description
187+
metric.WithUnit("1"),
188+
)
189+
errors = multierr.Append(errors, err)
190+
191+
return m, errors
192+
}
193+
194+
type batchUuidsProviderMetrics struct {
195+
QueueLength metric.Int64ObservableGauge
196+
QueueTime metric.Float64Histogram
197+
BatchSize metric.Int64Histogram
198+
}

internal/mojang/batch_uuids_provider_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ type batchUuidsProviderTestSuite struct {
4141

4242
func (s *batchUuidsProviderTestSuite) SetupTest() {
4343
s.MojangApi = &mojangUsernamesToUuidsRequestMock{}
44-
s.Provider = NewBatchUuidsProvider(
44+
s.Provider, _ = NewBatchUuidsProvider(
4545
s.MojangApi.UsernamesToUuids,
4646
3,
4747
awaitDelay,

internal/mojang/client.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@ func (c *MojangApi) UsernamesToUuids(ctx context.Context, usernames []string) ([
7777
// Obtains textures information for provided uuid
7878
// See https://wiki.vg/Mojang_API#UUID_-.3E_Profile_.2B_Skin.2FCape
7979
func (c *MojangApi) UuidToTextures(ctx context.Context, uuid string, signed bool) (*ProfileResponse, error) {
80+
// TODO: normalize request url for tracing
8081
normalizedUuid := strings.ReplaceAll(uuid, "-", "")
8182
url := c.profileUrl + normalizedUuid
8283
if signed {

0 commit comments

Comments
 (0)