Skip to content

Commit e546a4c

Browse files
committed
latest
1 parent 8656acc commit e546a4c

File tree

4 files changed

+82
-44
lines changed

4 files changed

+82
-44
lines changed

.bazelrc

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -99,13 +99,16 @@ common --incompatible_auto_exec_groups
9999
common --incompatible_config_setting_private_default_visibility
100100
common --incompatible_disable_native_repo_rules
101101
common --incompatible_disable_non_executable_java_binary
102-
common --incompatible_disable_target_provider_fields
102+
# For jetbrains bazel plugin
103+
# common --incompatible_disable_target_provider_fields
103104
common --incompatible_disallow_empty_glob
104105
common --incompatible_disallow_struct_provider_syntax
105106
common --incompatible_strict_action_env
106-
common --incompatible_struct_has_no_methods
107+
# Enabled for the experimental JetBrains bazel plugin
108+
# common --incompatible_struct_has_no_methods
107109
common --incompatible_use_plus_in_repo_names
108110

111+
109112
build --@curl//:use_mbedtls=true
110113
# build --@curl//:http_only=true
111114

exporters/otlp/src/otlp_grpc_forward_proxy.cc

Lines changed: 43 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -20,16 +20,15 @@
2020
#include "opentelemetry/proto/collector/trace/v1/trace_service.pb.h"
2121
#include "opentelemetry/proto/collector/logs/v1/logs_service.pb.h"
2222

