Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
121 commits
Select commit Hold shift + click to select a range
df3db4b
ZooKeeper proxy filter
Feb 2, 2019
d2f50eb
Fix format issues
Feb 18, 2019
5a3bfe1
Fix docs
Feb 18, 2019
e16f507
Add missing words to dictionary.
Feb 18, 2019
ea2c5d6
Move var declaration closer to usage.
Feb 18, 2019
71f7686
Tentatively adding @snowp as sponsor/co-maintainer :-)
Feb 19, 2019
ad8f315
Make DecoderImpl's constructor explicit
Feb 20, 2019
cfa9f3f
Use peekInt<>() to extract bool
Feb 20, 2019
2698f55
Use copyOut() instead of linearize
Feb 20, 2019
a17402a
Simplify test helpers
Feb 20, 2019
f5a2877
Drop my copy of enumToInt()
Feb 20, 2019
8482d4c
Merge remote-tracking branch 'upstream/master' into add-zookeeper-filter
Feb 22, 2019
6746876
Fix order of version history items
Feb 22, 2019
7911d6c
Consistently name stats that are requests
Feb 23, 2019
dce2ca7
Fix doc
Feb 23, 2019
315e656
Use enum class for XID codes
Feb 23, 2019
0e2c698
Expand enumToInt() to support signed ints.
Feb 23, 2019
d839235
Add enumToIntSigned()
Feb 23, 2019
98e6896
Move Buffer::OwnedImpl instead of returning pointers
Feb 23, 2019
c371cfb
Emit decoderError() calls when len checks fail
Feb 23, 2019
73962e4
Parse delete & exists requests
Feb 23, 2019
e19d918
Parse getacl & setacl requests
Feb 23, 2019
30546ce
Parse sync requests
Feb 23, 2019
b454671
Parse check requests
Feb 23, 2019
e2fa765
Parse multi requests
Feb 24, 2019
a21102f
Parse reconfig requests
Feb 24, 2019
4635b35
Parse setWatches requests
Feb 24, 2019
bae0ca2
Parse Close requests
Feb 24, 2019
24b781c
Fix format
Feb 24, 2019
4d3ca2b
Set the corresponding metadata for each request
Feb 25, 2019
6ba1f21
Skip obvious comments
Feb 27, 2019
e39825d
Few stylistic items
Feb 27, 2019
ac3b3d1
Describe regular vs readonly connect requests
Feb 27, 2019
1d66596
Merge branch 'master' into add-zookeeper-filter
Mar 2, 2019
83ff78c
Add comment noting that ZK uses network ordering
Mar 2, 2019
2192a9d
Centralize error handling when parsing
Mar 3, 2019
2db08fe
Improve coverage
Mar 5, 2019
e315233
onWrite() should be used for responses
Mar 5, 2019
edf37a8
Fix mem leak
Mar 5, 2019
5cac7fa
Fix decoding error with Pings
Mar 5, 2019
020d46a
Address nit
Mar 5, 2019
c241f25
Don't use exceptions to check if a bool is avail
Mar 5, 2019
6cc7279
Make check length a helper and not a macro
Mar 5, 2019
701cce0
Avoid potential infinite loops
Mar 5, 2019
354bd32
Split empty string vs not big enough buffer
Mar 5, 2019
4eb510f
Use return values instead of out param references
Mar 5, 2019
4c8204d
Track request bytes
Mar 6, 2019
44a179f
Naming & link for ZooKeeper
Mar 7, 2019
c9cadb7
Mention supported ZK version & opcodes handling
Mar 7, 2019
70827ce
Handle unknown opcodes
Mar 7, 2019
028d7e9
Add support for {check, remove}watches
Mar 7, 2019
fcf42bb
Kick CI
Mar 7, 2019
5d3f2f9
Merge remote-tracking branch 'upstream/master' into add-zookeeper-filter
Mar 9, 2019
90c58da
Document the different between XIDs <=0 and > 0.
Mar 9, 2019
3dc1f72
Fix spelling
Mar 10, 2019
2b67b7a
Use const for skipping offsets
Mar 10, 2019
1854c33
Skip reading credential, since we don't use it.
Mar 10, 2019
70e4852
More spelling
Mar 10, 2019
bdad785
Add xid to the dictionary
Mar 10, 2019
fcc62ef
Kick CI
Mar 11, 2019
3180d02
Make local vars const when possible
Mar 11, 2019
0575502
Use consts to explain how the min length is derived
Mar 11, 2019
93caa9b
Fix bool that shouldn't be const
Mar 11, 2019
d55144b
Rename checkLength to ensureMinLength
Mar 11, 2019
dfd64fe
Use consts to express what the min lengths mean
Mar 11, 2019
0d11026
Fix format
Mar 11, 2019
6ce5752
Avoid const for values in declarations
Mar 11, 2019
b9490e3
Simplify peekBool()
Mar 11, 2019
9389ef1
More context when throwing exception
Mar 11, 2019
9a744d7
Update tests
Mar 11, 2019
cbc618a
Enforce max bytes check
Mar 11, 2019
980207e
Fix signature
Mar 11, 2019
df93faa
Cast len to uint
Mar 11, 2019
0ba7695
Fix test
Mar 11, 2019
64fe5c4
Merge remote-tracking branch 'upstream/master' into add-zookeeper-filter
Mar 14, 2019
ceecefb
Use google.protobuf.UInt32Value
Mar 14, 2019
804b83c
Enumerate unsupported opcodes.
Mar 14, 2019
55293f2
Add missing import for UInt32Value
Mar 14, 2019
6c71415
Use PROTOBUF_GET_WRAPPED_OR_DEFAULT
Mar 14, 2019
c121cee
Use constexpr
Mar 14, 2019
6c8c977
Use helper to skip individual strings
Mar 14, 2019
e3ee7f2
Remove const from values in decls
Mar 14, 2019
d845a5a
Clarify that helpers aren't for IO
Mar 14, 2019
a115c66
Fix spelling
Mar 14, 2019
df66703
Merge remote-tracking branch 'upstream/master' into add-zookeeper-filter
Mar 16, 2019
f001664
Support all of create()'s flags
Mar 17, 2019
36d1c39
Fix build
Mar 17, 2019
7ef7405
Move createFlagsToString out of header
Mar 17, 2019
be08bfa
Fix name
Mar 17, 2019
4695977
Fix more typos
Mar 17, 2019
e301b74
Handle unknown flags.
Mar 17, 2019
eb2cebd
Handle container & TTL znode creation
Mar 17, 2019
2a0374d
Fix
Mar 17, 2019
2f1b994
Fix signature
Mar 17, 2019
8b705e6
Fix type
Mar 17, 2019
3043ab2
Fix parseCreateRequest call
Mar 17, 2019
b9d4883
Reduce calls to enumToInt()
Mar 18, 2019
ff5284e
Handle enum value that wasn't being handled
Mar 18, 2019
f91a5db
Improve comment on handling XIDs.
Mar 18, 2019
823ccc5
Guard against longer than length messages
Mar 18, 2019
a2ae4ec
Properly namespace method
Mar 18, 2019
aceaca4
Move missing header to the right place
Mar 18, 2019
f21580f
Relax erstwhile const methods
Mar 18, 2019
9284fc1
Fix syntax
Mar 18, 2019
514e92a
Fix test
Mar 18, 2019
a1a28bc
Support getEphemerals & getAllChildrenNumber
Mar 18, 2019
4cd3f6e
Simplify int to enum conversion
Mar 18, 2019
e43cd1e
Encapsulate skip within the BufferHelper
Mar 19, 2019
fe401f4
Explain how offset and cursor_ are different.
Mar 19, 2019
6e0f226
Test all possible create flags
Mar 20, 2019
a80279d
Improve coverage fo ZooKeeperFilter::onCreateRequest
Mar 20, 2019
67227d7
Add test for empty string as path
Mar 20, 2019
2533893
Fix comment
Mar 20, 2019
f18cbfe
DRY things up a bit
Mar 20, 2019
58ce244
Merge remote-tracking branch 'upstream/master' into add-zookeeper-filter
Mar 20, 2019
0a1e14f
Tidy up ZooKeeperFilter::doDecode
Mar 20, 2019
d689794
Add missing coverage for BufferHelper::peekString
Mar 20, 2019
bda8df1
Fix
Mar 20, 2019
cb117f3
Merge remote-tracking branch 'upstream/master' into add-zookeeper-filter
Mar 22, 2019
3f3f466
More constness
Mar 22, 2019
3ec7cb4
Rename enumToIntSigned -> enumToSignedInt
Mar 25, 2019
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions CODEOWNERS
Original file line number Diff line number Diff line change
Expand Up @@ -22,3 +22,5 @@
/*/extensions/filters/network/mysql_proxy @rshriram @venilnoronha @mattklein123
# quic extension
/*/extensions/quic_listeners/ @alyssawilk @danzh2010 @mattklein123 @mpwarres @wu-bin
# zookeeper_proxy extension
/*/extensions/filters/network/zookeeper_proxy @rgs1 @snowp
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
load("//bazel:api_build_system.bzl", "api_proto_library_internal")

licenses(["notice"]) # Apache 2

api_proto_library_internal(
name = "zookeeper_proxy",
srcs = ["zookeeper_proxy.proto"],
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
syntax = "proto3";

package envoy.config.filter.network.zookeeper_proxy.v1alpha1;

option java_outer_classname = "ZookeeperProxyProto";
option java_multiple_files = true;
option java_package = "io.envoyproxy.envoy.config.filter.network.zookeeper_proxy.v1alpha1";
option go_package = "v1alpha1";

import "validate/validate.proto";
import "google/protobuf/wrappers.proto";

// [#protodoc-title: ZooKeeper proxy]
// ZooKeeper Proxy :ref:`configuration overview <config_network_filters_zookeeper_proxy>`.
message ZooKeeperProxy {
// The human readable prefix to use when emitting :ref:`statistics
// <config_network_filters_zookeeper_proxy_stats>`.
string stat_prefix = 1 [(validate.rules).string.min_bytes = 1];

// [#not-implemented-hide:] The optional path to use for writing ZooKeeper access logs.
// If the access log field is empty, access logs will not be written.
string access_log = 2;

// Messages — requests, responses and events — that are bigger than this value will
// be ignored. If it is not set, the default value is 1Mb.
//
// The value here should match the jute.maxbuffer property in your cluster configuration:
//
// https://zookeeper.apache.org/doc/r3.4.10/zookeeperAdmin.html#Unsafe+Options
//
// if that is set. If it isn't, ZooKeeper's default is also 1Mb.
google.protobuf.UInt32Value max_packet_bytes = 3;
}
Original file line number Diff line number Diff line change
Expand Up @@ -21,3 +21,4 @@ filters.
tcp_proxy_filter
thrift_proxy_filter
sni_cluster_filter
zookeeper_proxy_filter
92 changes: 92 additions & 0 deletions docs/root/configuration/network_filters/zookeeper_proxy_filter.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
.. _config_network_filters_zookeeper_proxy:

ZooKeeper proxy
===============

The ZooKeeper proxy filter decodes the client protocol for
`Apache ZooKeeper <https://zookeeper.apache.org/>`_. It decodes the requests,
responses and events in the payload. Most opcodes known in
`ZooKeeper 3.5 <https://github.com/apache/zookeeper/blob/master/zookeeper-server/src/main/java/org/apache/zookeeper/ZooDefs.java>`_
are supported. The unsupported ones are related to SASL authentication.

.. attention::

The zookeeper_proxy filter is experimental and is currently under active
development. Capabilities will be expanded over time and the
configuration structures are likely to change.

.. _config_network_filters_zookeeper_proxy_config:

Configuration
-------------

The ZooKeeper proxy filter should be chained with the TCP proxy filter as shown
in the configuration snippet below:

.. code-block:: yaml

filter_chains:
- filters:
- name: envoy.filters.network.zookeeper_proxy
config:
stat_prefix: zookeeper
- name: envoy.tcp_proxy
config:
stat_prefix: tcp
cluster: ...


.. _config_network_filters_zookeeper_proxy_stats:

Statistics
----------

Every configured ZooKeeper proxy filter has statistics rooted at *zookeeper.<stat_prefix>.* with the
following statistics:

.. csv-table::
:header: Name, Type, Description
:widths: 1, 1, 2

decoder_error, Counter, Number of times a message wasn't decoded
request_bytes, Counter, Number of bytes in decoded request messages
connect_rq, Counter, Number of regular connect (non-readonly) requests
connect_readonly_rq, Counter, Number of connect requests with the readonly flag set
ping_rq, Counter, Number of ping requests
auth.<type>_rq, Counter, Number of auth requests for a given type
getdata_rq, Counter, Number of getdata requests
create_rq, Counter, Number of create requests
create2_rq, Counter, Number of create2 requests
setdata_rq, Counter, Number of setdata requests
getchildren_rq, Counter, Number of getchildren requests
getchildren2_rq, Counter, Number of getchildren2 requests
remove_rq, Counter, Number of delete requests
exists_rq, Counter, Number of stat requests
getacl_rq, Counter, Number of getacl requests
setacl_rq, Counter, Number of setacl requests
sync_rq, Counter, Number of sync requests
multi_rq, Counter, Number of multi transaction requests
reconfig_rq, Counter, Number of reconfig requests
close_rq, Counter, Number of close requests
setwatches_rq, Counter, Number of setwatches requests
checkwatches_rq, Counter, Number of checkwatches requests
removewatches_rq, Counter, Number of removewatches requests
check_rq, Counter, Number of check requests

.. _config_network_filters_zookeeper_proxy_dynamic_metadata:

Dynamic Metadata
----------------

The ZooKeeper filter emits the following dynamic metadata for each message parsed:

.. csv-table::
:header: Name, Type, Description
:widths: 1, 1, 2

<path>, string, "The path associated with the request, response or event"
<opname>, string, "The opname for the request, response or event"
<create_type>, string, "The string representation of the flags applied to the znode"
<bytes>, string, "The size of the request message in bytes"
<watch>, string, "True if a watch is being set, false otherwise"
<version>, string, "The version parameter, if any, given with the request"
1 change: 1 addition & 0 deletions docs/root/configuration/well_known_dynamic_metadata.rst
Original file line number Diff line number Diff line change
Expand Up @@ -17,3 +17,4 @@ The following Envoy filters emit dynamic metadata that other filters can leverag
* :ref:`MySQL Proxy Filter <config_network_filters_mysql_proxy_dynamic_metadata>`
* :ref:`Role Based Access Control (RBAC) Filter <config_http_filters_rbac_dynamic_metadata>`
* :ref:`Role Based Access Control (RBAC) Network Filter <config_network_filters_rbac_dynamic_metadata>`
* :ref:`ZooKeeper Proxy Filter <config_network_filters_zookeeper_proxy_dynamic_metadata>`
2 changes: 2 additions & 0 deletions docs/root/intro/version_history.rst
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,8 @@ Version history
* upstream: add cluster factory to allow creating and registering :ref:`custom cluster type<arch_overview_service_discovery_types_custom>`.
* tracing: added :ref:`verbose <envoy_api_field_config.filter.network.http_connection_manager.v2.HttpConnectionManager.tracing>` to support logging annotations on spans.
* upstream: added support for host weighting and :ref:`locality weighting <arch_overview_load_balancing_locality_weighted_lb>` in the :ref:`ring hash load balancer <arch_overview_load_balancing_types_ring_hash>`, and added a :ref:`maximum_ring_size<envoy_api_field_Cluster.RingHashLbConfig.maximum_ring_size>` config parameter to strictly bound the ring size.
* zookeeper: added a ZooKeeper proxy filter that parses ZooKeeper messages (requests/responses/events).
Refer to ::ref:`ZooKeeper proxy<config_network_filters_zookeeper_proxy>` for more details.
* upstream: added configuration option to select any host when the fallback policy fails.

1.9.0 (Dec 20, 2018)
Expand Down
7 changes: 6 additions & 1 deletion source/common/common/enum_to_int.h
Original file line number Diff line number Diff line change
Expand Up @@ -6,5 +6,10 @@ namespace Envoy {
/**
* Convert an int based enum to an int.
*/
template <typename T> uint32_t enumToInt(T val) { return static_cast<uint32_t>(val); }
template <typename T> constexpr uint32_t enumToInt(T val) { return static_cast<uint32_t>(val); }

