|
12 | 12 | import sentry_sdk
|
13 | 13 | from django.conf import settings
|
14 | 14 |
|
| 15 | +from sentry.utils import metrics |
| 16 | + |
15 | 17 | from .base import Feature, FeatureHandlerStrategy
|
16 | 18 | from .exceptions import FeatureNotRegistered
|
17 | 19 |
|
@@ -210,26 +212,49 @@ def has(self, name: str, *args: Any, skip_entity: bool | None = False, **kwargs:
|
210 | 212 | >>> FeatureManager.has('organizations:feature', organization, actor=request.user)
|
211 | 213 |
|
212 | 214 | """
|
| 215 | + sample_rate = 0.01 |
213 | 216 | try:
|
214 |
| - actor = kwargs.pop("actor", None) |
215 |
| - feature = self.get(name, *args, **kwargs) |
| 217 | + with metrics.timer("features.has", tags={"name": name}, sample_rate=sample_rate): |
| 218 | + actor = kwargs.pop("actor", None) |
| 219 | + feature = self.get(name, *args, **kwargs) |
216 | 220 |
|
217 |
| - # Check registered feature handlers |
218 |
| - rv = self._get_handler(feature, actor) |
219 |
| - if rv is not None: |
220 |
| - return rv |
| 221 | + # Check registered feature handlers |
| 222 | + rv = self._get_handler(feature, actor) |
| 223 | + if rv is not None: |
| 224 | + metrics.incr( |
| 225 | + "feature.has.result", |
| 226 | + tags={"name": name, "result": rv}, |
| 227 | + sample_rate=sample_rate, |
| 228 | + ) |
| 229 | + return rv |
221 | 230 |
|
222 |
| - if self._entity_handler and not skip_entity: |
223 |
| - rv = self._entity_handler.has(feature, actor) |
| 231 | + if self._entity_handler and not skip_entity: |
| 232 | + rv = self._entity_handler.has(feature, actor) |
| 233 | + if rv is not None: |
| 234 | + metrics.incr( |
| 235 | + "feature.has.result", |
| 236 | + tags={"name": name, "result": rv}, |
| 237 | + sample_rate=sample_rate, |
| 238 | + ) |
| 239 | + return rv |
| 240 | + |
| 241 | + rv = settings.SENTRY_FEATURES.get(feature.name, False) |
224 | 242 | if rv is not None:
|
| 243 | + metrics.incr( |
| 244 | + "feature.has.result", |
| 245 | + tags={"name": name, "result": rv}, |
| 246 | + sample_rate=sample_rate, |
| 247 | + ) |
225 | 248 | return rv
|
226 | 249 |
|
227 |
| - rv = settings.SENTRY_FEATURES.get(feature.name, False) |
228 |
| - if rv is not None: |
229 |
| - return rv |
| 250 | + # Features are by default disabled if no plugin or default enables them |
| 251 | + metrics.incr( |
| 252 | + "feature.has.result", |
| 253 | + tags={"name": name, "result": False}, |
| 254 | + sample_rate=sample_rate, |
| 255 | + ) |
230 | 256 |
|
231 |
| - # Features are by default disabled if no plugin or default enables them |
232 |
| - return False |
| 257 | + return False |
233 | 258 | except Exception:
|
234 | 259 | logging.exception("Failed to run feature check")
|
235 | 260 | return False
|
|
0 commit comments