2
0

main.cc 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. // Copyright The OpenTelemetry Authors
  2. // SPDX-License-Identifier: Apache-2.0
  3. #include <cstdio>
  4. #include <memory>
  5. #include <string>
  6. #include <thread>
  7. #include <utility>
  8. #include "opentelemetry/common/attribute_value.h"
  9. #include "opentelemetry/exporters/prometheus/exporter_factory.h"
  10. #include "opentelemetry/exporters/prometheus/exporter_options.h"
  11. #include "opentelemetry/metrics/meter_provider.h"
  12. #include "opentelemetry/sdk/metrics/instruments.h"
  13. #include "opentelemetry/sdk/metrics/meter_provider.h"
  14. #include "opentelemetry/sdk/metrics/meter_provider_factory.h"
  15. #include "opentelemetry/sdk/metrics/metric_reader.h"
  16. #include "opentelemetry/sdk/metrics/provider.h"
  17. #include "opentelemetry/sdk/metrics/view/instrument_selector.h"
  18. #include "opentelemetry/sdk/metrics/view/instrument_selector_factory.h"
  19. #include "opentelemetry/sdk/metrics/view/meter_selector.h"
  20. #include "opentelemetry/sdk/metrics/view/meter_selector_factory.h"
  21. #include "opentelemetry/sdk/metrics/view/view.h"
  22. #include "opentelemetry/sdk/metrics/view/view_factory.h"
  23. #ifdef BAZEL_BUILD
  24. # include "examples/common/metrics_foo_library/foo_library.h"
  25. #else
  26. # include "metrics_foo_library/foo_library.h"
  27. #endif
  28. namespace metrics_sdk = opentelemetry::sdk::metrics;
  29. namespace common = opentelemetry::common;
  30. namespace metrics_exporter = opentelemetry::exporter::metrics;
  31. namespace metrics_api = opentelemetry::metrics;
  32. namespace
  33. {
  34. void InitMetrics(const std::string &name, const std::string &addr)
  35. {
  36. metrics_exporter::PrometheusExporterOptions opts;
  37. if (!addr.empty())
  38. {
  39. opts.url = addr;
  40. }
  41. std::puts("PrometheusExporter example program running ...");
  42. std::string version{"1.2.0"};
  43. std::string schema{"https://opentelemetry.io/schemas/1.2.0"};
  44. auto prometheus_exporter = metrics_exporter::PrometheusExporterFactory::Create(opts);
  45. // Initialize and set the global MeterProvider
  46. auto u_provider = metrics_sdk::MeterProviderFactory::Create();
  47. auto *p = static_cast<metrics_sdk::MeterProvider *>(u_provider.get());
  48. p->AddMetricReader(std::move(prometheus_exporter));
  49. // counter view
  50. std::string counter_name = name + "_counter";
  51. std::string counter_unit = "unit";
  52. auto instrument_selector = metrics_sdk::InstrumentSelectorFactory::Create(
  53. metrics_sdk::InstrumentType::kCounter, counter_name, counter_unit);
  54. auto meter_selector = metrics_sdk::MeterSelectorFactory::Create(name, version, schema);
  55. auto sum_view = metrics_sdk::ViewFactory::Create(counter_name, "description", counter_unit,
  56. metrics_sdk::AggregationType::kSum);
  57. p->AddView(std::move(instrument_selector), std::move(meter_selector), std::move(sum_view));
  58. // histogram view
  59. std::string histogram_name = name + "_histogram";
  60. std::string histogram_unit = "unit";
  61. auto histogram_instrument_selector = metrics_sdk::InstrumentSelectorFactory::Create(
  62. metrics_sdk::InstrumentType::kHistogram, histogram_name, histogram_unit);
  63. auto histogram_meter_selector = metrics_sdk::MeterSelectorFactory::Create(name, version, schema);
  64. auto histogram_view = metrics_sdk::ViewFactory::Create(
  65. histogram_name, "description", histogram_unit, metrics_sdk::AggregationType::kHistogram);
  66. p->AddView(std::move(histogram_instrument_selector), std::move(histogram_meter_selector),
  67. std::move(histogram_view));
  68. std::shared_ptr<opentelemetry::metrics::MeterProvider> provider(std::move(u_provider));
  69. metrics_sdk::Provider::SetMeterProvider(provider);
  70. }
  71. void CleanupMetrics()
  72. {
  73. std::shared_ptr<metrics_api::MeterProvider> none;
  74. metrics_sdk::Provider::SetMeterProvider(none);
  75. }
  76. } // namespace
  77. int main(int argc, char **argv)
  78. {
  79. std::string example_type;
  80. std::string addr{"localhost:9464"};
  81. if (argc == 1)
  82. {
  83. std::puts("usage: $prometheus_example <example type> <url>");
  84. }
  85. if (argc >= 2)
  86. {
  87. example_type = argv[1];
  88. }
  89. if (argc > 2)
  90. {
  91. addr = argv[2];
  92. }
  93. std::string name{"prometheus_metric_example"};
  94. InitMetrics(name, addr);
  95. if (example_type == "counter")
  96. {
  97. foo_library::counter_example(name);
  98. }
  99. else if (example_type == "histogram")
  100. {
  101. foo_library::histogram_example(name);
  102. }
  103. else
  104. {
  105. std::thread counter_example{&foo_library::counter_example, name};
  106. std::thread histogram_example{&foo_library::histogram_example, name};
  107. counter_example.join();
  108. histogram_example.join();
  109. }
  110. CleanupMetrics();
  111. return 0;
  112. }