Skip to content

Commit e8e336b

Browse files
ndakkouneViBiOh
andauthored
[AWSX-2144] feat(go-forwarder): add configuration and API key resolution (#1084)
Co-authored-by: Vincent Boutour <vincent.boutour@datadoghq.com>
1 parent 20ab64d commit e8e336b

15 files changed

Lines changed: 743 additions & 19 deletions

File tree

aws/logs_monitoring_go/Makefile

Lines changed: 31 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,54 @@
1-
.PHONY: build package test lint clean sam-build sam-invoke sam-deploy build-ForwarderFunction
2-
31
BINARY_NAME := bootstrap
42
ZIP_NAME := forwarder.zip
53

6-
build:
7-
GOOS=linux GOARCH=arm64 go build -o $(BINARY_NAME) ./cmd/forwarder/
4+
# Go
85

9-
# Used by `sam build`
10-
build-ForwarderFunction:
11-
GOOS=linux GOARCH=arm64 go build -o $(ARTIFACTS_DIR)/bootstrap ./cmd/forwarder/
6+
.PHONY: build
7+
build:
8+
GOOS=linux GOARCH=arm64 go build -ldflags="-s" -installsuffix nocgo -o $(BINARY_NAME) ./cmd/forwarder/
129

10+
.PHONY: package
1311
package: build
1412
zip $(ZIP_NAME) $(BINARY_NAME)
1513

14+
.PHONY: test
1615
test:
1716
go test -race ./...
1817

18+
.PHONY: lint
1919
lint:
2020
golangci-lint run ./...
2121

22+
.PHONY: audit
23+
audit:
24+
go vet ./...
25+
go tool govulncheck
26+
27+
.PHONY: generate
28+
generate:
29+
go generate ./...
30+
31+
.PHONY: clean
2232
clean:
2333
rm -f $(BINARY_NAME) $(ZIP_NAME)
2434

35+
# SAM
36+
37+
# Used only by SAM
38+
.PHONY: build-ForwarderFunction
39+
build-ForwarderFunction:
40+
GOOS=linux GOARCH=arm64 go build -ldflags="-s" -installsuffix nocgo -o $(ARTIFACTS_DIR)/bootstrap ./cmd/forwarder/
41+
42+
.PHONY: sam-build
2543
sam-build:
2644
sam build
2745

46+
.PHONY: sam-deploy
47+
sam-deploy: sam-build
48+
sam deploy
49+
2850
EVENT ?= events/cloudwatch_logs.json
51+
52+
.PHONY: sam-invoke
2953
sam-invoke: sam-build
3054
sam local invoke ForwarderFunction -e $(EVENT)
31-
32-
sam-deploy: sam-build
33-
sam deploy

aws/logs_monitoring_go/cmd/forwarder/main.go

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,16 +8,28 @@ package main
88
import (
99
"context"
1010
"encoding/json"
11-
"log"
11+
"log/slog"
12+
13+
"github.com/DataDog/datadog-serverless-functions/aws/logs_monitoring_go/internal/config"
1214

1315
"github.com/aws/aws-lambda-go/lambda"
1416
)
1517

16-
func handleRequest(ctx context.Context, event json.RawMessage) error {
17-
log.Printf("Received event: %s", string(event))
18-
return nil
18+
func main() {
19+
ctx := context.Background()
20+
cfg, err := config.Load(ctx)
21+
if err != nil {
22+
slog.Error("config load failed", slog.Any("error", err))
23+
return
24+
}
25+
26+
lambda.Start(handleRequest(cfg))
1927
}
2028

21-
func main() {
22-
lambda.Start(handleRequest)
29+
// cfg not used for now, will be when forwarding logic added
30+
func handleRequest(cfg *config.Config) func(context.Context, json.RawMessage) error {
31+
return func(ctx context.Context, event json.RawMessage) error {
32+
slog.Info("received event", slog.String("event", string(event)))
33+
return nil
34+
}
2335
}

aws/logs_monitoring_go/go.mod

Lines changed: 36 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,39 @@ module github.com/DataDog/datadog-serverless-functions/aws/logs_monitoring_go
22

33
go 1.26
44

5-
require github.com/aws/aws-lambda-go v1.53.0
5+
require (
6+
github.com/aws/aws-lambda-go v1.53.0
7+
github.com/aws/aws-sdk-go-v2 v1.41.4
8+
github.com/aws/aws-sdk-go-v2/config v1.32.12
9+
github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.41.4
10+
github.com/google/go-cmp v0.7.0
11+
)
12+
13+
require (
14+
github.com/aws/aws-sdk-go-v2/credentials v1.19.12 // indirect
15+
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.20 // indirect
16+
github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.20 // indirect
17+
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.20 // indirect
18+
github.com/aws/aws-sdk-go-v2/internal/ini v1.8.6 // indirect
19+
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.7 // indirect
20+
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.20 // indirect
21+
github.com/aws/aws-sdk-go-v2/service/signin v1.0.8 // indirect
22+
github.com/aws/aws-sdk-go-v2/service/sso v1.30.13 // indirect
23+
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.17 // indirect
24+
github.com/aws/aws-sdk-go-v2/service/sts v1.41.9 // indirect
25+
github.com/aws/smithy-go v1.24.2 // indirect
26+
github.com/stretchr/testify v1.11.1 // indirect
27+
go.uber.org/mock v0.6.0 // indirect
28+
golang.org/x/mod v0.34.0 // indirect
29+
golang.org/x/sync v0.20.0 // indirect
30+
golang.org/x/sys v0.42.0 // indirect
31+
golang.org/x/telemetry v0.0.0-20260311193753-579e4da9a98c // indirect
32+
golang.org/x/tools v0.43.0 // indirect
33+
golang.org/x/vuln v1.1.4 // indirect
34+
)
35+
36+
tool (
37+
go.uber.org/mock/mockgen
38+
golang.org/x/tools/cmd/goimports
39+
golang.org/x/vuln/cmd/govulncheck
40+
)

aws/logs_monitoring_go/go.sum

Lines changed: 54 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,62 @@
11
github.com/aws/aws-lambda-go v1.53.0 h1:uAMv6W/vCP/L494BAUSxe+8KVBIPK+SGPyapFt3FuMk=
22
github.com/aws/aws-lambda-go v1.53.0/go.mod h1:dpMpZgvWx5vuQJfBt0zqBha60q7Dd7RfgJv23DymV8A=
3+
github.com/aws/aws-sdk-go-v2 v1.41.4 h1:10f50G7WyU02T56ox1wWXq+zTX9I1zxG46HYuG1hH/k=
4+
github.com/aws/aws-sdk-go-v2 v1.41.4/go.mod h1:mwsPRE8ceUUpiTgF7QmQIJ7lgsKUPQOUl3o72QBrE1o=
5+
github.com/aws/aws-sdk-go-v2/config v1.32.12 h1:O3csC7HUGn2895eNrLytOJQdoL2xyJy0iYXhoZ1OmP0=
6+
github.com/aws/aws-sdk-go-v2/config v1.32.12/go.mod h1:96zTvoOFR4FURjI+/5wY1vc1ABceROO4lWgWJuxgy0g=
7+
github.com/aws/aws-sdk-go-v2/credentials v1.19.12 h1:oqtA6v+y5fZg//tcTWahyN9PEn5eDU/Wpvc2+kJ4aY8=
8+
github.com/aws/aws-sdk-go-v2/credentials v1.19.12/go.mod h1:U3R1RtSHx6NB0DvEQFGyf/0sbrpJrluENHdPy1j/3TE=
9+
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.20 h1:zOgq3uezl5nznfoK3ODuqbhVg1JzAGDUhXOsU0IDCAo=
10+
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.20/go.mod h1:z/MVwUARehy6GAg/yQ1GO2IMl0k++cu1ohP9zo887wE=
11+
github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.20 h1:CNXO7mvgThFGqOFgbNAP2nol2qAWBOGfqR/7tQlvLmc=
12+
github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.20/go.mod h1:oydPDJKcfMhgfcgBUZaG+toBbwy8yPWubJXBVERtI4o=
13+
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.20 h1:tN6W/hg+pkM+tf9XDkWUbDEjGLb+raoBMFsTodcoYKw=
14+
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.20/go.mod h1:YJ898MhD067hSHA6xYCx5ts/jEd8BSOLtQDL3iZsvbc=
15+
github.com/aws/aws-sdk-go-v2/internal/ini v1.8.6 h1:qYQ4pzQ2Oz6WpQ8T3HvGHnZydA72MnLuFK9tJwmrbHw=
16+
github.com/aws/aws-sdk-go-v2/internal/ini v1.8.6/go.mod h1:O3h0IK87yXci+kg6flUKzJnWeziQUKciKrLjcatSNcY=
17+
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.7 h1:5EniKhLZe4xzL7a+fU3C2tfUN4nWIqlLesfrjkuPFTY=
18+
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.7/go.mod h1:x0nZssQ3qZSnIcePWLvcoFisRXJzcTVvYpAAdYX8+GI=
19+
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.20 h1:2HvVAIq+YqgGotK6EkMf+KIEqTISmTYh5zLpYyeTo1Y=
20+
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.20/go.mod h1:V4X406Y666khGa8ghKmphma/7C0DAtEQYhkq9z4vpbk=
21+
github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.41.4 h1:9aZbO86sraeCIHHCpZhxwN9tnVy9POkSKzi4/TpT54A=
22+
github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.41.4/go.mod h1:cxiXDhEzIq7Xx1BtmC4lGBK3SwAZ79+EUWiKawYHo14=
23+
github.com/aws/aws-sdk-go-v2/service/signin v1.0.8 h1:0GFOLzEbOyZABS3PhYfBIx2rNBACYcKty+XGkTgw1ow=
24+
github.com/aws/aws-sdk-go-v2/service/signin v1.0.8/go.mod h1:LXypKvk85AROkKhOG6/YEcHFPoX+prKTowKnVdcaIxE=
25+
github.com/aws/aws-sdk-go-v2/service/sso v1.30.13 h1:kiIDLZ005EcKomYYITtfsjn7dtOwHDOFy7IbPXKek2o=
26+
github.com/aws/aws-sdk-go-v2/service/sso v1.30.13/go.mod h1:2h/xGEowcW/g38g06g3KpRWDlT+OTfxxI0o1KqayAB8=
27+
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.17 h1:jzKAXIlhZhJbnYwHbvUQZEB8KfgAEuG0dc08Bkda7NU=
28+
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.17/go.mod h1:Al9fFsXjv4KfbzQHGe6V4NZSZQXecFcvaIF4e70FoRA=
29+
github.com/aws/aws-sdk-go-v2/service/sts v1.41.9 h1:Cng+OOwCHmFljXIxpEVXAGMnBia8MSU6Ch5i9PgBkcU=
30+
github.com/aws/aws-sdk-go-v2/service/sts v1.41.9/go.mod h1:LrlIndBDdjA/EeXeyNBle+gyCwTlizzW5ycgWnvIxkk=
31+
github.com/aws/smithy-go v1.24.2 h1:FzA3bu/nt/vDvmnkg+R8Xl46gmzEDam6mZ1hzmwXFng=
32+
github.com/aws/smithy-go v1.24.2/go.mod h1:YE2RhdIuDbA5E5bTdciG9KrW3+TiEONeUWCqxX9i1Fc=
333
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
434
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
35+
github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
36+
github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=
537
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
638
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
7-
github.com/stretchr/testify v1.7.2 h1:4jaiDzPyXQvSd7D0EjG45355tLlV3VOECpq10pLC+8s=
8-
github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals=
39+
github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U=
40+
github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U=
41+
go.uber.org/mock v0.6.0 h1:hyF9dfmbgIX5EfOdasqLsWD6xqpNZlXblLB/Dbnwv3Y=
42+
go.uber.org/mock v0.6.0/go.mod h1:KiVJ4BqZJaMj4svdfmHM0AUx4NJYO8ZNpPnZn1Z+BBU=
43+
golang.org/x/mod v0.27.0 h1:kb+q2PyFnEADO2IEF935ehFUXlWiNjJWtRNgBLSfbxQ=
44+
golang.org/x/mod v0.27.0/go.mod h1:rWI627Fq0DEoudcK+MBkNkCe0EetEaDSwJJkCcjpazc=
45+
golang.org/x/mod v0.34.0 h1:xIHgNUUnW6sYkcM5Jleh05DvLOtwc6RitGHbDk4akRI=
46+
golang.org/x/mod v0.34.0/go.mod h1:ykgH52iCZe79kzLLMhyCUzhMci+nQj+0XkbXpNYtVjY=
47+
golang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw=
48+
golang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=
49+
golang.org/x/sync v0.20.0 h1:e0PTpb7pjO8GAtTs2dQ6jYa5BWYlMuX047Dco/pItO4=
50+
golang.org/x/sync v0.20.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0=
51+
golang.org/x/sys v0.42.0 h1:omrd2nAlyT5ESRdCLYdm3+fMfNFE/+Rf4bDIQImRJeo=
52+
golang.org/x/sys v0.42.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw=
53+
golang.org/x/telemetry v0.0.0-20260311193753-579e4da9a98c h1:6a8FdnNk6bTXBjR4AGKFgUKuo+7GnR3FX5L7CbveeZc=
54+
golang.org/x/telemetry v0.0.0-20260311193753-579e4da9a98c/go.mod h1:TpUTTEp9frx7rTdLpC9gFG9kdI7zVLFTFFlqaH2Cncw=
55+
golang.org/x/tools v0.36.0 h1:kWS0uv/zsvHEle1LbV5LE8QujrxB3wfQyxHfhOk0Qkg=
56+
golang.org/x/tools v0.36.0/go.mod h1:WBDiHKJK8YgLHlcQPYQzNCkUxUypCaa5ZegCVutKm+s=
57+
golang.org/x/tools v0.43.0 h1:12BdW9CeB3Z+J/I/wj34VMl8X+fEXBxVR90JeMX5E7s=
58+
golang.org/x/tools v0.43.0/go.mod h1:uHkMso649BX2cZK6+RpuIPXS3ho2hZo4FVwfoy1vIk0=
59+
golang.org/x/vuln v1.1.4 h1:Ju8QsuyhX3Hk8ma3CesTbO8vfJD9EvUBgHvkxHBzj0I=
60+
golang.org/x/vuln v1.1.4/go.mod h1:F+45wmU18ym/ca5PLTPLsSzr2KppzswxPP603ldA67s=
961
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
1062
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
// Unless explicitly stated otherwise all files in this repository are licensed
2+
// under the Apache License Version 2.0.
3+
// This product includes software developed at Datadog (https://www.datadoghq.com/).
4+
// Copyright 2026-Present Datadog, Inc.
5+
6+
package config
7+
8+
import (
9+
"context"
10+
"errors"
11+
"fmt"
12+
"io"
13+
"log/slog"
14+
"net/http"
15+
"os"
16+
"time"
17+
18+
awshttp "github.com/aws/aws-sdk-go-v2/aws/transport/http"
19+
awsconfig "github.com/aws/aws-sdk-go-v2/config"
20+
)
21+
22+
var (
23+
ErrMissingAPIKey = errors.New("missing Datadog API key")
24+
ErrInvalidAPIKey = errors.New("invalid Datadog API key format")
25+
)
26+
27+
const (
28+
httpClientTimeout = 5 * time.Second
29+
)
30+
31+
func (c *Config) resolveAPIKey(ctx context.Context) error {
32+
awsCfg, err := awsconfig.LoadDefaultConfig(ctx, awsconfig.WithHTTPClient(awshttp.NewBuildableClient().WithTimeout(httpClientTimeout)))
33+
if err != nil {
34+
return fmt.Errorf("loading AWS config: %w", err)
35+
}
36+
37+
if v, ok := os.LookupEnv("DD_API_KEY_SECRET_ARN"); ok {
38+
client, err := c.createSecretsManagerAPIClient(ctx, awsCfg)
39+
if err != nil {
40+
return fmt.Errorf("creating Secrets Manager client: %w", err)
41+
}
42+
43+
apiKey, err := resolveFromSecretsManager(ctx, client, v)
44+
if err != nil {
45+
return fmt.Errorf("resolving from secrets manager: %w", err)
46+
}
47+
48+
c.APIKey = apiKey
49+
return nil
50+
}
51+
52+
if v, ok := os.LookupEnv("DD_API_KEY_SSM_NAME"); ok {
53+
return c.resolveFromSSM(ctx, awsCfg, v)
54+
}
55+
56+
if v, ok := os.LookupEnv("DD_KMS_API_KEY"); ok {
57+
return c.resolveFromKMS(ctx, awsCfg, v)
58+
}
59+
60+
return errors.New("no API key configured: set DD_API_KEY_SECRET_ARN, DD_API_KEY_SSM_NAME or DD_KMS_API_KEY. See: https://docs.datadoghq.com/serverless/forwarder/")
61+
}
62+
63+
func (c *Config) validateAPIKey(ctx context.Context) error {
64+
if c.APIKey == "" {
65+
return fmt.Errorf("set DD_API_KEY_SECRET_ARN, DD_API_KEY_SSM_NAME or DD_KMS_API_KEY. See: https://docs.datadoghq.com/serverless/forwarder/: %w", ErrMissingAPIKey)
66+
}
67+
68+
if len(c.APIKey) != 32 {
69+
return fmt.Errorf("expected 32 characters, got %d. Verify your API key at https://app.%s/organization-settings/api-keys: %w", len(c.APIKey), c.Site, ErrInvalidAPIKey)
70+
}
71+
72+
slog.Debug("validating Datadog API key")
73+
74+
req, err := http.NewRequestWithContext(ctx, http.MethodGet, c.APIURL+"/api/v1/validate", nil)
75+
if err != nil {
76+
slog.Warn("failed to build API key validation request", slog.Any("error", err))
77+
return nil
78+
}
79+
req.Header.Set("DD-API-KEY", c.APIKey)
80+
81+
client := &http.Client{Timeout: httpClientTimeout}
82+
resp, err := client.Do(req)
83+
if err != nil {
84+
slog.Warn("failed to validate API key", slog.Any("error", err))
85+
return nil
86+
}
87+
defer func() {
88+
if _, err := io.Copy(io.Discard, resp.Body); err != nil {
89+
slog.Warn("failed to drain response body", slog.Any("error", err))
90+
}
91+
if err := resp.Body.Close(); err != nil {
92+
slog.Warn("failed to close response body", slog.Any("error", err))
93+
}
94+
}()
95+
96+
if resp.StatusCode == http.StatusForbidden {
97+
slog.Warn("invalid Datadog API key", slog.String("url", "https://app."+c.Site+"/organization-settings/api-keys"))
98+
} else if resp.StatusCode != http.StatusOK {
99+
slog.Warn("unexpected response from validation endpoint", slog.String("status", resp.Status))
100+
}
101+
102+
return nil
103+
}
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
// Unless explicitly stated otherwise all files in this repository are licensed
2+
// under the Apache License Version 2.0.
3+
// This product includes software developed at Datadog (https://www.datadoghq.com/).
4+
// Copyright 2026-Present Datadog, Inc.
5+
6+
package config
7+
8+
import (
9+
"context"
10+
"fmt"
11+
"log/slog"
12+
)
13+
14+
type Config struct {
15+
APIKey string
16+
Site string
17+
IntakeURL string
18+
APIURL string
19+
LogLevel string
20+
UseFIPS bool
21+
}
22+
23+
func Load(ctx context.Context) (*Config, error) {
24+
initLogger(envOrDefault("DD_LOG_LEVEL", "INFO"))
25+
logDroppedEnvVars()
26+
27+
cfg := loadConfig()
28+
slog.Debug("config loaded", slog.String("site", cfg.Site), slog.String("intakeURL", cfg.IntakeURL), slog.String("apiURL", cfg.APIURL), slog.String("logLevel", cfg.LogLevel), slog.Bool("useFIPS", cfg.UseFIPS))
29+
30+
if err := cfg.resolveAPIKey(ctx); err != nil {
31+
return nil, fmt.Errorf("resolving API key: %w", err)
32+
}
33+
34+
if err := cfg.validateAPIKey(ctx); err != nil {
35+
return nil, fmt.Errorf("validating API key: %w", err)
36+
}
37+
38+
return cfg, nil
39+
}
40+
41+
func loadConfig() *Config {
42+
site := envOrDefault("DD_SITE", "datadoghq.com")
43+
return &Config{
44+
Site: site,
45+
IntakeURL: envOrDefault("DD_URL", "https://http-intake.logs."+site),
46+
APIURL: envOrDefault("DD_API_URL", "https://api."+site),
47+
LogLevel: envOrDefault("DD_LOG_LEVEL", "INFO"),
48+
UseFIPS: envOrDefaultBool("DD_USE_FIPS", false),
49+
}
50+
}

0 commit comments

Comments
 (0)