Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions examples/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@
add_subdirectory(plugin)
add_subdirectory(simple)
25 changes: 25 additions & 0 deletions examples/simple/BUILD
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
cc_library(
name = "foo_library",
srcs = [
"foo_library/foo_library.cc",
],
hdrs = [
"foo_library/foo_library.h",
],
deps = [
"//api",
],
)

cc_binary(
name = "example_simple",
srcs = [
"main.cc",
"stdout_exporter.h",
],
deps = [
":foo_library",
"//api",
"//sdk/src/trace",
],
)
6 changes: 6 additions & 0 deletions examples/simple/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
add_library(foo_library foo_library/foo_library.cc)
target_link_libraries(foo_library ${CMAKE_THREAD_LIBS_INIT} opentelemetry_api)

add_executable(example_simple main.cc)
target_link_libraries(example_simple ${CMAKE_THREAD_LIBS_INIT} foo_library
opentelemetry_trace)
25 changes: 25 additions & 0 deletions examples/simple/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@

## Building and Running the Simple Trace Example

This example sets up a tracer in the main application then uses a library that is instrumented with Open Telemetry. All telemetry output is directed to stdout.

Install Bazel version 1.2.0 by following the steps listed at https://docs.bazel.build/versions/master/install.html

Clone or fork the Open Telemetry C++ repository:

```sh
git clone https://github.com/open-telemetry/opentelemetry-cpp.git
```

Build the example from the root of the opentelemetry-cpp directory using Bazel:

```sh
cd opentelemetry-cpp/
bazel build //examples/simple:example_simple
```

Run the resulting executable to see telemetry from the application as it calls the instrumented library.

```sh
bazel-bin/examples/simple/example_simple
```
36 changes: 36 additions & 0 deletions examples/simple/foo_library/foo_library.cc
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
#include "opentelemetry/trace/provider.h"

namespace trace = opentelemetry::trace;
namespace nostd = opentelemetry::nostd;

namespace
{
nostd::shared_ptr<trace::Tracer> get_tracer()
{
// Retrieve the global TraceProvider specific in main
auto provider = trace::Provider::GetTracerProvider();
// Return a Tracer object
return provider->GetTracer("foo_library");
}

void f1()
{
// Create a span using the Tracer returned by the get_tracer() function
auto span = get_tracer()->StartSpan("f1");
}

void f2()
{
auto span = get_tracer()->StartSpan("f2");

f1();
f1();
}
} // namespace

void foo_library()
{
auto span = get_tracer()->StartSpan("library");

f2();
}
3 changes: 3 additions & 0 deletions examples/simple/foo_library/foo_library.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
#pragma once

void foo_library();
36 changes: 36 additions & 0 deletions examples/simple/main.cc
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
#include "opentelemetry/sdk/trace/simple_processor.h"
#include "opentelemetry/sdk/trace/tracer_provider.h"
#include "opentelemetry/trace/provider.h"

// Using an exporter that simply dumps span data to stdout.
#include "stdout_exporter.h"

#include "foo_library/foo_library.h"

namespace
{
void initTracer()
{
// Specify the exporter: StdoutExporter in this case simply passes all output from the span
// processor to stdout
auto exporter = std::unique_ptr<sdktrace::SpanExporter>(new StdoutExporter);
// Specify the Span Processor: SimpleSpanProcessor forwards all completed spans directly to the
// exporter
auto processor = std::shared_ptr<sdktrace::SpanProcessor>(new sdktrace::SimpleSpanProcessor(
std::move(exporter))); // Creating a Span Processor given the StdoutExporter defined earlier
// Initialize a trace provider with the Span Processor instance defined above
auto provider = nostd::shared_ptr<trace::TracerProvider>(new sdktrace::TracerProvider(processor));
// Set global trace provider
trace::Provider::SetTracerProvider(provider);
}
} // namespace

int main()
{
// Removing this line will leave OT initialized with the default noop
// tracer, thus being effectively deactivated.
initTracer();

// Call the instrumented library
foo_library();
}
52 changes: 52 additions & 0 deletions examples/simple/stdout_exporter.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
#pragma once

#include "opentelemetry/sdk/trace/exporter.h"
#include "opentelemetry/sdk/trace/span_data.h"

#include <iostream>

namespace trace = opentelemetry::trace;
namespace nostd = opentelemetry::nostd;
namespace sdktrace = opentelemetry::sdk::trace;

