mirror of
https://github.com/falcosecurity/falco.git
synced 2025-09-25 20:30:47 +00:00
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:
@@ -1003,6 +1003,7 @@ metrics:
|
|||||||
libbpf_stats_enabled: true
|
libbpf_stats_enabled: true
|
||||||
convert_memory_to_mb: true
|
convert_memory_to_mb: true
|
||||||
include_empty_values: false
|
include_empty_values: false
|
||||||
|
prometheus_enabled: false
|
||||||
|
|
||||||
#######################################
|
#######################################
|
||||||
# Falco performance tuning (advanced) #
|
# Falco performance tuning (advanced) #
|
||||||
|
@@ -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)
|
+ std::to_string(s.config->m_webserver_listen_port)
|
||||||
+ ssl_option + "\n");
|
+ 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.webserver.start(
|
||||||
s.offline_inspector,
|
s.offline_inspector,
|
||||||
|
metrics_collectors,
|
||||||
s.config->m_webserver_threadiness,
|
s.config->m_webserver_threadiness,
|
||||||
s.config->m_webserver_listen_port,
|
s.config->m_webserver_listen_port,
|
||||||
s.config->m_webserver_listen_address,
|
s.config->m_webserver_listen_address,
|
||||||
|
@@ -79,7 +79,8 @@ falco_configuration::falco_configuration():
|
|||||||
m_metrics_output_file(""),
|
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_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_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_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_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;
|
std::vector<std::string> load_plugins;
|
||||||
|
|
||||||
|
@@ -158,6 +158,7 @@ public:
|
|||||||
uint32_t m_metrics_flags;
|
uint32_t m_metrics_flags;
|
||||||
bool m_metrics_convert_memory_to_mb;
|
bool m_metrics_convert_memory_to_mb;
|
||||||
bool m_metrics_include_empty_values;
|
bool m_metrics_include_empty_values;
|
||||||
|
bool m_metrics_prometheus_enabled;
|
||||||
std::vector<plugin_config> m_plugins;
|
std::vector<plugin_config> m_plugins;
|
||||||
|
|
||||||
// Falco engine
|
// Falco engine
|
||||||
|
@@ -27,6 +27,7 @@ falco_webserver::~falco_webserver()
|
|||||||
|
|
||||||
void falco_webserver::start(
|
void falco_webserver::start(
|
||||||
const std::shared_ptr<sinsp>& inspector,
|
const std::shared_ptr<sinsp>& inspector,
|
||||||
|
const std::vector<libs::metrics::libs_metrics_collector>& metrics_collectors,
|
||||||
uint32_t threadiness,
|
uint32_t threadiness,
|
||||||
uint32_t listen_port,
|
uint32_t listen_port,
|
||||||
std::string& listen_address,
|
std::string& listen_address,
|
||||||
@@ -68,6 +69,28 @@ void falco_webserver::start(
|
|||||||
res.set_content(versions_json_str, "application/json");
|
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
|
// run server in a separate thread
|
||||||
if (!m_server->is_valid())
|
if (!m_server->is_valid())
|
||||||
{
|
{
|
||||||
@@ -118,10 +141,7 @@ void falco_webserver::stop()
|
|||||||
{
|
{
|
||||||
m_server_thread.join();
|
m_server_thread.join();
|
||||||
}
|
}
|
||||||
if (m_server != nullptr)
|
m_server = nullptr;
|
||||||
{
|
|
||||||
m_server = nullptr;
|
|
||||||
}
|
|
||||||
m_running = false;
|
m_running = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -36,6 +36,7 @@ public:
|
|||||||
falco_webserver& operator = (const falco_webserver&) = delete;
|
falco_webserver& operator = (const falco_webserver&) = delete;
|
||||||
virtual void start(
|
virtual void start(
|
||||||
const std::shared_ptr<sinsp>& inspector,
|
const std::shared_ptr<sinsp>& inspector,
|
||||||
|
const std::vector<libs::metrics::libs_metrics_collector>& metrics_collectors,
|
||||||
uint32_t threadiness,
|
uint32_t threadiness,
|
||||||
uint32_t listen_port,
|
uint32_t listen_port,
|
||||||
std::string& list_address,
|
std::string& list_address,
|
||||||
|
Reference in New Issue
Block a user