feat(webserver): implement metrics endpoint

This endpoint currently returns only prometheus metrics.

Signed-off-by: Samuel Gaist <samuel.gaist@idiap.ch>
This commit is contained in:
Samuel Gaist
2024-03-15 22:18:00 +01:00
committed by poiana
parent 61dab93eb3
commit 8f1b2dc909
6 changed files with 40 additions and 5 deletions

View File

@@ -1003,6 +1003,7 @@ metrics:
libbpf_stats_enabled: true
convert_memory_to_mb: true
include_empty_values: false
prometheus_enabled: false
#######################################
# Falco performance tuning (advanced) #

View File

@@ -44,8 +44,18 @@ falco::app::run_result falco::app::actions::start_webserver(falco::app::state& s
+ std::to_string(s.config->m_webserver_listen_port)
+ ssl_option + "\n");
std::vector<libs::metrics::libs_metrics_collector> metrics_collectors;
if (s.config->m_metrics_prometheus_enabled && s.config->m_metrics_prometheus_enabled)
{
for (const auto& source_info: s.source_infos)
{
metrics_collectors.push_back(libs::metrics::libs_metrics_collector(source_info.inspector.get(), s.config->m_metrics_flags));
}
}
s.webserver.start(
s.offline_inspector,
metrics_collectors,
s.config->m_webserver_threadiness,
s.config->m_webserver_listen_port,
s.config->m_webserver_listen_address,

View File

@@ -79,7 +79,8 @@ falco_configuration::falco_configuration():
m_metrics_output_file(""),
m_metrics_flags((METRICS_V2_KERNEL_COUNTERS | METRICS_V2_LIBBPF_STATS | METRICS_V2_RESOURCE_UTILIZATION | METRICS_V2_STATE_COUNTERS)),
m_metrics_convert_memory_to_mb(true),
m_metrics_include_empty_values(false)
m_metrics_include_empty_values(false),
m_metrics_prometheus_enabled(false)
{
}
@@ -553,6 +554,7 @@ void falco_configuration::load_yaml(const std::string& config_name)
m_metrics_convert_memory_to_mb = config.get_scalar<bool>("metrics.convert_memory_to_mb", true);
m_metrics_include_empty_values = config.get_scalar<bool>("metrics.include_empty_values", false);
m_metrics_prometheus_enabled = config.get_scalar<bool>("metrics.prometheus_enabled", false);
std::vector<std::string> load_plugins;

View File

@@ -158,6 +158,7 @@ public:
uint32_t m_metrics_flags;
bool m_metrics_convert_memory_to_mb;
bool m_metrics_include_empty_values;
bool m_metrics_prometheus_enabled;
std::vector<plugin_config> m_plugins;
// Falco engine

View File

@@ -27,6 +27,7 @@ falco_webserver::~falco_webserver()
void falco_webserver::start(
const std::shared_ptr<sinsp>& inspector,
const std::vector<libs::metrics::libs_metrics_collector>& metrics_collectors,
uint32_t threadiness,
uint32_t listen_port,
std::string& listen_address,
@@ -68,6 +69,28 @@ void falco_webserver::start(
res.set_content(versions_json_str, "application/json");
});
if (!metrics_collectors.empty())
{
libs::metrics::prometheus_metrics_converter prometheus_metrics_converter;
m_server->Get("/metrics",
[metrics_collectors, prometheus_metrics_converter](const httplib::Request &, httplib::Response &res) {
std::string prometheus_text;
for (auto metrics_collector: metrics_collectors) {
metrics_collector.snapshot();
auto metrics_snapshot = metrics_collector.get_metrics();
for (auto& metric: metrics_snapshot)
{
prometheus_metrics_converter.convert_metric_to_unit_convention(metric);
prometheus_text += prometheus_metrics_converter.convert_metric_to_text_prometheus(metric, "namespace", "falco") + "\n";
}
}
res.set_content(prometheus_text, "text/plain; version=0.0.4");
});
}
// run server in a separate thread
if (!m_server->is_valid())
{
@@ -118,10 +141,7 @@ void falco_webserver::stop()
{
m_server_thread.join();
}
if (m_server != nullptr)
{
m_server = nullptr;
}
m_server = nullptr;
m_running = false;
}
}

View File

@@ -36,6 +36,7 @@ public:
falco_webserver& operator = (const falco_webserver&) = delete;
virtual void start(
const std::shared_ptr<sinsp>& inspector,
const std::vector<libs::metrics::libs_metrics_collector>& metrics_collectors,
uint32_t threadiness,
uint32_t listen_port,
std::string& list_address,