add GetStatsHistory to retrieve stats snapshots (#4748)
Summary: This PR adds public `GetStatsHistory` API to retrieve stats history in the form of an std map. The key of the map is the timestamp in microseconds when the stats snapshot is taken, the value is another std map from stats name to stats value (stored in std string). Two DBOptions are introduced: `stats_persist_period_sec` (default 10 minutes) controls the intervals between two snapshots are taken; `max_stats_history_count` (default 10) controls the max number of history snapshots to keep in memory. RocksDB will stop collecting stats snapshots if `stats_persist_period_sec` is set to 0. (This PR is the in-memory part of https://github.com/facebook/rocksdb/pull/4535) Pull Request resolved: https://github.com/facebook/rocksdb/pull/4748 Differential Revision: D13961471 Pulled By: miasantreble fbshipit-source-id: ac836d401ecb84ea92216bf9966f969dedf4ad04main
parent
48c8d8445e
commit
c4f5d0aa15
@ -0,0 +1,45 @@ |
|||||||
|
// Copyright (c) 2011-present, Facebook, Inc. All rights reserved.
|
||||||
|
// This source code is licensed under both the GPLv2 (found in the
|
||||||
|
// COPYING file in the root directory) and Apache 2.0 License
|
||||||
|
// (found in the LICENSE.Apache file in the root directory).
|
||||||
|
// Copyright (c) 2011 The LevelDB Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style license that can be
|
||||||
|
// found in the LICENSE file. See the AUTHORS file for names of contributors.
|
||||||
|
|
||||||
|
#include "db/db_impl.h" |
||||||
|
#include "db/in_memory_stats_history.h" |
||||||
|
|
||||||
|
namespace rocksdb { |
||||||
|
|
||||||
|
InMemoryStatsHistoryIterator::~InMemoryStatsHistoryIterator() {} |
||||||
|
|
||||||
|
bool InMemoryStatsHistoryIterator::Valid() const { return valid_; } |
||||||
|
|
||||||
|
Status InMemoryStatsHistoryIterator::status() const { return status_; } |
||||||
|
|
||||||
|
void InMemoryStatsHistoryIterator::Next() { |
||||||
|
// increment start_time by 1 to avoid infinite loop
|
||||||
|
AdvanceIteratorByTime(GetStatsTime() + 1, end_time_); |
||||||
|
} |
||||||
|
|
||||||
|
uint64_t InMemoryStatsHistoryIterator::GetStatsTime() const { return time_; } |
||||||
|
|
||||||
|
const std::map<std::string, uint64_t>& |
||||||
|
InMemoryStatsHistoryIterator::GetStatsMap() const { |
||||||
|
return stats_map_; |
||||||
|
} |
||||||
|
|
||||||
|
// advance the iterator to the next time between [start_time, end_time)
|
||||||
|
// if success, update time_ and stats_map_ with new_time and stats_map
|
||||||
|
void InMemoryStatsHistoryIterator::AdvanceIteratorByTime(uint64_t start_time, |
||||||
|
uint64_t end_time) { |
||||||
|
// try to find next entry in stats_history_ map
|
||||||
|
if (db_impl_ != nullptr) { |
||||||
|
valid_ = |
||||||
|
db_impl_->FindStatsByTime(start_time, end_time, &time_, &stats_map_); |
||||||
|
} else { |
||||||
|
valid_ = false; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
} // namespace rocksdb
|
@ -0,0 +1,55 @@ |
|||||||
|
// Copyright (c) 2011-present, Facebook, Inc. All rights reserved.
|
||||||
|
// This source code is licensed under both the GPLv2 (found in the
|
||||||
|
// COPYING file in the root directory) and Apache 2.0 License
|
||||||
|
// (found in the LICENSE.Apache file in the root directory).
|
||||||
|
// Copyright (c) 2011 The LevelDB Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style license that can be
|
||||||
|
// found in the LICENSE file. See the AUTHORS file for names of contributors.
|
||||||
|
|
||||||
|
#pragma once |
||||||
|
|
||||||
|
#include "rocksdb/stats_history.h" |
||||||
|
|
||||||
|
namespace rocksdb { |
||||||
|
|
||||||
|
class InMemoryStatsHistoryIterator final : public StatsHistoryIterator { |
||||||
|
public: |
||||||
|
InMemoryStatsHistoryIterator(uint64_t start_time, uint64_t end_time, |
||||||
|
DBImpl* db_impl) |
||||||
|
: start_time_(start_time), |
||||||
|
end_time_(end_time), |
||||||
|
valid_(true), |
||||||
|
db_impl_(db_impl) { |
||||||
|
AdvanceIteratorByTime(start_time_, end_time_); |
||||||
|
} |
||||||
|
~InMemoryStatsHistoryIterator() override; |
||||||
|
bool Valid() const override; |
||||||
|
Status status() const override; |
||||||
|
|
||||||
|
void Next() override; |
||||||
|
uint64_t GetStatsTime() const override; |
||||||
|
|
||||||
|
const std::map<std::string, uint64_t>& GetStatsMap() const override; |
||||||
|
|
||||||
|
private: |
||||||
|
// advance the iterator to the next stats history record with timestamp
|
||||||
|
// between [start_time, end_time)
|
||||||
|
void AdvanceIteratorByTime(uint64_t start_time, uint64_t end_time); |
||||||
|
|
||||||
|
// No copying allowed
|
||||||
|
InMemoryStatsHistoryIterator(const InMemoryStatsHistoryIterator&) = delete; |
||||||
|
void operator=(const InMemoryStatsHistoryIterator&) = delete; |
||||||
|
InMemoryStatsHistoryIterator(InMemoryStatsHistoryIterator&&) = delete; |
||||||
|
InMemoryStatsHistoryIterator& operator=(InMemoryStatsHistoryIterator&&) = |
||||||
|
delete; |
||||||
|
|
||||||
|
uint64_t time_; |
||||||
|
uint64_t start_time_; |
||||||
|
uint64_t end_time_; |
||||||
|
std::map<std::string, uint64_t> stats_map_; |
||||||
|
Status status_; |
||||||
|
bool valid_; |
||||||
|
DBImpl* db_impl_; |
||||||
|
}; |
||||||
|
|
||||||
|
} // namespace rocksdb
|
@ -0,0 +1,49 @@ |
|||||||
|
// Copyright (c) 2011-present, Facebook, Inc. All rights reserved.
|
||||||
|
// This source code is licensed under both the GPLv2 (found in the
|
||||||
|
// COPYING file in the root directory) and Apache 2.0 License
|
||||||
|
// (found in the LICENSE.Apache file in the root directory).
|
||||||
|
// Copyright (c) 2011 The LevelDB Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style license that can be
|
||||||
|
// found in the LICENSE file. See the AUTHORS file for names of contributors.
|
||||||
|
|
||||||
|
#pragma once |
||||||
|
|
||||||
|
#include <map> |
||||||
|
#include <string> |
||||||
|
|
||||||
|
// #include "db/db_impl.h"
|
||||||
|
#include "rocksdb/statistics.h" |
||||||
|
#include "rocksdb/status.h" |
||||||
|
|
||||||
|
namespace rocksdb { |
||||||
|
|
||||||
|
class DBImpl; |
||||||
|
|
||||||
|
class StatsHistoryIterator { |
||||||
|
public: |
||||||
|
StatsHistoryIterator() {} |
||||||
|
virtual ~StatsHistoryIterator() {} |
||||||
|
|
||||||
|
virtual bool Valid() const = 0; |
||||||
|
|
||||||
|
// Moves to the next stats history record. After this call, Valid() is
|
||||||
|
// true iff the iterator was not positioned at the last entry in the source.
|
||||||
|
// REQUIRES: Valid()
|
||||||
|
virtual void Next() = 0; |
||||||
|
|
||||||
|
// Return the time stamp (in microseconds) when stats history is recorded.
|
||||||
|
// REQUIRES: Valid()
|
||||||
|
virtual uint64_t GetStatsTime() const = 0; |
||||||
|
|
||||||
|
// Return the current stats history as an std::map which specifies the
|
||||||
|
// mapping from stats name to stats value . The underlying storage
|
||||||
|
// for the returned map is valid only until the next modification of
|
||||||
|
// the iterator.
|
||||||
|
// REQUIRES: Valid()
|
||||||
|
virtual const std::map<std::string, uint64_t>& GetStatsMap() const = 0; |
||||||
|
|
||||||
|
// If an error has occurred, return it. Else return an ok status.
|
||||||
|
virtual Status status() const = 0; |
||||||
|
}; |
||||||
|
|
||||||
|
} // namespace rocksdb
|
Loading…
Reference in new issue