logging and client, context utils

This commit is contained in:
2024-11-16 14:02:46 -05:00
parent 46fa5ea6bf
commit 9af155dbde
15 changed files with 405 additions and 85 deletions

View File

@ -0,0 +1,28 @@
package util
// These constants contain typed values
// for safely setting and retrieving flags
// from the cobra command
const (
FLAG_APIKEY = "apiKey"
ENV_API = "EIA_API_KEY"
FLAG_TMOUT = "timeout"
ENV_TMOUT = "EIA_API_TMOUT"
FLAG_API_LOG_LEVEL = "apiLogLevel"
ENV_API_LOG_LEVEL = "EIA_API_LOG_LEVEL"
FLAG_LOG_LEVEL = "logLevel"
ENV_LOG_LEVEL = "LOG_LEVEL"
)
// Type for context data
type eiaCtxField uint8
// These constants contain fields to safely set
// or get fields from the command context
const (
CTX_EIA_CLIENT eiaCtxField = iota
CTX_EIA_TMOUT
)

View File

@ -0,0 +1,67 @@
package util
import (
"context"
"errors"
"os"
"time"
"github.com/rs/zerolog"
"github.com/spf13/cobra"
"gitea.libretechconsulting.com/50W/eia-api-go/pkg/eia"
)
var (
DefRequestTimeout = 5 * time.Second
DefAPILogLevel = zerolog.DebugLevel
)
func RequestCtx(cmd *cobra.Command) (context.Context, context.CancelFunc) {
return context.WithTimeout(cmd.Context(), GetRequestTmout(cmd))
}
func GetRequestTmout(cmd *cobra.Command) time.Duration {
tmout, ok := cmd.Context().Value(CTX_EIA_TMOUT).(time.Duration)
if !ok || tmout == 0 {
return DefRequestTimeout
}
return tmout
}
func SetRequestTmout(cmd *cobra.Command, tmout time.Duration) {
cmd.SetContext(context.WithValue(cmd.Context(),
CTX_EIA_TMOUT, tmout))
}
func Client(cmd *cobra.Command) (*eia.Client, error) {
client, ok := cmd.Context().Value(CTX_EIA_CLIENT).(*eia.Client)
if !ok {
return nil, errors.New("command context lacks api client")
}
return client, nil
}
func SetClient(cmd *cobra.Command, _ []string) {
client, err := eia.NewClient(&eia.ClientOpts{
Context: cmd.Context(),
APIKey: GetAPIKey(cmd),
Logger: Logger(cmd),
LogLevel: GetAPILogLevel(cmd),
})
if err != nil {
Logger(cmd).Fatal().Err(err).Send()
}
cmd.SetContext(context.WithValue(cmd.Context(),
CTX_EIA_CLIENT, client))
}
func GetAPIKey(cmd *cobra.Command) string {
if key := os.Getenv(ENV_API); key != "" {
return key
}
key, _ := cmd.Flags().GetString(FLAG_APIKEY)
return key
}

View File

@ -0,0 +1,74 @@
package util
import (
"os"
"github.com/rs/zerolog"
"github.com/spf13/cobra"
)
var DefaultLogLevel = zerolog.InfoLevel
func Logger(cmd *cobra.Command) *zerolog.Logger {
return zerolog.Ctx(cmd.Context())
}
func SetLogger(cmd *cobra.Command, logger *zerolog.Logger) {
cmd.SetContext(logger.WithContext(cmd.Context()))
}
func GetLogLevel(cmd *cobra.Command) *zerolog.Level {
var level zerolog.Level
var err error
if envLevel := os.Getenv(ENV_LOG_LEVEL); envLevel != "" {
level, err = zerolog.ParseLevel(envLevel)
if err != nil {
Logger(cmd).Err(err).
Str("envLogLevel", envLevel).
Str("envVar", ENV_LOG_LEVEL).
Str("defaultLevel", DefaultLogLevel.String()).
Msg("Invalid log level in environment, using default")
level = DefaultLogLevel
}
}
if flagLevel, err := cmd.Flags().GetString(FLAG_LOG_LEVEL); err == nil {
level, err = zerolog.ParseLevel(flagLevel)
if err != nil {
Logger(cmd).Err(err).
Str("flagLogLevel", flagLevel).
Str("defaultLevel", DefaultLogLevel.String()).
Msg("Invalid log level in command flag, using default")
level = DefaultLogLevel
}
}
return &level
}
func GetAPILogLevel(cmd *cobra.Command) *zerolog.Level {
var level zerolog.Level
var err error
if envLevel := os.Getenv(ENV_API_LOG_LEVEL); envLevel != "" {
level, err = zerolog.ParseLevel(envLevel)
if err != nil {
Logger(cmd).Err(err).
Str("envLogLevel", envLevel).
Str("envVar", ENV_API_LOG_LEVEL).
Str("defaultLevel", DefAPILogLevel.String()).
Msg("Invalid API log level in environment, using default")
level = DefAPILogLevel
}
}
if flagLevel, err := cmd.Flags().GetString(FLAG_API_LOG_LEVEL); err == nil {
level, err = zerolog.ParseLevel(flagLevel)
if err != nil {
Logger(cmd).Err(err).
Str("flagLogLevel", flagLevel).
Str("defaultLevel", DefAPILogLevel.String()).
Msg("Invalid API log level in command flag, using default")
level = DefAPILogLevel
}
}
return &level
}