X7ROOT File Manager
Current Path:
/opt/hc_python/lib/python3.12/site-packages/sentry_sdk
opt
/
hc_python
/
lib
/
python3.12
/
site-packages
/
sentry_sdk
/
??
..
??
__init__.py
(1.38 KB)
??
__pycache__
??
_compat.py
(3.04 KB)
??
_init_implementation.py
(2.5 KB)
??
_log_batcher.py
(5.37 KB)
??
_lru_cache.py
(1.2 KB)
??
_metrics_batcher.py
(4.92 KB)
??
_queue.py
(10.99 KB)
??
_types.py
(10.18 KB)
??
_werkzeug.py
(3.65 KB)
??
ai
??
api.py
(14.92 KB)
??
attachments.py
(3.04 KB)
??
client.py
(41.11 KB)
??
consts.py
(52.47 KB)
??
crons
??
debug.py
(1019 B)
??
envelope.py
(10.23 KB)
??
feature_flags.py
(2.18 KB)
??
hub.py
(25.14 KB)
??
integrations
??
logger.py
(2.73 KB)
??
metrics.py
(2 KB)
??
monitor.py
(3.55 KB)
??
profiler
??
py.typed
(0 B)
??
scope.py
(63.89 KB)
??
scrubber.py
(5.92 KB)
??
serializer.py
(13.22 KB)
??
session.py
(5.46 KB)
??
sessions.py
(8.96 KB)
??
spotlight.py
(8.47 KB)
??
tracing.py
(50.53 KB)
??
tracing_utils.py
(39.59 KB)
??
transport.py
(31.13 KB)
??
types.py
(1.24 KB)
??
utils.py
(62.4 KB)
??
worker.py
(4.36 KB)
Editing: _metrics_batcher.py
import os import random import threading from datetime import datetime, timezone from typing import Optional, List, Callable, TYPE_CHECKING, Any, Union from sentry_sdk.utils import format_timestamp, safe_repr from sentry_sdk.envelope import Envelope, Item, PayloadRef if TYPE_CHECKING: from sentry_sdk._types import Metric class MetricsBatcher: MAX_METRICS_BEFORE_FLUSH = 1000 MAX_METRICS_BEFORE_DROP = 10_000 FLUSH_WAIT_TIME = 5.0 def __init__( self, capture_func, # type: Callable[[Envelope], None] record_lost_func, # type: Callable[..., None] ): # type: (...) -> None self._metric_buffer = [] # type: List[Metric] self._capture_func = capture_func self._record_lost_func = record_lost_func self._running = True self._lock = threading.Lock() self._flush_event = threading.Event() # type: threading.Event self._flusher = None # type: Optional[threading.Thread] self._flusher_pid = None # type: Optional[int] def _ensure_thread(self): # type: (...) -> bool if not self._running: return False pid = os.getpid() if self._flusher_pid == pid: return True with self._lock: if self._flusher_pid == pid: return True self._flusher_pid = pid self._flusher = threading.Thread(target=self._flush_loop) self._flusher.daemon = True try: self._flusher.start() except RuntimeError: self._running = False return False return True def _flush_loop(self): # type: (...) -> None while self._running: self._flush_event.wait(self.FLUSH_WAIT_TIME + random.random()) self._flush_event.clear() self._flush() def add( self, metric, # type: Metric ): # type: (...) -> None if not self._ensure_thread() or self._flusher is None: return None with self._lock: if len(self._metric_buffer) >= self.MAX_METRICS_BEFORE_DROP: self._record_lost_func( reason="queue_overflow", data_category="trace_metric", quantity=1, ) return None self._metric_buffer.append(metric) if len(self._metric_buffer) >= self.MAX_METRICS_BEFORE_FLUSH: self._flush_event.set() def kill(self): # type: (...) -> None if self._flusher is None: return self._running = False self._flush_event.set() self._flusher = None def flush(self): # type: (...) -> None self._flush() @staticmethod def _metric_to_transport_format(metric): # type: (Metric) -> Any def format_attribute(val): # type: (Union[int, float, str, bool]) -> Any if isinstance(val, bool): return {"value": val, "type": "boolean"} if isinstance(val, int): return {"value": val, "type": "integer"} if isinstance(val, float): return {"value": val, "type": "double"} if isinstance(val, str): return {"value": val, "type": "string"} return {"value": safe_repr(val), "type": "string"} res = { "timestamp": metric["timestamp"], "trace_id": metric["trace_id"], "name": metric["name"], "type": metric["type"], "value": metric["value"], "attributes": { k: format_attribute(v) for (k, v) in metric["attributes"].items() }, } if metric.get("span_id") is not None: res["span_id"] = metric["span_id"] if metric.get("unit") is not None: res["unit"] = metric["unit"] return res def _flush(self): # type: (...) -> Optional[Envelope] envelope = Envelope( headers={"sent_at": format_timestamp(datetime.now(timezone.utc))} ) with self._lock: if len(self._metric_buffer) == 0: return None envelope.add_item( Item( type="trace_metric", content_type="application/vnd.sentry.items.trace-metric+json", headers={ "item_count": len(self._metric_buffer), }, payload=PayloadRef( json={ "items": [ self._metric_to_transport_format(metric) for metric in self._metric_buffer ] } ), ) ) self._metric_buffer.clear() self._capture_func(envelope) return envelope
Upload File
Create Folder