blob: d06753b9661bc9c5d869a82d170c346f8c5265ea [file] [log] [blame]
// Copyright 2021 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "sysmem_metrics.h"
#include <limits>
#include "src/devices/sysmem/metrics/metrics.cb.h"
#include "utils.h"
SysmemMetrics::SysmemMetrics()
: metrics_buffer_(cobalt::MetricsBuffer::Create(sysmem_metrics::kProjectId)),
unused_page_check_(
metrics_buffer_->CreateMetricBuffer(sysmem_metrics::kUnusedPageCheckMetricId)),
weak_vmo_events_(metrics_buffer_->CreateMetricBuffer(sysmem_metrics::kWeakVmoEventsMetricId)),
weak_vmo_histograms_(metrics_buffer_->CreateHistogramMetricBuffer(
COBALT_EXPONENTIAL_HISTOGRAM_INFO(::sysmem_metrics::kWeakVmoHistograms))) {}
cobalt::MetricsBuffer& SysmemMetrics::metrics_buffer() { return *metrics_buffer_; }
void SysmemMetrics::LogUnusedPageCheck(sysmem_metrics::UnusedPageCheckMetricDimensionEvent event) {
unused_page_check_.LogEvent({event});
}
void SysmemMetrics::LogUnusedPageCheckCounts(uint32_t succeeded_count, uint32_t failed_count) {
if (succeeded_count) {
unused_page_check_pending_success_count_ += succeeded_count;
}
if (failed_count) {
unused_page_check_.LogEventCount(
{sysmem_metrics::UnusedPageCheckMetricDimensionEvent_PatternCheckFailed}, failed_count);
}
zx::time now = zx::clock::get_monotonic();
if (((now >= unused_page_check_last_flush_time_ + kUnusedPageCheckFlushSuccessPeriod) &&
unused_page_check_pending_success_count_) ||
unused_page_check_pending_success_count_ >= std::numeric_limits<uint32_t>::max() / 2) {
unused_page_check_.LogEventCount(
{sysmem_metrics::UnusedPageCheckMetricDimensionEvent_PatternCheckOk},
safe_cast<uint32_t>(unused_page_check_pending_success_count_));
unused_page_check_pending_success_count_ = 0;
unused_page_check_last_flush_time_ = now;
}
}
void SysmemMetrics::LogCloseWeakAsapTakingTooLong() {
weak_vmo_events_.LogEvent(
{sysmem_metrics::WeakVmoEventsMetricDimensionEvent_CloseWeakAsapExceeded5Seconds});
}
void SysmemMetrics::LogCloseWeakAsapDuration(zx::duration duration) {
weak_vmo_histograms_.LogValue(
{sysmem_metrics::WeakVmoHistogramsMetricDimensionOperation_CloseWeakAsapComplete},
duration.to_msecs());
}