diff --git a/swh/core/statsd.py b/swh/core/statsd.py --- a/swh/core/statsd.py +++ b/swh/core/statsd.py @@ -83,7 +83,7 @@ self.statsd = statsd self.metric = metric self.error_metric = error_metric - self.tags = tags + self.tags = tags or {} self.sample_rate = sample_rate self.elapsed = None # this is for testing purpose @@ -104,8 +104,8 @@ start = monotonic() try: result = await func(*args, **kwargs) - except: # noqa - self._send_error() + except BaseException as e: + self._send_error(error_type=type(e).__name__) raise self._send(start) return result @@ -118,8 +118,8 @@ start = monotonic() try: result = func(*args, **kwargs) - except: # noqa - self._send_error() + except BaseException as e: + self._send_error(error_type=type(e).__name__) raise self._send(start) return result @@ -137,7 +137,7 @@ if type is None: self._send(self._start) else: - self._send_error() + self._send_error(error_type=type.__name__) def _send(self, start): elapsed = (monotonic() - start) * 1000 @@ -146,10 +146,14 @@ ) self.elapsed = elapsed - def _send_error(self): + def _send_error(self, error_type=None): if self.error_metric is None: self.error_metric = self.metric + "_error_count" - self.statsd.increment(self.error_metric, tags=self.tags) + if error_type is not None: + tags = {**self.tags, "error_type": error_type} + else: + tags = self.tags + self.statsd.increment(self.error_metric, tags=tags) def start(self): """Start the timer""" diff --git a/swh/core/tests/test_statsd.py b/swh/core/tests/test_statsd.py --- a/swh/core/tests/test_statsd.py +++ b/swh/core/tests/test_statsd.py @@ -219,12 +219,13 @@ func(1, 0) packet = statsd.socket.recv() - name_value, type_ = packet.split("|") + name_value, type_, tags = packet.split("|") name, value = name_value.split(":") assert type_ == "c" assert name == "timed.test_error_count" assert int(value) == 1 + assert tags == "#error_type:ZeroDivisionError" def test_timed_no_metric(statsd): @@ -322,12 +323,13 @@ # Ensure the timing was recorded. packet = statsd.socket.recv() - name_value, type_ = packet.split("|") + name_value, type_, tags = packet.split("|") name, value = name_value.split(":") assert type_ == "c" assert name == "timed_context.test_error_count" assert int(value) == 1 + assert tags == "#error_type:ContextException" def test_timed_context_no_metric_name_exception(statsd):