Skip to content
Merged
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
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,8 @@ Increment the:

* [RESOURCE DETECTOR] Add the host resource detector
[#4413](https://github.com/open-telemetry/opentelemetry-cpp/issues/4413)
* [RESOURCE DETECTOR] Add the service resource detector and builder
[#4414](https://github.com/open-telemetry/opentelemetry-cpp/issues/4414)
* [CONFIGURATION] deprecate config builder cmake components
[#4428](https://github.com/open-telemetry/opentelemetry-cpp/pull/4428)

Expand Down
4 changes: 2 additions & 2 deletions examples/configuration/kitchen-sink.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -1067,8 +1067,8 @@ resource:
host:
- # Enable the process resource detector, which populates process.* attributes.
process:
# - # Enable the service detector, which populates service.name based on the OTEL_SERVICE_NAME environment variable and service.instance.id.
# service:
- # Enable the service resource detector, which populates service.name based on the OTEL_SERVICE_NAME environment variable and service.instance.id.
service:
# - # Enable an extension resource detector registered by name.
# my_custom_detector:
# Configure resource schema URL.
Expand Down
2 changes: 2 additions & 0 deletions examples/configuration/main.cc
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,7 @@
# include "opentelemetry/resource_detectors/container_detector_builder.h"
# include "opentelemetry/resource_detectors/host_detector_builder.h"
# include "opentelemetry/resource_detectors/process_detector_builder.h"
# include "opentelemetry/resource_detectors/service_detector_builder.h"
#endif

static bool opt_help = false;
Expand Down Expand Up @@ -226,6 +227,7 @@ void InitOtel(const std::string &config_file)
opentelemetry::resource_detector::ContainerDetectorBuilder::Register(registry.get());
opentelemetry::resource_detector::HostDetectorBuilder::Register(registry.get());
opentelemetry::resource_detector::ProcessDetectorBuilder::Register(registry.get());
opentelemetry::resource_detector::ServiceDetectorBuilder::Register(registry.get());
#endif
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,8 @@ target_link_libraries(
opentelemetry-cpp::host_resource_detector_builder
opentelemetry-cpp::process_resource_detector
opentelemetry-cpp::process_resource_detector_builder
opentelemetry-cpp::service_resource_detector
opentelemetry-cpp::service_resource_detector_builder
GTest::gtest
GTest::gtest_main)

Expand Down
2 changes: 2 additions & 0 deletions install/test/cmake/fetch_content_test/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -112,6 +112,8 @@ target_link_libraries(
opentelemetry-cpp::host_resource_detector_builder
opentelemetry-cpp::process_resource_detector
opentelemetry-cpp::process_resource_detector_builder
opentelemetry-cpp::service_resource_detector
opentelemetry-cpp::service_resource_detector_builder
opentelemetry-cpp::http_client
opentelemetry-cpp::http_client_curl
opentelemetry-cpp::in_memory_span_exporter
Expand Down
36 changes: 36 additions & 0 deletions install/test/src/test_resource_detectors.cc
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,21 @@

#include <gtest/gtest.h>

#include <opentelemetry/nostd/variant.h>
#include <opentelemetry/resource_detectors/container_detector.h>
#include <opentelemetry/resource_detectors/container_detector_builder.h>
#include <opentelemetry/resource_detectors/env_entity_detector.h>
#include <opentelemetry/resource_detectors/host_detector.h>
#include <opentelemetry/resource_detectors/host_detector_builder.h>
#include <opentelemetry/resource_detectors/process_detector.h>
#include <opentelemetry/resource_detectors/process_detector_builder.h>
#include <opentelemetry/resource_detectors/service_detector.h>
#include <opentelemetry/resource_detectors/service_detector_builder.h>
#include <opentelemetry/semconv/service_attributes.h>
#include <memory>
#include <string>

namespace semconv = opentelemetry::semconv;

TEST(ResourceDetectorsInstall, ContainerResourceDetector)
{
Expand Down Expand Up @@ -44,6 +51,24 @@ TEST(ResourceDetectorsInstall, ProcessResourceDetector)
ASSERT_NO_THROW(auto resource = detector->Detect());
}

TEST(ResourceDetectorsInstall, ServiceResourceDetector)
{
std::unique_ptr<opentelemetry::sdk::resource::ResourceDetector> detector =
std::make_unique<opentelemetry::resource_detector::ServiceResourceDetector>();
ASSERT_TRUE(detector != nullptr);

auto resource = detector->Detect();
const auto &attrs = resource.GetAttributes();

auto name_it = attrs.find(semconv::service::kServiceName);
ASSERT_NE(name_it, attrs.end());
EXPECT_FALSE(opentelemetry::nostd::get<std::string>(name_it->second).empty());

auto instance_id_it = attrs.find(semconv::service::kServiceInstanceId);
ASSERT_NE(instance_id_it, attrs.end());
EXPECT_FALSE(opentelemetry::nostd::get<std::string>(instance_id_it->second).empty());
}

TEST(ResourceDetectorsInstall, ContainerDetectorBuilder)
{
auto builder = std::make_unique<opentelemetry::resource_detector::ContainerDetectorBuilder>();
Expand Down Expand Up @@ -73,3 +98,14 @@ TEST(ResourceDetectorsInstall, ProcessDetectorBuilder)
auto detector = builder->Build(&model);
ASSERT_TRUE(detector != nullptr);
}

TEST(ResourceDetectorsInstall, ServiceDetectorBuilder)
{
auto builder = std::make_unique<opentelemetry::resource_detector::ServiceDetectorBuilder>();
ASSERT_TRUE(builder != nullptr);

opentelemetry::sdk::configuration::ServiceResourceDetectorConfiguration model;
auto detector = builder->Build(&model);
ASSERT_TRUE(detector != nullptr);
ASSERT_NO_THROW(auto resource = detector->Detect());
}
39 changes: 39 additions & 0 deletions resource_detectors/BUILD
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,43 @@ cc_library(
],
)

cc_library(
name = "service_resource_detector_utils",
srcs = ["src/service_detector_utils.cc"],
copts = ["-fexceptions"],
deps = [
":process_resource_detector",
"//api",
"//resource_detectors:headers",
"//sdk:headers",
"//sdk/src/common:env_variables",
"//sdk/src/common:random",
"//sdk/src/resource",
],
)

cc_library(
name = "service_resource_detector",
srcs = ["src/service_detector.cc"],
copts = ["-fexceptions"],
deps = [
":service_resource_detector_utils",
"//api",
"//resource_detectors:headers",
"//sdk:headers",
"//sdk/src/resource",
],
)

cc_library(
name = "service_resource_detector_builder",
srcs = ["src/service_detector_builder.cc"],
deps = [
":service_resource_detector",
"//sdk/src/configuration:configuration_core",
],
)

# Convenience target linking all resource detectors.
cc_library(
name = "resource_detectors",
Expand All @@ -103,6 +140,7 @@ cc_library(
":env_entity_resource_detector",
":host_resource_detector",
":process_resource_detector",
":service_resource_detector",
],
)

Expand All @@ -113,5 +151,6 @@ cc_library(
":container_resource_detector_builder",
":host_resource_detector_builder",
":process_resource_detector_builder",
":service_resource_detector_builder",
],
)
67 changes: 65 additions & 2 deletions resource_detectors/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -136,6 +136,64 @@ target_link_libraries(
PRIVATE opentelemetry_process_resource_detector
opentelemetry_configuration_core)

#
# opentelemetry_service_resource_detector_utils
#

add_library(opentelemetry_service_resource_detector_utils
src/service_detector_utils.cc)

set_target_properties(opentelemetry_service_resource_detector_utils
PROPERTIES EXPORT_NAME service_resource_detector_utils)
set_target_version(opentelemetry_service_resource_detector_utils)

target_link_libraries(
opentelemetry_service_resource_detector_utils
PUBLIC opentelemetry_resources
PRIVATE opentelemetry_process_resource_detector)
target_include_directories(
opentelemetry_service_resource_detector_utils
PUBLIC "$<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}/include>"
"$<INSTALL_INTERFACE:include>")

#
# opentelemetry_service_resource_detector
#

add_library(opentelemetry_service_resource_detector src/service_detector.cc)

set_target_properties(opentelemetry_service_resource_detector
PROPERTIES EXPORT_NAME service_resource_detector)
set_target_version(opentelemetry_service_resource_detector)

target_link_libraries(opentelemetry_service_resource_detector
PUBLIC opentelemetry_service_resource_detector_utils)
target_include_directories(
opentelemetry_service_resource_detector
PUBLIC "$<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}/include>"
"$<INSTALL_INTERFACE:include>")

#
# opentelemetry_service_resource_detector_builder
#

add_library(opentelemetry_service_resource_detector_builder
src/service_detector_builder.cc)

set_target_properties(opentelemetry_service_resource_detector_builder
PROPERTIES EXPORT_NAME service_resource_detector_builder)
set_target_version(opentelemetry_service_resource_detector_builder)

target_include_directories(
opentelemetry_service_resource_detector_builder
PUBLIC "$<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}/include>"
"$<INSTALL_INTERFACE:include>")

target_link_libraries(
opentelemetry_service_resource_detector_builder
PRIVATE opentelemetry_service_resource_detector
opentelemetry_configuration_core)

#
# opentelemetry_resource_detectors (interface to all detectors)
#
Expand All @@ -150,7 +208,8 @@ target_link_libraries(
INTERFACE opentelemetry_container_resource_detector
opentelemetry_env_entity_resource_detector
opentelemetry_host_resource_detector
opentelemetry_process_resource_detector)
opentelemetry_process_resource_detector
opentelemetry_service_resource_detector)

#
# opentelemetry_resource_detectors_builders (interface to all builders)
Expand All @@ -165,7 +224,8 @@ target_link_libraries(
opentelemetry_resource_detectors_builders
INTERFACE opentelemetry_container_resource_detector_builder
opentelemetry_host_resource_detector_builder
opentelemetry_process_resource_detector_builder)
opentelemetry_process_resource_detector_builder
opentelemetry_service_resource_detector_builder)

