Skip to content

Commit 038e65d

Browse files
authored
Add support for LowMemory metrics temporality (#2234)
1 parent bc23e6a commit 038e65d

File tree

7 files changed

+130
-9
lines changed

7 files changed

+130
-9
lines changed

exporters/otlp/BUILD

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ cc_library(
2020
"include/opentelemetry/exporters/otlp/otlp_log_recordable.h",
2121
"include/opentelemetry/exporters/otlp/otlp_metric_utils.h",
2222
"include/opentelemetry/exporters/otlp/otlp_populate_attribute_utils.h",
23+
"include/opentelemetry/exporters/otlp/otlp_preferred_temporality.h",
2324
"include/opentelemetry/exporters/otlp/otlp_recordable.h",
2425
"include/opentelemetry/exporters/otlp/otlp_recordable_utils.h",
2526
"include/opentelemetry/exporters/otlp/protobuf_include_prefix.h",

exporters/otlp/include/opentelemetry/exporters/otlp/otlp_grpc_metric_exporter_options.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
#pragma once
55

66
#include "opentelemetry/exporters/otlp/otlp_grpc_exporter_options.h"
7+
#include "opentelemetry/exporters/otlp/otlp_preferred_temporality.h"
78
#include "opentelemetry/sdk/metrics/instruments.h"
89

910
#include <memory>
@@ -21,8 +22,8 @@ struct OtlpGrpcMetricExporterOptions : public OtlpGrpcExporterOptions
2122
{
2223

2324
// Preferred Aggregation Temporality
24-
sdk::metrics::AggregationTemporality aggregation_temporality =
25-
sdk::metrics::AggregationTemporality::kCumulative;
25+
PreferredAggregationTemporality aggregation_temporality =
26+
PreferredAggregationTemporality::kCumulative;
2627
};
2728

2829
} // namespace otlp

exporters/otlp/include/opentelemetry/exporters/otlp/otlp_http_metric_exporter_options.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
#include "opentelemetry/exporters/otlp/otlp_environment.h"
77
#include "opentelemetry/exporters/otlp/otlp_http.h"
8-
#include "opentelemetry/sdk/metrics/instruments.h"
8+
#include "opentelemetry/exporters/otlp/otlp_preferred_temporality.h"
99

1010
#include <chrono>
1111
#include <cstddef>
@@ -50,8 +50,8 @@ struct OtlpHttpMetricExporterOptions
5050
OtlpHeaders http_headers = GetOtlpDefaultMetricsHeaders();
5151

5252
// Preferred Aggregation Temporality
53-
sdk::metrics::AggregationTemporality aggregation_temporality =
54-
sdk::metrics::AggregationTemporality::kCumulative;
53+
PreferredAggregationTemporality aggregation_temporality =
54+
PreferredAggregationTemporality::kCumulative;
5555

5656
#ifdef ENABLE_ASYNC_EXPORT
5757
// Concurrent requests

exporters/otlp/include/opentelemetry/exporters/otlp/otlp_metric_utils.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
#include "opentelemetry/proto/metrics/v1/metrics.pb.h"
1010
#include "opentelemetry/proto/resource/v1/resource.pb.h"
1111

12+
#include "opentelemetry/exporters/otlp/otlp_preferred_temporality.h"
1213
#include "opentelemetry/exporters/otlp/protobuf_include_suffix.h"
1314

1415
#include "opentelemetry/sdk/metrics/export/metric_producer.h"
@@ -52,11 +53,13 @@ class OtlpMetricUtils
5253
proto::collector::metrics::v1::ExportMetricsServiceRequest *request) noexcept;
5354

5455
static sdk::metrics::AggregationTemporalitySelector ChooseTemporalitySelector(
55-
sdk::metrics::AggregationTemporality preferred_aggregation_temporality) noexcept;
56+
PreferredAggregationTemporality preferred_aggregation_temporality) noexcept;
5657
static sdk::metrics::AggregationTemporality DeltaTemporalitySelector(
5758
sdk::metrics::InstrumentType instrument_type) noexcept;
5859
static sdk::metrics::AggregationTemporality CumulativeTemporalitySelector(
5960
sdk::metrics::InstrumentType instrument_type) noexcept;
61+
static sdk::metrics::AggregationTemporality LowMemoryTemporalitySelector(
62+
sdk::metrics::InstrumentType instrument_type) noexcept;
6063
};
6164

6265
} // namespace otlp
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
// Copyright The OpenTelemetry Authors
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
#pragma once
5+
#include "opentelemetry/version.h"
6+
7+
OPENTELEMETRY_BEGIN_NAMESPACE
8+
namespace exporter
9+
{
10+
namespace otlp
11+
{
12+
13+
enum class PreferredAggregationTemporality
14+
{
15+
kUnspecified,
16+
kDelta,
17+
kCumulative,
18+
kLowMemory,
19+
};
20+
21+
}
22+
} // namespace exporter
23+
OPENTELEMETRY_END_NAMESPACE

