Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions snuba/settings/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -130,6 +130,9 @@
}
DDM_METRICS_SAMPLE_RATE = float(os.environ.get("SNUBA_DDM_METRICS_SAMPLE_RATE", 0.01))

NEW_DOGSTATSD_HOST: str | None = os.environ.get("SNUBA_NEW_STATSD_HOST") or None
NEW_DOGSTATSD_PORT: int | None = int(os.environ.get("SNUBA_NEW_STATSD_PORT") or 0) or None

CLICKHOUSE_READONLY_USER = os.environ.get("CLICKHOUSE_READONLY_USER", "default")
CLICKHOUSE_READONLY_PASSWORD = os.environ.get("CLICKHOUSE_READONLY_PASSWORD", "")

Expand Down
21 changes: 20 additions & 1 deletion snuba/utils/metrics/backends/dualwrite.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,10 +15,14 @@ class SentryDatadogMetricsBackend(MetricsBackend):
"""

def __init__(
self, datadog: DatadogMetricsBackend, sentry: SentryMetricsBackend
self,
datadog: DatadogMetricsBackend,
sentry: SentryMetricsBackend,
new_datadog: DatadogMetricsBackend | None = None,
) -> None:
self.datadog = datadog
self.sentry = sentry
self.new_datadog = new_datadog

def _use_sentry(self) -> bool:
from snuba import state
Expand All @@ -27,6 +31,11 @@ def _use_sentry(self) -> bool:
return bool(random.random() < settings.DDM_METRICS_SAMPLE_RATE)
return False

def _use_new_datadog(self) -> bool:
from snuba import state

return str(state.get_config("use_new_datadog_metrics", "0")) == "1"

def increment(
self,
name: str,
Expand All @@ -37,6 +46,8 @@ def increment(
self.datadog.increment(name, value, tags, unit)
if self._use_sentry():
self.sentry.increment(name, value, tags, unit)
if self._use_new_datadog() and self.new_datadog is not None:
self.new_datadog.increment(name, value, tags, unit)

def gauge(
self,
Expand All @@ -48,6 +59,8 @@ def gauge(
self.datadog.gauge(name, value, tags, unit)
if self._use_sentry():
self.sentry.gauge(name, value, tags, unit)
if self._use_new_datadog() and self.new_datadog is not None:
self.new_datadog.gauge(name, value, tags, unit)

def timing(
self,
Expand All @@ -59,6 +72,8 @@ def timing(
self.datadog.timing(name, value, tags, unit)
if self._use_sentry():
self.sentry.timing(name, value, tags, unit)
if self._use_new_datadog() and self.new_datadog is not None:
self.new_datadog.timing(name, value, tags, unit)

def distribution(
self,
Expand All @@ -70,6 +85,8 @@ def distribution(
self.datadog.distribution(name, value, tags, unit)
if self._use_sentry():
self.sentry.distribution(name, value, tags, unit)
if self._use_new_datadog() and self.new_datadog is not None:
self.new_datadog.distribution(name, value, tags, unit)

def events(
self,
Expand All @@ -80,3 +97,5 @@ def events(
tags: Tags | None = None,
) -> None:
self.datadog.events(title, text, alert_type, priority, tags)
if self._use_new_datadog() and self.new_datadog is not None:
self.new_datadog.events(title, text, alert_type, priority, tags)
25 changes: 22 additions & 3 deletions snuba/utils/metrics/util.py
Original file line number Diff line number Diff line change
Expand Up @@ -41,20 +41,39 @@ def create_metrics(
from snuba.utils.metrics.backends.dualwrite import SentryDatadogMetricsBackend
from snuba.utils.metrics.backends.sentry import SentryMetricsBackend

new_datadog_host: Optional[str] = settings.NEW_DOGSTATSD_HOST
new_datadog_port: Optional[int] = settings.NEW_DOGSTATSD_PORT
new_datadog_backend: Optional[DatadogMetricsBackend] = None

if new_datadog_host and new_datadog_port:
new_datadog_backend = DatadogMetricsBackend(
partial(
DogStatsd,
host=host,
port=port,
namespace=prefix,
constant_tags=(
[f"{key}:{value}" for key, value in tags.items()] if tags is not None else None
),
),
sample_rates,
)

return SentryDatadogMetricsBackend(
DatadogMetricsBackend(
partial(
DogStatsd,
host=host,
port=port,
namespace=prefix,
constant_tags=[f"{key}:{value}" for key, value in tags.items()]
if tags is not None
else None,
constant_tags=(
[f"{key}:{value}" for key, value in tags.items()] if tags is not None else None
),
),
sample_rates,
),
SentryMetricsBackend(),
new_datadog_backend,
)


Expand Down
Loading