diff --git a/packages/p/prometheus-cpp/xmake.lua b/packages/p/prometheus-cpp/xmake.lua new file mode 100644 index 000000000..38636ebeb --- /dev/null +++ b/packages/p/prometheus-cpp/xmake.lua @@ -0,0 +1,98 @@ +package("prometheus-cpp") + set_homepage("https://github.com/jupp0r/prometheus-cpp") + set_description("Prometheus Client Library for Modern C++") + set_license("MIT") + + add_urls("https://github.com/jupp0r/prometheus-cpp/archive/refs/tags/$(version).tar.gz", + "https://github.com/jupp0r/prometheus-cpp.git") + add_versions("v1.0.0", "07018db604ea3e61f5078583e87c80932ea10c300d979061490ee1b7dc8e3a41") + + add_configs("pull", {description = "Enable Pull.", default = true, type = "boolean"}) + add_configs("push", {description = "Enable push.", default = true, type = "boolean"}) + add_configs("compression", {description = "Enable compression.", default = true, type = "boolean"}) + + add_deps("cmake") + + if is_plat("linux") then + add_syslinks("pthread") + end + + on_load("linux", function (package) + if package:config("pull") then + package:add("deps", "civetweb v1.15") + package:add("links", "prometheus-cpp-pull") + end + if package:config("push") then + package:add("deps", "libcurl") + package:add("links", "prometheus-cpp-push") + end + if package:config("compression") then + package:add("deps", "zlib") + end + package:add("links", "prometheus-cpp-core") + end) + + on_install("linux", function (package) + local configs = {} + for name, enabled in pairs(package:configs()) do + if not package:extraconf("configs", name, "builtin") then + table.insert(configs, "-DENABLE_" .. name:upper() .. "=" .. (enabled and "ON" or "OFF")) + end + end + table.insert(configs, "-DGENERATE_PKGCONFIG=ON") + table.insert(configs, "-DENABLE_TESTING=OFF") + table.insert(configs, "-DUSE_THIRDPARTY_LIBRARIES=OFF") + table.insert(configs, "-DCMAKE_BUILD_TYPE=" .. (package:debug() and "Debug" or "Release")) + table.insert(configs, "-DBUILD_SHARED_LIBS=" .. (package:config("shared") and "ON" or "OFF")) + import("package.tools.cmake").install(package, configs) + end) + + on_test("linux", function (package) + assert(package:has_cxxincludes("prometheus/counter.h")) + + if package:config("pull") then + assert(package:has_cxxincludes("prometheus/exposer.h")) + assert(package:check_cxxsnippets({test = [[ + #include + #include + #include + #include + #include + #include + + void test() { + using namespace prometheus; + Exposer exposer{"127.0.0.1:8080"}; + auto registry = std::make_shared(); + auto& packet_counter = BuildCounter() + .Name("observed_packets_total") + .Help("Number of observed packets") + .Register(*registry); + auto& tcp_rx_counter = packet_counter.Add({{"protocol", "tcp"}, {"direction", "rx"}}); + auto& tcp_tx_counter = packet_counter.Add({{"protocol", "tcp"}, {"direction", "tx"}}); + auto& udp_rx_counter = packet_counter.Add({{"protocol", "udp"}, {"direction", "rx"}}); + auto& udp_tx_counter = packet_counter.Add({{"protocol", "udp"}, {"direction", "tx"}}); + auto& http_requests_counter = BuildCounter() + .Name("http_requests_total") + .Help("Number of HTTP requests") + .Register(*registry); + exposer.RegisterCollectable(registry); + for (int i = 0; i < 30; i++) { + std::this_thread::sleep_for(std::chrono::seconds(1)); + const auto random_value = std::rand(); + if (random_value & 1) tcp_rx_counter.Increment(); + if (random_value & 2) tcp_tx_counter.Increment(); + if (random_value & 4) udp_rx_counter.Increment(); + if (random_value & 8) udp_tx_counter.Increment(); + const std::array methods = {"GET", "PUT", "POST", "HEAD"}; + auto method = methods.at(random_value % methods.size()); + http_requests_counter.Add({{"method", method}}).Increment(); + } + } + ]]}, {configs = {languages = "cxx11"}, includes = {"prometheus/counter.h", "prometheus/exposer.h", "prometheus/registry.h"}})) + end + + if package:config("push") then + assert(package:has_cxxincludes("prometheus/gateway.h")) + end + end)