Преглед изворни кода

Closes #13645: Make Sentry integration optional (#14197)

Jeremy Stretch пре 2 година
родитељ
комит
840b7d804c

+ 0 - 4
base_requirements.txt

@@ -126,10 +126,6 @@ PyYAML
 # https://github.com/psf/requests/blob/main/HISTORY.md
 # https://github.com/psf/requests/blob/main/HISTORY.md
 requests
 requests
 
 
-# Sentry SDK
-# https://github.com/getsentry/sentry-python/blob/master/CHANGELOG.md
-sentry-sdk
-
 # Social authentication framework
 # Social authentication framework
 # https://github.com/python-social-auth/social-core/blob/master/CHANGELOG.md
 # https://github.com/python-social-auth/social-core/blob/master/CHANGELOG.md
 social-auth-core
 social-auth-core

+ 3 - 15
docs/administration/error-reporting.md

@@ -4,27 +4,15 @@
 
 
 ### Enabling Error Reporting
 ### Enabling Error Reporting
 
 
-NetBox supports native integration with [Sentry](https://sentry.io/) for automatic error reporting. To enable this functionality, simply set `SENTRY_ENABLED` to True in `configuration.py`. Errors will be sent to a Sentry ingestor maintained by the NetBox team for analysis.
-
-```python
-SENTRY_ENABLED = True
-```
-
-### Using a Custom DSN
-
-If you prefer instead to use your own Sentry ingestor, you'll need to first create a new project under your Sentry account to represent your NetBox deployment and obtain its corresponding data source name (DSN). This looks like a URL similar to the example below:
-
-```
-https://examplePublicKey@o0.ingest.sentry.io/0
-```
-
-Once you have obtained a DSN, configure Sentry in NetBox's `configuration.py` file with the following parameters:
+NetBox supports native integration with [Sentry](https://sentry.io/) for automatic error reporting. To enable this functionality, set `SENTRY_ENABLED` to True and define your unique [data source name (DSN)](https://docs.sentry.io/product/sentry-basics/concepts/dsn-explainer/) in `configuration.py`.
 
 
 ```python
 ```python
 SENTRY_ENABLED = True
 SENTRY_ENABLED = True
 SENTRY_DSN = "https://examplePublicKey@o0.ingest.sentry.io/0"
 SENTRY_DSN = "https://examplePublicKey@o0.ingest.sentry.io/0"
 ```
 ```
 
 
+Setting `SENTRY_ENABLED` to False will disable the Sentry integration.
+
 ### Assigning Tags
 ### Assigning Tags
 
 
 You can optionally attach one or more arbitrary tags to the outgoing error reports if desired by setting the `SENTRY_TAGS` parameter:
 You can optionally attach one or more arbitrary tags to the outgoing error reports if desired by setting the `SENTRY_TAGS` parameter:

+ 3 - 0
docs/configuration/error-reporting.md

@@ -18,6 +18,9 @@ Default: False
 
 
 Set to True to enable automatic error reporting via [Sentry](https://sentry.io/).
 Set to True to enable automatic error reporting via [Sentry](https://sentry.io/).
 
 
+!!! note
+    The `sentry-sdk` Python package is required to enable Sentry integration.
+
 ---
 ---
 
 
 ## SENTRY_SAMPLE_RATE
 ## SENTRY_SAMPLE_RATE

+ 11 - 0
docs/installation/3-netbox.md

@@ -227,6 +227,17 @@ sudo sh -c "echo 'boto3' >> /opt/netbox/local_requirements.txt"
 !!! info
 !!! info
     These packages were previously required in NetBox v3.5 but now are optional.
     These packages were previously required in NetBox v3.5 but now are optional.
 
 
+### Sentry Integration
+
+NetBox may be configured to send error reports to [Sentry](../administration/error-reporting.md) for analysis. This integration requires installation of the `sentry-sdk` Python library.
+
+```no-highlight
+sudo sh -c "echo 'sentry-sdk' >> /opt/netbox/local_requirements.txt"
+```
+
+!!! info
+    Sentry integration was previously included by default in NetBox v3.6 but is now optional.
+
 ## Run the Upgrade Script
 ## Run the Upgrade Script
 
 
 Once NetBox has been configured, we're ready to proceed with the actual installation. We'll run the packaged upgrade script (`upgrade.sh`) to perform the following actions:
 Once NetBox has been configured, we're ready to proceed with the actual installation. We'll run the packaged upgrade script (`upgrade.sh`) to perform the following actions:

+ 9 - 12
netbox/netbox/settings.py

@@ -9,12 +9,14 @@ import warnings
 from urllib.parse import urlencode, urlsplit
 from urllib.parse import urlencode, urlsplit
 
 
 import django
 import django
-import sentry_sdk
 from django.contrib.messages import constants as messages
 from django.contrib.messages import constants as messages
 from django.core.exceptions import ImproperlyConfigured, ValidationError
 from django.core.exceptions import ImproperlyConfigured, ValidationError
 from django.core.validators import URLValidator
 from django.core.validators import URLValidator
 from django.utils.encoding import force_str
 from django.utils.encoding import force_str
-from sentry_sdk.integrations.django import DjangoIntegration
+try:
+    import sentry_sdk
+except ModuleNotFoundError:
+    pass
 
 
 from netbox.config import PARAMS
 from netbox.config import PARAMS
 from netbox.constants import RQ_QUEUE_DEFAULT, RQ_QUEUE_HIGH, RQ_QUEUE_LOW
 from netbox.constants import RQ_QUEUE_DEFAULT, RQ_QUEUE_HIGH, RQ_QUEUE_LOW
@@ -39,8 +41,6 @@ if sys.version_info < (3, 8):
         f"NetBox requires Python 3.8 or later. (Currently installed: Python {platform.python_version()})"
         f"NetBox requires Python 3.8 or later. (Currently installed: Python {platform.python_version()})"
     )
     )
 
 
-DEFAULT_SENTRY_DSN = 'https://198cf560b29d4054ab8e583a1d10ea58@o1242133.ingest.sentry.io/6396485'
-
 #
 #
 # Configuration import
 # Configuration import
 #
 #
@@ -158,7 +158,7 @@ RQ_RETRY_MAX = getattr(configuration, 'RQ_RETRY_MAX', 0)
 SCRIPTS_ROOT = getattr(configuration, 'SCRIPTS_ROOT', os.path.join(BASE_DIR, 'scripts')).rstrip('/')
 SCRIPTS_ROOT = getattr(configuration, 'SCRIPTS_ROOT', os.path.join(BASE_DIR, 'scripts')).rstrip('/')
 SEARCH_BACKEND = getattr(configuration, 'SEARCH_BACKEND', 'netbox.search.backends.CachedValueSearchBackend')
 SEARCH_BACKEND = getattr(configuration, 'SEARCH_BACKEND', 'netbox.search.backends.CachedValueSearchBackend')
 SECURE_SSL_REDIRECT = getattr(configuration, 'SECURE_SSL_REDIRECT', False)
 SECURE_SSL_REDIRECT = getattr(configuration, 'SECURE_SSL_REDIRECT', False)
-SENTRY_DSN = getattr(configuration, 'SENTRY_DSN', DEFAULT_SENTRY_DSN)
+SENTRY_DSN = getattr(configuration, 'SENTRY_DSN', None)
 SENTRY_ENABLED = getattr(configuration, 'SENTRY_ENABLED', False)
 SENTRY_ENABLED = getattr(configuration, 'SENTRY_ENABLED', False)
 SENTRY_SAMPLE_RATE = getattr(configuration, 'SENTRY_SAMPLE_RATE', 1.0)
 SENTRY_SAMPLE_RATE = getattr(configuration, 'SENTRY_SAMPLE_RATE', 1.0)
 SENTRY_TRACES_SAMPLE_RATE = getattr(configuration, 'SENTRY_TRACES_SAMPLE_RATE', 0)
 SENTRY_TRACES_SAMPLE_RATE = getattr(configuration, 'SENTRY_TRACES_SAMPLE_RATE', 0)
@@ -517,12 +517,12 @@ SERIALIZATION_MODULES = {
 #
 #
 
 
 if SENTRY_ENABLED:
 if SENTRY_ENABLED:
+    try:
+        from sentry_sdk.integrations.django import DjangoIntegration
+    except ModuleNotFoundError:
+        raise ImproperlyConfigured("SENTRY_ENABLED is True but the sentry-sdk package is not installed.")
     if not SENTRY_DSN:
     if not SENTRY_DSN:
         raise ImproperlyConfigured("SENTRY_ENABLED is True but SENTRY_DSN has not been defined.")
         raise ImproperlyConfigured("SENTRY_ENABLED is True but SENTRY_DSN has not been defined.")
-    # If using the default DSN, force sampling rates
-    if SENTRY_DSN == DEFAULT_SENTRY_DSN:
-        SENTRY_SAMPLE_RATE = 1.0
-        SENTRY_TRACES_SAMPLE_RATE = 0
     # Initialize the SDK
     # Initialize the SDK
     sentry_sdk.init(
     sentry_sdk.init(
         dsn=SENTRY_DSN,
         dsn=SENTRY_DSN,
@@ -537,9 +537,6 @@ if SENTRY_ENABLED:
     # Assign any configured tags
     # Assign any configured tags
     for k, v in SENTRY_TAGS.items():
     for k, v in SENTRY_TAGS.items():
         sentry_sdk.set_tag(k, v)
         sentry_sdk.set_tag(k, v)
-    # If using the default DSN, append a unique deployment ID tag for error correlation
-    if SENTRY_DSN == DEFAULT_SENTRY_DSN:
-        sentry_sdk.set_tag('netbox.deployment_id', DEPLOYMENT_ID)
 
 
 
 
 #
 #

+ 3 - 2
netbox/netbox/views/errors.py

@@ -9,7 +9,6 @@ from django.template.exceptions import TemplateDoesNotExist
 from django.views.decorators.csrf import requires_csrf_token
 from django.views.decorators.csrf import requires_csrf_token
 from django.views.defaults import ERROR_500_TEMPLATE_NAME, page_not_found
 from django.views.defaults import ERROR_500_TEMPLATE_NAME, page_not_found
 from django.views.generic import View
 from django.views.generic import View
-from sentry_sdk import capture_message
 
 
 from netbox.plugins.utils import get_installed_plugins
 from netbox.plugins.utils import get_installed_plugins
 
 
@@ -34,7 +33,9 @@ def handler_404(request, exception):
     """
     """
     Wrap Django's default 404 handler to enable Sentry reporting.
     Wrap Django's default 404 handler to enable Sentry reporting.
     """
     """
-    capture_message("Page not found", level="error")
+    if settings.SENTRY_ENABLED:
+        from sentry_sdk import capture_message
+        capture_message("Page not found", level="error")
 
 
     return page_not_found(request, exception)
     return page_not_found(request, exception)
 
 

+ 0 - 1
requirements.txt

@@ -28,7 +28,6 @@ Pillow==10.1.0
 psycopg[binary,pool]==3.1.12
 psycopg[binary,pool]==3.1.12
 PyYAML==6.0.1
 PyYAML==6.0.1
 requests==2.31.0
 requests==2.31.0
-sentry-sdk==1.34.0
 social-auth-app-django==5.4.0
 social-auth-app-django==5.4.0
 social-auth-core[openidconnect]==4.5.0
 social-auth-core[openidconnect]==4.5.0
 svgwrite==1.4.3
 svgwrite==1.4.3