Skip to content

Commit a1311d1

Browse files
committed
[SDK] Implement env var configuration for PeriodicExportingMetricReaderOptions
1 parent b7b0278 commit a1311d1

File tree

5 files changed

+122
-9
lines changed

5 files changed

+122
-9
lines changed

CHANGELOG.md

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,12 @@ Increment the:
1515

1616
## [Unreleased]
1717

18+
* [TEST] Shared otel-cpp libs linked to latest static protobuf and grpc
19+
[#3544](https://github.com/open-telemetry/opentelemetry-cpp/pull/3544)
20+
21+
* [SDK] Implement env var configuration for PeriodicExportingMetricReader
22+
[#3549](https://github.com/open-telemetry/opentelemetry-cpp/pull/3549)
23+
1824
## [1.22 2025-07-11]
1925

2026
* [DOC] Udpate link to membership document
@@ -1404,7 +1410,7 @@ Important changes:
14041410
* [ETW EXPORTER] Remove namespace using in ETW exporter which affects global
14051411
namespace
14061412
[#2531](https://github.com/open-telemetry/opentelemetry-cpp/pull/2531)
1407-
* [BUILD] Don't invoke vcpkg from this repo with CMAKE_TOOLCHAIN_FILE set
1413+
* [BUILD] Don't invoke vcpkg from this repo with CMAKE_TOOLCHAIN_FILE set
14081414
[#2527](https://github.com/open-telemetry/opentelemetry-cpp/pull/2527)
14091415
* [EXPORTER] Async exporting for otlp grpc
14101416
[#2407](https://github.com/open-telemetry/opentelemetry-cpp/pull/2407)

sdk/include/opentelemetry/sdk/metrics/export/periodic_exporting_metric_reader_options.h

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,11 @@
33

44
#pragma once
55

6-
#include "opentelemetry/version.h"
7-
86
#include <chrono>
97

8+
#include "opentelemetry/nostd/string_view.h"
9+
#include "opentelemetry/version.h"
10+
1011
OPENTELEMETRY_BEGIN_NAMESPACE
1112
namespace sdk
1213
{
@@ -16,18 +17,22 @@ namespace metrics
1617
constexpr std::chrono::milliseconds kExportIntervalMillis = std::chrono::milliseconds(60000);
1718
constexpr std::chrono::milliseconds kExportTimeOutMillis = std::chrono::milliseconds(30000);
1819

20+
std::chrono::milliseconds GetEnvDuration(nostd::string_view env_var_name,
21+
std::chrono::milliseconds default_value);
22+
1923
/**
2024
* Struct to hold PeriodicExortingMetricReader options.
2125
*/
2226

2327
struct PeriodicExportingMetricReaderOptions
2428
{
2529
/* The time interval between two consecutive exports. */
26-
std::chrono::milliseconds export_interval_millis =
27-
std::chrono::milliseconds(kExportIntervalMillis);
30+
std::chrono::milliseconds export_interval_millis;
2831

2932
/* how long the export can run before it is cancelled. */
30-
std::chrono::milliseconds export_timeout_millis = std::chrono::milliseconds(kExportTimeOutMillis);
33+
std::chrono::milliseconds export_timeout_millis;
34+
35+
PeriodicExportingMetricReaderOptions();
3136
};
3237

3338
} // namespace metrics

sdk/src/metrics/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ add_library(
1515
instrument_metadata_validator.cc
1616
export/periodic_exporting_metric_reader.cc
1717
export/periodic_exporting_metric_reader_factory.cc
18+
export/periodic_exporting_metric_reader_options.cc
1819
state/filtered_ordered_attribute_map.cc
1920
state/metric_collector.cc
2021
state/observable_registry.cc
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
// Copyright The OpenTelemetry Authors
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
#include <chrono>
5+
6+
#include "opentelemetry/nostd/string_view.h"
7+
#include "opentelemetry/sdk/common/env_variables.h"
8+
#include "opentelemetry/sdk/metrics/export/periodic_exporting_metric_reader_options.h"
9+
#include "opentelemetry/version.h"
10+
11+
OPENTELEMETRY_BEGIN_NAMESPACE
12+
namespace sdk
13+
{
14+
namespace metrics
15+
{
16+
17+
std::chrono::milliseconds GetEnvDuration(nostd::string_view env_var_name,
18+
std::chrono::milliseconds default_value)
19+
{
20+
std::chrono::system_clock::duration duration;
21+
if (common::GetDurationEnvironmentVariable(env_var_name.data(), duration))
22+
{
23+
return std::chrono::duration_cast<std::chrono::milliseconds>(duration);
24+
}
25+
return default_value;
26+
}
27+
PeriodicExportingMetricReaderOptions::PeriodicExportingMetricReaderOptions()
28+
: export_interval_millis(GetEnvDuration("OTEL_METRIC_EXPORT_INTERVAL", kExportIntervalMillis)),
29+
export_timeout_millis(GetEnvDuration("OTEL_METRIC_EXPORT_TIMEOUT", kExportTimeOutMillis))
30+
{}
31+
} // namespace metrics
32+
} // namespace sdk
33+
OPENTELEMETRY_END_NAMESPACE

sdk/test/metrics/periodic_exporting_metric_reader_test.cc

Lines changed: 71 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
#include <stddef.h>
66
#include <chrono>
77
#include <memory>
8-
#include <ratio>
98
#include <thread>
109
#include <utility>
1110
#include <vector>
@@ -18,6 +17,11 @@
1817
#include "opentelemetry/sdk/metrics/instruments.h"
1918
#include "opentelemetry/sdk/metrics/push_metric_exporter.h"
2019

20+
#if defined(_MSC_VER)
21+
using opentelemetry::common::setenv;
22+
using opentelemetry::common::unsetenv;
23+
#endif
24+
2125
using namespace opentelemetry;
2226
using namespace opentelemetry::sdk::instrumentationscope;
2327
using namespace opentelemetry::sdk::metrics;
@@ -76,7 +80,7 @@ class MockMetricProducer : public MetricProducer
7680
size_t data_sent_size_{0};
7781
};
7882

79-
TEST(PeriodicExporingMetricReader, BasicTests)
83+
TEST(PeriodicExportingMetricReader, BasicTests)
8084
{
8185
std::unique_ptr<PushMetricExporter> exporter(
8286
new MockPushMetricExporter(std::chrono::milliseconds{0}));
@@ -95,7 +99,7 @@ TEST(PeriodicExporingMetricReader, BasicTests)
9599
static_cast<MockMetricProducer *>(&producer)->GetDataCount());
96100
}
97101

98-
TEST(PeriodicExporingMetricReader, Timeout)
102+
TEST(PeriodicExportingMetricReader, Timeout)
99103
{
100104
std::unique_ptr<PushMetricExporter> exporter(
101105
new MockPushMetricExporter(std::chrono::milliseconds{2000}));
@@ -109,3 +113,67 @@ TEST(PeriodicExporingMetricReader, Timeout)
109113
std::this_thread::sleep_for(std::chrono::milliseconds(1000));
110114
reader->Shutdown();
111115
}
116+
117+
TEST(GetEnvDurationTest, Absent)
118+
{
119+
const char *env = "OTEL_TEST";
120+
unsetenv(env);
121+
EXPECT_EQ(GetEnvDuration(env, std::chrono::milliseconds(42)), std::chrono::milliseconds(42));
122+
}
123+
124+
TEST(GetEnvDurationTest, NotSet)
125+
{
126+
const char *env = "OTEL_TEST";
127+
setenv(env, "", 1);
128+
EXPECT_EQ(GetEnvDuration(env, std::chrono::milliseconds(42)), std::chrono::milliseconds(42));
129+
unsetenv(env);
130+
}
131+
132+
TEST(GetEnvDurationTest, Valid)
133+
{
134+
const char *env = "OTEL_TEST";
135+
setenv(env, "1243ms", 1);
136+
EXPECT_EQ(GetEnvDuration(env, std::chrono::milliseconds(42)), std::chrono::milliseconds(1243));
137+
138+
setenv(env, "3s", 1);
139+
EXPECT_EQ(GetEnvDuration(env, std::chrono::milliseconds(42)), std::chrono::milliseconds(3000));
140+
141+
unsetenv(env);
142+
}
143+
144+
TEST(GetEnvDurationTest, Invalid)
145+
{
146+
const char *env = "OTEL_TEST";
147+
setenv(env, "not_a_duration", 1);
148+
EXPECT_EQ(GetEnvDuration(env, std::chrono::milliseconds(42)), std::chrono::milliseconds(42));
149+
unsetenv(env);
150+
}
151+
152+
TEST(PeriodicExportingMetricReaderOptions, UsesEnvVars)
153+
{
154+
const char *env_interval = "OTEL_METRIC_EXPORT_INTERVAL";
155+
const char *env_timeout = "OTEL_METRIC_EXPORT_TIMEOUT";
156+
157+
setenv(env_interval, "1500ms", 1);
158+
setenv(env_timeout, "1000ms", 1);
159+
160+
PeriodicExportingMetricReaderOptions options;
161+
EXPECT_EQ(options.export_interval_millis, std::chrono::milliseconds(1500));
162+
EXPECT_EQ(options.export_timeout_millis, std::chrono::milliseconds(1000));
163+
164+
unsetenv(env_interval);
165+
unsetenv(env_timeout);
166+
}
167+
168+
TEST(PeriodicExportingMetricReaderOptions, UsesDefault)
169+
{
170+
const char *env_interval = "OTEL_METRIC_EXPORT_INTERVAL";
171+
const char *env_timeout = "OTEL_METRIC_EXPORT_TIMEOUT";
172+
173+
unsetenv(env_interval);
174+
unsetenv(env_timeout);
175+
176+
PeriodicExportingMetricReaderOptions options;
177+
EXPECT_EQ(options.export_interval_millis, std::chrono::milliseconds(60000));
178+
EXPECT_EQ(options.export_timeout_millis, std::chrono::milliseconds(30000));
179+
}

0 commit comments

Comments
 (0)