-
Notifications
You must be signed in to change notification settings - Fork 891
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
GODRIVER-2810 Switch to polling monitoring when running within a FaaS environment #1376
Changes from all commits
fbbafce
2a88672
8c6de75
7a61bdb
d5a6c99
8277d88
fb83d15
728f277
9fec743
7c38cd1
fcc4db7
fe237bb
c343f12
25b7685
c0085e1
a62ad25
0e8a3a9
3672bb4
b8cba73
cfb1c66
1a728b0
2d54de4
2d5ebd9
1f32ccd
9ca3369
16b14a9
6287bab
ce91abf
d2798ef
aaa1b6a
20d1b17
b686f7c
34a8970
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,128 @@ | ||
// Copyright (C) MongoDB, Inc. 2023-present. | ||
// | ||
// Licensed under the Apache License, Version 2.0 (the "License"); you may | ||
// not use this file except in compliance with the License. You may obtain | ||
// a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 | ||
|
||
package driverutil | ||
|
||
import ( | ||
"os" | ||
"strings" | ||
) | ||
|
||
const AwsLambdaPrefix = "AWS_Lambda_" | ||
|
||
const ( | ||
// FaaS environment variable names | ||
|
||
// EnvVarAWSExecutionEnv is the AWS Execution environment variable. | ||
EnvVarAWSExecutionEnv = "AWS_EXECUTION_ENV" | ||
// EnvVarAWSLambdaRuntimeAPI is the AWS Lambda runtime API variable. | ||
EnvVarAWSLambdaRuntimeAPI = "AWS_LAMBDA_RUNTIME_API" | ||
// EnvVarFunctionsWorkerRuntime is the functions worker runtime variable. | ||
EnvVarFunctionsWorkerRuntime = "FUNCTIONS_WORKER_RUNTIME" | ||
// EnvVarKService is the K Service variable. | ||
EnvVarKService = "K_SERVICE" | ||
// EnvVarFunctionName is the function name variable. | ||
EnvVarFunctionName = "FUNCTION_NAME" | ||
// EnvVarVercel is the Vercel variable. | ||
EnvVarVercel = "VERCEL" | ||
// EnvVarK8s is the K8s veriable. | ||
EnvVarK8s = "KUBERNETES_SERVICE_HOST" | ||
) | ||
|
||
const ( | ||
// FaaS environment variable names | ||
|
||
// EnvVarAWSRegion is the AWS region variable. | ||
EnvVarAWSRegion = "AWS_REGION" | ||
// EnvVarAWSLambdaFunctionMemorySize is the AWS Lambda function memory size variable. | ||
EnvVarAWSLambdaFunctionMemorySize = "AWS_LAMBDA_FUNCTION_MEMORY_SIZE" | ||
// EnvVarFunctionMemoryMB is the function memory in megabytes variable. | ||
EnvVarFunctionMemoryMB = "FUNCTION_MEMORY_MB" | ||
// EnvVarFunctionTimeoutSec is the function timeout in seconds variable. | ||
EnvVarFunctionTimeoutSec = "FUNCTION_TIMEOUT_SEC" | ||
// EnvVarFunctionRegion is the function region variable. | ||
EnvVarFunctionRegion = "FUNCTION_REGION" | ||
// EnvVarVercelRegion is the Vercel region variable. | ||
EnvVarVercelRegion = "VERCEL_REGION" | ||
) | ||
|
||
const ( | ||
// FaaS environment names used by the client | ||
|
||
// EnvNameAWSLambda is the AWS Lambda environment name. | ||
EnvNameAWSLambda = "aws.lambda" | ||
// EnvNameAzureFunc is the Azure Function environment name. | ||
EnvNameAzureFunc = "azure.func" | ||
// EnvNameGCPFunc is the Google Cloud Function environment name. | ||
EnvNameGCPFunc = "gcp.func" | ||
// EnvNameVercel is the Vercel environment name. | ||
EnvNameVercel = "vercel" | ||
) | ||
|
||
// GetFaasEnvName parses the FaaS environment variable name and returns the | ||
// corresponding name used by the client. If none of the variables or variables | ||
// for multiple names are populated the client.env value MUST be entirely | ||
// omitted. When variables for multiple "client.env.name" values are present, | ||
// "vercel" takes precedence over "aws.lambda"; any other combination MUST cause | ||
// "client.env" to be entirely omitted. | ||
func GetFaasEnvName() string { | ||
envVars := []string{ | ||
EnvVarAWSExecutionEnv, | ||
EnvVarAWSLambdaRuntimeAPI, | ||
EnvVarFunctionsWorkerRuntime, | ||
EnvVarKService, | ||
EnvVarFunctionName, | ||
EnvVarVercel, | ||
} | ||
|
||
// If none of the variables are populated the client.env value MUST be | ||
// entirely omitted. | ||
names := make(map[string]struct{}) | ||
|
||
for _, envVar := range envVars { | ||
val := os.Getenv(envVar) | ||
if val == "" { | ||
continue | ||
} | ||
|
||
var name string | ||
|
||
switch envVar { | ||
case EnvVarAWSExecutionEnv: | ||
if !strings.HasPrefix(val, AwsLambdaPrefix) { | ||
continue | ||
} | ||
|
||
name = EnvNameAWSLambda | ||
case EnvVarAWSLambdaRuntimeAPI: | ||
name = EnvNameAWSLambda | ||
case EnvVarFunctionsWorkerRuntime: | ||
name = EnvNameAzureFunc | ||
case EnvVarKService, EnvVarFunctionName: | ||
name = EnvNameGCPFunc | ||
case EnvVarVercel: | ||
// "vercel" takes precedence over "aws.lambda". | ||
delete(names, EnvNameAWSLambda) | ||
|
||
name = EnvNameVercel | ||
} | ||
|
||
names[name] = struct{}{} | ||
if len(names) > 1 { | ||
// If multiple names are populated the client.env value | ||
// MUST be entirely omitted. | ||
names = nil | ||
|
||
break | ||
} | ||
} | ||
|
||
for name := range names { | ||
return name | ||
} | ||
|
||
return "" | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -32,7 +32,8 @@ func TestSDAMProse(t *testing.T) { | |
heartbeatIntervalMtOpts := mtest.NewOptions(). | ||
ClientOptions(heartbeatIntervalClientOpts). | ||
CreateCollection(false). | ||
ClientType(mtest.Proxy) | ||
ClientType(mtest.Proxy). | ||
MinServerVersion("4.4") // RTT Monitor / Streaming protocol is not supported for versions < 4.4. | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Before this change, we always started the RTT monitor. The goals of this ticket is to avoid opening a connection for streaming for servers that do not support streaming: https://github.com/mongodb/specifications/pull/1452/files#diff-67f5deaee17cfd34b1845819d83009a9b7e16d2ef28ffce946f51b714474efdeR745 |
||
mt.RunOpts("heartbeats processed more frequently", heartbeatIntervalMtOpts, func(mt *mtest.T) { | ||
// Test that setting heartbeat interval to 500ms causes the client to process heartbeats | ||
// approximately every 500ms instead of the default 10s. Note that a Client doesn't | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
C compiler is required to run a race test on non-darwin, see requirements: https://go.dev/doc/articles/race_detector#Requirements