Skip to content

Commit

Permalink
Resource sdk Implementation (#502)
Browse files Browse the repository at this point in the history
  • Loading branch information
lalitb authored Jan 22, 2021
1 parent ad9e57f commit ce89aa1
Show file tree
Hide file tree
Showing 28 changed files with 489 additions and 25 deletions.
3 changes: 2 additions & 1 deletion examples/multithreaded/main.cc
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
#include "opentelemetry/sdk/resource/resource.h"
#include "opentelemetry/sdk/trace/simple_processor.h"
#include "opentelemetry/sdk/trace/tracer_provider.h"
#include "opentelemetry/trace/provider.h"
Expand All @@ -18,7 +19,7 @@ void initTracer()
auto processor = std::shared_ptr<sdktrace::SpanProcessor>(
new sdktrace::SimpleSpanProcessor(std::move(exporter)));
auto provider = nostd::shared_ptr<opentelemetry::trace::TracerProvider>(
new sdktrace::TracerProvider(processor));
new sdktrace::TracerProvider(processor, opentelemetry::sdk::resource::Resource::Create({})));
// Set the global trace provider
opentelemetry::trace::Provider::SetTracerProvider(provider);
}
Expand Down
4 changes: 3 additions & 1 deletion examples/simple/main.cc
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,9 @@ void initTracer()
auto processor = std::shared_ptr<sdktrace::SpanProcessor>(
new sdktrace::SimpleSpanProcessor(std::move(exporter)));
auto provider = nostd::shared_ptr<opentelemetry::trace::TracerProvider>(
new sdktrace::TracerProvider(processor));
new sdktrace::TracerProvider(processor, opentelemetry::sdk::resource::Resource::Create({}),
std::make_shared<opentelemetry::sdk::trace::AlwaysOnSampler>()));

// Set the global trace provider
opentelemetry::trace::Provider::SetTracerProvider(provider);
}
Expand Down
4 changes: 3 additions & 1 deletion ext/test/zpages/tracez_data_aggregator_test.cc
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
#include <gtest/gtest.h>

#include "opentelemetry/ext/zpages/tracez_processor.h"
#include "opentelemetry/sdk/resource/resource.h"
#include "opentelemetry/sdk/trace/recordable.h"
#include "opentelemetry/sdk/trace/tracer.h"

Expand Down Expand Up @@ -34,7 +35,8 @@ class TracezDataAggregatorTest : public ::testing::Test
void SetUp() override
{
std::shared_ptr<TracezSpanProcessor> processor(new TracezSpanProcessor());
tracer = std::shared_ptr<opentelemetry::trace::Tracer>(new Tracer(processor));
auto resource = opentelemetry::sdk::resource::Resource::Create({});
tracer = std::shared_ptr<opentelemetry::trace::Tracer>(new Tracer(processor, resource));
tracez_data_aggregator = std::unique_ptr<TracezDataAggregator>(
new TracezDataAggregator(processor, milliseconds(10)));
}
Expand Down
7 changes: 5 additions & 2 deletions ext/test/zpages/tracez_processor_test.cc
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@

#include "opentelemetry/ext/zpages/threadsafe_span_data.h"
#include "opentelemetry/nostd/span.h"
#include "opentelemetry/sdk/resource/resource.h"
#include "opentelemetry/sdk/trace/tracer.h"

