Merge pull request #795 from indiosmo/queue_full_counter

Expose a counter for how many messages were dropped in async mode
This commit is contained in:
Gabi Melman 2018-08-14 16:36:38 +03:00 committed by GitHub
commit c23f36c734
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 23 additions and 0 deletions

View File

@ -31,6 +31,7 @@ public:
if (tail_ == head_) // overrun last item if full if (tail_ == head_) // overrun last item if full
{ {
head_ = (head_ + 1) % max_items_; head_ = (head_ + 1) % max_items_;
++overrun_counter_;
} }
} }
@ -53,12 +54,19 @@ public:
return ((tail_ + 1) % max_items_) == head_; return ((tail_ + 1) % max_items_) == head_;
} }
size_t overrun_counter() const
{
return overrun_counter_;
}
private: private:
size_t max_items_; size_t max_items_;
typename std::vector<T>::size_type head_ = 0; typename std::vector<T>::size_type head_ = 0;
typename std::vector<T>::size_type tail_ = 0; typename std::vector<T>::size_type tail_ = 0;
std::vector<T> v_; std::vector<T> v_;
size_t overrun_counter_ = 0;
}; };
} // namespace details } // namespace details
} // namespace spdlog } // namespace spdlog

View File

@ -30,6 +30,12 @@ public:
{ {
} }
size_t overrun_counter() const
{
std::unique_lock<std::mutex> lock(queue_mutex_);
return q_.overrun_counter();
}
#ifndef __MINGW32__ #ifndef __MINGW32__
// try to enqueue and block if no room left // try to enqueue and block if no room left
void enqueue(T &&item) void enqueue(T &&item)

View File

@ -157,6 +157,11 @@ public:
post_async_msg_(async_msg(std::move(worker_ptr), async_msg_type::flush), overflow_policy); post_async_msg_(async_msg(std::move(worker_ptr), async_msg_type::flush), overflow_policy);
} }
size_t overrun_counter() const
{
return q_.overrun_counter();
}
private: private:
q_type q_; q_type q_;

View File

@ -7,6 +7,7 @@ TEST_CASE("basic async test ", "[async]")
{ {
using namespace spdlog; using namespace spdlog;
auto test_sink = std::make_shared<sinks::test_sink_mt>(); auto test_sink = std::make_shared<sinks::test_sink_mt>();
size_t overrun_counter = 0;
size_t queue_size = 128; size_t queue_size = 128;
size_t messages = 256; size_t messages = 256;
{ {
@ -17,9 +18,11 @@ TEST_CASE("basic async test ", "[async]")
logger->info("Hello message #{}", i); logger->info("Hello message #{}", i);
} }
logger->flush(); logger->flush();
overrun_counter = tp->overrun_counter();
} }
REQUIRE(test_sink->msg_counter() == messages); REQUIRE(test_sink->msg_counter() == messages);
REQUIRE(test_sink->flush_counter() == 1); REQUIRE(test_sink->flush_counter() == 1);
REQUIRE(overrun_counter == 0);
} }
TEST_CASE("discard policy ", "[async]") TEST_CASE("discard policy ", "[async]")
@ -37,6 +40,7 @@ TEST_CASE("discard policy ", "[async]")
logger->info("Hello message"); logger->info("Hello message");
} }
REQUIRE(test_sink->msg_counter() < messages); REQUIRE(test_sink->msg_counter() < messages);
REQUIRE(tp->overrun_counter() > 0);
} }
TEST_CASE("discard policy using factory ", "[async]") TEST_CASE("discard policy using factory ", "[async]")