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

Commit 383dd333 authored by Tej Singh's avatar Tej Singh Committed by android-build-merger
Browse files

Merge "StatsdStats: improve activation time logging" into qt-dev

am: 26b6ef79

Change-Id: I3c9be295caf4acb672bed44ba47a4d67a44ed52a
parents 8479242f 26b6ef79
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -269,6 +269,7 @@ void StatsLogProcessor::OnLogEvent(LogEvent* event) {
        if (lastBroadcastTime != mLastActivationBroadcastTimes.end()) {
            if (currentTimestampNs - lastBroadcastTime->second <
                    StatsdStats::kMinActivationBroadcastPeriodNs) {
                StatsdStats::getInstance().noteActivationBroadcastGuardrailHit(uid);
                VLOG("StatsD would've sent an activation broadcast but the rate limit stopped us.");
                return;
            }
+43 −0
Original line number Diff line number Diff line
@@ -51,6 +51,7 @@ const int FIELD_ID_PERIODIC_ALARM_STATS = 12;
const int FIELD_ID_SYSTEM_SERVER_RESTART = 15;
const int FIELD_ID_LOGGER_ERROR_STATS = 16;
const int FIELD_ID_OVERFLOW = 18;
const int FIELD_ID_ACTIVATION_BROADCAST_GUARDRAIL = 19;

const int FIELD_ID_ATOM_STATS_TAG = 1;
const int FIELD_ID_ATOM_STATS_COUNT = 2;
@@ -109,6 +110,9 @@ const int FIELD_ID_UID_MAP_BYTES_USED = 2;
const int FIELD_ID_UID_MAP_DROPPED_CHANGES = 3;
const int FIELD_ID_UID_MAP_DELETED_APPS = 4;

const int FIELD_ID_ACTIVATION_BROADCAST_GUARDRAIL_UID = 1;
const int FIELD_ID_ACTIVATION_BROADCAST_GUARDRAIL_TIME = 2;

const std::map<int, std::pair<size_t, size_t>> StatsdStats::kAtomDimensionKeySizeLimitMap = {
        {android::util::BINDER_CALLS, {6000, 10000}},
        {android::util::LOOPER_STATS, {1500, 2500}},
@@ -236,6 +240,19 @@ void StatsdStats::noteActiveStatusChanged(const ConfigKey& key, bool activated,
    vec.push_back(timeSec);
}

void StatsdStats::noteActivationBroadcastGuardrailHit(const int uid) {
    noteActivationBroadcastGuardrailHit(uid, getWallClockSec());
}

void StatsdStats::noteActivationBroadcastGuardrailHit(const int uid, const int32_t timeSec) {
    lock_guard<std::mutex> lock(mLock);
    auto& guardrailTimes = mActivationBroadcastGuardrailStats[uid];
    if (guardrailTimes.size() == kMaxTimestampCount) {
        guardrailTimes.pop_front();
    }
    guardrailTimes.push_back(timeSec);
}

void StatsdStats::noteDataDropped(const ConfigKey& key, const size_t totalBytes) {
    noteDataDropped(key, totalBytes, getWallClockSec());
}
@@ -590,6 +607,7 @@ void StatsdStats::resetInternalLocked() {
        pullStats.second.unregisteredCount = 0;
    }
    mAtomMetricStats.clear();
    mActivationBroadcastGuardrailStats.clear();
}

string buildTimeString(int64_t timeSec) {
@@ -758,6 +776,17 @@ void StatsdStats::dumpStats(int out) const {

    dprintf(out, "Event queue overflow: %d; MaxHistoryNs: %lld; MinHistoryNs: %lld\n",
            mOverflowCount, (long long)mMaxQueueHistoryNs, (long long)mMinQueueHistoryNs);

    if (mActivationBroadcastGuardrailStats.size() > 0) {
        dprintf(out, "********mActivationBroadcastGuardrail stats***********\n");
        for (const auto& pair: mActivationBroadcastGuardrailStats) {
            dprintf(out, "Uid %d: Times: ", pair.first);
            for (const auto& guardrailHitTime : pair.second) {
                dprintf(out, "%d ", guardrailHitTime);
            }
        }
        dprintf(out, "\n");
    }
}

void addConfigStatsToProto(const ConfigStats& configStats, ProtoOutputStream* proto) {
@@ -959,6 +988,20 @@ void StatsdStats::dumpStats(std::vector<uint8_t>* output, bool reset) {
                    restart);
    }

    for (const auto& pair: mActivationBroadcastGuardrailStats) {
        uint64_t token = proto.start(FIELD_TYPE_MESSAGE |
                                     FIELD_ID_ACTIVATION_BROADCAST_GUARDRAIL |
                                     FIELD_COUNT_REPEATED);
        proto.write(FIELD_TYPE_INT32 | FIELD_ID_ACTIVATION_BROADCAST_GUARDRAIL_UID,
                    (int32_t) pair.first);
        for (const auto& guardrailHitTime : pair.second) {
            proto.write(FIELD_TYPE_INT32 | FIELD_ID_ACTIVATION_BROADCAST_GUARDRAIL_TIME |
                            FIELD_COUNT_REPEATED,
                        guardrailHitTime);
        }
        proto.end(token);
    }

    output->clear();
    size_t bufferSize = proto.size();
    output->resize(bufferSize);
+13 −0
Original line number Diff line number Diff line
@@ -444,6 +444,12 @@ public:
     * the queue */
    void noteEventQueueOverflow(int64_t oldestEventTimestampNs);

    /**
     * Reports that the activation broadcast guardrail was hit for this uid. Namely, the broadcast
     * should have been sent, but instead was skipped due to hitting the guardrail.
     */
     void noteActivationBroadcastGuardrailHit(const int uid);

    /**
     * Reset the historical stats. Including all stats in icebox, and the tracked stats about
     * metrics, matchers, and atoms. The active configs will be kept and StatsdStats will continue
@@ -532,6 +538,10 @@ private:
    // Maps metric ID to its stats. The size is capped by the number of metrics.
    std::map<int64_t, AtomMetricStats> mAtomMetricStats;

    // Maps uids to times when the activation changed broadcast not sent due to hitting the
    // guardrail. The size is capped by the number of configs, and up to 20 times per uid.
    std::map<int, std::list<int32_t>> mActivationBroadcastGuardrailStats;

    struct LogLossStats {
        LogLossStats(int32_t sec, int32_t count, int32_t error, int32_t tag, int32_t uid,
                     int32_t pid)
@@ -588,6 +598,8 @@ private:

    void noteActiveStatusChanged(const ConfigKey& key, bool activate, int32_t timeSec);

    void noteActivationBroadcastGuardrailHit(const int uid, int32_t timeSec);

    void addToIceBoxLocked(std::shared_ptr<ConfigStats>& stats);

    /**
@@ -607,6 +619,7 @@ private:
    FRIEND_TEST(StatsdStatsTest, TestSystemServerCrash);
    FRIEND_TEST(StatsdStatsTest, TestPullAtomStats);
    FRIEND_TEST(StatsdStatsTest, TestAtomMetricsStats);
    FRIEND_TEST(StatsdStatsTest, TestActivationBroadcastGuardrailHit);
};

}  // namespace statsd
+4 −0
Original line number Diff line number Diff line
@@ -521,6 +521,10 @@ void MetricsManager::loadActiveConfig(const ActiveConfig& config, int64_t curren
            if (metric->getMetricId() == activeMetric.id()) {
                VLOG("Setting active metric: %lld", (long long)metric->getMetricId());
                metric->loadActiveMetric(activeMetric, currentTimeNs);
                if (!mIsActive && metric->isActive()) {
                    StatsdStats::getInstance().noteActiveStatusChanged(mConfigKey,
                                                                       /*activate=*/ true);
                }
                mIsActive |= metric->isActive();
            }
        }
+7 −0
Original line number Diff line number Diff line
@@ -470,6 +470,13 @@ message StatsdStatsReport {
    }

    optional EventQueueOverflow queue_overflow = 18;

    message ActivationBroadcastGuardrail {
        optional int32 uid = 1;
        repeated int32 guardrail_met_sec = 2;
    }

    repeated ActivationBroadcastGuardrail activation_guardrail_stats = 19;
}

message AlertTriggerDetails {
Loading