SILENT KILLERPanel

Current Path: > > opt > hc_python > lib64 > python3.12 > > site-packages > sentry_sdk > >


Operation   : Linux premium131.web-hosting.com 4.18.0-553.44.1.lve.el8.x86_64 #1 SMP Thu Mar 13 14:29:12 UTC 2025 x86_64
Software     : Apache
Server IP    : 162.0.232.56 | Your IP: 216.73.216.111
Domains      : 1034 Domain(s)
Permission   : [ 0755 ]

Files and Folders in: //opt/hc_python/lib64/python3.12//site-packages/sentry_sdk//

NameTypeSizeLast ModifiedActions
__pycache__ Directory - -
ai Directory - -
crons Directory - -
integrations Directory - -
profiler Directory - -
__init__.py File 1215 bytes May 23 2025 10:34:44.
_compat.py File 3116 bytes May 23 2025 10:34:44.
_init_implementation.py File 2559 bytes May 23 2025 10:34:44.
_log_batcher.py File 5085 bytes May 23 2025 10:34:44.
_lru_cache.py File 1229 bytes May 23 2025 10:34:44.
_queue.py File 11250 bytes May 23 2025 10:34:44.
_types.py File 10462 bytes May 23 2025 10:34:44.
_werkzeug.py File 3734 bytes May 23 2025 10:34:44.
api.py File 11866 bytes May 23 2025 10:34:44.
attachments.py File 3109 bytes May 23 2025 10:34:44.
client.py File 38029 bytes May 23 2025 10:34:44.
consts.py File 40631 bytes May 23 2025 10:34:44.
debug.py File 1019 bytes May 23 2025 10:34:44.
envelope.py File 10355 bytes May 23 2025 10:34:44.
feature_flags.py File 2233 bytes May 23 2025 10:34:44.
hub.py File 25675 bytes May 23 2025 10:34:44.
logger.py File 1656 bytes May 23 2025 10:34:44.
metrics.py File 29913 bytes May 23 2025 10:34:44.
monitor.py File 3710 bytes May 23 2025 10:34:44.
py.typed File 0 bytes May 23 2025 10:34:44.
scope.py File 63332 bytes May 23 2025 10:34:44.
scrubber.py File 6064 bytes May 23 2025 10:34:44.
serializer.py File 13087 bytes May 23 2025 10:34:44.
session.py File 5571 bytes May 23 2025 10:34:44.
sessions.py File 9181 bytes May 23 2025 10:34:44.
spotlight.py File 8678 bytes May 23 2025 10:34:44.
tracing.py File 48114 bytes May 23 2025 10:34:44.
tracing_utils.py File 28820 bytes May 23 2025 10:34:44.
transport.py File 32604 bytes May 23 2025 10:34:44.
types.py File 1222 bytes May 23 2025 10:34:44.
utils.py File 59368 bytes May 23 2025 10:34:44.
worker.py File 4464 bytes May 23 2025 10:34:44.

Reading File: //opt/hc_python/lib64/python3.12//site-packages/sentry_sdk///monitor.py

import os
import time
from threading import Thread, Lock

import sentry_sdk
from sentry_sdk.utils import logger

from typing import TYPE_CHECKING

if TYPE_CHECKING:
    from typing import Optional


MAX_DOWNSAMPLE_FACTOR = 10


class Monitor:
    """
    Performs health checks in a separate thread once every interval seconds
    and updates the internal state. Other parts of the SDK only read this state
    and act accordingly.
    """

    name = "sentry.monitor"

    def __init__(self, transport, interval=10):
        # type: (sentry_sdk.transport.Transport, float) -> None
        self.transport = transport  # type: sentry_sdk.transport.Transport
        self.interval = interval  # type: float

        self._healthy = True
        self._downsample_factor = 0  # type: int

        self._thread = None  # type: Optional[Thread]
        self._thread_lock = Lock()
        self._thread_for_pid = None  # type: Optional[int]
        self._running = True

    def _ensure_running(self):
        # type: () -> None
        """
        Check that the monitor has an active thread to run in, or create one if not.

        Note that this might fail (e.g. in Python 3.12 it's not possible to
        spawn new threads at interpreter shutdown). In that case self._running
        will be False after running this function.
        """
        if self._thread_for_pid == os.getpid() and self._thread is not None:
            return None

        with self._thread_lock:
            if self._thread_for_pid == os.getpid() and self._thread is not None:
                return None

            def _thread():
                # type: (...) -> None
                while self._running:
                    time.sleep(self.interval)
                    if self._running:
                        self.run()

            thread = Thread(name=self.name, target=_thread)
            thread.daemon = True
            try:
                thread.start()
            except RuntimeError:
                # Unfortunately at this point the interpreter is in a state that no
                # longer allows us to spawn a thread and we have to bail.
                self._running = False
                return None

            self._thread = thread
            self._thread_for_pid = os.getpid()

        return None

    def run(self):
        # type: () -> None
        self.check_health()
        self.set_downsample_factor()

    def set_downsample_factor(self):
        # type: () -> None
        if self._healthy:
            if self._downsample_factor > 0:
                logger.debug(
                    "[Monitor] health check positive, reverting to normal sampling"
                )
            self._downsample_factor = 0
        else:
            if self.downsample_factor < MAX_DOWNSAMPLE_FACTOR:
                self._downsample_factor += 1
            logger.debug(
                "[Monitor] health check negative, downsampling with a factor of %d",
                self._downsample_factor,
            )

    def check_health(self):
        # type: () -> None
        """
        Perform the actual health checks,
        currently only checks if the transport is rate-limited.
        TODO: augment in the future with more checks.
        """
        self._healthy = self.transport.is_healthy()

    def is_healthy(self):
        # type: () -> bool
        self._ensure_running()
        return self._healthy

    @property
    def downsample_factor(self):
        # type: () -> int
        self._ensure_running()
        return self._downsample_factor

    def kill(self):
        # type: () -> None
        self._running = False

    def __del__(self):
        # type: () -> None
        self.kill()

SILENT KILLER Tool