Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 69f1baf7 authored by Yao Chen's avatar Yao Chen
Browse files

Some fixes in StatsdStats, and add some unit tests

+ Add timestamp for when metric data is reported.

Test: statsd_test

Change-Id: Ief5ec5172feed4ec74b7422b77cf69ec8361ef2f
parent c8862caf
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -201,6 +201,7 @@ void StatsLogProcessor::onDumpReport(const ConfigKey& key, vector<uint8_t>* outD
            iter.rp()->move(toRead);
        }
    }
    StatsdStats::getInstance().noteMetricsReportSent(key);
}

void StatsLogProcessor::OnConfigRemoved(const ConfigKey& key) {
@@ -236,7 +237,7 @@ void StatsLogProcessor::flushIfNecessary(uint64_t timestampNs,
    } else if (totalBytes > kMaxSerializedBytes) { // Too late. We need to start clearing data.
        // We ignore the return value so we force each metric producer to clear its contents.
        metricsManager->onDumpReport();
        StatsdStats::getInstance().noteDataDrop(key);
        StatsdStats::getInstance().noteDataDropped(key);
        VLOG("StatsD had to toss out metrics for %s", key.ToString().c_str());
    }
}
+1 −1
Original line number Diff line number Diff line
@@ -488,7 +488,7 @@ status_t StatsService::cmd_print_stats(FILE* out, const Vector<String8>& args) {
    if (args.size() > 1) {
        reset = strtol(args[1].string(), NULL, 10);
    }
    vector<int8_t> output;
    vector<uint8_t> output;
    statsdStats.dumpStats(&output, reset);
    return NO_ERROR;
}
+23 −7
Original line number Diff line number Diff line
@@ -61,7 +61,7 @@ const int FIELD_ID_ATOM_STATS_COUNT = 2;
// TODO: add stats for pulled atoms.
StatsdStats::StatsdStats() {
    mPushedAtomStats.resize(android::util::kMaxPushedAtomId + 1);
    mStartTime = time(nullptr);
    mStartTimeSec = time(nullptr);
}

StatsdStats& StatsdStats::getInstance() {
@@ -107,6 +107,7 @@ void StatsdStats::noteConfigRemovedInternalLocked(const ConfigKey& key) {
        mMetricsStats.erase(key);
        mConditionStats.erase(key);
        mIceBox.push_back(it->second);
        mConfigStats.erase(it);
    }
}

@@ -126,7 +127,7 @@ void StatsdStats::noteBroadcastSent(const ConfigKey& key) {
    it->second.add_broadcast_sent_time_sec(time(nullptr));
}

