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
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
/.cache/
/.vscode/
/build*/
25 changes: 18 additions & 7 deletions src/container_resource_detector.cpp
Original file line number Diff line number Diff line change
@@ -1,11 +1,16 @@
#include "opentelemetry/resource/wwa/container_resource_detector.h"

#include <fstream>
#include <regex>
#include <stdexcept>
#include <string>

#include <opentelemetry/sdk/resource/semantic_conventions.h>
#include <opentelemetry/version.h>

#if OPENTELEMETRY_VERSION_MAJOR == 1 && OPENTELEMETRY_VERSION_MINOR < 18
# include <opentelemetry/sdk/resource/semantic_conventions.h>
#else
# include <opentelemetry/semconv/incubating/container_attributes.h>
# include <opentelemetry/semconv/schema_url.h>
#endif

#include "container_utils.h"

Expand All @@ -31,12 +36,18 @@ ::opentelemetry::sdk::resource::Resource container_resource_detector::Detect()
return ::opentelemetry::sdk::resource::Resource::GetEmpty();
}

# if OPENTELEMETRY_VERSION_MAJOR == 1 && OPENTELEMETRY_VERSION_MINOR < 18
using ::opentelemetry::sdk::resource::SemanticConventions::kContainerId;
using ::opentelemetry::sdk::resource::SemanticConventions::kSchemaUrl;
# else
using ::opentelemetry::semconv::container::kContainerId;
using ::opentelemetry::semconv::kSchemaUrl;
# endif

::opentelemetry::sdk::resource::ResourceAttributes attrs;
attrs[::opentelemetry::sdk::resource::SemanticConventions::kContainerId] = cid;
attrs[kContainerId] = cid;

return ::opentelemetry::sdk::resource::Resource::Create(
attrs, ::opentelemetry::sdk::resource::SemanticConventions::kSchemaUrl
);
return ::opentelemetry::sdk::resource::Resource::Create(attrs, kSchemaUrl);
#endif
}

Expand Down
69 changes: 45 additions & 24 deletions src/os_resource_detector.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,15 @@
# include "tstring.h"
#endif

#include <opentelemetry/sdk/resource/semantic_conventions.h>
#include <opentelemetry/version.h>

#if OPENTELEMETRY_VERSION_MAJOR == 1 && OPENTELEMETRY_VERSION_MINOR < 18
# include <opentelemetry/sdk/resource/semantic_conventions.h>
#else
# include <opentelemetry/semconv/incubating/host_attributes.h>
# include <opentelemetry/semconv/incubating/os_attributes.h>
# include <opentelemetry/semconv/schema_url.h>
#endif

#include "os_utils.h"

