Skip to content

PeriodicMetricExporter does not export periodically for either Delta or Cumulative temporality ExponentialHistogram #3971

Open

Description

@alexchowle

Describe your environment

OS: Centos 7
Python version: 3.11.1
SDK version: 1.25.0
API version: 1.25.0

What happened?

I have a low-throughput service and have implemented my own Histogram to measure the duration of an operation. This uses a PeriodicMetricExporter which is configured to export every 60 seconds. When I use Delta temporality, I get an export within 60 seconds of the last histogram recording. I then have no exports until the next observation is made.

When changing to Cumulative temporality I have the exact same experience. For comparison purposes, when using the Golang SDK I get the same behaviour as Python's Delta but, when using Cumulative, I get a metronomic export every 60 seconds regardless of any observations being recorded..

Should the Python PeriodicMetricExporter export every 60 seconds or not, and how does temporality setting play into it? At the moment it causes me a problem because my service has low throughput. My observability backend (New Relic) uses the StartTimeUnixNano value which can be hours in the past. A constant periodic export would help to correct this as the StartTimeUnixNano would be at most 60 seconds in the past.

Steps to Reproduce

metrics_temporality = {
        Histogram: AggregationTemporality.DELTA
    }
otlp_metric_exporter = OTLPMetricExporter(endpoint=grpc_collector_address, insecure=True,
                                              preferred_temporality=metrics_temporality, timeout=30_000)
metric_reader = PeriodicExportingMetricReader(otlp_metric_exporter,
                                                  export_interval_millis=60_000))
meter_provider = MeterProvider(metric_readers=[metric_reader], resource=_create_resources(),
                                   views=[View(instrument_type=Histogram,
                                               aggregation=ExponentialBucketHistogramAggregation())])
metrics.set_meter_provider(meter_provider)

meter = metrics.get_meter(__name__)

h = meter.create_histogram(
        name='my_histogram', unit='s', description='just my histogram'
    )

h.record(1.0)
time.sleep(120)
h.record(2.0)
    

Expected Result

I expected to see periodic metric exports for the histogram every 60 seconds, regardless of chosen temporality

Actual Result

A metric export within 60 seconds of the last observation.

Additional context

N/A

Would you like to implement a fix?

None

Activity

  1. aabmass commented on Jun 14, 2024

    @aabmass
    Member
  2. added a commit that references this issue on Sep 7, 2026
    0a3eb11
  3. added a commit that references this issue on Sep 10, 2026
    ab22674
  4. mertefesensoy commented on Nov 1, 2026

    @mertefesensoy

    SDK 1.26.0 includes the fix for this cumulative exponential histogram case in #3978, released July 25, 2024.

    My Codex agent executed this example on Python 3.12.10, using SDK 1.25.0 and 1.26.0 with their matching API and semantic conventions. It records once, then collects twice.

    from opentelemetry.sdk.metrics import MeterProvider
    from opentelemetry.sdk.metrics._internal.instrument import Histogram
    from opentelemetry.sdk.metrics.export import AggregationTemporality, InMemoryMetricReader
    from opentelemetry.sdk.metrics.view import ExponentialBucketHistogramAggregation, View
    
    reader = InMemoryMetricReader(
        preferred_temporality={Histogram: AggregationTemporality.CUMULATIVE}
    )
    provider = MeterProvider(
        metric_readers=[reader],
        views=[View(instrument_type=Histogram, aggregation=ExponentialBucketHistogramAggregation())],
    )
    histogram = provider.get_meter("repro3971").create_histogram("duration")
    histogram.record(1.0)
    try:
        for _ in range(2):
            data = reader.get_metrics_data()
            print([
                point.count
                for resource in data.resource_metrics
                for scope in resource.scope_metrics
                for metric in scope.metrics
                for point in metric.data.data_points
            ] if data else [])
    finally:
        provider.shutdown()
    SDK 1.25.0: [1], []
    SDK 1.26.0: [1], [1]
    

    With PeriodicExportingMetricReader and an in-memory recording exporter, the agent also observed three cumulative exports after one observation on 1.26.0 and current main (bc3bd9ce). Cumulative StartTimeUnixNano stayed constant across those exports; repeated export does not move the cumulative start time forward.

    The New Relic path was not exercised. For the missing cumulative exports, try SDK 1.26.0 or later with AggregationTemporality.CUMULATIVE.

    Assisted with Claude Code; I checked and edited it.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions