prometheus_decoder_ut.cpp 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478
  1. #include "prometheus.h"
  2. #include <library/cpp/monlib/encode/protobuf/protobuf.h>
  3. #include <library/cpp/testing/unittest/registar.h>
  4. using namespace NMonitoring;
  5. #define ASSERT_LABEL_EQUAL(label, name, value) do { \
  6. UNIT_ASSERT_STRINGS_EQUAL((label).GetName(), name); \
  7. UNIT_ASSERT_STRINGS_EQUAL((label).GetValue(), value); \
  8. } while (false)
  9. #define ASSERT_DOUBLE_POINT(s, time, value) do { \
  10. UNIT_ASSERT_VALUES_EQUAL((s).GetTime(), (time).MilliSeconds()); \
  11. UNIT_ASSERT_EQUAL((s).GetValueCase(), NProto::TSingleSample::kFloat64); \
  12. UNIT_ASSERT_DOUBLES_EQUAL((s).GetFloat64(), value, std::numeric_limits<double>::epsilon()); \
  13. } while (false)
  14. #define ASSERT_UINT_POINT(s, time, value) do { \
  15. UNIT_ASSERT_VALUES_EQUAL((s).GetTime(), (time).MilliSeconds()); \
  16. UNIT_ASSERT_EQUAL((s).GetValueCase(), NProto::TSingleSample::kUint64); \
  17. UNIT_ASSERT_VALUES_EQUAL((s).GetUint64(), value); \
  18. } while (false)
  19. #define ASSERT_HIST_POINT(s, time, expected) do { \
  20. UNIT_ASSERT_VALUES_EQUAL((s).GetTime(), time.MilliSeconds()); \
  21. UNIT_ASSERT_EQUAL((s).GetValueCase(), NProto::TSingleSample::kHistogram);\
  22. UNIT_ASSERT_VALUES_EQUAL((s).GetHistogram().BoundsSize(), (expected).Count()); \
  23. UNIT_ASSERT_VALUES_EQUAL((s).GetHistogram().ValuesSize(), (expected).Count()); \
  24. for (size_t i = 0; i < (s).GetHistogram().BoundsSize(); i++) { \
  25. UNIT_ASSERT_DOUBLES_EQUAL((s).GetHistogram().GetBounds(i), (expected).UpperBound(i), Min<double>()); \
  26. UNIT_ASSERT_VALUES_EQUAL((s).GetHistogram().GetValues(i), (expected).Value(i)); \
  27. } \
  28. } while (false)
  29. Y_UNIT_TEST_SUITE(TPrometheusDecoderTest) {
  30. NProto::TSingleSamplesList Decode(TStringBuf data) {
  31. NProto::TSingleSamplesList samples;
  32. {
  33. IMetricEncoderPtr e = EncoderProtobuf(&samples);
  34. DecodePrometheus(data, e.Get());
  35. }
  36. return samples;
  37. }
  38. Y_UNIT_TEST(Empty) {
  39. {
  40. auto samples = Decode("");
  41. UNIT_ASSERT_EQUAL(samples.SamplesSize(), 0);
  42. }
  43. {
  44. auto samples = Decode("\n");
  45. UNIT_ASSERT_EQUAL(samples.SamplesSize(), 0);
  46. }
  47. {
  48. auto samples = Decode("\n \n \n");
  49. UNIT_ASSERT_EQUAL(samples.SamplesSize(), 0);
  50. }
  51. {
  52. auto samples = Decode("\t\n\t\n");
  53. UNIT_ASSERT_EQUAL(samples.SamplesSize(), 0);
  54. }
  55. }
  56. Y_UNIT_TEST(Minimal) {
  57. auto samples = Decode(
  58. "minimal_metric 1.234\n"
  59. "another_metric -3e3 103948\n"
  60. "# Even that:\n"
  61. "no_labels{} 3\n"
  62. "# HELP line for non-existing metric will be ignored.\n");
  63. UNIT_ASSERT_EQUAL(samples.SamplesSize(), 3);
  64. {
  65. auto& s = samples.GetSamples(0);
  66. UNIT_ASSERT_EQUAL(s.GetMetricType(), NProto::EMetricType::GAUGE);
  67. UNIT_ASSERT_EQUAL(1, s.LabelsSize());
  68. ASSERT_LABEL_EQUAL(s.GetLabels(0), "sensor", "minimal_metric");
  69. ASSERT_DOUBLE_POINT(s, TInstant::Zero(), 1.234);
  70. }
  71. {
  72. auto& s = samples.GetSamples(1);
  73. UNIT_ASSERT_EQUAL(s.GetMetricType(), NProto::EMetricType::GAUGE);
  74. UNIT_ASSERT_EQUAL(s.LabelsSize(), 1);
  75. ASSERT_LABEL_EQUAL(s.GetLabels(0), "sensor", "another_metric");
  76. ASSERT_DOUBLE_POINT(s, TInstant::MilliSeconds(103948), -3000.0);
  77. }
  78. {
  79. auto& s = samples.GetSamples(2);
  80. UNIT_ASSERT_EQUAL(s.GetMetricType(), NProto::EMetricType::GAUGE);
  81. UNIT_ASSERT_EQUAL(1, s.LabelsSize());
  82. ASSERT_LABEL_EQUAL(s.GetLabels(0), "sensor", "no_labels");
  83. ASSERT_DOUBLE_POINT(s, TInstant::Zero(), 3.0);
  84. }
  85. }
  86. Y_UNIT_TEST(Counter) {
  87. auto samples = Decode(
  88. "# A normal comment.\n"
  89. "#\n"
  90. "# TYPE name counter\n"
  91. "name{labelname=\"val1\",basename=\"basevalue\"} NaN\n"
  92. "name {labelname=\"val2\",basename=\"basevalue\"} 2.3 1234567890\n"
  93. "# HELP name two-line\\n doc str\\\\ing\n");
  94. UNIT_ASSERT_EQUAL(samples.SamplesSize(), 2);
  95. {
  96. auto& s = samples.GetSamples(0);
  97. UNIT_ASSERT_EQUAL(s.GetMetricType(), NProto::EMetricType::RATE);
  98. UNIT_ASSERT_EQUAL(s.LabelsSize(), 3);
  99. ASSERT_LABEL_EQUAL(s.GetLabels(0), "sensor", "name");
  100. ASSERT_LABEL_EQUAL(s.GetLabels(1), "basename", "basevalue");
  101. ASSERT_LABEL_EQUAL(s.GetLabels(2), "labelname", "val1");
  102. ASSERT_UINT_POINT(s, TInstant::Zero(), ui64(0));
  103. }
  104. {
  105. auto& s = samples.GetSamples(1);
  106. UNIT_ASSERT_EQUAL(s.GetMetricType(), NProto::EMetricType::RATE);
  107. UNIT_ASSERT_EQUAL(s.LabelsSize(), 3);
  108. ASSERT_LABEL_EQUAL(s.GetLabels(0), "sensor", "name");
  109. ASSERT_LABEL_EQUAL(s.GetLabels(1), "basename", "basevalue");
  110. ASSERT_LABEL_EQUAL(s.GetLabels(2), "labelname", "val2");
  111. ASSERT_UINT_POINT(s, TInstant::MilliSeconds(1234567890), i64(2));
  112. }
  113. }
  114. Y_UNIT_TEST(Gauge) {
  115. auto samples = Decode(
  116. "# A normal comment.\n"
  117. "#\n"
  118. " # HELP name2 \tdoc str\"ing 2\n"
  119. " # TYPE name2 gauge\n"
  120. "name2{labelname=\"val2\"\t,basename = \"basevalue2\"\t\t} +Inf 54321\n"
  121. "name2{ labelname = \"val1\" , }-Inf\n");
  122. UNIT_ASSERT_EQUAL(samples.SamplesSize(), 2);
  123. {
  124. auto& s = samples.GetSamples(0);
  125. UNIT_ASSERT_EQUAL(s.GetMetricType(), NProto::EMetricType::GAUGE);
  126. UNIT_ASSERT_EQUAL(s.LabelsSize(), 3);
  127. ASSERT_LABEL_EQUAL(s.GetLabels(0), "sensor", "name2");
  128. ASSERT_LABEL_EQUAL(s.GetLabels(1), "basename", "basevalue2");
  129. ASSERT_LABEL_EQUAL(s.GetLabels(2), "labelname", "val2");
  130. ASSERT_DOUBLE_POINT(s, TInstant::MilliSeconds(54321), INFINITY);
  131. }
  132. {
  133. auto& s = samples.GetSamples(1);
  134. UNIT_ASSERT_EQUAL(s.GetMetricType(), NProto::EMetricType::GAUGE);
  135. UNIT_ASSERT_EQUAL(s.LabelsSize(), 2);
  136. ASSERT_LABEL_EQUAL(s.GetLabels(0), "sensor", "name2");
  137. ASSERT_LABEL_EQUAL(s.GetLabels(1), "labelname", "val1");
  138. ASSERT_DOUBLE_POINT(s, TInstant::Zero(), -INFINITY);
  139. }
  140. }
  141. Y_UNIT_TEST(Summary) {
  142. auto samples = Decode(
  143. "# HELP \n"
  144. "# TYPE my_summary summary\n"
  145. "my_summary{n1=\"val1\",quantile=\"0.5\"} 110\n"
  146. "my_summary{n1=\"val1\",quantile=\"0.9\"} 140 1\n"
  147. "my_summary_count{n1=\"val1\"} 42\n"
  148. "my_summary_sum{n1=\"val1\"} 08 15\n"
  149. "# some\n"
  150. "# funny comments\n"
  151. "# HELP\n"
  152. "# HELP my_summary\n"
  153. "# HELP my_summary \n");
  154. UNIT_ASSERT_EQUAL(samples.SamplesSize(), 4);
  155. {
  156. auto& s = samples.GetSamples(0);
  157. UNIT_ASSERT_EQUAL(s.GetMetricType(), NProto::EMetricType::GAUGE);
  158. UNIT_ASSERT_EQUAL(s.LabelsSize(), 3);
  159. ASSERT_LABEL_EQUAL(s.GetLabels(0), "sensor", "my_summary");
  160. ASSERT_LABEL_EQUAL(s.GetLabels(1), "quantile", "0.5");
  161. ASSERT_LABEL_EQUAL(s.GetLabels(2), "n1", "val1");
  162. ASSERT_DOUBLE_POINT(s, TInstant::Zero(), 110.0);
  163. }
  164. {
  165. auto& s = samples.GetSamples(1);
  166. UNIT_ASSERT_EQUAL(s.GetMetricType(), NProto::EMetricType::GAUGE);
  167. UNIT_ASSERT_EQUAL(s.LabelsSize(), 3);
  168. ASSERT_LABEL_EQUAL(s.GetLabels(0), "sensor", "my_summary");
  169. ASSERT_LABEL_EQUAL(s.GetLabels(1), "quantile", "0.9");
  170. ASSERT_LABEL_EQUAL(s.GetLabels(2), "n1", "val1");
  171. ASSERT_DOUBLE_POINT(s, TInstant::MilliSeconds(1), 140.0);
  172. }
  173. {
  174. auto& s = samples.GetSamples(2);
  175. UNIT_ASSERT_EQUAL(s.GetMetricType(), NProto::EMetricType::RATE);
  176. UNIT_ASSERT_EQUAL(s.LabelsSize(), 2);
  177. ASSERT_LABEL_EQUAL(s.GetLabels(0), "sensor", "my_summary_count");
  178. ASSERT_LABEL_EQUAL(s.GetLabels(1), "n1", "val1");
  179. ASSERT_UINT_POINT(s, TInstant::Zero(), 42);
  180. }
  181. {
  182. auto& s = samples.GetSamples(3);
  183. UNIT_ASSERT_EQUAL(s.GetMetricType(), NProto::EMetricType::GAUGE);
  184. UNIT_ASSERT_EQUAL(s.LabelsSize(), 2);
  185. ASSERT_LABEL_EQUAL(s.GetLabels(0), "sensor", "my_summary_sum");
  186. ASSERT_LABEL_EQUAL(s.GetLabels(1), "n1", "val1");
  187. ASSERT_DOUBLE_POINT(s, TInstant::MilliSeconds(15), 8.0);
  188. }
  189. }
  190. Y_UNIT_TEST(Histogram) {
  191. auto samples = Decode(
  192. "# HELP request_duration_microseconds The response latency.\n"
  193. "# TYPE request_duration_microseconds histogram\n"
  194. "request_duration_microseconds_bucket{le=\"0\"} 0\n"
  195. "request_duration_microseconds_bucket{le=\"100\"} 123\n"
  196. "request_duration_microseconds_bucket{le=\"120\"} 412\n"
  197. "request_duration_microseconds_bucket{le=\"144\"} 592\n"
  198. "request_duration_microseconds_bucket{le=\"172.8\"} 1524\n"
  199. "request_duration_microseconds_bucket{le=\"+Inf\"} 2693\n"
  200. "request_duration_microseconds_sum 1.7560473e+06\n"
  201. "request_duration_microseconds_count 2693\n");
  202. UNIT_ASSERT_EQUAL(samples.SamplesSize(), 3);
  203. {
  204. auto& s = samples.GetSamples(0);
  205. UNIT_ASSERT_EQUAL(s.GetMetricType(), NProto::EMetricType::GAUGE);
  206. UNIT_ASSERT_EQUAL(s.LabelsSize(), 1);
  207. ASSERT_LABEL_EQUAL(s.GetLabels(0), "sensor", "request_duration_microseconds_sum");
  208. ASSERT_DOUBLE_POINT(s, TInstant::Zero(), 1756047.3);
  209. }
  210. {
  211. auto& s = samples.GetSamples(1);
  212. UNIT_ASSERT_EQUAL(s.GetMetricType(), NProto::EMetricType::RATE);
  213. UNIT_ASSERT_EQUAL(s.LabelsSize(), 1);
  214. ASSERT_LABEL_EQUAL(s.GetLabels(0), "sensor", "request_duration_microseconds_count");
  215. ASSERT_UINT_POINT(s, TInstant::Zero(), 2693);
  216. }
  217. {
  218. auto& s = samples.GetSamples(2);
  219. UNIT_ASSERT_EQUAL(s.GetMetricType(), NProto::EMetricType::HIST_RATE);
  220. UNIT_ASSERT_EQUAL(s.LabelsSize(), 1);
  221. ASSERT_LABEL_EQUAL(s.GetLabels(0), "sensor", "request_duration_microseconds");
  222. auto hist = ExplicitHistogramSnapshot(
  223. { 0, 100, 120, 144, 172.8, HISTOGRAM_INF_BOUND },
  224. { 0, 123, 289, 180, 932, 1169 });
  225. ASSERT_HIST_POINT(s, TInstant::Zero(), *hist);
  226. }
  227. }
  228. Y_UNIT_TEST(HistogramWithLabels) {
  229. auto samples = Decode(
  230. "# A histogram, which has a pretty complex representation in the text format:\n"
  231. "# HELP http_request_duration_seconds A histogram of the request duration.\n"
  232. "# TYPE http_request_duration_seconds histogram\n"
  233. "http_request_duration_seconds_bucket{le=\"0.05\", method=\"POST\"} 24054\n"
  234. "http_request_duration_seconds_bucket{method=\"POST\", le=\"0.1\"} 33444\n"
  235. "http_request_duration_seconds_bucket{le=\"0.2\", method=\"POST\", } 100392\n"
  236. "http_request_duration_seconds_bucket{le=\"0.5\",method=\"POST\",} 129389\n"
  237. "http_request_duration_seconds_bucket{ method=\"POST\", le=\"1\", } 133988\n"
  238. "http_request_duration_seconds_bucket{ le=\"+Inf\", method=\"POST\", } 144320\n"
  239. "http_request_duration_seconds_sum{method=\"POST\"} 53423\n"
  240. "http_request_duration_seconds_count{ method=\"POST\", } 144320\n");
  241. UNIT_ASSERT_EQUAL(samples.SamplesSize(), 3);
  242. {
  243. auto& s = samples.GetSamples(0);
  244. UNIT_ASSERT_EQUAL(s.GetMetricType(), NProto::EMetricType::GAUGE);
  245. UNIT_ASSERT_EQUAL(s.LabelsSize(), 2);
  246. ASSERT_LABEL_EQUAL(s.GetLabels(0), "sensor", "http_request_duration_seconds_sum");
  247. ASSERT_LABEL_EQUAL(s.GetLabels(1), "method", "POST");
  248. ASSERT_DOUBLE_POINT(s, TInstant::Zero(), 53423.0);
  249. }
  250. {
  251. auto& s = samples.GetSamples(1);
  252. UNIT_ASSERT_EQUAL(s.GetMetricType(), NProto::EMetricType::RATE);
  253. UNIT_ASSERT_EQUAL(s.LabelsSize(), 2);
  254. ASSERT_LABEL_EQUAL(s.GetLabels(0), "sensor", "http_request_duration_seconds_count");
  255. ASSERT_LABEL_EQUAL(s.GetLabels(1), "method", "POST");
  256. ASSERT_UINT_POINT(s, TInstant::Zero(), 144320);
  257. }
  258. {
  259. auto& s = samples.GetSamples(2);
  260. UNIT_ASSERT_EQUAL(s.GetMetricType(), NProto::EMetricType::HIST_RATE);
  261. UNIT_ASSERT_EQUAL(s.LabelsSize(), 2);
  262. ASSERT_LABEL_EQUAL(s.GetLabels(0), "sensor", "http_request_duration_seconds");
  263. ASSERT_LABEL_EQUAL(s.GetLabels(1), "method", "POST");
  264. auto hist = ExplicitHistogramSnapshot(
  265. { 0.05, 0.1, 0.2, 0.5, 1, HISTOGRAM_INF_BOUND },
  266. { 24054, 9390, 66948, 28997, 4599, 10332 });
  267. ASSERT_HIST_POINT(s, TInstant::Zero(), *hist);
  268. }
  269. }
  270. Y_UNIT_TEST(MultipleHistograms) {
  271. auto samples = Decode(
  272. "# TYPE inboundBytesPerSec histogram\n"
  273. "inboundBytesPerSec_bucket{client=\"mbus\", le=\"10.0\"} 1.0\n"
  274. "inboundBytesPerSec_bucket{client=\"mbus\", le=\"20.0\"} 5.0\n"
  275. "inboundBytesPerSec_bucket{client=\"mbus\", le=\"+Inf\"} 5.0\n"
  276. "inboundBytesPerSec_count{client=\"mbus\"} 5.0\n"
  277. "inboundBytesPerSec_bucket{client=\"grpc\", le=\"10.0\"} 1.0\n"
  278. "inboundBytesPerSec_bucket{client=\"grpc\", le=\"20.0\"} 5.0\n"
  279. "inboundBytesPerSec_bucket{client=\"grpc\", le=\"30.0\"} 5.0\n"
  280. "inboundBytesPerSec_count{client=\"grpc\"} 5.0\n"
  281. "# TYPE outboundBytesPerSec histogram\n"
  282. "outboundBytesPerSec_bucket{client=\"grpc\", le=\"100.0\"} 1.0 1512216000000\n"
  283. "outboundBytesPerSec_bucket{client=\"grpc\", le=\"200.0\"} 1.0 1512216000000\n"
  284. "outboundBytesPerSec_bucket{client=\"grpc\", le=\"+Inf\"} 1.0 1512216000000\n"
  285. "outboundBytesPerSec_count{client=\"grpc\"} 1.0 1512216000000\n");
  286. UNIT_ASSERT_EQUAL(samples.SamplesSize(), 6);
  287. {
  288. auto& s = samples.GetSamples(0);
  289. UNIT_ASSERT_EQUAL(s.GetMetricType(), NProto::EMetricType::RATE);
  290. UNIT_ASSERT_EQUAL(s.LabelsSize(), 2);
  291. ASSERT_LABEL_EQUAL(s.GetLabels(0), "sensor", "inboundBytesPerSec_count");
  292. ASSERT_LABEL_EQUAL(s.GetLabels(1), "client", "mbus");
  293. ASSERT_UINT_POINT(s, TInstant::Zero(), 5);
  294. }
  295. {
  296. auto& s = samples.GetSamples(1);
  297. UNIT_ASSERT_EQUAL(s.GetMetricType(), NProto::EMetricType::HIST_RATE);
  298. UNIT_ASSERT_EQUAL(s.LabelsSize(), 2);
  299. ASSERT_LABEL_EQUAL(s.GetLabels(0), "sensor", "inboundBytesPerSec");
  300. ASSERT_LABEL_EQUAL(s.GetLabels(1), "client", "mbus");
  301. auto hist = ExplicitHistogramSnapshot(
  302. { 10, 20, HISTOGRAM_INF_BOUND },
  303. { 1, 4, 0 });
  304. ASSERT_HIST_POINT(s, TInstant::Zero(), *hist);
  305. }
  306. {
  307. auto& s = samples.GetSamples(2);
  308. UNIT_ASSERT_EQUAL(s.GetMetricType(), NProto::EMetricType::RATE);
  309. UNIT_ASSERT_EQUAL(s.LabelsSize(), 2);
  310. ASSERT_LABEL_EQUAL(s.GetLabels(0), "sensor", "inboundBytesPerSec_count");
  311. ASSERT_LABEL_EQUAL(s.GetLabels(1), "client", "grpc");
  312. ASSERT_UINT_POINT(s, TInstant::Zero(), 5);
  313. }
  314. {
  315. auto& s = samples.GetSamples(3);
  316. UNIT_ASSERT_EQUAL(s.GetMetricType(), NProto::EMetricType::HIST_RATE);
  317. UNIT_ASSERT_EQUAL(s.LabelsSize(), 2);
  318. ASSERT_LABEL_EQUAL(s.GetLabels(0), "sensor", "inboundBytesPerSec");
  319. ASSERT_LABEL_EQUAL(s.GetLabels(1), "client", "grpc");
  320. auto hist = ExplicitHistogramSnapshot(
  321. { 10, 20, 30 },
  322. { 1, 4, 0 });
  323. ASSERT_HIST_POINT(s, TInstant::Zero(), *hist);
  324. }
  325. {
  326. auto& s = samples.GetSamples(4);
  327. UNIT_ASSERT_EQUAL(s.GetMetricType(), NProto::EMetricType::RATE);
  328. UNIT_ASSERT_EQUAL(s.LabelsSize(), 2);
  329. ASSERT_LABEL_EQUAL(s.GetLabels(0), "sensor", "outboundBytesPerSec_count");
  330. ASSERT_LABEL_EQUAL(s.GetLabels(1), "client", "grpc");
  331. ASSERT_UINT_POINT(s, TInstant::Seconds(1512216000), 1) ;
  332. }
  333. {
  334. auto& s = samples.GetSamples(5);
  335. UNIT_ASSERT_EQUAL(s.GetMetricType(), NProto::EMetricType::HIST_RATE);
  336. UNIT_ASSERT_EQUAL(s.LabelsSize(), 2);
  337. ASSERT_LABEL_EQUAL(s.GetLabels(0), "sensor", "outboundBytesPerSec");
  338. ASSERT_LABEL_EQUAL(s.GetLabels(1), "client", "grpc");
  339. auto hist = ExplicitHistogramSnapshot(
  340. { 100, 200, HISTOGRAM_INF_BOUND },
  341. { 1, 0, 0 });
  342. ASSERT_HIST_POINT(s, TInstant::Seconds(1512216000), *hist);
  343. }
  344. }
  345. Y_UNIT_TEST(MixedTypes) {
  346. auto samples = Decode(
  347. "# HELP http_requests_total The total number of HTTP requests.\n"
  348. "# TYPE http_requests_total counter\n"
  349. "http_requests_total { } 1027 1395066363000\n"
  350. "http_requests_total{method=\"post\",code=\"200\"} 1027 1395066363000\n"
  351. "http_requests_total{method=\"post\",code=\"400\"} 3 1395066363000\n"
  352. "\n"
  353. "# Minimalistic line:\n"
  354. "metric_without_timestamp_and_labels 12.47\n"
  355. "\n"
  356. "# HELP rpc_duration_seconds A summary of the RPC duration in seconds.\n"
  357. "# TYPE rpc_duration_seconds summary\n"
  358. "rpc_duration_seconds{quantile=\"0.01\"} 3102\n"
  359. "rpc_duration_seconds{quantile=\"0.5\"} 4773\n"
  360. "rpc_duration_seconds{quantile=\"0.9\"} 9001\n"
  361. "rpc_duration_seconds_sum 1.7560473e+07\n"
  362. "rpc_duration_seconds_count 2693\n"
  363. "\n"
  364. "# Another mMinimalistic line:\n"
  365. "metric_with_timestamp 12.47 1234567890\n");
  366. UNIT_ASSERT_EQUAL(samples.SamplesSize(), 10);
  367. {
  368. auto& s = samples.GetSamples(0);
  369. UNIT_ASSERT_EQUAL(s.GetMetricType(), NProto::EMetricType::RATE);
  370. UNIT_ASSERT_EQUAL(s.LabelsSize(), 1);
  371. ASSERT_LABEL_EQUAL(s.GetLabels(0), "sensor", "http_requests_total");
  372. ASSERT_UINT_POINT(s, TInstant::Seconds(1395066363), 1027);
  373. }
  374. {
  375. auto& s = samples.GetSamples(1);
  376. UNIT_ASSERT_EQUAL(s.GetMetricType(), NProto::EMetricType::RATE);
  377. UNIT_ASSERT_EQUAL(s.LabelsSize(), 3);
  378. ASSERT_LABEL_EQUAL(s.GetLabels(0), "sensor", "http_requests_total");
  379. ASSERT_LABEL_EQUAL(s.GetLabels(1), "method", "post");
  380. ASSERT_LABEL_EQUAL(s.GetLabels(2), "code", "200");
  381. ASSERT_UINT_POINT(s, TInstant::Seconds(1395066363), 1027);
  382. }
  383. {
  384. auto& s = samples.GetSamples(2);
  385. UNIT_ASSERT_EQUAL(s.GetMetricType(), NProto::EMetricType::RATE);
  386. UNIT_ASSERT_EQUAL(s.LabelsSize(), 3);
  387. ASSERT_LABEL_EQUAL(s.GetLabels(0), "sensor", "http_requests_total");
  388. ASSERT_LABEL_EQUAL(s.GetLabels(1), "method", "post");
  389. ASSERT_LABEL_EQUAL(s.GetLabels(2), "code", "400");
  390. ASSERT_UINT_POINT(s, TInstant::Seconds(1395066363), 3);
  391. }
  392. {
  393. auto& s = samples.GetSamples(3);
  394. UNIT_ASSERT_EQUAL(s.GetMetricType(), NProto::EMetricType::GAUGE);
  395. UNIT_ASSERT_EQUAL(s.LabelsSize(), 1);
  396. ASSERT_LABEL_EQUAL(s.GetLabels(0), "sensor", "metric_without_timestamp_and_labels");
  397. ASSERT_DOUBLE_POINT(s, TInstant::Zero(), 12.47);
  398. }
  399. {
  400. auto& s = samples.GetSamples(4);
  401. UNIT_ASSERT_EQUAL(s.GetMetricType(), NProto::EMetricType::GAUGE);
  402. UNIT_ASSERT_EQUAL(s.LabelsSize(), 2);
  403. ASSERT_LABEL_EQUAL(s.GetLabels(0), "sensor", "rpc_duration_seconds");
  404. ASSERT_LABEL_EQUAL(s.GetLabels(1), "quantile", "0.01");
  405. ASSERT_DOUBLE_POINT(s, TInstant::Zero(), 3102);
  406. }
  407. {
  408. auto& s = samples.GetSamples(5);
  409. UNIT_ASSERT_EQUAL(s.GetMetricType(), NProto::EMetricType::GAUGE);
  410. UNIT_ASSERT_EQUAL(s.LabelsSize(), 2);
  411. ASSERT_LABEL_EQUAL(s.GetLabels(0), "sensor", "rpc_duration_seconds");
  412. ASSERT_LABEL_EQUAL(s.GetLabels(1), "quantile", "0.5");
  413. ASSERT_DOUBLE_POINT(s, TInstant::Zero(), 4773);
  414. }
  415. {
  416. auto& s = samples.GetSamples(6);
  417. UNIT_ASSERT_EQUAL(s.GetMetricType(), NProto::EMetricType::GAUGE);
  418. UNIT_ASSERT_EQUAL(s.LabelsSize(), 2);
  419. ASSERT_LABEL_EQUAL(s.GetLabels(0), "sensor", "rpc_duration_seconds");
  420. ASSERT_LABEL_EQUAL(s.GetLabels(1), "quantile", "0.9");
  421. ASSERT_DOUBLE_POINT(s, TInstant::Zero(), 9001);
  422. }
  423. {
  424. auto& s = samples.GetSamples(7);
  425. UNIT_ASSERT_EQUAL(s.GetMetricType(), NProto::EMetricType::GAUGE);
  426. UNIT_ASSERT_EQUAL(s.LabelsSize(), 1);
  427. ASSERT_LABEL_EQUAL(s.GetLabels(0), "sensor", "rpc_duration_seconds_sum");
  428. ASSERT_DOUBLE_POINT(s, TInstant::Zero(), 17560473);
  429. }
  430. {
  431. auto& s = samples.GetSamples(8);
  432. UNIT_ASSERT_EQUAL(s.GetMetricType(), NProto::EMetricType::RATE);
  433. UNIT_ASSERT_EQUAL(s.LabelsSize(), 1);
  434. ASSERT_LABEL_EQUAL(s.GetLabels(0), "sensor", "rpc_duration_seconds_count");
  435. ASSERT_UINT_POINT(s, TInstant::Zero(), 2693);
  436. }
  437. {
  438. auto& s = samples.GetSamples(9);
  439. UNIT_ASSERT_EQUAL(s.GetMetricType(), NProto::EMetricType::GAUGE);
  440. UNIT_ASSERT_EQUAL(s.LabelsSize(), 1);
  441. ASSERT_LABEL_EQUAL(s.GetLabels(0), "sensor", "metric_with_timestamp");
  442. ASSERT_DOUBLE_POINT(s, TInstant::MilliSeconds(1234567890), 12.47);
  443. }
  444. }
  445. }