Skip to content

Commit bffa91b

Browse files
[TRACE SDK] Batch span processor options now using env variables (open-telemetry#3661)
1 parent ecb155b commit bffa91b

File tree

4 files changed

+163
-4
lines changed

4 files changed

+163
-4
lines changed

sdk/include/opentelemetry/sdk/trace/batch_span_processor_options.h

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,22 +17,30 @@ namespace trace
1717
/**
1818
* Struct to hold batch SpanProcessor options.
1919
*/
20-
struct BatchSpanProcessorOptions
20+
struct OPENTELEMETRY_EXPORT BatchSpanProcessorOptions
2121
{
22+
BatchSpanProcessorOptions();
2223
/**
2324
* The maximum buffer/queue size. After the size is reached, spans are
2425
* dropped.
2526
*/
26-
size_t max_queue_size = 2048;
27+
size_t max_queue_size;
2728

2829
/* The time interval between two consecutive exports. */
29-
std::chrono::milliseconds schedule_delay_millis = std::chrono::milliseconds(5000);
30+
std::chrono::milliseconds schedule_delay_millis;
31+
32+
/**
33+
* The maximum time allowed to to export data
34+
* It is not currently used by the SDK and the parameter is ignored
35+
* TODO: Implement the parameter in BatchSpanProcessor
36+
*/
37+
std::chrono::milliseconds export_timeout;
3038

3139
/**
3240
* The maximum batch size of every export. It must be smaller or
3341
* equal to max_queue_size.
3442
*/
35-
size_t max_export_batch_size = 512;
43+
size_t max_export_batch_size;
3644
};
3745

3846
} // namespace trace

