From da14cbfbb6ccfc5e154b3e8c73563611f765517c Mon Sep 17 00:00:00 2001 From: "Luka(najjaci)" Date: Sat, 7 Feb 2026 10:36:45 +0100 Subject: [PATCH 1/2] tracing --- app.go | 23 +++++++--- configs/config.go | 20 +++++--- configs/tracing/config.go | 26 +++++++++++ go.mod | 33 +++++++++---- go.sum | 89 +++++++++++++++++++++++++++--------- main.go | 6 ++- repository/user_repo_impl.go | 10 ++++ server/auth_server.go | 4 +- service/auth_service.go | 23 ++++++++-- tracing.go | 45 ++++++++++++++++++ vault/vault_client.go | 61 ++++++++++++++++-------- 11 files changed, 267 insertions(+), 73 deletions(-) create mode 100644 configs/tracing/config.go create mode 100644 tracing.go diff --git a/app.go b/app.go index 18b5804..fbe8054 100644 --- a/app.go +++ b/app.go @@ -16,6 +16,7 @@ import ( "net" "sync" + "go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc" "google.golang.org/grpc" "google.golang.org/grpc/reflection" ) @@ -43,8 +44,14 @@ func NewAppWithConfig(config configs.Config) (*app, error) { }, nil } -func (a *app) Start() error { - a.init() +func (a *app) Start(ctx context.Context) error { + shutdownTracing := initTracing( + "apollo", + a.config.Tracing().Endpoint(), + ) + a.shutdownProcesses = append(a.shutdownProcesses, shutdownTracing) + + a.init(ctx) return a.startGrpcServer() } @@ -76,13 +83,13 @@ func (a *app) GracefulStop(ctx context.Context) { } } -func (a *app) init() { +func (a *app) init(ctx context.Context) { manager := db.NewScyllaManager() a.cm = manager a.initUserRepo(a.cm) - a.initVaultClientService() + a.initVaultClientService(ctx) a.initAuthService() a.initAuthServiceServer() @@ -94,7 +101,9 @@ func (a *app) initGrpcServer() { if a.authServiceServer == nil { log.Fatalln("eval grpc server is nil") } - s := grpc.NewServer() + s := grpc.NewServer( + grpc.StatsHandler(otelgrpc.NewServerHandler()), + ) proto1.RegisterAuthServiceServer(s, a.authServiceServer) reflection.Register(s) a.grpcServer = s @@ -111,8 +120,8 @@ func (a *app) initAuthServiceServer() { a.authServiceServer = server } -func (a *app) initVaultClientService() { - vaultService, err := vault.NewVaultClientService() +func (a *app) initVaultClientService(ctx context.Context) { + vaultService, err := vault.NewVaultClientService(ctx) if err != nil { log.Fatalln(err) } diff --git a/configs/config.go b/configs/config.go index e983a77..6477467 100644 --- a/configs/config.go +++ b/configs/config.go @@ -1,24 +1,28 @@ package configs import ( - "apollo/configs/server" "apollo/configs/nats" + "apollo/configs/server" + "apollo/configs/tracing" ) type Config interface { Server() server.Config - Nats() nats.Config + Nats() nats.Config + Tracing() tracing.Config } type config struct { - server server.Config - nats nats.Config + server server.Config + nats nats.Config + tracing tracing.Config } func NewConfig() (Config, error) { return &config{ - server: server.NewConfig(), - nats: nats.NewConfig(), + server: server.NewConfig(), + nats: nats.NewConfig(), + tracing: tracing.NewConfig(), }, nil } @@ -29,3 +33,7 @@ func (c config) Server() server.Config { func (c config) Nats() nats.Config { return c.nats } + +func (c config) Tracing() tracing.Config { + return c.tracing +} diff --git a/configs/tracing/config.go b/configs/tracing/config.go new file mode 100644 index 0000000..09a0ee2 --- /dev/null +++ b/configs/tracing/config.go @@ -0,0 +1,26 @@ +package tracing + +import ( + "fmt" + "os" +) + +type Config interface { + Endpoint() string +} + +type config struct { + jaegerHost string + jaegerGRPCPort string +} + +func NewConfig() Config { + return config{ + jaegerHost: os.Getenv("JAEGER_HOST"), + jaegerGRPCPort: os.Getenv("JAEGER_GRPC_PORT"), + } +} + +func (c config) Endpoint() string { + return fmt.Sprintf("%s:%s", c.jaegerHost, c.jaegerGRPCPort) +} diff --git a/go.mod b/go.mod index 06111a0..1f45d76 100644 --- a/go.mod +++ b/go.mod @@ -1,15 +1,18 @@ module apollo -go 1.21.3 +go 1.24.0 require ( github.com/c12s/oort v1.0.0 github.com/gocql/gocql v1.6.0 github.com/hashicorp/vault-client-go v0.4.2 - github.com/neo4j/neo4j-go-driver/v4 v4.4.1 github.com/scylladb/gocqlx/v3 v3.0.1 - google.golang.org/grpc v1.65.0 - google.golang.org/protobuf v1.34.1 + go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.65.0 + go.opentelemetry.io/otel v1.40.0 + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.40.0 + go.opentelemetry.io/otel/sdk v1.40.0 + google.golang.org/grpc v1.78.0 + google.golang.org/protobuf v1.36.11 ) require ( @@ -34,15 +37,27 @@ require ( github.com/nats-io/nats.go v1.31.0 // indirect github.com/nats-io/nkeys v0.4.5 // indirect github.com/nats-io/nuid v1.0.1 // indirect - golang.org/x/crypto v0.23.0 // indirect + golang.org/x/crypto v0.47.0 // indirect ) require ( + github.com/cenkalti/backoff/v5 v5.0.3 // indirect + github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/go-logr/logr v1.4.3 // indirect + github.com/go-logr/stdr v1.2.2 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.7 // indirect github.com/scylladb/go-reflectx v1.0.1 // indirect - golang.org/x/net v0.25.0 // indirect - golang.org/x/sys v0.20.0 // indirect - golang.org/x/text v0.15.0 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240528184218-531527333157 // indirect + go.opentelemetry.io/auto/sdk v1.2.1 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.40.0 // indirect + go.opentelemetry.io/otel/metric v1.40.0 // indirect + go.opentelemetry.io/otel/trace v1.40.0 // indirect + go.opentelemetry.io/proto/otlp v1.9.0 // indirect + golang.org/x/net v0.49.0 // indirect + golang.org/x/sys v0.40.0 // indirect + golang.org/x/text v0.33.0 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20260128011058-8636f8732409 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20260128011058-8636f8732409 // indirect ) replace github.com/c12s/oort => ../oort diff --git a/go.sum b/go.sum index 67616f0..d6b014a 100644 --- a/go.sum +++ b/go.sum @@ -2,19 +2,34 @@ github.com/bitly/go-hostpool v0.0.0-20171023180738-a3a6125de932 h1:mXoPYz/Ul5HYE github.com/bitly/go-hostpool v0.0.0-20171023180738-a3a6125de932/go.mod h1:NOuUCSz6Q9T7+igc/hlvDOUdtWKryOrtFyIVABv/p7k= github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869 h1:DDGfHa7BWjL4YnC6+E63dPcxHo2sUxDIu8g3QgEJdRY= github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4= +github.com/cenkalti/backoff/v5 v5.0.3 h1:ZN+IMa753KfX5hd8vVaMixjnqRZ3y8CuJKRKj1xcsSM= +github.com/cenkalti/backoff/v5 v5.0.3/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw= +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/fatih/color v1.7.0 h1:DkWD4oS2D8LGGgTQ6IvwJJXSL5Vp2ffcQg58nFV38Ys= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= +github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +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/golang-jwt/jwt/v5 v5.2.1 h1:OuVbFODueb089Lh128TAcimifWaLhJwVflnrgM17wHk= github.com/golang-jwt/jwt/v5 v5.2.1/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= -github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= +github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.7 h1:X+2YciYSxvMQK0UZ7sg45ZVabVZBeBuvMkmuI2V3Fak= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.7/go.mod h1:lW34nIZuQ8UDPdkon5fmfp2l3+ZkQ2me/+oecHYLOII= github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed h1:5upAirOpQc1Q53c0bnx2ufif5kANL7bfZWcc6VJWJd8= github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed/go.mod h1:tMWxXQ9wFIaZeTI9F+hmhFiGpFmhOHzyShyFUhRm0H4= github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= @@ -33,11 +48,13 @@ github.com/hashicorp/vault-client-go v0.4.2 h1:XeUXb5jnDuCUhC8HRpkdGPLh1XtzXmiOn github.com/hashicorp/vault-client-go v0.4.2/go.mod h1:4tDw7Uhq5XOxS1fO+oMtotHL7j4sB9cp0T7U6m4FzDY= github.com/klauspost/compress v1.17.0 h1:Rnbp4K9EjcDuVuHtd0dgA4qNuv9yKDYKK1ulpJwgrqM= github.com/klauspost/compress v1.17.0/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= -github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-colorable v0.1.6 h1:6Su7aK7lXmJ/U79bYtBjLNaha4Fs1Rg9plHpcH+vvnE= github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= @@ -55,6 +72,8 @@ github.com/nats-io/nuid v1.0.1 h1:5iA8DT8V7q8WK2EScv2padNa/rTESc1KdnPw4TC2paw= github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= +github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= github.com/ryanuber/go-glob v1.0.0 h1:iQh3xXAumdQ+4Ufa5b25cRpC5TYKlno6hsv6Cb3pkBk= github.com/ryanuber/go-glob v1.0.0/go.mod h1:807d1WSdnB0XRJzKNil9Om6lcp/3a0v4qIHxIXzX/Yc= github.com/scylladb/go-reflectx v1.0.1 h1:b917wZM7189pZdlND9PbIJ6NQxfDPfBvUaQ7cjj1iZQ= @@ -66,31 +85,57 @@ github.com/scylladb/gocqlx/v3 v3.0.1/go.mod h1:EjbSZM0VR2a57ZUxCRQ3v3CSoWIkH1WTM github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk= -github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -golang.org/x/crypto v0.23.0 h1:dIJU/v2J8Mdglj/8rJ6UUOM3Zc9zLZxVZwwxMooUSAI= -golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= -golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= -golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= -golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= -golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= +go.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ64= +go.opentelemetry.io/auto/sdk v1.2.1/go.mod h1:KRTj+aOaElaLi+wW1kO/DZRXwkF4C5xPbEe3ZiIhN7Y= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.65.0 h1:XmiuHzgJt067+a6kwyAzkhXooYVv3/TOw9cM2VfJgUM= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.65.0/go.mod h1:KDgtbWKTQs4bM+VPUr6WlL9m/WXcmkCcBlIzqxPGzmI= +go.opentelemetry.io/otel v1.40.0 h1:oA5YeOcpRTXq6NN7frwmwFR0Cn3RhTVZvXsP4duvCms= +go.opentelemetry.io/otel v1.40.0/go.mod h1:IMb+uXZUKkMXdPddhwAHm6UfOwJyh4ct1ybIlV14J0g= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.40.0 h1:QKdN8ly8zEMrByybbQgv8cWBcdAarwmIPZ6FThrWXJs= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.40.0/go.mod h1:bTdK1nhqF76qiPoCCdyFIV+N/sRHYXYCTQc+3VCi3MI= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.40.0 h1:DvJDOPmSWQHWywQS6lKL+pb8s3gBLOZUtw4N+mavW1I= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.40.0/go.mod h1:EtekO9DEJb4/jRyN4v4Qjc2yA7AtfCBuz2FynRUWTXs= +go.opentelemetry.io/otel/metric v1.40.0 h1:rcZe317KPftE2rstWIBitCdVp89A2HqjkxR3c11+p9g= +go.opentelemetry.io/otel/metric v1.40.0/go.mod h1:ib/crwQH7N3r5kfiBZQbwrTge743UDc7DTFVZrrXnqc= +go.opentelemetry.io/otel/sdk v1.40.0 h1:KHW/jUzgo6wsPh9At46+h4upjtccTmuZCFAc9OJ71f8= +go.opentelemetry.io/otel/sdk v1.40.0/go.mod h1:Ph7EFdYvxq72Y8Li9q8KebuYUr2KoeyHx0DRMKrYBUE= +go.opentelemetry.io/otel/sdk/metric v1.40.0 h1:mtmdVqgQkeRxHgRv4qhyJduP3fYJRMX4AtAlbuWdCYw= +go.opentelemetry.io/otel/sdk/metric v1.40.0/go.mod h1:4Z2bGMf0KSK3uRjlczMOeMhKU2rhUqdWNoKcYrtcBPg= +go.opentelemetry.io/otel/trace v1.40.0 h1:WA4etStDttCSYuhwvEa8OP8I5EWu24lkOzp+ZYblVjw= +go.opentelemetry.io/otel/trace v1.40.0/go.mod h1:zeAhriXecNGP/s2SEG3+Y8X9ujcJOTqQ5RgdEJcawiA= +go.opentelemetry.io/proto/otlp v1.9.0 h1:l706jCMITVouPOqEnii2fIAuO3IVGBRPV5ICjceRb/A= +go.opentelemetry.io/proto/otlp v1.9.0/go.mod h1:xE+Cx5E/eEHw+ISFkwPLwCZefwVjY+pqKg1qcK03+/4= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= +golang.org/x/crypto v0.47.0 h1:V6e3FRj+n4dbpw86FJ8Fv7XVOql7TEwpHapKoMJ/GO8= +golang.org/x/crypto v0.47.0/go.mod h1:ff3Y9VzzKbwSSEzWqJsJVBnWmRwRSHt/6Op5n9bQc4A= +golang.org/x/net v0.49.0 h1:eeHFmOGUTtaaPSGNmjBKpbng9MulQsJURQUAfUwY++o= +golang.org/x/net v0.49.0/go.mod h1:/ysNB2EvaqvesRkuLAyjI1ycPZlQHM3q01F02UY/MV8= +golang.org/x/sync v0.19.0 h1:vV+1eWNmZ5geRlYjzm2adRgW2/mcpevXNg50YZtPCE4= +golang.org/x/sync v0.19.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= -golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= -golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/sys v0.40.0 h1:DBZZqJ2Rkml6QMQsZywtnjnnGvHza6BTfYFWY9kjEWQ= +golang.org/x/sys v0.40.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/text v0.33.0 h1:B3njUFyqtHDUI5jMn1YIr5B0IE2U0qck04r6d4KPAxE= +golang.org/x/text v0.33.0/go.mod h1:LuMebE6+rBincTi9+xWTY8TztLzKHc/9C1uBCG27+q8= golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240528184218-531527333157 h1:Zy9XzmMEflZ/MAaA7vNcoebnRAld7FsPW1EeBB7V0m8= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240528184218-531527333157/go.mod h1:EfXuqaE1J41VCDicxHzUDm+8rk+7ZdXzHV0IhO/I6s0= -google.golang.org/grpc v1.65.0 h1:bs/cUb4lp1G5iImFFd3u5ixQzweKizoZJAwBNLR42lc= -google.golang.org/grpc v1.65.0/go.mod h1:WgYC2ypjlB0EiQi6wdKixMqukr6lBc0Vo+oOgjrM5ZQ= -google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= -google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= +gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= +google.golang.org/genproto/googleapis/api v0.0.0-20260128011058-8636f8732409 h1:merA0rdPeUV3YIIfHHcH4qBkiQAc1nfCKSI7lB4cV2M= +google.golang.org/genproto/googleapis/api v0.0.0-20260128011058-8636f8732409/go.mod h1:fl8J1IvUjCilwZzQowmw2b7HQB2eAuYBabMXzWurF+I= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260128011058-8636f8732409 h1:H86B94AW+VfJWDqFeEbBPhEtHzJwJfTbgE2lZa54ZAQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260128011058-8636f8732409/go.mod h1:j9x/tPzZkyxcgEFkiKEEGxfvyumM01BEtsW8xzOahRQ= +google.golang.org/grpc v1.78.0 h1:K1XZG/yGDJnzMdd/uZHAkVqJE+xIDOcmdSFZkBUicNc= +google.golang.org/grpc v1.78.0/go.mod h1:I47qjTo4OKbMkjA/aOOwxDIiPSBofUtQUI5EfpWvW7U= +google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE= +google.golang.org/protobuf v1.36.11/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= diff --git a/main.go b/main.go index 79391ee..4927658 100644 --- a/main.go +++ b/main.go @@ -1,8 +1,8 @@ package main import ( - "context" "apollo/configs" + "context" "log" "os" "os/signal" @@ -20,7 +20,9 @@ func main() { if err != nil { log.Fatalln(err) } - err = app.Start() + + ctx := context.Background() + err = app.Start(ctx) if err != nil { log.Fatalln(err) } diff --git a/repository/user_repo_impl.go b/repository/user_repo_impl.go index 4f49b1f..87499a6 100644 --- a/repository/user_repo_impl.go +++ b/repository/user_repo_impl.go @@ -7,6 +7,8 @@ import ( "context" "errors" "log" + + "go.opentelemetry.io/otel" ) type UserRepo struct { @@ -24,6 +26,10 @@ func NewUserRepo(userHandler *dao.UserHandler, orgHandler *dao.OrgHandler, permH } func (store UserRepo) CreateUser(ctx context.Context, req model.UserDTO) model.RegisterResp { + tracer := otel.Tracer("apollo.UserRepo") + ctx, span := tracer.Start(ctx, "UserRepo.CreateUser") + defer span.End() + user, _ := proto1.UserToModel(&req) _, err := store.orgHandler.FindOrgByName(ctx, req.Org) @@ -76,5 +82,9 @@ func (store UserRepo) CreateUser(ctx context.Context, req model.UserDTO) model.R } func (store UserRepo) LoginUser(ctx context.Context, req model.LoginReq) model.LoginResp { + tracer := otel.Tracer("apollo.UserRepo") + ctx, span := tracer.Start(ctx, "UserRepo.LoginUser") + defer span.End() + return model.LoginResp{Token: "", Error: errors.New("invalid mapping")} } diff --git a/server/auth_server.go b/server/auth_server.go index d5dafea..8ec924b 100644 --- a/server/auth_server.go +++ b/server/auth_server.go @@ -50,7 +50,7 @@ func (o *AuthServiceServer) LoginUser(ctx context.Context, req *proto1.LoginReq) return nil, status.Error(codes.Internal, "Error in login request") } - resp := o.service.LoginUser(*user) + resp := o.service.LoginUser(ctx, *user) if resp.Error != nil { return nil, status.Error(codes.InvalidArgument, "Invalid username and/or password") @@ -66,7 +66,7 @@ func (o *AuthServiceServer) VerifyToken(ctx context.Context, req *proto1.Token) return nil, status.Error(codes.Internal, "Error in token request") } - resp, username := o.service.VerifyToken(*token) + resp, username := o.service.VerifyToken(ctx, *token) if !resp.Verified { return nil, status.Error(codes.Unauthenticated, "Invalid token") diff --git a/service/auth_service.go b/service/auth_service.go index bb0e7c3..0f59f44 100644 --- a/service/auth_service.go +++ b/service/auth_service.go @@ -9,6 +9,7 @@ import ( "log" oort "github.com/c12s/oort/pkg/api" + "go.opentelemetry.io/otel" ) type AuthService struct { @@ -25,6 +26,10 @@ func NewAuthService(repo repository.IUserRepo, v *vault.VaultClientService) (*Au } func (h AuthService) RegisterUser(ctx context.Context, req model.UserDTO) model.RegisterResp { + tracer := otel.Tracer("auth-service") + ctx, span := tracer.Start(ctx, "AuthService.RegisterUser") + defer span.End() + refClient := *h.v registerResp := h.repo.CreateUser(ctx, req) @@ -42,14 +47,18 @@ func (h AuthService) RegisterUser(ctx context.Context, req model.UserDTO) model. registerResp.User.Username, registerResp.User.Permissions) - refClient.RegisterUser(req.Username, req.Password, []string{"org.add"}) + refClient.RegisterUser(ctx, req.Username, req.Password, []string{"org.add"}) return registerResp } -func (h AuthService) LoginUser(req model.LoginReq) model.LoginResp { +func (h AuthService) LoginUser(ctx context.Context, req model.LoginReq) model.LoginResp { + tracer := otel.Tracer("auth-service") + ctx, span := tracer.Start(ctx, "AuthService.LoginUser") + defer span.End() + refClient := *h.v - loginResp := refClient.LoginUser(req) + loginResp := refClient.LoginUser(ctx, req) if loginResp.Error != nil { return loginResp } @@ -60,9 +69,13 @@ func (h AuthService) Autorize(req model.AuthorizationReq) model.AuthorizationRes return model.AuthorizationResp{Authorized: true} } -func (h AuthService) VerifyToken(req model.Token) (model.InternalToken, string) { +func (h AuthService) VerifyToken(ctx context.Context, req model.Token) (model.InternalToken, string) { + tracer := otel.Tracer("auth-service") + ctx, span := tracer.Start(ctx, "AuthService.VerifyToken") + defer span.End() + refClient := *h.v - response := refClient.VerifyToken(req.Token) + response := refClient.VerifyToken(ctx, req.Token) if !response.Verified { return model.InternalToken{Verified: response.Verified, Jwt: ""}, "" diff --git a/tracing.go b/tracing.go new file mode 100644 index 0000000..ee4e388 --- /dev/null +++ b/tracing.go @@ -0,0 +1,45 @@ +package main + +import ( + "context" + "log" + + "go.opentelemetry.io/otel" + "go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc" + "go.opentelemetry.io/otel/propagation" + "go.opentelemetry.io/otel/sdk/resource" + sdktrace "go.opentelemetry.io/otel/sdk/trace" + semconv "go.opentelemetry.io/otel/semconv/v1.21.0" +) + +func initTracing(serviceName, endpoint string) func() { + exp, err := otlptracegrpc.New( + context.Background(), + otlptracegrpc.WithEndpoint(endpoint), + otlptracegrpc.WithInsecure(), + ) + if err != nil { + log.Fatalf("otlp grpc exporter error: %v", err) + } + + tp := sdktrace.NewTracerProvider( + sdktrace.WithBatcher(exp), + sdktrace.WithResource(resource.NewWithAttributes( + semconv.SchemaURL, + semconv.ServiceName(serviceName), + )), + ) + + otel.SetTracerProvider(tp) + + otel.SetTextMapPropagator( + propagation.NewCompositeTextMapPropagator( + propagation.TraceContext{}, + propagation.Baggage{}, + ), + ) + + return func() { + _ = tp.Shutdown(context.Background()) + } +} diff --git a/vault/vault_client.go b/vault/vault_client.go index 7d42556..acba577 100644 --- a/vault/vault_client.go +++ b/vault/vault_client.go @@ -1,10 +1,10 @@ package vault import ( + "apollo/model" "context" "encoding/json" "fmt" - "apollo/model" "io/ioutil" "log" "os" @@ -12,6 +12,7 @@ import ( vault "github.com/hashicorp/vault-client-go" schema "github.com/hashicorp/vault-client-go/schema" + "go.opentelemetry.io/otel" ) type VaultClientService struct { @@ -24,13 +25,13 @@ type VaultKey struct { } // init -func NewVaultClientService() (*VaultClientService, error) { +func NewVaultClientService(ctx context.Context) (*VaultClientService, error) { return &VaultClientService{ - client: initClient(), + client: initClient(ctx), }, nil } -func initClient() *vault.Client { +func initClient(ctx context.Context) *vault.Client { vaultAddress := fmt.Sprintf("http://%s:%s", os.Getenv("VAULT_HOSTNAME"), os.Getenv("VAULT_HTTP_PORT")) @@ -59,12 +60,12 @@ func initClient() *vault.Client { log.Printf("Error while trying to set vault token: %v", err) } - Unseal(client, vaultKey.UnsealKey) + Unseal(ctx, client, vaultKey.UnsealKey) return client } // init - initializedVault := Initialize(client) + initializedVault := Initialize(ctx, client) vaultKey := VaultKey{ RootKey: initializedVault.rootKey, UnsealKey: initializedVault.keysArray[0].(string), @@ -76,15 +77,19 @@ func initClient() *vault.Client { log.Fatal(err) } - Unseal(client, vaultKey.UnsealKey) - MountSecretEngine(client) + Unseal(ctx, client, vaultKey.UnsealKey) + MountSecretEngine(ctx, client) return client } -func (v VaultClientService) RegisterUser(username string, password string, policies []string) { +func (v VaultClientService) RegisterUser(ctx context.Context, username string, password string, policies []string) { + tracer := otel.Tracer("vault-client") + ctx, span := tracer.Start(ctx, "Vault.RegisterUser") + defer span.End() + resp, err := v.client.Auth.UserpassWriteUser( - context.Background(), + ctx, username, schema.UserpassWriteUserRequest{ Password: password, @@ -103,9 +108,13 @@ func (v VaultClientService) RegisterUser(username string, password string, polic } -func (v VaultClientService) LoginUser(req model.LoginReq) model.LoginResp { +func (v VaultClientService) LoginUser(ctx context.Context, req model.LoginReq) model.LoginResp { + tracer := otel.Tracer("vault-client") + ctx, span := tracer.Start(ctx, "Vault.LoginUser") + defer span.End() + resp, err := v.client.Auth.UserpassLogin( - context.Background(), + ctx, req.Username, schema.UserpassLoginRequest{ Password: req.Password, @@ -120,9 +129,9 @@ func (v VaultClientService) LoginUser(req model.LoginReq) model.LoginResp { return model.LoginResp{Token: resp.Auth.ClientToken, Error: nil} } -func (v VaultClientService) VerifyToken(token string) model.VerificationResp { +func (v VaultClientService) VerifyToken(ctx context.Context, token string) model.VerificationResp { resp, err := v.client.Auth.TokenLookUp( - context.Background(), + ctx, schema.TokenLookUpRequest{ Token: token, }, @@ -149,9 +158,13 @@ func (v VaultClientService) VerifyToken(token string) model.VerificationResp { return model.VerificationResp{Verified: !isBefore, Username: username} } -func Initialize(client *vault.Client) VaultClient { +func Initialize(ctx context.Context, client *vault.Client) VaultClient { + tracer := otel.Tracer("vault-client") + ctx, span := tracer.Start(ctx, "Vault.Initialize") + defer span.End() + resp, err := client.System.Initialize( - context.Background(), + ctx, schema.InitializeRequest{ PgpKeys: nil, RootTokenPgpKey: "", @@ -172,9 +185,13 @@ func Initialize(client *vault.Client) VaultClient { return VaultClient{keysArray: keysArray, rootKey: resp.Data["root_token"].(string)} } -func Unseal(client *vault.Client, firstKey string) { +func Unseal(ctx context.Context, client *vault.Client, firstKey string) { + tracer := otel.Tracer("vault-client") + ctx, span := tracer.Start(ctx, "Vault.Unseal") + defer span.End() + _, err := client.System.Unseal( - context.Background(), + ctx, schema.UnsealRequest{ Key: firstKey, // first key in array }, @@ -184,9 +201,13 @@ func Unseal(client *vault.Client, firstKey string) { } } -func MountSecretEngine(client *vault.Client) { +func MountSecretEngine(ctx context.Context, client *vault.Client) { + tracer := otel.Tracer("vault-client") + ctx, span := tracer.Start(ctx, "Vault.MountSecretEngine") + defer span.End() + _, err := client.System.AuthEnableMethod( - context.Background(), + ctx, "userpass", schema.AuthEnableMethodRequest{ Description: "Mount for user identity", From 6a51c94200395f6f40fb729335f76cd68bce66c5 Mon Sep 17 00:00:00 2001 From: "Luka(najjaci)" Date: Tue, 10 Feb 2026 14:42:13 +0100 Subject: [PATCH 2/2] final_modifications --- client/oort_client.go | 16 ++++++++-------- service/auth_service.go | 6 +++--- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/client/oort_client.go b/client/oort_client.go index 0bdd548..0a4e5fc 100644 --- a/client/oort_client.go +++ b/client/oort_client.go @@ -11,7 +11,7 @@ import ( "google.golang.org/grpc/credentials/insecure" ) -func AuthorizeUser(permission string, subjectId string) bool { +func AuthorizeUser(ctx context.Context, permission string, subjectId string) bool { conn, err := grpc.Dial("oort:8000", grpc.WithTransportCredentials(insecure.NewCredentials())) if err != nil { log.Fatal(err) @@ -20,7 +20,7 @@ func AuthorizeUser(permission string, subjectId string) bool { evaluatorClient := oort.NewOortEvaluatorClient(conn) - getResp, err := evaluatorClient.Authorize(context.Background(), &oort.AuthorizationReq{ + getResp, err := evaluatorClient.Authorize(ctx, &oort.AuthorizationReq{ Subject: &oort.Resource{ Id: subjectId, Kind: "user", @@ -40,7 +40,7 @@ func AuthorizeUser(permission string, subjectId string) bool { return getResp.Authorized } -func CreateOrgUserRelationship(org_id string, user_id string) error { +func CreateOrgUserRelationship(ctx context.Context, org_id string, user_id string) error { conn, err := grpc.Dial("oort:8000", grpc.WithTransportCredentials(insecure.NewCredentials())) if err != nil { log.Fatal(err) @@ -51,7 +51,7 @@ func CreateOrgUserRelationship(org_id string, user_id string) error { log.Printf("Org za inherit: " + org_id) log.Printf("User za inherit: " + user_id) - _, err = administratorClient.CreateInheritanceRel(context.TODO(), &oort.CreateInheritanceRelReq{ + _, err = administratorClient.CreateInheritanceRel(ctx, &oort.CreateInheritanceRelReq{ From: &oort.Resource{ Id: org_id, Kind: "org", @@ -68,7 +68,7 @@ func CreateOrgUserRelationship(org_id string, user_id string) error { return nil } -func GetGrantedPermissions(user string) []*oort.GrantedPermission { +func GetGrantedPermissions(ctx context.Context, user string) []*oort.GrantedPermission { conn, err := grpc.Dial("oort:8000", grpc.WithTransportCredentials(insecure.NewCredentials())) if err != nil { log.Fatal(err) @@ -77,7 +77,7 @@ func GetGrantedPermissions(user string) []*oort.GrantedPermission { evaluatorClient := oort.NewOortEvaluatorClient(conn) - resp, err := evaluatorClient.GetGrantedPermissions(context.TODO(), &oort.GetGrantedPermissionsReq{ + resp, err := evaluatorClient.GetGrantedPermissions(ctx, &oort.GetGrantedPermissionsReq{ Subject: &oort.Resource{ Id: user, Kind: "user", @@ -96,7 +96,7 @@ func GetGrantedPermissions(user string) []*oort.GrantedPermission { return resp.Permissions } -func CreatePolicyAsync(org_id string, user string, perms []string) { +func CreatePolicyAsync(ctx context.Context, org_id string, user string, perms []string) { permissions := getPermissionsForOort(perms) administratorAsync, err := oort.NewAdministrationAsyncClient("nats:4222") @@ -107,7 +107,7 @@ func CreatePolicyAsync(org_id string, user string, perms []string) { log.Printf("User za policy: " + user) log.Printf("Org za policy: " + org_id) for _, perm := range permissions { - err := administratorAsync.SendRequest(&oort.CreatePolicyReq{ + err := administratorAsync.SendRequest(ctx, &oort.CreatePolicyReq{ SubjectScope: &oort.Resource{ Id: user, Kind: "user", diff --git a/service/auth_service.go b/service/auth_service.go index 0f59f44..5353215 100644 --- a/service/auth_service.go +++ b/service/auth_service.go @@ -37,13 +37,13 @@ func (h AuthService) RegisterUser(ctx context.Context, req model.UserDTO) model. return registerResp } - err := client.CreateOrgUserRelationship(registerResp.User.Org, registerResp.User.Username) + err := client.CreateOrgUserRelationship(ctx, registerResp.User.Org, registerResp.User.Username) if err != nil { log.Printf("Error while creating inheritance rel: %v", err) return model.RegisterResp{User: model.UserDTO{}, Error: err} } - client.CreatePolicyAsync(registerResp.User.Org, + client.CreatePolicyAsync(ctx, registerResp.User.Org, registerResp.User.Username, registerResp.User.Permissions) @@ -82,7 +82,7 @@ func (h AuthService) VerifyToken(ctx context.Context, req model.Token) (model.In } // proveriti da li ima nekih promena na oort-u - permissions := client.GetGrantedPermissions(response.Username) + permissions := client.GetGrantedPermissions(ctx, response.Username) // create jwt with permissions inside token, err := CreateToken(response.Username, transformPermissions(response.Username, permissions))