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