12087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac/* 22087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac * Copyright (C) 2017 The Android Open Source Project 32087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac * 42087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac * Licensed under the Apache License, Version 2.0 (the "License"); 52087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac * you may not use this file except in compliance with the License. 62087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac * You may obtain a copy of the License at 72087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac * 82087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac * http://www.apache.org/licenses/LICENSE-2.0 92087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac * 102087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac * Unless required by applicable law or agreed to in writing, software 112087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac * distributed under the License is distributed on an "AS IS" BASIS, 122087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 132087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac * See the License for the specific language governing permissions and 142087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac * limitations under the License. 152087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac */ 162087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac 179def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac#include "hash.h" 182087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac#include "stats_log_util.h" 192087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac 208a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen#include <logd/LogEvent.h> 2159cc24dbfda4148c1f5ef4de9c8763caa8672443yro#include <private/android_filesystem_config.h> 228a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen#include <utils/Log.h> 232087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac#include <set> 242087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac#include <stack> 25330af58f2b8582b855085655fae553cdfaf44e6cYangster-mac#include <utils/Log.h> 26330af58f2b8582b855085655fae553cdfaf44e6cYangster-mac#include <utils/SystemClock.h> 272087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac 282087716f2bdca90c7c3034d556ac12911bd8018eYangster-macusing android::util::FIELD_COUNT_REPEATED; 292087716f2bdca90c7c3034d556ac12911bd8018eYangster-macusing android::util::FIELD_TYPE_BOOL; 302087716f2bdca90c7c3034d556ac12911bd8018eYangster-macusing android::util::FIELD_TYPE_FLOAT; 312087716f2bdca90c7c3034d556ac12911bd8018eYangster-macusing android::util::FIELD_TYPE_INT32; 322087716f2bdca90c7c3034d556ac12911bd8018eYangster-macusing android::util::FIELD_TYPE_INT64; 339def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-macusing android::util::FIELD_TYPE_UINT64; 349def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-macusing android::util::FIELD_TYPE_FIXED64; 352087716f2bdca90c7c3034d556ac12911bd8018eYangster-macusing android::util::FIELD_TYPE_MESSAGE; 362087716f2bdca90c7c3034d556ac12911bd8018eYangster-macusing android::util::FIELD_TYPE_STRING; 372087716f2bdca90c7c3034d556ac12911bd8018eYangster-macusing android::util::ProtoOutputStream; 382087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac 392087716f2bdca90c7c3034d556ac12911bd8018eYangster-macnamespace android { 402087716f2bdca90c7c3034d556ac12911bd8018eYangster-macnamespace os { 412087716f2bdca90c7c3034d556ac12911bd8018eYangster-macnamespace statsd { 422087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac 432087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac// for DimensionsValue Proto 442087716f2bdca90c7c3034d556ac12911bd8018eYangster-macconst int DIMENSIONS_VALUE_FIELD = 1; 452087716f2bdca90c7c3034d556ac12911bd8018eYangster-macconst int DIMENSIONS_VALUE_VALUE_STR = 2; 462087716f2bdca90c7c3034d556ac12911bd8018eYangster-macconst int DIMENSIONS_VALUE_VALUE_INT = 3; 472087716f2bdca90c7c3034d556ac12911bd8018eYangster-macconst int DIMENSIONS_VALUE_VALUE_LONG = 4; 484c959cb99eb7e71e5417a61f5429c5fa0073e826Yao Chen// const int DIMENSIONS_VALUE_VALUE_BOOL = 5; // logd doesn't have bool data type. 492087716f2bdca90c7c3034d556ac12911bd8018eYangster-macconst int DIMENSIONS_VALUE_VALUE_FLOAT = 6; 502087716f2bdca90c7c3034d556ac12911bd8018eYangster-macconst int DIMENSIONS_VALUE_VALUE_TUPLE = 7; 519def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-macconst int DIMENSIONS_VALUE_VALUE_STR_HASH = 8; 522087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac 538a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chenconst int DIMENSIONS_VALUE_TUPLE_VALUE = 1; 548a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen 55b038b709566c191164bd23539175df8aadeb2f94Chenjie Yu// for PulledAtomStats proto 56b038b709566c191164bd23539175df8aadeb2f94Chenjie Yuconst int FIELD_ID_PULLED_ATOM_STATS = 10; 57b038b709566c191164bd23539175df8aadeb2f94Chenjie Yuconst int FIELD_ID_PULL_ATOM_ID = 1; 58b038b709566c191164bd23539175df8aadeb2f94Chenjie Yuconst int FIELD_ID_TOTAL_PULL = 2; 59b038b709566c191164bd23539175df8aadeb2f94Chenjie Yuconst int FIELD_ID_TOTAL_PULL_FROM_CACHE = 3; 60b038b709566c191164bd23539175df8aadeb2f94Chenjie Yuconst int FIELD_ID_MIN_PULL_INTERVAL_SEC = 4; 619def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac 628a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chennamespace { 63b038b709566c191164bd23539175df8aadeb2f94Chenjie Yu 648a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chenvoid writeDimensionToProtoHelper(const std::vector<FieldValue>& dims, size_t* index, int depth, 659def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac int prefix, std::set<string> *str_set, 669def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac ProtoOutputStream* protoOutput) { 678a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen size_t count = dims.size(); 688a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen while (*index < count) { 698a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen const auto& dim = dims[*index]; 708a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen const int valueDepth = dim.mField.getDepth(); 718a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen const int valuePrefix = dim.mField.getPrefix(depth); 728a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen const int fieldNum = dim.mField.getPosAtDepth(depth); 738a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen if (valueDepth > 2) { 748a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen ALOGE("Depth > 2 not supported"); 758a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen return; 768a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen } 778a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen 788a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen if (depth == valueDepth && valuePrefix == prefix) { 795ee0787024cc446a21008ff5710dec19c6afc834Yi Jin uint64_t token = protoOutput->start(FIELD_TYPE_MESSAGE | FIELD_COUNT_REPEATED | 808a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen DIMENSIONS_VALUE_TUPLE_VALUE); 818a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen protoOutput->write(FIELD_TYPE_INT32 | DIMENSIONS_VALUE_FIELD, fieldNum); 828a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen switch (dim.mValue.getType()) { 838a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen case INT: 848a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen protoOutput->write(FIELD_TYPE_INT32 | DIMENSIONS_VALUE_VALUE_INT, 858a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen dim.mValue.int_value); 868a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen break; 878a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen case LONG: 888a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen protoOutput->write(FIELD_TYPE_INT64 | DIMENSIONS_VALUE_VALUE_LONG, 898a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen (long long)dim.mValue.long_value); 908a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen break; 918a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen case FLOAT: 928a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen protoOutput->write(FIELD_TYPE_FLOAT | DIMENSIONS_VALUE_VALUE_FLOAT, 938a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen dim.mValue.float_value); 948a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen break; 958a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen case STRING: 969def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac if (str_set == nullptr) { 979def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac protoOutput->write(FIELD_TYPE_STRING | DIMENSIONS_VALUE_VALUE_STR, 989def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac dim.mValue.str_value); 999def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac } else { 1009def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac str_set->insert(dim.mValue.str_value); 1019def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac protoOutput->write( 1029def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac FIELD_TYPE_UINT64 | DIMENSIONS_VALUE_VALUE_STR_HASH, 1039def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac (long long)Hash64(dim.mValue.str_value)); 1049def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac } 1058a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen break; 1068a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen default: 1078a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen break; 1082087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac } 1098a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen if (token != 0) { 1108a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen protoOutput->end(token); 1118a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen } 1128a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen (*index)++; 1138a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen } else if (valueDepth > depth && valuePrefix == prefix) { 1148a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen // Writing the sub tree 1155ee0787024cc446a21008ff5710dec19c6afc834Yi Jin uint64_t dimensionToken = protoOutput->start( 1168a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen FIELD_TYPE_MESSAGE | FIELD_COUNT_REPEATED | DIMENSIONS_VALUE_TUPLE_VALUE); 1178a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen protoOutput->write(FIELD_TYPE_INT32 | DIMENSIONS_VALUE_FIELD, fieldNum); 1185ee0787024cc446a21008ff5710dec19c6afc834Yi Jin uint64_t tupleToken = 1198a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen protoOutput->start(FIELD_TYPE_MESSAGE | DIMENSIONS_VALUE_VALUE_TUPLE); 1208a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen writeDimensionToProtoHelper(dims, index, valueDepth, dim.mField.getPrefix(valueDepth), 1219def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac str_set, protoOutput); 1229def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac protoOutput->end(tupleToken); 1239def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac protoOutput->end(dimensionToken); 1249def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac } else { 1259def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac // Done with the prev sub tree 1269def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac return; 1279def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac } 1289def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac } 1299def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac} 1309def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac 1319def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-macvoid writeDimensionLeafToProtoHelper(const std::vector<FieldValue>& dims, 1329def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac const int dimensionLeafField, 1339def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac size_t* index, int depth, 1349def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac int prefix, std::set<string> *str_set, 1359def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac ProtoOutputStream* protoOutput) { 1369def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac size_t count = dims.size(); 1379def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac while (*index < count) { 1389def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac const auto& dim = dims[*index]; 1399def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac const int valueDepth = dim.mField.getDepth(); 1409def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac const int valuePrefix = dim.mField.getPrefix(depth); 1419def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac if (valueDepth > 2) { 1429def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac ALOGE("Depth > 2 not supported"); 1439def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac return; 1449def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac } 1459def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac 1469def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac if (depth == valueDepth && valuePrefix == prefix) { 1479def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac uint64_t token = protoOutput->start(FIELD_TYPE_MESSAGE | FIELD_COUNT_REPEATED | 1489def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac dimensionLeafField); 1499def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac switch (dim.mValue.getType()) { 1509def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac case INT: 1519def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac protoOutput->write(FIELD_TYPE_INT32 | DIMENSIONS_VALUE_VALUE_INT, 1529def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac dim.mValue.int_value); 1539def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac break; 1549def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac case LONG: 1559def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac protoOutput->write(FIELD_TYPE_INT64 | DIMENSIONS_VALUE_VALUE_LONG, 1569def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac (long long)dim.mValue.long_value); 1579def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac break; 1589def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac case FLOAT: 1599def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac protoOutput->write(FIELD_TYPE_FLOAT | DIMENSIONS_VALUE_VALUE_FLOAT, 1609def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac dim.mValue.float_value); 1619def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac break; 1629def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac case STRING: 1639def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac if (str_set == nullptr) { 1649def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac protoOutput->write(FIELD_TYPE_STRING | DIMENSIONS_VALUE_VALUE_STR, 1659def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac dim.mValue.str_value); 1669def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac } else { 1679def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac str_set->insert(dim.mValue.str_value); 1689def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac protoOutput->write( 1699def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac FIELD_TYPE_UINT64 | DIMENSIONS_VALUE_VALUE_STR_HASH, 1709def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac (long long)Hash64(dim.mValue.str_value)); 1719def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac } 1729def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac break; 1739def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac default: 1749def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac break; 1759def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac } 1769def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac if (token != 0) { 1779def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac protoOutput->end(token); 1789def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac } 1799def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac (*index)++; 1809def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac } else if (valueDepth > depth && valuePrefix == prefix) { 1819def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac writeDimensionLeafToProtoHelper(dims, dimensionLeafField, 1829def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac index, valueDepth, dim.mField.getPrefix(valueDepth), 1839def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac str_set, protoOutput); 1849def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac } else { 1859def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac // Done with the prev sub tree 1869def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac return; 1879def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac } 1889def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac } 1899def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac} 1909def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac 1919def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-macvoid writeDimensionPathToProtoHelper(const std::vector<Matcher>& fieldMatchers, 1929def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac size_t* index, int depth, int prefix, 1939def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac ProtoOutputStream* protoOutput) { 1949def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac size_t count = fieldMatchers.size(); 1959def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac while (*index < count) { 1969def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac const Field& field = fieldMatchers[*index].mMatcher; 1979def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac const int valueDepth = field.getDepth(); 1989def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac const int valuePrefix = field.getPrefix(depth); 1999def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac const int fieldNum = field.getPosAtDepth(depth); 2009def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac if (valueDepth > 2) { 2019def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac ALOGE("Depth > 2 not supported"); 2029def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac return; 2039def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac } 2049def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac 2059def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac if (depth == valueDepth && valuePrefix == prefix) { 2069def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac uint64_t token = protoOutput->start(FIELD_TYPE_MESSAGE | FIELD_COUNT_REPEATED | 2079def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac DIMENSIONS_VALUE_TUPLE_VALUE); 2089def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac protoOutput->write(FIELD_TYPE_INT32 | DIMENSIONS_VALUE_FIELD, fieldNum); 2099def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac if (token != 0) { 2109def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac protoOutput->end(token); 2119def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac } 2129def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac (*index)++; 2139def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac } else if (valueDepth > depth && valuePrefix == prefix) { 2149def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac // Writing the sub tree 2159def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac uint64_t dimensionToken = protoOutput->start( 2169def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac FIELD_TYPE_MESSAGE | FIELD_COUNT_REPEATED | DIMENSIONS_VALUE_TUPLE_VALUE); 2179def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac protoOutput->write(FIELD_TYPE_INT32 | DIMENSIONS_VALUE_FIELD, fieldNum); 2189def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac uint64_t tupleToken = 2199def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac protoOutput->start(FIELD_TYPE_MESSAGE | DIMENSIONS_VALUE_VALUE_TUPLE); 2209def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac writeDimensionPathToProtoHelper(fieldMatchers, index, valueDepth, 2219def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac field.getPrefix(valueDepth), protoOutput); 2228a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen protoOutput->end(tupleToken); 2238a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen protoOutput->end(dimensionToken); 2248a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen } else { 2258a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen // Done with the prev sub tree 2268a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen return; 2278a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen } 2282087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac } 2292087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac} 2302087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac 2318a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen} // namespace 2322087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac 2339def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-macvoid writeDimensionToProto(const HashableDimensionKey& dimension, std::set<string> *str_set, 2349def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac ProtoOutputStream* protoOutput) { 2358a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen if (dimension.getValues().size() == 0) { 2369369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac return; 2379369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac } 2388a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen protoOutput->write(FIELD_TYPE_INT32 | DIMENSIONS_VALUE_FIELD, 2398a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen dimension.getValues()[0].mField.getTag()); 2405ee0787024cc446a21008ff5710dec19c6afc834Yi Jin uint64_t topToken = protoOutput->start(FIELD_TYPE_MESSAGE | DIMENSIONS_VALUE_VALUE_TUPLE); 2418a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen size_t index = 0; 2429def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac writeDimensionToProtoHelper(dimension.getValues(), &index, 0, 0, str_set, protoOutput); 2439def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac protoOutput->end(topToken); 2449def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac} 2459def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac 2469def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-macvoid writeDimensionLeafNodesToProto(const HashableDimensionKey& dimension, 2479def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac const int dimensionLeafFieldId, 2489def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac std::set<string> *str_set, 2499def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac ProtoOutputStream* protoOutput) { 2509def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac if (dimension.getValues().size() == 0) { 2519def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac return; 2529def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac } 2539def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac size_t index = 0; 2549def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac writeDimensionLeafToProtoHelper(dimension.getValues(), dimensionLeafFieldId, 2559def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac &index, 0, 0, str_set, protoOutput); 2569def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac} 2579def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac 2589def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-macvoid writeDimensionPathToProto(const std::vector<Matcher>& fieldMatchers, 2599def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac ProtoOutputStream* protoOutput) { 2609def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac if (fieldMatchers.size() == 0) { 2619def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac return; 2629def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac } 2639def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac protoOutput->write(FIELD_TYPE_INT32 | DIMENSIONS_VALUE_FIELD, 2649def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac fieldMatchers[0].mMatcher.getTag()); 2659def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac uint64_t topToken = protoOutput->start(FIELD_TYPE_MESSAGE | DIMENSIONS_VALUE_VALUE_TUPLE); 2669def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac size_t index = 0; 2679def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac writeDimensionPathToProtoHelper(fieldMatchers, &index, 0, 0, protoOutput); 2688a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen protoOutput->end(topToken); 2692087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac} 2702087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac 2718a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen// Supported Atoms format 2728a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen// XYZ_Atom { 2738a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen// repeated SubMsg field_1 = 1; 2748a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen// SubMsg2 field_2 = 2; 2758a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen// int32/float/string/int63 field_3 = 3; 2768a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen// } 2778a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen// logd's msg format, doesn't allow us to distinguish between the 2 cases below 2788a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen// Case (1): 2798a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen// Atom { 2808a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen// SubMsg { 2818a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen// int i = 1; 2828a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen// int j = 2; 2838a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen// } 2848a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen// repeated SubMsg 2858a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen// } 2868a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen// 2878a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen// and case (2): 2888a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen// Atom { 2898a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen// SubMsg { 2908a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen// repeated int i = 1; 2918a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen// repeated int j = 2; 2928a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen// } 2938a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen// optional SubMsg = 1; 2948a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen// } 2958a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen// 2968a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen// 2978a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chenvoid writeFieldValueTreeToStreamHelper(const std::vector<FieldValue>& dims, size_t* index, 2988a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen int depth, int prefix, ProtoOutputStream* protoOutput) { 2998a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen size_t count = dims.size(); 3008a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen while (*index < count) { 3018a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen const auto& dim = dims[*index]; 3028a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen const int valueDepth = dim.mField.getDepth(); 3038a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen const int valuePrefix = dim.mField.getPrefix(depth); 3048a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen const int fieldNum = dim.mField.getPosAtDepth(depth); 3058a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen if (valueDepth > 2) { 3068a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen ALOGE("Depth > 2 not supported"); 3078a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen return; 3082087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac } 3092087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac 3108a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen if (depth == valueDepth && valuePrefix == prefix) { 3118a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen switch (dim.mValue.getType()) { 3128a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen case INT: 3138a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen protoOutput->write(FIELD_TYPE_INT32 | fieldNum, dim.mValue.int_value); 3148a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen break; 3158a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen case LONG: 3168a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen protoOutput->write(FIELD_TYPE_INT64 | fieldNum, 3178a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen (long long)dim.mValue.long_value); 3188a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen break; 3198a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen case FLOAT: 3208a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen protoOutput->write(FIELD_TYPE_FLOAT | fieldNum, dim.mValue.float_value); 3218a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen break; 3228a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen case STRING: 3238a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen protoOutput->write(FIELD_TYPE_STRING | fieldNum, dim.mValue.str_value); 3248a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen break; 325f520492279ce5c0a029c36b5251031a66f1413fbYangster-mac default: 326f520492279ce5c0a029c36b5251031a66f1413fbYangster-mac break; 3272087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac } 3288a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen (*index)++; 3298a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen } else if (valueDepth > depth && valuePrefix == prefix) { 3308a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen // Writing the sub tree 3315ee0787024cc446a21008ff5710dec19c6afc834Yi Jin uint64_t msg_token = 0ULL; 3328a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen if (valueDepth == depth + 2) { 3338a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen msg_token = 3348a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen protoOutput->start(FIELD_TYPE_MESSAGE | FIELD_COUNT_REPEATED | fieldNum); 3358a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen } else if (valueDepth == depth + 1) { 3368a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen msg_token = protoOutput->start(FIELD_TYPE_MESSAGE | fieldNum); 3372087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac } 3388a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen // Directly jump to the leaf value because the repeated position field is implied 3398a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen // by the position of the sub msg in the parent field. 3408a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen writeFieldValueTreeToStreamHelper(dims, index, valueDepth, 3418a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen dim.mField.getPrefix(valueDepth), protoOutput); 3428a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen if (msg_token != 0) { 3438a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen protoOutput->end(msg_token); 3442087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac } 3458a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen } else { 3468a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen // Done with the prev sub tree 3478a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen return; 3482087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac } 3492087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac } 3508a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen} 3512087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac 3528a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chenvoid writeFieldValueTreeToStream(int tagId, const std::vector<FieldValue>& values, 3538a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen util::ProtoOutputStream* protoOutput) { 3545ee0787024cc446a21008ff5710dec19c6afc834Yi Jin uint64_t atomToken = protoOutput->start(FIELD_TYPE_MESSAGE | tagId); 3558a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen 3568a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen size_t index = 0; 3578a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen writeFieldValueTreeToStreamHelper(values, &index, 0, 0, protoOutput); 3588a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen protoOutput->end(atomToken); 359b814481ad1f8d0e429d799b1571a6272e1a7f6c5Yangster-mac} 3602087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac 36159cc24dbfda4148c1f5ef4de9c8763caa8672443yroint64_t TimeUnitToBucketSizeInMillisGuardrailed(int uid, TimeUnit unit) { 36259cc24dbfda4148c1f5ef4de9c8763caa8672443yro int64_t bucketSizeMillis = TimeUnitToBucketSizeInMillis(unit); 3631a0a941c20eb746868d0de52e3806f69c74d335fChenjie Yu if (bucketSizeMillis > 1000 && bucketSizeMillis < 5 * 60 * 1000LL && uid != AID_SHELL && 3641a0a941c20eb746868d0de52e3806f69c74d335fChenjie Yu uid != AID_ROOT) { 36559cc24dbfda4148c1f5ef4de9c8763caa8672443yro bucketSizeMillis = 5 * 60 * 1000LL; 36659cc24dbfda4148c1f5ef4de9c8763caa8672443yro } 36759cc24dbfda4148c1f5ef4de9c8763caa8672443yro return bucketSizeMillis; 36859cc24dbfda4148c1f5ef4de9c8763caa8672443yro} 36959cc24dbfda4148c1f5ef4de9c8763caa8672443yro 370b814481ad1f8d0e429d799b1571a6272e1a7f6c5Yangster-macint64_t TimeUnitToBucketSizeInMillis(TimeUnit unit) { 371b814481ad1f8d0e429d799b1571a6272e1a7f6c5Yangster-mac switch (unit) { 372b814481ad1f8d0e429d799b1571a6272e1a7f6c5Yangster-mac case ONE_MINUTE: 373b814481ad1f8d0e429d799b1571a6272e1a7f6c5Yangster-mac return 60 * 1000LL; 374b814481ad1f8d0e429d799b1571a6272e1a7f6c5Yangster-mac case FIVE_MINUTES: 375b814481ad1f8d0e429d799b1571a6272e1a7f6c5Yangster-mac return 5 * 60 * 1000LL; 376b814481ad1f8d0e429d799b1571a6272e1a7f6c5Yangster-mac case TEN_MINUTES: 377b814481ad1f8d0e429d799b1571a6272e1a7f6c5Yangster-mac return 10 * 60 * 1000LL; 378b814481ad1f8d0e429d799b1571a6272e1a7f6c5Yangster-mac case THIRTY_MINUTES: 379b814481ad1f8d0e429d799b1571a6272e1a7f6c5Yangster-mac return 30 * 60 * 1000LL; 380b814481ad1f8d0e429d799b1571a6272e1a7f6c5Yangster-mac case ONE_HOUR: 381b814481ad1f8d0e429d799b1571a6272e1a7f6c5Yangster-mac return 60 * 60 * 1000LL; 382b814481ad1f8d0e429d799b1571a6272e1a7f6c5Yangster-mac case THREE_HOURS: 383b814481ad1f8d0e429d799b1571a6272e1a7f6c5Yangster-mac return 3 * 60 * 60 * 1000LL; 384b814481ad1f8d0e429d799b1571a6272e1a7f6c5Yangster-mac case SIX_HOURS: 385b814481ad1f8d0e429d799b1571a6272e1a7f6c5Yangster-mac return 6 * 60 * 60 * 1000LL; 386b814481ad1f8d0e429d799b1571a6272e1a7f6c5Yangster-mac case TWELVE_HOURS: 387b814481ad1f8d0e429d799b1571a6272e1a7f6c5Yangster-mac return 12 * 60 * 60 * 1000LL; 388b814481ad1f8d0e429d799b1571a6272e1a7f6c5Yangster-mac case ONE_DAY: 389b814481ad1f8d0e429d799b1571a6272e1a7f6c5Yangster-mac return 24 * 60 * 60 * 1000LL; 390b814481ad1f8d0e429d799b1571a6272e1a7f6c5Yangster-mac case CTS: 391b814481ad1f8d0e429d799b1571a6272e1a7f6c5Yangster-mac return 1000; 392b814481ad1f8d0e429d799b1571a6272e1a7f6c5Yangster-mac case TIME_UNIT_UNSPECIFIED: 393b814481ad1f8d0e429d799b1571a6272e1a7f6c5Yangster-mac default: 394b814481ad1f8d0e429d799b1571a6272e1a7f6c5Yangster-mac return -1; 395b814481ad1f8d0e429d799b1571a6272e1a7f6c5Yangster-mac } 3962087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac} 3972087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac 398b038b709566c191164bd23539175df8aadeb2f94Chenjie Yuvoid writePullerStatsToStream(const std::pair<int, StatsdStats::PulledAtomStats>& pair, 399b038b709566c191164bd23539175df8aadeb2f94Chenjie Yu util::ProtoOutputStream* protoOutput) { 4005ee0787024cc446a21008ff5710dec19c6afc834Yi Jin uint64_t token = protoOutput->start(FIELD_TYPE_MESSAGE | FIELD_ID_PULLED_ATOM_STATS | 401b038b709566c191164bd23539175df8aadeb2f94Chenjie Yu FIELD_COUNT_REPEATED); 402b038b709566c191164bd23539175df8aadeb2f94Chenjie Yu protoOutput->write(FIELD_TYPE_INT32 | FIELD_ID_PULL_ATOM_ID, (int32_t)pair.first); 403b038b709566c191164bd23539175df8aadeb2f94Chenjie Yu protoOutput->write(FIELD_TYPE_INT64 | FIELD_ID_TOTAL_PULL, (long long)pair.second.totalPull); 404b038b709566c191164bd23539175df8aadeb2f94Chenjie Yu protoOutput->write(FIELD_TYPE_INT64 | FIELD_ID_TOTAL_PULL_FROM_CACHE, 405b038b709566c191164bd23539175df8aadeb2f94Chenjie Yu (long long)pair.second.totalPullFromCache); 406b038b709566c191164bd23539175df8aadeb2f94Chenjie Yu protoOutput->write(FIELD_TYPE_INT64 | FIELD_ID_MIN_PULL_INTERVAL_SEC, 407b038b709566c191164bd23539175df8aadeb2f94Chenjie Yu (long long)pair.second.minPullIntervalSec); 408b038b709566c191164bd23539175df8aadeb2f94Chenjie Yu protoOutput->end(token); 409b038b709566c191164bd23539175df8aadeb2f94Chenjie Yu} 410b038b709566c191164bd23539175df8aadeb2f94Chenjie Yu 411330af58f2b8582b855085655fae553cdfaf44e6cYangster-macint64_t getElapsedRealtimeNs() { 412330af58f2b8582b855085655fae553cdfaf44e6cYangster-mac return ::android::elapsedRealtimeNano(); 413330af58f2b8582b855085655fae553cdfaf44e6cYangster-mac} 414330af58f2b8582b855085655fae553cdfaf44e6cYangster-mac 415330af58f2b8582b855085655fae553cdfaf44e6cYangster-macint64_t getElapsedRealtimeSec() { 416330af58f2b8582b855085655fae553cdfaf44e6cYangster-mac return ::android::elapsedRealtimeNano() / NS_PER_SEC; 417330af58f2b8582b855085655fae553cdfaf44e6cYangster-mac} 418330af58f2b8582b855085655fae553cdfaf44e6cYangster-mac 419330af58f2b8582b855085655fae553cdfaf44e6cYangster-macint64_t getElapsedRealtimeMillis() { 420330af58f2b8582b855085655fae553cdfaf44e6cYangster-mac return ::android::elapsedRealtime(); 421330af58f2b8582b855085655fae553cdfaf44e6cYangster-mac} 422330af58f2b8582b855085655fae553cdfaf44e6cYangster-mac 423330af58f2b8582b855085655fae553cdfaf44e6cYangster-macint64_t getWallClockNs() { 424330af58f2b8582b855085655fae553cdfaf44e6cYangster-mac return time(nullptr) * NS_PER_SEC; 425330af58f2b8582b855085655fae553cdfaf44e6cYangster-mac} 426330af58f2b8582b855085655fae553cdfaf44e6cYangster-mac 427330af58f2b8582b855085655fae553cdfaf44e6cYangster-macint64_t getWallClockSec() { 428330af58f2b8582b855085655fae553cdfaf44e6cYangster-mac return time(nullptr); 429330af58f2b8582b855085655fae553cdfaf44e6cYangster-mac} 430330af58f2b8582b855085655fae553cdfaf44e6cYangster-mac 431330af58f2b8582b855085655fae553cdfaf44e6cYangster-macint64_t getWallClockMillis() { 432330af58f2b8582b855085655fae553cdfaf44e6cYangster-mac return time(nullptr) * MS_PER_SEC; 433330af58f2b8582b855085655fae553cdfaf44e6cYangster-mac} 434330af58f2b8582b855085655fae553cdfaf44e6cYangster-mac 435d5c356214fabec1ad9d5d16d673f000deb49ea30Yangster-macint64_t truncateTimestampNsToFiveMinutes(int64_t timestampNs) { 436d5c356214fabec1ad9d5d16d673f000deb49ea30Yangster-mac return timestampNs / NS_PER_SEC / (5 * 60) * NS_PER_SEC * (5 * 60); 437d5c356214fabec1ad9d5d16d673f000deb49ea30Yangster-mac} 438d5c356214fabec1ad9d5d16d673f000deb49ea30Yangster-mac 4399def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-macint64_t NanoToMillis(const int64_t nano) { 4409def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac return nano / 1000000; 4419def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac} 4429def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac 4439def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-macint64_t MillisToNano(const int64_t millis) { 4449def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac return millis * 1000000; 4459def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac} 4469def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac 4472087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac} // namespace statsd 4482087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac} // namespace os 44959cc24dbfda4148c1f5ef4de9c8763caa8672443yro} // namespace android 450