diff --git a/BUILD b/BUILD index 967e3d6374c0a..37418ba57c2c1 100644 --- a/BUILD +++ b/BUILD @@ -534,6 +534,25 @@ GRPCXX_PUBLIC_HDRS = [ "include/grpcpp/impl/codegen/sync.h", ] +grpc_cc_library( + name = "grpc_rs", + srcs = [ + "//:src/rs/stats.cc", + ], + language = "c++", + public_hdrs = [ + "include/grpcrs/stats.h", + ], + tags = [ + "nofixdeps", + ], + visibility = ["@grpc:public"], + deps = [ + "stats", + "//src/core:slice", + ], +) + grpc_cc_library( name = "grpc_unsecure", srcs = [ @@ -560,6 +579,7 @@ grpc_cc_library( "grpc_client_channel", "grpc_common", "grpc_http_filters", + "grpc_rs", "grpc_security_base", "grpc_trace", "http_connect_handshaker", @@ -636,6 +656,7 @@ grpc_cc_library( "grpc_http_filters", "grpc_jwt_credentials", "grpc_public_hdrs", + "grpc_rs", "grpc_security_base", "grpc_trace", "http_connect_handshaker", diff --git a/CMakeLists.txt b/CMakeLists.txt index 3f1064eb90440..c0505dc5db2cc 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2344,6 +2344,7 @@ add_library(grpc src/core/tsi/ssl_transport_security_utils.cc src/core/tsi/transport_security.cc src/core/tsi/transport_security_grpc.cc + src/rs/stats.cc ) target_compile_features(grpc PUBLIC cxx_std_14) @@ -2475,6 +2476,7 @@ foreach(_hdr include/grpc/support/thd_id.h include/grpc/support/time.h include/grpc/support/workaround_list.h + include/grpcrs/stats.h ) string(REPLACE "include/" "" _path ${_hdr}) get_filename_component(_path ${_path} PATH) @@ -2987,6 +2989,7 @@ add_library(grpc_unsecure src/core/tsi/local_transport_security.cc src/core/tsi/transport_security.cc src/core/tsi/transport_security_grpc.cc + src/rs/stats.cc ) target_compile_features(grpc_unsecure PUBLIC cxx_std_14) @@ -3117,6 +3120,7 @@ foreach(_hdr include/grpc/support/thd_id.h include/grpc/support/time.h include/grpc/support/workaround_list.h + include/grpcrs/stats.h ) string(REPLACE "include/" "" _path ${_hdr}) get_filename_component(_path ${_path} PATH) diff --git a/build_autogenerated.yaml b/build_autogenerated.yaml index 86c7573a11836..a1ce1063ca148 100644 --- a/build_autogenerated.yaml +++ b/build_autogenerated.yaml @@ -211,6 +211,7 @@ libs: - include/grpc/support/thd_id.h - include/grpc/support/time.h - include/grpc/support/workaround_list.h + - include/grpcrs/stats.h headers: - src/core/ext/filters/backend_metrics/backend_metric_filter.h - src/core/ext/filters/backend_metrics/backend_metric_provider.h @@ -1777,6 +1778,7 @@ libs: - src/core/tsi/ssl_transport_security_utils.cc - src/core/tsi/transport_security.cc - src/core/tsi/transport_security_grpc.cc + - src/rs/stats.cc deps: - absl/cleanup:cleanup - absl/container:flat_hash_map @@ -1926,6 +1928,7 @@ libs: - include/grpc/support/thd_id.h - include/grpc/support/time.h - include/grpc/support/workaround_list.h + - include/grpcrs/stats.h headers: - src/core/ext/filters/backend_metrics/backend_metric_filter.h - src/core/ext/filters/backend_metrics/backend_metric_provider.h @@ -2708,6 +2711,7 @@ libs: - src/core/tsi/local_transport_security.cc - src/core/tsi/transport_security.cc - src/core/tsi/transport_security_grpc.cc + - src/rs/stats.cc deps: - absl/cleanup:cleanup - absl/container:flat_hash_map diff --git a/include/grpcrs/stats.h b/include/grpcrs/stats.h new file mode 100644 index 0000000000000..bc1ccdce7bd21 --- /dev/null +++ b/include/grpcrs/stats.h @@ -0,0 +1,81 @@ +// Copyright 2023 TiKV Project Authors. Licensed under Apache-2.0. + +#ifndef GRPC_RS_STATS_H +#define GRPC_RS_STATS_H + +#include +#include + +#ifndef GRPCRSAPI +#define GRPCRSAPI GPRAPI +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/** gRPC stats. + See: grpc/src/core/lib/debug/stats_data.yaml */ +typedef struct grpcrs_stats grpcrs_stats; + +enum grpcrs_stats_counter { + ClientCallsCreated, + ServerCallsCreated, + ClientChannelsCreated, + ClientSubchannelsCreated, + ServerChannelsCreated, + InsecureConnectionsCreated, + SyscallWrite, + SyscallRead, + TcpReadAlloc8k, + TcpReadAlloc64k, + Http2SettingsWrites, + Http2PingsSent, + Http2WritesBegun, + Http2TransportStalls, + Http2StreamStalls, + CqPluckCreates, + CqNextCreates, + CqCallbackCreates, + COUNTER_COUNT +}; + +enum grpcrs_stats_histogram { + CallInitialSize, + TcpWriteSize, + TcpWriteIovSize, + TcpReadSize, + TcpReadOffer, + TcpReadOfferIovSize, + Http2SendMessageSize, + Http2MetadataSize, + HISTOGRAM_COUNT +}; + +GRPCRSAPI grpcrs_stats* grpcrs_stats_collect(); + +GRPCRSAPI void grpcrs_stats_free(grpcrs_stats* stats); + +GRPCRSAPI uint64_t grpcrs_stats_get_counter( + const grpcrs_stats* stats, grpcrs_stats_counter which); + +GRPCRSAPI grpc_slice grpcrs_stats_counter_name(grpcrs_stats_counter which); + +GRPCRSAPI grpc_slice grpcrs_stats_counter_doc(grpcrs_stats_counter which); + +GRPCRSAPI double grpcrs_stats_get_histogram_percentile( + const grpcrs_stats* stats, grpcrs_stats_histogram which, + double percentile); + +GRPCRSAPI double grpcrs_stats_get_histogram_count( + const grpcrs_stats* stats, grpcrs_stats_histogram which); + +GRPCRSAPI grpc_slice grpcrs_stats_histogram_name(grpcrs_stats_histogram which); + +GRPCRSAPI grpc_slice grpcrs_stats_histogram_doc(grpcrs_stats_histogram which); + +#ifdef __cplusplus +} +#endif + +#endif /* GRPC_RS_STATS_H */ diff --git a/src/rs/stats.cc b/src/rs/stats.cc new file mode 100644 index 0000000000000..852994c8d310c --- /dev/null +++ b/src/rs/stats.cc @@ -0,0 +1,74 @@ +// Copyright 2023 TiKV Project Authors. Licensed under Apache-2.0. + +#include + +#include "src/core/lib/debug/stats.h" +#include "src/core/lib/debug/stats_data.h" + +// Just make sure they have the same number of counters. +static_assert(static_cast(grpcrs_stats_counter::COUNTER_COUNT) == + static_cast(grpc_core::GlobalStats::Counter::COUNT), + "Counter count must be the same"); + +// Just make sure they have the same number of histograms. +static_assert(static_cast(grpcrs_stats_histogram::HISTOGRAM_COUNT) == + static_cast(grpc_core::GlobalStats::Histogram::COUNT), + "Histogram count must be the same"); + +grpcrs_stats* grpcrs_stats_collect() { + return (grpcrs_stats*)grpc_core::global_stats().Collect().release(); +} + +void grpcrs_stats_free(grpcrs_stats* stats) { + auto s = (grpc_core::GlobalStats*)stats; + delete s; +} + +uint64_t grpcrs_stats_get_counter( + const grpcrs_stats* stats, grpcrs_stats_counter which) { + auto s = (const grpc_core::GlobalStats*)stats; + return s->counters[which]; +} + +grpc_slice +grpcrs_stats_counter_name(grpcrs_stats_counter which) { + auto name = grpc_core::GlobalStats::counter_name[which]; + auto slice = grpc_slice_from_static_buffer(name.data(), name.size()); + return slice; +} + +grpc_slice +grpcrs_stats_counter_doc(grpcrs_stats_counter which) { + auto doc = grpc_core::GlobalStats::counter_doc[which]; + auto slice = grpc_slice_from_static_buffer(doc.data(), doc.size()); + return slice; +} + +double grpcrs_stats_get_histogram_percentile( + const grpcrs_stats* stats, grpcrs_stats_histogram which, + double percentile) { + auto s = (const grpc_core::GlobalStats*)stats; + return s->histogram(static_cast(which)) + .Percentile(percentile); +} + +double grpcrs_stats_get_histogram_count( + const grpcrs_stats* stats, grpcrs_stats_histogram which) { + auto s = (const grpc_core::GlobalStats*)stats; + return s->histogram(static_cast(which)) + .Count(); +} + +grpc_slice +grpcrs_stats_histogram_name(grpcrs_stats_histogram which) { + auto name = grpc_core::GlobalStats::histogram_name[which]; + auto slice = grpc_slice_from_static_buffer(name.data(), name.size()); + return slice; +} + +grpc_slice +grpcrs_stats_histogram_doc(grpcrs_stats_histogram which) { + auto doc = grpc_core::GlobalStats::histogram_doc[which]; + auto slice = grpc_slice_from_static_buffer(doc.data(), doc.size()); + return slice; +}