From 567467203e4ca4f1ffa730cb942ba559f583ebc0 Mon Sep 17 00:00:00 2001 From: Pengyuan Bian Date: Fri, 27 Apr 2018 23:48:54 -0700 Subject: [PATCH] Create a child span for mixer check call. --- src/envoy/http/mixer/control.cc | 6 ++++-- src/envoy/http/mixer/control.h | 2 ++ src/envoy/utils/grpc_transport.cc | 24 +++++++++++++++--------- src/envoy/utils/grpc_transport.h | 3 +++ src/envoy/utils/mixer_control.cc | 6 ++++-- 5 files changed, 28 insertions(+), 13 deletions(-) diff --git a/src/envoy/http/mixer/control.cc b/src/envoy/http/mixer/control.cc index fb8fd8bedb2..718dc3cf268 100644 --- a/src/envoy/http/mixer/control.cc +++ b/src/envoy/http/mixer/control.cc @@ -32,7 +32,8 @@ Control::Control(const Config& config, Upstream::ClusterManager& cm, config_.config_pb().transport().stats_update_interval(), [this](::istio::mixerclient::Statistics* stat) -> bool { return GetStats(stat); - }) { + }), + random_(random) { ::istio::control::http::Controller::Options options(config_.config_pb()); Utils::CreateEnvironment(dispatcher, random, *check_client_factory_, @@ -43,7 +44,8 @@ Control::Control(const Config& config, Upstream::ClusterManager& cm, Utils::CheckTransport::Func Control::GetCheckTransport( const HeaderMap* headers) { - return Utils::CheckTransport::GetFunc(*check_client_factory_, headers); + return Utils::CheckTransport::GetFunc(*check_client_factory_, random_, + headers); } // Call controller to get statistics. diff --git a/src/envoy/http/mixer/control.h b/src/envoy/http/mixer/control.h index aacf783c512..d70962b45ff 100644 --- a/src/envoy/http/mixer/control.h +++ b/src/envoy/http/mixer/control.h @@ -56,6 +56,8 @@ class Control final : public ThreadLocal::ThreadLocalObject { Grpc::AsyncClientFactoryPtr report_client_factory_; // The stats object. Utils::MixerStatsObject stats_obj_; + // Random number generator for remote check span id. + Runtime::RandomGenerator& random_; }; } // namespace Mixer diff --git a/src/envoy/utils/grpc_transport.cc b/src/envoy/utils/grpc_transport.cc index fe7923a2a48..abdb9c0f9cb 100644 --- a/src/envoy/utils/grpc_transport.cc +++ b/src/envoy/utils/grpc_transport.cc @@ -50,10 +50,11 @@ template GrpcTransport::GrpcTransport( Grpc::AsyncClientPtr async_client, const RequestType &request, const Http::HeaderMap *headers, ResponseType *response, - istio::mixerclient::DoneFunc on_done) + Runtime::RandomGenerator &random, istio::mixerclient::DoneFunc on_done) : async_client_(std::move(async_client)), headers_(headers), response_(response), + random_(random), on_done_(on_done), request_(async_client_->send( descriptor(), request, *this, Tracing::NullSpan::instance(), @@ -69,10 +70,11 @@ void GrpcTransport::onCreateInitialMetadata( CopyHeaderEntry(headers_->RequestId(), kRequestId, metadata); CopyHeaderEntry(headers_->XB3TraceId(), kB3TraceId, metadata); - CopyHeaderEntry(headers_->XB3SpanId(), kB3SpanId, metadata); - CopyHeaderEntry(headers_->XB3ParentSpanId(), kB3ParentSpanId, metadata); CopyHeaderEntry(headers_->XB3Sampled(), kB3Sampled, metadata); CopyHeaderEntry(headers_->XB3Flags(), kB3Flags, metadata); + // Create a child span for mixer call. + CopyHeaderEntry(headers_->XB3SpanId(), kB3ParentSpanId, metadata); + metadata.addReferenceKey(kB3SpanId, Hex::uint64ToHex(random_.random())); // This one is NOT inline, need to do linar search. CopyHeaderEntry(headers_->get(kOtSpanContext), kOtSpanContext, metadata); @@ -107,12 +109,14 @@ void GrpcTransport::Cancel() { template typename GrpcTransport::Func GrpcTransport::GetFunc( - Grpc::AsyncClientFactory &factory, const Http::HeaderMap *headers) { - return [&factory, headers](const RequestType &request, ResponseType *response, - istio::mixerclient::DoneFunc on_done) + Grpc::AsyncClientFactory &factory, Runtime::RandomGenerator &random, + const Http::HeaderMap *headers) { + return [&factory, &random, headers](const RequestType &request, + ResponseType *response, + istio::mixerclient::DoneFunc on_done) -> istio::mixerclient::CancelFunc { auto transport = new GrpcTransport( - factory.create(), request, headers, response, on_done); + factory.create(), request, headers, response, random, on_done); return [transport]() { transport->Cancel(); }; }; } @@ -137,9 +141,11 @@ const google::protobuf::MethodDescriptor &ReportTransport::descriptor() { // explicitly instantiate CheckTransport and ReportTransport template CheckTransport::Func CheckTransport::GetFunc( - Grpc::AsyncClientFactory &factory, const Http::HeaderMap *headers); + Grpc::AsyncClientFactory &factory, Runtime::RandomGenerator &random, + const Http::HeaderMap *headers); template ReportTransport::Func ReportTransport::GetFunc( - Grpc::AsyncClientFactory &factory, const Http::HeaderMap *headers); + Grpc::AsyncClientFactory &factory, Runtime::RandomGenerator &random, + const Http::HeaderMap *headers); } // namespace Utils } // namespace Envoy diff --git a/src/envoy/utils/grpc_transport.h b/src/envoy/utils/grpc_transport.h index 2cb60834bec..adf4f48dd13 100644 --- a/src/envoy/utils/grpc_transport.h +++ b/src/envoy/utils/grpc_transport.h @@ -39,10 +39,12 @@ class GrpcTransport : public Grpc::TypedAsyncRequestCallbacks, istio::mixerclient::DoneFunc on_done)>; static Func GetFunc(Grpc::AsyncClientFactory& factory, + Runtime::RandomGenerator& random, const Http::HeaderMap* headers = nullptr); GrpcTransport(Grpc::AsyncClientPtr async_client, const RequestType& request, const Http::HeaderMap* headers, ResponseType* response, + Runtime::RandomGenerator& random, istio::mixerclient::DoneFunc on_done); // Grpc::AsyncRequestCallbacks @@ -62,6 +64,7 @@ class GrpcTransport : public Grpc::TypedAsyncRequestCallbacks, Grpc::AsyncClientPtr async_client_; const Http::HeaderMap* headers_; ResponseType* response_; + Runtime::RandomGenerator& random_; ::istio::mixerclient::DoneFunc on_done_; Grpc::AsyncRequest* request_{}; }; diff --git a/src/envoy/utils/mixer_control.cc b/src/envoy/utils/mixer_control.cc index 01ccaac74b5..aff9c9819b5 100644 --- a/src/envoy/utils/mixer_control.cc +++ b/src/envoy/utils/mixer_control.cc @@ -61,8 +61,10 @@ void CreateEnvironment(Event::Dispatcher &dispatcher, Grpc::AsyncClientFactory &check_client_factory, Grpc::AsyncClientFactory &report_client_factory, ::istio::mixerclient::Environment *env) { - env->check_transport = CheckTransport::GetFunc(check_client_factory, nullptr); - env->report_transport = ReportTransport::GetFunc(report_client_factory); + env->check_transport = + CheckTransport::GetFunc(check_client_factory, random, nullptr); + env->report_transport = + ReportTransport::GetFunc(report_client_factory, random); env->timer_create_func = [&dispatcher](std::function timer_cb) -> std::unique_ptr<::istio::mixerclient::Timer> {