exporters/otlp/src/otlp_metric_utils.cc

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -247,13 +247,17 @@ void OtlpMetricUtils::PopulateRequest(
247247
}
248248

249249
sdk::metrics::AggregationTemporalitySelector OtlpMetricUtils::ChooseTemporalitySelector(
250-
sdk::metrics::AggregationTemporality preferred_aggregation_temporality) noexcept
250+
PreferredAggregationTemporality preferred_aggregation_temporality) noexcept
251251
{
252-
if (preferred_aggregation_temporality == sdk::metrics::AggregationTemporality::kDelta)
252+
if (preferred_aggregation_temporality == PreferredAggregationTemporality::kDelta)
253253
{
254254
return DeltaTemporalitySelector;
255255
}
256-
return CumulativeTemporalitySelector;
256+
else if (preferred_aggregation_temporality == PreferredAggregationTemporality::kCumulative)
257+
{
258+
return CumulativeTemporalitySelector;
259+
}
260+
return LowMemoryTemporalitySelector;
257261
}
258262

259263
sdk::metrics::AggregationTemporality OtlpMetricUtils::DeltaTemporalitySelector(
@@ -279,6 +283,22 @@ sdk::metrics::AggregationTemporality OtlpMetricUtils::CumulativeTemporalitySelec
279283
return sdk::metrics::AggregationTemporality::kCumulative;
280284
}
281285

286+
sdk::metrics::AggregationTemporality OtlpMetricUtils::LowMemoryTemporalitySelector(
287+
sdk::metrics::InstrumentType instrument_type) noexcept
288+
{
289+
switch (instrument_type)
290+
{
291+
case sdk::metrics::InstrumentType::kCounter:
292+
case sdk::metrics::InstrumentType::kHistogram:
293+
return sdk::metrics::AggregationTemporality::kDelta;
294+
case sdk::metrics::InstrumentType::kObservableCounter:
295+
case sdk::metrics::InstrumentType::kObservableGauge:
296+
case sdk::metrics::InstrumentType::kUpDownCounter:
297+
case sdk::metrics::InstrumentType::kObservableUpDownCounter:
298+
return sdk::metrics::AggregationTemporality::kCumulative;
299+
}
300+
return sdk::metrics::AggregationTemporality::kUnspecified;
301+
}
282302
} // namespace otlp
283303
} // namespace exporter
284304
OPENTELEMETRY_END_NAMESPACE

exporters/otlp/test/otlp_http_metric_exporter_test.cc

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111

1212
#include "opentelemetry/proto/collector/metrics/v1/metrics_service.pb.h"
1313

14+
#include "opentelemetry/exporters/otlp/otlp_metric_utils.h"
1415
#include "opentelemetry/exporters/otlp/protobuf_include_suffix.h"
1516

1617
#include "opentelemetry/common/key_value_iterable_view.h"
@@ -976,6 +977,78 @@ TEST_F(OtlpHttpMetricExporterTestPeer, CheckDefaultTemporality)
976977
}
977978
#endif
978979