sdk/src/trace/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ add_library(
1313
provider.cc
1414
batch_span_processor.cc
1515
batch_span_processor_factory.cc
16+
batch_span_processor_options.cc
1617
simple_processor_factory.cc
1718
samplers/always_on_factory.cc
1819
samplers/always_off_factory.cc
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
// Copyright The OpenTelemetry Authors
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
#include <stddef.h>
5+
#include <chrono>
6+
#include <cstdint>
7+
8+
#include "opentelemetry/sdk/common/env_variables.h"
9+
#include "opentelemetry/sdk/trace/batch_span_processor_options.h"
10+
#include "opentelemetry/version.h"
11+
12+
OPENTELEMETRY_BEGIN_NAMESPACE
13+
namespace sdk
14+
{
15+
namespace trace
16+
{
17+
18+
constexpr const char *kMaxQueueSizeEnv = "OTEL_BSP_MAX_QUEUE_SIZE";
19+
constexpr const char *kScheduleDelayEnv = "OTEL_BSP_SCHEDULE_DELAY";
20+
constexpr const char *kExportTimeoutEnv = "OTEL_BSP_EXPORT_TIMEOUT";
21+
constexpr const char *kMaxExportBatchSizeEnv = "OTEL_BSP_MAX_EXPORT_BATCH_SIZE";
22+
23+
const size_t kDefaultMaxQueueSize = 2084;
24+
const std::chrono::milliseconds kDefaultScheduleDelayMillis = std::chrono::milliseconds(5000);
25+
const std::chrono::milliseconds kDefaultExportTimeout = std::chrono::milliseconds(3000);
26+
const size_t kDefaultMaxExportBatchSize = 512;
27+
28+
inline size_t GetMaxQueueSizeFromEnv()
29+
{
30+
std::uint32_t value;
31+
if (!opentelemetry::sdk::common::GetUintEnvironmentVariable(kMaxQueueSizeEnv, value))
32+
{
33+
return kDefaultMaxQueueSize;
34+
}
35+
return static_cast<size_t>(value);
36+
}
37+
38+
inline std::chrono::milliseconds GetDurationFromEnv(
39+
const char *env_var,
40+
const std::chrono::milliseconds &default_duration)
41+
{
42+
std::chrono::system_clock::duration duration{0};
43+
if (!opentelemetry::sdk::common::GetDurationEnvironmentVariable(env_var, duration))
44+
{
45+
return default_duration;
46+
}
47+
return std::chrono::duration_cast<std::chrono::milliseconds>(duration);
48+
}
49+
50+
inline size_t GetMaxExportBatchSizeFromEnv()
51+
{
52+
std::uint32_t value;
53+
if (!opentelemetry::sdk::common::GetUintEnvironmentVariable(kMaxExportBatchSizeEnv, value))
54+
{
55+
return kDefaultMaxExportBatchSize;
56+
}
57+
return static_cast<size_t>(value);
58+
}
59+
60+
BatchSpanProcessorOptions::BatchSpanProcessorOptions()
61+
: max_queue_size(GetMaxQueueSizeFromEnv()),
62+
schedule_delay_millis(GetDurationFromEnv(kScheduleDelayEnv, kDefaultScheduleDelayMillis)),
63+
export_timeout(GetDurationFromEnv(kExportTimeoutEnv, kDefaultExportTimeout)),
64+
max_export_batch_size(GetMaxExportBatchSizeFromEnv())
65+
{}
66+
67+
} // namespace trace
68+
} // namespace sdk
69+
OPENTELEMETRY_END_NAMESPACE

sdk/test/trace/batch_span_processor_test.cc

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
// SPDX-License-Identifier: Apache-2.0
33

44
#include <gtest/gtest.h>
5+
#include <stdlib.h>
56
#include <algorithm>
67
#include <atomic>
78
#include <chrono>
@@ -25,6 +26,12 @@
2526
#include "opentelemetry/sdk/trace/span_data.h"
2627
#include "opentelemetry/version.h"
2728

29+
#if defined(_MSC_VER)
30+
# include "opentelemetry/sdk/common/env_variables.h"
31+
using opentelemetry::sdk::common::setenv;
32+
using opentelemetry::sdk::common::unsetenv;
33+
#endif
34+
2835
OPENTELEMETRY_BEGIN_NAMESPACE
2936

3037
/**
@@ -364,4 +371,78 @@ TEST_F(BatchSpanProcessorTestPeer, TestScheduleDelayMillis)
364371
}
365372
}
366373

374+
TEST(BatchSpanProcessorOptionsEnvTest, TestDefaultValues)
375+
{
376+
sdk::trace::BatchSpanProcessorOptions options;
377+
378+
EXPECT_EQ(options.max_queue_size, static_cast<size_t>(2084));
379+
EXPECT_EQ(options.schedule_delay_millis, std::chrono::milliseconds(5000));
380+
EXPECT_EQ(options.export_timeout, std::chrono::milliseconds(3000));
381+
EXPECT_EQ(options.max_export_batch_size, static_cast<size_t>(512));
382+
}
383+
384+
TEST(BatchSpanProcessorOptionsEnvTest, TestMaxQueueSizeFromEnv)
385+
{
386+
setenv("OTEL_BSP_MAX_QUEUE_SIZE", "1234", 1);
387+
388+
sdk::trace::BatchSpanProcessorOptions options;
389+
390+
EXPECT_EQ(options.max_queue_size, static_cast<size_t>(1234));
391+
392+
unsetenv("OTEL_BSP_MAX_QUEUE_SIZE");
393+
}
394+
395+
TEST(BatchSpanProcessorOptionsEnvTest, TestScheduleDelayFromEnv)
396+
{
397+
setenv("OTEL_BSP_SCHEDULE_DELAY", "7s", 1);
398+
399+
sdk::trace::BatchSpanProcessorOptions options;
400+
401+
EXPECT_EQ(options.schedule_delay_millis, std::chrono::milliseconds(7000));
402+
403+
unsetenv("OTEL_BSP_SCHEDULE_DELAY");
404+
}
405+
406+
TEST(BatchSpanProcessorOptionsEnvTest, TestExportTimeoutFromEnv)
407+
{
408+
setenv("OTEL_BSP_EXPORT_TIMEOUT", "250ms", 1);
409+
410+
sdk::trace::BatchSpanProcessorOptions options;
411+
412+
EXPECT_EQ(options.export_timeout, std::chrono::milliseconds(250));
413+
414+
unsetenv("OTEL_BSP_EXPORT_TIMEOUT");
415+
}
416+
417+
TEST(BatchSpanProcessorOptionsEnvTest, TestMaxExportBatchSizeFromEnv)
418+
{
419+
setenv("OTEL_BSP_MAX_EXPORT_BATCH_SIZE", "42", 1);
420+
421+
sdk::trace::BatchSpanProcessorOptions options;
422+
423+
EXPECT_EQ(options.max_export_batch_size, static_cast<size_t>(42));
424+
425+
unsetenv("OTEL_BSP_MAX_EXPORT_BATCH_SIZE");
426+
}
427+
428+
TEST(BatchSpanProcessorOptionsEnvTest, TestOptionsReadFromMultipleEnvVars)
429+
{
430+
setenv("OTEL_BSP_MAX_QUEUE_SIZE", "3000", 1);
431+
setenv("OTEL_BSP_SCHEDULE_DELAY", "2s", 1);
432+
setenv("OTEL_BSP_EXPORT_TIMEOUT", "1s", 1);
433+
setenv("OTEL_BSP_MAX_EXPORT_BATCH_SIZE", "256", 1);
434+
435+
sdk::trace::BatchSpanProcessorOptions options;
436+
437+
EXPECT_EQ(options.max_queue_size, static_cast<size_t>(3000));
438+
EXPECT_EQ(options.schedule_delay_millis, std::chrono::milliseconds(2000));
439+
EXPECT_EQ(options.export_timeout, std::chrono::milliseconds(1000));
440+
EXPECT_EQ(options.max_export_batch_size, static_cast<size_t>(256));
441+
442+
unsetenv("OTEL_BSP_MAX_QUEUE_SIZE");
443+
unsetenv("OTEL_BSP_SCHEDULE_DELAY");
444+
unsetenv("OTEL_BSP_EXPORT_TIMEOUT");
445+
unsetenv("OTEL_BSP_MAX_EXPORT_BATCH_SIZE");
446+
}
447+
367448
OPENTELEMETRY_END_NAMESPACE

0 commit comments

Comments
 (0)