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

Commit 058d8698 authored by Bookatz's avatar Bookatz
Browse files

Statsd BroadcastSubscribers can receive 'cookies'

Subscribers can now provide additional Strings that will be passed back to
it when an anomaly is detected. This way, the Subscriber can be informed
about anomaly-specific information has meaning to it.
Statsd itself does not use these strings and doesn't care what they are
- it simply passes them back to the subscriber.

Change-Id: If269872397c4ed2c67e41d54d850cdc664d4f73e
Fixes: 74012329
Test: run cts-dev -m CtsStatsdHostTestCases -t android.cts.statsd.alert.BroadcastSubscriberTests
parent 983c1e54
Loading
Loading
Loading
Loading
+1 −0
Original line number Original line Diff line number Diff line
@@ -376,6 +376,7 @@ package android.app {
    method public boolean setBroadcastSubscriber(long, long, android.app.PendingIntent);
    method public boolean setBroadcastSubscriber(long, long, android.app.PendingIntent);
    method public boolean setDataFetchOperation(long, android.app.PendingIntent);
    method public boolean setDataFetchOperation(long, android.app.PendingIntent);
    field public static final java.lang.String ACTION_STATSD_STARTED = "android.app.action.STATSD_STARTED";
    field public static final java.lang.String ACTION_STATSD_STARTED = "android.app.action.STATSD_STARTED";
    field public static final java.lang.String EXTRA_STATS_BROADCAST_SUBSCRIBER_COOKIES = "android.app.extra.STATS_BROADCAST_SUBSCRIBER_COOKIES";
    field public static final java.lang.String EXTRA_STATS_CONFIG_KEY = "android.app.extra.STATS_CONFIG_KEY";
    field public static final java.lang.String EXTRA_STATS_CONFIG_KEY = "android.app.extra.STATS_CONFIG_KEY";
    field public static final java.lang.String EXTRA_STATS_CONFIG_UID = "android.app.extra.STATS_CONFIG_UID";
    field public static final java.lang.String EXTRA_STATS_CONFIG_UID = "android.app.extra.STATS_CONFIG_UID";
    field public static final java.lang.String EXTRA_STATS_DIMENSIONS_VALUE = "android.app.extra.STATS_DIMENSIONS_VALUE";
    field public static final java.lang.String EXTRA_STATS_DIMENSIONS_VALUE = "android.app.extra.STATS_DIMENSIONS_VALUE";
+1 −0
Original line number Original line Diff line number Diff line
@@ -295,6 +295,7 @@ message PerfettoDetails {


message BroadcastSubscriberDetails {
message BroadcastSubscriberDetails {
  optional int64 subscriber_id = 1;
  optional int64 subscriber_id = 1;
  repeated string cookie = 2;
}
}


message Subscription {
message Subscription {
+16 −4
Original line number Original line Diff line number Diff line
@@ -77,6 +77,12 @@ void SubscriberReporter::alertBroadcastSubscriber(const ConfigKey& configKey,
    }
    }
    int64_t subscriberId = subscription.broadcast_subscriber_details().subscriber_id();
    int64_t subscriberId = subscription.broadcast_subscriber_details().subscriber_id();


    vector<String16> cookies;
    cookies.reserve(subscription.broadcast_subscriber_details().cookie_size());
    for (auto& cookie : subscription.broadcast_subscriber_details().cookie()) {
        cookies.push_back(String16(cookie.c_str()));
    }

    auto it1 = mIntentMap.find(configKey);
    auto it1 = mIntentMap.find(configKey);
    if (it1 == mIntentMap.end()) {
    if (it1 == mIntentMap.end()) {
        ALOGW("Cannot inform subscriber for missing config key %s ", configKey.ToString().c_str());
        ALOGW("Cannot inform subscriber for missing config key %s ", configKey.ToString().c_str());
@@ -88,12 +94,13 @@ void SubscriberReporter::alertBroadcastSubscriber(const ConfigKey& configKey,
                configKey.ToString().c_str(), (long long)subscriberId);
                configKey.ToString().c_str(), (long long)subscriberId);
        return;
        return;
    }
    }
    sendBroadcastLocked(it2->second, configKey, subscription, dimKey);
    sendBroadcastLocked(it2->second, configKey, subscription, cookies, dimKey);
}
}


void SubscriberReporter::sendBroadcastLocked(const sp<IBinder>& intentSender,
void SubscriberReporter::sendBroadcastLocked(const sp<IBinder>& intentSender,
                                             const ConfigKey& configKey,
                                             const ConfigKey& configKey,
                                             const Subscription& subscription,
                                             const Subscription& subscription,
                                             const vector<String16>& cookies,
                                             const MetricDimensionKey& dimKey) const {
                                             const MetricDimensionKey& dimKey) const {
    VLOG("SubscriberReporter::sendBroadcastLocked called.");
    VLOG("SubscriberReporter::sendBroadcastLocked called.");
    if (mStatsCompanionService == nullptr) {
    if (mStatsCompanionService == nullptr) {
@@ -101,11 +108,16 @@ void SubscriberReporter::sendBroadcastLocked(const sp<IBinder>& intentSender,
        return;
        return;
    }
    }
    mStatsCompanionService->sendSubscriberBroadcast(
    mStatsCompanionService->sendSubscriberBroadcast(
            intentSender, configKey.GetUid(), configKey.GetId(), subscription.id(),
            intentSender,
            subscription.rule_id(), getStatsDimensionsValue(dimKey.getDimensionKeyInWhat()));
            configKey.GetUid(),
            configKey.GetId(),
            subscription.id(),
            subscription.rule_id(),
            cookies,
            getStatsDimensionsValue(dimKey.getDimensionKeyInWhat()));
}
}


void getStatsDimensionsValueHelper(const std::vector<FieldValue>& dims, size_t* index, int depth,
void getStatsDimensionsValueHelper(const vector<FieldValue>& dims, size_t* index, int depth,
                                   int prefix, vector<StatsDimensionsValue>* output) {
                                   int prefix, vector<StatsDimensionsValue>* output) {
    size_t count = dims.size();
    size_t count = dims.size();
    while (*index < count) {
    while (*index < count) {
+2 −0
Original line number Original line Diff line number Diff line
@@ -26,6 +26,7 @@


#include <mutex>
#include <mutex>
#include <unordered_map>
#include <unordered_map>
#include <vector>


namespace android {
namespace android {
namespace os {
namespace os {
@@ -102,6 +103,7 @@ private:
    void sendBroadcastLocked(const sp<android::IBinder>& intentSender,
    void sendBroadcastLocked(const sp<android::IBinder>& intentSender,
                             const ConfigKey& configKey,
                             const ConfigKey& configKey,
                             const Subscription& subscription,
                             const Subscription& subscription,
                             const std::vector<String16>& cookies,
                             const MetricDimensionKey& dimKey) const;
                             const MetricDimensionKey& dimKey) const;
};
};


+8 −1
Original line number Original line Diff line number Diff line
@@ -53,6 +53,12 @@ public final class StatsManager {
     */
     */
    public static final String EXTRA_STATS_SUBSCRIPTION_RULE_ID =
    public static final String EXTRA_STATS_SUBSCRIPTION_RULE_ID =
            "android.app.extra.STATS_SUBSCRIPTION_RULE_ID";
            "android.app.extra.STATS_SUBSCRIPTION_RULE_ID";
    /**
     *   List<String> of the relevant statsd_config.proto's BroadcastSubscriberDetails.cookie.
     *   Obtain using {@link android.content.Intent#getStringArrayListExtra(String)}.
     */
    public static final String EXTRA_STATS_BROADCAST_SUBSCRIBER_COOKIES =
            "android.app.extra.STATS_BROADCAST_SUBSCRIBER_COOKIES";
    /**
    /**
     * Extra of a {@link android.os.StatsDimensionsValue} representing sliced dimension value
     * Extra of a {@link android.os.StatsDimensionsValue} representing sliced dimension value
     * information.
     * information.
@@ -146,7 +152,8 @@ public final class StatsManager {
     * {@link #EXTRA_STATS_CONFIG_UID},
     * {@link #EXTRA_STATS_CONFIG_UID},
     * {@link #EXTRA_STATS_CONFIG_KEY},
     * {@link #EXTRA_STATS_CONFIG_KEY},
     * {@link #EXTRA_STATS_SUBSCRIPTION_ID},
     * {@link #EXTRA_STATS_SUBSCRIPTION_ID},
     * {@link #EXTRA_STATS_SUBSCRIPTION_RULE_ID}, and
     * {@link #EXTRA_STATS_SUBSCRIPTION_RULE_ID},
     * {@link #EXTRA_STATS_BROADCAST_SUBSCRIBER_COOKIES}, and
     * {@link #EXTRA_STATS_DIMENSIONS_VALUE}.
     * {@link #EXTRA_STATS_DIMENSIONS_VALUE}.
     * <p>
     * <p>
     * This function can only be called by the owner (uid) of the config. It must be called each
     * This function can only be called by the owner (uid) of the config. It must be called each
Loading