1c4dfae56c10a1dd571baa78c750f2e68c919d74fJoe Onorato/* 2c4dfae56c10a1dd571baa78c750f2e68c919d74fJoe Onorato * Copyright (C) 2017 The Android Open Source Project 3c4dfae56c10a1dd571baa78c750f2e68c919d74fJoe Onorato * 4c4dfae56c10a1dd571baa78c750f2e68c919d74fJoe Onorato * Licensed under the Apache License, Version 2.0 (the "License"); 5c4dfae56c10a1dd571baa78c750f2e68c919d74fJoe Onorato * you may not use this file except in compliance with the License. 6c4dfae56c10a1dd571baa78c750f2e68c919d74fJoe Onorato * You may obtain a copy of the License at 7c4dfae56c10a1dd571baa78c750f2e68c919d74fJoe Onorato * 8c4dfae56c10a1dd571baa78c750f2e68c919d74fJoe Onorato * http://www.apache.org/licenses/LICENSE-2.0 9c4dfae56c10a1dd571baa78c750f2e68c919d74fJoe Onorato * 10c4dfae56c10a1dd571baa78c750f2e68c919d74fJoe Onorato * Unless required by applicable law or agreed to in writing, software 11c4dfae56c10a1dd571baa78c750f2e68c919d74fJoe Onorato * distributed under the License is distributed on an "AS IS" BASIS, 12c4dfae56c10a1dd571baa78c750f2e68c919d74fJoe Onorato * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13c4dfae56c10a1dd571baa78c750f2e68c919d74fJoe Onorato * See the License for the specific language governing permissions and 14c4dfae56c10a1dd571baa78c750f2e68c919d74fJoe Onorato * limitations under the License. 15c4dfae56c10a1dd571baa78c750f2e68c919d74fJoe Onorato */ 16c4dfae56c10a1dd571baa78c750f2e68c919d74fJoe Onorato 17484524a246ffe453f8cd89b698a279c23b0bde1fTej Singh#define DEBUG false // STOPSHIP if true 18c4dfae56c10a1dd571baa78c750f2e68c919d74fJoe Onorato#include "logd/LogEvent.h" 19c4dfae56c10a1dd571baa78c750f2e68c919d74fJoe Onorato 202087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac#include "stats_log_util.h" 21c4dfae56c10a1dd571baa78c750f2e68c919d74fJoe Onorato 22c4dfae56c10a1dd571baa78c750f2e68c919d74fJoe Onoratonamespace android { 23c4dfae56c10a1dd571baa78c750f2e68c919d74fJoe Onoratonamespace os { 24c4dfae56c10a1dd571baa78c750f2e68c919d74fJoe Onoratonamespace statsd { 25c4dfae56c10a1dd571baa78c750f2e68c919d74fJoe Onorato 2624809bdb45c28244aeaa9c1795581d685780645cyrousing namespace android::util; 279c1debe330006b2b4d5c08a55905789c57369609Yao Chenusing android::util::ProtoOutputStream; 281481fe142d36d5f0b36eeebc358d5a8aef7bf28aDavid Chenusing std::string; 299c1debe330006b2b4d5c08a55905789c57369609Yao Chenusing std::vector; 30c4dfae56c10a1dd571baa78c750f2e68c919d74fJoe Onorato 3180235403d2a80eee1c23dbe856d18194b1b93843Yao ChenLogEvent::LogEvent(log_msg& msg) { 323ca368318ae8909c861e56c7d93035ab344ca10aChenjie Yu mContext = 3380235403d2a80eee1c23dbe856d18194b1b93843Yao Chen create_android_log_parser(msg.msg() + sizeof(uint32_t), msg.len() - sizeof(uint32_t)); 34330af58f2b8582b855085655fae553cdfaf44e6cYangster-mac mLogdTimestampNs = msg.entry_v1.sec * NS_PER_SEC + msg.entry_v1.nsec; 35d10f7b1c7bdb1c66aa04148945cae9733ee4cadfYao Chen mLogUid = msg.entry_v4.uid; 363ca368318ae8909c861e56c7d93035ab344ca10aChenjie Yu init(mContext); 373ca368318ae8909c861e56c7d93035ab344ca10aChenjie Yu if (mContext) { 3848d75189ccbfc06f24f315ff5b8a1a42cf8207c5Yao Chen // android_log_destroy will set mContext to NULL 393ca368318ae8909c861e56c7d93035ab344ca10aChenjie Yu android_log_destroy(&mContext); 402087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac } 41c4dfae56c10a1dd571baa78c750f2e68c919d74fJoe Onorato} 42c4dfae56c10a1dd571baa78c750f2e68c919d74fJoe Onorato 43330af58f2b8582b855085655fae553cdfaf44e6cYangster-macLogEvent::LogEvent(int32_t tagId, int64_t wallClockTimestampNs, int64_t elapsedTimestampNs) { 44330af58f2b8582b855085655fae553cdfaf44e6cYangster-mac mLogdTimestampNs = wallClockTimestampNs; 4580235403d2a80eee1c23dbe856d18194b1b93843Yao Chen mTagId = tagId; 462087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac mLogUid = 0; 4780235403d2a80eee1c23dbe856d18194b1b93843Yao Chen mContext = create_android_logger(1937006964); // the event tag shared by all stats logs 4880235403d2a80eee1c23dbe856d18194b1b93843Yao Chen if (mContext) { 49330af58f2b8582b855085655fae553cdfaf44e6cYangster-mac android_log_write_int64(mContext, elapsedTimestampNs); 50330af58f2b8582b855085655fae553cdfaf44e6cYangster-mac android_log_write_int32(mContext, tagId); 51330af58f2b8582b855085655fae553cdfaf44e6cYangster-mac } 52330af58f2b8582b855085655fae553cdfaf44e6cYangster-mac} 53330af58f2b8582b855085655fae553cdfaf44e6cYangster-mac 54330af58f2b8582b855085655fae553cdfaf44e6cYangster-macLogEvent::LogEvent(int32_t tagId, int64_t timestampNs) { 55330af58f2b8582b855085655fae553cdfaf44e6cYangster-mac mLogdTimestampNs = timestampNs; 56330af58f2b8582b855085655fae553cdfaf44e6cYangster-mac mTagId = tagId; 57330af58f2b8582b855085655fae553cdfaf44e6cYangster-mac mLogUid = 0; 58330af58f2b8582b855085655fae553cdfaf44e6cYangster-mac mContext = create_android_logger(1937006964); // the event tag shared by all stats logs 59330af58f2b8582b855085655fae553cdfaf44e6cYangster-mac if (mContext) { 60330af58f2b8582b855085655fae553cdfaf44e6cYangster-mac android_log_write_int64(mContext, timestampNs); 6180235403d2a80eee1c23dbe856d18194b1b93843Yao Chen android_log_write_int32(mContext, tagId); 6280235403d2a80eee1c23dbe856d18194b1b93843Yao Chen } 63c4dfae56c10a1dd571baa78c750f2e68c919d74fJoe Onorato} 64c4dfae56c10a1dd571baa78c750f2e68c919d74fJoe Onorato 6580235403d2a80eee1c23dbe856d18194b1b93843Yao Chenvoid LogEvent::init() { 6680235403d2a80eee1c23dbe856d18194b1b93843Yao Chen if (mContext) { 6780235403d2a80eee1c23dbe856d18194b1b93843Yao Chen const char* buffer; 6880235403d2a80eee1c23dbe856d18194b1b93843Yao Chen size_t len = android_log_write_list_buffer(mContext, &buffer); 6980235403d2a80eee1c23dbe856d18194b1b93843Yao Chen // turns to reader mode 70c1fe6f469d7559e36c23b4137bf9efe273d9a9f1Chenjie Yu android_log_context contextForRead = create_android_log_parser(buffer, len); 71c1fe6f469d7559e36c23b4137bf9efe273d9a9f1Chenjie Yu if (contextForRead) { 72c1fe6f469d7559e36c23b4137bf9efe273d9a9f1Chenjie Yu init(contextForRead); 73c1fe6f469d7559e36c23b4137bf9efe273d9a9f1Chenjie Yu // destroy the context to save memory. 7448d75189ccbfc06f24f315ff5b8a1a42cf8207c5Yao Chen // android_log_destroy will set mContext to NULL 75c1fe6f469d7559e36c23b4137bf9efe273d9a9f1Chenjie Yu android_log_destroy(&contextForRead); 7648d75189ccbfc06f24f315ff5b8a1a42cf8207c5Yao Chen } 77c1fe6f469d7559e36c23b4137bf9efe273d9a9f1Chenjie Yu android_log_destroy(&mContext); 782087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac } 792087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac} 802087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac 812087716f2bdca90c7c3034d556ac12911bd8018eYangster-macLogEvent::~LogEvent() { 822087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac if (mContext) { 8348d75189ccbfc06f24f315ff5b8a1a42cf8207c5Yao Chen // This is for the case when LogEvent is created using the test interface 8448d75189ccbfc06f24f315ff5b8a1a42cf8207c5Yao Chen // but init() isn't called. 852087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac android_log_destroy(&mContext); 8680235403d2a80eee1c23dbe856d18194b1b93843Yao Chen } 87c4dfae56c10a1dd571baa78c750f2e68c919d74fJoe Onorato} 88c4dfae56c10a1dd571baa78c750f2e68c919d74fJoe Onorato 8980235403d2a80eee1c23dbe856d18194b1b93843Yao Chenbool LogEvent::write(int32_t value) { 9080235403d2a80eee1c23dbe856d18194b1b93843Yao Chen if (mContext) { 9180235403d2a80eee1c23dbe856d18194b1b93843Yao Chen return android_log_write_int32(mContext, value) >= 0; 9280235403d2a80eee1c23dbe856d18194b1b93843Yao Chen } 9380235403d2a80eee1c23dbe856d18194b1b93843Yao Chen return false; 9480235403d2a80eee1c23dbe856d18194b1b93843Yao Chen} 9580235403d2a80eee1c23dbe856d18194b1b93843Yao Chen 9680235403d2a80eee1c23dbe856d18194b1b93843Yao Chenbool LogEvent::write(uint32_t value) { 9780235403d2a80eee1c23dbe856d18194b1b93843Yao Chen if (mContext) { 9880235403d2a80eee1c23dbe856d18194b1b93843Yao Chen return android_log_write_int32(mContext, value) >= 0; 9980235403d2a80eee1c23dbe856d18194b1b93843Yao Chen } 10080235403d2a80eee1c23dbe856d18194b1b93843Yao Chen return false; 10180235403d2a80eee1c23dbe856d18194b1b93843Yao Chen} 10280235403d2a80eee1c23dbe856d18194b1b93843Yao Chen 103d9dfda76e0aa8b8aa4d2562a7ff4259f4500e355Chenjie Yubool LogEvent::write(int64_t value) { 104d9dfda76e0aa8b8aa4d2562a7ff4259f4500e355Chenjie Yu if (mContext) { 105d9dfda76e0aa8b8aa4d2562a7ff4259f4500e355Chenjie Yu return android_log_write_int64(mContext, value) >= 0; 106d9dfda76e0aa8b8aa4d2562a7ff4259f4500e355Chenjie Yu } 107d9dfda76e0aa8b8aa4d2562a7ff4259f4500e355Chenjie Yu return false; 108d9dfda76e0aa8b8aa4d2562a7ff4259f4500e355Chenjie Yu} 109d9dfda76e0aa8b8aa4d2562a7ff4259f4500e355Chenjie Yu 11080235403d2a80eee1c23dbe856d18194b1b93843Yao Chenbool LogEvent::write(uint64_t value) { 11180235403d2a80eee1c23dbe856d18194b1b93843Yao Chen if (mContext) { 11280235403d2a80eee1c23dbe856d18194b1b93843Yao Chen return android_log_write_int64(mContext, value) >= 0; 11380235403d2a80eee1c23dbe856d18194b1b93843Yao Chen } 11480235403d2a80eee1c23dbe856d18194b1b93843Yao Chen return false; 11580235403d2a80eee1c23dbe856d18194b1b93843Yao Chen} 11680235403d2a80eee1c23dbe856d18194b1b93843Yao Chen 11780235403d2a80eee1c23dbe856d18194b1b93843Yao Chenbool LogEvent::write(const string& value) { 11880235403d2a80eee1c23dbe856d18194b1b93843Yao Chen if (mContext) { 11980235403d2a80eee1c23dbe856d18194b1b93843Yao Chen return android_log_write_string8_len(mContext, value.c_str(), value.length()) >= 0; 12080235403d2a80eee1c23dbe856d18194b1b93843Yao Chen } 12180235403d2a80eee1c23dbe856d18194b1b93843Yao Chen return false; 12280235403d2a80eee1c23dbe856d18194b1b93843Yao Chen} 12380235403d2a80eee1c23dbe856d18194b1b93843Yao Chen 12480235403d2a80eee1c23dbe856d18194b1b93843Yao Chenbool LogEvent::write(float value) { 12580235403d2a80eee1c23dbe856d18194b1b93843Yao Chen if (mContext) { 12680235403d2a80eee1c23dbe856d18194b1b93843Yao Chen return android_log_write_float32(mContext, value) >= 0; 12780235403d2a80eee1c23dbe856d18194b1b93843Yao Chen } 12880235403d2a80eee1c23dbe856d18194b1b93843Yao Chen return false; 12980235403d2a80eee1c23dbe856d18194b1b93843Yao Chen} 13080235403d2a80eee1c23dbe856d18194b1b93843Yao Chen 1319c1debe330006b2b4d5c08a55905789c57369609Yao Chenbool LogEvent::write(const std::vector<AttributionNodeInternal>& nodes) { 13280235403d2a80eee1c23dbe856d18194b1b93843Yao Chen if (mContext) { 1332087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac if (android_log_write_list_begin(mContext) < 0) { 1342087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac return false; 1352087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac } 1362087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac for (size_t i = 0; i < nodes.size(); ++i) { 1372087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac if (!write(nodes[i])) { 1382087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac return false; 1392087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac } 1402087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac } 1412087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac if (android_log_write_list_end(mContext) < 0) { 1422087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac return false; 1432087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac } 1442087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac return true; 1452087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac } 1462087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac return false; 1472087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac} 1482087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac 1499c1debe330006b2b4d5c08a55905789c57369609Yao Chenbool LogEvent::write(const AttributionNodeInternal& node) { 1502087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac if (mContext) { 1512087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac if (android_log_write_list_begin(mContext) < 0) { 1522087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac return false; 1532087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac } 1542087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac if (android_log_write_int32(mContext, node.uid()) < 0) { 1552087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac return false; 1562087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac } 1572087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac if (android_log_write_string8(mContext, node.tag().c_str()) < 0) { 1582087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac return false; 1592087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac } 1602087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac if (android_log_write_list_end(mContext) < 0) { 1612087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac return false; 1622087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac } 1632087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac return true; 16480235403d2a80eee1c23dbe856d18194b1b93843Yao Chen } 1652087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac return false; 1661481fe142d36d5f0b36eeebc358d5a8aef7bf28aDavid Chen} 1671481fe142d36d5f0b36eeebc358d5a8aef7bf28aDavid Chen 168c4dfae56c10a1dd571baa78c750f2e68c919d74fJoe Onorato/** 169c4dfae56c10a1dd571baa78c750f2e68c919d74fJoe Onorato * The elements of each log event are stored as a vector of android_log_list_elements. 170c4dfae56c10a1dd571baa78c750f2e68c919d74fJoe Onorato * The goal is to do as little preprocessing as possible, because we read a tiny fraction 171c4dfae56c10a1dd571baa78c750f2e68c919d74fJoe Onorato * of the elements that are written to the log. 1728a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen * 1738a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen * The idea here is to read through the log items once, we get as much information we need for 1748a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen * matching as possible. Because this log will be matched against lots of matchers. 175c4dfae56c10a1dd571baa78c750f2e68c919d74fJoe Onorato */ 17680235403d2a80eee1c23dbe856d18194b1b93843Yao Chenvoid LogEvent::init(android_log_context context) { 177c4dfae56c10a1dd571baa78c750f2e68c919d74fJoe Onorato android_log_list_element elem; 17880235403d2a80eee1c23dbe856d18194b1b93843Yao Chen int i = 0; 1798a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen int depth = -1; 1808a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen int pos[] = {1, 1, 1}; 181c4dfae56c10a1dd571baa78c750f2e68c919d74fJoe Onorato do { 18280235403d2a80eee1c23dbe856d18194b1b93843Yao Chen elem = android_log_read_next(context); 183c4dfae56c10a1dd571baa78c750f2e68c919d74fJoe Onorato switch ((int)elem.type) { 184c4dfae56c10a1dd571baa78c750f2e68c919d74fJoe Onorato case EVENT_TYPE_INT: 185330af58f2b8582b855085655fae553cdfaf44e6cYangster-mac // elem at [0] is EVENT_TYPE_LIST, [1] is the timestamp, [2] is tag id. 186330af58f2b8582b855085655fae553cdfaf44e6cYangster-mac if (i == 2) { 18780235403d2a80eee1c23dbe856d18194b1b93843Yao Chen mTagId = elem.data.int32; 1882087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac } else { 1898a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen if (depth < 0 || depth > 2) { 1908a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen return; 1918a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen } 1928a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen 1938a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen mValues.push_back( 1948a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen FieldValue(Field(mTagId, pos, depth), Value((int32_t)elem.data.int32))); 1958a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen 1968a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen pos[depth]++; 19780235403d2a80eee1c23dbe856d18194b1b93843Yao Chen } 1982087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac break; 1998a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen case EVENT_TYPE_FLOAT: { 2008a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen if (depth < 0 || depth > 2) { 2018a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen ALOGE("Depth > 2. Not supported!"); 2028a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen return; 2032087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac } 2048a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen 2058a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen mValues.push_back(FieldValue(Field(mTagId, pos, depth), Value(elem.data.float32))); 2068a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen 2078a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen pos[depth]++; 2088a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen 2098a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen } break; 2108a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen case EVENT_TYPE_STRING: { 2118a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen if (depth < 0 || depth > 2) { 2128a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen ALOGE("Depth > 2. Not supported!"); 2138a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen return; 2142087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac } 2158a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen 2168a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen mValues.push_back(FieldValue(Field(mTagId, pos, depth), 2178a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen Value(string(elem.data.string, elem.len)))); 2188a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen 2198a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen pos[depth]++; 2208a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen 2218a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen } break; 2228a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen case EVENT_TYPE_LONG: { 223330af58f2b8582b855085655fae553cdfaf44e6cYangster-mac if (i == 1) { 224330af58f2b8582b855085655fae553cdfaf44e6cYangster-mac mElapsedTimestampNs = elem.data.int64; 225330af58f2b8582b855085655fae553cdfaf44e6cYangster-mac } else { 226330af58f2b8582b855085655fae553cdfaf44e6cYangster-mac if (depth < 0 || depth > 2) { 227330af58f2b8582b855085655fae553cdfaf44e6cYangster-mac ALOGE("Depth > 2. Not supported!"); 228330af58f2b8582b855085655fae553cdfaf44e6cYangster-mac return; 229330af58f2b8582b855085655fae553cdfaf44e6cYangster-mac } 230330af58f2b8582b855085655fae553cdfaf44e6cYangster-mac mValues.push_back( 231330af58f2b8582b855085655fae553cdfaf44e6cYangster-mac FieldValue(Field(mTagId, pos, depth), Value((int64_t)elem.data.int64))); 2328a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen 233330af58f2b8582b855085655fae553cdfaf44e6cYangster-mac pos[depth]++; 234330af58f2b8582b855085655fae553cdfaf44e6cYangster-mac } 2358a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen } break; 236c4dfae56c10a1dd571baa78c750f2e68c919d74fJoe Onorato case EVENT_TYPE_LIST: 2378a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen depth++; 2388a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen if (depth > 2) { 2398a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen ALOGE("Depth > 2. Not supported!"); 2408a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen return; 2412087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac } 2428a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen pos[depth] = 1; 2438a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen 244c4dfae56c10a1dd571baa78c750f2e68c919d74fJoe Onorato break; 2458a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen case EVENT_TYPE_LIST_STOP: { 2468a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen int prevDepth = depth; 2478a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen depth--; 2488a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen if (depth >= 0 && depth < 2) { 2498a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen // Now go back to decorate the previous items that are last at prevDepth. 2508a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen // So that we can later easily match them with Position=Last matchers. 2518a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen pos[prevDepth]--; 2528a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen int path = getEncodedField(pos, prevDepth, false); 253db43afcec22c11ce661decdd2b3500f2dfe2034aYao Chen for (auto it = mValues.rbegin(); it != mValues.rend(); ++it) { 254db43afcec22c11ce661decdd2b3500f2dfe2034aYao Chen if (it->mField.getDepth() >= prevDepth && 255db43afcec22c11ce661decdd2b3500f2dfe2034aYao Chen it->mField.getPath(prevDepth) == path) { 256db43afcec22c11ce661decdd2b3500f2dfe2034aYao Chen it->mField.decorateLastPos(prevDepth); 2578a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen } else { 2588a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen // Safe to break, because the items are in DFS order. 2598a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen break; 2608a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen } 2612087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac } 2628a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen pos[depth]++; 2632087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac } 264c4dfae56c10a1dd571baa78c750f2e68c919d74fJoe Onorato break; 2658a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen } 266c4dfae56c10a1dd571baa78c750f2e68c919d74fJoe Onorato case EVENT_TYPE_UNKNOWN: 267c4dfae56c10a1dd571baa78c750f2e68c919d74fJoe Onorato break; 268c4dfae56c10a1dd571baa78c750f2e68c919d74fJoe Onorato default: 269c4dfae56c10a1dd571baa78c750f2e68c919d74fJoe Onorato break; 270c4dfae56c10a1dd571baa78c750f2e68c919d74fJoe Onorato } 27180235403d2a80eee1c23dbe856d18194b1b93843Yao Chen i++; 272c4dfae56c10a1dd571baa78c750f2e68c919d74fJoe Onorato } while ((elem.type != EVENT_TYPE_UNKNOWN) && !elem.complete); 273c4dfae56c10a1dd571baa78c750f2e68c919d74fJoe Onorato} 274c4dfae56c10a1dd571baa78c750f2e68c919d74fJoe Onorato 275c4dfae56c10a1dd571baa78c750f2e68c919d74fJoe Onoratoint64_t LogEvent::GetLong(size_t key, status_t* err) const { 2768a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen // TODO: encapsulate the magical operations all in Field struct as a static function. 2778a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen int field = getSimpleField(key); 2788a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen for (const auto& value : mValues) { 2798a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen if (value.mField.getField() == field) { 280ab92a1fdcc2c56ffe6c451711c0eb35becbdd6e3Yao Chen if (value.mValue.getType() == LONG) { 281ab92a1fdcc2c56ffe6c451711c0eb35becbdd6e3Yao Chen return value.mValue.long_value; 282ab92a1fdcc2c56ffe6c451711c0eb35becbdd6e3Yao Chen } else if (value.mValue.getType() == INT) { 2838a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen return value.mValue.int_value; 2848a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen } else { 2858a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen *err = BAD_TYPE; 2868a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen return 0; 2878a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen } 2888a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen } 2898a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen if ((size_t)value.mField.getPosAtDepth(0) > key) { 2908a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen break; 2912087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac } 292c4dfae56c10a1dd571baa78c750f2e68c919d74fJoe Onorato } 2938a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen 2948a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen *err = BAD_INDEX; 2958a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen return 0; 296c4dfae56c10a1dd571baa78c750f2e68c919d74fJoe Onorato} 297c4dfae56c10a1dd571baa78c750f2e68c919d74fJoe Onorato 29880f9112aecf08845ef0b2b132d721b7ce850970fChenjie Yuint LogEvent::GetInt(size_t key, status_t* err) const { 2998a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen int field = getSimpleField(key); 3008a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen for (const auto& value : mValues) { 3018a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen if (value.mField.getField() == field) { 3028a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen if (value.mValue.getType() == INT) { 3038a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen return value.mValue.int_value; 3048a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen } else { 3058a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen *err = BAD_TYPE; 3068a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen return 0; 3078a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen } 3088a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen } 3098a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen if ((size_t)value.mField.getPosAtDepth(0) > key) { 3108a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen break; 3118a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen } 3128a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen } 3138a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen 31480f9112aecf08845ef0b2b132d721b7ce850970fChenjie Yu *err = BAD_INDEX; 31580f9112aecf08845ef0b2b132d721b7ce850970fChenjie Yu return 0; 31680f9112aecf08845ef0b2b132d721b7ce850970fChenjie Yu} 31780f9112aecf08845ef0b2b132d721b7ce850970fChenjie Yu 318c4dfae56c10a1dd571baa78c750f2e68c919d74fJoe Onoratoconst char* LogEvent::GetString(size_t key, status_t* err) const { 3198a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen int field = getSimpleField(key); 3208a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen for (const auto& value : mValues) { 3218a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen if (value.mField.getField() == field) { 3228a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen if (value.mValue.getType() == STRING) { 3238a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen return value.mValue.str_value.c_str(); 3248a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen } else { 3258a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen *err = BAD_TYPE; 3268a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen return 0; 3278a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen } 3288a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen } 3298a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen if ((size_t)value.mField.getPosAtDepth(0) > key) { 3308a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen break; 3312087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac } 332c4dfae56c10a1dd571baa78c750f2e68c919d74fJoe Onorato } 3338a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen 3348a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen *err = BAD_INDEX; 3358a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen return NULL; 336c4dfae56c10a1dd571baa78c750f2e68c919d74fJoe Onorato} 337c4dfae56c10a1dd571baa78c750f2e68c919d74fJoe Onorato 338c4dfae56c10a1dd571baa78c750f2e68c919d74fJoe Onoratobool LogEvent::GetBool(size_t key, status_t* err) const { 3398a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen int field = getSimpleField(key); 3408a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen for (const auto& value : mValues) { 3418a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen if (value.mField.getField() == field) { 3428a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen if (value.mValue.getType() == INT) { 3438a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen return value.mValue.int_value != 0; 3448a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen } else if (value.mValue.getType() == LONG) { 3458a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen return value.mValue.long_value != 0; 3468a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen } else { 3478a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen *err = BAD_TYPE; 3488a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen return false; 3498a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen } 3502087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac } 3518a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen if ((size_t)value.mField.getPosAtDepth(0) > key) { 3528a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen break; 3532087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac } 354c4dfae56c10a1dd571baa78c750f2e68c919d74fJoe Onorato } 355c4dfae56c10a1dd571baa78c750f2e68c919d74fJoe Onorato 3568a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen *err = BAD_INDEX; 3578a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen return false; 3582087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac} 3592087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac 3608a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chenfloat LogEvent::GetFloat(size_t key, status_t* err) const { 3618a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen int field = getSimpleField(key); 3628a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen for (const auto& value : mValues) { 3638a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen if (value.mField.getField() == field) { 3648a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen if (value.mValue.getType() == FLOAT) { 3658a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen return value.mValue.float_value; 3668a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen } else { 3678a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen *err = BAD_TYPE; 3688a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen return 0.0; 3698a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen } 3708a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen } 3718a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen if ((size_t)value.mField.getPosAtDepth(0) > key) { 3728a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen break; 3738a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen } 374729093df0dd7d7038ad43b16ecdb59a1404f3b50Yao Chen } 3752087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac 3768a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen *err = BAD_INDEX; 3778a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen return 0.0; 378d40053eb8bcb19c7c3b080a36714566bb4e4a748Yangster-mac} 379d40053eb8bcb19c7c3b080a36714566bb4e4a748Yangster-mac 380c4dfae56c10a1dd571baa78c750f2e68c919d74fJoe Onoratostring LogEvent::ToString() const { 38120e9e6231a1aba79b4e5ae47f3ccfb066920e60fYao Chen string result; 38220e9e6231a1aba79b4e5ae47f3ccfb066920e60fYao Chen result += StringPrintf("{ %lld %lld (%d)", (long long)mLogdTimestampNs, 38320e9e6231a1aba79b4e5ae47f3ccfb066920e60fYao Chen (long long)mElapsedTimestampNs, mTagId); 3848a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen for (const auto& value : mValues) { 38520e9e6231a1aba79b4e5ae47f3ccfb066920e60fYao Chen result += 38620e9e6231a1aba79b4e5ae47f3ccfb066920e60fYao Chen StringPrintf("%#x", value.mField.getField()) + "->" + value.mValue.toString() + " "; 387c4dfae56c10a1dd571baa78c750f2e68c919d74fJoe Onorato } 38820e9e6231a1aba79b4e5ae47f3ccfb066920e60fYao Chen result += " }"; 38920e9e6231a1aba79b4e5ae47f3ccfb066920e60fYao Chen return result; 390c4dfae56c10a1dd571baa78c750f2e68c919d74fJoe Onorato} 391c4dfae56c10a1dd571baa78c750f2e68c919d74fJoe Onorato 3922087716f2bdca90c7c3034d556ac12911bd8018eYangster-macvoid LogEvent::ToProto(ProtoOutputStream& protoOutput) const { 3938a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen writeFieldValueTreeToStream(mTagId, getValues(), &protoOutput); 394c4dfae56c10a1dd571baa78c750f2e68c919d74fJoe Onorato} 395c4dfae56c10a1dd571baa78c750f2e68c919d74fJoe Onorato 396c4dfae56c10a1dd571baa78c750f2e68c919d74fJoe Onorato} // namespace statsd 397c4dfae56c10a1dd571baa78c750f2e68c919d74fJoe Onorato} // namespace os 398c4dfae56c10a1dd571baa78c750f2e68c919d74fJoe Onorato} // namespace android 399