17 #define TIME_BUCKETS 20 22 ProfileItem(
const std::string& reference) : m_reference(reference)
23 { gettimeofday(&m_tvStart, NULL);
24 auto timenow = chrono::system_clock::to_time_t(chrono::system_clock::now());
25 m_ts = std::string(ctime(&timenow));
26 m_ts.back() =
'\0'; };
32 gettimeofday(&tv, NULL);
33 m_duration = (tv.tv_sec - m_tvStart.tv_sec) * 1000 +
34 (tv.tv_usec - m_tvStart.tv_usec) / 1000;
36 unsigned long getDuration() {
return m_duration; };
37 const std::string& getReference()
const {
return m_reference; };
38 const std::string& getTs()
const {
return m_ts; };
40 std::string m_reference;
41 struct timeval m_tvStart;
42 unsigned long m_duration;
49 QueryProfile(
int samples) : m_samples(samples) { time(&m_lastReport); };
52 int b = item->getDuration() / BUCKET_SIZE;
53 if (b >= TIME_BUCKETS)
56 if (m_items.size() == m_samples)
59 unsigned long minDuration = m_items[0]->getDuration();
60 for (
int i = 1; i < m_items.size(); i++)
62 if (m_items[i]->getDuration() < minDuration)
64 minDuration = m_items[i]->getDuration();
68 if (item->getDuration() > minDuration)
70 delete m_items[minIndex];
71 m_items[minIndex] = item;
80 m_items.push_back(item);
82 if (time(0) - m_lastReport > 600)
89 std::vector<ProfileItem *> m_items;
91 unsigned int m_buckets[TIME_BUCKETS];
94 Logger *logger = Logger::getLogger();
95 logger->info(
"Storage profile report");
96 logger->info(
" < %3d mS %d", BUCKET_SIZE, m_buckets[0]);
97 for (
int j = 1; j < TIME_BUCKETS - 1; j++)
99 logger->info(
"%3d-%3d mS %d",
100 j * BUCKET_SIZE, (j + 1) * BUCKET_SIZE,
103 logger->info(
" > %3d mS %d", BUCKET_SIZE * TIME_BUCKETS, m_buckets[TIME_BUCKETS-1]);
104 for (
int i = 0; i < m_items.size(); i++)
106 logger->info(
"%ld mS, %s, %s\n",
107 m_items[i]->getDuration(),
108 m_items[i]->getTs().c_str(),
109 m_items[i]->getReference().c_str());
Fledge Logger class used to log to syslog.
Definition: logger.h:26