Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions services/auth/go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ require (
github.com/golang-jwt/jwt v3.2.2+incompatible
github.com/gomodule/redigo v1.9.2
github.com/grpc-ecosystem/grpc-gateway/v2 v2.21.0
github.com/grpc-ecosystem/grpc-opentracing v0.0.0-20180507213350-8e809c8a8645
github.com/jackc/pgx/v4 v4.18.3
github.com/joho/godotenv v1.5.1
github.com/natefinch/lumberjack v2.0.0+incompatible
Expand All @@ -36,13 +37,15 @@ require (
github.com/rakyll/statik v0.1.7
github.com/rs/cors v1.11.0
github.com/stretchr/testify v1.9.0
github.com/uber/jaeger-client-go v2.30.0+incompatible
go.uber.org/zap v1.27.0
golang.org/x/crypto v0.24.0
google.golang.org/grpc v1.65.0
google.golang.org/protobuf v1.34.2
)

require (
github.com/HdrHistogram/hdrhistogram-go v1.1.2 // indirect
github.com/beorn7/perks v1.0.1 // indirect
github.com/cespare/xxhash/v2 v2.3.0 // indirect
github.com/davecgh/go-spew v1.1.1 // indirect
Expand Down Expand Up @@ -72,13 +75,16 @@ require (
github.com/lann/builder v0.0.0-20180802200727-47ae307949d0 // indirect
github.com/lann/ps v0.0.0-20150810152359-62de8c46ede0 // indirect
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
github.com/opentracing/opentracing-go v1.2.0 // indirect
github.com/pierrec/lz4/v4 v4.1.21 // indirect
github.com/pmezard/go-difflib v1.0.0 // indirect
github.com/prometheus/client_model v0.6.1 // indirect
github.com/prometheus/common v0.55.0 // indirect
github.com/prometheus/procfs v0.15.1 // indirect
github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 // indirect
github.com/rogpeppe/go-internal v1.12.0 // indirect
github.com/uber/jaeger-lib v2.4.1+incompatible // indirect
go.uber.org/atomic v1.6.0 // indirect
go.uber.org/multierr v1.10.0 // indirect
golang.org/x/net v0.26.0 // indirect
golang.org/x/sys v0.22.0 // indirect
Expand Down
46 changes: 46 additions & 0 deletions services/auth/go.sum

Large diffs are not rendered by default.

14 changes: 14 additions & 0 deletions services/auth/internal/app/app.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,9 @@ import (
"sync"
"time"

"github.com/grpc-ecosystem/grpc-opentracing/go/otgrpc"
"github.com/natefinch/lumberjack"
"github.com/opentracing/opentracing-go"
"github.com/prometheus/client_golang/prometheus/promhttp"
"github.com/rs/cors"
"go.uber.org/zap"
Expand All @@ -20,6 +22,7 @@ import (

"github.com/Genvekt/cli-chat/libraries/logger/pkg/logger"
"github.com/Genvekt/cli-chat/services/auth/internal/metric"
"github.com/Genvekt/cli-chat/services/auth/internal/tracing"

"github.com/rakyll/statik/fs"

Expand Down Expand Up @@ -67,6 +70,7 @@ func (a *App) initDeps(ctx context.Context) error {
a.initLogger,
a.initMetrics,
a.initServiceProvider,
a.initJaegerTracing,
a.initGRPCServer,
a.initHTTPServer,
a.initSwaggerServer,
Expand Down Expand Up @@ -116,6 +120,15 @@ func (a *App) initMetrics(ctx context.Context) error {
return nil
}

func (a *App) initJaegerTracing(_ context.Context) error {
err := tracing.Init(a.provider.JaegerConfig())
if err != nil {
return err
}

return nil
}

func (a *App) initServiceProvider(_ context.Context) error {
a.provider = newServiceProvider()

Expand All @@ -138,6 +151,7 @@ func (a *App) initGRPCServer(ctx context.Context) error {
a.grpcServer = grpc.NewServer(
grpc.Creds(creds),
grpc.ChainUnaryInterceptor(
otgrpc.OpenTracingServerInterceptor(opentracing.GlobalTracer()),
interceptor.LogInterceptor,
interceptor.MetricsInterceptor,
interceptor.ValidateInterceptor,
Expand Down
14 changes: 14 additions & 0 deletions services/auth/internal/app/service_provider.go
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@ type ServiceProvider struct {
prometheusConfig config.HTTPConfig
postgresConfig config.PostgresConfig
redisConfig cacheConfig.RedisConfig
jaegerConfig config.JaegerTracingConfig
userServiceConfig config.UserServiceConfig

refreshTokenConfig config.TokenProviderConfig
Expand Down Expand Up @@ -200,6 +201,19 @@ func (s *ServiceProvider) RefreshTokenConfig() config.TokenProviderConfig {
return s.refreshTokenConfig
}

// JaegerConfig provides configuration parameters for jaeger
func (s *ServiceProvider) JaegerConfig() config.JaegerTracingConfig {
if s.jaegerConfig == nil {
cfg, err := env.NewJaegerTracingConfigEnv()
if err != nil {
logger.Fatal("failed to load jaeger tracing config", zap.Error(err))
}
s.jaegerConfig = cfg
}

return s.jaegerConfig
}

// RefreshTokenProvider provides refresh token
func (s *ServiceProvider) RefreshTokenProvider() utils.TokenProvider {
if s.refreshTokenProvider == nil {
Expand Down
8 changes: 8 additions & 0 deletions services/auth/internal/config/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -64,3 +64,11 @@ type TokenProviderConfig interface {
Secret() []byte
TTL() time.Duration
}

// JaegerTracingConfig provides envs related to jaeger
type JaegerTracingConfig interface {
ServiceName() string
SamplerType() string
SamplerParam() float64
AgentAddress() string
}
69 changes: 69 additions & 0 deletions services/auth/internal/config/env/jaeger_tracing.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
package env

import (
"fmt"
"os"
"strconv"
)

const (
serviceNameEnv = "JAEGER_SERVICE_NAME"

// use jaeger default envs
samplerTypeEnv = "JAEGER_SAMPLER_TYPE"
samplerParamEnv = "JAEGER_SAMPLER_PARAM"
agentAddressEnv = "JAEGER_AGENT_HOST"
)

type jaegerTracingConfigEnv struct {
serviceName string
samplerType string
samplerParam float64
agentAddress string
}

// NewJaegerTracingConfigEnv retrieves jaeger configuration form env
func NewJaegerTracingConfigEnv() (*jaegerTracingConfigEnv, error) {
serviceName := os.Getenv(serviceNameEnv)
if serviceName == "" {
return nil, fmt.Errorf("environment variable %q not defined", serviceNameEnv)
}

samplerType := os.Getenv(samplerTypeEnv)
if samplerType == "" {
return nil, fmt.Errorf("environment variable %q not defined", samplerTypeEnv)
}

samplerParam, err := strconv.ParseFloat(os.Getenv(samplerParamEnv), 64)
if err != nil {
return nil, fmt.Errorf("environment variable %q not defined, float expected", samplerParamEnv)
}

agentAddress := os.Getenv(agentAddressEnv)
if agentAddress == "" {
return nil, fmt.Errorf("environment variable %q not defined", agentAddressEnv)
}

return &jaegerTracingConfigEnv{
serviceName: serviceName,
samplerType: samplerType,
samplerParam: samplerParam,
agentAddress: agentAddress,
}, nil
}

func (j *jaegerTracingConfigEnv) ServiceName() string {
return j.serviceName
}

func (j *jaegerTracingConfigEnv) SamplerType() string {
return j.samplerType
}

func (j *jaegerTracingConfigEnv) SamplerParam() float64 {
return j.samplerParam
}

func (j *jaegerTracingConfigEnv) AgentAddress() string {
return j.agentAddress
}
4 changes: 4 additions & 0 deletions services/auth/internal/repository/access/pg/postgres.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import (

sq "github.com/Masterminds/squirrel"
"github.com/jackc/pgx/v4"
"github.com/opentracing/opentracing-go"

"github.com/Genvekt/cli-chat/libraries/db_client/pkg/db"
"github.com/Genvekt/cli-chat/services/auth/internal/model"
Expand Down Expand Up @@ -40,6 +41,9 @@ func (r *accessRepositoryPostgres) GetEndpointAccessRule(
ctx context.Context,
endpoint string,
) (*model.EndpointAccessRule, error) {
span, ctx := opentracing.StartSpanFromContext(ctx, "query endpoint access rule")
defer span.Finish()

builderSelectOne := sq.Select(roleColumn, endpointColumn).
From(roleAccessRuleTable).
PlaceholderFormat(sq.Dollar).
Expand Down
5 changes: 5 additions & 0 deletions services/auth/internal/service/access/check.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,17 @@ import (
"errors"
"fmt"

"github.com/opentracing/opentracing-go"

"github.com/Genvekt/cli-chat/services/auth/internal/model"
"github.com/Genvekt/cli-chat/services/auth/internal/repository"
)

// Check validates access permissions for endpoint
func (s *accessService) Check(ctx context.Context, accessToken string, endpoint string) (bool, error) {
span, ctx := opentracing.StartSpanFromContext(ctx, "check access")
defer span.Finish()

claims, err := s.accessTokenProvider.Verify(ctx, accessToken)
if err != nil {
return false, fmt.Errorf("access token is invalid")
Expand Down
27 changes: 27 additions & 0 deletions services/auth/internal/tracing/tracing.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package tracing

import (
jaegerCfg "github.com/uber/jaeger-client-go/config"

"github.com/Genvekt/cli-chat/services/auth/internal/config"
)

// Init initialises jaeger tracer
func Init(cfg config.JaegerTracingConfig) error {
tracingCfg := jaegerCfg.Configuration{
Sampler: &jaegerCfg.SamplerConfig{
Type: cfg.SamplerType(),
Param: cfg.SamplerParam(),
},
Reporter: &jaegerCfg.ReporterConfig{
LocalAgentHostPort: cfg.AgentAddress(),
},
}

_, err := tracingCfg.InitGlobalTracer(cfg.ServiceName())
if err != nil {
return err
}

return nil
}
12 changes: 10 additions & 2 deletions services/auth/internal/utils/token/token.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@ import (
"fmt"
"time"

"github.com/opentracing/opentracing-go"

"github.com/Genvekt/cli-chat/services/auth/internal/config"
"github.com/Genvekt/cli-chat/services/auth/internal/model"
"github.com/Genvekt/cli-chat/services/auth/internal/utils"
Expand All @@ -28,7 +30,10 @@ func NewTokenProvider(conf config.TokenProviderConfig) *tokenProvider {
}

// Generate creates new token for user
func (t *tokenProvider) Generate(_ context.Context, user *model.User) (string, error) {
func (t *tokenProvider) Generate(ctx context.Context, user *model.User) (string, error) {
span, _ := opentracing.StartSpanFromContext(ctx, "generate token")
defer span.Finish()

claims := &model.UserClaims{
StandardClaims: jwt.StandardClaims{
ExpiresAt: time.Now().Add(t.ttl).Unix(),
Expand All @@ -43,7 +48,10 @@ func (t *tokenProvider) Generate(_ context.Context, user *model.User) (string, e
}

// Verify checks tha token was generated by this instance
func (t *tokenProvider) Verify(_ context.Context, token string) (*model.UserClaims, error) {
func (t *tokenProvider) Verify(ctx context.Context, token string) (*model.UserClaims, error) {
span, _ := opentracing.StartSpanFromContext(ctx, "verify token")
defer span.Finish()

jwtToken, err := jwt.ParseWithClaims(token, &model.UserClaims{}, func(token *jwt.Token) (interface{}, error) {
_, ok := token.Method.(*jwt.SigningMethodHMAC)
if !ok {
Expand Down
6 changes: 6 additions & 0 deletions services/chat_server/go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -18,16 +18,20 @@ require (
github.com/Masterminds/squirrel v1.5.4
github.com/brianvoe/gofakeit/v7 v7.0.4
github.com/gojuno/minimock/v3 v3.3.13
github.com/grpc-ecosystem/grpc-opentracing v0.0.0-20180507213350-8e809c8a8645
github.com/jackc/pgx/v4 v4.18.3
github.com/joho/godotenv v1.5.1
github.com/natefinch/lumberjack v2.0.0+incompatible
github.com/opentracing/opentracing-go v1.2.0
github.com/stretchr/testify v1.8.4
github.com/uber/jaeger-client-go v2.30.0+incompatible
go.uber.org/zap v1.27.0
google.golang.org/grpc v1.65.0
google.golang.org/protobuf v1.34.2
)

require (
github.com/HdrHistogram/hdrhistogram-go v1.1.2 // indirect
github.com/davecgh/go-spew v1.1.1 // indirect
github.com/envoyproxy/protoc-gen-validate v1.0.4 // indirect
github.com/georgysavva/scany v1.2.2 // indirect
Expand All @@ -45,6 +49,8 @@ require (
github.com/pkg/errors v0.9.1 // indirect
github.com/pmezard/go-difflib v1.0.0 // indirect
github.com/rogpeppe/go-internal v1.12.0 // indirect
github.com/uber/jaeger-lib v2.4.1+incompatible // indirect
go.uber.org/atomic v1.6.0 // indirect
go.uber.org/multierr v1.10.0 // indirect
golang.org/x/crypto v0.24.0 // indirect
golang.org/x/net v0.26.0 // indirect
Expand Down
Loading