@@ -115,8 +115,7 @@ struct THistBase
115115
116116// //////////////////////////////////////////////////////////////////////////////
117117
118- struct TTimeHist
119- : public THistBase<TRequestUsTimeBuckets>
118+ struct TUsTimeHist : public THistBase <TRequestUsTimeBuckets>
120119{
121120 using THistBase::THistBase;
122121
@@ -128,6 +127,103 @@ struct TTimeHist
128127
129128// //////////////////////////////////////////////////////////////////////////////
130129
130+ struct TMsTimeHist : public THistBase <TRequestMsTimeBuckets>
131+ {
132+ using THistBase::THistBase;
133+
134+ void Increment (TDuration requestTime, ui64 count = 1 )
135+ {
136+ THistBase::Increment (requestTime.MicroSeconds () / 1000 ., count);
137+ }
138+ };
139+
140+ // //////////////////////////////////////////////////////////////////////////////
141+
142+ // Allows to use both microseconds and milliseconds for time histograms.
143+ class TCompoundTimeHist
144+ {
145+ private:
146+ std::unique_ptr<TUsTimeHist> UsTimeHist;
147+ std::unique_ptr<TMsTimeHist> MsTimeHist;
148+
149+ public:
150+ TCompoundTimeHist (
151+ const TString& name,
152+ EHistogramCounterOptions counterOptions)
153+ {
154+ const bool useMsUnitsForTimeHistogram =
155+ counterOptions &
156+ EHistogramCounterOption::UseMsUnitsForTimeHistogram;
157+ const bool useUsUnitsForTimeHistogram =
158+ counterOptions &
159+ EHistogramCounterOption::UseUsUnitsForTimeHistogram;
160+ Y_ABORT_UNLESS (
161+ useMsUnitsForTimeHistogram || useUsUnitsForTimeHistogram,
162+ " At least one of the units must be enabled" );
163+ if (useMsUnitsForTimeHistogram) {
164+ Cerr << " useMsUnitsForTimeHistogram " << name << Endl;
165+ MsTimeHist = std::make_unique<TMsTimeHist>(name, counterOptions);
166+ }
167+ if (useUsUnitsForTimeHistogram) {
168+ Cerr << " useUsUnitsForTimeHistogram " << name << Endl;
169+ UsTimeHist = std::make_unique<TUsTimeHist>(name, counterOptions);
170+ }
171+ }
172+ ~TCompoundTimeHist () = default ;
173+
174+ TCompoundTimeHist (const TCompoundTimeHist&) = delete ;
175+ TCompoundTimeHist (TCompoundTimeHist&&) = default ;
176+ TCompoundTimeHist& operator =(const TCompoundTimeHist&) = delete ;
177+ TCompoundTimeHist& operator =(TCompoundTimeHist&&) = default ;
178+
179+ void Increment (TDuration requestTime, ui64 count = 1 )
180+ {
181+ if (MsTimeHist) {
182+ MsTimeHist->Increment (requestTime, count);
183+ }
184+ if (UsTimeHist) {
185+ UsTimeHist->Increment (requestTime, count);
186+ }
187+ }
188+
189+ template <typename ... Args>
190+ void Register (Args&&... args)
191+ {
192+ if (MsTimeHist) {
193+ MsTimeHist->Register (args...);
194+ }
195+ if (UsTimeHist) {
196+ UsTimeHist->Register (std::forward<Args>(args)...);
197+ }
198+ }
199+
200+ [[nodiscard]] TVector<TBucketInfo> GetBuckets () const
201+ {
202+ if (MsTimeHist) {
203+ return MsTimeHist->GetBuckets ();
204+ }
205+ return UsTimeHist->GetBuckets ();
206+ }
207+
208+ [[nodiscard]] const TString& GetUnits () const
209+ {
210+ if (MsTimeHist) {
211+ return MsTimeHist->GetUnits ();
212+ }
213+ return UsTimeHist->GetUnits ();
214+ }
215+
216+ [[nodiscard]] const TString& GetName () const
217+ {
218+ if (MsTimeHist) {
219+ return MsTimeHist->GetName ();
220+ }
221+ return UsTimeHist->GetName ();
222+ }
223+ };
224+
225+ // //////////////////////////////////////////////////////////////////////////////
226+
131227struct TSizeHist
132228 : public THistBase<TKbSizeBuckets>
133229{
@@ -289,19 +385,19 @@ struct TRequestCounters::TStatCounters
289385 TSizeHist SizeHist;
290386 TRequestPercentiles<TSizeHist> SizePercentiles;
291387
292- TTimeHist TimeHist;
293- TTimeHist TimeHistUnaligned;
294- TRequestPercentiles<TTimeHist > TimePercentiles;
388+ TCompoundTimeHist TimeHist;
389+ TCompoundTimeHist TimeHistUnaligned;
390+ TRequestPercentiles<TCompoundTimeHist > TimePercentiles;
295391
296- TTimeHist ExecutionTimeHist;
297- TTimeHist ExecutionTimeHistUnaligned;
298- TRequestPercentiles<TTimeHist > ExecutionTimePercentiles;
392+ TCompoundTimeHist ExecutionTimeHist;
393+ TCompoundTimeHist ExecutionTimeHistUnaligned;
394+ TRequestPercentiles<TCompoundTimeHist > ExecutionTimePercentiles;
299395
300- TTimeHist RequestCompletionTimeHist;
301- TRequestPercentiles<TTimeHist > RequestCompletionTimePercentiles;
396+ TCompoundTimeHist RequestCompletionTimeHist;
397+ TRequestPercentiles<TCompoundTimeHist > RequestCompletionTimePercentiles;
302398
303- TTimeHist PostponedTimeHist;
304- TRequestPercentiles<TTimeHist > PostponedTimePercentiles;
399+ TCompoundTimeHist PostponedTimeHist;
400+ TRequestPercentiles<TCompoundTimeHist > PostponedTimePercentiles;
305401
306402 TMaxCalculator<DEFAULT_BUCKET_COUNT> MaxTimeCalc;
307403 TMaxCalculator<DEFAULT_BUCKET_COUNT> MaxTotalTimeCalc;
0 commit comments