980+
// Test Preferred aggregtion temporality selection
981+
TEST_F(OtlpHttpMetricExporterTestPeer, PreferredAggergationTemporality)
982+
{
983+
// Cummulative aggregation selector : use cummulative aggregation for all instruments.
984+
std::unique_ptr<OtlpHttpMetricExporter> exporter(new OtlpHttpMetricExporter());
985+
EXPECT_EQ(GetOptions(exporter).aggregation_temporality,
986+
PreferredAggregationTemporality::kCumulative);
987+
auto cumm_selector =
988+
OtlpMetricUtils::ChooseTemporalitySelector(GetOptions(exporter).aggregation_temporality);
989+
EXPECT_EQ(cumm_selector(opentelemetry::sdk::metrics::InstrumentType::kCounter),
990+
opentelemetry::sdk::metrics::AggregationTemporality::kCumulative);
991+
EXPECT_EQ(cumm_selector(opentelemetry::sdk::metrics::InstrumentType::kHistogram),
992+
opentelemetry::sdk::metrics::AggregationTemporality::kCumulative);
993+
EXPECT_EQ(cumm_selector(opentelemetry::sdk::metrics::InstrumentType::kUpDownCounter),
994+
opentelemetry::sdk::metrics::AggregationTemporality::kCumulative);
995+
EXPECT_EQ(cumm_selector(opentelemetry::sdk::metrics::InstrumentType::kObservableCounter),
996+
opentelemetry::sdk::metrics::AggregationTemporality::kCumulative);
997+
EXPECT_EQ(cumm_selector(opentelemetry::sdk::metrics::InstrumentType::kObservableGauge),
998+
opentelemetry::sdk::metrics::AggregationTemporality::kCumulative);
999+
EXPECT_EQ(cumm_selector(opentelemetry::sdk::metrics::InstrumentType::kObservableUpDownCounter),
1000+
opentelemetry::sdk::metrics::AggregationTemporality::kCumulative);
1001+
1002+
// LowMemory aggregation selector use:
1003+
// - cummulative aggregtion for Counter and Histogram
1004+
// - delta aggregation for up-down counter, observable counter, observable gauge, observable
1005+
// up-down counter
1006+
OtlpHttpMetricExporterOptions opts2;
1007+
opts2.aggregation_temporality = PreferredAggregationTemporality::kLowMemory;
1008+
std::unique_ptr<OtlpHttpMetricExporter> exporter2(new OtlpHttpMetricExporter(opts2));
1009+
EXPECT_EQ(GetOptions(exporter2).aggregation_temporality,
1010+
PreferredAggregationTemporality::kLowMemory);
1011+
auto lowmemory_selector =
1012+
OtlpMetricUtils::ChooseTemporalitySelector(GetOptions(exporter2).aggregation_temporality);
1013+
EXPECT_EQ(lowmemory_selector(opentelemetry::sdk::metrics::InstrumentType::kCounter),
1014+
opentelemetry::sdk::metrics::AggregationTemporality::kDelta);
1015+
EXPECT_EQ(lowmemory_selector(opentelemetry::sdk::metrics::InstrumentType::kHistogram),
1016+
opentelemetry::sdk::metrics::AggregationTemporality::kDelta);
1017+
1018+
EXPECT_EQ(lowmemory_selector(opentelemetry::sdk::metrics::InstrumentType::kUpDownCounter),
1019+
opentelemetry::sdk::metrics::AggregationTemporality::kCumulative);
1020+
EXPECT_EQ(lowmemory_selector(opentelemetry::sdk::metrics::InstrumentType::kObservableCounter),
1021+
opentelemetry::sdk::metrics::AggregationTemporality::kCumulative);
1022+
EXPECT_EQ(lowmemory_selector(opentelemetry::sdk::metrics::InstrumentType::kObservableGauge),
1023+
opentelemetry::sdk::metrics::AggregationTemporality::kCumulative);
1024+
EXPECT_EQ(
1025+
lowmemory_selector(opentelemetry::sdk::metrics::InstrumentType::kObservableUpDownCounter),
1026+
opentelemetry::sdk::metrics::AggregationTemporality::kCumulative);
1027+
1028+
// Delta aggregation selector use:
1029+
// - delta aggregtion for Counter, Histogram, Observable Counter, Observable Gauge
1030+
// - cummulative aggregation for up-down counter, observable up-down counter
1031+
OtlpHttpMetricExporterOptions opts3;
1032+
opts3.aggregation_temporality = PreferredAggregationTemporality::kDelta;
1033+
std::unique_ptr<OtlpHttpMetricExporter> exporter3(new OtlpHttpMetricExporter(opts3));
1034+
EXPECT_EQ(GetOptions(exporter3).aggregation_temporality, PreferredAggregationTemporality::kDelta);
1035+
auto delta_selector =
1036+
OtlpMetricUtils::ChooseTemporalitySelector(GetOptions(exporter3).aggregation_temporality);
1037+
EXPECT_EQ(delta_selector(opentelemetry::sdk::metrics::InstrumentType::kCounter),
1038+
opentelemetry::sdk::metrics::AggregationTemporality::kDelta);
1039+
EXPECT_EQ(delta_selector(opentelemetry::sdk::metrics::InstrumentType::kHistogram),
1040+
opentelemetry::sdk::metrics::AggregationTemporality::kDelta);
1041+
EXPECT_EQ(delta_selector(opentelemetry::sdk::metrics::InstrumentType::kObservableCounter),
1042+
opentelemetry::sdk::metrics::AggregationTemporality::kDelta);
1043+
EXPECT_EQ(delta_selector(opentelemetry::sdk::metrics::InstrumentType::kObservableGauge),
1044+
opentelemetry::sdk::metrics::AggregationTemporality::kDelta);
1045+
1046+
EXPECT_EQ(delta_selector(opentelemetry::sdk::metrics::InstrumentType::kUpDownCounter),
1047+
opentelemetry::sdk::metrics::AggregationTemporality::kCumulative);
1048+
EXPECT_EQ(delta_selector(opentelemetry::sdk::metrics::InstrumentType::kObservableUpDownCounter),
1049+
opentelemetry::sdk::metrics::AggregationTemporality::kCumulative);
1050+
}
1051+
9791052
} // namespace otlp
9801053
} // namespace exporter
9811054
OPENTELEMETRY_END_NAMESPACE

0 commit comments

Comments
 (0)