From 39cd2245145a253bb3b9c38e83e9c2daee88a664 Mon Sep 17 00:00:00 2001 From: Keshav Manghat Date: Fri, 31 Jul 2020 21:58:18 +0000 Subject: [PATCH 1/7] WIP --- examples/zpages/zpages_example.cc | 2 +- ext/include/opentelemetry/ext/zpages/zpages.h | 11 ++++++++++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/examples/zpages/zpages_example.cc b/examples/zpages/zpages_example.cc index 948b063f96..6d7715f81b 100644 --- a/examples/zpages/zpages_example.cc +++ b/examples/zpages/zpages_example.cc @@ -17,7 +17,7 @@ int main(int argc, char* argv[]) { * Note that the webserver is destroyed after the application ends execution. */ zPages(); - + std::cout << "In main\n"; auto tracer = opentelemetry::trace::Provider::GetTracerProvider()->GetTracer(""); // Create a span of each type(running, completed and error) diff --git a/ext/include/opentelemetry/ext/zpages/zpages.h b/ext/include/opentelemetry/ext/zpages/zpages.h index aae1e818cb..d77829e06a 100644 --- a/ext/include/opentelemetry/ext/zpages/zpages.h +++ b/ext/include/opentelemetry/ext/zpages/zpages.h @@ -1,6 +1,7 @@ #pragma once #include +#include #include "opentelemetry/ext/zpages/tracez_data_aggregator.h" #include "opentelemetry/ext/zpages/tracez_processor.h" @@ -20,7 +21,8 @@ class zPages { : tracez_processor_(std::make_shared()), tracez_provider_(opentelemetry::nostd::shared_ptr( new opentelemetry::sdk::trace::TracerProvider(tracez_processor_))) { - + + std::cout << "Constructor\n"; // Set the global trace provider for a user to use, which is connected to our span processor opentelemetry::trace::Provider::SetTracerProvider(tracez_provider_); @@ -30,8 +32,15 @@ class zPages { // Ensure zPages has time to setup, so the program doesn't crash std::this_thread::sleep_for(setup_time_); } + + static void StartServer(){ + tracez_processor_ = std::make_shared(); + tracez_provider_ = opentelemetry::nostd::shared_ptr( + new opentelemetry::sdk::trace::TracerProvider(tracez_processor_)); + } private: + zPages(){} /* * Runs the HTTP server in the background for TraceZ */ From ffb74aef441917b00b2c3b94a64289f46f8a3624 Mon Sep 17 00:00:00 2001 From: Keshav Manghat Date: Sat, 1 Aug 2020 19:31:13 +0000 Subject: [PATCH 2/7] Updated zpages wrapper --- examples/zpages/zpages_example.cc | 6 +- examples/zpages/zpagesexample.cc | 2 +- ext/include/opentelemetry/ext/zpages/zpages.h | 62 +++++++------------ 3 files changed, 26 insertions(+), 44 deletions(-) diff --git a/examples/zpages/zpages_example.cc b/examples/zpages/zpages_example.cc index 6d7715f81b..bd9bd37acf 100644 --- a/examples/zpages/zpages_example.cc +++ b/examples/zpages/zpages_example.cc @@ -16,10 +16,12 @@ int main(int argc, char* argv[]) { * can be viewed. * Note that the webserver is destroyed after the application ends execution. */ - zPages(); - std::cout << "In main\n"; + InitializeZpages(); auto tracer = opentelemetry::trace::Provider::GetTracerProvider()->GetTracer(""); + std::cout << "This example for zPages creates a few types of spans and then " + << "creates a span every second for the duration of the application" + << "\n"; // Create a span of each type(running, completed and error) auto running_span = tracer->StartSpan("examplespan"); tracer->StartSpan("examplespan")->End(); diff --git a/examples/zpages/zpagesexample.cc b/examples/zpages/zpagesexample.cc index 1fe0dc197c..efece747a8 100644 --- a/examples/zpages/zpagesexample.cc +++ b/examples/zpages/zpagesexample.cc @@ -35,7 +35,7 @@ void MakeSpans(int i) { } int main(int argc, char* argv[]) { - zPages(); + //zPages(); auto tracer = opentelemetry::trace::Provider::GetTracerProvider()->GetTracer(""); auto run_span = tracer->StartSpan("always running"); diff --git a/ext/include/opentelemetry/ext/zpages/zpages.h b/ext/include/opentelemetry/ext/zpages/zpages.h index d77829e06a..6883b84c0d 100644 --- a/ext/include/opentelemetry/ext/zpages/zpages.h +++ b/ext/include/opentelemetry/ext/zpages/zpages.h @@ -1,6 +1,7 @@ #pragma once #include +#include #include #include "opentelemetry/ext/zpages/tracez_data_aggregator.h" @@ -11,56 +12,35 @@ #include "opentelemetry/sdk/trace/tracer_provider.h" #include "opentelemetry/nostd/shared_ptr.h" - /* - * Wrapper class that allows users to use zPages by calling this class constructor. Currently only - * has TraceZ, but other types of zPages can be added in the future - */ -class zPages { - public: - zPages() - : tracez_processor_(std::make_shared()), - tracez_provider_(opentelemetry::nostd::shared_ptr( - new opentelemetry::sdk::trace::TracerProvider(tracez_processor_))) { - - std::cout << "Constructor\n"; - // Set the global trace provider for a user to use, which is connected to our span processor - opentelemetry::trace::Provider::SetTracerProvider(tracez_provider_); - tracez_server_thread_ = std::thread(&zPages::RunTracezServer, this); - tracez_server_thread_.detach(); - // Ensure zPages has time to setup, so the program doesn't crash - std::this_thread::sleep_for(setup_time_); - } - - static void StartServer(){ - tracez_processor_ = std::make_shared(); - tracez_provider_ = opentelemetry::nostd::shared_ptr( +class zPages { + public: + zPages(){ + auto tracez_processor_ = std::make_shared(); + auto tracez_provider_ = opentelemetry::nostd::shared_ptr( new opentelemetry::sdk::trace::TracerProvider(tracez_processor_)); - } - private: - zPages(){} - /* - * Runs the HTTP server in the background for TraceZ - */ - void RunTracezServer() { auto tracez_aggregator = std::unique_ptr( new opentelemetry::ext::zpages::TracezDataAggregator(tracez_processor_)); - opentelemetry::ext::zpages::TracezHttpServer tracez_server(std::move(tracez_aggregator)); - tracez_server.start(); + tracez_server_ = std::unique_ptr(new opentelemetry::ext::zpages::TracezHttpServer(std::move(tracez_aggregator))); + tracez_server_->start(); - // Keeps zPages server up indefinitely - while (1) std::this_thread::sleep_for(long_time_); - tracez_server.stop(); - } + opentelemetry::trace::Provider::SetTracerProvider(tracez_provider_); + std::this_thread::sleep_for(setup_time_); + } + + ~zPages(){ + tracez_server_->stop(); + } - std::thread tracez_server_thread_; - std::shared_ptr tracez_processor_; - opentelemetry::nostd::shared_ptr tracez_provider_; - const std::chrono::duration setup_time_ = std::chrono::nanoseconds(100); - const std::chrono::duration> long_time_ = std::chrono::hours(9999); + private: + std::unique_ptr tracez_server_; + const std::chrono::duration setup_time_ = std::chrono::nanoseconds(100); }; +void InitializeZpages(){ + static zPages instance; +} From cd20e06c84bcee736d6f501153d572256512f022 Mon Sep 17 00:00:00 2001 From: Keshav Manghat Date: Mon, 3 Aug 2020 14:58:31 +0000 Subject: [PATCH 3/7] Added wrapper changes --- ext/include/opentelemetry/ext/zpages/zpages.h | 1 - 1 file changed, 1 deletion(-) diff --git a/ext/include/opentelemetry/ext/zpages/zpages.h b/ext/include/opentelemetry/ext/zpages/zpages.h index 6883b84c0d..dde08677b9 100644 --- a/ext/include/opentelemetry/ext/zpages/zpages.h +++ b/ext/include/opentelemetry/ext/zpages/zpages.h @@ -13,7 +13,6 @@ #include "opentelemetry/nostd/shared_ptr.h" - class zPages { public: zPages(){ From f33a08827d5060412430e5c8525e4fa1ae1c0af9 Mon Sep 17 00:00:00 2001 From: Keshav Manghat Date: Mon, 3 Aug 2020 16:15:48 +0000 Subject: [PATCH 4/7] Modified zPages wrapper --- examples/zpages/zpages_example.cc | 5 ++--- ext/include/opentelemetry/ext/zpages/zpages.h | 20 +++++++++---------- 2 files changed, 12 insertions(+), 13 deletions(-) diff --git a/examples/zpages/zpages_example.cc b/examples/zpages/zpages_example.cc index bd9bd37acf..816d2d5179 100644 --- a/examples/zpages/zpages_example.cc +++ b/examples/zpages/zpages_example.cc @@ -16,9 +16,9 @@ int main(int argc, char* argv[]) { * can be viewed. * Note that the webserver is destroyed after the application ends execution. */ - InitializeZpages(); + zPages::Initialize(); auto tracer = opentelemetry::trace::Provider::GetTracerProvider()->GetTracer(""); - + std::cout << "This example for zPages creates a few types of spans and then " << "creates a span every second for the duration of the application" << "\n"; @@ -34,7 +34,6 @@ int main(int argc, char* argv[]) { // Create another running span with a different name auto running_span2 = tracer->StartSpan("examplespan2"); - // Create a completed span every second till user stops the loop std::cout << "Presss CTRL+C to stop...\n"; while(true){ diff --git a/ext/include/opentelemetry/ext/zpages/zpages.h b/ext/include/opentelemetry/ext/zpages/zpages.h index dde08677b9..f5906702cb 100644 --- a/ext/include/opentelemetry/ext/zpages/zpages.h +++ b/ext/include/opentelemetry/ext/zpages/zpages.h @@ -14,7 +14,12 @@ class zPages { - public: +public: + static void Initialize(){ + static zPages instance; + } + +private: zPages(){ auto tracez_processor_ = std::make_shared(); auto tracez_provider_ = opentelemetry::nostd::shared_ptr( @@ -31,15 +36,10 @@ class zPages { std::this_thread::sleep_for(setup_time_); } - ~zPages(){ + ~zPages(){ tracez_server_->stop(); - } - - private: - std::unique_ptr tracez_server_; - const std::chrono::duration setup_time_ = std::chrono::nanoseconds(100); + } + std::unique_ptr tracez_server_; + const std::chrono::duration setup_time_ = std::chrono::nanoseconds(100); }; -void InitializeZpages(){ - static zPages instance; -} From eb18a609408f96f2abfac38642027e4c9456658c Mon Sep 17 00:00:00 2001 From: Keshav Manghat Date: Mon, 3 Aug 2020 18:12:44 +0000 Subject: [PATCH 5/7] Documented and updated wrapper code --- ext/include/opentelemetry/ext/zpages/zpages.h | 46 +++++++++++++++---- 1 file changed, 37 insertions(+), 9 deletions(-) diff --git a/ext/include/opentelemetry/ext/zpages/zpages.h b/ext/include/opentelemetry/ext/zpages/zpages.h index f5906702cb..696e37a27c 100644 --- a/ext/include/opentelemetry/ext/zpages/zpages.h +++ b/ext/include/opentelemetry/ext/zpages/zpages.h @@ -12,34 +12,62 @@ #include "opentelemetry/sdk/trace/tracer_provider.h" #include "opentelemetry/nostd/shared_ptr.h" +using std::chrono::microseconds; +using opentelemetry::ext::zpages::TracezSpanProcessor; +using opentelemetry::ext::zpages::TracezDataAggregator; +using opentelemetry::ext::zpages::TracezHttpServer; +/** + * Wrapper for zPages that initializes all the components required for zPages, + * and starts the HTTP server in the constructor and ends it in the destructor. + * The constructor and destructor for this object is private to prevent + * creation other than by calling the static function inialize. This follows the + * meyers singelton pattern and only a single instance of the class is allowed. + */ class zPages { public: + /** + * This function is called if the user wishes to include zPages in their + * application. It creates a static instance of this class. + */ static void Initialize(){ - static zPages instance; + /** + * Creating this will cause an unused variable warning but the pupose of the + * object is to start and end the server in the constructor and destructor + * respectively. + */ + static zPages* instance = new zPages; } private: + /** + * Constructor is responsible for initializing the tracer, tracez processor, + * tracez data aggregator and the tracez server. The server is also started in + * constructor. + */ zPages(){ - auto tracez_processor_ = std::make_shared(); + auto tracez_processor_ = std::make_shared(); auto tracez_provider_ = opentelemetry::nostd::shared_ptr( new opentelemetry::sdk::trace::TracerProvider(tracez_processor_)); - auto tracez_aggregator = std::unique_ptr( - new opentelemetry::ext::zpages::TracezDataAggregator(tracez_processor_)); + auto tracez_aggregator = std::unique_ptr( + new TracezDataAggregator(tracez_processor_)); - tracez_server_ = std::unique_ptr(new opentelemetry::ext::zpages::TracezHttpServer(std::move(tracez_aggregator))); + tracez_server_ = std::unique_ptr(new TracezHttpServer(std::move(tracez_aggregator))); tracez_server_->start(); opentelemetry::trace::Provider::SetTracerProvider(tracez_provider_); - + + // Give the server some time to set up to prevent crashes std::this_thread::sleep_for(setup_time_); } - + ~zPages(){ + // shut down the server when the object goes out of scope(at the end of the + // program) tracez_server_->stop(); } - std::unique_ptr tracez_server_; - const std::chrono::duration setup_time_ = std::chrono::nanoseconds(100); + std::unique_ptr tracez_server_; + const std::chrono::duration setup_time_ = microseconds(10); }; From 269905cdb117b94a7e026a86557911e355e93f26 Mon Sep 17 00:00:00 2001 From: Keshav Manghat Date: Mon, 3 Aug 2020 18:15:00 +0000 Subject: [PATCH 6/7] Format updates --- ext/include/opentelemetry/ext/zpages/zpages.h | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/ext/include/opentelemetry/ext/zpages/zpages.h b/ext/include/opentelemetry/ext/zpages/zpages.h index 696e37a27c..e61ffc7bbf 100644 --- a/ext/include/opentelemetry/ext/zpages/zpages.h +++ b/ext/include/opentelemetry/ext/zpages/zpages.h @@ -47,13 +47,16 @@ class zPages { */ zPages(){ auto tracez_processor_ = std::make_shared(); - auto tracez_provider_ = opentelemetry::nostd::shared_ptr( + auto tracez_provider_ = + opentelemetry::nostd::shared_ptr( new opentelemetry::sdk::trace::TracerProvider(tracez_processor_)); auto tracez_aggregator = std::unique_ptr( new TracezDataAggregator(tracez_processor_)); - tracez_server_ = std::unique_ptr(new TracezHttpServer(std::move(tracez_aggregator))); + tracez_server_ = std::unique_ptr + (new TracezHttpServer(std::move(tracez_aggregator))); + tracez_server_->start(); opentelemetry::trace::Provider::SetTracerProvider(tracez_provider_); From 0ddc6c2640c62ffcf2b8a9bfcef050a047d83f8e Mon Sep 17 00:00:00 2001 From: Keshav Manghat Date: Mon, 3 Aug 2020 18:22:52 +0000 Subject: [PATCH 7/7] Using concrete object rather than pointer for zpages object --- ext/include/opentelemetry/ext/zpages/zpages.h | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/ext/include/opentelemetry/ext/zpages/zpages.h b/ext/include/opentelemetry/ext/zpages/zpages.h index e61ffc7bbf..392c6555b1 100644 --- a/ext/include/opentelemetry/ext/zpages/zpages.h +++ b/ext/include/opentelemetry/ext/zpages/zpages.h @@ -31,12 +31,7 @@ class zPages { * application. It creates a static instance of this class. */ static void Initialize(){ - /** - * Creating this will cause an unused variable warning but the pupose of the - * object is to start and end the server in the constructor and destructor - * respectively. - */ - static zPages* instance = new zPages; + static zPages instance; } private: