1* // Copyright 2021 Google LLC 2* // 3* // Licensed under the Apache License, Version 2.0 (the "License"); 4* // you may not use this file except in compliance with the License. 5* // You may obtain a copy of the License at 6* // 7* // http://www.apache.org/licenses/LICENSE-2.0 8* // 9* // Unless required by applicable law or agreed to in writing, software 10* // distributed under the License is distributed on an "AS IS" BASIS, 11* // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12* // See the License for the specific language governing permissions and 13* // limitations under the License. 14* 15* #pragma once 16* 17* #include "metricblob.pb.h" 18* 19* #include <unistd.h> 20* 21* #include <blobs-ipmid/blobs.hpp> 22* 23* #include <atomic> 24* #include <cstdint> 25* #include <string> 26* #include <string_view> 27* #include <unordered_map> 28* #include <vector> 29* 30* namespace metric_blob 31* { 32* 33* class BmcHealthSnapshot 34* { 35* public: 36* BmcHealthSnapshot(); 37* 38* /** 39* * Reads data from this metric 40* * @param offset: offset into the data to read 41* * @param requestedSize: how many bytes to read 42* * @returns Bytes able to read. Returns empty if nothing can be read. 43* */ 44* std::string_view read(uint32_t offset, uint32_t requestedSize); 45* 46* /** 47* * Returns information about the amount of readable data and whether the 48* * metric has finished populating. 49* * @param meta: Struct to fill with the metadata info 50* */ 51* bool stat(blobs::BlobMeta& meta); 52* 53* /** 54* * Start the metric collection process 55* */ 56* void doWork(); 57* 58* /** 59* * The size of the content string. 60* */ 61* uint32_t size(); 62* 63* private: 64* /** 65* * Serialize to the pb_dump_ array. 66* */ 67* void serializeSnapshotToArray( 68* const bmcmetrics::metricproto::BmcMetricSnapshot& snapshot); 69* 70* // The two following functions access the snapshot's string table so they 71* // have to be member functions. 72* bmcmetrics::metricproto::BmcProcStatMetric getProcStatList(); 73* bmcmetrics::metricproto::BmcFdStatMetric getFdStatList(); 74* 75* int getStringID(const std::string_view s); 76* std::atomic<bool> done; 77* std::vector<char> pbDump; 78* std::unordered_map<std::string, int> stringTable; 79* int stringId; 80* long ticksPerSec; 81* }; 82* 83* } // namespace metric_blob 84*