Skip to content

Commit

Permalink
ads: support envoy filter local ratelimit.
Browse files Browse the repository at this point in the history
Signed-off-by: yuan <[email protected]>
  • Loading branch information
yuanqijing committed Sep 19, 2024
1 parent 53caaa8 commit 917ece0
Show file tree
Hide file tree
Showing 13 changed files with 996 additions and 25 deletions.
57 changes: 57 additions & 0 deletions api/filter/ratelimit.proto
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
syntax = "proto3";

package filter;
option go_package = "kmesh.net/kmesh/api/filter;filter";

/*
TokenBucket defines parameters for a token bucket rate limiter.
https://www.envoyproxy.io/docs/envoy/latest/api-v3/type/v3/token_bucket.proto#envoy-v3-api-msg-type-v3-tokenbucket
{
"max_tokens": ...,
"tokens_per_fill": {...},
"fill_interval": {...}
}
*/
message TokenBucket {
// The maximum number of tokens in the bucket.
int64 max_tokens = 1;

// The number of tokens added to the bucket during each fill interval.
int64 tokens_per_fill = 2;

// The interval at which the bucket is refilled in nanoseconds.
int64 fill_interval = 3;
}


/*
LocalRateLimit defines parameters for local rate limiting.
https://www.envoyproxy.io/docs/envoy/latest/api-v3/extensions/filters/http/local_ratelimit/v3/local_rate_limit.proto#envoy-v3-api-msg-extensions-filters-http-local-ratelimit-v3-localratelimit
{
"stat_prefix": ...,
"status": {...},
"token_bucket": {...},
"filter_enabled": {...},
"filter_enforced": {...},
"request_headers_to_add_when_not_enforced": [],
"response_headers_to_add": [],
"descriptors": [],
"stage": ...,
"local_rate_limit_per_downstream_connection": ...,
"local_cluster_rate_limit": {...},
"enable_x_ratelimit_headers": ...,
"vh_rate_limits": ...,
"always_consume_default_token_bucket": {...},
"rate_limited_as_resource_exhausted": ...
}
*/
message LocalRateLimit {
reserved 1 to 2;

// The token bucket configuration for the rate limiter.
TokenBucket token_bucket = 3;

// Reserved field numbers for future use
reserved 4 to 15;
}

2 changes: 2 additions & 0 deletions api/listener/listener_components.proto
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,14 @@ option go_package = "kmesh.net/kmesh/api/listener;listener";
import "api/core/address.proto";
import "api/filter/tcp_proxy.proto";
import "api/filter/http_connection_manager.proto";
import "api/filter/ratelimit.proto";

message Filter {
string name = 1;
oneof config_type {
filter.TcpProxy tcp_proxy = 2;
filter.HttpConnectionManager http_connection_manager = 3;
filter.LocalRateLimit local_rate_limit = 4;
}
}

Expand Down
201 changes: 201 additions & 0 deletions api/v2-c/filter/ratelimit.pb-c.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,201 @@
/* Generated by the protocol buffer compiler. DO NOT EDIT! */
/* Generated from: api/filter/ratelimit.proto */

/* Do not generate deprecated warnings for self */
#ifndef PROTOBUF_C__NO_DEPRECATED
#define PROTOBUF_C__NO_DEPRECATED
#endif

