mirror of https://github.com/grpc/grpc.git
Merge pull request #15570 from AspirinSJL/load_reporting_filter
Load reporting filterpull/15852/head
commit
f69f49d64f
35 changed files with 5760 additions and 10284 deletions
@ -0,0 +1,108 @@ |
|||||||
|
/*
|
||||||
|
* |
||||||
|
* Copyright 2018 gRPC authors. |
||||||
|
* |
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||||
|
* you may not use this file except in compliance with the License. |
||||||
|
* You may obtain a copy of the License at |
||||||
|
* |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
* |
||||||
|
*/ |
||||||
|
|
||||||
|
#ifndef GRPC_CORE_EXT_FILTERS_LOAD_REPORTING_REGISTERED_OPENCENSUS_OBJECTS_H |
||||||
|
#define GRPC_CORE_EXT_FILTERS_LOAD_REPORTING_REGISTERED_OPENCENSUS_OBJECTS_H |
||||||
|
|
||||||
|
#include <grpc/support/port_platform.h> |
||||||
|
|
||||||
|
#include "opencensus/stats/stats.h" |
||||||
|
|
||||||
|
#include "src/cpp/server/load_reporter/constants.h" |
||||||
|
|
||||||
|
namespace grpc { |
||||||
|
namespace load_reporter { |
||||||
|
|
||||||
|
// Measures.
|
||||||
|
|
||||||
|
::opencensus::stats::MeasureInt64 MeasureStartCount() { |
||||||
|
static const ::opencensus::stats::MeasureInt64 start_count = |
||||||
|
::opencensus::stats::MeasureInt64::Register( |
||||||
|
kMeasureStartCount, kMeasureStartCount, kMeasureStartCount); |
||||||
|
return start_count; |
||||||
|
} |
||||||
|
|
||||||
|
::opencensus::stats::MeasureInt64 MeasureEndCount() { |
||||||
|
static const ::opencensus::stats::MeasureInt64 end_count = |
||||||
|
::opencensus::stats::MeasureInt64::Register( |
||||||
|
kMeasureEndCount, kMeasureEndCount, kMeasureEndCount); |
||||||
|
return end_count; |
||||||
|
} |
||||||
|
|
||||||
|
::opencensus::stats::MeasureInt64 MeasureEndBytesSent() { |
||||||
|
static const ::opencensus::stats::MeasureInt64 end_bytes_sent = |
||||||
|
::opencensus::stats::MeasureInt64::Register( |
||||||
|
kMeasureEndBytesSent, kMeasureEndBytesSent, kMeasureEndBytesSent); |
||||||
|
return end_bytes_sent; |
||||||
|
} |
||||||
|
|
||||||
|
::opencensus::stats::MeasureInt64 MeasureEndBytesReceived() { |
||||||
|
static const ::opencensus::stats::MeasureInt64 end_bytes_received = |
||||||
|
::opencensus::stats::MeasureInt64::Register(kMeasureEndBytesReceived, |
||||||
|
kMeasureEndBytesReceived, |
||||||
|
kMeasureEndBytesReceived); |
||||||
|
return end_bytes_received; |
||||||
|
} |
||||||
|
|
||||||
|
::opencensus::stats::MeasureInt64 MeasureEndLatencyMs() { |
||||||
|
static const ::opencensus::stats::MeasureInt64 end_latency_ms = |
||||||
|
::opencensus::stats::MeasureInt64::Register( |
||||||
|
kMeasureEndLatencyMs, kMeasureEndLatencyMs, kMeasureEndLatencyMs); |
||||||
|
return end_latency_ms; |
||||||
|
} |
||||||
|
|
||||||
|
::opencensus::stats::MeasureDouble MeasureOtherCallMetric() { |
||||||
|
static const ::opencensus::stats::MeasureDouble other_call_metric = |
||||||
|
::opencensus::stats::MeasureDouble::Register(kMeasureOtherCallMetric, |
||||||
|
kMeasureOtherCallMetric, |
||||||
|
kMeasureOtherCallMetric); |
||||||
|
return other_call_metric; |
||||||
|
} |
||||||
|
|
||||||
|
// Tags.
|
||||||
|
|
||||||
|
opencensus::stats::TagKey TagKeyToken() { |
||||||
|
static const auto token = opencensus::stats::TagKey::Register(kTagKeyToken); |
||||||
|
return token; |
||||||
|
} |
||||||
|
|
||||||
|
opencensus::stats::TagKey TagKeyHost() { |
||||||
|
static const auto token = opencensus::stats::TagKey::Register(kTagKeyHost); |
||||||
|
return token; |
||||||
|
} |
||||||
|
opencensus::stats::TagKey TagKeyUserId() { |
||||||
|
static const auto token = opencensus::stats::TagKey::Register(kTagKeyUserId); |
||||||
|
return token; |
||||||
|
} |
||||||
|
|
||||||
|
opencensus::stats::TagKey TagKeyStatus() { |
||||||
|
static const auto token = opencensus::stats::TagKey::Register(kTagKeyStatus); |
||||||
|
return token; |
||||||
|
} |
||||||
|
|
||||||
|
opencensus::stats::TagKey TagKeyMetricName() { |
||||||
|
static const auto token = |
||||||
|
opencensus::stats::TagKey::Register(kTagKeyMetricName); |
||||||
|
return token; |
||||||
|
} |
||||||
|
|
||||||
|
} // namespace load_reporter
|
||||||
|
} // namespace grpc
|
||||||
|
|
||||||
|
#endif /* GRPC_CORE_EXT_FILTERS_LOAD_REPORTING_REGISTERED_OPENCENSUS_OBJECTS_H \ |
||||||
|
*/ |
@ -1,71 +0,0 @@ |
|||||||
/*
|
|
||||||
* |
|
||||||
* Copyright 2016 gRPC authors. |
|
||||||
* |
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License"); |
|
||||||
* you may not use this file except in compliance with the License. |
|
||||||
* You may obtain a copy of the License at |
|
||||||
* |
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
* |
|
||||||
* Unless required by applicable law or agreed to in writing, software |
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS, |
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
|
||||||
* See the License for the specific language governing permissions and |
|
||||||
* limitations under the License. |
|
||||||
* |
|
||||||
*/ |
|
||||||
|
|
||||||
#include <grpc/support/port_platform.h> |
|
||||||
|
|
||||||
#include <limits.h> |
|
||||||
#include <string.h> |
|
||||||
|
|
||||||
#include <grpc/load_reporting.h> |
|
||||||
#include <grpc/support/alloc.h> |
|
||||||
#include <grpc/support/sync.h> |
|
||||||
|
|
||||||
#include "src/core/ext/filters/load_reporting/server_load_reporting_filter.h" |
|
||||||
#include "src/core/ext/filters/load_reporting/server_load_reporting_plugin.h" |
|
||||||
#include "src/core/lib/channel/channel_stack_builder.h" |
|
||||||
#include "src/core/lib/slice/slice_internal.h" |
|
||||||
#include "src/core/lib/surface/call.h" |
|
||||||
#include "src/core/lib/surface/channel_init.h" |
|
||||||
|
|
||||||
static bool is_load_reporting_enabled(const grpc_channel_args* a) { |
|
||||||
return grpc_channel_arg_get_bool( |
|
||||||
grpc_channel_args_find(a, GRPC_ARG_ENABLE_LOAD_REPORTING), false); |
|
||||||
} |
|
||||||
|
|
||||||
static bool maybe_add_server_load_reporting_filter( |
|
||||||
grpc_channel_stack_builder* builder, void* arg) { |
|
||||||
const grpc_channel_args* args = |
|
||||||
grpc_channel_stack_builder_get_channel_arguments(builder); |
|
||||||
const grpc_channel_filter* filter = |
|
||||||
static_cast<const grpc_channel_filter*>(arg); |
|
||||||
grpc_channel_stack_builder_iterator* it = |
|
||||||
grpc_channel_stack_builder_iterator_find(builder, filter->name); |
|
||||||
const bool already_has_load_reporting_filter = |
|
||||||
!grpc_channel_stack_builder_iterator_is_end(it); |
|
||||||
grpc_channel_stack_builder_iterator_destroy(it); |
|
||||||
if (is_load_reporting_enabled(args) && !already_has_load_reporting_filter) { |
|
||||||
return grpc_channel_stack_builder_prepend_filter(builder, filter, nullptr, |
|
||||||
nullptr); |
|
||||||
} |
|
||||||
return true; |
|
||||||
} |
|
||||||
|
|
||||||
grpc_arg grpc_load_reporting_enable_arg() { |
|
||||||
return grpc_channel_arg_integer_create((char*)GRPC_ARG_ENABLE_LOAD_REPORTING, |
|
||||||
1); |
|
||||||
} |
|
||||||
|
|
||||||
/* Plugin registration */ |
|
||||||
|
|
||||||
void grpc_server_load_reporting_plugin_init(void) { |
|
||||||
grpc_channel_init_register_stage(GRPC_SERVER_CHANNEL, INT_MAX, |
|
||||||
maybe_add_server_load_reporting_filter, |
|
||||||
(void*)&grpc_server_load_reporting_filter); |
|
||||||
} |
|
||||||
|
|
||||||
void grpc_server_load_reporting_plugin_shutdown() {} |
|
@ -1,61 +0,0 @@ |
|||||||
/*
|
|
||||||
* |
|
||||||
* Copyright 2016 gRPC authors. |
|
||||||
* |
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License"); |
|
||||||
* you may not use this file except in compliance with the License. |
|
||||||
* You may obtain a copy of the License at |
|
||||||
* |
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
* |
|
||||||
* Unless required by applicable law or agreed to in writing, software |
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS, |
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
|
||||||
* See the License for the specific language governing permissions and |
|
||||||
* limitations under the License. |
|
||||||
* |
|
||||||
*/ |
|
||||||
|
|
||||||
#ifndef GRPC_CORE_EXT_FILTERS_LOAD_REPORTING_SERVER_LOAD_REPORTING_PLUGIN_H |
|
||||||
#define GRPC_CORE_EXT_FILTERS_LOAD_REPORTING_SERVER_LOAD_REPORTING_PLUGIN_H |
|
||||||
|
|
||||||
#include <grpc/support/port_platform.h> |
|
||||||
|
|
||||||
#include <grpc/impl/codegen/grpc_types.h> |
|
||||||
|
|
||||||
#include "src/core/lib/channel/channel_stack.h" |
|
||||||
|
|
||||||
/** Identifiers for the invocation point of the users LR callback */ |
|
||||||
typedef enum grpc_load_reporting_source { |
|
||||||
GRPC_LR_POINT_UNKNOWN = 0, |
|
||||||
GRPC_LR_POINT_CHANNEL_CREATION, |
|
||||||
GRPC_LR_POINT_CHANNEL_DESTRUCTION, |
|
||||||
GRPC_LR_POINT_CALL_CREATION, |
|
||||||
GRPC_LR_POINT_CALL_DESTRUCTION |
|
||||||
} grpc_load_reporting_source; |
|
||||||
|
|
||||||
/** Call information to be passed to the provided LR callback. */ |
|
||||||
typedef struct grpc_load_reporting_call_data { |
|
||||||
const grpc_load_reporting_source source; /**< point of last data update. */ |
|
||||||
|
|
||||||
/** Unique identifier for the channel associated with the data */ |
|
||||||
intptr_t channel_id; |
|
||||||
|
|
||||||
/** Unique identifier for the call associated with the data. If the call
|
|
||||||
* hasn't been created yet, it'll have a value of zero. */ |
|
||||||
intptr_t call_id; |
|
||||||
|
|
||||||
/** Only valid when \a source is \a GRPC_LR_POINT_CALL_DESTRUCTION, that is,
|
|
||||||
* once the call has completed */ |
|
||||||
const grpc_call_final_info* final_info; |
|
||||||
|
|
||||||
const char* initial_md_string; /**< value string for LR's initial md key */ |
|
||||||
const char* trailing_md_string; /**< value string for LR's trailing md key */ |
|
||||||
const char* method_name; /**< Corresponds to :path header */ |
|
||||||
} grpc_load_reporting_call_data; |
|
||||||
|
|
||||||
/** Return a \a grpc_arg enabling load reporting */ |
|
||||||
grpc_arg grpc_load_reporting_enable_arg(); |
|
||||||
|
|
||||||
#endif /* GRPC_CORE_EXT_FILTERS_LOAD_REPORTING_SERVER_LOAD_REPORTING_PLUGIN_H \ |
|
||||||
*/ |
|
@ -1,120 +0,0 @@ |
|||||||
/*
|
|
||||||
* |
|
||||||
* Copyright 2016 gRPC authors. |
|
||||||
* |
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License"); |
|
||||||
* you may not use this file except in compliance with the License. |
|
||||||
* You may obtain a copy of the License at |
|
||||||
* |
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
* |
|
||||||
* Unless required by applicable law or agreed to in writing, software |
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS, |
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
|
||||||
* See the License for the specific language governing permissions and |
|
||||||
* limitations under the License. |
|
||||||
* |
|
||||||
*/ |
|
||||||
|
|
||||||
#include "test/core/end2end/end2end_tests.h" |
|
||||||
|
|
||||||
#include <string.h> |
|
||||||
|
|
||||||
#include <grpc/support/alloc.h> |
|
||||||
#include <grpc/support/log.h> |
|
||||||
#include <grpc/support/sync.h> |
|
||||||
|
|
||||||
#include "src/core/ext/filters/client_channel/client_channel.h" |
|
||||||
#include "src/core/ext/filters/http/server/http_server_filter.h" |
|
||||||
#include "src/core/ext/filters/load_reporting/server_load_reporting_plugin.h" |
|
||||||
#include "src/core/ext/transport/chttp2/transport/chttp2_transport.h" |
|
||||||
#include "src/core/lib/channel/channel_args.h" |
|
||||||
#include "src/core/lib/channel/connected_channel.h" |
|
||||||
#include "src/core/lib/gpr/host_port.h" |
|
||||||
#include "src/core/lib/surface/channel.h" |
|
||||||
#include "src/core/lib/surface/server.h" |
|
||||||
#include "test/core/util/port.h" |
|
||||||
#include "test/core/util/test_config.h" |
|
||||||
|
|
||||||
typedef struct load_reporting_fixture_data { |
|
||||||
char* localaddr; |
|
||||||
} load_reporting_fixture_data; |
|
||||||
|
|
||||||
static grpc_end2end_test_fixture chttp2_create_fixture_load_reporting( |
|
||||||
grpc_channel_args* client_args, grpc_channel_args* server_args) { |
|
||||||
grpc_end2end_test_fixture f; |
|
||||||
int port = grpc_pick_unused_port_or_die(); |
|
||||||
load_reporting_fixture_data* ffd = static_cast<load_reporting_fixture_data*>( |
|
||||||
gpr_malloc(sizeof(load_reporting_fixture_data))); |
|
||||||
memset(&f, 0, sizeof(f)); |
|
||||||
|
|
||||||
gpr_join_host_port(&ffd->localaddr, "localhost", port); |
|
||||||
|
|
||||||
f.fixture_data = ffd; |
|
||||||
f.cq = grpc_completion_queue_create_for_next(nullptr); |
|
||||||
f.shutdown_cq = grpc_completion_queue_create_for_pluck(nullptr); |
|
||||||
|
|
||||||
return f; |
|
||||||
} |
|
||||||
|
|
||||||
void chttp2_init_client_load_reporting(grpc_end2end_test_fixture* f, |
|
||||||
grpc_channel_args* client_args) { |
|
||||||
load_reporting_fixture_data* ffd = |
|
||||||
static_cast<load_reporting_fixture_data*>(f->fixture_data); |
|
||||||
f->client = |
|
||||||
grpc_insecure_channel_create(ffd->localaddr, client_args, nullptr); |
|
||||||
GPR_ASSERT(f->client); |
|
||||||
} |
|
||||||
|
|
||||||
void chttp2_init_server_load_reporting(grpc_end2end_test_fixture* f, |
|
||||||
grpc_channel_args* server_args) { |
|
||||||
load_reporting_fixture_data* ffd = |
|
||||||
static_cast<load_reporting_fixture_data*>(f->fixture_data); |
|
||||||
grpc_arg arg = grpc_load_reporting_enable_arg(); |
|
||||||
if (f->server) { |
|
||||||
grpc_server_destroy(f->server); |
|
||||||
} |
|
||||||
server_args = grpc_channel_args_copy_and_add(server_args, &arg, 1); |
|
||||||
f->server = grpc_server_create(server_args, nullptr); |
|
||||||
{ |
|
||||||
grpc_core::ExecCtx exec_ctx; |
|
||||||
grpc_channel_args_destroy(server_args); |
|
||||||
} |
|
||||||
grpc_server_register_completion_queue(f->server, f->cq, nullptr); |
|
||||||
GPR_ASSERT(grpc_server_add_insecure_http2_port(f->server, ffd->localaddr)); |
|
||||||
grpc_server_start(f->server); |
|
||||||
} |
|
||||||
|
|
||||||
void chttp2_tear_down_load_reporting(grpc_end2end_test_fixture* f) { |
|
||||||
load_reporting_fixture_data* ffd = |
|
||||||
static_cast<load_reporting_fixture_data*>(f->fixture_data); |
|
||||||
gpr_free(ffd->localaddr); |
|
||||||
gpr_free(ffd); |
|
||||||
} |
|
||||||
|
|
||||||
/* All test configurations */ |
|
||||||
static grpc_end2end_test_config configs[] = { |
|
||||||
{"chttp2/fullstack+load_reporting", |
|
||||||
FEATURE_MASK_SUPPORTS_DELAYED_CONNECTION | |
|
||||||
FEATURE_MASK_SUPPORTS_CLIENT_CHANNEL | |
|
||||||
FEATURE_MASK_SUPPORTS_AUTHORITY_HEADER, |
|
||||||
nullptr, chttp2_create_fixture_load_reporting, |
|
||||||
chttp2_init_client_load_reporting, chttp2_init_server_load_reporting, |
|
||||||
chttp2_tear_down_load_reporting}, |
|
||||||
}; |
|
||||||
|
|
||||||
int main(int argc, char** argv) { |
|
||||||
size_t i; |
|
||||||
|
|
||||||
grpc_test_init(argc, argv); |
|
||||||
grpc_end2end_tests_pre_init(); |
|
||||||
grpc_init(); |
|
||||||
|
|
||||||
for (i = 0; i < sizeof(configs) / sizeof(*configs); i++) { |
|
||||||
grpc_end2end_tests(argc, argv, configs[i]); |
|
||||||
} |
|
||||||
|
|
||||||
grpc_shutdown(); |
|
||||||
|
|
||||||
return 0; |
|
||||||
} |
|
File diff suppressed because it is too large
Load Diff
Loading…
Reference in new issue