summaryrefslogtreecommitdiff
path: root/cmds/statsd/src/metrics/GaugeMetricProducer.h
diff options
context:
space:
mode:
Diffstat (limited to 'cmds/statsd/src/metrics/GaugeMetricProducer.h')
-rw-r--r--cmds/statsd/src/metrics/GaugeMetricProducer.h211
1 files changed, 0 insertions, 211 deletions
diff --git a/cmds/statsd/src/metrics/GaugeMetricProducer.h b/cmds/statsd/src/metrics/GaugeMetricProducer.h
deleted file mode 100644
index ef3a24a43dcc..000000000000
--- a/cmds/statsd/src/metrics/GaugeMetricProducer.h
+++ /dev/null
@@ -1,211 +0,0 @@
-/*
- * Copyright (C) 2017 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.
- */
-
-#pragma once
-
-#include <unordered_map>
-
-#include <android/util/ProtoOutputStream.h>
-#include <gtest/gtest_prod.h>
-#include "../condition/ConditionTracker.h"
-#include "../external/PullDataReceiver.h"
-#include "../external/StatsPullerManager.h"
-#include "../matchers/matcher_util.h"
-#include "../matchers/EventMatcherWizard.h"
-#include "MetricProducer.h"
-#include "frameworks/base/cmds/statsd/src/statsd_config.pb.h"
-#include "../stats_util.h"
-
-namespace android {
-namespace os {
-namespace statsd {
-
-struct GaugeAtom {
- GaugeAtom(std::shared_ptr<vector<FieldValue>> fields, int64_t elapsedTimeNs)
- : mFields(fields), mElapsedTimestampNs(elapsedTimeNs) {
- }
- std::shared_ptr<vector<FieldValue>> mFields;
- int64_t mElapsedTimestampNs;
-};
-
-struct GaugeBucket {
- int64_t mBucketStartNs;
- int64_t mBucketEndNs;
- std::vector<GaugeAtom> mGaugeAtoms;
-};
-
-typedef std::unordered_map<MetricDimensionKey, std::vector<GaugeAtom>>
- DimToGaugeAtomsMap;
-
-// This gauge metric producer first register the puller to automatically pull the gauge at the
-// beginning of each bucket. If the condition is met, insert it to the bucket info. Otherwise
-// proactively pull the gauge when the condition is changed to be true. Therefore, the gauge metric
-// producer always reports the guage at the earliest time of the bucket when the condition is met.
-class GaugeMetricProducer : public virtual MetricProducer, public virtual PullDataReceiver {
-public:
- GaugeMetricProducer(
- const ConfigKey& key, const GaugeMetric& gaugeMetric, const int conditionIndex,
- const vector<ConditionState>& initialConditionCache,
- const sp<ConditionWizard>& conditionWizard, const int whatMatcherIndex,
- const sp<EventMatcherWizard>& matcherWizard, const int pullTagId,
- const int triggerAtomId, const int atomId, const int64_t timeBaseNs,
- const int64_t startTimeNs, const sp<StatsPullerManager>& pullerManager,
- const std::unordered_map<int, std::shared_ptr<Activation>>& eventActivationMap = {},
- const std::unordered_map<int, std::vector<std::shared_ptr<Activation>>>&
- eventDeactivationMap = {});
-
- virtual ~GaugeMetricProducer();
-
- // Handles when the pulled data arrives.
- void onDataPulled(const std::vector<std::shared_ptr<LogEvent>>& data,
- bool pullSuccess, int64_t originalPullTimeNs) override;
-
- // GaugeMetric needs to immediately trigger another pull when we create the partial bucket.
- void notifyAppUpgrade(const int64_t& eventTimeNs) override {
- std::lock_guard<std::mutex> lock(mMutex);
-
- if (!mSplitBucketForAppUpgrade) {
- return;
- }
- flushLocked(eventTimeNs);
- if (mIsPulled && mSamplingType == GaugeMetric::RANDOM_ONE_SAMPLE) {
- pullAndMatchEventsLocked(eventTimeNs);
- }
- };
-
- // GaugeMetric needs to immediately trigger another pull when we create the partial bucket.
- void onStatsdInitCompleted(const int64_t& eventTimeNs) override {
- std::lock_guard<std::mutex> lock(mMutex);
-
- flushLocked(eventTimeNs);
- if (mIsPulled && mSamplingType == GaugeMetric::RANDOM_ONE_SAMPLE) {
- pullAndMatchEventsLocked(eventTimeNs);
- }
- };
-
-protected:
- void onMatchedLogEventInternalLocked(
- const size_t matcherIndex, const MetricDimensionKey& eventKey,
- const ConditionKey& conditionKey, bool condition, const LogEvent& event,
- const std::map<int, HashableDimensionKey>& statePrimaryKeys) override;
-
-private:
- void onDumpReportLocked(const int64_t dumpTimeNs,
- const bool include_current_partial_bucket,
- const bool erase_data,
- const DumpLatency dumpLatency,
- std::set<string> *str_set,
- android::util::ProtoOutputStream* protoOutput) override;
- void clearPastBucketsLocked(const int64_t dumpTimeNs) override;
-
- // Internal interface to handle condition change.
- void onConditionChangedLocked(const bool conditionMet, const int64_t eventTime) override;
-
- // Internal interface to handle active state change.
- void onActiveStateChangedLocked(const int64_t& eventTimeNs) override;
-
- // Internal interface to handle sliced condition change.
- void onSlicedConditionMayChangeLocked(bool overallCondition, const int64_t eventTime) override;
-
- // Internal function to calculate the current used bytes.
- size_t byteSizeLocked() const override;
-
- void dumpStatesLocked(FILE* out, bool verbose) const override;
-
- void dropDataLocked(const int64_t dropTimeNs) override;
-
- // Util function to flush the old packet.
- void flushIfNeededLocked(const int64_t& eventTime) override;
-
- void flushCurrentBucketLocked(const int64_t& eventTimeNs,
- const int64_t& nextBucketStartTimeNs) override;
-
- void prepareFirstBucketLocked() override;
-
- void pullAndMatchEventsLocked(const int64_t timestampNs);
-
- const int mWhatMatcherIndex;
-
- sp<EventMatcherWizard> mEventMatcherWizard;
-
- sp<StatsPullerManager> mPullerManager;
- // tagId for pulled data. -1 if this is not pulled
- const int mPullTagId;
-
- // tagId for atoms that trigger the pulling, if any
- const int mTriggerAtomId;
-
- // tagId for output atom
- const int mAtomId;
-
- // if this is pulled metric
- const bool mIsPulled;
-
- // Save the past buckets and we can clear when the StatsLogReport is dumped.
- std::unordered_map<MetricDimensionKey, std::vector<GaugeBucket>> mPastBuckets;
-
- // The current partial bucket.
- std::shared_ptr<DimToGaugeAtomsMap> mCurrentSlicedBucket;
-
- // The current full bucket for anomaly detection. This is updated to the latest value seen for
- // this slice (ie, for partial buckets, we use the last partial bucket in this full bucket).
- std::shared_ptr<DimToValMap> mCurrentSlicedBucketForAnomaly;
-
- const int64_t mMinBucketSizeNs;
-
- // Translate Atom based bucket to single numeric value bucket for anomaly and updates the map
- // for each slice with the latest value.
- void updateCurrentSlicedBucketForAnomaly();
-
- // Allowlist of fields to report. Empty means all are reported.
- std::vector<Matcher> mFieldMatchers;
-
- GaugeMetric::SamplingType mSamplingType;
-
- const int64_t mMaxPullDelayNs;
-
- // apply an allowlist on the original input
- std::shared_ptr<vector<FieldValue>> getGaugeFields(const LogEvent& event);
-
- // Util function to check whether the specified dimension hits the guardrail.
- bool hitGuardRailLocked(const MetricDimensionKey& newKey);
-
- static const size_t kBucketSize = sizeof(GaugeBucket{});
-
- const size_t mDimensionSoftLimit;
-
- const size_t mDimensionHardLimit;
-
- const size_t mGaugeAtomsPerDimensionLimit;
-
- const bool mSplitBucketForAppUpgrade;
-
- FRIEND_TEST(GaugeMetricProducerTest, TestPulledEventsWithCondition);
- FRIEND_TEST(GaugeMetricProducerTest, TestPulledEventsWithSlicedCondition);
- FRIEND_TEST(GaugeMetricProducerTest, TestPulledEventsNoCondition);
- FRIEND_TEST(GaugeMetricProducerTest, TestPulledWithAppUpgradeDisabled);
- FRIEND_TEST(GaugeMetricProducerTest, TestPulledEventsAnomalyDetection);
- FRIEND_TEST(GaugeMetricProducerTest, TestFirstBucket);
- FRIEND_TEST(GaugeMetricProducerTest, TestPullOnTrigger);
- FRIEND_TEST(GaugeMetricProducerTest, TestRemoveDimensionInOutput);
-
- FRIEND_TEST(GaugeMetricProducerTest_PartialBucket, TestPushedEvents);
- FRIEND_TEST(GaugeMetricProducerTest_PartialBucket, TestPulled);
-};
-
-} // namespace statsd
-} // namespace os
-} // namespace android