1932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac/* 2932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac * Copyright (C) 2018 The Android Open Source Project 3932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac * 4932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac * Licensed under the Apache License, Version 2.0 (the "License"); 5932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac * you may not use this file except in compliance with the License. 6932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac * You may obtain a copy of the License at 7932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac * 8932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac * http://www.apache.org/licenses/LICENSE-2.0 9932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac * 10932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac * Unless required by applicable law or agreed to in writing, software 11932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac * distributed under the License is distributed on an "AS IS" BASIS, 12932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac * See the License for the specific language governing permissions and 14932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac * limitations under the License. 15932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac */ 16932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac 17754e29edd76e2d927619e83c660c0d93e98211c8Yangster-mac#define DEBUG false // STOPSHIP if true 18932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac#include "Log.h" 19932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac 20932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac#include <android/os/IIncidentManager.h> 21932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac#include <android/os/IncidentReportArgs.h> 22932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac#include <binder/IServiceManager.h> 23932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac 24932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac#include "external/Perfetto.h" 25932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac#include "frameworks/base/libs/incident/proto/android/os/header.pb.h" 26932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac#include "subscriber/IncidentdReporter.h" 27932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac#include "subscriber/SubscriberReporter.h" 28932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac 29932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-macnamespace android { 30932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-macnamespace os { 31932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-macnamespace statsd { 32932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac 33932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-macvoid triggerSubscribers(const int64_t rule_id, 34932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac const MetricDimensionKey& dimensionKey, 35932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac const ConfigKey& configKey, 36932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac const std::vector<Subscription>& subscriptions) { 37932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac VLOG("informSubscribers called."); 38932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac if (subscriptions.empty()) { 39932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac VLOG("No Subscriptions were associated."); 40932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac return; 41932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac } 42932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac 43932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac for (const Subscription& subscription : subscriptions) { 44932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac if (subscription.probability_of_informing() < 1 45932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac && ((float)rand() / RAND_MAX) >= subscription.probability_of_informing()) { 46932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac // Note that due to float imprecision, 0.0 and 1.0 might not truly mean never/always. 47932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac // The config writer was advised to use -0.1 and 1.1 for never/always. 48932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac ALOGI("Fate decided that a subscriber would not be informed."); 49932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac continue; 50932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac } 51932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac switch (subscription.subscriber_information_case()) { 52932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac case Subscription::SubscriberInformationCase::kIncidentdDetails: 53932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac if (!GenerateIncidentReport(subscription.incidentd_details(), rule_id, configKey)) { 54932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac ALOGW("Failed to generate incident report."); 55932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac } 56932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac break; 57932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac case Subscription::SubscriberInformationCase::kPerfettoDetails: 58d0dd6c7cefb23e0f521aac533087281be2c30bddSami Kyostila if (!CollectPerfettoTraceAndUploadToDropbox(subscription.perfetto_details(), 59d0dd6c7cefb23e0f521aac533087281be2c30bddSami Kyostila rule_id, configKey)) { 60d0dd6c7cefb23e0f521aac533087281be2c30bddSami Kyostila ALOGW("Failed to generate perfetto traces."); 61932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac } 62932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac break; 63932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac case Subscription::SubscriberInformationCase::kBroadcastSubscriberDetails: 64932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac SubscriberReporter::getInstance().alertBroadcastSubscriber(configKey, subscription, 65932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac dimensionKey); 66932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac break; 67932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac default: 68932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac break; 69932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac } 70932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac } 71932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac} 72932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac 73932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac 74932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac} // namespace statsd 75932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac} // namespace os 76932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac} // namespace android 77