metrics_ostream.cc 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226
  1. // Copyright The OpenTelemetry Authors
  2. // SPDX-License-Identifier: Apache-2.0
  3. #include <chrono>
  4. #include <memory>
  5. #include <string>
  6. #include <thread>
  7. #include <utility>
  8. #include <vector>
  9. #include "opentelemetry/common/attribute_value.h"
  10. #include "opentelemetry/exporters/ostream/metric_exporter_factory.h"
  11. #include "opentelemetry/metrics/meter_provider.h"
  12. #include "opentelemetry/sdk/metrics/aggregation/aggregation_config.h"
  13. #include "opentelemetry/sdk/metrics/export/periodic_exporting_metric_reader_factory.h"
  14. #include "opentelemetry/sdk/metrics/export/periodic_exporting_metric_reader_options.h"
  15. #include "opentelemetry/sdk/metrics/instruments.h"
  16. #include "opentelemetry/sdk/metrics/meter_context.h"
  17. #include "opentelemetry/sdk/metrics/meter_context_factory.h"
  18. #include "opentelemetry/sdk/metrics/meter_provider.h"
  19. #include "opentelemetry/sdk/metrics/meter_provider_factory.h"
  20. #include "opentelemetry/sdk/metrics/metric_reader.h"
  21. #include "opentelemetry/sdk/metrics/provider.h"
  22. #include "opentelemetry/sdk/metrics/push_metric_exporter.h"
  23. #include "opentelemetry/sdk/metrics/view/instrument_selector.h"
  24. #include "opentelemetry/sdk/metrics/view/instrument_selector_factory.h"
  25. #include "opentelemetry/sdk/metrics/view/meter_selector.h"
  26. #include "opentelemetry/sdk/metrics/view/meter_selector_factory.h"
  27. #include "opentelemetry/sdk/metrics/view/view.h"
  28. #include "opentelemetry/sdk/metrics/view/view_factory.h"
  29. #ifdef BAZEL_BUILD
  30. # include "examples/common/metrics_foo_library/foo_library.h"
  31. #else
  32. # include "metrics_foo_library/foo_library.h"
  33. #endif
  34. namespace metrics_sdk = opentelemetry::sdk::metrics;
  35. namespace common = opentelemetry::common;
  36. namespace exportermetrics = opentelemetry::exporter::metrics;
  37. namespace metrics_api = opentelemetry::metrics;
  38. namespace
  39. {
  40. void InitMetrics(const std::string &name)
  41. {
  42. auto exporter = exportermetrics::OStreamMetricExporterFactory::Create();
  43. std::string version{"1.2.0"};
  44. std::string schema{"https://opentelemetry.io/schemas/1.2.0"};
  45. // Initialize and set the global MeterProvider
  46. metrics_sdk::PeriodicExportingMetricReaderOptions options;
  47. options.export_interval_millis = std::chrono::milliseconds(1000);
  48. options.export_timeout_millis = std::chrono::milliseconds(500);
  49. auto reader =
  50. metrics_sdk::PeriodicExportingMetricReaderFactory::Create(std::move(exporter), options);
  51. auto context = metrics_sdk::MeterContextFactory::Create();
  52. context->AddMetricReader(std::move(reader));
  53. auto provider = opentelemetry::sdk::metrics::MeterProviderFactory::Create(std::move(context));
  54. // counter view
  55. std::string counter_name = name + "_counter";
  56. std::string unit = "counter-unit";
  57. auto instrument_selector = metrics_sdk::InstrumentSelectorFactory::Create(
  58. metrics_sdk::InstrumentType::kCounter, counter_name, unit);
  59. auto meter_selector = metrics_sdk::MeterSelectorFactory::Create(name, version, schema);
  60. auto sum_view = metrics_sdk::ViewFactory::Create(name, "description", unit,
  61. metrics_sdk::AggregationType::kSum);
  62. provider->AddView(std::move(instrument_selector), std::move(meter_selector), std::move(sum_view));
  63. // observable counter view
  64. std::string observable_counter_name = name + "_observable_counter";
  65. auto observable_instrument_selector = metrics_sdk::InstrumentSelectorFactory::Create(
  66. metrics_sdk::InstrumentType::kObservableCounter, observable_counter_name, unit);
  67. auto observable_meter_selector = metrics_sdk::MeterSelectorFactory::Create(name, version, schema);
  68. auto observable_sum_view = metrics_sdk::ViewFactory::Create(name, "test_description", unit,
  69. metrics_sdk::AggregationType::kSum);
  70. provider->AddView(std::move(observable_instrument_selector), std::move(observable_meter_selector),
  71. std::move(observable_sum_view));
  72. // histogram view
  73. std::string histogram_name = name + "_histogram";
  74. unit = "histogram-unit";
  75. auto histogram_instrument_selector = metrics_sdk::InstrumentSelectorFactory::Create(
  76. metrics_sdk::InstrumentType::kHistogram, histogram_name, unit);
  77. auto histogram_meter_selector = metrics_sdk::MeterSelectorFactory::Create(name, version, schema);
  78. auto histogram_aggregation_config = std::unique_ptr<metrics_sdk::HistogramAggregationConfig>(
  79. new metrics_sdk::HistogramAggregationConfig);
  80. histogram_aggregation_config->boundaries_ = std::vector<double>{
  81. 0.0, 50.0, 100.0, 250.0, 500.0, 750.0, 1000.0, 2500.0, 5000.0, 10000.0, 20000.0};
  82. std::shared_ptr<metrics_sdk::AggregationConfig> aggregation_config(
  83. std::move(histogram_aggregation_config));
  84. auto histogram_view = metrics_sdk::ViewFactory::Create(
  85. name, "description", unit, metrics_sdk::AggregationType::kHistogram, aggregation_config);
  86. provider->AddView(std::move(histogram_instrument_selector), std::move(histogram_meter_selector),
  87. std::move(histogram_view));
  88. // hisogram view with base2 exponential aggregation
  89. std::string histogram_base2_name = name + "_exponential_histogram";
  90. unit = "histogram-unit";
  91. auto histogram_base2_instrument_selector = metrics_sdk::InstrumentSelectorFactory::Create(
  92. metrics_sdk::InstrumentType::kHistogram, histogram_base2_name, unit);
  93. auto histogram_base2_meter_selector =
  94. metrics_sdk::MeterSelectorFactory::Create(name, version, schema);
  95. auto histogram_base2_aggregation_config =
  96. std::unique_ptr<metrics_sdk::Base2ExponentialHistogramAggregationConfig>(
  97. new metrics_sdk::Base2ExponentialHistogramAggregationConfig);
  98. histogram_base2_aggregation_config->max_scale_ = 3;
  99. histogram_base2_aggregation_config->record_min_max_ = true;
  100. histogram_base2_aggregation_config->max_buckets_ = 100;
  101. std::shared_ptr<metrics_sdk::AggregationConfig> base2_aggregation_config(
  102. std::move(histogram_base2_aggregation_config));
  103. auto histogram_base2_view = metrics_sdk::ViewFactory::Create(
  104. name, "description", unit, metrics_sdk::AggregationType::kBase2ExponentialHistogram,
  105. base2_aggregation_config);
  106. provider->AddView(std::move(histogram_base2_instrument_selector),
  107. std::move(histogram_base2_meter_selector), std::move(histogram_base2_view));
  108. std::shared_ptr<opentelemetry::metrics::MeterProvider> api_provider(std::move(provider));
  109. metrics_sdk::Provider::SetMeterProvider(api_provider);
  110. }
  111. void CleanupMetrics()
  112. {
  113. std::shared_ptr<metrics_api::MeterProvider> none;
  114. metrics_sdk::Provider::SetMeterProvider(none);
  115. }
  116. } // namespace
  117. int main(int argc, char **argv)
  118. {
  119. std::string example_type;
  120. if (argc >= 2)
  121. {
  122. example_type = argv[1];
  123. }
  124. std::string name{"ostream_metric_example"};
  125. InitMetrics(name);
  126. if (example_type == "counter")
  127. {
  128. foo_library::counter_example(name);
  129. }
  130. else if (example_type == "observable_counter")
  131. {
  132. foo_library::observable_counter_example(name);
  133. }
  134. else if (example_type == "histogram")
  135. {
  136. foo_library::histogram_example(name);
  137. }
  138. else if (example_type == "exponential_histogram")
  139. {
  140. foo_library::histogram_exp_example(name);
  141. }
  142. #if OPENTELEMETRY_ABI_VERSION_NO >= 2
  143. else if (example_type == "gauge")
  144. {
  145. foo_library::gauge_example(name);
  146. }
  147. #endif
  148. else if (example_type == "semconv_counter")
  149. {
  150. foo_library::semconv_counter_example();
  151. }
  152. else if (example_type == "semconv_observable_counter")
  153. {
  154. foo_library::semconv_observable_counter_example();
  155. }
  156. else if (example_type == "semconv_histogram")
  157. {
  158. foo_library::semconv_histogram_example();
  159. }
  160. else
  161. {
  162. std::thread counter_example{&foo_library::counter_example, name};
  163. std::thread observable_counter_example{&foo_library::observable_counter_example, name};
  164. std::thread histogram_example{&foo_library::histogram_example, name};
  165. std::thread histogram_exp_example{&foo_library::histogram_exp_example, name};
  166. #if OPENTELEMETRY_ABI_VERSION_NO >= 2
  167. std::thread gauge_example{&foo_library::gauge_example, name};
  168. #endif
  169. std::thread semconv_counter_example{&foo_library::semconv_counter_example};
  170. std::thread semconv_observable_counter_example{
  171. &foo_library::semconv_observable_counter_example};
  172. std::thread semconv_histogram_example{&foo_library::semconv_histogram_example};
  173. counter_example.join();
  174. observable_counter_example.join();
  175. histogram_example.join();
  176. histogram_exp_example.join();
  177. #if OPENTELEMETRY_ABI_VERSION_NO >= 2
  178. gauge_example.join();
  179. #endif
  180. semconv_counter_example.join();
  181. semconv_observable_counter_example.join();
  182. semconv_histogram_example.join();
  183. }
  184. CleanupMetrics();
  185. return 0;
  186. }