diff --git a/cmd/auth/main.go b/cmd/auth/main.go index 446a22a20..d8efef487 100644 --- a/cmd/auth/main.go +++ b/cmd/auth/main.go @@ -7,6 +7,7 @@ import ( "context" "fmt" "log" + "net/url" "os" "time" @@ -22,7 +23,6 @@ import ( "github.com/absmach/magistrala/internal" jaegerclient "github.com/absmach/magistrala/internal/clients/jaeger" pgclient "github.com/absmach/magistrala/internal/clients/postgres" - "github.com/absmach/magistrala/internal/env" "github.com/absmach/magistrala/internal/postgres" "github.com/absmach/magistrala/internal/server" grpcserver "github.com/absmach/magistrala/internal/server/grpc" @@ -32,6 +32,7 @@ import ( v1 "github.com/authzed/authzed-go/proto/authzed/api/v1" "github.com/authzed/authzed-go/v1" "github.com/authzed/grpcutil" + "github.com/caarlos0/env/v10" "github.com/jmoiron/sqlx" chclient "github.com/mainflux/callhome/pkg/client" "go.opentelemetry.io/otel/trace" @@ -53,17 +54,17 @@ const ( ) type config struct { - LogLevel string `env:"MG_AUTH_LOG_LEVEL" envDefault:"info"` - SecretKey string `env:"MG_AUTH_SECRET_KEY" envDefault:"secret"` - JaegerURL string `env:"MG_JAEGER_URL" envDefault:"http://jaeger:14268/api/traces"` - SendTelemetry bool `env:"MG_SEND_TELEMETRY" envDefault:"true"` - InstanceID string `env:"MG_AUTH_ADAPTER_INSTANCE_ID" envDefault:""` - AccessDuration string `env:"MG_AUTH_ACCESS_TOKEN_DURATION" envDefault:"30m"` - RefreshDuration string `env:"MG_AUTH_REFRESH_TOKEN_DURATION" envDefault:"24h"` - SpicedbHost string `env:"MG_SPICEDB_HOST" envDefault:"localhost"` - SpicedbPort string `env:"MG_SPICEDB_PORT" envDefault:"50051"` - SpicedbSchemaFile string `env:"MG_SPICEDB_SCHEMA_FILE" envDefault:"./docker/spicedb/schema.zed"` - TraceRatio float64 `env:"MG_JAEGER_TRACE_RATIO" envDefault:"1.0"` + LogLevel string `env:"MG_AUTH_LOG_LEVEL" envDefault:"info"` + SecretKey string `env:"MG_AUTH_SECRET_KEY" envDefault:"secret"` + JaegerURL url.URL `env:"MG_JAEGER_URL" envDefault:"http://jaeger:14268/api/traces"` + SendTelemetry bool `env:"MG_SEND_TELEMETRY" envDefault:"true"` + InstanceID string `env:"MG_AUTH_ADAPTER_INSTANCE_ID" envDefault:""` + AccessDuration time.Duration `env:"MG_AUTH_ACCESS_TOKEN_DURATION" envDefault:"1h"` + RefreshDuration time.Duration `env:"MG_AUTH_REFRESH_TOKEN_DURATION" envDefault:"24h"` + SpicedbHost string `env:"MG_SPICEDB_HOST" envDefault:"localhost"` + SpicedbPort string `env:"MG_SPICEDB_PORT" envDefault:"50051"` + SpicedbSchemaFile string `env:"MG_SPICEDB_SCHEMA_FILE" envDefault:"./docker/spicedb/schema.zed"` + TraceRatio float64 `env:"MG_JAEGER_TRACE_RATIO" envDefault:"1.0"` } func main() { @@ -126,7 +127,7 @@ func main() { svc := newService(db, tracer, cfg, dbConfig, logger, spicedbclient) httpServerConfig := server.Config{Port: defSvcHTTPPort} - if err := env.Parse(&httpServerConfig, env.Options{Prefix: envPrefixHTTP}); err != nil { + if err := env.ParseWithOptions(&httpServerConfig, env.Options{Prefix: envPrefixHTTP}); err != nil { logger.Error(fmt.Sprintf("failed to load %s HTTP server configuration : %s", svcName, err.Error())) exitCode = 1 return @@ -134,7 +135,7 @@ func main() { hs := httpserver.New(ctx, cancel, svcName, httpServerConfig, httpapi.MakeHandler(svc, logger, cfg.InstanceID), logger) grpcServerConfig := server.Config{Port: defSvcGRPCPort} - if err := env.Parse(&grpcServerConfig, env.Options{Prefix: envPrefixGrpc}); err != nil { + if err := env.ParseWithOptions(&grpcServerConfig, env.Options{Prefix: envPrefixGrpc}); err != nil { logger.Error(fmt.Sprintf("failed to load %s gRPC server configuration : %s", svcName, err.Error())) exitCode = 1 return @@ -205,16 +206,7 @@ func newService(db *sqlx.DB, tracer trace.Tracer, cfg config, dbConfig pgclient. idProvider := uuid.New() t := jwt.New([]byte(cfg.SecretKey)) - aDuration, err := time.ParseDuration(cfg.AccessDuration) - if err != nil { - logger.Error(fmt.Sprintf("failed to parse access token duration: %s", err.Error())) - } - rDuration, err := time.ParseDuration(cfg.RefreshDuration) - if err != nil { - logger.Error(fmt.Sprintf("failed to parse refresh token duration: %s", err.Error())) - } - - svc := auth.New(keysRepo, domainsRepo, idProvider, t, pa, aDuration, rDuration) + svc := auth.New(keysRepo, domainsRepo, idProvider, t, pa, cfg.AccessDuration, cfg.RefreshDuration) svc = api.LoggingMiddleware(svc, logger) counter, latency := internal.MakeMetrics("groups", "api") svc = api.MetricsMiddleware(svc, counter, latency) diff --git a/cmd/bootstrap/main.go b/cmd/bootstrap/main.go index 18626d366..87dd329ca 100644 --- a/cmd/bootstrap/main.go +++ b/cmd/bootstrap/main.go @@ -8,6 +8,7 @@ import ( "context" "fmt" "log" + "net/url" "os" "github.com/absmach/magistrala" @@ -21,7 +22,6 @@ import ( authclient "github.com/absmach/magistrala/internal/clients/grpc/auth" "github.com/absmach/magistrala/internal/clients/jaeger" pgclient "github.com/absmach/magistrala/internal/clients/postgres" - "github.com/absmach/magistrala/internal/env" "github.com/absmach/magistrala/internal/postgres" "github.com/absmach/magistrala/internal/server" httpserver "github.com/absmach/magistrala/internal/server/http" @@ -29,6 +29,7 @@ import ( "github.com/absmach/magistrala/pkg/events/store" mgsdk "github.com/absmach/magistrala/pkg/sdk/go" "github.com/absmach/magistrala/pkg/uuid" + "github.com/caarlos0/env/v10" "github.com/jmoiron/sqlx" chclient "github.com/mainflux/callhome/pkg/client" "go.opentelemetry.io/otel/trace" @@ -50,7 +51,7 @@ type config struct { EncKey string `env:"MG_BOOTSTRAP_ENCRYPT_KEY" envDefault:"12345678910111213141516171819202"` ESConsumerName string `env:"MG_BOOTSTRAP_EVENT_CONSUMER" envDefault:"bootstrap"` ThingsURL string `env:"MG_THINGS_URL" envDefault:"http://localhost:9000"` - JaegerURL string `env:"MG_JAEGER_URL" envDefault:"http://jaeger:14268/api/traces"` + JaegerURL url.URL `env:"MG_JAEGER_URL" envDefault:"http://jaeger:14268/api/traces"` SendTelemetry bool `env:"MG_SEND_TELEMETRY" envDefault:"true"` InstanceID string `env:"MG_BOOTSTRAP_INSTANCE_ID" envDefault:""` ESURL string `env:"MG_BOOTSTRAP_ES_URL" envDefault:"redis://localhost:6379/0"` @@ -133,7 +134,7 @@ func main() { } httpServerConfig := server.Config{Port: defSvcHTTPPort} - if err := env.Parse(&httpServerConfig, env.Options{Prefix: envPrefixHTTP}); err != nil { + if err := env.ParseWithOptions(&httpServerConfig, env.Options{Prefix: envPrefixHTTP}); err != nil { logger.Error(fmt.Sprintf("failed to load %s HTTP server configuration : %s", svcName, err)) exitCode = 1 return diff --git a/cmd/cassandra-reader/main.go b/cmd/cassandra-reader/main.go index e1472d4f8..39fa8ccd7 100644 --- a/cmd/cassandra-reader/main.go +++ b/cmd/cassandra-reader/main.go @@ -14,7 +14,6 @@ import ( "github.com/absmach/magistrala/internal" cassandraclient "github.com/absmach/magistrala/internal/clients/cassandra" authclient "github.com/absmach/magistrala/internal/clients/grpc/auth" - "github.com/absmach/magistrala/internal/env" "github.com/absmach/magistrala/internal/server" httpserver "github.com/absmach/magistrala/internal/server/http" mglog "github.com/absmach/magistrala/logger" @@ -22,6 +21,7 @@ import ( "github.com/absmach/magistrala/readers" "github.com/absmach/magistrala/readers/api" "github.com/absmach/magistrala/readers/cassandra" + "github.com/caarlos0/env/v10" "github.com/gocql/gocql" chclient "github.com/mainflux/callhome/pkg/client" "golang.org/x/sync/errgroup" @@ -100,7 +100,7 @@ func main() { // Create new http server httpServerConfig := server.Config{Port: defSvcHTTPPort} - if err := env.Parse(&httpServerConfig, env.Options{Prefix: envPrefixHTTP}); err != nil { + if err := env.ParseWithOptions(&httpServerConfig, env.Options{Prefix: envPrefixHTTP}); err != nil { logger.Error(fmt.Sprintf("failed to load %s HTTP server configuration : %s", svcName, err)) exitCode = 1 return diff --git a/cmd/cassandra-writer/main.go b/cmd/cassandra-writer/main.go index a7529ca0d..c88ae6fec 100644 --- a/cmd/cassandra-writer/main.go +++ b/cmd/cassandra-writer/main.go @@ -8,6 +8,7 @@ import ( "context" "fmt" "log" + "net/url" "os" "github.com/absmach/magistrala" @@ -18,13 +19,13 @@ import ( "github.com/absmach/magistrala/internal" cassandraclient "github.com/absmach/magistrala/internal/clients/cassandra" jaegerclient "github.com/absmach/magistrala/internal/clients/jaeger" - "github.com/absmach/magistrala/internal/env" "github.com/absmach/magistrala/internal/server" httpserver "github.com/absmach/magistrala/internal/server/http" mglog "github.com/absmach/magistrala/logger" "github.com/absmach/magistrala/pkg/messaging/brokers" brokerstracing "github.com/absmach/magistrala/pkg/messaging/brokers/tracing" "github.com/absmach/magistrala/pkg/uuid" + "github.com/caarlos0/env/v10" "github.com/gocql/gocql" chclient "github.com/mainflux/callhome/pkg/client" "golang.org/x/sync/errgroup" @@ -41,7 +42,7 @@ type config struct { LogLevel string `env:"MG_CASSANDRA_WRITER_LOG_LEVEL" envDefault:"info"` ConfigPath string `env:"MG_CASSANDRA_WRITER_CONFIG_PATH" envDefault:"/config.toml"` BrokerURL string `env:"MG_MESSAGE_BROKER_URL" envDefault:"nats://localhost:4222"` - JaegerURL string `env:"MG_JAEGER_URL" envDefault:"http://jaeger:14268/api/traces"` + JaegerURL url.URL `env:"MG_JAEGER_URL" envDefault:"http://jaeger:14268/api/traces"` SendTelemetry bool `env:"MG_SEND_TELEMETRY" envDefault:"true"` InstanceID string `env:"MG_CASSANDRA_WRITER_INSTANCE_ID" envDefault:""` TraceRatio float64 `env:"MG_JAEGER_TRACE_RATIO" envDefault:"1.0"` @@ -74,7 +75,7 @@ func main() { } httpServerConfig := server.Config{Port: defSvcHTTPPort} - if err := env.Parse(&httpServerConfig, env.Options{Prefix: envPrefixHTTP}); err != nil { + if err := env.ParseWithOptions(&httpServerConfig, env.Options{Prefix: envPrefixHTTP}); err != nil { logger.Error(fmt.Sprintf("failed to load %s HTTP server configuration : %s", svcName, err)) exitCode = 1 return diff --git a/cmd/certs/main.go b/cmd/certs/main.go index 4bcd07869..4c21000aa 100644 --- a/cmd/certs/main.go +++ b/cmd/certs/main.go @@ -8,6 +8,7 @@ import ( "context" "fmt" "log" + "net/url" "os" "github.com/absmach/magistrala" @@ -20,13 +21,13 @@ import ( authclient "github.com/absmach/magistrala/internal/clients/grpc/auth" jaegerclient "github.com/absmach/magistrala/internal/clients/jaeger" pgclient "github.com/absmach/magistrala/internal/clients/postgres" - "github.com/absmach/magistrala/internal/env" "github.com/absmach/magistrala/internal/postgres" "github.com/absmach/magistrala/internal/server" httpserver "github.com/absmach/magistrala/internal/server/http" mglog "github.com/absmach/magistrala/logger" mgsdk "github.com/absmach/magistrala/pkg/sdk/go" "github.com/absmach/magistrala/pkg/uuid" + "github.com/caarlos0/env/v10" "github.com/jmoiron/sqlx" chclient "github.com/mainflux/callhome/pkg/client" "go.opentelemetry.io/otel/trace" @@ -45,7 +46,7 @@ type config struct { LogLevel string `env:"MG_CERTS_LOG_LEVEL" envDefault:"info"` CertsURL string `env:"MG_SDK_CERTS_URL" envDefault:"http://localhost"` ThingsURL string `env:"MG_THINGS_URL" envDefault:"http://things:9000"` - JaegerURL string `env:"MG_JAEGER_URL" envDefault:"http://jaeger:14268/api/traces"` + JaegerURL url.URL `env:"MG_JAEGER_URL" envDefault:"http://jaeger:14268/api/traces"` SendTelemetry bool `env:"MG_SEND_TELEMETRY" envDefault:"true"` InstanceID string `env:"MG_CERTS_INSTANCE_ID" envDefault:""` TraceRatio float64 `env:"MG_JAEGER_TRACE_RATIO" envDefault:"1.0"` @@ -137,7 +138,7 @@ func main() { svc := newService(auth, db, tracer, logger, cfg, dbConfig, pkiclient) httpServerConfig := server.Config{Port: defSvcHTTPPort} - if err := env.Parse(&httpServerConfig, env.Options{Prefix: envPrefixHTTP}); err != nil { + if err := env.ParseWithOptions(&httpServerConfig, env.Options{Prefix: envPrefixHTTP}); err != nil { logger.Error(fmt.Sprintf("failed to load %s HTTP server configuration : %s", svcName, err)) exitCode = 1 return diff --git a/cmd/coap/main.go b/cmd/coap/main.go index 16bc5b8c0..1757281d1 100644 --- a/cmd/coap/main.go +++ b/cmd/coap/main.go @@ -8,6 +8,7 @@ import ( "context" "fmt" "log" + "net/url" "os" "github.com/absmach/magistrala" @@ -17,7 +18,6 @@ import ( "github.com/absmach/magistrala/internal" authapi "github.com/absmach/magistrala/internal/clients/grpc/auth" jaegerclient "github.com/absmach/magistrala/internal/clients/jaeger" - "github.com/absmach/magistrala/internal/env" "github.com/absmach/magistrala/internal/server" coapserver "github.com/absmach/magistrala/internal/server/coap" httpserver "github.com/absmach/magistrala/internal/server/http" @@ -25,6 +25,7 @@ import ( "github.com/absmach/magistrala/pkg/messaging/brokers" brokerstracing "github.com/absmach/magistrala/pkg/messaging/brokers/tracing" "github.com/absmach/magistrala/pkg/uuid" + "github.com/caarlos0/env/v10" chclient "github.com/mainflux/callhome/pkg/client" "golang.org/x/sync/errgroup" ) @@ -40,7 +41,7 @@ const ( type config struct { LogLevel string `env:"MG_COAP_ADAPTER_LOG_LEVEL" envDefault:"info"` BrokerURL string `env:"MG_MESSAGE_BROKER_URL" envDefault:"nats://localhost:4222"` - JaegerURL string `env:"MG_JAEGER_URL" envDefault:"http://jaeger:14268/api/traces"` + JaegerURL url.URL `env:"MG_JAEGER_URL" envDefault:"http://jaeger:14268/api/traces"` SendTelemetry bool `env:"MG_SEND_TELEMETRY" envDefault:"true"` InstanceID string `env:"MG_COAP_ADAPTER_INSTANCE_ID" envDefault:""` TraceRatio float64 `env:"MG_JAEGER_TRACE_RATIO" envDefault:"1.0"` @@ -72,14 +73,14 @@ func main() { } httpServerConfig := server.Config{Port: defSvcHTTPPort} - if err := env.Parse(&httpServerConfig, env.Options{Prefix: envPrefixHTTP}); err != nil { + if err := env.ParseWithOptions(&httpServerConfig, env.Options{Prefix: envPrefixHTTP}); err != nil { logger.Error(fmt.Sprintf("failed to load %s HTTP server configuration : %s", svcName, err)) exitCode = 1 return } coapServerConfig := server.Config{Port: defSvcCoAPPort} - if err := env.Parse(&coapServerConfig, env.Options{Prefix: envPrefix}); err != nil { + if err := env.ParseWithOptions(&coapServerConfig, env.Options{Prefix: envPrefix}); err != nil { logger.Error(fmt.Sprintf("failed to load %s CoAP server configuration : %s", svcName, err)) exitCode = 1 return diff --git a/cmd/http/main.go b/cmd/http/main.go index 7095378a0..cd682c081 100644 --- a/cmd/http/main.go +++ b/cmd/http/main.go @@ -9,6 +9,7 @@ import ( "fmt" "log" "net/http" + "net/url" "os" "github.com/absmach/magistrala" @@ -17,7 +18,6 @@ import ( "github.com/absmach/magistrala/internal" authapi "github.com/absmach/magistrala/internal/clients/grpc/auth" jaegerclient "github.com/absmach/magistrala/internal/clients/jaeger" - "github.com/absmach/magistrala/internal/env" "github.com/absmach/magistrala/internal/server" httpserver "github.com/absmach/magistrala/internal/server/http" mglog "github.com/absmach/magistrala/logger" @@ -26,6 +26,7 @@ import ( brokerstracing "github.com/absmach/magistrala/pkg/messaging/brokers/tracing" "github.com/absmach/magistrala/pkg/messaging/handler" "github.com/absmach/magistrala/pkg/uuid" + "github.com/caarlos0/env/v10" chclient "github.com/mainflux/callhome/pkg/client" mproxy "github.com/mainflux/mproxy/pkg/http" "github.com/mainflux/mproxy/pkg/session" @@ -44,7 +45,7 @@ const ( type config struct { LogLevel string `env:"MG_HTTP_ADAPTER_LOG_LEVEL" envDefault:"info"` BrokerURL string `env:"MG_MESSAGE_BROKER_URL" envDefault:"nats://localhost:4222"` - JaegerURL string `env:"MG_JAEGER_URL" envDefault:"http://jaeger:14268/api/traces"` + JaegerURL url.URL `env:"MG_JAEGER_URL" envDefault:"http://jaeger:14268/api/traces"` SendTelemetry bool `env:"MG_SEND_TELEMETRY" envDefault:"true"` InstanceID string `env:"MG_HTTP_ADAPTER_INSTANCE_ID" envDefault:""` TraceRatio float64 `env:"MG_JAEGER_TRACE_RATIO" envDefault:"1.0"` @@ -76,7 +77,7 @@ func main() { } httpServerConfig := server.Config{Port: defSvcHTTPPort} - if err := env.Parse(&httpServerConfig, env.Options{Prefix: envPrefix}); err != nil { + if err := env.ParseWithOptions(&httpServerConfig, env.Options{Prefix: envPrefix}); err != nil { logger.Error(fmt.Sprintf("failed to load %s HTTP server configuration : %s", svcName, err)) exitCode = 1 return diff --git a/cmd/influxdb-reader/main.go b/cmd/influxdb-reader/main.go index 074e127d0..7d6e899b9 100644 --- a/cmd/influxdb-reader/main.go +++ b/cmd/influxdb-reader/main.go @@ -14,7 +14,6 @@ import ( "github.com/absmach/magistrala/internal" authclient "github.com/absmach/magistrala/internal/clients/grpc/auth" influxdbclient "github.com/absmach/magistrala/internal/clients/influxdb" - "github.com/absmach/magistrala/internal/env" "github.com/absmach/magistrala/internal/server" httpserver "github.com/absmach/magistrala/internal/server/http" mglog "github.com/absmach/magistrala/logger" @@ -22,6 +21,7 @@ import ( "github.com/absmach/magistrala/readers" "github.com/absmach/magistrala/readers/api" "github.com/absmach/magistrala/readers/influxdb" + "github.com/caarlos0/env/v10" influxdb2 "github.com/influxdata/influxdb-client-go/v2" chclient "github.com/mainflux/callhome/pkg/client" "golang.org/x/sync/errgroup" @@ -35,8 +35,8 @@ const ( ) type config struct { - LogLevel string `env:"MG_INFLUX_READER_LOG_LEVEL" envDefault:"info"` - SendTelemetry bool `env:"MG_SEND_TELEMETRY" envDefault:"true"` + LogLevel string `env:"MG_INFLUX_READER_LOG_LEVEL" envDefault:"info"` + SendTelemetry bool `env:"MG_SEND_TELEMETRY" envDefault:"true"` InstanceID string `env:"MG_INFLUX_READER_INSTANCE_ID" envDefault:""` } @@ -86,7 +86,7 @@ func main() { logger.Info("Successfully connected to things grpc server " + tcHandler.Secure()) influxDBConfig := influxdbclient.Config{} - if err := env.Parse(&influxDBConfig, env.Options{Prefix: envPrefixDB}); err != nil { + if err := env.ParseWithOptions(&influxDBConfig, env.Options{Prefix: envPrefixDB}); err != nil { logger.Error(fmt.Sprintf("failed to load InfluxDB client configuration from environment variable : %s", err)) exitCode = 1 return @@ -109,7 +109,7 @@ func main() { repo := newService(client, repocfg, logger) httpServerConfig := server.Config{Port: defSvcHTTPPort} - if err := env.Parse(&httpServerConfig, env.Options{Prefix: envPrefixHTTP}); err != nil { + if err := env.ParseWithOptions(&httpServerConfig, env.Options{Prefix: envPrefixHTTP}); err != nil { logger.Error(fmt.Sprintf("failed to load %s HTTP server configuration : %s", svcName, err)) exitCode = 1 return diff --git a/cmd/influxdb-writer/main.go b/cmd/influxdb-writer/main.go index 81e8b2431..7fc73730c 100644 --- a/cmd/influxdb-writer/main.go +++ b/cmd/influxdb-writer/main.go @@ -8,6 +8,7 @@ import ( "context" "fmt" "log" + "net/url" "os" "github.com/absmach/magistrala" @@ -17,13 +18,13 @@ import ( "github.com/absmach/magistrala/consumers/writers/influxdb" influxdbclient "github.com/absmach/magistrala/internal/clients/influxdb" "github.com/absmach/magistrala/internal/clients/jaeger" - "github.com/absmach/magistrala/internal/env" "github.com/absmach/magistrala/internal/server" httpserver "github.com/absmach/magistrala/internal/server/http" mglog "github.com/absmach/magistrala/logger" "github.com/absmach/magistrala/pkg/messaging/brokers" brokerstracing "github.com/absmach/magistrala/pkg/messaging/brokers/tracing" "github.com/absmach/magistrala/pkg/uuid" + "github.com/caarlos0/env/v10" chclient "github.com/mainflux/callhome/pkg/client" "golang.org/x/sync/errgroup" ) @@ -39,7 +40,7 @@ type config struct { LogLevel string `env:"MG_INFLUX_WRITER_LOG_LEVEL" envDefault:"info"` ConfigPath string `env:"MG_INFLUX_WRITER_CONFIG_PATH" envDefault:"/config.toml"` BrokerURL string `env:"MG_MESSAGE_BROKER_URL" envDefault:"nats://localhost:4222"` - JaegerURL string `env:"MG_JAEGER_URL" envDefault:"http://jaeger:14268/api/traces"` + JaegerURL url.URL `env:"MG_JAEGER_URL" envDefault:"http://jaeger:14268/api/traces"` SendTelemetry bool `env:"MG_SEND_TELEMETRY" envDefault:"true"` InstanceID string `env:"MG_INFLUX_WRITER_INSTANCE_ID" envDefault:""` TraceRatio float64 `env:"MG_JAEGER_TRACE_RATIO" envDefault:"1.0"` @@ -71,7 +72,7 @@ func main() { } httpServerConfig := server.Config{Port: defSvcHTTPPort} - if err := env.Parse(&httpServerConfig, env.Options{Prefix: envPrefixHTTP}); err != nil { + if err := env.ParseWithOptions(&httpServerConfig, env.Options{Prefix: envPrefixHTTP}); err != nil { logger.Error(fmt.Sprintf("failed to load %s HTTP server configuration : %s", svcName, err)) exitCode = 1 return @@ -100,7 +101,7 @@ func main() { pubSub = brokerstracing.NewPubSub(httpServerConfig, tracer, pubSub) influxDBConfig := influxdbclient.Config{} - if err := env.Parse(&influxDBConfig, env.Options{Prefix: envPrefixDB}); err != nil { + if err := env.ParseWithOptions(&influxDBConfig, env.Options{Prefix: envPrefixDB}); err != nil { logger.Error(fmt.Sprintf("failed to load InfluxDB client configuration from environment variable : %s", err)) exitCode = 1 return diff --git a/cmd/lora/main.go b/cmd/lora/main.go index fae793541..1a8817116 100644 --- a/cmd/lora/main.go +++ b/cmd/lora/main.go @@ -8,6 +8,7 @@ import ( "context" "fmt" "log" + "net/url" "os" "time" @@ -15,7 +16,6 @@ import ( "github.com/absmach/magistrala/internal" "github.com/absmach/magistrala/internal/clients/jaeger" redisclient "github.com/absmach/magistrala/internal/clients/redis" - "github.com/absmach/magistrala/internal/env" "github.com/absmach/magistrala/internal/server" httpserver "github.com/absmach/magistrala/internal/server/http" mglog "github.com/absmach/magistrala/logger" @@ -28,6 +28,7 @@ import ( "github.com/absmach/magistrala/pkg/messaging/brokers" brokerstracing "github.com/absmach/magistrala/pkg/messaging/brokers/tracing" "github.com/absmach/magistrala/pkg/uuid" + "github.com/caarlos0/env/v10" mqttpaho "github.com/eclipse/paho.mqtt.golang" "github.com/go-redis/redis/v8" chclient "github.com/mainflux/callhome/pkg/client" @@ -54,7 +55,7 @@ type config struct { LoraMsgTimeout time.Duration `env:"MG_LORA_ADAPTER_MESSAGES_TIMEOUT" envDefault:"30s"` ESConsumerName string `env:"MG_LORA_ADAPTER_EVENT_CONSUMER" envDefault:"lora-adapter"` BrokerURL string `env:"MG_MESSAGE_BROKER_URL" envDefault:"nats://localhost:4222"` - JaegerURL string `env:"MG_JAEGER_URL" envDefault:"http://jaeger:14268/api/traces"` + JaegerURL url.URL `env:"MG_JAEGER_URL" envDefault:"http://jaeger:14268/api/traces"` SendTelemetry bool `env:"MG_SEND_TELEMETRY" envDefault:"true"` InstanceID string `env:"MG_LORA_ADAPTER_INSTANCE_ID" envDefault:""` ESURL string `env:"MG_LORA_ADAPTER_ES_URL" envDefault:"redis://localhost:6379/0"` @@ -88,7 +89,7 @@ func main() { } httpServerConfig := server.Config{Port: defSvcHTTPPort} - if err := env.Parse(&httpServerConfig, env.Options{Prefix: envPrefixHTTP}); err != nil { + if err := env.ParseWithOptions(&httpServerConfig, env.Options{Prefix: envPrefixHTTP}); err != nil { logger.Error(fmt.Sprintf("failed to load %s HTTP server configuration : %s", svcName, err)) exitCode = 1 return diff --git a/cmd/mongodb-reader/main.go b/cmd/mongodb-reader/main.go index 35331296c..b8416b0e1 100644 --- a/cmd/mongodb-reader/main.go +++ b/cmd/mongodb-reader/main.go @@ -14,7 +14,6 @@ import ( "github.com/absmach/magistrala/internal" authclient "github.com/absmach/magistrala/internal/clients/grpc/auth" mongoclient "github.com/absmach/magistrala/internal/clients/mongo" - "github.com/absmach/magistrala/internal/env" "github.com/absmach/magistrala/internal/server" httpserver "github.com/absmach/magistrala/internal/server/http" mglog "github.com/absmach/magistrala/logger" @@ -22,6 +21,7 @@ import ( "github.com/absmach/magistrala/readers" "github.com/absmach/magistrala/readers/api" "github.com/absmach/magistrala/readers/mongodb" + "github.com/caarlos0/env/v10" chclient "github.com/mainflux/callhome/pkg/client" "go.mongodb.org/mongo-driver/mongo" "golang.org/x/sync/errgroup" @@ -95,7 +95,7 @@ func main() { logger.Info("Successfully connected to things grpc server " + tcHandler.Secure()) httpServerConfig := server.Config{Port: defSvcHTTPPort} - if err := env.Parse(&httpServerConfig, env.Options{Prefix: envPrefixHTTP}); err != nil { + if err := env.ParseWithOptions(&httpServerConfig, env.Options{Prefix: envPrefixHTTP}); err != nil { logger.Error(fmt.Sprintf("failed to load %s HTTP server configuration : %s", svcName, err)) exitCode = 1 return diff --git a/cmd/mongodb-writer/main.go b/cmd/mongodb-writer/main.go index 243c0a085..41bbdb251 100644 --- a/cmd/mongodb-writer/main.go +++ b/cmd/mongodb-writer/main.go @@ -8,6 +8,7 @@ import ( "context" "fmt" "log" + "net/url" "os" "github.com/absmach/magistrala" @@ -18,13 +19,13 @@ import ( "github.com/absmach/magistrala/internal" jaegerclient "github.com/absmach/magistrala/internal/clients/jaeger" mongoclient "github.com/absmach/magistrala/internal/clients/mongo" - "github.com/absmach/magistrala/internal/env" "github.com/absmach/magistrala/internal/server" httpserver "github.com/absmach/magistrala/internal/server/http" mglog "github.com/absmach/magistrala/logger" "github.com/absmach/magistrala/pkg/messaging/brokers" brokerstracing "github.com/absmach/magistrala/pkg/messaging/brokers/tracing" "github.com/absmach/magistrala/pkg/uuid" + "github.com/caarlos0/env/v10" chclient "github.com/mainflux/callhome/pkg/client" "go.mongodb.org/mongo-driver/mongo" "golang.org/x/sync/errgroup" @@ -41,7 +42,7 @@ type config struct { LogLevel string `env:"MG_MONGO_WRITER_LOG_LEVEL" envDefault:"info"` ConfigPath string `env:"MG_MONGO_WRITER_CONFIG_PATH" envDefault:"/config.toml"` BrokerURL string `env:"MG_MESSAGE_BROKER_URL" envDefault:"nats://localhost:4222"` - JaegerURL string `env:"MG_JAEGER_URL" envDefault:"http://jaeger:14268/api/traces"` + JaegerURL url.URL `env:"MG_JAEGER_URL" envDefault:"http://jaeger:14268/api/traces"` SendTelemetry bool `env:"MG_SEND_TELEMETRY" envDefault:"true"` InstanceID string `env:"MG_MONGO_WRITER_INSTANCE_ID" envDefault:""` TraceRatio float64 `env:"MG_JAEGER_TRACE_RATIO" envDefault:"1.0"` @@ -73,7 +74,7 @@ func main() { } httpServerConfig := server.Config{Port: defSvcHTTPPort} - if err := env.Parse(&httpServerConfig, env.Options{Prefix: envPrefixHTTP}); err != nil { + if err := env.ParseWithOptions(&httpServerConfig, env.Options{Prefix: envPrefixHTTP}); err != nil { logger.Error(fmt.Sprintf("failed to load %s HTTP server configuration : %s", svcName, err)) exitCode = 1 return diff --git a/cmd/mqtt/main.go b/cmd/mqtt/main.go index b331c3397..479c1173c 100644 --- a/cmd/mqtt/main.go +++ b/cmd/mqtt/main.go @@ -10,13 +10,13 @@ import ( "io" "log" "net/http" + "net/url" "os" "time" "github.com/absmach/magistrala" authapi "github.com/absmach/magistrala/internal/clients/grpc/auth" jaegerclient "github.com/absmach/magistrala/internal/clients/jaeger" - "github.com/absmach/magistrala/internal/env" "github.com/absmach/magistrala/internal/server" mglog "github.com/absmach/magistrala/logger" "github.com/absmach/magistrala/mqtt" @@ -28,6 +28,7 @@ import ( "github.com/absmach/magistrala/pkg/messaging/handler" mqttpub "github.com/absmach/magistrala/pkg/messaging/mqtt" "github.com/absmach/magistrala/pkg/uuid" + "github.com/caarlos0/env/v10" "github.com/cenkalti/backoff/v4" chclient "github.com/mainflux/callhome/pkg/client" mp "github.com/mainflux/mproxy/pkg/mqtt" @@ -51,7 +52,7 @@ type config struct { HTTPTargetPort string `env:"MG_MQTT_ADAPTER_WS_TARGET_PORT" envDefault:"8080"` HTTPTargetPath string `env:"MG_MQTT_ADAPTER_WS_TARGET_PATH" envDefault:"/mqtt"` Instance string `env:"MG_MQTT_ADAPTER_INSTANCE" envDefault:""` - JaegerURL string `env:"MG_JAEGER_URL" envDefault:"http://jaeger:14268/api/traces"` + JaegerURL url.URL `env:"MG_JAEGER_URL" envDefault:"http://jaeger:14268/api/traces"` BrokerURL string `env:"MG_MESSAGE_BROKER_URL" envDefault:"nats://localhost:4222"` SendTelemetry bool `env:"MG_SEND_TELEMETRY" envDefault:"true"` InstanceID string `env:"MG_MQTT_ADAPTER_INSTANCE_ID" envDefault:""` diff --git a/cmd/opcua/main.go b/cmd/opcua/main.go index 796245679..9a866a2df 100644 --- a/cmd/opcua/main.go +++ b/cmd/opcua/main.go @@ -8,13 +8,13 @@ import ( "context" "fmt" "log" + "net/url" "os" "github.com/absmach/magistrala" "github.com/absmach/magistrala/internal" jaegerclient "github.com/absmach/magistrala/internal/clients/jaeger" redisclient "github.com/absmach/magistrala/internal/clients/redis" - "github.com/absmach/magistrala/internal/env" "github.com/absmach/magistrala/internal/server" httpserver "github.com/absmach/magistrala/internal/server/http" mglog "github.com/absmach/magistrala/logger" @@ -27,6 +27,7 @@ import ( "github.com/absmach/magistrala/pkg/messaging/brokers" brokerstracing "github.com/absmach/magistrala/pkg/messaging/brokers/tracing" "github.com/absmach/magistrala/pkg/uuid" + "github.com/caarlos0/env/v10" "github.com/go-redis/redis/v8" chclient "github.com/mainflux/callhome/pkg/client" "golang.org/x/sync/errgroup" @@ -48,7 +49,7 @@ type config struct { LogLevel string `env:"MG_OPCUA_ADAPTER_LOG_LEVEL" envDefault:"info"` ESConsumerName string `env:"MG_OPCUA_ADAPTER_EVENT_CONSUMER" envDefault:"opcua-adapter"` BrokerURL string `env:"MG_MESSAGE_BROKER_URL" envDefault:"nats://localhost:4222"` - JaegerURL string `env:"MG_JAEGER_URL" envDefault:"http://jaeger:14268/api/traces"` + JaegerURL url.URL `env:"MG_JAEGER_URL" envDefault:"http://jaeger:14268/api/traces"` SendTelemetry bool `env:"MG_SEND_TELEMETRY" envDefault:"true"` InstanceID string `env:"MG_OPCUA_ADAPTER_INSTANCE_ID" envDefault:""` ESURL string `env:"MG_OPCUA_ADAPTER_ES_URL" envDefault:"redis://localhost:6379/0"` @@ -87,7 +88,7 @@ func main() { } httpServerConfig := server.Config{Port: defSvcHTTPPort} - if err := env.Parse(&httpServerConfig, env.Options{Prefix: envPrefixHTTP}); err != nil { + if err := env.ParseWithOptions(&httpServerConfig, env.Options{Prefix: envPrefixHTTP}); err != nil { logger.Error(fmt.Sprintf("failed to load %s HTTP server configuration : %s", svcName, err)) exitCode = 1 return diff --git a/cmd/postgres-reader/main.go b/cmd/postgres-reader/main.go index 31e0ce284..fc6aad1bb 100644 --- a/cmd/postgres-reader/main.go +++ b/cmd/postgres-reader/main.go @@ -14,7 +14,6 @@ import ( "github.com/absmach/magistrala/internal" authclient "github.com/absmach/magistrala/internal/clients/grpc/auth" pgclient "github.com/absmach/magistrala/internal/clients/postgres" - "github.com/absmach/magistrala/internal/env" "github.com/absmach/magistrala/internal/server" httpserver "github.com/absmach/magistrala/internal/server/http" mglog "github.com/absmach/magistrala/logger" @@ -22,6 +21,7 @@ import ( "github.com/absmach/magistrala/readers" "github.com/absmach/magistrala/readers/api" "github.com/absmach/magistrala/readers/postgres" + "github.com/caarlos0/env/v10" "github.com/jmoiron/sqlx" chclient "github.com/mainflux/callhome/pkg/client" "golang.org/x/sync/errgroup" @@ -103,7 +103,7 @@ func main() { repo := newService(db, logger) httpServerConfig := server.Config{Port: defSvcHTTPPort} - if err := env.Parse(&httpServerConfig, env.Options{Prefix: envPrefixHTTP}); err != nil { + if err := env.ParseWithOptions(&httpServerConfig, env.Options{Prefix: envPrefixHTTP}); err != nil { logger.Error(fmt.Sprintf("failed to load %s HTTP server configuration : %s", svcName, err)) exitCode = 1 return diff --git a/cmd/postgres-writer/main.go b/cmd/postgres-writer/main.go index 1f122e112..14db0e1b0 100644 --- a/cmd/postgres-writer/main.go +++ b/cmd/postgres-writer/main.go @@ -8,6 +8,7 @@ import ( "context" "fmt" "log" + "net/url" "os" "github.com/absmach/magistrala" @@ -18,13 +19,13 @@ import ( "github.com/absmach/magistrala/internal" jaegerclient "github.com/absmach/magistrala/internal/clients/jaeger" pgclient "github.com/absmach/magistrala/internal/clients/postgres" - "github.com/absmach/magistrala/internal/env" "github.com/absmach/magistrala/internal/server" httpserver "github.com/absmach/magistrala/internal/server/http" mglog "github.com/absmach/magistrala/logger" "github.com/absmach/magistrala/pkg/messaging/brokers" brokerstracing "github.com/absmach/magistrala/pkg/messaging/brokers/tracing" "github.com/absmach/magistrala/pkg/uuid" + "github.com/caarlos0/env/v10" "github.com/jmoiron/sqlx" chclient "github.com/mainflux/callhome/pkg/client" "golang.org/x/sync/errgroup" @@ -42,7 +43,7 @@ type config struct { LogLevel string `env:"MG_POSTGRES_WRITER_LOG_LEVEL" envDefault:"info"` ConfigPath string `env:"MG_POSTGRES_WRITER_CONFIG_PATH" envDefault:"/config.toml"` BrokerURL string `env:"MG_MESSAGE_BROKER_URL" envDefault:"nats://localhost:4222"` - JaegerURL string `env:"MG_JAEGER_URL" envDefault:"http://jaeger:14268/api/traces"` + JaegerURL url.URL `env:"MG_JAEGER_URL" envDefault:"http://jaeger:14268/api/traces"` SendTelemetry bool `env:"MG_SEND_TELEMETRY" envDefault:"true"` InstanceID string `env:"MG_POSTGRES_WRITER_INSTANCE_ID" envDefault:""` TraceRatio float64 `env:"MG_JAEGER_TRACE_RATIO" envDefault:"1.0"` @@ -74,7 +75,7 @@ func main() { } httpServerConfig := server.Config{Port: defSvcHTTPPort} - if err := env.Parse(&httpServerConfig, env.Options{Prefix: envPrefixHTTP}); err != nil { + if err := env.ParseWithOptions(&httpServerConfig, env.Options{Prefix: envPrefixHTTP}); err != nil { logger.Error(fmt.Sprintf("failed to load %s HTTP server configuration : %s", svcName, err)) exitCode = 1 return diff --git a/cmd/provision/main.go b/cmd/provision/main.go index 258f04d13..cc5945a8d 100644 --- a/cmd/provision/main.go +++ b/cmd/provision/main.go @@ -13,7 +13,6 @@ import ( "reflect" "github.com/absmach/magistrala" - "github.com/absmach/magistrala/internal/env" "github.com/absmach/magistrala/internal/server" httpserver "github.com/absmach/magistrala/internal/server/http" mglog "github.com/absmach/magistrala/logger" @@ -24,6 +23,7 @@ import ( "github.com/absmach/magistrala/pkg/uuid" "github.com/absmach/magistrala/provision" "github.com/absmach/magistrala/provision/api" + "github.com/caarlos0/env/v10" chclient "github.com/mainflux/callhome/pkg/client" "golang.org/x/sync/errgroup" ) diff --git a/cmd/smpp-notifier/main.go b/cmd/smpp-notifier/main.go index 54f1441e5..3b73f58fa 100644 --- a/cmd/smpp-notifier/main.go +++ b/cmd/smpp-notifier/main.go @@ -8,6 +8,7 @@ import ( "context" "fmt" "log" + "net/url" "os" "github.com/absmach/magistrala" @@ -21,7 +22,6 @@ import ( authclient "github.com/absmach/magistrala/internal/clients/grpc/auth" jaegerclient "github.com/absmach/magistrala/internal/clients/jaeger" pgclient "github.com/absmach/magistrala/internal/clients/postgres" - "github.com/absmach/magistrala/internal/env" "github.com/absmach/magistrala/internal/server" httpserver "github.com/absmach/magistrala/internal/server/http" mglog "github.com/absmach/magistrala/logger" @@ -29,6 +29,7 @@ import ( brokerstracing "github.com/absmach/magistrala/pkg/messaging/brokers/tracing" "github.com/absmach/magistrala/pkg/ulid" "github.com/absmach/magistrala/pkg/uuid" + "github.com/caarlos0/env/v10" "github.com/jmoiron/sqlx" chclient "github.com/mainflux/callhome/pkg/client" "go.opentelemetry.io/otel/trace" @@ -48,7 +49,7 @@ type config struct { From string `env:"MG_SMPP_NOTIFIER_FROM_ADDR" envDefault:""` ConfigPath string `env:"MG_SMPP_NOTIFIER_CONFIG_PATH" envDefault:"/config.toml"` BrokerURL string `env:"MG_MESSAGE_BROKER_URL" envDefault:"nats://localhost:4222"` - JaegerURL string `env:"MG_JAEGER_URL" envDefault:"http://jaeger:14268/api/traces"` + JaegerURL url.URL `env:"MG_JAEGER_URL" envDefault:"http://jaeger:14268/api/traces"` SendTelemetry bool `env:"MG_SEND_TELEMETRY" envDefault:"true"` InstanceID string `env:"MG_SMPP_NOTIFIER_INSTANCE_ID" envDefault:""` TraceRatio float64 `env:"MG_JAEGER_TRACE_RATIO" envDefault:"1.0"` @@ -94,7 +95,7 @@ func main() { } httpServerConfig := server.Config{Port: defSvcHTTPPort} - if err := env.Parse(&httpServerConfig, env.Options{Prefix: envPrefixHTTP}); err != nil { + if err := env.ParseWithOptions(&httpServerConfig, env.Options{Prefix: envPrefixHTTP}); err != nil { logger.Error(fmt.Sprintf("failed to load %s HTTP server configuration : %s", svcName, err)) exitCode = 1 return diff --git a/cmd/smtp-notifier/main.go b/cmd/smtp-notifier/main.go index 2182095ee..d77d412ff 100644 --- a/cmd/smtp-notifier/main.go +++ b/cmd/smtp-notifier/main.go @@ -8,6 +8,7 @@ import ( "context" "fmt" "log" + "net/url" "os" "github.com/absmach/magistrala" @@ -22,7 +23,6 @@ import ( jaegerclient "github.com/absmach/magistrala/internal/clients/jaeger" pgclient "github.com/absmach/magistrala/internal/clients/postgres" "github.com/absmach/magistrala/internal/email" - "github.com/absmach/magistrala/internal/env" "github.com/absmach/magistrala/internal/server" httpserver "github.com/absmach/magistrala/internal/server/http" mglog "github.com/absmach/magistrala/logger" @@ -30,6 +30,7 @@ import ( brokerstracing "github.com/absmach/magistrala/pkg/messaging/brokers/tracing" "github.com/absmach/magistrala/pkg/ulid" "github.com/absmach/magistrala/pkg/uuid" + "github.com/caarlos0/env/v10" "github.com/jmoiron/sqlx" chclient "github.com/mainflux/callhome/pkg/client" "go.opentelemetry.io/otel/trace" @@ -49,7 +50,7 @@ type config struct { ConfigPath string `env:"MG_SMTP_NOTIFIER_CONFIG_PATH" envDefault:"/config.toml"` From string `env:"MG_SMTP_NOTIFIER_FROM_ADDR" envDefault:""` BrokerURL string `env:"MG_MESSAGE_BROKER_URL" envDefault:"nats://localhost:4222"` - JaegerURL string `env:"MG_JAEGER_URL" envDefault:"http://jaeger:14268/api/traces"` + JaegerURL url.URL `env:"MG_JAEGER_URL" envDefault:"http://jaeger:14268/api/traces"` SendTelemetry bool `env:"MG_SEND_TELEMETRY" envDefault:"true"` InstanceID string `env:"MG_SMTP_NOTIFIER_INSTANCE_ID" envDefault:""` TraceRatio float64 `env:"MG_JAEGER_TRACE_RATIO" envDefault:"1.0"` @@ -97,7 +98,7 @@ func main() { } httpServerConfig := server.Config{Port: defSvcHTTPPort} - if err := env.Parse(&httpServerConfig, env.Options{Prefix: envPrefixHTTP}); err != nil { + if err := env.ParseWithOptions(&httpServerConfig, env.Options{Prefix: envPrefixHTTP}); err != nil { logger.Error(fmt.Sprintf("failed to load %s HTTP server configuration : %s", svcName, err)) exitCode = 1 return diff --git a/cmd/things/main.go b/cmd/things/main.go index 3ddf6ebd1..483038dda 100644 --- a/cmd/things/main.go +++ b/cmd/things/main.go @@ -8,6 +8,7 @@ import ( "context" "fmt" "log" + "net/url" "os" "time" @@ -17,7 +18,6 @@ import ( jaegerclient "github.com/absmach/magistrala/internal/clients/jaeger" pgclient "github.com/absmach/magistrala/internal/clients/postgres" redisclient "github.com/absmach/magistrala/internal/clients/redis" - "github.com/absmach/magistrala/internal/env" mggroups "github.com/absmach/magistrala/internal/groups" gapi "github.com/absmach/magistrala/internal/groups/api" gpostgres "github.com/absmach/magistrala/internal/groups/postgres" @@ -38,6 +38,7 @@ import ( thingspg "github.com/absmach/magistrala/things/postgres" localusers "github.com/absmach/magistrala/things/standalone" ctracing "github.com/absmach/magistrala/things/tracing" + "github.com/caarlos0/env/v10" "github.com/go-chi/chi/v5" "github.com/go-redis/redis/v8" "github.com/jmoiron/sqlx" @@ -59,16 +60,16 @@ const ( ) type config struct { - LogLevel string `env:"MG_THINGS_LOG_LEVEL" envDefault:"info"` - StandaloneID string `env:"MG_THINGS_STANDALONE_ID" envDefault:""` - StandaloneToken string `env:"MG_THINGS_STANDALONE_TOKEN" envDefault:""` - JaegerURL string `env:"MG_JAEGER_URL" envDefault:"http://jaeger:14268/api/traces"` - CacheKeyDuration string `env:"MG_THINGS_CACHE_KEY_DURATION" envDefault:"10m"` - SendTelemetry bool `env:"MG_SEND_TELEMETRY" envDefault:"true"` - InstanceID string `env:"MG_THINGS_INSTANCE_ID" envDefault:""` - ESURL string `env:"MG_THINGS_ES_URL" envDefault:"redis://localhost:6379/0"` - CacheURL string `env:"MG_THINGS_CACHE_URL" envDefault:"redis://localhost:6379/0"` - TraceRatio float64 `env:"MG_JAEGER_TRACE_RATIO" envDefault:"1.0"` + LogLevel string `env:"MG_THINGS_LOG_LEVEL" envDefault:"info"` + StandaloneID string `env:"MG_THINGS_STANDALONE_ID" envDefault:""` + StandaloneToken string `env:"MG_THINGS_STANDALONE_TOKEN" envDefault:""` + JaegerURL url.URL `env:"MG_JAEGER_URL" envDefault:"http://jaeger:14268/api/traces"` + CacheKeyDuration time.Duration `env:"MG_THINGS_CACHE_KEY_DURATION" envDefault:"10m"` + SendTelemetry bool `env:"MG_SEND_TELEMETRY" envDefault:"true"` + InstanceID string `env:"MG_THINGS_INSTANCE_ID" envDefault:""` + ESURL string `env:"MG_THINGS_ES_URL" envDefault:"redis://localhost:6379/0"` + CacheURL string `env:"MG_THINGS_CACHE_URL" envDefault:"redis://localhost:6379/0"` + TraceRatio float64 `env:"MG_JAEGER_TRACE_RATIO" envDefault:"1.0"` } func main() { @@ -162,7 +163,7 @@ func main() { } httpServerConfig := server.Config{Port: defSvcHTTPPort} - if err := env.Parse(&httpServerConfig, env.Options{Prefix: envPrefixHTTP}); err != nil { + if err := env.ParseWithOptions(&httpServerConfig, env.Options{Prefix: envPrefixHTTP}); err != nil { logger.Error(fmt.Sprintf("failed to load %s HTTP server configuration : %s", svcName, err)) exitCode = 1 return @@ -171,7 +172,7 @@ func main() { httpSvc := httpserver.New(ctx, cancel, svcName, httpServerConfig, httpapi.MakeHandler(csvc, gsvc, mux, logger, cfg.InstanceID), logger) grpcServerConfig := server.Config{Port: defSvcAuthGRPCPort} - if err := env.Parse(&grpcServerConfig, env.Options{Prefix: envPrefixGRPC}); err != nil { + if err := env.ParseWithOptions(&grpcServerConfig, env.Options{Prefix: envPrefixGRPC}); err != nil { logger.Error(fmt.Sprintf("failed to load %s gRPC server configuration : %s", svcName, err)) exitCode = 1 return @@ -205,24 +206,19 @@ func main() { } } -func newService(ctx context.Context, db *sqlx.DB, dbConfig pgclient.Config, auth magistrala.AuthServiceClient, cacheClient *redis.Client, keyDuration, esURL string, tracer trace.Tracer, logger mglog.Logger) (things.Service, groups.Service, error) { +func newService(ctx context.Context, db *sqlx.DB, dbConfig pgclient.Config, auth magistrala.AuthServiceClient, cacheClient *redis.Client, keyDuration time.Duration, esURL string, tracer trace.Tracer, logger mglog.Logger) (things.Service, groups.Service, error) { database := postgres.NewDatabase(db, dbConfig, tracer) cRepo := thingspg.NewRepository(database) gRepo := gpostgres.New(database) idp := uuid.New() - kDuration, err := time.ParseDuration(keyDuration) - if err != nil { - logger.Error(fmt.Sprintf("failed to parse cache key duration: %s", err.Error())) - } - - thingCache := thcache.NewCache(cacheClient, kDuration) + thingCache := thcache.NewCache(cacheClient, keyDuration) csvc := things.NewService(auth, cRepo, gRepo, thingCache, idp) gsvc := mggroups.NewService(gRepo, idp, auth) - csvc, err = thevents.NewEventStoreMiddleware(ctx, csvc, esURL) + csvc, err := thevents.NewEventStoreMiddleware(ctx, csvc, esURL) if err != nil { return nil, nil, err } diff --git a/cmd/timescale-reader/main.go b/cmd/timescale-reader/main.go index 5764bb0c5..c9fe1ecda 100644 --- a/cmd/timescale-reader/main.go +++ b/cmd/timescale-reader/main.go @@ -14,7 +14,6 @@ import ( "github.com/absmach/magistrala/internal" authclient "github.com/absmach/magistrala/internal/clients/grpc/auth" pgclient "github.com/absmach/magistrala/internal/clients/postgres" - "github.com/absmach/magistrala/internal/env" "github.com/absmach/magistrala/internal/server" httpserver "github.com/absmach/magistrala/internal/server/http" mglog "github.com/absmach/magistrala/logger" @@ -22,6 +21,7 @@ import ( "github.com/absmach/magistrala/readers" "github.com/absmach/magistrala/readers/api" "github.com/absmach/magistrala/readers/timescale" + "github.com/caarlos0/env/v10" "github.com/jmoiron/sqlx" chclient "github.com/mainflux/callhome/pkg/client" "golang.org/x/sync/errgroup" @@ -101,7 +101,7 @@ func main() { logger.Info("Successfully connected to things grpc server " + tcHandler.Secure()) httpServerConfig := server.Config{Port: defSvcHTTPPort} - if err := env.Parse(&httpServerConfig, env.Options{Prefix: envPrefixHTTP}); err != nil { + if err := env.ParseWithOptions(&httpServerConfig, env.Options{Prefix: envPrefixHTTP}); err != nil { logger.Error(fmt.Sprintf("failed to load %s HTTP server configuration : %s", svcName, err)) exitCode = 1 return diff --git a/cmd/timescale-writer/main.go b/cmd/timescale-writer/main.go index d4c0f9da5..bbd9b9d35 100644 --- a/cmd/timescale-writer/main.go +++ b/cmd/timescale-writer/main.go @@ -8,6 +8,7 @@ import ( "context" "fmt" "log" + "net/url" "os" "github.com/absmach/magistrala" @@ -18,13 +19,13 @@ import ( "github.com/absmach/magistrala/internal" jaegerclient "github.com/absmach/magistrala/internal/clients/jaeger" pgclient "github.com/absmach/magistrala/internal/clients/postgres" - "github.com/absmach/magistrala/internal/env" "github.com/absmach/magistrala/internal/server" httpserver "github.com/absmach/magistrala/internal/server/http" mglog "github.com/absmach/magistrala/logger" "github.com/absmach/magistrala/pkg/messaging/brokers" brokerstracing "github.com/absmach/magistrala/pkg/messaging/brokers/tracing" "github.com/absmach/magistrala/pkg/uuid" + "github.com/caarlos0/env/v10" "github.com/jmoiron/sqlx" chclient "github.com/mainflux/callhome/pkg/client" "golang.org/x/sync/errgroup" @@ -42,7 +43,7 @@ type config struct { LogLevel string `env:"MG_TIMESCALE_WRITER_LOG_LEVEL" envDefault:"info"` ConfigPath string `env:"MG_TIMESCALE_WRITER_CONFIG_PATH" envDefault:"/config.toml"` BrokerURL string `env:"MG_MESSAGE_BROKER_URL" envDefault:"nats://localhost:4222"` - JaegerURL string `env:"MG_JAEGER_URL" envDefault:"http://jaeger:14268/api/traces"` + JaegerURL url.URL `env:"MG_JAEGER_URL" envDefault:"http://jaeger:14268/api/traces"` SendTelemetry bool `env:"MG_SEND_TELEMETRY" envDefault:"true"` InstanceID string `env:"MG_TIMESCALE_WRITER_INSTANCE_ID" envDefault:""` TraceRatio float64 `env:"MG_JAEGER_TRACE_RATIO" envDefault:"1.0"` @@ -74,7 +75,7 @@ func main() { } httpServerConfig := server.Config{Port: defSvcHTTPPort} - if err := env.Parse(&httpServerConfig, env.Options{Prefix: envPrefixHTTP}); err != nil { + if err := env.ParseWithOptions(&httpServerConfig, env.Options{Prefix: envPrefixHTTP}); err != nil { logger.Error(fmt.Sprintf("failed to load %s HTTP server configuration : %s", svcName, err)) exitCode = 1 return diff --git a/cmd/twins/main.go b/cmd/twins/main.go index 903d510ef..e900e12c3 100644 --- a/cmd/twins/main.go +++ b/cmd/twins/main.go @@ -8,6 +8,7 @@ import ( "context" "fmt" "log" + "net/url" "os" "github.com/absmach/magistrala" @@ -16,7 +17,6 @@ import ( jaegerclient "github.com/absmach/magistrala/internal/clients/jaeger" mongoclient "github.com/absmach/magistrala/internal/clients/mongo" redisclient "github.com/absmach/magistrala/internal/clients/redis" - "github.com/absmach/magistrala/internal/env" "github.com/absmach/magistrala/internal/server" httpserver "github.com/absmach/magistrala/internal/server/http" mglog "github.com/absmach/magistrala/logger" @@ -31,6 +31,7 @@ import ( "github.com/absmach/magistrala/twins/events" twmongodb "github.com/absmach/magistrala/twins/mongodb" "github.com/absmach/magistrala/twins/tracing" + "github.com/caarlos0/env/v10" "github.com/go-redis/redis/v8" chclient "github.com/mainflux/callhome/pkg/client" "go.mongodb.org/mongo-driver/mongo" @@ -51,7 +52,7 @@ type config struct { StandaloneToken string `env:"MG_TWINS_STANDALONE_TOKEN" envDefault:""` ChannelID string `env:"MG_TWINS_CHANNEL_ID" envDefault:""` BrokerURL string `env:"MG_MESSAGE_BROKER_URL" envDefault:"nats://localhost:4222"` - JaegerURL string `env:"MG_JAEGER_URL" envDefault:"http://jaeger:14268/api/traces"` + JaegerURL url.URL `env:"MG_JAEGER_URL" envDefault:"http://jaeger:14268/api/traces"` SendTelemetry bool `env:"MG_SEND_TELEMETRY" envDefault:"true"` InstanceID string `env:"MG_TWINS_INSTANCE_ID" envDefault:""` ESURL string `env:"MG_TWINS_ES_URL" envDefault:"redis://localhost:6379/0"` @@ -85,7 +86,7 @@ func main() { } httpServerConfig := server.Config{Port: defSvcHTTPPort} - if err := env.Parse(&httpServerConfig, env.Options{Prefix: envPrefixHTTP}); err != nil { + if err := env.ParseWithOptions(&httpServerConfig, env.Options{Prefix: envPrefixHTTP}); err != nil { logger.Error(fmt.Sprintf("failed to load %s HTTP server configuration : %s", svcName, err)) exitCode = 1 return diff --git a/cmd/users/main.go b/cmd/users/main.go index ed1acc93f..6d14c0a28 100644 --- a/cmd/users/main.go +++ b/cmd/users/main.go @@ -8,6 +8,7 @@ import ( "context" "fmt" "log" + "net/url" "os" "regexp" "time" @@ -19,7 +20,6 @@ import ( jaegerclient "github.com/absmach/magistrala/internal/clients/jaeger" pgclient "github.com/absmach/magistrala/internal/clients/postgres" "github.com/absmach/magistrala/internal/email" - "github.com/absmach/magistrala/internal/env" mggroups "github.com/absmach/magistrala/internal/groups" gapi "github.com/absmach/magistrala/internal/groups/api" gevents "github.com/absmach/magistrala/internal/groups/events" @@ -40,6 +40,7 @@ import ( "github.com/absmach/magistrala/users/hasher" clientspg "github.com/absmach/magistrala/users/postgres" ctracing "github.com/absmach/magistrala/users/tracing" + "github.com/caarlos0/env/v10" "github.com/go-chi/chi/v5" "github.com/jmoiron/sqlx" chclient "github.com/mainflux/callhome/pkg/client" @@ -58,20 +59,18 @@ const ( ) type config struct { - LogLevel string `env:"MG_USERS_LOG_LEVEL" envDefault:"info"` - SecretKey string `env:"MG_USERS_SECRET_KEY" envDefault:"secret"` - AdminEmail string `env:"MG_USERS_ADMIN_EMAIL" envDefault:""` - AdminPassword string `env:"MG_USERS_ADMIN_PASSWORD" envDefault:""` - PassRegexText string `env:"MG_USERS_PASS_REGEX" envDefault:"^.{8,}$"` - AccessDuration string `env:"MG_USERS_ACCESS_TOKEN_DURATION" envDefault:"15m"` - RefreshDuration string `env:"MG_USERS_REFRESH_TOKEN_DURATION" envDefault:"24h"` - ResetURL string `env:"MG_TOKEN_RESET_ENDPOINT" envDefault:"/reset-request"` - JaegerURL string `env:"MG_JAEGER_URL" envDefault:"http://jaeger:14268/api/traces"` - SendTelemetry bool `env:"MG_SEND_TELEMETRY" envDefault:"true"` - InstanceID string `env:"MG_USERS_INSTANCE_ID" envDefault:""` - ESURL string `env:"MG_USERS_ES_URL" envDefault:"redis://localhost:6379/0"` - TraceRatio float64 `env:"MG_JAEGER_TRACE_RATIO" envDefault:"1.0"` - PassRegex *regexp.Regexp + LogLevel string `env:"MG_USERS_LOG_LEVEL" envDefault:"info"` + SecretKey string `env:"MG_USERS_SECRET_KEY" envDefault:"secret"` + AdminEmail string `env:"MG_USERS_ADMIN_EMAIL" envDefault:""` + AdminPassword string `env:"MG_USERS_ADMIN_PASSWORD" envDefault:""` + PassRegexText string `env:"MG_USERS_PASS_REGEX" envDefault:"^.{8,}$"` + ResetURL string `env:"MG_TOKEN_RESET_ENDPOINT" envDefault:"/reset-request"` + JaegerURL url.URL `env:"MG_JAEGER_URL" envDefault:"http://jaeger:14268/api/traces"` + SendTelemetry bool `env:"MG_SEND_TELEMETRY" envDefault:"true"` + InstanceID string `env:"MG_USERS_INSTANCE_ID" envDefault:""` + ESURL string `env:"MG_USERS_ES_URL" envDefault:"redis://localhost:6379/0"` + TraceRatio float64 `env:"MG_JAEGER_TRACE_RATIO" envDefault:"1.0"` + PassRegex *regexp.Regexp } func main() { @@ -159,7 +158,7 @@ func main() { } httpServerConfig := server.Config{Port: defSvcHTTPPort} - if err := env.Parse(&httpServerConfig, env.Options{Prefix: envPrefixHTTP}); err != nil { + if err := env.ParseWithOptions(&httpServerConfig, env.Options{Prefix: envPrefixHTTP}); err != nil { logger.Error(fmt.Sprintf("failed to load %s HTTP server configuration : %s", svcName, err.Error())) exitCode = 1 return diff --git a/cmd/ws/main.go b/cmd/ws/main.go index dc5440d1c..8457247d5 100644 --- a/cmd/ws/main.go +++ b/cmd/ws/main.go @@ -8,13 +8,13 @@ import ( "context" "fmt" "log" + "net/url" "os" "github.com/absmach/magistrala" "github.com/absmach/magistrala/internal" authapi "github.com/absmach/magistrala/internal/clients/grpc/auth" jaegerclient "github.com/absmach/magistrala/internal/clients/jaeger" - "github.com/absmach/magistrala/internal/env" "github.com/absmach/magistrala/internal/server" httpserver "github.com/absmach/magistrala/internal/server/http" mglog "github.com/absmach/magistrala/logger" @@ -25,6 +25,7 @@ import ( "github.com/absmach/magistrala/ws" "github.com/absmach/magistrala/ws/api" "github.com/absmach/magistrala/ws/tracing" + "github.com/caarlos0/env/v10" chclient "github.com/mainflux/callhome/pkg/client" "github.com/mainflux/mproxy/pkg/session" "github.com/mainflux/mproxy/pkg/websockets" @@ -43,7 +44,7 @@ const ( type config struct { LogLevel string `env:"MG_WS_ADAPTER_LOG_LEVEL" envDefault:"info"` BrokerURL string `env:"MG_MESSAGE_BROKER_URL" envDefault:"nats://localhost:4222"` - JaegerURL string `env:"MG_JAEGER_URL" envDefault:"http://jaeger:14268/api/traces"` + JaegerURL url.URL `env:"MG_JAEGER_URL" envDefault:"http://jaeger:14268/api/traces"` SendTelemetry bool `env:"MG_SEND_TELEMETRY" envDefault:"true"` InstanceID string `env:"MG_WS_ADAPTER_INSTANCE_ID" envDefault:""` TraceRatio float64 `env:"MG_JAEGER_TRACE_RATIO" envDefault:"1.0"` @@ -75,7 +76,7 @@ func main() { } httpServerConfig := server.Config{Port: defSvcHTTPPort} - if err := env.Parse(&httpServerConfig, env.Options{Prefix: envPrefixHTTP}); err != nil { + if err := env.ParseWithOptions(&httpServerConfig, env.Options{Prefix: envPrefixHTTP}); err != nil { logger.Error(fmt.Sprintf("failed to load %s HTTP server configuration : %s", svcName, err)) exitCode = 1 return diff --git a/docker/.env b/docker/.env index f7cd3c930..f489be59d 100644 --- a/docker/.env +++ b/docker/.env @@ -56,11 +56,10 @@ MG_ES_STORE_TYPE=${MG_MESSAGE_BROKER_TYPE} MG_ES_STORE_URL=${MG_NATS_URL} ## Jaeger -MG_JAEGER_PORT=6831 +MG_JAEGER_COLLECTOR_OTLP_ENABLED=true MG_JAEGER_FRONTEND=16686 -MG_JAEGER_COLLECTOR=14268 -MG_JAEGER_CONFIGS=5778 -MG_JAEGER_URL=http://jaeger:14268/api/traces +MG_JAEGER_OLTP_HTTP=4318 +MG_JAEGER_URL=http://jaeger:4318 MG_JAEGER_TRACE_RATIO=1.0 ## Call home @@ -73,17 +72,35 @@ MG_POSTGRES_MAX_CONNECTIONS=100 ### Auth MG_AUTH_LOG_LEVEL=debug +MG_AUTH_HTTP_HOST=auth MG_AUTH_HTTP_PORT=8189 +MG_AUTH_HTTP_SERVER_CERT= +MG_AUTH_HTTP_SERVER_KEY= +MG_AUTH_GRPC_HOST=auth MG_AUTH_GRPC_PORT=8181 -MG_AUTH_GRPC_URL=auth:8181 -MG_AUTH_GRPC_TIMEOUT=300s +MG_AUTH_GRPC_SERVER_CERT=${GRPC_MTLS:+./ssl/certs/auth-grpc-server.crt}${GRPC_TLS:+./ssl/certs/auth-grpc-server.crt} +MG_AUTH_GRPC_SERVER_KEY=${GRPC_MTLS:+./ssl/certs/auth-grpc-server.key}${GRPC_TLS:+./ssl/certs/auth-grpc-server.key} +MG_AUTH_GRPC_SERVER_CA_CERTS=${GRPC_MTLS:+./ssl/certs/ca.crt}${GRPC_TLS:+./ssl/certs/ca.crt} +MG_AUTH_DB_HOST=auth-db MG_AUTH_DB_PORT=5432 MG_AUTH_DB_USER=magistrala MG_AUTH_DB_PASS=magistrala -MG_AUTH_DB=auth -MG_AUTH_SECRET=secret -MG_AUTH_ACCESS_TOKEN_DURATION="300m" +MG_AUTH_DB_NAME=auth +MG_AUTH_DB_SSL_MODE=disable +MG_AUTH_DB_SSL_CERT= +MG_AUTH_DB_SSL_KEY= +MG_AUTH_DB_SSL_ROOT_CERT= +MG_AUTH_SECRET_KEY=HyE2D4RUt9nnKG6v8zKEqAp6g6ka8hhZsqUpzgKvnwpXrNVQSH +MG_AUTH_ACCESS_TOKEN_DURATION="1h" +MG_AUTH_REFRESH_TOKEN_DURATION="24h" +MG_AUTH_ADAPTER_INSTANCE_ID= +#### Auth GRPC Client Config +MG_AUTH_GRPC_URL=auth:8181 +MG_AUTH_GRPC_TIMEOUT=300s +MG_AUTH_GRPC_CLIENT_CERT=${GRPC_MTLS:+./ssl/certs/auth-grpc-client.crt} +MG_AUTH_GRPC_CLIENT_KEY=${GRPC_MTLS:+./ssl/certs/auth-grpc-client.key} +MG_AUTH_GRPC_CLIENT_CA_CERTS=${GRPC_MTLS:+./ssl/certs/ca.crt} ### SpiceDB Datastore config MG_SPICEDB_DB_USER=magistrala diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml index b3004bbca..35607a912 100644 --- a/docker/docker-compose.yml +++ b/docker/docker-compose.yml @@ -79,7 +79,7 @@ services: environment: POSTGRES_USER: ${MG_AUTH_DB_USER} POSTGRES_PASSWORD: ${MG_AUTH_DB_PASS} - POSTGRES_DB: ${MG_AUTH_DB} + POSTGRES_DB: ${MG_AUTH_DB_NAME} networks: - magistrala-base-net volumes: @@ -95,19 +95,38 @@ services: - ${MG_AUTH_GRPC_PORT} restart: on-failure environment: + MG_AUTH_LOG_LEVEL: ${MG_AUTH_LOG_LEVEL} MG_SPICEDB_SCHEMA_FILE: ${MG_SPICEDB_SCHEMA_FILE} MG_SPICEDB_HOST: ${MG_SPICEDB_HOST} MG_SPICEDB_PORT: ${MG_SPICEDB_PORT} - MG_AUTH_LOG_LEVEL: ${MG_AUTH_LOG_LEVEL} - MG_AUTH_DB_HOST: auth-db + MG_AUTH_ACCESS_TOKEN_DURATION: ${MG_AUTH_ACCESS_TOKEN_DURATION} + MG_AUTH_REFRESH_TOKEN_DURATION: ${MG_AUTH_REFRESH_TOKEN_DURATION} + MG_AUTH_SECRET_KEY: ${MG_AUTH_SECRET_KEY} + MG_AUTH_HTTP_HOST: ${MG_AUTH_HTTP_HOST} + MG_AUTH_HTTP_PORT: ${MG_AUTH_HTTP_PORT} + MG_AUTH_HTTP_SERVER_CERT: ${MG_AUTH_HTTP_SERVER_CERT} + MG_AUTH_HTTP_SERVER_KEY: ${MG_AUTH_HTTP_SERVER_KEY} + MG_AUTH_GRPC_HOST: ${MG_AUTH_GRPC_HOST} + MG_AUTH_GRPC_PORT: ${MG_AUTH_GRPC_PORT} + ## Compose supports parameter expansion in environment, + ## Eg: ${VAR:+replacement} or ${VAR+replacement} -> replacement if VAR is set and non-empty, otherwise empty + ## Eg :${VAR:-default} or ${VAR-default} -> value of VAR if set and non-empty, otherwise default + MG_AUTH_GRPC_SERVER_CERT: ${MG_AUTH_GRPC_SERVER_CERT:+/auth-grpc-server.crt} + MG_AUTH_GRPC_SERVER_KEY: ${MG_AUTH_GRPC_SERVER_KEY:+/auth-grpc-server.key} + MG_AUTH_GRPC_SERVER_CA_CERTS: ${MG_AUTH_GRPC_SERVER_CA_CERTS:+/auth-grpc-server-ca.crt} + MG_AUTH_DB_HOST: ${MG_AUTH_DB_HOST} MG_AUTH_DB_PORT: ${MG_AUTH_DB_PORT} MG_AUTH_DB_USER: ${MG_AUTH_DB_USER} MG_AUTH_DB_PASS: ${MG_AUTH_DB_PASS} - MG_AUTH_DB: ${MG_AUTH_DB} - MG_AUTH_HTTP_PORT: ${MG_AUTH_HTTP_PORT} - MG_AUTH_GRPC_PORT: ${MG_AUTH_GRPC_PORT} - MG_AUTH_SECRET: ${MG_AUTH_SECRET} - MG_AUTH_ACCESS_TOKEN_DURATION: ${MG_AUTH_ACCESS_TOKEN_DURATION} + MG_AUTH_DB_NAME: ${MG_AUTH_DB_NAME} + MG_AUTH_DB_SSL_MODE: ${MG_AUTH_DB_SSL_MODE} + MG_AUTH_DB_SSL_CERT: ${MG_AUTH_DB_SSL_CERT} + MG_AUTH_DB_SSL_KEY: ${MG_AUTH_DB_SSL_KEY} + MG_AUTH_DB_SSL_ROOT_CERT: ${MG_AUTH_DB_SSL_ROOT_CERT} + MG_JAEGER_URL: ${MG_JAEGER_URL} + MG_JAEGER_TRACE_RATIO: ${MG_JAEGER_TRACE_RATIO} + MG_SEND_TELEMETRY: ${MG_SEND_TELEMETRY} + MG_AUTH_ADAPTER_INSTANCE_ID: ${MG_AUTH_ADAPTER_INSTANCE_ID} ports: - ${MG_AUTH_HTTP_PORT}:${MG_AUTH_HTTP_PORT} - ${MG_AUTH_GRPC_PORT}:${MG_AUTH_GRPC_PORT} @@ -353,11 +372,11 @@ services: jaeger: image: jaegertracing/all-in-one:1.38.0 container_name: magistrala-jaeger + environment: + COLLECTOR_OTLP_ENABLED: ${MG_JAEGER_COLLECTOR_OTLP_ENABLED} ports: - - ${MG_JAEGER_PORT}:${MG_JAEGER_PORT}/udp - ${MG_JAEGER_FRONTEND}:${MG_JAEGER_FRONTEND} - - ${MG_JAEGER_COLLECTOR}:${MG_JAEGER_COLLECTOR} - - ${MG_JAEGER_CONFIGS}:${MG_JAEGER_CONFIGS} + - ${MG_JAEGER_OLTP_HTTP}:${MG_JAEGER_OLTP_HTTP} networks: - magistrala-base-net diff --git a/go.mod b/go.mod index eba81976f..59051d464 100644 --- a/go.mod +++ b/go.mod @@ -6,7 +6,7 @@ require ( github.com/0x6flab/namegenerator v1.1.0 github.com/authzed/authzed-go v0.10.1 github.com/authzed/grpcutil v0.0.0-20230908193239-4286bb1d6403 - github.com/caarlos0/env/v7 v7.1.0 + github.com/caarlos0/env/v10 v10.0.0 github.com/cenkalti/backoff/v4 v4.2.1 github.com/docker/docker v24.0.7+incompatible github.com/eclipse/paho.mqtt.golang v1.4.3 diff --git a/go.sum b/go.sum index 595e6a91c..646a3358f 100644 --- a/go.sum +++ b/go.sum @@ -131,8 +131,8 @@ github.com/bytedance/sonic v1.10.0-rc/go.mod h1:ElCzW+ufi8qKqNW0FY314xriJhyJhuoJ github.com/bytedance/sonic v1.10.2 h1:GQebETVBxYB7JGWJtLBi07OVzWwt+8dWA00gEVW2ZFE= github.com/bytedance/sonic v1.10.2/go.mod h1:iZcSUejdk5aukTND/Eu/ivjQuEL0Cu9/rf50Hi0u/g4= github.com/c-bata/go-prompt v0.2.2/go.mod h1:VzqtzE2ksDBcdln8G7mk2RX9QyGjH+OVqOCSiVIqS34= -github.com/caarlos0/env/v7 v7.1.0 h1:9lzTF5amyQeWHZzuZeKlCb5FWSUxpG1js43mhbY8ozg= -github.com/caarlos0/env/v7 v7.1.0/go.mod h1:LPPWniDUq4JaO6Q41vtlyikhMknqymCLBw0eX4dcH1E= +github.com/caarlos0/env/v10 v10.0.0 h1:yIHUBZGsyqCnpTkbjk8asUlx6RFhhEs+h7TOBdgdzXA= +github.com/caarlos0/env/v10 v10.0.0/go.mod h1:ZfulV76NvVPw3tm591U4SwL3Xx9ldzBP9aGxzeN7G18= github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ= github.com/cenkalti/backoff v2.0.0+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= diff --git a/internal/clients/cassandra/cassandra.go b/internal/clients/cassandra/cassandra.go index 480246dd3..710e666aa 100644 --- a/internal/clients/cassandra/cassandra.go +++ b/internal/clients/cassandra/cassandra.go @@ -4,8 +4,8 @@ package cassandra import ( - "github.com/absmach/magistrala/internal/env" "github.com/absmach/magistrala/pkg/errors" + "github.com/caarlos0/env/v10" "github.com/gocql/gocql" ) @@ -34,7 +34,7 @@ func Setup(envPrefix string) (*gocql.Session, error) { // the initial query in database. func SetupDB(envPrefix string, initQuery string) (*gocql.Session, error) { config := Config{} - if err := env.Parse(&config, env.Options{Prefix: envPrefix}); err != nil { + if err := env.ParseWithOptions(&config, env.Options{Prefix: envPrefix}); err != nil { return nil, errors.Wrap(errConfig, err) } cs, err := Connect(config) diff --git a/internal/clients/grpc/auth/client.go b/internal/clients/grpc/auth/client.go index 6acdaee14..845a04389 100644 --- a/internal/clients/grpc/auth/client.go +++ b/internal/clients/grpc/auth/client.go @@ -7,9 +7,9 @@ import ( "github.com/absmach/magistrala" authgrpc "github.com/absmach/magistrala/auth/api/grpc" grpcclient "github.com/absmach/magistrala/internal/clients/grpc" - "github.com/absmach/magistrala/internal/env" "github.com/absmach/magistrala/pkg/errors" thingsauth "github.com/absmach/magistrala/things/api/grpc" + "github.com/caarlos0/env/v10" ) const ( @@ -22,7 +22,7 @@ var errGrpcConfig = errors.New("failed to load grpc configuration") // Setup loads Auth gRPC configuration from environment variable and creates new Auth gRPC API. func Setup(svcName string) (magistrala.AuthServiceClient, grpcclient.ClientHandler, error) { config := grpcclient.Config{} - if err := env.Parse(&config, env.Options{Prefix: envAuthGrpcPrefix}); err != nil { + if err := env.ParseWithOptions(&config, env.Options{Prefix: envAuthGrpcPrefix}); err != nil { return nil, nil, errors.Wrap(errGrpcConfig, err) } c, ch, err := grpcclient.Setup(config, svcName) @@ -36,7 +36,7 @@ func Setup(svcName string) (magistrala.AuthServiceClient, grpcclient.ClientHandl // Setup loads Auth gRPC configuration from environment variable and creates new Auth gRPC API. func SetupAuthz(svcName string) (magistrala.AuthzServiceClient, grpcclient.ClientHandler, error) { config := grpcclient.Config{} - if err := env.Parse(&config, env.Options{Prefix: envAuthzGrpcPrefix}); err != nil { + if err := env.ParseWithOptions(&config, env.Options{Prefix: envAuthzGrpcPrefix}); err != nil { return nil, nil, errors.Wrap(errGrpcConfig, err) } c, ch, err := grpcclient.Setup(config, svcName) diff --git a/internal/clients/influxdb/influxdb.go b/internal/clients/influxdb/influxdb.go index 306274e59..220d23f46 100644 --- a/internal/clients/influxdb/influxdb.go +++ b/internal/clients/influxdb/influxdb.go @@ -7,8 +7,8 @@ import ( "context" "time" - "github.com/absmach/magistrala/internal/env" "github.com/absmach/magistrala/pkg/errors" + "github.com/caarlos0/env/v10" influxdb2 "github.com/influxdata/influxdb-client-go/v2" ) @@ -36,7 +36,7 @@ type Config struct { // Setup load configuration from environment variable, create InfluxDB client and connect to InfluxDB server. func Setup(ctx context.Context, envPrefix string) (influxdb2.Client, error) { config := Config{} - if err := env.Parse(&config, env.Options{Prefix: envPrefix}); err != nil { + if err := env.ParseWithOptions(&config, env.Options{Prefix: envPrefix}); err != nil { return nil, errors.Wrap(errConfig, err) } return Connect(ctx, config) diff --git a/internal/clients/jaeger/provider.go b/internal/clients/jaeger/provider.go index ecf08623c..a78519f70 100644 --- a/internal/clients/jaeger/provider.go +++ b/internal/clients/jaeger/provider.go @@ -25,8 +25,8 @@ var ( ) // NewProvider initializes Jaeger TraceProvider. -func NewProvider(ctx context.Context, svcName, jaegerUrl, instanceID string, fraction float64) (*trace.TracerProvider, error) { - if jaegerUrl == "" { +func NewProvider(ctx context.Context, svcName string, jaegerUrl url.URL, instanceID string, fraction float64) (*trace.TracerProvider, error) { + if jaegerUrl == (url.URL{}) { return nil, errNoURL } @@ -34,27 +34,21 @@ func NewProvider(ctx context.Context, svcName, jaegerUrl, instanceID string, fra return nil, errNoSvcName } - url, err := url.Parse(jaegerUrl) - if err != nil { - return nil, err - } - - var exporter *otlptrace.Exporter - switch url.Scheme { + var client otlptrace.Client + switch jaegerUrl.Scheme { case "http": - exporter, err = otlptracehttp.New(ctx, otlptracehttp.WithEndpoint(url.Host), otlptracehttp.WithURLPath(url.Path), otlptracehttp.WithInsecure()) - if err != nil { - return nil, err - } + client = otlptracehttp.NewClient(otlptracehttp.WithEndpoint(jaegerUrl.Host), otlptracehttp.WithURLPath(jaegerUrl.Path), otlptracehttp.WithInsecure()) case "https": - exporter, err = otlptracehttp.New(ctx, otlptracehttp.WithEndpoint(url.Host), otlptracehttp.WithURLPath(url.Path)) - if err != nil { - return nil, err - } + client = otlptracehttp.NewClient(otlptracehttp.WithEndpoint(jaegerUrl.Host), otlptracehttp.WithURLPath(jaegerUrl.Path)) default: return nil, errUnsupportedTraceURLScheme } + exporter, err := otlptrace.New(ctx, client) + if err != nil { + return nil, err + } + attributes := []attribute.KeyValue{ semconv.ServiceNameKey.String(svcName), attribute.String("host.id", instanceID), diff --git a/internal/clients/mongo/mongo.go b/internal/clients/mongo/mongo.go index 342759690..13bf65703 100644 --- a/internal/clients/mongo/mongo.go +++ b/internal/clients/mongo/mongo.go @@ -7,8 +7,8 @@ import ( "context" "fmt" - "github.com/absmach/magistrala/internal/env" "github.com/absmach/magistrala/pkg/errors" + "github.com/caarlos0/env/v10" "go.mongodb.org/mongo-driver/mongo" "go.mongodb.org/mongo-driver/mongo/options" ) @@ -40,7 +40,7 @@ func Connect(cfg Config) (*mongo.Database, error) { // Setup load configuration from environment, create new MongoDB client and connect to MongoDB server. func Setup(envPrefix string) (*mongo.Database, error) { cfg := Config{} - if err := env.Parse(&cfg, env.Options{Prefix: envPrefix}); err != nil { + if err := env.ParseWithOptions(&cfg, env.Options{Prefix: envPrefix}); err != nil { return nil, errors.Wrap(errConfig, err) } db, err := Connect(cfg) diff --git a/internal/clients/postgres/postgres.go b/internal/clients/postgres/postgres.go index 721cc97db..3e7b4be29 100644 --- a/internal/clients/postgres/postgres.go +++ b/internal/clients/postgres/postgres.go @@ -6,8 +6,8 @@ package postgres import ( "fmt" - "github.com/absmach/magistrala/internal/env" "github.com/absmach/magistrala/pkg/errors" + "github.com/caarlos0/env/v10" _ "github.com/jackc/pgx/v5/stdlib" // required for SQL access "github.com/jmoiron/sqlx" migrate "github.com/rubenv/sql-migrate" @@ -41,7 +41,7 @@ func Setup(prefix string, migrations migrate.MemoryMigrationSource) (*sqlx.DB, e // unapplied database migrations. A non-nil error is returned to indicate failure. func SetupWithConfig(prefix string, migrations migrate.MemoryMigrationSource, defConfig Config) (*sqlx.DB, error) { cfg := defConfig - if err := env.Parse(&cfg, env.Options{Prefix: prefix}); err != nil { + if err := env.ParseWithOptions(&cfg, env.Options{Prefix: prefix}); err != nil { return nil, errors.Wrap(errConfig, err) } return SetupDB(cfg, migrations) @@ -82,7 +82,7 @@ func MigrateDB(db *sqlx.DB, migrations migrate.MemoryMigrationSource) error { } func (c *Config) LoadEnv(prefix string) error { - if err := env.Parse(c, env.Options{Prefix: prefix}); err != nil { + if err := env.ParseWithOptions(c, env.Options{Prefix: prefix}); err != nil { return errors.Wrap(errConfig, err) } return nil diff --git a/internal/env/doc.go b/internal/env/doc.go deleted file mode 100644 index c5eb09084..000000000 --- a/internal/env/doc.go +++ /dev/null @@ -1,6 +0,0 @@ -// Copyright (c) Magistrala -// SPDX-License-Identifier: Apache-2.0 - -// Package env contains the domain concept definitions needed to support -// magistrala environment variable functionality. -package env diff --git a/internal/env/parser.go b/internal/env/parser.go deleted file mode 100644 index 17381d1d4..000000000 --- a/internal/env/parser.go +++ /dev/null @@ -1,41 +0,0 @@ -// Copyright (c) Magistrala -// SPDX-License-Identifier: Apache-2.0 - -package env - -import ( - "github.com/caarlos0/env/v7" -) - -type Options struct { - // Environment keys and values that will be accessible for the service - Environment map[string]string - - // TagName specifies another tagname to use rather than the default env - TagName string - - // RequiredIfNoDef automatically sets all env as required if they do not declare 'envDefault' - RequiredIfNoDef bool - - // OnSet allows to run a function when a value is set - OnSet env.OnSetFn - - // Prefix define a prefix for each key - Prefix string -} - -func Parse(v interface{}, opts ...Options) error { - altOpts := []env.Options{} - - for _, opt := range opts { - altOpts = append(altOpts, env.Options{ - Environment: opt.Environment, - TagName: opt.TagName, - RequiredIfNoDef: opt.RequiredIfNoDef, - OnSet: opt.OnSet, - Prefix: opt.Prefix, - }) - } - - return env.Parse(v, altOpts...) -} diff --git a/internal/env/parser_test.go b/internal/env/parser_test.go deleted file mode 100644 index a914e7118..000000000 --- a/internal/env/parser_test.go +++ /dev/null @@ -1,235 +0,0 @@ -// Copyright (c) Magistrala -// SPDX-License-Identifier: Apache-2.0 - -package env - -import ( - "fmt" - "testing" - "time" - - "github.com/absmach/magistrala/internal/clients/grpc" - "github.com/absmach/magistrala/internal/server" - "github.com/absmach/magistrala/pkg/errors" - "github.com/stretchr/testify/assert" -) - -var errNotDuration error = errors.New("unable to parse duration") - -func TestParseServerConfig(t *testing.T) { - tests := []struct { - description string - config *server.Config - expectedConfig *server.Config - options []Options - err error - }{ - { - "Parsing with Server Config", - &server.Config{}, - &server.Config{ - Host: "localhost", - Port: "8080", - CertFile: "cert", - KeyFile: "key", - ServerCAFile: "server-ca-certs", - ClientCAFile: "client-ca-certs", - }, - []Options{ - { - Environment: map[string]string{ - "HOST": "localhost", - "PORT": "8080", - "SERVER_CERT": "cert", - "SERVER_KEY": "key", - "SERVER_CA_CERTS": "server-ca-certs", - "CLIENT_CA_CERTS": "client-ca-certs", - }, - }, - }, - nil, - }, - { - "Parsing with Server Config with Prefix", - &server.Config{}, - &server.Config{ - Host: "localhost", - Port: "8080", - CertFile: "cert", - KeyFile: "key", - ServerCAFile: "server-ca-certs", - ClientCAFile: "client-ca-certs", - }, - []Options{ - { - Environment: map[string]string{ - "MG-HOST": "localhost", - "MG-PORT": "8080", - "MG-SERVER_CERT": "cert", - "MG-SERVER_KEY": "key", - "MG-SERVER_CA_CERTS": "server-ca-certs", - "MG-CLIENT_CA_CERTS": "client-ca-certs", - }, - Prefix: "MG-", - }, - }, - nil, - }, - } - for _, test := range tests { - err := Parse(test.config, test.options...) - switch test.err { - case nil: - assert.NoError(t, err, fmt.Sprintf("%s: expected no error but got %v", test.description, err)) - default: - assert.Error(t, err, fmt.Sprintf("%s: expected error but got nil", test.description)) - } - assert.Equal(t, test.expectedConfig, test.config, fmt.Sprintf("%s: expected %v got %v", test.description, test.expectedConfig, test.config)) - } -} - -func TestParseGRPCConfig(t *testing.T) { - tests := []struct { - description string - config *grpc.Config - expectedConfig *grpc.Config - options []Options - err error - }{ - { - "Parsing a grpc.Config struct", - &grpc.Config{}, - &grpc.Config{ - URL: "val.com", - Timeout: time.Second, - }, - []Options{ - { - Environment: map[string]string{ - "URL": "val.com", - "TIMEOUT": time.Second.String(), - }, - }, - }, - nil, - }, - { - "Invalid type parsing", - &grpc.Config{}, - &grpc.Config{URL: "val.com"}, - []Options{ - { - Environment: map[string]string{ - "URL": "val.com", - "TIMEOUT": "invalid", - }, - }, - }, - errNotDuration, - }, - { - "Parsing all configs", - &grpc.Config{}, - &grpc.Config{ - URL: "val.com", - Timeout: time.Second, - ServerCAFile: "server-ca-cert", - ClientCert: "client-cert", - ClientKey: "client-key", - }, - []Options{ - { - Environment: map[string]string{ - "MG-URL": "val.com", - "MG-TIMEOUT": "1s", - "MG-SERVER_CA_CERTS": "server-ca-cert", - "MG-CLIENT_CERT": "client-cert", - "MG-CLIENT_KEY": "client-key", - }, - Prefix: "MG-", - }, - }, - nil, - }, - } - for _, test := range tests { - err := Parse(test.config, test.options...) - switch test.err { - case nil: - assert.NoError(t, err, fmt.Sprintf("%s: expected no error but got %v", test.description, err)) - default: - assert.Error(t, err, fmt.Sprintf("%s: expected error but got nil", test.description)) - } - assert.Equal(t, test.expectedConfig, test.config, fmt.Sprintf("%s: expected %v got %v", test.description, test.expectedConfig, test.config)) - } -} - -func TestParseCustomConfig(t *testing.T) { - type CustomConfig struct { - Field1 string `env:"FIELD1" envDefault:"val1"` - Field2 int `env:"FIELD2"` - } - - tests := []struct { - description string - config *CustomConfig - expectedConfig *CustomConfig - options []Options - err error - }{ - { - "parse with missing required field", - &CustomConfig{}, - &CustomConfig{Field1: "test val"}, - []Options{ - { - Environment: map[string]string{ - "FIELD1": "test val", - }, - RequiredIfNoDef: true, - }, - }, - errors.New(`required environment variable "FIELD2" not set`), - }, - { - "parse with wrong type", - &CustomConfig{}, - &CustomConfig{Field1: "test val"}, - []Options{ - { - Environment: map[string]string{ - "FIELD1": "test val", - "FIELD2": "not int", - }, - }, - }, - errors.New(`strconv.ParseInt`), - }, - { - "parse with prefix", - &CustomConfig{}, - &CustomConfig{Field1: "test val", Field2: 2}, - []Options{ - { - Environment: map[string]string{ - "MG-FIELD1": "test val", - "MG-FIELD2": "2", - }, - Prefix: "MG-", - }, - }, - nil, - }, - } - - for _, test := range tests { - err := Parse(test.config, test.options...) - switch test.err { - case nil: - assert.NoError(t, err, fmt.Sprintf("expected no error but got %v", err)) - default: - assert.Error(t, err, "expected error but got nil") - } - assert.Equal(t, test.expectedConfig, test.config, fmt.Sprintf("expected %v got %v", test.expectedConfig, test.config)) - } -}