9#include <grpcpp/support/status.h>
11#include <userver/utils/fixed_array.hpp>
12#include <userver/utils/statistics/fwd.hpp>
13#include <userver/utils/statistics/percentile.hpp>
14#include <userver/utils/statistics/rate_counter.hpp>
15#include <userver/utils/statistics/recentperiod.hpp>
17#include <userver/ugrpc/impl/static_metadata.hpp>
19USERVER_NAMESPACE_BEGIN
21namespace ugrpc::impl {
23enum class StatisticsDomain { kClient, kServer };
25std::string_view ToString(StatisticsDomain);
27class MethodStatistics
final {
29 explicit MethodStatistics(StatisticsDomain domain);
31 void AccountStarted()
noexcept;
33 void AccountStatus(grpc::StatusCode code)
noexcept;
35 void AccountTiming(std::chrono::milliseconds timing)
noexcept;
39 void AccountNetworkError()
noexcept;
44 void AccountInternalError()
noexcept;
46 void AccountCancelledByDeadlinePropagation()
noexcept;
48 void AccountDeadlinePropagated()
noexcept;
50 void AccountCancelled()
noexcept;
52 friend void DumpMetric(utils::statistics::Writer& writer,
53 const MethodStatistics& stats);
55 std::uint64_t GetStarted()
const noexcept;
59 utils::statistics::Percentile<2000, std::uint32_t, 256, 100>;
60 using RateCounter = utils::statistics::RateCounter;
63 static constexpr std::size_t kCodesCount =
64 static_cast<std::size_t>(grpc::StatusCode::UNAUTHENTICATED) + 1;
66 const StatisticsDomain domain_;
67 RateCounter started_{0};
68 std::array<RateCounter, kCodesCount> status_codes_{};
69 utils::statistics::RecentPeriod<Percentile, Percentile> timings_;
70 RateCounter network_errors_{0};
71 RateCounter internal_errors_{0};
72 RateCounter cancelled_{0};
74 RateCounter deadline_updated_{0};
75 RateCounter deadline_cancelled_{0};
78class ServiceStatistics
final {
80 ServiceStatistics(
const StaticServiceMetadata& metadata,
81 StatisticsDomain domain);
85 MethodStatistics& GetMethodStatistics(std::size_t method_id);
86 const MethodStatistics& GetMethodStatistics(std::size_t method_id)
const;
88 const StaticServiceMetadata& GetMetadata()
const;
90 std::uint64_t GetStartedRequests()
const;
92 friend void DumpMetric(utils::statistics::Writer& writer,
93 const ServiceStatistics& stats);
96 const StaticServiceMetadata metadata_;
97 utils::FixedArray<MethodStatistics> method_statistics_;