|
2 | 2 | // SPDX-License-Identifier: Apache-2.0 |
3 | 3 |
|
4 | 4 | #include <gtest/gtest.h> |
| 5 | +#include <stdlib.h> |
5 | 6 | #include <atomic> |
6 | 7 | #include <cstddef> |
7 | 8 | #include <cstdint> |
|
37 | 38 | #include "opentelemetry/trace/span.h" |
38 | 39 | #include "opentelemetry/trace/tracer.h" |
39 | 40 |
|
| 41 | +#if defined(_MSC_VER) |
| 42 | +# include "opentelemetry/sdk/common/env_variables.h" |
| 43 | +using opentelemetry::sdk::common::setenv; |
| 44 | +using opentelemetry::sdk::common::unsetenv; |
| 45 | +#endif |
| 46 | + |
40 | 47 | #if OPENTELEMETRY_ABI_VERSION_NO >= 2 |
41 | 48 | # include <initializer_list> |
42 | 49 | # include <map> |
@@ -569,6 +576,102 @@ TEST(TracerProvider, SpanLimitsTracerProviderFactoryCreate) |
569 | 576 | EXPECT_EQ(stored.link_attribute_count_limit, limits.link_attribute_count_limit); |
570 | 577 | } |
571 | 578 |
|
| 579 | +namespace |
| 580 | +{ |
| 581 | + |
| 582 | +void UnsetSpanLimitsEnv() |
| 583 | +{ |
| 584 | + unsetenv("OTEL_ATTRIBUTE_VALUE_LENGTH_LIMIT"); |
| 585 | + unsetenv("OTEL_ATTRIBUTE_COUNT_LIMIT"); |
| 586 | + unsetenv("OTEL_SPAN_ATTRIBUTE_VALUE_LENGTH_LIMIT"); |
| 587 | + unsetenv("OTEL_SPAN_ATTRIBUTE_COUNT_LIMIT"); |
| 588 | + unsetenv("OTEL_SPAN_EVENT_COUNT_LIMIT"); |
| 589 | + unsetenv("OTEL_SPAN_LINK_COUNT_LIMIT"); |
| 590 | + unsetenv("OTEL_EVENT_ATTRIBUTE_COUNT_LIMIT"); |
| 591 | + unsetenv("OTEL_LINK_ATTRIBUTE_COUNT_LIMIT"); |
| 592 | +} |
| 593 | + |
| 594 | +} // namespace |
| 595 | + |
| 596 | +TEST(TracerProvider, SpanLimitsFromEnvUnsetIsNoLimits) |
| 597 | +{ |
| 598 | + UnsetSpanLimitsEnv(); |
| 599 | + |
| 600 | + const SpanLimits limits = span_limits_env::GetSpanLimitsFromEnv(); |
| 601 | + const SpanLimits no_limits = SpanLimits::NoLimits(); |
| 602 | + EXPECT_EQ(limits.attribute_count_limit, no_limits.attribute_count_limit); |
| 603 | + EXPECT_EQ(limits.attribute_value_length_limit, no_limits.attribute_value_length_limit); |
| 604 | + EXPECT_EQ(limits.event_count_limit, no_limits.event_count_limit); |
| 605 | + EXPECT_EQ(limits.link_count_limit, no_limits.link_count_limit); |
| 606 | + EXPECT_EQ(limits.event_attribute_count_limit, no_limits.event_attribute_count_limit); |
| 607 | + EXPECT_EQ(limits.link_attribute_count_limit, no_limits.link_attribute_count_limit); |
| 608 | +} |
| 609 | + |
| 610 | +TEST(TracerProvider, SpanLimitsFromEnvReadsVariables) |
| 611 | +{ |
| 612 | + UnsetSpanLimitsEnv(); |
| 613 | + setenv("OTEL_SPAN_ATTRIBUTE_VALUE_LENGTH_LIMIT", "100", 1); |
| 614 | + setenv("OTEL_SPAN_ATTRIBUTE_COUNT_LIMIT", "5", 1); |
| 615 | + setenv("OTEL_SPAN_EVENT_COUNT_LIMIT", "3", 1); |
| 616 | + setenv("OTEL_SPAN_LINK_COUNT_LIMIT", "2", 1); |
| 617 | + setenv("OTEL_EVENT_ATTRIBUTE_COUNT_LIMIT", "4", 1); |
| 618 | + setenv("OTEL_LINK_ATTRIBUTE_COUNT_LIMIT", "6", 1); |
| 619 | + |
| 620 | + const SpanLimits limits = span_limits_env::GetSpanLimitsFromEnv(); |
| 621 | + EXPECT_EQ(limits.attribute_value_length_limit, 100u); |
| 622 | + EXPECT_EQ(limits.attribute_count_limit, 5u); |
| 623 | + EXPECT_EQ(limits.event_count_limit, 3u); |
| 624 | + EXPECT_EQ(limits.link_count_limit, 2u); |
| 625 | + EXPECT_EQ(limits.event_attribute_count_limit, 4u); |
| 626 | + EXPECT_EQ(limits.link_attribute_count_limit, 6u); |
| 627 | + |
| 628 | + UnsetSpanLimitsEnv(); |
| 629 | +} |
| 630 | + |
| 631 | +TEST(TracerProvider, SpanLimitsFromEnvGeneralAttributeVariablesApply) |
| 632 | +{ |
| 633 | + UnsetSpanLimitsEnv(); |
| 634 | + setenv("OTEL_ATTRIBUTE_VALUE_LENGTH_LIMIT", "50", 1); |
| 635 | + setenv("OTEL_ATTRIBUTE_COUNT_LIMIT", "10", 1); |
| 636 | + |
| 637 | + const SpanLimits limits = span_limits_env::GetSpanLimitsFromEnv(); |
| 638 | + EXPECT_EQ(limits.attribute_value_length_limit, 50u); |
| 639 | + EXPECT_EQ(limits.attribute_count_limit, 10u); |
| 640 | + EXPECT_EQ(limits.event_count_limit, (std::numeric_limits<std::uint32_t>::max)()); |
| 641 | + |
| 642 | + UnsetSpanLimitsEnv(); |
| 643 | +} |
| 644 | + |
| 645 | +TEST(TracerProvider, SpanLimitsFromEnvSpanSpecificTakesPrecedence) |
| 646 | +{ |
| 647 | + UnsetSpanLimitsEnv(); |
| 648 | + setenv("OTEL_ATTRIBUTE_VALUE_LENGTH_LIMIT", "50", 1); |
| 649 | + setenv("OTEL_ATTRIBUTE_COUNT_LIMIT", "10", 1); |
| 650 | + setenv("OTEL_SPAN_ATTRIBUTE_VALUE_LENGTH_LIMIT", "100", 1); |
| 651 | + setenv("OTEL_SPAN_ATTRIBUTE_COUNT_LIMIT", "20", 1); |
| 652 | + |
| 653 | + const SpanLimits limits = span_limits_env::GetSpanLimitsFromEnv(); |
| 654 | + EXPECT_EQ(limits.attribute_value_length_limit, 100u); |
| 655 | + EXPECT_EQ(limits.attribute_count_limit, 20u); |
| 656 | + |
| 657 | + UnsetSpanLimitsEnv(); |
| 658 | +} |
| 659 | + |
| 660 | +TEST(TracerProvider, SpanLimitsTracerProviderFactoryCreateDefaultReadsEnv) |
| 661 | +{ |
| 662 | + UnsetSpanLimitsEnv(); |
| 663 | + setenv("OTEL_SPAN_EVENT_COUNT_LIMIT", "42", 1); |
| 664 | + |
| 665 | + auto provider = TracerProviderFactory::Create(std::make_unique<SimpleSpanProcessor>(nullptr)); |
| 666 | + |
| 667 | + const auto &limits = provider->GetSpanLimits(); |
| 668 | + EXPECT_EQ(limits.event_count_limit, 42u); |
| 669 | + EXPECT_EQ(limits.attribute_count_limit, (std::numeric_limits<std::uint32_t>::max)()); |
| 670 | + EXPECT_EQ(limits.link_count_limit, (std::numeric_limits<std::uint32_t>::max)()); |
| 671 | + |
| 672 | + UnsetSpanLimitsEnv(); |
| 673 | +} |
| 674 | + |
572 | 675 | TEST(TracerProvider, SpanLimitsTracerProviderFactoryCreateDefault) |
573 | 676 | { |
574 | 677 | auto provider = TracerProviderFactory::Create(std::make_unique<SimpleSpanProcessor>(nullptr)); |
|
0 commit comments