Skip to content

Commit

Permalink
feat: support millisecond in HttpRequest for lastSendTime (#1755)
Browse files Browse the repository at this point in the history
  • Loading branch information
catdogpandas committed Sep 13, 2024
1 parent 7a04991 commit 1c42ebd
Show file tree
Hide file tree
Showing 6 changed files with 58 additions and 12 deletions.
9 changes: 5 additions & 4 deletions core/common/http/AsynCurlRunner.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -14,11 +14,12 @@

#include "common/http/AsynCurlRunner.h"

#include <chrono>

#include "app_config/AppConfig.h"
#include "common/StringTools.h"
#include "common/http/Curl.h"
#include "logger/Logger.h"
#include "monitor/LogtailAlarm.h"

using namespace std;

Expand Down Expand Up @@ -95,7 +96,7 @@ bool AsynCurlRunner::AddRequestToClient(unique_ptr<AsynHttpRequest>&& request) {

request->mPrivateData = headers;
curl_easy_setopt(curl, CURLOPT_PRIVATE, request.get());
request->mLastSendTime = time(nullptr);
request->mLastSendTime = std::chrono::system_clock::now();
auto res = curl_multi_add_handle(mClient, curl);
if (res != CURLM_OK) {
LOG_ERROR(sLogger,
Expand Down Expand Up @@ -182,8 +183,8 @@ void AsynCurlRunner::HandleCompletedRequests() {
curl_easy_getinfo(handler, CURLINFO_PRIVATE, &request);
LOG_DEBUG(sLogger,
("send http request completed, request address",
request)("response time", ToString(time(nullptr) - request->mLastSendTime))(
"try cnt", ToString(request->mTryCnt)));
request)("response time",ToString(chrono::duration_cast<chrono::milliseconds>(chrono::system_clock::now()- request->mLastSendTime).count()) + "ms")
("try cnt", ToString(request->mTryCnt)));
switch (msg->data.result) {
case CURLE_OK: {
long statusCode = 0;
Expand Down
3 changes: 2 additions & 1 deletion core/common/http/HttpRequest.h
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@

#pragma once

#include <chrono>
#include <cstdint>
#include <map>
#include <string>
Expand Down Expand Up @@ -43,7 +44,7 @@ struct HttpRequest {
uint32_t mMaxTryCnt = sDefaultMaxTryCnt;

uint32_t mTryCnt = 1;
time_t mLastSendTime = 0;
std::chrono::system_clock::time_point mLastSendTime;

HttpRequest(const std::string& method,
bool httpsFlag,
Expand Down
4 changes: 3 additions & 1 deletion core/prometheus/async/PromHttpRequest.cpp
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
#include "prometheus/async/PromHttpRequest.h"

#include <chrono>
#include <cstdint>
#include <string>

Expand All @@ -23,7 +24,8 @@ PromHttpRequest::PromHttpRequest(const std::string& method,
}

void PromHttpRequest::OnSendDone(const HttpResponse& response) {
mFuture->Process(response, mLastSendTime * 1000);
mFuture->Process(response,
std::chrono::duration_cast<std::chrono::milliseconds>(mLastSendTime.time_since_epoch()).count());
}

[[nodiscard]] bool PromHttpRequest::IsContextValid() const {
Expand Down
12 changes: 6 additions & 6 deletions core/runner/sink/http/HttpSink.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@
#include "common/StringTools.h"
#include "common/http/Curl.h"
#include "logger/Logger.h"
#include "monitor/LogtailAlarm.h"
#include "pipeline/plugin/interface/HttpFlusher.h"
#include "pipeline/queue/QueueKeyManager.h"
#include "pipeline/queue/SenderQueueItem.h"
Expand Down Expand Up @@ -100,7 +99,8 @@ bool HttpSink::AddRequestToClient(std::unique_ptr<HttpSinkRequest>&& request) {

request->mPrivateData = headers;
curl_easy_setopt(curl, CURLOPT_PRIVATE, request.get());
request->mLastSendTime = time(nullptr);
request->mLastSendTime = std::chrono::system_clock::now();

auto res = curl_multi_add_handle(mClient, curl);
if (res != CURLM_OK) {
request->mItem->mStatus = SendingStatus::IDLE;
Expand Down Expand Up @@ -191,10 +191,10 @@ void HttpSink::HandleCompletedRequests() {
HttpSinkRequest* request = nullptr;
curl_easy_getinfo(handler, CURLINFO_PRIVATE, &request);
LOG_DEBUG(sLogger,
("send http request completed, item address", request->mItem)(
"config-flusher-dst", QueueKeyManager::GetInstance()->GetName(request->mItem->mQueueKey))(
"response time",
ToString(time(nullptr) - request->mLastSendTime))("try cnt", ToString(request->mTryCnt)));
("send http request completed, item address", request->mItem)
("config-flusher-dst", QueueKeyManager::GetInstance()->GetName(request->mItem->mQueueKey))
("response time",ToString(chrono::duration_cast<chrono::milliseconds>(chrono::system_clock::now()- request->mLastSendTime).count()) + "ms")
("try cnt", ToString(request->mTryCnt)));
switch (msg->data.result) {
case CURLE_OK: {
long statusCode = 0;
Expand Down
4 changes: 4 additions & 0 deletions core/unittest/prometheus/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,9 @@ target_link_libraries(scrape_config_unittest ${UT_BASE_TARGET})
add_executable(prom_utils_unittest UtilsUnittest.cpp)
target_link_libraries(prom_utils_unittest ${UT_BASE_TARGET})

add_executable(prom_asyn_unittest PromAsynUnittest.cpp)
target_link_libraries(prom_asyn_unittest ${UT_BASE_TARGET})

include(GoogleTest)

gtest_discover_tests(labels_unittest)
Expand All @@ -54,3 +57,4 @@ gtest_discover_tests(textparser_unittest)
gtest_discover_tests(textparser_benchmark)
gtest_discover_tests(scrape_config_unittest)
gtest_discover_tests(prom_utils_unittest)
gtest_discover_tests(prom_asyn_unittest)
38 changes: 38 additions & 0 deletions core/unittest/prometheus/PromAsynUnittest.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@

#include "common/http/HttpResponse.h"
#include "prometheus/async/PromFuture.h"
#include "prometheus/async/PromHttpRequest.h"
#include "unittest/Unittest.h"

using namespace std;

namespace logtail {
class PromAsynUnittest : public testing::Test {
public:
void TestExecTime();
};

void PromAsynUnittest::TestExecTime() {
auto future = std::make_shared<PromFuture>();
auto now = std::chrono::system_clock::now();
bool exec = false;
future->AddDoneCallback([&exec, now](const HttpResponse&, uint64_t timestampMilliSec) {
APSARA_TEST_EQUAL(timestampMilliSec,
std::chrono::duration_cast<std::chrono::milliseconds>(now.time_since_epoch()).count());

APSARA_TEST_TRUE(exec);
});
auto request = std::make_shared<PromHttpRequest>(
"http", false, "127.0.0.1", 8080, "/", "", map<string, string>(), "", 10, 3, future);
auto asynRequest = std::dynamic_pointer_cast<AsynHttpRequest>(request);
asynRequest->mLastSendTime = now;
auto response = HttpResponse{};
exec = true;
asynRequest->OnSendDone(response);
}

UNIT_TEST_CASE(PromAsynUnittest, TestExecTime);

} // namespace logtail

UNIT_TEST_MAIN

0 comments on commit 1c42ebd

Please sign in to comment.