blob: 111a619760df53d24cd07d4a89c81e3fdd33a5c2 [file] [log] [blame]
Joe Onoratoc4dfae52017-10-17 23:38:21 -07001/*
2 * Copyright (C) 2017 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#pragma once
18
Yao Chen8a8d16c2018-02-08 14:50:40 -080019#include "FieldValue.h"
Joe Onoratoc4dfae52017-10-17 23:38:21 -070020
Howard Roa46b6582018-09-18 16:45:02 -070021#include <android/frameworks/stats/1.0/types.h>
Chenjie Yu12e5e672018-09-14 15:54:59 -070022#include <android/os/StatsLogEventWrapper.h>
Yao Chen5110bed2017-10-23 12:50:02 -070023#include <android/util/ProtoOutputStream.h>
Joe Onoratoc4dfae52017-10-17 23:38:21 -070024#include <log/log_event_list.h>
25#include <log/log_read.h>
Yao Chen80235402017-11-13 20:42:25 -080026#include <private/android_logger.h>
Yao Chen5110bed2017-10-23 12:50:02 -070027#include <utils/Errors.h>
Joe Onoratoc4dfae52017-10-17 23:38:21 -070028
29#include <string>
30#include <vector>
31
Howard Roa46b6582018-09-18 16:45:02 -070032using namespace android::frameworks::stats::V1_0;
33
Joe Onoratoc4dfae52017-10-17 23:38:21 -070034namespace android {
35namespace os {
36namespace statsd {
37
Yao Chen9c1debe2018-02-19 14:39:19 -080038struct AttributionNodeInternal {
39 void set_uid(int32_t id) {
40 mUid = id;
41 }
42
43 void set_tag(const std::string& value) {
44 mTag = value;
45 }
46
47 int32_t uid() const {
48 return mUid;
49 }
50
51 const std::string& tag() const {
52 return mTag;
53 }
54
55 int32_t mUid;
56 std::string mTag;
57};
Chenjie Yu97dbb202019-02-13 16:42:04 -080058
59struct InstallTrainInfo {
60 int64_t trainVersionCode;
61 std::vector<uint8_t> experimentIds;
62};
Joe Onoratoc4dfae52017-10-17 23:38:21 -070063/**
64 * Wrapper for the log_msg structure.
65 */
66class LogEvent {
67public:
68 /**
69 * Read a LogEvent from a log_msg.
70 */
David Chena3bf0502017-11-01 16:57:43 -070071 explicit LogEvent(log_msg& msg);
Joe Onoratoc4dfae52017-10-17 23:38:21 -070072
Chenjie Yud7e3a222018-11-28 21:29:44 +000073 /**
74 * Creates LogEvent from StatsLogEventWrapper.
75 */
76 static void createLogEvents(const StatsLogEventWrapper& statsLogEventWrapper,
77 std::vector<std::shared_ptr<LogEvent>>& logEvents);
78
79 /**
80 * Construct one LogEvent from a StatsLogEventWrapper with the i-th work chain. -1 if no chain.
81 */
82 explicit LogEvent(const StatsLogEventWrapper& statsLogEventWrapper, int workChainIndex);
Chenjie Yu12e5e672018-09-14 15:54:59 -070083
Joe Onoratoc4dfae52017-10-17 23:38:21 -070084 /**
Yao Chen80235402017-11-13 20:42:25 -080085 * Constructs a LogEvent with synthetic data for testing. Must call init() before reading.
Joe Onoratoc4dfae52017-10-17 23:38:21 -070086 */
Yangster-mac330af582018-02-08 15:24:38 -080087 explicit LogEvent(int32_t tagId, int64_t wallClockTimestampNs, int64_t elapsedTimestampNs);
88
89 // For testing. The timestamp is used as both elapsed real time and logd timestamp.
90 explicit LogEvent(int32_t tagId, int64_t timestampNs);
David Chen1481fe12017-10-16 13:16:34 -070091
Howard Ro1a2a3992018-10-22 22:51:57 -070092 // For testing. The timestamp is used as both elapsed real time and logd timestamp.
93 explicit LogEvent(int32_t tagId, int64_t timestampNs, int32_t uid);
94
Yangster-mac48b3d622018-08-18 12:38:11 -070095 /**
96 * Constructs a KeyValuePairsAtom LogEvent from value maps.
97 */
98 explicit LogEvent(int32_t tagId, int64_t wallClockTimestampNs, int64_t elapsedTimestampNs,
99 int32_t uid,
Howard Ro4078dd42018-09-27 17:41:08 -0700100 const std::map<int32_t, int32_t>& int_map,
101 const std::map<int32_t, int64_t>& long_map,
Yangster-mac48b3d622018-08-18 12:38:11 -0700102 const std::map<int32_t, std::string>& string_map,
103 const std::map<int32_t, float>& float_map);
104
Chenjie Yu6b1667c2019-01-18 10:09:33 -0800105 // Constructs a BinaryPushStateChanged LogEvent from API call.
106 explicit LogEvent(const std::string& trainName, int64_t trainVersionCode, bool requiresStaging,
107 bool rollbackEnabled, bool requiresLowLatencyMonitor, int32_t state,
108 const std::vector<uint8_t>& experimentIds, int32_t userId);
109
Howard Roa46b6582018-09-18 16:45:02 -0700110 explicit LogEvent(int64_t wallClockTimestampNs, int64_t elapsedTimestampNs,
111 const SpeakerImpedance& speakerImpedance);
112
113 explicit LogEvent(int64_t wallClockTimestampNs, int64_t elapsedTimestampNs,
114 const HardwareFailed& hardwareFailed);
115
116 explicit LogEvent(int64_t wallClockTimestampNs, int64_t elapsedTimestampNs,
117 const PhysicalDropDetected& physicalDropDetected);
118
119 explicit LogEvent(int64_t wallClockTimestampNs, int64_t elapsedTimestampNs,
120 const ChargeCycles& chargeCycles);
121
122 explicit LogEvent(int64_t wallClockTimestampNs, int64_t elapsedTimestampNs,
123 const BatteryHealthSnapshotArgs& batteryHealthSnapshotArgs);
124
125 explicit LogEvent(int64_t wallClockTimestampNs, int64_t elapsedTimestampNs,
126 const SlowIo& slowIo);
127
128 explicit LogEvent(int64_t wallClockTimestampNs, int64_t elapsedTimestampNs,
129 const BatteryCausedShutdown& batteryCausedShutdown);
130
Maggie Whitefc1aa592018-11-28 21:55:23 -0800131 explicit LogEvent(int64_t wallClockTimestampNs, int64_t elapsedTimestampNs,
132 const UsbPortOverheatEvent& usbPortOverheatEvent);
133
Carter Hsub8fd1e92019-01-11 15:24:45 +0800134 explicit LogEvent(int64_t wallClockTimestampNs, int64_t elapsedTimestampNs,
135 const SpeechDspStat& speechDspStat);
136
Maggie White58174da2019-01-18 15:23:35 -0800137 explicit LogEvent(int64_t wallClockTimestampNs, int64_t elapsedTimestampNs,
138 const VendorAtom& vendorAtom);
139
Chenjie Yu97dbb202019-02-13 16:42:04 -0800140 explicit LogEvent(int64_t wallClockTimestampNs, int64_t elapsedTimestampNs,
141 const InstallTrainInfo& installTrainInfo);
142
Joe Onoratoc4dfae52017-10-17 23:38:21 -0700143 ~LogEvent();
144
145 /**
146 * Get the timestamp associated with this event.
147 */
Yangster-mac330af582018-02-08 15:24:38 -0800148 inline int64_t GetLogdTimestampNs() const { return mLogdTimestampNs; }
149 inline int64_t GetElapsedTimestampNs() const { return mElapsedTimestampNs; }
Joe Onoratoc4dfae52017-10-17 23:38:21 -0700150
151 /**
152 * Get the tag for this event.
153 */
Yangster-mac68985802018-01-21 10:05:09 -0800154 inline int GetTagId() const { return mTagId; }
Joe Onoratoc4dfae52017-10-17 23:38:21 -0700155
Yangster-mac68985802018-01-21 10:05:09 -0800156 inline uint32_t GetUid() const {
Yao Chend10f7b12017-12-18 12:53:50 -0800157 return mLogUid;
158 }
159
Joe Onoratoc4dfae52017-10-17 23:38:21 -0700160 /**
161 * Get the nth value, starting at 1.
162 *
163 * Returns BAD_INDEX if the index is larger than the number of elements.
164 * Returns BAD_TYPE if the index is available but the data is the wrong type.
165 */
166 int64_t GetLong(size_t key, status_t* err) const;
Chenjie Yu80f91122018-01-31 20:24:50 -0800167 int GetInt(size_t key, status_t* err) const;
Joe Onoratoc4dfae52017-10-17 23:38:21 -0700168 const char* GetString(size_t key, status_t* err) const;
169 bool GetBool(size_t key, status_t* err) const;
170 float GetFloat(size_t key, status_t* err) const;
171
172 /**
Yao Chen80235402017-11-13 20:42:25 -0800173 * Write test data to the LogEvent. This can only be used when the LogEvent is constructed
174 * using LogEvent(tagId, timestampNs). You need to call init() before you can read from it.
175 */
176 bool write(uint32_t value);
177 bool write(int32_t value);
178 bool write(uint64_t value);
179 bool write(int64_t value);
Yao Chen9c1debe2018-02-19 14:39:19 -0800180 bool write(const std::string& value);
Yao Chen80235402017-11-13 20:42:25 -0800181 bool write(float value);
Yao Chen9c1debe2018-02-19 14:39:19 -0800182 bool write(const std::vector<AttributionNodeInternal>& nodes);
183 bool write(const AttributionNodeInternal& node);
Howard Ro1a2a3992018-10-22 22:51:57 -0700184 bool writeKeyValuePairs(int32_t uid,
185 const std::map<int32_t, int32_t>& int_map,
Howard Ro4078dd42018-09-27 17:41:08 -0700186 const std::map<int32_t, int64_t>& long_map,
Yangster-mace124e422018-08-16 10:30:28 -0700187 const std::map<int32_t, std::string>& string_map,
188 const std::map<int32_t, float>& float_map);
Yao Chen80235402017-11-13 20:42:25 -0800189
190 /**
Joe Onoratoc4dfae52017-10-17 23:38:21 -0700191 * Return a string representation of this event.
192 */
Yao Chen9c1debe2018-02-19 14:39:19 -0800193 std::string ToString() const;
Joe Onoratoc4dfae52017-10-17 23:38:21 -0700194
195 /**
Yao Chen5110bed2017-10-23 12:50:02 -0700196 * Write this object to a ProtoOutputStream.
Joe Onoratoc4dfae52017-10-17 23:38:21 -0700197 */
Yao Chen5110bed2017-10-23 12:50:02 -0700198 void ToProto(android::util::ProtoOutputStream& out) const;
Joe Onoratoc4dfae52017-10-17 23:38:21 -0700199
David Chen1481fe12017-10-16 13:16:34 -0700200 /**
David Chen1481fe12017-10-16 13:16:34 -0700201 * Used with the constructor where tag is passed in. Converts the log_event_list to read mode
202 * and prepares the list for reading.
203 */
204 void init();
205
Chenjie Yua7259ab2017-12-10 08:31:05 -0800206 /**
Yangster-mac330af582018-02-08 15:24:38 -0800207 * Set elapsed timestamp if the original timestamp is missing.
Chenjie Yua7259ab2017-12-10 08:31:05 -0800208 */
Yangster-mac330af582018-02-08 15:24:38 -0800209 void setElapsedTimestampNs(int64_t timestampNs) {
210 mElapsedTimestampNs = timestampNs;
211 }
212
213 /**
214 * Set the timestamp if the original logd timestamp is missing.
215 */
216 void setLogdWallClockTimestampNs(int64_t timestampNs) {
217 mLogdTimestampNs = timestampNs;
218 }
Chenjie Yua7259ab2017-12-10 08:31:05 -0800219
Yangster-mac20877162017-12-22 17:19:39 -0800220 inline int size() const {
Yao Chen8a8d16c2018-02-08 14:50:40 -0800221 return mValues.size();
Chenjie Yud9dfda72017-12-11 17:41:20 -0800222 }
223
Yao Chen8a8d16c2018-02-08 14:50:40 -0800224 const std::vector<FieldValue>& getValues() const {
225 return mValues;
226 }
Yangster-macd40053e2018-01-09 16:29:22 -0800227
Yao Chen8a8d16c2018-02-08 14:50:40 -0800228 std::vector<FieldValue>* getMutableValues() {
229 return &mValues;
230 }
Yangster-mac20877162017-12-22 17:19:39 -0800231
Chenjie Yu0bd73db2018-12-16 07:37:04 -0800232 inline LogEvent makeCopy() {
233 return LogEvent(*this);
234 }
235
Joe Onoratoc4dfae52017-10-17 23:38:21 -0700236private:
237 /**
Chenjie Yu0bd73db2018-12-16 07:37:04 -0800238 * Only use this if copy is absolutely needed.
Joe Onoratoc4dfae52017-10-17 23:38:21 -0700239 */
Chih-Hung Hsieh3227aab2018-12-20 13:42:28 -0800240 LogEvent(const LogEvent&);
Joe Onoratoc4dfae52017-10-17 23:38:21 -0700241
242 /**
243 * Parses a log_msg into a LogEvent object.
244 */
Yao Chen80235402017-11-13 20:42:25 -0800245 void init(android_log_context context);
Joe Onoratoc4dfae52017-10-17 23:38:21 -0700246
Yao Chen8a8d16c2018-02-08 14:50:40 -0800247 // The items are naturally sorted in DFS order as we read them. this allows us to do fast
248 // matching.
249 std::vector<FieldValue> mValues;
Yao Chen80235402017-11-13 20:42:25 -0800250
Yangster-mac20877162017-12-22 17:19:39 -0800251 // This field is used when statsD wants to create log event object and write fields to it. After
252 // calling init() function, this object would be destroyed to save memory usage.
253 // When the log event is created from log msg, this field is never initiated.
Yao Chen48d75182018-01-23 09:40:48 -0800254 android_log_context mContext = NULL;
Yao Chen93fe3a32017-11-02 13:52:59 -0700255
Yangster-mac330af582018-02-08 15:24:38 -0800256 // The timestamp set by the logd.
257 int64_t mLogdTimestampNs;
258
259 // The elapsed timestamp set by statsd log writer.
260 int64_t mElapsedTimestampNs;
Yao Chen93fe3a32017-11-02 13:52:59 -0700261
Joe Onoratoc4dfae52017-10-17 23:38:21 -0700262 int mTagId;
Yao Chend10f7b12017-12-18 12:53:50 -0800263
264 uint32_t mLogUid;
Joe Onoratoc4dfae52017-10-17 23:38:21 -0700265};
266
267} // namespace statsd
268} // namespace os
269} // namespace android
270