Browse Source

Merge pull request #2482 from zerotier/otel

Add OpenTelemetry support in Central Controllers
Adam Ierymenko 2 days ago
parent
commit
a548c7ea71
100 changed files with 13404 additions and 91 deletions
  1. 143 3
      controller/CV1.cpp
  2. 3 0
      controller/CV1.hpp
  3. 153 13
      controller/CV2.cpp
  4. 5 8
      controller/CV2.hpp
  5. 15 0
      controller/ConnectionPool.hpp
  6. 77 0
      controller/DB.cpp
  7. 0 4
      controller/DB.hpp
  8. 122 0
      controller/DBMirrorSet.cpp
  9. 130 3
      controller/EmbeddedNetworkController.cpp
  10. 32 0
      controller/FileDB.cpp
  11. 0 46
      controller/PostgreSQL.cpp
  12. 106 8
      controller/PostgreSQL.hpp
  13. 3 2
      ext/central-controller-docker/Dockerfile
  14. 12 1
      ext/central-controller-docker/Dockerfile.builder
  15. 3 1
      ext/central-controller-docker/Dockerfile.run_base
  16. 2 2
      ext/central-controller-docker/Makefile
  17. 4 0
      ext/central-controller-docker/main.sh
  18. 3 0
      ext/opentelemetry-cpp-1.21.0/.bazelignore
  19. 41 0
      ext/opentelemetry-cpp-1.21.0/.bazelrc
  20. 1 0
      ext/opentelemetry-cpp-1.21.0/.bazelversion
  21. 73 0
      ext/opentelemetry-cpp-1.21.0/.clang-format
  22. 42 0
      ext/opentelemetry-cpp-1.21.0/.clang-tidy
  23. 7 0
      ext/opentelemetry-cpp-1.21.0/.cmake-format.py
  24. 52 0
      ext/opentelemetry-cpp-1.21.0/.copyright-ignore
  25. 55 0
      ext/opentelemetry-cpp-1.21.0/.devcontainer/Dockerfile.conan
  26. 58 0
      ext/opentelemetry-cpp-1.21.0/.devcontainer/Dockerfile.dev
  27. 65 0
      ext/opentelemetry-cpp-1.21.0/.devcontainer/README.md
  28. 39 0
      ext/opentelemetry-cpp-1.21.0/.devcontainer/customize_container.sh
  29. 35 0
      ext/opentelemetry-cpp-1.21.0/.devcontainer/devcontainer.json
  30. 47 0
      ext/opentelemetry-cpp-1.21.0/.gitattributes
  31. 50 0
      ext/opentelemetry-cpp-1.21.0/.github/.codecov.yaml
  32. 8 0
      ext/opentelemetry-cpp-1.21.0/.github/CODEOWNERS
  33. 19 0
      ext/opentelemetry-cpp-1.21.0/.github/ISSUE_TEMPLATE/bug_report.md
  34. 19 0
      ext/opentelemetry-cpp-1.21.0/.github/ISSUE_TEMPLATE/feature_request.md
  35. 13 0
      ext/opentelemetry-cpp-1.21.0/.github/dependabot.yml
  36. 11 0
      ext/opentelemetry-cpp-1.21.0/.github/pull_request_template.md
  37. 38 0
      ext/opentelemetry-cpp-1.21.0/.github/repository-settings.md
  38. 82 0
      ext/opentelemetry-cpp-1.21.0/.github/workflows/benchmark.yml
  39. 1247 0
      ext/opentelemetry-cpp-1.21.0/.github/workflows/ci.yml
  40. 89 0
      ext/opentelemetry-cpp-1.21.0/.github/workflows/clang-tidy.yaml
  41. 372 0
      ext/opentelemetry-cpp-1.21.0/.github/workflows/cmake_install.yml
  42. 48 0
      ext/opentelemetry-cpp-1.21.0/.github/workflows/codeql-analysis.yml
  43. 77 0
      ext/opentelemetry-cpp-1.21.0/.github/workflows/cppcheck.yml
  44. 54 0
      ext/opentelemetry-cpp-1.21.0/.github/workflows/dependencies_image.yml
  45. 25 0
      ext/opentelemetry-cpp-1.21.0/.github/workflows/fossa.yml
  46. 92 0
      ext/opentelemetry-cpp-1.21.0/.github/workflows/iwyu.yml
  47. 52 0
      ext/opentelemetry-cpp-1.21.0/.github/workflows/ossf-scorecard.yml
  48. 28 0
      ext/opentelemetry-cpp-1.21.0/.github/workflows/project_management_comment.yml
  49. 29 0
      ext/opentelemetry-cpp-1.21.0/.github/workflows/project_management_issue_open.yml
  50. 21 0
      ext/opentelemetry-cpp-1.21.0/.github/workflows/stale.yml
  51. 84 0
      ext/opentelemetry-cpp-1.21.0/.gitignore
  52. 39 0
      ext/opentelemetry-cpp-1.21.0/.gitmodules
  53. 31 0
      ext/opentelemetry-cpp-1.21.0/.iwyu.imp
  54. 8 0
      ext/opentelemetry-cpp-1.21.0/.markdownlint.json
  55. 3 0
      ext/opentelemetry-cpp-1.21.0/.markdownlintignore
  56. 2816 0
      ext/opentelemetry-cpp-1.21.0/CHANGELOG.md
  57. 927 0
      ext/opentelemetry-cpp-1.21.0/CMakeLists.txt
  58. 126 0
      ext/opentelemetry-cpp-1.21.0/CMakeSettings.json
  59. 3 0
      ext/opentelemetry-cpp-1.21.0/CODE_OF_CONDUCT.md
  60. 322 0
      ext/opentelemetry-cpp-1.21.0/CONTRIBUTING.md
  61. 139 0
      ext/opentelemetry-cpp-1.21.0/DEPRECATED.md
  62. 452 0
      ext/opentelemetry-cpp-1.21.0/INSTALL.md
  63. 201 0
      ext/opentelemetry-cpp-1.21.0/LICENSE
  64. 25 0
      ext/opentelemetry-cpp-1.21.0/MODULE.bazel
  65. 127 0
      ext/opentelemetry-cpp-1.21.0/README.md
  66. 96 0
      ext/opentelemetry-cpp-1.21.0/RELEASING.md
  67. 107 0
      ext/opentelemetry-cpp-1.21.0/Versioning.md
  68. 23 0
      ext/opentelemetry-cpp-1.21.0/WORKSPACE
  69. 4 0
      ext/opentelemetry-cpp-1.21.0/WORKSPACE.bzlmod
  70. 81 0
      ext/opentelemetry-cpp-1.21.0/api/BUILD
  71. 140 0
      ext/opentelemetry-cpp-1.21.0/api/CMakeLists.txt
  72. 299 0
      ext/opentelemetry-cpp-1.21.0/api/include/opentelemetry/baggage/baggage.h
  73. 36 0
      ext/opentelemetry-cpp-1.21.0/api/include/opentelemetry/baggage/baggage_context.h
  74. 60 0
      ext/opentelemetry-cpp-1.21.0/api/include/opentelemetry/baggage/propagation/baggage_propagator.h
  75. 82 0
      ext/opentelemetry-cpp-1.21.0/api/include/opentelemetry/common/attribute_value.h
  76. 64 0
      ext/opentelemetry-cpp-1.21.0/api/include/opentelemetry/common/key_value_iterable.h
  77. 146 0
      ext/opentelemetry-cpp-1.21.0/api/include/opentelemetry/common/key_value_iterable_view.h
  78. 272 0
      ext/opentelemetry-cpp-1.21.0/api/include/opentelemetry/common/kv_properties.h
  79. 523 0
      ext/opentelemetry-cpp-1.21.0/api/include/opentelemetry/common/macros.h
  80. 133 0
      ext/opentelemetry-cpp-1.21.0/api/include/opentelemetry/common/spin_lock_mutex.h
  81. 42 0
      ext/opentelemetry-cpp-1.21.0/api/include/opentelemetry/common/string_util.h
  82. 206 0
      ext/opentelemetry-cpp-1.21.0/api/include/opentelemetry/common/timestamp.h
  83. 19 0
      ext/opentelemetry-cpp-1.21.0/api/include/opentelemetry/config.h
  84. 171 0
      ext/opentelemetry-cpp-1.21.0/api/include/opentelemetry/context/context.h
  85. 35 0
      ext/opentelemetry-cpp-1.21.0/api/include/opentelemetry/context/context_value.h
  86. 93 0
      ext/opentelemetry-cpp-1.21.0/api/include/opentelemetry/context/propagation/composite_propagator.h
  87. 57 0
      ext/opentelemetry-cpp-1.21.0/api/include/opentelemetry/context/propagation/global_propagator.h
  88. 40 0
      ext/opentelemetry-cpp-1.21.0/api/include/opentelemetry/context/propagation/noop_propagator.h
  89. 59 0
      ext/opentelemetry-cpp-1.21.0/api/include/opentelemetry/context/propagation/text_map_propagator.h
  90. 340 0
      ext/opentelemetry-cpp-1.21.0/api/include/opentelemetry/context/runtime_context.h
  91. 25 0
      ext/opentelemetry-cpp-1.21.0/api/include/opentelemetry/detail/preprocessor.h
  92. 37 0
      ext/opentelemetry-cpp-1.21.0/api/include/opentelemetry/logs/event_id.h
  93. 82 0
      ext/opentelemetry-cpp-1.21.0/api/include/opentelemetry/logs/event_logger.h
  94. 37 0
      ext/opentelemetry-cpp-1.21.0/api/include/opentelemetry/logs/event_logger_provider.h
  95. 92 0
      ext/opentelemetry-cpp-1.21.0/api/include/opentelemetry/logs/log_record.h
  96. 492 0
      ext/opentelemetry-cpp-1.21.0/api/include/opentelemetry/logs/logger.h
  97. 71 0
      ext/opentelemetry-cpp-1.21.0/api/include/opentelemetry/logs/logger_provider.h
  98. 204 0
      ext/opentelemetry-cpp-1.21.0/api/include/opentelemetry/logs/logger_type_traits.h
  99. 131 0
      ext/opentelemetry-cpp-1.21.0/api/include/opentelemetry/logs/noop.h
  100. 100 0
      ext/opentelemetry-cpp-1.21.0/api/include/opentelemetry/logs/provider.h

+ 143 - 3
controller/CV1.cpp

@@ -21,6 +21,7 @@
 #include "CtlUtil.hpp"
 #include "EmbeddedNetworkController.hpp"
 #include "Redis.hpp"
+#include "opentelemetry/trace/provider.h"
 
 #include <chrono>
 #include <climits>
@@ -61,6 +62,11 @@ CV1::CV1(const Identity& myId, const char* path, int listenPort, RedisConfig* rc
 	, _redisMemberStatus(false)
 	, _smee(NULL)
 {
+	auto provider = opentelemetry::trace::Provider::GetTracerProvider();
+	auto tracer = provider->GetTracer("cv1");
+	auto span = tracer->StartSpan("cv1::CV1");
+	auto scope = tracer->WithActiveSpan(span);
+
 	char myAddress[64];
 	_myAddressStr = myId.address().toString(myAddress);
 	_connString = std::string(path);
@@ -98,6 +104,9 @@ CV1::CV1(const Identity& myId, const char* path, int listenPort, RedisConfig* rc
 	_pool->unborrow(c);
 
 	if (_rc != NULL) {
+		auto innerspan = tracer->StartSpan("cv1::CV1::configureRedis");
+		auto innerscope = tracer->WithActiveSpan(innerspan);
+
 		sw::redis::ConnectionOptions opts;
 		sw::redis::ConnectionPoolOptions poolOpts;
 		opts.host = _rc->hostname;
@@ -111,10 +120,12 @@ CV1::CV1(const Identity& myId, const char* path, int listenPort, RedisConfig* rc
 		poolOpts.connection_lifetime = std::chrono::minutes(3);
 		poolOpts.connection_idle_time = std::chrono::minutes(1);
 		if (_rc->clusterMode) {
+			innerspan->SetAttribute("cluster_mode", "true");
 			fprintf(stderr, "Using Redis in Cluster Mode\n");
 			_cluster = std::make_shared<sw::redis::RedisCluster>(opts, poolOpts);
 		}
 		else {
+			innerspan->SetAttribute("cluster_mode", "false");
 			fprintf(stderr, "Using Redis in Standalone Mode\n");
 			_redis = std::make_shared<sw::redis::Redis>(opts, poolOpts);
 		}
@@ -161,6 +172,11 @@ CV1::~CV1()
 
 void CV1::configureSmee()
 {
+	auto provider = opentelemetry::trace::Provider::GetTracerProvider();
+	auto tracer = provider->GetTracer("cv1");
+	auto span = tracer->StartSpan("cv1::configureSmee");
+	auto scope = tracer->WithActiveSpan(span);
+
 	const char* TEMPORAL_SCHEME = "ZT_TEMPORAL_SCHEME";
 	const char* TEMPORAL_HOST = "ZT_TEMPORAL_HOST";
 	const char* TEMPORAL_PORT = "ZT_TEMPORAL_PORT";
@@ -202,6 +218,11 @@ bool CV1::isReady()
 
 bool CV1::save(nlohmann::json& record, bool notifyListeners)
 {
+	auto provider = opentelemetry::trace::Provider::GetTracerProvider();
+	auto tracer = provider->GetTracer("cv1");
+	auto span = tracer->StartSpan("cv1::save");
+	auto scope = tracer->WithActiveSpan(span);
+
 	bool modified = false;
 	try {
 		if (! record.is_object()) {
@@ -257,6 +278,13 @@ bool CV1::save(nlohmann::json& record, bool notifyListeners)
 
 void CV1::eraseNetwork(const uint64_t networkId)
 {
+	auto provider = opentelemetry::trace::Provider::GetTracerProvider();
+	auto tracer = provider->GetTracer("cv1");
+	auto span = tracer->StartSpan("cv1::eraseNetwork");
+	auto scope = tracer->WithActiveSpan(span);
+	char networkIdStr[17];
+	span->SetAttribute("network_id", Utils::hex(networkId, networkIdStr));
+
 	fprintf(stderr, "PostgreSQL::eraseNetwork\n");
 	char tmp2[24];
 	waitForReady();
@@ -272,6 +300,15 @@ void CV1::eraseNetwork(const uint64_t networkId)
 
 void CV1::eraseMember(const uint64_t networkId, const uint64_t memberId)
 {
+	auto provider = opentelemetry::trace::Provider::GetTracerProvider();
+	auto tracer = provider->GetTracer("cv1");
+	auto span = tracer->StartSpan("cv1::eraseMember");
+	auto scope = tracer->WithActiveSpan(span);
+	char networkIdStr[17];
+	char memberIdStr[11];
+	span->SetAttribute("network_id", Utils::hex(networkId, networkIdStr));
+	span->SetAttribute("member_id", Utils::hex10(memberId, memberIdStr));
+
 	fprintf(stderr, "PostgreSQL::eraseMember\n");
 	char tmp2[24];
 	waitForReady();
@@ -289,6 +326,18 @@ void CV1::eraseMember(const uint64_t networkId, const uint64_t memberId)
 
 void CV1::nodeIsOnline(const uint64_t networkId, const uint64_t memberId, const InetAddress& physicalAddress, const char* osArch)
 {
+	auto provider = opentelemetry::trace::Provider::GetTracerProvider();
+	auto tracer = provider->GetTracer("cv1");
+	auto span = tracer->StartSpan("cv1::nodeIsOnline");
+	auto scope = tracer->WithActiveSpan(span);
+	char networkIdStr[17];
+	char memberIdStr[11];
+	char ipStr[INET6_ADDRSTRLEN];
+	span->SetAttribute("network_id", Utils::hex(networkId, networkIdStr));
+	span->SetAttribute("member_id", Utils::hex10(memberId, memberIdStr));
+	span->SetAttribute("physical_address", physicalAddress.toString(ipStr));
+	span->SetAttribute("os_arch", osArch);
+
 	std::lock_guard<std::mutex> l(_lastOnline_l);
 	NodeOnlineRecord& i = _lastOnline[std::pair<uint64_t, uint64_t>(networkId, memberId)];
 	i.lastSeen = OSUtils::now();
@@ -305,6 +354,11 @@ void CV1::nodeIsOnline(const uint64_t networkId, const uint64_t memberId, const
 
 AuthInfo CV1::getSSOAuthInfo(const nlohmann::json& member, const std::string& redirectURL)
 {
+	auto provider = opentelemetry::trace::Provider::GetTracerProvider();
+	auto tracer = provider->GetTracer("cv1");
+	auto span = tracer->StartSpan("cv1::getSSOAuthInfo");
+	auto scope = tracer->WithActiveSpan(span);
+
 	Metrics::db_get_sso_info++;
 	// NONCE is just a random character string.  no semantic meaning
 	// state = HMAC SHA384 of Nonce based on shared sso key
@@ -476,6 +530,7 @@ AuthInfo CV1::getSSOAuthInfo(const nlohmann::json& member, const std::string& re
 		_pool->unborrow(c);
 	}
 	catch (std::exception& e) {
+		span->SetStatus(opentelemetry::trace::StatusCode::kError, e.what());
 		fprintf(stderr, "ERROR: Error updating member on load for network %s: %s\n", networkId.c_str(), e.what());
 	}
 
@@ -484,6 +539,11 @@ AuthInfo CV1::getSSOAuthInfo(const nlohmann::json& member, const std::string& re
 
 void CV1::initializeNetworks()
 {
+	auto provider = opentelemetry::trace::Provider::GetTracerProvider();
+	auto tracer = provider->GetTracer("cv1");
+	auto span = tracer->StartSpan("cv1::initializeNetworks");
+	auto scope = tracer->WithActiveSpan(span);
+
 	try {
 		std::string setKey = "networks:{" + _myAddressStr + "}";
 
@@ -756,11 +816,13 @@ void CV1::initializeNetworks()
 		fprintf(stderr, "network init done.\n");
 	}
 	catch (sw::redis::Error& e) {
+		span->SetStatus(opentelemetry::trace::StatusCode::kError, e.what());
 		fprintf(stderr, "ERROR: Error initializing networks in Redis: %s\n", e.what());
 		std::this_thread::sleep_for(std::chrono::milliseconds(5000));
 		exit(-1);
 	}
 	catch (std::exception& e) {
+		span->SetStatus(opentelemetry::trace::StatusCode::kError, e.what());
 		fprintf(stderr, "ERROR: Error initializing networks: %s\n", e.what());
 		std::this_thread::sleep_for(std::chrono::milliseconds(5000));
 		exit(-1);
@@ -769,6 +831,11 @@ void CV1::initializeNetworks()
 
 void CV1::initializeMembers()
 {
+	auto provider = opentelemetry::trace::Provider::GetTracerProvider();
+	auto tracer = provider->GetTracer("cv1");
+	auto span = tracer->StartSpan("cv1::initializeMembers");
+	auto scope = tracer->WithActiveSpan(span);
+
 	std::string memberId;
 	std::string networkId;
 	try {
@@ -1024,10 +1091,12 @@ void CV1::initializeMembers()
 		}
 	}
 	catch (sw::redis::Error& e) {
+		span->SetStatus(opentelemetry::trace::StatusCode::kError, e.what());
 		fprintf(stderr, "ERROR: Error initializing members (redis): %s\n", e.what());
 		exit(-1);
 	}
 	catch (std::exception& e) {
+		span->SetStatus(opentelemetry::trace::StatusCode::kError, e.what());
 		fprintf(stderr, "ERROR: Error initializing member: %s-%s %s\n", networkId.c_str(), memberId.c_str(), e.what());
 		exit(-1);
 	}
@@ -1054,6 +1123,11 @@ void CV1::heartbeat()
 	const char* hostname = hostnameTmp;
 
 	while (_run == 1) {
+		auto provider = opentelemetry::trace::Provider::GetTracerProvider();
+		auto tracer = provider->GetTracer("cv1");
+		auto span = tracer->StartSpan("cv1::heartbeat");
+		auto scope = tracer->WithActiveSpan(span);
+
 		// fprintf(stderr, "%s: heartbeat\n", controllerId);
 		auto c = _pool->borrow();
 		int64_t ts = OSUtils::now();
@@ -1085,6 +1159,7 @@ void CV1::heartbeat()
 			}
 			catch (std::exception& e) {
 				fprintf(stderr, "%s: Heartbeat update failed: %s\n", controllerId, e.what());
+				span->End();
 				std::this_thread::sleep_for(std::chrono::milliseconds(1000));
 				continue;
 			}
@@ -1105,6 +1180,7 @@ void CV1::heartbeat()
 			fprintf(stderr, "ERROR: Redis error in heartbeat thread: %s\n", e.what());
 		}
 
+		span->End();
 		std::this_thread::sleep_for(std::chrono::milliseconds(1000));
 	}
 	fprintf(stderr, "Exited heartbeat thread\n");
@@ -1133,7 +1209,7 @@ void CV1::_membersWatcher_Postgres()
 	std::string stream = "member_" + _myAddressStr;
 
 	fprintf(stderr, "Listening to member stream: %s\n", stream.c_str());
-	MemberNotificationReceiver m(this, *c->c, stream);
+	MemberNotificationReceiver<CV1> m(this, *c->c, stream);
 
 	while (_run == 1) {
 		c->c->await_notification(5, 0);
@@ -1149,6 +1225,11 @@ void CV1::_membersWatcher_Redis()
 	std::string lastID = "0";
 	fprintf(stderr, "Listening to member stream: %s\n", key.c_str());
 	while (_run == 1) {
+		auto provider = opentelemetry::trace::Provider::GetTracerProvider();
+		auto tracer = provider->GetTracer("cv1");
+		auto span = tracer->StartSpan("cv1::_membersWatcher_Redis");
+		auto scope = tracer->WithActiveSpan(span);
+
 		try {
 			json tmp;
 			std::unordered_map<std::string, ItemStream> result;
@@ -1204,6 +1285,7 @@ void CV1::_membersWatcher_Redis()
 			}
 		}
 		catch (sw::redis::Error& e) {
+			span->SetStatus(opentelemetry::trace::StatusCode::kError, e.what());
 			fprintf(stderr, "Error in Redis members watcher: %s\n", e.what());
 		}
 	}
@@ -1234,9 +1316,14 @@ void CV1::_networksWatcher_Postgres()
 
 	auto c = _pool->borrow();
 
-	NetworkNotificationReceiver n(this, *c->c, stream);
+	NetworkNotificationReceiver<CV1> n(this, *c->c, stream);
 
 	while (_run == 1) {
+		auto provider = opentelemetry::trace::Provider::GetTracerProvider();
+		auto tracer = provider->GetTracer("cv1");
+		auto span = tracer->StartSpan("cv1::_networksWatcher_Postgres");
+		auto scope = tracer->WithActiveSpan(span);
+
 		c->c->await_notification(5, 0);
 	}
 }
@@ -1247,6 +1334,11 @@ void CV1::_networksWatcher_Redis()
 	std::string key = "network-stream:{" + std::string(_myAddress.toString(buf)) + "}";
 	std::string lastID = "0";
 	while (_run == 1) {
+		auto provider = opentelemetry::trace::Provider::GetTracerProvider();
+		auto tracer = provider->GetTracer("cv1");
+		auto span = tracer->StartSpan("cv1::_networksWatcher_Redis");
+		auto scope = tracer->WithActiveSpan(span);
+
 		try {
 			json tmp;
 			std::unordered_map<std::string, ItemStream> result;
@@ -1303,6 +1395,7 @@ void CV1::_networksWatcher_Redis()
 			}
 		}
 		catch (sw::redis::Error& e) {
+			span->SetStatus(opentelemetry::trace::StatusCode::kError, e.what());
 			fprintf(stderr, "Error in Redis networks watcher: %s\n", e.what());
 		}
 	}
@@ -1314,6 +1407,11 @@ void CV1::commitThread()
 	fprintf(stderr, "%s: commitThread start\n", _myAddressStr.c_str());
 	std::pair<nlohmann::json, bool> qitem;
 	while (_commitQueue.get(qitem) & (_run == 1)) {
+		auto provider = opentelemetry::trace::Provider::GetTracerProvider();
+		auto tracer = provider->GetTracer("cv1");
+		auto span = tracer->StartSpan("cv1::commitThread");
+		auto scope = tracer->WithActiveSpan(span);
+
 		// fprintf(stderr, "commitThread tick\n");
 		if (! qitem.first.is_object()) {
 			fprintf(stderr, "not an object\n");
@@ -1339,6 +1437,9 @@ void CV1::commitThread()
 			nlohmann::json& config = (qitem.first);
 			const std::string objtype = config["objtype"];
 			if (objtype == "member") {
+				auto mspan = tracer->StartSpan("cv1::commitThread::member");
+				auto mscope = tracer->WithActiveSpan(mspan);
+
 				// fprintf(stderr, "%s: commitThread: member\n", _myAddressStr.c_str());
 				std::string memberId;
 				std::string networkId;
@@ -1486,9 +1587,13 @@ void CV1::commitThread()
 				}
 				catch (std::exception& e) {
 					fprintf(stderr, "%s ERROR: Error updating member %s-%s: %s\n", _myAddressStr.c_str(), networkId.c_str(), memberId.c_str(), e.what());
+					mspan->SetStatus(opentelemetry::trace::StatusCode::kError, e.what());
 				}
 			}
 			else if (objtype == "network") {
+				auto nspan = tracer->StartSpan("cv1::commitThread::network");
+				auto nscope = tracer->WithActiveSpan(nspan);
+
 				try {
 					// fprintf(stderr, "%s: commitThread: network\n", _myAddressStr.c_str());
 					pqxx::work w(*c->c);
@@ -1624,6 +1729,7 @@ void CV1::commitThread()
 					}
 				}
 				catch (std::exception& e) {
+					nspan->SetStatus(opentelemetry::trace::StatusCode::kError, e.what());
 					fprintf(stderr, "%s ERROR: Error updating network: %s\n", _myAddressStr.c_str(), e.what());
 				}
 				if (_redisMemberStatus) {
@@ -1639,11 +1745,15 @@ void CV1::commitThread()
 						}
 					}
 					catch (sw::redis::Error& e) {
+						nspan->SetStatus(opentelemetry::trace::StatusCode::kError, e.what());
 						fprintf(stderr, "ERROR: Error adding network to Redis: %s\n", e.what());
 					}
 				}
 			}
 			else if (objtype == "_delete_network") {
+				auto dspan = tracer->StartSpan("cv1::commitThread::_delete_network");
+				auto dscope = tracer->WithActiveSpan(dspan);
+
 				// fprintf(stderr, "%s: commitThread: delete network\n", _myAddressStr.c_str());
 				try {
 					pqxx::work w(*c->c);
@@ -1655,6 +1765,7 @@ void CV1::commitThread()
 					w.commit();
 				}
 				catch (std::exception& e) {
+					dspan->SetStatus(opentelemetry::trace::StatusCode::kError, e.what());
 					fprintf(stderr, "%s ERROR: Error deleting network: %s\n", _myAddressStr.c_str(), e.what());
 				}
 				if (_redisMemberStatus) {
@@ -1672,11 +1783,15 @@ void CV1::commitThread()
 						}
 					}
 					catch (sw::redis::Error& e) {
+						dspan->SetStatus(opentelemetry::trace::StatusCode::kError, e.what());
 						fprintf(stderr, "ERROR: Error adding network to Redis: %s\n", e.what());
 					}
 				}
 			}
 			else if (objtype == "_delete_member") {
+				auto mspan = tracer->StartSpan("cv1::commitThread::_delete_member");
+				auto mscope = tracer->WithActiveSpan(mspan);
+
 				// fprintf(stderr, "%s commitThread: delete member\n", _myAddressStr.c_str());
 				try {
 					pqxx::work w(*c->c);
@@ -1689,6 +1804,7 @@ void CV1::commitThread()
 					w.commit();
 				}
 				catch (std::exception& e) {
+					mspan->SetStatus(opentelemetry::trace::StatusCode::kError, e.what());
 					fprintf(stderr, "%s ERROR: Error deleting member: %s\n", _myAddressStr.c_str(), e.what());
 				}
 				if (_redisMemberStatus) {
@@ -1707,6 +1823,7 @@ void CV1::commitThread()
 						}
 					}
 					catch (sw::redis::Error& e) {
+						mspan->SetStatus(opentelemetry::trace::StatusCode::kError, e.what());
 						fprintf(stderr, "ERROR: Error deleting member from Redis: %s\n", e.what());
 					}
 				}
@@ -1716,6 +1833,7 @@ void CV1::commitThread()
 			}
 		}
 		catch (std::exception& e) {
+			span->SetStatus(opentelemetry::trace::StatusCode::kError, e.what());
 			fprintf(stderr, "%s ERROR: Error getting objtype: %s\n", _myAddressStr.c_str(), e.what());
 		}
 		_pool->unborrow(c);
@@ -1727,6 +1845,11 @@ void CV1::commitThread()
 
 void CV1::notifyNewMember(const std::string& networkID, const std::string& memberID)
 {
+	auto provider = opentelemetry::trace::Provider::GetTracerProvider();
+	auto tracer = provider->GetTracer("cv1");
+	auto span = tracer->StartSpan("cv1::notifyNewMember");
+	auto scope = tracer->WithActiveSpan(span);
+
 	smeeclient::smee_client_notify_network_joined(_smee, networkID.c_str(), memberID.c_str());
 }
 
@@ -1756,6 +1879,11 @@ void CV1::onlineNotification_Postgres()
 
 	nlohmann::json jtmp1, jtmp2;
 	while (_run == 1) {
+		auto provider = opentelemetry::trace::Provider::GetTracerProvider();
+		auto tracer = provider->GetTracer("cv1");
+		auto span = tracer->StartSpan("cv1::onlineNotification_Postgres");
+		auto scope = tracer->WithActiveSpan(span);
+
 		auto c = _pool->borrow();
 		auto c2 = _pool->borrow();
 		try {
@@ -1839,6 +1967,8 @@ void CV1::onlineNotification_Postgres()
 		ConnectionPoolStats stats = _pool->get_stats();
 		fprintf(stderr, "%s pool stats: in use size: %llu, available size: %llu, total: %llu\n", _myAddressStr.c_str(), stats.borrowed_size, stats.pool_size, (stats.borrowed_size + stats.pool_size));
 
+		span->End();
+
 		std::this_thread::sleep_for(std::chrono::seconds(10));
 	}
 	fprintf(stderr, "%s: Fell out of run loop in onlineNotificationThread\n", _myAddressStr.c_str());
@@ -1856,6 +1986,11 @@ void CV1::onlineNotification_Redis()
 	std::string controllerId = std::string(_myAddress.toString(buf));
 
 	while (_run == 1) {
+		auto provider = opentelemetry::trace::Provider::GetTracerProvider();
+		auto tracer = provider->GetTracer("cv1");
+		auto span = tracer->StartSpan("cv1::onlineNotification_Redis");
+		auto scope = tracer->WithActiveSpan(span);
+
 		fprintf(stderr, "onlineNotification tick\n");
 		auto start = std::chrono::high_resolution_clock::now();
 		uint64_t count = 0;
@@ -1886,14 +2021,19 @@ void CV1::onlineNotification_Redis()
 		auto total = dur.count();
 
 		fprintf(stderr, "onlineNotification ran in %llu ms\n", total);
+		span->End();
 
 		std::this_thread::sleep_for(std::chrono::seconds(5));
 	}
 }
 
 uint64_t CV1::_doRedisUpdate(sw::redis::Transaction& tx, std::string& controllerId, std::unordered_map<std::pair<uint64_t, uint64_t>, NodeOnlineRecord, _PairHasher>& lastOnline)
-
 {
+	auto provider = opentelemetry::trace::Provider::GetTracerProvider();
+	auto tracer = provider->GetTracer("cv1");
+	auto span = tracer->StartSpan("cv1::_doRedisUpdate");
+	auto scope = tracer->WithActiveSpan(span);
+
 	nlohmann::json jtmp1, jtmp2;
 	uint64_t count = 0;
 	for (auto i = lastOnline.begin(); i != lastOnline.end(); ++i) {

+ 3 - 0
controller/CV1.hpp

@@ -43,6 +43,9 @@ struct RedisConfig;
  * but be aware that we might change it at any time.
  */
 class CV1 : public DB {
+	friend class MemberNotificationReceiver<CV1>;
+	friend class NetworkNotificationReceiver<CV1>;
+
   public:
 	CV1(const Identity& myId, const char* path, int listenPort, RedisConfig* rc);
 	virtual ~CV1();

+ 153 - 13
controller/CV2.cpp

@@ -20,6 +20,7 @@
 #include "../version.h"
 #include "CtlUtil.hpp"
 #include "EmbeddedNetworkController.hpp"
+#include "opentelemetry/trace/provider.h"
 
 #include <chrono>
 #include <climits>
@@ -37,6 +38,11 @@ using namespace ZeroTier;
 
 CV2::CV2(const Identity& myId, const char* path, int listenPort) : DB(), _pool(), _myId(myId), _myAddress(myId.address()), _ready(0), _connected(1), _run(1), _waitNoticePrinted(false), _listenPort(listenPort)
 {
+	auto provider = opentelemetry::trace::Provider::GetTracerProvider();
+	auto tracer = provider->GetTracer("cv2");
+	auto span = tracer->StartSpan("cv2::CV2");
+	auto scope = tracer->WithActiveSpan(span);
+
 	fprintf(stderr, "CV2::CV2\n");
 	char myAddress[64];
 	_myAddressStr = myId.address().toString(myAddress);
@@ -104,8 +110,23 @@ bool CV2::isReady()
 	return (_ready == 2) && _connected;
 }
 
+void CV2::_memberChanged(nlohmann::json& old, nlohmann::json& memberConfig, bool notifyListeners)
+{
+	DB::_memberChanged(old, memberConfig, notifyListeners);
+}
+
+void CV2::_networkChanged(nlohmann::json& old, nlohmann::json& networkConfig, bool notifyListeners)
+{
+	DB::_networkChanged(old, networkConfig, notifyListeners);
+}
+
 bool CV2::save(nlohmann::json& record, bool notifyListeners)
 {
+	auto provider = opentelemetry::trace::Provider::GetTracerProvider();
+	auto tracer = provider->GetTracer("cv2");
+	auto span = tracer->StartSpan("cv2::save");
+	auto scope = tracer->WithActiveSpan(span);
+
 	bool modified = false;
 	try {
 		if (! record.is_object()) {
@@ -114,6 +135,9 @@ bool CV2::save(nlohmann::json& record, bool notifyListeners)
 		}
 		const std::string objtype = record["objtype"];
 		if (objtype == "network") {
+			auto nspan = tracer->StartSpan("cv2::save::network");
+			auto nscope = tracer->WithActiveSpan(nspan);
+
 			// fprintf(stderr, "network save\n");
 			const uint64_t nwid = OSUtils::jsonIntHex(record["id"], 0ULL);
 			if (nwid) {
@@ -127,6 +151,9 @@ bool CV2::save(nlohmann::json& record, bool notifyListeners)
 			}
 		}
 		else if (objtype == "member") {
+			auto mspan = tracer->StartSpan("cv2::save::member");
+			auto mscope = tracer->WithActiveSpan(mspan);
+
 			std::string networkId = record["nwid"];
 			std::string memberId = record["id"];
 			const uint64_t nwid = OSUtils::jsonIntHex(record["nwid"], 0ULL);
@@ -161,21 +188,36 @@ bool CV2::save(nlohmann::json& record, bool notifyListeners)
 
 void CV2::eraseNetwork(const uint64_t networkId)
 {
-	fprintf(stderr, "PostgreSQL::eraseNetwork\n");
-	char tmp2[24];
+	auto provider = opentelemetry::trace::Provider::GetTracerProvider();
+	auto tracer = provider->GetTracer("cv2");
+	auto span = tracer->StartSpan("cv2::eraseNetwork");
+	auto scope = tracer->WithActiveSpan(span);
+	char networkIdStr[17];
+	std::string nwid = Utils::hex(networkId, networkIdStr);
+	span->SetAttribute("network_id", nwid);
+
+	fprintf(stderr, "CV2::eraseNetwork\n");
 	waitForReady();
-	Utils::hex(networkId, tmp2);
 	std::pair<nlohmann::json, bool> tmp;
-	tmp.first["id"] = tmp2;
+	tmp.first["id"] = nwid;
 	tmp.first["objtype"] = "_delete_network";
 	tmp.second = true;
 	_commitQueue.post(tmp);
-	nlohmann::json nullJson;
-	_networkChanged(tmp.first, nullJson, true);
+	// nlohmann::json nullJson;
+	//_networkChanged(tmp.first, nullJson, isReady());
 }
 
 void CV2::eraseMember(const uint64_t networkId, const uint64_t memberId)
 {
+	auto provider = opentelemetry::trace::Provider::GetTracerProvider();
+	auto tracer = provider->GetTracer("cv2");
+	auto span = tracer->StartSpan("cv2::eraseMember");
+	auto scope = tracer->WithActiveSpan(span);
+	char networkIdStr[17];
+	char memberIdStr[11];
+	span->SetAttribute("network_id", Utils::hex(networkId, networkIdStr));
+	span->SetAttribute("member_id", Utils::hex10(memberId, memberIdStr));
+
 	fprintf(stderr, "PostgreSQL::eraseMember\n");
 	char tmp2[24];
 	waitForReady();
@@ -187,12 +229,24 @@ void CV2::eraseMember(const uint64_t networkId, const uint64_t memberId)
 	tmp.first["objtype"] = "_delete_member";
 	tmp.second = true;
 	_commitQueue.post(tmp);
-	nlohmann::json nullJson;
-	_memberChanged(tmp.first, nullJson, true);
+	// nlohmann::json nullJson;
+	//_memberChanged(tmp.first, nullJson, isReady());
 }
 
 void CV2::nodeIsOnline(const uint64_t networkId, const uint64_t memberId, const InetAddress& physicalAddress, const char* osArch)
 {
+	auto provider = opentelemetry::trace::Provider::GetTracerProvider();
+	auto tracer = provider->GetTracer("cv2");
+	auto span = tracer->StartSpan("cv2::nodeIsOnline");
+	auto scope = tracer->WithActiveSpan(span);
+	char networkIdStr[17];
+	char memberIdStr[11];
+	char ipAddressStr[INET6_ADDRSTRLEN];
+	span->SetAttribute("network_id", Utils::hex(networkId, networkIdStr));
+	span->SetAttribute("member_id", Utils::hex10(memberId, memberIdStr));
+	span->SetAttribute("physical_address", ipAddressStr);
+	span->SetAttribute("os_arch", osArch);
+
 	std::lock_guard<std::mutex> l(_lastOnline_l);
 	NodeOnlineRecord& i = _lastOnline[std::pair<uint64_t, uint64_t>(networkId, memberId)];
 	i.lastSeen = OSUtils::now();
@@ -210,6 +264,10 @@ void CV2::nodeIsOnline(const uint64_t networkId, const uint64_t memberId, const
 AuthInfo CV2::getSSOAuthInfo(const nlohmann::json& member, const std::string& redirectURL)
 {
 	// TODO: Redo this for CV2
+	auto provider = opentelemetry::trace::Provider::GetTracerProvider();
+	auto tracer = provider->GetTracer("cv2");
+	auto span = tracer->StartSpan("cv2::getSSOAuthInfo");
+	auto scope = tracer->WithActiveSpan(span);
 
 	Metrics::db_get_sso_info++;
 	// NONCE is just a random character string.  no semantic meaning
@@ -365,6 +423,7 @@ AuthInfo CV2::getSSOAuthInfo(const nlohmann::json& member, const std::string& re
 	}
 	catch (std::exception& e) {
 		fprintf(stderr, "ERROR: Error updating member on load for network %s: %s\n", networkId.c_str(), e.what());
+		span->SetStatus(opentelemetry::trace::StatusCode::kError, e.what());
 	}
 
 	return info;   // std::string(authenticationURL);
@@ -372,6 +431,11 @@ AuthInfo CV2::getSSOAuthInfo(const nlohmann::json& member, const std::string& re
 
 void CV2::initializeNetworks()
 {
+	auto provider = opentelemetry::trace::Provider::GetTracerProvider();
+	auto tracer = provider->GetTracer("cv2");
+	auto span = tracer->StartSpan("cv2::initializeNetworks");
+	auto scope = tracer->WithActiveSpan(span);
+
 	fprintf(stderr, "Initializing networks...\n");
 
 	try {
@@ -494,6 +558,7 @@ void CV2::initializeNetworks()
 	}
 	catch (std::exception& e) {
 		fprintf(stderr, "ERROR: Error initializing networks: %s\n", e.what());
+		span->SetStatus(opentelemetry::trace::StatusCode::kError, e.what());
 		std::this_thread::sleep_for(std::chrono::milliseconds(5000));
 		exit(-1);
 	}
@@ -501,6 +566,11 @@ void CV2::initializeNetworks()
 
 void CV2::initializeMembers()
 {
+	auto provider = opentelemetry::trace::Provider::GetTracerProvider();
+	auto tracer = provider->GetTracer("cv2");
+	auto span = tracer->StartSpan("cv2::initializeMembers");
+	auto scope = tracer->WithActiveSpan(span);
+
 	std::string memberId;
 	std::string networkId;
 	try {
@@ -647,6 +717,7 @@ void CV2::initializeMembers()
 	}
 	catch (std::exception& e) {
 		fprintf(stderr, "ERROR: Error initializing member: %s-%s %s\n", networkId.c_str(), memberId.c_str(), e.what());
+		span->SetStatus(opentelemetry::trace::StatusCode::kError, e.what());
 		exit(-1);
 	}
 }
@@ -672,6 +743,11 @@ void CV2::heartbeat()
 	const char* hostname = hostnameTmp;
 
 	while (_run == 1) {
+		auto provider = opentelemetry::trace::Provider::GetTracerProvider();
+		auto tracer = provider->GetTracer("cv2");
+		auto span = tracer->StartSpan("cv2::heartbeat");
+		auto scope = tracer->WithActiveSpan(span);
+
 		auto c = _pool->borrow();
 		int64_t ts = OSUtils::now();
 
@@ -698,15 +774,18 @@ void CV2::heartbeat()
 			}
 			catch (std::exception& e) {
 				fprintf(stderr, "ERROR: Error in heartbeat: %s\n", e.what());
+				span->SetStatus(opentelemetry::trace::StatusCode::kError, e.what());
 				continue;
 			}
 			catch (...) {
 				fprintf(stderr, "ERROR: Unknown error in heartbeat\n");
+				span->SetStatus(opentelemetry::trace::StatusCode::kError, "Unknown error in heartbeat");
 				continue;
 			}
 		}
 
 		_pool->unborrow(c);
+		span->End();
 
 		std::this_thread::sleep_for(std::chrono::seconds(1));
 	}
@@ -720,7 +799,7 @@ void CV2::membersDbWatcher()
 	std::string stream = "member_" + _myAddressStr;
 
 	fprintf(stderr, "Listening to member stream: %s\n", stream.c_str());
-	MemberNotificationReceiver m(this, *c->c, stream);
+	MemberNotificationReceiver<CV2> m(this, *c->c, stream);
 
 	while (_run == 1) {
 		c->c->await_notification(5, 0);
@@ -739,7 +818,7 @@ void CV2::networksDbWatcher()
 
 	auto c = _pool->borrow();
 
-	NetworkNotificationReceiver n(this, *c->c, stream);
+	NetworkNotificationReceiver<CV2> n(this, *c->c, stream);
 
 	while (_run == 1) {
 		c->c->await_notification(5, 0);
@@ -754,6 +833,11 @@ void CV2::commitThread()
 	fprintf(stderr, "%s: commitThread start\n", _myAddressStr.c_str());
 	std::pair<nlohmann::json, bool> qitem;
 	while (_commitQueue.get(qitem) && (_run == 1)) {
+		auto provider = opentelemetry::trace::Provider::GetTracerProvider();
+		auto tracer = provider->GetTracer("cv2");
+		auto span = tracer->StartSpan("cv2::commitThread");
+		auto scope = tracer->WithActiveSpan(span);
+
 		// fprintf(stderr, "commitThread tick\n");
 		if (! qitem.first.is_object()) {
 			fprintf(stderr, "not an object\n");
@@ -779,6 +863,9 @@ void CV2::commitThread()
 			nlohmann::json& config = (qitem.first);
 			const std::string objtype = config["objtype"];
 			if (objtype == "member") {
+				auto mspan = tracer->StartSpan("cv2::commitThread::member");
+				auto mscope = tracer->WithActiveSpan(span);
+
 				// fprintf(stderr, "%s: commitThread: member\n", _myAddressStr.c_str());
 				std::string memberId;
 				std::string networkId;
@@ -896,13 +983,22 @@ void CV2::commitThread()
 					if (s) {
 						fprintf(stderr, "%s ERROR: SQL error: %s\n", _myAddressStr.c_str(), s->query().c_str());
 					}
+					mspan->SetStatus(opentelemetry::trace::StatusCode::kError, "pqxx::data_exception");
+					mspan->SetAttribute("error", e.what());
+					mspan->SetAttribute("config", cfgDump);
 				}
 				catch (std::exception& e) {
 					std::string cfgDump = OSUtils::jsonDump(config, 2);
 					fprintf(stderr, "%s ERROR: Error updating member %s-%s: %s\njsonDump: %s\n", _myAddressStr.c_str(), networkId.c_str(), memberId.c_str(), e.what(), cfgDump.c_str());
+					mspan->SetStatus(opentelemetry::trace::StatusCode::kError, "std::exception");
+					mspan->SetAttribute("error", e.what());
+					mspan->SetAttribute("config", cfgDump);
 				}
 			}
 			else if (objtype == "network") {
+				auto nspan = tracer->StartSpan("cv2::commitThread::network");
+				auto nscope = tracer->WithActiveSpan(span);
+
 				try {
 					// fprintf(stderr, "%s: commitThread: network\n", _myAddressStr.c_str());
 					pqxx::work w(*c->c);
@@ -942,29 +1038,48 @@ void CV2::commitThread()
 					if (s) {
 						fprintf(stderr, "%s ERROR: SQL error: %s\n", _myAddressStr.c_str(), s->query().c_str());
 					}
+					nspan->SetStatus(opentelemetry::trace::StatusCode::kError, "pqxx::data_exception");
+					nspan->SetAttribute("error", e.what());
+					nspan->SetAttribute("config", OSUtils::jsonDump(config, 2));
 				}
 				catch (std::exception& e) {
 					fprintf(stderr, "%s ERROR: Error updating network: %s\n", _myAddressStr.c_str(), e.what());
+					nspan->SetStatus(opentelemetry::trace::StatusCode::kError, "std::exception");
+					nspan->SetAttribute("error", e.what());
+					nspan->SetAttribute("config", OSUtils::jsonDump(config, 2));
 				}
 			}
 			else if (objtype == "_delete_network") {
+				auto dspan = tracer->StartSpan("cv2::commitThread::delete_network");
+				auto dscope = tracer->WithActiveSpan(span);
+
 				// fprintf(stderr, "%s: commitThread: delete network\n", _myAddressStr.c_str());
 				try {
-					// don't think we need this. Deletion handled by CV2 API
-
 					pqxx::work w(*c->c);
 					std::string networkId = config["id"];
-
+					fprintf(stderr, "Deleting network %s\n", networkId.c_str());
 					w.exec_params0("DELETE FROM network_memberships_ctl WHERE network_id = $1", networkId);
 					w.exec_params0("DELETE FROM networks_ctl WHERE id = $1", networkId);
 
 					w.commit();
+
+					uint64_t nwidInt = OSUtils::jsonIntHex(config["nwid"], 0ULL);
+					json oldConfig;
+					get(nwidInt, oldConfig);
+					json empty;
+					_networkChanged(oldConfig, empty, qitem.second);
 				}
 				catch (std::exception& e) {
 					fprintf(stderr, "%s ERROR: Error deleting network: %s\n", _myAddressStr.c_str(), e.what());
+					dspan->SetStatus(opentelemetry::trace::StatusCode::kError, "std::exception");
+					dspan->SetAttribute("error", e.what());
+					dspan->SetAttribute("config", OSUtils::jsonDump(config, 2));
 				}
 			}
 			else if (objtype == "_delete_member") {
+				auto dspan = tracer->StartSpan("cv2::commitThread::delete_member");
+				auto dscope = tracer->WithActiveSpan(span);
+
 				// fprintf(stderr, "%s commitThread: delete member\n", _myAddressStr.c_str());
 				try {
 					pqxx::work w(*c->c);
@@ -975,9 +1090,22 @@ void CV2::commitThread()
 					pqxx::result res = w.exec_params0("DELETE FROM network_memberships_ctl WHERE device_id = $1 AND network_id = $2", memberId, networkId);
 
 					w.commit();
+
+					uint64_t nwidInt = OSUtils::jsonIntHex(config["nwid"], 0ULL);
+					uint64_t memberidInt = OSUtils::jsonIntHex(config["id"], 0ULL);
+
+					nlohmann::json networkConfig;
+					nlohmann::json oldConfig;
+
+					get(nwidInt, networkConfig, memberidInt, oldConfig);
+					json empty;
+					_memberChanged(oldConfig, empty, qitem.second);
 				}
 				catch (std::exception& e) {
 					fprintf(stderr, "%s ERROR: Error deleting member: %s\n", _myAddressStr.c_str(), e.what());
+					dspan->SetStatus(opentelemetry::trace::StatusCode::kError, "std::exception");
+					dspan->SetAttribute("error", e.what());
+					dspan->SetAttribute("config", OSUtils::jsonDump(config, 2));
 				}
 			}
 			else {
@@ -986,6 +1114,8 @@ void CV2::commitThread()
 		}
 		catch (std::exception& e) {
 			fprintf(stderr, "%s ERROR: Error getting objtype: %s\n", _myAddressStr.c_str(), e.what());
+			span->SetStatus(opentelemetry::trace::StatusCode::kError, "std::exception");
+			span->SetAttribute("error", e.what());
 		}
 		_pool->unborrow(c);
 		c.reset();
@@ -1002,6 +1132,11 @@ void CV2::onlineNotificationThread()
 
 	nlohmann::json jtmp1, jtmp2;
 	while (_run == 1) {
+		auto provider = opentelemetry::trace::Provider::GetTracerProvider();
+		auto tracer = provider->GetTracer("cv2");
+		auto span = tracer->StartSpan("cv2::onlineNotificationThread");
+		auto scope = tracer->WithActiveSpan(span);
+
 		auto c = _pool->borrow();
 		auto c2 = _pool->borrow();
 
@@ -1086,12 +1221,17 @@ void CV2::onlineNotificationThread()
 		}
 		catch (std::exception& e) {
 			fprintf(stderr, "%s ERROR: Error in onlineNotificationThread: %s\n", _myAddressStr.c_str(), e.what());
+			span->SetStatus(opentelemetry::trace::StatusCode::kError, "std::exception");
+			span->SetAttribute("error", e.what());
 		}
 		catch (...) {
 			fprintf(stderr, "%s ERROR: Unknown error in onlineNotificationThread\n", _myAddressStr.c_str());
+			span->SetStatus(opentelemetry::trace::StatusCode::kError, "unknown");
 		}
 		_pool->unborrow(c2);
 		_pool->unborrow(c);
+		span->End();
+
 		std::this_thread::sleep_for(std::chrono::seconds(10));
 	}
 

+ 5 - 8
controller/CV2.hpp

@@ -31,6 +31,9 @@
 namespace ZeroTier {
 
 class CV2 : public DB {
+	friend class MemberNotificationReceiver<CV2>;
+	friend class NetworkNotificationReceiver<CV2>;
+
   public:
 	CV2(const Identity& myId, const char* path, int listenPort);
 	virtual ~CV2();
@@ -56,15 +59,9 @@ class CV2 : public DB {
 			return (std::size_t)(p.first ^ p.second);
 		}
 	};
-	virtual void _memberChanged(nlohmann::json& old, nlohmann::json& memberConfig, bool notifyListeners)
-	{
-		DB::_memberChanged(old, memberConfig, notifyListeners);
-	}
+	virtual void _memberChanged(nlohmann::json& old, nlohmann::json& memberConfig, bool notifyListeners);
 
-	virtual void _networkChanged(nlohmann::json& old, nlohmann::json& networkConfig, bool notifyListeners)
-	{
-		DB::_networkChanged(old, networkConfig, notifyListeners);
-	}
+	virtual void _networkChanged(nlohmann::json& old, nlohmann::json& networkConfig, bool notifyListeners);
 
   private:
 	void initializeNetworks();

+ 15 - 0
controller/ConnectionPool.hpp

@@ -19,6 +19,7 @@
 #endif
 
 #include "../node/Metrics.hpp"
+#include "opentelemetry/trace/provider.h"
 
 #include <deque>
 #include <exception>
@@ -87,6 +88,11 @@ template <class T> class ConnectionPool {
 	 */
 	std::shared_ptr<T> borrow()
 	{
+		auto provider = opentelemetry::trace::Provider::GetTracerProvider();
+		auto tracer = provider->GetTracer("connection_pool");
+		auto span = tracer->StartSpan("connection_pool::borrow");
+		auto scope = tracer->WithActiveSpan(span);
+
 		std::unique_lock<std::mutex> l(m_poolMutex);
 
 		while ((m_pool.size() + m_borrowed.size()) < m_minPoolSize) {
@@ -104,6 +110,7 @@ template <class T> class ConnectionPool {
 					return std::static_pointer_cast<T>(conn);
 				}
 				catch (std::exception& e) {
+					span->SetStatus(opentelemetry::trace::StatusCode::kError, e.what());
 					Metrics::pool_errors++;
 					throw ConnectionUnavailable();
 				}
@@ -121,12 +128,15 @@ template <class T> class ConnectionPool {
 							return std::static_pointer_cast<T>(conn);
 						}
 						catch (std::exception& e) {
+							span->SetStatus(opentelemetry::trace::StatusCode::kError, e.what());
 							// Error creating a replacement connection
 							Metrics::pool_errors++;
 							throw ConnectionUnavailable();
 						}
 					}
 				}
+
+				span->SetStatus(opentelemetry::trace::StatusCode::kError, "No available connections in pool");
 				// Nothing available
 				Metrics::pool_errors++;
 				throw ConnectionUnavailable();
@@ -151,6 +161,11 @@ template <class T> class ConnectionPool {
 	 */
 	void unborrow(std::shared_ptr<T> conn)
 	{
+		auto provider = opentelemetry::trace::Provider::GetTracerProvider();
+		auto tracer = provider->GetTracer("connection_pool");
+		auto span = tracer->StartSpan("connection_pool::unborrow");
+		auto scope = tracer->WithActiveSpan(span);
+
 		// Lock
 		std::unique_lock<std::mutex> lock(m_poolMutex);
 		m_borrowed.erase(conn);

+ 77 - 0
controller/DB.cpp

@@ -15,6 +15,7 @@
 
 #include "../node/Metrics.hpp"
 #include "EmbeddedNetworkController.hpp"
+#include "opentelemetry/trace/provider.h"
 
 #include <algorithm>
 #include <chrono>
@@ -26,6 +27,11 @@ namespace ZeroTier {
 
 void DB::initNetwork(nlohmann::json& network)
 {
+	auto provider = opentelemetry::trace::Provider::GetTracerProvider();
+	auto tracer = provider->GetTracer("db");
+	auto span = tracer->StartSpan("db::initNetwork");
+	auto scope = tracer->WithActiveSpan(span);
+
 	if (! network.count("private"))
 		network["private"] = true;
 	if (! network.count("creationTime"))
@@ -76,6 +82,11 @@ void DB::initNetwork(nlohmann::json& network)
 
 void DB::initMember(nlohmann::json& member)
 {
+	auto provider = opentelemetry::trace::Provider::GetTracerProvider();
+	auto tracer = provider->GetTracer("db");
+	auto span = tracer->StartSpan("db::initMember");
+	auto scope = tracer->WithActiveSpan(span);
+
 	if (! member.count("authorized"))
 		member["authorized"] = false;
 	if (! member.count("ssoExempt"))
@@ -121,6 +132,11 @@ void DB::initMember(nlohmann::json& member)
 
 void DB::cleanNetwork(nlohmann::json& network)
 {
+	auto provider = opentelemetry::trace::Provider::GetTracerProvider();
+	auto tracer = provider->GetTracer("db");
+	auto span = tracer->StartSpan("db::cleanNetwork");
+	auto scope = tracer->WithActiveSpan(span);
+
 	network.erase("clock");
 	network.erase("authorizedMemberCount");
 	network.erase("activeMemberCount");
@@ -130,6 +146,11 @@ void DB::cleanNetwork(nlohmann::json& network)
 
 void DB::cleanMember(nlohmann::json& member)
 {
+	auto provider = opentelemetry::trace::Provider::GetTracerProvider();
+	auto tracer = provider->GetTracer("db");
+	auto span = tracer->StartSpan("db::cleanMember");
+	auto scope = tracer->WithActiveSpan(span);
+
 	member.erase("clock");
 	member.erase("physicalAddr");
 	member.erase("recentLog");
@@ -148,6 +169,13 @@ DB::~DB()
 
 bool DB::get(const uint64_t networkId, nlohmann::json& network)
 {
+	auto provider = opentelemetry::trace::Provider::GetTracerProvider();
+	auto tracer = provider->GetTracer("db");
+	auto span = tracer->StartSpan("db::getNetwork");
+	auto scope = tracer->WithActiveSpan(span);
+	char networkIdStr[17];
+	span->SetAttribute("network_id", Utils::hex(networkId, networkIdStr));
+
 	waitForReady();
 	Metrics::db_get_network++;
 	std::shared_ptr<_Network> nw;
@@ -167,6 +195,15 @@ bool DB::get(const uint64_t networkId, nlohmann::json& network)
 
 bool DB::get(const uint64_t networkId, nlohmann::json& network, const uint64_t memberId, nlohmann::json& member)
 {
+	auto provider = opentelemetry::trace::Provider::GetTracerProvider();
+	auto tracer = provider->GetTracer("db");
+	auto span = tracer->StartSpan("db::getNetworkAndMember");
+	auto scope = tracer->WithActiveSpan(span);
+	char networkIdStr[17];
+	char memberIdStr[11];
+	span->SetAttribute("network_id", Utils::hex(networkId, networkIdStr));
+	span->SetAttribute("member_id", Utils::hex(networkId, memberIdStr));
+
 	waitForReady();
 	Metrics::db_get_network_and_member++;
 	std::shared_ptr<_Network> nw;
@@ -190,6 +227,15 @@ bool DB::get(const uint64_t networkId, nlohmann::json& network, const uint64_t m
 
 bool DB::get(const uint64_t networkId, nlohmann::json& network, const uint64_t memberId, nlohmann::json& member, NetworkSummaryInfo& info)
 {
+	auto provider = opentelemetry::trace::Provider::GetTracerProvider();
+	auto tracer = provider->GetTracer("db");
+	auto span = tracer->StartSpan("db::getNetworkAndMemberAndSummary");
+	auto scope = tracer->WithActiveSpan(span);
+	char networkIdStr[17];
+	char memberIdStr[11];
+	span->SetAttribute("network_id", Utils::hex(networkId, networkIdStr));
+	span->SetAttribute("member_id", Utils::hex(memberId, memberIdStr));
+
 	waitForReady();
 	Metrics::db_get_network_and_member_and_summary++;
 	std::shared_ptr<_Network> nw;
@@ -209,11 +255,19 @@ bool DB::get(const uint64_t networkId, nlohmann::json& network, const uint64_t m
 			return false;
 		member = m->second;
 	}
+
 	return true;
 }
 
 bool DB::get(const uint64_t networkId, nlohmann::json& network, std::vector<nlohmann::json>& members)
 {
+	auto provider = opentelemetry::trace::Provider::GetTracerProvider();
+	auto tracer = provider->GetTracer("db");
+	auto span = tracer->StartSpan("db::getNetworkAndMembers");
+	auto scope = tracer->WithActiveSpan(span);
+	char networkIdStr[17];
+	span->SetAttribute("network_id", Utils::hex(networkId, networkIdStr));
+
 	waitForReady();
 	Metrics::db_get_member_list++;
 	std::shared_ptr<_Network> nw;
@@ -236,6 +290,11 @@ bool DB::get(const uint64_t networkId, nlohmann::json& network, std::vector<nloh
 
 void DB::networks(std::set<uint64_t>& networks)
 {
+	auto provider = opentelemetry::trace::Provider::GetTracerProvider();
+	auto tracer = provider->GetTracer("db");
+	auto span = tracer->StartSpan("db::networks");
+	auto scope = tracer->WithActiveSpan(span);
+
 	waitForReady();
 	Metrics::db_get_network_list++;
 	std::shared_lock<std::shared_mutex> l(_networks_l);
@@ -245,6 +304,11 @@ void DB::networks(std::set<uint64_t>& networks)
 
 void DB::_memberChanged(nlohmann::json& old, nlohmann::json& memberConfig, bool notifyListeners)
 {
+	auto provider = opentelemetry::trace::Provider::GetTracerProvider();
+	auto tracer = provider->GetTracer("db");
+	auto span = tracer->StartSpan("db::_memberChanged");
+	auto scope = tracer->WithActiveSpan(span);
+
 	Metrics::db_member_change++;
 	uint64_t memberId = 0;
 	uint64_t networkId = 0;
@@ -389,6 +453,14 @@ void DB::_memberChanged(nlohmann::json& old, nlohmann::json& memberConfig, bool
 
 void DB::_networkChanged(nlohmann::json& old, nlohmann::json& networkConfig, bool notifyListeners)
 {
+	auto provider = opentelemetry::trace::Provider::GetTracerProvider();
+	auto tracer = provider->GetTracer("db");
+	auto span = tracer->StartSpan("db::_networkChanged");
+	span->SetAttribute("old_network_config", old.dump());
+	span->SetAttribute("network_config", networkConfig.dump());
+	span->SetAttribute("notify_listeners", notifyListeners);
+	auto scope = tracer->WithActiveSpan(span);
+
 	Metrics::db_network_change++;
 	if (notifyListeners) {
 		if (old.is_object() && old.contains("id") && networkConfig.is_object() && networkConfig.contains("id")) {
@@ -457,6 +529,11 @@ void DB::_networkChanged(nlohmann::json& old, nlohmann::json& networkConfig, boo
 
 void DB::_fillSummaryInfo(const std::shared_ptr<_Network>& nw, NetworkSummaryInfo& info)
 {
+	auto provider = opentelemetry::trace::Provider::GetTracerProvider();
+	auto tracer = provider->GetTracer("db");
+	auto span = tracer->StartSpan("db::_fillSummaryInfo");
+	auto scope = tracer->WithActiveSpan(span);
+
 	for (auto ab = nw->activeBridgeMembers.begin(); ab != nw->activeBridgeMembers.end(); ++ab)
 		info.activeBridges.push_back(Address(*ab));
 	std::sort(info.activeBridges.begin(), info.activeBridges.end());

+ 0 - 4
controller/DB.hpp

@@ -61,10 +61,6 @@ struct AuthInfo {
  * Base class with common infrastructure for all controller DB implementations
  */
 class DB {
-#ifdef ZT_CONTROLLER_USE_LIBPQ
-	friend class MemberNotificationReceiver;
-	friend class NetworkNotificationReceiver;
-#endif
   public:
 	class ChangeListener {
 	  public:

+ 122 - 0
controller/DBMirrorSet.cpp

@@ -13,6 +13,8 @@
 
 #include "DBMirrorSet.hpp"
 
+#include "opentelemetry/trace/provider.h"
+
 namespace ZeroTier {
 
 DBMirrorSet::DBMirrorSet(DB::ChangeListener* listener) : _listener(listener), _running(true), _syncCheckerThread(), _dbs(), _dbs_l()
@@ -25,6 +27,11 @@ DBMirrorSet::DBMirrorSet(DB::ChangeListener* listener) : _listener(listener), _r
 				std::this_thread::sleep_for(std::chrono::milliseconds(500));
 			}
 
+			auto provider = opentelemetry::trace::Provider::GetTracerProvider();
+			auto tracer = provider->GetTracer("db_mirror_set");
+			auto span = tracer->StartSpan("db::syncChecker");
+			auto scope = tracer->WithActiveSpan(span);
+
 			std::vector<std::shared_ptr<DB> > dbs;
 			{
 				std::unique_lock<std::shared_mutex> l(_dbs_l);
@@ -77,6 +84,11 @@ DBMirrorSet::~DBMirrorSet()
 
 bool DBMirrorSet::hasNetwork(const uint64_t networkId) const
 {
+	auto provider = opentelemetry::trace::Provider::GetTracerProvider();
+	auto tracer = provider->GetTracer("db_mirror_set");
+	auto span = tracer->StartSpan("db_mirror_set::hasNetwork");
+	auto scope = tracer->WithActiveSpan(span);
+
 	std::shared_lock<std::shared_mutex> l(_dbs_l);
 	for (auto d = _dbs.begin(); d != _dbs.end(); ++d) {
 		if ((*d)->hasNetwork(networkId))
@@ -87,6 +99,13 @@ bool DBMirrorSet::hasNetwork(const uint64_t networkId) const
 
 bool DBMirrorSet::get(const uint64_t networkId, nlohmann::json& network)
 {
+	auto provider = opentelemetry::trace::Provider::GetTracerProvider();
+	auto tracer = provider->GetTracer("db_mirror_set");
+	auto span = tracer->StartSpan("db_mirror_set::getNetwork");
+	auto scope = tracer->WithActiveSpan(span);
+	char networkIdStr[17];
+	span->SetAttribute("network_id", Utils::hex(networkId, networkIdStr));
+
 	std::shared_lock<std::shared_mutex> l(_dbs_l);
 	for (auto d = _dbs.begin(); d != _dbs.end(); ++d) {
 		if ((*d)->get(networkId, network)) {
@@ -98,6 +117,15 @@ bool DBMirrorSet::get(const uint64_t networkId, nlohmann::json& network)
 
 bool DBMirrorSet::get(const uint64_t networkId, nlohmann::json& network, const uint64_t memberId, nlohmann::json& member)
 {
+	auto provider = opentelemetry::trace::Provider::GetTracerProvider();
+	auto tracer = provider->GetTracer("db_mirror_set");
+	auto span = tracer->StartSpan("db_mirror_set::getNetworkAndMember");
+	auto scope = tracer->WithActiveSpan(span);
+	char networkIdStr[17];
+	char memberIdStr[11];
+	span->SetAttribute("network_id", Utils::hex(networkId, networkIdStr));
+	span->SetAttribute("member_id", Utils::hex10(memberId, memberIdStr));
+
 	std::shared_lock<std::shared_mutex> l(_dbs_l);
 	for (auto d = _dbs.begin(); d != _dbs.end(); ++d) {
 		if ((*d)->get(networkId, network, memberId, member))
@@ -108,6 +136,15 @@ bool DBMirrorSet::get(const uint64_t networkId, nlohmann::json& network, const u
 
 bool DBMirrorSet::get(const uint64_t networkId, nlohmann::json& network, const uint64_t memberId, nlohmann::json& member, DB::NetworkSummaryInfo& info)
 {
+	auto provider = opentelemetry::trace::Provider::GetTracerProvider();
+	auto tracer = provider->GetTracer("db_mirror_set");
+	auto span = tracer->StartSpan("db_mirror_set::getNetworkAndMemberWithSummary");
+	auto scope = tracer->WithActiveSpan(span);
+	char networkIdStr[17];
+	char memberIdStr[11];
+	span->SetAttribute("network_id", Utils::hex(networkId, networkIdStr));
+	span->SetAttribute("member_id", Utils::hex10(memberId, memberIdStr));
+
 	std::shared_lock<std::shared_mutex> l(_dbs_l);
 	for (auto d = _dbs.begin(); d != _dbs.end(); ++d) {
 		if ((*d)->get(networkId, network, memberId, member, info))
@@ -118,6 +155,13 @@ bool DBMirrorSet::get(const uint64_t networkId, nlohmann::json& network, const u
 
 bool DBMirrorSet::get(const uint64_t networkId, nlohmann::json& network, std::vector<nlohmann::json>& members)
 {
+	auto provider = opentelemetry::trace::Provider::GetTracerProvider();
+	auto tracer = provider->GetTracer("db_mirror_set");
+	auto span = tracer->StartSpan("db_mirror_set::getNetworkAndMembers");
+	auto scope = tracer->WithActiveSpan(span);
+	char networkIdStr[17];
+	span->SetAttribute("network_id", Utils::hex(networkId, networkIdStr));
+
 	std::shared_lock<std::shared_mutex> l(_dbs_l);
 	for (auto d = _dbs.begin(); d != _dbs.end(); ++d) {
 		if ((*d)->get(networkId, network, members))
@@ -128,6 +172,11 @@ bool DBMirrorSet::get(const uint64_t networkId, nlohmann::json& network, std::ve
 
 AuthInfo DBMirrorSet::getSSOAuthInfo(const nlohmann::json& member, const std::string& redirectURL)
 {
+	auto provider = opentelemetry::trace::Provider::GetTracerProvider();
+	auto tracer = provider->GetTracer("db_mirror_set");
+	auto span = tracer->StartSpan("db_mirror_set::getSSOAuthInfo");
+	auto scope = tracer->WithActiveSpan(span);
+
 	std::shared_lock<std::shared_mutex> l(_dbs_l);
 	for (auto d = _dbs.begin(); d != _dbs.end(); ++d) {
 		AuthInfo info = (*d)->getSSOAuthInfo(member, redirectURL);
@@ -140,6 +189,11 @@ AuthInfo DBMirrorSet::getSSOAuthInfo(const nlohmann::json& member, const std::st
 
 void DBMirrorSet::networks(std::set<uint64_t>& networks)
 {
+	auto provider = opentelemetry::trace::Provider::GetTracerProvider();
+	auto tracer = provider->GetTracer("db_mirror_set");
+	auto span = tracer->StartSpan("db_mirror_set::networks");
+	auto scope = tracer->WithActiveSpan(span);
+
 	std::shared_lock<std::shared_mutex> l(_dbs_l);
 	for (auto d = _dbs.begin(); d != _dbs.end(); ++d) {
 		(*d)->networks(networks);
@@ -148,6 +202,11 @@ void DBMirrorSet::networks(std::set<uint64_t>& networks)
 
 bool DBMirrorSet::waitForReady()
 {
+	auto provider = opentelemetry::trace::Provider::GetTracerProvider();
+	auto tracer = provider->GetTracer("db_mirror_set");
+	auto span = tracer->StartSpan("db_mirror_set::waitForReady");
+	auto scope = tracer->WithActiveSpan(span);
+
 	bool r = false;
 	std::shared_lock<std::shared_mutex> l(_dbs_l);
 	for (auto d = _dbs.begin(); d != _dbs.end(); ++d) {
@@ -158,6 +217,11 @@ bool DBMirrorSet::waitForReady()
 
 bool DBMirrorSet::isReady()
 {
+	auto provider = opentelemetry::trace::Provider::GetTracerProvider();
+	auto tracer = provider->GetTracer("db_mirror_set");
+	auto span = tracer->StartSpan("db_mirror_set::isReady");
+	auto scope = tracer->WithActiveSpan(span);
+
 	std::shared_lock<std::shared_mutex> l(_dbs_l);
 	for (auto d = _dbs.begin(); d != _dbs.end(); ++d) {
 		if (! (*d)->isReady())
@@ -168,6 +232,11 @@ bool DBMirrorSet::isReady()
 
 bool DBMirrorSet::save(nlohmann::json& record, bool notifyListeners)
 {
+	auto provider = opentelemetry::trace::Provider::GetTracerProvider();
+	auto tracer = provider->GetTracer("db_mirror_set");
+	auto span = tracer->StartSpan("db_mirror_set::save");
+	auto scope = tracer->WithActiveSpan(span);
+
 	std::vector<std::shared_ptr<DB> > dbs;
 	{
 		std::unique_lock<std::shared_mutex> l(_dbs_l);
@@ -191,6 +260,13 @@ bool DBMirrorSet::save(nlohmann::json& record, bool notifyListeners)
 
 void DBMirrorSet::eraseNetwork(const uint64_t networkId)
 {
+	auto provider = opentelemetry::trace::Provider::GetTracerProvider();
+	auto tracer = provider->GetTracer("db_mirror_set");
+	auto span = tracer->StartSpan("db_mirror_set::eraseNetwork");
+	auto scope = tracer->WithActiveSpan(span);
+	char networkIdStr[17];
+	span->SetAttribute("network_id", Utils::hex(networkId, networkIdStr));
+
 	std::unique_lock<std::shared_mutex> l(_dbs_l);
 	for (auto d = _dbs.begin(); d != _dbs.end(); ++d) {
 		(*d)->eraseNetwork(networkId);
@@ -199,6 +275,15 @@ void DBMirrorSet::eraseNetwork(const uint64_t networkId)
 
 void DBMirrorSet::eraseMember(const uint64_t networkId, const uint64_t memberId)
 {
+	auto provider = opentelemetry::trace::Provider::GetTracerProvider();
+	auto tracer = provider->GetTracer("db_mirror_set");
+	auto span = tracer->StartSpan("db_mirror_set::eraseMember");
+	auto scope = tracer->WithActiveSpan(span);
+	char networkIdStr[17];
+	char memberIdStr[11];
+	span->SetAttribute("network_id", Utils::hex(networkId, networkIdStr));
+	span->SetAttribute("member_id", Utils::hex10(memberId, memberIdStr));
+
 	std::unique_lock<std::shared_mutex> l(_dbs_l);
 	for (auto d = _dbs.begin(); d != _dbs.end(); ++d) {
 		(*d)->eraseMember(networkId, memberId);
@@ -207,6 +292,18 @@ void DBMirrorSet::eraseMember(const uint64_t networkId, const uint64_t memberId)
 
 void DBMirrorSet::nodeIsOnline(const uint64_t networkId, const uint64_t memberId, const InetAddress& physicalAddress, const char* osArch)
 {
+	auto provider = opentelemetry::trace::Provider::GetTracerProvider();
+	auto tracer = provider->GetTracer("db_mirror_set");
+	auto span = tracer->StartSpan("db_mirror_set::nodeIsOnline");
+	auto scope = tracer->WithActiveSpan(span);
+	char networkIdStr[17];
+	char memberIdStr[11];
+	char phyAddressStr[INET6_ADDRSTRLEN];
+	span->SetAttribute("network_id", Utils::hex(networkId, networkIdStr));
+	span->SetAttribute("member_id", Utils::hex10(memberId, memberIdStr));
+	span->SetAttribute("physical_address", physicalAddress.toString(phyAddressStr));
+	span->SetAttribute("os_arch", osArch);
+
 	std::shared_lock<std::shared_mutex> l(_dbs_l);
 	for (auto d = _dbs.begin(); d != _dbs.end(); ++d) {
 		(*d)->nodeIsOnline(networkId, memberId, physicalAddress, osArch);
@@ -220,6 +317,13 @@ void DBMirrorSet::nodeIsOnline(const uint64_t networkId, const uint64_t memberId
 
 void DBMirrorSet::onNetworkUpdate(const void* db, uint64_t networkId, const nlohmann::json& network)
 {
+	auto provider = opentelemetry::trace::Provider::GetTracerProvider();
+	auto tracer = provider->GetTracer("db_mirror_set");
+	auto span = tracer->StartSpan("db_mirror_set::onNetworkUpdate");
+	auto scope = tracer->WithActiveSpan(span);
+	char networkIdStr[17];
+	span->SetAttribute("network_id", Utils::hex(networkId, networkIdStr));
+
 	nlohmann::json record(network);
 	std::unique_lock<std::shared_mutex> l(_dbs_l);
 	for (auto d = _dbs.begin(); d != _dbs.end(); ++d) {
@@ -232,6 +336,15 @@ void DBMirrorSet::onNetworkUpdate(const void* db, uint64_t networkId, const nloh
 
 void DBMirrorSet::onNetworkMemberUpdate(const void* db, uint64_t networkId, uint64_t memberId, const nlohmann::json& member)
 {
+	auto provider = opentelemetry::trace::Provider::GetTracerProvider();
+	auto tracer = provider->GetTracer("db_mirror_set");
+	auto span = tracer->StartSpan("db_mirror_set::onNetworkMemberUpdate");
+	auto scope = tracer->WithActiveSpan(span);
+	char networkIdStr[17];
+	char memberIdStr[11];
+	span->SetAttribute("network_id", Utils::hex(networkId, networkIdStr));
+	span->SetAttribute("member_id", Utils::hex10(memberId, memberIdStr));
+
 	nlohmann::json record(member);
 	std::unique_lock<std::shared_mutex> l(_dbs_l);
 	for (auto d = _dbs.begin(); d != _dbs.end(); ++d) {
@@ -244,6 +357,15 @@ void DBMirrorSet::onNetworkMemberUpdate(const void* db, uint64_t networkId, uint
 
 void DBMirrorSet::onNetworkMemberDeauthorize(const void* db, uint64_t networkId, uint64_t memberId)
 {
+	auto provider = opentelemetry::trace::Provider::GetTracerProvider();
+	auto tracer = provider->GetTracer("db_mirror_set");
+	auto span = tracer->StartSpan("db_mirror_set::onNetworkMemberDeauthorize");
+	auto scope = tracer->WithActiveSpan(span);
+	char networkIdStr[17];
+	char memberIdStr[11];
+	span->SetAttribute("network_id", Utils::hex(networkId, networkIdStr));
+	span->SetAttribute("member_id", Utils::hex10(memberId, memberIdStr));
+
 	_listener->onNetworkMemberDeauthorize(this, networkId, memberId);
 }
 

+ 130 - 3
controller/EmbeddedNetworkController.cpp

@@ -47,6 +47,7 @@
 #include "../node/MAC.hpp"
 #include "../node/NetworkConfig.hpp"
 #include "../node/Node.hpp"
+#include "opentelemetry/trace/provider.h"
 
 using json = nlohmann::json;
 
@@ -65,6 +66,11 @@ namespace {
 
 static json _renderRule(ZT_VirtualNetworkRule& rule)
 {
+	auto provider = opentelemetry::trace::Provider::GetTracerProvider();
+	auto tracer = provider->GetTracer("embedded_controller");
+	auto span = tracer->StartSpan("embedded_controller::renderRule");
+	auto scope = tracer->WithActiveSpan(span);
+
 	char tmp[128];
 	json r = json::object();
 	const ZT_VirtualNetworkRuleType rt = (ZT_VirtualNetworkRuleType)(rule.t & 0x3f);
@@ -272,6 +278,11 @@ static json _renderRule(ZT_VirtualNetworkRule& rule)
 
 static bool _parseRule(json& r, ZT_VirtualNetworkRule& rule)
 {
+	auto provider = opentelemetry::trace::Provider::GetTracerProvider();
+	auto tracer = provider->GetTracer("embedded_controller");
+	auto span = tracer->StartSpan("embedded_controller::parseRule");
+	auto scope = tracer->WithActiveSpan(span);
+
 	if (! r.is_object())
 		return false;
 
@@ -588,6 +599,11 @@ void EmbeddedNetworkController::setSSORedirectURL(const std::string& url)
 
 void EmbeddedNetworkController::init(const Identity& signingId, Sender* sender)
 {
+	auto provider = opentelemetry::trace::Provider::GetTracerProvider();
+	auto tracer = provider->GetTracer("embedded_controller");
+	auto span = tracer->StartSpan("embedded_controller::init");
+	auto scope = tracer->WithActiveSpan(span);
+
 	char tmp[64];
 	_signingId = signingId;
 	_sender = sender;
@@ -596,16 +612,16 @@ void EmbeddedNetworkController::init(const Identity& signingId, Sender* sender)
 #ifdef ZT_CONTROLLER_USE_LIBPQ
 	if ((_path.length() > 9) && (_path.substr(0, 9) == "postgres:")) {
 		fprintf(stderr, "CV1\n");
-		_db.addDB(std::shared_ptr<DB>(new CV1(_signingId, _path.substr(9).c_str(), _listenPort, _rc)));
+		_db.addDB(std::shared_ptr<CV1>(new CV1(_signingId, _path.substr(9).c_str(), _listenPort, _rc)));
 	}
 	else if ((_path.length() > 4) && (_path.substr(0, 4) == "cv2:")) {
 		fprintf(stderr, "CV2\n");
-		_db.addDB(std::shared_ptr<DB>(new CV2(_signingId, _path.substr(4).c_str(), _listenPort)));
+		_db.addDB(std::shared_ptr<CV2>(new CV2(_signingId, _path.substr(4).c_str(), _listenPort)));
 	}
 	else {
 		fprintf(stderr, "FileDB\n");
 #endif
-		_db.addDB(std::shared_ptr<DB>(new FileDB(_path.c_str())));
+		_db.addDB(std::shared_ptr<FileDB>(new FileDB(_path.c_str())));
 #ifdef ZT_CONTROLLER_USE_LIBPQ
 	}
 #endif
@@ -645,6 +661,11 @@ void EmbeddedNetworkController::init(const Identity& signingId, Sender* sender)
 
 void EmbeddedNetworkController::request(uint64_t nwid, const InetAddress& fromAddr, uint64_t requestPacketId, const Identity& identity, const Dictionary<ZT_NETWORKCONFIG_METADATA_DICT_CAPACITY>& metaData)
 {
+	auto provider = opentelemetry::trace::Provider::GetTracerProvider();
+	auto tracer = provider->GetTracer("embedded_controller");
+	auto span = tracer->StartSpan("embedded_controller::request");
+	auto scope = tracer->WithActiveSpan(span);
+
 	if (((! _signingId) || (! _signingId.hasPrivate())) || (_signingId.address().toInt() != (nwid >> 24)) || (! _sender))
 		return;
 	_startThreads();
@@ -672,6 +693,11 @@ void EmbeddedNetworkController::request(uint64_t nwid, const InetAddress& fromAd
 
 std::string EmbeddedNetworkController::networkUpdateFromPostData(uint64_t networkID, const std::string& body)
 {
+	auto provider = opentelemetry::trace::Provider::GetTracerProvider();
+	auto tracer = provider->GetTracer("embedded_controller");
+	auto span = tracer->StartSpan("embedded_controller::networkUpdateFromPostData");
+	auto scope = tracer->WithActiveSpan(span);
+
 	json b = OSUtils::jsonParse(body);
 
 	char nwids[24];
@@ -959,6 +985,11 @@ void EmbeddedNetworkController::configureHTTPControlPlane(httplib::Server& s, ht
 	std::string memberPath = "/controller/network/([0-9a-fA-F]{16})/member/([0-9a-fA-F]{10})";
 
 	auto controllerGet = [&, setContent](const httplib::Request& req, httplib::Response& res) {
+		auto provider = opentelemetry::trace::Provider::GetTracerProvider();
+		auto tracer = provider->GetTracer("embedded_controller");
+		auto span = tracer->StartSpan("embedded_controller::controllerGet");
+		auto scope = tracer->WithActiveSpan(span);
+
 		char tmp[4096];
 		const bool dbOk = _db.isReady();
 		OSUtils::ztsnprintf(
@@ -979,6 +1010,11 @@ void EmbeddedNetworkController::configureHTTPControlPlane(httplib::Server& s, ht
 	sv6.Get(controllerPath, controllerGet);
 
 	auto networkListGet = [&, setContent](const httplib::Request& req, httplib::Response& res) {
+		auto provider = opentelemetry::trace::Provider::GetTracerProvider();
+		auto tracer = provider->GetTracer("embedded_controller");
+		auto span = tracer->StartSpan("embedded_controller::networkListGet");
+		auto scope = tracer->WithActiveSpan(span);
+
 		std::set<uint64_t> networkIds;
 		_db.networks(networkIds);
 		char tmp[64];
@@ -995,6 +1031,11 @@ void EmbeddedNetworkController::configureHTTPControlPlane(httplib::Server& s, ht
 	sv6.Get(networkListPath, networkListGet);
 
 	auto networkListGet2 = [&, setContent](const httplib::Request& req, httplib::Response& res) {
+		auto provider = opentelemetry::trace::Provider::GetTracerProvider();
+		auto tracer = provider->GetTracer("embedded_controller");
+		auto span = tracer->StartSpan("embedded_controller::networkListGet2");
+		auto scope = tracer->WithActiveSpan(span);
+
 		std::set<uint64_t> networkIds;
 		_db.networks(networkIds);
 
@@ -1043,6 +1084,11 @@ void EmbeddedNetworkController::configureHTTPControlPlane(httplib::Server& s, ht
 	sv6.Get(networkListPath2, networkListGet2);
 
 	auto networkGet = [&, setContent](const httplib::Request& req, httplib::Response& res) {
+		auto provider = opentelemetry::trace::Provider::GetTracerProvider();
+		auto tracer = provider->GetTracer("embedded_controller");
+		auto span = tracer->StartSpan("embedded_controller::networkGet");
+		auto scope = tracer->WithActiveSpan(span);
+
 		auto networkID = req.matches[1];
 		uint64_t nwid = Utils::hexStrToU64(networkID.str().c_str());
 		json network;
@@ -1057,6 +1103,11 @@ void EmbeddedNetworkController::configureHTTPControlPlane(httplib::Server& s, ht
 	sv6.Get(networkPath, networkGet);
 
 	auto createNewNetwork = [&, setContent](const httplib::Request& req, httplib::Response& res) {
+		auto provider = opentelemetry::trace::Provider::GetTracerProvider();
+		auto tracer = provider->GetTracer("embedded_controller");
+		auto span = tracer->StartSpan("embedded_controller::createNewNetwork");
+		auto scope = tracer->WithActiveSpan(span);
+
 		// fprintf(stderr, "creating new network (new style)\n");
 		uint64_t nwid = 0;
 		uint64_t nwidPrefix = (Utils::hexStrToU64(_signingIdAddressString.c_str()) << 24) & 0xffffffffff000000ULL;
@@ -1084,6 +1135,11 @@ void EmbeddedNetworkController::configureHTTPControlPlane(httplib::Server& s, ht
 	sv6.Post(networkListPath, createNewNetwork);
 
 	auto createNewNetworkOldAndBusted = [&, setContent](const httplib::Request& req, httplib::Response& res) {
+		auto provider = opentelemetry::trace::Provider::GetTracerProvider();
+		auto tracer = provider->GetTracer("embedded_controller");
+		auto span = tracer->StartSpan("embedded_controller::createNewNetworkOldAndBusted");
+		auto scope = tracer->WithActiveSpan(span);
+
 		auto inID = req.matches[1].str();
 
 		if (inID != _signingIdAddressString) {
@@ -1116,6 +1172,11 @@ void EmbeddedNetworkController::configureHTTPControlPlane(httplib::Server& s, ht
 	sv6.Post(oldAndBustedNetworkCreatePath, createNewNetworkOldAndBusted);
 
 	auto networkPost = [&, setContent](const httplib::Request& req, httplib::Response& res) {
+		auto provider = opentelemetry::trace::Provider::GetTracerProvider();
+		auto tracer = provider->GetTracer("embedded_controller");
+		auto span = tracer->StartSpan("embedded_controller::networkPost");
+		auto scope = tracer->WithActiveSpan(span);
+
 		auto networkID = req.matches[1].str();
 		uint64_t nwid = Utils::hexStrToU64(networkID.c_str());
 
@@ -1128,6 +1189,11 @@ void EmbeddedNetworkController::configureHTTPControlPlane(httplib::Server& s, ht
 	sv6.Post(networkPath, networkPost);
 
 	auto networkDelete = [&, setContent](const httplib::Request& req, httplib::Response& res) {
+		auto provider = opentelemetry::trace::Provider::GetTracerProvider();
+		auto tracer = provider->GetTracer("embedded_controller");
+		auto span = tracer->StartSpan("embedded_controller::networkDelete");
+		auto scope = tracer->WithActiveSpan(span);
+
 		auto networkID = req.matches[1].str();
 		uint64_t nwid = Utils::hexStrToU64(networkID.c_str());
 
@@ -1144,6 +1210,11 @@ void EmbeddedNetworkController::configureHTTPControlPlane(httplib::Server& s, ht
 	sv6.Delete(networkPath, networkDelete);
 
 	auto memberListGet = [&, setContent](const httplib::Request& req, httplib::Response& res) {
+		auto provider = opentelemetry::trace::Provider::GetTracerProvider();
+		auto tracer = provider->GetTracer("embedded_controller");
+		auto span = tracer->StartSpan("embedded_controller::memberListGet");
+		auto scope = tracer->WithActiveSpan(span);
+
 		auto networkID = req.matches[1];
 		uint64_t nwid = Utils::hexStrToU64(networkID.str().c_str());
 		json network;
@@ -1170,6 +1241,11 @@ void EmbeddedNetworkController::configureHTTPControlPlane(httplib::Server& s, ht
 	sv6.Get(memberListPath, memberListGet);
 
 	auto memberListGet2 = [&, setContent](const httplib::Request& req, httplib::Response& res) {
+		auto provider = opentelemetry::trace::Provider::GetTracerProvider();
+		auto tracer = provider->GetTracer("embedded_controller");
+		auto span = tracer->StartSpan("embedded_controller::memberListGet2");
+		auto scope = tracer->WithActiveSpan(span);
+
 		auto networkID = req.matches[1];
 		uint64_t nwid = Utils::hexStrToU64(networkID.str().c_str());
 		json network;
@@ -1208,6 +1284,11 @@ void EmbeddedNetworkController::configureHTTPControlPlane(httplib::Server& s, ht
 	sv6.Get(memberListPath2, memberListGet2);
 
 	auto memberGet = [&, setContent](const httplib::Request& req, httplib::Response& res) {
+		auto provider = opentelemetry::trace::Provider::GetTracerProvider();
+		auto tracer = provider->GetTracer("embedded_controller");
+		auto span = tracer->StartSpan("embedded_controller::memberGet");
+		auto scope = tracer->WithActiveSpan(span);
+
 		auto networkID = req.matches[1];
 		auto memberID = req.matches[2];
 		uint64_t nwid = Utils::hexStrToU64(networkID.str().c_str());
@@ -1225,6 +1306,11 @@ void EmbeddedNetworkController::configureHTTPControlPlane(httplib::Server& s, ht
 	sv6.Get(memberPath, memberGet);
 
 	auto memberPost = [&, setContent](const httplib::Request& req, httplib::Response& res) {
+		auto provider = opentelemetry::trace::Provider::GetTracerProvider();
+		auto tracer = provider->GetTracer("embedded_controller");
+		auto span = tracer->StartSpan("embedded_controller::memberPost");
+		auto scope = tracer->WithActiveSpan(span);
+
 		auto networkID = req.matches[1].str();
 		auto memberID = req.matches[2].str();
 		uint64_t nwid = Utils::hexStrToU64(networkID.c_str());
@@ -1347,6 +1433,11 @@ void EmbeddedNetworkController::configureHTTPControlPlane(httplib::Server& s, ht
 	sv6.Post(memberPath, memberPost);
 
 	auto memberDelete = [&, setContent](const httplib::Request& req, httplib::Response& res) {
+		auto provider = opentelemetry::trace::Provider::GetTracerProvider();
+		auto tracer = provider->GetTracer("embedded_controller");
+		auto span = tracer->StartSpan("embedded_controller::memberDelete");
+		auto scope = tracer->WithActiveSpan(span);
+
 		auto networkID = req.matches[1].str();
 		auto memberID = req.matches[2].str();
 
@@ -1374,6 +1465,11 @@ void EmbeddedNetworkController::configureHTTPControlPlane(httplib::Server& s, ht
 
 void EmbeddedNetworkController::handleRemoteTrace(const ZT_RemoteTrace& rt)
 {
+	auto provider = opentelemetry::trace::Provider::GetTracerProvider();
+	auto tracer = provider->GetTracer("embedded_controller");
+	auto span = tracer->StartSpan("embedded_controller::handleRemoteTrace");
+	auto scope = tracer->WithActiveSpan(span);
+
 	static volatile unsigned long idCounter = 0;
 	char id[128], tmp[128];
 	std::string k, v;
@@ -1436,6 +1532,11 @@ void EmbeddedNetworkController::handleRemoteTrace(const ZT_RemoteTrace& rt)
 
 void EmbeddedNetworkController::onNetworkUpdate(const void* db, uint64_t networkId, const nlohmann::json& network)
 {
+	auto provider = opentelemetry::trace::Provider::GetTracerProvider();
+	auto tracer = provider->GetTracer("embedded_controller");
+	auto span = tracer->StartSpan("embedded_controller::onNetworkUpdate");
+	auto scope = tracer->WithActiveSpan(span);
+
 	// Send an update to all members of the network that are online
 	const int64_t now = OSUtils::now();
 	std::lock_guard<std::mutex> l(_memberStatus_l);
@@ -1447,6 +1548,11 @@ void EmbeddedNetworkController::onNetworkUpdate(const void* db, uint64_t network
 
 void EmbeddedNetworkController::onNetworkMemberUpdate(const void* db, uint64_t networkId, uint64_t memberId, const nlohmann::json& member)
 {
+	auto provider = opentelemetry::trace::Provider::GetTracerProvider();
+	auto tracer = provider->GetTracer("embedded_controller");
+	auto span = tracer->StartSpan("embedded_controller::onNetworkMemberUpdate");
+	auto scope = tracer->WithActiveSpan(span);
+
 	// Push update to member if online
 	try {
 		std::lock_guard<std::mutex> l(_memberStatus_l);
@@ -1460,6 +1566,11 @@ void EmbeddedNetworkController::onNetworkMemberUpdate(const void* db, uint64_t n
 
 void EmbeddedNetworkController::onNetworkMemberDeauthorize(const void* db, uint64_t networkId, uint64_t memberId)
 {
+	auto provider = opentelemetry::trace::Provider::GetTracerProvider();
+	auto tracer = provider->GetTracer("embedded_controller");
+	auto span = tracer->StartSpan("embedded_controller::onNetworkMemberDeauthorize");
+	auto scope = tracer->WithActiveSpan(span);
+
 	const int64_t now = OSUtils::now();
 	Revocation rev((uint32_t)_node->prng(), networkId, 0, now, ZT_REVOCATION_FLAG_FAST_PROPAGATE, Address(memberId), Revocation::CREDENTIAL_TYPE_COM);
 	rev.sign(_signingId);
@@ -1474,6 +1585,11 @@ void EmbeddedNetworkController::onNetworkMemberDeauthorize(const void* db, uint6
 
 void EmbeddedNetworkController::_request(uint64_t nwid, const InetAddress& fromAddr, uint64_t requestPacketId, const Identity& identity, const Dictionary<ZT_NETWORKCONFIG_METADATA_DICT_CAPACITY>& metaData)
 {
+	auto provider = opentelemetry::trace::Provider::GetTracerProvider();
+	auto tracer = provider->GetTracer("embedded_controller");
+	auto span = tracer->StartSpan("embedded_controller::_request");
+	auto scope = tracer->WithActiveSpan(span);
+
 	Metrics::network_config_request++;
 	auto tid = std::this_thread::get_id();
 	std::stringstream ss;
@@ -2193,6 +2309,11 @@ void EmbeddedNetworkController::_request(uint64_t nwid, const InetAddress& fromA
 
 void EmbeddedNetworkController::_startThreads()
 {
+	auto provider = opentelemetry::trace::Provider::GetTracerProvider();
+	auto tracer = provider->GetTracer("embedded_network_controller");
+	auto span = tracer->StartSpan("embedded_network_controller::_startThreads");
+	auto scope = tracer->WithActiveSpan(span);
+
 	std::lock_guard<std::mutex> l(_threads_l);
 	if (! _threads.empty()) {
 		return;
@@ -2232,6 +2353,11 @@ void EmbeddedNetworkController::_startThreads()
 void EmbeddedNetworkController::_ssoExpiryThread()
 {
 	while (_ssoExpiryRunning) {
+		auto provider = opentelemetry::trace::Provider::GetTracerProvider();
+		auto tracer = provider->GetTracer("embedded_network_controller");
+		auto span = tracer->StartSpan("embedded_network_controller::_ssoExpiryThread");
+		auto scope = tracer->WithActiveSpan(span);
+
 		std::vector<_MemberStatusKey> expired;
 		nlohmann::json network, member;
 		int64_t now = OSUtils::now();
@@ -2262,6 +2388,7 @@ void EmbeddedNetworkController::_ssoExpiryThread()
 			Metrics::sso_member_deauth++;
 			onNetworkMemberDeauthorize(nullptr, e->networkId, e->nodeId);
 		}
+		span->End();
 		std::this_thread::sleep_for(std::chrono::milliseconds(500));
 	}
 }

+ 32 - 0
controller/FileDB.cpp

@@ -14,11 +14,17 @@
 #include "FileDB.hpp"
 
 #include "../node/Metrics.hpp"
+#include "opentelemetry/trace/provider.h"
 
 namespace ZeroTier {
 
 FileDB::FileDB(const char* path) : DB(), _path(path), _networksPath(_path + ZT_PATH_SEPARATOR_S + "network"), _tracePath(_path + ZT_PATH_SEPARATOR_S + "trace"), _running(true)
 {
+	auto provider = opentelemetry::trace::Provider::GetTracerProvider();
+	auto tracer = provider->GetTracer("filedb");
+	auto span = tracer->StartSpan("filedb::FileDB");
+	auto scope = tracer->WithActiveSpan(span);
+
 	OSUtils::mkdir(_path.c_str());
 	OSUtils::lockDownFile(_path.c_str(), true);
 	OSUtils::mkdir(_networksPath.c_str());
@@ -85,11 +91,19 @@ bool FileDB::isReady()
 
 bool FileDB::save(nlohmann::json& record, bool notifyListeners)
 {
+	auto provider = opentelemetry::trace::Provider::GetTracerProvider();
+	auto tracer = provider->GetTracer("filedb");
+	auto span = tracer->StartSpan("filedb::save");
+	auto scope = tracer->WithActiveSpan(span);
+
 	char p1[4096], p2[4096], pb[4096];
 	bool modified = false;
 	try {
 		const std::string objtype = record["objtype"];
 		if (objtype == "network") {
+			auto span = tracer->StartSpan("filedb::save::network");
+			auto scope = tracer->WithActiveSpan(span);
+
 			const uint64_t nwid = OSUtils::jsonIntHex(record["id"], 0ULL);
 			if (nwid) {
 				nlohmann::json old;
@@ -106,6 +120,9 @@ bool FileDB::save(nlohmann::json& record, bool notifyListeners)
 			}
 		}
 		else if (objtype == "member") {
+			auto span = tracer->StartSpan("filedb::save::member");
+			auto scope = tracer->WithActiveSpan(span);
+
 			const uint64_t id = OSUtils::jsonIntHex(record["id"], 0ULL);
 			const uint64_t nwid = OSUtils::jsonIntHex(record["nwid"], 0ULL);
 			if ((id) && (nwid)) {
@@ -136,6 +153,11 @@ bool FileDB::save(nlohmann::json& record, bool notifyListeners)
 
 void FileDB::eraseNetwork(const uint64_t networkId)
 {
+	auto provider = opentelemetry::trace::Provider::GetTracerProvider();
+	auto tracer = provider->GetTracer("filedb");
+	auto span = tracer->StartSpan("filedb::eraseNetwork");
+	auto scope = tracer->WithActiveSpan(span);
+
 	nlohmann::json network, nullJson;
 	get(networkId, network);
 	char p[16384];
@@ -150,6 +172,11 @@ void FileDB::eraseNetwork(const uint64_t networkId)
 
 void FileDB::eraseMember(const uint64_t networkId, const uint64_t memberId)
 {
+	auto provider = opentelemetry::trace::Provider::GetTracerProvider();
+	auto tracer = provider->GetTracer("filedb");
+	auto span = tracer->StartSpan("filedb::eraseMember");
+	auto scope = tracer->WithActiveSpan(span);
+
 	nlohmann::json network, member, nullJson;
 	get(networkId, network, memberId, member);
 	char p[4096];
@@ -162,6 +189,11 @@ void FileDB::eraseMember(const uint64_t networkId, const uint64_t memberId)
 
 void FileDB::nodeIsOnline(const uint64_t networkId, const uint64_t memberId, const InetAddress& physicalAddress, const char* osArch)
 {
+	auto provider = opentelemetry::trace::Provider::GetTracerProvider();
+	auto tracer = provider->GetTracer("filedb");
+	auto span = tracer->StartSpan("filedb::nodeIsOnline");
+	auto scope = tracer->WithActiveSpan(span);
+
 	char mid[32], atmp[64];
 	OSUtils::ztsnprintf(mid, sizeof(mid), "%.10llx", (unsigned long long)memberId);
 	physicalAddress.toString(atmp);

+ 0 - 46
controller/PostgreSQL.cpp

@@ -8,50 +8,4 @@ using namespace nlohmann;
 
 using namespace ZeroTier;
 
-MemberNotificationReceiver::MemberNotificationReceiver(DB* p, pqxx::connection& c, const std::string& channel) : pqxx::notification_receiver(c, channel), _psql(p)
-{
-	fprintf(stderr, "initialize MemberNotificationReceiver\n");
-}
-
-void MemberNotificationReceiver::operator()(const std::string& payload, int packend_pid)
-{
-	fprintf(stderr, "Member Notification received: %s\n", payload.c_str());
-	Metrics::pgsql_mem_notification++;
-	json tmp(json::parse(payload));
-	json& ov = tmp["old_val"];
-	json& nv = tmp["new_val"];
-	json oldConfig, newConfig;
-	if (ov.is_object())
-		oldConfig = ov;
-	if (nv.is_object())
-		newConfig = nv;
-	if (oldConfig.is_object() || newConfig.is_object()) {
-		_psql->_memberChanged(oldConfig, newConfig, _psql->isReady());
-		fprintf(stderr, "payload sent\n");
-	}
-}
-
-NetworkNotificationReceiver::NetworkNotificationReceiver(DB* p, pqxx::connection& c, const std::string& channel) : pqxx::notification_receiver(c, channel), _psql(p)
-{
-	fprintf(stderr, "initialize NetworkNotificationReceiver\n");
-}
-
-void NetworkNotificationReceiver::operator()(const std::string& payload, int packend_pid)
-{
-	fprintf(stderr, "Network Notification received: %s\n", payload.c_str());
-	Metrics::pgsql_net_notification++;
-	json tmp(json::parse(payload));
-	json& ov = tmp["old_val"];
-	json& nv = tmp["new_val"];
-	json oldConfig, newConfig;
-	if (ov.is_object())
-		oldConfig = ov;
-	if (nv.is_object())
-		newConfig = nv;
-	if (oldConfig.is_object() || newConfig.is_object()) {
-		_psql->_networkChanged(oldConfig, newConfig, _psql->isReady());
-		fprintf(stderr, "payload sent\n");
-	}
-}
-
 #endif

+ 106 - 8
controller/PostgreSQL.hpp

@@ -18,8 +18,10 @@
 
 #include "ConnectionPool.hpp"
 #include "DB.hpp"
+#include "opentelemetry/trace/provider.h"
 
 #include <memory>
+#include <nlohmann/json.hpp>
 #include <pqxx/pqxx>
 
 namespace ZeroTier {
@@ -56,32 +58,128 @@ class PostgresConnFactory : public ConnectionFactory {
 	std::string m_connString;
 };
 
-class MemberNotificationReceiver : public pqxx::notification_receiver {
+template <typename T> class MemberNotificationReceiver : public pqxx::notification_receiver {
   public:
-	MemberNotificationReceiver(DB* p, pqxx::connection& c, const std::string& channel);
+	MemberNotificationReceiver(T* p, pqxx::connection& c, const std::string& channel) : pqxx::notification_receiver(c, channel), _psql(p)
+	{
+		fprintf(stderr, "initialize MemberNotificationReceiver\n");
+	}
+
 	virtual ~MemberNotificationReceiver()
 	{
 		fprintf(stderr, "MemberNotificationReceiver destroyed\n");
 	}
 
-	virtual void operator()(const std::string& payload, int backendPid);
+	virtual void operator()(const std::string& payload, int backendPid)
+	{
+		auto provider = opentelemetry::trace::Provider::GetTracerProvider();
+		auto tracer = provider->GetTracer("db_member_notification");
+		auto span = tracer->StartSpan("db_member_notification::operator()");
+		auto scope = tracer->WithActiveSpan(span);
+		span->SetAttribute("payload", payload);
+		span->SetAttribute("psqlReady", _psql->isReady());
+
+		fprintf(stderr, "Member Notification received: %s\n", payload.c_str());
+		Metrics::pgsql_mem_notification++;
+		nlohmann::json tmp(nlohmann::json::parse(payload));
+		nlohmann::json& ov = tmp["old_val"];
+		nlohmann::json& nv = tmp["new_val"];
+		nlohmann::json oldConfig, newConfig;
+		if (ov.is_object())
+			oldConfig = ov;
+		if (nv.is_object())
+			newConfig = nv;
+
+		if (oldConfig.is_object() && newConfig.is_object()) {
+			_psql->save(newConfig, _psql->isReady());
+			fprintf(stderr, "payload sent\n");
+		}
+		else if (newConfig.is_object() && ! oldConfig.is_object()) {
+			// new member
+			Metrics::member_count++;
+			_psql->save(newConfig, _psql->isReady());
+			fprintf(stderr, "new member payload sent\n");
+		}
+		else if (! newConfig.is_object() && oldConfig.is_object()) {
+			// member delete
+			uint64_t networkId = OSUtils::jsonIntHex(oldConfig["nwid"], 0ULL);
+			uint64_t memberId = OSUtils::jsonIntHex(oldConfig["id"], 0ULL);
+			if (memberId && networkId) {
+				_psql->eraseMember(networkId, memberId);
+				fprintf(stderr, "member delete payload sent\n");
+			}
+		}
+	}
 
   private:
-	DB* _psql;
+	T* _psql;
 };
 
-class NetworkNotificationReceiver : public pqxx::notification_receiver {
+template <typename T> class NetworkNotificationReceiver : public pqxx::notification_receiver {
   public:
-	NetworkNotificationReceiver(DB* p, pqxx::connection& c, const std::string& channel);
+	NetworkNotificationReceiver(T* p, pqxx::connection& c, const std::string& channel) : pqxx::notification_receiver(c, channel), _psql(p)
+	{
+		fprintf(stderr, "initialize NetworkrNotificationReceiver\n");
+	}
+
 	virtual ~NetworkNotificationReceiver()
 	{
 		fprintf(stderr, "NetworkNotificationReceiver destroyed\n");
 	};
 
-	virtual void operator()(const std::string& payload, int packend_pid);
+	virtual void operator()(const std::string& payload, int packend_pid)
+	{
+		auto provider = opentelemetry::trace::Provider::GetTracerProvider();
+		auto tracer = provider->GetTracer("db_network_notification");
+		auto span = tracer->StartSpan("db_network_notification::operator()");
+		auto scope = tracer->WithActiveSpan(span);
+		span->SetAttribute("payload", payload);
+		span->SetAttribute("psqlReady", _psql->isReady());
+
+		fprintf(stderr, "Network Notification received: %s\n", payload.c_str());
+		Metrics::pgsql_net_notification++;
+		nlohmann::json tmp(nlohmann::json::parse(payload));
+
+		nlohmann::json& ov = tmp["old_val"];
+		nlohmann::json& nv = tmp["new_val"];
+		nlohmann::json oldConfig, newConfig;
+
+		if (ov.is_object())
+			oldConfig = ov;
+		if (nv.is_object())
+			newConfig = nv;
+
+		if (oldConfig.is_object() && newConfig.is_object()) {
+			std::string nwid = oldConfig["id"];
+			span->SetAttribute("action", "network_change");
+			span->SetAttribute("network_id", nwid);
+			_psql->save(newConfig, _psql->isReady());
+			fprintf(stderr, "payload sent\n");
+		}
+		else if (newConfig.is_object() && ! oldConfig.is_object()) {
+			std::string nwid = newConfig["id"];
+			span->SetAttribute("network_id", nwid);
+			span->SetAttribute("action", "new_network");
+			// new network
+			_psql->save(newConfig, _psql->isReady());
+			fprintf(stderr, "new network payload sent\n");
+		}
+		else if (! newConfig.is_object() && oldConfig.is_object()) {
+			// network delete
+			span->SetAttribute("action", "delete_network");
+			std::string nwid = oldConfig["id"];
+			span->SetAttribute("network_id", nwid);
+			uint64_t networkId = Utils::hexStrToU64(nwid.c_str());
+			span->SetAttribute("network_id_int", networkId);
+			if (networkId) {
+				_psql->eraseNetwork(networkId);
+				fprintf(stderr, "network delete payload sent\n");
+			}
+		}
+	}
 
   private:
-	DB* _psql;
+	T* _psql;
 };
 
 struct NodeOnlineRecord {

+ 3 - 2
ext/central-controller-docker/Dockerfile

@@ -1,13 +1,14 @@
 # Dockerfile for ZeroTier Central Controllers
-FROM registry.zerotier.com/zerotier/ctlbuild:2025-05-13-01 AS builder
+FROM registry.zerotier.com/zerotier/ctlbuild:2025-07-14 AS builder
 ADD . /ZeroTierOne
 RUN export PATH=$PATH:~/.cargo/bin && cd ZeroTierOne && make clean && make central-controller -j8
 
 FROM golang:bookworm AS go_base
 RUN go install -tags 'postgres' github.com/golang-migrate/migrate/v4/cmd/migrate@latest
 
-FROM registry.zerotier.com/zerotier/ctlrun:2025-05-13-01
+FROM registry.zerotier.com/zerotier/ctlrun:2025-07-14 AS run_base
 COPY --from=builder /ZeroTierOne/zerotier-one /usr/local/bin/zerotier-one
+COPY --from=builder /ZeroTierOne/ext/opentelemetry-cpp-1.21.0/localinstall/lib/*.so /usr/local/lib64/
 COPY --from=go_base /go/bin/migrate /usr/local/bin/migrate
 COPY ext/central-controller-docker/migrations /migrations
 

+ 12 - 1
ext/central-controller-docker/Dockerfile.builder

@@ -16,8 +16,19 @@ RUN apt -y install \
     postgresql-client \
     postgresql-client-common \
     curl \
+    libcurl4-openssl-dev \
     google-perftools \
     libgoogle-perftools-dev \
-    protobuf-compiler 
+    protobuf-compiler \
+    protobuf-compiler-grpc \
+    protobuf-c-compiler \
+    grpc-proto \
+    libgrpc++1.51 \
+    libgrpc++-dev \
+    libgrpc-dev \
+    libgrpc29 \
+    cmake \
+    git
+
 
 RUN curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y

+ 3 - 1
ext/central-controller-docker/Dockerfile.run_base

@@ -13,5 +13,7 @@ RUN apt -y install \
     binutils \
     perf-tools-unstable \
     google-perftools \
-    gnupg
+    gnupg \
+    libgrpc++1.51 \
+    libgrpc29 
 

+ 2 - 2
ext/central-controller-docker/Makefile

@@ -10,7 +10,7 @@ buildx:
 	@echo docker buildx inspect --bootstrap
 
 controller-builder:	buildx
-	docker buildx build --no-cache --platform linux/amd64,linux/arm64 -t $(registry)/ctlbuild:latest -f Dockerfile.builder . --push
+	docker buildx build --no-cache --platform linux/amd64,linux/arm64 -t $(registry)/ctlbuild:$(shell date +"%Y-%m-%d") -f Dockerfile.builder . --push 
 
 controller-runbase: buildx
-	docker buildx build --no-cache --platform linux/amd64,linux/arm64 -t $(registry)/ctlrun:latest -f Dockerfile.run_base . --push
+	docker buildx build --no-cache --platform linux/amd64,linux/arm64 -t $(registry)/ctlrun:$(shell date +"%Y-%m-%d") -f Dockerfile.run_base . --push 

+ 4 - 0
ext/central-controller-docker/main.sh

@@ -83,6 +83,10 @@ echo "{
         \"lowBandwidthMode\": ${ZT_LB_MODE:-$DEFAULT_LB_MODE},
         \"ssoRedirectURL\": \"${ZT_SSO_REDIRECT_URL}\",
         \"allowManagementFrom\": [\"127.0.0.1\", \"::1\", \"10.0.0.0/8\"],
+        \"otel\": {
+            \"exporterEndpoint\": \"${ZT_EXPORTER_ENDPOINT}\",
+            \"exporterSampleRate\": ${ZT_EXPORTER_SAMPLE_RATE:-0}
+        },
         ${REDIS}
     }
 }    

+ 3 - 0
ext/opentelemetry-cpp-1.21.0/.bazelignore

@@ -0,0 +1,3 @@
+third_party
+tools
+out

+ 41 - 0
ext/opentelemetry-cpp-1.21.0/.bazelrc

@@ -0,0 +1,41 @@
+# Copyright The OpenTelemetry Authors
+# SPDX-License-Identifier: Apache-2.0
+
+# bazel configurations for running tests under sanitizers.
+# Based on https://github.com/bazelment/trunk/blob/master/tools/bazel.rc
+
+# Enable automatic configs based on platform
+common --enable_platform_specific_config
+
+# Make globs that don't match anything fail
+common --incompatible_disallow_empty_glob
+
+# Needed by gRPC to build on some platforms.
+build --copt -DGRPC_BAZEL_BUILD
+
+# Workaround abseil libraries missing symbols
+build:windows --dynamic_mode=off
+
+# Set minimum supported C++ version
+build:macos --host_cxxopt=-std=c++14 --cxxopt=-std=c++14
+build:linux --host_cxxopt=-std=c++14 --cxxopt=-std=c++14
+build:windows --host_cxxopt=/std:c++14 --cxxopt=/std:c++14
+
+# --config=asan : Address Sanitizer.
+common:asan --copt -DADDRESS_SANITIZER
+common:asan --copt -fsanitize=address,bool,float-cast-overflow,integer-divide-by-zero,null,return,returns-nonnull-attribute,shift-exponent,signed-integer-overflow,unreachable,vla-bound
+common:asan --copt -fsanitize-address-use-after-scope
+common:asan --copt -fno-sanitize-recover=all
+common:asan --linkopt -fsanitize=address,bool,float-cast-overflow,integer-divide-by-zero,null,return,returns-nonnull-attribute,shift-exponent,signed-integer-overflow,unreachable,vla-bound
+common:asan --linkopt -fsanitize-address-use-after-scope
+common:asan --linkopt -fno-sanitize-recover=all
+common:asan --cc_output_directory_tag=asan
+
+# --config=tsan : Thread Sanitizer.
+common:tsan --copt -fsanitize=thread
+common:tsan --copt -DTHREAD_SANITIZER
+common:tsan --linkopt -fsanitize=thread
+common:tsan --cc_output_directory_tag=tsan
+# This is needed to address false positive problem with abseil.The same setting as gRPC
+# https://github.com/google/sanitizers/issues/953
+common:tsan --test_env=TSAN_OPTIONS=report_atomic_races=0

+ 1 - 0
ext/opentelemetry-cpp-1.21.0/.bazelversion

@@ -0,0 +1 @@
+7.1.1

+ 73 - 0
ext/opentelemetry-cpp-1.21.0/.clang-format

@@ -0,0 +1,73 @@
+# Copyright The OpenTelemetry Authors
+# SPDX-License-Identifier: Apache-2.0
+
+# See Clang docs: http://clang.llvm.org/docs/ClangFormatStyleOptions.html
+BasedOnStyle: Chromium
+
+# Allow double brackets such as std::vector<std::vector<int>>.
+Standard: Cpp11
+
+# Indent 2 spaces at a time.
+IndentWidth: 2
+
+# Keep lines under 100 columns long.
+ColumnLimit: 100
+
+# Always break before braces
+BreakBeforeBraces: Custom
+BraceWrapping:
+#  TODO(lujc) wait for clang-format-9 support in Chromium tools
+#  AfterCaseLabel: true
+  AfterClass: true
+  AfterControlStatement: true
+  AfterEnum: true
+  AfterFunction: true
+  AfterNamespace: true
+  AfterStruct: true
+  AfterUnion: true
+  BeforeCatch: true
+  BeforeElse: true
+  IndentBraces: false
+  SplitEmptyFunction: false
+  SplitEmptyRecord: false
+  SplitEmptyNamespace: false
+
+  # Keeps extern "C" blocks unindented.
+  AfterExternBlock: false
+
+# Indent case labels.
+IndentCaseLabels: true
+
+# Right-align pointers and references
+PointerAlignment: Right
+
+# ANGLE likes to align things as much as possible.
+AlignOperands: true
+AlignConsecutiveAssignments: true
+
+# Use 2 space negative offset for access modifiers
+AccessModifierOffset: -2
+
+# TODO(jmadill): Decide if we want this on. Doesn't have an "all or none" mode.
+AllowShortCaseLabelsOnASingleLine: false
+
+# Useful for spacing out functions in classes
+KeepEmptyLinesAtTheStartOfBlocks: true
+
+# Indent nested PP directives.
+IndentPPDirectives: AfterHash
+
+# Include blocks style
+IncludeBlocks: Preserve
+
+AttributeMacros:
+  - OPENTELEMETRY_UNLIKELY
+  - OPENTELEMETRY_LIKELY
+  - OPENTELEMETRY_MAYBE_UNUSED
+  - OPENTELEMETRY_DEPRECATED
+  - OPENTELEMETRY_API_SINGLETON
+  - OPENTELEMETRY_LOCAL_SYMBOL
+  - OPENTELEMETRY_EXPORT
+  - OPENTELEMETRY_SANITIZER_NO_MEMORY
+  - OPENTELEMETRY_SANITIZER_NO_THREAD
+  - OPENTELEMETRY_SANITIZER_NO_ADDRESS

+ 42 - 0
ext/opentelemetry-cpp-1.21.0/.clang-tidy

@@ -0,0 +1,42 @@
+# Copyright The OpenTelemetry Authors
+# SPDX-License-Identifier: Apache-2.0
+
+Checks: >
+  -*,
+  performance-*,
+  portability-*,
+  abseil-*,
+  -abseil-string-find-str-contains,
+  bugprone-*,
+  -bugprone-easily-swappable-parameters,
+  -bugprone-implicit-widening-of-multiplication-result,
+  -bugprone-inc-dec-in-conditions,
+  -bugprone-narrowing-conversions,
+  -bugprone-unchecked-optional-access,
+  -bugprone-unhandled-exception-at-new,
+  -bugprone-unused-local-non-trivial-variable,
+  google-*,
+  -google-build-using-namespace,
+  -google-default-arguments,
+  -google-explicit-constructor,
+  -google-readability-avoid-underscore-in-googletest-name,
+  -google-readability-braces-around-statements,
+  -google-readability-namespace-comments,
+  -google-readability-todo,
+  -google-runtime-references,
+  misc-*,
+  -misc-const-correctness,
+  -misc-include-cleaner,
+  -misc-non-private-member-variables-in-classes,
+  -misc-unused-alias-decls,
+  -misc-use-anonymous-namespace,
+  cppcoreguidelines-*,
+  -cppcoreguidelines-owning-memory,
+  -cppcoreguidelines-avoid-do-while,
+  -cppcoreguidelines-avoid-c-arrays,
+  -cppcoreguidelines-avoid-magic-numbers,
+  -cppcoreguidelines-init-variables,
+  -cppcoreguidelines-macro-usage,
+  -cppcoreguidelines-non-private-member-variables-in-classes,
+  -cppcoreguidelines-avoid-non-const-global-variables,
+  -cppcoreguidelines-pro-*

+ 7 - 0
ext/opentelemetry-cpp-1.21.0/.cmake-format.py

@@ -0,0 +1,7 @@
+# Copyright The OpenTelemetry Authors
+# SPDX-License-Identifier: Apache-2.0
+
+# If comment markup is enabled, don't reflow the first comment block in
+# eachlistfile. Use this to preserve formatting of your
+# copyright/licensestatements.
+first_comment_is_literal = True

+ 52 - 0
ext/opentelemetry-cpp-1.21.0/.copyright-ignore

@@ -0,0 +1,52 @@
+# Copyright The OpenTelemetry Authors
+# SPDX-License-Identifier: Apache-2.0
+
+# Ignore the following directories
+
+./.git/*
+./.github/*
+./third_party/benchmark/*
+./third_party/boost/*
+./third_party/googletest/*
+./third_party/ms-gsl/*
+./third_party/nlohmann-json/*
+./third_party/opentelemetry-proto/*
+./third_party/prometheus-cpp/*
+./tools/vcpkg/*
+./tools/ports/*
+
+# Third party code
+
+./api/include/opentelemetry/nostd/internal/absl/*
+./exporters/jaeger/thrift-gen/*
+./exporters/etw/include/opentelemetry/exporters/etw/TraceLoggingDynamic.h
+
+# Doc
+
+./docs/*
+
+## Ignore the following files patterns
+
+*.md
+*.rst
+*.png
+*.log
+*.patch
+*.json
+*.nuspec
+*.pem
+
+# Packaging
+*/CONTROL
+
+# LICENSE files
+*/LICENSE
+
+# Ignore the following misc files
+
+./.bazelignore
+./.bazelversion
+./docker/.gitignore
+.markdownlintignore
+./ci/toc.yml
+./ci/valgrind-suppressions

+ 55 - 0
ext/opentelemetry-cpp-1.21.0/.devcontainer/Dockerfile.conan

@@ -0,0 +1,55 @@
+# Copyright The OpenTelemetry Authors
+# SPDX-License-Identifier: Apache-2.0
+FROM ubuntu:24.04@sha256:1e622c5f073b4f6bfad6632f2616c7f59ef256e96fe78bf6a595d1dc4376ac02
+
+RUN apt update && apt install -y \
+	build-essential \
+	ca-certificates \
+	wget \
+	cmake \
+	git \
+	sudo \
+	nano \
+	pkg-config \
+	ninja-build \
+	clang-format \
+	clang-tidy \
+	autoconf \
+	automake \
+	libtool \
+	python3-pip
+
+RUN pip install "conan==2.15.1" --break-system-packages
+
+ARG USER_UID=1000
+ARG USER_GID=1000
+ARG USER_NAME=devuser
+ENV USER_NAME=devuser
+ENV USER_UID=${USER_UID}
+ENV USER_GID=${USER_GID}
+ENV INSTALL_PACKAGES=
+ENV IS_CONTAINER_BUILD=true
+
+COPY ./.devcontainer/customize_container.sh /tmp/opentelemetry_cpp/devcontainer/customize_container.sh
+RUN /tmp/opentelemetry_cpp/devcontainer/customize_container.sh
+USER devuser
+
+RUN conan profile detect --force	
+
+ARG CONAN_FILE=conanfile_stable.txt
+ARG CONAN_BUILD_TYPE=Debug
+ARG CXX_STANDARD=17
+WORKDIR /home/devuser/conan
+COPY ./install/conan/ .
+
+RUN conan install ./${CONAN_FILE} --build=missing -s build_type=${CONAN_BUILD_TYPE}
+ENV CMAKE_TOOLCHAIN_FILE=/home/devuser/conan/build/${CONAN_BUILD_TYPE}/generators/conan_toolchain.cmake
+ENV CXX_STANDARD=${CXX_STANDARD}
+ENV BUILD_TYPE=${CONAN_BUILD_TYPE}
+ENV CONAN_FILE=${CONAN_FILE}
+
+WORKDIR  /workspaces/opentelemetry-cpp
+
+ENTRYPOINT []
+
+CMD ["/bin/bash"]

+ 58 - 0
ext/opentelemetry-cpp-1.21.0/.devcontainer/Dockerfile.dev

@@ -0,0 +1,58 @@
+# Copyright The OpenTelemetry Authors
+# SPDX-License-Identifier: Apache-2.0
+
+FROM otel/cpp_format_tools
+
+ARG USER_UID=1000
+ARG USER_GID=1000
+ARG INSTALL_PACKAGES=
+
+ARG CXX_STANDARD=17
+ARG CMAKE_VERSION=3.31.6
+ARG ABSEIL_CPP_VERSION=20230125.3
+ARG PROTOBUF_VERSION=23.3
+ARG GRPC_VERSION=v1.55.0
+
+ENV CXX_STANDARD=${CXX_STANDARD}
+ENV CMAKE_VERSION=${CMAKE_VERSION}
+ENV ABSEIL_CPP_VERSION=${ABSEIL_CPP_VERSION}
+ENV PROTOBUF_VERSION=${PROTOBUF_VERSION}
+ENV GRPC_VERSION=${GRPC_VERSION}
+
+COPY ci /opt/ci
+
+RUN apt update && apt install -y wget \
+	ninja-build \
+	libcurl4-openssl-dev \
+	clang-tidy \
+	shellcheck
+
+RUN cd /opt/ci && bash setup_cmake.sh
+RUN cd /opt/ci && bash setup_ci_environment.sh
+RUN cd /opt && bash ci/setup_googletest.sh \
+    && bash ci/install_abseil.sh \
+    && bash ci/install_protobuf.sh \
+    && bash ci/setup_grpc.sh -r $GRPC_VERSION -s $CXX_STANDARD -p protobuf -p abseil-cpp
+
+ADD https://github.com/bazelbuild/bazelisk/releases/download/v1.22.1/bazelisk-linux-amd64 /usr/local/bin
+	
+RUN git config --global core.autocrlf input \
+	&& chmod +x /usr/local/bin/bazelisk-linux-amd64
+
+ENV INSTALL_PACKAGES=${INSTALL_PACKAGES}
+ENV USER_NAME=devuser
+ENV USER_UID=${USER_UID}
+ENV USER_GID=${USER_GID}
+ENV IS_CONTAINER_BUILD=true
+
+COPY ./.devcontainer/customize_container.sh /tmp/opentelemetry_cpp/devcontainer/customize_container.sh
+RUN /tmp/opentelemetry_cpp/devcontainer/customize_container.sh
+RUN apt install -y npm && npm install -g [email protected]
+
+USER devuser
+
+WORKDIR  /workspaces/opentelemetry-cpp
+
+ENTRYPOINT []
+
+CMD ["/bin/bash"]

+ 65 - 0
ext/opentelemetry-cpp-1.21.0/.devcontainer/README.md

@@ -0,0 +1,65 @@
+# Customizing Your Dev Container
+
+Customize your dev container using build arguments (for direct Docker builds) or
+environment variables (for evaluation in `devcontainer.json`).
+
+* **CMake version:**
+  The version of cmake to install. (Default: 3.31.6)
+  * Docker ARG:
+   `CMAKE_VERSION`
+  * Host Environment Variable:
+   `OTEL_CPP_DEVCONTAINER_CMAKE_VERSION`
+
+* **CXX standard:**
+  This is the C++ standard to build from (eg: 17, 20, ...). (Default: 17)
+  * Docker ARG:
+   `CXX_STANDARD`
+  * Host Environment Variable:
+   `OTEL_CPP_DEVCONTAINER_CXX_STANDARD`
+
+* **abseil-cpp version:**
+  This is the version of abseil-cpp that will be used to build protobuf, gRPC,
+  and opentelemetry-cpp.
+  * Docker ARG:
+   `ABSEIL_CPP_VERSION`
+  * Host Environment Variable:
+   `OTEL_CPP_DEVCONTAINER_ABSEIL_CPP_VERSION`
+
+* **Protobuf version:**
+  * Docker ARG:
+   `PROTOBUF_VERSION`
+  * Host Environment Variable:
+   `OTEL_CPP_DEVCONTAINER_PROTOBUF_VERSION`
+
+* **gRPC version:**
+  * Docker ARG:
+   `GRPC_VERSION`
+  * Host Environment Variable:
+   `OTEL_CPP_DEVCONTAINER_GRPC_VERSION`
+
+* **User ID (UID):**
+  User ID (Default: `1000`)
+  * Docker ARG:
+   `USER_UID`
+  * Host Environment Variable:
+   `OTEL_CPP_DEVCONTAINER_USER_UID`
+
+* **Group ID (GID):**
+  User group ID (Default: `1000`)
+  * Docker ARG:
+   `USER_GID`
+  * Host Environment Variable:
+   `OTEL_CPP_DEVCONTAINER_USER_GID`
+
+* **Install Packages:**
+  These are the additional packages that will be installed via `apt install` in the devcontainer. This is a space separated list.
+  * Docker ARG:
+   `INSTALL_PACKAGES`  (Default: ``)
+  * Host Environment Variable:
+   `OTEL_CPP_DEVCONTAINER_INSTALL_PACKAGES` (Default: ``)
+
+## Examples
+
+* `docker build --build-arg CXX_STANDARD="20" --build-arg INSTALL_PACKAGES="nano gitk"...`
+* `export OTEL_CPP_DEVCONTAINER_CXX_STANDARD=20`
+* `export OTEL_CPP_DEVCONTAINER_INSTALL_PACKAGES="nano gitk"`

+ 39 - 0
ext/opentelemetry-cpp-1.21.0/.devcontainer/customize_container.sh

@@ -0,0 +1,39 @@
+#!/bin/bash
+
+# Copyright The OpenTelemetry Authors
+# SPDX-License-Identifier: Apache-2.0
+
+set -eu
+
+if [[ $IS_CONTAINER_BUILD != "true" ]]; then
+     echo "This script should only run inside a Docker container."
+     exit 1
+fi
+
+if [[ -n "$INSTALL_PACKAGES" ]]; then
+    packages=($INSTALL_PACKAGES)
+    for package in "${packages[@]}"; do
+        apt install -y "$package"
+    done
+fi
+
+if [[ $(id "$USER_NAME" 2>/dev/null) ]]; then
+    echo "User '$USER_NAME' already exists. Removing it."
+    userdel -rf "$USER_NAME"
+elif [[ $(id -u "$USER_UID" 2>/dev/null) ]]; then
+    OTHER_USER=$(getent passwd "$USER_UID" | cut -d: -f1)
+    echo "User '$OTHER_USER' exists with UID $USER_UID. Removing it."
+    userdel -rf "$OTHER_USER"
+fi
+
+if [[ ! $(getent group "$USER_GID" 2>/dev/null) ]]; then
+    echo "Group '$USER_GID' does not exist. Adding it."
+    groupadd -g "$USER_GID" "$USER_NAME"
+fi
+
+useradd -m -u "$USER_UID" -g "$USER_GID" -s /bin/bash "$USER_NAME"
+echo "Created user '$USER_NAME' (UID: $USER_UID, GID: $USER_GID)."
+
+echo "$USER_NAME ALL=(ALL) NOPASSWD:ALL" | tee /etc/sudoers.d/"$USER_NAME"
+
+echo "User and group setup complete."

+ 35 - 0
ext/opentelemetry-cpp-1.21.0/.devcontainer/devcontainer.json

@@ -0,0 +1,35 @@
+// Copyright The OpenTelemetry Authors
+// SPDX-License-Identifier: Apache-2.0
+// For format details, see https://aka.ms/devcontainer.json. For config options, see the README at:
+// https://github.com/microsoft/vscode-dev-containers/tree/v0.162.0/containers/javascript-node
+{
+	"name": "opentelemetry-cpp",
+	"build": {
+		"context": "..",
+		"dockerfile": "Dockerfile.dev",
+		"args": {
+			"USER_UID": "${localEnv:OTEL_CPP_DEVCONTAINER_USER_UID:1000}",
+			"USER_GID": "${localEnv:OTEL_CPP_DEVCONTAINER_USER_GID:1000}",
+			"INSTALL_PACKAGES": "${localEnv:OTEL_CPP_DEVCONTAINER_INSTALL_PACKAGES:}",
+			"CMAKE_VERSION": "${localEnv:OTEL_CPP_DEVCONTAINER_CMAKE_VERSION:3.31.6}",
+			"CXX_STANDARD": "${localEnv:OTEL_CPP_DEVCONTAINER_CXX_STANDARD:17}",
+			"GRPC_VERSION": "${localEnv:OTEL_CPP_DEVCONTAINER_GRPC_VERSION:v1.55.0}",
+			"PROTOBUF_VERSION": "${localEnv:OTEL_CPP_DEVCONTAINER_PROTOBUF_VERSION:23.3}",
+			"ABSEIL_CPP_VERSION":"${localEnv:OTEL_CPP_DEVCONTAINER_ABSEIL_CPP_VERSION:20230125.3}"
+		}
+	},
+	"customizations": {
+		"vscode": {
+			"extensions": [
+				"ms-vscode.cpptools",
+				"ms-azuretools.vscode-docker",
+				"ms-vscode.cpptools-extension-pack"
+			],
+			"settings": {
+				"terminal.integrated.shell.linux": "/bin/bash",
+			}
+		}
+	},
+
+	"remoteUser": "devuser"
+}

+ 47 - 0
ext/opentelemetry-cpp-1.21.0/.gitattributes

@@ -0,0 +1,47 @@
+##### Source code #####
+
+## C++ and C source files
+*.c                     text eol=lf diff=cpp
+*.h                     text eol=lf diff=cpp
+*.cc                    text eol=lf diff=cpp
+*.cpp                   text eol=lf diff=cpp
+*.cxx                   text eol=lf diff=cpp
+*.hpp                   text eol=lf diff=cpp
+
+## Python scripts
+*.py                    text eol=lf diff=python
+
+## Perl scripts/libraries/modules
+*.perl                  text eol=lf diff=perl
+*.pl                    text eol=lf diff=perl
+*.pm                    text eol=lf diff=perl
+
+## Shell scripts
+*.sh                    text eol=lf
+*.bash                  text eol=lf
+
+## Windows batch and PowerShell scripts
+*.bat                   text eol=crlf
+*.cmd                   text eol=crlf
+*.ps1                   text eol=crlf
+
+##### Other file types #####
+
+## Text files and documentation
+*.txt                   text
+README*                 text
+INSTALL*                text
+LICENSE*                text
+
+## Non-text documentation
+*.html                  text diff=html
+*.pdf                   binary
+*.rtf                   binary
+
+## git files
+.gitignore              text eol=lf
+.gitattributes          text eol=lf
+
+## bazel files
+WORKSPACE               text eol=lf
+BUILD                   text eol=lf

+ 50 - 0
ext/opentelemetry-cpp-1.21.0/.github/.codecov.yaml

@@ -0,0 +1,50 @@
+codecov:
+  require_ci_to_pass: false
+  max_report_age: off
+
+coverage:
+  precision: 2
+  round: up
+  range: "80...100"
+  status:
+    project:
+      default:
+        informational: true
+        target: auto
+        threshold: 10%
+    patch: false
+
+parsers:
+  gcov:
+    branch_detection:
+      conditional: yes
+      loop: yes
+      method: no
+      macro: no
+
+comment:
+  layout: "reach,diff,flags,tree"
+  behavior: default
+  require_changes: false
+
+# Relative file path fixing.
+# CI file paths must match Git file paths.
+# This fix removes the "/home/runner/" prefix
+# to coverage report file paths.
+fixes:
+  - "/home/runner/::"
+
+ignore:
+  - "docs/**/*"
+  - "docker/**/*"
+  - "examples/**/*"
+  - "bazel/**/*"
+  - "cmake/**/*"
+  - "buildscripts/**/*"
+  - "third_party/**/*"
+  - "test_common/**/*"
+  - "tools/**/*"
+  - ".vscode/**/*"
+  - ".github/**/*"
+  - "**/test/**/*"
+  - "**.md"

+ 8 - 0
ext/opentelemetry-cpp-1.21.0/.github/CODEOWNERS

@@ -0,0 +1,8 @@
+# Code owners file.
+# This file controls who is tagged for review for any given pull request.
+
+# For ETW exporter
+exporters/etw/*  @reyang @maxgolov @lalitb @ThomsonTan @open-telemetry/cpp-approvers
+
+# For anything not explicitly taken by someone else:
+*       @open-telemetry/cpp-approvers

+ 19 - 0
ext/opentelemetry-cpp-1.21.0/.github/ISSUE_TEMPLATE/bug_report.md

@@ -0,0 +1,19 @@
+---
+name: Bug Report
+about: Create a report to help us improve
+labels: bug
+---
+
+**Describe your environment** Describe any aspect of your environment relevant to the problem, including your platform, build system, version numbers of installed dependencies, etc. If you're reporting a problem with a specific version of a library in this repo, please check whether the problem has been fixed on main branch.
+
+**Steps to reproduce**
+Describe exactly how to reproduce the error. Include a code sample if applicable.
+
+**What is the expected behavior?**
+What did you expect to see?
+
+**What is the actual behavior?**
+What did you see instead?
+
+**Additional context**
+Add any other context about the problem here.

+ 19 - 0
ext/opentelemetry-cpp-1.21.0/.github/ISSUE_TEMPLATE/feature_request.md

@@ -0,0 +1,19 @@
+---
+name: Feature Request
+about: Suggest an idea for this project
+labels: feature-request
+---
+
+Before opening a feature request against this repo, consider whether the feature should/could be implemented in the [other OpenTelemetry client libraries](https://github.com/open-telemetry/). If so, please [open an issue on opentelemetry-specification](https://github.com/open-telemetry/opentelemetry-specification/issues/new) first.
+
+**Is your feature request related to a problem?**
+If so, provide a concise description of the problem.
+
+**Describe the solution you'd like**
+What do you want to happen instead? What is the expected behavior?
+
+**Describe alternatives you've considered**
+Which alternative solutions or features have you considered?
+
+**Additional context**
+Add any other context about the feature request here.

+ 13 - 0
ext/opentelemetry-cpp-1.21.0/.github/dependabot.yml

@@ -0,0 +1,13 @@
+version: 2
+updates:
+  - package-ecosystem: "github-actions"
+    directory: "/"
+    schedule:
+      interval: "daily"
+    labels:
+      - "GHA"
+
+  - package-ecosystem: "devcontainers"
+    directory: "/"
+    schedule:
+     interval: daily

+ 11 - 0
ext/opentelemetry-cpp-1.21.0/.github/pull_request_template.md

@@ -0,0 +1,11 @@
+Fixes # (issue)
+
+## Changes
+
+Please provide a brief description of the changes here.
+
+For significant contributions please make sure you have completed the following items:
+
+* [ ] `CHANGELOG.md` updated for non-trivial changes
+* [ ] Unit tests have been added
+* [ ] Changes in public API reviewed

+ 38 - 0
ext/opentelemetry-cpp-1.21.0/.github/repository-settings.md

@@ -0,0 +1,38 @@
+# Process
+
+This file documents local admin changes for opentelemetry-cpp,
+per the community process: https://github.com/open-telemetry/community/blob/main/docs/how-to-configure-new-repository.md
+
+Please note that the EasyCLA check **MUST** stay **REQUIRED**,
+it should never be disabled or bypassed, at the risk of tainting the repository.
+
+# Guidelines
+
+The best is to open a PR first that describes the change,
+so it can be discussed during review (maybe it is not needed,
+maybe there is an alternate solution, ...).
+
+The PR must add a log entry in this file, detailing:
+
+* the date the change is implemented
+* what is changed exactly (which setting)
+* a short rationale
+
+Admin changes are then applied only when the PR is merged.
+
+If for some reason a change is implemented in emergency,
+before a PR can be discussed and merged,
+a PR should still be prepared and pushed after the fact to
+describe the settings changed.
+
+# Log of local changes
+
+## 2023-11-03
+
+Created log file `.github/repository-settings.md`, since admin permissions are now granted to maintainers.
+
+See https://github.com/open-telemetry/community/issues/1727
+
+No setting changed.
+
+

+ 82 - 0
ext/opentelemetry-cpp-1.21.0/.github/workflows/benchmark.yml

@@ -0,0 +1,82 @@
+name: OpenTelemetry-cpp benchmarks
+on:
+  push:
+    branches:
+      - main
+
+permissions:
+  contents: write
+  deployments: write
+
+jobs:
+  benchmark:
+    name: Run OpenTelemetry-cpp benchmarks
+    runs-on: ubuntu-latest
+    steps:
+      - name: Harden the runner (Audit all outbound calls)
+        uses: step-security/harden-runner@0634a2670c59f64b4a01f0f96f84700a4088b9f0 # v2.12.0
+        with:
+          egress-policy: audit
+
+      - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
+        with:
+          submodules: 'recursive'
+      - name: Mount Bazel Cache
+        uses: actions/cache@5a3ec84eff668545956fd18022155c47e93e2684 # v4.2.3
+        env:
+          cache-name: bazel_cache
+        with:
+          path: /home/runner/.cache/bazel
+          key: bazel_benchmark
+      - name: setup
+        run: |
+          sudo ./ci/setup_ci_environment.sh
+          sudo ./ci/install_bazelisk.sh
+      - name: Run benchmark
+        id: run_benchmarks
+        run: |
+          ./ci/do_ci.sh bazel.benchmark
+          mkdir -p benchmarks
+          mv api-benchmark_result.json benchmarks
+          mv sdk-benchmark_result.json benchmarks
+          mv exporters-benchmark_result.json benchmarks
+      - uses: actions/upload-artifact@6027e3dd177782cd8ab9af838c04fd81a07f1d47 # main March 2025
+        with:
+          name: benchmark_results
+          path: benchmarks
+  store_benchmark:
+    needs: benchmark
+    strategy:
+      matrix:
+        components: ["api", "sdk", "exporters"]
+    name: Store benchmark result
+    runs-on: ubuntu-latest
+    steps:
+      - name: Harden the runner (Audit all outbound calls)
+        uses: step-security/harden-runner@0634a2670c59f64b4a01f0f96f84700a4088b9f0 # v2.12.0
+        with:
+          egress-policy: audit
+
+      - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
+      - uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # main March 2025
+        with:
+          name: benchmark_results
+          path: benchmarks
+      - name: Print json files
+        id: print_json
+        run: |
+          cat benchmarks/*
+      - name: Push benchmark result
+        uses: benchmark-action/github-action-benchmark@d48d326b4ca9ba73ca0cd0d59f108f9e02a381c7 # v1.20.4
+        with:
+          name: OpenTelemetry-cpp ${{ matrix.components }} Benchmark
+          tool: 'googlecpp'
+          output-file-path: benchmarks/${{ matrix.components }}-benchmark_result.json
+          github-token: ${{ secrets.GITHUB_TOKEN }}
+          auto-push: true
+          # Show alert with commit comment on detecting possible performance regression
+          alert-threshold: '200%'
+          comment-on-alert: true
+          fail-on-alert: false
+          gh-pages-branch: gh-pages
+          benchmark-data-dir-path: benchmarks

+ 1247 - 0
ext/opentelemetry-cpp-1.21.0/.github/workflows/ci.yml

@@ -0,0 +1,1247 @@
+name: CI
+
+on:
+  push:
+    branches: [ main ]
+  pull_request:
+    branches: [ main ]
+
+permissions:
+  contents: read
+
+jobs:
+
+# Commented 2024-11-06, lack of workers in github causes CI failures
+#  arm64_test:
+#    name: CMake test arm64 (with modern protobuf,grpc and abseil)
+#    runs-on: actuated-arm64-4cpu-16gb
+#    steps:
+#    - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
+#      with:
+#        submodules: 'recursive'
+#    - name: setup
+#      env:
+#        PROTOBUF_VERSION: '23.3'
+#        ABSEIL_CPP_VERSION: '20230125.3'
+#        CXX_STANDARD: '14'
+#        CC: /usr/bin/gcc-10
+#        CXX: /usr/bin/g++-10
+#      run: |
+#        sudo -E ./ci/setup_gcc10.sh
+#        sudo -E ./ci/setup_ci_environment.sh
+#        sudo -E ./ci/setup_cmake.sh
+#        sudo -E ./ci/setup_googletest.sh
+#        sudo -E ./ci/install_abseil.sh
+#        sudo -E ./ci/install_protobuf.sh
+
+  cmake_test:
+    name: CMake test (prometheus, elasticsearch, zipkin)
+    runs-on: ubuntu-22.04
+    env:
+      CXX_STANDARD: '17'
+    steps:
+    - name: Harden the runner (Audit all outbound calls)
+      uses: step-security/harden-runner@0634a2670c59f64b4a01f0f96f84700a4088b9f0 # v2.12.0
+      with:
+        egress-policy: audit
+
+    - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
+      with:
+        submodules: 'recursive'
+    - name: setup
+      run: |
+        sudo -E ./ci/setup_ci_environment.sh
+        sudo -E ./ci/setup_cmake.sh
+        sudo -E ./ci/setup_googletest.sh
+    - name: run cmake tests
+      run: |
+        ./ci/do_ci.sh cmake.test
+
+  cmake_fetch_content_test:
+    name: CMake FetchContent usage with opentelemetry-cpp
+    runs-on: ubuntu-24.04
+    env:
+      CXX_STANDARD: '17'
+      BUILD_TYPE: 'Debug'
+    steps:
+    - name: Harden the runner (Audit all outbound calls)
+      uses: step-security/harden-runner@0634a2670c59f64b4a01f0f96f84700a4088b9f0 # v2.12.0
+      with:
+        egress-policy: audit
+    - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
+      with:
+        submodules: 'recursive'
+    - name: setup
+      run: |
+        sudo -E ./ci/setup_ci_environment.sh
+        sudo -E ./ci/setup_cmake.sh
+        sudo -E ./ci/setup_googletest.sh
+    - name: Install abseil, protobuf, and grpc with apt
+      run: |
+        sudo -E apt-get update
+        sudo -E apt-get install -y libabsl-dev libprotobuf-dev libgrpc++-dev protobuf-compiler protobuf-compiler-grpc
+    - name: run fetch content cmake test
+      run: |
+        ./ci/do_ci.sh cmake.fetch_content.test
+
+  cmake_gcc_maintainer_sync_test:
+    name: CMake gcc 14 (maintainer mode, sync)
+    runs-on: ubuntu-24.04
+    steps:
+    - name: Harden the runner (Audit all outbound calls)
+      uses: step-security/harden-runner@0634a2670c59f64b4a01f0f96f84700a4088b9f0 # v2.12.0
+      with:
+        egress-policy: audit
+
+    - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
+      with:
+        submodules: 'recursive'
+    - name: setup
+      env:
+        CC: /usr/bin/gcc-14
+        CXX: /usr/bin/g++-14
+        PROTOBUF_VERSION: 21.12
+      run: |
+        sudo apt remove needrestart #refer: https://github.com/actions/runner-images/issues/9937
+        sudo -E ./ci/setup_ci_environment.sh
+        sudo -E ./ci/setup_cmake.sh
+        sudo -E ./ci/setup_googletest.sh
+        sudo -E ./ci/install_protobuf.sh
+    - name: setup grpc
+      run: |
+        sudo ./ci/setup_grpc.sh
+    - name: run cmake gcc (maintainer mode, sync)
+      env:
+        CC: /usr/bin/gcc-14
+        CXX: /usr/bin/g++-14
+      run: |
+        ./ci/do_ci.sh cmake.maintainer.sync.test
+    - name: generate test cert
+      env:
+        CFSSL_VERSION: 1.6.3
+      run: |
+        sudo -E ./tools/setup-cfssl.sh
+        (cd ./functional/cert; ./generate_cert.sh)
+    - name: run func test
+      run: |
+        (cd ./functional/otlp; ./run_test.sh)
+
+  cmake_gcc_maintainer_async_test:
+    name: CMake gcc 14 (maintainer mode, async)
+    runs-on: ubuntu-24.04
+    steps:
+    - name: Harden the runner (Audit all outbound calls)
+      uses: step-security/harden-runner@0634a2670c59f64b4a01f0f96f84700a4088b9f0 # v2.12.0
+      with:
+        egress-policy: audit
+
+    - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
+      with:
+        submodules: 'recursive'
+    - name: setup
+      env:
+        CC: /usr/bin/gcc-14
+        CXX: /usr/bin/g++-14
+        PROTOBUF_VERSION: 21.12
+      run: |
+        sudo apt remove needrestart #refer: https://github.com/actions/runner-images/issues/9937
+        sudo -E ./ci/setup_ci_environment.sh
+        sudo -E ./ci/setup_cmake.sh
+        sudo -E ./ci/setup_googletest.sh
+        sudo -E ./ci/install_protobuf.sh
+    - name: setup grpc
+      run: |
+        sudo ./ci/setup_grpc.sh
+    - name: run cmake gcc (maintainer mode, async)
+      env:
+        CC: /usr/bin/gcc-14
+        CXX: /usr/bin/g++-14
+      run: |
+        ./ci/do_ci.sh cmake.maintainer.async.test
+    - name: generate test cert
+      env:
+        CFSSL_VERSION: 1.6.3
+      run: |
+        sudo -E ./tools/setup-cfssl.sh
+        (cd ./functional/cert; ./generate_cert.sh)
+    - name: run func test
+      run: |
+        (cd ./functional/otlp; ./run_test.sh)
+
+  cmake_clang_maintainer_sync_test:
+    name: CMake clang 18 (maintainer mode, sync)
+    runs-on: ubuntu-24.04
+    steps:
+    - name: Harden the runner (Audit all outbound calls)
+      uses: step-security/harden-runner@0634a2670c59f64b4a01f0f96f84700a4088b9f0 # v2.12.0
+      with:
+        egress-policy: audit
+
+    - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
+      with:
+        submodules: 'recursive'
+    - name: setup
+      env:
+        CC: /usr/bin/clang-18
+        CXX: /usr/bin/clang++-18
+        PROTOBUF_VERSION: 21.12
+      run: |
+        sudo apt remove needrestart #refer: https://github.com/actions/runner-images/issues/9937
+        sudo -E ./ci/setup_ci_environment.sh
+        sudo -E ./ci/setup_cmake.sh
+        sudo -E ./ci/setup_googletest.sh
+        sudo -E ./ci/install_protobuf.sh
+    - name: setup grpc
+      run: |
+        sudo ./ci/setup_grpc.sh
+    - name: run cmake clang (maintainer mode, sync)
+      env:
+        CC: /usr/bin/clang-18
+        CXX: /usr/bin/clang++-18
+      run: |
+        ./ci/do_ci.sh cmake.maintainer.sync.test
+    - name: generate test cert
+      env:
+        CFSSL_VERSION: 1.6.3
+      run: |
+        sudo -E ./tools/setup-cfssl.sh
+        (cd ./functional/cert; ./generate_cert.sh)
+    - name: run func test
+      run: |
+        (cd ./functional/otlp; ./run_test.sh)
+
+  cmake_clang_maintainer_async_test:
+    name: CMake clang 18 (maintainer mode, async)
+    runs-on: ubuntu-24.04
+    steps:
+    - name: Harden the runner (Audit all outbound calls)
+      uses: step-security/harden-runner@0634a2670c59f64b4a01f0f96f84700a4088b9f0 # v2.12.0
+      with:
+        egress-policy: audit
+
+    - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
+      with:
+        submodules: 'recursive'
+    - name: setup
+      env:
+        CC: /usr/bin/clang-18
+        CXX: /usr/bin/clang++-18
+        PROTOBUF_VERSION: 21.12
+      run: |
+        sudo apt remove needrestart #refer: https://github.com/actions/runner-images/issues/9937
+        sudo -E ./ci/setup_ci_environment.sh
+        sudo -E ./ci/setup_cmake.sh
+        sudo -E ./ci/setup_googletest.sh
+        sudo -E ./ci/install_protobuf.sh
+    - name: setup grpc
+      run: |
+        sudo ./ci/setup_grpc.sh
+    - name: run cmake clang (maintainer mode, async)
+      env:
+        CC: /usr/bin/clang-18
+        CXX: /usr/bin/clang++-18
+      run: |
+        ./ci/do_ci.sh cmake.maintainer.async.test
+    - name: generate test cert
+      env:
+        CFSSL_VERSION: 1.6.3
+      run: |
+        sudo -E ./tools/setup-cfssl.sh
+        (cd ./functional/cert; ./generate_cert.sh)
+    - name: run func test
+      run: |
+        (cd ./functional/otlp; ./run_test.sh)
+
+  cmake_clang_maintainer_abiv2_test:
+    name: CMake clang 18 (maintainer mode, abiv2)
+    runs-on: ubuntu-24.04
+    steps:
+    - name: Harden the runner (Audit all outbound calls)
+      uses: step-security/harden-runner@0634a2670c59f64b4a01f0f96f84700a4088b9f0 # v2.12.0
+      with:
+        egress-policy: audit
+
+    - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
+      with:
+        submodules: 'recursive'
+    - name: setup
+      env:
+        CC: /usr/bin/clang-18
+        CXX: /usr/bin/clang++-18
+        PROTOBUF_VERSION: 21.12
+      run: |
+        sudo apt remove needrestart #refer: https://github.com/actions/runner-images/issues/9937
+        sudo -E ./ci/setup_ci_environment.sh
+        sudo -E ./ci/setup_cmake.sh
+        sudo -E ./ci/setup_googletest.sh
+        sudo -E ./ci/install_protobuf.sh
+    - name: setup grpc
+      run: |
+        sudo ./ci/setup_grpc.sh
+    - name: run cmake clang (maintainer mode, abiv2)
+      env:
+        CC: /usr/bin/clang-18
+        CXX: /usr/bin/clang++-18
+      run: |
+        ./ci/do_ci.sh cmake.maintainer.abiv2.test
+    - name: generate test cert
+      env:
+        CFSSL_VERSION: 1.6.3
+      run: |
+        sudo -E ./tools/setup-cfssl.sh
+        (cd ./functional/cert; ./generate_cert.sh)
+    - name: run func test
+      run: |
+        (cd ./functional/otlp; ./run_test.sh)
+
+  cmake_msvc_maintainer_test:
+    name: CMake msvc (maintainer mode)
+    runs-on: windows-latest
+    steps:
+    - name: Harden the runner (Audit all outbound calls)
+      uses: step-security/harden-runner@0634a2670c59f64b4a01f0f96f84700a4088b9f0 # v2.12.0
+      with:
+        egress-policy: audit
+
+    - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
+      with:
+        submodules: 'recursive'
+    - name: setup
+      run: |
+        ./ci/setup_cmake.ps1
+        ./ci/setup_windows_ci_environment.ps1
+    - name: run tests
+      run: ./ci/do_ci.ps1 cmake.maintainer.test
+
+  cmake_msvc_maintainer_test_stl_cxx20:
+    name: CMake msvc (maintainer mode) with C++20
+    runs-on: windows-latest
+    steps:
+    - name: Harden the runner (Audit all outbound calls)
+      uses: step-security/harden-runner@0634a2670c59f64b4a01f0f96f84700a4088b9f0 # v2.12.0
+      with:
+        egress-policy: audit
+
+    - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
+      with:
+        submodules: 'recursive'
+    - name: setup
+      run: |
+        ./ci/setup_cmake.ps1
+        ./ci/setup_windows_ci_environment.ps1
+    - name: run tests
+      env:
+        CXX_STANDARD: '20'
+      run: ./ci/do_ci.ps1 cmake.maintainer.cxx20.stl.test
+
+  cmake_msvc_maintainer_abiv2_test:
+    name: CMake msvc (maintainer mode, abiv2)
+    runs-on: windows-latest
+    steps:
+    - name: Harden the runner (Audit all outbound calls)
+      uses: step-security/harden-runner@0634a2670c59f64b4a01f0f96f84700a4088b9f0 # v2.12.0
+      with:
+        egress-policy: audit
+
+    - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
+      with:
+        submodules: 'recursive'
+    - name: setup
+      run: |
+        ./ci/setup_cmake.ps1
+        ./ci/setup_windows_ci_environment.ps1
+    - name: run tests
+      env:
+        CXX_STANDARD: '20'
+      run: ./ci/do_ci.ps1 cmake.maintainer.abiv2.test
+
+  cmake_with_async_export_test:
+    name: CMake test (without otlp-exporter and with async export)
+    runs-on: ubuntu-latest
+    steps:
+    - name: Harden the runner (Audit all outbound calls)
+      uses: step-security/harden-runner@0634a2670c59f64b4a01f0f96f84700a4088b9f0 # v2.12.0
+      with:
+        egress-policy: audit
+
+    - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
+      with:
+        submodules: 'recursive'
+    - name: setup
+      env:
+        CC: /usr/bin/gcc-12
+        CXX: /usr/bin/g++-12
+      run: |
+        sudo -E ./ci/setup_ci_environment.sh
+        sudo -E ./ci/setup_cmake.sh
+        sudo -E ./ci/setup_googletest.sh
+    - name: run cmake tests (without otlp-exporter)
+      env:
+        CC: /usr/bin/gcc-12
+        CXX: /usr/bin/g++-12
+      run: |
+        ./ci/do_ci.sh cmake.with_async_export.test
+
+  cmake_opentracing_shim_test:
+    name: CMake test (with opentracing-shim)
+    runs-on: ubuntu-latest
+    steps:
+    - name: Harden the runner (Audit all outbound calls)
+      uses: step-security/harden-runner@0634a2670c59f64b4a01f0f96f84700a4088b9f0 # v2.12.0
+      with:
+        egress-policy: audit
+
+    - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
+      with:
+        submodules: 'recursive'
+    - name: setup
+      run: |
+        sudo -E ./ci/setup_ci_environment.sh
+        sudo -E ./ci/setup_cmake.sh
+        sudo -E ./ci/setup_googletest.sh
+    - name: run cmake tests (enable opentracing-shim)
+      run: ./ci/do_ci.sh cmake.opentracing_shim.test
+
+  cmake_test_cxx14_gcc:
+    name: CMake C++14 test(GCC)
+    runs-on: ubuntu-22.04
+    steps:
+    - name: Harden the runner (Audit all outbound calls)
+      uses: step-security/harden-runner@0634a2670c59f64b4a01f0f96f84700a4088b9f0 # v2.12.0
+      with:
+        egress-policy: audit
+
+    - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
+      with:
+        submodules: 'recursive'
+    - name: setup
+      run: |
+        sudo -E ./ci/setup_ci_environment.sh
+        sudo -E ./ci/setup_cmake.sh
+        sudo -E ./ci/setup_googletest.sh
+    - name: run tests (enable stl)
+      env:
+        CXX_STANDARD: '14'
+      run: ./ci/do_ci.sh cmake.c++14.stl.test
+
+  cmake_test_cxx17_gcc:
+    name: CMake C++17 test(GCC)
+    runs-on: ubuntu-22.04
+    steps:
+    - name: Harden the runner (Audit all outbound calls)
+      uses: step-security/harden-runner@0634a2670c59f64b4a01f0f96f84700a4088b9f0 # v2.12.0
+      with:
+        egress-policy: audit
+
+    - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
+      with:
+        submodules: 'recursive'
+    - name: setup
+      run: |
+        sudo -E ./ci/setup_ci_environment.sh
+        sudo -E ./ci/setup_cmake.sh
+        sudo -E ./ci/setup_googletest.sh
+    - name: run tests (enable stl)
+      env:
+        CXX_STANDARD: '17'
+      run: ./ci/do_ci.sh cmake.c++17.stl.test
+
+  cmake_test_cxx20_gcc:
+    name: CMake C++20 test(GCC)
+    runs-on: ubuntu-22.04
+    steps:
+    - name: Harden the runner (Audit all outbound calls)
+      uses: step-security/harden-runner@0634a2670c59f64b4a01f0f96f84700a4088b9f0 # v2.12.0
+      with:
+        egress-policy: audit
+
+    - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
+      with:
+        submodules: 'recursive'
+    - name: setup
+      run: |
+        sudo -E ./ci/setup_ci_environment.sh
+        sudo -E ./ci/setup_cmake.sh
+        sudo -E ./ci/setup_googletest.sh
+    - name: run tests
+      env:
+        CXX_STANDARD: '20'
+      run: ./ci/do_ci.sh cmake.c++20.test
+    - name: run tests (enable stl)
+      env:
+        CXX_STANDARD: '20'
+      run: ./ci/do_ci.sh cmake.c++20.stl.test
+
+  cmake_test_cxx20_clang:
+    name: CMake C++20 test(Clang with libc++)
+    runs-on: ubuntu-22.04
+    steps:
+    - name: Harden the runner (Audit all outbound calls)
+      uses: step-security/harden-runner@0634a2670c59f64b4a01f0f96f84700a4088b9f0 # v2.12.0
+      with:
+        egress-policy: audit
+
+    - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
+      with:
+        submodules: 'recursive'
+    - name: setup
+      env:
+        CC: /usr/bin/clang
+        CXX: /usr/bin/clang++
+        CXXFLAGS: "-stdlib=libc++"
+      run: |
+        sudo -E ./ci/setup_ci_environment.sh
+        sudo -E ./ci/setup_cmake.sh
+        sudo -E ./ci/setup_googletest.sh
+    - name: run tests
+      env:
+        CC: /usr/bin/clang
+        CXX: /usr/bin/clang++
+        CXXFLAGS: "-stdlib=libc++"
+        CXX_STANDARD: '20'
+      run: ./ci/do_ci.sh cmake.c++20.test
+    - name: run tests (enable stl)
+      env:
+        CC: /usr/bin/clang
+        CXX: /usr/bin/clang++
+        CXXFLAGS: "-stdlib=libc++"
+        CXX_STANDARD: '20'
+      run: ./ci/do_ci.sh cmake.c++20.stl.test
+
+  cmake_test_cxx23_gcc:
+    name: CMake C++23 test(GCC)
+    runs-on: ubuntu-latest
+    steps:
+    - name: Harden the runner (Audit all outbound calls)
+      uses: step-security/harden-runner@0634a2670c59f64b4a01f0f96f84700a4088b9f0 # v2.12.0
+      with:
+        egress-policy: audit
+
+    - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
+      with:
+        submodules: 'recursive'
+    - name: setup
+      run: |
+        sudo -E ./ci/setup_ci_environment.sh
+        sudo -E ./ci/setup_cmake.sh
+        sudo -E ./ci/setup_googletest.sh
+    - name: run tests
+      env:
+        CXX_STANDARD: '23'
+      run: ./ci/do_ci.sh cmake.c++23.test
+    - name: run tests (enable stl)
+      env:
+        CXX_STANDARD: '23'
+      run: ./ci/do_ci.sh cmake.c++23.stl.test
+
+  cmake_test_cxx23_clang:
+    name: CMake C++23 test(Clang with libc++)
+    runs-on: ubuntu-22.04
+    steps:
+    - name: Harden the runner (Audit all outbound calls)
+      uses: step-security/harden-runner@0634a2670c59f64b4a01f0f96f84700a4088b9f0 # v2.12.0
+      with:
+        egress-policy: audit
+
+    - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
+      with:
+        submodules: 'recursive'
+    - name: setup
+      env:
+        CC: /usr/bin/clang
+        CXX: /usr/bin/clang++
+        CXXFLAGS: "-stdlib=libc++"
+      run: |
+        sudo -E ./ci/setup_ci_environment.sh
+        sudo -E ./ci/setup_cmake.sh
+        sudo -E ./ci/setup_googletest.sh
+    - name: run tests
+      env:
+        CC: /usr/bin/clang
+        CXX: /usr/bin/clang++
+        CXXFLAGS: "-stdlib=libc++"
+        CXX_STANDARD: '23'
+      run: ./ci/do_ci.sh cmake.c++23.test
+    - name: run tests (enable stl)
+      env:
+        CC: /usr/bin/clang
+        CXX: /usr/bin/clang++
+        CXXFLAGS: "-stdlib=libc++"
+        CXX_STANDARD: '23'
+      run: ./ci/do_ci.sh cmake.c++23.stl.test
+
+  cmake_otprotocol_test:
+    name: CMake test (with otlp-exporter)
+    runs-on: ubuntu-22.04
+    steps:
+    - name: Harden the runner (Audit all outbound calls)
+      uses: step-security/harden-runner@0634a2670c59f64b4a01f0f96f84700a4088b9f0 # v2.12.0
+      with:
+        egress-policy: audit
+
+    - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
+      with:
+        submodules: 'recursive'
+    - name: setup
+      run: |
+        sudo -E ./ci/setup_ci_environment.sh
+        sudo -E ./ci/setup_cmake.sh
+        sudo -E ./ci/setup_googletest.sh
+    - name: run otlp exporter tests
+      run: |
+        sudo ./ci/setup_grpc.sh
+        ./ci/do_ci.sh cmake.exporter.otprotocol.test
+    - name: generate test cert
+      env:
+        CFSSL_VERSION: 1.6.3
+      run: |
+        sudo -E ./tools/setup-cfssl.sh
+        (cd ./functional/cert; ./generate_cert.sh)
+    - name: run func test
+      run: |
+        (cd ./functional/otlp; ./run_test.sh)
+
+  cmake_modern_protobuf_grpc_with_abseil_test:
+    name: CMake test (with modern protobuf,grpc and abseil)
+    runs-on: ubuntu-latest
+    steps:
+    - name: Harden the runner (Audit all outbound calls)
+      uses: step-security/harden-runner@0634a2670c59f64b4a01f0f96f84700a4088b9f0 # v2.12.0
+      with:
+        egress-policy: audit
+
+    - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
+      with:
+        submodules: 'recursive'
+    - name: setup
+      env:
+        PROTOBUF_VERSION: '23.3'
+        ABSEIL_CPP_VERSION: '20230125.3'
+        CXX_STANDARD: '14'
+      run: |
+        sudo -E ./ci/setup_ci_environment.sh
+        sudo -E ./ci/setup_cmake.sh
+        sudo -E ./ci/setup_googletest.sh
+        sudo -E ./ci/install_abseil.sh
+        sudo -E ./ci/install_protobuf.sh
+    - name: run otlp exporter tests
+      env:
+        CXX_STANDARD: '14'
+      run: |
+        sudo -E ./ci/setup_grpc.sh -m -p protobuf -p abseil-cpp
+        ./ci/do_ci.sh cmake.exporter.otprotocol.test
+
+  cmake_do_not_install_test:
+    name: CMake do not install test (with otlp-exporter)
+    runs-on: ubuntu-22.04
+    steps:
+    - name: Harden the runner (Audit all outbound calls)
+      uses: step-security/harden-runner@0634a2670c59f64b4a01f0f96f84700a4088b9f0 # v2.12.0
+      with:
+        egress-policy: audit
+
+    - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
+      with:
+        submodules: 'recursive'
+    - name: setup
+      run: |
+        sudo -E ./ci/setup_ci_environment.sh
+        sudo -E ./ci/setup_cmake.sh
+        sudo -E ./ci/setup_googletest.sh
+    - name: run otlp exporter tests
+      run: |
+        sudo ./ci/setup_grpc.sh
+        ./ci/do_ci.sh cmake.do_not_install.test
+
+  cmake_otprotocol_shared_libs_with_static_grpc_test:
+    name: CMake test (build shared libraries with otlp-exporter and static gRPC)
+    runs-on: ubuntu-22.04
+    steps:
+    - name: Harden the runner (Audit all outbound calls)
+      uses: step-security/harden-runner@0634a2670c59f64b4a01f0f96f84700a4088b9f0 # v2.12.0
+      with:
+        egress-policy: audit
+
+    - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
+      with:
+        submodules: 'recursive'
+    - name: setup
+      run: |
+        sudo -E ./ci/setup_ci_environment.sh
+        sudo -E ./ci/setup_cmake.sh
+        sudo -E ./ci/setup_googletest.sh
+    - name: run otlp exporter tests
+      run: |
+        sudo ./ci/setup_grpc.sh -T
+        ./ci/do_ci.sh cmake.exporter.otprotocol.shared_libs.with_static_grpc.test
+
+  plugin_test:
+    name: Plugin -> CMake
+    runs-on: ubuntu-latest
+    steps:
+    - name: Harden the runner (Audit all outbound calls)
+      uses: step-security/harden-runner@0634a2670c59f64b4a01f0f96f84700a4088b9f0 # v2.12.0
+      with:
+        egress-policy: audit
+
+    - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
+      with:
+        submodules: 'recursive'
+    - name: setup
+      env:
+        CC: /usr/bin/gcc-12
+        CXX: /usr/bin/g++-12
+      run: |
+        sudo -E ./ci/setup_ci_environment.sh
+        sudo -E ./ci/setup_cmake.sh
+        sudo -E ./ci/setup_googletest.sh
+    - name: run tests
+      env:
+        CC: /usr/bin/gcc-12
+        CXX: /usr/bin/g++-12
+      run: ./ci/do_ci.sh cmake.test_example_plugin
+
+  bazel_test:
+    name: Bazel
+    runs-on: ubuntu-latest
+    steps:
+    - name: Harden the runner (Audit all outbound calls)
+      uses: step-security/harden-runner@0634a2670c59f64b4a01f0f96f84700a4088b9f0 # v2.12.0
+      with:
+        egress-policy: audit
+
+    - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
+      with:
+        submodules: 'recursive'
+    - name: Mount Bazel Cache
+      uses: actions/cache@5a3ec84eff668545956fd18022155c47e93e2684 # v4.2.3
+      env:
+        cache-name: bazel_cache
+      with:
+        path: /home/runner/.cache/bazel
+        key: bazel_test
+    - name: setup
+      run: |
+        sudo ./ci/setup_ci_environment.sh
+        sudo ./ci/setup_cmake.sh
+        sudo ./ci/install_bazelisk.sh
+    - name: run tests
+      run: ./ci/do_ci.sh bazel.test
+
+  bazel_no_bzlmod_test:
+    name: Bazel without bzlmod
+    runs-on: ubuntu-latest
+    steps:
+    - name: Harden the runner (Audit all outbound calls)
+      uses: step-security/harden-runner@0634a2670c59f64b4a01f0f96f84700a4088b9f0 # v2.12.0
+      with:
+        egress-policy: audit
+
+    - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
+      with:
+        submodules: 'recursive'
+    - name: Mount Bazel Cache
+      uses: actions/cache@5a3ec84eff668545956fd18022155c47e93e2684 # v4.2.3
+      env:
+        cache-name: bazel_cache
+      with:
+        path: /home/runner/.cache/bazel
+        key: bazel_test
+    - name: setup
+      run: |
+        sudo ./ci/setup_ci_environment.sh
+        sudo ./ci/setup_cmake.sh
+        sudo ./ci/install_bazelisk.sh
+    - name: run tests
+      run: ./ci/do_ci.sh bazel.no_bzlmod.test
+
+  bazel_test_async:
+    name: Bazel with async export
+    runs-on: ubuntu-latest
+    steps:
+    - name: Harden the runner (Audit all outbound calls)
+      uses: step-security/harden-runner@0634a2670c59f64b4a01f0f96f84700a4088b9f0 # v2.12.0
+      with:
+        egress-policy: audit
+
+    - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
+      with:
+        submodules: 'recursive'
+    - name: Mount Bazel Cache
+      uses: actions/cache@5a3ec84eff668545956fd18022155c47e93e2684 # v4.2.3
+      env:
+        cache-name: bazel_cache
+      with:
+        path: /home/runner/.cache/bazel
+        key: bazel_test
+    - name: setup
+      run: |
+        sudo ./ci/setup_ci_environment.sh
+        sudo ./ci/setup_cmake.sh
+        sudo ./ci/install_bazelisk.sh
+    - name: run tests
+      run: ./ci/do_ci.sh bazel.with_async_export.test
+
+  bazel_valgrind:
+    name: Bazel valgrind
+    runs-on: ubuntu-latest
+    steps:
+    - name: Harden the runner (Audit all outbound calls)
+      uses: step-security/harden-runner@0634a2670c59f64b4a01f0f96f84700a4088b9f0 # v2.12.0
+      with:
+        egress-policy: audit
+
+    - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
+      with:
+        submodules: 'recursive'
+    - name: Mount Bazel Cache
+      uses: actions/cache@5a3ec84eff668545956fd18022155c47e93e2684 # v4.2.3
+      env:
+        cache-name: bazel_cache
+      with:
+        path: /home/runner/.cache/bazel
+        key: bazel_valgrind
+    - name: setup
+      run: |
+        sudo ./ci/setup_ci_environment.sh
+        sudo ./ci/setup_cmake.sh
+        sudo ./ci/install_bazelisk.sh
+    - name: run tests
+      run: ./ci/do_ci.sh bazel.valgrind
+
+  bazel_noexcept:
+    name: Bazel noexcept
+    runs-on: ubuntu-latest
+    steps:
+    - name: Harden the runner (Audit all outbound calls)
+      uses: step-security/harden-runner@0634a2670c59f64b4a01f0f96f84700a4088b9f0 # v2.12.0
+      with:
+        egress-policy: audit
+
+    - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
+      with:
+        submodules: 'recursive'
+    - name: Mount Bazel Cache
+      uses: actions/cache@5a3ec84eff668545956fd18022155c47e93e2684 # v4.2.3
+      env:
+        cache-name: bazel_cache
+      with:
+        path: /home/runner/.cache/bazel
+        key: bazel_noexcept
+    - name: setup
+      run: |
+        sudo ./ci/setup_ci_environment.sh
+        sudo ./ci/setup_cmake.sh
+        sudo ./ci/install_bazelisk.sh
+    - name: run tests
+      run: ./ci/do_ci.sh bazel.noexcept
+
+  bazel_nortti:
+    name: Bazel nortti
+    runs-on: ubuntu-latest
+    steps:
+    - name: Harden the runner (Audit all outbound calls)
+      uses: step-security/harden-runner@0634a2670c59f64b4a01f0f96f84700a4088b9f0 # v2.12.0
+      with:
+        egress-policy: audit
+
+    - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
+      with:
+        submodules: 'recursive'
+    - name: Mount Bazel Cache
+      uses: actions/cache@5a3ec84eff668545956fd18022155c47e93e2684 # v4.2.3
+      env:
+        cache-name: bazel_cache
+      with:
+        path: /home/runner/.cache/bazel
+        key: bazel_nortti
+    - name: setup
+      run: |
+        sudo ./ci/setup_ci_environment.sh
+        sudo ./ci/setup_cmake.sh
+        sudo ./ci/install_bazelisk.sh
+    - name: run tests
+      run: ./ci/do_ci.sh bazel.nortti
+
+  bazel_asan:
+    name: Bazel asan config
+    runs-on: ubuntu-latest
+    steps:
+    - name: Harden the runner (Audit all outbound calls)
+      uses: step-security/harden-runner@0634a2670c59f64b4a01f0f96f84700a4088b9f0 # v2.12.0
+      with:
+        egress-policy: audit
+
+    - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
+      with:
+        submodules: 'recursive'
+    - name: Mount Bazel Cache
+      uses: actions/cache@5a3ec84eff668545956fd18022155c47e93e2684 # v4.2.3
+      env:
+        cache-name: bazel_cache
+      with:
+        path: /home/runner/.cache/bazel
+        key: bazel_asan
+    - name: setup
+      run: |
+        sudo ./ci/setup_ci_environment.sh
+        sudo ./ci/setup_cmake.sh
+        sudo ./ci/install_bazelisk.sh
+    - name: run tests
+      run: ./ci/do_ci.sh bazel.asan
+
+  bazel_tsan:
+    name: Bazel tsan config
+    runs-on: ubuntu-latest
+    steps:
+    - name: Harden the runner (Audit all outbound calls)
+      uses: step-security/harden-runner@0634a2670c59f64b4a01f0f96f84700a4088b9f0 # v2.12.0
+      with:
+        egress-policy: audit
+
+    - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
+      with:
+        submodules: 'recursive'
+    - name: Mount Bazel Cache
+      uses: actions/cache@5a3ec84eff668545956fd18022155c47e93e2684 # v4.2.3
+      env:
+        cache-name: bazel_cache
+      with:
+        path: /home/runner/.cache/bazel
+        key: bazel_tsan
+    - name: setup
+      run: |
+        sudo ./ci/setup_ci_environment.sh
+        sudo ./ci/setup_cmake.sh
+        sudo ./ci/install_bazelisk.sh
+    - name: run tests
+      run: ./ci/do_ci.sh bazel.tsan
+
+  bazel_osx:
+    name: Bazel on MacOS
+    runs-on: macos-latest
+    steps:
+    - name: Harden the runner (Audit all outbound calls)
+      uses: step-security/harden-runner@0634a2670c59f64b4a01f0f96f84700a4088b9f0 # v2.12.0
+      with:
+        egress-policy: audit
+
+    - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
+      with:
+        submodules: 'recursive'
+    - name: Mount Bazel Cache
+      uses: actions/cache@5a3ec84eff668545956fd18022155c47e93e2684 # v4.2.3
+      env:
+        cache-name: bazel_cache
+      with:
+        path: /Users/runner/.cache/bazel
+        key: bazel_osx
+    - name: run tests
+      run: ./ci/do_ci.sh bazel.macos.test
+
+  benchmark:
+    name: Benchmark
+    runs-on: ubuntu-latest
+    steps:
+    - name: Harden the runner (Audit all outbound calls)
+      uses: step-security/harden-runner@0634a2670c59f64b4a01f0f96f84700a4088b9f0 # v2.12.0
+      with:
+        egress-policy: audit
+
+    - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
+      with:
+        submodules: 'recursive'
+    - name: Mount Bazel Cache
+      uses: actions/cache@5a3ec84eff668545956fd18022155c47e93e2684 # v4.2.3
+      env:
+        cache-name: bazel_cache
+      with:
+        path: /home/runner/.cache/bazel
+        key: bazel_benchmark
+    - name: setup
+      run: |
+        sudo ./ci/setup_ci_environment.sh
+        sudo ./ci/install_bazelisk.sh
+    - name: run tests
+      run: |
+        env BENCHMARK_DIR=/benchmark
+        ./ci/do_ci.sh benchmark
+    - name: Upload benchmark results
+      uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
+      with:
+        name: benchmark_reports
+        path: /home/runner/benchmark
+
+  format:
+    name: Format
+    runs-on: ubuntu-24.04
+    steps:
+    - name: Harden the runner (Audit all outbound calls)
+      uses: step-security/harden-runner@0634a2670c59f64b4a01f0f96f84700a4088b9f0 # v2.12.0
+      with:
+        egress-policy: audit
+
+    - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
+    - name: setup
+      run: sudo apt remove needrestart && sudo ./ci/install_format_tools.sh #refer: https://github.com/actions/runner-images/issues/9937
+    - name: run tests
+      run: ./ci/do_ci.sh format
+
+  copyright:
+    name: Copyright
+    runs-on: ubuntu-22.04
+    steps:
+    - name: Harden the runner (Audit all outbound calls)
+      uses: step-security/harden-runner@0634a2670c59f64b4a01f0f96f84700a4088b9f0 # v2.12.0
+      with:
+        egress-policy: audit
+
+    - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
+    - name: check copyright
+      run: ./tools/check_copyright.sh
+
+  windows:
+    name: CMake -> exporter proto
+    runs-on: windows-2019
+    steps:
+    - name: Harden the runner (Audit all outbound calls)
+      uses: step-security/harden-runner@0634a2670c59f64b4a01f0f96f84700a4088b9f0 # v2.12.0
+      with:
+        egress-policy: audit
+
+    - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
+      with:
+        submodules: 'recursive'
+    - name: setup
+      run: |
+        ./ci/setup_cmake.ps1
+        ./ci/setup_windows_ci_environment.ps1
+        ./ci/install_windows_protobuf.ps1
+    - name: run cmake test
+      run: ./ci/do_ci.ps1 cmake.test
+    - name: run otprotocol test
+      run: ./ci/do_ci.ps1 cmake.exporter.otprotocol.test
+
+  windows-build-dll:
+    name: CMake -> exporter proto (Build as DLL)
+    runs-on: windows-2019
+    steps:
+    - name: Harden the runner (Audit all outbound calls)
+      uses: step-security/harden-runner@0634a2670c59f64b4a01f0f96f84700a4088b9f0 # v2.12.0
+      with:
+        egress-policy: audit
+
+    - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
+      with:
+        submodules: 'recursive'
+    - name: setup
+      run: |
+        ./ci/setup_cmake.ps1
+        ./ci/setup_windows_ci_environment.ps1
+        ./ci/install_windows_protobuf.ps1
+    - name: run cmake test (DLL build)
+      run: ./ci/do_ci.ps1 cmake.dll.test
+    - name: run cmake cxx20 test (DLL build)
+      run: ./ci/do_ci.ps1 cmake.dll.cxx20.test
+    - name: run otprotocol test (DLL build)
+      run: ./ci/do_ci.ps1 cmake.exporter.otprotocol.dll.test
+
+  windows_with_async_export:
+    name: CMake (With async export) -> exporter proto
+    runs-on: windows-2019
+    steps:
+    - name: Harden the runner (Audit all outbound calls)
+      uses: step-security/harden-runner@0634a2670c59f64b4a01f0f96f84700a4088b9f0 # v2.12.0
+      with:
+        egress-policy: audit
+
+    - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
+      with:
+        submodules: 'recursive'
+    - name: setup
+      run: |
+        ./ci/setup_cmake.ps1
+        ./ci/setup_windows_ci_environment.ps1
+        ./ci/install_windows_protobuf.ps1
+    - name: run cmake test
+      run: ./ci/do_ci.ps1 cmake.with_async_export.test
+    - name: run otprotocol test
+      run: ./ci/do_ci.ps1 cmake.exporter.otprotocol.with_async_export.test
+
+  windows_bazel:
+    name: Bazel Windows
+    runs-on: windows-2019
+    steps:
+    - name: Harden the runner (Audit all outbound calls)
+      uses: step-security/harden-runner@0634a2670c59f64b4a01f0f96f84700a4088b9f0 # v2.12.0
+      with:
+        egress-policy: audit
+
+    - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
+      with:
+        submodules: 'recursive'
+    - name: setup
+      run: |
+        ./ci/install_windows_bazelisk.ps1
+    - name: run tests
+      run: ./ci/do_ci.ps1 bazel.build
+
+  windows_plugin_test:
+    name: Plugin -> CMake Windows
+    runs-on: windows-2019
+    steps:
+    - name: Harden the runner (Audit all outbound calls)
+      uses: step-security/harden-runner@0634a2670c59f64b4a01f0f96f84700a4088b9f0 # v2.12.0
+      with:
+        egress-policy: audit
+
+    - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
+      with:
+        submodules: 'recursive'
+    - name: setup
+      run: |
+        ./ci/setup_cmake.ps1
+        ./ci/setup_windows_ci_environment.ps1
+    - name: run tests
+      run: ./ci/do_ci.ps1 cmake.test_example_plugin
+
+  code_coverage:
+    name: Code coverage
+    runs-on: ubuntu-22.04
+    steps:
+    - name: Harden the runner (Audit all outbound calls)
+      uses: step-security/harden-runner@0634a2670c59f64b4a01f0f96f84700a4088b9f0 # v2.12.0
+      with:
+        egress-policy: audit
+
+    - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
+      with:
+        submodules: 'recursive'
+    - name: setup
+      env:
+        CC: /usr/bin/gcc-10
+        CXX: /usr/bin/g++-10
+      run: |
+        sudo -E ./ci/setup_ci_environment.sh
+        sudo -E ./ci/setup_cmake.sh
+        sudo -E ./ci/setup_googletest.sh
+    - name: run tests and generate report
+      env:
+        CC: /usr/bin/gcc-10
+        CXX: /usr/bin/g++-10
+      run: ./ci/do_ci.sh code.coverage
+    - name: upload report
+      uses: codecov/codecov-action@18283e04ce6e62d37312384ff67231eb8fd56d24 # v5.4.3
+      with:
+        files: /home/runner/build/coverage.info
+
+  markdown-lint:
+    runs-on: ubuntu-latest
+
+    steps:
+    - name: Harden the runner (Audit all outbound calls)
+      uses: step-security/harden-runner@0634a2670c59f64b4a01f0f96f84700a4088b9f0 # v2.12.0
+      with:
+        egress-policy: audit
+
+    - name: check out code
+      uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
+
+    - name: install markdownlint-cli
+      run: sudo npm install -g [email protected]
+
+    - name: run markdownlint
+      run: markdownlint .
+
+  shellcheck:
+    runs-on: ubuntu-latest
+    steps:
+    - name: Harden the runner (Audit all outbound calls)
+      uses: step-security/harden-runner@0634a2670c59f64b4a01f0f96f84700a4088b9f0 # v2.12.0
+      with:
+        egress-policy: audit
+
+    - name: check out code
+      uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
+    - name: install shellcheck
+      run: sudo apt install --assume-yes shellcheck
+    - name: run shellcheck
+      run: find . -name \*.sh | xargs shellcheck --severity=error
+
+  misspell:
+    runs-on: ubuntu-latest
+    steps:
+    - name: Harden the runner (Audit all outbound calls)
+      uses: step-security/harden-runner@0634a2670c59f64b4a01f0f96f84700a4088b9f0 # v2.12.0
+      with:
+        egress-policy: audit
+
+    - name: check out code
+      uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
+    - name: install misspell
+      run: |
+        curl -L -o ./install-misspell.sh https://git.io/misspell
+        sh ./install-misspell.sh
+    - name: run misspell
+      run: ./bin/misspell -error .
+
+  docfx_check:
+    name: DocFX check
+    runs-on: windows-latest
+    steps:
+    - name: Harden the runner (Audit all outbound calls)
+      uses: step-security/harden-runner@0634a2670c59f64b4a01f0f96f84700a4088b9f0 # v2.12.0
+      with:
+        egress-policy: audit
+
+    - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
+    - name: install docfx
+      run: choco install docfx -y --version=2.58.5
+    - name: run ./ci/docfx.cmd
+      shell: cmd
+      run: ./ci/docfx.cmd
+
+  w3c_trace_context_compliance_v1:
+    name: W3C Distributed Tracing Validation V1
+    runs-on: ubuntu-latest
+    steps:
+      - name: Harden the runner (Audit all outbound calls)
+        uses: step-security/harden-runner@0634a2670c59f64b4a01f0f96f84700a4088b9f0 # v2.12.0
+        with:
+          egress-policy: audit
+
+      - name: Checkout open-telemetry/opentelemetry-cpp
+        uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
+        with:
+          submodules: 'recursive'
+      - name: setup
+        env:
+          CC: /usr/bin/gcc-12
+          CXX: /usr/bin/g++-12
+        run: |
+          sudo -E ./ci/setup_ci_environment.sh
+          sudo -E ./ci/setup_cmake.sh
+          sudo -E ./ci/setup_googletest.sh
+      - name: run w3c trace-context test server (background)
+        env:
+          CXX_STANDARD: '14'
+        run: |
+          ./ci/do_ci.sh cmake.w3c.trace-context.build-server
+          cd $HOME/build/ext/test/w3c_tracecontext_http_test_server
+          ./w3c_tracecontext_http_test_server &
+      - name: Checkout w3c/trace-context repo
+        uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
+        with:
+          repository: w3c/trace-context
+          path: trace-context
+      - name: install dependencies
+        run: |
+          sudo apt update && sudo apt install python3-pip
+          sudo pip3 install aiohttp==3.11.18
+      - name: run w3c trace-context test suite
+        env:
+          SPEC_LEVEL: 1
+        run:
+          |
+          python ${GITHUB_WORKSPACE}/trace-context/test/test.py http://localhost:30000/test TraceContextTest AdvancedTest
+          curl http://localhost:30000/stop

+ 89 - 0
ext/opentelemetry-cpp-1.21.0/.github/workflows/clang-tidy.yaml

@@ -0,0 +1,89 @@
+name: clang-tidy
+
+on:
+  push:
+    branches: [main]
+  pull_request:
+    branches: [main]
+
+permissions:
+  contents: read
+
+jobs:
+  clang-tidy:
+    runs-on: ubuntu-24.04
+    steps:
+      - name: Harden the runner (Audit all outbound calls)
+        uses: step-security/harden-runner@0634a2670c59f64b4a01f0f96f84700a4088b9f0 # v2.12.0
+        with:
+          egress-policy: audit
+
+      - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
+        with:
+          submodules: recursive
+
+      - name: Setup Environment
+        env:
+          PROTOBUF_VERSION: '23.3'
+          ABSEIL_CPP_VERSION: '20230125.3'
+          CXX_STANDARD: '14'
+        run: |
+          sudo apt update -y
+          sudo apt install -y --no-install-recommends --no-install-suggests \
+          build-essential \
+          iwyu \
+          cmake \
+          libssl-dev \
+          libcurl4-openssl-dev \
+          libprotobuf-dev \
+          protobuf-compiler \
+          libgmock-dev \
+          libgtest-dev \
+          libbenchmark-dev
+
+          if ! command -v clang-tidy &> /dev/null; then
+            echo "clang-tidy could not be found"
+            exit 1
+          fi
+          echo "Using clang-tidy version: $(clang-tidy --version)"
+          echo "clang-tidy installed at: $(which clang-tidy)"
+
+
+      - name: Prepare CMake
+        env:
+          CC: clang
+          CXX: clang++
+        run: |
+          echo "Running cmake..."
+          cmake -B build \
+            -DCMAKE_CXX_STANDARD=14 \
+            -DWITH_STL=CXX14 \
+            -DWITH_OTLP_HTTP=ON \
+            -DWITH_OTLP_FILE=ON \
+            -DWITH_PROMETHEUS=ON \
+            -DWITH_ZIPKIN=ON \
+            -DWITH_ELASTICSEARCH=ON \
+            -DWITH_OTLP_HTTP_COMPRESSION=ON \
+            -DWITH_EXAMPLES=ON \
+            -DWITH_EXAMPLES_HTTP=ON \
+            -DBUILD_W3CTRACECONTEXT_TEST=ON \
+            -DWITH_METRICS_EXEMPLAR_PREVIEW=ON \
+            -DWITH_ASYNC_EXPORT_PREVIEW=ON \
+            -DCMAKE_EXPORT_COMPILE_COMMANDS=ON
+
+      - name: Run clang-tidy
+        run: |
+          cmake --build build --target opentelemetry_proto
+          jq -r .[].file build/compile_commands.json | grep -vE '/(generated|third_party)/' | xargs -P $(nproc) -n 1 clang-tidy --quiet -p build 2>&1 | tee -a clang-tidy.log
+
+      - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
+        with:
+          name: Logs (clang-tidy)
+          path: ./clang-tidy.log
+
+      - name: Count warnings
+        run: |
+          COUNT=$(grep -c "warning:" clang-tidy.log)
+          echo "clang-tidy reported ${COUNT} warning(s)"
+
+# TODO: include WITH_OTLP_GRPC flags.

+ 372 - 0
ext/opentelemetry-cpp-1.21.0/.github/workflows/cmake_install.yml

@@ -0,0 +1,372 @@
+name: CMake Install Tests
+
+on:
+  workflow_dispatch:
+  push:
+    branches: [ main ]
+  pull_request:
+    branches: [ main ]
+
+permissions:
+  contents: read
+
+jobs:
+  windows_2022_vcpkg_submodule:
+    name: Windows 2022 vcpkg submodule versions cxx17 (static libs - dll)
+    runs-on: windows-2022
+    env:
+      # Set to the latest version of cmake 3.x
+      CMAKE_VERSION: '3.31.6'
+      # cxx17 is the default for windows-2022
+      CXX_STANDARD: '17'
+    steps:
+      - name: Harden the runner (Audit all outbound calls)
+        uses: step-security/harden-runner@0634a2670c59f64b4a01f0f96f84700a4088b9f0 # v2.12.0
+        with:
+          egress-policy: audit
+
+      - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
+        with:
+          submodules: 'recursive'
+      - name: Build dependencies with vcpkg submodule
+        run: |
+          ./ci/setup_cmake.ps1
+          ./ci/setup_windows_ci_environment.ps1
+      - name: Run Tests
+        run: ./ci/do_ci.ps1 cmake.install.test
+      - name: Run DLL Tests
+        run: ./ci/do_ci.ps1 cmake.dll.install.test
+
+  windows_2019_vcpkg_submodule_min_cmake:
+    name: Windows 2019 vcpkg submodule versions minimum cmake cxx14 (static libs)
+    runs-on: windows-2019
+    env:
+      # cmake 3.15 is the minimum for windows builds (See https://github.com/open-telemetry/opentelemetry-cpp/pull/3349#discussion_r2030319430)
+      CMAKE_VERSION: '3.15.0'
+      # cxx14 is the default for windows-2019
+      CXX_STANDARD: '14'
+    steps:
+      - name: Harden the runner (Audit all outbound calls)
+        uses: step-security/harden-runner@0634a2670c59f64b4a01f0f96f84700a4088b9f0 # v2.12.0
+        with:
+          egress-policy: audit
+
+      - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
+        with:
+          submodules: 'recursive'
+      - name: Build dependencies with vcpkg submodule
+        run: |
+          ./ci/setup_cmake.ps1
+          ./ci/setup_windows_ci_environment.ps1
+      - name: Run Tests
+        run: ./ci/do_ci.ps1 cmake.install.test
+
+  ubuntu_2404_system_packages:
+    name: Ubuntu 24.04 apt packages cxx17 (static libs - shared libs)
+    runs-on: ubuntu-24.04
+    env:
+      INSTALL_TEST_DIR: '/home/runner/install_test'
+      # CMake 3.28 is apt package version for Ubuntu 24.04
+      CMAKE_VERSION: '3.28.3'
+      # cxx17 is the default for Ubuntu 24.04
+      CXX_STANDARD: '17'
+      BUILD_TYPE: 'Debug'
+    steps:
+    - name: Harden the runner (Audit all outbound calls)
+      uses: step-security/harden-runner@0634a2670c59f64b4a01f0f96f84700a4088b9f0 # v2.12.0
+      with:
+        egress-policy: audit
+
+    - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
+      with:
+        submodules: 'recursive'
+    - name: Install libcurl, zlib, nlohmann-json with apt
+      run: |
+        sudo -E ./ci/setup_ci_environment.sh
+        sudo -E ./ci/setup_cmake.sh
+        sudo -E ./ci/setup_googletest.sh
+    - name: Install abseil, protobuf, and grpc with apt
+      run: |
+        sudo -E apt-get update
+        sudo -E apt-get install -y libabsl-dev libprotobuf-dev libgrpc++-dev protobuf-compiler protobuf-compiler-grpc
+    - name: Run Tests (static libs)
+      env:
+        BUILD_SHARED_LIBS: 'OFF'
+      run: ./ci/do_ci.sh cmake.install.test
+    - name: Run Tests (shared libs)
+      env:
+        BUILD_SHARED_LIBS: 'ON'
+      run: ./ci/do_ci.sh cmake.install.test
+
+  ubuntu_2404_latest:
+    name: Ubuntu 24.04 latest versions cxx20 (static libs)
+    runs-on: ubuntu-24.04
+    env:
+      INSTALL_TEST_DIR: '/home/runner/install_test'
+      # Set to the latest version of cmake 3.x
+      CMAKE_VERSION: '3.31.6'
+      # Set to the latest cxx standard supported by opentelemetry-cpp
+      CXX_STANDARD: '20'
+      # Versions below set to the latest version available
+      # The abseil and protobuf versions are taken from
+      # the grpc submodules at the GRPC_VERSION tag
+      GOOGLETEST_VERSION: '1.16.0'
+      ABSEIL_CPP_VERSION: '20240722.1'
+      PROTOBUF_VERSION: '29.0'
+      GRPC_VERSION: 'v1.71.0'
+      BUILD_TYPE: 'Debug'
+    steps:
+    - name: Harden the runner (Audit all outbound calls)
+      uses: step-security/harden-runner@0634a2670c59f64b4a01f0f96f84700a4088b9f0 # v2.12.0
+      with:
+        egress-policy: audit
+
+    - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
+      with:
+        submodules: 'recursive'
+    - name: Install gtest, libcurl, zlib, nlohmann-json with apt
+      run: |
+        sudo -E ./ci/setup_ci_environment.sh
+        sudo -E ./ci/setup_cmake.sh
+        sudo -E ./ci/setup_googletest.sh
+    - name: Build abseil, protobuf, and grpc with ci scripts
+      run: |
+        sudo -E ./ci/install_abseil.sh
+        sudo -E ./ci/install_protobuf.sh
+        sudo -E ./ci/setup_grpc.sh -r $GRPC_VERSION -s $CXX_STANDARD -p protobuf -p abseil-cpp
+    - name: Run Tests (static libs)
+      env:
+        BUILD_SHARED_LIBS: 'OFF'
+      run: ./ci/do_ci.sh cmake.install.test
+
+  ubuntu_2204_stable:
+    name: Ubuntu 22.04 stable versions cxx17 (static libs - shared libs)
+    runs-on: ubuntu-22.04
+    env:
+      INSTALL_TEST_DIR: '/home/runner/install_test'
+      # CMake 3.22 is the apt package version for Ubuntu 22.04
+      CMAKE_VERSION: '3.22.0'
+      CXX_STANDARD: '17'
+      # These are stable versions tested in the main ci workflow
+      # and defaults in the devcontainer
+      GOOGLETEST_VERSION: '1.14.0'
+      ABSEIL_CPP_VERSION: '20230125.3'
+      PROTOBUF_VERSION: '23.3'
+      GRPC_VERSION: 'v1.55.0'
+      BUILD_TYPE: 'Debug'
+    steps:
+    - name: Harden the runner (Audit all outbound calls)
+      uses: step-security/harden-runner@0634a2670c59f64b4a01f0f96f84700a4088b9f0 # v2.12.0
+      with:
+        egress-policy: audit
+
+    - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
+      with:
+        submodules: 'recursive'
+    - name: Install gtest, libcurl, zlib, nlohmann-json with apt
+      run: |
+        sudo -E ./ci/setup_ci_environment.sh
+        sudo -E ./ci/setup_cmake.sh
+        sudo -E ./ci/setup_googletest.sh
+    - name: Build abseil, protobuf, and grpc with ci scripts
+      run: |
+        sudo -E ./ci/install_abseil.sh
+        sudo -E ./ci/install_protobuf.sh
+        sudo -E ./ci/setup_grpc.sh -r $GRPC_VERSION -s $CXX_STANDARD -p protobuf -p abseil-cpp
+    - name: Run Tests (static libs)
+      env:
+        BUILD_SHARED_LIBS: 'OFF'
+      run: ./ci/do_ci.sh cmake.install.test
+    - name: Run Tests (shared libs)
+      env:
+        BUILD_SHARED_LIBS: 'ON'
+      run: ./ci/do_ci.sh cmake.install.test
+
+  ubuntu_2204_minimum:
+    name: Ubuntu 22.04 minimum versions cxx14 (static libs - shared libs)
+    runs-on: ubuntu-22.04
+    env:
+      INSTALL_TEST_DIR: '/home/runner/install_test'
+      # Set to the current minimum version of cmake
+      CMAKE_VERSION: '3.14.0'
+      # cxx14 is the default for Ubuntu 22.04
+      CXX_STANDARD: '14'
+      # This is the apt package version of googletest for Ubuntu 22.04
+      GOOGLETEST_VERSION: '1.11.0'
+      # These are minimum versions tested in the main ci workflow
+      ABSEIL_CPP_VERSION: '20220623.2'
+      PROTOBUF_VERSION: '21.12'
+      GRPC_VERSION: 'v1.49.2'
+      BUILD_TYPE: 'Debug'
+    steps:
+    - name: Harden the runner (Audit all outbound calls)
+      uses: step-security/harden-runner@0634a2670c59f64b4a01f0f96f84700a4088b9f0 # v2.12.0
+      with:
+        egress-policy: audit
+
+    - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
+      with:
+        submodules: 'recursive'
+    - name: Install gtest, libcurl, zlib, nlohmann-json with apt
+      run: |
+        sudo -E ./ci/setup_ci_environment.sh
+        sudo -E ./ci/setup_cmake.sh
+        sudo -E ./ci/setup_googletest.sh
+    - name: Build abseil, protobuf, and grpc with ci scripts
+      run: |
+        sudo -E ./ci/install_abseil.sh
+        sudo -E ./ci/install_protobuf.sh
+        sudo -E ./ci/setup_grpc.sh -r $GRPC_VERSION -s $CXX_STANDARD -p protobuf -p abseil-cpp
+    - name: Run Tests (static libs)
+      env:
+          BUILD_SHARED_LIBS: 'OFF'
+      run: ./ci/do_ci.sh cmake.install.test
+    - name: Run Tests (shared libs)
+      env:
+          BUILD_SHARED_LIBS: 'ON'
+      run: ./ci/do_ci.sh cmake.install.test
+
+  ubuntu_2404_conan_stable:
+    name: Ubuntu 24.04 conan stable versions cxx17 (static libs - shared libs - opentracing shim)
+    runs-on: ubuntu-24.04
+    env:
+      INSTALL_TEST_DIR: '/home/runner/install_test'
+       # CMake 3.28 is apt package version for Ubuntu 24.04
+      CMAKE_VERSION: '3.28.3'
+      CXX_STANDARD: '17'
+      CMAKE_TOOLCHAIN_FILE: /home/runner/conan/build/Debug/generators/conan_toolchain.cmake
+      BUILD_TYPE: 'Debug'
+    steps:
+      - name: Harden the runner (Audit all outbound calls)
+        uses: step-security/harden-runner@0634a2670c59f64b4a01f0f96f84700a4088b9f0 # v2.12.0
+        with:
+          egress-policy: audit
+
+      - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
+        with:
+          submodules: 'recursive'
+      - name: Install Conan
+        run: |
+          python3 -m pip install pip==25.0.1
+          pip install "conan==2.15.1"
+          conan profile detect --force
+      - name: Install or build all dependencies with Conan
+        run: |
+          sudo -E ./ci/setup_cmake.sh
+          conan install install/conan/conanfile_stable.txt --build=missing -of /home/runner/conan -s build_type=${BUILD_TYPE} -s compiler.cppstd=${CXX_STANDARD}
+      - name: Run Tests (static libs)
+        env:
+          BUILD_SHARED_LIBS: 'OFF'
+        run: ./ci/do_ci.sh cmake.install.test
+      - name: Run Tests (shared libs)
+        env:
+          BUILD_SHARED_LIBS: 'ON'
+        run: ./ci/do_ci.sh cmake.install.test
+      - name: verify pkgconfig packages
+        run: |
+          export PKG_CONFIG_PATH=$INSTALL_TEST_DIR/lib/pkgconfig:$PKG_CONFIG_PATH
+          ./ci/verify_packages.sh
+      - name: Run OpenTracing Shim Test
+        run: ./ci/do_ci.sh cmake.opentracing_shim.install.test
+
+  ubuntu_2404_conan_latest:
+    name: Ubuntu 24.04 conan latest versions cxx17 (static libs)
+    runs-on: ubuntu-24.04
+    env:
+      INSTALL_TEST_DIR: '/home/runner/install_test'
+      # Set to the latest version of cmake 3.x
+      CMAKE_VERSION: '3.31.6'
+      CXX_STANDARD: '17'
+      CMAKE_TOOLCHAIN_FILE: /home/runner/conan/build/Debug/generators/conan_toolchain.cmake
+      BUILD_TYPE: 'Debug'
+    steps:
+      - name: Harden the runner (Audit all outbound calls)
+        uses: step-security/harden-runner@0634a2670c59f64b4a01f0f96f84700a4088b9f0 # v2.12.0
+        with:
+          egress-policy: audit
+
+      - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
+        with:
+          submodules: 'recursive'
+      - name: Install Conan
+        run: |
+          python3 -m pip install pip==25.0.1
+          pip install "conan==2.15.1"
+          conan profile detect --force
+      - name: Install or build all dependencies with Conan
+        run: |
+          sudo -E ./ci/setup_cmake.sh
+          conan install install/conan/conanfile_latest.txt --build=missing -of /home/runner/conan -s build_type=${BUILD_TYPE} -s compiler.cppstd=${CXX_STANDARD}
+      - name: Run Tests (static libs)
+        env:
+          BUILD_SHARED_LIBS: 'OFF'
+        run: ./ci/do_ci.sh cmake.install.test
+      - name: verify pkgconfig packages
+        run: |
+          export PKG_CONFIG_PATH=$INSTALL_TEST_DIR/lib/pkgconfig:$PKG_CONFIG_PATH
+          ./ci/verify_packages.sh
+
+  macos_14_conan_stable:
+    name: macOS 14 conan stable versions cxx17 (static libs)
+    runs-on: macos-14
+    env:
+      INSTALL_TEST_DIR: '/Users/runner/install_test'
+      CMAKE_VERSION: '3.28.3'
+      CXX_STANDARD: '17'
+      CMAKE_TOOLCHAIN_FILE: '/Users/runner/conan/build/Debug/generators/conan_toolchain.cmake'
+      BUILD_TYPE: 'Debug'
+    steps:
+    - name: Harden the runner (Audit all outbound calls)
+      uses: step-security/harden-runner@0634a2670c59f64b4a01f0f96f84700a4088b9f0 # v2.12.0
+      with:
+        egress-policy: audit
+
+    - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
+      with:
+        submodules: 'recursive'
+    - name: Install Conan and tools
+      run: |
+        brew install conan autoconf automake libtool coreutils
+        ./ci/setup_cmake_macos.sh
+        conan profile detect --force
+    - name: Install or build all dependencies with Conan
+      run: conan install install/conan/conanfile_stable.txt --build=missing -of /Users/runner/conan -s build_type=${BUILD_TYPE} -s compiler.cppstd=${CXX_STANDARD}
+    - name: Run Tests (static libs)
+      env:
+        BUILD_SHARED_LIBS: 'OFF'
+      run: ./ci/do_ci.sh cmake.install.test
+
+  macos_14_brew_packages:
+    name: macOS 14 brew latest versions cxx17 (static libs)
+    runs-on: macos-14
+    env:
+      INSTALL_TEST_DIR: '/Users/runner/install_test'
+      # Set to the latest version of cmake 3.x
+      CMAKE_VERSION: '3.31.6'
+      CXX_STANDARD: '17'
+      BUILD_TYPE: 'Debug'
+    steps:
+    - name: Harden the runner (Audit all outbound calls)
+      uses: step-security/harden-runner@0634a2670c59f64b4a01f0f96f84700a4088b9f0 # v2.12.0
+      with:
+        egress-policy: audit
+
+    - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
+      with:
+        submodules: 'recursive'
+    - name: Install Dependencies with Homebrew
+      run: |
+        ./ci/setup_cmake_macos.sh
+        brew install coreutils
+        brew install googletest
+        brew install google-benchmark
+        brew install zlib
+        brew install abseil
+        brew install protobuf
+        brew install grpc
+        brew install nlohmann-json
+        brew install prometheus-cpp
+    - name: Run Tests (static libs)
+      env:
+        BUILD_SHARED_LIBS: 'OFF'
+      run: ./ci/do_ci.sh cmake.install.test

+ 48 - 0
ext/opentelemetry-cpp-1.21.0/.github/workflows/codeql-analysis.yml

@@ -0,0 +1,48 @@
+name: "CodeQL"
+
+on:
+  push:
+    branches: [main]
+  pull_request:
+    # The branches below must be a subset of the branches above
+    branches: [main]
+
+permissions:
+  contents: read
+
+jobs:
+  CodeQL-Build:
+    permissions:
+      actions: read  # for github/codeql-action/init to get workflow details
+      contents: read  # for actions/checkout to fetch code
+      security-events: write  # for github/codeql-action/autobuild to send a status report
+    runs-on: ubuntu-latest
+    steps:
+    - name: Harden the runner (Audit all outbound calls)
+      uses: step-security/harden-runner@0634a2670c59f64b4a01f0f96f84700a4088b9f0 # v2.12.0
+      with:
+        egress-policy: audit
+
+    - name: Checkout repository
+      uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
+      with:
+         submodules: 'recursive'
+    - name: Remove Third_party Modules from Code Scan
+      run: |
+        rm -rf third_party
+    - name: Setup
+      env:
+        CC: /usr/bin/gcc-12
+        CXX: /usr/bin/g++-12
+        GOOGLETEST_VERSION: 1.12.1
+      run: |
+        sudo -E ./ci/setup_googletest.sh
+        sudo -E ./ci/setup_ci_environment.sh
+    - name: Initialize CodeQL
+      uses: github/codeql-action/init@ff0a06e83cb2de871e5a09832bc6a81e7276941f # v3.28.18
+      with:
+       languages: cpp
+    - name: Autobuild
+      uses: github/codeql-action/autobuild@ff0a06e83cb2de871e5a09832bc6a81e7276941f # v3.28.18
+    - name: Perform CodeQL Analysis
+      uses: github/codeql-action/analyze@ff0a06e83cb2de871e5a09832bc6a81e7276941f # v3.28.18

+ 77 - 0
ext/opentelemetry-cpp-1.21.0/.github/workflows/cppcheck.yml

@@ -0,0 +1,77 @@
+
+name: cppcheck
+
+on:
+  push:
+    branches: [ main ]
+  pull_request:
+    branches: [ main ]
+
+permissions:
+  contents: read
+
+jobs:
+  cppcheck:
+    runs-on: ubuntu-24.04
+    steps:
+      - name: Harden the runner (Audit all outbound calls)
+        uses: step-security/harden-runner@0634a2670c59f64b4a01f0f96f84700a4088b9f0 # v2.12.0
+        with:
+          egress-policy: audit
+
+      - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
+        with:
+          submodules: 'recursive'
+
+      - name: Set up dependencies
+        run: |
+          sudo apt update -y
+          sudo apt install -y cppcheck
+
+      - name: Run cppcheck
+        run: |
+          cppcheck --version | tee cppcheck.log
+          cppcheck \
+            --force \
+            --enable=warning,performance,portability \
+            --inline-suppr \
+            --suppress=unknownMacro:exporters/etw/include/opentelemetry/exporters/etw/TraceLoggingDynamic.h \
+            --language=c++ \
+            --std=c++14 \
+            -I api/include \
+            -I exporters/elasticsearch/include \
+            -I exporters/etw/include \
+            -I exporters/memory/include \
+            -I exporters/ostream/include \
+            -I exporters/otlp/include \
+            -I exporters/prometheus/include \
+            -I exporters/zipkin/include \
+            -I ext/include \
+            -I opentracing-shim/include \
+            -I sdk/include \
+            -i build \
+            -i test \
+            -i third_party \
+            -j $(nproc) \
+            . 2>&1 | tee --append cppcheck.log
+
+      - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
+        if: success() || failure()
+        with:
+          name: Logs (cppcheck)
+          path: ./cppcheck.log
+
+      - name: Count warnings
+        run: |
+          set +e
+          readonly WARNING_COUNT=`grep -c -E "\[.+\]" cppcheck.log`
+          echo "cppcheck reported ${WARNING_COUNT} warning(s)"
+          # Acceptable limit, to decrease over time down to 0
+          readonly WARNING_LIMIT=10
+          # FAIL the build if WARNING_COUNT > WARNING_LIMIT
+          if [ $WARNING_COUNT -gt $WARNING_LIMIT ] ; then
+            exit 1
+          # WARN in annotations if WARNING_COUNT > 0
+          elif [ $WARNING_COUNT -gt 0 ] ; then
+            echo "::warning::cppcheck reported ${WARNING_COUNT} warning(s)"
+          fi

+ 54 - 0
ext/opentelemetry-cpp-1.21.0/.github/workflows/dependencies_image.yml

@@ -0,0 +1,54 @@
+name: 'OpenTelemetry-cpp dependencies image'
+on:
+  schedule:
+    - cron: "0 3 * * 6"
+
+permissions:
+  contents: read
+
+jobs:
+  docker_image:
+    name: Docker Image
+    runs-on: ubuntu-latest
+    timeout-minutes: 300
+    steps:
+    - name: Harden the runner (Audit all outbound calls)
+      uses: step-security/harden-runner@0634a2670c59f64b4a01f0f96f84700a4088b9f0 # v2.12.0
+      with:
+        egress-policy: audit
+
+    -
+      name: checkout
+      uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
+    -
+      name: Set up QEMU
+      uses: docker/setup-qemu-action@29109295f81e9208d7d86ff1c6c12d2833863392 # v3.6.0
+    -
+      name: Set up Docker Buildx
+      id: buildx
+      uses: docker/setup-buildx-action@b5ca514318bd6ebac0fb2aedd5d36ec1b5c232a2 # v3.10.0
+    -
+      name: Build Image
+      uses: docker/build-push-action@263435318d21b8e681c14492fe198d362a7d2c83 # v6.18.0
+      with:
+        builder: ${{ steps.buildx.outputs.name }}
+        context: ci/
+        file: ./docker/Dockerfile
+        build-args: BASE_IMAGE=ubuntu:latest
+        platforms: linux/amd64
+        # platforms: linux/amd64,linux/arm64
+        push: false
+        tags: otel-cpp-deps
+        load: true
+    -
+      name: Save Image
+      run: |
+        docker images
+        docker save -o /opt/otel-cpp-deps-debian.tar otel-cpp-deps
+    -
+      name: Upload Image
+      uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
+      with:
+        name: otel-cpp-deps
+        path: /opt/otel-cpp-deps-debian.tar
+        retention-days: 14

+ 25 - 0
ext/opentelemetry-cpp-1.21.0/.github/workflows/fossa.yml

@@ -0,0 +1,25 @@
+name: FOSSA scanning
+
+on:
+  push:
+    branches:
+      - main
+
+permissions:
+  contents: read
+
+jobs:
+  fossa:
+    runs-on: ubuntu-latest
+    steps:
+      - name: Harden the runner (Audit all outbound calls)
+        uses: step-security/harden-runner@0634a2670c59f64b4a01f0f96f84700a4088b9f0 # v2.12.0
+        with:
+          egress-policy: audit
+
+      - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
+
+      - uses: fossas/fossa-action@3ebcea1862c6ffbd5cf1b4d0bd6b3fe7bd6f2cac # v1.7.0
+        with:
+          api-key: ${{secrets.FOSSA_API_KEY}}
+          team: OpenTelemetry

+ 92 - 0
ext/opentelemetry-cpp-1.21.0/.github/workflows/iwyu.yml

@@ -0,0 +1,92 @@
+
+name: include-what-you-use
+
+on:
+  push:
+    branches: [ main ]
+  pull_request:
+    branches: [ main ]
+
+permissions:
+  contents: read
+
+jobs:
+  iwyu:
+    runs-on: ubuntu-latest
+    steps:
+      - name: Harden the runner (Audit all outbound calls)
+        uses: step-security/harden-runner@0634a2670c59f64b4a01f0f96f84700a4088b9f0 # v2.12.0
+        with:
+          egress-policy: audit
+
+      - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
+        with:
+          submodules: 'recursive'
+
+      - name: setup dependencies
+        run: |
+          sudo apt update -y
+          sudo apt install -y --no-install-recommends --no-install-suggests \
+            build-essential \
+            iwyu \
+            ninja-build \
+            libssl-dev \
+            libcurl4-openssl-dev \
+            libprotobuf-dev \
+            protobuf-compiler \
+            libgmock-dev \
+            libgtest-dev \
+            libbenchmark-dev
+          sudo ./ci/setup_cmake.sh
+
+
+      - name: setup grpc
+        run: |
+          sudo ./ci/setup_grpc.sh
+
+      - name: Prepare CMake
+        run: |
+          TOPDIR=`pwd`
+          mkdir build && cd build
+          CC="clang" CXX="clang++" cmake \
+            -DCMAKE_CXX_STANDARD=14 \
+            -DWITH_STL=CXX14 \
+            -DCMAKE_CXX_INCLUDE_WHAT_YOU_USE="include-what-you-use;-w;-Xiwyu;--mapping_file=${TOPDIR}/.iwyu.imp;" \
+            -DBUILD_TESTING=ON \
+            -DBUILD_W3CTRACECONTEXT_TEST=ON \
+            -DWITH_OTLP_GRPC=ON \
+            -DWITH_OTLP_HTTP=ON \
+            -DWITH_OTLP_FILE=ON \
+            -DWITH_OPENTRACING=ON \
+            -DWITH_OTLP_HTTP_COMPRESSION=ON \
+            -DWITH_THREAD_INSTRUMENTATION=ON \
+            -DWITH_ZIPKIN=ON \
+            -DWITH_PROMETHEUS=ON \
+            ..
+
+      - name: iwyu_tool
+        run: |
+          cd build
+          make -k 2>&1 | tee -a iwyu.log
+
+      - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
+        if: success() || failure()
+        with:
+          name: Logs (include-what-you-use)
+          path: ./build/*.log
+
+      - name: count warnings
+        run: |
+          set +e
+          cd build
+          readonly WARNING_COUNT=`grep -c "include-what-you-use reported diagnostics:" iwyu.log`
+          echo "include-what-you-use reported ${WARNING_COUNT} warning(s)"
+          # Acceptable limit, to decrease over time down to 0
+          readonly WARNING_LIMIT=0
+          # FAIL the build if WARNING_COUNT > WARNING_LIMIT
+          if [ $WARNING_COUNT -gt $WARNING_LIMIT ] ; then
+            exit 1
+          # WARN in annotations if WARNING_COUNT > 0
+          elif [ $WARNING_COUNT -gt 0 ] ; then
+            echo "::warning::include-what-you-use reported ${WARNING_COUNT} warning(s)"
+          fi

+ 52 - 0
ext/opentelemetry-cpp-1.21.0/.github/workflows/ossf-scorecard.yml

@@ -0,0 +1,52 @@
+name: OSSF Scorecard
+
+on:
+  push:
+    branches:
+      - main
+  schedule:
+    - cron: "56 23 * * 6" # once a week
+  workflow_dispatch:
+
+permissions: read-all
+
+jobs:
+  analysis:
+    runs-on: ubuntu-latest
+    permissions:
+      # Needed for Code scanning upload
+      security-events: write
+      # Needed for GitHub OIDC token if publish_results is true
+      id-token: write
+    steps:
+      - name: Harden the runner (Audit all outbound calls)
+        uses: step-security/harden-runner@0634a2670c59f64b4a01f0f96f84700a4088b9f0 # v2.12.0
+        with:
+          egress-policy: audit
+
+      - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
+        with:
+          persist-credentials: false
+
+      - uses: ossf/scorecard-action@f49aabe0b5af0936a0987cfb85d86b75731b0186 # v2.4.1
+        with:
+          results_file: results.sarif
+          results_format: sarif
+          publish_results: true
+
+      # Upload the results as artifacts (optional). Commenting out will disable
+      # uploads of run results in SARIF format to the repository Actions tab.
+      # https://docs.github.com/en/actions/advanced-guides/storing-workflow-data-as-artifacts
+      - name: "Upload artifact"
+        uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
+        with:
+          name: SARIF file
+          path: results.sarif
+          retention-days: 5
+
+      # Upload the results to GitHub's code scanning dashboard (optional).
+      # Commenting out will disable upload of results to your repo's Code Scanning dashboard
+      - name: "Upload to code-scanning"
+        uses: github/codeql-action/upload-sarif@ff0a06e83cb2de871e5a09832bc6a81e7276941f # v3.28.18
+        with:
+          sarif_file: results.sarif

+ 28 - 0
ext/opentelemetry-cpp-1.21.0/.github/workflows/project_management_comment.yml

@@ -0,0 +1,28 @@
+
+name: Add comment
+on:
+  issues:
+    types:
+      - labeled
+permissions:
+  contents: read
+
+jobs:
+  add-comment:
+    if: github.event.label.name == 'help wanted'
+    runs-on: ubuntu-latest
+    permissions:
+      issues: write
+    steps:
+      - name: Harden the runner (Audit all outbound calls)
+        uses: step-security/harden-runner@0634a2670c59f64b4a01f0f96f84700a4088b9f0 # v2.12.0
+        with:
+          egress-policy: audit
+
+      - name: Add comment
+        uses: peter-evans/create-or-update-comment@71345be0265236311c031f5c7866368bd1eff043
+        with:
+          issue-number: ${{ github.event.issue.number }}
+          body: |
+            This issue is available for anyone to work on. **Make sure to reference this issue in your pull request.**
+            :sparkles: Thank you for your contribution! :sparkles:

+ 29 - 0
ext/opentelemetry-cpp-1.21.0/.github/workflows/project_management_issue_open.yml

@@ -0,0 +1,29 @@
+name: OpenTelemetry-cpp project
+on:
+  issues:
+    types:
+      - reopened
+      - opened
+permissions:
+  contents: read
+
+jobs:
+  label_issues:
+    runs-on: ubuntu-latest
+    permissions:
+      issues: write
+    steps:
+      - name: Harden the runner (Audit all outbound calls)
+        uses: step-security/harden-runner@0634a2670c59f64b4a01f0f96f84700a4088b9f0 # v2.12.0
+        with:
+          egress-policy: audit
+
+      - uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1
+        with:
+          script: |
+            github.rest.issues.addLabels({
+              issue_number: context.issue.number,
+              owner: context.repo.owner,
+              repo: context.repo.repo,
+              labels: ["needs-triage"]
+            })

+ 21 - 0
ext/opentelemetry-cpp-1.21.0/.github/workflows/stale.yml

@@ -0,0 +1,21 @@
+name: "Mark stale issues"
+on:
+  schedule:
+    - cron: "30 1 * * *"
+
+permissions:
+  contents: read
+
+jobs:
+  stale:
+    permissions:
+      issues: write  # for actions/stale to close stale issues
+      pull-requests: write  # for actions/stale to close stale PRs
+    runs-on: ubuntu-latest
+    steps:
+      - uses: actions/stale@5bef64f19d7facfb25b37b414482c7164d639639 # v9.1.0
+        with:
+          stale-issue-message: "This issue was marked as stale due to lack of activity."
+          days-before-issue-stale: 60
+          days-before-close: -1
+          exempt-issue-labels: "do-not-stale"

+ 84 - 0
ext/opentelemetry-cpp-1.21.0/.gitignore

@@ -0,0 +1,84 @@
+# Copyright The OpenTelemetry Authors
+# SPDX-License-Identifier: Apache-2.0
+
+# Ref. https://github.com/github/gitignore/blob/master/C%2B%2B.gitignore
+# Prerequisites
+*.d
+
+# Compiled Object files
+*.slo
+*.lo
+*.o
+*.obj
+
+# Precompiled Headers
+*.gch
+*.pch
+
+# Compiled Dynamic libraries
+*.so
+*.dylib
+*.dll
+*.pdb
+
+# Fortran module files
+*.mod
+*.smod
+
+# Compiled Static libraries
+*.lai
+*.la
+*.a
+*.lib
+
+# Executables
+*.exe
+*.out
+*.app
+
+# Bazel files
+MODULE.bazel.lock
+/bazel-*
+
+# Mac
+.DS_Store
+
+# Output directories
+/out
+/out.*
+# Indicator that the tools were deployed
+.buildtools
+
+# Temporary Bazel directories
+/bazel-*
+/plugin
+/build
+
+tags
+.cache/clangd/*
+
+# Temporary dir used when generating semconv
+buildscripts/semantic-convention/tmp-semconv/
+
+# Generated cert keys in functional tests
+functional/cert/ca.csr
+functional/cert/ca.pem
+functional/cert/ca-key.pem
+functional/cert/client_cert.csr
+functional/cert/client_cert.pem
+functional/cert/client_cert-key.pem
+functional/cert/server_cert.csr
+functional/cert/server_cert.pem
+functional/cert/server_cert-key.pem
+functional/cert/ca_b.csr
+functional/cert/ca_b.pem
+functional/cert/ca_b-key.pem
+functional/cert/client_cert_b.csr
+functional/cert/client_cert_b.pem
+functional/cert/client_cert_b-key.pem
+functional/cert/server_cert_b.csr
+functional/cert/server_cert_b.pem
+functional/cert/server_cert_b-key.pem
+functional/cert/unreadable.pem
+
+localinstall

+ 39 - 0
ext/opentelemetry-cpp-1.21.0/.gitmodules

@@ -0,0 +1,39 @@
+[submodule "third_party/prometheus-cpp"]
+path = third_party/prometheus-cpp
+url = https://github.com/jupp0r/prometheus-cpp
+branch = master
+
+[submodule "tools/vcpkg"]
+path = tools/vcpkg
+url = https://github.com/Microsoft/vcpkg
+branch = master
+
+[submodule "third_party/ms-gsl"]
+path = third_party/ms-gsl
+url = https://github.com/microsoft/GSL
+branch = main
+
+[submodule "third_party/googletest"]
+path = third_party/googletest
+url = https://github.com/google/googletest
+branch = main
+
+[submodule "third_party/benchmark"]
+path = third_party/benchmark
+url = https://github.com/google/benchmark
+branch = main
+
+[submodule "third_party/opentelemetry-proto"]
+path = third_party/opentelemetry-proto
+url = https://github.com/open-telemetry/opentelemetry-proto
+branch = main
+
+[submodule "third_party/nlohmann-json"]
+path = third_party/nlohmann-json
+url = https://github.com/nlohmann/json
+branch = master
+
+[submodule "third_party/opentracing-cpp"]
+path = third_party/opentracing-cpp
+url = https://github.com/opentracing/opentracing-cpp.git
+branch = master

+ 31 - 0
ext/opentelemetry-cpp-1.21.0/.iwyu.imp

@@ -0,0 +1,31 @@
+# Copyright The OpenTelemetry Authors
+# SPDX-License-Identifier: Apache-2.0
+
+# include-what-you-use mapping file
+
+[
+  # Work around for C++ STL
+  { "include": ["<bits/chrono.h>", "private", "<chrono>", "public"] },
+  { "include": ["<bits/std_abs.h>", "private", "<cstdlib>", "public"] },
+  { "include": ["<ext/alloc_traits.h>", "private", "<memory>", "public"] },
+  { "include": ["<bits/types/struct_tm.h>", "private", "<time.h>", "public"] },
+  { "include": ["<bits/types/struct_FILE.h>", "private", "<stdio.h>", "public"] },
+
+  # Local opentelemetry-cpp style
+
+  # We prefer to include <gtest/gtest.h> for simplicity
+  { "include": ["<gtest/gtest-message.h>", "private", "<gtest/gtest.h>", "public"] },
+  { "include": ["<gtest/gtest-test-part.h>", "private", "<gtest/gtest.h>", "public"] },
+  { "include": ["<gtest/gtest-param-test.h>", "private", "<gtest/gtest.h>", "public"] },
+  { "include": ["<gtest/gtest_pred_impl.h>", "private", "<gtest/gtest.h>", "public"] },
+  { "include": ["<gtest/gtest-typed-test.h>", "private", "<gtest/gtest.h>", "public"] },
+  { "include": ["<gtest/gtest-assertion-result.h>", "private", "<gtest/gtest.h>", "public"] },
+
+  # We prefer to include <gmock/gmock.h> for simplicity
+  { "include": ["<gmock/gmock-function-mocker.h>", "private", "<gmock/gmock.h>", "public"] },
+  { "include": ["<gmock/gmock-spec-builders.h>", "private", "<gmock/gmock.h>", "public"] },
+
+  # We prefer to include <curl/curl.h> for simplicity
+  { "include": ["<curl/system.h>", "private", "<curl/curl.h>", "public"] },
+]
+

+ 8 - 0
ext/opentelemetry-cpp-1.21.0/.markdownlint.json

@@ -0,0 +1,8 @@
+{
+    "default": true,
+    "MD013":
+    {
+        "code_blocks": false,
+        "tables": false
+    }
+}

+ 3 - 0
ext/opentelemetry-cpp-1.21.0/.markdownlintignore

@@ -0,0 +1,3 @@
+third_party/**
+tools/**
+examples/otlp/README.md

+ 2816 - 0
ext/opentelemetry-cpp-1.21.0/CHANGELOG.md

@@ -0,0 +1,2816 @@
+# Changelog
+
+All notable changes to this project will be documented in this file.
+
+The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
+and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
+
+## Guideline to update the version
+
+Increment the:
+
+* MAJOR version when you make incompatible API/ABI changes,
+* MINOR version when you add functionality in a backwards compatible manner, and
+* PATCH version when you make backwards compatible bug fixes.
+
+## [Unreleased]
+
+## [1.21 2025-05-28]
+
+* [BUILD] Remove WITH_ABSEIL
+  [#3318](https://github.com/open-telemetry/opentelemetry-cpp/pull/3318)
+
+* [INSTALL] Add CMake components to the opentelemetry-cpp package
+  [#3320](https://github.com/open-telemetry/opentelemetry-cpp/pull/3220)
+
+* [CI] Harden GitHub Actions
+  [#3338](https://github.com/open-telemetry/opentelemetry-cpp/pull/3338)
+
+* [StepSecurity] Harden GibHub Actions, part 2
+  [#3340](https://github.com/open-telemetry/opentelemetry-cpp/pull/3340)
+
+* Bump github/codeql-action from 3.28.12 to 3.28.13
+  [#3341](https://github.com/open-telemetry/opentelemetry-cpp/pull/3341)
+
+* [DEVCONTAINER] expose cmake version setting as docker arg and environment variable
+  [#3347](https://github.com/open-telemetry/opentelemetry-cpp/pull/3347)
+
+* [CI] disable bzip2 in conan builds
+  [#3352](https://github.com/open-telemetry/opentelemetry-cpp/pull/3352)
+
+* [SEMANTIC CONVENTIONS] Upgrade semantic conventions to 1.32.0
+  [#3351](https://github.com/open-telemetry/opentelemetry-cpp/pull/3351)
+
+* Bump github/codeql-action from 3.28.13 to 3.28.15
+  [#3353](https://github.com/open-telemetry/opentelemetry-cpp/pull/3353)
+
+* [CMAKE] bump cmake minimum required version to 3.14
+  [#3349](https://github.com/open-telemetry/opentelemetry-cpp/pull/3349)
+
+* Bump codecov/codecov-action from 5.4.0 to 5.4.2
+  [#3362](https://github.com/open-telemetry/opentelemetry-cpp/pull/3362)
+
+* [DOC] Fix documentation tags in logger API
+  [#3371](https://github.com/open-telemetry/opentelemetry-cpp/pull/3371)
+
+* [CI] fix artifacts download/upload
+  [#3369](https://github.com/open-telemetry/opentelemetry-cpp/pull/3369)
+
+* [API] Add Enabled method to Tracer
+  [#3357](https://github.com/open-telemetry/opentelemetry-cpp/pull/3357)
+
+* [BUILD] Fixes warnings of ciso646 in C++17
+  [#3360](https://github.com/open-telemetry/opentelemetry-cpp/pull/3360)
+
+* Bump github/codeql-action from 3.28.15 to 3.28.16
+  [#3377](https://github.com/open-telemetry/opentelemetry-cpp/pull/3377)
+
+* Bump step-security/harden-runner from 2.11.1 to 2.12.0
+  [#3373](https://github.com/open-telemetry/opentelemetry-cpp/pull/3373)
+
+* Bump docker/build-push-action from 6.15.0 to 6.16.0
+  [#3382](https://github.com/open-telemetry/opentelemetry-cpp/pull/3382)
+
+* Bump actions/download-artifact from 4.2.1 to 4.3.0
+  [#3381](https://github.com/open-telemetry/opentelemetry-cpp/pull/3381)
+
+* [CI] Harden Github actions - pinned-dependencies (part -1)
+  [#3380](https://github.com/open-telemetry/opentelemetry-cpp/pull/3380)
+
+* [StepSecurity] ci: Harden GitHub Actions
+  [#3378](https://github.com/open-telemetry/opentelemetry-cpp/pull/3378)
+
+* [SDK] Base2 exponential histogram aggregation
+  [#3346](https://github.com/open-telemetry/opentelemetry-cpp/pull/3346)
+
+* [StepSecurity] ci: Harden GitHub Actions
+  [#3379](https://github.com/open-telemetry/opentelemetry-cpp/pull/3379)
+
+* [BUILD] Fixes glibc++ 5 checking
+  [#3355](https://github.com/open-telemetry/opentelemetry-cpp/pull/3355)
+
+* [TEST] Add stress test for histogram metric for multiple threads validation
+  [#3388](https://github.com/open-telemetry/opentelemetry-cpp/pull/3388)
+
+* Bump github/codeql-action from 3.28.16 to 3.28.17
+  [#3389](https://github.com/open-telemetry/opentelemetry-cpp/pull/3389)
+
+* [SDK] Optimize PeriodicExportingMetricReader Thread Usage
+  [#3383](https://github.com/open-telemetry/opentelemetry-cpp/pull/3383)
+
+* [Metrics SDK] Use nostd::function_ref in AttributesHashMap
+  [#3393](https://github.com/open-telemetry/opentelemetry-cpp/pull/3393)
+
+* [SDK] support aggregation of identical instruments
+  [#3358](https://github.com/open-telemetry/opentelemetry-cpp/pull/3358)
+
+* [BUILD] Fixes unused var
+  [#3397](https://github.com/open-telemetry/opentelemetry-cpp/pull/3397)
+
+* [INSTALL] Unify cmake install functions and dynamically set component dependencies
+  [#3368](https://github.com/open-telemetry/opentelemetry-cpp/pull/3368)
+
+* [BUILD] Upgrade nlohmann_json to 3.12.0
+  [#3406](https://github.com/open-telemetry/opentelemetry-cpp/pull/3406)
+
+* [BUILD] Upgrade opentelemetry-proto to 1.6.0
+  [#3407](https://github.com/open-telemetry/opentelemetry-cpp/pull/3407)
+
+* [CMAKE] add generated protobuf headers to the opentelemetry_proto target
+  [#3400](https://github.com/open-telemetry/opentelemetry-cpp/pull/3400)
+
+* [MERGE] Fix accidental rollback of nlohmann-json submodule
+  [#3415](https://github.com/open-telemetry/opentelemetry-cpp/pull/3415)
+
+* Bump fossas/fossa-action from 1.6.0 to 1.7.0
+  [#3414](https://github.com/open-telemetry/opentelemetry-cpp/pull/3414)
+
+* Bump docker/build-push-action from 6.16.0 to 6.17.0
+  [#3420](https://github.com/open-telemetry/opentelemetry-cpp/pull/3420)
+
+* Bump codecov/codecov-action from 5.4.2 to 5.4.3
+  [#3419](https://github.com/open-telemetry/opentelemetry-cpp/pull/3419)
+
+* [SEMANTIC CONVENTIONS] Upgrade semantic conventions to 1.33
+  [#3416](https://github.com/open-telemetry/opentelemetry-cpp/pull/3416)
+
+* [DOCS] update the INSTALL guide on cmake components
+  [#3422](https://github.com/open-telemetry/opentelemetry-cpp/pull/3422)
+
+* Bump github/codeql-action from 3.28.17 to 3.28.18
+  [#3423](https://github.com/open-telemetry/opentelemetry-cpp/pull/3423)
+
+* [CMAKE] update cmake files in examples directory
+  [#3421](https://github.com/open-telemetry/opentelemetry-cpp/pull/3421)
+
+* [SDK] Fix Base2ExponentialHistogramAggregation Merge with empty buckets
+  [#3425](https://github.com/open-telemetry/opentelemetry-cpp/pull/3425)
+
+* [SDK] Fix MetricProducer interface
+  [#3413](https://github.com/open-telemetry/opentelemetry-cpp/pull/3413)
+
+* [CMAKE] remove global include_directories usage and rely on target properties
+  [#3426](https://github.com/open-telemetry/opentelemetry-cpp/pull/3426)
+
+* [BUILD] remove unused WITH_CURL build flag
+  [#3429](https://github.com/open-telemetry/opentelemetry-cpp/pull/3429)
+
+* [SEMANTIC CONVENTIONS] Upgrade to semantic conventions 1.34.0
+  [#3428](https://github.com/open-telemetry/opentelemetry-cpp/pull/3428)
+
+* [EXPORTER] ostream log exporter, fix memory ownership issues
+  [#3417](https://github.com/open-telemetry/opentelemetry-cpp/pull/3417)
+
+* [TEST] add all components to the cmake fetch content test
+  [#3433](https://github.com/open-telemetry/opentelemetry-cpp/pull/3433)
+
+* [BUILD] Error out when building DLL without MSVC
+  [#3438](https://github.com/open-telemetry/opentelemetry-cpp/pull/3438)
+
+* [BUILD] Add missing CMake keyword for target_link_libraries
+  [#3442](https://github.com/open-telemetry/opentelemetry-cpp/pull/3442)
+
+* [CMAKE] Remove third-party version mismatch warning
+  [#3432](https://github.com/open-telemetry/opentelemetry-cpp/pull/3432)
+
+* Bump docker/build-push-action from 6.17.0 to 6.18.0
+  [#3446](https://github.com/open-telemetry/opentelemetry-cpp/pull/3446)
+
+* [SEMANTIC CONVENTIONS] Fix comment style to preserve markup.
+  [#3444](https://github.com/open-telemetry/opentelemetry-cpp/pull/3444)
+
+* [EXPORTER] support unix sockets in grpc client
+  [#3410](https://github.com/open-telemetry/opentelemetry-cpp/pull/3410)
+
+* [BUILD] Propagate INTERFACE_COMPILE_DEFINITIONS from API through common_foo_library
+  [#3440](https://github.com/open-telemetry/opentelemetry-cpp/pull/3440)
+
+New Features:
+
+* [SDK] Base2 exponential histogram aggregation
+  [#3346](https://github.com/open-telemetry/opentelemetry-cpp/pull/3346)
+
+  * Add base2 exponential histogram aggregation. Includes a new aggregation type,
+    ostream exporter, and otlp/grpc exporter. Updated histogram aggregation and
+    benchmark tests.
+
+Important changes:
+
+* [EXPORTER] ostream log exporter, fixed memory ownership issues
+  [#3417](https://github.com/open-telemetry/opentelemetry-cpp/pull/3417)
+
+  * In the SDK, the following classes implementation has changed:
+
+    * opentelemetry::sdk::logs::ReadableLogRecord
+    * opentelemetry::sdk::logs::ReadWriteLogRecord
+
+  * An application implementing a custom log record exporter,
+    that reuses these classes from the opentelemetry-cpp SDK,
+    will need code adjustments, in particular for methods:
+
+    * GetBody()
+    * GetAttributes()
+
+  * Applications not using these SDK classes directly are not affected.
+
+* [BUILD] Remove WITH_ABSEIL
+  [#3318](https://github.com/open-telemetry/opentelemetry-cpp/pull/3318)
+
+  * The build option `WITH_ABSEIL` is no longer used, and opentelemetry-cpp
+    will no longer use any release of abseil provided externally,
+    for its own use.
+
+  * Instead, opentelemetry-cpp will only use an internal abseil version.
+
+  * This change resolves long standing binary integrity issues,
+    that occurred in the past when mixing several versions of abseil
+    in the build.
+
+## [1.20 2025-04-01]
+
+* [BUILD] Update opentelemetry-proto version
+  [#3254](https://github.com/open-telemetry/opentelemetry-cpp/pull/3254)
+
+* [BUILD] Build break with CURL 7.29.0
+  [#3255](https://github.com/open-telemetry/opentelemetry-cpp/pull/3255)
+
+* [SEMANTIC CONVENTIONS] Upgrade to semantic conventions 1.30.0
+  [#3258](https://github.com/open-telemetry/opentelemetry-cpp/pull/3258)
+
+* [SDK] Add tracer scope configurator
+  [#3137](https://github.com/open-telemetry/opentelemetry-cpp/pull/3137)
+
+* [DOC] Add document and example for sharing gRPC Client
+  [#3260](https://github.com/open-telemetry/opentelemetry-cpp/pull/3260)
+
+* [SDK] Fix BatchLogRecordProcessor to instrument shutdown
+  [#3262](https://github.com/open-telemetry/opentelemetry-cpp/pull/3262)
+
+* [SDK] Support OTEL_SDK_DISABLED environment variable
+  [#3245](https://github.com/open-telemetry/opentelemetry-cpp/pull/3245)
+
+* [CI] OTLP in Windows builds
+  [#3263](https://github.com/open-telemetry/opentelemetry-cpp/pull/3263)
+
+* [BUILD] Fixes compatibility of type_traits
+  [#3274](https://github.com/open-telemetry/opentelemetry-cpp/pull/3274)
+
+* [BUILD] Fix compilation with Regex being disabled
+  [#3276](https://github.com/open-telemetry/opentelemetry-cpp/pull/3276)
+
+* [EXPORTER] Support exporting event_name using OTLP Exporter
+  [#3277](https://github.com/open-telemetry/opentelemetry-cpp/pull/3277)
+
+* [CI] Add FOSSA scanning workflow
+  [#3279](https://github.com/open-telemetry/opentelemetry-cpp/pull/3279)
+
+* [BUILD] Adding typecast without whom c++latest build fails
+  [#3281](https://github.com/open-telemetry/opentelemetry-cpp/pull/3281)
+
+* [ADMIN] Add FOSSA badges
+  [#3280](https://github.com/open-telemetry/opentelemetry-cpp/pull/3280)
+
+* [BUILD] Fix compiling problems with abiv2 and MSVC
+  [#3284](https://github.com/open-telemetry/opentelemetry-cpp/pull/3284)
+
+* [BUILD] Enable old behavior of CMP0092
+  [#3269](https://github.com/open-telemetry/opentelemetry-cpp/pull/3269)
+
+* [SDK] Add meter scope configurator
+  [#3268](https://github.com/open-telemetry/opentelemetry-cpp/pull/3268)
+
+* [DEVCONTAINER] Support customization and run as non-root user
+  [#3270](https://github.com/open-telemetry/opentelemetry-cpp/pull/3270)
+
+* [ETW] Add configuration to export 64-bit integer as timestamp
+  [#3286](https://github.com/open-telemetry/opentelemetry-cpp/pull/3286)
+
+* [API] Deprecate event logger
+  [#3285](https://github.com/open-telemetry/opentelemetry-cpp/pull/3285)
+
+* [BUILD] Add link directory to support curl 8.12
+  [#3272](https://github.com/open-telemetry/opentelemetry-cpp/pull/3272)
+
+* [API] Change the param-pack unpacking order to start from left to right
+  [#3296](https://github.com/open-telemetry/opentelemetry-cpp/pull/3296)
+
+* [SDK] Implement spec: MetricFilter
+  [#3235](https://github.com/open-telemetry/opentelemetry-cpp/pull/3235)
+
+* [SEMANTIC CONVENTIONS] Upgrade semantic conventions to 1.31.0
+  [#3297](https://github.com/open-telemetry/opentelemetry-cpp/pull/3297)
+
+* [SDK] Add logger scope configurator
+  [#3282](https://github.com/open-telemetry/opentelemetry-cpp/pull/3282)
+
+* [EXAMPLE] fix buffer overrun in the gRPC sample project
+  [#3304](https://github.com/open-telemetry/opentelemetry-cpp/pull/3304)
+
+* [CI] Bump fossas/fossa-action from 1.5.0 to 1.6.0
+  [#3305](https://github.com/open-telemetry/opentelemetry-cpp/pull/3305)
+
+* [TEST] fix segfault in singleton test with cmake on macos-latest
+  [#3316](https://github.com/open-telemetry/opentelemetry-cpp/pull/3316)
+
+* [TEST] fix test failure with elasticsearch exporter on cxx20
+  [#3308](https://github.com/open-telemetry/opentelemetry-cpp/pull/3308)
+
+* [TEST] otlp grpc exporter retry test fix
+  [#3311](https://github.com/open-telemetry/opentelemetry-cpp/pull/3311)
+
+* [SDK] Use OPENTELEMETRY_EXPORT and static local variables
+  [#3314](https://github.com/open-telemetry/opentelemetry-cpp/pull/3314)
+
+* [BUILD] Fix elasticsearch exporter json compatibility
+  [#3313](https://github.com/open-telemetry/opentelemetry-cpp/pull/3313)
+
+* [BUILD] Fix missing exported definition for OTLP file exporter and forceflush
+  [#3319](https://github.com/open-telemetry/opentelemetry-cpp/pull/3319)
+
+* [BUILD] Remove gRPC header including in OtlpGrpcClientFactory
+  [#3321](https://github.com/open-telemetry/opentelemetry-cpp/pull/3321)
+
+* [ADMIN] Add Pranav Sharma in cpp-approvers
+  [#3323](https://github.com/open-telemetry/opentelemetry-cpp/pull/3323)
+
+* [DEVCONTAINER] fix grpc install
+  [#3325](https://github.com/open-telemetry/opentelemetry-cpp/pull/3325)
+
+* [ADMIN] Add dbarker to approvers
+  [#3331](https://github.com/open-telemetry/opentelemetry-cpp/pull/3331)
+
+* [CI] Upgrade CI to ubuntu 22.04
+  [#3330](https://github.com/open-telemetry/opentelemetry-cpp/pull/3330)
+
+* [CI] Add ossf-scorecard scanning workflow
+  [#3332](https://github.com/open-telemetry/opentelemetry-cpp/pull/3332)
+
+* [CI] pin cmake in ci and devcontainer
+  [#3336](https://github.com/open-telemetry/opentelemetry-cpp/pull/3336)
+
+* [METRICS SDK] Fix hash collision in MetricAttributes
+  [#3322](https://github.com/open-telemetry/opentelemetry-cpp/pull/3322)
+
+Important changes:
+
+* [SDK] Support OTEL_SDK_DISABLED environment variable
+  [#3245](https://github.com/open-telemetry/opentelemetry-cpp/pull/3245)
+
+  * The SDK now exposes the following new methods:
+
+    * opentelemetry::sdk::trace::Provider::SetTracerProvider()
+    * opentelemetry::sdk::metrics::Provider::SetMeterProvider()
+    * opentelemetry::sdk::logs::Provider::SetLoggerProvider()
+
+  * These methods do support the `OTEL_SDK_DISABLED` environment variable,
+    unlike the corresponding existing API Provider classes.
+
+  * Applications are encouraged to migrate from the API to the SDK
+    `Provider` classes, to benefit from this feature.
+
+  * All the example code has been updated to reflect the new usage.
+
+## [1.19 2025-01-22]
+
+* [PROMETHEUS_EXPORTER] Fix default for emitting otel_scope attributes
+  [#3171](https://github.com/open-telemetry/opentelemetry-cpp/pull/3171)
+
+* [Code health] Include what you use cleanup, part 5
+  [#3140](https://github.com/open-telemetry/opentelemetry-cpp/pull/3140)
+
+* [BUILD] Upgrade cmake
+  [#3167](https://github.com/open-telemetry/opentelemetry-cpp/pull/3167)
+
+* [SHIM] Fix string_view mappings between OT and OTel
+  [#3181](https://github.com/open-telemetry/opentelemetry-cpp/pull/3181)
+
+* [EXPORTER] Refactor ElasticSearchRecordable
+  [#3164](https://github.com/open-telemetry/opentelemetry-cpp/pull/3164)
+
+* [SEMANTIC CONVENTIONS] Upgrade to semantic conventions 1.29.0
+  [#3182](https://github.com/open-telemetry/opentelemetry-cpp/pull/3182)
+
+* [BUILD] Fix cross-compilation with protoc
+  [#3186](https://github.com/open-telemetry/opentelemetry-cpp/pull/3186)
+
+* [Code health] Perform cppcheck cleanup
+  [#3150](https://github.com/open-telemetry/opentelemetry-cpp/pull/3150)
+
+* [EXPORTER] add instrumentation scope attributes
+  to otlp proto messages for traces and metrics
+  [#3185](https://github.com/open-telemetry/opentelemetry-cpp/pull/3185)
+
+* [SDK] Tracer provider shutdown blocks in-definitively
+  [#3191](https://github.com/open-telemetry/opentelemetry-cpp/pull/3191)
+
+* [SEMANTIC CONVENTIONS] Upgrade to weaver 0.11.0
+  [#3194](https://github.com/open-telemetry/opentelemetry-cpp/pull/3194)
+
+* [DOC] Update existing maintaining dependencies doc
+  [#3195](https://github.com/open-telemetry/opentelemetry-cpp/pull/3195)
+
+* [TEST] Change is_called_ and got_response_ to use atomic
+  [#3204](https://github.com/open-telemetry/opentelemetry-cpp/pull/3204)
+
+* [SEMANTIC CONVENTIONS] update links to openmetrics to reference the v1.0.0 release
+  [#3205](https://github.com/open-telemetry/opentelemetry-cpp/pull/3205)
+
+* [CI] Fix CI on ubuntu-latest
+  [#3207](https://github.com/open-telemetry/opentelemetry-cpp/pull/3207)
+
+* [BUILD] Build break using protoc 3.14
+  [#3211](https://github.com/open-telemetry/opentelemetry-cpp/pull/3211)
+
+* [TEST] Build the singleton test on windows
+  [#3183](https://github.com/open-telemetry/opentelemetry-cpp/pull/3183)
+
+* [BUILD] Add cxx feature detections
+  [#3203](https://github.com/open-telemetry/opentelemetry-cpp/pull/3203)
+
+* [SDK] Do not frequently create and destroy http client threads
+  [#3198](https://github.com/open-telemetry/opentelemetry-cpp/pull/3198)
+
+* [EXPORTER] Optimize OTLP HTTP compression
+  [#3178](https://github.com/open-telemetry/opentelemetry-cpp/pull/3178)
+
+* [SDK] Fix include instrumentation scope attributes in equal method
+  [#3214](https://github.com/open-telemetry/opentelemetry-cpp/pull/3214)
+
+* Upgrade to opentelemetry-proto 1.5.0
+  [#3210](https://github.com/open-telemetry/opentelemetry-cpp/pull/3210)
+
+* [TEST] Added support for SELINUX in functional tests
+  [#3212](https://github.com/open-telemetry/opentelemetry-cpp/pull/3212)
+
+* [EDITORIAL] fix changelog entry for PR 3185
+  [#3217](https://github.com/open-telemetry/opentelemetry-cpp/pull/3217)
+
+* [TEST] Functional tests for OTLP/gRPC with mutual TLS
+  [#3227](https://github.com/open-telemetry/opentelemetry-cpp/pull/3227)
+
+* [SEMCONV] Metrics are incorrectly prefixed with 'metric'
+  [#3228](https://github.com/open-telemetry/opentelemetry-cpp/pull/3228)
+
+* [BUILD] Add OTLP/file exporter for dll and examples
+  [#3231](https://github.com/open-telemetry/opentelemetry-cpp/pull/3231)
+
+* [Code Health] Include what you use, part 6
+  [#3216](https://github.com/open-telemetry/opentelemetry-cpp/pull/3216)
+
+* [CI] Spurious test failures
+  [#3233](https://github.com/open-telemetry/opentelemetry-cpp/pull/3233)
+
+* [BUILD] Fix error ‘uint8_t’ does not name a type with gcc-15
+  [#3240](https://github.com/open-telemetry/opentelemetry-cpp/pull/3240)
+
+* [EXPORTER] fix throw in OtlpGrpcMetricExporter with shared grpc client
+  [#3243](https://github.com/open-telemetry/opentelemetry-cpp/pull/3243)
+
+* [SDK] Better control of threads executed by opentelemetry-cpp
+  [#3175](https://github.com/open-telemetry/opentelemetry-cpp/pull/3175)
+
+* [Code Health] Include what you use, part 7
+  [#3238](https://github.com/open-telemetry/opentelemetry-cpp/pull/3238)
+
+* [SDK] Fix lifetime of GlobalLogHandler
+  [#3221](https://github.com/open-telemetry/opentelemetry-cpp/pull/3221)
+
+* [MAINTAINER] Add devcontainer
+  [#3123](https://github.com/open-telemetry/opentelemetry-cpp/pull/3123)
+
+* [SDK] enable deriving from ResourceDetector to create a Resource
+  [#3247](https://github.com/open-telemetry/opentelemetry-cpp/pull/3247)
+
+* [EXPORTER] Support handling retry-able errors for OTLP/HTTP
+  [#3223](https://github.com/open-telemetry/opentelemetry-cpp/pull/3223)
+
+* [CI] Add GRPC in maintainer CI
+  [#3248](https://github.com/open-telemetry/opentelemetry-cpp/pull/3248)
+
+* [EXPORTER] Support handling retry-able errors for OTLP/gRPC
+  [#3219](https://github.com/open-telemetry/opentelemetry-cpp/pull/3219)
+
+* [SDK] Optimize Metric Processing for Single Collector with Delta Temporality
+  [#3236](https://github.com/open-telemetry/opentelemetry-cpp/pull/3236)
+
+New features:
+
+* [SDK] Better control of threads executed by opentelemetry-cpp
+  [#3175](https://github.com/open-telemetry/opentelemetry-cpp/pull/3175)
+
+  * This feature provides a way for applications,
+    when configuring the SDK and exporters,
+    to participate in the execution path
+    of internal opentelemetry-cpp threads.
+
+  * The opentelemetry-cpp library provides the following:
+
+    * a new ThreadInstrumentation interface,
+    * new runtime options structures, to optionally configure the SDK:
+      * BatchSpanProcessorRuntimeOptions
+      * PeriodicExportingMetricReaderRuntimeOptions
+      * BatchLogRecordProcessorRuntimeOptions
+    * new runtime options structures,
+      to optionally configure the OTLP HTTP exporters:
+      * OtlpHttpExporterRuntimeOptions
+      * OtlpHttpMetricExporterRuntimeOptions
+      * OtlpHttpLogRecordExporterRuntimeOptions
+    * new ThreadInstrumentation parameters,
+      to optionally configure the CURL HttpClient
+    * new runtime options structures,
+      to optionally configure the OTLP FILE exporters:
+      * OtlpFileExporterRuntimeOptions
+      * OtlpFileMetricExporterRuntimeOptions
+      * OtlpFileLogRecordExporterRuntimeOptions
+    * new runtime options structure,
+      to optionally configure the OTLP FILE client:
+      * OtlpFileClientRuntimeOptions
+
+  * Using the optional runtime options structures,
+    an application can subclass the ThreadInstrumentation interface,
+    and be notified of specific events of interest during the execution
+    of an internal opentelemetry-cpp thread.
+
+  * This allows an application to call, for example:
+
+    * pthread_setaffinity_np(), for better performances,
+    * setns(), to control the network namespace used by HTTP CURL connections
+    * pthread_setname_np(), for better observability from the operating system
+    * many more specific apis, as needed
+
+  * See the documentation for ThreadInstrumentation for details.
+
+  * A new example program, example_otlp_instrumented_http,
+    shows how to use the feature,
+    and add application logic in the thread execution code path.
+
+  * Note that this feature is experimental,
+    protected by a WITH_THREAD_INSTRUMENTATION_PREVIEW
+    flag in CMake. Various runtime options structures,
+    as well as the thread instrumentation interface,
+    may change without notice before this feature is declared stable.
+
+* [EXPORTER] Support handling retry-able errors for OTLP/HTTP
+  [#3223](https://github.com/open-telemetry/opentelemetry-cpp/pull/3223)
+
+  * This feature is experimental,
+    protected by a WITH_OTLP_RETRY_PREVIEW
+    flag in CMake.
+
+* [EXPORTER] Support handling retry-able errors for OTLP/gRPC
+  [#3219](https://github.com/open-telemetry/opentelemetry-cpp/pull/3219)
+
+  * This feature is experimental,
+    protected by a WITH_OTLP_RETRY_PREVIEW
+    flag in CMake.
+
+## [1.18 2024-11-25]
+
+* [EXPORTER] Fix crash in ElasticsearchLogRecordExporter
+  [#3082](https://github.com/open-telemetry/opentelemetry-cpp/pull/3082)
+
+* [BUILD] Avoid buggy warning with gcc <= 8
+  [#3087](https://github.com/open-telemetry/opentelemetry-cpp/pull/3087)
+
+* [API] Jaeger Propagator should not be deprecated
+  [#3086](https://github.com/open-telemetry/opentelemetry-cpp/pull/3086)
+
+* Update bzlmod version
+  [#3093](https://github.com/open-telemetry/opentelemetry-cpp/pull/3093)
+
+* [BUILD] Remove std::make_unique
+  [#3098](https://github.com/open-telemetry/opentelemetry-cpp/pull/3098)
+
+* [BUILD] Fix compiling problems for gcc 4.8
+  [#3100](https://github.com/open-telemetry/opentelemetry-cpp/pull/3100)
+
+* [TEST] Fix linking order and gmock linking
+  [#3106](https://github.com/open-telemetry/opentelemetry-cpp/pull/3106)
+
+* [EXPORTER] Add config options to prometheus exporter
+  [#3104](https://github.com/open-telemetry/opentelemetry-cpp/pull/3104)
+
+* [BUILD] Add a CMake option to disable shared libs
+  [#3095](https://github.com/open-telemetry/opentelemetry-cpp/pull/3095)
+
+* [EXPORTER] Remove out of date ETW exporter doc
+  [#3103](https://github.com/open-telemetry/opentelemetry-cpp/pull/3103)
+
+* [EXPORTER] Add logging for async gRPC errors
+  [#3108](https://github.com/open-telemetry/opentelemetry-cpp/pull/3108)
+
+* [BUILD] Remove aligned_storage from nostd
+  [#3112](https://github.com/open-telemetry/opentelemetry-cpp/pull/3112)
+
+* [EXPORTER] Elastic Search exporter follow ECS guidelines
+  [#3107](https://github.com/open-telemetry/opentelemetry-cpp/pull/3107)
+
+* [INSTALL] Resolve dependencies in opentelemetry-cpp-config.cmake
+  [#3094](https://github.com/open-telemetry/opentelemetry-cpp/pull/3094)
+
+* [API] Add synchronous gauge
+  [#3029](https://github.com/open-telemetry/opentelemetry-cpp/pull/3029)
+
+* [BUILD] allow building with -DWITH_OTLP_HTTP_COMPRESSION=OFF without zlib
+  [#3120](https://github.com/open-telemetry/opentelemetry-cpp/pull/3120)
+
+* [CI] Comment the arm64 CI
+  [#3125](https://github.com/open-telemetry/opentelemetry-cpp/pull/3125)
+
+* [API] Comply with W3C Trace Context
+  [#3115](https://github.com/open-telemetry/opentelemetry-cpp/pull/3115)
+
+* [EXPORTER] bump prometheus to v1.3.0
+  [#3122](https://github.com/open-telemetry/opentelemetry-cpp/pull/3122)
+
+* [EXPORTER] Log SSL Connection Information
+  [#3113](https://github.com/open-telemetry/opentelemetry-cpp/pull/3113)
+
+* [BUILD] Improve how to handle yield() in ARM
+  [#3129](https://github.com/open-telemetry/opentelemetry-cpp/pull/3129)
+
+* [BUILD] Fix -Wmissing-template-arg-list-after-template-kw warning
+  [#3133](https://github.com/open-telemetry/opentelemetry-cpp/pull/3133)
+
+* [EXPORTER]: Elasticsearch exporter put log resource in root instead of under 'resources'
+  [#3131](https://github.com/open-telemetry/opentelemetry-cpp/pull/3131)
+
+* [TEST] Rename w3c_tracecontext_test to w3c_tracecontext_http_test_server
+  [#3132](https://github.com/open-telemetry/opentelemetry-cpp/pull/3132)
+
+* [BUILD] Patches for building on AIX
+  [#3127](https://github.com/open-telemetry/opentelemetry-cpp/pull/3127)
+
+* [SEMANTIC CONVENTIONS] Migration to weaver
+  [#3105](https://github.com/open-telemetry/opentelemetry-cpp/pull/3105)
+
+* [SEMANTIC CONVENTIONS] Upgrade to semantic conventions 1.28.0
+  [#3139](https://github.com/open-telemetry/opentelemetry-cpp/pull/3139)
+
+* [EXPORTER] handling of invalid ports in UrlParser
+  [#3142](https://github.com/open-telemetry/opentelemetry-cpp/pull/3142)
+
+* [CI] speed up clang-tidy workflow
+  [#3148](https://github.com/open-telemetry/opentelemetry-cpp/pull/3148)
+
+* [EXPORTER] Allow to share gRPC clients between OTLP exporters
+  [#3041](https://github.com/open-telemetry/opentelemetry-cpp/pull/3041)
+
+* Bump codecov/codecov-action from 4 to 5
+  [#3143](https://github.com/open-telemetry/opentelemetry-cpp/pull/3143)
+
+* [CI] Add cppcheck in the build
+  [#3151](https://github.com/open-telemetry/opentelemetry-cpp/pull/3151)
+
+* [BUILD] Fix error message
+  [#3152](https://github.com/open-telemetry/opentelemetry-cpp/pull/3152)
+
+* [EXPORTER] fix clang-tidy warnings in UrlParser
+  [#3146](https://github.com/open-telemetry/opentelemetry-cpp/pull/3146)
+
+* [EXPORTER] Upgrade to opentelemetry-proto 1.4.0
+  [#3157](https://github.com/open-telemetry/opentelemetry-cpp/pull/3157)
+
+* [TEST] refactor UrlParser tests to use value-paramterized tests
+  [#3153](https://github.com/open-telemetry/opentelemetry-cpp/pull/3153)
+
+* [TEST] add a test for ElasticSearchRecordable
+  [#3154](https://github.com/open-telemetry/opentelemetry-cpp/pull/3154)
+
+* [BUILD] Fix missing dependency on protoc compiler
+  [#3159](https://github.com/open-telemetry/opentelemetry-cpp/pull/3159)
+
+* [bazel] Update prometheus-cpp in MODULE.bazel
+  [#3162](https://github.com/open-telemetry/opentelemetry-cpp/pull/3162)
+
+* [bazel] Enable --incompatible_disallow_empty_glob
+  [#2642](https://github.com/open-telemetry/opentelemetry-cpp/pull/2642)
+
+* [INSTALL] Fix cmake/opentelemetry-cpp-config.cmake.in
+  [#3165](https://github.com/open-telemetry/opentelemetry-cpp/pull/3165)
+
+* [BUILD] Do not set OTELCPP_PROTO_PATH in the CMake cache
+  [#3160](https://github.com/open-telemetry/opentelemetry-cpp/pull/3160)
+
+* [BUILD] Fix build for esp32
+  [#3155](https://github.com/open-telemetry/opentelemetry-cpp/pull/3155)
+
+* [bazel] Update opentelemetry-proto in MODULE.bazel
+  [#3163](https://github.com/open-telemetry/opentelemetry-cpp/pull/3163)
+
+Important changes:
+
+* [API] Jaeger Propagator should not be deprecated
+  [#3086](https://github.com/open-telemetry/opentelemetry-cpp/pull/3086)
+
+  * Deprecation of the Jaeger propagator, as announced on 2023-01-31
+    in version 1.8.2, is now reverted.
+  * This deprecation turned out to be not justified,
+    as the Jaeger propagator can be used without the (now removed)
+    Jaeger exporter.
+
+* [EXPORTER] Change log resources location for ElasticsearchLogRecordExporter
+  [#3119](https://github.com/open-telemetry/opentelemetry-cpp/pull/3131)
+
+  * Moved from `root/resources` to `root`
+
+* [SEMANTIC CONVENTIONS] Migration to weaver
+  [#3105](https://github.com/open-telemetry/opentelemetry-cpp/pull/3105)
+
+  * `semantic_convention.h` header files are deprecated,
+    replaced by `semconv/xxx_attributes.h` header files,
+    for each `xxx` semantic attribute group.
+  * See file DEPRECATED.md for details.
+
+Deprecations:
+
+* This release contains deprecations, see file DEPRECATED.md for details.
+
+## [1.17 2024-10-07]
+
+* [CI] Add a clang-tidy build
+  [#3001](https://github.com/open-telemetry/opentelemetry-cpp/pull/3001)
+
+* [BUILD] Upgrade to opentelemetry-proto 1.3.2
+  [#2991](https://github.com/open-telemetry/opentelemetry-cpp/pull/2991)
+
+* [REMOVAL] Remove build option `WITH_DEPRECATED_SDK_FACTORY`
+  [#2717](https://github.com/open-telemetry/opentelemetry-cpp/pull/2717)
+
+* [EXPORTER] ForceFlush before canceling the running requests on shutdown
+  [#2727](https://github.com/open-telemetry/opentelemetry-cpp/pull/2727)
+
+* [SDK] Fix crash in PeriodicExportingMetricReader
+  [#2983](https://github.com/open-telemetry/opentelemetry-cpp/pull/2983)
+
+* [SDK] Fix memory leak in TlsRandomNumberGenerator() constructor
+  [#2661](https://github.com/open-telemetry/opentelemetry-cpp/pull/2661)
+
+* [EXPORTER] Ignore exception when create thread in OTLP file exporter
+  [#3012](https://github.com/open-telemetry/opentelemetry-cpp/pull/3012)
+
+* [BUILD] Update the version in MODULE.bazel
+  [#3015](https://github.com/open-telemetry/opentelemetry-cpp/pull/3015)
+
+* [BUILD] Fix build without vcpkg on Windows when gRPC is disabled
+  [#3016](https://github.com/open-telemetry/opentelemetry-cpp/pull/3016)
+
+* [BUILD] Add abi_version_no bazel flag
+  [#3020](https://github.com/open-telemetry/opentelemetry-cpp/pull/3020)
+
+* [Code health] Expand iwyu coverage to include unit tests
+  [#3022](https://github.com/open-telemetry/opentelemetry-cpp/pull/3022)
+
+* [BUILD] Version opentelemetry_proto/proto_grpc shared libraries
+  [#2992](https://github.com/open-telemetry/opentelemetry-cpp/pull/2992)
+
+* [SEMANTIC CONVENTIONS] Upgrade semantic conventions to 1.27.0
+  [#3023](https://github.com/open-telemetry/opentelemetry-cpp/pull/3023)
+
+* [SDK] Support empty histogram buckets
+  [#3027](https://github.com/open-telemetry/opentelemetry-cpp/pull/3027)
+
+* [TEST] Fix sync problems in OTLP File exporter tests
+  [#3031](https://github.com/open-telemetry/opentelemetry-cpp/pull/3031)
+
+* [SDK] PeriodicExportingMetricReader: future is never set, blocks until timeout
+  [#3030](https://github.com/open-telemetry/opentelemetry-cpp/pull/3030)
+
+* [Code Health] Clang Tidy cleanup, Part 2
+  [#3038](https://github.com/open-telemetry/opentelemetry-cpp/pull/3038)
+
+* [Code Health] include-what-you-use cleanup, part 3
+  [#3004](https://github.com/open-telemetry/opentelemetry-cpp/pull/3004)
+
+* [SDK] Fix overflow in timeout logic
+  [#3046](https://github.com/open-telemetry/opentelemetry-cpp/pull/3046)
+
+* [TEST] Add missing tests to Bazel build
+  [#3045](https://github.com/open-telemetry/opentelemetry-cpp/pull/3045)
+
+* [TEST] update collector tests with debug exporter
+  [#3050](https://github.com/open-telemetry/opentelemetry-cpp/pull/3050)
+
+* [EXAMPLE] update collector example with debug exporter
+  [#3049](https://github.com/open-telemetry/opentelemetry-cpp/pull/3049)
+
+* [TEST] update references to logging exporter
+  [#3053](https://github.com/open-telemetry/opentelemetry-cpp/pull/3053)
+
+* [EXAMPLE] Clean the tracer initialization in OStream example
+  [#3051](https://github.com/open-telemetry/opentelemetry-cpp/pull/3051)
+
+* [EXPORTER] Fix the format of SpanLink for ETW
+  [#3054](https://github.com/open-telemetry/opentelemetry-cpp/pull/3054)
+
+* [EXPORTER] Add in-memory metric exporter
+  [#3043](https://github.com/open-telemetry/opentelemetry-cpp/pull/3043)
+
+* [Code Health] include-what-you-use cleanup, part 4
+  [#3040](https://github.com/open-telemetry/opentelemetry-cpp/pull/3040)
+
+* [BUILD] add loongarch info
+  [#3052](https://github.com/open-telemetry/opentelemetry-cpp/pull/3052)
+
+* [CI] Update otel-collector version
+  [#3067](https://github.com/open-telemetry/opentelemetry-cpp/pull/3067)
+
+* [SDK] Update MetricProducer interface to match spec
+  [#3044](https://github.com/open-telemetry/opentelemetry-cpp/pull/3044)
+
+* [EXPORTER] Fix URL in ES exporter, fix ipv6 supporting for http client
+  [#3081](https://github.com/open-telemetry/opentelemetry-cpp/pull/3081)
+
+* [EXPORTER] Add HttpHeaders in ElasticsearchLogRecordExporter
+  [#3083](https://github.com/open-telemetry/opentelemetry-cpp/pull/3083)
+
+Breaking changes:
+
+* [REMOVAL] Remove build option `WITH_DEPRECATED_SDK_FACTORY`
+  [#2717](https://github.com/open-telemetry/opentelemetry-cpp/pull/2717)
+
+  * As announced in opentelemetry-cpp previous release 1.16.0,
+    CMake option `WITH_DEPRECATED_SDK_FACTORY` was temporary,
+    and to be removed by the next release.
+  * This option is now removed.
+  * Code configuring the SDK must be adjusted, as previously described:
+
+    * [API/SDK] Provider cleanup
+      [#2664](https://github.com/open-telemetry/opentelemetry-cpp/pull/2664)
+
+    * Before this fix:
+      * SDK factory methods such as:
+        * opentelemetry::sdk::trace::TracerProviderFactory::Create()
+        * opentelemetry::sdk::metrics::MeterProviderFactory::Create()
+        * opentelemetry::sdk::logs::LoggerProviderFactory::Create()
+        * opentelemetry::sdk::logs::EventLoggerProviderFactory::Create()
+
+        returned an API object (opentelemetry::trace::TracerProvider)
+          to the caller.
+
+    * After this fix, these methods return an SDK level object
+      (opentelemetry::sdk::trace::TracerProvider) to the caller.
+    * Returning an SDK object is necessary for the application to
+      cleanup and invoke SDK level methods, such as ForceFlush(),
+      on a provider.
+    * The application code that configures the SDK, by calling
+      the various provider factories, may need adjustment.
+    * All the examples have been updated, and in particular no
+      longer perform static_cast do convert an API object to an SDK object.
+      Please refer to examples for guidance on how to adjust.
+
+## [1.16.1 2024-07-17]
+
+* [BUILD] Add bazel missing BUILD file
+  [#2720](https://github.com/open-telemetry/opentelemetry-cpp/pull/2720)
+
+* [SDK] Added reserve for spans array in BatchSpanProcessor.
+  [#2724](https://github.com/open-telemetry/opentelemetry-cpp/pull/2724)
+
+* [DOC] Update "Using triplets" section in building-with-vcpkg documentation.
+  [#2726](https://github.com/open-telemetry/opentelemetry-cpp/pull/2726)
+
+* [DOC] Remove comment for unused LoggerProvider initialization params
+  [#2972](https://github.com/open-telemetry/opentelemetry-cpp/pull/2972)
+
+* [SECURITY] Remove OTLP HTTP support for TLS 1.0 and TLS 1.1,
+  require TLS 1.2 or better
+  [#2722](https://github.com/open-telemetry/opentelemetry-cpp/pull/2722)
+
+* [TEST] Fix opentelemetry-collector bind address
+  [#2989](https://github.com/open-telemetry/opentelemetry-cpp/pull/2989)
+
+* [EXPORTER] Fix references in AttributeValueVisitor
+  [#2985](https://github.com/open-telemetry/opentelemetry-cpp/pull/2985)
+
+* [Code health] include-what-you-use cleanup, part 2
+  [#2704](https://github.com/open-telemetry/opentelemetry-cpp/pull/2704)
+
+* [Code Health] clang-tidy cleanup, part 1
+  [#2990](https://github.com/open-telemetry/opentelemetry-cpp/pull/2990)
+
+* [CI] Build failures with ABSEIL 20240116 and CMAKE 3.30
+  [#3002](https://github.com/open-telemetry/opentelemetry-cpp/pull/3002)
+
+* [CI] Enable bzlmod
+  [#2995](https://github.com/open-telemetry/opentelemetry-cpp/pull/2995)
+
+* [Metrics SDK] Fix hash calculation for nostd::string
+  [#2999](https://github.com/open-telemetry/opentelemetry-cpp/pull/2999)
+
+Breaking changes:
+
+* [SECURITY] Remove OTLP HTTP support for TLS 1.0 and TLS 1.1,
+  require TLS 1.2 or better
+  [#2722](https://github.com/open-telemetry/opentelemetry-cpp/pull/2722)
+  * The OTLP HTTP exporter no longer accept options like:
+    * min_TLS = 1.0
+    * min_TLS = 1.1
+    * max_TLS = 1.0
+    * max_TLS = 1.1
+  * When connecting to an OTLP HTTP endpoint, using `https`,
+    the connection will require TLS 1.2 by default,
+    unless min_TLS is set to 1.3
+  * Plain `http` connections (insecure) are not affected.
+
+## [1.16.0] 2024-06-21
+
+* [BUILD] Upgrade bazel abseil from 20220623.1 to 20230802.2
+  [#2650](https://github.com/open-telemetry/opentelemetry-cpp/pull/2650)
+* [BUILD] Use nostd::enable_if_t instead of std::enable_if_t
+  [#2648](https://github.com/open-telemetry/opentelemetry-cpp/pull/2648)
+* [EXEMPLAR] Update ExemplarFilter and ExemplarReservoir for spec
+  [#2372](https://github.com/open-telemetry/opentelemetry-cpp/pull/2372)
+* [BUILD] Link CoreFoundation on apple systems
+  [#2655](https://github.com/open-telemetry/opentelemetry-cpp/pull/2655)
+* [SDK] Avoid missing conditional variable update and simplify atomic bool
+  [#2553](https://github.com/open-telemetry/opentelemetry-cpp/pull/2553)
+* [BUILD] Build break in OLTP_FILE tests
+  [#2659](https://github.com/open-telemetry/opentelemetry-cpp/pull/2659)
+* [EXPORTER] General cleanup for is_shutdown flags in exporters.
+  [#2663](https://github.com/open-telemetry/opentelemetry-cpp/pull/2663)
+* [CI] Upgrade Maintainers CI to ubuntu-24.04
+  [#2670](https://github.com/open-telemetry/opentelemetry-cpp/pull/2670)
+* [BUILD] Upgrade to opentelemetry-proto 1.3.1
+  [#2669](https://github.com/open-telemetry/opentelemetry-cpp/pull/2669)
+* [API] Return NoopLogRecord from NoopLogger
+  [#2668](https://github.com/open-telemetry/opentelemetry-cpp/pull/2668)
+* [BUILD] Remove the hard-coded separator in tracestate
+  [#2672](https://github.com/open-telemetry/opentelemetry-cpp/pull/2672)
+* [SDK] Fix forceflush may wait for ever
+  [#2584](https://github.com/open-telemetry/opentelemetry-cpp/pull/2584)
+* [API] DO not allow unsafe Logger::EmitLogRecord
+  [#2673](https://github.com/open-telemetry/opentelemetry-cpp/pull/2673)
+* [BUILD] Read default proto version from third_party_release
+  [#2677](https://github.com/open-telemetry/opentelemetry-cpp/pull/2677)
+* [CI] include-what-you-use
+  [#2629](https://github.com/open-telemetry/opentelemetry-cpp/pull/2629)
+* [CI] Upgrade to clang-format 18
+  [#2684](https://github.com/open-telemetry/opentelemetry-cpp/pull/2684)
+* [CI] Fix CI failures on Ubuntu 24.04
+  [#2686](https://github.com/open-telemetry/opentelemetry-cpp/pull/2686)
+* [SEMANTIC CONVENTIONS] Upgrade to version 1.26.0
+  [#2687](https://github.com/open-telemetry/opentelemetry-cpp/pull/2687)
+* [API/SDK] Provider cleanup
+  [#2664](https://github.com/open-telemetry/opentelemetry-cpp/pull/2664)
+* [ETW] Add table name mapping for Logs other than the default Log table
+  [#2691](https://github.com/open-telemetry/opentelemetry-cpp/pull/2691)
+* [CI] Remove benchmark overlay for vcpkg
+  [#2695](https://github.com/open-telemetry/opentelemetry-cpp/pull/2695)
+* [BUILD] Remove the incorrect set of CMAKE_MSVC_RUNTIME_LIBRARY for vcpkg
+  [#2696](https://github.com/open-telemetry/opentelemetry-cpp/pull/2696)
+* [BUILD] CMakeLists.txt: Enable CMAKE_MSVC_RUNTIME_LIBRARY support
+  [#2652](https://github.com/open-telemetry/opentelemetry-cpp/pull/2652)
+* [EXPORTER] OTLP file: use thread-safe file/io
+  [#2675](https://github.com/open-telemetry/opentelemetry-cpp/pull/2675)
+* [bazel] Bump version and deps
+  [#2679](https://github.com/open-telemetry/opentelemetry-cpp/pull/2679)
+* [BUILD] Add support for bzlmod
+  [#2608](https://github.com/open-telemetry/opentelemetry-cpp/pull/2608)
+* [BUILD] Fix Import Abseil-cpp
+  [#2701](https://github.com/open-telemetry/opentelemetry-cpp/pull/2701)
+* [Code health] include-what-you-use cleanup
+  [#2692](https://github.com/open-telemetry/opentelemetry-cpp/pull/2692)
+* [BUILD] Restore Bazel flag removed from public API
+  [#2702](https://github.com/open-telemetry/opentelemetry-cpp/pull/2702)
+* [DOC] Fix typo tace_id -> trace_id in logger.h
+  [#2703](https://github.com/open-telemetry/opentelemetry-cpp/pull/2703)
+* Bump docker/build-push-action from 5 to 6
+  [#2705](https://github.com/open-telemetry/opentelemetry-cpp/pull/2705)
+* [CI] Enable ARM64 build in CI
+  [#2699](https://github.com/open-telemetry/opentelemetry-cpp/pull/2699)
+* [Code health] Remove Unicode Text from Source files
+  [#2707](https://github.com/open-telemetry/opentelemetry-cpp/pull/2707)
+* [BUILD] Add option WITH_OTLP_GRPC_SSL_MTLS_PREVIEW
+  [#2714](https://github.com/open-telemetry/opentelemetry-cpp/pull/2714)
+* [EXPORTER] All 2xx return codes should be considered successful.
+  [#2712](https://github.com/open-telemetry/opentelemetry-cpp/pull/2712)
+
+Important changes:
+
+* [API/SDK] Provider cleanup
+  [#2664](https://github.com/open-telemetry/opentelemetry-cpp/pull/2664)
+  * Before this fix:
+    * The API class `opentelemetry::trace::Tracer` exposed methods such
+      as `ForceFlush()`, `ForceFlushWithMicroseconds()`, `Close()`
+      and `CloseWithMicroseconds()`.
+    * These methods are meant to be used when configuring the SDK,
+      and should not be part of the API. Exposing them was an oversight.
+    * Two of these methods are virtual, and therefore part of the ABI.
+  * After this fix:
+    * In `OPENTELEMETRY_ABI_VERSION_NO 1`, nothing is changed,
+      because removing this code would break the ABI.
+    * In `OPENTELEMETRY_ABI_VERSION_NO 2`, these methods are moved
+      from the API to the SDK. This is a breaking change for ABI version 2,
+      which is still experimental.
+  * In all cases, instrumenting an application should not
+    invoke flush or close on a tracer, do not use these methods.
+
+Breaking changes:
+
+* [API/SDK] Provider cleanup
+  [#2664](https://github.com/open-telemetry/opentelemetry-cpp/pull/2664)
+  * Before this fix:
+    * SDK factory methods such as:
+      * opentelemetry::sdk::trace::TracerProviderFactory::Create()
+      * opentelemetry::sdk::metrics::MeterProviderFactory::Create()
+      * opentelemetry::sdk::logs::LoggerProviderFactory::Create()
+      * opentelemetry::sdk::logs::EventLoggerProviderFactory::Create()
+      returned an API object (opentelemetry::trace::TracerProvider)
+      to the caller.
+  * After this fix, these methods return an SDK level object
+    (opentelemetry::sdk::trace::TracerProvider) to the caller.
+  * Returning an SDK object is necessary for the application to
+    cleanup and invoke SDK level methods, such as ForceFlush(),
+    on a provider.
+  * The application code that configures the SDK, by calling
+    the various provider factories, may need adjustment.
+  * All the examples have been updated, and in particular no
+    longer perform static_cast do convert an API object to an SDK object.
+    Please refer to examples for guidance on how to adjust.
+  * If adjusting application code is impractical,
+    an alternate and temporary solution is to build with option
+    WITH_DEPRECATED_SDK_FACTORY=ON in CMake.
+  * Option WITH_DEPRECATED_SDK_FACTORY=ON will allow to build code
+    without application changes, posponing changes for later.
+  * WITH_DEPRECATED_SDK_FACTORY=ON is temporary, only to provide
+    an easier migration path. Expect this flag to be removed,
+    as early as by the next release.
+
+Notes on experimental features:
+
+* [#2372](https://github.com/open-telemetry/opentelemetry-cpp/issues/2372)
+  introduced `MeterProvider::SetExemplar()` which accepts en
+  `ExemplarFilterType` enumeration with `kAlwaysOff`, `kAlwaysOn` and
+  `kTraceBased`.
+
+## [1.15.0] 2024-04-21
+
+* [EXPORTER] Change OTLP HTTP content_type default to binary
+  [#2564](https://github.com/open-telemetry/opentelemetry-cpp/pull/2564)
+* [DOC] Fix OTLP documentation: Default endpoint is wrong for OTLP/HTTP
+  [#2560](https://github.com/open-telemetry/opentelemetry-cpp/pull/2560)
+* [BUILD] Fix old style cast warning
+  [#2567](https://github.com/open-telemetry/opentelemetry-cpp/pull/2567)
+* [EXPORTER] Gzip compression support for OTLP/HTTP and OTLP/gRPC exporter
+  [#2530](https://github.com/open-telemetry/opentelemetry-cpp/pull/2530)
+* [BUILD] update vcpkg submodule to 2024.02.14
+  [#2575](https://github.com/open-telemetry/opentelemetry-cpp/pull/2575)
+* [SDK] Support for OTEL_SERVICE_NAME
+  [#2577](https://github.com/open-telemetry/opentelemetry-cpp/pull/2577)
+* [EXPORTER] Support URL-encoded values for `OTEL_EXPORTER_OTLP_HEADERS`
+  [#2579](https://github.com/open-telemetry/opentelemetry-cpp/pull/2579)
+* [BUILD] CMake cleanup for message()
+  [#2582](https://github.com/open-telemetry/opentelemetry-cpp/pull/2582)
+* [BUILD] Bump CMake minimum required version to 3.9
+  [#2581](https://github.com/open-telemetry/opentelemetry-cpp/pull/2581)
+* [BUILD] Provide LIKELY / UNLIKELY macros
+  [#2580](https://github.com/open-telemetry/opentelemetry-cpp/pull/2580)
+* [EXPORTER] OTLP: Fix missing ResourceMetrics SchemaURL
+  [#2587](https://github.com/open-telemetry/opentelemetry-cpp/pull/2587)
+* [ETW] cleanup include path
+  [#2594](https://github.com/open-telemetry/opentelemetry-cpp/pull/2594)
+* Upgrade to googletest 1.14.0
+  [#2596](https://github.com/open-telemetry/opentelemetry-cpp/pull/2596)
+* Upgrade to nlohmann_json 3.11.3
+  [#2595](https://github.com/open-telemetry/opentelemetry-cpp/pull/2595)
+* [BAZEL] Move -std=c++14 to .bazelrc
+  [#2600](https://github.com/open-telemetry/opentelemetry-cpp/pull/2600)
+* [BAZEL] Fix -std=c++14 warning on Windows
+  [#2601](https://github.com/open-telemetry/opentelemetry-cpp/pull/2601)
+* Upgrade to benchmark 1.8.3
+  [#2597](https://github.com/open-telemetry/opentelemetry-cpp/pull/2597)
+* Upgrade to prometheus 1.2.4
+  [#2598](https://github.com/open-telemetry/opentelemetry-cpp/pull/2598)
+* [DOC] Fix typo: Asynchronouse -> Asynchronous in meter.h
+  [#2604](https://github.com/open-telemetry/opentelemetry-cpp/pull/2604)
+* [BUILD] Do not link prometheus-cpp::util when it doesn't exist
+  [#2606](https://github.com/open-telemetry/opentelemetry-cpp/pull/2606)
+* [SDK] Remove unused variable
+  [#2609](https://github.com/open-telemetry/opentelemetry-cpp/pull/2609)
+* [METRICS SDK] Remove extra OfferMeasurement call
+  in SyncMetricsStorage::OfferMeasurement
+  [#2610](https://github.com/open-telemetry/opentelemetry-cpp/pull/2610)
+* [MISC] Use set -e on all shell scripts and pass shellcheck --severity=error
+  [#2616](https://github.com/open-telemetry/opentelemetry-cpp/pull/2616)
+* [CI] Add shellcheck --severity=error as a CI step
+  [#2618](https://github.com/open-telemetry/opentelemetry-cpp/pull/2618)
+* [CI] Upgrade to abseil 20240116.1 (CMake only)
+  [#2599](https://github.com/open-telemetry/opentelemetry-cpp/pull/2599)
+* [CI] Benchmark, provide units with --benchmark_min_time
+  [#2621](https://github.com/open-telemetry/opentelemetry-cpp/pull/2621)
+* [EXPORTER] OTLP file exporter
+  [#2540](https://github.com/open-telemetry/opentelemetry-cpp/pull/2540)
+* [CI] Use platform CMake
+  [#2627](https://github.com/open-telemetry/opentelemetry-cpp/pull/2627)
+* [PROTO] Upgrade to opentelemetry-proto 1.2.0
+  [#2631](https://github.com/open-telemetry/opentelemetry-cpp/pull/2631)
+* [SDK] DefaultLogHandler to print errors to std::cerr, add LogLevel::None
+  [#2622](https://github.com/open-telemetry/opentelemetry-cpp/pull/2622)
+* [SEMANTIC CONVENTIONS] Upgrade to semantic convention 1.25.0
+  [#2633](https://github.com/open-telemetry/opentelemetry-cpp/pull/2633)
+* [DOC] Add readme and examples for OTLP FILE exporters.
+  [#2638](https://github.com/open-telemetry/opentelemetry-cpp/pull/2638)
+* [SEMANTIC CONVENTIONS] Rework on semantic conventions 1.25.0
+  [#2640](https://github.com/open-telemetry/opentelemetry-cpp/pull/2640)
+* [DOC] Update INSTALL.md
+  [#2592](https://github.com/open-telemetry/opentelemetry-cpp/pull/2592)
+
+Important changes:
+
+* [EXPORTER] Gzip compression support for OTLP/HTTP and OTLP/gRPC exporter
+  [#2530](https://github.com/open-telemetry/opentelemetry-cpp/pull/2530)
+  * In the `OtlpHttpExporterOptions` and `OtlpGrpcExporterOptions`, a new
+    field called compression has been introduced. This field can be set
+    to "gzip” to enable gzip compression.
+  * The CMake option `WITH_OTLP_HTTP_COMPRESSION` is introduced to enable
+    gzip compression support for the OTLP HTTP Exporter and includes a
+    dependency on zlib.
+* [SDK] Change OTLP HTTP content_type default to binary
+  [#2558](https://github.com/open-telemetry/opentelemetry-cpp/pull/2558)
+* [CI] Use platform CMake
+  [#2627](https://github.com/open-telemetry/opentelemetry-cpp/pull/2627)
+  * The `CI` in github no longer install a different version of `cmake`.
+  * It now always use the `cmake` provided by the platform.
+  * As part of this change, the script `ci/setup_cmake.sh` was renamed
+    to `ci/setup_googletest.sh`, for clarity, now that this script
+    only installs googletest.
+* [SDK] DefaultLogHandler to print to std::cerr, add LogLevel::None
+  [#2622](https://github.com/open-telemetry/opentelemetry-cpp/pull/2622)
+  * Change DefaultLogHandler output
+    * Before, the default internal logger, DefaultLogHandler,
+      used to print to std::cout.
+    * Now, DefaultLogHandler prints errors and warnings to std::cerr,
+      as expected, while printing info and debug messages to std::cout.
+    * Applications that expected to find the opentelemetry-cpp internal
+      error log in std::cout may need adjustments, either by looking
+      at std::cerr instead, or by using a custom log handler.
+  * Additional LogLevel::None
+    * LogLevel::None is a new supported log level, which does not print
+      any message.
+    * Custom log handlers may need to implement a new case, to avoid
+      compiler warnings.
+    * Numbering of log levels like OTEL_INTERNAL_LOG_LEVEL_ERROR
+      has changed, which requires to rebuild, as the SDK ABI differs.
+
+## [1.14.2] 2024-02-27
+
+* [SDK] Fix observable attributes drop
+   [#2557](https://github.com/open-telemetry/opentelemetry-cpp/pull/2557)
+
+## [1.14.1] 2024-02-23
+
+* [SDK] Restore Recordable API compatibility with versions < 1.14.0
+  [#2547](https://github.com/open-telemetry/opentelemetry-cpp/pull/2547)
+* [DOC] Add missing CHANGELOG.
+  [#2549](https://github.com/open-telemetry/opentelemetry-cpp/pull/2549)
+* [EXPORTER] Error when grpc endpoint is empty
+  [#2507](https://github.com/open-telemetry/opentelemetry-cpp/pull/2507)
+* [DOC] Fix typo in benchmarks.rst
+  [#2542](https://github.com/open-telemetry/opentelemetry-cpp/pull/2542)
+
+Important changes:
+
+* [SDK] Restore Recordable API compatibility with versions < 1.14.0
+  [#2547](https://github.com/open-telemetry/opentelemetry-cpp/pull/2547)
+  * For third party _extending_ the SDK, release 1.14.0 introduced
+    an API breaking change compared to 1.13.0
+  * This fix restores API (but not ABI) compatibility of
+    release 1.14.1 with release 1.13.0.
+  * This allows to build a third party exporter with no source code changes,
+    for both releases 1.14.1 and 1.13.0.
+
+## [1.14.0] 2024-02-16
+
+* [BUILD] Add DLL build CI pipeline with CXX20
+  [#2465](https://github.com/open-telemetry/opentelemetry-cpp/pull/2465)
+* [EXPORTER] Set `is_monotonic` flag for Observable Counters
+  [#2478](https://github.com/open-telemetry/opentelemetry-cpp/pull/2478)
+* [PROTO] Upgrade to opentelemetry-proto v1.1.0
+  [#2488](https://github.com/open-telemetry/opentelemetry-cpp/pull/2488)
+* [BUILD] Introduce CXX 20 CI pipeline for MSVC/Windows
+  [#2450](https://github.com/open-telemetry/opentelemetry-cpp/pull/2450)
+* [API] Propagation: fix for hex conversion to binary for odd hex strings
+  [#2533](https://github.com/open-telemetry/opentelemetry-cpp/pull/2533)
+* [DOC] Fix calendar link
+  [#2532](https://github.com/open-telemetry/opentelemetry-cpp/pull/2532)
+* [ETW EXPORTER] Remove namespace using in ETW exporter which affects global
+  namespace
+  [#2531](https://github.com/open-telemetry/opentelemetry-cpp/pull/2531)
+* [BUILD] Don't invoke vcpkg from this repo with CMAKE_TOOLCHAIN_FILE set
+  [#2527](https://github.com/open-telemetry/opentelemetry-cpp/pull/2527)
+* [EXPORTER] Async exporting for otlp grpc
+  [#2407](https://github.com/open-telemetry/opentelemetry-cpp/pull/2407)
+* [METRICS SDK] Fix attribute filtering for synchronous instruments.
+  [#2472](https://github.com/open-telemetry/opentelemetry-cpp/pull/2472)
+* [BUILD] Better handling of OPENTELEMETRY_STL_VERSION under Bazel.
+  [#2503](https://github.com/open-telemetry/opentelemetry-cpp/pull/2503)
+* [DOC] Fixes CI markdown error MD055 - Table pipe style
+  [#2517](https://github.com/open-telemetry/opentelemetry-cpp/pull/2517)
+* [API] Propagators: do not overwrite the active span with a default invalid
+  span [#2511](https://github.com/open-telemetry/opentelemetry-cpp/pull/2511)
+* [BUILD] Updated the recorded vcpkg submodule version
+  [#2513](https://github.com/open-telemetry/opentelemetry-cpp/pull/2513)
+* [BUILD] Remove unnecessary usage/includes of nostd/type_traits
+  [#2509](https://github.com/open-telemetry/opentelemetry-cpp/pull/2509)
+* [SEMANTIC CONVENTIONS] Upgrade to version 1.24.0
+  [#2461](https://github.com/open-telemetry/opentelemetry-cpp/pull/2461)
+* [EXAMPLES] Improve readme of Metrics example
+  [#2510](https://github.com/open-telemetry/opentelemetry-cpp/pull/2510)
+* [BUILD] Clang-15 warning about `__has_trivial_destructor`
+  [#2502](https://github.com/open-telemetry/opentelemetry-cpp/pull/2502)
+* [BUILD] Fix multiple assignment operators for SpinLockMutex
+  [#2501](https://github.com/open-telemetry/opentelemetry-cpp/pull/2501)
+* [BUILD] Alternative way of exporting symbols (generating .def file)
+  [#2476](https://github.com/open-telemetry/opentelemetry-cpp/pull/2476)
+* [CI] Make cmake.c++20*.test actually use C++20 and add cmake.c++23*.test
+  [#2496](https://github.com/open-telemetry/opentelemetry-cpp/pull/2496)
+* [DOCUMENTATION] Add api reference documentation for logs
+  [#2497](https://github.com/open-telemetry/opentelemetry-cpp/pull/2497)
+* [BUILD] Fix variable shadow
+  [#2498](https://github.com/open-telemetry/opentelemetry-cpp/pull/2498)
+* [BUILD] Fix checks on __cplusplus under MSVC, do not assume /Zc
+  [#2493](https://github.com/open-telemetry/opentelemetry-cpp/pull/2493)
+* [EXAMPLES] Use logs API instead of logs bridge API in the example
+  [#2494](https://github.com/open-telemetry/opentelemetry-cpp/pull/2494)
+* [EXPORTER] Fix forward protocol encoding for ETW exporter
+  [#2473](https://github.com/open-telemetry/opentelemetry-cpp/pull/2473)
+* [BUILD] Skip patch alias target
+  [#2457](https://github.com/open-telemetry/opentelemetry-cpp/pull/2457)
+* [EXPORTER] Rename populate_otel_scope to without_otel_scope
+  [#2479](https://github.com/open-telemetry/opentelemetry-cpp/pull/2479)
+* [EXPORTER SDK] Additional fixes after NOMINMAX removal on Windows
+  [#2475](https://github.com/open-telemetry/opentelemetry-cpp/pull/2475)
+* [EXPORTER] Do not use regex in `CleanUpString` because some implementations of
+  STL may crash.
+  [#2464](https://github.com/open-telemetry/opentelemetry-cpp/pull/2464)
+* [EXPORTER] Fix Aggregation type detection in OTLP Exporter
+  [#2467](https://github.com/open-telemetry/opentelemetry-cpp/pull/2467)
+* [EXPORTER] Add option to disable Prometheus otel_scope_name and
+  otel_scope_version attributes
+  [#2451](https://github.com/open-telemetry/opentelemetry-cpp/pull/2451)
+* [SEMANTIC CONVENTIONS] Code generation script fails on SELINUX
+  [#2455](https://github.com/open-telemetry/opentelemetry-cpp/pull/2455)
+* [BUILD] Fix removing of NOMINMAX on Windows
+  [#2449](https://github.com/open-telemetry/opentelemetry-cpp/pull/2449)
+* [BUILD] Accept path list in OPENTELEMETRY_EXTERNAL_COMPONENT_PATH
+  [#2439](https://github.com/open-telemetry/opentelemetry-cpp/pull/2439)
+* [BUILD] Remove gmock from GTEST_BOTH_LIBRARIES
+  [#2437](https://github.com/open-telemetry/opentelemetry-cpp/pull/2437)
+* [REMOVAL] Remove option WITH_OTLP_HTTP_SSL_PREVIEW
+  [#2435](https://github.com/open-telemetry/opentelemetry-cpp/pull/2435)
+
+Important changes:
+
+Breaking changes:
+
+* [REMOVAL] Remove option WITH_OTLP_HTTP_SSL_PREVIEW
+  [#2435](https://github.com/open-telemetry/opentelemetry-cpp/pull/2435)
+  * CMake options `WITH_OTLP_HTTP_SSL_PREVIEW` and
+    `WITH_OTLP_HTTP_SSL_TLS_PREVIEW` are removed. Building opentelemetry-cpp
+    without SSL support is no longer possible.
+
+* [PROTO] Upgrade to opentelemetry-proto v1.1.0
+  [#2488](https://github.com/open-telemetry/opentelemetry-cpp/pull/2488)
+  * Class `opentelemetry::sdk::trace::Recordable` has a new virtual method,
+    `SetTraceFlags()`.
+  * This is an incompatible change for the SDK Recordable API and ABI.
+  * Applications _configuring_ the SDK are not affected.
+  * Third parties providing SDK _extensions_ are affected,
+    and must provide a `SetTraceFlags()` implementation,
+    starting with opentelemetry-cpp 1.14.0.
+
+## [1.13.0] 2023-12-06
+
+* [BUILD] Remove WITH_REMOVE_METER_PREVIEW, use WITH_ABI_VERSION_2 instead
+  [#2370](https://github.com/open-telemetry/opentelemetry-cpp/pull/2370)
+* [SDK] Metrics ObservableRegistry Cleanup
+  [#2376](https://github.com/open-telemetry/opentelemetry-cpp/pull/2376)
+* [BUILD] Make WITH_OTLP_HTTP_SSL_PREVIEW mainstream
+  [#2378](https://github.com/open-telemetry/opentelemetry-cpp/pull/2378)
+* [SDK] Creating DoubleUpDownCounter with no matching view
+  [#2379](https://github.com/open-telemetry/opentelemetry-cpp/pull/2379)
+* [API] Add InstrumentationScope attributes in TracerProvider::GetTracer()
+  [#2371](https://github.com/open-telemetry/opentelemetry-cpp/pull/2371)
+* [BUILD] DLL export interface for Metrics
+  [#2344](https://github.com/open-telemetry/opentelemetry-cpp/pull/2344)
+* [BUILD] enum CanonicalCode names too generic... conflict with old C defines
+  [#2385](https://github.com/open-telemetry/opentelemetry-cpp/pull/2385)
+* [BUILD] Fix cpack broken package version
+  [#2386](https://github.com/open-telemetry/opentelemetry-cpp/pull/2386)
+* [API] Add a new AddLink() operation to Span
+  [#2380](https://github.com/open-telemetry/opentelemetry-cpp/pull/2380)
+* [opentracing-shim] Add check for sampled context
+  [#2390](https://github.com/open-telemetry/opentelemetry-cpp/pull/2390)
+* [BUILD] Fix exported definitions when building DLL with STL
+  [#2387](https://github.com/open-telemetry/opentelemetry-cpp/pull/2387)
+* [BUILD] Add missing includes to runtime_context_test
+  [#2395](https://github.com/open-telemetry/opentelemetry-cpp/pull/2395)
+* [ADMIN] Add file .github/repository-settings.md
+  [#2392](https://github.com/open-telemetry/opentelemetry-cpp/pull/2392)
+* [SDK] Fix GetLogger with empty library name
+  [#2398](https://github.com/open-telemetry/opentelemetry-cpp/pull/2398)
+* [TEST] Fix compiling problem and removed -DENABLE_TEST
+  [#2401](https://github.com/open-telemetry/opentelemetry-cpp/pull/2401)
+* [BUILD] Check windows options are not passed to non-Windows build
+  [#2399](https://github.com/open-telemetry/opentelemetry-cpp/pull/2399)
+* [EXPORTER] Rework OTLP/HTTP and OTLP/GRPC exporter options
+  [#2388](https://github.com/open-telemetry/opentelemetry-cpp/pull/2388)
+* [Build] Update vcpkg to latest release
+  [#2412](https://github.com/open-telemetry/opentelemetry-cpp/pull/2412)
+* [SDK] Cardinality limits for metrics streams
+  (Sync Instruments + Delta Temporality)
+  [#2255](https://github.com/open-telemetry/opentelemetry-cpp/pull/2255)
+* [EXPORTER] Prometheus: Add unit to names, convert to word
+  [#2213](https://github.com/open-telemetry/opentelemetry-cpp/pull/2213)
+* [Metrics] Make context optional for histogram instruments in Metrics SDK
+  [#2416](https://github.com/open-telemetry/opentelemetry-cpp/pull/2416)
+* [BUILD] Fix references to trace namespace to be fully qualified
+  [#2422](https://github.com/open-telemetry/opentelemetry-cpp/pull/2422)
+* [BUILD] Bump third_party/googletest to same version as bazel
+  [#2421](https://github.com/open-telemetry/opentelemetry-cpp/pull/2421)
+* [BUILD] Remove defining NOMINMAX from api
+  [#2420](https://github.com/open-telemetry/opentelemetry-cpp/pull/2420)
+* [BUILD] 'uint8_t' not declared in this scope with gcc 13.2.1
+  [#2423](https://github.com/open-telemetry/opentelemetry-cpp/pull/2423)
+* [BUILD] Improve the handling of OPENTELEMETRY_HAVE_WORKING_REGEX
+  [#2430](https://github.com/open-telemetry/opentelemetry-cpp/pull/2430)
+* [SEMANTIC CONVENTION] Upgrade to semconv 1.23.1
+  [#2428](https://github.com/open-telemetry/opentelemetry-cpp/pull/2428)
+* [BUILD] Use fully qualified references to trace/common namespace
+  [#2424](https://github.com/open-telemetry/opentelemetry-cpp/pull/2424)
+* [API] Create root span with active span
+  [#2427](https://github.com/open-telemetry/opentelemetry-cpp/pull/2427)
+* [REMOVAL] Remove ZPAGES
+  [#2433](https://github.com/open-telemetry/opentelemetry-cpp/pull/2433)
+
+Important changes:
+
+* [API] Add InstrumentationScope attributes in TracerProvider::GetTracer()
+  [#2371](https://github.com/open-telemetry/opentelemetry-cpp/pull/2371)
+  * TracerProvider::GetTracer() now accepts InstrumentationScope attributes.
+  * Because this is an `ABI` breaking change, the fix is only available
+    with the `CMake` option `WITH_ABI_VERSION_2=ON`.
+  * When building with `CMake` option `WITH_ABI_VERSION_1=ON` (by default)
+    the `ABI` is unchanged, and the fix is not available.
+
+* [API] Add a new AddLink() operation to Span
+  [#2380](https://github.com/open-telemetry/opentelemetry-cpp/pull/2380)
+  * New `API` Span::AddLink() adds a single link to a span.
+  * New `API` Span::AddLinks() adds multiple links to a span.
+  * Because this is an `ABI` breaking change, the fix is only available
+    with the `CMake` option `WITH_ABI_VERSION_2=ON`.
+  * When building with `CMake` option `WITH_ABI_VERSION_1=ON` (by default)
+    the `ABI` is unchanged, and the fix is not available.
+
+* [BUILD] Make WITH_OTLP_HTTP_SSL_PREVIEW mainstream
+  [#2378](https://github.com/open-telemetry/opentelemetry-cpp/pull/2378)
+  * The experimental `CMake` option `WITH_OTLP_HTTP_SSL_PREVIEW`
+    is now promoted to stable. The default is changed to `ON`.
+  * The experimental `CMake` option `WITH_OTLP_HTTP_SSL_TLS_PREVIEW`
+    is now promoted to stable. The default is changed to `ON`.
+  * These build options are scheduled to be removed by the next release,
+    building without SSL/TLS will no longer be possible.
+
+* [EXPORTER] Rework OTLP/HTTP and OTLP/GRPC exporter options
+  [#2388](https://github.com/open-telemetry/opentelemetry-cpp/pull/2388)
+  * `OtlpGrpcMetricExporterOptions` used to honor `_TRACES_`
+    environment variables, instead of `_METRICS_` environment variables.
+  * The implementation of `OtlpGrpcMetricExporterOptions` is now fixed.
+  * Please check configuration variables,
+    to make sure `_METRICS_` variables are set as expected.
+
+Breaking changes:
+
+* [BUILD] Remove WITH_REMOVE_METER_PREVIEW, use WITH_ABI_VERSION_2 instead
+  [#2370](https://github.com/open-telemetry/opentelemetry-cpp/pull/2370)
+  * The experimental `CMake` option `WITH_REMOVE_METER_PREVIEW` is removed,
+    use option `WITH_ABI_VERSION_2` instead.
+
+* [BUILD] enum CanonicalCode names too generic... conflict with old C defines
+  [#2385](https://github.com/open-telemetry/opentelemetry-cpp/pull/2385)
+  * Header file `opentelemetry/trace/canonical_code.h` is unused,
+    and is now removed.
+  * This header should not be included directly in an application.
+    If this is the case, please remove any remaining include directives.
+
+* [BUILD] Fix exported definitions when building DLL with STL
+  [#2387](https://github.com/open-telemetry/opentelemetry-cpp/pull/2387)
+  * The MeterSelector, MeterSelectorFactory, InstrumentSelector,
+    and InstrumentSelectorFactory APIs now use const std::string&
+    instead of nostd::string_view for name, version and schema to
+    maintain a single export definition for DLL.
+
+* [EXPORTER] Rework OTLP/HTTP and OTLP/GRPC exporter options
+  [#2388](https://github.com/open-telemetry/opentelemetry-cpp/pull/2388)
+  * `OtlpGrpcLogRecordExporter` incorrectly used `OtlpGrpcExporterOptions`,
+    which are options for traces and not logs.
+  * This created a bug: the `OtlpGrpcLogRecordExporter` honors `_TRACES_`
+    environment variables, instead of `_LOGS_` environment variables.
+  * `OtlpGrpcLogRecordExporter` is changed to use
+    `OtlpGrpcLogRecordExporterOptions` instead, fixing the bug.
+  * User code that initializes the SDK with a GRPC Log exporter,
+    and uses exporter options, should adjust to replace
+    `OtlpGrpcExporterOptions` with `OtlpGrpcLogRecordExporterOptions`.
+  * Please check configuration variables,
+    to make sure `_LOGS_` variables are set as expected.
+
+* [REMOVAL] Remove ZPAGES
+  [#2433](https://github.com/open-telemetry/opentelemetry-cpp/pull/2433)
+  * As announced in release 1.12.0,
+    the deprecated ZPAGES exporter is now removed.
+
+## [1.12.0] 2023-10-16
+
+* [BUILD] Support `pkg-config`
+  [#2269](https://github.com/open-telemetry/opentelemetry-cpp/pull/2269)
+* [CI] Do not automatically close stale issues
+  [#2277](https://github.com/open-telemetry/opentelemetry-cpp/pull/2277)
+* [CI] Benchmark workflow fails, C++14 required to build grpc
+  [#2278](https://github.com/open-telemetry/opentelemetry-cpp/pull/2278)
+* [SDK] Increase metric name maximum length from 63 to 255 characters
+  [#2284](https://github.com/open-telemetry/opentelemetry-cpp/pull/2284)
+* [SEMANTIC CONVENTION] Deprecated semconv (in the spec)
+  not deprecated (in C++)
+  [#2285](https://github.com/open-telemetry/opentelemetry-cpp/pull/2285)
+* [SDK] Remove unused member variables from SyncMetricStorage
+  [#2294](https://github.com/open-telemetry/opentelemetry-cpp/pull/2294)
+* [DEPRECATION] Deprecate ZPAGES
+  [#2291](https://github.com/open-telemetry/opentelemetry-cpp/pull/2291)
+* [API] Deliver ABI breaking changes
+  [#2222](https://github.com/open-telemetry/opentelemetry-cpp/pull/2222)
+* [SDK] Allow metric instrument names to contain / characters
+  [#2310](https://github.com/open-telemetry/opentelemetry-cpp/pull/2310)
+* [SDK] Fix Observable Counters/UpDownCounters
+  [#2298](https://github.com/open-telemetry/opentelemetry-cpp/pull/2298)
+* [SDK] Add exemplar reservoir to async metric storage
+  [#2319](https://github.com/open-telemetry/opentelemetry-cpp/pull/2319)
+* [TEST] Fix lifetime issues in prometheus test utils
+  [#2322](https://github.com/open-telemetry/opentelemetry-cpp/pull/2322)
+* [EXPORTER] Prometheus: Remove explicit timestamps from metric points
+  [#2324](https://github.com/open-telemetry/opentelemetry-cpp/pull/2324)
+* [EXPORTER] Prometheus: Handle attribute key collisions from sanitation
+  [#2326](https://github.com/open-telemetry/opentelemetry-cpp/pull/2326)
+* [EXPORTER] Prometheus cleanup, test with TranslateToPrometheus
+  [#2329](https://github.com/open-telemetry/opentelemetry-cpp/pull/2329)
+* [SDK] Fix log message in Meter::RegisterSyncMetricStorage
+  [#2325](https://github.com/open-telemetry/opentelemetry-cpp/pull/2325)
+* [DOC] Simplify the project status section
+  [#2332](https://github.com/open-telemetry/opentelemetry-cpp/pull/2332)
+* [EXPORTER] Prometheus: Sanitize labels according to spec
+  [#2330](https://github.com/open-telemetry/opentelemetry-cpp/pull/2330)
+* [SDK] Fix deadlock when shuting down http client
+  [#2337](https://github.com/open-telemetry/opentelemetry-cpp/pull/2337)
+* [Exporter] Group spans by resource and instrumentation scope
+  in OTLP export requests
+  [#2335](https://github.com/open-telemetry/opentelemetry-cpp/pull/2335)
+* [BUILD] Need fine-grained HAVE_CPP_STDLIB
+  [#2304](https://github.com/open-telemetry/opentelemetry-cpp/pull/2304)
+* [API] Add InstrumentationScope attributes in MeterProvider::GetMeter()
+  [#2224](https://github.com/open-telemetry/opentelemetry-cpp/pull/2224)
+* [REMOVAL] Drop C++11 support
+  [#2342](https://github.com/open-telemetry/opentelemetry-cpp/pull/2342)
+* [EXPORTER] prometheus: add otel_scope_name and otel_scope_version labels
+  [#2293](https://github.com/open-telemetry/opentelemetry-cpp/pull/2293)
+* [EXPORTER] Export resource for prometheus
+  [#2301](https://github.com/open-telemetry/opentelemetry-cpp/pull/2301)
+* [BUILD] error: read-only reference ‘value’ used as ‘asm’ output
+  [#2354](https://github.com/open-telemetry/opentelemetry-cpp/pull/2354)
+* [BUILD] Build break with external CMake nlohman_json package
+  [#2353](https://github.com/open-telemetry/opentelemetry-cpp/pull/2353)
+* [BUILD] Upgrade libcurl to version 8.4.0
+  [#2358](https://github.com/open-telemetry/opentelemetry-cpp/pull/2358)
+* [BUILD] Fix opentracing-shim when added in super project
+  [#2356](https://github.com/open-telemetry/opentelemetry-cpp/pull/2356)
+* [BUILD] Fix protoc searching with non-imported protobuf::protoc target
+  [#2362](https://github.com/open-telemetry/opentelemetry-cpp/pull/2362)
+* [BUILD] Support to use different cmake package CONFIG of dependencies
+  [#2263](https://github.com/open-telemetry/opentelemetry-cpp/pull/2263)
+* [SEMANTIC CONVENTION] Upgrade to semconv 1.22.0
+  [#2368](https://github.com/open-telemetry/opentelemetry-cpp/pull/2368)
+
+Important changes:
+
+* [API] Add InstrumentationScope attributes in MeterProvider::GetMeter()
+  [#2224](https://github.com/open-telemetry/opentelemetry-cpp/pull/2224)
+  * MeterProvider::GetMeter() now accepts InstrumentationScope attributes.
+  * Because this is an `ABI` breaking change, the fix is only available
+    with the `CMake` option `WITH_ABI_VERSION_2=ON`.
+  * When building with `CMake` option `WITH_ABI_VERSION_1=ON` (by default)
+    the `ABI` is unchanged, and the fix is not available.
+
+Breaking changes:
+
+* [BUILD] Need fine-grained HAVE_CPP_STDLIB
+  [#2304](https://github.com/open-telemetry/opentelemetry-cpp/pull/2304)
+  * In `CMAKE`, the boolean option `WITH_STL` as changed to an option
+    that accepts the values `OFF`, `ON`, `CXX11`, `CXX14`, `CXX17`,
+    `CXX20` and `CXX23`.
+  * Applications makefiles that did not set WITH_STL need to use
+    `WITH_STL=OFF` instead (this is the default).
+  * Applications makefiles that did set WITH_STL need to use
+    `WITH_STL=ON` instead, or may choose to pick a specific value.
+  * In the `API` header files, the preprocessor symbol `HAVE_CPP_STDLIB`
+    is no longer used.
+  * Applications that did set `HAVE_CPP_STDLIB` before, need to set
+    `OPENTELEMETRY_STL_VERSION=<version>` instead, to build with a
+    specific STL version (2011, 2014, 2017, 2020, 2023).
+  * The opentelemetry-cpp makefile no longer sets
+    CMAKE_CXX_STANDARD by itself.
+    Instead, the CMAKE_CXX_STANDARD and/or compiler options -stdc++ used
+    by the caller are honored.
+  * Applications that set neither CMAKE_CXX_STANDARD nor -stdc++
+    options may need to provide a C++ standard in their makefiles.
+
+* [REMOVAL] Drop C++11 support
+  [#2342](https://github.com/open-telemetry/opentelemetry-cpp/pull/2342)
+  * Building with C++11 is no longer supported.
+
+Deprecations:
+
+* [DEPRECATION] Deprecate ZPAGES
+  [#2291](https://github.com/open-telemetry/opentelemetry-cpp/pull/2291)
+
+## [1.11.0] 2023-08-21
+
+* [BUILD] Fix more cases for symbol name for 32-bit win32 DLL build
+  [#2264](https://github.com/open-telemetry/opentelemetry-cpp/pull/2264)
+* [BUILD] added public link of `opentelemetry_proto_grpc` against gRPC lib (only
+  if gRPC library is shared)
+  [#2268](https://github.com/open-telemetry/opentelemetry-cpp/pull/2268)
+* [CI] use ubuntu-latest for tsan CI
+  [#2267](https://github.com/open-telemetry/opentelemetry-cpp/pull/2267)
+* [SDK] Fixing an apparent logging macro bug
+  [#2265](https://github.com/open-telemetry/opentelemetry-cpp/pull/2265)
+* [BUILD] Support protobuf 3.22 or upper
+  [#2163](https://github.com/open-telemetry/opentelemetry-cpp/pull/2163)
+* [BUILD] Remove extra includes
+  [#2252](https://github.com/open-telemetry/opentelemetry-cpp/pull/2252)
+* [LOGS API SDK] Mark logs signal as stable API/SDK
+  [#2229](https://github.com/open-telemetry/opentelemetry-cpp/pull/2229)
+* [SEMANTIC CONVENTIONS] Upgrade to 1.21.0
+  [#2248](https://github.com/open-telemetry/opentelemetry-cpp/pull/2248)
+* [SDK] Valgrind errors on std::atomic variables
+  [#2244](https://github.com/open-telemetry/opentelemetry-cpp/pull/2244)
+* [BUILD] Fix compile with clang 16 and libc++
+  [#2242](https://github.com/open-telemetry/opentelemetry-cpp/pull/2242)
+* [Metrics SDK] Add unit to Instrument selection criteria
+  [#2236](https://github.com/open-telemetry/opentelemetry-cpp/pull/2236)
+* [SDK] Add OStreamLogRecordExporterFactory
+  [#2240](https://github.com/open-telemetry/opentelemetry-cpp/pull/2240)
+* [SDK] Add support for LowMemory metrics temporality
+  [#2234](https://github.com/open-telemetry/opentelemetry-cpp/pull/2234)
+* [CI] Misc build scripts cleanup
+  [#2232](https://github.com/open-telemetry/opentelemetry-cpp/pull/2232)
+* [CI] Upgrade GoogleTest version from 1.12.1 to 1.13.0
+  [#2114](https://github.com/open-telemetry/opentelemetry-cpp/pull/2114)
+* [BUILD] include cstdint
+  [#2230](https://github.com/open-telemetry/opentelemetry-cpp/pull/2230)
+* [EXPORTER] Support protobuf 3.22 or upper
+  [#2163](https://github.com/open-telemetry/opentelemetry-cpp/pull/2163)
+* [SDK] Mark logs signal as stable API/SDK
+  [#2229](https://github.com/open-telemetry/opentelemetry-cpp/pull/2229)
+
+Breaking changes:
+
+* [SDK] Add unit to Instrument selection criteria
+  [#2236](https://github.com/open-telemetry/opentelemetry-cpp/pull/2236)
+  * The `View` constructor and `ViewFactory::Create` method now takes a
+   `unit` criteria as optional third argument.
+  * Please adjust SDK configuration code accordingly.
+
+## [1.10.0] 2023-07-11
+
+* [REMOVAL] Remove the jaeger exporter
+  [#2031](https://github.com/open-telemetry/opentelemetry-cpp/pull/2031)
+
+* [CI] Add a C++11 build
+  [#2152](https://github.com/open-telemetry/opentelemetry-cpp/pull/2152)
+
+* [CI] Add Include what you use
+  [#2214](https://github.com/open-telemetry/opentelemetry-cpp/pull/2214)
+
+* [CI] opentelemetry-cpp project CI
+  [#2071](https://github.com/open-telemetry/opentelemetry-cpp/pull/2071)
+
+* [CI] Do not tag pull_request with the "need-triage" label
+  [#2228](https://github.com/open-telemetry/opentelemetry-cpp/pull/2228)
+
+* [BUILD] Fixing CMake to build GTest on Windows
+  [#1887](https://github.com/open-telemetry/opentelemetry-cpp/pull/1887)
+
+* [BUILD] Remove option WITH_OTLP
+  [#2161](https://github.com/open-telemetry/opentelemetry-cpp/pull/2161)
+
+* [BUILD] Link to opentelemetry_logs even without OTLP
+  [#2177](https://github.com/open-telemetry/opentelemetry-cpp/pull/2177)
+
+* [BUILD] Avoid dependency on protobuf from the OTLP HTTP metrics exporter header
+  [#2179](https://github.com/open-telemetry/opentelemetry-cpp/pull/2179)
+
+* [BUILD] Add ctime header to metrics_exporter.cc
+  [#2187](https://github.com/open-telemetry/opentelemetry-cpp/pull/2187)
+
+* [BUILD] Fix the exported symbol name for 32-bit win32 DLL
+  [#2190](https://github.com/open-telemetry/opentelemetry-cpp/pull/2190)
+
+* [BUILD] Upgrade to opentelemetry-proto 0.20.0
+  [#2195](https://github.com/open-telemetry/opentelemetry-cpp/pull/2195)
+
+* [BUILD] SDK Header files cleanup, use forward declarations
+  [#2182](https://github.com/open-telemetry/opentelemetry-cpp/pull/2182)
+
+* [BUILD] Enable building otel-cpp extensions from main repo
+  [#1937](https://github.com/open-telemetry/opentelemetry-cpp/pull/1937)
+
+* [BUILD] Fix if check on environment variable and add CMake variable
+  [#2207](https://github.com/open-telemetry/opentelemetry-cpp/pull/2207)
+
+* [BUILD] Add `OPENTELEMETRY_CPP_FOUND` into cmake CONFIG file
+  [#2215](https://github.com/open-telemetry/opentelemetry-cpp/pull/2215)
+
+* [BUILD] Upgrade opentelemetry-proto to 1.0.0
+  [#2216](https://github.com/open-telemetry/opentelemetry-cpp/pull/2216)
+
+* [BUILD] Include nostd/string_view which is used in severity.h
+  [#2219](https://github.com/open-telemetry/opentelemetry-cpp/pull/2219)
+
+* [TEST] Expand api singleton test to cover explicit dlopen()
+  [#2164](https://github.com/open-telemetry/opentelemetry-cpp/pull/2164)
+
+* [API] Remove include_trace_context
+  [#2194](https://github.com/open-telemetry/opentelemetry-cpp/pull/2194)
+
+* [API] Remove Meters
+  [#2205](https://github.com/open-telemetry/opentelemetry-cpp/pull/2205)
+
+* [SDK] Add AdaptingCircularBufferCounter for exponential histograms
+  [#2158](https://github.com/open-telemetry/opentelemetry-cpp/pull/2158)
+
+* [SDK] Add base2 exponential histogram indexer
+  [#2173](https://github.com/open-telemetry/opentelemetry-cpp/pull/2173)
+
+* [SDK] Simplify SDK version
+  [#2180](https://github.com/open-telemetry/opentelemetry-cpp/pull/2180)
+
+* [SDK] Add benchmark for base2 exponential histogram indexer
+  [#2181](https://github.com/open-telemetry/opentelemetry-cpp/pull/2181)
+
+* [SDK] Provide builders to avoid exposing Metrics SDK internals
+  [#2189](https://github.com/open-telemetry/opentelemetry-cpp/pull/2189)
+
+* [SDK] MeterProvider should own MeterContext, not share it
+  [#2218](https://github.com/open-telemetry/opentelemetry-cpp/pull/2218)
+
+* [SDK] TracerProvider should own TracerContext, not share it
+  [#2221](https://github.com/open-telemetry/opentelemetry-cpp/pull/2221)
+
+* [EXPORTER] Change OTLP Json field name to camelCase
+  [#2162](https://github.com/open-telemetry/opentelemetry-cpp/pull/2162)
+
+* [EXPORTER] Support empty arrays in `OtlpRecordable` attributes
+  [#2166](https://github.com/open-telemetry/opentelemetry-cpp/pull/2166)
+
+* [EXPORTER] set is_monotonic only for instrument type kCounter
+  [#2171](https://github.com/open-telemetry/opentelemetry-cpp/pull/2171)
+
+* [EXPORTER] Fixed HTTP CURL for 32bits platforms
+  [#2178](https://github.com/open-telemetry/opentelemetry-cpp/pull/2178)
+
+* [EXPORTER] Fix OTLP HTTP exporting in sync mode
+  [#2193](https://github.com/open-telemetry/opentelemetry-cpp/pull/2193)
+
+* [EXPORTER] Prometheus exporter sanitizes invalid characters
+  [#1934](https://github.com/open-telemetry/opentelemetry-cpp/pull/1934)
+
+* [EXPORTER] Prometheus: Error on ingesting samples
+  with different value but same timestamp
+  [#2200](https://github.com/open-telemetry/opentelemetry-cpp/pull/2200)
+
+* [EXPORTER] OTLP GRPC mTLS support
+  [#2120](https://github.com/open-telemetry/opentelemetry-cpp/pull/2120)
+
+* [DOC] Small fix for Histogram documentation
+  [#2156](https://github.com/open-telemetry/opentelemetry-cpp/pull/2156)
+
+* [DOC] Move Reiley Yang to emeritus
+  [#2198](https://github.com/open-telemetry/opentelemetry-cpp/pull/2198)
+
+Important changes:
+
+* [API] Remove Meters
+  [#2205](https://github.com/open-telemetry/opentelemetry-cpp/pull/2205)
+  * The CMake option `WITH_REMOVE_METER_PREVIEW` was added.
+  * This option is experimental, and may change in the future.
+  * Enabling it is an ABI breaking change.
+
+Breaking changes:
+
+* [REMOVAL] Remove the jaeger exporter
+  [#2031](https://github.com/open-telemetry/opentelemetry-cpp/pull/2031)
+  * The CMake `WITH_JAEGER` option has been removed
+  * Please remove usage of `WITH_JAEGER` from user scripts and makefiles.
+
+* [SDK] MeterProvider should own MeterContext, not share it
+  [#2218](https://github.com/open-telemetry/opentelemetry-cpp/pull/2218)
+  * The `MeterProvider` constructor now takes a `unique_ptr` on
+    `MeterContext`, instead of a `shared_ptr`.
+  * Please adjust SDK configuration code accordingly.
+
+* [SDK] TracerProvider should own TracerContext, not share it
+  [#2221](https://github.com/open-telemetry/opentelemetry-cpp/pull/2221)
+  * The `TracerProvider` constructor now takes a `unique_ptr` on
+    `TracerContext`, instead of a `shared_ptr`.
+  * The `LoggerProvider` constructor now takes a `unique_ptr` on
+    `LoggerContext`, instead of a `shared_ptr`.
+  * Please adjust SDK configuration code accordingly.
+
+## [1.9.1] 2023-05-26
+
+* [DEPRECATION] Drop C++11 support
+  [#2146](https://github.com/open-telemetry/opentelemetry-cpp/pull/2146)
+
+* [CI] Upgrade Bazel and Bazelisk version
+  [#2118](https://github.com/open-telemetry/opentelemetry-cpp/pull/2118)
+* [CI] Upgrade Google Benchmark version from 1.6.0 to 1.7.1
+  [#2116](https://github.com/open-telemetry/opentelemetry-cpp/pull/2116)
+* [CI] Upgrade Nlohmann JSON library version from 3.10.5 to 3.11.2
+  [#2115](https://github.com/open-telemetry/opentelemetry-cpp/pull/2115)
+
+* [BUILD] Missed include
+  [#2143](https://github.com/open-telemetry/opentelemetry-cpp/pull/2143)
+* [BUILD] Add opentelemetry_proto_grpc and allow build shared
+  opentelemetry_proto and opentelemetry_proto_grpc on non-Windows platform.
+  [#2097](https://github.com/open-telemetry/opentelemetry-cpp/pull/2097)
+* [BUILD] Warning cleanup, single character wrapped by std::string
+  [#2137](https://github.com/open-telemetry/opentelemetry-cpp/pull/2137)
+* [BUILD] Add missing target dependencies
+  [#2128](https://github.com/open-telemetry/opentelemetry-cpp/pull/2128)
+* [BUILD] Fix if JSON library already added another CMake target
+  [#2126](https://github.com/open-telemetry/opentelemetry-cpp/pull/2126)
+* [BUILD] shared libraries with version suffix, along with the symbolic link
+  [#2109](https://github.com/open-telemetry/opentelemetry-cpp/pull/2109)
+* [BUILD] Show warning message if WITH_OTLP is enabled
+  [#2112](https://github.com/open-telemetry/opentelemetry-cpp/pull/2112)
+* [BUILD] Add missing STL header.
+  [#2107](https://github.com/open-telemetry/opentelemetry-cpp/pull/2107)
+* [BUILD] Build break with old curl, macro CURL_VERSION_BITS unknown
+  [#2102](https://github.com/open-telemetry/opentelemetry-cpp/pull/2102)
+* [BUILD] Transitive dependency issue with the otlp http exporter
+  [#2154](https://github.com/open-telemetry/opentelemetry-cpp/pull/2154)
+
+* [TEST] Add unit test for log body implicit conversions.
+  [#2136](https://github.com/open-telemetry/opentelemetry-cpp/pull/2136)
+* [TEST] Add event id to logger benchmark method
+  [#2133](https://github.com/open-telemetry/opentelemetry-cpp/pull/2133)
+
+* [API] Fix inclusion header files and use forward declaration
+  [#2124](https://github.com/open-telemetry/opentelemetry-cpp/pull/2124)
+* [API] Add user facing Logging API and Benchmarks
+  [#2094](https://github.com/open-telemetry/opentelemetry-cpp/pull/2094)
+
+* [SDK] SDK support for the new OTel log
+  [#2123](https://github.com/open-telemetry/opentelemetry-cpp/pull/2123)
+
+* [EXPORTER] Fixed HTTP session cleanup on shutdown
+  [#2111](https://github.com/open-telemetry/opentelemetry-cpp/pull/2111)
+* [EXPORTER] Delegate all API calls of gRPC into
+  opentelemetry_exporter_otlp_grpc_client,
+  and make it contains all symbols needed.
+  [#2005](https://github.com/open-telemetry/opentelemetry-cpp/pull/2005)
+
+* [DOC] Add Marc as maintainer.
+  [#2027](https://github.com/open-telemetry/opentelemetry-cpp/pull/2027)
+
+Breaking changes:
+
+* Add opentelemetry_proto_grpc and move gRPC sources into it.
+  [#2097](https://github.com/open-telemetry/opentelemetry-cpp/pull/2097)
+  * There will be no breaking changes for users who only use OTLP exporters and
+    do not directly use opentelemetry-cpp::proto. However, it is important to
+    note that `opentelemetry-cpp::proto` no longer contains generated gRPC codes
+    , and all components that depend on these gRPC codes should also link to
+    `opentelemetry-cpp::proto_grpc`.
+
+Deprecations:
+
+* The Jaeger Exporter is deprecated, see [DEPRECATED](./DEPRECATED.md) for details.
+* C++11 support is to end, C++14 will be supported instead,
+  see [DEPRECATED](./DEPRECATED.md) for details.
+
+## [1.9.0] 2023-04-12
+
+* [CI] Make build environment parallel (Windows)
+  [#2080](https://github.com/open-telemetry/opentelemetry-cpp/pull/2080)
+* [CI] Make build environment parallel (Linux)
+  [#2076](https://github.com/open-telemetry/opentelemetry-cpp/pull/2076)
+* [CI] Remove separate run of metrics ostream example
+  [#2030](https://github.com/open-telemetry/opentelemetry-cpp/pull/2030)
+
+* [BUILD] Include directory path added for Zipkin exporter example
+  [#2069](https://github.com/open-telemetry/opentelemetry-cpp/pull/2069)
+* [BUILD] Ignore more warning in generated protobuf files
+  [#2067](https://github.com/open-telemetry/opentelemetry-cpp/pull/2067)
+* [BUILD] Clean warnings in ETW exporters
+  [#2063](https://github.com/open-telemetry/opentelemetry-cpp/pull/2063)
+* [BUILD] Fix default value of OPENTELEMETRY_INSTALL_default
+  [#2062](https://github.com/open-telemetry/opentelemetry-cpp/pull/2062)
+
+* [SEMANTIC CONVENTIONS] Upgrade to version 1.20.0
+  [#2088](https://github.com/open-telemetry/opentelemetry-cpp/pull/2088)
+* [SEMANTIC CONVENTIONS] Upgrade to version 1.19.0
+  [#2017](https://github.com/open-telemetry/opentelemetry-cpp/pull/2017)
+
+* [API] Checking indices before dereference in string utils
+  [#2040](https://github.com/open-telemetry/opentelemetry-cpp/pull/2040)
+* [API] Export factory class of log provider
+  [#2041](https://github.com/open-telemetry/opentelemetry-cpp/pull/2041)
+
+* [SDK] Implement Forceflush for Periodic Metric Reader
+  [#2064](https://github.com/open-telemetry/opentelemetry-cpp/pull/2064)
+* [SDK] Add `ForceFlush` for all `LogRecordExporter` and `SpanExporter`
+  [#2000](https://github.com/open-telemetry/opentelemetry-cpp/pull/2000)
+* [SDK] Fix schema URL precedence bug in `Resource::Merge`
+  [#2036](https://github.com/open-telemetry/opentelemetry-cpp/pull/2036)
+* [SDK] Use sdk_start_ts for MetricData start_ts for instruments having
+  cumulative aggregation temporality.
+  [#2086](https://github.com/open-telemetry/opentelemetry-cpp/pull/2086)
+
+* [EXPORTER] Add OTLP HTTP SSL support
+  [#1793](https://github.com/open-telemetry/opentelemetry-cpp/pull/1793)
+* [EXPORTER] GRPC endpoint scheme should take precedence over OTEL_EXPORTER_OTLP_TRACES_INSECURE
+  [#2060](https://github.com/open-telemetry/opentelemetry-cpp/pull/2060)
+
+* [EXAMPLES] Remove unused 'alerting' section from prometheus.yml in examples
+  [#2055](https://github.com/open-telemetry/opentelemetry-cpp/pull/2055)
+* [EXAMPLES] Fix view names in Prometheus example
+  [#2034](https://github.com/open-telemetry/opentelemetry-cpp/pull/2034)
+
+* [DOC] Fix some docs typo
+  [#2057](https://github.com/open-telemetry/opentelemetry-cpp/pull/2057)
+* [DOC] Update OpenTracing shim README.md
+  [#2028](https://github.com/open-telemetry/opentelemetry-cpp/pull/2028)
+* [DOC] INSTALL doc clarifications
+  [#2078](https://github.com/open-telemetry/opentelemetry-cpp/pull/2078)
+
+Important changes:
+
+* [EXPORTER] GRPC endpoint scheme should take precedence over OTEL_EXPORTER_OTLP_TRACES_INSECURE
+  [#2060](https://github.com/open-telemetry/opentelemetry-cpp/pull/2060)
+  * The logic to decide whether or not an OTLP GRPC exporter uses SSL has
+    changed to comply with the specification:
+    * Before this change, the following settings were evaluated, in order:
+      * OTEL_EXPORTER_OTLP_TRACES_INSECURE (starting with 1.8.3)
+      * OTEL_EXPORTER_OTLP_INSECURE (starting with 1.8.3)
+      * OTEL_EXPORTER_OTLP_TRACES_SSL_ENABLE
+      * OTEL_EXPORTER_OTLP_SSL_ENABLE
+    * With this change, the following settings are evaluated, in order:
+      * The GRPC endpoint scheme, if provided:
+        * "https" imply with SSL,
+        * "http" imply without ssl.
+      * OTEL_EXPORTER_OTLP_TRACES_INSECURE
+      * OTEL_EXPORTER_OTLP_INSECURE
+      * OTEL_EXPORTER_OTLP_TRACES_SSL_ENABLE
+      * OTEL_EXPORTER_OTLP_SSL_ENABLE
+    * As a result, a behavior change for GRPC SSL is possible,
+      because the endpoint scheme now takes precedence.
+      Please verify configuration settings for the GRPC endpoint.
+* [SDK] Add `ForceFlush` for all `LogRecordExporter` and `SpanExporter`
+  [#2000](https://github.com/open-telemetry/opentelemetry-cpp/pull/2000)
+  * `LogRecordExporter` and `SpanExporter` add a new virtual function
+    `ForceFlush`, and if users implement any customized `LogRecordExporter` and
+    `SpanExporter`, they should also implement this function.
+    There should be no impact if users only use factory to create exporters.
+
+Deprecations:
+
+* The Jaeger Exporter is deprecated, see [DEPRECATED](./DEPRECATED.md) for details.
+
+## [1.8.3] 2023-03-06
+
+* Provide version major/minor/patch macros
+  [#2014](https://github.com/open-telemetry/opentelemetry-cpp/pull/2014)
+* [BUILD] Add `OPENTELEMETRY_INSTALL` to allow user to skip install targets.
+  [#2022](https://github.com/open-telemetry/opentelemetry-cpp/pull/2022)
+* [SDK] Rename the global SDK version variables to avoid naming clash
+  [#2011](https://github.com/open-telemetry/opentelemetry-cpp/pull/2011)
+* [BUILD] Fix typo in CMakeLists.txt
+  [#2010](https://github.com/open-telemetry/opentelemetry-cpp/pull/2010)
+* [EXPORTER] fix Prometheus test iterator iterator increment
+  [#2006](https://github.com/open-telemetry/opentelemetry-cpp/pull/2006)
+* [SDK]Add attributes for InstrumentationScope
+  [#2004](https://github.com/open-telemetry/opentelemetry-cpp/pull/2004)
+* [METRICS SDK] Performance improvement in measurement processing
+  [#1993](https://github.com/open-telemetry/opentelemetry-cpp/pull/1993)
+* [EXAMPLE] Add example for logs ostream exporter
+  [#1992](https://github.com/open-telemetry/opentelemetry-cpp/pull/1992)
+* [ETW Exporter] Support serialize span/log attributes into JSON
+  [#1991](https://github.com/open-telemetry/opentelemetry-cpp/pull/1991)
+* [ETW Exporter]Do not overwrite ParentId when setting attribute on Span
+  [#1989](https://github.com/open-telemetry/opentelemetry-cpp/pull/1989)
+* Upgrade prometheus-cpp to v1.1.0
+  [#1954](https://github.com/open-telemetry/opentelemetry-cpp/pull/1954)
+* Convert Prometheus Exporter to Pull MetricReader
+  [#1953](https://github.com/open-telemetry/opentelemetry-cpp/pull/1953)
+* [DOCS] Add alpine packages to INSTALL.md
+  [#1957](https://github.com/open-telemetry/opentelemetry-cpp/pull/1957)
+* [METRICS SDK] Add benchmark tests for Sum Aggregation.
+  [#1948](https://github.com/open-telemetry/opentelemetry-cpp/pull/1948)
+* [BUILD] Build OpenTelemetry SDK and exporters into DLL
+  [#1932](https://github.com/open-telemetry/opentelemetry-cpp/pull/1932)
+* [CI] Enforce copyright check in CI
+  [#1965](https://github.com/open-telemetry/opentelemetry-cpp/pull/1965)
+* [BUILD] Fix typo GENENV -> GETENV
+  [#1972](https://github.com/open-telemetry/opentelemetry-cpp/pull/1972)
+* [SEMANTIC CONVENTIONS] Upgrade to version 1.18.0
+  [#1974](https://github.com/open-telemetry/opentelemetry-cpp/pull/1974)
+* [EXT] Fix thread-safety when shutdown.
+  [#1977](https://github.com/open-telemetry/opentelemetry-cpp/pull/1977)
+* [SDK] Fix missing ObservedTimestamp.
+  [#1985](https://github.com/open-telemetry/opentelemetry-cpp/pull/1985)
+* [METRICS SDK] fix variable names
+  [#1987](https://github.com/open-telemetry/opentelemetry-cpp/pull/1987)
+* [EXPORTER] Fix Prometheus server crash on listening to already used port
+  [#1986](https://github.com/open-telemetry/opentelemetry-cpp/pull/1986)
+* [EXPORTER] Boolean environment variables not parsed per the spec
+  [#1982](https://github.com/open-telemetry/opentelemetry-cpp/pull/1982)
+* [EXPORTER] Opentracing shim
+  [#1909](https://github.com/open-telemetry/opentelemetry-cpp/pull/1909)
+
+## [1.8.2] 2023-01-31
+
+* Remove redundant macro check in nostd::shared_ptr [#1939](https://github.com/open-telemetry/opentelemetry-cpp/pull/1939)
+* Fix typo in packages.cmake causing incorrect nuget package versions [#1936](https://github.com/open-telemetry/opentelemetry-cpp/pull/1936)
+* [METRICS] Custom Aggregation support [#1899](https://github.com/open-telemetry/opentelemetry-cpp/pull/1899)
+* Small fix in INSTALL.md for enabling building package. [#1930](https://github.com/open-telemetry/opentelemetry-cpp/pull/1930)
+* [METRICS] Fix warning for misconfiguration of PeriodicExportingMetricReader [#1929](https://github.com/open-telemetry/opentelemetry-cpp/pull/1929)
+* Make macros.h available for all source files via version.h [#1918](https://github.com/open-telemetry/opentelemetry-cpp/pull/1918)
+* [METRICS] Histogram Aggregation: Fix bucket detection logic,
+ performance improvements, and benchmark tests [#1869](https://github.com/open-telemetry/opentelemetry-cpp/pull/1869)
+* Remove unused namespace alias for nostd [#1914](https://github.com/open-telemetry/opentelemetry-cpp/pull/1914)
+* [METRICS] Update meter.h [#1907](https://github.com/open-telemetry/opentelemetry-cpp/pull/1907)
+* sdk::resource::Resource::Merge should be const [#1905](https://github.com/open-telemetry/opentelemetry-cpp/pull/1905)
+* [METRICS] Collect and Export metric data before
+ PeriodicMetricReader shutdown. [#1860](https://github.com/open-telemetry/opentelemetry-cpp/pull/1860)
+* [ETW EXPORTER] Add Virtual destructor for TailSampler, Update Maintainer
+ mode warnings for MSVC [#1897](https://github.com/open-telemetry/opentelemetry-cpp/pull/1897)
+* Fix #1867 Orderly shutdown in examples [#1868](https://github.com/open-telemetry/opentelemetry-cpp/pull/1868)
+* [METRICS] minor metrics handling optimizations [#1890](https://github.com/open-telemetry/opentelemetry-cpp/pull/1890)
+* fix SpinLockMutex for Intel Compiler [#1885](https://github.com/open-telemetry/opentelemetry-cpp/pull/1885)
+* [LOGS] Change BatchLogRecordProcessorFactory::Create to static method [#1876](https://github.com/open-telemetry/opentelemetry-cpp/pull/1876)
+* Enable generating deb, rpm, NuGet, tgz, zip package through cmake build [#1662](https://github.com/open-telemetry/opentelemetry-cpp/pull/1662)
+* Updated clone command in INSTALL.md [#1818](https://github.com/open-telemetry/opentelemetry-cpp/pull/1818)
+* Small cleanup to remove old metrics design docs [#1855](https://github.com/open-telemetry/opentelemetry-cpp/pull/1855)
+* [BUILD] Fix build error with older version of VS2017 compiler. [1857](https://github.com/open-telemetry/opentelemetry-cpp/pull/1857)
+* [EXPORTERS] Enable setting Span endtime for ETW exporter [#1846](https://github.com/open-telemetry/opentelemetry-cpp/pull/1846)
+* [REMOVAL] Remove deprecated experimental semantic conventions [#1743](https://github.com/open-telemetry/opentelemetry-cpp/pull/1743)
+* [EXPORTERS] Fix console debug logs for otlp exporters. [#1848](https://github.com/open-telemetry/opentelemetry-cpp/pull/1848)
+* [LOGS] Add `include_trace_context` and `EventLogger` [#1884](https://github.com/open-telemetry/opentelemetry-cpp/pull/1884)
+* [METRICS] Change BatchLogRecordProcessorFactory::Create to static method
+* [BUILD] Fix OTELCPP_MAINTAINER_MODE [#1844](https://github.com/open-telemetry/opentelemetry-cpp/pull/1844)
+* [BUILD] Fix compatibility when using clang and libc++, upgrade GTest and
+  cmake when using C++20 [#1852](https://github.com/open-telemetry/opentelemetry-cpp/pull/1852)
+* [SEMANTIC CONVENTIONS] Upgrade to version 1.16.0
+  [#1854](https://github.com/open-telemetry/opentelemetry-cpp/pull/1854)
+* [SDK] BatchSpanProcessor now logs a warning when dropping a span because the
+  queue is full
+  [1871](https://github.com/open-telemetry/opentelemetry-cpp/pull/1871)
+* [BUILD] Migrate from @bazel_tools//platforms to [Bazel Platforms](https://github.com/bazelbuild/platforms)
+  to enable Bazel 6.0.0 compatibility [#1873](https://github.com/open-telemetry/opentelemetry-cpp/pull/1873)
+* [BUILD] Cleanup CMake makefiles for nlohmann_json
+  [#1912](https://github.com/open-telemetry/opentelemetry-cpp/pull/1912)
+* [BUILD] Cleanup CMake makefiles for CURL usage
+  [#1916](https://github.com/open-telemetry/opentelemetry-cpp/pull/1916)
+* [SEMANTIC CONVENTIONS] Upgrade to version 1.17.0
+  [#1927](https://github.com/open-telemetry/opentelemetry-cpp/pull/1927)
+* [MAINTAINER DOC] Define and document a deprecation process,
+  [DEPRECATION] Deprecate the Jaeger exporter,
+  implemented by [#1923](https://github.com/open-telemetry/opentelemetry-cpp/pull/1923)
+* [BUILD] OTLP HTTP Exporter has build warnings in maintainer mode
+  [#1943](https://github.com/open-telemetry/opentelemetry-cpp/pull/1943)
+
+Deprecations:
+
+* [MAINTAINER DOC] Define and document a deprecation process,
+  [#1923](https://github.com/open-telemetry/opentelemetry-cpp/pull/1923)
+  * A new file, [DEPRECATED](./DEPRECATED.md) list all the code currently
+    deprecated.
+  * A new [deprecation process](./docs/deprecation-process.md) details the plan to
+    deprecate and later remove code.
+* [DEPRECATION] Deprecate the Jaeger exporter
+  [#1923](https://github.com/open-telemetry/opentelemetry-cpp/pull/1923)
+  * The Jaeger Exporter is deprecated, see [DEPRECATED](./DEPRECATED.md) for details.
+
+Important changes:
+
+* [BUILD] Cleanup CMake makefiles for CURL usage
+  [#1916](https://github.com/open-telemetry/opentelemetry-cpp/pull/1916)
+  * CMake option `WITH_OTLP_HTTP`
+    * Before this change, the CMake option `WITH_OTLP_HTTP` was unpredictable,
+      sometime set to ON and sometime set to OFF by default,
+      depending on whether a CURL package was found or not.
+      The option `WITH_OTLP_HTTP` was sometime not displayed in the ccmake
+      UI, making it impossible to even discover there is an option of that name.
+    * With this change, CMake option `WITH_OTLP_HTTP` is always OFF by
+      default. WITH_OTLP_HTTP MUST be set to ON explicitly to build the
+      OTLP HTTP exporter. The option is always visible in the ccmake UI.
+  * CMake option `BUILD_W3CTRACECONTEXT_TEST`
+    * Before this change, the W3C trace context tests were built, or
+      not, in an unpredictable way, depending on the presence, or not, of a
+      CURL package. In particular, the build could ignore the W3C trace
+      context tests even when BUILD_W3CTRACECONTEXT_TEST=ON.
+    * With this change, option BUILD_W3CTRACECONTEXT_TEST is honored.
+  * HTTP client/server examples
+    * Before this change, the HTTP client/server examples were built, or
+      not, in an unpredictable way, depending on the presence, or not, of a
+      CURL package.
+    * With this change, a new option `WITH_EXAMPLES_HTTP` is used to
+      build the HTTP client/server examples.
+
+## [1.8.1] 2022-12-04
+
+* [ETW Exporter] Tail based sampling support [#1780](https://github.com/open-telemetry/opentelemetry-cpp/pull/1780)
+* [EXPORTERS] fix typo [affecting otlp exported histogram metrics max uint] [#1827](https://github.com/open-telemetry/opentelemetry-cpp/pull/1827)
+* [EXPORTERS] fix enum-compare-switch warning [#1833](https://github.com/open-telemetry/opentelemetry-cpp/pull/1833)
+* [METRICS] Change default temporality as "Cumulative" for OTLP metrics
+exporters [#1828](https://github.com/open-telemetry/opentelemetry-cpp/pull/1828)
+* [BUILD] Moved otlp_grpc_utils.cc to opentelemetry_exporter_otlp_grpc_client.
+[#1829](https://github.com/open-telemetry/opentelemetry-cpp/pull/1829)
+* Fix type mismatch when move nostd::shared_ptr [#1815](https://github.com/open-telemetry/opentelemetry-cpp/pull/1815)
+* [BUILD] Fix Prometheus target name [#1820](https://github.com/open-telemetry/opentelemetry-cpp/pull/1820)
+* Clean unused docker files [#1817](https://github.com/open-telemetry/opentelemetry-cpp/pull/1817)
+* [BUILD] Fix default bazel build [#1816](https://github.com/open-telemetry/opentelemetry-cpp/pull/1816)
+* [BUILD] move client::nosend under test_common [#1811](https://github.com/open-telemetry/opentelemetry-cpp/pull/1811)
+* [BUILD] Fix opentelemetry-proto file exists check [#1824](https://github.com/open-telemetry/opentelemetry-cpp/pull/1824)
+
+## [1.8.0] 2022-11-27
+
+* [DOC] Update Metrics status in README.md [#1722](https://github.com/open-telemetry/opentelemetry-cpp/pull/1722)
+* [DOC] Remove misleading comments about ABI compatibility for nostd::span [#1731](https://github.com/open-telemetry/opentelemetry-cpp/pull/1731)
+* [BUILD] Bump abseil-cpp for cmake CI [#1807](https://github.com/open-telemetry/opentelemetry-cpp/pull/1807)
+* [Exporter] Add status code to OTLP grpc trace log [#1792](https://github.com/open-telemetry/opentelemetry-cpp/pull/1792)
+* [Exporter] add fix for prometheus exporter build [#1795](https://github.com/open-telemetry/opentelemetry-cpp/pull/1795)
+* [BUILD] Add option WITH_BENCHMARK to disable building benchmarks [#1794](https://github.com/open-telemetry/opentelemetry-cpp/pull/1794)
+* [BUILD] Fix CI benchmark [#1799](https://github.com/open-telemetry/opentelemetry-cpp/pull/1799)
+* [BUILD] bump to gRPC v1.48.1 for bazel CIs [#1786](https://github.com/open-telemetry/opentelemetry-cpp/pull/1786)
+* [BUILD] Fix CI build [#1798](https://github.com/open-telemetry/opentelemetry-cpp/pull/1798)
+* [BUILD] Fix clang-format in CI [#1796](https://github.com/open-telemetry/opentelemetry-cpp/pull/1796)
+* Fix session lock of OtlpHttpClient [#1760](https://github.com/open-telemetry/opentelemetry-cpp/pull/1760)
+* [Metrics SDK] Add MeterContext::ForEachMeter() method to process callbacks on
+ Meter in thread-safe manner [#1783](https://github.com/open-telemetry/opentelemetry-cpp/pull/1783)
+* [DOC] Document that clang-format version 10.0 is used. [#1782](https://github.com/open-telemetry/opentelemetry-cpp/pull/1782)
+* [BUILD] Upgrade bazel build to use abseil-cpp-20220623.1 [#1779](https://github.com/open-telemetry/opentelemetry-cpp/pull/1779)
+* Fix GlobalLogHandler singleton creation order [#1767](https://github.com/open-telemetry/opentelemetry-cpp/pull/1767)
+* [Metrics SDK] Change Prometheus CMake target name [#1765](https://github.com/open-telemetry/opentelemetry-cpp/pull/1765)
+* [DOC] Cleanup INSTALL.md [#1757](https://github.com/open-telemetry/opentelemetry-cpp/pull/1757)
+* [DOC] Format config options in OTLP exporter readme [#1748](https://github.com/open-telemetry/opentelemetry-cpp/pull/1748)
+* [DOC] Cleanup ENABLE_METRICS_PREVIEW [#1745](https://github.com/open-telemetry/opentelemetry-cpp/pull/1745)
+* [Build] Multiple CURL packages leads to invalid build (#1738) [#1739](https://github.com/open-telemetry/opentelemetry-cpp/pull/1739)
+* [Metrics SDK] Cleanup ENABLE_METRICS_PREVIEW [#1735](https://github.com/open-telemetry/opentelemetry-cpp/pull/1735)
+* [Logs SDK] LogProcessor, LogExporter class name [#1736](https://github.com/open-telemetry/opentelemetry-cpp/pull/1736)
+* [Metrics SDK] Cleanup of old _metric api/sdk [#1734](https://github.com/open-telemetry/opentelemetry-cpp/pull/1734)
+* [ETW Exporter] Fix span timestamp(s) precision to nanoseconds [#1726](https://github.com/open-telemetry/opentelemetry-cpp/pull/1726)
+* [LOGS SDK] Rename LogProcessor and LogExporter to LogRecordProcessor and LogRecordExporter
+  [#1727](https://github.com/open-telemetry/opentelemetry-cpp/pull/1727)
+* [METRICS SDK] - Remove old metrics from Github CI
+  [#1733](https://github.com/open-telemetry/opentelemetry-cpp/pull/1733)
+* [BUILD] Add CMake OTELCPP_PROTO_PATH [#1730](https://github.com/open-telemetry/opentelemetry-cpp/pull/1730)
+* [SEMANTIC CONVENTIONS] Upgrade to version 1.15.0
+  [#1761](https://github.com/open-telemetry/opentelemetry-cpp/pull/1761)
+* [LOGS SDK] New LogRecord and logs::Recordable implementations.
+  [#1766](https://github.com/open-telemetry/opentelemetry-cpp/pull/1766)
+
+Deprecation notes:
+
+* [Deprecation] Deprecate experimental semantic conventions
+  [#1744](https://github.com/open-telemetry/opentelemetry-cpp/pull/1744)
+  * The file
+    `api/include/opentelemetry/trace/experimental_semantic_conventions.h`
+    is deprecated, and will be removed in a future release.
+    Use file
+    `api/include/opentelemetry/trace/semantic_conventions.h`
+    instead.
+
+  * The file
+    `sdk/include/opentelemetry/sdk/resource/experimental_semantic_conventions.h`
+    is deprecated, and will be removed in a future release.
+    Use file
+    `sdk/include/opentelemetry/sdk/resource/semantic_conventions.h`
+    instead.
+
+  * The function, declared in the global namespace
+    `uint32_t hashCode(const char *str, uint32_t h = 0)`
+    is deprecated, and will be removed in a future release.
+    No replacement will be provided.
+    Note that function `opentelemetry::utils::hashCode`,
+    declared in the ETW exporter, is not affected by this deprecation.
+
+Breaking changes:
+
+* [SEMANTIC CONVENTIONS] Upgrade to version 1.15.0
+  [#1761](https://github.com/open-telemetry/opentelemetry-cpp/pull/1761)
+  * Naming of semantic conventions has changed from uppercase constants,
+    like `SemanticConventions::SERVICE_NAME`,
+    to camel case, like `SemanticConventions::kServiceName`.
+    This is necessary to avoid collisions with macros in general,
+    which breaks the build on some platforms.
+  * Semantic conventions are flagged as experimental,
+    which is why this change is done in this release.
+
+## [1.7.0] 2022-10-28
+
+* [METRICS SDK] Validate Instrument meta data (name, unit, description) [#1713](https://github.com/open-telemetry/opentelemetry-cpp/pull/1713)
+* [DOCS] Document libthrift 0.12.0 doesn't work with Jaeger exporter [#1714](https://github.com/open-telemetry/opentelemetry-cpp/pull/1714)
+* [Metrics SDK] Add Monotonic Property to Sum Aggregation, and
+unit tests for Up Down Counter [#1675](https://github.com/open-telemetry/opentelemetry-cpp/pull/1675)
+* [Metrics SDK] Move Metrics Exemplar processing behind feature flag [#1710](https://github.com/open-telemetry/opentelemetry-cpp/pull/1710)
+* [Metrics API/SDK] Change Meter API/SDK to return nostd::unique_ptr
+ for Sync Instruments [#1707](https://github.com/open-telemetry/opentelemetry-cpp/pull/1707)
+which includes breaking change in the Metrics api and sdk.
+* [BUILD] Add e2e test to asan & tsan CI [#1670](https://github.com/open-telemetry/opentelemetry-cpp/pull/1670)
+* [BUILD] Add otlp-grpc example bazel [#1708](https://github.com/open-telemetry/opentelemetry-cpp/pull/1708)
+* [TRACE SDK] Fix debug log of OTLP HTTP exporter and ES log exporter [#1703](https://github.com/open-telemetry/opentelemetry-cpp/pull/1703)
+* [METRICS SDK] Fix a potential precision loss on integer in
+ReservoirCellIndexFor [#1696](https://github.com/open-telemetry/opentelemetry-cpp/pull/1696)
+* [METRICS SDK] Fix Histogram crash [#1685](https://github.com/open-telemetry/opentelemetry-cpp/pull/1685)
+* [METRICS SDK] Fix:1676 Segfault when short export period is used for metrics [#1682](https://github.com/open-telemetry/opentelemetry-cpp/pull/1682)
+* [METRICS SDK] Add timeout support to MeterContext::ForceFlush [#1673](https://github.com/open-telemetry/opentelemetry-cpp/pull/1673)
+* [DOCS] - Minor updates to OStream Metrics exporter documentation [#1679](https://github.com/open-telemetry/opentelemetry-cpp/pull/1679)
+* [DOCS] Fix:#1575 API Documentation for Metrics SDK and API [#1678](https://github.com/open-telemetry/opentelemetry-cpp/pull/1678)
+* [BUILD] Fixed compiler warnings [#1677](https://github.com/open-telemetry/opentelemetry-cpp/pull/1677)
+* [METRICS SDK] Fix threading issue between Meter::RegisterSyncMetricStorage
+ and Meter::Collect [#1666](https://github.com/open-telemetry/opentelemetry-cpp/pull/1666)
+* [METRICS SDK] Fix data race on MeterContext::meters_ [#1668](https://github.com/open-telemetry/opentelemetry-cpp/pull/1668)
+* [METRICS SDK] Fix observable Gauge metrics generation [#1651](https://github.com/open-telemetry/opentelemetry-cpp/pull/1651)
+* [BUILD] Detect ARCH=sparc in CMake [#1660](https://github.com/open-telemetry/opentelemetry-cpp/pull/1660)
+* [SDK] Add user agent for OTLP http/grpc client [#1657](https://github.com/open-telemetry/opentelemetry-cpp/pull/1657)
+* [BUILD] Fix clang and gcc warnings [#1658](https://github.com/open-telemetry/opentelemetry-cpp/pull/1658)
+* [Metrics SDK] Add Metrics ExemplarFilter and ExemplarReservoir [#1584](https://github.com/open-telemetry/opentelemetry-cpp/pull/1584)
+* [LOGS SDK] Rename OnReceive to OnEmit [#1652](https://github.com/open-telemetry/opentelemetry-cpp/pull/1652)
+* [METRICS SDK] Fix Observable Gauge does not reflect updated values,
+and send the old value always [#1641](https://github.com/open-telemetry/opentelemetry-cpp/pull/1641)
+* [Metrics SDK] Change boundary type to double for Explicit Bucket Histogram Aggregation,
+and change default bucket range [#1626](https://github.com/open-telemetry/opentelemetry-cpp/pull/1626)
+* [METRICS SDK] Fix occasional Segfault with LongCounter instrument [#1638](https://github.com/open-telemetry/opentelemetry-cpp/pull/1638)
+* [BUILD] Bump vcpk to 2022.08.15 [#1633](https://github.com/open-telemetry/opentelemetry-cpp/pull/1633)
+* [BUILD] Bump gRPC to v1.48.1 for CMake Linux CI [#1608](https://github.com/open-telemetry/opentelemetry-cpp/pull/1608)
+* [Metrics] Switch to explicit 64 bit integers [#1686](https://github.com/open-telemetry/opentelemetry-cpp/pull/1686)
+  which includes breaking change in the Metrics api and sdk.
+* [Metrics SDK] Add support for Pull Metric Exporter [#1701](https://github.com/open-telemetry/opentelemetry-cpp/pull/1701)
+  which includes breaking change in the Metrics api.
+* [BUILD] Add CMake OTELCPP_MAINTAINER_MODE [#1650](https://github.com/open-telemetry/opentelemetry-cpp/pull/1650)
+* [SEMANTIC CONVENTIONS] Upgrade to version 1.14.0 [#1697](https://github.com/open-telemetry/opentelemetry-cpp/pull/1697)
+
+Notes:
+
+Metrics API/SDK GA release includes PRs [#1686](https://github.com/open-telemetry/opentelemetry-cpp/pull/1686),
+[#1701](https://github.com/open-telemetry/opentelemetry-cpp/pull/1701), and
+[#1707](https://github.com/open-telemetry/opentelemetry-cpp/pull/1707)
+with breaking changes in the Metrics API and SDK.
+
+## [1.6.1] 2022-09-22
+
+* [BUILD] Upgrade opentelemetry-proto to v0.19.0 [#1579](https://github.com/open-telemetry/opentelemetry-cpp/pull/1579)
+* [METRICS EXPORTER] Add `OtlpGrpcMetricExporterFactory` and `OtlpHttpMetricExporterFactory`.
+  [#1606](https://github.com/open-telemetry/opentelemetry-cpp/pull/1606)
+* [SEMANTIC CONVENTIONS] Upgrade to version 1.13.0 [#1624](https://github.com/open-telemetry/opentelemetry-cpp/pull/1624)
+* [BUILD] Fixes span creation benchmark issue. [#1622](https://github.com/open-telemetry/opentelemetry-cpp/pull/1622)
+* [BUILD] Fix more build warnings (#1616) [#1620](https://github.com/open-telemetry/opentelemetry-cpp/pull/1620)
+* [SDK gRPC]: Fix out-of-bounds access of string_view in GrpcClientCarrier in
+      the example
+      [#1619](https://github.com/open-telemetry/opentelemetry-cpp/pull/1619)
+* [EXPORTER ETW] Add Trace flags in SpanContext [#1618](https://github.com/open-telemetry/opentelemetry-cpp/pull/1618)
+* [SDK] resource sdk: Update Resource::Merge function docs [#1615](https://github.com/open-telemetry/opentelemetry-cpp/pull/1615)
+* [BUILD] Fix build warnings [#1613](https://github.com/open-telemetry/opentelemetry-cpp/pull/1613)
+* [API BUILD] Fix header only api singletons (#1520) [#1604](https://github.com/open-telemetry/opentelemetry-cpp/pull/1604)
+* [METRICS SDK] Fix default value of
+  `OtlpHttpMetricExporterOptions::aggregation_temporality`.
+  [#1601](https://github.com/open-telemetry/opentelemetry-cpp/pull/1601)
+* [METRICS EXAMPLE] Example for OTLP gRPC exporter for Metrics. [#1598](https://github.com/open-telemetry/opentelemetry-cpp/pull/1598)
+* [SDK] Fix `LoggerContext::Shutdown` and tsan of `OtlpHttpClient` [#1592](https://github.com/open-telemetry/opentelemetry-cpp/pull/1592)
+* [METRICS SDK] Fix 1585 - Multiple cumulative metric collections without
+  measurement recording.
+  [#1586](https://github.com/open-telemetry/opentelemetry-cpp/pull/1586)
+* [BUILD] metrics warnings [#1583](https://github.com/open-telemetry/opentelemetry-cpp/pull/1583)
+* [METRICS SDK] Fix ObservableInstrument::RemoveCallback [#1582](https://github.com/open-telemetry/opentelemetry-cpp/pull/1582)
+* [SDK] Add error log when getting a http error code [#1581](https://github.com/open-telemetry/opentelemetry-cpp/pull/1581)
+* [EXPORTER] ETW Exporter - Add support for Sampler and ID Generator [#1547](https://github.com/open-telemetry/opentelemetry-cpp/pull/1547)
+
+Notes:
+
+While [OpenTelemetry semantic
+convention](https://github.com/open-telemetry/opentelemetry-specification/tree/main/semantic_conventions)
+is still in experimental state, PR
+[#1624](https://github.com/open-telemetry/opentelemetry-cpp/pull/1624) upgraded
+it from 1.12.0 to 1.13.0 which **MAY** break the instrumentation library. Please
+update the semantic convention in instrumentation library is needed.
+
+## [1.6.0] 2022-08-15
+
+* [METRICS SDK] Calling Observable Instruments callback during metrics
+  collection
+  [#1554](https://github.com/open-telemetry/opentelemetry-cpp/pull/1554)
+* [METRICS CI] Add CI jobs for new and deprecated metrics [#1531](https://github.com/open-telemetry/opentelemetry-cpp/pull/1531)
+* [METRICS BUILD] Fix metrics asan and tsan CI [#1562](https://github.com/open-telemetry/opentelemetry-cpp/pull/1562)
+* [METRICS SDK] remove throw check from metrics  with noexcept [#1560](https://github.com/open-telemetry/opentelemetry-cpp/pull/1560)
+* [METRICS SDK] fix metrics race condition [#1552](https://github.com/open-telemetry/opentelemetry-cpp/pull/1552)
+* [METRICS SDK] Fix metrics context circular reference [#1535](https://github.com/open-telemetry/opentelemetry-cpp/pull/1535)
+* [METRICS EXPORTER] Improve scope/instrument names in metrics ostream exporter [#1544](https://github.com/open-telemetry/opentelemetry-cpp/pull/1544)
+* [METRICS BUILD] fix IWYU error in instruments.h [#1555](https://github.com/open-telemetry/opentelemetry-cpp/pull/1555)
+* [EXPORTER] Prometheus exporter support Gauge Type [#1553](https://github.com/open-telemetry/opentelemetry-cpp/pull/1553)
+* [METRICS SDK] Fix default Metric view name [#1515](https://github.com/open-telemetry/opentelemetry-cpp/pull/1515)
+* [SDK] Fix infinitely waiting when shutdown with more than one running http
+  sessions.
+  [#1549](https://github.com/open-telemetry/opentelemetry-cpp/pull/1549)
+* [METRICS SDK] Fix OTLP gRPC Metrics env variables [#1543](https://github.com/open-telemetry/opentelemetry-cpp/pull/1543)
+* [METRICS SDK] Metric aggregation temporality controls  [#1541](https://github.com/open-telemetry/opentelemetry-cpp/pull/1541)
+* [METRICS SDK] Histogram min/max support [#1540](https://github.com/open-telemetry/opentelemetry-cpp/pull/1540)
+* [METRICS EXPORTER] ostream exporter should print out resource attributes [#1523](https://github.com/open-telemetry/opentelemetry-cpp/pull/1523)
+* [METRICS SDK] Support multiple async callbacks [#1495](https://github.com/open-telemetry/opentelemetry-cpp/pull/1495)
+* [BUILD] Fix code scanning alert [#1530](https://github.com/open-telemetry/opentelemetry-cpp/pull/1530)
+* [BUILD] Fix several compiling/linking errors [#1539](https://github.com/open-telemetry/opentelemetry-cpp/pull/1539)
+* [TRACE SDK] Add SpanData getter for Span Recordable [#1508](https://github.com/open-telemetry/opentelemetry-cpp/pull/1508)
+* [LOG SDK] Fix log sdk builder (#1486) [#1524](https://github.com/open-telemetry/opentelemetry-cpp/pull/1524)
+* [METRICS SDK] Add configuration options for Aggregation creation [#1513](https://github.com/open-telemetry/opentelemetry-cpp/pull/1513)
+* [METRICS TEST] Fix metrics unit test memory leack [#1533](https://github.com/open-telemetry/opentelemetry-cpp/pull/1533)
+* [LOG SDK] Add log sdk builders (#1486) [#1524](https://github.com/open-telemetry/opentelemetry-cpp/pull/1524)
+
+## [1.5.0] 2022-07-29
+
+* [EXPORTER BUILD] Add resources to dep list of prometheus exporter test [#1527](https://github.com/open-telemetry/opentelemetry-cpp/pull/1527)
+* [BUILD] Don't require applications using jaeger exporter to know about libcurl
+  [#1518](https://github.com/open-telemetry/opentelemetry-cpp/pull/1518)
+* [EXPORTER] Inline print_value() in ostream exporter [#1512](https://github.com/open-telemetry/opentelemetry-cpp/pull/1512)
+* [SDK] fix: urlPaser will incorrect parsing url like `http://abc.com/xxx@xxx/a/b`
+  [#1511](https://github.com/open-telemetry/opentelemetry-cpp/pull/1511)
+* [SDK] Rename `InstrumentationLibrary` to `InstrumentationScope` [#1507](https://github.com/open-telemetry/opentelemetry-cpp/pull/1507)
+* [BUILD] Try to build nlohmann-json only it's depended. [#1505](https://github.com/open-telemetry/opentelemetry-cpp/pull/1505)
+* [EXPORTER BUILD] Link opentelemetry_api to ETW exporter test [#1503](https://github.com/open-telemetry/opentelemetry-cpp/pull/1503)
+* [SDK] Add automatically semantic conventions from the spec (#873) [#1497](https://github.com/open-telemetry/opentelemetry-cpp/pull/1497)
+* [SDK] Use template class for in-memory data. [#1496](https://github.com/open-telemetry/opentelemetry-cpp/pull/1496)
+* [SDK] fix compiler warnings [#1499](https://github.com/open-telemetry/opentelemetry-cpp/pull/1499)
+* [TRACE SDK] Add trace sdk builders (#1393) [#1471](https://github.com/open-telemetry/opentelemetry-cpp/pull/1471)
+* [METRICS BUILD] Enable bazel build for metrics proto files [#1489](https://github.com/open-telemetry/opentelemetry-cpp/pull/1489)
+* [METRICS EXPORTER] Add metrics OTLP/HTTP exporter [#1487](https://github.com/open-telemetry/opentelemetry-cpp/pull/1487)
+* [EXPORTER] fix otlp grpc exporter naming [#1488](https://github.com/open-telemetry/opentelemetry-cpp/pull/1488)
+* [BUILD] Remove `--config Debug` when installing. [#1480](https://github.com/open-telemetry/opentelemetry-cpp/pull/1480)
+* [EXPORTER] Fix endpoint in otlp grpc exporter [#1474](https://github.com/open-telemetry/opentelemetry-cpp/pull/1474)
+* [EXAMPLE] Fix memory ownership of InMemorySpanExporter (#1473) [#1471](https://github.com/open-telemetry/opentelemetry-cpp/pull/1471)
+* [EXPORTER TESTS] Prometheus unit test [#1461](https://github.com/open-telemetry/opentelemetry-cpp/pull/1461)
+* [DOCS] Update docs to use relative code links. [#1447](https://github.com/open-telemetry/opentelemetry-cpp/pull/1447)
+* [SDK] Remove reference to deprecated InstrumentationLibrary in OTLP [#1469](https://github.com/open-telemetry/opentelemetry-cpp/pull/1469)
+* [SDK] Fix trace kIsSampled flag set incorrectly [#1465](https://github.com/open-telemetry/opentelemetry-cpp/pull/1465)
+* [METRICS EXPORTER] OTLP gRPC Metrics Exporter [#1454](https://github.com/open-telemetry/opentelemetry-cpp/pull/1454)
+* [EXPORTER] fix prometheus exporter failure type [#1460](https://github.com/open-telemetry/opentelemetry-cpp/pull/1460)
+* [SDK] Fix build warnings about missing aggregates. [#1368](https://github.com/open-telemetry/opentelemetry-cpp/pull/1368)
+* [EXT] `curl::HttpClient` use `curl_multi_handle` instead of creating a thread
+  for every request and it's able to reuse connections now. ([#1317](https://github.com/open-telemetry/opentelemetry-cpp/pull/1317))
+* [SEMANTIC CONVENTIONS] Upgrade to version 1.12.0 [#873](https://github.com/open-telemetry/opentelemetry-cpp/pull/873)
+
+## [1.4.1] 2022-06-19
+
+* [METRICS SDK] Fix variables inizialization [#1430](https://github.com/open-telemetry/opentelemetry-cpp/pull/1430)
+* [DOCS] Fixed broken link to OpenTelemetry.io (#1445) [#1446](https://github.com/open-telemetry/opentelemetry-cpp/pull/1446)
+* [BUILD] Upgrade nlohmann_json to 3.10.5 (#1438) [#1441](https://github.com/open-telemetry/opentelemetry-cpp/pull/1441)
+* [METRICS SDK] fix histogram [#1440](https://github.com/open-telemetry/opentelemetry-cpp/pull/1440)
+* [DOCS] Fix GettingStarted documentation for Jaeger HTTP exporter (#1347) [#1439](https://github.com/open-telemetry/opentelemetry-cpp/pull/1439)
+* [BUILD] install sdk-config.h [#1419](https://github.com/open-telemetry/opentelemetry-cpp/pull/1419)
+* [EXAMPLE] Log current timestamp instead of epoch time [#1434](https://github.com/open-telemetry/opentelemetry-cpp/pull/1434)
+* [METRICS SDK] Add attributes/dimensions to metrics ostream exporter [#1400](https://github.com/open-telemetry/opentelemetry-cpp/pull/1400)
+* [SDK] Fix global log handle symbols when using dlopen [#1420](https://github.com/open-telemetry/opentelemetry-cpp/pull/1420)
+* [METRICS] Only record non-negative / finite / Non-NAN histogram values([#1427](https://github.com/open-telemetry/opentelemetry-cpp/pull/1427))
+* [ETW EXPORTER] Fix ETW log exporter header inclusion [#1426](https://github.com/open-telemetry/opentelemetry-cpp/pull/1426)
+* [ETW EXPORTER] Copy string_view passed to ETW exporter in PropertyVariant [#1425](https://github.com/open-telemetry/opentelemetry-cpp/pull/1425)
+* [METRICS API/SDK] Pass state to async callback function. [#1408](https://github.com/open-telemetry/opentelemetry-cpp/pull/1408)
+* [BUILD] fix nlohmann_json's (third party) include dir [#1415](https://github.com/open-telemetry/opentelemetry-cpp/pull/1415)
+* [SDK] fix: WaitOnSocket select error when sockfd above FD_SETSIZE [#1410](https://github.com/open-telemetry/opentelemetry-cpp/pull/1410)
+* [SDK] fix OTEL_INTERNAL_LOG_INFO [#1407](https://github.com/open-telemetry/opentelemetry-cpp/pull/1407)
+* [DOCS] Document Getting Started with Prometheus and Grafana [#1396](https://github.com/open-telemetry/opentelemetry-cpp/pull/1396)
+
+## [1.4.0] 2022-05-17
+
+* [API SDK] Upgrade proto to v0.17.0, update log data model ([#1383](https://github.com/open-telemetry/opentelemetry-cpp/pull/1383))
+* [BUILD] Alpine image ([#1382](https://github.com/open-telemetry/opentelemetry-cpp/pull/1382))
+* [LOGS SDK] Get span_id from context when Logger::Log received invalid span_id
+  ([#1398](https://github.com/open-telemetry/opentelemetry-cpp/pull/1398))
+* [METRICS SDK] Connect async storage with async instruments ([#1388](https://github.com/open-telemetry/opentelemetry-cpp/pull/1388))
+* [DOCS] Getting started document using ostream exporter ([#1394](https://github.com/open-telemetry/opentelemetry-cpp/pull/1394))
+* [BUILD] Fix missing link to nlohmann_json ([#1390](https://github.com/open-telemetry/opentelemetry-cpp/pull/1390))
+* [SDK] Fix sharing resource in batched exported spans ([#1386](https://github.com/open-telemetry/opentelemetry-cpp/pull/1386))
+* [PROTOCOL \& LOGS] Upgrade proto to v0.17.0, update log data model ([#1383](https://github.com/open-telemetry/opentelemetry-cpp/pull/1383))
+* [METRICS SDK] Remove un-necessary files. ([#1379](https://github.com/open-telemetry/opentelemetry-cpp/pull/1379))
+* [EXPORTER] Prometheus exporter meters and instrument name ([#1378](https://github.com/open-telemetry/opentelemetry-cpp/pull/1378))
+* [API] Add noexcept/const qualifier at missing places for Trace API. ([#1374](https://github.com/open-telemetry/opentelemetry-cpp/pull/1374))
+* [SDK] Fix empty tracestate header propagation ([#1373](https://github.com/open-telemetry/opentelemetry-cpp/pull/1373))
+* [METRICS SDK] Reuse temporal metric storage for sync storage ([#1369](https://github.com/open-telemetry/opentelemetry-cpp/pull/1369))
+* [SDK] Fix baggage propagation for empty/invalid baggage context ([#1367](https://github.com/open-telemetry/opentelemetry-cpp/pull/1367))
+* [BUILD] Export opentelemetry_otlp_recordable ([#1365](https://github.com/open-telemetry/opentelemetry-cpp/pull/1365))
+* [TESTS] Disable test on prometheus-cpp which not need ([#1363](https://github.com/open-telemetry/opentelemetry-cpp/pull/1363))
+* [METRICS] Fix class member initialization order ([#1360](https://github.com/open-telemetry/opentelemetry-cpp/pull/1360))
+* [METRICS SDK] Simplify SDK Configuration: Use View with default aggregation if
+  no matching View is configured
+  ([#1358](https://github.com/open-telemetry/opentelemetry-cpp/pull/1358))
+* [BUILD] Add missing include guard ([#1357](https://github.com/open-telemetry/opentelemetry-cpp/pull/1357))
+* [ETW EXPORTER] Fix scalar delete against array ([#1356](https://github.com/open-telemetry/opentelemetry-cpp/pull/1356))
+* [ETW EXPORTER] Conditional include for codecvt header ([#1355](https://github.com/open-telemetry/opentelemetry-cpp/pull/1355))
+* [BUILD] Use latest TraceLoggingDynamic.h ([#1354](https://github.com/open-telemetry/opentelemetry-cpp/pull/1354))
+* [SDK] Add explicit type cast in baggage UrlDecode ([#1353](https://github.com/open-telemetry/opentelemetry-cpp/pull/1353))
+* [METRICS SDK] Remove exporter registration to meter provider ([#1350](https://github.com/open-telemetry/opentelemetry-cpp/pull/1350))
+* [METRICS SDK] Fix output time in metrics OStream exporter ([#1346](https://github.com/open-telemetry/opentelemetry-cpp/pull/1346))
+* [BUILD] ostream metrics cmake ([#1344](https://github.com/open-telemetry/opentelemetry-cpp/pull/1344))
+* [BUILD] Link `opentelemetry_ext` with `opentelemetry_api` ([#1336](https://github.com/open-telemetry/opentelemetry-cpp/pull/1336))
+* [METRICS SDK] Enable metric collection for Async Instruments - Delta and
+  Cumulative
+  ([#1334](https://github.com/open-telemetry/opentelemetry-cpp/pull/1334))
+* [BUILD] Dependencies image as artifact ([#1333](https://github.com/open-telemetry/opentelemetry-cpp/pull/1333))
+* [EXAMPLE] Prometheus example ([#1332](https://github.com/open-telemetry/opentelemetry-cpp/pull/1332))
+* [METRICS EXPORTER] Prometheus exporter ([#1331](https://github.com/open-telemetry/opentelemetry-cpp/pull/1331))
+* [METRICS] Metrics histogram example ([#1330](https://github.com/open-telemetry/opentelemetry-cpp/pull/1330))
+* [TESTS] Replace deprecated googletest API ([#1327](https://github.com/open-telemetry/opentelemetry-cpp/pull/1327))
+* [BUILD] Fix Ninja path ([#1326](https://github.com/open-telemetry/opentelemetry-cpp/pull/1326))
+* [API] Update yield logic for ARM processor ([#1325](https://github.com/open-telemetry/opentelemetry-cpp/pull/1325))
+* [BUILD] Fix metrics compiler warnings ([#1328](https://github.com/open-telemetry/opentelemetry-cpp/pull/1328))
+* [METRICS SDK] Implement Merge and Diff operation for Histogram Aggregation ([#1303](https://github.com/open-telemetry/opentelemetry-cpp/pull/1303))
+
+Notes:
+
+While opentelemetry-cpp Logs are still in experimental stage,
+[#1383](https://github.com/open-telemetry/opentelemetry-cpp/pull/1383) updated
+opentelemetry-proto to 0.17.0, which includes some breaking change in the
+protocol, like
+[this](https://github.com/open-telemetry/opentelemetry-proto/pull/373). This
+makes `name` parameter for our log API unnecessary. However, this parameter is
+marked deprecated instead of being removed in this release, and it will be
+removed in future release.
+
+## [1.3.0] 2022-04-11
+
+* [ETW EXPORTER] ETW provider handle cleanup ([#1322](https://github.com/open-telemetry/opentelemetry-cpp/pull/1322))
+* [BUILD] Move public definitions into `opentelemetry_api`. ([#1314](https://github.com/open-telemetry/opentelemetry-cpp/pull/1314))
+* [METRICS] OStream example ([#1312](https://github.com/open-telemetry/opentelemetry-cpp/pull/1312))
+* [BUILD] Rename `http_client_curl` to `opentelemetry_http_client_curl` ([#1301](https://github.com/open-telemetry/opentelemetry-cpp/pull/1301))
+* [METRICS SDK] Add InstrumentationInfo and Resource to the metrics data to be
+  exported.
+  ([#1299](https://github.com/open-telemetry/opentelemetry-cpp/pull/1299))
+* [TESTS] Add building test without RTTI ([#1294](https://github.com/open-telemetry/opentelemetry-cpp/pull/1294))
+* [METRICS SDK] Implement periodic exporting metric reader ([#1286](https://github.com/open-telemetry/opentelemetry-cpp/pull/1286))
+* [SDK] Bugfix: span SetAttribute crash ([#1283](https://github.com/open-telemetry/opentelemetry-cpp/pull/1283))
+* [BUG] Remove implicitly deleted default constructor ([#1267](https://github.com/open-telemetry/opentelemetry-cpp/pull/1267))
+* [METRICS SDK] Synchronous Metric collection (Delta , Cumulative) ([#1265](https://github.com/open-telemetry/opentelemetry-cpp/pull/1265))
+* [METRICS SDK] Metrics exemplar round 1 ([#1264](https://github.com/open-telemetry/opentelemetry-cpp/pull/1264))
+* [EXPORTER] Fix: use CURLOPT_TIMEOUT_MS to config OtlpHttpExporter's timeout
+  instead of CURLOPT_TIMEOUT
+  ([#1261](https://github.com/open-telemetry/opentelemetry-cpp/pull/1261))
+* [EXPORTER] Jaeger Exporter - Populate Span Links ([#1251](https://github.com/open-telemetry/opentelemetry-cpp/pull/1251))
+* [SDK] Reorder the destructor of members in LoggerProvider and TracerProvider ([#1245](https://github.com/open-telemetry/opentelemetry-cpp/pull/1245))
+* [METRICS SDK] Enable metric collection from MetricReader ([#1241](https://github.com/open-telemetry/opentelemetry-cpp/pull/1241))
+* [METRICS SDK] Asynchronous Aggregation storage ([#1232](https://github.com/open-telemetry/opentelemetry-cpp/pull/1232))
+* [METRICS SDK] Synchronous Instruments - Aggregation Storage(s) creation for
+  configured views
+  ([#1219](https://github.com/open-telemetry/opentelemetry-cpp/pull/1219))
+* [BUILD] Added s390x arch into CMake build. ([#1216](https://github.com/open-telemetry/opentelemetry-cpp/pull/1216))
+* [API] Allow extension of the lifetime of ContextStorage. ([#1214](https://github.com/open-telemetry/opentelemetry-cpp/pull/1214))
+* [METRICS SDK] Add Aggregation storage ([#1213](https://github.com/open-telemetry/opentelemetry-cpp/pull/1213))
+* [TESTS] Fix ostream_log_test Mac ([#1208](https://github.com/open-telemetry/opentelemetry-cpp/pull/1208))
+* [BUILD] Update grpc to v1.43.2 to support VS2022/MSVC 19.30 and bazel 5.0 ([#1207](https://github.com/open-telemetry/opentelemetry-cpp/pull/1207))
+* [DOCS] Benchmark documentation ([#1205](https://github.com/open-telemetry/opentelemetry-cpp/pull/1205))
+* [DOCS] Fix errors in SDK documentation ([#1201](https://github.com/open-telemetry/opentelemetry-cpp/pull/1201))
+* [METRICS EXPORTER] Ostream metric exporter ([#1196](https://github.com/open-telemetry/opentelemetry-cpp/pull/1196))
+* [Metrics SDK] Filtering metrics attributes ([#1191](https://github.com/open-telemetry/opentelemetry-cpp/pull/1191))
+* [Metrics SDK] Sync and Async Instruments SDK ([#1184](https://github.com/open-telemetry/opentelemetry-cpp/pull/1184))
+* [Metrics SDK] Add Aggregation as part of metrics SDK. ([#1178](https://github.com/open-telemetry/opentelemetry-cpp/pull/1178))
+* [BUILD] Cmake: thrift requires boost headers, include them as
+  Boost_INCLUDE_DIRS
+  ([#1100](https://github.com/open-telemetry/opentelemetry-cpp/pull/1100))
+
+Notes:
+
+[#1301](https://github.com/open-telemetry/opentelemetry-cpp/pull/1301) added
+`opentelemetry_` as prefix to http_client_curl library for resolving potential
+naming conflict, this could break existing cmake build if http_client_curl is
+listed as explicit dependency in user's cmake file.
+
+## [1.2.0] 2022-01-31
+
+* [CI] Continuous benchmark tests as part of the CI ([#1174](https://github.com/open-telemetry/opentelemetry-cpp/pull/1174))
+* [API] Allow to use external abseil for bazel targets ([#1172](https://github.com/open-telemetry/opentelemetry-cpp/pull/1172))
+* [EXPORTER] Importing gsl::span if std::span is not available ([#1167](https://github.com/open-telemetry/opentelemetry-cpp/pull/1167))
+* [EXPORTER] Synchronized calls to Exporter::Export & Shutdown ([#1164](https://github.com/open-telemetry/opentelemetry-cpp/pull/1164))
+* [EXPORTER] OTLP http exporter block thread  ([#1163](https://github.com/open-telemetry/opentelemetry-cpp/pull/1163))
+* [TESTS] Jaeger: ThriftSender unit test ([#1162](https://github.com/open-telemetry/opentelemetry-cpp/pull/1162))
+* [EXPORTER] InMemorySpanExporter shutdown fix ([#1161](https://github.com/open-telemetry/opentelemetry-cpp/pull/1161))
+* [EXPORTER] Fix leak in Jaeger exporter ([#1160](https://github.com/open-telemetry/opentelemetry-cpp/pull/1160))
+* [TESTS] ZipkinExporter unit-tests ([#1155](https://github.com/open-telemetry/opentelemetry-cpp/pull/1155))
+* [SDK] Logger: propagating resources through LoggerProvider ([#1154](https://github.com/open-telemetry/opentelemetry-cpp/pull/1154))
+* [SDK] Logger: support for instrumentation library ([#1149](https://github.com/open-telemetry/opentelemetry-cpp/pull/1149))
+* [SDK] Add log level for internal log of sdk ([#1147](https://github.com/open-telemetry/opentelemetry-cpp/pull/1147))
+* [METRICS] Metrics SDK: View API ([#1110](https://github.com/open-telemetry/opentelemetry-cpp/pull/1110))
+
+Notes on experimental features:
+
+[#1149](https://github.com/open-telemetry/opentelemetry-cpp/pull/1149) and
+[#1154](https://github.com/open-telemetry/opentelemetry-cpp/pull/1154) from
+above CHANGELOG introduced API changes which are not backward compatible with
+previous logs, please update API package to this release if
+`ENABLE_LOGS_PREVIEW` is turned on (it is turned off by default).
+
+## [1.1.1] 2021-12-20
+
+* [SDK] Rename OTEL_CPP_GET_ATTR macro, and define it using fully qualified attr
+  function
+  ([#1140](https://github.com/open-telemetry/opentelemetry-cpp/pull/1140))
+* [SDK] Default resource attributes and attributes in OTEL_RESOURCE_ATTRIBUTES
+  are missing when using Otlp*LogExporter
+  ([#1082](https://github.com/open-telemetry/opentelemetry-cpp/pull/1082))
+* [METRICS] Add Meter and MeterProvider in the SDK
+  ([#1078](https://github.com/open-telemetry/opentelemetry-cpp/pull/1078))
+* [EXPORTER] ZipkinExporter shutdown
+  ([#1153](https://github.com/open-telemetry/opentelemetry-cpp/pull/1153))
+* [EXPORTER] Jaeger exporter shutdown
+  ([#1150](https://github.com/open-telemetry/opentelemetry-cpp/pull/1150))
+* [EXPORTER] Bugfix: `jaeger::TUDPTransport::write` crash when `getaddrinfo`
+  returns error
+  ([#1116](https://github.com/open-telemetry/opentelemetry-cpp/pull/1116))
+* [EXPORTER] Bugfix: Jaeger exporter: extend supported attributes types
+  ([#1106](https://github.com/open-telemetry/opentelemetry-cpp/pull/1106))
+* [EXPORTER] Fix otlp generates null span ids
+  ([#1113](https://github.com/open-telemetry/opentelemetry-cpp/pull/1113))
+* [EXPORTER] Jaeger bazel (Linux only)
+  ([#1077](https://github.com/open-telemetry/opentelemetry-cpp/pull/1077))
+* [DOCS] Add note on DLL support
+  ([#1137](https://github.com/open-telemetry/opentelemetry-cpp/pull/1137))
+* [DOCS] Improve the instructions for Bazel build
+  ([#1136](https://github.com/open-telemetry/opentelemetry-cpp/pull/1136))
+* [DOCS] Document dependencies
+  ([#1119](https://github.com/open-telemetry/opentelemetry-cpp/pull/1119))
+* [DOCS] Dockerfile for quick demo/troubleshooting purpose
+  ([#905](https://github.com/open-telemetry/opentelemetry-cpp/pull/905))
+* [TESTS] Fix data race in BM_ThreadYieldSpinLockThrashing
+  ([#1099](https://github.com/open-telemetry/opentelemetry-cpp/pull/1099))
+* [EXAMPLE] Otlp gRPC log example
+  ([#1083](https://github.com/open-telemetry/opentelemetry-cpp/pull/1083))
+* [BUILD] C++20 not Building with VS2019
+  ([#1144](https://github.com/open-telemetry/opentelemetry-cpp/pull/1144))
+* [BUILD] Mark tags to bazel
+  targets([#1075](https://github.com/open-telemetry/opentelemetry-cpp/pull/1075))
+
+## [1.1.0] 2021-11-19
+
+* [BUILD] build release tarball when nlohmann-json not installed
+  ([#1074](https://github.com/open-telemetry/opentelemetry-cpp/pull/1074))
+* [SDK] Bugfix: regex is neither working on GCC 4.9.x
+  ([#1069](https://github.com/open-telemetry/opentelemetry-cpp/pull/1069))
+* [SDK] Improvement: span_id should not break strict aliasing.
+  ([#1068](https://github.com/open-telemetry/opentelemetry-cpp/pull/1068))
+* [EXAMPLE] OTLP HTTP log example
+  ([#1062](https://github.com/open-telemetry/opentelemetry-cpp/pull/1062))
+* [SDK] OTLP gRPC log export should fail after shutdown
+  ([#1064](https://github.com/open-telemetry/opentelemetry-cpp/pull/1064))
+* [BUILD] Building otlp exporter from the release tarball
+  ([#1056](https://github.com/open-telemetry/opentelemetry-cpp/pull/1056))
+* [METRICS] Move old metrics implementation to different directory, and rename
+  targets to \_deprecated
+  ([#1053](https://github.com/open-telemetry/opentelemetry-cpp/pull/1053))
+* [EXPORTER] Add OTLP/gRPC Log Exporter
+  ([#1048](https://github.com/open-telemetry/opentelemetry-cpp/pull/1048))
+* [EXPORTER] Prometheus Exporter
+  ([#1031](https://github.com/open-telemetry/opentelemetry-cpp/pull/1031))
+* [EXPORTER] Add OTLP/HTTP Log Exporter
+  ([#1030](https://github.com/open-telemetry/opentelemetry-cpp/pull/1030))
+* [SDK] fix: issue 368- consistent namespace scope resolution
+  ([#1008](https://github.com/open-telemetry/opentelemetry-cpp/pull/1008))
+
+## [1.0.1] 2021-10-21
+
+* [EXPORTER] Exports span attributes to ETW
+  ([#1021](https://github.com/open-telemetry/opentelemetry-cpp/pull/1021))
+* [BUILD] cmake: add FindThrift.cmake find module method for thrift
+  ([#1020](https://github.com/open-telemetry/opentelemetry-cpp/pull/1020))
+* [BUILD] Fix nlohmann_json package dependency
+  ([#1017](https://github.com/open-telemetry/opentelemetry-cpp/pull/1017))
+* [EXPORTER] Change OTLP/HTTP default port from 4317 to 4318
+  ([#1018](https://github.com/open-telemetry/opentelemetry-cpp/pull/1018))
+* [EXPORTER] ETW Log Exporter
+  ([#1006](https://github.com/open-telemetry/opentelemetry-cpp/pull/1006))
+* [API] Adding new Logger:log() method
+  ([#1005](https://github.com/open-telemetry/opentelemetry-cpp/pull/1005))
+* [EXPORTER] Remove scheme from OTLP endpoint before passing to gRPC
+  ([#988](https://github.com/open-telemetry/opentelemetry-cpp/pull/988))
+* [BUILD] Update opentelemetry-proto for bazel build to 0.9.0
+  ([#984](https://github.com/open-telemetry/opentelemetry-cpp/pull/984))
+* [BUILD] Cross compling grpc_cpp_plugin not found bug
+  ([#982](https://github.com/open-telemetry/opentelemetry-cpp/pull/982))
+* [EXPORTER] Support environment variables for both `OtlpGrpcExporter` and
+  `OtlpHttpExporter`
+  ([#983](https://github.com/open-telemetry/opentelemetry-cpp/pull/983))
+* [API/SDK] Add schema_url support to both Resource and InstrumentationLibrary
+  ([#979](https://github.com/open-telemetry/opentelemetry-cpp/pull/979))
+* [BUILD] Fix build issue where _memcpy_ was not declared in scope
+  ([#985](https://github.com/open-telemetry/opentelemetry-cpp/issues/985))
+
+## [1.0.0] 2021-09-16
+
+### API
+
+* Document DefaultSpan, remove DefaultTracer
+  ([#959](https://github.com/open-telemetry/opentelemetry-cpp/pull/959))
+* Separate baggage<->Context api from Baggage Propagator
+  ([#963](https://github.com/open-telemetry/opentelemetry-cpp/pull/963))
+* Remove unused public API to_span_ptr
+  ([#964](https://github.com/open-telemetry/opentelemetry-cpp/pull/964))
+* :collision: Make span context management public
+  ([#967](https://github.com/open-telemetry/opentelemetry-cpp/pull/967))
+* Support determining parent span from Context while creating new Span
+  ([#969](https://github.com/open-telemetry/opentelemetry-cpp/pull/969))
+* :collision: Traces: Add note on experimental semantic convention
+  implementation, prefix semantics headers with experimental tag
+  ([#970](https://github.com/open-telemetry/opentelemetry-cpp/pull/970))
+* Increment OPENTELEMETRY_ABI_VERSION_NO to 1
+  ([#980](https://github.com/open-telemetry/opentelemetry-cpp/pull/980))
+
+### SDK
+
+* Clean up `GetEnvironmentVariable` and remove unused variable under `NO_GETENV`
+  ([#976](https://github.com/open-telemetry/opentelemetry-cpp/pull/976))
+* :collision: Resources: Add note on experimental semantic convention
+  implementation, prefix semantics headers with experimental tag
+  ([#970](https://github.com/open-telemetry/opentelemetry-cpp/pull/970))
+
+### OTLP Exporter
+
+* :bug: Ignore status description if status code is not Error
+  ([#962](https://github.com/open-telemetry/opentelemetry-cpp/pull/962))
+* :collision: Make Otlp exporter configuration environment variables
+  specs-compliant
+  ([#974](https://github.com/open-telemetry/opentelemetry-cpp/pull/974))
+
+### Zipkin Exporter
+
+* :bug: Don't set parentId in case parentId is empty
+  ([#943](https://github.com/open-telemetry/opentelemetry-cpp/pull/943))
+* :rocket: Extend zipkin exporter with ability to provide headers
+  ([#951](https://github.com/open-telemetry/opentelemetry-cpp/pull/951))
+
+### DOCS
+
+* :book: Add getting-started documentation for SDK:
+  ([#942](https://github.com/open-telemetry/opentelemetry-cpp/pull/942))
+* :book: Remove unnecessary spaces and spelling of gRPC in README
+  ([#965](https://github.com/open-telemetry/opentelemetry-cpp/pull/965))
+
+### BUILD
+
+* Disable bazel build for gcc 4.8, upgrade versions for grpc(v1.39.1) and
+  bazel(4.2.0), document bazel support
+  ([#953](https://github.com/open-telemetry/opentelemetry-cpp/pull/953))
+* Move CMake config template to cmake folder
+  ([#958](https://github.com/open-telemetry/opentelemetry-cpp/pull/958))
+* Enable CMake to search the new package variable `<PackageName>_ROOT`
+  ([#975](https://github.com/open-telemetry/opentelemetry-cpp/pull/975))
+* :bug: Do not override CMAKE_CXX_STANDARD
+  ([#977](https://github.com/open-telemetry/opentelemetry-cpp/pull/977))
+
+### :construction: Experiemental Features (Will change in future)
+
+* Semantic Conventions for traces - As the specs is still experimental, the
+  implementation will change in future.
+* Semantic Convention for resource - As the specs is still experimental, the
+  implementation will change in future.
+* Logs and Metrics API & SDK - These are not compliant, and are behind feature
+  flag. Not recommended to use for now.
+
+## [1.0.0-rc4] 2021-08-04
+
+* [EXPORTER] `BREAKING CHANGE` Fix default HTTP port for OTLP HTTP Exporter
+  ([#939](https://github.com/open-telemetry/opentelemetry-cpp/pull/939))
+* [API] Fix timeout calculation for Tracer::Flush() and Tracer::Close()
+  ([#937](https://github.com/open-telemetry/opentelemetry-cpp/pull/937))
+* [API] Fix for Stack::Resize that new_capacity is not assigned to capacity_
+  ([#934](https://github.com/open-telemetry/opentelemetry-cpp/pull/934))
+* [SDK] Fix race condition in circular buffer simulation test
+  ([#931](https://github.com/open-telemetry/opentelemetry-cpp/pull/931))
+* [EXPORTER] Fix error logging in Jaeger Exporter
+  ([#930](https://github.com/open-telemetry/opentelemetry-cpp/pull/930))
+* [BUILD] Use latest grpc version (v1.39.0) for cmake build of otlp exporter
+  ([#927](https://github.com/open-telemetry/opentelemetry-cpp/pull/927))
+* [EXPORTER] Add Jaeger Thrift HTTP exporter
+  ([#926](https://github.com/open-telemetry/opentelemetry-cpp/pull/926))
+* [SDK] Move env-var read logic to common dir, and optional reading of env-var
+  ([#924](https://github.com/open-telemetry/opentelemetry-cpp/pull/924))
+* [EXPORTER] Remove recordable header from CMake install rules for exporters
+  ([#923](https://github.com/open-telemetry/opentelemetry-cpp/pull/923))
+* [EXPORTER] `BREAKING CHANGE` Rename Recordable to JaegerRecordable in Jaeger
+  exporter
+  ([#919](https://github.com/open-telemetry/opentelemetry-cpp/pull/919))
+* [EXPORTER] `BREAKING CHANGE` Rename Jaeger exporter target
+  ([#918](https://github.com/open-telemetry/opentelemetry-cpp/pull/918))
+* [EXPORTER] Add Zipkin exporter example
+  ([#917](https://github.com/open-telemetry/opentelemetry-cpp/pull/917))
+* [EXPORTER] Bazel build for Zipkin exorter
+  ([#916](https://github.com/open-telemetry/opentelemetry-cpp/pull/916))
+* [BUILD] Allow to use local GSL
+  ([#915](https://github.com/open-telemetry/opentelemetry-cpp/pull/915))
+* [DOCS] Document vcpkg toolchain configuration
+  ([#913](https://github.com/open-telemetry/opentelemetry-cpp/pull/913))
+* [SDK] Fix for resource deletion after tracer provider shutdown
+  ([#911](https://github.com/open-telemetry/opentelemetry-cpp/pull/911))
+* [BUILD] Add bazel build for grpc example
+  ([#910](https://github.com/open-telemetry/opentelemetry-cpp/pull/910))
+* [EXPORTER] Add resource and instrumentation library support for
+  OStreamSpanExporter
+  ([#906](https://github.com/open-telemetry/opentelemetry-cpp/pull/906))
+* [API] Adding semantic-convention attributes for trace
+  ([#868](https://github.com/open-telemetry/opentelemetry-cpp/pull/868))
+
+## [1.0.0-rc3] 2021-07-12
+
+* [DOCS] Add doxygen reference docs for SDK
+  ([#902](https://github.com/open-telemetry/opentelemetry-cpp/pull/902))
+* [EXPORTER] Jaeger Exporter - Populate resource attributes into process tags in
+  Jaeger ([#897](https://github.com/open-telemetry/opentelemetry-cpp/pull/897))
+* [EXPORTER] Zipkin Exporter - Report Event timestamp into microseconds
+  ([#896](https://github.com/open-telemetry/opentelemetry-cpp/pull/896))
+* [EXPORTER] Jaeger Exporter - Handle span events
+  ([#895](https://github.com/open-telemetry/opentelemetry-cpp/pull/895))
+* [DOCS] Fix API docs for Scope object
+  ([#894](https://github.com/open-telemetry/opentelemetry-cpp/pull/894))
+* [BUILD] Fix Linking error for libcurl on some macOS environments
+  ([#893](https://github.com/open-telemetry/opentelemetry-cpp/pull/893))
+* [API] Context cleanup from Runtime Storage
+  ([#885](https://github.com/open-telemetry/opentelemetry-cpp/pull/885))
+* [DOCS] Document strategy to avoid conflict between two different versions of
+  Abseil ([#883](https://github.com/open-telemetry/opentelemetry-cpp/pull/883/))
+* [EXPORTER] ETW Exporter - Document example for ETW Exporter
+  ([#882](https://github.com/open-telemetry/opentelemetry-cpp/pull/882))
+* [SDK] Create Span with Valid spanId and traceId irrespective of Sampling
+  decision
+  ([#879](https://github.com/open-telemetry/opentelemetry-cpp/pull/879))
+* [EXPORTER] Jaeger Exporter - Rename bswap macros to avoid clash on some
+  systems ([#876](https://github.com/open-telemetry/opentelemetry-cpp/pull/876))
+* [API] Add Semantics Conventions attributes for Resources
+  ([#872](https://github.com/open-telemetry/opentelemetry-cpp/pull/872))
+* [BUILD] Use nlohmann-json from submodules if not already installed
+  ([#870](https://github.com/open-telemetry/opentelemetry-cpp/pull/870))
+
+## [1.0.0-rc2] 2021-06-18
+
+* [EXPORTER] Jaeger Exporter - Support for Instrumentation Library
+  ([#864](https://github.com/open-telemetry/opentelemetry-cpp/pull/864))
+* [TESTS] Adding benchmark tests for baggage api
+  ([#861](https://github.com/open-telemetry/opentelemetry-cpp/pull/861))
+* [BUILD] Fix for GCC9/C++20 Support for using STL for modern C++ features
+  ([#860](https://github.com/open-telemetry/opentelemetry-cpp/pull/860))
+* [TESTS] Adding benchmark tests for span create api
+  ([#856](https://github.com/open-telemetry/opentelemetry-cpp/pull/856))
+* [BUILD] Fix for using Abseil library for modern C++ features
+  ([#850](https://github.com/open-telemetry/opentelemetry-cpp/pull/850))
+* [BUILD] Fix issues with win32/x86 compilation
+  ([#847](https://github.com/open-telemetry/opentelemetry-cpp/pull/847))
+* [DOCS] Document OSS dependencies and their licenses
+  ([#844](https://github.com/open-telemetry/opentelemetry-cpp/pull/844))
+* [BUILD] Various fixes to build with Visual Studio 2015
+  ([#840](https://github.com/open-telemetry/opentelemetry-cpp/pull/840))
+* [INSTRUMENTATION] HTTPClient: Change support for full URL argument
+  ([#833](https://github.com/open-telemetry/opentelemetry-cpp/pull/833))
+* [EXPORTER] Jaeger Exporter - fix endianness of Jaeger IDs for transmission
+  ([#832](https://github.com/open-telemetry/opentelemetry-cpp/pull/832))
+* [INSTRUMENTATION] fix protobuf compilation warning in gRPC example
+  ([#830](https://github.com/open-telemetry/opentelemetry-cpp/pull/830))
+* [EXPORTER] `BREAKING CHANGE` - Add OTLP/HTTP+JSON Protocol exporter; Rename
+  `OtlpExporter` to `OtlpGrpcExporter`
+  ([#810](https://github.com/open-telemetry/opentelemetry-cpp/pull/810))
+
+## [1.0.0-rc1] 2021-06-04
+
+* [BUILD] Enable Jaeger exporter build in Windows
+  ([#815](https://github.com/open-telemetry/opentelemetry-cpp/pull/815))
+* [DOCS] Versioning doc update to clarify release and versioning policy
+  ([#811](https://github.com/open-telemetry/opentelemetry-cpp/pull/811))
+* [LOGS] Move Logging implementation under feature-flag
+  ([#807](https://github.com/open-telemetry/opentelemetry-cpp/pull/807))
+* [BUILD] Filter metric headers files from `opentelemetry-api` and
+  `opentelemetry-sdk` targets if metrics feature-flag is disabled
+  ([#806](https://github.com/open-telemetry/opentelemetry-cpp/pull/806))
+* [BUILD] Fix install rule for ostream exporter, Jaeger, ETW, ElasticSearch
+  ([#805](Fix install rule for header files of ostream exporter))
+* [API/SDK] Switch from mpark::variant to absl::variant as default
+  ([#771](https://github.com/open-telemetry/opentelemetry-cpp/pull/771))
+* [API/SDK] Support `const char *` as acceptable data type for attributes and
+  resources
+  ([#771](https://github.com/open-telemetry/opentelemetry-cpp/pull/771))
+* [EXAMPLE] gRPC instrumentation example with context propagation
+  ([#729](https://github.com/open-telemetry/opentelemetry-cpp/pull/729))
+
+## [0.7.0] 2021-05-26
+
+* [METRICS] Move metrics api/sdk under preview feature flag
+  ([#745](https://github.com/open-telemetry/opentelemetry-cpp/pull/745))
+* [DOCS] Add instructions to build using Bazel
+  ([#747](https://github.com/open-telemetry/opentelemetry-cpp/pull/747))
+* [DOCS] Update copyright headers
+  ([#754](https://github.com/open-telemetry/opentelemetry-cpp/pull/754))
+* [EXPORTER] Populate resource to OTLP proto data
+  ([#758](https://github.com/open-telemetry/opentelemetry-cpp/pull/758))
+* [CI] Add CodeQL security scan CI workflow
+  ([#770](https://github.com/open-telemetry/opentelemetry-cpp/pull/770))
+* [BUILD] Enable building API only CMake Project
+  ([#778](https://github.com/open-telemetry/opentelemetry-cpp/pull/778))
+* [SDK] Fix for sampling of root span
+  ([#784](https://github.com/open-telemetry/opentelemetry-cpp/pull/784))
+* [CI] Add Jaeger exporter to CMake CI build
+  ([#786](https://github.com/open-telemetry/opentelemetry-cpp/pull/786))
+* [API] `BREAKING CHANGE` - Tracer::WithActiveSpan() to return Scope object
+  intead of unique_ptr
+  ([#788](https://github.com/open-telemetry/opentelemetry-cpp/pull/788))
+* [DOCS] Add docs for nested spans and context propagation in readthedocs
+  ([#792](https://github.com/open-telemetry/opentelemetry-cpp/pull/792))
+* [CI] Output verbose error for failed unit-test in CI
+  ([#796](https://github.com/open-telemetry/opentelemetry-cpp/pull/796))
+
+## [0.6.0] 2021-05-11
+
+* [EXPORTER] Add Jaeger exporter
+  ([#534](https://github.com/open-telemetry/opentelemetry-cpp/pull/534))
+* [SDK] Support multiple processors
+  ([#692](https://github.com/open-telemetry/opentelemetry-cpp/pull/692))
+* [SDK] Add instrumentation library and multiple tracer support
+  ([#693](https://github.com/open-telemetry/opentelemetry-cpp/pull/693))
+* [SDK] Resource integration with Exporters
+  ([#706](https://github.com/open-telemetry/opentelemetry-cpp/pull/706))
+* [EXAMPLE] Enhance existing http example with propagation
+  ([#727](https://github.com/open-telemetry/opentelemetry-cpp/pull/727))
+
+## [0.5.0] 2021-04-26
+
+* [SDK] Support custom span-id and trace-id generator
+  ([#681](https://github.com/open-telemetry/opentelemetry-cpp/pull/681))
+* [SDK] Add SpanContext (and TraceState) to Recordable
+  ([#667](https://github.com/open-telemetry/opentelemetry-cpp/pull/667))
+* [SDK] Global Propagator
+  ([#668](https://github.com/open-telemetry/opentelemetry-cpp/pull/668))
+* [SDK] Create SharedContext for updating span pipeline
+  ([#650](https://github.com/open-telemetry/opentelemetry-cpp/pull/650))
+* [API] Baggage implementation
+  ([#676](https://github.com/open-telemetry/opentelemetry-cpp/pull/676))
+* [API] Move class from opentelemetry::core namespace to opentelemetry::common
+  namespace
+  ([#686](https://github.com/open-telemetry/opentelemetry-cpp/pull/686))
+
+## [0.4.0] 2021-04-12
+
+* [EXPORTER] ETW Exporter enhancements
+  ([#519](https://github.com/open-telemetry/opentelemetry-cpp/pull/519))
+* [EXPORTER] Read Zipkin endpoint from environment variable.
+  ([#624](https://github.com/open-telemetry/opentelemetry-cpp/pull/624))
+* [EXPORTER] Split Zpages webserver hosting from Exporter
+  ([#626](https://github.com/open-telemetry/opentelemetry-cpp/pull/626))
+* [EXPORTER] ETW Exporter Usage Instructions
+  ([#628](https://github.com/open-telemetry/opentelemetry-cpp/pull/628))
+* [INSTRUMENTATION] HTTP Client/Server Instrumentation example
+  ([#632](https://github.com/open-telemetry/opentelemetry-cpp/pull/632))
+* [EXPORTER] Enable tls authentication for otlp grpc exporter ([#635](Enable tls
+  authentication for otlp grpc exporter))
+* [API] Refactoring trace_state to reuse common functionality in baggage
+  ([#638](https://github.com/open-telemetry/opentelemetry-cpp/pull/638/files))
+
+## [0.3.0] 2021-03-19
+
+* [EXPORTER] Added Zipkin Exporter.
+  ([#471](https://github.com/open-telemetry/opentelemetry-cpp/pull/471))
+* [API] Added Jaeger propagator.
+  ([#599](https://github.com/open-telemetry/opentelemetry-cpp/pull/599))
+* [PROPAGATOR] Added Composite Propagator
+  ([#597](https://github.com/open-telemetry/opentelemetry-cpp/pull/597))
+* [API] Propagate traceflag from parent
+  ([#603](https://github.com/open-telemetry/opentelemetry-cpp/pull/603))
+* [DOCS] Add sphinx support for api doc generation
+  ([595](https://github.com/open-telemetry/opentelemetry-cpp/pull/595))
+* [SDK] Add service.name if missing in Resource
+  ([#616](https://github.com/open-telemetry/opentelemetry-cpp/pull/616))
+
+## [0.2.0] 2021-03-02
+
+* [SDK] Added `ForceFlush` to `TracerProvider`.
+  ([#588](https://github.com/open-telemetry/opentelemetry-cpp/pull/588)).
+* [SDK] Added Resource API.
+  ([#502](https://github.com/open-telemetry/opentelemetry-cpp/pull/502))
+* [API] Modified TraceState support for w3c trace context as per specs.
+* [SDK] TraceState implementation as per spec
+  ([#551](https://github.com/open-telemetry/opentelemetry-cpp/pull/551))
+* [API] Added B3 Propagator.
+  ([#523](https://github.com/open-telemetry/opentelemetry-cpp/pull/523))
+* [Exporter] Added ETW Exporter.
+  ([#376](https://github.com/open-telemetry/opentelemetry-cpp/pull/376))
+* [CI] Enable cache for Bazel for faster builds.
+  ([#505](https://github.com/open-telemetry/opentelemetry-cpp/pull/505))
+
+## [0.0.1] 2020-12-16
+
+### Added
+
+* Trace API and SDK experimental
+* OTLP Exporter
+
+### Changed
+
+### Removed

+ 927 - 0
ext/opentelemetry-cpp-1.21.0/CMakeLists.txt

@@ -0,0 +1,927 @@
+# Copyright The OpenTelemetry Authors
+# SPDX-License-Identifier: Apache-2.0
+
+cmake_minimum_required(VERSION 3.14)
+
+# See https://cmake.org/cmake/help/latest/policy/CMP0074.html required by
+# certain version of zlib which CURL depends on.
+if(${CMAKE_VERSION} VERSION_GREATER_EQUAL "3.12")
+  cmake_policy(SET CMP0074 NEW)
+endif()
+
+# Allow to use normal variable for option()
+if(${CMAKE_VERSION} VERSION_GREATER_EQUAL "3.13")
+  cmake_policy(SET CMP0077 NEW)
+endif()
+
+# Prefer CMAKE_MSVC_RUNTIME_LIBRARY if possible
+if(POLICY CMP0091)
+  cmake_policy(SET CMP0091 NEW)
+endif()
+
+if(POLICY CMP0092)
+  # https://cmake.org/cmake/help/latest/policy/CMP0092.html#policy:CMP0092 Make
+  # sure the /W3 is not removed from CMAKE_CXX_FLAGS since CMake 3.15
+  cmake_policy(SET CMP0092 OLD)
+endif()
+
+# MSVC RTTI flag /GR should not be not added to CMAKE_CXX_FLAGS by default. @see
+# https://cmake.org/cmake/help/latest/policy/CMP0117.html
+if(CMAKE_VERSION VERSION_GREATER_EQUAL "3.20.0")
+  cmake_policy(SET CMP0117 NEW)
+endif()
+
+project(opentelemetry-cpp)
+
+# Mark variables as used so cmake doesn't complain about them
+mark_as_advanced(CMAKE_TOOLCHAIN_FILE)
+
+# Note: CMAKE_FIND_PACKAGE_PREFER_CONFIG requires cmake 3.15. Prefer cmake
+# CONFIG search mode to find dependencies. This is important to properly find
+# protobuf versions 3.22.0 and above due to the abseil-cpp dependency.
+set(CMAKE_FIND_PACKAGE_PREFER_CONFIG TRUE)
+
+# Don't use customized cmake modules if vcpkg is used to resolve dependence.
+if(NOT DEFINED CMAKE_TOOLCHAIN_FILE)
+  list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake/modules/")
+endif()
+
+if(EXISTS "${CMAKE_SOURCE_DIR}/third_party_release")
+  file(STRINGS "${CMAKE_SOURCE_DIR}/third_party_release" third_party_tags)
+  foreach(third_party ${third_party_tags})
+    string(REGEX REPLACE "^[ ]+" "" third_party ${third_party})
+    string(REGEX MATCH "^[^=]+" third_party_name ${third_party})
+    string(REPLACE "${third_party_name}=" "" third_party_tag ${third_party})
+    set(${third_party_name} "${third_party_tag}")
+  endforeach()
+endif()
+
+if(DEFINED ENV{ARCH})
+  # Architecture may be specified via ARCH environment variable
+  set(ARCH $ENV{ARCH})
+else()
+  # Autodetection logic that populates ARCH variable
+  if(CMAKE_SYSTEM_PROCESSOR MATCHES "amd64.*|x86_64.*|AMD64.*")
+    # Windows may report AMD64 even if target is 32-bit
+    if(CMAKE_SIZEOF_VOID_P EQUAL 8)
+      set(ARCH x64)
+    elseif(CMAKE_SIZEOF_VOID_P EQUAL 4)
+      set(ARCH x86)
+    endif()
+  elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "i686.*|i386.*|x86.*")
+    # Windows may report x86 even if target is 64-bit
+    if(CMAKE_SIZEOF_VOID_P EQUAL 8)
+      set(ARCH x64)
+    elseif(CMAKE_SIZEOF_VOID_P EQUAL 4)
+      set(ARCH x86)
+    endif()
+  elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "powerpc")
+    # AIX will report the processor as 'powerpc' even if building in 64-bit mode
+    if(CMAKE_SIZEOF_VOID_P EQUAL 8)
+      set(ARCH ppc64)
+    else()
+      set(ARCH ppc32)
+    endif()
+  elseif(CMAKE_SYSTEM_PROCESSOR MATCHES
+         "^(aarch64.*|AARCH64.*|arm64.*|ARM64.*)")
+    set(ARCH arm64)
+  elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(arm.*|ARM.*)")
+    set(ARCH arm)
+  elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(powerpc|ppc)64le")
+    set(ARCH ppc64le)
+  elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(powerpc|ppc)64")
+    set(ARCH ppc64)
+  elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(mips.*|MIPS.*)")
+    set(ARCH mips)
+  elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(riscv.*|RISCV.*)")
+    set(ARCH riscv)
+  elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(s390x.*|S390X.*)")
+    set(ARCH s390x)
+  elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(sparc.*|SPARC.*)")
+    set(ARCH sparc)
+  elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(loongarch.*|LOONGARCH.*)")
+    set(ARCH loongarch)
+  else()
+    message(
+      FATAL_ERROR
+        "opentelemetry-cpp: unrecognized target processor ${CMAKE_SYSTEM_PROCESSOR} configuration!"
+    )
+  endif()
+endif()
+message(STATUS "Building for architecture ARCH=${ARCH}")
+
+# Autodetect vcpkg toolchain
+if(DEFINED ENV{VCPKG_ROOT} AND NOT DEFINED CMAKE_TOOLCHAIN_FILE)
+  set(CMAKE_TOOLCHAIN_FILE
+      "$ENV{VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake"
+      CACHE STRING "")
+endif()
+
+if(VCPKG_CHAINLOAD_TOOLCHAIN_FILE)
+  include("${VCPKG_CHAINLOAD_TOOLCHAIN_FILE}")
+endif()
+
+option(WITH_ABI_VERSION_1 "ABI version 1" ON)
+option(WITH_ABI_VERSION_2 "EXPERIMENTAL: ABI version 2 preview" OFF)
+
+file(READ "${CMAKE_CURRENT_LIST_DIR}/api/include/opentelemetry/version.h"
+     OPENTELEMETRY_CPP_HEADER_VERSION_H)
+
+#
+# We do not want to have WITH_ABI_VERSION = "1" or "2", and instead prefer two
+# distinct flags, WITH_ABI_VERSION_1 and WITH_ABI_VERSION_2.
+#
+# This allows:
+#
+# * to have a specific option description for each ABI
+# * to mark experimental/stable/deprecated on flags, for clarity
+# * to search for exact abi usage move easily, discouraging:
+#
+#   * cmake -DWITH_ABI_VERSION=${ARG}
+#
+# While not supported, having distinct WITH_ABI_VERSION_1 and WITH_ABI_VERSION_2
+# flags also opens the possibility to support multiple ABI concurrently, should
+# that become necessary.
+#
+if(WITH_ABI_VERSION_1 AND WITH_ABI_VERSION_2)
+  #
+  # Only one ABI is supported in a build.
+  #
+  message(
+    FATAL_ERROR "Set either WITH_ABI_VERSION_1 or WITH_ABI_VERSION_2, not both")
+endif()
+
+if(WITH_ABI_VERSION_2)
+  set(OPENTELEMETRY_ABI_VERSION_NO "2")
+elseif(WITH_ABI_VERSION_1)
+  set(OPENTELEMETRY_ABI_VERSION_NO "1")
+else()
+  if(OPENTELEMETRY_CPP_HEADER_VERSION_H MATCHES
+     "OPENTELEMETRY_ABI_VERSION_NO[ \t\r\n]+\"?([0-9]+)\"?")
+    math(EXPR OPENTELEMETRY_ABI_VERSION_NO ${CMAKE_MATCH_1})
+  else()
+    message(
+      FATAL_ERROR
+        "OPENTELEMETRY_ABI_VERSION_NO not found on ${CMAKE_CURRENT_LIST_DIR}/api/include/opentelemetry/version.h"
+    )
+  endif()
+endif()
+
+message(STATUS "OPENTELEMETRY_ABI_VERSION_NO=${OPENTELEMETRY_ABI_VERSION_NO}")
+
+if(OPENTELEMETRY_CPP_HEADER_VERSION_H MATCHES
+   "OPENTELEMETRY_VERSION[ \t\r\n]+\"?([^\"]+)\"?")
+  set(OPENTELEMETRY_VERSION ${CMAKE_MATCH_1})
+else()
+  message(
+    FATAL_ERROR
+      "OPENTELEMETRY_VERSION not found on ${CMAKE_CURRENT_LIST_DIR}/api/include/opentelemetry/version.h"
+  )
+endif()
+
+message(STATUS "OPENTELEMETRY_VERSION=${OPENTELEMETRY_VERSION}")
+
+option(WITH_NO_DEPRECATED_CODE "Do not include deprecated code" OFF)
+
+set(WITH_STL
+    "OFF"
+    CACHE STRING "Which version of the Standard Library for C++ to use")
+
+option(WITH_GSL
+       "Whether to use Guidelines Support Library for C++ latest features" OFF)
+
+set(OPENTELEMETRY_INSTALL_default ON)
+if(NOT CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR)
+  set(OPENTELEMETRY_INSTALL_default OFF)
+endif()
+option(OPENTELEMETRY_INSTALL "Whether to install opentelemetry targets"
+       ${OPENTELEMETRY_INSTALL_default})
+
+include("${PROJECT_SOURCE_DIR}/cmake/tools.cmake")
+
+if(NOT WITH_STL STREQUAL "OFF")
+  # These definitions are needed for test projects that do not link against
+  # opentelemetry-api library directly. We ensure that variant implementation
+  # (absl::variant or std::variant) in variant unit test code is consistent with
+  # the global project build definitions. Optimize for speed to reduce the hops
+  if(CMAKE_CXX_COMPILER_ID STREQUAL "MSVC")
+    if(CMAKE_BUILD_TYPE MATCHES Debug)
+      # Turn off optimizations for DEBUG
+      set(MSVC_CXX_OPT_FLAG "/Od")
+    else()
+      string(REGEX MATCH "\/O" result ${CMAKE_CXX_FLAGS})
+      if(NOT ${result} MATCHES "\/O")
+        set(MSVC_CXX_OPT_FLAG "/O2")
+      endif()
+    endif()
+    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${MSVC_CXX_OPT_FLAG}")
+  endif()
+endif()
+
+option(WITH_OTLP_RETRY_PREVIEW
+       "Whether to enable experimental retry functionality" OFF)
+
+option(WITH_OTLP_GRPC_SSL_MTLS_PREVIEW
+       "Whether to enable mTLS support fro gRPC" OFF)
+
+option(WITH_OTLP_GRPC "Whether to include the OTLP gRPC exporter in the SDK"
+       OFF)
+
+option(WITH_OTLP_HTTP "Whether to include the OTLP http exporter in the SDK"
+       OFF)
+
+option(WITH_OTLP_FILE "Whether to include the OTLP file exporter in the SDK"
+       OFF)
+
+option(
+  WITH_OTLP_HTTP_COMPRESSION
+  "Whether to include gzip compression for the OTLP http exporter in the SDK"
+  OFF)
+
+option(WITH_CURL_LOGGING "Whether to enable select CURL verbosity in OTel logs"
+       OFF)
+
+option(WITH_ZIPKIN "Whether to include the Zipkin exporter in the SDK" OFF)
+
+option(WITH_PROMETHEUS "Whether to include the Prometheus Client in the SDK"
+       OFF)
+
+option(WITH_ELASTICSEARCH
+       "Whether to include the Elasticsearch Client in the SDK" OFF)
+
+option(WITH_NO_GETENV "Whether the platform supports environment variables" OFF)
+
+option(BUILD_TESTING "Whether to enable tests" ON)
+
+option(WITH_BENCHMARK "Whether to build benchmark program" ON)
+
+option(BUILD_W3CTRACECONTEXT_TEST "Whether to build w3c trace context" OFF)
+
+option(OTELCPP_MAINTAINER_MODE "Build in maintainer mode (-Wall -Werror)" OFF)
+
+option(WITH_OPENTRACING "Whether to include the Opentracing shim" OFF)
+
+option(OTELCPP_VERSIONED_LIBS "Whether to generate the versioned shared libs"
+       OFF)
+
+#
+# This option is experimental, subject to change in the spec:
+#
+# * https://github.com/open-telemetry/opentelemetry-specification/issues/2232
+#
+option(WITH_REMOVE_METER_PREVIEW
+       "EXPERIMENTAL, ABI BREAKING: Allow to remove a meter" OFF)
+
+if(OTELCPP_VERSIONED_LIBS AND NOT BUILD_SHARED_LIBS)
+  message(FATAL_ERROR "OTELCPP_VERSIONED_LIBS=ON requires BUILD_SHARED_LIBS=ON")
+endif()
+
+if(WIN32)
+  option(WITH_ETW "Whether to include the ETW Exporter in the SDK" ON)
+else()
+  if(DEFINED (WITH_ETW))
+    message(FATAL_ERROR "WITH_ETW is only supported on Windows")
+  endif()
+endif(WIN32)
+
+# Do not convert deprecated message to error
+if(CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang|AppleClang")
+  add_compile_options(-Wno-error=deprecated-declarations)
+endif()
+
+option(
+  WITH_API_ONLY
+  "Only build the API (use as a header-only library). Overrides WITH_EXAMPLES and all options to enable exporters"
+  OFF)
+option(WITH_EXAMPLES "Whether to build examples" ON)
+
+# This requires CURL, OFF by default.
+option(
+  WITH_EXAMPLES_HTTP
+  "Whether to build http client/server examples. Requires WITH_EXAMPLES and CURL"
+  OFF)
+
+option(WITH_FUNC_TESTS "Whether to build functional tests" ON)
+
+option(WITH_ASYNC_EXPORT_PREVIEW "Whether to enable async export" OFF)
+
+# Exemplar specs status is experimental, so behind feature flag by default
+option(WITH_METRICS_EXEMPLAR_PREVIEW
+       "Whether to enable exemplar within metrics" OFF)
+
+# Experimental, so behind feature flag by default
+option(WITH_THREAD_INSTRUMENTATION_PREVIEW
+       "Whether to enable thread instrumentation" OFF)
+
+option(OPENTELEMETRY_SKIP_DYNAMIC_LOADING_TESTS
+       "Whether to build test libraries that are always linked as shared libs"
+       OFF)
+
+#
+# Verify options dependencies
+#
+
+if(WITH_EXAMPLES_HTTP AND NOT WITH_EXAMPLES)
+  message(FATAL_ERROR "WITH_EXAMPLES_HTTP=ON requires WITH_EXAMPLES=ON")
+endif()
+
+find_package(Threads)
+
+function(install_windows_deps)
+  # Bootstrap vcpkg from CMake and auto-install deps in case if we are missing
+  # deps on Windows. Respect the target architecture variable.
+  set(VCPKG_TARGET_ARCHITECTURE
+      ${ARCH}
+      PARENT_SCOPE)
+  message(STATUS "Installing build tools and dependencies...")
+  set(ENV{ARCH} ${ARCH})
+  execute_process(
+    COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/tools/setup-buildtools.cmd)
+  set(CMAKE_TOOLCHAIN_FILE
+      ${CMAKE_CURRENT_SOURCE_DIR}/tools/vcpkg/scripts/buildsystems/vcpkg.cmake
+      CACHE FILEPATH "")
+  message(
+    STATUS
+      "Make sure that vcpkg.cmake is set as the CMAKE_TOOLCHAIN_FILE at the START of the cmake build process!
+    Can be command-line arg (cmake -DCMAKE_TOOLCHAIN_FILE=...) or set in your editor of choice."
+  )
+
+endfunction()
+
+function(set_target_version target_name)
+  if(OTELCPP_VERSIONED_LIBS)
+    set_target_properties(
+      ${target_name} PROPERTIES VERSION ${OPENTELEMETRY_VERSION}
+                                SOVERSION ${OPENTELEMETRY_ABI_VERSION_NO})
+  endif()
+endfunction()
+
+if(MSVC)
+  # Options for Visual C++ compiler: /Zc:__cplusplus - report an updated value
+  # for recent C++ language standards. Without this option MSVC returns the
+  # value of __cplusplus="199711L"
+  if(MSVC_VERSION GREATER 1900)
+    # __cplusplus flag is not supported by Visual Studio 2015
+    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /Zc:__cplusplus")
+  endif()
+endif()
+
+# include GNUInstallDirs before include cmake/opentelemetry-proto.cmake because
+# opentelemetry-proto installs targets to the location variables defined in
+# GNUInstallDirs.
+include(GNUInstallDirs)
+
+if(WITH_PROMETHEUS)
+  find_package(prometheus-cpp CONFIG QUIET)
+  if(NOT prometheus-cpp_FOUND)
+    message(STATUS "Trying to use local prometheus-cpp from submodule")
+    if(EXISTS ${PROJECT_SOURCE_DIR}/third_party/prometheus-cpp/.git)
+      set(SAVED_ENABLE_TESTING ${ENABLE_TESTING})
+      set(SAVED_CMAKE_CXX_CLANG_TIDY ${CMAKE_CXX_CLANG_TIDY})
+      set(SAVED_CMAKE_CXX_INCLUDE_WHAT_YOU_USE
+          ${CMAKE_CXX_INCLUDE_WHAT_YOU_USE})
+      set(ENABLE_TESTING OFF)
+      set(CMAKE_CXX_CLANG_TIDY "")
+      set(CMAKE_CXX_INCLUDE_WHAT_YOU_USE "")
+      add_subdirectory(third_party/prometheus-cpp)
+      set(ENABLE_TESTING ${SAVED_ENABLE_TESTING})
+      set(CMAKE_CXX_CLANG_TIDY ${SAVED_CMAKE_CXX_CLANG_TIDY})
+      set(CMAKE_CXX_INCLUDE_WHAT_YOU_USE
+          ${SAVED_CMAKE_CXX_INCLUDE_WHAT_YOU_USE})
+
+      # Get the version of the prometheus-cpp submodule
+      find_package(Git QUIET)
+      if(Git_FOUND)
+        execute_process(
+          COMMAND ${GIT_EXECUTABLE} describe --tags --always
+          WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/third_party/prometheus-cpp
+          OUTPUT_VARIABLE prometheus-cpp_VERSION
+          OUTPUT_STRIP_TRAILING_WHITESPACE)
+        string(REGEX REPLACE "^v" "" prometheus-cpp_VERSION
+                             "${prometheus-cpp_VERSION}")
+      endif()
+
+      message(
+        STATUS
+          "Using local prometheus-cpp from submodule. Version = ${prometheus-cpp_VERSION}"
+      )
+    else()
+      message(
+        FATAL_ERROR
+          "\nprometheus-cpp package was not found. Please either provide it manually or clone with submodules. "
+          "To initialize, fetch and checkout any nested submodules, you can use the following command:\n"
+          "git submodule update --init --recursive")
+    endif()
+  else()
+    message(STATUS "Using external prometheus-cpp")
+  endif()
+endif()
+
+if(WITH_OTLP_GRPC
+   OR WITH_OTLP_HTTP
+   OR WITH_OTLP_FILE)
+
+  # Including the CMakeFindDependencyMacro resolves an error from
+  # gRPCConfig.cmake on some grpc versions. See
+  # https://github.com/grpc/grpc/pull/33361 for more details.
+  include(CMakeFindDependencyMacro)
+
+  # Protobuf 3.22+ depends on abseil-cpp and must be found using the cmake
+  # find_package CONFIG search mode. The following attempts to find Protobuf
+  # using the CONFIG mode first, and if not found, falls back to the MODULE
+  # mode. See https://gitlab.kitware.com/cmake/cmake/-/issues/24321 for more
+  # details.
+  find_package(Protobuf CONFIG)
+  if(NOT Protobuf_FOUND)
+    find_package(Protobuf MODULE)
+    if(Protobuf_FOUND AND Protobuf_VERSION VERSION_GREATER_EQUAL "3.22.0")
+      message(
+        WARNING
+          "Found Protobuf version ${Protobuf_VERSION} using MODULE mode. "
+          "Linking errors may occur. Protobuf 3.22+ depends on abseil-cpp "
+          "and should be found using the CONFIG mode.")
+    endif()
+  endif()
+
+  if(WITH_OTLP_GRPC)
+    find_package(gRPC CONFIG)
+  endif()
+  if((NOT Protobuf_FOUND) OR (WITH_OTLP_GRPC AND NOT gRPC_FOUND))
+    if(WIN32 AND (NOT DEFINED CMAKE_TOOLCHAIN_FILE))
+      install_windows_deps()
+    endif()
+
+    if(WIN32 AND (NOT DEFINED CMAKE_TOOLCHAIN_FILE))
+      message(FATAL_ERROR "Windows dependency installation failed!")
+    endif()
+    if(WIN32)
+      include(${CMAKE_TOOLCHAIN_FILE})
+    endif()
+
+    if(NOT Protobuf_FOUND)
+      find_package(Protobuf CONFIG REQUIRED)
+    endif()
+    if(NOT gRPC_FOUND AND WITH_OTLP_GRPC)
+      find_package(gRPC CONFIG)
+    endif()
+    if(WIN32)
+      # Always use x64 protoc.exe
+      if(NOT EXISTS "${Protobuf_PROTOC_EXECUTABLE}")
+        set(Protobuf_PROTOC_EXECUTABLE
+            ${CMAKE_CURRENT_SOURCE_DIR}/tools/vcpkg/packages/protobuf_x64-windows/tools/protobuf/protoc.exe
+        )
+      endif()
+    endif()
+  endif()
+  # Latest Protobuf imported targets and without legacy module support
+  if(TARGET protobuf::protoc)
+    if(CMAKE_CROSSCOMPILING AND Protobuf_PROTOC_EXECUTABLE)
+      set(PROTOBUF_PROTOC_EXECUTABLE ${Protobuf_PROTOC_EXECUTABLE})
+    else()
+      project_build_tools_get_imported_location(PROTOBUF_PROTOC_EXECUTABLE
+                                                protobuf::protoc)
+      # If protobuf::protoc is not a imported target, then we use the target
+      # directly for fallback
+      if(NOT PROTOBUF_PROTOC_EXECUTABLE)
+        set(PROTOBUF_PROTOC_EXECUTABLE protobuf::protoc)
+      endif()
+    endif()
+  elseif(Protobuf_PROTOC_EXECUTABLE)
+    # Some versions of FindProtobuf.cmake uses mixed case instead of uppercase
+    set(PROTOBUF_PROTOC_EXECUTABLE ${Protobuf_PROTOC_EXECUTABLE})
+  endif()
+  include(CMakeDependentOption)
+
+  message(STATUS "PROTOBUF_PROTOC_EXECUTABLE=${PROTOBUF_PROTOC_EXECUTABLE}")
+  set(SAVED_CMAKE_CXX_CLANG_TIDY ${CMAKE_CXX_CLANG_TIDY})
+  set(CMAKE_CXX_CLANG_TIDY "")
+  include(cmake/opentelemetry-proto.cmake)
+  set(CMAKE_CXX_CLANG_TIDY ${SAVED_CMAKE_CXX_CLANG_TIDY})
+endif()
+
+#
+# Do we need HTTP CLIENT CURL ?
+#
+
+if(WITH_OTLP_HTTP
+   OR WITH_ELASTICSEARCH
+   OR WITH_ZIPKIN
+   OR BUILD_W3CTRACECONTEXT_TEST
+   OR WITH_EXAMPLES_HTTP)
+  set(WITH_HTTP_CLIENT_CURL ON)
+else()
+  set(WITH_HTTP_CLIENT_CURL OFF)
+endif()
+
+#
+# Do we need CURL ?
+#
+
+if((NOT WITH_API_ONLY) AND WITH_HTTP_CLIENT_CURL)
+  # No specific version required.
+  find_package(CURL REQUIRED)
+  # Set the CURL_VERSION from the legacy CURL_VERSION_STRING Required for CMake
+  # versions below 4.0
+  if(NOT DEFINED CURL_VERSION AND DEFINED CURL_VERSION_STRING)
+    set(CURL_VERSION ${CURL_VERSION_STRING})
+  endif()
+endif()
+
+#
+# Do we need ZLIB ?
+#
+
+if((NOT WITH_API_ONLY)
+   AND WITH_HTTP_CLIENT_CURL
+   AND WITH_OTLP_HTTP_COMPRESSION)
+  # No specific version required.
+  find_package(ZLIB REQUIRED)
+  # Set the ZLIB_VERSION from the legacy ZLIB_VERSION_STRING Required for CMake
+  # versions below 3.26
+  if(NOT DEFINED ZLIB_VERSION AND DEFINED ZLIB_VERSION_STRING)
+    set(ZLIB_VERSION ${ZLIB_VERSION_STRING})
+  endif()
+endif()
+
+#
+# Do we need NLOHMANN_JSON ?
+#
+
+if(WITH_ELASTICSEARCH
+   OR WITH_ZIPKIN
+   OR WITH_OTLP_HTTP
+   OR WITH_OTLP_FILE
+   OR BUILD_W3CTRACECONTEXT_TEST
+   OR WITH_ETW)
+  set(USE_NLOHMANN_JSON ON)
+else()
+  set(USE_NLOHMANN_JSON OFF)
+endif()
+
+if((NOT WITH_API_ONLY) AND USE_NLOHMANN_JSON)
+  include(cmake/nlohmann-json.cmake)
+endif()
+
+if(OTELCPP_MAINTAINER_MODE)
+  if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
+    message(STATUS "Building with gcc in maintainer mode.")
+
+    add_compile_options(-Wall)
+    add_compile_options(-Werror)
+    add_compile_options(-Wextra)
+
+    # Tested with GCC 9.4 on github.
+    if(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 9.4)
+      message(STATUS "Building with additional warnings for gcc.")
+
+      # Relaxed warnings
+
+      # Enforced warnings
+
+      # C++ options only
+      add_compile_options($<$<STREQUAL:$<COMPILE_LANGUAGE>,CXX>:-Wextra-semi>)
+      add_compile_options(
+        $<$<STREQUAL:$<COMPILE_LANGUAGE>,CXX>:-Woverloaded-virtual>)
+      add_compile_options(
+        $<$<STREQUAL:$<COMPILE_LANGUAGE>,CXX>:-Wsuggest-override>)
+      add_compile_options(
+        $<$<STREQUAL:$<COMPILE_LANGUAGE>,CXX>:-Wold-style-cast>)
+
+      # C and C++
+      add_compile_options(-Wcast-qual)
+      add_compile_options(-Wformat-security)
+      add_compile_options(-Wlogical-op)
+      add_compile_options(-Wmissing-include-dirs)
+      add_compile_options(-Wstringop-truncation)
+      add_compile_options(-Wundef)
+      add_compile_options(-Wvla)
+    endif()
+  elseif(CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
+    message(STATUS "Building with clang in maintainer mode.")
+
+    add_compile_options(-Wall)
+    add_compile_options(-Werror)
+    add_compile_options(-Wextra)
+
+    # Tested with Clang 11.0 on github.
+    if(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 11.0)
+      message(STATUS "Building with additional warnings for clang.")
+
+      # Relaxed warnings
+      add_compile_options(-Wno-error=unused-private-field)
+
+      # Enforced warnings
+      add_compile_options(-Wcast-qual)
+      add_compile_options(-Wconditional-uninitialized)
+      add_compile_options(-Wextra-semi)
+      add_compile_options(-Wformat-security)
+      add_compile_options(-Wheader-hygiene)
+      add_compile_options(-Winconsistent-missing-destructor-override)
+      add_compile_options(-Winconsistent-missing-override)
+      add_compile_options(-Wnewline-eof)
+      add_compile_options(-Wnon-virtual-dtor)
+      add_compile_options(-Woverloaded-virtual)
+      add_compile_options(-Wrange-loop-analysis)
+      add_compile_options(-Wundef)
+      add_compile_options(-Wundefined-reinterpret-cast)
+      add_compile_options(-Wvla)
+      add_compile_options(-Wold-style-cast)
+    endif()
+  elseif(CMAKE_CXX_COMPILER_ID STREQUAL "MSVC")
+    message(STATUS "Building with msvc in maintainer mode.")
+
+    add_compile_options(/WX)
+    add_compile_options(/W4)
+
+    # Relaxed warnings
+    add_compile_options(/wd4100)
+    add_compile_options(/wd4125)
+    add_compile_options(/wd4566)
+    add_compile_options(/wd4127)
+    add_compile_options(/wd4512)
+    add_compile_options(/wd4267)
+    add_compile_options(/wd4996)
+
+    # Enforced warnings
+    add_compile_options(/we4265) # 'class': class has virtual functions, but
+                                 # destructor is not virtual
+    add_compile_options(/we5204) # A class with virtual functions has
+                                 # non-virtual trivial destructor.
+
+  elseif()
+    message(FATAL_ERROR "Building with unknown compiler in maintainer mode.")
+  endif()
+endif(OTELCPP_MAINTAINER_MODE)
+
+list(APPEND CMAKE_PREFIX_PATH "${CMAKE_BINARY_DIR}")
+
+include(CTest)
+if(BUILD_TESTING)
+  if(EXISTS ${CMAKE_BINARY_DIR}/lib/libgtest.a)
+    # Prefer GTest from build tree. GTest is not always working with
+    # CMAKE_PREFIX_PATH
+    set(GTEST_INCLUDE_DIRS
+        ${CMAKE_CURRENT_SOURCE_DIR}/third_party/googletest/googletest/include
+        ${CMAKE_CURRENT_SOURCE_DIR}/third_party/googletest/googlemock/include)
+    if(TARGET gtest)
+      set(GTEST_BOTH_LIBRARIES gtest gtest_main)
+    else()
+      set(GTEST_BOTH_LIBRARIES ${CMAKE_BINARY_DIR}/lib/libgtest.a
+                               ${CMAKE_BINARY_DIR}/lib/libgtest_main.a)
+    endif()
+  elseif(WIN32)
+    # Make sure we are always bootsrapped with vcpkg on Windows
+    find_package(GTest)
+    if(NOT (GTEST_FOUND OR GTest_FOUND))
+      if(DEFINED CMAKE_TOOLCHAIN_FILE)
+        message(
+          FATAL_ERROR
+            "Pleaes install GTest with the CMAKE_TOOLCHAIN_FILE at ${CMAKE_TOOLCHAIN_FILE}"
+        )
+      else()
+        install_windows_deps()
+        include(${CMAKE_TOOLCHAIN_FILE})
+        find_package(GTest REQUIRED)
+      endif()
+    endif()
+  else()
+    # Prefer GTest installed by OS distro, brew or vcpkg package manager
+    find_package(GTest REQUIRED)
+  endif()
+  if(NOT GTEST_BOTH_LIBRARIES)
+    # New GTest package names
+    if(TARGET GTest::gtest)
+      set(GTEST_BOTH_LIBRARIES GTest::gtest GTest::gtest_main)
+    elseif(TARGET GTest::GTest)
+      set(GTEST_BOTH_LIBRARIES GTest::GTest GTest::Main)
+    endif()
+  endif()
+  if(GTEST_INCLUDE_DIRS)
+    include_directories(SYSTEM ${GTEST_INCLUDE_DIRS})
+  endif()
+  message(STATUS "GTEST_INCLUDE_DIRS   = ${GTEST_INCLUDE_DIRS}")
+  message(STATUS "GTEST_BOTH_LIBRARIES = ${GTEST_BOTH_LIBRARIES}")
+
+  # Try to find gmock
+  if(NOT GMOCK_LIB AND TARGET GTest::gmock)
+    set(GMOCK_LIB GTest::gmock)
+  elseif(MSVC)
+    # Explicitly specify that we consume GTest from shared library. The rest of
+    # code logic below determines whether we link Release or Debug flavor of the
+    # library. These flavors have different prefix on Windows, gmock and gmockd
+    # respectively.
+    add_definitions(-DGTEST_LINKED_AS_SHARED_LIBRARY=1)
+    if(GMOCK_LIB)
+      # unset GMOCK_LIB to force find_library to redo the lookup, as the cached
+      # entry could cause linking to incorrect flavor of gmock and leading to
+      # runtime error.
+      unset(GMOCK_LIB CACHE)
+    endif()
+  endif()
+  if(NOT GMOCK_LIB)
+    if(MSVC AND CMAKE_BUILD_TYPE STREQUAL "Debug")
+      find_library(GMOCK_LIB gmockd PATH_SUFFIXES lib)
+    else()
+      find_library(GMOCK_LIB gmock PATH_SUFFIXES lib)
+    endif()
+    # Reset GMOCK_LIB if it was not found, or some target may link
+    # GMOCK_LIB-NOTFOUND
+    if(NOT GMOCK_LIB)
+      unset(GMOCK_LIB)
+      unset(GMOCK_LIB CACHE)
+    endif()
+  endif()
+
+  enable_testing()
+  if(WITH_BENCHMARK)
+    # Benchmark respects the CMAKE_PREFIX_PATH
+    find_package(benchmark CONFIG REQUIRED)
+  endif()
+endif()
+
+# Record build config and versions
+message(STATUS "---------------------------------------------")
+message(STATUS "build settings")
+message(STATUS "---------------------------------------------")
+message(STATUS "OpenTelemetry: ${OPENTELEMETRY_VERSION}")
+message(STATUS "OpenTelemetry ABI: ${OPENTELEMETRY_ABI_VERSION_NO}")
+message(STATUS "ARCH: ${ARCH}")
+message(STATUS "CXX: ${CMAKE_CXX_COMPILER_ID} ${CMAKE_CXX_COMPILER_VERSION}")
+message(STATUS "CMAKE_BUILD_TYPE: ${CMAKE_BUILD_TYPE}")
+message(STATUS "CXXFLAGS: ${CMAKE_CXX_FLAGS}")
+message(STATUS "CMAKE_CXX_STANDARD: ${CMAKE_CXX_STANDARD}")
+message(STATUS "CMAKE_TOOLCHAIN_FILE: ${CMAKE_TOOLCHAIN_FILE}")
+message(STATUS "BUILD_SHARED_LIBS: ${BUILD_SHARED_LIBS}")
+
+message(STATUS "---------------------------------------------")
+message(STATUS "opentelemetry-cpp build options")
+message(STATUS "---------------------------------------------")
+message(STATUS "WITH_API_ONLY: ${WITH_API_ONLY}")
+message(STATUS "WITH_NO_DEPRECATED_CODE: ${WITH_NO_DEPRECATED_CODE}")
+message(STATUS "WITH_ABI_VERSION_1: ${WITH_ABI_VERSION_1}")
+message(STATUS "WITH_ABI_VERSION_2: ${WITH_ABI_VERSION_2}")
+message(STATUS "OTELCPP_VERSIONED_LIBS: ${OTELCPP_VERSIONED_LIBS}")
+message(STATUS "OTELCPP_MAINTAINER_MODE: ${OTELCPP_MAINTAINER_MODE}")
+message(STATUS "WITH_STL: ${WITH_STL}")
+message(STATUS "WITH_GSL: ${WITH_GSL}")
+message(STATUS "WITH_NO_GETENV: ${WITH_NO_GETENV}")
+
+message(STATUS "---------------------------------------------")
+message(STATUS "opentelemetry-cpp cmake component options")
+message(STATUS "---------------------------------------------")
+message(STATUS "WITH_OTLP_GRPC: ${WITH_OTLP_GRPC}")
+message(STATUS "WITH_OTLP_HTTP: ${WITH_OTLP_HTTP}")
+message(STATUS "WITH_OTLP_FILE: ${WITH_OTLP_FILE}")
+message(STATUS "WITH_HTTP_CLIENT_CURL: ${WITH_HTTP_CLIENT_CURL}")
+message(STATUS "WITH_ZIPKIN: ${WITH_ZIPKIN}")
+message(STATUS "WITH_PROMETHEUS: ${WITH_PROMETHEUS}")
+message(STATUS "WITH_ELASTICSEARCH: ${WITH_ELASTICSEARCH}")
+message(STATUS "WITH_OPENTRACING: ${WITH_OPENTRACING}")
+message(STATUS "WITH_ETW: ${WITH_ETW}")
+message(STATUS "OPENTELEMETRY_BUILD_DLL: ${OPENTELEMETRY_BUILD_DLL}")
+
+message(STATUS "---------------------------------------------")
+message(STATUS "feature preview options")
+message(STATUS "---------------------------------------------")
+message(STATUS "WITH_ASYNC_EXPORT_PREVIEW: ${WITH_ASYNC_EXPORT_PREVIEW}")
+message(
+  STATUS
+    "WITH_THREAD_INSTRUMENTATION_PREVIEW: ${WITH_THREAD_INSTRUMENTATION_PREVIEW}"
+)
+message(
+  STATUS "WITH_METRICS_EXEMPLAR_PREVIEW: ${WITH_METRICS_EXEMPLAR_PREVIEW}")
+message(STATUS "WITH_REMOVE_METER_PREVIEW: ${WITH_REMOVE_METER_PREVIEW}")
+message(
+  STATUS "WITH_OTLP_GRPC_SSL_MTLS_PREVIEW: ${WITH_OTLP_GRPC_SSL_MTLS_PREVIEW}")
+message(STATUS "WITH_OTLP_RETRY_PREVIEW: ${WITH_OTLP_RETRY_PREVIEW}")
+message(STATUS "---------------------------------------------")
+message(STATUS "third-party options")
+message(STATUS "---------------------------------------------")
+message(STATUS "WITH_NLOHMANN_JSON: ${USE_NLOHMANN_JSON}")
+message(STATUS "WITH_CURL_LOGGING: ${WITH_CURL_LOGGING}")
+message(STATUS "WITH_OTLP_HTTP_COMPRESSION: ${WITH_OTLP_HTTP_COMPRESSION}")
+message(STATUS "---------------------------------------------")
+message(STATUS "examples and test options")
+message(STATUS "---------------------------------------------")
+message(STATUS "WITH_BENCHMARK: ${WITH_BENCHMARK}")
+message(STATUS "WITH_EXAMPLES: ${WITH_EXAMPLES}")
+message(STATUS "WITH_EXAMPLES_HTTP: ${WITH_EXAMPLES_HTTP}")
+message(STATUS "WITH_FUNC_TESTS: ${WITH_FUNC_TESTS}")
+message(STATUS "BUILD_W3CTRACECONTEXT_TEST: ${BUILD_W3CTRACECONTEXT_TEST}")
+message(STATUS "BUILD_TESTING: ${BUILD_TESTING}")
+message(STATUS "---------------------------------------------")
+message(STATUS "versions")
+message(STATUS "---------------------------------------------")
+message(STATUS "CMake: ${CMAKE_VERSION}")
+message(STATUS "GTest: ${GTest_VERSION}")
+message(STATUS "benchmark: ${benchmark_VERSION}")
+if(WITH_GSL)
+  message(STATUS "GSL: ${GSL_VERSION}")
+endif()
+if(absl_FOUND)
+  message(STATUS "Abseil: ${absl_VERSION}")
+endif()
+if(Protobuf_FOUND)
+  message(STATUS "Protobuf: ${Protobuf_VERSION}")
+endif()
+if(gRPC_FOUND)
+  message(STATUS "gRPC: ${gRPC_VERSION}")
+endif()
+if(CURL_FOUND)
+  message(STATUS "CURL: ${CURL_VERSION}")
+endif()
+if(ZLIB_FOUND)
+  message(STATUS "ZLIB: ${ZLIB_VERSION}")
+endif()
+if(USE_NLOHMANN_JSON)
+  message(STATUS "nlohmann-json: ${nlohmann_json_VERSION}")
+endif()
+if(prometheus-cpp_FOUND)
+  message(STATUS "prometheus-cpp: ${prometheus-cpp_VERSION}")
+endif()
+message(STATUS "---------------------------------------------")
+
+include("${PROJECT_SOURCE_DIR}/cmake/otel-install-functions.cmake")
+
+include(CMakePackageConfigHelpers)
+
+if(DEFINED OPENTELEMETRY_BUILD_DLL)
+  if(NOT WIN32)
+    message(FATAL_ERROR "Build DLL is only supported on Windows!")
+  endif()
+  if(NOT MSVC)
+    message(WARNING "Build DLL is supposed to work with MSVC!")
+  endif()
+  if(WITH_STL)
+    message(
+      WARNING "Build DLL with C++ STL could cause binary incompatibility!")
+  endif()
+  add_definitions(-DOPENTELEMETRY_BUILD_EXPORT_DLL)
+endif()
+
+add_subdirectory(api)
+
+if(WITH_OPENTRACING)
+  find_package(OpenTracing CONFIG QUIET)
+  if(NOT OpenTracing_FOUND)
+    set(OPENTRACING_DIR "third_party/opentracing-cpp")
+    message(STATUS "Trying to use local ${OPENTRACING_DIR} from submodule")
+    if(EXISTS "${PROJECT_SOURCE_DIR}/${OPENTRACING_DIR}/.git")
+      set(SAVED_BUILD_TESTING ${BUILD_TESTING})
+      set(BUILD_TESTING OFF)
+      set(SAVED_CMAKE_CXX_INCLUDE_WHAT_YOU_USE
+          ${CMAKE_CXX_INCLUDE_WHAT_YOU_USE})
+      set(CMAKE_CXX_INCLUDE_WHAT_YOU_USE "")
+      add_subdirectory(${OPENTRACING_DIR})
+      set(BUILD_TESTING ${SAVED_BUILD_TESTING})
+      set(CMAKE_CXX_INCLUDE_WHAT_YOU_USE
+          ${SAVED_CMAKE_CXX_INCLUDE_WHAT_YOU_USE})
+    else()
+      message(
+        FATAL_ERROR
+          "\nopentracing-cpp package was not found. Please either provide it manually or clone with submodules. "
+          "To initialize, fetch and checkout any nested submodules, you can use the following command:\n"
+          "git submodule update --init --recursive")
+    endif()
+  else()
+    message(STATUS "Using external opentracing-cpp")
+  endif()
+  add_subdirectory(opentracing-shim)
+endif()
+
+if(NOT WITH_API_ONLY)
+  set(BUILD_TESTING ${BUILD_TESTING})
+
+  add_subdirectory(sdk)
+  add_subdirectory(ext)
+  add_subdirectory(exporters)
+
+  if(BUILD_TESTING)
+    add_subdirectory(test_common)
+  endif()
+  if(WITH_EXAMPLES)
+    add_subdirectory(examples)
+  endif()
+  if(WITH_FUNC_TESTS)
+    add_subdirectory(functional)
+  endif()
+endif()
+
+include(cmake/opentelemetry-build-external-component.cmake)
+include(cmake/patch-imported-config.cmake)
+
+if(OPENTELEMETRY_INSTALL)
+  # Install the cmake config and version files
+  otel_install_cmake_config()
+
+  # Install the components and associated files
+  otel_install_components()
+
+  # Install the thirdparty dependency definition file
+  otel_install_thirdparty_definitions()
+
+  if(BUILD_PACKAGE)
+    include(cmake/package.cmake)
+    include(CPack)
+  endif()
+endif()

+ 126 - 0
ext/opentelemetry-cpp-1.21.0/CMakeSettings.json

@@ -0,0 +1,126 @@
+{
+  "configurations": [
+    {
+      "name": "nostd-x64-Debug",
+      "generator": "Ninja",
+      "configurationType": "Debug",
+        "inheritEnvironments": [
+          "msvc_x64_x64"
+        ],
+      "buildRoot": "${projectDir}\\out\\vs2019\\${name}",
+      "installRoot": "${projectDir}\\out\\vs2019\\${name}\\install",
+      "cmakeCommandArgs": "",
+      "buildCommandArgs": "",
+      "ctestCommandArgs": "",
+      "variables": [
+        {
+          "name": "WITH_OTLP_GRPC",
+          "value": "True",
+          "type": "BOOL"
+        },
+        {
+          "name": "WITH_EXAMPLES",
+          "value": "true",
+          "type": "BOOL"
+        }
+      ]
+    },
+    {
+      "name": "nostd-x64-Release",
+      "generator": "Ninja",
+      "configurationType": "Release",
+        "inheritEnvironments": [
+          "msvc_x64_x64"
+        ],
+      "buildRoot": "${projectDir}\\out\\vs2019\\${name}",
+      "installRoot": "${projectDir}\\out\\vs2019\\${name}\\install",
+      "cmakeCommandArgs": "",
+      "buildCommandArgs": "",
+      "ctestCommandArgs": "",
+      "cmakeToolchain": "",
+      "variables": [
+        {
+          "name": "WITH_OTLP_GRPC",
+          "value": "True",
+          "type": "BOOL"
+        },
+        {
+          "name": "WITH_EXAMPLES",
+          "value": "true",
+          "type": "BOOL"
+        }
+      ]
+    },
+    {
+      "name": "stdlib-x64-Debug",
+      "generator": "Ninja",
+      "configurationType": "Debug",
+      "inheritEnvironments": [
+        "msvc_x64_x64"
+      ],
+      "buildRoot": "${projectDir}\\out\\vs2019\\${name}",
+      "installRoot": "${projectDir}\\out\\vs2019\\${name}\\install",
+      "cmakeCommandArgs": "",
+      "buildCommandArgs": "",
+      "ctestCommandArgs": "",
+      "variables": [
+        {
+          "name": "WITH_STL",
+          "value": "True",
+          "type": "BOOL"
+        },
+        {
+          "name": "WITH_OTLP_GRPC",
+          "value": "True",
+          "type": "BOOL"
+        },
+        {
+          "name": "WITH_EXAMPLES",
+          "value": "true",
+          "type": "BOOL"
+        },
+        {
+          "name": "WITH_PROMETHEUS",
+          "value": "True",
+          "type": "BOOL"
+        }
+      ]
+    },
+    {
+      "name": "stdlib-x64-Release",
+      "generator": "Ninja",
+      "configurationType": "Release",
+      "inheritEnvironments": [
+        "msvc_x64_x64"
+      ],
+      "buildRoot": "${projectDir}\\out\\vs2019\\${name}",
+      "installRoot": "${projectDir}\\out\\vs2019\\${name}\\install",
+      "cmakeCommandArgs": "",
+      "buildCommandArgs": "",
+      "ctestCommandArgs": "",
+      "cmakeToolchain": "",
+      "variables": [
+        {
+          "name": "WITH_STL",
+          "value": "True",
+          "type": "BOOL"
+        },
+        {
+          "name": "WITH_OTLP_GRPC",
+          "value": "True",
+          "type": "BOOL"
+        },
+        {
+          "name": "WITH_EXAMPLES",
+          "value": "true",
+          "type": "BOOL"
+        },
+        {
+          "name": "WITH_PROMETHEUS",
+          "value": "True",
+          "type": "BOOL"
+        }
+      ]
+    }
+  ]
+}

+ 3 - 0
ext/opentelemetry-cpp-1.21.0/CODE_OF_CONDUCT.md

@@ -0,0 +1,3 @@
+# OpenTelemetry Community Code of Conduct
+
+OpenTelemetry follows the [CNCF Code of Conduct](https://github.com/cncf/foundation/blob/master/code-of-conduct.md).

+ 322 - 0
ext/opentelemetry-cpp-1.21.0/CONTRIBUTING.md

@@ -0,0 +1,322 @@
+# Contributing to opentelemetry-cpp
+
+The OpenTelemetry C/C++ special interest group (SIG) meets regularly. See the
+OpenTelemetry [community](https://github.com/open-telemetry/community#cc-sdk)
+repo for information on this and other language SIGs.
+
+See the [public meeting
+notes](https://docs.google.com/document/d/1i1E4-_y4uJ083lCutKGDhkpi3n4_e774SBLi9hPLocw/edit)
+for a summary description of past meetings. To request edit access, join the
+meeting or get in touch on
+[Slack](https://cloud-native.slack.com/archives/C01N3AT62SJ).
+
+See the [community membership
+document](https://github.com/open-telemetry/community/blob/main/community-membership.md)
+on how to become a
+[**Member**](https://github.com/open-telemetry/community/blob/main/community-membership.md#member),
+[**Approver**](https://github.com/open-telemetry/community/blob/main/community-membership.md#approver)
+and
+[**Maintainer**](https://github.com/open-telemetry/community/blob/main/community-membership.md#maintainer).
+
+## Development
+
+OpenTelemetry C++ uses the [Google naming
+convention](https://google.github.io/styleguide/cppguide.html#Naming).
+
+Code is formatted automatically and enforced by CI.
+
+### Build and Run Code Examples
+
+Note: these instructions apply to examples configured with Bazel, see
+example-specific documentation for other build automation tools.
+
+Install the latest bazel version by following the steps listed
+[here](https://docs.bazel.build/versions/master/install.html).
+
+Select an example of interest from the [examples
+folder](https://github.com/open-telemetry/opentelemetry-cpp/tree/main/examples).
+Inside each example directory is a `BUILD` file containing instructions for
+Bazel. Find the binary name of your example by inspecting the contents of this
+`BUILD` file.
+
+Build the example from the root of the opentelemetry-cpp directory using Bazel.
+Replace `<binary name>` with the identifier found in the previous step:
+
+```sh
+bazel build //examples/<example directory name>:<binary name>
+```
+
+Run the resulting executable to see telemetry from the application as it calls
+the instrumented library: </li>
+
+```sh
+bazel-bin/examples/<example directory name>/<binary name>
+```
+
+For instance, building and running the `simple` example can be done as follows:
+
+```sh
+bazel build //examples/simple:example_simple
+bazel-bin/examples/simple/example_simple
+```
+
+### DevContainer Setup for Project
+
+This guide provides instructions on how to set up and use the development
+container (`devcontainer`) environment to streamline testing and development
+for this project. With the DevContainer, you can work in a consistent environment
+configured with all the necessary dependencies and tools.
+
+#### Prerequisites
+
+Before getting started, ensure you have the following installed:
+
+* **Docker**: DevContainers require Docker for containerization.
+* **Visual Studio Code (VSCode)** with the **Remote - Containers** extension.
+
+#### Getting Started
+
+* **Open the Project in DevContainer**:
+
+   Open the project in VSCode. When prompted to "Reopen in Container," select
+   this option. If you’re not prompted, you can manually open the container by
+   selecting **Remote-Containers: Reopen in Container** from the command palette
+   (`F1` or `Ctrl+Shift+P`).
+
+* **Container Setup**:
+
+   The DevContainer environment will automatically build based on the configuration
+   files provided (e.g., `.devcontainer/devcontainer.json`). This setup will install
+   required dependencies, tools, and environment variables needed for the project.
+
+* **Container Customization**:
+   See `.devcontainer/README.md` for devcontainer configuration options.
+
+#### Available Commands
+
+Once inside the DevContainer, you can use the following commands to run tests
+and CI workflows.
+
+##### 1. Run Tests with Bazelisk
+
+To run tests with Bazelisk using specific compilation options, use:
+
+```bash
+bazelisk-linux-amd64 test --copt=-DENABLE_LOGS_PREVIEW
+--test_output=errors --cache_test_results=no --copt=-DENABLE_TEST //exporters/otlp/...
+```
+
+###### Command Breakdown
+
+* `--copt=-DENABLE_LOGS_PREVIEW`: Enables preview logs.
+* `--test_output=errors`: Shows only the errors in the test output.
+* `--cache_test_results=no`: Forces Bazel to re-run tests without caching.
+* `--copt=-DENABLE_TEST`: Enables testing capabilities for the target code.
+* `//exporters/otlp/...`: Specifies the test target path.
+
+##### 2. Run CI Script
+
+You can also run the CI script provided to perform testing with the
+following command as an
+example:
+
+```bash
+bash ci/do_ci.sh cmake.exporter.otprotocol.test
+```
+
+This command initiates the CI pipeline, executing tests specifically for the
+**cmake.exporter.otprotocol** module.
+
+#### Troubleshooting
+
+If you encounter issues:
+
+* **Rebuild the DevContainer**: From the command palette, run
+  **Remote-Containers: Rebuild Container** to reinitialize the environment.
+* **Check Bazelisk and CI Script Logs**: Inspect logs for any configuration or
+  dependency issues.
+
+#### Additional Notes
+
+* You can adjust compiler options (`--copt`) as needed to test additional flags
+  or enable/disable specific features.
+* The test results will be displayed in the terminal within the DevContainer for
+  easy debugging.
+
+#### Resources
+
+* **Bazelisk Documentation**: [https://github.com/bazelbuild/bazelisk](https://github.com/bazelbuild/bazelisk)
+* **VSCode DevContainer Documentation**: [https://code.visualstudio.com/docs/remote/containers](https://code.visualstudio.com/docs/remote/containers)
+
+### Docker Development Image
+
+The `.devcontainer/Dockerfile.dev`
+dockerfile can be built directly with the following command.
+
+```sh
+ docker build -t opentelemetry-cpp-dev -f ./.devcontainer/Dockerfile.dev .
+```
+
+You can customize the image using build arguments
+ to match permissions with the host user.
+
+```sh
+ docker build -t opentelemetry-cpp-dev \
+  --build-arg USER_UID="$(id -u)" \
+  --build-arg USER_GID="$(id -g)" \
+  -f ./.devcontainer/Dockerfile.dev .
+
+```
+
+Run an interactive bash session binding your host
+ opentelemetry-cpp directory to the container's workspace:
+
+```sh
+docker run -it -v "$PWD:/workspaces/opentelemetry-cpp" opentelemetry-cpp-dev bash
+```
+
+## Pull Requests
+
+### How to Send Pull Requests
+
+Everyone is welcome to contribute code to `opentelemetry-cpp` via GitHub pull
+requests (PRs).
+
+To create a new PR, fork the project in GitHub and clone the upstream repo:
+
+```sh
+git clone --recursive https://github.com/open-telemetry/opentelemetry-cpp.git
+```
+
+Add your fork as a remote:
+
+```sh
+git remote add fork https://github.com/YOUR_GITHUB_USERNAME/opentelemetry-cpp.git
+```
+
+If you haven't, make sure you are loading the submodules required to build
+OpenTelemetry
+
+```sh
+git submodule init
+git submodule update
+```
+
+The source code is automatically formatted using clang-format.
+
+The output can vary between versions, so make sure to install `clang-format`
+version `10.0`, and have `clang-format-10` in your execution path,
+so that the helper script `tools/format.sh` can find it.
+
+Check out a new branch, make modifications and push the branch to your fork:
+
+```sh
+git checkout -b feature
+# edit files
+tools/format.sh
+git commit
+git push fork feature
+```
+
+If you made changes to the Markdown documents (`*.md` files), install the latest
+[`markdownlint-cli`](https://github.com/igorshubovych/markdownlint-cli) and run:
+
+```sh
+markdownlint .
+```
+
+If you modified shell scripts (`*.sh` files), install `shellcheck` and run:
+
+```sh
+shellcheck --severity=error <path to shell script>.sh
+```
+
+Open a pull request against the main `opentelemetry-cpp` repo.
+
+To run tests locally, please read the [CI instructions](ci/README.md).
+
+### How to Receive Comments
+
+* If the PR is not ready for review, please put `[WIP]` in the title, tag it as
+  `work-in-progress`, or mark it as
+  [`draft`](https://github.blog/2019-02-14-introducing-draft-pull-requests/).
+* Make sure [CLA](https://identity.linuxfoundation.org/projects/cncf) is signed
+  and CI is clear.
+* For non-trivial changes, please update the [CHANGELOG](./CHANGELOG.md).
+
+### How to Get PRs Merged
+
+A PR is considered to be **ready to merge** when:
+
+* It has received two approvals with at least one approval from
+  [Approver](https://github.com/open-telemetry/community/blob/main/community-membership.md#approver)
+  /
+  [Maintainer](https://github.com/open-telemetry/community/blob/main/community-membership.md#maintainer)
+  (at different company).
+* A pull request opened by an Approver / Maintainer can be merged with only one
+  approval from  Approver / Maintainer (at different company).
+* Major feedback items/points are resolved.
+* It has been open for review for at least one working day. This gives people
+  reasonable time to review.
+* Trivial changes (typo, cosmetic, doc, etc.) don't have to wait for one day.
+* Urgent fixes can take exceptions as long as it has been actively communicated.
+
+Any Maintainer can merge the PR once it is **ready to merge**. Maintainer can
+make conscious judgement to merge pull requests which have not strictly met
+above mentioned requirements.
+
+If a PR has been stuck (e.g. there are lots of debates and people couldn't agree
+on each other), the owner should try to get people aligned by:
+
+* Consolidating the perspectives and putting a summary in the PR. It is
+  recommended to add a link into the PR description, which points to a comment
+  with a summary in the PR conversation
+* Stepping back to see if it makes sense to narrow down the scope of the PR or
+  split it up.
+
+If none of the above worked and the PR has been stuck for more than 2 weeks, the
+owner should bring it to the OpenTelemetry C++ SIG meeting. See
+[README.md](README.md#contributing) for the meeting link.
+
+## Design Choices
+
+As with other OpenTelemetry clients, opentelemetry-cpp follows the
+[opentelemetry-specification](https://github.com/open-telemetry/opentelemetry-specification).
+
+It's especially valuable to read through the [library
+guidelines](https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/library-guidelines.md).
+
+## Useful Resources
+
+Hi! If you’re looking at this document, these resources will provide you the
+knowledge to get started as a newcomer to the OpenTelemetry project. They will
+help you understand the OpenTelemetry Project, its components, and specifically
+the C++ repository.
+
+### Reading Resources
+
+* Medium
+  [article](https://medium.com/opentelemetry/how-to-start-contributing-to-opentelemetry-b23991ad91f4)
+  (October 2019) on how to start contributing to the OpenTelemetry project.
+* Medium
+  [article](https://medium.com/opentelemetry/opentelemetry-beyond-getting-started-5ac43cd0fe26)
+  (January 2020) describing the overarching goals and use cases for
+  OpenTelemetry.
+
+### Relevant Documentation
+
+* [OpenTelemetry
+  Specification](https://github.com/open-telemetry/opentelemetry-specification)
+* The OpenTelemetry Specification describes the requirements and expectations
+  of for all OpenTelemetry implementations.
+
+* Read through the OpenTelemetry C++ documentation
+* The
+    [API](https://opentelemetry-cpp.readthedocs.io/en/latest/api/api.html)
+    and
+    [SDK](https://opentelemetry-cpp.readthedocs.io/en/latest/sdk/sdk.html)
+    documentation provides a lot of information on what the classes and their
+    functions are used for.
+
+Please contribute! You’re welcome to add more information if you come across any
+helpful resources.

+ 139 - 0
ext/opentelemetry-cpp-1.21.0/DEPRECATED.md

@@ -0,0 +1,139 @@
+# Deprecated
+
+This document lists all the items currently deprecated in opentelemetry-cpp.
+
+Deprecated items will be removed in the future.
+
+## Guidelines
+
+### Maintainer guidelines
+
+See the [deprecation-process](./docs/deprecation-process.md)
+
+## [TEMPLATE]
+
+### New Deprecation Title (Template)
+
+#### Announcement (Template)
+
+#### Motivation (Template)
+
+#### Scope (Template)
+
+#### Mitigation (Template)
+
+#### Planned removal (Template)
+
+## [Platforms]
+
+N/A
+
+## [Compilers]
+
+N/A
+
+## [Third party dependencies]
+
+N/A
+
+## [Build tools]
+
+N/A
+
+## [Build scripts]
+
+N/A
+
+## [opentelemetry-cpp API]
+
+N/A
+
+## [opentelemetry-cpp SDK]
+
+N/A
+
+## [opentelemetry-cpp Exporter]
+
+N/A
+
+## [Documentation]
+
+N/A
+
+## Semantic conventions
+
+### Header files "semantic_conventions.h"
+
+#### Announcement (semantic_conventions.h)
+
+Deprecation is announced as part of the migration to weaver:
+
+* `Version:` release following opentelemetry-cpp 1.17.0
+* `Date:` Nov 9, 2024
+* `PR:` [PR 3105](https://github.com/open-telemetry/opentelemetry-cpp/pull/3105)
+
+#### Motivation (semantic_conventions.h)
+
+The header files for semantic conventions are generated automatically.
+The tooling to generate these files is changing:
+
+* before, the build-tool repository was used
+* now, the weaver repository is used
+
+Changes in tooling allows to generate code that is better organized,
+with dedicated header files per group of semantic conventions,
+instead of a single header file for everything.
+
+#### Scope (semantic_conventions.h)
+
+The following files:
+
+* `api/include/opentelemetry/trace/semantic_conventions.h`
+* `sdk/include/opentelemetry/sdk/resource/semantic_conventions.h`
+
+are now deprecated.
+
+They correspond to semantic conventions v1.27.0,
+and will no longer be maintained up to date.
+
+These files will be removed in the future.
+
+#### Mitigation (semantic_conventions.h)
+
+Two things have changed:
+
+* the header file to use
+* the symbol name to use.
+
+Before, the semantic convention for `url.full` was:
+
+* declared in file `semantic_conventions.h`
+* declared as symbol `SemanticConventions::kUrlFull`
+
+Now, the `url.full` convention, which is part or the `url` group, is:
+
+* declared in file `semconv/url_attributes.h`
+* declared as symbol `semconv::url::kUrlFull`
+
+Application code that uses semantic conventions must be adjusted
+accordingly.
+
+In addition, semantic conventions that are not marked as stable
+are generated in a different header file, placed under directory
+`incubating`, to better separate stable and non stable code.
+
+For example, file `semconv/incubating/url_attributes.h`
+defines `semconv::url::kUrlDomain`,
+which is not marked as stable in semconv v1.27.0
+
+#### Planned removal (semantic_conventions.h)
+
+The following files:
+
+* `api/include/opentelemetry/trace/semantic_conventions.h`
+* `sdk/include/opentelemetry/sdk/resource/semantic_conventions.h`
+
+will be removed.
+
+The removal date is planned for July 1, 2025.
+This allows more than six months for applications to adjust.

+ 452 - 0
ext/opentelemetry-cpp-1.21.0/INSTALL.md

@@ -0,0 +1,452 @@
+# Building opentelemetry-cpp
+
+[CMake](https://cmake.org/) and [Bazel](https://bazel.build) are the official
+build systems for opentelemetry-cpp.
+
+## Dependencies
+
+You can link OpenTelemetry C++ SDK with libraries provided in
+[dependencies.md](https://github.com/open-telemetry/opentelemetry-cpp/blob/main/docs/dependencies.md)
+(complete list of libraries with versions used in our CI can be found
+[here](https://github.com/open-telemetry/opentelemetry-cpp/blob/main/third_party_release)).
+
+## Build instructions using CMake
+
+### Prerequisites for CMake build
+
+- A supported platform (e.g. Windows, macOS or Linux). Refer to [Platforms
+  Supported](./README.md#supported-development-platforms) for more information.
+- A compatible C++ compiler supporting at least C++14. Major compilers are
+  supported. Refer to [Supported Compilers](./README.md#supported-c-versions)
+  for more information.
+- [Git](https://git-scm.com/) for fetching opentelemetry-cpp source code from
+  repository. To install Git, consult the [Set up
+  Git](https://help.github.com/articles/set-up-git/) guide on GitHub.
+- [CMake](https://cmake.org/) for building opentelemetry-cpp API, SDK with their
+  unittests. The minimum CMake version is 3.14.
+  CMake 3.15+ is recommended on Windows due to known CI test failures with 3.14.
+  To install CMake,
+  consult the [Installing CMake](https://cmake.org/install/) guide.
+- [GoogleTest](https://github.com/google/googletest) framework to build and run
+  the unittests. Refer to
+  [third_party_release](https://github.com/open-telemetry/opentelemetry-cpp/blob/main/third_party_release#L5)
+  for version of GoogleTest used in CI. To install GoogleTest, consult the
+  [GoogleTest Build
+  Instructions](https://github.com/google/googletest/blob/master/googletest/README.md#generic-build-instructions).
+- [Google Benchmark](https://github.com/google/benchmark) framework to build and
+  run benchmark tests. Refer to
+  [third_party_release](https://github.com/open-telemetry/opentelemetry-cpp/blob/main/third_party_release#L4)
+  for version of Benchmark used in CI. To install Benchmark, consult the
+  [GoogleBenchmark Build
+  Instructions](https://github.com/google/benchmark#installation).
+- Apart from above core requirements, the Exporters and Propagators have their
+  build dependencies.
+
+### Building dependencies for the OTLP exporters
+
+The opentelemetry-cpp OTLP exporters depend on Protobuf and gRPC
+ (in the case of the otlp grpc exporters).
+Protobuf (since version 3.22.0) and gRPC depend on Abseil.
+For cmake builds, it is best practice to build and install Abseil
+, Protobuf, and gPRC as independent packages -
+configuring cmake for Protobuf and gRPC to build against
+ the installed packages instead of using their submodule option.
+
+If building and installing Protobuf and gRPC manually with cmake the
+ recommended approach is:
+
+1. Choose the desired tag version of grpc. Find the compatible versions of abseil
+ and protobuf by inspecting the submodules of grpc at that tag.
+2. Build and install the required version of abseil
+3. Build and install the required version of protobuf
+    - Set the cmake option of Protobuf to build against the installed
+     package of Abseil (`protobuf_ABSL_PROVIDER=package`)
+4. Build and install the required version of grpc
+    - Set the cmake option of grpc to build against the installed packages
+     of Abseil and Protobuf (cmake options - `gRPC_ABSL_PROVIDER=package` and `gRPC_PROTOBUF_PROVIDER=package`)
+
+### Building as standalone CMake Project
+
+1. Getting the opentelemetry-cpp source with its submodules:
+
+   ```console
+   # Change to the directory where you want to create the code repository
+   $ cd ~
+   $ mkdir source && cd source && git clone --recurse-submodules https://github.com/open-telemetry/opentelemetry-cpp
+   Cloning into 'opentelemetry-cpp'...
+   ...
+   Resolving deltas: 100% (3225/3225), done.
+   $
+   ```
+
+2. Navigate to the repository cloned above, and create the `CMake` build
+   configuration.
+
+   ```console
+   $ cd opentelemetry-cpp
+   $ mkdir build && cd build && cmake ..
+   -- The C compiler identification is GNU 9.3.0
+   -- The CXX compiler identification is GNU 9.3.0
+   ...
+   -- Configuring done
+   -- Generating done
+   -- Build files have been written to: /home/<user>/source/opentelemetry-cpp/build
+   $
+   ```
+
+   Some of the available cmake build variables we can use during cmake
+   configuration:
+
+   - `-DCMAKE_POSITION_INDEPENDENT_CODE=ON` : Please note that with default
+     configuration, the code is compiled without `-fpic` option, so it is not
+     suitable for inclusion in shared libraries. To enable the code for
+     inclusion in shared libraries, this variable is used.
+   - `-DBUILD_SHARED_LIBS=ON` : To build shared libraries for the targets.
+      Please refer to note [below](#building-shared-libs-for-windows) for
+      Windows DLL support.
+   - `-DWITH_OTLP_GRPC=ON` : To enable building OTLP GRPC exporter.
+   - `-DWITH_OTLP_HTTP=ON` : To enable building OTLP HTTP exporter.
+   - `-DWITH_PROMETHEUS=ON` : To enable building prometheus exporter.
+   - `-DOPENTELEMETRY_INSTALL=ON`: To install `otel-cpp` library needed
+      for external code linking.
+
+3. Once the build configuration is created, build the CMake targets - this
+   includes building SDKs and unittests for API and SDK. Note that since API is
+   header only library, no separate build is triggered for it.
+
+   ```console
+   $ cmake --build . --target all
+   Scanning dependencies of target timestamp_test
+   [  0%] Building CXX object api/test/core/CMakeFiles/timestamp_test.dir/timestamp_test.cc.o
+   [  1%] Linking CXX executable timestamp_test
+   ...
+   Scanning dependencies of target w3c_tracecontext_test
+   [ 99%] Building CXX object ext/test/w3c_tracecontext_test/CMakeFiles/w3c_tracecontext_test.dir/main.cc.o
+   [100%] Linking CXX executable w3c_tracecontext_test
+   [100%] Built target w3c_tracecontext_test
+   $
+   ```
+
+4. Once CMake tests are built, run them with `ctest` command
+
+   ```console
+   $ ctest
+   Test project /tmp/opentelemetry-cpp/build
+        Start   1: trace.SystemTimestampTest.Construction
+   ...
+        Start 380: ext.http.urlparser.UrlParserTests.BasicTests
+   ...
+   100% tests passed, 0 tests failed out of 380
+   $
+   ```
+
+5. Optionally install the header files for API, and generated targets and header
+   files for SDK at custom/default install location.
+
+   ```console
+   $ cmake --install . --prefix /<install-root>/
+   -- Installing: /<install-root>/lib/cmake/opentelemetry-cpp/opentelemetry-cpp-config.cmake
+   -- Installing: /<install-root>/lib/cmake/opentelemetry-cpp/opentelemetry-cpp-config-version.cmake
+   ...
+   $
+   ```
+
+### Incorporating into an external CMake Project
+
+There are two approaches to incoporate `opentelemetry-cpp` into
+ an external CMake project:
+
+1. Build and install `opentelemetry-cpp` then use `find_package`
+ to import its targets
+
+   ```cmake
+   # Find all installed components and link all imported targets
+   find_package(opentelemetry-cpp CONFIG REQUIRED)
+   ...
+   target_include_directories(foo PRIVATE ${OPENTELEMETRY_CPP_INCLUDE_DIRS})
+   target_link_libraries(foo PRIVATE ${OPENTELEMETRY_CPP_LIBRARIES})
+   ```
+
+   ```cmake
+   # Find a specific component and link its imported target(s)
+   find_package(opentelemetry-cpp CONFIG REQUIRED COMPONENTS api)
+   ...
+   target_link_libraries(foo PRIVATE opentelemetry-cpp::api)
+   ```
+
+2. Use CMake's [FetchContent](https://cmake.org/cmake/help/latest/module/FetchContent.html)
+ module to fetch and build `opentelemetry-cpp` then make its targets available
+
+   ```cmake
+   # Fetch from an existing clone and build
+   include(FetchContent)
+   FetchContent_Declare(opentelemetry-cpp SOURCE_DIR "<path/to/opentelemetry-cpp>")
+   FetchContent_MakeAvailable(opentelemetry-cpp)
+   ...
+   target_link_libraries(foo PRIVATE opentelemetry-cpp::api)
+   ```
+
+   ```cmake
+   # Clone and build opentelemetry-cpp from a git tag
+   include(FetchContent)
+   FetchContent_Declare(
+   opentelemetry-cpp
+   GIT_REPOSITORY https://github.com/open-telemetry/opentelemetry-cpp.git
+   GIT_TAG        v1.20.0)
+   FetchContent_MakeAvailable(opentelemetry-cpp)
+   ...
+   target_link_libraries(foo PRIVATE opentelemetry-cpp::api)
+   ```
+
+In both cases the project's built or imported CMake targets will be
+ available in the `opentelemetry-cpp` namespace (ie: `opentelemetry-cpp::api`)
+
+#### Using opentelemetry-cpp package components
+
+> **Note:** `opentelemetry-cpp` CMake package components were introduced in `v1.21.0`
+
+The `opentelemetry-cpp` package supports using the `COMPONENTS` argument to
+`find_package`. The following example illustrates using this feature to include
+and link the `api` header only target to an instrumented `foo_lib` while only including
+and linking the `sdk` and `otlp_grpc_exporter` targets to the `foo_app`.
+
+```cmake
+# foo_lib/CMakeLists.txt
+find_package(opentelemetry-cpp CONFIG REQUIRED COMPONENTS api)
+add_library(foo_lib foo.cpp)
+target_link_libraries(foo_lib PRIVATE opentelemetry-cpp::api)
+```
+
+```cmake
+# foo_app/CMakeLists.txt
+find_package(opentelemetry-cpp CONFIG REQUIRED COMPONENTS api sdk exporters_otlp_grpc)
+add_executable(foo_app main.cpp)
+target_link_libraries(foo_app PRIVATE foo_lib opentelemetry-cpp::api opentelemetry-cpp::trace opentelemetry-cpp::otlp_grpc_exporter )
+```
+
+The following table provides the mapping between components and targets. Components
+and targets available in the installation depends on the opentelemetry-cpp package
+build configuration.
+
+> **Note:** components `exporters_elasticsearch` and `exporters_etw`
+ may be moved out of the core package and to `opentelemetry-cpp-contrib`
+  in a future release
+
+| Component                  | Targets                                                                                          |
+|----------------------------|--------------------------------------------------------------------------------------------------|
+| **api**                    | opentelemetry-cpp::api                                                                           |
+| **sdk**                    | opentelemetry-cpp::sdk                                                                           |
+|                            | opentelemetry-cpp::version                                                                       |
+|                            | opentelemetry-cpp::common                                                                        |
+|                            | opentelemetry-cpp::resources                                                                     |
+|                            | opentelemetry-cpp::trace                                                                         |
+|                            | opentelemetry-cpp::metrics                                                                       |
+|                            | opentelemetry-cpp::logs                                                                          |
+| **ext_common**             | opentelemetry-cpp::ext                                                                           |
+| **ext_http_curl**          | opentelemetry-cpp::http_client_curl                                                              |
+| **ext_dll**                | opentelemetry-cpp::opentelemetry_cpp                                                             |
+| **exporters_in_memory**    | opentelemetry-cpp::in_memory_span_exporter                                                       |
+|                            | opentelemetry-cpp::in_memory_metric_exporter                                                     |
+| **exporters_ostream**      | opentelemetry-cpp::ostream_log_record_exporter                                                   |
+|                            | opentelemetry-cpp::ostream_metrics_exporter                                                      |
+|                            | opentelemetry-cpp::ostream_span_exporter                                                         |
+| **exporters_otlp_common**  | opentelemetry-cpp::proto                                                                         |
+|                            | opentelemetry-cpp::otlp_recordable                                                               |
+| **exporters_otlp_file**    | opentelemetry-cpp::otlp_file_client                                                              |
+|                            | opentelemetry-cpp::otlp_file_exporter                                                            |
+|                            | opentelemetry-cpp::otlp_file_log_record_exporter                                                 |
+|                            | opentelemetry-cpp::otlp_file_metric_exporter                                                     |
+| **exporters_otlp_grpc**    | opentelemetry-cpp::proto_grpc                                                                    |
+|                            | opentelemetry-cpp::otlp_grpc_client                                                              |
+|                            | opentelemetry-cpp::otlp_grpc_exporter                                                            |
+|                            | opentelemetry-cpp::otlp_grpc_log_record_exporter                                                 |
+|                            | opentelemetry-cpp::otlp_grpc_metrics_exporter                                                    |
+| **exporters_otlp_http**    | opentelemetry-cpp::otlp_http_client                                                              |
+|                            | opentelemetry-cpp::otlp_http_exporter                                                            |
+|                            | opentelemetry-cpp::otlp_http_log_record_exporter                                                 |
+|                            | opentelemetry-cpp::otlp_http_metric_exporter                                                     |
+| **exporters_prometheus**   | opentelemetry-cpp::prometheus_exporter                                                           |
+| **exporters_elasticsearch**| opentelemetry-cpp::elasticsearch_log_record_exporter                                             |
+| **exporters_etw**          | opentelemetry-cpp::etw_exporter                                                                  |
+| **exporters_zipkin**       | opentelemetry-cpp::zipkin_trace_exporter                                                         |
+| **shims_opentracing**      | opentelemetry-cpp::opentracing_shim                                                              |
+
+## Build instructions using Bazel
+
+NOTE: Experimental, and not supported for all the components. Make sure the
+[GoogleTest](https://github.com/google/googletest) installation may fail if
+there is a different version of googletest already installed in system-defined
+path.
+
+### Prerequisites for Bazel build
+
+- A supported platform (e.g. Windows, macOS or Linux). Refer to [Platforms
+Supported](./README.md#supported-development-platforms) for more information.
+- A compatible C++ compiler supporting at least C++14. Major compilers are
+supported. Refer to [Supported Compilers](./README.md#supported-c-versions) for
+more information.
+- [Git](https://git-scm.com/) for fetching opentelemetry-cpp source code from
+repository. To install Git, consult the [Set up
+Git](https://help.github.com/articles/set-up-git/) guide on GitHub.
+- [Bazel](https://www.bazel.build/) for building opentelemetry-cpp API, SDK with
+their unittests. We use 3.7.2 in our build system.
+
+To install Bazel, consult the [Installing
+Bazel](https://docs.bazel.build/versions/3.7.0/install.html) guide.
+
+### Building as standalone Bazel Project
+
+1. Getting the opentelemetry-cpp source:
+
+   ```console
+   # Change to the directory where you want to create the code repository
+   $ cd ~
+   $ mkdir source && cd source
+   $ git clone https://github.com/open-telemetry/opentelemetry-cpp
+   Cloning into 'opentelemetry-cpp'...
+   ...
+   Resolving deltas: 100% (3225/3225), done.
+   $
+   ```
+
+2. Navigate to the repository cloned above, download the dependencies and build
+   the source code:
+
+   ```console
+   $ cd opentelemetry-cpp
+   $ bazel build //...
+   bazel build -- //... -//exporters/otlp/... -//exporters/prometheus/...
+   Extracting Bazel installation...
+   Starting local Bazel server and connecting to it...
+   INFO: Analyzed 121 targets (98 packages loaded, 3815 targets configured).
+   INFO: Found 121 targets...
+   INFO: From Compiling sdk/src/trace/tracer_context.cc:
+   ...
+
+   ```
+
+3. Once Bazel tests are built, run them with `bazel test //...` command
+
+   ```console
+   $ bazel test //...
+   ..
+   $
+   ```
+
+4. The build artifacts will be located under `bazel-bin`
+
+### Incorporating into an existing Bazel Project
+
+- WORKSPACE file:
+
+```console
+http_archive(
+    name = "io_opentelemetry_cpp",
+    sha256 = "<sha256>",
+    strip_prefix = "opentelemetry-cpp-1.0.1",
+    urls = [
+        "https://github.com/open-telemetry/opentelemetry-cpp/archive/refs/tags/v1.0.1.tar.gz"
+    ],
+)
+
+# Load OpenTelemetry dependencies after load.
+load("@io_opentelemetry_cpp//bazel:repository.bzl", "opentelemetry_cpp_deps")
+
+opentelemetry_cpp_deps()
+
+# (required after v1.8.0) Load extra dependencies required for OpenTelemetry
+load("@io_opentelemetry_cpp//bazel:extra_deps.bzl", "opentelemetry_extra_deps")
+
+opentelemetry_extra_deps()
+
+# Load gRPC dependencies after load.
+load("@com_github_grpc_grpc//bazel:grpc_deps.bzl", "grpc_deps")
+
+grpc_deps()
+
+# Load extra gRPC dependencies due to https://github.com/grpc/grpc/issues/20511
+load("@com_github_grpc_grpc//bazel:grpc_extra_deps.bzl", "grpc_extra_deps")
+
+grpc_extra_deps()
+
+```
+
+- Component level BUILD file:
+
+```console
+cc_library(
+   name = "<name>"
+   ...
+   deps = [
+      "@io_opentelemetry_cpp//api",
+      "@io_opentelemetry_cpp//exporters/otlp:otlp_exporter",
+      "@io_opentelemetry_cpp//sdk/src/trace",
+      ...
+   ],
+   ...
+)
+```
+
+## Building shared libs for Windows
+
+Windows DLL build is supported under **preview**. Please check the
+[doc](./docs/build-as-dll.md) for more details.
+
+## Generating binary packages
+
+OpenTelemetry C++ supports generating platform specific binary packages from CMake
+configuration. The packages generated through this mayn't be production ready,
+and user may have to customize it further before using it as distribution.
+
+- Linux : deb, rpm, tgz
+- MacOS : tgz
+- Windows : NuGet, zip
+
+This requires platform specific package generators already installed. The package
+generation can subsequently be enabled by using BUILD_PACKAGE option during cmake
+configuration
+
+   ```console
+   $ cd opentelemetry-cpp
+   $ mkdir build && cd build && cmake -DBUILD_PACKAGE=ON ..
+
+   -- Package name: opentelemetry-cpp-1.8.1-ubuntu-20.04-x86_64.deb
+   -- Configuring done
+   -- Generating done
+   ...
+   $
+   ```
+
+Once build is complete as specified in [standalone build section](#building-as-standalone-cmake-project),
+the package can be generated as below.
+
+   ```console
+   $ cpack -C debug
+   CPack: Create package using DEB
+   ...
+   CPack: - package: /home/<user>/opentelemetry-cpp/build/opentelemetry-cpp-1.8.1-ubuntu-20.04-x86_64.deb generated.
+   $
+   ```
+
+## Using Package Managers
+
+If you are using [Conan](https://www.conan.io/) to manage your dependencies, add
+[`opentelemetry-cpp/x.y.z`](https://conan.io/center/opentelemetry-cpp) to your
+`conanfile`'s requires, where `x.y.z` is the release version you want to use.
+Please file issues [here](https://github.com/conan-io/conan-center-index/issues)
+if you experience problems with the packages.
+
+If you are using [vcpkg](https://github.com/Microsoft/vcpkg/) on your project
+for external dependencies, then you can install the [opentelemetry-cpp
+package](https://github.com/microsoft/vcpkg/tree/master/ports/opentelemetry-cpp)
+with `vcpkg install opentelemetry-cpp` and follow the then displayed
+descriptions. Please see the vcpkg project for any issues regarding the
+packaging.
+
+If you are using [alpine linux](https://www.alpinelinux.org/) you can install
+the [opentelemetry-cpp packages](https://pkgs.alpinelinux.org/packages?name=opentelemetry-cpp-*)
+with `apk add -X http://dl-cdn.alpinelinux.org/alpine/edge/testing opentelemetry-cpp-dev`.
+
+Please note, these packages are not officially provided and maintained by
+OpenTelemetry C++ project, and are just listed here to consolidate all such
+efforts for ease of developers.

+ 201 - 0
ext/opentelemetry-cpp-1.21.0/LICENSE

@@ -0,0 +1,201 @@
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright [yyyy] [name of copyright owner]
+
+   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.

+ 25 - 0
ext/opentelemetry-cpp-1.21.0/MODULE.bazel

@@ -0,0 +1,25 @@
+# Copyright The OpenTelemetry Authors
+# SPDX-License-Identifier: Apache-2.0
+
+module(
+    name = "opentelemetry-cpp",
+    version = "1.21.0",
+    compatibility_level = 0,
+    repo_name = "io_opentelemetry_cpp",
+)
+
+bazel_dep(name = "abseil-cpp", version = "20240116.1", repo_name = "com_google_absl")
+bazel_dep(name = "bazel_skylib", version = "1.5.0")
+bazel_dep(name = "curl", version = "8.8.0")
+bazel_dep(name = "grpc", version = "1.63.1.bcr.1", repo_name = "com_github_grpc_grpc")
+bazel_dep(name = "nlohmann_json", version = "3.12.0", repo_name = "github_nlohmann_json")
+bazel_dep(name = "opentelemetry-proto", version = "1.6.0", repo_name = "com_github_opentelemetry_proto")
+bazel_dep(name = "opentracing-cpp", version = "1.6.0", repo_name = "com_github_opentracing")
+bazel_dep(name = "platforms", version = "0.0.8")
+bazel_dep(name = "prometheus-cpp", version = "1.3.0", repo_name = "com_github_jupp0r_prometheus_cpp")
+bazel_dep(name = "protobuf", version = "26.0", repo_name = "com_google_protobuf")
+bazel_dep(name = "rules_proto", version = "5.3.0-21.7")
+bazel_dep(name = "zlib", version = "1.3.1.bcr.1")
+
+bazel_dep(name = "google_benchmark", version = "1.8.3", dev_dependency = True, repo_name = "com_github_google_benchmark")
+bazel_dep(name = "googletest", version = "1.14.0.bcr.1", dev_dependency = True, repo_name = "com_google_googletest")

+ 127 - 0
ext/opentelemetry-cpp-1.21.0/README.md

@@ -0,0 +1,127 @@
+# OpenTelemetry C++
+
+[![Slack](https://img.shields.io/badge/slack-@cncf/otel/cpp-brightgreen.svg?logo=slack)](https://cloud-native.slack.com/archives/C01N3AT62SJ)
+[![codecov.io](https://codecov.io/gh/open-telemetry/opentelemetry-cpp/branch/main/graphs/badge.svg?)](https://codecov.io/gh/open-telemetry/opentelemetry-cpp/)
+[![Build
+Status](https://github.com/open-telemetry/opentelemetry-cpp/actions/workflows/ci.yml/badge.svg?branch=main)](https://github.com/open-telemetry/opentelemetry-cpp/actions)
+[![Release](https://img.shields.io/github/v/release/open-telemetry/opentelemetry-cpp?include_prereleases&style=)](https://github.com/open-telemetry/opentelemetry-cpp/releases/)
+[![FOSSA License Status](https://app.fossa.com/api/projects/custom%2B162%2Fgithub.com%2Fopen-telemetry%2Fopentelemetry-cpp.svg?type=shield&issueType=license)](https://app.fossa.com/projects/custom%2B162%2Fgithub.com%2Fopen-telemetry%2Fopentelemetry-cpp?ref=badge_shield&issueType=license)
+[![FOSSA Security Status](https://app.fossa.com/api/projects/custom%2B162%2Fgithub.com%2Fopen-telemetry%2Fopentelemetry-cpp.svg?type=shield&issueType=security)](https://app.fossa.com/projects/custom%2B162%2Fgithub.com%2Fopen-telemetry%2Fopentelemetry-cpp?ref=badge_shield&issueType=security)
+
+The C++ [OpenTelemetry](https://opentelemetry.io/) client.
+
+## Project Status
+
+**Stable** across all 3 signals i.e. `Logs`, `Metrics`, and `Traces`.
+
+See [Spec Compliance
+Matrix](https://github.com/open-telemetry/opentelemetry-specification/blob/main/spec-compliance-matrix.md)
+to understand which portions of the specification has been implemented in this
+repo.
+
+## Supported C++ Versions
+
+Code shipped from this repository generally supports the following versions of
+C++ standards:
+
+* ISO/IEC 14882:2014 (C++14)
+* ISO/IEC 14882:2017 (C++17)
+* ISO/IEC 14882:2020 (C++20)
+
+Any exceptions to this are noted in the individual `README.md` files.
+
+Please note that supporting the [C Programming
+Language](https://en.wikipedia.org/wiki/C_(programming_language)) is not a goal
+of the current project.
+
+## Supported Development Platforms
+
+ Our CI pipeline builds and tests on following `x86-64` platforms:
+
+| Platform                                                            |   Build type  |
+|---------------------------------------------------------------------|---------------|
+| ubuntu-22.04 (GCC 10, GCC 12, Clang 14)                             | CMake, Bazel  |
+| ubuntu-20.04 (GCC 9.4.0 - default compiler)                         | CMake, Bazel  |
+| ubuntu-20.04 (GCC 9.4.0 with -std=c++14/17/20 flags)                | CMake, Bazel  |
+| macOS 12.7 (Xcode 14.2)                                             | Bazel         |
+| Windows Server 2019 (Visual Studio Enterprise 2019)                 | CMake, Bazel  |
+| Windows Server 2022 (Visual Studio Enterprise 2022)                 | CMake         |
+
+In general, the code shipped from this repository should build on all platforms
+having C++ compiler with [supported C++ standards](#supported-c-versions).
+
+## Dependencies
+
+Please refer to [Dependencies.md](docs/dependencies.md) for OSS Dependencies and
+license requirements.
+
+## Installation
+
+Please refer to [INSTALL.md](./INSTALL.md).
+
+## Getting Started
+
+As an application owner or the library author, you can find the getting started
+guide and reference documentation on
+[opentelemetry-cpp.readthedocs.io](https://opentelemetry-cpp.readthedocs.io/en/latest/)
+
+The `examples/simple` directory contains a minimal program demonstrating how to
+instrument a small library using a simple `processor` and console `exporter`,
+along with build files for CMake and Bazel.
+
+## Contributing
+
+See [CONTRIBUTING.md](CONTRIBUTING.md)
+
+We meet weekly, and the time of the meeting alternates between Monday at 13:00
+PT and Wednesday at 9:00 PT. The meeting is subject to change depending on
+contributors' availability. Check the [OpenTelemetry community
+calendar](https://github.com/open-telemetry/community#calendar)
+for specific dates and Zoom meeting links.
+
+Meeting notes are available as a public [Google
+doc](https://docs.google.com/document/d/1i1E4-_y4uJ083lCutKGDhkpi3n4_e774SBLi9hPLocw/edit?usp=sharing).
+For edit access, get in touch on
+[Slack](https://cloud-native.slack.com/archives/C01N3AT62SJ).
+
+[Maintainers](https://github.com/open-telemetry/community/blob/main/community-membership.md#maintainer)
+([@open-telemetry/cpp-maintainers](https://github.com/orgs/open-telemetry/teams/cpp-maintainers)):
+
+* [Ehsan Saei](https://github.com/esigo)
+* [Lalit Kumar Bhasin](https://github.com/lalitb), Microsoft
+* [Marc Alff](https://github.com/marcalff), Oracle
+* [Tom Tan](https://github.com/ThomsonTan), Microsoft
+
+[Approvers](https://github.com/open-telemetry/community/blob/main/community-membership.md#approver)
+([@open-telemetry/cpp-approvers](https://github.com/orgs/open-telemetry/teams/cpp-approvers)):
+
+* [Doug Barker](https://github.com/dbarker)
+* [Josh Suereth](https://github.com/jsuereth), Google
+* [Pranav Sharma](https://github.com/psx95), Google
+* [WenTao Ou](https://github.com/owent), Tencent
+
+[Emeritus
+Maintainer/Approver/Triager](https://github.com/open-telemetry/community/blob/main/community-membership.md#emeritus-maintainerapprovertriager):
+
+* [Alolita Sharma](https://github.com/alolita)
+* [Emil Mikulic](https://github.com/g-easy)
+* [Jodee Varney](https://github.com/jodeev)
+* [Johannes Tax](https://github.com/pyohannes)
+* [Max Golovanov](https://github.com/maxgolov)
+* [Reiley Yang](https://github.com/reyang)
+* [Ryan Burn](https://github.com/rnburn)
+
+### Thanks to all the people who have contributed
+
+[![contributors](https://contributors-img.web.app/image?repo=open-telemetry/opentelemetry-cpp)](https://github.com/open-telemetry/opentelemetry-cpp/graphs/contributors)
+
+## Release Schedule
+
+See the [release
+notes](https://github.com/open-telemetry/opentelemetry-cpp/releases) for
+existing releases.
+
+See the [project
+milestones](https://github.com/open-telemetry/opentelemetry-cpp/milestones) for
+details on upcoming releases. The dates and features described in issues and
+milestones are estimates, and subject to change.

+ 96 - 0
ext/opentelemetry-cpp-1.21.0/RELEASING.md

@@ -0,0 +1,96 @@
+# Release Process
+
+## Pre Release
+
+1: Upgrade to latest [dependencies](docs/maintaining-dependencies.md)
+if required.
+
+2: Make sure all relevant changes for this release are included under
+`Unreleased` section in `CHANGELOG.md` and are in language that non-contributors
+to the project can understand.
+
+3: Run the pre-release script. It creates a branch `pre_release_<new-tag>` and
+updates `CHANGELOG.md` with the `<new-tag>`:
+
+```sh
+./buildscripts/pre_release.sh -t <new-tag>
+```
+
+4: Verify that CHANGELOG.md is updated properly:
+
+```sh
+git diff main
+```
+
+5: Push the changes to upstream and create a Pull Request on GitHub. Be sure to
+include the curated changes from the [Changelog](./CHANGELOG.md) in the
+description.
+
+## Tag
+
+Once the above Pull Request has been approved and merged it is time to tag the
+merged commit.
+
+***IMPORTANT***: It is critical you use the same tag that you used in the
+Pre-Release step! Failure to do so will leave things in a broken state.
+
+1: Note down the commit hash of the master branch after above PR request is
+merged: `<commit-hash>`
+
+```sh
+git show -s --format=%H
+```
+
+2: Create a github tag on this commit hash:
+
+```sh
+git tag -a "<new-tag>" -s -m "Version <new-tag>" "<commit-hash>"
+```
+
+3: Push tag to upstream remote
+
+```sh
+git push upstream
+```
+
+## Versioning
+
+Once tag is created, it's time to use that tag for Runtime Versioning
+
+1: Create a new brach for updating version information in
+`./sdk/src/version.cc`.
+
+```sh
+git checkout -b update_version_${tag} master
+```
+
+2: Run the pre-commit script to update the version:
+
+```sh
+./buildscripts/pre-commit
+```
+
+3: Check if any changes made since last release broke ABI compatibility. If yes,
+update `OPENTELEMETRY_ABI_VERSION_NO` in
+[version.h](api/include/opentelemetry/version.h).
+
+4: Push the changes to upstream and create a Pull Request on GitHub.
+
+5: Once changes are merged, move the tag created earlier to the new commit hash
+from step 4.
+
+```sh
+git tag -f <previous-tag> <new-commit-hash>
+git push --tags --force
+```
+
+## Release
+
+Finally create a Release for the new `<new-tag>` on GitHub. The release body
+should include all the release notes from the Changelog for this release.
+
+## Post Release
+
+Update the OpenTelemetry.io document
+[here](https://github.com/open-telemetry/opentelemetry.io/tree/main/content/en/docs/instrumentation/cpp)
+by sending a Pull Request.

+ 107 - 0
ext/opentelemetry-cpp-1.21.0/Versioning.md

@@ -0,0 +1,107 @@
+# Versioning
+
+This document describes the versioning policy for this repository.
+
+## Goals
+
+### API and SDK Compatibility
+
+Once the API for a given signal (spans, logs, metrics, baggage) has been
+officially released, that API module will function with any SDK that has the
+same MAJOR version and equal or greater MINOR or PATCH version. For example,
+application compiled with API v1.1 is compatible with SDK v1.1.2, v1.2.0, etc.
+
+For example, libraries that are instrumented with `opentelemetry 1.0.1` will
+function in applications using `opentelemetry 1.11.33` or `opentelemetry 1.3.4`,
+buy may not work in applications using `opentelemetry 2.0.0`.
+
+### ABI Stability
+
+Refer to the [ABI Policy](./docs/abi-policy.md) for more details. To summarise:
+
+* The API is header only, and uses ABI compliant interfaces. However, ABI
+  stability is not guaranteed for SDK.
+* In case of ABI breaking changes, a new `inline namespace` version will be
+  introduced, and the existing linked applications can continue using the older
+  version unless they relink with newer version.
+
+## Release Policy
+
+* Release versions will follow [SemVer 2.0](https://semver.org/).
+* Only a single source package containing the API, SDK, and exporters which are
+  required by the specification would be released. All these components are
+  always versioned and released together. For example, any changes in one of the
+  exporter would result in version update of the entire source package even
+  though there is no changes in API, SDK and other exporters.
+* Experimental releases: New (unstable) telemetry signals and features will be
+  introduced behind feature flag protected by a preprocessor macro.
+
+  ```cpp
+  #ifdef FEATURE_FLAG
+    <metrics api/sdk definitions>
+  #endif
+  ```
+
+  As we deliver the package in source form, and the user is responsible to build
+  it for their platform, the user must be aware of these feature flags
+  (documented in the [CHANGELOG.md](CHANGELOG.md) file). The user must enable
+  them explicitly through their build system (CMake, Bazel or others) to use any
+  preview features.
+
+  The guidelines in creating feature flag would be:
+
+  * Naming:
+    * `ENABLE_<SIGNAL>_PREVIEW` : For experimental release of signal api/sdks
+      eg, `METRICS_PREVIEW`, `LOGS_PREVIEW`,
+    * `ENABLE_<SIGNAL>_<FEATURE_NAME>_PREVIEW` : For experimental release for
+      any feature within stable signal. For example, `TRACING_JAEGER_PREVIEW` to
+      release the experimental Jaeger exporter for tracing.
+  * Cleanup: It is good practice to keep feature-flags as shortlived as
+    possible. And, also important to keep the number of them low. They should be
+    used such that it is easy to remove/cleanup them once the experimental
+    feature is stable.
+
+* New signals will be stabilized via a **minor version bump**, and are not
+  allowed to break existing stable interfaces. Feature flags will be removed
+  once we have a stable implementation for the signal.
+
+* As an exception, small experimental features in otherwise stable
+  signals/components mayn't necessarily be released under feature flag. These
+  would be flagged as experimental by adding a `NOTE` in it's header file -
+  either at the beginning of file, or as the comment for the experimental API
+  methods. Also, if the complete header is experimental, it would be prefixed as
+  `experimental_`. As an example, the semantic conventions for trace signal is
+  experimental at the time of the writing and is within
+  `experimental_semantic_conventions.h`
+
+* Code under the "*::detail" namespace implements internal details, and is NOT
+  part of public interface. Also, any API not documented in the [public
+  documentation](https://opentelemetry-cpp.readthedocs.io/en/latest/) is NOT
+  part of the public interface.
+
+* GitHub releases will be made for all released versions.
+
+## Example Versioning Lifecycle
+
+Purely for illustration purposes, not intended to represent actual releases:
+
+* v0.0.1 release:
+  * Contains experimental API and SDK of trace (without feature flag)
+  * No API and SDK of logging and metrics available
+* v1.0.0-rc1 release:
+  * Pre-release, no API/ABI guarantees, but more stable than alpha/beta.
+  * Contains pre-release API and SDK of trace, baggage and resource
+  * experimental metrics and logging API/SDK behind feature flag
+* v1.0.0: ( with traces )
+  * Contains stable API and SDK of trace, baggage and resource
+  * experimental metrics and logging API/SDK behind feature flag
+* v1.5.0 release (with metrics)
+  * Contains stable API and SDK of metrics, trace, baggage, resource.
+  * experimental logging API/SDK behind feature flag
+* v1.10.0 release (with logging)
+  * Contains stable API and SDK of logging, metrics, trace, baggage, resource.
+
+### Before moving to version 1.0.0
+
+* Major version zero (0.y.z) is for initial development. Anything MAY change at
+  any time. The public API SHOULD NOT be considered stable.

+ 23 - 0
ext/opentelemetry-cpp-1.21.0/WORKSPACE

@@ -0,0 +1,23 @@
+# Copyright The OpenTelemetry Authors
+# SPDX-License-Identifier: Apache-2.0
+
+workspace(name = "io_opentelemetry_cpp")
+
+# Load our direct dependencies.
+load("//bazel:repository.bzl", "opentelemetry_cpp_deps")
+
+opentelemetry_cpp_deps()
+
+load("//bazel:extra_deps.bzl", "opentelemetry_extra_deps")
+
+opentelemetry_extra_deps()
+
+# Load gRPC dependencies after load.
+load("@com_github_grpc_grpc//bazel:grpc_deps.bzl", "grpc_deps")
+
+grpc_deps()
+
+# Load extra gRPC dependencies due to https://github.com/grpc/grpc/issues/20511
+load("@com_github_grpc_grpc//bazel:grpc_extra_deps.bzl", "grpc_extra_deps")
+
+grpc_extra_deps()

+ 4 - 0
ext/opentelemetry-cpp-1.21.0/WORKSPACE.bzlmod

@@ -0,0 +1,4 @@
+# Copyright The OpenTelemetry Authors
+# SPDX-License-Identifier: Apache-2.0
+
+# Disables the default WORKSPACE when using bzlmod

+ 81 - 0
ext/opentelemetry-cpp-1.21.0/api/BUILD

@@ -0,0 +1,81 @@
+# Copyright The OpenTelemetry Authors
+# SPDX-License-Identifier: Apache-2.0
+
+load("@bazel_skylib//rules:common_settings.bzl", "bool_flag", "int_flag", "string_flag")
+
+package(default_visibility = ["//visibility:public"])
+
+CPP_STDLIBS = [
+    "none",
+    "best",
+    "2014",
+    "2017",
+    "2020",
+    "2023",
+]
+
+string_flag(
+    name = "with_cxx_stdlib",
+    build_setting_default = "best",
+    values = CPP_STDLIBS,
+)
+
+cc_library(
+    name = "api",
+    hdrs = glob(["include/**/*.h"]),
+    defines = select({
+        ":set_cxx_stdlib_none": [],
+        ### automatic selection
+        ":set_cxx_stdlib_best": ["OPENTELEMETRY_STL_VERSION=(__cplusplus/100)"],
+        # See https://learn.microsoft.com/en-us/cpp/build/reference/zc-cplusplus
+        ":set_cxx_stdlib_best_and_msvc": ["OPENTELEMETRY_STL_VERSION=(_MSVC_LANG/100)"],
+        ### manual selection
+        ":set_cxx_stdlib_2014": ["OPENTELEMETRY_STL_VERSION=2014"],
+        ":set_cxx_stdlib_2017": ["OPENTELEMETRY_STL_VERSION=2017"],
+        ":set_cxx_stdlib_2020": ["OPENTELEMETRY_STL_VERSION=2020"],
+        ":set_cxx_stdlib_2023": ["OPENTELEMETRY_STL_VERSION=2023"],
+        "//conditions:default": [],
+    }) + select({
+        ":abi_version_no_1": ["OPENTELEMETRY_ABI_VERSION_NO=1"],
+        ":abi_version_no_2": ["OPENTELEMETRY_ABI_VERSION_NO=2"],
+    }),
+    strip_include_prefix = "include",
+    tags = ["api"],
+    deps = [
+        "@com_google_absl//absl/base",
+        "@com_google_absl//absl/strings",
+        "@com_google_absl//absl/types:variant",
+    ],
+)
+
+[config_setting(
+    name = "set_cxx_stdlib_%s" % v,
+    flag_values = {":with_cxx_stdlib": v},
+) for v in CPP_STDLIBS]
+
+config_setting(
+    name = "set_cxx_stdlib_best_and_msvc",
+    constraint_values = ["@bazel_tools//tools/cpp:msvc"],
+    flag_values = {":with_cxx_stdlib": "best"},
+)
+
+bool_flag(
+    name = "with_abseil",
+    build_setting_default = False,
+    deprecation = "The value of this flag is ignored. Bazel builds always depend on Abseil for its pre-adopted `std::` types. You should remove this flag from your build command.",
+)
+
+int_flag(
+    name = "abi_version_no",
+    build_setting_default = 1,
+)
+
+config_setting(
+    name = "abi_version_no_1",
+    flag_values = {":abi_version_no": "1"},
+)
+
+config_setting(
+    name = "abi_version_no_2",
+    flag_values = {":abi_version_no": "2"},
+)

+ 140 - 0
ext/opentelemetry-cpp-1.21.0/api/CMakeLists.txt

@@ -0,0 +1,140 @@
+# Copyright The OpenTelemetry Authors
+# SPDX-License-Identifier: Apache-2.0
+
+add_library(opentelemetry_api INTERFACE)
+target_include_directories(
+  opentelemetry_api
+  INTERFACE "$<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}/include>"
+            "$<INSTALL_INTERFACE:include>")
+
+set_target_properties(opentelemetry_api PROPERTIES EXPORT_NAME api)
+
+otel_add_component(
+  COMPONENT
+  api
+  TARGETS
+  opentelemetry_api
+  FILES_DIRECTORY
+  "include/opentelemetry"
+  FILES_DESTINATION
+  "include"
+  FILES_MATCHING
+  PATTERN
+  "*.h")
+
+if(OPENTELEMETRY_INSTALL)
+  unset(TARGET_DEPS)
+endif()
+
+if(BUILD_TESTING)
+  add_subdirectory(test)
+endif()
+
+if(WITH_NO_DEPRECATED_CODE)
+  target_compile_definitions(opentelemetry_api
+                             INTERFACE OPENTELEMETRY_NO_DEPRECATED_CODE)
+endif()
+
+if(WITH_STL STREQUAL "OFF")
+  message(STATUS "Building WITH_STL=OFF")
+elseif(WITH_STL STREQUAL "CXX11")
+  message(STATUS "Building WITH_STL=CXX11")
+  target_compile_definitions(opentelemetry_api
+                             INTERFACE OPENTELEMETRY_STL_VERSION=2011)
+elseif(WITH_STL STREQUAL "CXX14")
+  message(STATUS "Building WITH_STL=CXX14")
+  target_compile_definitions(opentelemetry_api
+                             INTERFACE OPENTELEMETRY_STL_VERSION=2014)
+elseif(WITH_STL STREQUAL "CXX17")
+  message(STATUS "Building WITH_STL=CXX17")
+  target_compile_definitions(opentelemetry_api
+                             INTERFACE OPENTELEMETRY_STL_VERSION=2017)
+elseif(WITH_STL STREQUAL "CXX20")
+  message(STATUS "Building WITH_STL=CXX20")
+  target_compile_definitions(opentelemetry_api
+                             INTERFACE OPENTELEMETRY_STL_VERSION=2020)
+elseif(WITH_STL STREQUAL "CXX23")
+  message(STATUS "Building WITH_STL=CXX23")
+  target_compile_definitions(opentelemetry_api
+                             INTERFACE OPENTELEMETRY_STL_VERSION=2023)
+elseif(WITH_STL STREQUAL "ON")
+  message(STATUS "Building WITH_STL=ON")
+  # "ON" corresponds to "CXX23" at this time.
+  target_compile_definitions(opentelemetry_api
+                             INTERFACE OPENTELEMETRY_STL_VERSION=2023)
+else()
+  message(
+    FATAL_ERROR "WITH_STL must be ON, OFF, CXX11, CXX14, CXX17, CXX20 or CXX23")
+endif()
+
+if(WITH_GSL)
+  target_compile_definitions(opentelemetry_api INTERFACE HAVE_GSL)
+
+  # Guidelines Support Library path. Used if we are not on not get C++20.
+  #
+  find_package(Microsoft.GSL QUIET)
+  if(TARGET Microsoft.GSL::GSL)
+    target_link_libraries(opentelemetry_api INTERFACE Microsoft.GSL::GSL)
+    list(APPEND TARGET_DEPS "gsl")
+  else()
+    set(GSL_DIR third_party/ms-gsl)
+    target_include_directories(
+      opentelemetry_api INTERFACE "$<BUILD_INTERFACE:${GSL_DIR}/include>")
+  endif()
+endif()
+
+if(WITH_NO_GETENV)
+  target_compile_definitions(opentelemetry_api INTERFACE NO_GETENV)
+endif()
+
+if(WIN32)
+  if(WITH_ETW)
+    target_compile_definitions(opentelemetry_api INTERFACE HAVE_MSGPACK)
+  endif()
+endif()
+
+if(WITH_ASYNC_EXPORT_PREVIEW)
+  target_compile_definitions(opentelemetry_api INTERFACE ENABLE_ASYNC_EXPORT)
+endif()
+
+target_compile_definitions(
+  opentelemetry_api
+  INTERFACE OPENTELEMETRY_ABI_VERSION_NO=${OPENTELEMETRY_ABI_VERSION_NO})
+
+if(WITH_OTLP_RETRY_PREVIEW)
+  target_compile_definitions(opentelemetry_api
+                             INTERFACE ENABLE_OTLP_RETRY_PREVIEW)
+endif()
+
+if(WITH_OTLP_GRPC_SSL_MTLS_PREVIEW)
+  target_compile_definitions(opentelemetry_api
+                             INTERFACE ENABLE_OTLP_GRPC_SSL_MTLS_PREVIEW)
+endif()
+
+if(WITH_METRICS_EXEMPLAR_PREVIEW)
+  target_compile_definitions(opentelemetry_api
+                             INTERFACE ENABLE_METRICS_EXEMPLAR_PREVIEW)
+endif()
+
+if(WITH_THREAD_INSTRUMENTATION_PREVIEW)
+  target_compile_definitions(opentelemetry_api
+                             INTERFACE ENABLE_THREAD_INSTRUMENTATION_PREVIEW)
+endif()
+
+if(WITH_OTLP_HTTP_COMPRESSION)
+  target_compile_definitions(opentelemetry_api
+                             INTERFACE ENABLE_OTLP_COMPRESSION_PREVIEW)
+endif()
+
+if(APPLE)
+  target_link_libraries(opentelemetry_api INTERFACE "-framework CoreFoundation")
+endif()
+
+include(${PROJECT_SOURCE_DIR}/cmake/pkgconfig.cmake)
+
+if(OPENTELEMETRY_INSTALL)
+  opentelemetry_add_pkgconfig(
+    api "OpenTelemetry API"
+    "A header-only library to support instrumentation with OpenTelemetry."
+    "${TARGET_DEPS}")
+endif()

+ 299 - 0
ext/opentelemetry-cpp-1.21.0/api/include/opentelemetry/baggage/baggage.h

@@ -0,0 +1,299 @@
+// Copyright The OpenTelemetry Authors
+// SPDX-License-Identifier: Apache-2.0
+
+#pragma once
+
+#include <cctype>
+
+#include "opentelemetry/common/kv_properties.h"
+#include "opentelemetry/common/macros.h"
+#include "opentelemetry/nostd/shared_ptr.h"
+#include "opentelemetry/nostd/string_view.h"
+#include "opentelemetry/version.h"
+
+OPENTELEMETRY_BEGIN_NAMESPACE
+
+namespace baggage
+{
+
+class OPENTELEMETRY_EXPORT Baggage
+{
+public:
+  static constexpr size_t kMaxKeyValuePairs = 180;
+  static constexpr size_t kMaxKeyValueSize  = 4096;
+  static constexpr size_t kMaxSize          = 8192;
+  static constexpr char kKeyValueSeparator  = '=';
+  static constexpr char kMembersSeparator   = ',';
+  static constexpr char kMetadataSeparator  = ';';
+
+  Baggage() noexcept : kv_properties_(new common::KeyValueProperties()) {}
+  Baggage(size_t size) noexcept : kv_properties_(new common::KeyValueProperties(size)) {}
+
+  template <class T>
+  Baggage(const T &keys_and_values) noexcept
+      : kv_properties_(new common::KeyValueProperties(keys_and_values))
+  {}
+
+  OPENTELEMETRY_API_SINGLETON static nostd::shared_ptr<Baggage> GetDefault()
+  {
+    static nostd::shared_ptr<Baggage> baggage{new Baggage()};
+    return baggage;
+  }
+
+  /* Get value for key in the baggage
+     @returns true if key is found, false otherwise
+  */
+  bool GetValue(nostd::string_view key, std::string &value) const noexcept
+  {
+    return kv_properties_->GetValue(key, value);
+  }
+
+  /* Returns shared_ptr of new baggage object which contains new key-value pair. If key or value is
+     invalid, copy of current baggage is returned
+  */
+  nostd::shared_ptr<Baggage> Set(const nostd::string_view &key,
+                                 const nostd::string_view &value) noexcept
+  {
+
+    nostd::shared_ptr<Baggage> baggage(new Baggage(kv_properties_->Size() + 1));
+    const bool valid_kv = IsValidKey(key) && IsValidValue(value);
+
+    if (valid_kv)
+    {
+      baggage->kv_properties_->AddEntry(key, value);
+    }
+
+    // add rest of the fields.
+    kv_properties_->GetAllEntries(
+        [&baggage, &key, &valid_kv](nostd::string_view e_key, nostd::string_view e_value) {
+          // if key or value was not valid, add all the entries. Add only remaining entries
+          // otherwise.
+          if (!valid_kv || key != e_key)
+          {
+            baggage->kv_properties_->AddEntry(e_key, e_value);
+          }
+
+          return true;
+        });
+
+    return baggage;
+  }
+
+  // @return all key-values entries by repeatedly invoking the function reference passed as argument
+  // for each entry
+  bool GetAllEntries(
+      nostd::function_ref<bool(nostd::string_view, nostd::string_view)> callback) const noexcept
+  {
+    return kv_properties_->GetAllEntries(callback);
+  }
+
+  // delete key from the baggage if it exists. Returns shared_ptr of new baggage object.
+  // if key does not exist, copy of current baggage is returned.
+  // Validity of key is not checked as invalid keys should never be populated in baggage in the
+  // first place.
+  nostd::shared_ptr<Baggage> Delete(nostd::string_view key) noexcept
+  {
+    // keeping size of baggage same as key might not be found in it
+    nostd::shared_ptr<Baggage> baggage(new Baggage(kv_properties_->Size()));
+    kv_properties_->GetAllEntries(
+        [&baggage, &key](nostd::string_view e_key, nostd::string_view e_value) {
+          if (key != e_key)
+            baggage->kv_properties_->AddEntry(e_key, e_value);
+          return true;
+        });
+    return baggage;
+  }
+
+  // Returns shared_ptr of baggage after extracting key-value pairs from header
+  static nostd::shared_ptr<Baggage> FromHeader(nostd::string_view header) noexcept
+  {
+    if (header.size() > kMaxSize)
+    {
+      // header size exceeds maximum threshold, return empty baggage
+      return GetDefault();
+    }
+
+    common::KeyValueStringTokenizer kv_str_tokenizer(header);
+    size_t cnt = kv_str_tokenizer.NumTokens();  // upper bound on number of kv pairs
+    if (cnt > kMaxKeyValuePairs)
+    {
+      cnt = kMaxKeyValuePairs;
+    }
+
+    nostd::shared_ptr<Baggage> baggage(new Baggage(cnt));
+    bool kv_valid;
+    nostd::string_view key, value;
+
+    while (kv_str_tokenizer.next(kv_valid, key, value) && baggage->kv_properties_->Size() < cnt)
+    {
+      if (!kv_valid || (key.size() + value.size() > kMaxKeyValueSize))
+      {
+        // if kv pair is not valid, skip it
+        continue;
+      }
+
+      // NOTE : metadata is kept as part of value only as it does not have any semantic meaning.
+      // but, we need to extract it (else Decode on value will return error)
+      nostd::string_view metadata;
+      auto metadata_separator = value.find(kMetadataSeparator);
+      if (metadata_separator != std::string::npos)
+      {
+        metadata = value.substr(metadata_separator);
+        value    = value.substr(0, metadata_separator);
+      }
+
+      bool err       = 0;
+      auto key_str   = UrlDecode(common::StringUtil::Trim(key), err);
+      auto value_str = UrlDecode(common::StringUtil::Trim(value), err);
+
+      if (err == false && IsValidKey(key_str) && IsValidValue(value_str))
+      {
+        if (!metadata.empty())
+        {
+          value_str.append(metadata.data(), metadata.size());
+        }
+        baggage->kv_properties_->AddEntry(key_str, value_str);
+      }
+    }
+
+    return baggage;
+  }
+
+  // Creates string from baggage object.
+  std::string ToHeader() const noexcept
+  {
+    std::string header_s;
+    bool first = true;
+    kv_properties_->GetAllEntries([&](nostd::string_view key, nostd::string_view value) {
+      if (!first)
+      {
+        header_s.push_back(kMembersSeparator);
+      }
+      else
+      {
+        first = false;
+      }
+      header_s.append(UrlEncode(key));
+      header_s.push_back(kKeyValueSeparator);
+
+      // extracting metadata from value. We do not encode metadata
+      auto metadata_separator = value.find(kMetadataSeparator);
+      if (metadata_separator != std::string::npos)
+      {
+        header_s.append(UrlEncode(value.substr(0, metadata_separator)));
+        auto metadata = value.substr(metadata_separator);
+        header_s.append(std::string(metadata.data(), metadata.size()));
+      }
+      else
+      {
+        header_s.append(UrlEncode(value));
+      }
+      return true;
+    });
+    return header_s;
+  }
+
+private:
+  static bool IsPrintableString(nostd::string_view str)
+  {
+    for (const auto ch : str)
+    {
+      if (ch < ' ' || ch > '~')
+      {
+        return false;
+      }
+    }
+
+    return true;
+  }
+
+  static bool IsValidKey(nostd::string_view key) { return key.size() && IsPrintableString(key); }
+
+  static bool IsValidValue(nostd::string_view value) { return IsPrintableString(value); }
+
+  // Uri encode key value pairs before injecting into header
+  // Implementation inspired from : https://golang.org/src/net/url/url.go?s=7851:7884#L264
+  static std::string UrlEncode(nostd::string_view str)
+  {
+    auto to_hex = [](char c) -> char {
+      static const char *hex = "0123456789ABCDEF";
+      return hex[c & 15];
+    };
+
+    std::string ret;
+
+    for (auto c : str)
+    {
+      if (std::isalnum(c) || c == '-' || c == '_' || c == '.' || c == '~')
+      {
+        ret.push_back(c);
+      }
+      else if (c == ' ')
+      {
+        ret.push_back('+');
+      }
+      else
+      {
+        ret.push_back('%');
+        ret.push_back(to_hex(c >> 4));
+        ret.push_back(to_hex(c & 15));
+      }
+    }
+
+    return ret;
+  }
+
+  // Uri decode key value pairs after extracting from header
+  static std::string UrlDecode(nostd::string_view str, bool &err)
+  {
+    auto IsHex = [](char c) {
+      return std::isdigit(c) || (c >= 'A' && c <= 'F') || (c >= 'a' && c <= 'f');
+    };
+
+    auto from_hex = [](char c) -> char {
+      // c - '0' produces integer type which could trigger error/warning when casting to char,
+      // but the cast is safe here.
+      return static_cast<char>(std::isdigit(c) ? c - '0' : std::toupper(c) - 'A' + 10);
+    };
+
+    std::string ret;
+
+    for (size_t i = 0; i < str.size(); i++)
+    {
+      if (str[i] == '%')
+      {
+        if (i + 2 >= str.size() || !IsHex(str[i + 1]) || !IsHex(str[i + 2]))
+        {
+          err = 1;
+          return "";
+        }
+        ret.push_back(from_hex(str[i + 1]) << 4 | from_hex(str[i + 2]));
+        i += 2;
+      }
+      else if (str[i] == '+')
+      {
+        ret.push_back(' ');
+      }
+      else if (std::isalnum(str[i]) || str[i] == '-' || str[i] == '_' || str[i] == '.' ||
+               str[i] == '~')
+      {
+        ret.push_back(str[i]);
+      }
+      else
+      {
+        err = 1;
+        return "";
+      }
+    }
+
+    return ret;
+  }
+
+private:
+  // Store entries in a C-style array to avoid using std::array or std::vector.
+  nostd::unique_ptr<common::KeyValueProperties> kv_properties_;
+};
+
+}  // namespace baggage
+
+OPENTELEMETRY_END_NAMESPACE

+ 36 - 0
ext/opentelemetry-cpp-1.21.0/api/include/opentelemetry/baggage/baggage_context.h

@@ -0,0 +1,36 @@
+// Copyright The OpenTelemetry Authors
+// SPDX-License-Identifier: Apache-2.0
+
+#pragma once
+
+#include "opentelemetry/baggage/baggage.h"
+#include "opentelemetry/context/context.h"
+#include "opentelemetry/nostd/shared_ptr.h"
+#include "opentelemetry/version.h"
+
+OPENTELEMETRY_BEGIN_NAMESPACE
+
+namespace baggage
+{
+
+static const std::string kBaggageHeader = "baggage";
+
+inline nostd::shared_ptr<Baggage> GetBaggage(const context::Context &context) noexcept
+{
+  context::ContextValue context_value = context.GetValue(kBaggageHeader);
+  if (nostd::holds_alternative<nostd::shared_ptr<Baggage>>(context_value))
+  {
+    return nostd::get<nostd::shared_ptr<Baggage>>(context_value);
+  }
+  static nostd::shared_ptr<Baggage> empty_baggage{new Baggage()};
+  return empty_baggage;
+}
+
+inline context::Context SetBaggage(context::Context &context,
+                                   const nostd::shared_ptr<Baggage> &baggage) noexcept
+{
+  return context.SetValue(kBaggageHeader, baggage);
+}
+
+}  // namespace baggage
+OPENTELEMETRY_END_NAMESPACE

+ 60 - 0
ext/opentelemetry-cpp-1.21.0/api/include/opentelemetry/baggage/propagation/baggage_propagator.h

@@ -0,0 +1,60 @@
+// Copyright The OpenTelemetry Authors
+// SPDX-License-Identifier: Apache-2.0
+
+#pragma once
+
+#include <memory>
+#include <string>
+
+#include "opentelemetry/baggage/baggage.h"
+#include "opentelemetry/baggage/baggage_context.h"
+#include "opentelemetry/context/context.h"
+#include "opentelemetry/context/propagation/text_map_propagator.h"
+#include "opentelemetry/nostd/function_ref.h"
+#include "opentelemetry/nostd/string_view.h"
+#include "opentelemetry/version.h"
+
+OPENTELEMETRY_BEGIN_NAMESPACE
+namespace baggage
+{
+namespace propagation
+{
+
+class BaggagePropagator : public context::propagation::TextMapPropagator
+{
+public:
+  void Inject(context::propagation::TextMapCarrier &carrier,
+              const context::Context &context) noexcept override
+  {
+    auto baggage = baggage::GetBaggage(context);
+    auto header  = baggage->ToHeader();
+    if (header.size())
+    {
+      carrier.Set(kBaggageHeader, header);
+    }
+  }
+
+  context::Context Extract(const context::propagation::TextMapCarrier &carrier,
+                           context::Context &context) noexcept override
+  {
+    nostd::string_view baggage_str = carrier.Get(baggage::kBaggageHeader);
+    auto baggage                   = baggage::Baggage::FromHeader(baggage_str);
+
+    if (baggage->ToHeader().size())
+    {
+      return baggage::SetBaggage(context, baggage);
+    }
+    else
+    {
+      return context;
+    }
+  }
+
+  bool Fields(nostd::function_ref<bool(nostd::string_view)> callback) const noexcept override
+  {
+    return callback(kBaggageHeader);
+  }
+};
+}  // namespace propagation
+}  // namespace baggage
+OPENTELEMETRY_END_NAMESPACE

+ 82 - 0
ext/opentelemetry-cpp-1.21.0/api/include/opentelemetry/common/attribute_value.h

@@ -0,0 +1,82 @@
+// Copyright The OpenTelemetry Authors
+// SPDX-License-Identifier: Apache-2.0
+
+#pragma once
+
+#include <cstdint>
+
+#include "opentelemetry/nostd/span.h"
+#include "opentelemetry/nostd/string_view.h"
+#include "opentelemetry/nostd/variant.h"
+#include "opentelemetry/version.h"
+
+OPENTELEMETRY_BEGIN_NAMESPACE
+namespace common
+{
+/// OpenTelemetry signals can be enriched by adding attributes. The
+/// \c AttributeValue type is defined as a variant of all attribute value
+/// types the OpenTelemetry C++ API supports.
+///
+/// The following attribute value types are supported by the OpenTelemetry
+/// specification:
+///  - Primitive types: string, boolean, double precision floating point
+///    (IEEE 754-1985) or signed 64 bit integer.
+///  - Homogenous arrays of primitive type values.
+///
+/// \warning
+/// \parblock The OpenTelemetry C++ API currently supports several attribute
+/// value types that are not covered by the OpenTelemetry specification:
+///  - \c uint64_t
+///  - \c nostd::span<const uint64_t>
+///  - \c nostd::span<uint8_t>
+///
+/// Those types are reserved for future use and currently should not be
+/// used. There are no guarantees around how those values are handled by
+/// exporters.
+/// \endparblock
+using AttributeValue =
+    nostd::variant<bool,
+                   int32_t,
+                   int64_t,
+                   uint32_t,
+                   double,
+                   const char *,
+                   nostd::string_view,
+                   nostd::span<const bool>,
+                   nostd::span<const int32_t>,
+                   nostd::span<const int64_t>,
+                   nostd::span<const uint32_t>,
+                   nostd::span<const double>,
+                   nostd::span<const nostd::string_view>,
+                   // Not currently supported by the specification, but reserved for future use.
+                   // Added to provide support for all primitive C++ types.
+                   uint64_t,
+                   // Not currently supported by the specification, but reserved for future use.
+                   // Added to provide support for all primitive C++ types.
+                   nostd::span<const uint64_t>,
+                   // Not currently supported by the specification, but reserved for future use.
+                   // See https://github.com/open-telemetry/opentelemetry-specification/issues/780
+                   nostd::span<const uint8_t>>;
+
+enum AttributeType
+{
+  kTypeBool,
+  kTypeInt,
+  kTypeInt64,
+  kTypeUInt,
+  kTypeDouble,
+  kTypeCString,
+  kTypeString,
+  kTypeSpanBool,
+  kTypeSpanInt,
+  kTypeSpanInt64,
+  kTypeSpanUInt,
+  kTypeSpanDouble,
+  kTypeSpanString,
+  kTypeUInt64,
+  kTypeSpanUInt64,
+  kTypeSpanByte
+};
+
+}  // namespace common
+OPENTELEMETRY_END_NAMESPACE

+ 64 - 0
ext/opentelemetry-cpp-1.21.0/api/include/opentelemetry/common/key_value_iterable.h

@@ -0,0 +1,64 @@
+// Copyright The OpenTelemetry Authors
+// SPDX-License-Identifier: Apache-2.0
+
+#pragma once
+
+#include "opentelemetry/common/attribute_value.h"
+#include "opentelemetry/nostd/function_ref.h"
+#include "opentelemetry/nostd/string_view.h"
+#include "opentelemetry/version.h"
+
+OPENTELEMETRY_BEGIN_NAMESPACE
+namespace common
+{
+/**
+ * Supports internal iteration over a collection of key-value pairs.
+ */
+class KeyValueIterable
+{
+public:
+  virtual ~KeyValueIterable() = default;
+
+  /**
+   * Iterate over key-value pairs
+   * @param callback a callback to invoke for each key-value. If the callback returns false,
+   * the iteration is aborted.
+   * @return true if every key-value pair was iterated over
+   */
+  virtual bool ForEachKeyValue(nostd::function_ref<bool(nostd::string_view, common::AttributeValue)>
+                                   callback) const noexcept = 0;
+
+  /**
+   * @return the number of key-value pairs
+   */
+  virtual size_t size() const noexcept = 0;
+};
+
+/**
+ * Supports internal iteration over a collection of key-value pairs.
+ */
+class NoopKeyValueIterable : public KeyValueIterable
+{
+public:
+  ~NoopKeyValueIterable() override = default;
+
+  /**
+   * Iterate over key-value pairs
+   * @param callback a callback to invoke for each key-value. If the callback returns false,
+   * the iteration is aborted.
+   * @return true if every key-value pair was iterated over
+   */
+  bool ForEachKeyValue(
+      nostd::function_ref<bool(nostd::string_view, common::AttributeValue)>) const noexcept override
+  {
+    return true;
+  }
+
+  /**
+   * @return the number of key-value pairs
+   */
+  size_t size() const noexcept override { return 0; }
+};
+
+}  // namespace common
+OPENTELEMETRY_END_NAMESPACE

+ 146 - 0
ext/opentelemetry-cpp-1.21.0/api/include/opentelemetry/common/key_value_iterable_view.h

@@ -0,0 +1,146 @@
+// Copyright The OpenTelemetry Authors
+// SPDX-License-Identifier: Apache-2.0
+
+#pragma once
+
+#include <stddef.h>
+#include <initializer_list>
+#include <iterator>
+#include <type_traits>
+#include <utility>
+#include <vector>
+
+#include "opentelemetry/common/attribute_value.h"
+#include "opentelemetry/common/key_value_iterable.h"
+#include "opentelemetry/nostd/function_ref.h"
+#include "opentelemetry/nostd/span.h"
+#include "opentelemetry/nostd/string_view.h"
+#include "opentelemetry/nostd/type_traits.h"
+#include "opentelemetry/nostd/utility.h"
+#include "opentelemetry/version.h"
+
+OPENTELEMETRY_BEGIN_NAMESPACE
+namespace common
+{
+// NOTE - code within `detail` namespace implements internal details, and not part
+// of the public interface.
+namespace detail
+{
+inline void take_key_value(nostd::string_view, common::AttributeValue) {}
+
+template <class T>
+auto is_key_value_iterable_impl(T iterable)
+    -> decltype(take_key_value(std::begin(iterable)->first, std::begin(iterable)->second),
+                nostd::size(iterable),
+                std::true_type{});
+
+std::false_type is_key_value_iterable_impl(...);
+
+template <class T>
+struct is_key_value_iterable
+{
+  static const bool value = decltype(detail::is_key_value_iterable_impl(std::declval<T>()))::value;
+};
+}  // namespace detail
+
+/**
+ * @brief Container for key-value pairs that can transform every value in it to one of types
+ * listed in common::AttributeValue. It may contain value types that are not directly map'able
+ * to primitive value types. In that case the `ForEachKeyValue` method acts as a transform to
+ * convert the value type to one listed under AtributeValue (bool, int32_t, int64_t, uint32_t,
+ * uint64_t, double, nostd::string_view, or arrays of primite types). For example, if UUID,
+ * GUID, or UTF-16 string type is passed as one of values stored inside this container, the
+ * container itself may provide a custom implementation of `ForEachKeyValue` to transform the
+ * 'non-standard' type to one of the standard types.
+ */
+template <class T>
+class KeyValueIterableView final : public KeyValueIterable
+{
+
+public:
+  explicit KeyValueIterableView(const T &container) noexcept : container_{&container} {}
+
+  // KeyValueIterable
+  bool ForEachKeyValue(nostd::function_ref<bool(nostd::string_view, common::AttributeValue)>
+                           callback) const noexcept override
+  {
+    auto iter = std::begin(*container_);
+    auto last = std::end(*container_);
+    for (; iter != last; ++iter)
+    {
+      if (!callback(iter->first, iter->second))
+      {
+        return false;
+      }
+    }
+    return true;
+  }
+
+  size_t size() const noexcept override { return nostd::size(*container_); }
+
+private:
+  const T *container_;
+};
+
+template <class T, nostd::enable_if_t<detail::is_key_value_iterable<T>::value> * = nullptr>
+KeyValueIterableView<T> MakeKeyValueIterableView(const T &container) noexcept
+{
+  return KeyValueIterableView<T>(container);
+}
+
+/**
+ * Utility function to help to make a attribute view from initializer_list
+ *
+ * @param attributes
+ * @return nostd::span<const std::pair<nostd::string_view, common::AttributeValue>>
+ */
+inline static nostd::span<const std::pair<nostd::string_view, common::AttributeValue>>
+MakeAttributes(std::initializer_list<std::pair<nostd::string_view, common::AttributeValue>>
+                   attributes) noexcept
+{
+  return nostd::span<const std::pair<nostd::string_view, common::AttributeValue>>{
+      attributes.begin(), attributes.end()};
+}
+
+/**
+ * Utility function to help to make a attribute view from a span
+ *
+ * @param attributes
+ * @return nostd::span<const std::pair<nostd::string_view, common::AttributeValue>>
+ */
+inline static nostd::span<const std::pair<nostd::string_view, common::AttributeValue>>
+MakeAttributes(
+    nostd::span<const std::pair<nostd::string_view, common::AttributeValue>> attributes) noexcept
+{
+  return attributes;
+}
+
+/**
+ * Utility function to help to make a attribute view from a KeyValueIterable
+ *
+ * @param attributes
+ * @return common::KeyValueIterable
+ */
+inline static const common::KeyValueIterable &MakeAttributes(
+    const common::KeyValueIterable &attributes) noexcept
+{
+  return attributes;
+}
+
+/**
+ * Utility function to help to make a attribute view from a key-value iterable object
+ *
+ * @param attributes
+ * @return nostd::span<const std::pair<nostd::string_view, common::AttributeValue>>
+ */
+template <
+    class ArgumentType,
+    nostd::enable_if_t<common::detail::is_key_value_iterable<ArgumentType>::value> * = nullptr>
+inline static common::KeyValueIterableView<ArgumentType> MakeAttributes(
+    const ArgumentType &arg) noexcept
+{
+  return common::KeyValueIterableView<ArgumentType>(arg);
+}
+
+}  // namespace common
+OPENTELEMETRY_END_NAMESPACE

+ 272 - 0
ext/opentelemetry-cpp-1.21.0/api/include/opentelemetry/common/kv_properties.h

@@ -0,0 +1,272 @@
+// Copyright The OpenTelemetry Authors
+// SPDX-License-Identifier: Apache-2.0
+
+#pragma once
+
+#include "opentelemetry/common/key_value_iterable_view.h"
+#include "opentelemetry/common/string_util.h"
+#include "opentelemetry/nostd/function_ref.h"
+#include "opentelemetry/nostd/string_view.h"
+#include "opentelemetry/nostd/unique_ptr.h"
+#include "opentelemetry/version.h"
+
+#include <cstring>
+#include <string>
+#include <type_traits>
+
+OPENTELEMETRY_BEGIN_NAMESPACE
+namespace common
+{
+
+// Constructor parameter for KeyValueStringTokenizer
+struct KeyValueStringTokenizerOptions
+{
+  char member_separator     = ',';
+  char key_value_separator  = '=';
+  bool ignore_empty_members = true;
+};
+
+// Tokenizer for key-value headers
+class KeyValueStringTokenizer
+{
+public:
+  KeyValueStringTokenizer(
+      nostd::string_view str,
+      const KeyValueStringTokenizerOptions &opts = KeyValueStringTokenizerOptions()) noexcept
+      : str_(str), opts_(opts), index_(0)
+  {}
+
+  static nostd::string_view GetDefaultKeyOrValue()
+  {
+    static std::string default_str = "";
+    return default_str;
+  }
+
+  // Returns next key value in the string header
+  // @param valid_kv : if the found kv pair is valid or not
+  // @param key : key in kv pair
+  // @param key : value in kv pair
+  // @returns true if next kv pair was found, false otherwise.
+  bool next(bool &valid_kv, nostd::string_view &key, nostd::string_view &value) noexcept
+  {
+    valid_kv = true;
+    while (index_ < str_.size())
+    {
+      bool is_empty_pair = false;
+      size_t end         = str_.find(opts_.member_separator, index_);
+      if (end == std::string::npos)
+      {
+        end = str_.size() - 1;
+      }
+      else if (end == index_)  // empty pair. do not update end
+      {
+        is_empty_pair = true;
+      }
+      else
+      {
+        end--;
+      }
+
+      auto list_member = StringUtil::Trim(str_, index_, end);
+      if (list_member.size() == 0 || is_empty_pair)
+      {
+        // empty list member
+        index_ = end + 2 - is_empty_pair;
+        if (opts_.ignore_empty_members)
+        {
+          continue;
+        }
+
+        valid_kv = true;
+        key      = GetDefaultKeyOrValue();
+        value    = GetDefaultKeyOrValue();
+        return true;
+      }
+
+      auto key_end_pos = list_member.find(opts_.key_value_separator);
+      if (key_end_pos == std::string::npos)
+      {
+        // invalid member
+        valid_kv = false;
+      }
+      else
+      {
+        key   = list_member.substr(0, key_end_pos);
+        value = list_member.substr(key_end_pos + 1);
+      }
+
+      index_ = end + 2;
+
+      return true;
+    }
+
+    // no more entries remaining
+    return false;
+  }
+
+  // Returns total number of tokens in header string
+  size_t NumTokens() const noexcept
+  {
+    size_t cnt = 0, begin = 0;
+    while (begin < str_.size())
+    {
+      ++cnt;
+      size_t end = str_.find(opts_.member_separator, begin);
+      if (end == std::string::npos)
+      {
+        break;
+      }
+
+      begin = end + 1;
+    }
+
+    return cnt;
+  }
+
+  // Resets the iterator
+  void reset() noexcept { index_ = 0; }
+
+private:
+  nostd::string_view str_;
+  KeyValueStringTokenizerOptions opts_;
+  size_t index_;
+};
+
+// Class to store fixed size array of key-value pairs of string type
+class KeyValueProperties
+{
+  // Class to store key-value pairs of string types
+public:
+  class Entry
+  {
+  public:
+    Entry() : key_(nullptr), value_(nullptr) {}
+
+    // Copy constructor
+    Entry(const Entry &copy)
+    {
+      key_   = CopyStringToPointer(copy.key_.get());
+      value_ = CopyStringToPointer(copy.value_.get());
+    }
+
+    // Copy assignment operator
+    Entry &operator=(Entry &other)
+    {
+      key_   = CopyStringToPointer(other.key_.get());
+      value_ = CopyStringToPointer(other.value_.get());
+      return *this;
+    }
+
+    // Move contructor and assignment operator
+    Entry(Entry &&other)            = default;
+    Entry &operator=(Entry &&other) = default;
+
+    // Creates an Entry for a given key-value pair.
+    Entry(nostd::string_view key, nostd::string_view value)
+    {
+      key_   = CopyStringToPointer(key);
+      value_ = CopyStringToPointer(value);
+    }
+
+    // Gets the key associated with this entry.
+    nostd::string_view GetKey() const noexcept { return key_.get(); }
+
+    // Gets the value associated with this entry.
+    nostd::string_view GetValue() const noexcept { return value_.get(); }
+
+    // Sets the value for this entry. This overrides the previous value.
+    void SetValue(nostd::string_view value) noexcept { value_ = CopyStringToPointer(value); }
+
+  private:
+    // Store key and value as raw char pointers to avoid using std::string.
+    nostd::unique_ptr<const char[]> key_;
+    nostd::unique_ptr<const char[]> value_;
+
+    // Copies string into a buffer and returns a unique_ptr to the buffer.
+    // This is a workaround for the fact that memcpy doesn't accept a const destination.
+    nostd::unique_ptr<const char[]> CopyStringToPointer(nostd::string_view str)
+    {
+      char *temp = new char[str.size() + 1];
+      memcpy(temp, str.data(), str.size());
+      temp[str.size()] = '\0';
+      return nostd::unique_ptr<const char[]>(temp);
+    }
+  };
+
+  // Maintain the number of entries in entries_.
+  size_t num_entries_;
+
+  // Max size of allocated array
+  size_t max_num_entries_;
+
+  // Store entries in a C-style array to avoid using std::array or std::vector.
+  nostd::unique_ptr<Entry[]> entries_;
+
+public:
+  // Create Key-value list of given size
+  // @param size : Size of list.
+  KeyValueProperties(size_t size) noexcept
+      : num_entries_(0), max_num_entries_(size), entries_(new Entry[size])
+  {}
+
+  // Create Empty Key-Value list
+  KeyValueProperties() noexcept : num_entries_(0), max_num_entries_(0), entries_(nullptr) {}
+
+  template <class T, class = typename std::enable_if<detail::is_key_value_iterable<T>::value>::type>
+  KeyValueProperties(const T &keys_and_values) noexcept
+      : num_entries_(0),
+        max_num_entries_(keys_and_values.size()),
+        entries_(new Entry[max_num_entries_])
+  {
+    for (auto &e : keys_and_values)
+    {
+      Entry entry(e.first, e.second);
+      (entries_.get())[num_entries_++] = std::move(entry);
+    }
+  }
+
+  // Adds new kv pair into kv properties
+  void AddEntry(nostd::string_view key, nostd::string_view value) noexcept
+  {
+    if (num_entries_ < max_num_entries_)
+    {
+      Entry entry(key, value);
+      (entries_.get())[num_entries_++] = std::move(entry);
+    }
+  }
+
+  // Returns all kv pair entries
+  bool GetAllEntries(
+      nostd::function_ref<bool(nostd::string_view, nostd::string_view)> callback) const noexcept
+  {
+    for (size_t i = 0; i < num_entries_; i++)
+    {
+      auto &entry = (entries_.get())[i];
+      if (!callback(entry.GetKey(), entry.GetValue()))
+      {
+        return false;
+      }
+    }
+    return true;
+  }
+
+  // Return value for key if exists, return false otherwise
+  bool GetValue(nostd::string_view key, std::string &value) const noexcept
+  {
+    for (size_t i = 0; i < num_entries_; i++)
+    {
+      auto &entry = (entries_.get())[i];
+      if (entry.GetKey() == key)
+      {
+        const auto &entry_value = entry.GetValue();
+        value                   = std::string(entry_value.data(), entry_value.size());
+        return true;
+      }
+    }
+    return false;
+  }
+
+  size_t Size() const noexcept { return num_entries_; }
+};
+}  // namespace common
+OPENTELEMETRY_END_NAMESPACE

+ 523 - 0
ext/opentelemetry-cpp-1.21.0/api/include/opentelemetry/common/macros.h

@@ -0,0 +1,523 @@
+// Copyright The OpenTelemetry Authors
+// SPDX-License-Identifier: Apache-2.0
+
+#pragma once
+
+/*
+   OPENTELEMETRY_HAVE_BUILTIN&OPENTELEMETRY_HAVE_FEATURE
+
+   Checks whether the compiler supports a Clang Feature Checking Macro, and if
+   so, checks whether it supports the provided builtin function "x" where x
+   is one of the functions noted in
+   https://clang.llvm.org/docs/LanguageExtensions.html
+
+   Note: Use this macro to avoid an extra level of #ifdef __has_builtin check.
+   http://releases.llvm.org/3.3/tools/clang/docs/LanguageExtensions.html
+*/
+#if !defined(OPENTELEMETRY_HAVE_BUILTIN)
+#  ifdef __has_builtin
+#    define OPENTELEMETRY_HAVE_BUILTIN(x) __has_builtin(x)
+#  else
+#    define OPENTELEMETRY_HAVE_BUILTIN(x) 0
+#  endif
+#endif
+
+#if !defined(OPENTELEMETRY_HAVE_FEATURE)
+#  ifdef __has_feature
+#    define OPENTELEMETRY_HAVE_FEATURE(f) __has_feature(f)
+#  else
+#    define OPENTELEMETRY_HAVE_FEATURE(f) 0
+#  endif
+#endif
+
+/*
+   has feature
+
+   OPENTELEMETRY_HAVE_ATTRIBUTE
+
+   A function-like feature checking macro that is a wrapper around
+   `__has_attribute`, which is defined by GCC 5+ and Clang and evaluates to a
+   nonzero constant integer if the attribute is supported or 0 if not.
+
+   It evaluates to zero if `__has_attribute` is not defined by the compiler.
+
+   GCC: https://gcc.gnu.org/gcc-5/changes.html
+   Clang: https://clang.llvm.org/docs/LanguageExtensions.html
+*/
+#if !defined(OPENTELEMETRY_HAVE_ATTRIBUTE)
+#  ifdef __has_attribute
+#    define OPENTELEMETRY_HAVE_ATTRIBUTE(x) __has_attribute(x)
+#  else
+#    define OPENTELEMETRY_HAVE_ATTRIBUTE(x) 0
+#  endif
+#endif
+
+/*
+   OPENTELEMETRY_HAVE_CPP_ATTRIBUTE
+
+   A function-like feature checking macro that accepts C++11 style attributes.
+   It's a wrapper around `__has_cpp_attribute`, defined by ISO C++ SD-6
+   (https://en.cppreference.com/w/cpp/experimental/feature_test). If we don't
+   find `__has_cpp_attribute`, will evaluate to 0.
+*/
+#if !defined(OPENTELEMETRY_HAVE_CPP_ATTRIBUTE)
+#  if defined(__cplusplus) && defined(__has_cpp_attribute)
+// NOTE: requiring __cplusplus above should not be necessary, but
+// works around https://bugs.llvm.org/show_bug.cgi?id=23435.
+#    define OPENTELEMETRY_HAVE_CPP_ATTRIBUTE(x) __has_cpp_attribute(x)
+#  else
+#    define OPENTELEMETRY_HAVE_CPP_ATTRIBUTE(x) 0
+#  endif
+#endif
+
+/*
+   Expected usage pattern:
+
+   if OPENTELEMETRY_LIKELY_CONDITION (ptr != nullptr)
+   {
+     do_something_likely();
+   } else {
+     do_something_unlikely();
+   }
+
+   This pattern works with gcc/clang and __builtin_expect(),
+   as well as with C++20.
+   It is unclear if __builtin_expect() will be deprecated
+   in favor of C++20 [[likely]] or not.
+
+   OPENTELEMETRY_LIKELY_CONDITION is preferred over OPENTELEMETRY_LIKELY,
+   to be revisited when C++20 is required.
+*/
+
+#if !defined(OPENTELEMETRY_LIKELY_CONDITION) && defined(__cplusplus)
+// Only use likely with C++20
+#  if __cplusplus >= 202002L
+// GCC 9 has likely attribute but do not support declare it at the beginning of statement
+#    if defined(__has_cpp_attribute) && (defined(__clang__) || !defined(__GNUC__) || __GNUC__ > 9)
+#      if __has_cpp_attribute(likely)
+#        define OPENTELEMETRY_LIKELY_CONDITION(C) (C) [[likely]]
+#      endif
+#    endif
+#  endif
+#endif
+#if !defined(OPENTELEMETRY_LIKELY_CONDITION) && (defined(__clang__) || defined(__GNUC__))
+// Only use if supported by the compiler
+#  define OPENTELEMETRY_LIKELY_CONDITION(C) (__builtin_expect(!!(C), true))
+#endif
+#ifndef OPENTELEMETRY_LIKELY_CONDITION
+// Do not use likely annotations
+#  define OPENTELEMETRY_LIKELY_CONDITION(C) (C)
+#endif
+
+#if !defined(OPENTELEMETRY_UNLIKELY_CONDITION) && defined(__cplusplus)
+// Only use unlikely with C++20
+#  if __cplusplus >= 202002L
+// GCC 9 has unlikely attribute but do not support declare it at the beginning of statement
+#    if defined(__has_cpp_attribute) && (defined(__clang__) || !defined(__GNUC__) || __GNUC__ > 9)
+#      if __has_cpp_attribute(unlikely)
+#        define OPENTELEMETRY_UNLIKELY_CONDITION(C) (C) [[unlikely]]
+#      endif
+#    endif
+#  endif
+#endif
+#if !defined(OPENTELEMETRY_UNLIKELY_CONDITION) && (defined(__clang__) || defined(__GNUC__))
+// Only use if supported by the compiler
+#  define OPENTELEMETRY_UNLIKELY_CONDITION(C) (__builtin_expect(!!(C), false))
+#endif
+#ifndef OPENTELEMETRY_UNLIKELY_CONDITION
+// Do not use unlikely annotations
+#  define OPENTELEMETRY_UNLIKELY_CONDITION(C) (C)
+#endif
+
+/*
+   Expected usage pattern:
+
+   if (ptr != nullptr)
+   OPENTELEMETRY_LIKELY
+   {
+     do_something_likely();
+   } else {
+     do_something_unlikely();
+   }
+
+   This pattern works starting with C++20.
+   See https://en.cppreference.com/w/cpp/language/attributes/likely
+
+   Please use OPENTELEMETRY_LIKELY_CONDITION instead for now.
+*/
+
+#if !defined(OPENTELEMETRY_LIKELY) && defined(__cplusplus)
+// Only use likely with C++20
+#  if __cplusplus >= 202002L
+// GCC 9 has likely attribute but do not support declare it at the beginning of statement
+#    if defined(__has_cpp_attribute) && (defined(__clang__) || !defined(__GNUC__) || __GNUC__ > 9)
+#      if __has_cpp_attribute(likely)
+#        define OPENTELEMETRY_LIKELY [[likely]]
+#      endif
+#    endif
+#  endif
+#endif
+
+#ifndef OPENTELEMETRY_LIKELY
+#  define OPENTELEMETRY_LIKELY
+#endif
+
+#if !defined(OPENTELEMETRY_UNLIKELY) && defined(__cplusplus)
+// Only use unlikely with C++20
+#  if __cplusplus >= 202002L
+// GCC 9 has unlikely attribute but do not support declare it at the beginning of statement
+#    if defined(__has_cpp_attribute) && (defined(__clang__) || !defined(__GNUC__) || __GNUC__ > 9)
+#      if __has_cpp_attribute(unlikely)
+#        define OPENTELEMETRY_UNLIKELY [[unlikely]]
+#      endif
+#    endif
+#  endif
+#endif
+
+#ifndef OPENTELEMETRY_UNLIKELY
+#  define OPENTELEMETRY_UNLIKELY
+#endif
+
+/// \brief Declare variable as maybe unused
+/// usage:
+///   OPENTELEMETRY_MAYBE_UNUSED int a;
+///   class OPENTELEMETRY_MAYBE_UNUSED a;
+///   OPENTELEMETRY_MAYBE_UNUSED int a();
+///
+#if defined(__cplusplus) && __cplusplus >= 201703L
+#  define OPENTELEMETRY_MAYBE_UNUSED [[maybe_unused]]
+#elif defined(__clang__)
+#  define OPENTELEMETRY_MAYBE_UNUSED __attribute__((unused))
+#elif defined(__GNUC__) && ((__GNUC__ >= 4) || ((__GNUC__ == 3) && (__GNUC_MINOR__ >= 1)))
+#  define OPENTELEMETRY_MAYBE_UNUSED __attribute__((unused))
+#elif (defined(_MSC_VER) && _MSC_VER >= 1910) && (defined(_MSVC_LANG) && _MSVC_LANG >= 201703L)
+#  define OPENTELEMETRY_MAYBE_UNUSED [[maybe_unused]]
+#else
+#  define OPENTELEMETRY_MAYBE_UNUSED
+#endif
+
+#ifndef OPENTELEMETRY_RTTI_ENABLED
+#  if defined(__clang__)
+#    if __has_feature(cxx_rtti)
+#      define OPENTELEMETRY_RTTI_ENABLED
+#    endif
+#  elif defined(__GNUG__)
+#    if defined(__GXX_RTTI)
+#      define OPENTELEMETRY_RTTI_ENABLED
+#    endif
+#  elif defined(_MSC_VER)
+#    if defined(_CPPRTTI)
+#      define OPENTELEMETRY_RTTI_ENABLED
+#    endif
+#  endif
+#endif
+
+#if defined(__cplusplus) && __cplusplus >= 201402L
+#  define OPENTELEMETRY_DEPRECATED [[deprecated]]
+#elif defined(__clang__)
+#  define OPENTELEMETRY_DEPRECATED __attribute__((deprecated))
+#elif defined(__GNUC__)
+#  define OPENTELEMETRY_DEPRECATED __attribute__((deprecated))
+#elif defined(_MSC_VER)
+#  if _MSC_VER >= 1910 && defined(_MSVC_LANG) && _MSVC_LANG >= 201703L
+#    define OPENTELEMETRY_DEPRECATED [[deprecated]]
+#  else
+#    define OPENTELEMETRY_DEPRECATED __declspec(deprecated)
+#  endif
+#else
+#  define OPENTELEMETRY_DEPRECATED
+#endif
+
+#if defined(__cplusplus) && __cplusplus >= 201402L
+#  define OPENTELEMETRY_DEPRECATED_MESSAGE(msg) [[deprecated(msg)]]
+#elif defined(__clang__)
+#  define OPENTELEMETRY_DEPRECATED_MESSAGE(msg) __attribute__((deprecated(msg)))
+#elif defined(__GNUC__)
+#  define OPENTELEMETRY_DEPRECATED_MESSAGE(msg) __attribute__((deprecated(msg)))
+#elif defined(_MSC_VER)
+#  if _MSC_VER >= 1910 && defined(_MSVC_LANG) && _MSVC_LANG >= 201703L
+#    define OPENTELEMETRY_DEPRECATED_MESSAGE(msg) [[deprecated(msg)]]
+#  else
+#    define OPENTELEMETRY_DEPRECATED_MESSAGE(msg) __declspec(deprecated(msg))
+#  endif
+#else
+#  define OPENTELEMETRY_DEPRECATED_MESSAGE(msg)
+#endif
+
+// Regex support
+#if (__GNUC__ == 4 && (__GNUC_MINOR__ == 8 || __GNUC_MINOR__ == 9))
+#  define OPENTELEMETRY_HAVE_WORKING_REGEX 0
+#else
+#  define OPENTELEMETRY_HAVE_WORKING_REGEX 1
+#endif
+
+/* clang-format off */
+
+/**
+  @page HEADER_ONLY_SINGLETON Header only singleton.
+
+  @section ELF_SINGLETON
+
+  For clang and gcc, the desired coding pattern is as follows.
+
+  @verbatim
+  class Foo
+  {
+    // (a)
+    __attribute__((visibility("default")))
+    // (b)
+    T& get_singleton()
+    {
+      // (c)
+      static T singleton;
+      return singleton;
+    }
+  };
+  @endverbatim
+
+  (a) is needed when the code is build with
+  @code -fvisibility="hidden" @endcode
+  to ensure that all instances of (b) are visible to the linker.
+
+  What is duplicated in the binary is @em code, in (b).
+
+  The linker will make sure only one instance
+  of all the (b) methods is used.
+
+  (c) is a singleton implemented inside a method.
+
+  This is very desirable, because:
+
+  - the C++ compiler guarantees that construction
+    of the variable (c) is thread safe.
+
+  - constructors for (c) singletons are executed in code path order,
+    or not at all if the singleton is never used.
+
+  @section OTHER_SINGLETON
+
+  For other platforms, header only singletons are not supported at this
+point.
+
+  @section CODING_PATTERN
+
+  The coding pattern to use in the source code is as follows
+
+  @verbatim
+  class Foo
+  {
+    OPENTELEMETRY_API_SINGLETON
+    T& get_singleton()
+    {
+      static T singleton;
+      return singleton;
+    }
+  };
+  @endverbatim
+*/
+
+/* clang-format on */
+
+#if defined(__clang__)
+
+#  define OPENTELEMETRY_API_SINGLETON __attribute__((visibility("default")))
+#  define OPENTELEMETRY_LOCAL_SYMBOL __attribute__((visibility("hidden")))
+
+#elif defined(__GNUC__)
+
+#  define OPENTELEMETRY_API_SINGLETON __attribute__((visibility("default")))
+#  define OPENTELEMETRY_LOCAL_SYMBOL __attribute__((visibility("hidden")))
+
+#else
+
+/* Add support for other compilers here. */
+
+#  define OPENTELEMETRY_API_SINGLETON
+#  define OPENTELEMETRY_LOCAL_SYMBOL
+
+#endif
+
+//
+// Atomic wrappers based on compiler intrinsics for memory read/write.
+// The tailing number is read/write length in bits.
+//
+// N.B. Compiler intrinsic is used because the usage of C++ standard library is restricted in the
+// OpenTelemetry C++ API.
+//
+#if defined(__GNUC__)
+
+#  define OPENTELEMETRY_ATOMIC_READ_8(ptr) __atomic_load_n(ptr, __ATOMIC_SEQ_CST)
+#  define OPENTELEMETRY_ATOMIC_WRITE_8(ptr, value) __atomic_store_n(ptr, value, __ATOMIC_SEQ_CST)
+
+#elif defined(_MSC_VER)
+
+#  include <intrin.h>
+
+#  define OPENTELEMETRY_ATOMIC_READ_8(ptr) \
+    static_cast<uint8_t>(_InterlockedCompareExchange8(reinterpret_cast<char *>(ptr), 0, 0))
+#  define OPENTELEMETRY_ATOMIC_WRITE_8(ptr, value) \
+    _InterlockedExchange8(reinterpret_cast<char *>(ptr), static_cast<char>(value))
+
+#else
+#  error port atomics read/write for the current platform
+#endif
+
+/* clang-format on */
+//
+// The if/elif order matters here. If both OPENTELEMETRY_BUILD_IMPORT_DLL and
+// OPENTELEMETRY_BUILD_EXPORT_DLL are defined, the former takes precedence.
+//
+// TODO: consider define OPENTELEMETRY_EXPORT for cygwin/gcc, see below link.
+// https://gcc.gnu.org/wiki/Visibility#How_to_use_the_new_C.2B-.2B-_visibility_support
+//
+#if defined(_MSC_VER) && defined(OPENTELEMETRY_BUILD_IMPORT_DLL)
+
+#  define OPENTELEMETRY_EXPORT __declspec(dllimport)
+
+#elif defined(_MSC_VER) && defined(OPENTELEMETRY_BUILD_EXPORT_DLL)
+
+#  define OPENTELEMETRY_EXPORT __declspec(dllexport)
+
+#else
+
+//
+// build OpenTelemetry as static library or not on Windows.
+//
+#  define OPENTELEMETRY_EXPORT
+
+#endif
+
+// OPENTELEMETRY_HAVE_EXCEPTIONS
+//
+// Checks whether the compiler both supports and enables exceptions. Many
+// compilers support a "no exceptions" mode that disables exceptions.
+//
+// Generally, when OPENTELEMETRY_HAVE_EXCEPTIONS is not defined:
+//
+// * Code using `throw` and `try` may not compile.
+// * The `noexcept` specifier will still compile and behave as normal.
+// * The `noexcept` operator may still return `false`.
+//
+// For further details, consult the compiler's documentation.
+#ifndef OPENTELEMETRY_HAVE_EXCEPTIONS
+#  if defined(__clang__) && ((__clang_major__ * 100) + __clang_minor__) < 306
+// Clang < 3.6
+// http://releases.llvm.org/3.6.0/tools/clang/docs/ReleaseNotes.html#the-exceptions-macro
+#    if defined(__EXCEPTIONS) && OPENTELEMETRY_HAVE_FEATURE(cxx_exceptions)
+#      define OPENTELEMETRY_HAVE_EXCEPTIONS 1
+#    endif  // defined(__EXCEPTIONS) && OPENTELEMETRY_HAVE_FEATURE(cxx_exceptions)
+#  elif OPENTELEMETRY_HAVE_FEATURE(cxx_exceptions)
+#    define OPENTELEMETRY_HAVE_EXCEPTIONS 1
+// Handle remaining special cases and default to exceptions being supported.
+#  elif !(defined(__GNUC__) && !defined(__EXCEPTIONS) && !defined(__cpp_exceptions)) && \
+      !(defined(_MSC_VER) && !defined(_CPPUNWIND))
+#    define OPENTELEMETRY_HAVE_EXCEPTIONS 1
+#  endif
+#endif
+#ifndef OPENTELEMETRY_HAVE_EXCEPTIONS
+#  define OPENTELEMETRY_HAVE_EXCEPTIONS 0
+#endif
+
+/*
+   OPENTELEMETRY_ATTRIBUTE_LIFETIME_BOUND indicates that a resource owned by a function
+   parameter or implicit object parameter is retained by the return value of the
+   annotated function (or, for a parameter of a constructor, in the value of the
+   constructed object). This attribute causes warnings to be produced if a
+   temporary object does not live long enough.
+
+   When applied to a reference parameter, the referenced object is assumed to be
+   retained by the return value of the function. When applied to a non-reference
+   parameter (for example, a pointer or a class type), all temporaries
+   referenced by the parameter are assumed to be retained by the return value of
+   the function.
+
+   See also the upstream documentation:
+   https://clang.llvm.org/docs/AttributeReference.html#lifetimebound
+*/
+#ifndef OPENTELEMETRY_ATTRIBUTE_LIFETIME_BOUND
+#  if OPENTELEMETRY_HAVE_CPP_ATTRIBUTE(clang::lifetimebound)
+#    define OPENTELEMETRY_ATTRIBUTE_LIFETIME_BOUND [[clang::lifetimebound]]
+#  elif OPENTELEMETRY_HAVE_ATTRIBUTE(lifetimebound)
+#    define OPENTELEMETRY_ATTRIBUTE_LIFETIME_BOUND __attribute__((lifetimebound))
+#  else
+#    define OPENTELEMETRY_ATTRIBUTE_LIFETIME_BOUND
+#  endif
+#endif
+
+// OPENTELEMETRY_HAVE_MEMORY_SANITIZER
+//
+// MemorySanitizer (MSan) is a detector of uninitialized reads. It consists of
+// a compiler instrumentation module and a run-time library.
+#ifndef OPENTELEMETRY_HAVE_MEMORY_SANITIZER
+#  if !defined(__native_client__) && OPENTELEMETRY_HAVE_FEATURE(memory_sanitizer)
+#    define OPENTELEMETRY_HAVE_MEMORY_SANITIZER 1
+#  else
+#    define OPENTELEMETRY_HAVE_MEMORY_SANITIZER 0
+#  endif
+#endif
+
+#if OPENTELEMETRY_HAVE_MEMORY_SANITIZER && OPENTELEMETRY_HAVE_ATTRIBUTE(no_sanitize_memory)
+#  define OPENTELEMETRY_SANITIZER_NO_MEMORY \
+    __attribute__((no_sanitize_memory))  // __attribute__((no_sanitize("memory")))
+#else
+#  define OPENTELEMETRY_SANITIZER_NO_MEMORY
+#endif
+
+// OPENTELEMETRY_HAVE_THREAD_SANITIZER
+//
+// ThreadSanitizer (TSan) is a fast data race detector.
+#ifndef OPENTELEMETRY_HAVE_THREAD_SANITIZER
+#  if defined(__SANITIZE_THREAD__)
+#    define OPENTELEMETRY_HAVE_THREAD_SANITIZER 1
+#  elif OPENTELEMETRY_HAVE_FEATURE(thread_sanitizer)
+#    define OPENTELEMETRY_HAVE_THREAD_SANITIZER 1
+#  else
+#    define OPENTELEMETRY_HAVE_THREAD_SANITIZER 0
+#  endif
+#endif
+
+#if OPENTELEMETRY_HAVE_THREAD_SANITIZER && OPENTELEMETRY_HAVE_ATTRIBUTE(no_sanitize_thread)
+#  define OPENTELEMETRY_SANITIZER_NO_THREAD \
+    __attribute__((no_sanitize_thread))  // __attribute__((no_sanitize("thread")))
+#else
+#  define OPENTELEMETRY_SANITIZER_NO_THREAD
+#endif
+
+// OPENTELEMETRY_HAVE_ADDRESS_SANITIZER
+//
+// AddressSanitizer (ASan) is a fast memory error detector.
+#ifndef OPENTELEMETRY_HAVE_ADDRESS_SANITIZER
+#  if defined(__SANITIZE_ADDRESS__)
+#    define OPENTELEMETRY_HAVE_ADDRESS_SANITIZER 1
+#  elif OPENTELEMETRY_HAVE_FEATURE(address_sanitizer)
+#    define OPENTELEMETRY_HAVE_ADDRESS_SANITIZER 1
+#  else
+#    define OPENTELEMETRY_HAVE_ADDRESS_SANITIZER 0
+#  endif
+#endif
+
+// OPENTELEMETRY_HAVE_HWADDRESS_SANITIZER
+//
+// Hardware-Assisted AddressSanitizer (or HWASAN) is even faster than asan
+// memory error detector which can use CPU features like ARM TBI, Intel LAM or
+// AMD UAI.
+#ifndef OPENTELEMETRY_HAVE_HWADDRESS_SANITIZER
+#  if defined(__SANITIZE_HWADDRESS__)
+#    define OPENTELEMETRY_HAVE_HWADDRESS_SANITIZER 1
+#  elif OPENTELEMETRY_HAVE_FEATURE(hwaddress_sanitizer)
+#    define OPENTELEMETRY_HAVE_HWADDRESS_SANITIZER 1
+#  else
+#    define OPENTELEMETRY_HAVE_HWADDRESS_SANITIZER 0
+#  endif
+#endif
+
+#if OPENTELEMETRY_HAVE_ADDRESS_SANITIZER && OPENTELEMETRY_HAVE_ATTRIBUTE(no_sanitize_address)
+#  define OPENTELEMETRY_SANITIZER_NO_ADDRESS \
+    __attribute__((no_sanitize_address))  // __attribute__((no_sanitize("address")))
+#elif OPENTELEMETRY_HAVE_ADDRESS_SANITIZER && defined(_MSC_VER) && _MSC_VER >= 1928
+#  define OPENTELEMETRY_SANITIZER_NO_ADDRESS __declspec(no_sanitize_address)
+#elif OPENTELEMETRY_HAVE_HWADDRESS_SANITIZER && OPENTELEMETRY_HAVE_ATTRIBUTE(no_sanitize)
+#  define OPENTELEMETRY_SANITIZER_NO_ADDRESS __attribute__((no_sanitize("hwaddress")))
+#else
+#  define OPENTELEMETRY_SANITIZER_NO_ADDRESS
+#endif

+ 133 - 0
ext/opentelemetry-cpp-1.21.0/api/include/opentelemetry/common/spin_lock_mutex.h

@@ -0,0 +1,133 @@
+// Copyright The OpenTelemetry Authors
+// SPDX-License-Identifier: Apache-2.0
+
+#pragma once
+
+#include <atomic>
+#include <chrono>
+#include <thread>
+
+#include "opentelemetry/version.h"
+
+#if defined(_MSC_VER)
+#  define _WINSOCKAPI_  // stops including winsock.h
+#  include <windows.h>
+#elif defined(__i386__) || defined(__x86_64__)
+#  if defined(__clang__)
+#    include <emmintrin.h>
+#  elif defined(__INTEL_COMPILER)
+#    include <immintrin.h>
+#  endif
+#endif
+
+OPENTELEMETRY_BEGIN_NAMESPACE
+namespace common
+{
+
+constexpr int SPINLOCK_FAST_ITERATIONS = 100;
+constexpr int SPINLOCK_SLEEP_MS        = 1;
+
+/**
+ * A Mutex which uses atomic flags and spin-locks instead of halting threads.
+ *
+ * This mutex uses an incremental back-off strategy with the following phases:
+ * 1. A tight spin-lock loop (pending: using hardware PAUSE/YIELD instructions)
+ * 2. A loop where the current thread yields control after checking the lock.
+ * 3. Issuing a thread-sleep call before starting back in phase 1.
+ *
+ * This is meant to give a good balance of perofrmance and CPU consumption in
+ * practice.
+ *
+ * This mutex uses an incremental back-off strategy with the following phases:
+ * 1. A tight spin-lock loop (pending: using hardware PAUSE/YIELD instructions)
+ * 2. A loop where the current thread yields control after checking the lock.
+ * 3. Issuing a thread-sleep call before starting back in phase 1.
+ *
+ * This is meant to give a good balance of perofrmance and CPU consumption in
+ * practice.
+ *
+ * This class implements the `BasicLockable` specification:
+ * https://en.cppreference.com/w/cpp/named_req/BasicLockable
+ */
+class SpinLockMutex
+{
+public:
+  SpinLockMutex() noexcept {}
+  ~SpinLockMutex() noexcept                       = default;
+  SpinLockMutex(const SpinLockMutex &)            = delete;
+  SpinLockMutex &operator=(const SpinLockMutex &) = delete;
+
+  static inline void fast_yield() noexcept
+  {
+// Issue a Pause/Yield instruction while spinning.
+#if defined(_MSC_VER)
+    YieldProcessor();
+#elif defined(__i386__) || defined(__x86_64__)
+#  if defined(__clang__) || defined(__INTEL_COMPILER)
+    _mm_pause();
+#  else
+    __builtin_ia32_pause();
+#  endif
+#elif defined(__armel__) || defined(__ARMEL__)
+    asm volatile("nop" ::: "memory");
+#elif defined(__arm__) || defined(__aarch64__)  // arm big endian / arm64
+    __asm__ __volatile__("yield" ::: "memory");
+#else
+    // TODO: Issue PAGE/YIELD on other architectures.
+#endif
+  }
+
+  /**
+   * Attempts to lock the mutex.  Return immediately with `true` (success) or `false` (failure).
+   */
+  bool try_lock() noexcept
+  {
+    return !flag_.load(std::memory_order_relaxed) &&
+           !flag_.exchange(true, std::memory_order_acquire);
+  }
+
+  /**
+   * Blocks until a lock can be obtained for the current thread.
+   *
+   * This mutex will spin the current CPU waiting for the lock to be available.  This can have
+   * decent performance in scenarios where there is low lock contention and lock-holders achieve
+   * their work quickly.  It degrades in scenarios where locked tasks take a long time.
+   */
+  void lock() noexcept
+  {
+    for (;;)
+    {
+      // Try once
+      if (!flag_.exchange(true, std::memory_order_acquire))
+      {
+        return;
+      }
+      // Spin-Fast (goal ~10ns)
+      for (std::size_t i = 0; i < SPINLOCK_FAST_ITERATIONS; ++i)
+      {
+        if (try_lock())
+        {
+          return;
+        }
+        fast_yield();
+      }
+      // Yield then try again (goal ~100ns)
+      std::this_thread::yield();
+      if (try_lock())
+      {
+        return;
+      }
+      // Sleep and then start the whole process again. (goal ~1000ns)
+      std::this_thread::sleep_for(std::chrono::milliseconds(SPINLOCK_SLEEP_MS));
+    }
+    return;
+  }
+  /** Releases the lock held by the execution agent. Throws no exceptions. */
+  void unlock() noexcept { flag_.store(false, std::memory_order_release); }
+
+private:
+  std::atomic<bool> flag_{false};
+};
+
+}  // namespace common
+OPENTELEMETRY_END_NAMESPACE

+ 42 - 0
ext/opentelemetry-cpp-1.21.0/api/include/opentelemetry/common/string_util.h

@@ -0,0 +1,42 @@
+// Copyright The OpenTelemetry Authors
+// SPDX-License-Identifier: Apache-2.0
+
+#pragma once
+
+#include "opentelemetry/nostd/string_view.h"
+#include "opentelemetry/version.h"
+
+OPENTELEMETRY_BEGIN_NAMESPACE
+namespace common
+{
+
+class StringUtil
+{
+public:
+  static nostd::string_view Trim(nostd::string_view str, size_t left, size_t right) noexcept
+  {
+    while (left <= right && isspace(str[left]))
+    {
+      left++;
+    }
+    while (left <= right && isspace(str[right]))
+    {
+      right--;
+    }
+    return str.substr(left, 1 + right - left);
+  }
+
+  static nostd::string_view Trim(nostd::string_view str) noexcept
+  {
+    if (str.empty())
+    {
+      return str;
+    }
+
+    return Trim(str, 0, str.size() - 1);
+  }
+};
+
+}  // namespace common
+
+OPENTELEMETRY_END_NAMESPACE

+ 206 - 0
ext/opentelemetry-cpp-1.21.0/api/include/opentelemetry/common/timestamp.h

@@ -0,0 +1,206 @@
+// Copyright The OpenTelemetry Authors
+// SPDX-License-Identifier: Apache-2.0
+
+#pragma once
+
+#include <chrono>
+#include <cstdint>
+
+#include "opentelemetry/version.h"
+
+OPENTELEMETRY_BEGIN_NAMESPACE
+namespace common
+{
+/**
+ * @brief A timepoint relative to the system clock epoch.
+ *
+ * This is used for marking the beginning and end of an operation.
+ */
+class SystemTimestamp
+{
+public:
+  /**
+   * @brief Initializes a system timestamp pointing to the start of the epoch.
+   */
+  SystemTimestamp() noexcept : nanos_since_epoch_{0} {}
+
+  /**
+   * @brief Initializes a system timestamp from a duration.
+   *
+   * @param time_since_epoch Time elapsed since the beginning of the epoch.
+   */
+  template <class Rep, class Period>
+  explicit SystemTimestamp(const std::chrono::duration<Rep, Period> &time_since_epoch) noexcept
+      : nanos_since_epoch_{static_cast<int64_t>(
+            std::chrono::duration_cast<std::chrono::nanoseconds>(time_since_epoch).count())}
+  {}
+
+  /**
+   * @brief Initializes a system timestamp based on a point in time.
+   *
+   * @param time_point A point in time.
+   */
+  /*implicit*/ SystemTimestamp(const std::chrono::system_clock::time_point &time_point) noexcept
+      : SystemTimestamp{time_point.time_since_epoch()}
+  {}
+
+  /**
+   * @brief Returns a time point for the time stamp.
+   *
+   * @return A time point corresponding to the time stamp.
+   */
+  operator std::chrono::system_clock::time_point() const noexcept
+  {
+    return std::chrono::system_clock::time_point{
+        std::chrono::duration_cast<std::chrono::system_clock::duration>(
+            std::chrono::nanoseconds{nanos_since_epoch_})};
+  }
+
+  /**
+   * @brief Returns the nanoseconds since the beginning of the epoch.
+   *
+   * @return Elapsed nanoseconds since the beginning of the epoch for this timestamp.
+   */
+  std::chrono::nanoseconds time_since_epoch() const noexcept
+  {
+    return std::chrono::nanoseconds{nanos_since_epoch_};
+  }
+
+  /**
+   * @brief Compare two steady time stamps.
+   *
+   * @return true if the two time stamps are equal.
+   */
+  bool operator==(const SystemTimestamp &other) const noexcept
+  {
+    return nanos_since_epoch_ == other.nanos_since_epoch_;
+  }
+
+  /**
+   * @brief Compare two steady time stamps for inequality.
+   *
+   * @return true if the two time stamps are not equal.
+   */
+  bool operator!=(const SystemTimestamp &other) const noexcept
+  {
+    return nanos_since_epoch_ != other.nanos_since_epoch_;
+  }
+
+private:
+  int64_t nanos_since_epoch_;
+};
+
+/**
+ * @brief A timepoint relative to the monotonic clock epoch
+ *
+ * This is used for calculating the duration of an operation.
+ */
+class SteadyTimestamp
+{
+public:
+  /**
+   * @brief Initializes a monotonic timestamp pointing to the start of the epoch.
+   */
+  SteadyTimestamp() noexcept : nanos_since_epoch_{0} {}
+
+  /**
+   * @brief Initializes a monotonic timestamp from a duration.
+   *
+   * @param time_since_epoch Time elapsed since the beginning of the epoch.
+   */
+  template <class Rep, class Period>
+  explicit SteadyTimestamp(const std::chrono::duration<Rep, Period> &time_since_epoch) noexcept
+      : nanos_since_epoch_{static_cast<int64_t>(
+            std::chrono::duration_cast<std::chrono::nanoseconds>(time_since_epoch).count())}
+  {}
+
+  /**
+   * @brief Initializes a monotonic timestamp based on a point in time.
+   *
+   * @param time_point A point in time.
+   */
+  /*implicit*/ SteadyTimestamp(const std::chrono::steady_clock::time_point &time_point) noexcept
+      : SteadyTimestamp{time_point.time_since_epoch()}
+  {}
+
+  /**
+   * @brief Returns a time point for the time stamp.
+   *
+   * @return A time point corresponding to the time stamp.
+   */
+  operator std::chrono::steady_clock::time_point() const noexcept
+  {
+    return std::chrono::steady_clock::time_point{
+        std::chrono::duration_cast<std::chrono::steady_clock::duration>(
+            std::chrono::nanoseconds{nanos_since_epoch_})};
+  }
+
+  /**
+   * @brief Returns the nanoseconds since the beginning of the epoch.
+   *
+   * @return Elapsed nanoseconds since the beginning of the epoch for this timestamp.
+   */
+  std::chrono::nanoseconds time_since_epoch() const noexcept
+  {
+    return std::chrono::nanoseconds{nanos_since_epoch_};
+  }
+
+  /**
+   * @brief Compare two steady time stamps.
+   *
+   * @return true if the two time stamps are equal.
+   */
+  bool operator==(const SteadyTimestamp &other) const noexcept
+  {
+    return nanos_since_epoch_ == other.nanos_since_epoch_;
+  }
+
+  /**
+   * @brief Compare two steady time stamps for inequality.
+   *
+   * @return true if the two time stamps are not equal.
+   */
+  bool operator!=(const SteadyTimestamp &other) const noexcept
+  {
+    return nanos_since_epoch_ != other.nanos_since_epoch_;
+  }
+
+private:
+  int64_t nanos_since_epoch_;
+};
+
+class DurationUtil
+{
+public:
+  template <class Rep, class Period>
+  static std::chrono::duration<Rep, Period> AdjustWaitForTimeout(
+      std::chrono::duration<Rep, Period> timeout,
+      std::chrono::duration<Rep, Period> indefinite_value) noexcept
+  {
+    // Do not call now() when this duration is max value, now() may have a expensive cost.
+    if (timeout == (std::chrono::duration<Rep, Period>::max)())
+    {
+      return indefinite_value;
+    }
+
+    // std::future<T>::wait_for, std::this_thread::sleep_for, and std::condition_variable::wait_for
+    // may use steady_clock or system_clock.We need make sure now() + timeout do not overflow.
+    auto max_timeout = std::chrono::duration_cast<std::chrono::duration<Rep, Period>>(
+        (std::chrono::steady_clock::time_point::max)() - std::chrono::steady_clock::now());
+    if (timeout >= max_timeout)
+    {
+      return indefinite_value;
+    }
+    max_timeout = std::chrono::duration_cast<std::chrono::duration<Rep, Period>>(
+        (std::chrono::system_clock::time_point::max)() - std::chrono::system_clock::now());
+    if (timeout >= max_timeout)
+    {
+      return indefinite_value;
+    }
+
+    return timeout;
+  }
+};
+
+}  // namespace common
+OPENTELEMETRY_END_NAMESPACE

+ 19 - 0
ext/opentelemetry-cpp-1.21.0/api/include/opentelemetry/config.h

@@ -0,0 +1,19 @@
+// Copyright The OpenTelemetry Authors
+// SPDX-License-Identifier: Apache-2.0
+
+#pragma once
+
+#include <type_traits>  // IWYU pragma: keep
+
+#if defined(OPENTELEMETRY_ABI_VERSION_NO) && OPENTELEMETRY_ABI_VERSION_NO >= 2
+#  error \
+      "opentelemetry/config.h is removed in ABI version 2 and later. Please use opentelemetry/version.h instead."
+#else
+#  if defined(__clang__) || defined(__GNUC__)
+#    pragma GCC warning \
+        "opentelemetry/config.h is deprecated. Please use opentelemetry/version.h instead."
+#  elif defined(_MSC_VER)
+#    pragma message( \
+        "[WARNING]: opentelemetry/config.h is deprecated. Please use opentelemetry/version.h instead.")
+#  endif
+#endif

+ 171 - 0
ext/opentelemetry-cpp-1.21.0/api/include/opentelemetry/context/context.h

@@ -0,0 +1,171 @@
+// Copyright The OpenTelemetry Authors
+// SPDX-License-Identifier: Apache-2.0
+
+#pragma once
+
+#include <cstring>
+#include <utility>
+
+#include "opentelemetry/context/context_value.h"
+#include "opentelemetry/nostd/shared_ptr.h"
+#include "opentelemetry/nostd/string_view.h"
+#include "opentelemetry/nostd/variant.h"
+#include "opentelemetry/version.h"
+
+OPENTELEMETRY_BEGIN_NAMESPACE
+namespace context
+{
+
+// The context class provides a context identifier. Is built as a linked list
+// of DataList nodes and each context holds a shared_ptr to a place within
+// the list that determines which keys and values it has access to. All that
+// come before and none that come after.
+class Context
+{
+
+public:
+  Context() = default;
+  // Creates a context object from a map of keys and identifiers, this will
+  // hold a shared_ptr to the head of the DataList linked list
+  template <class T>
+  Context(const T &keys_and_values) noexcept
+      : head_{nostd::shared_ptr<DataList>{new DataList(keys_and_values)}}
+  {}
+
+  // Creates a context object from a key and value, this will
+  // hold a shared_ptr to the head of the DataList linked list
+  Context(nostd::string_view key, ContextValue value) noexcept
+      : head_{nostd::shared_ptr<DataList>{new DataList(key, value)}}
+  {}
+
+  // Accepts a new iterable and then returns a new context that
+  // contains the new key and value data. It attaches the
+  // exisiting list to the end of the new list.
+  template <class T>
+  Context SetValues(T &values) noexcept
+  {
+    Context context                  = Context(values);
+    nostd::shared_ptr<DataList> last = context.head_;
+    while (last->next_ != nullptr)
+    {
+      last = last->next_;
+    }
+    last->next_ = head_;
+    return context;
+  }
+
+  // Accepts a new iterable and then returns a new context that
+  // contains the new key and value data. It attaches the
+  // exisiting list to the end of the new list.
+  Context SetValue(nostd::string_view key, ContextValue value) noexcept
+  {
+    Context context      = Context(key, value);
+    context.head_->next_ = head_;
+    return context;
+  }
+
+  // Returns the value associated with the passed in key.
+  context::ContextValue GetValue(const nostd::string_view key) const noexcept
+  {
+    for (DataList *data = head_.get(); data != nullptr; data = data->next_.get())
+    {
+      if (key.size() == data->key_length_)
+      {
+        if (std::memcmp(key.data(), data->key_, data->key_length_) == 0)
+        {
+          return data->value_;
+        }
+      }
+    }
+    return ContextValue{};
+  }
+
+  // Checks for key and returns true if found
+  bool HasKey(const nostd::string_view key) const noexcept
+  {
+    return !nostd::holds_alternative<nostd::monostate>(GetValue(key));
+  }
+
+  bool operator==(const Context &other) const noexcept { return (head_ == other.head_); }
+
+private:
+  // A linked list to contain the keys and values of this context node
+  struct DataList
+  {
+    char *key_ = nullptr;
+
+    nostd::shared_ptr<DataList> next_{nullptr};
+
+    size_t key_length_ = 0UL;
+
+    ContextValue value_;
+
+    DataList() = default;
+
+    // Builds a data list off of a key and value iterable and returns the head
+    template <class T>
+    DataList(const T &keys_and_vals)
+    {
+      bool first = true;
+      auto *node = this;
+      for (auto &iter : keys_and_vals)
+      {
+        if (first)
+        {
+          *node = DataList(iter.first, iter.second);
+          first = false;
+        }
+        else
+        {
+          node->next_ = nostd::shared_ptr<DataList>(new DataList(iter.first, iter.second));
+          node        = node->next_.get();
+        }
+      }
+    }
+
+    // Builds a data list with just a key and value, so it will just be the head
+    // and returns that head.
+    DataList(nostd::string_view key, const ContextValue &value)
+    {
+      key_        = new char[key.size()];
+      key_length_ = key.size();
+      std::memcpy(key_, key.data(), key.size() * sizeof(char));
+      next_  = nostd::shared_ptr<DataList>{nullptr};
+      value_ = value;
+    }
+
+    DataList(const DataList &other)
+        : key_(new char[other.key_length_]),
+          next_(other.next_),
+          key_length_(other.key_length_),
+          value_(other.value_)
+    {
+      std::memcpy(key_, other.key_, other.key_length_ * sizeof(char));
+    }
+
+    DataList &operator=(DataList &&other) noexcept
+    {
+      key_length_ = other.key_length_;
+      value_      = std::move(other.value_);
+      next_       = std::move(other.next_);
+
+      key_       = other.key_;
+      other.key_ = nullptr;
+
+      return *this;
+    }
+
+    ~DataList()
+    {
+      if (key_ != nullptr)
+      {
+        delete[] key_;
+      }
+    }
+  };
+
+  // Head of the list which holds the keys and values of this context
+  nostd::shared_ptr<DataList> head_;
+};
+}  // namespace context
+OPENTELEMETRY_END_NAMESPACE

+ 35 - 0
ext/opentelemetry-cpp-1.21.0/api/include/opentelemetry/context/context_value.h

@@ -0,0 +1,35 @@
+// Copyright The OpenTelemetry Authors
+// SPDX-License-Identifier: Apache-2.0
+
+#pragma once
+
+#include <cstdint>
+
+#include "opentelemetry/nostd/shared_ptr.h"
+#include "opentelemetry/nostd/variant.h"
+#include "opentelemetry/version.h"
+
+OPENTELEMETRY_BEGIN_NAMESPACE
+namespace baggage
+{
+class Baggage;
+}  // namespace baggage
+
+namespace trace
+{
+class Span;
+class SpanContext;
+}  // namespace trace
+
+namespace context
+{
+using ContextValue = nostd::variant<nostd::monostate,
+                                    bool,
+                                    int64_t,
+                                    uint64_t,
+                                    double,
+                                    nostd::shared_ptr<trace::Span>,
+                                    nostd::shared_ptr<trace::SpanContext>,
+                                    nostd::shared_ptr<baggage::Baggage>>;
+}  // namespace context
+OPENTELEMETRY_END_NAMESPACE

+ 93 - 0
ext/opentelemetry-cpp-1.21.0/api/include/opentelemetry/context/propagation/composite_propagator.h

@@ -0,0 +1,93 @@
+// Copyright The OpenTelemetry Authors
+// SPDX-License-Identifier: Apache-2.0
+
+#pragma once
+
+#include <memory>
+#include <vector>
+
+#include "opentelemetry/context/propagation/text_map_propagator.h"
+#include "opentelemetry/version.h"
+
+OPENTELEMETRY_BEGIN_NAMESPACE
+namespace context
+{
+namespace propagation
+{
+
+class CompositePropagator : public TextMapPropagator
+{
+public:
+  CompositePropagator(std::vector<std::unique_ptr<TextMapPropagator>> propagators)
+      : propagators_(std::move(propagators))
+  {}
+
+  /**
+   * Run each of the configured propagators with the given context and carrier.
+   * Propagators are run in the order they are configured, so if multiple
+   * propagators write the same carrier key, the propagator later in the list
+   * will "win".
+   *
+   * @param carrier Carrier into which context will be injected
+   * @param context Context to inject
+   *
+   */
+
+  void Inject(TextMapCarrier &carrier, const context::Context &context) noexcept override
+  {
+    for (auto &p : propagators_)
+    {
+      p->Inject(carrier, context);
+    }
+  }
+
+  /**
+   * Run each of the configured propagators with the given context and carrier.
+   * Propagators are run in the order they are configured, so if multiple
+   * propagators write the same context key, the propagator later in the list
+   * will "win".
+   *
+   * @param carrier Carrier from which to extract context
+   * @param context Context to add values to
+   */
+  context::Context Extract(const TextMapCarrier &carrier,
+                           context::Context &context) noexcept override
+  {
+    auto first = true;
+    context::Context tmp_context;
+    for (auto &p : propagators_)
+    {
+      if (first)
+      {
+        tmp_context = p->Extract(carrier, context);
+        first       = false;
+      }
+      else
+      {
+        tmp_context = p->Extract(carrier, tmp_context);
+      }
+    }
+    return propagators_.size() ? tmp_context : context;
+  }
+
+  /**
+   * Invoke callback with  fields set to carrier by `inject` method for all the
+   * configured propagators
+   * Returns true if all invocation return true
+   */
+  bool Fields(nostd::function_ref<bool(nostd::string_view)> callback) const noexcept override
+  {
+    bool status = true;
+    for (auto &p : propagators_)
+    {
+      status = status && p->Fields(callback);
+    }
+    return status;
+  }
+
+private:
+  std::vector<std::unique_ptr<TextMapPropagator>> propagators_;
+};
+}  // namespace propagation
+}  // namespace context
+OPENTELEMETRY_END_NAMESPACE

+ 57 - 0
ext/opentelemetry-cpp-1.21.0/api/include/opentelemetry/context/propagation/global_propagator.h

@@ -0,0 +1,57 @@
+// Copyright The OpenTelemetry Authors
+// SPDX-License-Identifier: Apache-2.0
+
+#pragma once
+
+#include <mutex>
+
+#include "opentelemetry/context/propagation/noop_propagator.h"
+
+#include "opentelemetry/common/macros.h"
+#include "opentelemetry/common/spin_lock_mutex.h"
+#include "opentelemetry/nostd/shared_ptr.h"
+
+#include "opentelemetry/version.h"
+
+OPENTELEMETRY_BEGIN_NAMESPACE
+namespace context
+{
+namespace propagation
+{
+
+class TextMapPropagator;
+
+/* Stores the singleton TextMapPropagator */
+
+class OPENTELEMETRY_EXPORT GlobalTextMapPropagator
+{
+public:
+  static nostd::shared_ptr<TextMapPropagator> GetGlobalPropagator() noexcept
+  {
+    std::lock_guard<common::SpinLockMutex> guard(GetLock());
+    return nostd::shared_ptr<TextMapPropagator>(GetPropagator());
+  }
+
+  static void SetGlobalPropagator(const nostd::shared_ptr<TextMapPropagator> &prop) noexcept
+  {
+    std::lock_guard<common::SpinLockMutex> guard(GetLock());
+    GetPropagator() = prop;
+  }
+
+private:
+  OPENTELEMETRY_API_SINGLETON static nostd::shared_ptr<TextMapPropagator> &GetPropagator() noexcept
+  {
+    static nostd::shared_ptr<TextMapPropagator> propagator(new NoOpPropagator());
+    return propagator;
+  }
+
+  OPENTELEMETRY_API_SINGLETON static common::SpinLockMutex &GetLock() noexcept
+  {
+    static common::SpinLockMutex lock;
+    return lock;
+  }
+};
+
+}  // namespace propagation
+}  // namespace context
+OPENTELEMETRY_END_NAMESPACE

+ 40 - 0
ext/opentelemetry-cpp-1.21.0/api/include/opentelemetry/context/propagation/noop_propagator.h

@@ -0,0 +1,40 @@
+// Copyright The OpenTelemetry Authors
+// SPDX-License-Identifier: Apache-2.0
+
+#pragma once
+
+#include "opentelemetry/context/propagation/text_map_propagator.h"
+#include "opentelemetry/version.h"
+
+OPENTELEMETRY_BEGIN_NAMESPACE
+namespace context
+{
+namespace propagation
+{
+
+/**
+ * No-op implementation TextMapPropagator
+ */
+class NoOpPropagator : public TextMapPropagator
+{
+public:
+  /** Noop extract function does nothing and returns the input context */
+  context::Context Extract(const TextMapCarrier & /*carrier*/,
+                           context::Context &context) noexcept override
+  {
+    return context;
+  }
+
+  /** Noop inject function does nothing */
+  void Inject(TextMapCarrier & /*carrier*/,
+              const context::Context & /* context */) noexcept override
+  {}
+
+  bool Fields(nostd::function_ref<bool(nostd::string_view)> /* callback */) const noexcept override
+  {
+    return true;
+  }
+};
+}  // namespace propagation
+}  // namespace context
+OPENTELEMETRY_END_NAMESPACE

+ 59 - 0
ext/opentelemetry-cpp-1.21.0/api/include/opentelemetry/context/propagation/text_map_propagator.h

@@ -0,0 +1,59 @@
+// Copyright The OpenTelemetry Authors
+// SPDX-License-Identifier: Apache-2.0
+
+#pragma once
+
+#include "opentelemetry/context/context.h"
+#include "opentelemetry/nostd/function_ref.h"
+#include "opentelemetry/nostd/string_view.h"
+#include "opentelemetry/version.h"
+
+OPENTELEMETRY_BEGIN_NAMESPACE
+namespace context
+{
+namespace propagation
+{
+
+// TextMapCarrier is the storage medium used by TextMapPropagator.
+class TextMapCarrier
+{
+public:
+  // returns the value associated with the passed key.
+  virtual nostd::string_view Get(nostd::string_view key) const noexcept = 0;
+
+  // stores the key-value pair.
+  virtual void Set(nostd::string_view key, nostd::string_view value) noexcept = 0;
+
+  /* list of all the keys in the carrier.
+   By default, it returns true without invoking callback */
+  virtual bool Keys(nostd::function_ref<bool(nostd::string_view)> /* callback */) const noexcept
+  {
+    return true;
+  }
+  virtual ~TextMapCarrier() = default;
+};
+
+// The TextMapPropagator class provides an interface that enables extracting and injecting
+// context into carriers that travel in-band across process boundaries. HTTP frameworks and clients
+// can integrate with TextMapPropagator by providing the object containing the
+// headers, and a getter and setter function for the extraction and
+// injection of values, respectively.
+
+class TextMapPropagator
+{
+public:
+  // Returns the context that is stored in the carrier with the TextMapCarrier as extractor.
+  virtual context::Context Extract(const TextMapCarrier &carrier,
+                                   context::Context &context) noexcept = 0;
+
+  // Sets the context for carrier with self defined rules.
+  virtual void Inject(TextMapCarrier &carrier, const context::Context &context) noexcept = 0;
+
+  // Gets the fields set in the carrier by the `inject` method
+  virtual bool Fields(nostd::function_ref<bool(nostd::string_view)> callback) const noexcept = 0;
+
+  virtual ~TextMapPropagator() = default;
+};
+}  // namespace propagation
+}  // namespace context
+OPENTELEMETRY_END_NAMESPACE

+ 340 - 0
ext/opentelemetry-cpp-1.21.0/api/include/opentelemetry/context/runtime_context.h

@@ -0,0 +1,340 @@
+// Copyright The OpenTelemetry Authors
+// SPDX-License-Identifier: Apache-2.0
+
+#pragma once
+
+#include <stddef.h>
+#include <algorithm>
+
+#include "opentelemetry/common/macros.h"
+#include "opentelemetry/context/context.h"
+#include "opentelemetry/context/context_value.h"
+#include "opentelemetry/nostd/shared_ptr.h"
+#include "opentelemetry/nostd/string_view.h"
+#include "opentelemetry/nostd/unique_ptr.h"
+#include "opentelemetry/version.h"
+
+OPENTELEMETRY_BEGIN_NAMESPACE
+namespace context
+{
+// The Token object provides is returned when attaching objects to the
+// RuntimeContext object and is associated with a context object, and
+// can be provided to the RuntimeContext Detach method to remove the
+// associated context from the RuntimeContext.
+class Token
+{
+public:
+  bool operator==(const Context &other) const noexcept { return context_ == other; }
+
+  ~Token() noexcept;
+
+private:
+  friend class RuntimeContextStorage;
+
+  // A constructor that sets the token's Context object to the
+  // one that was passed in.
+  Token(const Context &context) : context_(context) {}
+
+  const Context context_;
+};
+
+/**
+ * RuntimeContextStorage is used by RuntimeContext to store Context frames.
+ *
+ * Custom context management strategies can be implemented by deriving from
+ * this class and passing an initialized RuntimeContextStorage object to
+ * RuntimeContext::SetRuntimeContextStorage.
+ */
+class OPENTELEMETRY_EXPORT RuntimeContextStorage
+{
+public:
+  /**
+   * Return the current context.
+   * @return the current context
+   */
+  virtual Context GetCurrent() noexcept = 0;
+
+  /**
+   * Set the current context.
+   * @param the new current context
+   * @return a token for the new current context. This never returns a nullptr.
+   */
+  virtual nostd::unique_ptr<Token> Attach(const Context &context) noexcept = 0;
+
+  /**
+   * Detach the context related to the given token.
+   * @param token a token related to a context
+   * @return true if the context could be detached
+   */
+  virtual bool Detach(Token &token) noexcept = 0;
+
+  virtual ~RuntimeContextStorage() {}
+
+protected:
+  nostd::unique_ptr<Token> CreateToken(const Context &context) noexcept
+  {
+    return nostd::unique_ptr<Token>(new Token(context));
+  }
+};
+
+/**
+ * Construct and return the default RuntimeContextStorage
+ * @return a ThreadLocalContextStorage
+ */
+static RuntimeContextStorage *GetDefaultStorage() noexcept;
+
+// Provides a wrapper for propagating the context object globally.
+//
+// By default, a thread-local runtime context storage is used.
+class OPENTELEMETRY_EXPORT RuntimeContext
+{
+public:
+  // Return the current context.
+  static Context GetCurrent() noexcept { return GetRuntimeContextStorage()->GetCurrent(); }
+
+  // Sets the current 'Context' object. Returns a token
+  // that can be used to reset to the previous Context.
+  static nostd::unique_ptr<Token> Attach(const Context &context) noexcept
+  {
+    return GetRuntimeContextStorage()->Attach(context);
+  }
+
+  // Resets the context to a previous value stored in the
+  // passed in token. Returns true if successful, false otherwise
+  static bool Detach(Token &token) noexcept { return GetRuntimeContextStorage()->Detach(token); }
+
+  // Sets the Key and Value into the passed in context or if a context is not
+  // passed in, the RuntimeContext.
+  // Should be used to SetValues to the current RuntimeContext, is essentially
+  // equivalent to RuntimeContext::GetCurrent().SetValue(key,value). Keep in
+  // mind that the current RuntimeContext will not be changed, and the new
+  // context will be returned.
+  static Context SetValue(nostd::string_view key,
+                          const ContextValue &value,
+                          Context *context = nullptr) noexcept
+  {
+    Context temp_context;
+    if (context == nullptr)
+    {
+      temp_context = GetCurrent();
+    }
+    else
+    {
+      temp_context = *context;
+    }
+    return temp_context.SetValue(key, value);
+  }
+
+  // Returns the value associated with the passed in key and either the
+  // passed in context* or the runtime context if a context is not passed in.
+  // Should be used to get values from the current RuntimeContext, is
+  // essentially equivalent to RuntimeContext::GetCurrent().GetValue(key).
+  static ContextValue GetValue(nostd::string_view key, Context *context = nullptr) noexcept
+  {
+    Context temp_context;
+    if (context == nullptr)
+    {
+      temp_context = GetCurrent();
+    }
+    else
+    {
+      temp_context = *context;
+    }
+    return temp_context.GetValue(key);
+  }
+
+  /**
+   * Provide a custom runtime context storage.
+   *
+   * This provides a possibility to override the default thread-local runtime
+   * context storage. This has to be set before any spans are created by the
+   * application, otherwise the behavior is undefined.
+   *
+   * @param storage a custom runtime context storage
+   */
+  static void SetRuntimeContextStorage(
+      const nostd::shared_ptr<RuntimeContextStorage> &storage) noexcept
+  {
+    GetStorage() = storage;
+  }
+
+  /**
+   * Provide a pointer to const runtime context storage.
+   *
+   * The returned pointer can only be used for extending the lifetime of the runtime context
+   * storage.
+   *
+   */
+  static nostd::shared_ptr<const RuntimeContextStorage> GetConstRuntimeContextStorage() noexcept
+  {
+    return GetRuntimeContextStorage();
+  }
+
+private:
+  static nostd::shared_ptr<RuntimeContextStorage> GetRuntimeContextStorage() noexcept
+  {
+    return GetStorage();
+  }
+
+  OPENTELEMETRY_API_SINGLETON static nostd::shared_ptr<RuntimeContextStorage> &GetStorage() noexcept
+  {
+    static nostd::shared_ptr<RuntimeContextStorage> context(GetDefaultStorage());
+    return context;
+  }
+};
+
+inline Token::~Token() noexcept
+{
+  context::RuntimeContext::Detach(*this);
+}
+
+// The ThreadLocalContextStorage class is a derived class from
+// RuntimeContextStorage and provides a wrapper for propagating context through
+// cpp thread locally. This file must be included to use the RuntimeContext
+// class if another implementation has not been registered.
+class ThreadLocalContextStorage : public RuntimeContextStorage
+{
+public:
+  ThreadLocalContextStorage() noexcept = default;
+
+  // Return the current context.
+  Context GetCurrent() noexcept override { return GetStack().Top(); }
+
+  // Resets the context to the value previous to the passed in token. This will
+  // also detach all child contexts of the passed in token.
+  // Returns true if successful, false otherwise.
+  bool Detach(Token &token) noexcept override
+  {
+    // In most cases, the context to be detached is on the top of the stack.
+    if (token == GetStack().Top())
+    {
+      GetStack().Pop();
+      return true;
+    }
+
+    if (!GetStack().Contains(token))
+    {
+      return false;
+    }
+
+    while (!(token == GetStack().Top()))
+    {
+      GetStack().Pop();
+    }
+
+    GetStack().Pop();
+
+    return true;
+  }
+
+  // Sets the current 'Context' object. Returns a token
+  // that can be used to reset to the previous Context.
+  nostd::unique_ptr<Token> Attach(const Context &context) noexcept override
+  {
+    GetStack().Push(context);
+    return CreateToken(context);
+  }
+
+private:
+  // A nested class to store the attached contexts in a stack.
+  class Stack
+  {
+    friend class ThreadLocalContextStorage;
+
+    Stack() noexcept : size_(0), capacity_(0), base_(nullptr) {}
+
+    // Pops the top Context off the stack.
+    void Pop() noexcept
+    {
+      if (size_ == 0)
+      {
+        return;
+      }
+      // Store empty Context before decrementing `size`, to ensure
+      // the shared_ptr object (if stored in prev context object ) are released.
+      // The stack is not resized, and the unused memory would be reutilised
+      // for subsequent context storage.
+      base_[size_ - 1] = Context();
+      size_ -= 1;
+    }
+
+    bool Contains(const Token &token) const noexcept
+    {
+      for (size_t pos = size_; pos > 0; --pos)
+      {
+        if (token == base_[pos - 1])
+        {
+          return true;
+        }
+      }
+
+      return false;
+    }
+
+    // Returns the Context at the top of the stack.
+    Context Top() const noexcept
+    {
+      if (size_ == 0)
+      {
+        return Context();
+      }
+      return base_[size_ - 1];
+    }
+
+    // Pushes the passed in context pointer to the top of the stack
+    // and resizes if necessary.
+    void Push(const Context &context) noexcept
+    {
+      size_++;
+      if (size_ > capacity_)
+      {
+        Resize(size_ * 2);
+      }
+      base_[size_ - 1] = context;
+    }
+
+    // Reallocates the storage array to the pass in new capacity size.
+    void Resize(size_t new_capacity) noexcept
+    {
+      size_t old_size = size_ - 1;
+      if (new_capacity == 0)
+      {
+        new_capacity = 2;
+      }
+      Context *temp = new Context[new_capacity];
+      if (base_ != nullptr)
+      {
+        // vs2015 does not like this construct considering it unsafe:
+        // - std::copy(base_, base_ + old_size, temp);
+        // Ref.
+        // https://stackoverflow.com/questions/12270224/xutility2227-warning-c4996-std-copy-impl
+        for (size_t i = 0; i < (std::min)(old_size, new_capacity); i++)
+        {
+          temp[i] = base_[i];
+        }
+        delete[] base_;
+      }
+      base_     = temp;
+      capacity_ = new_capacity;
+    }
+
+    ~Stack() noexcept { delete[] base_; }
+
+    size_t size_;
+    size_t capacity_;
+    Context *base_;
+  };
+
+  OPENTELEMETRY_API_SINGLETON Stack &GetStack()
+  {
+    static thread_local Stack stack_ = Stack();
+    return stack_;
+  }
+};
+
+static RuntimeContextStorage *GetDefaultStorage() noexcept
+{
+  return new ThreadLocalContextStorage();
+}
+}  // namespace context
+OPENTELEMETRY_END_NAMESPACE

+ 25 - 0
ext/opentelemetry-cpp-1.21.0/api/include/opentelemetry/detail/preprocessor.h

@@ -0,0 +1,25 @@
+// Copyright The OpenTelemetry Authors
+// SPDX-License-Identifier: Apache-2.0
+
+// NOTE - code within detail namespace implements internal details, and not part
+// of the public interface.
+
+#pragma once
+
+#define OPENTELEMETRY_STRINGIFY(S) OPENTELEMETRY_STRINGIFY_(S)
+#define OPENTELEMETRY_STRINGIFY_(S) #S
+
+#define OPENTELEMETRY_CONCAT(A, B) OPENTELEMETRY_CONCAT_(A, B)
+#define OPENTELEMETRY_CONCAT_(A, B) A##B
+
+// Import the C++20 feature-test macros
+#ifdef __has_include
+#  if __has_include(<version>)
+#    include <version>
+#  endif
+#elif defined(_MSC_VER) && ((defined(__cplusplus) && __cplusplus >= 202002L) || \
+                            (defined(_MSVC_LANG) && _MSVC_LANG >= 202002L))
+#  if _MSC_VER >= 1922
+#    include <version>
+#  endif
+#endif

+ 37 - 0
ext/opentelemetry-cpp-1.21.0/api/include/opentelemetry/logs/event_id.h

@@ -0,0 +1,37 @@
+// Copyright The OpenTelemetry Authors
+// SPDX-License-Identifier: Apache-2.0
+
+#pragma once
+
+#include <algorithm>
+
+#include "opentelemetry/nostd/string_view.h"
+#include "opentelemetry/nostd/unique_ptr.h"
+#include "opentelemetry/version.h"
+
+OPENTELEMETRY_BEGIN_NAMESPACE
+namespace logs
+{
+
+/**
+ * EventId class which acts the Id of the event with an optional name.
+ */
+class EventId
+{
+public:
+  EventId(int64_t id, nostd::string_view name) noexcept
+      : id_{id}, name_{nostd::unique_ptr<char[]>{new char[name.length() + 1]}}
+  {
+    std::copy(name.begin(), name.end(), name_.get());
+    name_.get()[name.length()] = 0;
+  }
+
+  EventId(int64_t id) noexcept : id_{id}, name_{nullptr} {}
+
+public:
+  int64_t id_;
+  nostd::unique_ptr<char[]> name_;
+};
+
+}  // namespace logs
+OPENTELEMETRY_END_NAMESPACE

+ 82 - 0
ext/opentelemetry-cpp-1.21.0/api/include/opentelemetry/logs/event_logger.h

@@ -0,0 +1,82 @@
+// Copyright The OpenTelemetry Authors
+// SPDX-License-Identifier: Apache-2.0
+
+#pragma once
+
+#include "opentelemetry/logs/log_record.h"
+#include "opentelemetry/logs/logger.h"
+#include "opentelemetry/logs/logger_type_traits.h"
+#include "opentelemetry/nostd/shared_ptr.h"
+#include "opentelemetry/nostd/string_view.h"
+#include "opentelemetry/nostd/unique_ptr.h"
+#include "opentelemetry/version.h"
+
+OPENTELEMETRY_BEGIN_NAMESPACE
+namespace logs
+{
+#if OPENTELEMETRY_ABI_VERSION_NO < 2
+/**
+ * Handles event log record creation.
+ **/
+class OPENTELEMETRY_DEPRECATED EventLogger
+{
+public:
+  virtual ~EventLogger() = default;
+
+  /* Returns the name of the logger */
+  virtual const nostd::string_view GetName() noexcept = 0;
+
+  /* Returns the delegate logger of this event logger */
+  virtual nostd::shared_ptr<Logger> GetDelegateLogger() noexcept = 0;
+
+  /**
+   * Emit a event Log Record object
+   *
+   * @param event_name Event name
+   * @param log_record Log record
+   */
+  virtual void EmitEvent(nostd::string_view event_name,
+                         nostd::unique_ptr<LogRecord> &&log_record) noexcept = 0;
+
+  /**
+   * Emit a event Log Record object with arguments
+   *
+   * @param event_name Event name
+   * @tparam args Arguments which can be used to set data of log record by type.
+   *  Severity                                -> severity, severity_text
+   *  string_view                             -> body
+   *  AttributeValue                          -> body
+   *  SpanContext                             -> span_id,tace_id and trace_flags
+   *  SpanId                                  -> span_id
+   *  TraceId                                 -> tace_id
+   *  TraceFlags                              -> trace_flags
+   *  SystemTimestamp                         -> timestamp
+   *  system_clock::time_point                -> timestamp
+   *  KeyValueIterable                        -> attributes
+   *  Key value iterable container            -> attributes
+   *  span<pair<string_view, AttributeValue>> -> attributes(return type of MakeAttributes)
+   */
+  template <class... ArgumentType>
+  void EmitEvent(nostd::string_view event_name, ArgumentType &&...args)
+  {
+    nostd::shared_ptr<Logger> delegate_logger = GetDelegateLogger();
+    if (!delegate_logger)
+    {
+      return;
+    }
+    nostd::unique_ptr<LogRecord> log_record = delegate_logger->CreateLogRecord();
+
+    IgnoreTraitResult(detail::LogRecordSetterTrait<typename std::decay<ArgumentType>::type>::Set(
+        log_record.get(), std::forward<ArgumentType>(args))...);
+
+    EmitEvent(event_name, std::move(log_record));
+  }
+
+private:
+  template <class... ValueType>
+  void IgnoreTraitResult(ValueType &&...)
+  {}
+};
+#endif
+}  // namespace logs
+OPENTELEMETRY_END_NAMESPACE

+ 37 - 0
ext/opentelemetry-cpp-1.21.0/api/include/opentelemetry/logs/event_logger_provider.h

@@ -0,0 +1,37 @@
+// Copyright The OpenTelemetry Authors
+// SPDX-License-Identifier: Apache-2.0
+
+#pragma once
+
+#include "opentelemetry/nostd/shared_ptr.h"
+#include "opentelemetry/nostd/string_view.h"
+#include "opentelemetry/version.h"
+
+OPENTELEMETRY_BEGIN_NAMESPACE
+namespace logs
+{
+
+class EventLogger;
+class Logger;
+
+#if OPENTELEMETRY_ABI_VERSION_NO < 2
+/**
+ * Creates new EventLogger instances.
+ */
+class OPENTELEMETRY_DEPRECATED EventLoggerProvider
+{
+public:
+  virtual ~EventLoggerProvider() = default;
+
+  /**
+   * Creates a named EventLogger instance.
+   *
+   */
+
+  virtual nostd::shared_ptr<EventLogger> CreateEventLogger(
+      nostd::shared_ptr<Logger> delegate_logger,
+      nostd::string_view event_domain) noexcept = 0;
+};
+#endif
+}  // namespace logs
+OPENTELEMETRY_END_NAMESPACE

+ 92 - 0
ext/opentelemetry-cpp-1.21.0/api/include/opentelemetry/logs/log_record.h

@@ -0,0 +1,92 @@
+// Copyright The OpenTelemetry Authors
+// SPDX-License-Identifier: Apache-2.0
+
+#pragma once
+
+#include "opentelemetry/common/attribute_value.h"
+#include "opentelemetry/common/timestamp.h"
+#include "opentelemetry/version.h"
+
+OPENTELEMETRY_BEGIN_NAMESPACE
+namespace trace
+{
+class SpanId;
+class TraceId;
+class TraceFlags;
+}  // namespace trace
+
+namespace logs
+{
+
+enum class Severity : uint8_t;
+
+/**
+ * Maintains a representation of a log in a format that can be processed by a recorder.
+ *
+ * This class is thread-compatible.
+ */
+class LogRecord
+{
+public:
+  virtual ~LogRecord() = default;
+
+  /**
+   * Set the timestamp for this log.
+   * @param timestamp the timestamp to set
+   */
+  virtual void SetTimestamp(common::SystemTimestamp timestamp) noexcept = 0;
+
+  /**
+   * Set the observed timestamp for this log.
+   * @param timestamp the timestamp to set
+   */
+  virtual void SetObservedTimestamp(common::SystemTimestamp timestamp) noexcept = 0;
+
+  /**
+   * Set the severity for this log.
+   * @param severity the severity of the event
+   */
+  virtual void SetSeverity(logs::Severity severity) noexcept = 0;
+
+  /**
+   * Set body field for this log.
+   * @param message the body to set
+   */
+  virtual void SetBody(const common::AttributeValue &message) noexcept = 0;
+
+  /**
+   * Set an attribute of a log.
+   * @param key the name of the attribute
+   * @param value the attribute value
+   */
+  virtual void SetAttribute(nostd::string_view key,
+                            const common::AttributeValue &value) noexcept = 0;
+
+  /**
+   * Set the Event Id.
+   * @param id The event id to set
+   * @param name Optional event name to set
+   */
+  // TODO: mark this as pure virtual once all exporters have been updated
+  virtual void SetEventId(int64_t id, nostd::string_view name = {}) noexcept = 0;
+
+  /**
+   * Set the trace id for this log.
+   * @param trace_id the trace id to set
+   */
+  virtual void SetTraceId(const trace::TraceId &trace_id) noexcept = 0;
+
+  /**
+   * Set the span id for this log.
+   * @param span_id the span id to set
+   */
+  virtual void SetSpanId(const trace::SpanId &span_id) noexcept = 0;
+
+  /**
+   * Inject trace_flags for this log.
+   * @param trace_flags the trace flags to set
+   */
+  virtual void SetTraceFlags(const trace::TraceFlags &trace_flags) noexcept = 0;
+};
+}  // namespace logs
+OPENTELEMETRY_END_NAMESPACE

+ 492 - 0
ext/opentelemetry-cpp-1.21.0/api/include/opentelemetry/logs/logger.h

@@ -0,0 +1,492 @@
+// Copyright The OpenTelemetry Authors
+// SPDX-License-Identifier: Apache-2.0
+
+#pragma once
+
+#include "opentelemetry/logs/logger_type_traits.h"
+#include "opentelemetry/logs/severity.h"
+#include "opentelemetry/nostd/string_view.h"
+#include "opentelemetry/nostd/unique_ptr.h"
+#include "opentelemetry/version.h"
+
+OPENTELEMETRY_BEGIN_NAMESPACE
+namespace common
+{
+class KeyValueIterable;
+}  // namespace common
+
+namespace logs
+{
+
+class EventId;
+class LogRecord;
+
+/**
+ * Handles log record creation.
+ **/
+class Logger
+{
+public:
+  virtual ~Logger() = default;
+
+  /* Returns the name of the logger */
+  virtual const nostd::string_view GetName() noexcept = 0;
+
+  /**
+   * Create a Log Record object
+   *
+   * @return nostd::unique_ptr<LogRecord>
+   */
+  virtual nostd::unique_ptr<LogRecord> CreateLogRecord() noexcept = 0;
+
+  /**
+   * Emit a Log Record object
+   *
+   * @param log_record Log record
+   */
+  virtual void EmitLogRecord(nostd::unique_ptr<LogRecord> &&log_record) noexcept = 0;
+
+  /**
+   * Emit a Log Record object with arguments
+   *
+   * @param log_record Log record
+   * @param args Arguments which can be used to set data of log record by type.
+   *  Severity                                -> severity, severity_text
+   *  string_view                             -> body
+   *  AttributeValue                          -> body
+   *  SpanContext                             -> span_id,trace_id and trace_flags
+   *  SpanId                                  -> span_id
+   *  TraceId                                 -> trace_id
+   *  TraceFlags                              -> trace_flags
+   *  SystemTimestamp                         -> timestamp
+   *  system_clock::time_point                -> timestamp
+   *  KeyValueIterable                        -> attributes
+   *  Key value iterable container            -> attributes
+   *  span<pair<string_view, AttributeValue>> -> attributes(return type of MakeAttributes)
+   */
+  template <class... ArgumentType>
+  void EmitLogRecord(nostd::unique_ptr<LogRecord> &&log_record, ArgumentType &&...args)
+  {
+    if (!log_record)
+    {
+      return;
+    }
+
+    //
+    // Keep the parameter pack unpacking order from left to right because left
+    // ones are usually more important like severity and event_id than the
+    // attributes. The left to right unpack order could pass the more important
+    // data to processors to avoid caching and memory allocating.
+    //
+#if __cplusplus <= 201402L
+    // C++14 does not support fold expressions for parameter pack expansion.
+    int dummy[] = {(detail::LogRecordSetterTrait<typename std::decay<ArgumentType>::type>::Set(
+                        log_record.get(), std::forward<ArgumentType>(args)),
+                    0)...};
+    IgnoreTraitResult(dummy);
+#else
+    IgnoreTraitResult((detail::LogRecordSetterTrait<typename std::decay<ArgumentType>::type>::Set(
+                           log_record.get(), std::forward<ArgumentType>(args)),
+                       ...));
+#endif
+
+    EmitLogRecord(std::move(log_record));
+  }
+
+  /**
+   * Emit a Log Record object with arguments
+   *
+   * @param args Arguments which can be used to set data of log record by type.
+   *  Severity                                -> severity, severity_text
+   *  string_view                             -> body
+   *  AttributeValue                          -> body
+   *  SpanContext                             -> span_id,trace_id and trace_flags
+   *  SpanId                                  -> span_id
+   *  TraceId                                 -> trace_id
+   *  TraceFlags                              -> trace_flags
+   *  SystemTimestamp                         -> timestamp
+   *  system_clock::time_point                -> timestamp
+   *  KeyValueIterable                        -> attributes
+   *  Key value iterable container            -> attributes
+   *  span<pair<string_view, AttributeValue>> -> attributes(return type of MakeAttributes)
+   */
+  template <class... ArgumentType>
+  void EmitLogRecord(ArgumentType &&...args)
+  {
+    nostd::unique_ptr<LogRecord> log_record = CreateLogRecord();
+
+    EmitLogRecord(std::move(log_record), std::forward<ArgumentType>(args)...);
+  }
+
+  /**
+   * Writes a log with a severity of trace.
+   * @param args Arguments which can be used to set data of log record by type.
+   *  string_view                             -> body
+   *  AttributeValue                          -> body
+   *  SpanContext                             -> span_id,trace_id and trace_flags
+   *  SpanId                                  -> span_id
+   *  TraceId                                 -> trace_id
+   *  TraceFlags                              -> trace_flags
+   *  SystemTimestamp                         -> timestamp
+   *  system_clock::time_point                -> timestamp
+   *  KeyValueIterable                        -> attributes
+   *  Key value iterable container            -> attributes
+   *  span<pair<string_view, AttributeValue>> -> attributes(return type of MakeAttributes)
+   */
+  template <class... ArgumentType>
+  void Trace(ArgumentType &&...args) noexcept
+  {
+    static_assert(
+        !detail::LogRecordHasType<Severity, typename std::decay<ArgumentType>::type...>::value,
+        "Severity is already set.");
+    this->EmitLogRecord(Severity::kTrace, std::forward<ArgumentType>(args)...);
+  }
+
+  /**
+   * Writes a log with a severity of debug.
+   * @param args Arguments which can be used to set data of log record by type.
+   *  string_view                             -> body
+   *  AttributeValue                          -> body
+   *  SpanContext                             -> span_id,trace_id and trace_flags
+   *  SpanId                                  -> span_id
+   *  TraceId                                 -> trace_id
+   *  TraceFlags                              -> trace_flags
+   *  SystemTimestamp                         -> timestamp
+   *  system_clock::time_point                -> timestamp
+   *  KeyValueIterable                        -> attributes
+   *  Key value iterable container            -> attributes
+   *  span<pair<string_view, AttributeValue>> -> attributes(return type of MakeAttributes)
+   */
+  template <class... ArgumentType>
+  void Debug(ArgumentType &&...args) noexcept
+  {
+    static_assert(
+        !detail::LogRecordHasType<Severity, typename std::decay<ArgumentType>::type...>::value,
+        "Severity is already set.");
+    this->EmitLogRecord(Severity::kDebug, std::forward<ArgumentType>(args)...);
+  }
+
+  /**
+   * Writes a log with a severity of info.
+   * @param args Arguments which can be used to set data of log record by type.
+   *  string_view                             -> body
+   *  AttributeValue                          -> body
+   *  SpanContext                             -> span_id,trace_id and trace_flags
+   *  SpanId                                  -> span_id
+   *  TraceId                                 -> trace_id
+   *  TraceFlags                              -> trace_flags
+   *  SystemTimestamp                         -> timestamp
+   *  system_clock::time_point                -> timestamp
+   *  KeyValueIterable                        -> attributes
+   *  Key value iterable container            -> attributes
+   *  span<pair<string_view, AttributeValue>> -> attributes(return type of MakeAttributes)
+   */
+  template <class... ArgumentType>
+  void Info(ArgumentType &&...args) noexcept
+  {
+    static_assert(
+        !detail::LogRecordHasType<Severity, typename std::decay<ArgumentType>::type...>::value,
+        "Severity is already set.");
+    this->EmitLogRecord(Severity::kInfo, std::forward<ArgumentType>(args)...);
+  }
+
+  /**
+   * Writes a log with a severity of warn.
+   * @param args Arguments which can be used to set data of log record by type.
+   *  string_view                             -> body
+   *  AttributeValue                          -> body
+   *  SpanContext                             -> span_id,trace_id and trace_flags
+   *  SpanId                                  -> span_id
+   *  TraceId                                 -> trace_id
+   *  TraceFlags                              -> trace_flags
+   *  SystemTimestamp                         -> timestamp
+   *  system_clock::time_point                -> timestamp
+   *  KeyValueIterable                        -> attributes
+   *  Key value iterable container            -> attributes
+   *  span<pair<string_view, AttributeValue>> -> attributes(return type of MakeAttributes)
+   */
+  template <class... ArgumentType>
+  void Warn(ArgumentType &&...args) noexcept
+  {
+    static_assert(
+        !detail::LogRecordHasType<Severity, typename std::decay<ArgumentType>::type...>::value,
+        "Severity is already set.");
+    this->EmitLogRecord(Severity::kWarn, std::forward<ArgumentType>(args)...);
+  }
+
+  /**
+   * Writes a log with a severity of error.
+   * @param args Arguments which can be used to set data of log record by type.
+   *  string_view                             -> body
+   *  AttributeValue                          -> body
+   *  SpanContext                             -> span_id,trace_id and trace_flags
+   *  SpanId                                  -> span_id
+   *  TraceId                                 -> trace_id
+   *  TraceFlags                              -> trace_flags
+   *  SystemTimestamp                         -> timestamp
+   *  system_clock::time_point                -> timestamp
+   *  KeyValueIterable                        -> attributes
+   *  Key value iterable container            -> attributes
+   *  span<pair<string_view, AttributeValue>> -> attributes(return type of MakeAttributes)
+   */
+  template <class... ArgumentType>
+  void Error(ArgumentType &&...args) noexcept
+  {
+    static_assert(
+        !detail::LogRecordHasType<Severity, typename std::decay<ArgumentType>::type...>::value,
+        "Severity is already set.");
+    this->EmitLogRecord(Severity::kError, std::forward<ArgumentType>(args)...);
+  }
+
+  /**
+   * Writes a log with a severity of fatal.
+   * @param args Arguments which can be used to set data of log record by type.
+   *  string_view                             -> body
+   *  AttributeValue                          -> body
+   *  SpanContext                             -> span_id,trace_id and trace_flags
+   *  SpanId                                  -> span_id
+   *  TraceId                                 -> trace_id
+   *  TraceFlags                              -> trace_flags
+   *  SystemTimestamp                         -> timestamp
+   *  system_clock::time_point                -> timestamp
+   *  KeyValueIterable                        -> attributes
+   *  Key value iterable container            -> attributes
+   *  span<pair<string_view, AttributeValue>> -> attributes(return type of MakeAttributes)
+   */
+  template <class... ArgumentType>
+  void Fatal(ArgumentType &&...args) noexcept
+  {
+    static_assert(
+        !detail::LogRecordHasType<Severity, typename std::decay<ArgumentType>::type...>::value,
+        "Severity is already set.");
+    this->EmitLogRecord(Severity::kFatal, std::forward<ArgumentType>(args)...);
+  }
+
+  //
+  // OpenTelemetry C++ user-facing Logs API
+  //
+
+  inline bool Enabled(Severity severity, const EventId &event_id) const noexcept
+  {
+    if OPENTELEMETRY_LIKELY_CONDITION (!Enabled(severity))
+    {
+      return false;
+    }
+    return EnabledImplementation(severity, event_id);
+  }
+
+  inline bool Enabled(Severity severity, int64_t event_id) const noexcept
+  {
+    if OPENTELEMETRY_LIKELY_CONDITION (!Enabled(severity))
+    {
+      return false;
+    }
+    return EnabledImplementation(severity, event_id);
+  }
+
+  inline bool Enabled(Severity severity) const noexcept
+  {
+    return static_cast<uint8_t>(severity) >= OPENTELEMETRY_ATOMIC_READ_8(&minimum_severity_);
+  }
+
+  /**
+   * Log an event
+   *
+   * @severity severity of the log
+   * @event_id event identifier of the log
+   * @format an utf-8 string following https://messagetemplates.org/
+   * @attributes key value pairs of the log
+   */
+  virtual void Log(Severity severity,
+                   const EventId &event_id,
+                   nostd::string_view format,
+                   const common::KeyValueIterable &attributes) noexcept
+  {
+    this->EmitLogRecord(severity, event_id, format, attributes);
+  }
+
+  virtual void Log(Severity severity,
+                   int64_t event_id,
+                   nostd::string_view format,
+                   const common::KeyValueIterable &attributes) noexcept
+  {
+    this->EmitLogRecord(severity, EventId{event_id}, format, attributes);
+  }
+
+  virtual void Log(Severity severity,
+                   nostd::string_view format,
+                   const common::KeyValueIterable &attributes) noexcept
+  {
+    this->EmitLogRecord(severity, format, attributes);
+  }
+
+  virtual void Log(Severity severity, nostd::string_view message) noexcept
+  {
+    this->EmitLogRecord(severity, message);
+  }
+
+  // Convenient wrappers based on virtual methods Log().
+  // https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/logs/data-model.md#field-severitynumber
+
+  inline void Trace(const EventId &event_id,
+                    nostd::string_view format,
+                    const common::KeyValueIterable &attributes) noexcept
+  {
+    this->Log(Severity::kTrace, event_id, format, attributes);
+  }
+
+  inline void Trace(int64_t event_id,
+                    nostd::string_view format,
+                    const common::KeyValueIterable &attributes) noexcept
+  {
+    this->Log(Severity::kTrace, EventId{event_id}, format, attributes);
+  }
+
+  inline void Trace(nostd::string_view format, const common::KeyValueIterable &attributes) noexcept
+  {
+    this->Log(Severity::kTrace, format, attributes);
+  }
+
+  inline void Trace(nostd::string_view message) noexcept { this->Log(Severity::kTrace, message); }
+
+  inline void Debug(const EventId &event_id,
+                    nostd::string_view format,
+                    const common::KeyValueIterable &attributes) noexcept
+  {
+    this->Log(Severity::kDebug, event_id, format, attributes);
+  }
+
+  inline void Debug(int64_t event_id,
+                    nostd::string_view format,
+                    const common::KeyValueIterable &attributes) noexcept
+  {
+    this->Log(Severity::kDebug, EventId{event_id}, format, attributes);
+  }
+
+  inline void Debug(nostd::string_view format, const common::KeyValueIterable &attributes) noexcept
+  {
+    this->Log(Severity::kDebug, format, attributes);
+  }
+
+  inline void Debug(nostd::string_view message) noexcept { this->Log(Severity::kDebug, message); }
+
+  inline void Info(const EventId &event_id,
+                   nostd::string_view format,
+                   const common::KeyValueIterable &attributes) noexcept
+  {
+    this->Log(Severity::kInfo, event_id, format, attributes);
+  }
+
+  inline void Info(int64_t event_id,
+                   nostd::string_view format,
+                   const common::KeyValueIterable &attributes) noexcept
+  {
+    this->Log(Severity::kInfo, EventId{event_id}, format, attributes);
+  }
+
+  inline void Info(nostd::string_view format, const common::KeyValueIterable &attributes) noexcept
+  {
+    this->Log(Severity::kInfo, format, attributes);
+  }
+
+  inline void Info(nostd::string_view message) noexcept { this->Log(Severity::kInfo, message); }
+
+  inline void Warn(const EventId &event_id,
+                   nostd::string_view format,
+                   const common::KeyValueIterable &attributes) noexcept
+  {
+    this->Log(Severity::kWarn, event_id, format, attributes);
+  }
+
+  inline void Warn(int64_t event_id,
+                   nostd::string_view format,
+                   const common::KeyValueIterable &attributes) noexcept
+  {
+    this->Log(Severity::kWarn, EventId{event_id}, format, attributes);
+  }
+
+  inline void Warn(nostd::string_view format, const common::KeyValueIterable &attributes) noexcept
+  {
+    this->Log(Severity::kWarn, format, attributes);
+  }
+
+  inline void Warn(nostd::string_view message) noexcept { this->Log(Severity::kWarn, message); }
+
+  inline void Error(const EventId &event_id,
+                    nostd::string_view format,
+                    const common::KeyValueIterable &attributes) noexcept
+  {
+    this->Log(Severity::kError, event_id, format, attributes);
+  }
+
+  inline void Error(int64_t event_id,
+                    nostd::string_view format,
+                    const common::KeyValueIterable &attributes) noexcept
+  {
+    this->Log(Severity::kError, EventId{event_id}, format, attributes);
+  }
+
+  inline void Error(nostd::string_view format, const common::KeyValueIterable &attributes) noexcept
+  {
+    this->Log(Severity::kError, format, attributes);
+  }
+
+  inline void Error(nostd::string_view message) noexcept { this->Log(Severity::kError, message); }
+
+  inline void Fatal(const EventId &event_id,
+                    nostd::string_view format,
+                    const common::KeyValueIterable &attributes) noexcept
+  {
+    this->Log(Severity::kFatal, event_id, format, attributes);
+  }
+
+  inline void Fatal(int64_t event_id,
+                    nostd::string_view format,
+                    const common::KeyValueIterable &attributes) noexcept
+  {
+    this->Log(Severity::kFatal, EventId{event_id}, format, attributes);
+  }
+
+  inline void Fatal(nostd::string_view format, const common::KeyValueIterable &attributes) noexcept
+  {
+    this->Log(Severity::kFatal, format, attributes);
+  }
+
+  inline void Fatal(nostd::string_view message) noexcept { this->Log(Severity::kFatal, message); }
+
+  //
+  // End of OpenTelemetry C++ user-facing Log API.
+  //
+
+protected:
+  // TODO: discuss with community about naming for internal methods.
+  virtual bool EnabledImplementation(Severity /*severity*/,
+                                     const EventId & /*event_id*/) const noexcept
+  {
+    return false;
+  }
+
+  virtual bool EnabledImplementation(Severity /*severity*/, int64_t /*event_id*/) const noexcept
+  {
+    return false;
+  }
+
+  void SetMinimumSeverity(uint8_t severity_or_max) noexcept
+  {
+    OPENTELEMETRY_ATOMIC_WRITE_8(&minimum_severity_, severity_or_max);
+  }
+
+private:
+  template <class... ValueType>
+  void IgnoreTraitResult(ValueType &&...)
+  {}
+
+  //
+  // minimum_severity_ can be updated concurrently by multiple threads/cores, so race condition on
+  // read/write should be handled. And std::atomic can not be used here because it is not ABI
+  // compatible for OpenTelemetry C++ API.
+  //
+  mutable uint8_t minimum_severity_{kMaxSeverity};
+};
+}  // namespace logs
+OPENTELEMETRY_END_NAMESPACE

+ 71 - 0
ext/opentelemetry-cpp-1.21.0/api/include/opentelemetry/logs/logger_provider.h

@@ -0,0 +1,71 @@
+// Copyright The OpenTelemetry Authors
+// SPDX-License-Identifier: Apache-2.0
+
+#pragma once
+
+#include "opentelemetry/common/key_value_iterable.h"
+#include "opentelemetry/common/key_value_iterable_view.h"
+#include "opentelemetry/nostd/shared_ptr.h"
+#include "opentelemetry/nostd/span.h"
+#include "opentelemetry/nostd/string_view.h"
+#include "opentelemetry/nostd/type_traits.h"
+#include "opentelemetry/version.h"
+
+OPENTELEMETRY_BEGIN_NAMESPACE
+namespace logs
+{
+
+class Logger;
+
+/**
+ * Creates new Logger instances.
+ */
+class OPENTELEMETRY_EXPORT LoggerProvider
+{
+public:
+  virtual ~LoggerProvider() = default;
+
+  /**
+   * Gets or creates a named Logger instance.
+   *
+   * Optionally a version can be passed to create a named and versioned Logger
+   * instance.
+   *
+   * Optionally a configuration file name can be passed to create a configuration for
+   * the Logger instance.
+   *
+   */
+
+  virtual nostd::shared_ptr<Logger> GetLogger(
+      nostd::string_view logger_name,
+      nostd::string_view library_name            = "",
+      nostd::string_view library_version         = "",
+      nostd::string_view schema_url              = "",
+      const common::KeyValueIterable &attributes = common::NoopKeyValueIterable()) = 0;
+
+  nostd::shared_ptr<Logger> GetLogger(
+      nostd::string_view logger_name,
+      nostd::string_view library_name,
+      nostd::string_view library_version,
+      nostd::string_view schema_url,
+      std::initializer_list<std::pair<nostd::string_view, common::AttributeValue>> attributes)
+  {
+    return GetLogger(logger_name, library_name, library_version, schema_url,
+                     nostd::span<const std::pair<nostd::string_view, common::AttributeValue>>{
+                         attributes.begin(), attributes.end()});
+  }
+
+  template <class T,
+            nostd::enable_if_t<common::detail::is_key_value_iterable<T>::value> * = nullptr>
+  nostd::shared_ptr<Logger> GetLogger(nostd::string_view logger_name,
+                                      nostd::string_view library_name,
+                                      nostd::string_view library_version,
+                                      nostd::string_view schema_url,
+                                      const T &attributes)
+  {
+    return GetLogger(logger_name, library_name, library_version, schema_url,
+                     common::KeyValueIterableView<T>(attributes));
+  }
+};
+}  // namespace logs
+OPENTELEMETRY_END_NAMESPACE

+ 204 - 0
ext/opentelemetry-cpp-1.21.0/api/include/opentelemetry/logs/logger_type_traits.h

@@ -0,0 +1,204 @@
+// Copyright The OpenTelemetry Authors
+// SPDX-License-Identifier: Apache-2.0
+
+#pragma once
+
+#include <chrono>
+#include <memory>
+#include <type_traits>
+
+#include "opentelemetry/common/attribute_value.h"
+#include "opentelemetry/common/key_value_iterable.h"
+#include "opentelemetry/common/timestamp.h"
+#include "opentelemetry/logs/event_id.h"
+#include "opentelemetry/logs/log_record.h"
+#include "opentelemetry/logs/severity.h"
+#include "opentelemetry/nostd/string_view.h"
+#include "opentelemetry/nostd/type_traits.h"
+#include "opentelemetry/trace/span_context.h"
+#include "opentelemetry/trace/span_id.h"
+#include "opentelemetry/trace/trace_flags.h"
+#include "opentelemetry/trace/trace_id.h"
+#include "opentelemetry/version.h"
+
+OPENTELEMETRY_BEGIN_NAMESPACE
+namespace logs
+{
+namespace detail
+{
+template <class ValueType>
+struct LogRecordSetterTrait;
+
+template <>
+struct LogRecordSetterTrait<Severity>
+{
+  template <class ArgumentType>
+  inline static LogRecord *Set(LogRecord *log_record, ArgumentType &&arg) noexcept
+  {
+    log_record->SetSeverity(std::forward<ArgumentType>(arg));
+
+    return log_record;
+  }
+};
+
+template <>
+struct LogRecordSetterTrait<EventId>
+{
+  template <class ArgumentType>
+  inline static LogRecord *Set(LogRecord *log_record, ArgumentType &&arg) noexcept
+  {
+    log_record->SetEventId(arg.id_, nostd::string_view{arg.name_.get()});
+
+    return log_record;
+  }
+};
+
+template <>
+struct LogRecordSetterTrait<trace::SpanContext>
+{
+  template <class ArgumentType>
+  inline static LogRecord *Set(LogRecord *log_record, ArgumentType &&arg) noexcept
+  {
+    log_record->SetSpanId(arg.span_id());
+    log_record->SetTraceId(arg.trace_id());
+    log_record->SetTraceFlags(arg.trace_flags());
+
+    return log_record;
+  }
+};
+
+template <>
+struct LogRecordSetterTrait<trace::SpanId>
+{
+  template <class ArgumentType>
+  inline static LogRecord *Set(LogRecord *log_record, ArgumentType &&arg) noexcept
+  {
+    log_record->SetSpanId(std::forward<ArgumentType>(arg));
+
+    return log_record;
+  }
+};
+
+template <>
+struct LogRecordSetterTrait<trace::TraceId>
+{
+  template <class ArgumentType>
+  inline static LogRecord *Set(LogRecord *log_record, ArgumentType &&arg) noexcept
+  {
+    log_record->SetTraceId(std::forward<ArgumentType>(arg));
+
+    return log_record;
+  }
+};
+
+template <>
+struct LogRecordSetterTrait<trace::TraceFlags>
+{
+  template <class ArgumentType>
+  inline static LogRecord *Set(LogRecord *log_record, ArgumentType &&arg) noexcept
+  {
+    log_record->SetTraceFlags(std::forward<ArgumentType>(arg));
+
+    return log_record;
+  }
+};
+
+template <>
+struct LogRecordSetterTrait<common::SystemTimestamp>
+{
+  template <class ArgumentType>
+  inline static LogRecord *Set(LogRecord *log_record, ArgumentType &&arg) noexcept
+  {
+    log_record->SetTimestamp(std::forward<ArgumentType>(arg));
+
+    return log_record;
+  }
+};
+
+template <>
+struct LogRecordSetterTrait<std::chrono::system_clock::time_point>
+{
+  template <class ArgumentType>
+  inline static LogRecord *Set(LogRecord *log_record, ArgumentType &&arg) noexcept
+  {
+    log_record->SetTimestamp(common::SystemTimestamp(std::forward<ArgumentType>(arg)));
+
+    return log_record;
+  }
+};
+
+template <>
+struct LogRecordSetterTrait<common::KeyValueIterable>
+{
+  template <class ArgumentType>
+  inline static LogRecord *Set(LogRecord *log_record, ArgumentType &&arg) noexcept
+  {
+    arg.ForEachKeyValue(
+        [&log_record](nostd::string_view key, common::AttributeValue value) noexcept {
+          log_record->SetAttribute(key, value);
+          return true;
+        });
+
+    return log_record;
+  }
+};
+
+template <class ValueType>
+struct LogRecordSetterTrait
+{
+  static_assert(!std::is_same<nostd::unique_ptr<LogRecord>, ValueType>::value &&
+                    !std::is_same<std::unique_ptr<LogRecord>, ValueType>::value,
+                "unique_ptr<LogRecord> is not allowed, please use std::move()");
+
+  template <class ArgumentType,
+            nostd::enable_if_t<std::is_convertible<ArgumentType, nostd::string_view>::value ||
+                                   std::is_convertible<ArgumentType, common::AttributeValue>::value,
+                               void> * = nullptr>
+  inline static LogRecord *Set(LogRecord *log_record, ArgumentType &&arg) noexcept
+  {
+    log_record->SetBody(std::forward<ArgumentType>(arg));
+
+    return log_record;
+  }
+
+  template <class ArgumentType,
+            nostd::enable_if_t<std::is_base_of<common::KeyValueIterable, ArgumentType>::value, bool>
+                * = nullptr>
+  inline static LogRecord *Set(LogRecord *log_record, ArgumentType &&arg) noexcept
+  {
+    return LogRecordSetterTrait<common::KeyValueIterable>::Set(log_record,
+                                                               std::forward<ArgumentType>(arg));
+  }
+
+  template <class ArgumentType,
+            nostd::enable_if_t<common::detail::is_key_value_iterable<ArgumentType>::value, int> * =
+                nullptr>
+  inline static LogRecord *Set(LogRecord *log_record, ArgumentType &&arg) noexcept
+  {
+    for (auto &argv : arg)
+    {
+      log_record->SetAttribute(argv.first, argv.second);
+    }
+
+    return log_record;
+  }
+};
+
+template <class ValueType, class... ArgumentType>
+struct LogRecordHasType;
+
+template <class ValueType>
+struct LogRecordHasType<ValueType> : public std::false_type
+{};
+
+template <class ValueType, class TargetType, class... ArgumentType>
+struct LogRecordHasType<ValueType, TargetType, ArgumentType...>
+    : public std::conditional<std::is_same<ValueType, TargetType>::value,
+                              std::true_type,
+                              LogRecordHasType<ValueType, ArgumentType...>>::type
+{};
+
+}  // namespace detail
+
+}  // namespace logs
+OPENTELEMETRY_END_NAMESPACE

+ 131 - 0
ext/opentelemetry-cpp-1.21.0/api/include/opentelemetry/logs/noop.h

@@ -0,0 +1,131 @@
+// Copyright The OpenTelemetry Authors
+// SPDX-License-Identifier: Apache-2.0
+
+#pragma once
+
+// Please refer to provider.h for documentation on how to obtain a Logger object.
+//
+// This file is part of the internal implementation of OpenTelemetry. Nothing in this file should be
+// used directly. Please refer to logger.h for documentation on these interfaces.
+
+#include "opentelemetry/logs/event_logger.h"
+#include "opentelemetry/logs/event_logger_provider.h"
+#include "opentelemetry/logs/logger.h"
+#include "opentelemetry/logs/logger_provider.h"
+#include "opentelemetry/nostd/shared_ptr.h"
+#include "opentelemetry/nostd/string_view.h"
+#include "opentelemetry/nostd/unique_ptr.h"
+#include "opentelemetry/version.h"
+
+OPENTELEMETRY_BEGIN_NAMESPACE
+namespace common
+{
+class KeyValueIterable;
+}  // namespace common
+
+namespace logs
+{
+/**
+ * No-op implementation of Logger. This class should not be used directly. It should only be
+ * instantiated using a LoggerProvider's GetLogger() call.
+ */
+class NoopLogger final : public Logger
+{
+public:
+  const nostd::string_view GetName() noexcept override { return "noop logger"; }
+
+  nostd::unique_ptr<LogRecord> CreateLogRecord() noexcept override
+  {
+    /*
+     * Do not return memory shared between threads,
+     * a `new` + `delete` for each noop record can not be avoided,
+     * due to the semantic of unique_ptr.
+     */
+    return nostd::unique_ptr<LogRecord>(new NoopLogRecord());
+  }
+
+  using Logger::EmitLogRecord;
+
+  void EmitLogRecord(nostd::unique_ptr<LogRecord> &&) noexcept override {}
+
+private:
+  class NoopLogRecord : public LogRecord
+  {
+  public:
+    NoopLogRecord()           = default;
+    ~NoopLogRecord() override = default;
+
+    void SetTimestamp(common::SystemTimestamp /* timestamp */) noexcept override {}
+    void SetObservedTimestamp(common::SystemTimestamp /* timestamp */) noexcept override {}
+    void SetSeverity(logs::Severity /* severity */) noexcept override {}
+    void SetBody(const common::AttributeValue & /* message */) noexcept override {}
+    void SetAttribute(nostd::string_view /* key */,
+                      const common::AttributeValue & /* value */) noexcept override
+    {}
+    void SetEventId(int64_t /* id */, nostd::string_view /* name */) noexcept override {}
+    void SetTraceId(const trace::TraceId & /* trace_id */) noexcept override {}
+    void SetSpanId(const trace::SpanId & /* span_id */) noexcept override {}
+    void SetTraceFlags(const trace::TraceFlags & /* trace_flags */) noexcept override {}
+  };
+};
+
+/**
+ * No-op implementation of a LoggerProvider.
+ */
+class NoopLoggerProvider final : public LoggerProvider
+{
+public:
+  NoopLoggerProvider() : logger_{nostd::shared_ptr<NoopLogger>(new NoopLogger())} {}
+
+  nostd::shared_ptr<Logger> GetLogger(nostd::string_view /* logger_name */,
+                                      nostd::string_view /* library_name */,
+                                      nostd::string_view /* library_version */,
+                                      nostd::string_view /* schema_url */,
+                                      const common::KeyValueIterable & /* attributes */) override
+  {
+    return logger_;
+  }
+
+private:
+  nostd::shared_ptr<Logger> logger_;
+};
+
+#if OPENTELEMETRY_ABI_VERSION_NO < 2
+class NoopEventLogger final : public EventLogger
+{
+public:
+  NoopEventLogger() : logger_{nostd::shared_ptr<NoopLogger>(new NoopLogger())} {}
+
+  const nostd::string_view GetName() noexcept override { return "noop event logger"; }
+
+  nostd::shared_ptr<Logger> GetDelegateLogger() noexcept override { return logger_; }
+
+  void EmitEvent(nostd::string_view, nostd::unique_ptr<LogRecord> &&) noexcept override {}
+
+private:
+  nostd::shared_ptr<Logger> logger_;
+};
+
+/**
+ * No-op implementation of a EventLoggerProvider.
+ */
+class NoopEventLoggerProvider final : public EventLoggerProvider
+{
+public:
+  NoopEventLoggerProvider() : event_logger_{nostd::shared_ptr<EventLogger>(new NoopEventLogger())}
+  {}
+
+  nostd::shared_ptr<EventLogger> CreateEventLogger(
+      nostd::shared_ptr<Logger> /*delegate_logger*/,
+      nostd::string_view /*event_domain*/) noexcept override
+  {
+    return event_logger_;
+  }
+
+private:
+  nostd::shared_ptr<EventLogger> event_logger_;
+};
+#endif
+
+}  // namespace logs
+OPENTELEMETRY_END_NAMESPACE

+ 100 - 0
ext/opentelemetry-cpp-1.21.0/api/include/opentelemetry/logs/provider.h

@@ -0,0 +1,100 @@
+// Copyright The OpenTelemetry Authors
+// SPDX-License-Identifier: Apache-2.0
+
+#pragma once
+
+#include <mutex>
+
+#include "opentelemetry/common/macros.h"
+#include "opentelemetry/common/spin_lock_mutex.h"
+#include "opentelemetry/logs/noop.h"
+#include "opentelemetry/nostd/shared_ptr.h"
+#include "opentelemetry/version.h"
+
+OPENTELEMETRY_BEGIN_NAMESPACE
+namespace logs
+{
+
+#if OPENTELEMETRY_ABI_VERSION_NO < 2
+class EventLoggerProvider;
+#endif
+class LoggerProvider;
+
+/**
+ * Stores the singleton global LoggerProvider.
+ */
+class OPENTELEMETRY_EXPORT Provider
+{
+public:
+  /**
+   * Returns the singleton LoggerProvider.
+   *
+   * By default, a no-op LoggerProvider is returned. This will never return a
+   * nullptr LoggerProvider.
+   */
+  static nostd::shared_ptr<LoggerProvider> GetLoggerProvider() noexcept
+  {
+    std::lock_guard<common::SpinLockMutex> guard(GetLock());
+    return nostd::shared_ptr<LoggerProvider>(GetProvider());
+  }
+
+  /**
+   * Changes the singleton LoggerProvider.
+   */
+  static void SetLoggerProvider(const nostd::shared_ptr<LoggerProvider> &tp) noexcept
+  {
+    std::lock_guard<common::SpinLockMutex> guard(GetLock());
+    GetProvider() = tp;
+  }
+
+#if OPENTELEMETRY_ABI_VERSION_NO < 2
+  /**
+   * Returns the singleton EventLoggerProvider.
+   *
+   * By default, a no-op EventLoggerProvider is returned. This will never return a
+   * nullptr EventLoggerProvider.
+   */
+  OPENTELEMETRY_DEPRECATED static nostd::shared_ptr<EventLoggerProvider>
+  GetEventLoggerProvider() noexcept
+  {
+    std::lock_guard<common::SpinLockMutex> guard(GetLock());
+    return nostd::shared_ptr<EventLoggerProvider>(GetEventProvider());
+  }
+
+  /**
+   * Changes the singleton EventLoggerProvider.
+   */
+  OPENTELEMETRY_DEPRECATED static void SetEventLoggerProvider(
+      const nostd::shared_ptr<EventLoggerProvider> &tp) noexcept
+  {
+    std::lock_guard<common::SpinLockMutex> guard(GetLock());
+    GetEventProvider() = tp;
+  }
+#endif
+
+private:
+  OPENTELEMETRY_API_SINGLETON static nostd::shared_ptr<LoggerProvider> &GetProvider() noexcept
+  {
+    static nostd::shared_ptr<LoggerProvider> provider(new NoopLoggerProvider);
+    return provider;
+  }
+
+#if OPENTELEMETRY_ABI_VERSION_NO < 2
+  OPENTELEMETRY_DEPRECATED
+  OPENTELEMETRY_API_SINGLETON static nostd::shared_ptr<EventLoggerProvider> &
+  GetEventProvider() noexcept
+  {
+    static nostd::shared_ptr<EventLoggerProvider> provider(new NoopEventLoggerProvider);
+    return provider;
+  }
+#endif
+
+  OPENTELEMETRY_API_SINGLETON static common::SpinLockMutex &GetLock() noexcept
+  {
+    static common::SpinLockMutex lock;
+    return lock;
+  }
+};
+
+}  // namespace logs
+OPENTELEMETRY_END_NAMESPACE

Some files were not shown because too many files changed in this diff