mirror of
https://github.com/typesense/typesense.git
synced 2025-05-21 14:12:27 +08:00
Merge pull request #1467 from krunal1313/event_anaylytics
Enable analytics rate limit for some tests explicitly
This commit is contained in:
commit
5e17c44f9f
@ -165,6 +165,7 @@ private:
|
||||
Store* store = nullptr;
|
||||
Store* analytics_store = nullptr;
|
||||
|
||||
bool isRateLimitEnabled = false;
|
||||
AnalyticsManager() {}
|
||||
|
||||
~AnalyticsManager();
|
||||
@ -237,7 +238,7 @@ public:
|
||||
|
||||
std::unordered_map<std::string, QueryAnalytics*> get_nohits_queries();
|
||||
|
||||
void resetRateLimit();
|
||||
void resetToggleRateLimit(bool toggle);
|
||||
|
||||
void add_query_hits_count(const std::string& query_collection, const std::string& query, const std::string& user_id,
|
||||
uint64_t hits_count);
|
||||
|
@ -298,27 +298,32 @@ Option<bool> AnalyticsManager::add_event(const std::string& event_type, const st
|
||||
if(analytics_store) {
|
||||
auto &events_vec= query_collection_events[query_collection];
|
||||
|
||||
auto now_ts_seconds = std::chrono::duration_cast<std::chrono::seconds>(
|
||||
std::chrono::system_clock::now().time_since_epoch()).count();
|
||||
auto events_cache_it = events_cache.find(client_ip);
|
||||
#ifdef TEST_BUILD
|
||||
if (isRateLimitEnabled) {
|
||||
#endif
|
||||
auto now_ts_seconds = std::chrono::duration_cast<std::chrono::seconds>(
|
||||
std::chrono::system_clock::now().time_since_epoch()).count();
|
||||
auto events_cache_it = events_cache.find(client_ip);
|
||||
|
||||
if (events_cache_it != events_cache.end()) {
|
||||
//event found in events cache
|
||||
if ((now_ts_seconds - events_cache_it->second.last_update_time) < EVENTS_RATE_LIMIT_SEC) {
|
||||
if (events_cache_it->second.count >= EVENTS_RATE_LIMIT_COUNT) {
|
||||
return Option<bool>(500, "event rate limit reached.");
|
||||
if (events_cache_it != events_cache.end()) {
|
||||
//event found in events cache
|
||||
if ((now_ts_seconds - events_cache_it->second.last_update_time) < EVENTS_RATE_LIMIT_SEC) {
|
||||
if (events_cache_it->second.count >= EVENTS_RATE_LIMIT_COUNT) {
|
||||
return Option<bool>(500, "event rate limit reached.");
|
||||
} else {
|
||||
events_cache_it->second.count++;
|
||||
}
|
||||
} else {
|
||||
events_cache_it->second.count++;
|
||||
events_cache_it->second.last_update_time = now_ts_seconds;
|
||||
events_cache_it->second.count = 1;
|
||||
}
|
||||
} else {
|
||||
events_cache_it->second.last_update_time = now_ts_seconds;
|
||||
events_cache_it->second.count = 1;
|
||||
event_cache_t eventCache{(uint64_t) now_ts_seconds, 1};
|
||||
events_cache.insert(client_ip, eventCache);
|
||||
}
|
||||
} else {
|
||||
event_cache_t eventCache{(uint64_t) now_ts_seconds, 1};
|
||||
events_cache.insert(client_ip, eventCache);
|
||||
#ifdef TEST_BUILD
|
||||
}
|
||||
|
||||
#endif
|
||||
auto now_ts_useconds = std::chrono::duration_cast<std::chrono::microseconds>(
|
||||
std::chrono::system_clock::now().time_since_epoch()).count();
|
||||
|
||||
@ -712,8 +717,9 @@ Option<bool> AnalyticsManager::write_events_to_store(nlohmann::json &event_jsons
|
||||
return Option<bool>(true);
|
||||
}
|
||||
|
||||
void AnalyticsManager::resetRateLimit() {
|
||||
void AnalyticsManager::resetToggleRateLimit(bool toggle) {
|
||||
events_cache.clear();
|
||||
isRateLimitEnabled = toggle;
|
||||
}
|
||||
|
||||
void AnalyticsManager::resetAnalyticsStore() {
|
||||
|
@ -429,7 +429,7 @@ TEST_F(AnalyticsManagerTest, ClickEventsRateLimitTest) {
|
||||
})"_json;
|
||||
|
||||
//reset the LRU cache to test the rate limit
|
||||
analyticsManager.resetRateLimit();
|
||||
analyticsManager.resetToggleRateLimit(true);
|
||||
|
||||
req->body = event.dump();
|
||||
for(auto i = 0; i < 5; ++i) {
|
||||
@ -439,6 +439,8 @@ TEST_F(AnalyticsManagerTest, ClickEventsRateLimitTest) {
|
||||
//as rate limit is 5, adding one more event above that should trigger rate limit
|
||||
ASSERT_FALSE(post_create_event(req, res));
|
||||
ASSERT_EQ("{\"message\": \"event rate limit reached.\"}", res->body);
|
||||
|
||||
analyticsManager.resetToggleRateLimit(false);
|
||||
}
|
||||
|
||||
TEST_F(AnalyticsManagerTest, NoresultsQueries) {
|
||||
@ -895,8 +897,6 @@ TEST_F(AnalyticsManagerTest, EventsExpiryPartial) {
|
||||
}
|
||||
|
||||
TEST_F(AnalyticsManagerTest, PopularityScore) {
|
||||
//reset click event rate limit
|
||||
analyticsManager.resetRateLimit();
|
||||
|
||||
nlohmann::json products_schema = R"({
|
||||
"name": "products",
|
||||
@ -1182,8 +1182,6 @@ TEST_F(AnalyticsManagerTest, PopularityScoreValidation) {
|
||||
}
|
||||
|
||||
TEST_F(AnalyticsManagerTest, PurchaseEventsStoreRetrieval) {
|
||||
//reset rate limit
|
||||
analyticsManager.resetRateLimit();
|
||||
|
||||
nlohmann::json titles_schema = R"({
|
||||
"name": "titles",
|
||||
|
@ -1501,7 +1501,6 @@ TEST_F(CoreAPIUtilsTest, TestInvalidConversationModels) {
|
||||
|
||||
TEST_F(CoreAPIUtilsTest, GetClickEvents) {
|
||||
//reset analytics store
|
||||
analyticsManager.resetRateLimit();
|
||||
analyticsManager.resetAnalyticsStore();
|
||||
|
||||
nlohmann::json schema = R"({
|
||||
|
Loading…
x
Reference in New Issue
Block a user