Skip to content

Commit

Permalink
refactor: segment config into app and log
Browse files Browse the repository at this point in the history
  • Loading branch information
pyadav committed Feb 14, 2024
1 parent 08dcbfd commit 3c4c305
Show file tree
Hide file tree
Showing 13 changed files with 65 additions and 61 deletions.
5 changes: 5 additions & 0 deletions common/logger/config.go
@@ -0,0 +1,5 @@
package logger

type Config struct {
Json bool `yaml:"json" json:"json,omitempty" mapstructure:"json" default:"false"`
}
27 changes: 24 additions & 3 deletions gateway/cmd/serve.go
Expand Up @@ -2,21 +2,42 @@ package cmd

import (
"context"
"fmt"
"os"
"os/signal"
"syscall"

"github.com/missingstudio/studio/backend/config"
"github.com/missingstudio/studio/backend/internal/api"
"github.com/missingstudio/studio/backend/internal/ingester"
"github.com/missingstudio/studio/backend/internal/ratelimiter"
"github.com/missingstudio/studio/backend/internal/server"
"github.com/missingstudio/studio/common/logger"
"github.com/redis/go-redis/v9"
)

func Serve(cfg *config.Config) error {
logger := logger.New(cfg.LogFormatJson, nil)

ctx, cancelFunc := signal.NotifyContext(context.Background(), syscall.SIGTERM, syscall.SIGINT)
defer cancelFunc()

if err := server.Serve(ctx, logger, cfg); err != nil {
logger := logger.New(cfg.Log.Json, nil)
rdb := redis.NewClient(&redis.Options{
Addr: fmt.Sprintf("%s:%d", cfg.Redis.Host, cfg.Redis.Port),
Username: cfg.Redis.Username,
Password: cfg.Redis.Password,
})

_, err := rdb.Ping(ctx).Result()
if err != nil {
logger.Warn("failed to init redis connection")
os.Exit(1)
}

rl := ratelimiter.NewRateLimiter(cfg.Ratelimiter, logger, cfg.Ratelimiter.Type, rdb)
ingester := ingester.GetIngesterWithDefault(ctx, cfg.Ingester, logger)
deps := api.NewDeps(ingester, rl)

if err := server.Serve(ctx, logger, cfg.App, deps); err != nil {
logger.Error("error starting server", "error", err)
return err
}
Expand Down
14 changes: 8 additions & 6 deletions gateway/config/config.go
Expand Up @@ -7,16 +7,18 @@ import (

"github.com/missingstudio/studio/backend/internal/ingester"
"github.com/missingstudio/studio/backend/internal/ratelimiter"
"github.com/missingstudio/studio/backend/internal/server"

"github.com/missingstudio/studio/common/config"
"github.com/missingstudio/studio/common/logger"
)

type Config struct {
Host string `yaml:"host" json:"host,omitempty" mapstructure:"host" default:"0.0.0.0"`
Port int `yaml:"port" json:"port,omitempty" mapstructure:"port" default:"8080"`
LogFormatJson bool `yaml:"log_format_json" json:"log_format_json,omitempty" mapstructure:"log_format_json" default:"false"`
Ingester ingester.Config `yaml:"ingester" json:"ingester,omitempty" mapstructure:"ingester"`
Redis RedisConfig `yaml:"redis" mapstructure:"redis" json:"redis,omitempty"`
Ratelimiter ratelimiter.Config `yaml:"ratelimiter" mapstructure:"ratelimiter" json:"ratelimiter,omitempty"`
App server.Config `yaml:"app"`
Log logger.Config `yaml:"log"`
Ingester ingester.Config `yaml:"ingester"`
Redis RedisConfig `yaml:"redis"`
Ratelimiter ratelimiter.Config `yaml:"ratelimiter"`
}

type RedisConfig struct {
Expand Down
12 changes: 0 additions & 12 deletions gateway/config/constant.go

This file was deleted.

14 changes: 7 additions & 7 deletions gateway/internal/api/v1/deps.go → gateway/internal/api/deps.go
@@ -1,18 +1,18 @@
package v1
package api

import (
"github.com/missingstudio/studio/backend/internal/ingester"
"github.com/missingstudio/studio/backend/internal/ratelimiter"
)

type Deps struct {
ingester ingester.Ingester
ratelimiter *ratelimiter.RateLimiter
Ingester ingester.Ingester
RateLimiter *ratelimiter.RateLimiter
}

func NewDeps(ingester ingester.Ingester, ratelimiter *ratelimiter.RateLimiter) *Deps {
return &Deps{
ingester: ingester,
ratelimiter: ratelimiter,
func NewDeps(ingester ingester.Ingester, ratelimiter *ratelimiter.RateLimiter) Deps {
return Deps{
Ingester: ingester,
RateLimiter: ratelimiter,
}
}
7 changes: 4 additions & 3 deletions gateway/internal/api/v1/v1.go
Expand Up @@ -8,6 +8,7 @@ import (
"connectrpc.com/otelconnect"
"connectrpc.com/validate"
"connectrpc.com/vanguard"
"github.com/missingstudio/studio/backend/internal/api"
"github.com/missingstudio/studio/backend/internal/ingester"
"github.com/missingstudio/studio/backend/internal/interceptor"
"github.com/missingstudio/studio/protos/pkg/llm/llmv1connect"
Expand All @@ -24,13 +25,13 @@ func NewHandlerV1(ingester ingester.Ingester) *V1Handler {
}
}

func Register(d *Deps) (http.Handler, error) {
func Register(d api.Deps) (http.Handler, error) {
validateInterceptor, err := validate.NewInterceptor()
if err != nil {
return nil, fmt.Errorf("failed to create validate interceptor: %w", err)
}

v1Handler := NewHandlerV1(d.ingester)
v1Handler := NewHandlerV1(d.Ingester)
otelconnectInterceptor, err := otelconnect.NewInterceptor(otelconnect.WithTrustRemote())
if err != nil {
return nil, fmt.Errorf("failed to create validate otel connect: %w", err)
Expand All @@ -40,7 +41,7 @@ func Register(d *Deps) (http.Handler, error) {
stdInterceptors := []connect.Interceptor{
validateInterceptor,
otelconnectInterceptor,
interceptor.RateLimiterInterceptor(d.ratelimiter),
interceptor.RateLimiterInterceptor(d.RateLimiter),
interceptor.ProviderInterceptor(),
interceptor.RetryInterceptor(),
}
Expand Down
3 changes: 2 additions & 1 deletion gateway/internal/connectrpc/mux.go
Expand Up @@ -8,11 +8,12 @@ import (
"connectrpc.com/grpchealth"
"connectrpc.com/grpcreflect"

"github.com/missingstudio/studio/backend/internal/api"
v1 "github.com/missingstudio/studio/backend/internal/api/v1"
"github.com/missingstudio/studio/protos/pkg/llm/llmv1connect"
)

func NewConnectMux(d *v1.Deps) (*http.ServeMux, error) {
func NewConnectMux(d api.Deps) (*http.ServeMux, error) {
mux := http.NewServeMux()

compress1KB := connect.WithCompressMinBytes(1024)
Expand Down
4 changes: 2 additions & 2 deletions gateway/internal/interceptor/interceptor.go
Expand Up @@ -5,7 +5,7 @@ import (
"fmt"

"connectrpc.com/connect"
"github.com/missingstudio/studio/backend/config"

"github.com/missingstudio/studio/backend/internal/ratelimiter"
"github.com/missingstudio/studio/backend/internal/schema"
"github.com/missingstudio/studio/backend/pkg/utils"
Expand Down Expand Up @@ -53,7 +53,7 @@ func ProviderInterceptor() connect.UnaryInterceptorFunc {
ctx context.Context,
req connect.AnyRequest,
) (connect.AnyResponse, error) {
provider := req.Header().Get(config.XMSProvider)
provider := req.Header().Get("x-ms-provider")
if provider == "" {
return nil, ErrProviderHeaderNotExit
}
Expand Down
3 changes: 1 addition & 2 deletions gateway/internal/providers/providers.go
Expand Up @@ -5,7 +5,6 @@ import (
"fmt"
"net/http"

"github.com/missingstudio/studio/backend/config"
"github.com/missingstudio/studio/backend/internal/providers/anyscale"
"github.com/missingstudio/studio/backend/internal/providers/azure"
"github.com/missingstudio/studio/backend/internal/providers/base"
Expand Down Expand Up @@ -35,7 +34,7 @@ func init() {
}

func GetProvider(ctx context.Context, headers http.Header) (base.ProviderInterface, error) {
providerName := headers.Get(config.XMSProvider)
providerName := headers.Get("x-ms-provider")
if providerName == "" {
return nil, ErrProviderHeaderNotExit
}
Expand Down
2 changes: 2 additions & 0 deletions gateway/internal/ratelimiter/ratelimiter.go
Expand Up @@ -15,6 +15,8 @@ func NewRateLimiter(cfg Config, logger *slog.Logger, rltype string, rdb *redis.C
switch rltype {
case "sliding_window":
r.Limiter = NewSlidingWindowRateLimiter(cfg, logger, rdb)
default:
r.Limiter = NewSlidingWindowRateLimiter(cfg, logger, rdb)
}

return r
Expand Down
6 changes: 6 additions & 0 deletions gateway/internal/server/config.go
@@ -0,0 +1,6 @@
package server

type Config struct {
Host string `yaml:"host" json:"host,omitempty" mapstructure:"host" default:"0.0.0.0"`
Port int `yaml:"port" json:"port,omitempty" mapstructure:"port" default:"8080"`
}
26 changes: 3 additions & 23 deletions gateway/internal/server/server.go
Expand Up @@ -4,35 +4,15 @@ import (
"context"
"fmt"
"log/slog"
"os"

"github.com/missingstudio/studio/backend/config"
v1 "github.com/missingstudio/studio/backend/internal/api/v1"
"github.com/missingstudio/studio/backend/internal/api"
"github.com/missingstudio/studio/backend/internal/connectrpc"
"github.com/missingstudio/studio/backend/internal/httpserver"
"github.com/missingstudio/studio/backend/internal/ingester"
"github.com/missingstudio/studio/backend/internal/ratelimiter"
"github.com/missingstudio/studio/backend/pkg/utils"
"github.com/redis/go-redis/v9"
)

func Serve(ctx context.Context, logger *slog.Logger, cfg *config.Config) error {
rdb := redis.NewClient(&redis.Options{
Addr: fmt.Sprintf("%s:%d", cfg.Redis.Host, cfg.Redis.Port),
Username: cfg.Redis.Username,
Password: cfg.Redis.Password,
})

_, err := rdb.Ping(ctx).Result()
if err != nil {
logger.Warn("failed to init redis connection")
os.Exit(1)
}

rl := ratelimiter.NewRateLimiter(cfg.Ratelimiter, logger, cfg.Ratelimiter.Type, rdb)
ingester := ingester.GetIngesterWithDefault(ctx, cfg.Ingester, logger)

connectMux, err := connectrpc.NewConnectMux(v1.NewDeps(ingester, rl))
func Serve(ctx context.Context, logger *slog.Logger, cfg Config, deps api.Deps) error {
connectMux, err := connectrpc.NewConnectMux(deps)
if err != nil {
logger.Error("connect rpc mux not created", err)
return err
Expand Down
3 changes: 1 addition & 2 deletions gateway/pkg/utils/headers.go
Expand Up @@ -9,7 +9,6 @@ import (
"strings"

"github.com/go-playground/validator/v10"
"github.com/missingstudio/studio/backend/config"
"github.com/missingstudio/studio/common/errors"
)

Expand All @@ -20,7 +19,7 @@ func isJSON(s string, v interface{}) bool {
}

func UnmarshalConfigHeaders(header http.Header, v interface{}) error {
msconfig := header.Get(config.XMSConfig)
msconfig := header.Get("x-ms-provider")
if msconfig == "" && isJSON(msconfig, v) {
return ErrGatewayConfigHeaderNotValid
}
Expand Down

0 comments on commit 3c4c305

Please sign in to comment.