class StdoutExporter final : public sdktrace::SpanExporter
{
std::unique_ptr<sdktrace::Recordable> MakeRecordable() noexcept
{
return std::unique_ptr<sdktrace::Recordable>(new sdktrace::SpanData);
}

sdktrace::ExportResult Export(
const nostd::span<std::unique_ptr<sdktrace::Recordable>> &spans) noexcept
{
for (auto &recordable : spans)
{
auto span = std::unique_ptr<sdktrace::SpanData>(
static_cast<sdktrace::SpanData *>(recordable.release()));

if (span != nullptr)
{
char trace_id[32] = {0};
char span_id[16] = {0};
char parent_span_id[16] = {0};

span->GetTraceId().ToLowerBase16(trace_id);
span->GetSpanId().ToLowerBase16(span_id);
span->GetParentSpanId().ToLowerBase16(parent_span_id);

std::cout << "{"
<< "\n name : " << span->GetName()
<< "\n trace_id : " << std::string(trace_id, 32)
<< "\n span_id : " << std::string(span_id, 16)
<< "\n parent_span_id: " << std::string(parent_span_id, 16)
<< "\n start : " << span->GetStartTime().time_since_epoch().count()
<< "\n duration : " << span->GetDuration().count() << "\n}"
<< "\n";
}
}

return sdktrace::ExportResult::kSuccess;
}

void Shutdown(std::chrono::microseconds timeout = std::chrono::microseconds(0)) noexcept {}
};
3 changes: 2 additions & 1 deletion sdk/include/opentelemetry/sdk/trace/exporter.h
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,8 @@ class SpanExporter
* @param spans a span of unique pointers to span recordables
*/
virtual ExportResult Export(
nostd::span<std::unique_ptr<opentelemetry::sdk::trace::Recordable>> &spans) noexcept = 0;
const nostd::span<std::unique_ptr<opentelemetry::sdk::trace::Recordable>>
&spans) noexcept = 0;

/**
* Shut down the exporter.
Expand Down
2 changes: 1 addition & 1 deletion sdk/include/opentelemetry/sdk/trace/tracer_provider.h
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ class TracerProvider final : public opentelemetry::trace::TracerProvider

private:
opentelemetry::sdk::AtomicSharedPtr<SpanProcessor> processor_;
opentelemetry::nostd::shared_ptr<opentelemetry::trace::Tracer> tracer_;
std::shared_ptr<opentelemetry::trace::Tracer> tracer_;
};
} // namespace trace
} // namespace sdk
Expand Down
2 changes: 1 addition & 1 deletion sdk/src/trace/tracer_provider.cc
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ opentelemetry::nostd::shared_ptr<opentelemetry::trace::Tracer> TracerProvider::G
nostd::string_view library_name,
nostd::string_view library_version) noexcept
{
return tracer_;
return opentelemetry::nostd::shared_ptr<opentelemetry::trace::Tracer>(tracer_);
}

void TracerProvider::SetProcessor(std::shared_ptr<SpanProcessor> processor) noexcept
Expand Down
4 changes: 2 additions & 2 deletions sdk/test/trace/simple_processor_test.cc
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
#include "src/trace/simple_processor.h"
#include "opentelemetry/sdk/trace/simple_processor.h"
#include "opentelemetry/nostd/span.h"
#include "opentelemetry/sdk/trace/span_data.h"

Expand All @@ -23,7 +23,7 @@ class MockSpanExporter final : public SpanExporter
}

ExportResult Export(
opentelemetry::nostd::span<std::unique_ptr<Recordable>> &spans) noexcept override
const opentelemetry::nostd::span<std::unique_ptr<Recordable>> &spans) noexcept override
{
for (auto &span : spans)
{
Expand Down
2 changes: 1 addition & 1 deletion sdk/test/trace/tracer_provider_test.cc
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
#include "opentelemetry/sdk/trace/tracer_provider.h"
#include "opentelemetry/sdk/trace/simple_processor.h"
#include "opentelemetry/sdk/trace/tracer.h"
#include "src/trace/simple_processor.h"

#include <gtest/gtest.h>

Expand Down
4 changes: 2 additions & 2 deletions sdk/test/trace/tracer_test.cc
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
#include "opentelemetry/sdk/trace/tracer.h"
#include "opentelemetry/sdk/trace/simple_processor.h"
#include "opentelemetry/sdk/trace/span_data.h"
#include "src/trace/simple_processor.h"

#include <gtest/gtest.h>

Expand All @@ -22,7 +22,7 @@ class MockSpanExporter final : public SpanExporter
}

ExportResult Export(
opentelemetry::nostd::span<std::unique_ptr<Recordable>> &recordables) noexcept override
const opentelemetry::nostd::span<std::unique_ptr<Recordable>> &recordables) noexcept override
{
for (auto &recordable : recordables)
{
Expand Down