From 6d1e70f9d07eb2a7a9ad7550a1138eb9d0f13085 Mon Sep 17 00:00:00 2001 From: Armin Ronacher Date: Fri, 16 Oct 2020 11:07:51 +0200 Subject: [PATCH 1/3] feat: Automatically determine release and environment --- sentry_sdk/client.py | 6 ++++-- sentry_sdk/utils.py | 45 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 49 insertions(+), 2 deletions(-) diff --git a/sentry_sdk/client.py b/sentry_sdk/client.py index 168198adb9..bc9048214b 100644 --- a/sentry_sdk/client.py +++ b/sentry_sdk/client.py @@ -12,6 +12,8 @@ disable_capture_event, format_timestamp, get_type_name, + get_default_release, + get_default_environment, handle_in_app, logger, ) @@ -62,10 +64,10 @@ def _get_options(*args, **kwargs): rv["dsn"] = os.environ.get("SENTRY_DSN") if rv["release"] is None: - rv["release"] = os.environ.get("SENTRY_RELEASE") + rv["release"] = get_default_release() if rv["environment"] is None: - rv["environment"] = os.environ.get("SENTRY_ENVIRONMENT") + rv["environment"] = get_default_environment(rv["release"]) if rv["server_name"] is None and hasattr(socket, "gethostname"): rv["server_name"] = socket.gethostname() diff --git a/sentry_sdk/utils.py b/sentry_sdk/utils.py index 2a8798adb0..f6c87609c6 100644 --- a/sentry_sdk/utils.py +++ b/sentry_sdk/utils.py @@ -4,6 +4,7 @@ import os import sys import threading +import subprocess from datetime import datetime @@ -52,6 +53,50 @@ def _get_debug_hub(): pass +def get_default_release(): + # type: () -> Optional[str] + """Try to guess a default release.""" + release = os.environ.get("SENTRY_RELEASE") + if release: + return release + + with open(os.path.devnull, "w+") as null: + try: + release = ( + subprocess.Popen( + ["git", "rev-parse", "--short", "HEAD"], + stdout=subprocess.PIPE, + stderr=null, + stdin=null, + ) + .communicate()[0] + .strip() + ) + except (OSError, IOError): + pass + + if release: + return release + + for var in ("HEROKU_SLUG_COMMIT", "GAE_DEPLOYMENT_ID"): + release = os.environ.get(var) + if release: + return release + return None + + +def get_default_environment( + release=None, # type: Optional[str] +): + # type: () -> Optional[str] + rv = os.environ.get("SENTRY_ENVIRONMENT") + if rv: + return rv + if release is not None: + return "production" + return None + + class CaptureInternalException(object): __slots__ = () From d9104350d4f1a6dc088e7ffe50288ccee8401b98 Mon Sep 17 00:00:00 2001 From: Armin Ronacher Date: Fri, 16 Oct 2020 11:09:42 +0200 Subject: [PATCH 2/3] feat: add more supported envvars --- sentry_sdk/utils.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/sentry_sdk/utils.py b/sentry_sdk/utils.py index f6c87609c6..1da8280b2f 100644 --- a/sentry_sdk/utils.py +++ b/sentry_sdk/utils.py @@ -78,7 +78,13 @@ def get_default_release(): if release: return release - for var in ("HEROKU_SLUG_COMMIT", "GAE_DEPLOYMENT_ID"): + for var in ( + "HEROKU_SLUG_COMMIT", + "SOURCE_VERSION", + "CODEBUILD_RESOLVED_SOURCE_VERSION", + "CIRCLE_SHA1", + "GAE_DEPLOYMENT_ID", + ): release = os.environ.get(var) if release: return release From 80638d0d0bae64ebd2e28df0e4838632c58bec24 Mon Sep 17 00:00:00 2001 From: Armin Ronacher Date: Fri, 16 Oct 2020 21:38:41 +0200 Subject: [PATCH 3/3] fix: lint --- sentry_sdk/utils.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/sentry_sdk/utils.py b/sentry_sdk/utils.py index 1da8280b2f..d39b0c1e40 100644 --- a/sentry_sdk/utils.py +++ b/sentry_sdk/utils.py @@ -71,6 +71,7 @@ def get_default_release(): ) .communicate()[0] .strip() + .decode("utf-8") ) except (OSError, IOError): pass @@ -94,7 +95,7 @@ def get_default_release(): def get_default_environment( release=None, # type: Optional[str] ): - # type: () -> Optional[str] + # type: (...) -> Optional[str] rv = os.environ.get("SENTRY_ENVIRONMENT") if rv: return rv