@@ -8,18 +8,19 @@ package config
88import (
99 "compress/gzip"
1010 "errors"
11- "fmt"
1211 "log/slog"
12+ "os"
1313 "regexp"
1414
15- "github.com/DataDog/datadog-serverless-functions/aws/logs_monitoring_go/internal/filtering"
1615 "github.com/DataDog/datadog-serverless-functions/aws/logs_monitoring_go/internal/model"
17- "github.com/DataDog/datadog-serverless-functions/aws/logs_monitoring_go/internal/scrubbing"
1816)
1917
2018const (
21- DefaultSite = "datadoghq.com"
22- DefaultLogLevel = "INFO"
19+ DefaultSite = "datadoghq.com"
20+ DefaultPort = "443"
21+ DefaultProtocol = "https"
22+ DefaultLogLevel = "INFO"
23+
2324 EnvAPIKey = "DD_API_KEY"
2425 EnvSite = "DD_SITE"
2526 EnvURL = "DD_URL"
@@ -40,97 +41,92 @@ const (
4041 EnvRedactEmail = "REDACT_EMAIL"
4142 EnvIncludeAtMatch = "INCLUDE_AT_MATCH"
4243 EnvExcludeAtMatch = "EXCLUDE_AT_MATCH"
44+ EnvS3RetryBucketName = "DD_S3_BUCKET_NAME"
45+ EnvStoreFailedEvents = "DD_STORE_FAILED_EVENTS"
4346 ForwarderVersion = "6.0"
4447)
4548
4649type Config struct {
4750 APIKey string
4851 APIURL string
49- CompressionLevel int
50- Filter * filtering.Filter
51- Host string
5252 IntakeURL string
53- LogLevel string
54- Port string
55- S3MultilineLogRegex * regexp.Regexp
56- Scrubber * scrubbing.Scrubber
57- Service string
58- Site string
53+ CompressionLevel int
5954 SkipServerCertificate bool
55+ UseFIPS bool
56+ Host string
6057 Source string
58+ Service string
6159 Tags model.Tags
62- UseFIPS bool
63- UseHTTP bool
60+ S3MultilineLogRegex * regexp.Regexp
61+ FilterInclude * regexp.Regexp
62+ FilterExclude * regexp.Regexp
63+ ScrubbingRegex * regexp.Regexp
64+ ScrubbingReplacement string
65+ ScrubIP bool
66+ ScrubEmail bool
67+ StoreOnFail bool
68+ S3RetryBucketName string
6469}
6570
6671func Load () (* Config , error ) {
67- logLevel := envOrDefault (EnvLogLevel , DefaultLogLevel )
68- initLogger (logLevel )
72+ initLogger (envOrDefault (EnvLogLevel , DefaultLogLevel ))
6973 logDroppedEnvVars ()
7074
7175 var cfg Config
72- cfg .LogLevel = logLevel
7376 cfg .loadEnv ()
7477 cfg .extractFromEnv ()
7578
76- err := cfg .compileS3MultilineLogRegex ()
77-
78- scrubber , scrubbingErr := scrubbing .NewScrubber (
79- envOrDefault (EnvScrubbingRule , "" ),
80- envOrDefault (EnvScrubbingRuleReplacement , "" ),
81- envOrDefaultBool (EnvRedactIP , false ),
82- envOrDefaultBool (EnvRedactEmail , false ),
83- )
84- err = errors .Join (err , scrubbingErr )
85-
86- filter , filteringErr := filtering .NewFilter (
87- envOrDefault (EnvIncludeAtMatch , "" ),
88- envOrDefault (EnvExcludeAtMatch , "" ),
89- )
90- err = errors .Join (err , filteringErr )
91- if err != nil {
92- return nil , err
79+ var errs []error
80+ patterns := []struct {
81+ env string
82+ field * * regexp.Regexp
83+ }{
84+ {env : EnvScrubbingRule , field : & cfg .ScrubbingRegex },
85+ {env : EnvIncludeAtMatch , field : & cfg .FilterInclude },
86+ {env : EnvExcludeAtMatch , field : & cfg .FilterExclude },
87+ {env : EnvMultilineLogRegex , field : & cfg .S3MultilineLogRegex },
88+ }
89+ for _ , pattern := range patterns {
90+ if envValue := os .Getenv (pattern .env ); envValue != "" {
91+ re , err := regexp .Compile (envValue )
92+ * pattern .field = re
93+ errs = append (errs , err )
94+ }
9395 }
9496
95- cfg .Scrubber = scrubber
96- cfg .Filter = filter
97- return & cfg , nil
97+ return & cfg , errors .Join (errs ... )
9898}
9999
100100func (c * Config ) loadEnv () {
101- c .Site = envOrDefault (EnvSite , DefaultSite )
101+ site := envOrDefault (EnvSite , DefaultSite )
102+ port := envOrDefault (EnvPort , DefaultPort )
103+ protocol := DefaultProtocol
104+
102105 c .SkipServerCertificate = envOrDefaultBool (EnvSkipServerCertificate , false )
103- c .UseHTTP = envOrDefaultBool (EnvUseHTTP , false )
104106
105- protocol := "https"
106- if c .UseHTTP {
107+ if envOrDefaultBool (EnvUseHTTP , false ) {
107108 protocol = "http"
108109 }
109110
110111 compressionLevel := envOrDefaultInt (EnvCompressionLevel , gzip .DefaultCompression )
111112 if compressionLevel < gzip .HuffmanOnly || compressionLevel > gzip .BestCompression {
112113 slog .Warn ("invalid compression level, falling back to default" , slog .Int ("level" , compressionLevel ), slog .Int ("fallback" , gzip .DefaultCompression ))
113- compressionLevel = gzip .BestCompression
114+ compressionLevel = gzip .DefaultCompression
114115 }
115116 c .CompressionLevel = compressionLevel
116117
117- c .Port = envOrDefault (EnvPort , "443 " )
118- c .IntakeURL = envOrDefault (EnvURL , protocol + "://http-intake.logs." + c . Site + ":" + c . Port + "/api/v2/logs" )
119- c . APIURL = envOrDefault ( EnvAPIURL , protocol + "://api." + c . Site )
118+ c .IntakeURL = envOrDefault (EnvURL , protocol + "://http-intake.logs." + site + ":" + port + "/api/v2/logs " )
119+ c .APIURL = envOrDefault (EnvAPIURL , protocol + "://api." + site )
120+
120121 c .UseFIPS = envOrDefaultBool (EnvUseFIPS , false )
122+
121123 c .Source = envOrDefault (EnvSource , "" )
122124 c .Host = envOrDefault (EnvHost , "" )
123- }
124125
125- func (c * Config ) compileS3MultilineLogRegex () error {
126- pattern := envOrDefault (EnvMultilineLogRegex , "" )
127- if pattern == "" {
128- return nil
129- }
130- re , err := regexp .Compile (pattern )
131- if err != nil {
132- return fmt .Errorf ("compile multiline log regex: %w" , err )
133- }
134- c .S3MultilineLogRegex = re
135- return nil
126+ c .StoreOnFail = envOrDefaultBool (EnvStoreFailedEvents , false )
127+ c .S3RetryBucketName = envOrDefault (EnvS3RetryBucketName , "" )
128+
129+ c .ScrubbingReplacement = envOrDefault (EnvScrubbingRuleReplacement , "" )
130+ c .ScrubIP = envOrDefaultBool (EnvRedactIP , false )
131+ c .ScrubEmail = envOrDefaultBool (EnvRedactEmail , false )
136132}
0 commit comments