From 9af6ccdc8c7f786f19d6bdabf3d20e5d6ee6f64e Mon Sep 17 00:00:00 2001 From: jinrui Date: Fri, 17 Jun 2022 11:36:06 +0800 Subject: [PATCH 1/4] feat(push): Add push support http header customization --- push/include/prometheus/gateway.h | 7 +++++++ push/src/curl_wrapper.cc | 24 +++++++++++++++++++++++- push/src/curl_wrapper.h | 3 +++ push/src/gateway.cc | 5 +++++ 4 files changed, 38 insertions(+), 1 deletion(-) diff --git a/push/include/prometheus/gateway.h b/push/include/prometheus/gateway.h index e6acd0f0..955840a9 100644 --- a/push/include/prometheus/gateway.h +++ b/push/include/prometheus/gateway.h @@ -58,6 +58,13 @@ class PROMETHEUS_CPP_PUSH_EXPORT Gateway { // Delete metrics from the given pushgateway (for configured instance labels). std::future AsyncDeleteForInstance(); + /** + * Add a custom http header, it must use after create gateway before push + * `header` is the custom header, its content format is “key:value”, such + * as "user:gateway" + */ + void AddOptHttpHeader(const std::string& header); + private: std::string jobUri_; std::string labels_; diff --git a/push/src/curl_wrapper.cc b/push/src/curl_wrapper.cc index 767e10f1..7e772f7e 100644 --- a/push/src/curl_wrapper.cc +++ b/push/src/curl_wrapper.cc @@ -40,7 +40,24 @@ int CurlWrapper::performHttpRequest(HttpMethod method, const std::string& uri, curl_easy_setopt(curl_, CURLOPT_URL, uri.c_str()); curl_slist* header_chunk = nullptr; - header_chunk = curl_slist_append(header_chunk, CONTENT_TYPE); + header_chunk = curl_slist_append(header_chunk, CONTENT_TYPE); + if (nullptr == header_chunk) + { + return -1; + } + + for (int i = 0; i < optHttpHeader_.size(); i++) + { + curl_slist* header_tmp = nullptr; + header_tmp = curl_slist_append(header_chunk, optHttpHeader_[i].c_str()); + if (nullptr == header_tmp) + { + curl_slist_free_all(header_chunk); + return -1; + } + + header_chunk = header_tmp; + } curl_easy_setopt(curl_, CURLOPT_HTTPHEADER, header_chunk); if (!body.empty()) { @@ -86,5 +103,10 @@ int CurlWrapper::performHttpRequest(HttpMethod method, const std::string& uri, return response_code; } +void CurlWrapper::addOptHttpHeader(const std::string& header) +{ + optHttpHeader_.push_back(header); +} + } // namespace detail } // namespace prometheus diff --git a/push/src/curl_wrapper.h b/push/src/curl_wrapper.h index df20d6bb..6841e7c6 100644 --- a/push/src/curl_wrapper.h +++ b/push/src/curl_wrapper.h @@ -2,6 +2,7 @@ #include #include +#include #include "prometheus/detail/http_method.h" @@ -21,11 +22,13 @@ class CurlWrapper { int performHttpRequest(HttpMethod method, const std::string& uri, const std::string& body); + void addOptHttpHeader(const std::string& header); private: CURL* curl_; std::string auth_; std::mutex mutex_; + std::vector optHttpHeader_; }; } // namespace detail diff --git a/push/src/gateway.cc b/push/src/gateway.cc index 7d61266c..ab671123 100644 --- a/push/src/gateway.cc +++ b/push/src/gateway.cc @@ -164,4 +164,9 @@ void Gateway::CleanupStalePointers( std::end(collectables)); } +void Gateway::AddOptHttpHeader(const std::string& header) +{ + curlWrapper_->addOptHttpHeader(header); +} + } // namespace prometheus From d821e0c717491ab7535666798150b8f9b1fefd85 Mon Sep 17 00:00:00 2001 From: jinrui Date: Mon, 20 Jun 2022 16:56:05 +0800 Subject: [PATCH 2/4] fix(push): PR(#598) comments --- push/include/prometheus/gateway.h | 2 +- push/src/curl_wrapper.cc | 27 ++++++++++++++++++++++----- push/src/curl_wrapper.h | 5 ++--- push/src/gateway.cc | 7 ++++--- 4 files changed, 29 insertions(+), 12 deletions(-) diff --git a/push/include/prometheus/gateway.h b/push/include/prometheus/gateway.h index 955840a9..4f205fcc 100644 --- a/push/include/prometheus/gateway.h +++ b/push/include/prometheus/gateway.h @@ -63,7 +63,7 @@ class PROMETHEUS_CPP_PUSH_EXPORT Gateway { * `header` is the custom header, its content format is “key:value”, such * as "user:gateway" */ - void AddOptHttpHeader(const std::string& header); + int AddHttpHeader(const std::string& header); private: std::string jobUri_; diff --git a/push/src/curl_wrapper.cc b/push/src/curl_wrapper.cc index 7e772f7e..012b4bc8 100644 --- a/push/src/curl_wrapper.cc +++ b/push/src/curl_wrapper.cc @@ -22,12 +22,18 @@ CurlWrapper::CurlWrapper(const std::string& username, throw std::runtime_error("Cannot initialize easy curl!"); } + optHttpHeader_ = nullptr; + if (!username.empty()) { auth_ = username + ":" + password; } } CurlWrapper::~CurlWrapper() { + if (optHttpHeader_ != nullptr) + { + curl_slist_free_all(optHttpHeader_); + } curl_easy_cleanup(curl_); curl_global_cleanup(); } @@ -46,10 +52,10 @@ int CurlWrapper::performHttpRequest(HttpMethod method, const std::string& uri, return -1; } - for (int i = 0; i < optHttpHeader_.size(); i++) + curl_slist* optHeader_tmp = optHttpHeader_; + while (optHeader_tmp) { - curl_slist* header_tmp = nullptr; - header_tmp = curl_slist_append(header_chunk, optHttpHeader_[i].c_str()); + curl_slist* header_tmp = curl_slist_append(header_chunk, optHeader_tmp->data); if (nullptr == header_tmp) { curl_slist_free_all(header_chunk); @@ -57,7 +63,9 @@ int CurlWrapper::performHttpRequest(HttpMethod method, const std::string& uri, } header_chunk = header_tmp; + optHeader_tmp = optHeader_tmp->next; } + curl_easy_setopt(curl_, CURLOPT_HTTPHEADER, header_chunk); if (!body.empty()) { @@ -103,9 +111,18 @@ int CurlWrapper::performHttpRequest(HttpMethod method, const std::string& uri, return response_code; } -void CurlWrapper::addOptHttpHeader(const std::string& header) +int CurlWrapper::addOptHttpHeader(const std::string& header) { - optHttpHeader_.push_back(header); + std::lock_guard lock{mutex_}; + curl_slist* header_tmp = nullptr; + header_tmp = curl_slist_append(optHttpHeader_, header.c_str()); + if (nullptr == header_tmp) + { + return -1; + } + + optHttpHeader_ = header_tmp; + return 0; } } // namespace detail diff --git a/push/src/curl_wrapper.h b/push/src/curl_wrapper.h index 6841e7c6..c7f4ea26 100644 --- a/push/src/curl_wrapper.h +++ b/push/src/curl_wrapper.h @@ -2,7 +2,6 @@ #include #include -#include #include "prometheus/detail/http_method.h" @@ -22,13 +21,13 @@ class CurlWrapper { int performHttpRequest(HttpMethod method, const std::string& uri, const std::string& body); - void addOptHttpHeader(const std::string& header); + int addOptHttpHeader(const std::string& header); private: CURL* curl_; std::string auth_; std::mutex mutex_; - std::vector optHttpHeader_; + curl_slist* optHttpHeader_; }; } // namespace detail diff --git a/push/src/gateway.cc b/push/src/gateway.cc index ab671123..55fcb672 100644 --- a/push/src/gateway.cc +++ b/push/src/gateway.cc @@ -20,7 +20,7 @@ namespace prometheus { Gateway::Gateway(const std::string& host, const std::string& port, const std::string& jobname, const Labels& labels, const std::string& username, const std::string& password) { - curlWrapper_ = std::make_unique(username, password); + curlWrapper_ = detail::make_unique(username, password); std::stringstream jobUriStream; jobUriStream << host << ':' << port << "/metrics/job/" << jobname; @@ -164,9 +164,10 @@ void Gateway::CleanupStalePointers( std::end(collectables)); } -void Gateway::AddOptHttpHeader(const std::string& header) +int Gateway::AddHttpHeader(const std::string& header) { - curlWrapper_->addOptHttpHeader(header); + std::lock_guard lock{mutex_}; + return curlWrapper_->addOptHttpHeader(header); } } // namespace prometheus From 280a00fca9f97a12dbb5f187aae4b9294abee737 Mon Sep 17 00:00:00 2001 From: jinrui Date: Mon, 20 Jun 2022 17:16:59 +0800 Subject: [PATCH 3/4] fix(push): go back, detail::make_unique to std::make_unique --- push/src/gateway.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/push/src/gateway.cc b/push/src/gateway.cc index 55fcb672..fd2540ef 100644 --- a/push/src/gateway.cc +++ b/push/src/gateway.cc @@ -20,7 +20,7 @@ namespace prometheus { Gateway::Gateway(const std::string& host, const std::string& port, const std::string& jobname, const Labels& labels, const std::string& username, const std::string& password) { - curlWrapper_ = detail::make_unique(username, password); + curlWrapper_ = std::make_unique(username, password); std::stringstream jobUriStream; jobUriStream << host << ':' << port << "/metrics/job/" << jobname; From 5a4c3f61850eb40b9a911e90ea29b7b9d8da31f4 Mon Sep 17 00:00:00 2001 From: jinrui Date: Tue, 21 Jun 2022 11:04:57 +0800 Subject: [PATCH 4/4] fix(push): second PR(#598) comments --- push/src/curl_wrapper.cc | 10 +++------- push/src/curl_wrapper.h | 2 +- push/src/gateway.cc | 3 +-- 3 files changed, 5 insertions(+), 10 deletions(-) diff --git a/push/src/curl_wrapper.cc b/push/src/curl_wrapper.cc index 012b4bc8..3badcf9a 100644 --- a/push/src/curl_wrapper.cc +++ b/push/src/curl_wrapper.cc @@ -30,10 +30,7 @@ CurlWrapper::CurlWrapper(const std::string& username, } CurlWrapper::~CurlWrapper() { - if (optHttpHeader_ != nullptr) - { - curl_slist_free_all(optHttpHeader_); - } + curl_slist_free_all(optHttpHeader_); curl_easy_cleanup(curl_); curl_global_cleanup(); } @@ -111,11 +108,10 @@ int CurlWrapper::performHttpRequest(HttpMethod method, const std::string& uri, return response_code; } -int CurlWrapper::addOptHttpHeader(const std::string& header) +int CurlWrapper::addHttpHeader(const std::string& header) { std::lock_guard lock{mutex_}; - curl_slist* header_tmp = nullptr; - header_tmp = curl_slist_append(optHttpHeader_, header.c_str()); + auto header_tmp = curl_slist_append(optHttpHeader_, header.c_str()); if (nullptr == header_tmp) { return -1; diff --git a/push/src/curl_wrapper.h b/push/src/curl_wrapper.h index c7f4ea26..f1a55afc 100644 --- a/push/src/curl_wrapper.h +++ b/push/src/curl_wrapper.h @@ -21,7 +21,7 @@ class CurlWrapper { int performHttpRequest(HttpMethod method, const std::string& uri, const std::string& body); - int addOptHttpHeader(const std::string& header); + int addHttpHeader(const std::string& header); private: CURL* curl_; diff --git a/push/src/gateway.cc b/push/src/gateway.cc index fd2540ef..7fdc099b 100644 --- a/push/src/gateway.cc +++ b/push/src/gateway.cc @@ -166,8 +166,7 @@ void Gateway::CleanupStalePointers( int Gateway::AddHttpHeader(const std::string& header) { - std::lock_guard lock{mutex_}; - return curlWrapper_->addOptHttpHeader(header); + return curlWrapper_->addHttpHeader(header); } } // namespace prometheus