@@ -239,18 +239,13 @@ void ConvertSpans(
239239
240240class Handler : public ::opencensus::trace::exporter::SpanExporter::Handler {
241241 public:
242- Handler (const StackdriverOptions& opts,
243- const std::shared_ptr<grpc::Channel>& channel)
244- : opts_(opts),
245- stub_ (::google::devtools::cloudtrace::v2::TraceService::NewStub(
246- channel)) {}
242+ Handler (StackdriverOptions&& opts) : opts_(std::move(opts)) {}
247243
248244 void Export (const std::vector<::opencensus::trace::exporter::SpanData>& spans)
249245 override ;
250246
251247 private:
252248 const StackdriverOptions opts_;
253- std::unique_ptr<google::devtools::cloudtrace::v2::TraceService::Stub> stub_;
254249};
255250
256251void Handler::Export (
@@ -261,29 +256,52 @@ void Handler::Export(
261256 ::google::protobuf::Empty response;
262257 grpc::ClientContext context;
263258 context.set_deadline (absl::ToChronoTime (absl::Now () + opts_.rpc_deadline ));
264- grpc::Status status = stub_->BatchWriteSpans (&context, request, &response);
259+ grpc::Status status =
260+ opts_.trace_service_stub ->BatchWriteSpans (&context, request, &response);
265261 if (!status.ok ()) {
266262 std::cerr << " BatchWriteSpans failed: "
267263 << opencensus::common::ToString (status) << " \n " ;
268264 }
269265}
270266
271- } // namespace
272-
273- // static
274- void StackdriverExporter::Register (const StackdriverOptions& opts) {
267+ std::unique_ptr<google::devtools::cloudtrace::v2::TraceService::Stub>
268+ MakeStackdriverStub () {
275269 auto channel = ::grpc::CreateCustomChannel (
276270 kGoogleStackdriverTraceAddress , ::grpc::GoogleDefaultCredentials (),
277271 ::opencensus::common::WithUserAgent ());
272+ return ::google::devtools::cloudtrace::v2::TraceService::NewStub (channel);
273+ }
274+
275+ } // namespace
276+
277+ // static
278+ void StackdriverExporter::Register (StackdriverOptions&& opts) {
279+ if (opts.trace_service_stub == nullptr ) {
280+ opts.trace_service_stub = MakeStackdriverStub ();
281+ }
282+ ::opencensus::trace::exporter::SpanExporter::RegisterHandler (
283+ absl::make_unique<Handler>(std::move(opts)));
284+ }
285+
286+ // static, DEPRECATED
287+ void StackdriverExporter::Register (StackdriverOptions& opts) {
288+ if (opts.trace_service_stub == nullptr ) {
289+ opts.trace_service_stub = MakeStackdriverStub ();
290+ }
291+ // Copy opts but take ownership of trace_service_stub.
292+ StackdriverOptions copied_opts;
293+ copied_opts.project_id = opts.project_id ;
294+ copied_opts.rpc_deadline = opts.rpc_deadline ;
295+ copied_opts.trace_service_stub = std::move (opts.trace_service_stub );
278296 ::opencensus::trace::exporter::SpanExporter::RegisterHandler (
279- absl::make_unique<Handler>(opts, channel ));
297+ absl::make_unique<Handler>(std::move(copied_opts) ));
280298}
281299
282300// static, DEPRECATED
283301void StackdriverExporter::Register (absl::string_view project_id) {
284302 StackdriverOptions opts;
285303 opts.project_id = std::string (project_id);
286- Register (opts);
304+ Register (std::move ( opts) );
287305}
288306
289307} // namespace trace
0 commit comments