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..d39b0c1e40 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,57 @@ 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() + .decode("utf-8") + ) + except (OSError, IOError): + pass + + if release: + return release + + 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 + 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__ = ()