#ifndef SRC_HISTOGRAM_H_ #define SRC_HISTOGRAM_H_ #if defined(NODE_WANT_INTERNALS) && NODE_WANT_INTERNALS #include "hdr_histogram.h" #include "base_object.h" #include "util.h" #include #include #include namespace node { constexpr int kDefaultHistogramFigures = 3; class Histogram { public: Histogram( int64_t lowest = std::numeric_limits::min(), int64_t highest = std::numeric_limits::max(), int figures = kDefaultHistogramFigures); virtual ~Histogram() = default; inline bool Record(int64_t value); inline void Reset(); inline int64_t Min(); inline int64_t Max(); inline double Mean(); inline double Stddev(); inline double Percentile(double percentile); // Iterator is a function type that takes two doubles as argument, one for // percentile and one for the value at that percentile. template inline void Percentiles(Iterator&& fn); size_t GetMemorySize() const { return hdr_get_memory_size(histogram_.get()); } private: using HistogramPointer = DeleteFnPtr; HistogramPointer histogram_; }; class HistogramBase : public BaseObject, public Histogram { public: virtual ~HistogramBase() = default; virtual void TraceDelta(int64_t delta) {} virtual void TraceExceeds(int64_t delta) {} inline bool RecordDelta(); inline void ResetState(); int64_t Exceeds() const { return exceeds_; } void MemoryInfo(MemoryTracker* tracker) const override; SET_MEMORY_INFO_NAME(HistogramBase) SET_SELF_SIZE(HistogramBase) static void GetMin(const v8::FunctionCallbackInfo& args); static void GetMax(const v8::FunctionCallbackInfo& args); static void GetMean(const v8::FunctionCallbackInfo& args); static void GetExceeds(const v8::FunctionCallbackInfo& args); static void GetStddev(const v8::FunctionCallbackInfo& args); static void GetPercentile( const v8::FunctionCallbackInfo& args); static void GetPercentiles( const v8::FunctionCallbackInfo& args); static void DoReset(const v8::FunctionCallbackInfo& args); static void Initialize(Environment* env); static BaseObjectPtr New( Environment* env, int64_t lowest = std::numeric_limits::min(), int64_t highest = std::numeric_limits::max(), int figures = kDefaultHistogramFigures); HistogramBase( Environment* env, v8::Local wrap, int64_t lowest = std::numeric_limits::min(), int64_t highest = std::numeric_limits::max(), int figures = kDefaultHistogramFigures); private: int64_t exceeds_ = 0; uint64_t prev_ = 0; }; } // namespace node #endif // defined(NODE_WANT_INTERNALS) && NODE_WANT_INTERNALS #endif // SRC_HISTOGRAM_H_