#include "filter/ratelimit.pb-c.h"
void filter__token_bucket__init
(Filter__TokenBucket *message)
{
static const Filter__TokenBucket init_value = FILTER__TOKEN_BUCKET__INIT;
*message = init_value;
}
size_t filter__token_bucket__get_packed_size
(const Filter__TokenBucket *message)
{
assert(message->base.descriptor == &filter__token_bucket__descriptor);
return protobuf_c_message_get_packed_size ((const ProtobufCMessage*)(message));
}
size_t filter__token_bucket__pack
(const Filter__TokenBucket *message,
uint8_t *out)
{
assert(message->base.descriptor == &filter__token_bucket__descriptor);
return protobuf_c_message_pack ((const ProtobufCMessage*)message, out);
}
size_t filter__token_bucket__pack_to_buffer
(const Filter__TokenBucket *message,
ProtobufCBuffer *buffer)
{
assert(message->base.descriptor == &filter__token_bucket__descriptor);
return protobuf_c_message_pack_to_buffer ((const ProtobufCMessage*)message, buffer);
}
Filter__TokenBucket *
filter__token_bucket__unpack
(ProtobufCAllocator *allocator,
size_t len,
const uint8_t *data)
{
return (Filter__TokenBucket *)
protobuf_c_message_unpack (&filter__token_bucket__descriptor,
allocator, len, data);
}
void filter__token_bucket__free_unpacked
(Filter__TokenBucket *message,
ProtobufCAllocator *allocator)
{
if(!message)
return;
assert(message->base.descriptor == &filter__token_bucket__descriptor);
protobuf_c_message_free_unpacked ((ProtobufCMessage*)message, allocator);
}
void filter__local_rate_limit__init
(Filter__LocalRateLimit *message)
{
static const Filter__LocalRateLimit init_value = FILTER__LOCAL_RATE_LIMIT__INIT;
*message = init_value;
}
size_t filter__local_rate_limit__get_packed_size
(const Filter__LocalRateLimit *message)
{
assert(message->base.descriptor == &filter__local_rate_limit__descriptor);
return protobuf_c_message_get_packed_size ((const ProtobufCMessage*)(message));
}
size_t filter__local_rate_limit__pack
(const Filter__LocalRateLimit *message,
uint8_t *out)
{
assert(message->base.descriptor == &filter__local_rate_limit__descriptor);
return protobuf_c_message_pack ((const ProtobufCMessage*)message, out);
}
size_t filter__local_rate_limit__pack_to_buffer
(const Filter__LocalRateLimit *message,
ProtobufCBuffer *buffer)
{
assert(message->base.descriptor == &filter__local_rate_limit__descriptor);
return protobuf_c_message_pack_to_buffer ((const ProtobufCMessage*)message, buffer);
}
Filter__LocalRateLimit *
filter__local_rate_limit__unpack
(ProtobufCAllocator *allocator,
size_t len,
const uint8_t *data)
{
return (Filter__LocalRateLimit *)
protobuf_c_message_unpack (&filter__local_rate_limit__descriptor,
allocator, len, data);
}
void filter__local_rate_limit__free_unpacked
(Filter__LocalRateLimit *message,
ProtobufCAllocator *allocator)
{
if(!message)
return;
assert(message->base.descriptor == &filter__local_rate_limit__descriptor);
protobuf_c_message_free_unpacked ((ProtobufCMessage*)message, allocator);
}
static const ProtobufCFieldDescriptor filter__token_bucket__field_descriptors[3] =
{
{
"max_tokens",
1,
PROTOBUF_C_LABEL_NONE,
PROTOBUF_C_TYPE_INT64,
0, /* quantifier_offset */
offsetof(Filter__TokenBucket, max_tokens),
NULL,
NULL,
0, /* flags */
0,NULL,NULL /* reserved1,reserved2, etc */
},
{
"tokens_per_fill",
2,
PROTOBUF_C_LABEL_NONE,
PROTOBUF_C_TYPE_INT64,
0, /* quantifier_offset */
offsetof(Filter__TokenBucket, tokens_per_fill),
NULL,
NULL,
0, /* flags */
0,NULL,NULL /* reserved1,reserved2, etc */
},
{
"fill_interval",
3,
PROTOBUF_C_LABEL_NONE,
PROTOBUF_C_TYPE_INT64,
0, /* quantifier_offset */
offsetof(Filter__TokenBucket, fill_interval),
NULL,
NULL,
0, /* flags */
0,NULL,NULL /* reserved1,reserved2, etc */
},
};
static const unsigned filter__token_bucket__field_indices_by_name[] = {
2, /* field[2] = fill_interval */
0, /* field[0] = max_tokens */
1, /* field[1] = tokens_per_fill */
};
static const ProtobufCIntRange filter__token_bucket__number_ranges[1 + 1] =
{
{ 1, 0 },
{ 0, 3 }
};
const ProtobufCMessageDescriptor filter__token_bucket__descriptor =
{
PROTOBUF_C__MESSAGE_DESCRIPTOR_MAGIC,
"filter.TokenBucket",
"TokenBucket",
"Filter__TokenBucket",
"filter",
sizeof(Filter__TokenBucket),
3,
filter__token_bucket__field_descriptors,
filter__token_bucket__field_indices_by_name,
1, filter__token_bucket__number_ranges,
(ProtobufCMessageInit) filter__token_bucket__init,
NULL,NULL,NULL /* reserved[123] */
};
static const ProtobufCFieldDescriptor filter__local_rate_limit__field_descriptors[1] =
{
{
"token_bucket",
3,
PROTOBUF_C_LABEL_NONE,
PROTOBUF_C_TYPE_MESSAGE,
0, /* quantifier_offset */
offsetof(Filter__LocalRateLimit, token_bucket),
&filter__token_bucket__descriptor,
NULL,
0, /* flags */
0,NULL,NULL /* reserved1,reserved2, etc */
},
};
static const unsigned filter__local_rate_limit__field_indices_by_name[] = {
0, /* field[0] = token_bucket */
};
static const ProtobufCIntRange filter__local_rate_limit__number_ranges[1 + 1] =
{
{ 3, 0 },
{ 0, 1 }
};
const ProtobufCMessageDescriptor filter__local_rate_limit__descriptor =
{
PROTOBUF_C__MESSAGE_DESCRIPTOR_MAGIC,
"filter.LocalRateLimit",
"LocalRateLimit",
"Filter__LocalRateLimit",
"filter",
sizeof(Filter__LocalRateLimit),
1,
filter__local_rate_limit__field_descriptors,
filter__local_rate_limit__field_indices_by_name,
1, filter__local_rate_limit__number_ranges,
(ProtobufCMessageInit) filter__local_rate_limit__init,
NULL,NULL,NULL /* reserved[123] */
};
Loading

0 comments on commit 917ece0

Please sign in to comment.