Skip to content

Commit

Permalink
impl(pubsub): add MaxOtelLinkCountOption (#13024)
Browse files Browse the repository at this point in the history
  • Loading branch information
alevenberg authored Nov 3, 2023
1 parent ce762e1 commit 4110eeb
Show file tree
Hide file tree
Showing 3 changed files with 59 additions and 2 deletions.
8 changes: 8 additions & 0 deletions google/cloud/pubsub/internal/defaults.cc
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
#include "google/cloud/internal/populate_grpc_options.h"
#include "google/cloud/internal/user_agent_prefix.h"
#include "google/cloud/options.h"
#include "absl/strings/numbers.h"
#include <chrono>
#include <limits>
#include <thread>
Expand Down Expand Up @@ -105,6 +106,13 @@ Options DefaultPublisherOptionsOnly(Options opts) {
if (!opts.has<pubsub::CompressionAlgorithmOption>()) {
opts.set<pubsub::CompressionAlgorithmOption>(GRPC_COMPRESS_DEFLATE);
}
auto e = internal::GetEnv("OTEL_SPAN_LINK_COUNT_LIMIT");
size_t link_count;
if (e && absl::SimpleAtoi(e.value(), &link_count)) {
opts.set<pubsub::MaxOtelLinkCountOption>(link_count);
} else if (!opts.has<pubsub::MaxOtelLinkCountOption>()) {
opts.set<pubsub::MaxOtelLinkCountOption>(128);
}

return opts;
}
Expand Down
25 changes: 24 additions & 1 deletion google/cloud/pubsub/internal/defaults_test.cc
Original file line number Diff line number Diff line change
Expand Up @@ -121,6 +121,26 @@ TEST(OptionsTest, UserSetCommonOptions) {
EXPECT_THAT(*s, HasSubstr("test-prefix"));
}

TEST(OptionsTest, SetOtelLinkLimitEnvOverrides) {
ScopedEnvironment env("OTEL_SPAN_LINK_COUNT_LIMIT", "5");
auto opts =
DefaultPublisherOptions(Options{}.set<pubsub::MaxOtelLinkCountOption>(1));
EXPECT_EQ(5U, opts.get<pubsub::MaxOtelLinkCountOption>());
}

TEST(OptionsTest, UnsetOtelLinkLimitEnv) {
ScopedEnvironment env("OTEL_SPAN_LINK_COUNT_LIMIT", absl::nullopt);
auto opts =
DefaultPublisherOptions(Options{}.set<pubsub::MaxOtelLinkCountOption>(1));
EXPECT_EQ(1U, opts.get<pubsub::MaxOtelLinkCountOption>());
}

TEST(OptionsTest, UnsetOtelLinkLimitEnvNoUserOption) {
ScopedEnvironment env("OTEL_SPAN_LINK_COUNT_LIMIT", absl::nullopt);
auto opts = DefaultPublisherOptions(Options{});
EXPECT_EQ(128U, opts.get<pubsub::MaxOtelLinkCountOption>());
}

TEST(OptionsTest, PublisherDefaults) {
auto opts = DefaultPublisherOptions(Options{});
EXPECT_EQ(ms(10), opts.get<pubsub::MaxHoldTimeOption>());
Expand All @@ -136,6 +156,7 @@ TEST(OptionsTest, PublisherDefaults) {
EXPECT_EQ(GRPC_COMPRESS_DEFLATE,
opts.get<pubsub::CompressionAlgorithmOption>());
EXPECT_FALSE(opts.has<pubsub::CompressionThresholdOption>());
EXPECT_EQ(128, opts.get<pubsub::MaxOtelLinkCountOption>());
}

TEST(OptionsTest, UserSetPublisherOptions) {
Expand All @@ -148,7 +169,8 @@ TEST(OptionsTest, UserSetPublisherOptions) {
.set<pubsub::MaxPendingMessagesOption>(4)
.set<pubsub::MessageOrderingOption>(true)
.set<pubsub::FullPublisherActionOption>(
pubsub::FullPublisherAction::kIgnored));
pubsub::FullPublisherAction::kIgnored)
.set<pubsub::MaxOtelLinkCountOption>(1));

EXPECT_EQ(ms(100), opts.get<pubsub::MaxHoldTimeOption>());
EXPECT_EQ(1U, opts.get<pubsub::MaxBatchMessagesOption>());
Expand All @@ -158,6 +180,7 @@ TEST(OptionsTest, UserSetPublisherOptions) {
EXPECT_TRUE(opts.get<pubsub::MessageOrderingOption>());
EXPECT_EQ(pubsub::FullPublisherAction::kIgnored,
opts.get<pubsub::FullPublisherActionOption>());
EXPECT_EQ(1U, opts.get<pubsub::MaxOtelLinkCountOption>());
}

TEST(OptionsTest, SubscriberDefaults) {
Expand Down
28 changes: 27 additions & 1 deletion google/cloud/pubsub/options.h
Original file line number Diff line number Diff line change
Expand Up @@ -220,12 +220,38 @@ struct CompressionAlgorithmOption {
using Type = int;
};

/**
* The maximum number of Open Telemetry span links.
*
* This option controls the number of links contained in a single publish span.
*
* @note Application developers should keep in mind that Cloud Trace
* sets [limits][cloud-trace-quota-link] on the number of links per span
* (128). Additionally, Open Telemetry sets the default
* [limit][otel-quota-link] to 128.
*
* @ingroup pubsub-options
*
* @par Environment variable
* This option is controlled by the `OTEL_SPAN_LINK_COUNT_LIMIT`
* environment variable. If the environment variable is unset or unparsable,
* it uses the user provided value, and then the default of 128.
*
* [otel-quota-link]:
* https://opentelemetry.io/docs/specs/otel/configuration/sdk-environment-variables/#span-limits
* [cloud-trace-quota-link]:
* https://github.com/googleapis/googleapis/blob/52180f8ba240022dd8ce756ee69fe5a3c429ad4d/google/devtools/cloudtrace/v2/trace.proto#L266
*/
struct MaxOtelLinkCountOption {
using Type = std::size_t;
};

/// The list of options specific to publishers.
using PublisherOptionList =
OptionList<MaxHoldTimeOption, MaxBatchMessagesOption, MaxBatchBytesOption,
MaxPendingMessagesOption, MaxPendingBytesOption,
MessageOrderingOption, FullPublisherActionOption,
CompressionThresholdOption>;
CompressionThresholdOption, MaxOtelLinkCountOption>;

/**
* The maximum deadline for each incoming message.
Expand Down

0 comments on commit 4110eeb

Please sign in to comment.