|
5 | 5 | from opentelemetry import metrics, trace |
6 | 6 | from opentelemetry.exporter.otlp.proto.http.metric_exporter import OTLPMetricExporter |
7 | 7 | from opentelemetry.exporter.otlp.proto.http.trace_exporter import OTLPSpanExporter |
8 | | -from opentelemetry.sdk.metrics import MeterProvider |
9 | | -from opentelemetry.sdk.metrics.export import PeriodicExportingMetricReader |
| 8 | +from opentelemetry.sdk.metrics import Counter, Histogram, MeterProvider, UpDownCounter |
| 9 | +from opentelemetry.sdk.metrics.export import ( |
| 10 | + AggregationTemporality, |
| 11 | + PeriodicExportingMetricReader, |
| 12 | +) |
10 | 13 | from opentelemetry.sdk.resources import Resource |
11 | 14 | from opentelemetry.sdk.trace import TracerProvider, sampling |
12 | 15 | from opentelemetry.sdk.trace.export import BatchSpanProcessor |
@@ -53,10 +56,17 @@ def ready(self) -> None: |
53 | 56 | tracer_provider.add_span_processor(BatchSpanProcessor(span_exporter)) |
54 | 57 | trace.set_tracer_provider(tracer_provider) |
55 | 58 |
|
56 | | - # Metrics |
| 59 | + # Metrics — use delta temporality so each export contains only the |
| 60 | + # increment since the last export, not a running total. This makes |
| 61 | + # server-side aggregation (sum/avg in ClickHouse) straightforward. |
57 | 62 | metric_exporter = OTLPMetricExporter( |
58 | 63 | endpoint=f"{export_url}/v1/metrics", |
59 | 64 | headers=headers, |
| 65 | + preferred_temporality={ |
| 66 | + Counter: AggregationTemporality.DELTA, |
| 67 | + Histogram: AggregationTemporality.DELTA, |
| 68 | + UpDownCounter: AggregationTemporality.DELTA, |
| 69 | + }, |
60 | 70 | ) |
61 | 71 | reader = PeriodicExportingMetricReader(metric_exporter) |
62 | 72 | meter_provider = MeterProvider(metric_readers=[reader], resource=resource) |
|
0 commit comments