152e5b99983c1f7ff0b9a1f3b4b80d779073b21c8Bertrand SIMONNET/* 252e5b99983c1f7ff0b9a1f3b4b80d779073b21c8Bertrand SIMONNET * Copyright (C) 2015 The Android Open Source Project 352e5b99983c1f7ff0b9a1f3b4b80d779073b21c8Bertrand SIMONNET * 452e5b99983c1f7ff0b9a1f3b4b80d779073b21c8Bertrand SIMONNET * Licensed under the Apache License, Version 2.0 (the "License"); 552e5b99983c1f7ff0b9a1f3b4b80d779073b21c8Bertrand SIMONNET * you may not use this file except in compliance with the License. 652e5b99983c1f7ff0b9a1f3b4b80d779073b21c8Bertrand SIMONNET * You may obtain a copy of the License at 752e5b99983c1f7ff0b9a1f3b4b80d779073b21c8Bertrand SIMONNET * 852e5b99983c1f7ff0b9a1f3b4b80d779073b21c8Bertrand SIMONNET * http://www.apache.org/licenses/LICENSE-2.0 952e5b99983c1f7ff0b9a1f3b4b80d779073b21c8Bertrand SIMONNET * 1052e5b99983c1f7ff0b9a1f3b4b80d779073b21c8Bertrand SIMONNET * Unless required by applicable law or agreed to in writing, software 1152e5b99983c1f7ff0b9a1f3b4b80d779073b21c8Bertrand SIMONNET * distributed under the License is distributed on an "AS IS" BASIS, 1252e5b99983c1f7ff0b9a1f3b4b80d779073b21c8Bertrand SIMONNET * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1352e5b99983c1f7ff0b9a1f3b4b80d779073b21c8Bertrand SIMONNET * See the License for the specific language governing permissions and 1452e5b99983c1f7ff0b9a1f3b4b80d779073b21c8Bertrand SIMONNET * limitations under the License. 1552e5b99983c1f7ff0b9a1f3b4b80d779073b21c8Bertrand SIMONNET */ 1665b014683927aca25d5d7e62b4bdd46e19d46bfDarin Petkov 17d83ca801ad65ae389d20e5dd3e30aed6f285ebf4Bertrand SIMONNET#include "metrics/metrics_library.h" 1865b014683927aca25d5d7e62b4bdd46e19d46bfDarin Petkov 1941c54505234bf8baee7d5b1bab54758bd7893877Luigi Semenzato#include <base/logging.h> 2041c54505234bf8baee7d5b1bab54758bd7893877Luigi Semenzato#include <base/strings/stringprintf.h> 216b8629a6490d01196368ae1ed5bc6967c6f127ebBertrand SIMONNET#include <binder/IServiceManager.h> 2265b014683927aca25d5d7e62b4bdd46e19d46bfDarin Petkov#include <errno.h> 2365b014683927aca25d5d7e62b4bdd46e19d46bfDarin Petkov#include <sys/file.h> 244c5daa47942e4d891c74ac56417dd815b25e6e3dKen Mixter#include <sys/stat.h> 256b8629a6490d01196368ae1ed5bc6967c6f127ebBertrand SIMONNET#include <utils/String16.h> 264fcb2ac28fe7c7010c72844b911f869baaf798d9Darin Petkov 274fcb2ac28fe7c7010c72844b911f869baaf798d9Darin Petkov#include <cstdio> 284fcb2ac28fe7c7010c72844b911f869baaf798d9Darin Petkov#include <cstring> 2965b014683927aca25d5d7e62b4bdd46e19d46bfDarin Petkov 306b8629a6490d01196368ae1ed5bc6967c6f127ebBertrand SIMONNET#include "android/brillo/metrics/IMetricsd.h" 31bd3505e634cf8f6a8cb95f2b352670a0890c06f2Bertrand SIMONNET#include "constants.h" 32e10b548cf5e0f51f0de08e0c984b23b38640e0f9Chris Masone 33326842224051fd332b60c8039b7a43aa95f52120Luigi Semenzatostatic const char kCrosEventHistogramName[] = "Platform.CrOSEvent"; 34326842224051fd332b60c8039b7a43aa95f52120Luigi Semenzatostatic const int kCrosEventHistogramMax = 100; 356b8629a6490d01196368ae1ed5bc6967c6f127ebBertrand SIMONNETstatic const char kMetricsServiceName[] = "android.brillo.metrics.IMetricsd"; 3665b014683927aca25d5d7e62b4bdd46e19d46bfDarin Petkov 376844c06107726d45c76456c5e8fefe59a123fe79Chih-Chung Chang/* Add new cros events here. 386844c06107726d45c76456c5e8fefe59a123fe79Chih-Chung Chang * 396844c06107726d45c76456c5e8fefe59a123fe79Chih-Chung Chang * The index of the event is sent in the message, so please do not 406844c06107726d45c76456c5e8fefe59a123fe79Chih-Chung Chang * reorder the names. 416844c06107726d45c76456c5e8fefe59a123fe79Chih-Chung Chang */ 426844c06107726d45c76456c5e8fefe59a123fe79Chih-Chung Changstatic const char *kCrosEventNames[] = { 436844c06107726d45c76456c5e8fefe59a123fe79Chih-Chung Chang "ModemManagerCommandSendFailure", // 0 446844c06107726d45c76456c5e8fefe59a123fe79Chih-Chung Chang "HwWatchdogReboot", // 1 456844c06107726d45c76456c5e8fefe59a123fe79Chih-Chung Chang "Cras.NoCodecsFoundAtBoot", // 2 466e55c11537d0625e6d6a024db4b80ab942081022Darren Krahn "Chaps.DatabaseCorrupted", // 3 476e55c11537d0625e6d6a024db4b80ab942081022Darren Krahn "Chaps.DatabaseRepairFailure", // 4 486e55c11537d0625e6d6a024db4b80ab942081022Darren Krahn "Chaps.DatabaseCreateFailure", // 5 4986830baa179ee66b2551122dc587057dfd1cdd05Darren Krahn "Attestation.OriginSpecificExhausted", // 6 50e57398a6ee0afc0185aabedc66d14c91c09d33deLuigi Semenzato "SpringPowerSupply.Original.High", // 7 51e57398a6ee0afc0185aabedc66d14c91c09d33deLuigi Semenzato "SpringPowerSupply.Other.High", // 8 52e8fd968af0f72e9d80f34081a75048d5fdfb14b0Luigi Semenzato "SpringPowerSupply.Original.Low", // 9 53e8fd968af0f72e9d80f34081a75048d5fdfb14b0Luigi Semenzato "SpringPowerSupply.ChargerIdle", // 10 5409a15fa95486f7b6a3197366241827a23392918bDarren Krahn "TPM.NonZeroDictionaryAttackCounter", // 11 55538e2090cdac67acfa725a87ac94a75042bbdd61Luigi Semenzato "TPM.EarlyResetDuringCommand", // 12 566844c06107726d45c76456c5e8fefe59a123fe79Chih-Chung Chang}; 576844c06107726d45c76456c5e8fefe59a123fe79Chih-Chung Chang 586b8629a6490d01196368ae1ed5bc6967c6f127ebBertrand SIMONNETusing android::binder::Status; 596b8629a6490d01196368ae1ed5bc6967c6f127ebBertrand SIMONNETusing android::brillo::metrics::IMetricsd; 606b8629a6490d01196368ae1ed5bc6967c6f127ebBertrand SIMONNETusing android::String16; 616b8629a6490d01196368ae1ed5bc6967c6f127ebBertrand SIMONNET 622765d0abccd0c754422332d114cdecc271888e2dBertrand SIMONNETMetricsLibrary::MetricsLibrary() {} 63fd158294daa6061037ca564e21818a49ee56fc94Daniel EratMetricsLibrary::~MetricsLibrary() {} 64fd158294daa6061037ca564e21818a49ee56fc94Daniel Erat 65eafbbdf3df81cdbdb50b4c676e7d55dbdd9b30a3Ken Mixter// We take buffer and buffer_size as parameters in order to simplify testing 66eafbbdf3df81cdbdb50b4c676e7d55dbdd9b30a3Ken Mixter// of various alignments of the |device_name| with |buffer_size|. 67eafbbdf3df81cdbdb50b4c676e7d55dbdd9b30a3Ken Mixterbool MetricsLibrary::IsDeviceMounted(const char* device_name, 68eafbbdf3df81cdbdb50b4c676e7d55dbdd9b30a3Ken Mixter const char* mounts_file, 69eafbbdf3df81cdbdb50b4c676e7d55dbdd9b30a3Ken Mixter char* buffer, 70eafbbdf3df81cdbdb50b4c676e7d55dbdd9b30a3Ken Mixter int buffer_size, 71eafbbdf3df81cdbdb50b4c676e7d55dbdd9b30a3Ken Mixter bool* result) { 7214595032aa4781d430caff2eed02b9ce74132749Alex Vakulenko if (buffer == nullptr || buffer_size < 1) 73eafbbdf3df81cdbdb50b4c676e7d55dbdd9b30a3Ken Mixter return false; 74eafbbdf3df81cdbdb50b4c676e7d55dbdd9b30a3Ken Mixter int mounts_fd = open(mounts_file, O_RDONLY); 75eafbbdf3df81cdbdb50b4c676e7d55dbdd9b30a3Ken Mixter if (mounts_fd < 0) 76eafbbdf3df81cdbdb50b4c676e7d55dbdd9b30a3Ken Mixter return false; 77eafbbdf3df81cdbdb50b4c676e7d55dbdd9b30a3Ken Mixter // match_offset describes: 78eafbbdf3df81cdbdb50b4c676e7d55dbdd9b30a3Ken Mixter // -1 -- not beginning of line 79eafbbdf3df81cdbdb50b4c676e7d55dbdd9b30a3Ken Mixter // 0..strlen(device_name)-1 -- this offset in device_name is next to match 80eafbbdf3df81cdbdb50b4c676e7d55dbdd9b30a3Ken Mixter // strlen(device_name) -- matched full name, just need a space. 81eafbbdf3df81cdbdb50b4c676e7d55dbdd9b30a3Ken Mixter int match_offset = 0; 82eafbbdf3df81cdbdb50b4c676e7d55dbdd9b30a3Ken Mixter bool match = false; 83eafbbdf3df81cdbdb50b4c676e7d55dbdd9b30a3Ken Mixter while (!match) { 84eafbbdf3df81cdbdb50b4c676e7d55dbdd9b30a3Ken Mixter int read_size = read(mounts_fd, buffer, buffer_size); 85eafbbdf3df81cdbdb50b4c676e7d55dbdd9b30a3Ken Mixter if (read_size <= 0) { 86eafbbdf3df81cdbdb50b4c676e7d55dbdd9b30a3Ken Mixter if (errno == -EINTR) 87eafbbdf3df81cdbdb50b4c676e7d55dbdd9b30a3Ken Mixter continue; 88eafbbdf3df81cdbdb50b4c676e7d55dbdd9b30a3Ken Mixter break; 89eafbbdf3df81cdbdb50b4c676e7d55dbdd9b30a3Ken Mixter } 90eafbbdf3df81cdbdb50b4c676e7d55dbdd9b30a3Ken Mixter for (int i = 0; i < read_size; ++i) { 91eafbbdf3df81cdbdb50b4c676e7d55dbdd9b30a3Ken Mixter if (buffer[i] == '\n') { 92eafbbdf3df81cdbdb50b4c676e7d55dbdd9b30a3Ken Mixter match_offset = 0; 93eafbbdf3df81cdbdb50b4c676e7d55dbdd9b30a3Ken Mixter continue; 94eafbbdf3df81cdbdb50b4c676e7d55dbdd9b30a3Ken Mixter } 95eafbbdf3df81cdbdb50b4c676e7d55dbdd9b30a3Ken Mixter if (match_offset < 0) { 96eafbbdf3df81cdbdb50b4c676e7d55dbdd9b30a3Ken Mixter continue; 97eafbbdf3df81cdbdb50b4c676e7d55dbdd9b30a3Ken Mixter } 98eafbbdf3df81cdbdb50b4c676e7d55dbdd9b30a3Ken Mixter if (device_name[match_offset] == '\0') { 99eafbbdf3df81cdbdb50b4c676e7d55dbdd9b30a3Ken Mixter if (buffer[i] == ' ') { 100eafbbdf3df81cdbdb50b4c676e7d55dbdd9b30a3Ken Mixter match = true; 101eafbbdf3df81cdbdb50b4c676e7d55dbdd9b30a3Ken Mixter break; 102eafbbdf3df81cdbdb50b4c676e7d55dbdd9b30a3Ken Mixter } 103eafbbdf3df81cdbdb50b4c676e7d55dbdd9b30a3Ken Mixter match_offset = -1; 104eafbbdf3df81cdbdb50b4c676e7d55dbdd9b30a3Ken Mixter continue; 105eafbbdf3df81cdbdb50b4c676e7d55dbdd9b30a3Ken Mixter } 106eafbbdf3df81cdbdb50b4c676e7d55dbdd9b30a3Ken Mixter 107eafbbdf3df81cdbdb50b4c676e7d55dbdd9b30a3Ken Mixter if (buffer[i] == device_name[match_offset]) { 108eafbbdf3df81cdbdb50b4c676e7d55dbdd9b30a3Ken Mixter ++match_offset; 109eafbbdf3df81cdbdb50b4c676e7d55dbdd9b30a3Ken Mixter } else { 110eafbbdf3df81cdbdb50b4c676e7d55dbdd9b30a3Ken Mixter match_offset = -1; 111eafbbdf3df81cdbdb50b4c676e7d55dbdd9b30a3Ken Mixter } 112eafbbdf3df81cdbdb50b4c676e7d55dbdd9b30a3Ken Mixter } 113eafbbdf3df81cdbdb50b4c676e7d55dbdd9b30a3Ken Mixter } 114eafbbdf3df81cdbdb50b4c676e7d55dbdd9b30a3Ken Mixter close(mounts_fd); 115eafbbdf3df81cdbdb50b4c676e7d55dbdd9b30a3Ken Mixter *result = match; 116eafbbdf3df81cdbdb50b4c676e7d55dbdd9b30a3Ken Mixter return true; 117eafbbdf3df81cdbdb50b4c676e7d55dbdd9b30a3Ken Mixter} 118eafbbdf3df81cdbdb50b4c676e7d55dbdd9b30a3Ken Mixter 119eafbbdf3df81cdbdb50b4c676e7d55dbdd9b30a3Ken Mixterbool MetricsLibrary::IsGuestMode() { 120eafbbdf3df81cdbdb50b4c676e7d55dbdd9b30a3Ken Mixter char buffer[256]; 121eafbbdf3df81cdbdb50b4c676e7d55dbdd9b30a3Ken Mixter bool result = false; 122eafbbdf3df81cdbdb50b4c676e7d55dbdd9b30a3Ken Mixter if (!IsDeviceMounted("guestfs", 123eafbbdf3df81cdbdb50b4c676e7d55dbdd9b30a3Ken Mixter "/proc/mounts", 124eafbbdf3df81cdbdb50b4c676e7d55dbdd9b30a3Ken Mixter buffer, 125eafbbdf3df81cdbdb50b4c676e7d55dbdd9b30a3Ken Mixter sizeof(buffer), 126eafbbdf3df81cdbdb50b4c676e7d55dbdd9b30a3Ken Mixter &result)) { 127eafbbdf3df81cdbdb50b4c676e7d55dbdd9b30a3Ken Mixter return false; 128eafbbdf3df81cdbdb50b4c676e7d55dbdd9b30a3Ken Mixter } 1299f1a774c671a03c1849c9bf1b7c31f9fe7995f73Arkaitz Ruiz Alvarez return result && (access("/var/run/state/logged-in", F_OK) == 0); 130eafbbdf3df81cdbdb50b4c676e7d55dbdd9b30a3Ken Mixter} 131eafbbdf3df81cdbdb50b4c676e7d55dbdd9b30a3Ken Mixter 1326b8629a6490d01196368ae1ed5bc6967c6f127ebBertrand SIMONNETbool MetricsLibrary::CheckService() { 1336b8629a6490d01196368ae1ed5bc6967c6f127ebBertrand SIMONNET if (metricsd_proxy_.get() && 1346b8629a6490d01196368ae1ed5bc6967c6f127ebBertrand SIMONNET android::IInterface::asBinder(metricsd_proxy_)->isBinderAlive()) 1356b8629a6490d01196368ae1ed5bc6967c6f127ebBertrand SIMONNET return true; 1366b8629a6490d01196368ae1ed5bc6967c6f127ebBertrand SIMONNET 1376b8629a6490d01196368ae1ed5bc6967c6f127ebBertrand SIMONNET const String16 name(kMetricsServiceName); 1386b8629a6490d01196368ae1ed5bc6967c6f127ebBertrand SIMONNET metricsd_proxy_ = android::interface_cast<IMetricsd>( 1396b8629a6490d01196368ae1ed5bc6967c6f127ebBertrand SIMONNET android::defaultServiceManager()->checkService(name)); 1406b8629a6490d01196368ae1ed5bc6967c6f127ebBertrand SIMONNET return metricsd_proxy_.get(); 1416b8629a6490d01196368ae1ed5bc6967c6f127ebBertrand SIMONNET} 1426b8629a6490d01196368ae1ed5bc6967c6f127ebBertrand SIMONNET 1434c5daa47942e4d891c74ac56417dd815b25e6e3dKen Mixterbool MetricsLibrary::AreMetricsEnabled() { 14470b7abd84fc7b101d46a3f01d543b3fb3a9c268aJulian Pastarmov static struct stat stat_buffer; 14514595032aa4781d430caff2eed02b9ce74132749Alex Vakulenko time_t this_check_time = time(nullptr); 146a5b40d077fec4d9e379cc3ef20a2b5a9d36b71c3Bertrand SIMONNET if (!use_caching_ || this_check_time != cached_enabled_time_) { 1474c5daa47942e4d891c74ac56417dd815b25e6e3dKen Mixter cached_enabled_time_ = this_check_time; 1482765d0abccd0c754422332d114cdecc271888e2dBertrand SIMONNET cached_enabled_ = stat(consent_file_.value().data(), &stat_buffer) >= 0; 1494c5daa47942e4d891c74ac56417dd815b25e6e3dKen Mixter } 1504c5daa47942e4d891c74ac56417dd815b25e6e3dKen Mixter return cached_enabled_; 1514c5daa47942e4d891c74ac56417dd815b25e6e3dKen Mixter} 15211b8eb3cf14564630c8efd20d52d42796cf3cb0eDarin Petkov 153fc91b42a5e9b2813f9614fbcd3b5fe97a6a01781Darin Petkovvoid MetricsLibrary::Init() { 1549d3a4aeae2bd59ebe72fca44c4fa508c1e9f1333Bertrand SIMONNET base::FilePath dir = base::FilePath(metrics::kSharedMetricsDirectory); 1552765d0abccd0c754422332d114cdecc271888e2dBertrand SIMONNET consent_file_ = dir.Append(metrics::kConsentFileName); 1563598d951a6c7fade22b50c0af8b51e28c62fc1eaBertrand SIMONNET cached_enabled_ = false; 1573598d951a6c7fade22b50c0af8b51e28c62fc1eaBertrand SIMONNET cached_enabled_time_ = 0; 158a5b40d077fec4d9e379cc3ef20a2b5a9d36b71c3Bertrand SIMONNET use_caching_ = true; 159a5b40d077fec4d9e379cc3ef20a2b5a9d36b71c3Bertrand SIMONNET} 160a5b40d077fec4d9e379cc3ef20a2b5a9d36b71c3Bertrand SIMONNET 161a5b40d077fec4d9e379cc3ef20a2b5a9d36b71c3Bertrand SIMONNETvoid MetricsLibrary::InitWithNoCaching() { 162a5b40d077fec4d9e379cc3ef20a2b5a9d36b71c3Bertrand SIMONNET Init(); 163a5b40d077fec4d9e379cc3ef20a2b5a9d36b71c3Bertrand SIMONNET use_caching_ = false; 164fc91b42a5e9b2813f9614fbcd3b5fe97a6a01781Darin Petkov} 165fc91b42a5e9b2813f9614fbcd3b5fe97a6a01781Darin Petkov 1662765d0abccd0c754422332d114cdecc271888e2dBertrand SIMONNETvoid MetricsLibrary::InitForTest(const base::FilePath& metrics_directory) { 1672765d0abccd0c754422332d114cdecc271888e2dBertrand SIMONNET consent_file_ = metrics_directory.Append(metrics::kConsentFileName); 1683598d951a6c7fade22b50c0af8b51e28c62fc1eaBertrand SIMONNET cached_enabled_ = false; 1693598d951a6c7fade22b50c0af8b51e28c62fc1eaBertrand SIMONNET cached_enabled_time_ = 0; 170a5b40d077fec4d9e379cc3ef20a2b5a9d36b71c3Bertrand SIMONNET use_caching_ = true; 1711253186728abd35d7177008598627e7b872974e5Bertrand SIMONNET} 1721253186728abd35d7177008598627e7b872974e5Bertrand SIMONNET 1736b8629a6490d01196368ae1ed5bc6967c6f127ebBertrand SIMONNETbool MetricsLibrary::SendToUMA( 1746b8629a6490d01196368ae1ed5bc6967c6f127ebBertrand SIMONNET const std::string& name, int sample, int min, int max, int nbuckets) { 1756b8629a6490d01196368ae1ed5bc6967c6f127ebBertrand SIMONNET return CheckService() && 1766b8629a6490d01196368ae1ed5bc6967c6f127ebBertrand SIMONNET metricsd_proxy_->recordHistogram(String16(name.c_str()), sample, min, 1776b8629a6490d01196368ae1ed5bc6967c6f127ebBertrand SIMONNET max, nbuckets) 1786b8629a6490d01196368ae1ed5bc6967c6f127ebBertrand SIMONNET .isOk(); 17965b014683927aca25d5d7e62b4bdd46e19d46bfDarin Petkov} 1805b7dce1f609ca2a56928f88bedb31142c4b2d896Darin Petkov 1816b8629a6490d01196368ae1ed5bc6967c6f127ebBertrand SIMONNETbool MetricsLibrary::SendEnumToUMA(const std::string& name, 1826b8629a6490d01196368ae1ed5bc6967c6f127ebBertrand SIMONNET int sample, 18321cd2c5a9fdbeec3cc312943cc373f8c2dce3b1fDarin Petkov int max) { 1846b8629a6490d01196368ae1ed5bc6967c6f127ebBertrand SIMONNET return CheckService() && 1856b8629a6490d01196368ae1ed5bc6967c6f127ebBertrand SIMONNET metricsd_proxy_->recordLinearHistogram(String16(name.c_str()), sample, 1866b8629a6490d01196368ae1ed5bc6967c6f127ebBertrand SIMONNET max) 1876b8629a6490d01196368ae1ed5bc6967c6f127ebBertrand SIMONNET .isOk(); 188ed82485c3be8fcab94cfb312c771b28896c4f30eDarin Petkov} 189ed82485c3be8fcab94cfb312c771b28896c4f30eDarin Petkov 190adc1c235378f6d80a5c11d5a1197524d5cd0bf51Nathan Bullockbool MetricsLibrary::SendBoolToUMA(const std::string& name, bool sample) { 1916b8629a6490d01196368ae1ed5bc6967c6f127ebBertrand SIMONNET return CheckService() && 1926b8629a6490d01196368ae1ed5bc6967c6f127ebBertrand SIMONNET metricsd_proxy_->recordLinearHistogram(String16(name.c_str()), 1936b8629a6490d01196368ae1ed5bc6967c6f127ebBertrand SIMONNET sample ? 1 : 0, 2) 1946b8629a6490d01196368ae1ed5bc6967c6f127ebBertrand SIMONNET .isOk(); 195adc1c235378f6d80a5c11d5a1197524d5cd0bf51Nathan Bullock} 196adc1c235378f6d80a5c11d5a1197524d5cd0bf51Nathan Bullock 197a7ebeb3e8b2659e616b77989e4c8964d5188a8ecLuigi Semenzatobool MetricsLibrary::SendSparseToUMA(const std::string& name, int sample) { 1986b8629a6490d01196368ae1ed5bc6967c6f127ebBertrand SIMONNET return CheckService() && 1996b8629a6490d01196368ae1ed5bc6967c6f127ebBertrand SIMONNET metricsd_proxy_->recordSparseHistogram(String16(name.c_str()), sample) 2006b8629a6490d01196368ae1ed5bc6967c6f127ebBertrand SIMONNET .isOk(); 201a7ebeb3e8b2659e616b77989e4c8964d5188a8ecLuigi Semenzato} 202a7ebeb3e8b2659e616b77989e4c8964d5188a8ecLuigi Semenzato 2036b8629a6490d01196368ae1ed5bc6967c6f127ebBertrand SIMONNETbool MetricsLibrary::SendCrashToUMA(const char* crash_kind) { 2046b8629a6490d01196368ae1ed5bc6967c6f127ebBertrand SIMONNET return CheckService() && 2056b8629a6490d01196368ae1ed5bc6967c6f127ebBertrand SIMONNET metricsd_proxy_->recordCrash(String16(crash_kind)).isOk(); 206be2e13b32b9d079bed76019a63ff89bfb7a94f35Ken Mixter} 207b2f170970ebea7d7b6200761a5243224af536874Ken Mixter 208326842224051fd332b60c8039b7a43aa95f52120Luigi Semenzatobool MetricsLibrary::SendCrosEventToUMA(const std::string& event) { 209788d3b63656d26938c9ea005e1bc82f230aa9b38Alex Vakulenko for (size_t i = 0; i < arraysize(kCrosEventNames); i++) { 2106844c06107726d45c76456c5e8fefe59a123fe79Chih-Chung Chang if (strcmp(event.c_str(), kCrosEventNames[i]) == 0) { 2116844c06107726d45c76456c5e8fefe59a123fe79Chih-Chung Chang return SendEnumToUMA(kCrosEventHistogramName, i, kCrosEventHistogramMax); 2126844c06107726d45c76456c5e8fefe59a123fe79Chih-Chung Chang } 213326842224051fd332b60c8039b7a43aa95f52120Luigi Semenzato } 2146844c06107726d45c76456c5e8fefe59a123fe79Chih-Chung Chang return false; 215326842224051fd332b60c8039b7a43aa95f52120Luigi Semenzato} 216b13527d14eacf6fbed4e5f7be8245755279c203eBertrand SIMONNET 217b13527d14eacf6fbed4e5f7be8245755279c203eBertrand SIMONNETbool MetricsLibrary::GetHistogramsDump(std::string* dump) { 218b13527d14eacf6fbed4e5f7be8245755279c203eBertrand SIMONNET android::String16 temp_dump; 219b13527d14eacf6fbed4e5f7be8245755279c203eBertrand SIMONNET if (!CheckService() || 220b13527d14eacf6fbed4e5f7be8245755279c203eBertrand SIMONNET !metricsd_proxy_->getHistogramsDump(&temp_dump).isOk()) { 221b13527d14eacf6fbed4e5f7be8245755279c203eBertrand SIMONNET return false; 222b13527d14eacf6fbed4e5f7be8245755279c203eBertrand SIMONNET } 223b13527d14eacf6fbed4e5f7be8245755279c203eBertrand SIMONNET 224b13527d14eacf6fbed4e5f7be8245755279c203eBertrand SIMONNET *dump = android::String8(temp_dump).string(); 225b13527d14eacf6fbed4e5f7be8245755279c203eBertrand SIMONNET return true; 226b13527d14eacf6fbed4e5f7be8245755279c203eBertrand SIMONNET} 227