otel_add_component(
COMPONENT
Expand All @@ -180,6 +240,9 @@ otel_add_component(
opentelemetry_host_resource_detector_builder
opentelemetry_process_resource_detector
opentelemetry_process_resource_detector_builder
opentelemetry_service_resource_detector
opentelemetry_service_resource_detector_builder
opentelemetry_service_resource_detector_utils
FILES_DIRECTORY
"include/opentelemetry/"
FILES_DESTINATION
Expand Down
44 changes: 32 additions & 12 deletions resource_detectors/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,25 @@ Contributions to detect more attributes for each Entity are welcome.

[Entity: Service](https://opentelemetry.io/docs/specs/semconv/registry/entities/service/)

Not implemented.
| Attribute | Description | Linux | macOS | Windows |
| --- | --- | --- | --- | --- |
| `service.name` | From `OTEL_SERVICE_NAME` when set | Yes | Yes | Yes |
| `service.name` | Fallback `unknown_service:<process.executable.name>` or `unknown_service` | Yes | Yes | Yes |
| `service.instance.id` | Stable RFC 4122 UUID version 4 for the current process | Yes | Yes | Yes |

`service.name` is read only from the `OTEL_SERVICE_NAME` environment variable. When
that variable is unset, the detector falls back to
`unknown_service:<process.executable.name>` when the executable name is
available for the current process, otherwise `unknown_service`.

`service.instance.id` is generated once per process and remains stable until the
process ID changes (for example after `fork()`).

Limitations:

- The detector does not read `OTEL_RESOURCE_ATTRIBUTES`.
- Executable-name fallback reuses process detector utilities; on macOS the
executable name is available for the current process only.

### Container Resource Detector

Expand Down Expand Up @@ -62,10 +80,7 @@ or inaccessible.
| Attribute | Description | Linux | macOS | Windows |
| --- | --- | --- | --- | --- |
| `process.pid` | Process ID | Yes | Yes | Yes |
| `process.executable.path` | Path via `/proc` (Linux) or Win32 APIs | Yes | No | Yes |

Limitation: current macOS implementation does not populate
`process.executable.path`.
| `process.executable.path` | Path via `/proc` (Linux) or Win32 APIs | Yes | Yes | Yes |

### Env Entity Resource Detector (Experimental)

Expand Down Expand Up @@ -102,8 +117,7 @@ resource:
- container:
- host:
- process:
# NOTE: service detector cannot be configured currently
- service: # not implemented (github.com/open-telemetry/opentelemetry-cpp/issues/4414)
- service:
```

Call `Register` for each builder before creating the SDK:
Expand All @@ -112,15 +126,17 @@ Call `Register` for each builder before creating the SDK:
#include "opentelemetry/resource_detectors/container_detector_builder.h"
#include "opentelemetry/resource_detectors/host_detector_builder.h"
#include "opentelemetry/resource_detectors/process_detector_builder.h"
#include "opentelemetry/resource_detectors/service_detector_builder.h"

opentelemetry::resource_detector::ContainerDetectorBuilder::Register(registry.get());
opentelemetry::resource_detector::HostDetectorBuilder::Register(registry.get());
opentelemetry::resource_detector::ProcessDetectorBuilder::Register(registry.get());
opentelemetry::resource_detector::ServiceDetectorBuilder::Register(registry.get());
```

## Linking with CMake

### Linking to detectors directly (not required for declaritive config)
### Linking to detectors directly (not required for declarative config)

Link to all available detectors:

Expand All @@ -136,9 +152,9 @@ find_package(opentelemetry-cpp CONFIG REQUIRED COMPONENTS resource_detectors)
target_link_libraries(my_target PRIVATE opentelemetry-cpp::host_resource_detector)
```

### Linking to builders for declaritive configuration
### Linking to builders for declarative configuration

Builder targets make detectors available for declaritive configuration and hide
Builder targets make detectors available for declarative configuration and hide
the concrete detector implementations.

Link all builders:
Expand Down Expand Up @@ -166,12 +182,14 @@ All targets are part of the `resource_detectors` component.
| `opentelemetry-cpp::resource_detectors` | Interface: links all detectors |
| `opentelemetry-cpp::resource_detectors_builders` | Interface: links all builders |
| `opentelemetry-cpp::container_resource_detector` | Container detector |
| `opentelemetry-cpp::container_resource_detector_builder` | Container detector builder for declaritive configuration |
| `opentelemetry-cpp::container_resource_detector_builder` | Container detector builder for declarative configuration |
| `opentelemetry-cpp::env_entity_resource_detector` | Env entity detector |
| `opentelemetry-cpp::host_resource_detector` | Host detector |
| `opentelemetry-cpp::host_resource_detector_builder` | Host detector builder for declaritive configuration |
| `opentelemetry-cpp::process_resource_detector` | Process detector |
| `opentelemetry-cpp::process_resource_detector_builder` | Process detector builder for declaritive configuration |
| `opentelemetry-cpp::process_resource_detector_builder` | Process detector builder for declarative configuration |
| `opentelemetry-cpp::service_resource_detector` | Service detector |
| `opentelemetry-cpp::service_resource_detector_builder` | Service detector builder for declarative configuration |

## Linking with Bazel

Expand Down Expand Up @@ -219,3 +237,5 @@ deps = ["//resource_detectors:process_resource_detector_builder"]
| `//resource_detectors:host_resource_detector_builder` | Host detector builder |
| `//resource_detectors:process_resource_detector` | Process detector |
| `//resource_detectors:process_resource_detector_builder` | Process detector builder |
| `//resource_detectors:service_resource_detector` | Service detector |
| `//resource_detectors:service_resource_detector_builder` | Service detector builder |
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,8 @@ std::string FormFilePath(const int32_t &pid, const char *process_type);
* Platform-specific behavior:
* - Windows: Uses OpenProcess() + GetProcessImageFileNameW().
* - Linux/Unix: Reads the /proc/<pid>/exe symbolic link.
* - TODO: Need to implement for Darwin
* - macOS: Uses _NSGetExecutablePath() for the current process only; returns
* an empty string for other PIDs.
*
* @param pid Process ID.
*/
Expand Down
Loading
Loading