| // 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/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: | |
| Metrics(zx::duration poll_frequency, async_dispatcher_t* dispatcher, | |
| sys::ComponentInspector* inspector, fuchsia::cobalt::Logger_Sync* logger, | |
| memory::CaptureFn capture_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_; | |
| memory::CaptureFn capture_cb_; | |
| async::TaskClosureMethod<Metrics, &Metrics::CollectMetrics> task_{this}; | |
| std::unordered_map<std::string, cobalt_registry::MemoryMetricDimensionBucket> | |
| bucket_name_to_code_; | |
| memory::Digester digester_; | |
| // 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_ |