foo_library.cc 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  1. // Copyright The OpenTelemetry Authors
  2. // SPDX-License-Identifier: Apache-2.0
  3. #include <stdint.h>
  4. #include <stdlib.h>
  5. #include <chrono>
  6. #include <cmath>
  7. #include <map>
  8. #include <thread>
  9. #include <utility>
  10. #include <vector>
  11. #include "foo_library.h"
  12. #include "opentelemetry/common/key_value_iterable_view.h"
  13. #include "opentelemetry/context/context.h"
  14. #include "opentelemetry/metrics/async_instruments.h"
  15. #include "opentelemetry/metrics/meter.h"
  16. #include "opentelemetry/metrics/meter_provider.h"
  17. #include "opentelemetry/metrics/observer_result.h"
  18. #include "opentelemetry/metrics/provider.h"
  19. #include "opentelemetry/metrics/sync_instruments.h"
  20. #include "opentelemetry/nostd/shared_ptr.h"
  21. #include "opentelemetry/nostd/variant.h"
  22. #include "opentelemetry/semconv/http_metrics.h"
  23. #include "opentelemetry/semconv/incubating/container_metrics.h"
  24. #include "opentelemetry/semconv/incubating/system_metrics.h"
  25. namespace metrics_api = opentelemetry::metrics;
  26. namespace
  27. {
  28. static opentelemetry::nostd::shared_ptr<metrics_api::ObservableInstrument>
  29. double_observable_counter;
  30. std::map<std::string, std::string> get_random_attr()
  31. {
  32. const std::vector<std::pair<std::string, std::string>> labels = {{"key1", "value1"},
  33. {"key2", "value2"},
  34. {"key3", "value3"},
  35. {"key4", "value4"},
  36. {"key5", "value5"}};
  37. return std::map<std::string, std::string>{labels[rand() % (labels.size() - 1)],
  38. labels[rand() % (labels.size() - 1)]};
  39. }
  40. class MeasurementFetcher
  41. {
  42. public:
  43. static void Fetcher(opentelemetry::metrics::ObserverResult observer_result, void * /* state */)
  44. {
  45. if (opentelemetry::nostd::holds_alternative<
  46. opentelemetry::nostd::shared_ptr<opentelemetry::metrics::ObserverResultT<double>>>(
  47. observer_result))
  48. {
  49. double random_incr = (rand() % 5) + 1.1;
  50. value_ += random_incr;
  51. std::map<std::string, std::string> labels = get_random_attr();
  52. opentelemetry::nostd::get<
  53. opentelemetry::nostd::shared_ptr<opentelemetry::metrics::ObserverResultT<double>>>(
  54. observer_result)
  55. ->Observe(value_, labels);
  56. }
  57. }
  58. static double value_;
  59. };
  60. double MeasurementFetcher::value_ = 0.0;
  61. } // namespace
  62. void foo_library::counter_example(const std::string &name)
  63. {
  64. std::string counter_name = name + "_counter";
  65. auto provider = metrics_api::Provider::GetMeterProvider();
  66. opentelemetry::nostd::shared_ptr<metrics_api::Meter> meter = provider->GetMeter(name, "1.2.0");
  67. auto double_counter = meter->CreateDoubleCounter(counter_name);
  68. for (uint32_t i = 0; i < 20; ++i)
  69. {
  70. double val = (rand() % 700) + 1.1;
  71. double_counter->Add(val);
  72. std::this_thread::sleep_for(std::chrono::milliseconds(500));
  73. }
  74. }
  75. void foo_library::observable_counter_example(const std::string &name)
  76. {
  77. std::string counter_name = name + "_observable_counter";
  78. auto provider = metrics_api::Provider::GetMeterProvider();
  79. opentelemetry::nostd::shared_ptr<metrics_api::Meter> meter = provider->GetMeter(name, "1.2.0");
  80. double_observable_counter = meter->CreateDoubleObservableCounter(counter_name);
  81. double_observable_counter->AddCallback(MeasurementFetcher::Fetcher, nullptr);
  82. for (uint32_t i = 0; i < 20; ++i)
  83. {
  84. std::this_thread::sleep_for(std::chrono::milliseconds(500));
  85. }
  86. }
  87. void foo_library::histogram_example(const std::string &name)
  88. {
  89. std::string histogram_name = name + "_histogram";
  90. auto provider = metrics_api::Provider::GetMeterProvider();
  91. opentelemetry::nostd::shared_ptr<metrics_api::Meter> meter = provider->GetMeter(name, "1.2.0");
  92. auto histogram_counter = meter->CreateDoubleHistogram(histogram_name, "des", "histogram-unit");
  93. auto context = opentelemetry::context::Context{};
  94. for (uint32_t i = 0; i < 20; ++i)
  95. {
  96. double val = (rand() % 700) + 1.1;
  97. std::map<std::string, std::string> labels = get_random_attr();
  98. auto labelkv = opentelemetry::common::KeyValueIterableView<decltype(labels)>{labels};
  99. histogram_counter->Record(val, labelkv, context);
  100. std::this_thread::sleep_for(std::chrono::milliseconds(250));
  101. }
  102. }
  103. void foo_library::histogram_exp_example(const std::string &name)
  104. {
  105. std::string histogram_name = name + "_exponential_histogram";
  106. auto provider = metrics_api::Provider::GetMeterProvider();
  107. auto meter = provider->GetMeter(name, "1.2.0");
  108. auto histogram_counter = meter->CreateDoubleHistogram(histogram_name, "des", "histogram-unit");
  109. auto context = opentelemetry::context::Context{};
  110. for (uint32_t i = 0; i < 20; ++i)
  111. {
  112. double val = (rand() % 700) + 1.1;
  113. std::map<std::string, std::string> labels = get_random_attr();
  114. auto labelkv = opentelemetry::common::KeyValueIterableView<decltype(labels)>{labels};
  115. histogram_counter->Record(val, labelkv, context);
  116. std::this_thread::sleep_for(std::chrono::milliseconds(250));
  117. }
  118. }
  119. #if OPENTELEMETRY_ABI_VERSION_NO >= 2
  120. void foo_library::gauge_example(const std::string &name)
  121. {
  122. std::string gauge_name = name + "_gauge";
  123. auto provider = metrics_api::Provider::GetMeterProvider();
  124. opentelemetry::nostd::shared_ptr<metrics_api::Meter> meter = provider->GetMeter(name, "1.2.0");
  125. auto gauge = meter->CreateInt64Gauge(gauge_name, "des", "unit");
  126. auto context = opentelemetry::context::Context{};
  127. for (uint32_t i = 0; i < 20; ++i)
  128. {
  129. int64_t val = (rand() % 100) + 100;
  130. std::map<std::string, std::string> labels = get_random_attr();
  131. auto labelkv = opentelemetry::common::KeyValueIterableView<decltype(labels)>{labels};
  132. gauge->Record(val, labelkv, context);
  133. std::this_thread::sleep_for(std::chrono::milliseconds(250));
  134. }
  135. }
  136. #endif
  137. void foo_library::semconv_counter_example()
  138. {
  139. auto provider = metrics_api::Provider::GetMeterProvider();
  140. opentelemetry::nostd::shared_ptr<metrics_api::Meter> meter = provider->GetMeter("demo", "1.2.0");
  141. auto double_counter =
  142. opentelemetry::semconv::container::CreateSyncDoubleMetricContainerDiskIo(meter.get());
  143. for (uint32_t i = 0; i < 20; ++i)
  144. {
  145. double val = (rand() % 700) + 1.1;
  146. double_counter->Add(val);
  147. std::this_thread::sleep_for(std::chrono::milliseconds(500));
  148. }
  149. }
  150. void foo_library::semconv_observable_counter_example()
  151. {
  152. auto provider = metrics_api::Provider::GetMeterProvider();
  153. opentelemetry::nostd::shared_ptr<metrics_api::Meter> meter = provider->GetMeter("demo", "1.2.0");
  154. double_observable_counter =
  155. opentelemetry::semconv::system::CreateAsyncDoubleMetricSystemCpuTime(meter.get());
  156. double_observable_counter->AddCallback(MeasurementFetcher::Fetcher, nullptr);
  157. for (uint32_t i = 0; i < 20; ++i)
  158. {
  159. std::this_thread::sleep_for(std::chrono::milliseconds(500));
  160. }
  161. }
  162. void foo_library::semconv_histogram_example()
  163. {
  164. auto provider = metrics_api::Provider::GetMeterProvider();
  165. opentelemetry::nostd::shared_ptr<metrics_api::Meter> meter = provider->GetMeter("demo", "1.2.0");
  166. auto histogram_counter =
  167. opentelemetry::semconv::http::CreateSyncInt64MetricHttpClientRequestDuration(meter.get());
  168. auto context = opentelemetry::context::Context{};
  169. for (uint32_t i = 0; i < 20; ++i)
  170. {
  171. double val = (rand() % 700) + 1.1;
  172. uint64_t int_val = std::llround(val);
  173. std::map<std::string, std::string> labels = get_random_attr();
  174. auto labelkv = opentelemetry::common::KeyValueIterableView<decltype(labels)>{labels};
  175. histogram_counter->Record(int_val, labelkv, context);
  176. std::this_thread::sleep_for(std::chrono::milliseconds(250));
  177. }
  178. }