/*
 *
 * Copyright 2018 gRPC authors.
 *
 * 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
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 */

// Package envconfig contains grpc settings configured by environment variables.
package envconfig import ( ) var ( // EnableTXTServiceConfig is set if the DNS resolver should perform TXT // lookups for service config ("GRPC_ENABLE_TXT_SERVICE_CONFIG" is not // "false"). EnableTXTServiceConfig = boolFromEnv("GRPC_ENABLE_TXT_SERVICE_CONFIG", true) // TXTErrIgnore is set if TXT errors should be ignored // ("GRPC_GO_IGNORE_TXT_ERRORS" is not "false"). TXTErrIgnore = boolFromEnv("GRPC_GO_IGNORE_TXT_ERRORS", true) // RingHashCap indicates the maximum ring size which defaults to 4096 // entries but may be overridden by setting the environment variable // "GRPC_RING_HASH_CAP". This does not override the default bounds // checking which NACKs configs specifying ring sizes > 8*1024*1024 (~8M). RingHashCap = uint64FromEnv("GRPC_RING_HASH_CAP", 4096, 1, 8*1024*1024) // ALTSMaxConcurrentHandshakes is the maximum number of concurrent ALTS // handshakes that can be performed. ALTSMaxConcurrentHandshakes = uint64FromEnv("GRPC_ALTS_MAX_CONCURRENT_HANDSHAKES", 100, 1, 100) // EnforceALPNEnabled is set if TLS connections to servers with ALPN disabled // should be rejected. The HTTP/2 protocol requires ALPN to be enabled, this // option is present for backward compatibility. This option may be overridden // by setting the environment variable "GRPC_ENFORCE_ALPN_ENABLED" to "true" // or "false". EnforceALPNEnabled = boolFromEnv("GRPC_ENFORCE_ALPN_ENABLED", true) // XDSEndpointHashKeyBackwardCompat controls the parsing of the endpoint hash // key from EDS LbEndpoint metadata. Endpoint hash keys can be disabled by // setting "GRPC_XDS_ENDPOINT_HASH_KEY_BACKWARD_COMPAT" to "true". A future // release will remove this environment variable, enabling the new behavior // unconditionally. XDSEndpointHashKeyBackwardCompat = boolFromEnv("GRPC_XDS_ENDPOINT_HASH_KEY_BACKWARD_COMPAT", false) // LabelServerGoroutines controls setting [runtime/pprof.Labels] on the // goroutines spawned by [grpc.Server] type. // For now, this is limited to the goroutines spawned to handle incoming // requests on the server. // Set "GRPC_GO_SERVER_GOROUTINE_LABELS" to "grpc.method=true" to // enable this grpc.method label, or "all" to enable all valid labels. // This variable is a bit-field. LabelServerGoroutines = goroutineLabelsFromEnv("GRPC_GO_SERVER_GOROUTINE_LABELS", 0) // RingHashSetRequestHashKey is set if the ring hash balancer can get the // request hash header by setting the "requestHashHeader" field, according // to gRFC A76. It can be disabled by setting the environment variable // "GRPC_EXPERIMENTAL_RING_HASH_SET_REQUEST_HASH_KEY" to "false". RingHashSetRequestHashKey = boolFromEnv("GRPC_EXPERIMENTAL_RING_HASH_SET_REQUEST_HASH_KEY", true) // ALTSHandshakerKeepaliveParams is set if we should add the // KeepaliveParams when dial the ALTS handshaker service. ALTSHandshakerKeepaliveParams = boolFromEnv("GRPC_EXPERIMENTAL_ALTS_HANDSHAKER_KEEPALIVE_PARAMS", false) // EnableDefaultPortForProxyTarget controls whether the resolver adds a default port 443 // to a target address that lacks one. This flag only has an effect when all of // the following conditions are met: // - A connect proxy is being used. // - Target resolution is disabled. // - The DNS resolver is being used. EnableDefaultPortForProxyTarget = boolFromEnv("GRPC_EXPERIMENTAL_ENABLE_DEFAULT_PORT_FOR_PROXY_TARGET", true) // CaseSensitiveBalancerRegistries is set if the balancer registry should be // case-sensitive. This is enabled by default, but can be disabled by setting // the env variable "GRPC_GO_EXPERIMENTAL_CASE_SENSITIVE_BALANCER_REGISTRIES" // to "false". // // This env varible will be removed in release v1.82.0. CaseSensitiveBalancerRegistries = boolFromEnv("GRPC_GO_EXPERIMENTAL_CASE_SENSITIVE_BALANCER_REGISTRIES", true) // XDSAuthorityRewrite indicates whether xDS authority rewriting is enabled. // This feature is defined in gRFC A81 and is enabled by setting the // environment variable GRPC_EXPERIMENTAL_XDS_AUTHORITY_REWRITE to "true". XDSAuthorityRewrite = boolFromEnv("GRPC_EXPERIMENTAL_XDS_AUTHORITY_REWRITE", false) // PickFirstWeightedShuffling indicates whether weighted endpoint shuffling // is enabled in the pick_first LB policy, as defined in gRFC A113. This // feature can be disabled by setting the environment variable // GRPC_EXPERIMENTAL_PF_WEIGHTED_SHUFFLING to "false". PickFirstWeightedShuffling = boolFromEnv("GRPC_EXPERIMENTAL_PF_WEIGHTED_SHUFFLING", true) // XDSRecoverPanicInResourceParsing indicates whether the xdsclient should // recover from panics while parsing xDS resources. // // This feature can be disabled (e.g. for fuzz testing) by setting the // environment variable "GRPC_GO_EXPERIMENTAL_XDS_RESOURCE_PANIC_RECOVERY" // to "false". XDSRecoverPanicInResourceParsing = boolFromEnv("GRPC_GO_EXPERIMENTAL_XDS_RESOURCE_PANIC_RECOVERY", true) // EnablePriorityLBChildPolicyCache controls whether the priority balancer // should cache child balancers that are removed from the LB policy config, // for a period of 15 minutes. This is disabled by default, but can be // enabled by setting the env variable // GRPC_EXPERIMENTAL_ENABLE_PRIORITY_LB_CHILD_POLICY_CACHE to true. EnablePriorityLBChildPolicyCache = boolFromEnv("GRPC_EXPERIMENTAL_ENABLE_PRIORITY_LB_CHILD_POLICY_CACHE", false) // Enable8KBDefaultHeaderListSize indicates that default maximum header list // size is restricted to 8KB. This is disabled by default, but can be enabled // by setting the environment variable // "GRPC_GO_EXPERIMENTAL_ENABLE_8KB_DEFAULT_HEADER_LIST_SIZE" to "true". // When disabled, the default maximum header list size of 16MB is used. // // When enabled, RPCs with a total size of headers exceeding 8KB will fail // unless explicitly configured otherwise by the user. // // TODO: In release v1.82.0, env var will be enabled by default. Enable8KBDefaultHeaderListSize = boolFromEnv("GRPC_GO_EXPERIMENTAL_ENABLE_8KB_DEFAULT_HEADER_LIST_SIZE", false) // EnableHTTPFramerReadBufferPooling enables the use of the // readyreader.Reader interface to perform non-memory-pinning reads, // provided the underlying net.Conn supports it. This reduces memory usage // when subchannels are idle. // // This environment variable serves as an escape hatch to disable the // feature if unforeseen issues arise, and it will be removed in a future // release. EnableHTTPFramerReadBufferPooling = boolFromEnv("GRPC_GO_EXPERIMENTAL_HTTP_FRAMER_READ_BUFFER_POOLING", true) ) func ( string, bool) bool { if { // The default is true; return true unless the variable is "false". return !strings.EqualFold(os.Getenv(), "false") } // The default is false; return false unless the variable is "true". return strings.EqualFold(os.Getenv(), "true") } func ( string, , , uint64) uint64 { , := strconv.ParseUint(os.Getenv(), 10, 64) if != nil { return } if < { return } if > { return } return } // GoroutineLabels is a bitfield indicating which goroutine labels are enabled. type GoroutineLabels uint16 func ( string, GoroutineLabels) GoroutineLabels { := := os.Getenv() if strings.EqualFold(, "all") { return AllGoroutineLabels } else if strings.EqualFold(, "none") { return 0 } for := range strings.SplitSeq(, ",") { = strings.TrimSpace() if len() == 0 { continue } , , := strings.Cut(, "=") if ! { // no equals sign continue } = strings.TrimSpace() = strings.TrimSpace() := GoroutineLabels(0) switch { case strings.EqualFold(, "grpc.method"): = GoroutineLabelServerMethod default: continue } if strings.EqualFold(, "true") { |= } else if strings.EqualFold(, "false") { &^= } } return } const ( // GoroutineLabelServerMethod sets the grpc.method label on new // server-side gRPC streams. GoroutineLabelServerMethod GoroutineLabels = 1 << iota ) // AllGoroutineLabels is an or'd together bitfield of all valid GoroutineLabels // constant values (above). const AllGoroutineLabels = GoroutineLabelServerMethod