Line data Source code
1 : #include <fas/testing.hpp>
2 : #include <wrtstat/meter_manager.hpp>
3 : #include <wrtstat/wrtstat.hpp>
4 : #include <wrtstat/manager/aggregator_registry.hpp>
5 : #include <chrono>
6 : #include <map>
7 :
8 : //#define COUNT 1000000
9 : #define COUNT 1
10 : namespace {
11 :
12 3 : UNIT(wrtstat1, "")
13 : {
14 : using namespace fas::testing;
15 :
16 1 : wrtstat::meter_manager::options_type options;
17 : // Если resolutions now_t не совпадает, то
18 1 : options.resolution = wrtstat::resolutions::microseconds;
19 :
20 2 : wrtstat::meter_manager stat(options);
21 1 : stat.create_composite_multi_meter<std::chrono::microseconds>(
22 : "a1", "a2", "a3", true).create(
23 : stat.now(),
24 : static_cast<wrtstat::size_type >(255),
25 : 0l, 0l
26 : );
27 1 : t << message("DEBUG");
28 1 : t << flush;
29 :
30 1 : stat.create_size_multi_meter( "s1").create(stat.now(), 12);
31 1 : stat.create_value_multi_meter( "v1").create(stat.now(), 12, 0u);
32 1 : stat.create_value_multi_meter( "v2").create(stat.now(), 12, 1u);
33 :
34 1 : stat.create_time_multi_meter< std::chrono::nanoseconds >("t1")
35 : .create( stat.now(), 1u);
36 1 : stat.create_time_multi_meter< std::chrono::nanoseconds >( "t2")
37 : .create( stat.now(), 10u );
38 2 : t << nothing;
39 1 : }
40 :
41 3 : UNIT(wrtstat2, "")
42 : {
43 : using namespace fas::testing;
44 :
45 1 : wrtstat::meter_manager::options_type opt;
46 1 : opt.resolution = wrtstat::resolutions::none;
47 2 : wrtstat::meter_manager stat(opt);
48 1 : wrtstat::id_t id = stat.create_aggregator( "test1", 0 );
49 : // bool add(id_t id, time_type ts_now, value_type v, size_type cnt)
50 1 : stat.add(id, 0, 0, 1);
51 1 : stat.add(id, 1, 0, 1);
52 2 : auto pag = stat.pop(id);
53 1 : t << is_true<assert>(pag!=nullptr) << FAS_FL;
54 1 : t << stop;
55 1 : t << equal<expect, wrtstat::value_type>(pag->count, 1) << FAS_FL;
56 2 : t << nothing;
57 1 : }
58 :
59 : template<typename ... Args>
60 0 : void unused_params(const Args& ...)
61 : {
62 :
63 0 : }
64 :
65 3 : UNIT(wrtstat3, "")
66 : {
67 : using namespace fas::testing;
68 1 : t << flush;
69 1 : wrtstat::meter_manager::options_type opt;
70 1 : opt.resolution = wrtstat::resolutions::microseconds;
71 1 : opt.aggregation_step_ts = 1000000;
72 : /*opt.reducer_limit = 256;
73 : opt.reducer_levels = 256;
74 : opt.pool_size = 256;*/
75 1 : opt.prefixes={"a~~"/*, "b~~", "c~~", "d~~", "e~~", "f~~"*/};
76 :
77 1 : int test = 0;
78 : //#error TODO передавать имя!! и убрать удаление счетчиков, иначе ссылка будет не дествительна, а по значению захватывать не эффективно
79 1 : opt.handler=[&test, &t](const std::string& name, wrtstat::aggregated_data::ptr ag){
80 0 : ++test ;
81 0 : unused_params(t, name, ag);
82 0 : t << message(name) << " count=" << ag->count << " 80%=" << ag->perc80 << " 100%=" << ag->perc100 << " max=" << ag->max << " lossy=" << ag->lossy;
83 0 : };
84 : //opt.handler=[](const std::string& , wrtstat::aggregated_data::ptr ) {};
85 2 : wrtstat::meter_manager stat(opt);
86 :
87 2 : std::map<size_t, size_t> test_map;
88 : //auto meter = stat.create_multi_meter_factory<std::chrono::nanoseconds>("time1", "size1", "size2", true);
89 2 : auto meter = stat.create_composite_multi_meter<std::chrono::nanoseconds>("", "", "size2", true);
90 : //auto meter = stat.create_multi_meter_factory<std::chrono::nanoseconds>("time1");
91 : //auto meter = stat.create_composite_meter_factory<std::chrono::nanoseconds>("time1", "size1", "size2", false);
92 : //auto meter = stat.create_time_meter_factory<std::chrono::microseconds>("time1");
93 1 : auto start = std::chrono::steady_clock::now();
94 2 : for (size_t i = 0 ; i < COUNT; ++i)
95 : {
96 1 : auto m = meter.create(1UL, std::rand()%100, 0);
97 : //auto m = meter->create(1UL, 0UL, 0UL);
98 11 : for (int j=0;j<10; ++j)
99 10 : test_map[i]++;
100 1 : m.set_write_size(std::rand()%1000);
101 : //m.reset();
102 : }
103 1 : auto finish = std::chrono::steady_clock::now();
104 1 : time_t span_mks = std::chrono::duration_cast<std::chrono::microseconds>(finish -start).count();
105 2 : t << message("COUNT=") << COUNT << " tests=" << test << " time=" << span_mks << "mks rate=" << (COUNT*1000000L)/span_mks;
106 : //t << equal<assert>(test, 10) << FAS_FL;
107 1 : }
108 :
109 :
110 3 : UNIT(wrtstat4, "")
111 : {
112 : using namespace fas::testing;
113 1 : t << flush;
114 1 : wrtstat::wrtstat::options_type opt;
115 1 : opt.resolution = wrtstat::resolutions::microseconds;
116 1 : opt.aggregation_step_ts = 1000000;
117 1 : opt.reducer_limit = 256;
118 1 : opt.reducer_levels = 256;
119 1 : opt.pool_size = 256;
120 1 : opt.prefixes={"a~~", "b~~", "c~~", "d~~", "e~~", "f~~"};
121 :
122 1 : int test = 0;
123 : //#error TODO передавать имя!! и убрать удаление счетчиков, иначе ссылка будет не дествительна, а по значению захватывать не эффективно
124 1 : opt.handler=[&test, &t](const std::string& name, wrtstat::aggregated_data::ptr ag){
125 0 : ++test ;
126 0 : unused_params(t, name, ag);
127 0 : t << message(name) << " count=" << ag->count << " 80%=" << ag->perc80 << " 100%=" << ag->perc100 << " max=" << ag->max << " lossy=" << ag->lossy;
128 0 : };
129 : //opt.handler=[](const std::string& , wrtstat::aggregated_data::ptr ) {};
130 2 : wrtstat::meter_manager stat(opt);
131 :
132 2 : std::map<size_t, size_t> test_map;
133 : //auto meter = stat.create_multi_meter_factory<std::chrono::nanoseconds>("time1", "size1", "size2", true);
134 2 : auto meter = stat.create_composite_multi_meter<std::chrono::nanoseconds>("", "", "size2", true);
135 : /*auto meter = stat.create_multi_meter_factory<std::chrono::nanoseconds>("time1");
136 : auto meter = stat.create_composite_meter_factory<std::chrono::nanoseconds>("time1", "size1", "size2", false);
137 : auto meter = stat.create_time_meter_factory<std::chrono::microseconds>("time1");*/
138 1 : auto start = std::chrono::steady_clock::now();
139 2 : for (size_t i = 0 ; i < COUNT; ++i)
140 : {
141 1 : auto m = meter.create(1UL, std::rand()%100, 0);
142 : //auto m = meter->create(1UL, 0UL, 0UL);
143 11 : for (int j=0;j<10; ++j)
144 10 : test_map[i]++;
145 1 : m.set_write_size(std::rand()%1000);
146 : //m.reset();
147 : }
148 :
149 1 : auto finish = std::chrono::steady_clock::now();
150 1 : time_t span_mks = std::chrono::duration_cast<std::chrono::microseconds>(finish -start).count();
151 1 : t << message("COUNT=") << COUNT << " tests=" << test << " time=" << span_mks << "mks rate=" << (COUNT*1000000L)/span_mks;
152 1 : t << equal<assert>( stat.aggregators_count(), 7ul) << FAS_FL;
153 :
154 1 : wrtstat::aggregator_registry::options_type opt2;
155 2 : wrtstat::aggregator_registry ar(opt2, 0,0,0);
156 2 : t << equal<assert>( ar.aggregators_count(), 0ul) << FAS_FL;
157 1 : }
158 :
159 : }
160 :
161 1 : BEGIN_SUITE(wrtstat, "")
162 : ADD_UNIT(wrtstat1)
163 : ADD_UNIT(wrtstat2)
164 : ADD_UNIT(wrtstat3)
165 : ADD_UNIT(wrtstat4)
166 7 : END_SUITE(wrtstat)
167 :
|