SentryMetrics: use transactions and call parent methods
This commit is contained in:
@@ -9,6 +9,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|||||||
|
|
||||||
### Fixed
|
### Fixed
|
||||||
|
|
||||||
|
- Fixed a `SentryMetrics` issue that was preventing any metrics to be sent to
|
||||||
|
Sentry and also was preventing from metrics frames to be pushed to the pipeline.
|
||||||
|
|
||||||
- Fixed an issue in `BaseOutputTransport` where incoming audio would not be
|
- Fixed an issue in `BaseOutputTransport` where incoming audio would not be
|
||||||
resampled to the desired output sample rate.
|
resampled to the desired output sample rate.
|
||||||
|
|
||||||
|
|||||||
@@ -73,6 +73,7 @@ openai = [ "openai~=1.59.6", "websockets~=13.1", "python-deepcompare~=2.1.0" ]
|
|||||||
openpipe = [ "openpipe~=4.45.0" ]
|
openpipe = [ "openpipe~=4.45.0" ]
|
||||||
playht = [ "pyht~=0.1.6", "websockets~=13.1" ]
|
playht = [ "pyht~=0.1.6", "websockets~=13.1" ]
|
||||||
riva = [ "nvidia-riva-client~=2.18.0" ]
|
riva = [ "nvidia-riva-client~=2.18.0" ]
|
||||||
|
sentry = [ "sentry-sdk~=2.20.0" ]
|
||||||
silero = [ "onnxruntime~=1.20.1" ]
|
silero = [ "onnxruntime~=1.20.1" ]
|
||||||
simli = [ "simli-ai~=0.1.10"]
|
simli = [ "simli-ai~=0.1.10"]
|
||||||
soundfile = [ "soundfile~=0.13.0" ]
|
soundfile = [ "soundfile~=0.13.0" ]
|
||||||
|
|||||||
@@ -4,19 +4,14 @@
|
|||||||
# SPDX-License-Identifier: BSD 2-Clause License
|
# SPDX-License-Identifier: BSD 2-Clause License
|
||||||
#
|
#
|
||||||
|
|
||||||
import time
|
|
||||||
|
|
||||||
from loguru import logger
|
from loguru import logger
|
||||||
|
|
||||||
try:
|
try:
|
||||||
import sentry_sdk
|
import sentry_sdk
|
||||||
|
except ModuleNotFoundError as e:
|
||||||
sentry_available = sentry_sdk.is_initialized()
|
logger.error(f"Exception: {e}")
|
||||||
if not sentry_available:
|
logger.error("In order to use Sentry, you need to `pip install pipecat-ai[sentry]`.")
|
||||||
logger.warning("Sentry SDK not initialized. Sentry features will be disabled.")
|
raise Exception(f"Missing module: {e}")
|
||||||
except ImportError:
|
|
||||||
sentry_available = False
|
|
||||||
logger.warning("Sentry SDK not installed. Sentry features will be disabled.")
|
|
||||||
|
|
||||||
from pipecat.processors.metrics.frame_processor_metrics import FrameProcessorMetrics
|
from pipecat.processors.metrics.frame_processor_metrics import FrameProcessorMetrics
|
||||||
|
|
||||||
@@ -24,41 +19,44 @@ from pipecat.processors.metrics.frame_processor_metrics import FrameProcessorMet
|
|||||||
class SentryMetrics(FrameProcessorMetrics):
|
class SentryMetrics(FrameProcessorMetrics):
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
super().__init__()
|
super().__init__()
|
||||||
self._ttfb_metrics_span = None
|
self._ttfb_metrics_tx = None
|
||||||
self._processing_metrics_span = None
|
self._processing_metrics_tx = None
|
||||||
|
self._sentry_available = sentry_sdk.is_initialized()
|
||||||
|
if not self._sentry_available:
|
||||||
|
logger.warning("Sentry SDK not initialized. Sentry features will be disabled.")
|
||||||
|
|
||||||
async def start_ttfb_metrics(self, report_only_initial_ttfb):
|
async def start_ttfb_metrics(self, report_only_initial_ttfb):
|
||||||
if self._should_report_ttfb:
|
await super().start_ttfb_metrics(report_only_initial_ttfb)
|
||||||
self._start_ttfb_time = time.time()
|
|
||||||
if sentry_available:
|
|
||||||
self._ttfb_metrics_span = sentry_sdk.start_span(
|
|
||||||
op="ttfb",
|
|
||||||
description=f"TTFB for {self._processor_name()}",
|
|
||||||
start_timestamp=self._start_ttfb_time,
|
|
||||||
)
|
|
||||||
logger.debug(
|
|
||||||
f"Sentry Span ID: {self._ttfb_metrics_span.span_id} Description: {self._ttfb_metrics_span.description} started."
|
|
||||||
)
|
|
||||||
self._should_report_ttfb = not report_only_initial_ttfb
|
|
||||||
|
|
||||||
async def stop_ttfb_metrics(self):
|
if self._should_report_ttfb and self._sentry_available:
|
||||||
stop_time = time.time()
|
self._ttfb_metrics_tx = sentry_sdk.start_transaction(
|
||||||
if sentry_available:
|
op="ttfb",
|
||||||
self._ttfb_metrics_span.finish(end_timestamp=stop_time)
|
name=f"TTFB for {self._processor_name()}",
|
||||||
|
|
||||||
async def start_processing_metrics(self):
|
|
||||||
self._start_processing_time = time.time()
|
|
||||||
if sentry_available:
|
|
||||||
self._processing_metrics_span = sentry_sdk.start_span(
|
|
||||||
op="processing",
|
|
||||||
description=f"Processing for {self._processor_name()}",
|
|
||||||
start_timestamp=self._start_processing_time,
|
|
||||||
)
|
)
|
||||||
logger.debug(
|
logger.debug(
|
||||||
f"Sentry Span ID: {self._processing_metrics_span.span_id} Description: {self._processing_metrics_span.description} started."
|
f"Sentry transaction started (ID: {self._ttfb_metrics_tx.span_id} Name: {self._ttfb_metrics_tx.name})"
|
||||||
|
)
|
||||||
|
|
||||||
|
async def stop_ttfb_metrics(self):
|
||||||
|
await super().stop_ttfb_metrics()
|
||||||
|
|
||||||
|
if self._sentry_available and self._ttfb_metrics_tx:
|
||||||
|
self._ttfb_metrics_tx.finish()
|
||||||
|
|
||||||
|
async def start_processing_metrics(self):
|
||||||
|
await super().start_processing_metrics()
|
||||||
|
|
||||||
|
if self._sentry_available:
|
||||||
|
self._processing_metrics_tx = sentry_sdk.start_transaction(
|
||||||
|
op="processing",
|
||||||
|
name=f"Processing for {self._processor_name()}",
|
||||||
|
)
|
||||||
|
logger.debug(
|
||||||
|
f"Sentry transaction started (ID: {self._processing_metrics_tx.span_id} Name: {self._processing_metrics_tx.name})"
|
||||||
)
|
)
|
||||||
|
|
||||||
async def stop_processing_metrics(self):
|
async def stop_processing_metrics(self):
|
||||||
stop_time = time.time()
|
await super().stop_processing_metrics()
|
||||||
if sentry_available:
|
|
||||||
self._processing_metrics_span.finish(end_timestamp=stop_time)
|
if self._sentry_available and self._processing_metrics_tx:
|
||||||
|
self._processing_metrics_tx.finish()
|
||||||
|
|||||||
Reference in New Issue
Block a user