blob: d2b0195fc68e57be35582ffcba68ba96d696b85f [file] [log] [blame]
#ifndef THIRD_PARTY_MILOTIC_EXTERNAL_CC_TLBMC_HAL_SHARED_MEM_METRICS_H_
#define THIRD_PARTY_MILOTIC_EXTERNAL_CC_TLBMC_HAL_SHARED_MEM_METRICS_H_
#include <sys/types.h>
#include <array>
#include <atomic>
#include <cstddef>
#include <cstdint>
#include <string_view>
#include <type_traits>
#include "absl/time/time.h"
// copybara:strip_begin(g3-shared-libs)
#include "nlohmann/json.hpp"
// copybara:strip_end
#include "pattern_to_entity_array.h"
namespace milotic_tlbmc {
constexpr std::size_t kResourceCount =
milotic::authz::pattern_entity_pair_array.size();
// clang-format off
constexpr std::array<int, 4> kSupportedStatusCodes = {
// go/keep-sorted start
200,
401,
404,
500,
// go/keep-sorted end
};
// clang-format on
constexpr size_t kResponseTimeHistogramBucketCount = 20;
constexpr absl::Duration kResponseTimeHistogramBucketTime =
absl::Milliseconds(50);
constexpr size_t kMaxResponseStatusCode = 600;
constexpr size_t kTopLatencyResourcesCount = 20;
// The class is thread-safe.
class TlbmcMetrics {
public:
using MetricsIntegerType =
std::conditional_t<sizeof(void*) == 4, uint32_t, uint64_t>;
TlbmcMetrics() {
static_assert(std::atomic<MetricsIntegerType>::is_always_lock_free);
}
// copybara:strip_begin(g3-shared-libs)
void UpdateMetricsRequestCount(bool is_tlbmc_request);
void UpdateMetricsResponse(absl::Duration response_time, int status_code,
std::string_view resource_url);
// This call is expensive. Please call it only periodically, e.g., every
// minute.
nlohmann::json ToJson() const;
// copybara:strip_end
private:
std::atomic<MetricsIntegerType> total_tlbmc_request_count_ = 0;
std::atomic<MetricsIntegerType> total_gbmcweb_request_count_ = 0;
// Response status code count.
std::atomic<MetricsIntegerType>
response_status_code_count_[kMaxResponseStatusCode + 1] = {0};
// Historgram of response time. Every 50ms the response time is recorded.
// At this moment, the histogram is 20 buckets, and each bucket is 50ms.
// The first bucket is [0, 50ms), the last bucket is [950ms, inf).
std::atomic<MetricsIntegerType>
response_time_histogram_[kResponseTimeHistogramBucketCount] = {0};
// Resource average latency distribution.
std::atomic<MetricsIntegerType>
total_response_count_per_resource_[kResourceCount] = {0};
// TODO(nanzhou): handles overflow.
std::atomic<MetricsIntegerType>
response_total_latency_ms_per_resource_[kResourceCount] = {0};
};
} // namespace milotic_tlbmc
#endif // THIRD_PARTY_MILOTIC_EXTERNAL_CC_TLBMC_HAL_SHARED_MEM_METRICS_H_