Expand All @@ -23,35 +31,52 @@ ::opentelemetry::sdk::resource::Resource os_resource_detector::Detect()
{
::opentelemetry::sdk::resource::ResourceAttributes attrs;

#if OPENTELEMETRY_VERSION_MAJOR == 1 && OPENTELEMETRY_VERSION_MINOR < 18
using ::opentelemetry::sdk::resource::SemanticConventions::kHostArch;
using ::opentelemetry::sdk::resource::SemanticConventions::kHostName;
using ::opentelemetry::sdk::resource::SemanticConventions::kOsType;
using ::opentelemetry::sdk::resource::SemanticConventions::kOsVersion;
using ::opentelemetry::sdk::resource::SemanticConventions::kSchemaUrl;

using namespace ::opentelemetry::sdk::resource::SemanticConventions::HostArchValues;
using namespace ::opentelemetry::sdk::resource::SemanticConventions::OsTypeValues;
#else
using ::opentelemetry::semconv::host::kHostArch;
using ::opentelemetry::semconv::host::kHostName;
using ::opentelemetry::semconv::kSchemaUrl;
using ::opentelemetry::semconv::os::kOsType;
using ::opentelemetry::semconv::os::kOsVersion;

using namespace ::opentelemetry::semconv::host::HostArchValues;
using namespace ::opentelemetry::semconv::os::OsTypeValues;
#endif

#ifndef _WIN32
utsname info{};
if (uname(&info) == -1) {
return ::opentelemetry::sdk::resource::Resource::GetEmpty();
}

// NOLINTBEGIN(*-bounds-array-to-pointer-decay) -- we have no control over the system interface
attrs[::opentelemetry::sdk::resource::SemanticConventions::kHostArch] = get_host_arch(info.machine);
attrs[::opentelemetry::sdk::resource::SemanticConventions::kHostName] = std::string(info.nodename);
attrs[::opentelemetry::sdk::resource::SemanticConventions::kOsType] = get_os_type(info.sysname);
attrs[::opentelemetry::sdk::resource::SemanticConventions::kOsVersion] = std::string(info.release);
attrs[kHostArch] = get_host_arch(info.machine);
attrs[kHostName] = std::string(info.nodename);
attrs[kOsType] = get_os_type(info.sysname);
attrs[kOsVersion] = std::string(info.release);
// NOLINTEND(*-bounds-array-to-pointer-decay)
#else
SYSTEM_INFO si{};
GetSystemInfo(&si);
switch (si.wProcessorArchitecture) {
case PROCESSOR_ARCHITECTURE_AMD64:
attrs[::opentelemetry::sdk::resource::SemanticConventions::kHostArch] =
std::string(::opentelemetry::sdk::resource::SemanticConventions::HostArchValues::kAmd64);
attrs[kHostArch] = std::string(kAmd64);
break;

case PROCESSOR_ARCHITECTURE_INTEL:
attrs[::opentelemetry::sdk::resource::SemanticConventions::kHostArch] =
std::string(::opentelemetry::sdk::resource::SemanticConventions::HostArchValues::kX86);
attrs[kHostArch] = std::string(kX86);
break;

case PROCESSOR_ARCHITECTURE_ARM64:
attrs[::opentelemetry::sdk::resource::SemanticConventions::kHostArch] =
std::string(::opentelemetry::sdk::resource::SemanticConventions::HostArchValues::kArm64);
attrs[kHostArch] = std::string(kArm64);
break;

default:
Expand All @@ -60,28 +85,24 @@ ::opentelemetry::sdk::resource::Resource os_resource_detector::Detect()

std::array<TCHAR, MAX_COMPUTERNAME_LENGTH + 1> buf;
if (auto size = static_cast<DWORD>(buf.size()); GetComputerName(buf.data(), &size)) {
attrs[::opentelemetry::sdk::resource::SemanticConventions::kHostName] = convert(buf.data());
attrs[kHostName] = convert(buf.data());
}

attrs[::opentelemetry::sdk::resource::SemanticConventions::kOsType] =
std::string(::opentelemetry::sdk::resource::SemanticConventions::OsTypeValues::kWindows);
attrs[kOsType] = std::string(kWindows);

OSVERSIONINFO osvi{};
osvi.dwOSVersionInfoSize = sizeof(osvi);
if (GetVersionEx(&osvi)) {
attrs[::opentelemetry::sdk::resource::SemanticConventions::kOsVersion] =
std::to_string(osvi.dwMajorVersion)
.append(".")
.append(std::to_string(osvi.dwMinorVersion))
.append(" (Build ")
.append(std::to_string(osvi.dwBuildNumber))
.append(")");
attrs[kOsVersion] = std::to_string(osvi.dwMajorVersion)
.append(".")
.append(std::to_string(osvi.dwMinorVersion))
.append(" (Build ")
.append(std::to_string(osvi.dwBuildNumber))
.append(")");
}
#endif

return ::opentelemetry::sdk::resource::Resource::Create(
attrs, ::opentelemetry::sdk::resource::SemanticConventions::kSchemaUrl
);
return ::opentelemetry::sdk::resource::Resource::Create(attrs, kSchemaUrl);
}

} // namespace wwa::opentelemetry::resource
84 changes: 52 additions & 32 deletions src/os_utils.cpp
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
#include "os_utils.h"

