This repository has been archived by the owner on Jan 26, 2024. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 114
Add support for dynamic loading. #45
Merged
Merged
Changes from all commits
Commits
Show all changes
52 commits
Select commit
Hold shift + click to select a range
6b8bc2b
Dynamic load changes.
rnburn 4030ec8
Remove default timestamping.
rnburn ed6e121
Add dynamic load functions.
rnburn ae66b6b
Add dynamic load code.
rnburn c184ee5
Merge branch 'master' of github.com:rnburn/opentracing-cpp into dlopen
rnburn 9ad435f
Use factory interface for dynamic loading.
rnburn fc45b0e
Separate TracerFactory from dynamic loading.
rnburn 920b2a0
Support specifying an error_code when dynamic load fails.
rnburn 931b239
Allow DynamicTracingLibraryHandle to be default constructible.
rnburn b037065
Add documentation for make_opentracing_factory.
rnburn 5368976
Comment dynamic_load interface.
rnburn 3e20e42
Document tracer_factory.h
rnburn c41edee
Fix order in destructors.
rnburn 16ad19b
Correct typo.
rnburn 75b1da5
Merge branch 'master' of https://github.com/opentracing/opentracing-c…
rnburn 4ad8a70
Remove windows stub.
rnburn 6821cd6
Update naming convention to be more consistent.
rnburn ff26d65
Run clang-format.
rnburn c5bf3c3
Merge branch 'master' of https://github.com/opentracing/opentracing-c…
rnburn 5955aec
Correct typo.
rnburn 99a8f57
Add dynamic loading support to mocktracer.
rnburn 0484533
Add tests for dynamic loading.
rnburn 365f7ea
Run clang-format.
rnburn 749ed80
Test for weak symbols.
rnburn 09ed628
Run clang-format.
rnburn 5daa522
Fix bazel build for dynamic loading support.
rnburn 43cedf7
link 3rd party libraries in statically.
rnburn 61f959a
Correct include guards.
rnburn 83d97b6
Rearrange base64 code.
rnburn 9c5c8c6
Add missing base64 code.
rnburn 2123ae7
Include apache license.
rnburn 4262eba
Correct typo.
rnburn c6dad55
Writing manual serialization code.
rnburn 2502ce8
Add plugin library.
rnburn e3b1648
Add serialization for SpanData.
rnburn a53744b
Suppress false positive from undefined behavior sanitizer.
rnburn dc1e79e
Represent duration with a string.
rnburn 152218a
Use string to represent trace/span-ids.
rnburn bb817a3
Remove 3rd-party json library dependency.
rnburn cfe28ef
Run clang-format.
rnburn 4a30061
Add missing include.
rnburn 9deeb34
Use strings for IDs in JSON.
rnburn b3717a9
Merge branch 'jsonlib' into dlopen
rnburn 4131731
Run clang-format.
rnburn b9a40ff
Add dl library dependency.
rnburn d2297f5
Return const pointer from const member function.
rnburn 6796a85
Remove constexpr from rvalue-ref member.
rnburn 0d275cb
Merge branch 'expected-bug' into dlopen
rnburn 1368b7d
Fix bazel build.
rnburn 52d0a5c
Add example usage with mocktracer.
rnburn bf1189a
Add example for dynamic loading.
rnburn 3a198e9
Add missing include.
rnburn File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,3 @@ | ||
void __attribute((weak)) f(); | ||
|
||
int main() { return 0; } |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,3 @@ | ||
#pragma once | ||
|
||
#cmakedefine OPENTRACING_BUILD_DYNAMIC_LOADING |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,2 @@ | ||
add_subdirectory(tutorial) | ||
add_subdirectory(dynamic_load) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,4 @@ | ||
if (BUILD_DYNAMIC_LOADING AND BUILD_SHARED_LIBS) | ||
add_executable(dynamic_load-example dynamic_load-example.cpp) | ||
target_link_libraries(dynamic_load-example opentracing) | ||
endif() |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,64 @@ | ||
// Demonstrates how to load a tracer library in at runtime and how to use it | ||
// to construct spans. To run it using the mocktracer, invoke with | ||
// | ||
// TRACER_CONFIG=`mktemp` | ||
// echo '{ "output_file": "/dev/stdout" }' > $TRACER_CONFIG | ||
// dynamic_load-example /path/to/libopentracing_mocktracer.so $TRACER_CONFIG | ||
|
||
#include <opentracing/dynamic_load.h> | ||
#include <cassert> | ||
#include <cerrno> | ||
#include <fstream> | ||
#include <iostream> | ||
#include <iterator> | ||
#include <string> | ||
|
||
int main(int argc, char* argv[]) { | ||
if (argc != 3) { | ||
std::cerr << "Usage: <tracer_library> <tracer_config_file>\n"; | ||
return -1; | ||
} | ||
|
||
// Load the tracer library. | ||
std::string error_message; | ||
auto handle_maybe = | ||
opentracing::DynamicallyLoadTracingLibrary(argv[1], error_message); | ||
if (!handle_maybe) { | ||
std::cerr << "Failed to load tracer library " << error_message << "\n"; | ||
return -1; | ||
} | ||
|
||
// Read in the tracer's configuration. | ||
std::ifstream istream{argv[2]}; | ||
if (!istream.good()) { | ||
std::cerr << "Failed to open tracer config file " << argv[2] << ": " | ||
<< std::strerror(errno) << "\n"; | ||
return -1; | ||
} | ||
std::string tracer_config{std::istreambuf_iterator<char>{istream}, | ||
std::istreambuf_iterator<char>{}}; | ||
|
||
// Construct a tracer. | ||
auto& tracer_factory = handle_maybe->tracer_factory(); | ||
auto tracer_maybe = | ||
tracer_factory.MakeTracer(tracer_config.c_str(), error_message); | ||
if (!tracer_maybe) { | ||
std::cerr << "Failed to create tracer " << error_message << "\n"; | ||
return -1; | ||
} | ||
auto& tracer = *tracer_maybe; | ||
|
||
// Use the tracer to create some spans. | ||
{ | ||
auto span_a = tracer->StartSpan("A"); | ||
assert(span_a != nullptr); | ||
span_a->SetTag("abc", 123); | ||
auto span_b = | ||
tracer->StartSpan("B", {opentracing::ChildOf(&span_a->context())}); | ||
assert(span_b != nullptr); | ||
span_b->SetTag("xyz", 987); | ||
} | ||
|
||
tracer->Close(); | ||
return 0; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,5 @@ | ||
if (BUILD_MOCKTRACER AND BUILD_SHARED_LIBS) | ||
include_directories(${CMAKE_SOURCE_DIR}/mocktracer/include) | ||
add_executable(tutorial-example tutorial-example.cpp) | ||
target_link_libraries(tutorial-example opentracing_mocktracer) | ||
endif() |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,37 @@ | ||
#ifndef LIGHTSTEP_TEXT_MAP_CARRIER | ||
#define LIGHTSTEP_TEXT_MAP_CARRIER | ||
|
||
#include <opentracing/propagation.h> | ||
#include <string> | ||
#include <unordered_map> | ||
|
||
using opentracing::TextMapReader; | ||
using opentracing::TextMapWriter; | ||
using opentracing::expected; | ||
using opentracing::string_view; | ||
|
||
class TextMapCarrier : public TextMapReader, public TextMapWriter { | ||
public: | ||
TextMapCarrier(std::unordered_map<std::string, std::string>& text_map) | ||
: text_map_(text_map) {} | ||
|
||
expected<void> Set(string_view key, string_view value) const override { | ||
text_map_[key] = value; | ||
return {}; | ||
} | ||
|
||
expected<void> ForeachKey( | ||
std::function<expected<void>(string_view key, string_view value)> f) | ||
const override { | ||
for (const auto& key_value : text_map_) { | ||
auto result = f(key_value.first, key_value.second); | ||
if (!result) return result; | ||
} | ||
return {}; | ||
} | ||
|
||
private: | ||
std::unordered_map<std::string, std::string>& text_map_; | ||
}; | ||
|
||
#endif // LIGHTSTEP_TEXT_MAP_CARRIER |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,99 @@ | ||
// Demonstrates basic usage of the OpenTracing API. Uses OpenTracing's | ||
// mocktracer to capture all the recorded spans as JSON. | ||
|
||
#include <opentracing/mocktracer/json_recorder.h> | ||
#include <opentracing/mocktracer/tracer.h> | ||
#include <cassert> | ||
#include <iostream> | ||
#include <sstream> | ||
#include <unordered_map> | ||
#include "text_map_carrier.h" | ||
using namespace opentracing; | ||
using namespace opentracing::mocktracer; | ||
|
||
int main() { | ||
MockTracerOptions options; | ||
std::unique_ptr<std::ostringstream> output{new std::ostringstream{}}; | ||
std::ostringstream& oss = *output; | ||
options.recorder = std::unique_ptr<mocktracer::Recorder>{ | ||
new JsonRecorder{std::move(output)}}; | ||
|
||
std::shared_ptr<opentracing::Tracer> tracer{ | ||
new MockTracer{std::move(options)}}; | ||
|
||
auto parent_span = tracer->StartSpan("parent"); | ||
assert(parent_span); | ||
|
||
// Create a child span. | ||
{ | ||
auto child_span = | ||
tracer->StartSpan("childA", {ChildOf(&parent_span->context())}); | ||
assert(child_span); | ||
|
||
// Set a simple tag. | ||
child_span->SetTag("simple tag", 123); | ||
|
||
// Set a complex tag. | ||
child_span->SetTag("complex tag", | ||
Values{123, Dictionary{{"abc", 123}, {"xyz", 4.0}}}); | ||
|
||
// Log simple values. | ||
child_span->Log({{"event", "simple log"}, {"abc", 123}}); | ||
|
||
// Log complex values. | ||
child_span->Log({{"event", "complex log"}, | ||
{"data", Dictionary{{"a", 1}, {"b", Values{1, 2}}}}}); | ||
|
||
child_span->Finish(); | ||
} | ||
|
||
// Create a follows from span. | ||
{ | ||
auto child_span = | ||
tracer->StartSpan("childB", {FollowsFrom(&parent_span->context())}); | ||
|
||
// child_span's destructor will finish the span if not done so explicitly. | ||
} | ||
|
||
// Use custom timestamps. | ||
{ | ||
auto t1 = SystemClock::now(); | ||
auto t2 = SteadyClock::now(); | ||
auto span = tracer->StartSpan( | ||
"useCustomTimestamps", | ||
{ChildOf(&parent_span->context()), StartTimestamp(t1)}); | ||
assert(span); | ||
span->Finish({FinishTimestamp(t2)}); | ||
} | ||
|
||
// Extract and Inject a span context. | ||
{ | ||
std::unordered_map<std::string, std::string> text_map; | ||
TextMapCarrier carrier(text_map); | ||
auto err = tracer->Inject(parent_span->context(), carrier); | ||
assert(err); | ||
auto span_context_maybe = tracer->Extract(carrier); | ||
assert(span_context_maybe); | ||
auto span = tracer->StartSpan("propagationSpan", | ||
{ChildOf(span_context_maybe->get())}); | ||
} | ||
|
||
// You get an error when trying to extract a corrupt span. | ||
{ | ||
std::unordered_map<std::string, std::string> text_map = { | ||
{"x-ot-span-context", "123"}}; | ||
TextMapCarrier carrier(text_map); | ||
auto err = tracer->Extract(carrier); | ||
assert(!err); | ||
assert(err.error() == span_context_corrupted_error); | ||
// How to get a readable message from the error. | ||
std::cout << "Example error message: \"" << err.error().message() << "\"\n"; | ||
} | ||
|
||
parent_span->Finish(); | ||
tracer->Close(); | ||
|
||
std::cout << "\nRecorded spans as JSON:\n\n"; | ||
std::cout << oss.str() << "\n"; | ||
return 0; | ||
} |
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Is this the way to write it for all compilers? If not, I can devise a simple CMake loop to determine which, if any, weak symbol attribute notation works.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
GCC, Clang, ICC, and XL C all use the same weak symbol syntax.
MSVC has something different, but it's not quite the same as weak symbols and would have to be handled differently. Probably best to deal with that whenever we add the other pieces for MSVC.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
OK makes sense to me. Just like to leverage build tools for compatibility when it is straightforward to do so.