Setup Sentry Metrics
Configure Sentry's custom metrics for tracking counters, gauges, and distributions.
Invoke This Skill When
- User asks to "add Sentry metrics" or "track custom metrics"
- User wants counters, gauges, or distributions
- User asks about
Sentry.metricsorsentry_sdk.metrics
Quick Reference
| Platform | Min SDK | API |
|----------|---------|-----|
| JavaScript | 10.25.0+ | Sentry.metrics.* |
| Python | 2.44.0+ | sentry_sdk.metrics.* |
Note: Ruby does not have metrics support.
Metric Types
| Type | Purpose | Example Use Cases | |------|---------|-------------------| | Counter | Cumulative counts | API calls, clicks, errors | | Gauge | Point-in-time values | Queue depth, memory, connections | | Distribution | Statistical values | Response times, cart amounts |
JavaScript Setup
Metrics are enabled by default in SDK 10.25.0+.
Counter
Sentry.metrics.count("api_call", 1, {
attributes: { endpoint: "/api/users", status_code: 200 },
});
Gauge
Sentry.metrics.gauge("queue_depth", 42, {
unit: "none",
attributes: { queue: "jobs" },
});
Distribution
Sentry.metrics.distribution("response_time", 187.5, {
unit: "millisecond",
attributes: { endpoint: "/api/products" },
});
Filtering (optional)
Sentry.init({
beforeSendMetric: (metric) => {
if (metric.attributes?.sensitive) return null;
return metric;
},
});
Python Setup
Metrics are enabled by default in SDK 2.44.0+.
Counter
sentry_sdk.metrics.count("api_call", 1, attributes={"endpoint": "/api/users"})
Gauge
sentry_sdk.metrics.gauge("queue_depth", 42, attributes={"queue": "jobs"})
Distribution
sentry_sdk.metrics.distribution(
"response_time", 187.5,
unit="millisecond",
attributes={"endpoint": "/api/products"}
)
Filtering (optional)
def before_send_metric(metric, hint):
if metric.get("attributes", {}).get("sensitive"):
return None
return metric
sentry_sdk.init(dsn="YOUR_DSN", before_send_metric=before_send_metric)
Common Units
| Category | Values |
|----------|--------|
| Time | millisecond, second, minute, hour |
| Size | byte, kilobyte, megabyte |
| Currency | usd, eur, gbp |
| Other | none, percent, ratio |
Timing Helper Pattern
JavaScript
async function withTiming(name, fn, attrs = {}) {
const start = performance.now();
try { return await fn(); }
finally {
Sentry.metrics.distribution(name, performance.now() - start, {
unit: "millisecond", attributes: attrs,
});
}
}
Python
import time, sentry_sdk
def track_duration(name, **attrs):
def decorator(fn):
def wrapper(*args, **kwargs):
start = time.time()
try: return fn(*args, **kwargs)
finally:
sentry_sdk.metrics.distribution(
name, (time.time() - start) * 1000,
unit="millisecond", attributes=attrs
)
return wrapper
return decorator
Best Practices
- Low cardinality: Avoid user IDs, request IDs in attributes
- Namespaced names:
api.request.duration, notduration - Flush on exit: Call
Sentry.flush()before process exit
Troubleshooting
| Issue | Solution |
|-------|----------|
| Metrics not appearing | Verify SDK version, check DSN, wait for buffer flush |
| High cardinality warning | Remove unique IDs from attributes |
| Too many metrics | Use beforeSendMetric to filter |