#include <array>
#include <string_view>
#include <utility>

Expand All @@ -9,6 +8,7 @@
#endif

#if defined(__SIZEOF_INT128__) && __SIZEOF_INT128__ && __cplusplus >= 202002L && !defined(DISABLE_MPH)
# include <array>
# include <mph>
# define USE_MPH
# define CONTAINER std::array
Expand All @@ -19,31 +19,45 @@
# define CONTAINER_CONSTEXPR const
#endif

#include <opentelemetry/sdk/resource/semantic_conventions.h>
#include <opentelemetry/version.h>

#if OPENTELEMETRY_VERSION_MAJOR == 1 && OPENTELEMETRY_VERSION_MINOR < 18
# include <opentelemetry/sdk/resource/semantic_conventions.h>
#else
# include <opentelemetry/semconv/incubating/host_attributes.h>
# include <opentelemetry/semconv/incubating/os_attributes.h>
# include <opentelemetry/semconv/schema_url.h>
#endif

using std::literals::operator""sv;

std::string get_host_arch(std::string_view machine)
{
#if OPENTELEMETRY_VERSION_MAJOR == 1 && OPENTELEMETRY_VERSION_MINOR < 18
using namespace ::opentelemetry::sdk::resource::SemanticConventions::HostArchValues;
#else
using namespace ::opentelemetry::semconv::host::HostArchValues;
#endif

static CONTAINER_CONSTEXPR auto machine_to_arch = CONTAINER{
std::pair{"x86_64"sv, opentelemetry::sdk::resource::SemanticConventions::HostArchValues::kAmd64},
std::pair{"amd64"sv, opentelemetry::sdk::resource::SemanticConventions::HostArchValues::kAmd64},
std::pair{"aarch64"sv, opentelemetry::sdk::resource::SemanticConventions::HostArchValues::kArm64},
std::pair{"arm64"sv, opentelemetry::sdk::resource::SemanticConventions::HostArchValues::kArm64},
std::pair{"arm"sv, opentelemetry::sdk::resource::SemanticConventions::HostArchValues::kArm32},
std::pair{"armv7l"sv, opentelemetry::sdk::resource::SemanticConventions::HostArchValues::kArm32},
std::pair{"ppc"sv, opentelemetry::sdk::resource::SemanticConventions::HostArchValues::kPpc32},
std::pair{"ppc64"sv, opentelemetry::sdk::resource::SemanticConventions::HostArchValues::kPpc64},
std::pair{"ppc64le"sv, opentelemetry::sdk::resource::SemanticConventions::HostArchValues::kPpc64},
std::pair{"s390x"sv, opentelemetry::sdk::resource::SemanticConventions::HostArchValues::kS390x},
std::pair{"i386"sv, opentelemetry::sdk::resource::SemanticConventions::HostArchValues::kX86},
std::pair{"i486"sv, opentelemetry::sdk::resource::SemanticConventions::HostArchValues::kX86},
std::pair{"i586"sv, opentelemetry::sdk::resource::SemanticConventions::HostArchValues::kX86},
std::pair{"i686"sv, opentelemetry::sdk::resource::SemanticConventions::HostArchValues::kX86},
std::pair{"x86"sv, opentelemetry::sdk::resource::SemanticConventions::HostArchValues::kX86},
std::pair{"i86pc"sv, opentelemetry::sdk::resource::SemanticConventions::HostArchValues::kX86},
std::pair{"x86pc"sv, opentelemetry::sdk::resource::SemanticConventions::HostArchValues::kX86},
std::pair{"ia64"sv, opentelemetry::sdk::resource::SemanticConventions::HostArchValues::kIa64}
std::pair{"x86_64"sv, kAmd64},
std::pair{"amd64"sv, kAmd64},
std::pair{"aarch64"sv, kArm64},
std::pair{"arm64"sv, kArm64},
std::pair{"arm"sv, kArm32},
std::pair{"armv7l"sv, kArm32},
std::pair{"ppc"sv, kPpc32},
std::pair{"ppc64"sv, kPpc64},
std::pair{"ppc64le"sv, kPpc64},
std::pair{"s390x"sv, kS390x},
std::pair{"i386"sv, kX86},
std::pair{"i486"sv, kX86},
std::pair{"i586"sv, kX86},
std::pair{"i686"sv, kX86},
std::pair{"x86"sv, kX86},
std::pair{"i86pc"sv, kX86},
std::pair{"x86pc"sv, kX86},
std::pair{"ia64"sv, kIa64}
};

#ifdef USE_MPH
Expand All @@ -61,18 +75,24 @@ std::string get_host_arch(std::string_view machine)

std::string get_os_type(std::string_view os)
{
#if OPENTELEMETRY_VERSION_MAJOR == 1 && OPENTELEMETRY_VERSION_MINOR < 18
using namespace ::opentelemetry::sdk::resource::SemanticConventions::OsTypeValues;
#else
using namespace ::opentelemetry::semconv::os::OsTypeValues;
#endif

static CONTAINER_CONSTEXPR auto os_to_type = CONTAINER{
std::pair{"Linux"sv, opentelemetry::sdk::resource::SemanticConventions::OsTypeValues::kLinux},
std::pair{"Windows_NT"sv, opentelemetry::sdk::resource::SemanticConventions::OsTypeValues::kWindows},
std::pair{"DragonFly"sv, opentelemetry::sdk::resource::SemanticConventions::OsTypeValues::kDragonflybsd},
std::pair{"FreeBSD"sv, opentelemetry::sdk::resource::SemanticConventions::OsTypeValues::kFreebsd},
std::pair{"HP-UX"sv, opentelemetry::sdk::resource::SemanticConventions::OsTypeValues::kHpux},
std::pair{"AIX"sv, opentelemetry::sdk::resource::SemanticConventions::OsTypeValues::kAix},
std::pair{"Darwin"sv, opentelemetry::sdk::resource::SemanticConventions::OsTypeValues::kDarwin},
std::pair{"NetBSD"sv, opentelemetry::sdk::resource::SemanticConventions::OsTypeValues::kNetbsd},
std::pair{"OpenBSD"sv, opentelemetry::sdk::resource::SemanticConventions::OsTypeValues::kOpenbsd},
std::pair{"SunOS"sv, opentelemetry::sdk::resource::SemanticConventions::OsTypeValues::kSolaris},
std::pair{"OS/390"sv, opentelemetry::sdk::resource::SemanticConventions::OsTypeValues::kZOs}
std::pair{"Linux"sv, kLinux},
std::pair{"Windows_NT"sv, kWindows},
std::pair{"DragonFly"sv, kDragonflybsd},
std::pair{"FreeBSD"sv, kFreebsd},
std::pair{"HP-UX"sv, kHpux},
std::pair{"AIX"sv, kAix},
std::pair{"Darwin"sv, kDarwin},
std::pair{"NetBSD"sv, kNetbsd},
std::pair{"OpenBSD"sv, kOpenbsd},
std::pair{"SunOS"sv, kSolaris},
std::pair{"OS/390"sv, kZOs}
};

#ifdef USE_MPH
Expand All @@ -86,7 +106,7 @@ std::string get_os_type(std::string_view os)
#endif

if (os.starts_with("CYGWIN") || os.starts_with("MINGW") || os.starts_with("MSYS")) {
return opentelemetry::sdk::resource::SemanticConventions::OsTypeValues::kWindows;
return kWindows;
}

return {os.data(), os.length()};
Expand Down
Loading
Loading