Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

udp_proxy: support proxy access logging #23242

Merged
merged 16 commits into from
Nov 1, 2022
Next Next commit
add proxy_access_log
Signed-off-by: giantcroc <changran.wang@intel.com>
  • Loading branch information
giantcroc committed Sep 26, 2022
commit 45eaba4b31531155c91366828a1df8b079d73312
6 changes: 4 additions & 2 deletions api/envoy/extensions/filters/udp/udp_proxy/v3/udp_proxy.proto
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ option (udpa.annotations.file_status).package_version_status = ACTIVE;
// [#extension: envoy.filters.udp_listener.udp_proxy]

// Configuration for the UDP proxy filter.
// [#next-free-field: 10]
// [#next-free-field: 11]
message UdpProxyConfig {
option (udpa.annotations.versioning).previous_message_type =
"envoy.config.filter.udp.udp_proxy.v2alpha.UdpProxyConfig";
Expand Down Expand Up @@ -106,5 +106,7 @@ message UdpProxyConfig {
bool use_per_packet_load_balancing = 7;

// Configuration for access logs emitted by the UDP proxy. Note that certain UDP specific data is emitted as :ref:`Dynamic Metadata <config_access_log_format_dynamic_metadata>`.
repeated config.accesslog.v3.AccessLog access_log = 8;
repeated config.accesslog.v3.AccessLog sess_access_log = 8;
giantcroc marked this conversation as resolved.
Show resolved Hide resolved

repeated config.accesslog.v3.AccessLog proxy_access_log = 9;
}
27 changes: 22 additions & 5 deletions source/extensions/filters/udp/udp_proxy/udp_proxy_filter.h
Original file line number Diff line number Diff line change
Expand Up @@ -90,9 +90,14 @@ class UdpProxyFilterConfig {
"is not running with the CAP_NET_ADMIN capability.");
}

access_logs_.reserve(config.access_log_size());
for (const envoy::config::accesslog::v3::AccessLog& log_config : config.access_log()) {
access_logs_.emplace_back(AccessLog::AccessLogFactory::fromProto(log_config, context));
sess_access_logs_.reserve(config.sess_access_log_size());
for (const envoy::config::accesslog::v3::AccessLog& log_config : config.sess_access_log()) {
sess_access_logs_.emplace_back(AccessLog::AccessLogFactory::fromProto(log_config, context));
}

proxy_access_logs_.reserve(config.proxy_access_log_size());
for (const envoy::config::accesslog::v3::AccessLog& log_config : config.proxy_access_log()) {
proxy_access_logs_.emplace_back(AccessLog::AccessLogFactory::fromProto(log_config, context));
}

if (!config.hash_policies().empty()) {
Expand All @@ -116,7 +121,8 @@ class UdpProxyFilterConfig {
const Network::ResolvedUdpSocketConfig& upstreamSocketConfig() const {
return upstream_socket_config_;
}
const std::vector<AccessLog::InstanceSharedPtr>& accessLogs() const { return access_logs_; }
const std::vector<AccessLog::InstanceSharedPtr>& sessionAccessLogs() const { return sess_access_logs_; }
const std::vector<AccessLog::InstanceSharedPtr>& proxyAccessLogs() const { return proxy_access_logs_; }

private:
static UdpProxyDownstreamStats generateStats(const std::string& stat_prefix,
Expand All @@ -135,7 +141,8 @@ class UdpProxyFilterConfig {
std::unique_ptr<const HashPolicyImpl> hash_policy_;
mutable UdpProxyDownstreamStats stats_;
const Network::ResolvedUdpSocketConfig upstream_socket_config_;
std::vector<AccessLog::InstanceSharedPtr> access_logs_;
std::vector<AccessLog::InstanceSharedPtr> sess_access_logs_;
std::vector<AccessLog::InstanceSharedPtr> proxy_access_logs_;
Random::RandomGenerator& random_;
};

Expand Down Expand Up @@ -376,6 +383,16 @@ class UdpProxyFilter : public Network::UdpListenerReadFilter,
nullptr, Network::SocketCreationOptions{});
}

/**
* Struct definition for proxy access logging.
*/
struct UdpProxyStats {
uint64_t downstream_proxy_no_route_;
uint64_t downstream_proxy_total_;
uint64_t downstream_proxy_idle_timeout_;
uint64_t downstream_sess_rx_errors_;
};

// Upstream::ClusterUpdateCallbacks
void onClusterAddOrUpdate(Upstream::ThreadLocalCluster& cluster) final;
void onClusterRemoval(const std::string& cluster_name) override;
Expand Down