1
#include "source/common/stats/timespan_impl.h"
2

            
3
#include "source/common/common/assert.h"
4
#include "source/common/common/fmt.h"
5

            
6
namespace Envoy {
7
namespace Stats {
8

            
9
HistogramCompletableTimespanImpl::HistogramCompletableTimespanImpl(Histogram& histogram,
10
                                                                   TimeSource& time_source)
11
244675
    : time_source_(time_source), histogram_(histogram), start_(time_source.monotonicTime()) {
12
244675
  ensureTimeHistogram(histogram);
13
244675
}
14

            
15
9
std::chrono::milliseconds HistogramCompletableTimespanImpl::elapsed() const {
16
9
  return HistogramCompletableTimespanImpl::elapsedDuration<std::chrono::milliseconds>();
17
9
}
18

            
19
196050
void HistogramCompletableTimespanImpl::complete() { histogram_.recordValue(tickCount()); }
20

            
21
244676
void HistogramCompletableTimespanImpl::ensureTimeHistogram(const Histogram& histogram) const {
22
244676
  switch (histogram.unit()) {
23
9
  case Histogram::Unit::Null:
24
200
  case Histogram::Unit::Microseconds:
25
244676
  case Histogram::Unit::Milliseconds:
26
244676
    return;
27
  case Histogram::Unit::Unspecified:
28
  case Histogram::Unit::Bytes:
29
  case Histogram::Unit::Percent:
30
    RELEASE_ASSERT(
31
244676
        false,
32
244676
        fmt::format("Cannot create a timespan flushing the duration to histogram '{}' because "
33
244676
                    "it does not measure time. This is a programming error, either pass a "
34
244676
                    "histogram measuring time or fix the unit of the passed histogram.",
35
244676
                    histogram.name()));
36
244676
  }
37
244676
}
38

            
39
196051
uint64_t HistogramCompletableTimespanImpl::tickCount() const {
40
196051
  switch (histogram_.unit()) {
41
9
  case Histogram::Unit::Null:
42
9
    return 0;
43
154
  case Histogram::Unit::Microseconds:
44
154
    return HistogramCompletableTimespanImpl::elapsedDuration<std::chrono::microseconds>().count();
45
195885
  case Histogram::Unit::Milliseconds:
46
195885
    return HistogramCompletableTimespanImpl::elapsedDuration<std::chrono::milliseconds>().count();
47
  case Histogram::Unit::Unspecified:
48
  case Histogram::Unit::Bytes:
49
  case Histogram::Unit::Percent:
50
    PANIC("not implemented");
51
196051
  }
52
  PANIC_DUE_TO_CORRUPT_ENUM;
53
}
54

            
55
} // namespace Stats
56
} // namespace Envoy