using namespace opentelemetry::sdk::trace;
Expand Down Expand Up @@ -174,8 +175,10 @@ class TracezProcessor : public ::testing::Test
protected:
void SetUp() override
{
processor = std::shared_ptr<TracezSpanProcessor>(new TracezSpanProcessor());
tracer = std::shared_ptr<opentelemetry::trace::Tracer>(new Tracer(processor));
processor = std::shared_ptr<TracezSpanProcessor>(new TracezSpanProcessor());
auto resource = opentelemetry::sdk::resource::Resource::Create({});

tracer = std::shared_ptr<opentelemetry::trace::Tracer>(new Tracer(processor, resource));
auto spans = processor->GetSpanSnapshot();
running = spans.running;
completed = std::move(spans.completed);
Expand Down
77 changes: 77 additions & 0 deletions sdk/include/opentelemetry/sdk/resource/resource.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
#pragma once

#include "opentelemetry/sdk/common/attribute_utils.h"
#include "opentelemetry/sdk/resource/resource_detector.h"
#include "opentelemetry/sdk/version/version.h"
#include "opentelemetry/version.h"

#include <memory>
#include <sstream>
#include <unordered_map>

OPENTELEMETRY_BEGIN_NAMESPACE
namespace sdk
{
namespace resource
{

using ResourceAttributes =
std::unordered_map<std::string, opentelemetry::sdk::common::OwnedAttributeValue>;

class Resource
{
public:
Resource(const Resource &) = default;

const ResourceAttributes &GetAttributes() const noexcept;

/**
* Returns a new, merged {@link Resource} by merging the current Resource
* with the other Resource. In case of a collision, current Resource takes
* precedence.
*
* @param other the Resource that will be merged with this.
* @returns the newly merged Resource.
*/

Resource Merge(const Resource &other) noexcept;

/**
* Returns a newly created Resource with the specified attributes.
* It adds (merge) SDK attributes and OTEL attributes before returning.
* @param attributes for this resource
* @returns the newly created Resource.
*/

static Resource Create(const ResourceAttributes &attributes);

/**
* Returns an Empty resource.
*/

static Resource &GetEmpty();

/**
* Returns a Resource that indentifies the SDK in use.
*/

static Resource &GetDefault();

protected:
/**
* The constructor is protected and only for use internally by the class and
* inside ResourceDetector class.
* Users should use the Create factory method to obtain a Resource
* instance.
*/
Resource(const ResourceAttributes &attributes = ResourceAttributes()) noexcept;

private:
ResourceAttributes attributes_;

friend class OTELResourceDetector;
};

} // namespace resource
} // namespace sdk
OPENTELEMETRY_END_NAMESPACE
35 changes: 35 additions & 0 deletions sdk/include/opentelemetry/sdk/resource/resource_detector.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
#pragma once

#include "opentelemetry/nostd/unique_ptr.h"
#include "opentelemetry/version.h"

OPENTELEMETRY_BEGIN_NAMESPACE
namespace sdk
{
namespace resource
{

class Resource;

/**
* Interface for a Resource Detector
*/
class ResourceDetector
{
public:
virtual Resource Detect() = 0;
};

/**
* OTelResourceDetector to detect the presence of and create a Resource
* from the OTEL_RESOURCE_ATTRIBUTES environment variable.
*/
class OTELResourceDetector : public ResourceDetector
{
public:
Resource Detect() noexcept override;
};

} // namespace resource
} // namespace sdk
OPENTELEMETRY_END_NAMESPACE
3 changes: 3 additions & 0 deletions sdk/include/opentelemetry/sdk/trace/tracer.h
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
#pragma once

#include "opentelemetry/sdk/common/atomic_shared_ptr.h"
#include "opentelemetry/sdk/resource/resource.h"
#include "opentelemetry/sdk/trace/processor.h"
#include "opentelemetry/sdk/trace/samplers/always_on.h"
#include "opentelemetry/trace/noop.h"
Expand All @@ -23,6 +24,7 @@ class Tracer final : public trace_api::Tracer, public std::enable_shared_from_th
* nullptr.
*/
explicit Tracer(std::shared_ptr<SpanProcessor> processor,
const opentelemetry::sdk::resource::Resource &resource,
std::shared_ptr<Sampler> sampler = std::make_shared<AlwaysOnSampler>()) noexcept;

/**
Expand Down Expand Up @@ -57,6 +59,7 @@ class Tracer final : public trace_api::Tracer, public std::enable_shared_from_th
private:
opentelemetry::sdk::AtomicSharedPtr<SpanProcessor> processor_;
const std::shared_ptr<Sampler> sampler_;
const opentelemetry::sdk::resource::Resource &resource_;
};
} // namespace trace
} // namespace sdk
Expand Down
12 changes: 11 additions & 1 deletion sdk/include/opentelemetry/sdk/trace/tracer_provider.h
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
#include <string>

#include "opentelemetry/nostd/shared_ptr.h"
#include "opentelemetry/sdk/resource/resource.h"
#include "opentelemetry/sdk/trace/processor.h"
#include "opentelemetry/sdk/trace/samplers/always_on.h"
#include "opentelemetry/sdk/trace/tracer.h"
Expand All @@ -27,6 +28,8 @@ class TracerProvider final : public opentelemetry::trace::TracerProvider
*/
explicit TracerProvider(
std::shared_ptr<SpanProcessor> processor,
opentelemetry::sdk::resource::Resource &&resource =
opentelemetry::sdk::resource::Resource::Create({}),
std::shared_ptr<Sampler> sampler = std::make_shared<AlwaysOnSampler>()) noexcept;

opentelemetry::nostd::shared_ptr<opentelemetry::trace::Tracer> GetTracer(
Expand All @@ -48,10 +51,16 @@ class TracerProvider final : public opentelemetry::trace::TracerProvider

/**
* Obtain the sampler associated with this tracer provider.
* @return The span processor for this tracer provider.
* @return The sampler for this tracer provider.
*/
std::shared_ptr<Sampler> GetSampler() const noexcept;

/**
* Obtain the resource associated with this tracer provider.
* @return The resource for this tracer provider.
*/
const opentelemetry::sdk::resource::Resource &GetResource() const noexcept;

/**
* Shutdown the span processor associated with this tracer provider.
*/
Expand All @@ -61,6 +70,7 @@ class TracerProvider final : public opentelemetry::trace::TracerProvider
opentelemetry::sdk::AtomicSharedPtr<SpanProcessor> processor_;
std::shared_ptr<opentelemetry::trace::Tracer> tracer_;
const std::shared_ptr<Sampler> sampler_;
const opentelemetry::sdk::resource::Resource resource_;
};
} // namespace trace
} // namespace sdk
Expand Down
1 change: 1 addition & 0 deletions sdk/src/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -3,3 +3,4 @@ add_subdirectory(trace)
add_subdirectory(metrics)
add_subdirectory(logs)
add_subdirectory(version)
add_subdirectory(resource)
26 changes: 26 additions & 0 deletions sdk/src/resource/BUILD
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
# Copyright 2020, OpenTelemetry Authors
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

