userver: userver/ugrpc/impl/statistics.hpp Source File
Loading...
Searching...
No Matches
statistics.hpp
1#pragma once
2
3#include <array>
4#include <atomic>
5#include <chrono>
6#include <cstddef>
7#include <cstdint>
8
9#include <grpcpp/support/status.h>
10
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>
16
17#include <userver/ugrpc/impl/static_metadata.hpp>
18
19USERVER_NAMESPACE_BEGIN
20
21namespace ugrpc::impl {
22
23enum class StatisticsDomain { kClient, kServer };
24
25std::string_view ToString(StatisticsDomain);
26
27class MethodStatistics final {
28 public:
29 explicit MethodStatistics(StatisticsDomain domain);
30
31 void AccountStarted() noexcept;
32
33 void AccountStatus(grpc::StatusCode code) noexcept;
34
35 void AccountTiming(std::chrono::milliseconds timing) noexcept;
36
37 // All errors without gRPC status codes are categorized as "network errors".
38 // See server::RpcInterruptedError.
39 void AccountNetworkError() noexcept;
40
41 // Occurs when the service forgot to finish a request, oftentimes due to a
42 // thrown exception. Always indicates a programming error in our service.
43 // UNKNOWN status code is automatically returned in this case.
44 void AccountInternalError() noexcept;
45
46 void AccountCancelledByDeadlinePropagation() noexcept;
47
48 void AccountDeadlinePropagated() noexcept;
49
50 void AccountCancelled() noexcept;
51
52 friend void DumpMetric(utils::statistics::Writer& writer,
53 const MethodStatistics& stats);
54
55 std::uint64_t GetStarted() const noexcept;
56
57 private:
58 using Percentile =
59 utils::statistics::Percentile<2000, std::uint32_t, 256, 100>;
60 using RateCounter = utils::statistics::RateCounter;
61 // StatusCode enum cases have consecutive underlying values, starting from 0.
62 // UNAUTHENTICATED currently has the largest value.
63 static constexpr std::size_t kCodesCount =
64 static_cast<std::size_t>(grpc::StatusCode::UNAUTHENTICATED) + 1;
65
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};
73
74 RateCounter deadline_updated_{0};
75 RateCounter deadline_cancelled_{0};
76};
77
78class ServiceStatistics final {
79 public:
80 ServiceStatistics(const StaticServiceMetadata& metadata,
81 StatisticsDomain domain);
82
83 ~ServiceStatistics();
84
85 MethodStatistics& GetMethodStatistics(std::size_t method_id);
86 const MethodStatistics& GetMethodStatistics(std::size_t method_id) const;
87
88 const StaticServiceMetadata& GetMetadata() const;
89
90 std::uint64_t GetStartedRequests() const;
91
92 friend void DumpMetric(utils::statistics::Writer& writer,
93 const ServiceStatistics& stats);
94
95 private:
96 const StaticServiceMetadata metadata_;
97 utils::FixedArray<MethodStatistics> method_statistics_;
98};
99
100} // namespace ugrpc::impl
101
102USERVER_NAMESPACE_END