blob: ae0d0a9c1d1ddc5f276c441ca4fd0ef0b5d25138 [file] [log] [blame]
// Copyright 2020 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.
#ifndef SRC_DEVELOPER_MEMORY_MONITOR_METRICS_H_
#define SRC_DEVELOPER_MEMORY_MONITOR_METRICS_H_
#include <fuchsia/cobalt/cpp/fidl.h>
#include <lib/async/cpp/task.h>
#include <lib/async/dispatcher.h>
#include <lib/sys/inspect/cpp/component.h>
#include <string>
#include <unordered_map>
#include "src/developer/memory/metrics/bucket_match.h"
#include "src/developer/memory/metrics/capture.h"
#include "src/developer/memory/metrics/digest.h"
#include "src/developer/memory/metrics/watcher.h"
#include "src/developer/memory/monitor/memory_metrics_registry.cb.h"
#include "src/lib/fxl/macros.h"
namespace monitor {
class Metrics {
public:
using CaptureCb = fit::function<zx_status_t(memory::Capture*)>;
using DigestCb = fit::function<void(const memory::Capture&, memory::Digest*)>;
Metrics(const std::vector<memory::BucketMatch>& bucket_matches, zx::duration poll_frequency,
async_dispatcher_t* dispatcher, sys::ComponentInspector* inspector,
fuchsia::cobalt::Logger_Sync* logger, CaptureCb capture_cb, DigestCb digest_cb);
// Allow monitor to update the memory bandwidth readings
// once a second to metrics
void NextMemoryBandwidthReading(uint64_t reading, zx_time_t ts);
// Reader side must use the exact name to read from Inspect.
// Design doc in go/fuchsia-metrics-to-inspect-design.
static constexpr const char* kInspectPlatformNodeName = "platform_metrics";
// Details about config file are in b/151984065#comment16
static constexpr const char* kMemoryNodeName = "memory_usages";
static constexpr const char* kReadingMemoryTimestamp = "timestamp";
static constexpr const char* kMemoryBandwidthNodeName = "memory_bandwidth";
static constexpr const char* kReadings = "readings";
// Size of the circular buffer for readings within a minute
static constexpr size_t kMemoryBandwidthArraySize = 60;
private:
void CollectMetrics();
void WriteDigestToInspect(const memory::Digest& digest);
void AddKmemEvents(const zx_info_kmem_stats_t& kmem,
std::vector<fuchsia::cobalt::CobaltEvent>* events);
void AddKmemEventsWithUptime(const zx_info_kmem_stats_t& kmem, zx_time_t capture_time,
std::vector<fuchsia::cobalt::CobaltEvent>* events);
cobalt_registry::MemoryLeakMetricDimensionTimeSinceBoot GetUpTimeEventCode(
const zx_time_t current);
zx::duration poll_frequency_;
async_dispatcher_t* dispatcher_;
fuchsia::cobalt::Logger_Sync* logger_;
CaptureCb capture_cb_;
DigestCb digest_cb_;
async::TaskClosureMethod<Metrics, &Metrics::CollectMetrics> task_{this};
std::unordered_map<std::string, cobalt_registry::MemoryMetricDimensionBucket>
bucket_name_to_code_;
// The component inspector to publish data to.
// Not owned.
sys::ComponentInspector* inspector_;
inspect::Node platform_metric_node_;
inspect::Node metric_memory_node_;
std::map<std::string, inspect::UintProperty> inspect_memory_usages_;
inspect::IntProperty inspect_memory_timestamp_;
inspect::Node metric_memory_bandwidth_node_;
inspect::UintArray inspect_memory_bandwidth_;
inspect::IntProperty inspect_memory_bandwidth_timestamp_;
size_t memory_bandwidth_index_ = 0;
FXL_DISALLOW_COPY_AND_ASSIGN(Metrics);
};
} // namespace monitor
#endif // SRC_DEVELOPER_MEMORY_MONITOR_METRICS_H_