collector_test.cc 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. // Copyright The OpenTelemetry Authors
  2. // SPDX-License-Identifier: Apache-2.0
  3. #include <gtest/gtest.h>
  4. #include <prometheus/metric_family.h>
  5. #include <stddef.h>
  6. #include <chrono>
  7. #include <thread>
  8. #include <vector>
  9. #include "opentelemetry/exporters/prometheus/collector.h"
  10. #include "opentelemetry/metrics/meter_provider.h"
  11. #include "opentelemetry/sdk/metrics/export/metric_producer.h"
  12. #include "opentelemetry/sdk/metrics/instruments.h"
  13. #include "opentelemetry/sdk/metrics/metric_reader.h"
  14. #include "prometheus_test_helper.h"
  15. using opentelemetry::exporter::metrics::PrometheusCollector;
  16. using opentelemetry::sdk::metrics::MetricProducer;
  17. using opentelemetry::sdk::metrics::ResourceMetrics;
  18. namespace metric_api = opentelemetry::metrics;
  19. namespace metric_sdk = opentelemetry::sdk::metrics;
  20. namespace metric_exporter = opentelemetry::exporter::metrics;
  21. class MockMetricProducer : public MetricProducer
  22. {
  23. TestDataPoints test_data_points_;
  24. public:
  25. MockMetricProducer(std::chrono::microseconds sleep_ms = std::chrono::microseconds::zero())
  26. : sleep_ms_{sleep_ms}
  27. {}
  28. MetricProducer::Result Produce() noexcept override
  29. {
  30. std::this_thread::sleep_for(sleep_ms_);
  31. data_sent_size_++;
  32. ResourceMetrics data = test_data_points_.CreateSumPointData();
  33. return {data, MetricProducer::Status::kSuccess};
  34. }
  35. size_t GetDataCount() { return data_sent_size_; }
  36. private:
  37. std::chrono::microseconds sleep_ms_;
  38. size_t data_sent_size_{0};
  39. };
  40. class MockMetricReader : public opentelemetry::sdk::metrics::MetricReader
  41. {
  42. public:
  43. opentelemetry::sdk::metrics::AggregationTemporality GetAggregationTemporality(
  44. opentelemetry::sdk::metrics::InstrumentType /* instrument_type */) const noexcept override
  45. {
  46. // Prometheus exporter only support Cumulative
  47. return opentelemetry::sdk::metrics::AggregationTemporality::kCumulative;
  48. }
  49. private:
  50. bool OnForceFlush(std::chrono::microseconds /* timeout */) noexcept override { return true; }
  51. bool OnShutDown(std::chrono::microseconds /* timeout */) noexcept override { return true; }
  52. void OnInitialized() noexcept override {}
  53. };
  54. // ==================== Test for addMetricsData() function ======================
  55. /**
  56. * AddMetricData() should be able to successfully add a collection
  57. * of SumPointData. It checks that the cumulative
  58. * sum of updates to the aggregator of a record before and after AddMetricData()
  59. * is called are equal.
  60. */
  61. TEST(PrometheusCollector, BasicTests)
  62. {
  63. MockMetricReader reader;
  64. MockMetricProducer producer;
  65. reader.SetMetricProducer(&producer);
  66. PrometheusCollector collector(&reader, true, false);
  67. auto data = collector.Collect();
  68. // Collection size should be the same as the size
  69. // of the records collection produced by MetricProducer.
  70. ASSERT_EQ(data.size(), 2);
  71. }