-
Notifications
You must be signed in to change notification settings - Fork 696
Fix limit env vars unset/unlimited values #2054
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
Conversation
Builds on top of #2044. Should be rebased and reviewed after 2044 is merged. |
- Its length is greater than the maximum allowed length. | ||
- It needs to be encoded/decoded e.g, bytes to strings. |
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.
Nit: Looks like no cleaning is needed if value
is not string or bytes, if this is checked first then all the remaining execution in this function can be saved.
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.
We also need to clean the string/byte value in sequences (and validate them) so can't bail out
if key is None or key == "": | ||
_logger.warning("invalid key `%s` (empty or null)", key) | ||
return None | ||
|
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.
if isinstance(value, (int, float, bool)): | |
return True |
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.
Fixed in #2057
if isinstance(value, bytes): | ||
try: | ||
value = value.decode() | ||
except ValueError: |
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.
except ValueError: | |
except UnicodeDecodeError: |
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.
@@ -67,7 +67,7 @@ | |||
_DEFAULT_OTEL_LINK_ATTRIBUTE_COUNT_LIMIT = 128 | |||
|
|||
|
|||
_ENV_VALUE_UNSET = "unset" |
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.
didn't we use unset
so users should define it explicitly and can avoid the sudden surprise when not setting env either by no knowledge/ignorance considered as unlimited?
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.
We did but spec recommends using empty value as unlimited.
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.
We can try to convince others and update spec to accept "unset" as the value but for now I think we should update our SDK to make sure it is spec compatible.
@@ -609,15 +609,18 @@ def __repr__(self): | |||
def _from_env_if_absent( | |||
cls, value: Optional[int], env_var: str, default: Optional[int] = None | |||
) -> Optional[int]: | |||
if value is cls.UNSET: | |||
if value == cls.UNSET: |
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.
Maybe I'm not fully understanding this scenario. When will value
ever be "unset"? Isn't value supposed to be an int
?
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.
The API usage looks like the following in order to not set a limit:
SpanLimits(max_attributes=SpanLimits.UNSET)
SpanLimits.UNSET is a symbol that users can pass as a limit to set the limit to infinity. We can freely change its internal value to anything without breaking any contracts.
The reason why I used "unset" was that I thought -1 might be confusing as the spec disallows it for env vars. Internally we can still use -1 as the symbol value.
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.
Changed it back to -1 as this is probably causing more confusion and does not respect the function contract. I wonder why mypy didn't catch it.
Co-authored-by: Leighton Chen <[email protected]>
Description
Limit env vars set to an empty value will be treated as unset/unlimited.
Fixes #2052
Type of change
Please delete options that are not relevant.
How Has This Been Tested?
Does This PR Require a Contrib Repo Change?
Checklist: