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

Commit e2cd6d50 authored by Yangster-mac's avatar Yangster-mac
Browse files

1/ Duration anomaly tracker with alarm.

2/ Init anomaly from config based on the public language.
3/ Unit tests for anomaly detection in count/gauge producer.
4/ Revisit the duration tracker logic.

Test: unit test passed.
Change-Id: I2423c0e0f05b1e37626954de9e749303423963f2
parent 809565b7
Loading
Loading
Loading
Loading
+1 −2
Original line number Diff line number Diff line
@@ -21,6 +21,7 @@ statsd_common_src := \
    src/statsd_config.proto \
    src/atoms_copy.proto \
    src/anomaly/AnomalyMonitor.cpp \
    src/anomaly/AnomalyTracker.cpp \
    src/condition/CombinationConditionTracker.cpp \
    src/condition/condition_util.cpp \
    src/condition/SimpleConditionTracker.cpp \
@@ -39,7 +40,6 @@ statsd_common_src := \
    src/matchers/CombinationLogMatchingTracker.cpp \
    src/matchers/matcher_util.cpp \
    src/matchers/SimpleLogMatchingTracker.cpp \
    src/anomaly/DiscreteAnomalyTracker.cpp \
    src/metrics/MetricProducer.cpp \
    src/metrics/EventMetricProducer.cpp \
    src/metrics/CountMetricProducer.cpp \
@@ -178,4 +178,3 @@ statsd_common_aidl_includes:=
statsd_common_c_includes:=

include $(BUILD_NATIVE_TEST)
+13 −1
Original line number Diff line number Diff line
@@ -50,13 +50,24 @@ const int FIELD_ID_UID = 1;
const int FIELD_ID_NAME = 2;

StatsLogProcessor::StatsLogProcessor(const sp<UidMap>& uidMap,
                                     const sp<AnomalyMonitor>& anomalyMonitor,
                                     const std::function<void(const ConfigKey&)>& sendBroadcast)
    : mUidMap(uidMap), mSendBroadcast(sendBroadcast) {
    : mUidMap(uidMap), mAnomalyMonitor(anomalyMonitor), mSendBroadcast(sendBroadcast) {
}

StatsLogProcessor::~StatsLogProcessor() {
}

void StatsLogProcessor::onAnomalyAlarmFired(
        const uint64_t timestampNs,
        unordered_set<sp<const AnomalyAlarm>, SpHash<AnomalyAlarm>> anomalySet) {
    for (const auto& anomaly : anomalySet) {
        for (const auto& itr : mMetricsManagers) {
            itr.second->onAnomalyAlarmFired(timestampNs, anomaly);
        }
    }
}

// TODO: what if statsd service restarts? How do we know what logs are already processed before?
void StatsLogProcessor::OnLogEvent(const LogEvent& msg) {
    // pass the event to metrics managers.
@@ -93,6 +104,7 @@ void StatsLogProcessor::OnConfigUpdated(const ConfigKey& key, const StatsdConfig
    unique_ptr<MetricsManager> newMetricsManager = std::make_unique<MetricsManager>(config);
    if (newMetricsManager->isConfigValid()) {
        mUidMap->OnConfigUpdated(key);
        newMetricsManager->setAnomalyMonitor(mAnomalyMonitor);
        mMetricsManagers[key] = std::move(newMetricsManager);
        // Why doesn't this work? mMetricsManagers.insert({key, std::move(newMetricsManager)});
        ALOGD("StatsdConfig valid");
+7 −2
Original line number Diff line number Diff line
@@ -32,7 +32,7 @@ namespace statsd {

class StatsLogProcessor : public ConfigListener {
public:
    StatsLogProcessor(const sp<UidMap>& uidMap,
    StatsLogProcessor(const sp<UidMap>& uidMap, const sp<AnomalyMonitor>& anomalyMonitor,
                      const std::function<void(const ConfigKey&)>& sendBroadcast);
    virtual ~StatsLogProcessor();

@@ -44,6 +44,9 @@ public:
    size_t GetMetricsSize(const ConfigKey& key);
 
    void onDumpReport(const ConfigKey& key, vector<uint8_t>* outData);
    void onAnomalyAlarmFired(
            const uint64_t timestampNs,
            unordered_set<sp<const AnomalyAlarm>, SpHash<AnomalyAlarm>> anomalySet);

private:
    mutable mutex mBroadcastTimesMutex;
@@ -54,6 +57,8 @@ private:

    sp<UidMap> mUidMap;  // Reference to the UidMap to lookup app name and version for each uid.

    sp<AnomalyMonitor> mAnomalyMonitor;

    /* Max *serialized* size of the logs kept in memory before flushing through binder call.
       Proto lite does not implement the SpaceUsed() function which gives the in memory byte size.
       So we cap memory usage by limiting the serialized size. Note that protobuf's in memory size
+5 −2
Original line number Diff line number Diff line
@@ -73,7 +73,7 @@ StatsService::StatsService(const sp<Looper>& handlerLooper)
{
    mUidMap = new UidMap();
    mConfigManager = new ConfigManager();
    mProcessor = new StatsLogProcessor(mUidMap, [this](const ConfigKey& key) {
    mProcessor = new StatsLogProcessor(mUidMap, mAnomalyMonitor, [this](const ConfigKey& key) {
        auto sc = getStatsCompanionService();
        auto receiver = mConfigManager->GetConfigReceiver(key);
        if (sc == nullptr) {
@@ -554,7 +554,10 @@ Status StatsService::informAnomalyAlarmFired() {

    if (DEBUG) ALOGD("StatsService::informAnomalyAlarmFired succeeded");
    // TODO: check through all counters/timers and see if an anomaly has indeed occurred.

    uint64_t currentTimeNs = time(nullptr) * NS_PER_SEC;
    std::unordered_set<sp<const AnomalyAlarm>, SpHash<AnomalyAlarm>> anomalySet =
            mAnomalyMonitor->onAlarmFired(currentTimeNs);
    mProcessor->onAnomalyAlarmFired(currentTimeNs, anomalySet);
    return Status::ok();
}

+5 −0
Original line number Diff line number Diff line
@@ -129,6 +129,11 @@ int64_t AnomalyMonitor::secToMs(uint32_t timeSec) {
    return ((int64_t)timeSec) * 1000;
}

unordered_set<sp<const AnomalyAlarm>, SpHash<AnomalyAlarm>> AnomalyMonitor::onAlarmFired(
        uint64_t timestampNs) {
    return popSoonerThan(static_cast<uint32_t>(timestampNs));
}

}  // namespace statsd
}  // namespace os
}  // namespace android
Loading