From 6d37f3f047463bb2f555e1bd659f477d7eba8b14 Mon Sep 17 00:00:00 2001 From: Olivier Valentin Date: Wed, 12 Jun 2024 09:57:57 +0200 Subject: [PATCH] Control normalization in network introspection API (#1693) --- collector/lib/NetworkStatusInspector.cpp | 15 +++++++++++++-- collector/lib/NetworkStatusInspector.h | 5 +++-- docs/troubleshooting.md | 8 ++++++-- 3 files changed, 22 insertions(+), 6 deletions(-) diff --git a/collector/lib/NetworkStatusInspector.cpp b/collector/lib/NetworkStatusInspector.cpp index 4b5b913b60..3b915e0903 100644 --- a/collector/lib/NetworkStatusInspector.cpp +++ b/collector/lib/NetworkStatusInspector.cpp @@ -15,6 +15,7 @@ const std::string NetworkStatusInspector::kEndpointRoute = kBaseRoute + "/endpoi const std::string NetworkStatusInspector::kConnectionRoute = kBaseRoute + "/connection"; const std::string NetworkStatusInspector::kQueryParam_container = "container"; +const std::string NetworkStatusInspector::kQueryParam_normalize = "normalize"; NetworkStatusInspector::NetworkStatusInspector(const std::shared_ptr conntracker) : conntracker_(conntracker) { } @@ -60,8 +61,18 @@ static void SerializeEndpoint(const Endpoint& ep, Json::Value& node) { node["port"] = ep.port(); } +bool NetworkStatusInspector::shouldNormalize(const QueryParams& query_params) const { + std::optional normalize_flag = GetParameter(query_params, kQueryParam_normalize); + + if (!normalize_flag) { + return true; + } + + return *normalize_flag == "true"; +} + bool NetworkStatusInspector::handleGetEndpoints(struct mg_connection* conn, const QueryParams& query_params) { - collector::AdvertisedEndpointMap endpoint_states = conntracker_->FetchEndpointState(true, false); + collector::AdvertisedEndpointMap endpoint_states = conntracker_->FetchEndpointState(shouldNormalize(query_params), false); Json::Value body_root(Json::objectValue); std::unordered_map> by_container; @@ -108,7 +119,7 @@ bool NetworkStatusInspector::handleGetEndpoints(struct mg_connection* conn, cons } bool NetworkStatusInspector::handleGetConnections(struct mg_connection* conn, const QueryParams& query_params) { - collector::ConnMap connection_states = conntracker_->FetchConnState(true, false); + collector::ConnMap connection_states = conntracker_->FetchConnState(shouldNormalize(query_params), false); Json::Value body_root(Json::objectValue); std::unordered_map> by_container; diff --git a/collector/lib/NetworkStatusInspector.h b/collector/lib/NetworkStatusInspector.h index db476b8e8f..72e6b2c978 100644 --- a/collector/lib/NetworkStatusInspector.h +++ b/collector/lib/NetworkStatusInspector.h @@ -2,8 +2,6 @@ #define COLLECTOR_NETWORKSTATUSINSPECTOR_H #include -#include -#include #include @@ -29,6 +27,9 @@ class NetworkStatusInspector : public IntrospectionEndpoint { Json::FastWriter writer_; static const std::string kQueryParam_container; // = "container" + static const std::string kQueryParam_normalize; // = "normalize" + + bool shouldNormalize(const QueryParams& queryParams) const; bool handleGetEndpoints(struct mg_connection* conn, const QueryParams& queryParams); bool handleGetConnections(struct mg_connection* conn, const QueryParams& queryParams); diff --git a/docs/troubleshooting.md b/docs/troubleshooting.md index 88f9c1f326..4c6de56ff0 100644 --- a/docs/troubleshooting.md +++ b/docs/troubleshooting.md @@ -580,10 +580,14 @@ Afterglow is not applied to the data returned by this API. It is possible to filter the items returned per container_id by providing a query parameter: `container=` -Example of connection query, limited to container with identifier `c6f030bc4b42`: +By default, connections and endpoints are normalized in the result. It is +possible to disable normalization with a query parameter: `normalize=false` + +Example of connection query, limited to container with identifier `c6f030bc4b42` +and without normalization : ``` -$ curl "http://:8080/state/network/connection?container=c6f030bc4b42" +$ curl "http://:8080/state/network/connection?container=c6f030bc4b42&normalize=false" { "c6f030bc4b42" : [