23-
2423
OPENTELEMETRY_BEGIN_NAMESPACE
2524
namespace exporter
2625
{
2726
namespace otlp
2827
{
2928

30-
// Send this header along with unique random number, which we'll reject if received back.
31-
// This is to avoid loops due to misconfugration
32-
static std::string kFwProxyIdHeader{ "otelcpp-otlp-grpc-forward-proxy-id" };
29+
// Detect loops, by sending a random identifier for each forward proxy instance.
30+
// All identifiers received are collected, and send as individual http headers.
31+
static std::string kFwProxyRidHeader{ "otel-fw-proxy-rid" };
3332

3433
using namespace opentelemetry;
3534

@@ -89,11 +88,41 @@ struct OtlpGrpcForwardProxy::Impl
8988

9089
std::string fw_proxy_id;
9190

92-
bool LoopDetected( const std::multimap<grpc::string_ref, grpc::string_ref>& client_metadata ) const
91+
static inline char ascii_tolower( const char c ) noexcept
92+
{
93+
const unsigned char letter = c - 'A';
94+
return letter < 26 ? ( c | 0x20 ) : c;
95+
}
96+
97+
static inline bool ascii_strieq( const char *s0, const char *s1 ) noexcept
98+
{
99+
assert(s0);
100+
assert(s1);
101+
for( ;; )
102+
{
103+
const auto c0{ ascii_tolower( *s0 ++ ) };
104+
const auto c1{ ascii_tolower( *s1 ++ ) };
105+
if( c0 != c1 )
106+
return false;
107+
if( c0 == 0 ) // reached end, also c0 == c1
108+
return true;
109+
}
110+
}
111+
112+
bool CheckForLoop( grpc::ClientContext* context, const std::multimap<grpc::string_ref, grpc::string_ref>& client_metadata ) const
93113
{
94-
const auto key{ grpc::string_ref( kFwProxyIdHeader ) };
95-
const auto it{ client_metadata.find(key) };
96-
return it != client_metadata.cend() && it->second.compare( grpc::string_ref( fw_proxy_id ) ) == 0;
114+
assert(context != nullptr);
115+
const auto matching_keys{ client_metadata.equal_range( grpc::string_ref( kFwProxyRidHeader ) ) };
116+
for( auto i = matching_keys.first; i != matching_keys.second; ++i )
117+
if( ascii_strieq( i->second.data(), fw_proxy_id.c_str() ) )
118+
// Loop detected.
119+
return true;
120+
else
121+
// Add what we've got so far
122+
context->AddMetadata(kFwProxyRidHeader, i->second.data() );
123+
// Add ourselves too.
124+
context->AddMetadata(kFwProxyRidHeader, fw_proxy_id);
125+
return false;
97126
}
98127

99128
Impl(const OtlpGrpcClientOptions&);
@@ -192,13 +221,12 @@ grpc::ServerUnaryReactor* OtlpGrpcForwardProxy::Impl::Finish(grpc::CallbackServe
192221
explicit NAME(OtlpGrpcForwardProxy::Impl& impl_): impl(impl_){} \
193222
grpc::ServerUnaryReactor* Export(grpc::CallbackServerContext* cbServerContext, const REQUEST* req, RESPONSE* resp) override { \
194223
auto exportResult{ sdk::common::ExportResult::kFailure }; \
195-
if( impl.LoopDetected(cbServerContext->client_metadata()) ) \
196-
return impl.Finish(cbServerContext, exportResult, grpc::Status(grpc::StatusCode::FAILED_PRECONDITION, "OtlpGrpcForwardProxy detected loop.")); \
197224
if( impl.active ) { \
225+
auto context{ impl.client->MakeClientContext(impl.clientOptions) }; \
226+
if( impl.CheckForLoop(context.get(), cbServerContext->client_metadata()) ) \
227+
return impl.Finish(cbServerContext, exportResult, grpc::Status(grpc::StatusCode::FAILED_PRECONDITION, "OtlpGrpcForwardProxy detected loop.")); \
198228
OTEL_INTERNAL_LOG_DEBUG("[otlp_grpc_forward_proxy] " TEXT " export"); \
199229
auto syncStatus{ grpc::Status(grpc::Status(grpc::StatusCode::DO_NOT_USE, "")) }; \
200-
auto context{ impl.client->MakeClientContext(impl.clientOptions) }; \
201-
context->AddMetadata(kFwProxyIdHeader, impl.fw_proxy_id); \
202230
auto arena{ std::make_unique<google::protobuf::Arena>(impl.arenaOptions) }; \
203231
auto request{ *req }; \
204232
exportResult = impl.client->DelegateAsyncExport( impl.clientOptions, impl.STUB.get(), std::move(context), std::move(arena), std::move(request), \
@@ -221,12 +249,11 @@ grpc::ServerUnaryReactor* OtlpGrpcForwardProxy::Impl::Finish(grpc::CallbackServe
221249
OtlpGrpcForwardProxy::Impl& impl; \
222250
explicit NAME(OtlpGrpcForwardProxy::Impl& impl_): impl(impl_){} \
223251
grpc::Status Export(grpc::ServerContext* serverContext, const REQUEST* req, RESPONSE* resp) override { \
224-
if( impl.LoopDetected(serverContext->client_metadata()) ) \
225-
return grpc::Status(grpc::StatusCode::FAILED_PRECONDITION, "OtlpGrpcForwardProxy detected loop."); \
226252
if( impl.active ) { \
227-
OTEL_INTERNAL_LOG_DEBUG("[otlp_grpc_forward_proxy] " TEXT " export"); \
228253
auto context{ impl.client->MakeClientContext(impl.clientOptions) }; \
229-
context->AddMetadata(kFwProxyIdHeader, impl.fw_proxy_id); \
254+
if( impl.CheckForLoop( context.get(), serverContext->client_metadata()) ) \
255+
return grpc::Status(grpc::StatusCode::FAILED_PRECONDITION, "OtlpGrpcForwardProxy detected loop."); \
256+
OTEL_INTERNAL_LOG_DEBUG("[otlp_grpc_forward_proxy] " TEXT " export"); \
230257
return impl.STUB->Export( context.get(), *req, resp ); \
231258
} \
232259
return grpc::Status(grpc::StatusCode::FAILED_PRECONDITION, "OtlpGrpcForwardProxy is not active."); \

x/.bazelrc

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,3 +2,5 @@ import %workspace%/../.bazelrc
22
build --@otel_sdk//:with_dll=true
33
try-import %workspace%/../../top.bazelrc
44
test --test_output=streamed
5+
6+
common --run_under='"C:/Program Files/Microsoft Visual Studio/2022/Enterprise/Common7/IDE/devenv.exe"'

x/BUILD.bazel

Lines changed: 32 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -13,17 +13,23 @@ cc_test(
1313
)
1414

1515
cc_binary(
16-
name = "p",
17-
srcs = ["p.cpp"],
18-
deps = ["@otel_sdk//:dll"]
16+
name = "xx",
17+
srcs = ["x.cpp"],
18+
deps = ["@otel_sdk//:dll"],
1919
)
2020

21-
copy_directory(
22-
name = "dashboards_dir",
23-
src = "dashboards",
24-
out = "dashboards",
25-
hardlink = "on",
26-
)
21+
# cc_binary(
22+
# name = "p",
23+
# srcs = ["p.cpp"],
24+
# deps = ["@otel_sdk//:dll"]
25+
# )
26+
#
27+
# copy_directory(
28+
# name = "dashboards_dir",
29+
# src = "dashboards",
30+
# out = "dashboards",
31+
# hardlink = "on",
32+
# )
2733

2834
# native_binary(
2935
# name = "percli_binary",
@@ -53,20 +59,20 @@ copy_directory(
5359
# tool = "@otel_sdk//:percli",
5460
# )
5561

56-
cc_binary(
57-
name = "proxy",
58-
srcs = ["proxy.cpp"],
59-
deps = [
60-
"@otel_sdk//:dll",
61-
"@grpc//:grpc++",
62-
"@grpc//:grpc++_reflection",
63-
"@opentelemetry-proto//:logs_service_grpc_cc",
64-
"@opentelemetry-proto//:metrics_service_grpc_cc",
65-
"@opentelemetry-proto//:trace_service_grpc_cc",
66-
],
67-
)
68-
69-
cc_binary(
70-
name = "z",
71-
srcs = ["z.cpp"],
72-
)
62+
# cc_binary(
63+
# name = "proxy",
64+
# srcs = ["proxy.cpp"],
65+
# deps = [
66+
# "@otel_sdk//:dll",
67+
# "@grpc//:grpc++",
68+
# "@grpc//:grpc++_reflection",
69+
# "@opentelemetry-proto//:logs_service_grpc_cc",
70+
# "@opentelemetry-proto//:metrics_service_grpc_cc",
71+
# "@opentelemetry-proto//:trace_service_grpc_cc",
72+
# ],
73+
# )
74+
#
75+
# cc_binary(
76+
# name = "z",
77+
# srcs = ["z.cpp"],
78+
# )

0 commit comments

Comments
 (0)