Loading cmds/statsd/src/guardrail/StatsdStats.cpp +4 −0 Original line number Diff line number Diff line Loading @@ -92,6 +92,10 @@ const int FIELD_ID_UID_MAP_BYTES_USED = 3; const int FIELD_ID_UID_MAP_DROPPED_SNAPSHOTS = 4; const int FIELD_ID_UID_MAP_DROPPED_CHANGES = 5; const std::map<int, std::pair<size_t, size_t>> StatsdStats::kAtomDimensionKeySizeLimitMap = { {android::util::CPU_TIME_PER_UID_FREQ, {6000, 10000}}, }; // TODO: add stats for pulled atoms. StatsdStats::StatsdStats() { mPushedAtomStats.resize(android::util::kMaxPushedAtomId + 1); Loading cmds/statsd/src/guardrail/StatsdStats.h +3 −0 Original line number Diff line number Diff line Loading @@ -81,6 +81,9 @@ public: const static int kDimensionKeySizeSoftLimit = 300; const static int kDimensionKeySizeHardLimit = 500; // Per atom dimension key size limit static const std::map<int, std::pair<size_t, size_t>> kAtomDimensionKeySizeLimitMap; const static int kMaxConfigCount = 10; const static int kMaxAlertCountPerConfig = 100; const static int kMaxConditionCountPerConfig = 200; Loading cmds/statsd/src/metrics/GaugeMetricProducer.cpp +15 −7 Original line number Diff line number Diff line Loading @@ -17,9 +17,9 @@ #define DEBUG false // STOPSHIP if true #include "Log.h" #include "../guardrail/StatsdStats.h" #include "GaugeMetricProducer.h" #include "guardrail/StatsdStats.h" #include "stats_log_util.h" #include "../stats_log_util.h" #include <cutils/log.h> Loading Loading @@ -60,12 +60,20 @@ const int FIELD_ID_WALL_CLOCK_ATOM_TIMESTAMP = 5; GaugeMetricProducer::GaugeMetricProducer(const ConfigKey& key, const GaugeMetric& metric, const int conditionIndex, const sp<ConditionWizard>& wizard, const int pullTagId, const uint64_t startTimeNs, const sp<ConditionWizard>& wizard, const int pullTagId, const uint64_t startTimeNs, shared_ptr<StatsPullerManager> statsPullerManager) : MetricProducer(metric.id(), key, startTimeNs, conditionIndex, wizard), mStatsPullerManager(statsPullerManager), mPullTagId(pullTagId) { mPullTagId(pullTagId), mDimensionSoftLimit(StatsdStats::kAtomDimensionKeySizeLimitMap.find(pullTagId) != StatsdStats::kAtomDimensionKeySizeLimitMap.end() ? StatsdStats::kAtomDimensionKeySizeLimitMap.at(pullTagId).first : StatsdStats::kDimensionKeySizeSoftLimit), mDimensionHardLimit(StatsdStats::kAtomDimensionKeySizeLimitMap.find(pullTagId) != StatsdStats::kAtomDimensionKeySizeLimitMap.end() ? StatsdStats::kAtomDimensionKeySizeLimitMap.at(pullTagId).second : StatsdStats::kDimensionKeySizeHardLimit) { mCurrentSlicedBucket = std::make_shared<DimToGaugeAtomsMap>(); mCurrentSlicedBucketForAnomaly = std::make_shared<DimToValMap>(); int64_t bucketSizeMills = 0; Loading Loading @@ -305,11 +313,11 @@ bool GaugeMetricProducer::hitGuardRailLocked(const MetricDimensionKey& newKey) { return false; } // 1. Report the tuple count if the tuple count > soft limit if (mCurrentSlicedBucket->size() > StatsdStats::kDimensionKeySizeSoftLimit - 1) { if (mCurrentSlicedBucket->size() > mDimensionSoftLimit - 1) { size_t newTupleCount = mCurrentSlicedBucket->size() + 1; StatsdStats::getInstance().noteMetricDimensionSize(mConfigKey, mMetricId, newTupleCount); // 2. Don't add more tuples, we are above the allowed threshold. Drop the data. if (newTupleCount > StatsdStats::kDimensionKeySizeHardLimit) { if (newTupleCount > mDimensionHardLimit) { ALOGE("GaugeMetric %lld dropping data for dimension key %s", (long long)mMetricId, newKey.toString().c_str()); return true; Loading cmds/statsd/src/metrics/GaugeMetricProducer.h +4 −0 Original line number Diff line number Diff line Loading @@ -150,6 +150,10 @@ private: static const size_t kBucketSize = sizeof(GaugeBucket{}); const size_t mDimensionSoftLimit; const size_t mDimensionHardLimit; FRIEND_TEST(GaugeMetricProducerTest, TestWithCondition); FRIEND_TEST(GaugeMetricProducerTest, TestNoCondition); FRIEND_TEST(GaugeMetricProducerTest, TestPushedEventsWithUpgrade); Loading cmds/statsd/src/metrics/ValueMetricProducer.cpp +13 −5 Original line number Diff line number Diff line Loading @@ -18,8 +18,8 @@ #include "Log.h" #include "ValueMetricProducer.h" #include "guardrail/StatsdStats.h" #include "stats_log_util.h" #include "../guardrail/StatsdStats.h" #include "../stats_log_util.h" #include <cutils/log.h> #include <limits.h> Loading Loading @@ -68,7 +68,15 @@ ValueMetricProducer::ValueMetricProducer(const ConfigKey& key, const ValueMetric : MetricProducer(metric.id(), key, startTimeNs, conditionIndex, wizard), mValueField(metric.value_field()), mStatsPullerManager(statsPullerManager), mPullTagId(pullTagId) { mPullTagId(pullTagId), mDimensionSoftLimit(StatsdStats::kAtomDimensionKeySizeLimitMap.find(pullTagId) != StatsdStats::kAtomDimensionKeySizeLimitMap.end() ? StatsdStats::kAtomDimensionKeySizeLimitMap.at(pullTagId).first : StatsdStats::kDimensionKeySizeSoftLimit), mDimensionHardLimit(StatsdStats::kAtomDimensionKeySizeLimitMap.find(pullTagId) != StatsdStats::kAtomDimensionKeySizeLimitMap.end() ? StatsdStats::kAtomDimensionKeySizeLimitMap.at(pullTagId).second : StatsdStats::kDimensionKeySizeHardLimit) { // TODO: valuemetric for pushed events may need unlimited bucket length int64_t bucketSizeMills = 0; if (metric.has_bucket()) { Loading Loading @@ -266,11 +274,11 @@ bool ValueMetricProducer::hitGuardRailLocked(const MetricDimensionKey& newKey) { if (mCurrentSlicedBucket.find(newKey) != mCurrentSlicedBucket.end()) { return false; } if (mCurrentSlicedBucket.size() > StatsdStats::kDimensionKeySizeSoftLimit - 1) { if (mCurrentSlicedBucket.size() > mDimensionSoftLimit - 1) { size_t newTupleCount = mCurrentSlicedBucket.size() + 1; StatsdStats::getInstance().noteMetricDimensionSize(mConfigKey, mMetricId, newTupleCount); // 2. Don't add more tuples, we are above the allowed threshold. Drop the data. if (newTupleCount > StatsdStats::kDimensionKeySizeHardLimit) { if (newTupleCount > mDimensionHardLimit) { ALOGE("ValueMetric %lld dropping data for dimension key %s", (long long)mMetricId, newKey.toString().c_str()); return true; Loading Loading
cmds/statsd/src/guardrail/StatsdStats.cpp +4 −0 Original line number Diff line number Diff line Loading @@ -92,6 +92,10 @@ const int FIELD_ID_UID_MAP_BYTES_USED = 3; const int FIELD_ID_UID_MAP_DROPPED_SNAPSHOTS = 4; const int FIELD_ID_UID_MAP_DROPPED_CHANGES = 5; const std::map<int, std::pair<size_t, size_t>> StatsdStats::kAtomDimensionKeySizeLimitMap = { {android::util::CPU_TIME_PER_UID_FREQ, {6000, 10000}}, }; // TODO: add stats for pulled atoms. StatsdStats::StatsdStats() { mPushedAtomStats.resize(android::util::kMaxPushedAtomId + 1); Loading
cmds/statsd/src/guardrail/StatsdStats.h +3 −0 Original line number Diff line number Diff line Loading @@ -81,6 +81,9 @@ public: const static int kDimensionKeySizeSoftLimit = 300; const static int kDimensionKeySizeHardLimit = 500; // Per atom dimension key size limit static const std::map<int, std::pair<size_t, size_t>> kAtomDimensionKeySizeLimitMap; const static int kMaxConfigCount = 10; const static int kMaxAlertCountPerConfig = 100; const static int kMaxConditionCountPerConfig = 200; Loading
cmds/statsd/src/metrics/GaugeMetricProducer.cpp +15 −7 Original line number Diff line number Diff line Loading @@ -17,9 +17,9 @@ #define DEBUG false // STOPSHIP if true #include "Log.h" #include "../guardrail/StatsdStats.h" #include "GaugeMetricProducer.h" #include "guardrail/StatsdStats.h" #include "stats_log_util.h" #include "../stats_log_util.h" #include <cutils/log.h> Loading Loading @@ -60,12 +60,20 @@ const int FIELD_ID_WALL_CLOCK_ATOM_TIMESTAMP = 5; GaugeMetricProducer::GaugeMetricProducer(const ConfigKey& key, const GaugeMetric& metric, const int conditionIndex, const sp<ConditionWizard>& wizard, const int pullTagId, const uint64_t startTimeNs, const sp<ConditionWizard>& wizard, const int pullTagId, const uint64_t startTimeNs, shared_ptr<StatsPullerManager> statsPullerManager) : MetricProducer(metric.id(), key, startTimeNs, conditionIndex, wizard), mStatsPullerManager(statsPullerManager), mPullTagId(pullTagId) { mPullTagId(pullTagId), mDimensionSoftLimit(StatsdStats::kAtomDimensionKeySizeLimitMap.find(pullTagId) != StatsdStats::kAtomDimensionKeySizeLimitMap.end() ? StatsdStats::kAtomDimensionKeySizeLimitMap.at(pullTagId).first : StatsdStats::kDimensionKeySizeSoftLimit), mDimensionHardLimit(StatsdStats::kAtomDimensionKeySizeLimitMap.find(pullTagId) != StatsdStats::kAtomDimensionKeySizeLimitMap.end() ? StatsdStats::kAtomDimensionKeySizeLimitMap.at(pullTagId).second : StatsdStats::kDimensionKeySizeHardLimit) { mCurrentSlicedBucket = std::make_shared<DimToGaugeAtomsMap>(); mCurrentSlicedBucketForAnomaly = std::make_shared<DimToValMap>(); int64_t bucketSizeMills = 0; Loading Loading @@ -305,11 +313,11 @@ bool GaugeMetricProducer::hitGuardRailLocked(const MetricDimensionKey& newKey) { return false; } // 1. Report the tuple count if the tuple count > soft limit if (mCurrentSlicedBucket->size() > StatsdStats::kDimensionKeySizeSoftLimit - 1) { if (mCurrentSlicedBucket->size() > mDimensionSoftLimit - 1) { size_t newTupleCount = mCurrentSlicedBucket->size() + 1; StatsdStats::getInstance().noteMetricDimensionSize(mConfigKey, mMetricId, newTupleCount); // 2. Don't add more tuples, we are above the allowed threshold. Drop the data. if (newTupleCount > StatsdStats::kDimensionKeySizeHardLimit) { if (newTupleCount > mDimensionHardLimit) { ALOGE("GaugeMetric %lld dropping data for dimension key %s", (long long)mMetricId, newKey.toString().c_str()); return true; Loading
cmds/statsd/src/metrics/GaugeMetricProducer.h +4 −0 Original line number Diff line number Diff line Loading @@ -150,6 +150,10 @@ private: static const size_t kBucketSize = sizeof(GaugeBucket{}); const size_t mDimensionSoftLimit; const size_t mDimensionHardLimit; FRIEND_TEST(GaugeMetricProducerTest, TestWithCondition); FRIEND_TEST(GaugeMetricProducerTest, TestNoCondition); FRIEND_TEST(GaugeMetricProducerTest, TestPushedEventsWithUpgrade); Loading
cmds/statsd/src/metrics/ValueMetricProducer.cpp +13 −5 Original line number Diff line number Diff line Loading @@ -18,8 +18,8 @@ #include "Log.h" #include "ValueMetricProducer.h" #include "guardrail/StatsdStats.h" #include "stats_log_util.h" #include "../guardrail/StatsdStats.h" #include "../stats_log_util.h" #include <cutils/log.h> #include <limits.h> Loading Loading @@ -68,7 +68,15 @@ ValueMetricProducer::ValueMetricProducer(const ConfigKey& key, const ValueMetric : MetricProducer(metric.id(), key, startTimeNs, conditionIndex, wizard), mValueField(metric.value_field()), mStatsPullerManager(statsPullerManager), mPullTagId(pullTagId) { mPullTagId(pullTagId), mDimensionSoftLimit(StatsdStats::kAtomDimensionKeySizeLimitMap.find(pullTagId) != StatsdStats::kAtomDimensionKeySizeLimitMap.end() ? StatsdStats::kAtomDimensionKeySizeLimitMap.at(pullTagId).first : StatsdStats::kDimensionKeySizeSoftLimit), mDimensionHardLimit(StatsdStats::kAtomDimensionKeySizeLimitMap.find(pullTagId) != StatsdStats::kAtomDimensionKeySizeLimitMap.end() ? StatsdStats::kAtomDimensionKeySizeLimitMap.at(pullTagId).second : StatsdStats::kDimensionKeySizeHardLimit) { // TODO: valuemetric for pushed events may need unlimited bucket length int64_t bucketSizeMills = 0; if (metric.has_bucket()) { Loading Loading @@ -266,11 +274,11 @@ bool ValueMetricProducer::hitGuardRailLocked(const MetricDimensionKey& newKey) { if (mCurrentSlicedBucket.find(newKey) != mCurrentSlicedBucket.end()) { return false; } if (mCurrentSlicedBucket.size() > StatsdStats::kDimensionKeySizeSoftLimit - 1) { if (mCurrentSlicedBucket.size() > mDimensionSoftLimit - 1) { size_t newTupleCount = mCurrentSlicedBucket.size() + 1; StatsdStats::getInstance().noteMetricDimensionSize(mConfigKey, mMetricId, newTupleCount); // 2. Don't add more tuples, we are above the allowed threshold. Drop the data. if (newTupleCount > StatsdStats::kDimensionKeySizeHardLimit) { if (newTupleCount > mDimensionHardLimit) { ALOGE("ValueMetric %lld dropping data for dimension key %s", (long long)mMetricId, newKey.toString().c_str()); return true; Loading