/**
* Convert an int based enum to a signed int.
*/
template <typename T> constexpr int32_t enumToSignedInt(T val) { return static_cast<int32_t>(val); }
} // namespace Envoy
2 changes: 2 additions & 0 deletions source/extensions/extensions_build_config.bzl
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,7 @@ EXTENSIONS = {
"envoy.filters.network.tcp_proxy": "//source/extensions/filters/network/tcp_proxy:config",
"envoy.filters.network.thrift_proxy": "//source/extensions/filters/network/thrift_proxy:config",
"envoy.filters.network.sni_cluster": "//source/extensions/filters/network/sni_cluster:config",
"envoy.filters.network.zookeeper_proxy": "//source/extensions/filters/network/zookeeper_proxy:config",

#
# Resource monitors
Expand Down Expand Up @@ -194,6 +195,7 @@ WINDOWS_EXTENSIONS = {
"envoy.filters.network.tcp_proxy": "//source/extensions/filters/network/tcp_proxy:config",
#"envoy.filters.network.thrift_proxy": "//source/extensions/filters/network/thrift_proxy:config",
#"envoy.filters.network.sni_cluster": "//source/extensions/filters/network/sni_cluster:config",
#"envoy.filters.network.zookeeper_proxy": "//source/extensions/filters/network/zookeeper_proxy:config",

#
# Stat sinks
Expand Down
2 changes: 2 additions & 0 deletions source/extensions/filters/network/well_known_names.h
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,8 @@ class NetworkFilterNameValues {
const std::string Rbac = "envoy.filters.network.rbac";
// SNI Cluster filter
const std::string SniCluster = "envoy.filters.network.sni_cluster";
// ZooKeeper proxy filter
const std::string ZooKeeperProxy = "envoy.filters.network.zookeeper_proxy";

// Converts names from v1 to v2
const Config::V1Converter v1_converter_;
Expand Down
47 changes: 47 additions & 0 deletions source/extensions/filters/network/zookeeper_proxy/BUILD
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
licenses(["notice"]) # Apache 2

# ZooKeeper proxy L7 network filter.
# Public docs: docs/root/configuration/network_filters/zookeeper_proxy_filter.rst

load(
"//bazel:envoy_build_system.bzl",
"envoy_cc_library",
"envoy_package",
)

envoy_package()

envoy_cc_library(
name = "proxy_lib",
srcs = [
"zookeeper_decoder.cc",
"zookeeper_filter.cc",
"zookeeper_utils.cc",
],
hdrs = [
"zookeeper_decoder.h",
"zookeeper_filter.h",
"zookeeper_utils.h",
],
deps = [
"//include/envoy/network:filter_interface",
"//include/envoy/server:filter_config_interface",
"//include/envoy/stats:stats_interface",
"//include/envoy/stats:stats_macros",
"//source/common/config:filter_json_lib",
"//source/common/network:filter_lib",
"//source/extensions/filters/network:well_known_names",
],
)

envoy_cc_library(
name = "config",
srcs = ["zookeeper_config.cc"],
hdrs = ["zookeeper_config.h"],
deps = [
":proxy_lib",
"//source/extensions/filters/network:well_known_names",
"//source/extensions/filters/network/common:factory_base_lib",
"@envoy_api//envoy/config/filter/network/zookeeper_proxy/v1alpha1:zookeeper_proxy_cc",
],
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
#include "extensions/filters/network/zookeeper_proxy/zookeeper_config.h"

#include <string>

#include "envoy/config/filter/network/zookeeper_proxy/v1alpha1/zookeeper_proxy.pb.validate.h"
#include "envoy/registry/registry.h"
#include "envoy/server/filter_config.h"

#include "common/common/logger.h"

#include "extensions/filters/network/zookeeper_proxy/zookeeper_filter.h"

namespace Envoy {
namespace Extensions {
namespace NetworkFilters {
namespace ZooKeeperProxy {

/**
* Config registration for the ZooKeeper proxy filter. @see NamedNetworkFilterConfigFactory.
*/
Network::FilterFactoryCb
NetworkFilters::ZooKeeperProxy::ZooKeeperConfigFactory::createFilterFactoryFromProtoTyped(
const envoy::config::filter::network::zookeeper_proxy::v1alpha1::ZooKeeperProxy& proto_config,
Server::Configuration::FactoryContext& context) {

ASSERT(!proto_config.stat_prefix().empty());

const std::string stat_prefix = fmt::format("{}.zookeeper.", proto_config.stat_prefix());
const uint32_t max_packet_bytes =
PROTOBUF_GET_WRAPPED_OR_DEFAULT(proto_config, max_packet_bytes, 1024 * 1024);

ZooKeeperFilterConfigSharedPtr filter_config(
std::make_shared<ZooKeeperFilterConfig>(stat_prefix, max_packet_bytes, context.scope()));
return [filter_config](Network::FilterManager& filter_manager) -> void {
filter_manager.addFilter(std::make_shared<ZooKeeperFilter>(filter_config));
};
}

/**
* Static registration for the ZooKeeper proxy filter. @see RegisterFactory.
*/
REGISTER_FACTORY(ZooKeeperConfigFactory, Server::Configuration::NamedNetworkFilterConfigFactory);

} // namespace ZooKeeperProxy
} // namespace NetworkFilters
} // namespace Extensions
} // namespace Envoy
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
#pragma once

#include "envoy/config/filter/network/zookeeper_proxy/v1alpha1/zookeeper_proxy.pb.h"
#include "envoy/config/filter/network/zookeeper_proxy/v1alpha1/zookeeper_proxy.pb.validate.h"

#include "extensions/filters/network/common/factory_base.h"
#include "extensions/filters/network/well_known_names.h"
#include "extensions/filters/network/zookeeper_proxy/zookeeper_filter.h"

namespace Envoy {
namespace Extensions {
namespace NetworkFilters {
namespace ZooKeeperProxy {

/**
* Config registration for the ZooKeeper proxy filter.
*/
class ZooKeeperConfigFactory
: public Common::FactoryBase<
envoy::config::filter::network::zookeeper_proxy::v1alpha1::ZooKeeperProxy> {
public:
ZooKeeperConfigFactory() : FactoryBase(NetworkFilterNames::get().ZooKeeperProxy) {}

private:
Network::FilterFactoryCb createFilterFactoryFromProtoTyped(
const envoy::config::filter::network::zookeeper_proxy::v1alpha1::ZooKeeperProxy& proto_config,
Server::Configuration::FactoryContext& context) override;
};

} // namespace ZooKeeperProxy
} // namespace NetworkFilters
} // namespace Extensions
} // namespace Envoy
Loading