void StatsdStats::noteDataDrop(const ConfigKey& key) {
void StatsdStats::noteDataDropped(const ConfigKey& key) {
    lock_guard<std::mutex> lock(mLock);
    auto it = mConfigStats.find(key);
    if (it == mConfigStats.end()) {
@@ -137,6 +138,17 @@ void StatsdStats::noteDataDrop(const ConfigKey& key) {
    it->second.add_data_drop_time_sec(time(nullptr));
}

void StatsdStats::noteMetricsReportSent(const ConfigKey& key) {
    lock_guard<std::mutex> lock(mLock);
    auto it = mConfigStats.find(key);
    if (it == mConfigStats.end()) {
        ALOGE("Config key %s not found!", key.ToString().c_str());
        return;
    }

    it->second.add_dump_report_time_sec(time(nullptr));
}

void StatsdStats::noteConditionDimensionSize(const ConfigKey& key, const string& name, int size) {
    lock_guard<std::mutex> lock(mLock);
    // if name doesn't exist before, it will create the key with count 0.
@@ -164,7 +176,7 @@ void StatsdStats::noteMatcherMatched(const ConfigKey& key, const string& name) {
void StatsdStats::noteAtomLogged(int atomId, int32_t timeSec) {
    lock_guard<std::mutex> lock(mLock);

    if (timeSec < mStartTime) {
    if (timeSec < mStartTimeSec) {
        return;
    }

@@ -183,7 +195,7 @@ void StatsdStats::reset() {

void StatsdStats::resetInternalLocked() {
    // Reset the historical data, but keep the active ConfigStats
    mStartTime = time(nullptr);
    mStartTimeSec = time(nullptr);
    mIceBox.clear();
    mConditionStats.clear();
    mMetricsStats.clear();
@@ -225,11 +237,11 @@ void StatsdStats::addSubStatsToConfig(const ConfigKey& key,
    }
}

void StatsdStats::dumpStats(std::vector<int8_t>* output, bool reset) {
void StatsdStats::dumpStats(std::vector<uint8_t>* output, bool reset) {
    lock_guard<std::mutex> lock(mLock);

    if (DEBUG) {
        time_t t = time(nullptr);
        time_t t = mStartTimeSec;
        struct tm* tm = localtime(&t);
        char timeBuffer[80];
        strftime(timeBuffer, sizeof(timeBuffer), "%Y-%m-%d %I:%M%p", tm);
@@ -237,7 +249,7 @@ void StatsdStats::dumpStats(std::vector<int8_t>* output, bool reset) {
        VLOG("Stats collection start second: %s", timeBuffer);
    }
    ProtoOutputStream proto;
    proto.write(FIELD_TYPE_INT32 | FIELD_ID_BEGIN_TIME, mStartTime);
    proto.write(FIELD_TYPE_INT32 | FIELD_ID_BEGIN_TIME, mStartTimeSec);
    proto.write(FIELD_TYPE_INT32 | FIELD_ID_END_TIME, (int32_t)time(nullptr));

    VLOG("%lu Config in icebox: ", (unsigned long)mIceBox.size());
@@ -286,6 +298,10 @@ void StatsdStats::dumpStats(std::vector<int8_t>* output, bool reset) {
            for (const auto& dataDropTime : configStats.data_drop_time_sec()) {
                VLOG("\tdata drop time: %d", dataDropTime);
            }

            for (const auto& dumpTime : configStats.dump_report_time_sec()) {
                VLOG("\tdump report time: %d", dumpTime);
            }
        }

        addSubStatsToConfig(pair.first, configStats);
+17 −3
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@
#include "config/ConfigKey.h"
#include "frameworks/base/cmds/statsd/src/stats_log.pb.h"

#include <gtest/gtest_prod.h>
#include <mutex>
#include <string>
#include <vector>
@@ -63,7 +64,14 @@ public:
    /**
     * Report a config's metrics data has been dropped.
     */
    void noteDataDrop(const ConfigKey& key);
    void noteDataDropped(const ConfigKey& key);

    /**
     * Report metrics data report has been sent.
     *
     * The report may be requested via StatsManager API, or through adb cmd.
     */
    void noteMetricsReportSent(const ConfigKey& key);

    /**
     * Report the size of output tuple of a condition.
@@ -114,14 +122,14 @@ public:
     *
     * [reset]: whether to clear the historical stats after the call.
     */
    void dumpStats(std::vector<int8_t>* buffer, bool reset);
    void dumpStats(std::vector<uint8_t>* buffer, bool reset);

private:
    StatsdStats();

    mutable std::mutex mLock;

    int32_t mStartTime;
    int32_t mStartTimeSec;

    // The stats about the configs that are still in use.
    std::map<const ConfigKey, StatsdStatsReport_ConfigStats> mConfigStats;
@@ -153,6 +161,12 @@ private:
    void resetInternalLocked();

    void addSubStatsToConfig(const ConfigKey& key, StatsdStatsReport_ConfigStats& configStats);

    FRIEND_TEST(StatsdStatsTest, TestValidConfigAdd);
    FRIEND_TEST(StatsdStatsTest, TestInvalidConfigAdd);
    FRIEND_TEST(StatsdStatsTest, TestConfigRemove);
    FRIEND_TEST(StatsdStatsTest, TestSubStats);
    FRIEND_TEST(StatsdStatsTest, TestAtomLog);
};

}  // namespace statsd
+4 −3
Original line number Diff line number Diff line
@@ -206,9 +206,10 @@ message StatsdStatsReport {

        repeated int32 broadcast_sent_time_sec = 10;
        repeated int32 data_drop_time_sec = 11;
        repeated MatcherStats matcher_stats = 12;
        repeated ConditionStats condition_stats = 13;
        repeated MetricStats metric_stats = 14;
        repeated int32 dump_report_time_sec = 12;
        repeated MatcherStats matcher_stats = 13;
        repeated ConditionStats condition_stats = 14;
        repeated MetricStats metric_stats = 15;
    }

    repeated ConfigStats config_stats = 3;
Loading