For the complete documentation index, see llms.txt. Markdown versions are available by appending .md to documentation URLs.

Reduce Metric Sample Volume and Cardinality

SigNoz Cloud - This page applies to SigNoz Cloud editions.
Self-Host - This page applies to self-hosted SigNoz editions.

This guide covers the primary causes of metric volume growth in SigNoz and how to address each one.

Metrics are measured in Samples: a single (timestamp, value) pair for one time series. Every unique combination of label values creates a distinct time series: a metric with a label carrying 500 unique values generates 500 distinct time series, each emitting a sample on every scrape interval.

Understanding High Cardinality Data: explains why cardinality multiplies time series and the downstream impact on storage and query performance.

Optimization Tiers

Address the problem as close to its source as possible before reaching for Collector processors:

  1. Instrumentation: parameterize dynamic routes. Addresses the problem at source, before it enters the pipeline.
  2. OTel SDK: use the View API to drop attributes or entire metrics before they are serialized to OTLP.
  3. OTel Collector: use processors to aggregate or drop metrics in the pipeline. Covered in the problems below.

Problem 1: Unused Metrics

The simplest reduction is to stop ingesting metrics that serve no purpose in any dashboard or alert. Drop them at the Collector before they reach SigNoz.

Read more: How to Drop OpenTelemetry Metrics

Problem 2: High-Cardinality Labels

OTel Instrumentation libraries commonly emit high-cardinality attributes like k8s.pod.name, client.port, url.full directly on metric data points. If a label like k8s.pod.name has 200 unique values, it multiplies your baseline time series by 200×.

Step 1: Find the Noisy Labels

  1. Go to Metrics. Toggle to the Time Series view.
  2. Select your top ingested metric. Expand the "All Attributes" panel.
  3. Identify labels with hundreds or thousands of unique values.

Step 2: Verify Usage

Before aggregating anything, confirm the label is not in active use. If it appears in any dashboard or alert, do not aggregate it. The aggregation will break those queries.

  • Open the metric in Metrics Explorer. If it is used in any dashboards or alert rules, the counts appear at the top of the detail view. If neither is shown, the metric is not referenced anywhere and is safe to drop.
Metric detail view showing dashboard and alert rule counts at the top
Metrics Explorer: dashboard and alert rule counts appear at the top if the metric is in active use

Step 3: Implement the Fix (Aggregation)

If the label is unused, aggregating it will reduce the number of time series to one per unique combination of the retained labels.

LabelWhy it's problematicVerdict
k8s.pod.name / k8s.pod.uidChanges on every pod restart or redeploy. Large multiplier.Aggregate away
client.port / net.peer.portEphemeral TCP ports (49152–65535).Aggregate away
url.full / http.targetDynamic query params.Aggregate away
db.query.textFull SQL with literal values.Aggregate away
http.routeUnparameterized raw URLs (/user/123 instead of /user/{id}).Fix at instrumentation: parameterize route patterns in your SDK or framework router

Read more: How to safely drop metric labels

Problem 3: Cumulative Temporality

By default, OpenTelemetry SDKs use Cumulative Temporality: they emit a sample carrying the running total on every scrape interval, even when the value is unchanged.

Delta Temporality only emits a sample when the value changes. See Metric Types and Aggregation for a detailed explanation of temporality and how it affects aggregation.

When to Switch to Delta

If you have large idle infrastructure (e.g., 1000 pods with only 10 receiving traffic in a given minute), Delta prevents the 990 idle pods from emitting unchanged samples every scrape interval. This applies to synchronous instruments (like a request counter incremented per request); asynchronous instruments whose callback runs on every collection cycle still emit a sample each interval regardless of temporality.

FeatureCumulativeDelta
Idle seriesAlways sendsSkips unchanged
Network failureNext scrape recovers the total (Safe)Gap is permanently lost
Collector memoryTracks running totalsLower (no running totals to maintain)
UpDownCounter / Async UpDownCounterCumulativeCumulative (unaffected; Delta is undefined for bidirectional instruments)

OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE=delta applies Delta to Counter, Async Counter, and Histogram only. UpDownCounter, Async UpDownCounter, Gauge and Async Gauge remain Cumulative regardless.

How to Set Delta:

export OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE=delta

Problem 4: Collection Interval

Sample count scales directly with how often each time series is emitted. A metric exported every 5 seconds generates 12x the samples of the same metric exported every 60 seconds, with no change in cardinality.

SDK metrics: the OTel SDK default for OTEL_METRIC_EXPORT_INTERVAL is 60000 (60s). If your service overrides it to export more frequently, for example for a low-latency alert that no longer needs that resolution, raise it back toward the default or higher:

export OTEL_METRIC_EXPORT_INTERVAL=60000  # raise this if your service currently overrides it lower

Collector receivers (for example hostmetrics): the receiver's own default collection_interval is 1m. If your config explicitly sets a shorter interval, raise it:

receivers:
  hostmetrics:
    collection_interval: 60s # raise this if your config currently sets a shorter interval

Validate Your Changes

To confirm the volume reduction:

  1. Navigate to Metrics. In the list view, verify that unused metrics you dropped no longer appear, or that the time series count for your target metric has reduced.
  2. Check the Cost Meter Dashboard after an hour to confirm the datapoint.count trend has dropped.

Next Steps

Get Help

If you need help with the steps in this topic, please reach out to us on SigNoz Community Slack. If you are a SigNoz Cloud user, please use in product chat support located at the bottom right corner of your SigNoz instance or contact us at cloud-support@signoz.io.

Is this page helpful

Last updatedAugust 14, 2026

Edit on GitHub