-
Notifications
You must be signed in to change notification settings - Fork 440
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Resource sdk Implementation #502
Changes from 35 commits
a27a5e4
abe8287
083b169
b61acdd
4540bc5
dfe857c
0ae679e
7673007
d5b389f
9fbe8be
208f231
60034d9
04e9de8
bfdd7e1
2abd049
f71a47c
f7e4909
bc3bebc
48a30d4
d8d015a
48ab9ea
f515165
5b01258
e9745f1
84d5405
01fd510
c60fefc
b023c2a
1586018
9158d71
db2412b
35dbf99
5e67443
adbd86d
ef45994
a272b92
8cd247e
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
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 |
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 |
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" | ||
|
@@ -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; | ||
|
||
/** | ||
|
@@ -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_; | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I think we shouldn't make this a reference, but hold the resource by value. Theoretically, we support using a There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. fixed. |
||
}; | ||
} // namespace trace | ||
} // namespace sdk | ||
|
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", | ||
], | ||
) |
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}) |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,66 @@ | ||
#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_); | ||
for (auto &elem : attributes_) | ||
{ | ||
if (merged_resource_attributes.find(elem.first) == merged_resource_attributes.end()) | ||
{ | ||
merged_resource_attributes[elem.first] = elem.second; | ||
} | ||
} | ||
lalitb marked this conversation as resolved.
Show resolved
Hide resolved
|
||
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 |
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 |
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
protected
necessary or just private is fine?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.
protected
helps creating unit test case - to subclassResource
and create instance of it for testing. We are doing this inresources_test.cc
. I have modified the comment to indicate it's protected :)