You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

88 lines
2.8 KiB

/*
* Copyright (C) 2019 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#define LOG_TAG "perfstatsd"
#include <perfstatsd.h>
using namespace android::pixel::perfstatsd;
Perfstatsd::Perfstatsd(void) {
mRefreshPeriod = DEFAULT_DATA_COLLECT_PERIOD;
std::unique_ptr<StatsType> cpuUsage(new CpuUsage);
cpuUsage->setBufferSize(CPU_USAGE_BUFFER_SIZE);
mStats.emplace_back(std::move(cpuUsage));
std::unique_ptr<StatsType> ioUsage(new IoUsage);
ioUsage->setBufferSize(IO_USAGE_BUFFER_SIZE);
mStats.emplace_back(std::move(ioUsage));
}
void Perfstatsd::refresh(void) {
for (auto const &stats : mStats) {
stats->refresh();
}
return;
}
void Perfstatsd::getHistory(std::string *ret) {
std::priority_queue<StatsData, std::vector<StatsData>, StatsdataCompare> mergedQueue;
for (auto const &stats : mStats) {
stats->dump(&mergedQueue);
}
while (!mergedQueue.empty()) {
StatsData data = mergedQueue.top();
auto raw_time = data.getTime();
auto seconds = std::chrono::time_point_cast<std::chrono::seconds>(raw_time);
auto d = raw_time - seconds;
auto milliseconds = std::chrono::duration_cast<std::chrono::milliseconds>(d);
std::string content = data.getData();
time_t t = std::chrono::system_clock::to_time_t(raw_time);
char buff[20];
strftime(buff, sizeof(buff), "%m-%d %H:%M:%S", localtime(&t));
ret->append(std::string(buff) + ".");
ret->append(std::to_string(milliseconds.count()) + "\n");
ret->append(content + "\n");
mergedQueue.pop();
}
if (ret->size() > 400_KiB)
LOG(WARNING) << "Data might be too large. size: " << ret->size() << " bytes\n" << *ret;
}
void Perfstatsd::setOptions(const std::string &key, const std::string &value) {
if (key == PERFSTATSD_PERIOD) {
uint32_t val = 0;
if (!base::ParseUint(value, &val) || val < 1) {
LOG(ERROR) << "Invalid value. Minimum refresh period is 1 second";
} else {
mRefreshPeriod = val;
LOG(INFO) << "set period to " << value << " seconds";
}
return;
}
for (auto const &stats : mStats) {
stats->setOptions(std::forward<const std::string>(key),
std::forward<const std::string>(value));
}
return;
}