package(default_visibility = ["//visibility:public"])

cc_library(
name = "resource",
srcs = glob(["**/*.cc"]),
hdrs = glob(["**/*.h"]),
include_prefix = "src/resource",
deps = [
"//api",
"//sdk:headers",
],
)
16 changes: 16 additions & 0 deletions sdk/src/resource/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
add_library(opentelemetry_resources resource.cc resource_detector.cc)

set_target_properties(opentelemetry_resources PROPERTIES EXPORT_NAME resources)

target_link_libraries(opentelemetry_resources opentelemetry_common)

target_include_directories(
opentelemetry_resources
PUBLIC "$<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/sdk/include>")

install(
TARGETS opentelemetry_resources
EXPORT "${PROJECT_NAME}-target"
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR})
60 changes: 60 additions & 0 deletions sdk/src/resource/resource.cc
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
#include "opentelemetry/sdk/resource/resource.h"
#include "opentelemetry/nostd/span.h"
#include "opentelemetry/sdk/resource/resource_detector.h"
#include "opentelemetry/version.h"

OPENTELEMETRY_BEGIN_NAMESPACE
namespace sdk
{
namespace resource
{

const std::string kTelemetrySdkLanguage = "telemetry.sdk.language";
const std::string kTelemetrySdkName = "telemetry.sdk.name";
const std::string kTelemetrySdkVersion = "telemetry.sdk.version";

Resource::Resource(const ResourceAttributes &attributes) noexcept : attributes_(attributes) {}

Resource Resource::Merge(const Resource &other) noexcept
{
ResourceAttributes merged_resource_attributes(other.attributes_);
merged_resource_attributes.insert(attributes_.begin(), attributes_.end());
return Resource(merged_resource_attributes);
}

Resource Resource::Create(const ResourceAttributes &attributes)
{
static auto otel_resource = OTELResourceDetector().Detect();
auto default_resource = Resource::GetDefault();

if (attributes.size() > 0)
{
Resource tmp_resource(attributes);
auto merged_resource = tmp_resource.Merge(default_resource);
return merged_resource.Merge(otel_resource);
}
return default_resource.Merge(otel_resource);
}

Resource &Resource::GetEmpty()
{
static Resource empty_resource;
return empty_resource;
}

Resource &Resource::GetDefault()
{
static Resource default_resource({{kTelemetrySdkLanguage, "cpp"},
{kTelemetrySdkName, "opentelemetry"},
{kTelemetrySdkVersion, OPENTELEMETRY_SDK_VERSION}});
return default_resource;
}

const ResourceAttributes &Resource::GetAttributes() const noexcept
{
return attributes_;
}

} // namespace resource
} // namespace sdk
OPENTELEMETRY_END_NAMESPACE
34 changes: 34 additions & 0 deletions sdk/src/resource/resource_detector.cc
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
#include "opentelemetry/sdk/resource/resource_detector.h"
#include <cstdlib>
#include "opentelemetry/sdk/resource/resource.h"

OPENTELEMETRY_BEGIN_NAMESPACE
namespace sdk
{
namespace resource
{

const char *OTEL_RESOURCE_ATTRIBUTES = "OTEL_RESOURCE_ATTRIBUTES";

Resource OTELResourceDetector::Detect() noexcept
{
char *attributes_str = std::getenv(OTEL_RESOURCE_ATTRIBUTES);
if (attributes_str == nullptr)
return Resource();
// return Resource::GetEmpty();
ResourceAttributes attributes;
std::istringstream iss(attributes_str);
std::string token;
while (std::getline(iss, token, ','))
{
size_t pos = token.find('=');
std::string key = token.substr(0, pos);
std::string value = token.substr(pos + 1);
attributes[key] = value;
}
return Resource(attributes);
}

} // namespace resource
} // namespace sdk
OPENTELEMETRY_END_NAMESPACE
1 change: 1 addition & 0 deletions sdk/src/trace/BUILD
Original file line number Diff line number Diff line change
Expand Up @@ -23,5 +23,6 @@ cc_library(
"//api",
"//sdk:headers",
"//sdk/src/common:random",
"//sdk/src/resource",
],
)
Loading

0 comments on commit ce89aa1

Please sign in to comment.