job_statistics_ut.cpp 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254
  1. #include <yt/cpp/mapreduce/interface/job_statistics.h>
  2. #include <yt/cpp/mapreduce/interface/operation.h>
  3. #include <library/cpp/yson/node/node_io.h>
  4. #include <library/cpp/testing/gtest/gtest.h>
  5. using namespace NYT;
  6. TEST(TJobStatisticsTest, Simple)
  7. {
  8. const TString input = R"""(
  9. {
  10. "data" = {
  11. "output" = {
  12. "0" = {
  13. "uncompressed_data_size" = {
  14. "$" = {
  15. "completed" = {
  16. "simple_sort" = {
  17. "max" = 130;
  18. "count" = 1;
  19. "min" = 130;
  20. "sum" = 130;
  21. };
  22. "map" = {
  23. "max" = 42;
  24. "count" = 1;
  25. "min" = 42;
  26. "sum" = 42;
  27. };
  28. };
  29. "aborted" = {
  30. "simple_sort" = {
  31. "max" = 24;
  32. "count" = 1;
  33. "min" = 24;
  34. "sum" = 24;
  35. };
  36. };
  37. };
  38. };
  39. };
  40. };
  41. };
  42. })""";
  43. TJobStatistics stat(NodeFromYsonString(input));
  44. EXPECT_TRUE(stat.HasStatistics("data/output/0/uncompressed_data_size"));
  45. EXPECT_TRUE(!stat.HasStatistics("nonexistent-statistics"));
  46. EXPECT_THROW_MESSAGE_HAS_SUBSTR(stat.GetStatistics("BLAH-BLAH"), yexception, "Statistics");
  47. EXPECT_EQ(stat.GetStatisticsNames(), TVector<TString>{"data/output/0/uncompressed_data_size"});
  48. EXPECT_EQ(stat.GetStatistics("data/output/0/uncompressed_data_size").Max(), 130);
  49. EXPECT_EQ(stat.GetStatistics("data/output/0/uncompressed_data_size").Count(), 2);
  50. EXPECT_EQ(stat.GetStatistics("data/output/0/uncompressed_data_size").Min(), 42);
  51. EXPECT_EQ(stat.GetStatistics("data/output/0/uncompressed_data_size").Sum(), 172);
  52. EXPECT_EQ(stat.GetStatistics("data/output/0/uncompressed_data_size").Avg(), 172 / 2);
  53. EXPECT_EQ(stat.JobState({EJobState::Aborted}).GetStatistics("data/output/0/uncompressed_data_size").Sum(), 24);
  54. EXPECT_EQ(stat.JobType({EJobType::Map}).JobState({EJobState::Aborted}).GetStatistics("data/output/0/uncompressed_data_size").Sum(), TMaybe<i64>());
  55. }
  56. TEST(TJobStatisticsTest, OtherTypes)
  57. {
  58. const TString input = R"""(
  59. {
  60. "time" = {
  61. "exec" = {
  62. "$" = {
  63. "completed" = {
  64. "map" = {
  65. "max" = 2482468;
  66. "count" = 38;
  67. "min" = 578976;
  68. "sum" = 47987270;
  69. };
  70. };
  71. };
  72. };
  73. };
  74. })""";
  75. TJobStatistics stat(NodeFromYsonString(input));
  76. EXPECT_EQ(stat.GetStatisticsAs<TDuration>("time/exec").Max(), TDuration::MilliSeconds(2482468));
  77. }
  78. TEST(TJobStatisticsTest, Custom)
  79. {
  80. const TString input = R"""(
  81. {
  82. "custom" = {
  83. "some" = {
  84. "path" = {
  85. "$" = {
  86. "completed" = {
  87. "map" = {
  88. "max" = -1;
  89. "count" = 1;
  90. "min" = -1;
  91. "sum" = -1;
  92. };
  93. };
  94. };
  95. };
  96. };
  97. "another" = {
  98. "path" = {
  99. "$" = {
  100. "completed" = {
  101. "map" = {
  102. "max" = 1001;
  103. "count" = 2;
  104. "min" = 1001;
  105. "sum" = 2002;
  106. };
  107. };
  108. };
  109. };
  110. };
  111. };
  112. })""";
  113. TJobStatistics stat(NodeFromYsonString(input));
  114. EXPECT_TRUE(stat.HasCustomStatistics("some/path"));
  115. EXPECT_TRUE(!stat.HasCustomStatistics("nonexistent-statistics"));
  116. EXPECT_THROW_MESSAGE_HAS_SUBSTR(stat.GetCustomStatistics("BLAH-BLAH"), yexception, "Statistics");
  117. const auto names = stat.GetCustomStatisticsNames();
  118. const THashSet<TString> expected = {"some/path", "another/path"};
  119. EXPECT_EQ(THashSet<TString>(names.begin(), names.end()), expected);
  120. EXPECT_EQ(stat.GetCustomStatistics("some/path").Max(), -1);
  121. EXPECT_EQ(stat.GetCustomStatistics("another/path").Avg(), 1001);
  122. }
  123. TEST(TJobStatisticsTest, TaskNames)
  124. {
  125. const TString input = R"""(
  126. {
  127. "data" = {
  128. "output" = {
  129. "0" = {
  130. "uncompressed_data_size" = {
  131. "$" = {
  132. "completed" = {
  133. "partition_map" = {
  134. "max" = 130;
  135. "count" = 1;
  136. "min" = 130;
  137. "sum" = 130;
  138. };
  139. "partition(0)" = {
  140. "max" = 42;
  141. "count" = 1;
  142. "min" = 42;
  143. "sum" = 42;
  144. };
  145. };
  146. "aborted" = {
  147. "simple_sort" = {
  148. "max" = 24;
  149. "count" = 1;
  150. "min" = 24;
  151. "sum" = 24;
  152. };
  153. };
  154. };
  155. };
  156. };
  157. };
  158. };
  159. })""";
  160. TJobStatistics stat(NodeFromYsonString(input));
  161. EXPECT_TRUE(stat.HasStatistics("data/output/0/uncompressed_data_size"));
  162. EXPECT_TRUE(!stat.HasStatistics("nonexistent-statistics"));
  163. EXPECT_THROW_MESSAGE_HAS_SUBSTR(stat.GetStatistics("BLAH-BLAH"), yexception, "Statistics");
  164. EXPECT_EQ(stat.GetStatisticsNames(), TVector<TString>{"data/output/0/uncompressed_data_size"});
  165. EXPECT_EQ(stat.GetStatistics("data/output/0/uncompressed_data_size").Max(), 130);
  166. EXPECT_EQ(stat.GetStatistics("data/output/0/uncompressed_data_size").Count(), 2);
  167. EXPECT_EQ(stat.GetStatistics("data/output/0/uncompressed_data_size").Min(), 42);
  168. EXPECT_EQ(stat.GetStatistics("data/output/0/uncompressed_data_size").Sum(), 172);
  169. EXPECT_EQ(stat.GetStatistics("data/output/0/uncompressed_data_size").Avg(), 172 / 2);
  170. EXPECT_EQ(
  171. stat
  172. .JobState({EJobState::Aborted})
  173. .GetStatistics("data/output/0/uncompressed_data_size")
  174. .Sum(),
  175. 24);
  176. EXPECT_EQ(
  177. stat
  178. .JobType({EJobType::Partition})
  179. .JobState({EJobState::Aborted})
  180. .GetStatistics("data/output/0/uncompressed_data_size")
  181. .Sum(),
  182. TMaybe<i64>());
  183. EXPECT_EQ(
  184. stat
  185. .TaskName({"partition(0)"})
  186. .GetStatistics("data/output/0/uncompressed_data_size")
  187. .Sum(),
  188. 42);
  189. EXPECT_EQ(
  190. stat
  191. .TaskName({"partition"})
  192. .GetStatistics("data/output/0/uncompressed_data_size")
  193. .Sum(),
  194. TMaybe<i64>());
  195. EXPECT_EQ(
  196. stat
  197. .TaskName({"partition_map(0)"})
  198. .GetStatistics("data/output/0/uncompressed_data_size")
  199. .Sum(),
  200. 130);
  201. EXPECT_EQ(
  202. stat
  203. .JobType({EJobType::Partition})
  204. .GetStatistics("data/output/0/uncompressed_data_size")
  205. .Sum(),
  206. 42);
  207. EXPECT_EQ(
  208. stat
  209. .JobType({EJobType::PartitionMap})
  210. .GetStatistics("data/output/0/uncompressed_data_size")
  211. .Sum(),
  212. 130);
  213. EXPECT_EQ(
  214. stat
  215. .TaskName({ETaskName::Partition0})
  216. .GetStatistics("data/output/0/uncompressed_data_size")
  217. .Sum(),
  218. 42);
  219. EXPECT_EQ(
  220. stat
  221. .TaskName({ETaskName::Partition1})
  222. .GetStatistics("data/output/0/uncompressed_data_size")
  223. .Sum(),
  224. TMaybe<i64>());
  225. EXPECT_EQ(
  226. stat
  227. .TaskName({ETaskName::PartitionMap0})
  228. .GetStatistics("data/output/0/uncompressed_data_size")
  229. .Sum(),
  230. 130);
  231. }