blob: 24d624d9d9be45641dad09885ca11ffae0239c9f [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
Yao Chen5110bed2017-10-23 12:50:02 -070021#include <android/util/ProtoOutputStream.h>
Joe Onoratoc4dfae52017-10-17 23:38:21 -070022#include <log/log_event_list.h>
23#include <log/log_read.h>
Yao Chen80235402017-11-13 20:42:25 -080024#include <private/android_logger.h>
Yao Chen5110bed2017-10-23 12:50:02 -070025#include <utils/Errors.h>
Joe Onoratoc4dfae52017-10-17 23:38:21 -070026
27#include <string>
28#include <vector>
29
30namespace android {
31namespace os {
32namespace statsd {
33
Yao Chen9c1debe2018-02-19 14:39:19 -080034struct AttributionNodeInternal {
35 void set_uid(int32_t id) {
36 mUid = id;
37 }
38
39 void set_tag(const std::string& value) {
40 mTag = value;
41 }
42
43 int32_t uid() const {
44 return mUid;
45 }
46
47 const std::string& tag() const {
48 return mTag;
49 }
50
51 int32_t mUid;
52 std::string mTag;
53};
Joe Onoratoc4dfae52017-10-17 23:38:21 -070054/**
55 * Wrapper for the log_msg structure.
56 */
57class LogEvent {
58public:
59 /**
60 * Read a LogEvent from a log_msg.
61 */
David Chena3bf0502017-11-01 16:57:43 -070062 explicit LogEvent(log_msg& msg);
Joe Onoratoc4dfae52017-10-17 23:38:21 -070063
64 /**
Yao Chen80235402017-11-13 20:42:25 -080065 * Constructs a LogEvent with synthetic data for testing. Must call init() before reading.
Joe Onoratoc4dfae52017-10-17 23:38:21 -070066 */
Yangster-mac330af582018-02-08 15:24:38 -080067 explicit LogEvent(int32_t tagId, int64_t wallClockTimestampNs, int64_t elapsedTimestampNs);
68
69 // For testing. The timestamp is used as both elapsed real time and logd timestamp.
70 explicit LogEvent(int32_t tagId, int64_t timestampNs);
David Chen1481fe12017-10-16 13:16:34 -070071
Joe Onoratoc4dfae52017-10-17 23:38:21 -070072 ~LogEvent();
73
74 /**
75 * Get the timestamp associated with this event.
76 */
Yangster-mac330af582018-02-08 15:24:38 -080077 inline int64_t GetLogdTimestampNs() const { return mLogdTimestampNs; }
78 inline int64_t GetElapsedTimestampNs() const { return mElapsedTimestampNs; }
Joe Onoratoc4dfae52017-10-17 23:38:21 -070079
80 /**
81 * Get the tag for this event.
82 */
Yangster-mac68985802018-01-21 10:05:09 -080083 inline int GetTagId() const { return mTagId; }
Joe Onoratoc4dfae52017-10-17 23:38:21 -070084
Yangster-mac68985802018-01-21 10:05:09 -080085 inline uint32_t GetUid() const {
Yao Chend10f7b12017-12-18 12:53:50 -080086 return mLogUid;
87 }
88
Joe Onoratoc4dfae52017-10-17 23:38:21 -070089 /**
90 * Get the nth value, starting at 1.
91 *
92 * Returns BAD_INDEX if the index is larger than the number of elements.
93 * Returns BAD_TYPE if the index is available but the data is the wrong type.
94 */
95 int64_t GetLong(size_t key, status_t* err) const;
Chenjie Yu80f91122018-01-31 20:24:50 -080096 int GetInt(size_t key, status_t* err) const;
Joe Onoratoc4dfae52017-10-17 23:38:21 -070097 const char* GetString(size_t key, status_t* err) const;
98 bool GetBool(size_t key, status_t* err) const;
99 float GetFloat(size_t key, status_t* err) const;
100
101 /**
Yao Chen80235402017-11-13 20:42:25 -0800102 * Write test data to the LogEvent. This can only be used when the LogEvent is constructed
103 * using LogEvent(tagId, timestampNs). You need to call init() before you can read from it.
104 */
105 bool write(uint32_t value);
106 bool write(int32_t value);
107 bool write(uint64_t value);
108 bool write(int64_t value);
Yao Chen9c1debe2018-02-19 14:39:19 -0800109 bool write(const std::string& value);
Yao Chen80235402017-11-13 20:42:25 -0800110 bool write(float value);
Yao Chen9c1debe2018-02-19 14:39:19 -0800111 bool write(const std::vector<AttributionNodeInternal>& nodes);
112 bool write(const AttributionNodeInternal& node);
Yao Chen80235402017-11-13 20:42:25 -0800113
114 /**
Joe Onoratoc4dfae52017-10-17 23:38:21 -0700115 * Return a string representation of this event.
116 */
Yao Chen9c1debe2018-02-19 14:39:19 -0800117 std::string ToString() const;
Joe Onoratoc4dfae52017-10-17 23:38:21 -0700118
119 /**
Yao Chen5110bed2017-10-23 12:50:02 -0700120 * Write this object to a ProtoOutputStream.
Joe Onoratoc4dfae52017-10-17 23:38:21 -0700121 */
Yao Chen5110bed2017-10-23 12:50:02 -0700122 void ToProto(android::util::ProtoOutputStream& out) const;
Joe Onoratoc4dfae52017-10-17 23:38:21 -0700123
David Chen1481fe12017-10-16 13:16:34 -0700124 /**
David Chen1481fe12017-10-16 13:16:34 -0700125 * Used with the constructor where tag is passed in. Converts the log_event_list to read mode
126 * and prepares the list for reading.
127 */
128 void init();
129
Chenjie Yua7259ab2017-12-10 08:31:05 -0800130 /**
Yangster-mac330af582018-02-08 15:24:38 -0800131 * Set elapsed timestamp if the original timestamp is missing.
Chenjie Yua7259ab2017-12-10 08:31:05 -0800132 */
Yangster-mac330af582018-02-08 15:24:38 -0800133 void setElapsedTimestampNs(int64_t timestampNs) {
134 mElapsedTimestampNs = timestampNs;
135 }
136
137 /**
138 * Set the timestamp if the original logd timestamp is missing.
139 */
140 void setLogdWallClockTimestampNs(int64_t timestampNs) {
141 mLogdTimestampNs = timestampNs;
142 }
Chenjie Yua7259ab2017-12-10 08:31:05 -0800143
Yangster-mac20877162017-12-22 17:19:39 -0800144 inline int size() const {
Yao Chen8a8d16c2018-02-08 14:50:40 -0800145 return mValues.size();
Chenjie Yud9dfda72017-12-11 17:41:20 -0800146 }
147
Yao Chen8a8d16c2018-02-08 14:50:40 -0800148 const std::vector<FieldValue>& getValues() const {
149 return mValues;
150 }
Yangster-macd40053e2018-01-09 16:29:22 -0800151
Yao Chen8a8d16c2018-02-08 14:50:40 -0800152 std::vector<FieldValue>* getMutableValues() {
153 return &mValues;
154 }
Yangster-mac20877162017-12-22 17:19:39 -0800155
Joe Onoratoc4dfae52017-10-17 23:38:21 -0700156private:
157 /**
158 * Don't copy, it's slower. If we really need this we can add it but let's try to
159 * avoid it.
160 */
161 explicit LogEvent(const LogEvent&);
162
163 /**
164 * Parses a log_msg into a LogEvent object.
165 */
Yao Chen80235402017-11-13 20:42:25 -0800166 void init(android_log_context context);
Joe Onoratoc4dfae52017-10-17 23:38:21 -0700167
Yao Chen8a8d16c2018-02-08 14:50:40 -0800168 // The items are naturally sorted in DFS order as we read them. this allows us to do fast
169 // matching.
170 std::vector<FieldValue> mValues;
Yao Chen80235402017-11-13 20:42:25 -0800171
Yangster-mac20877162017-12-22 17:19:39 -0800172 // This field is used when statsD wants to create log event object and write fields to it. After
173 // calling init() function, this object would be destroyed to save memory usage.
174 // When the log event is created from log msg, this field is never initiated.
Yao Chen48d75182018-01-23 09:40:48 -0800175 android_log_context mContext = NULL;
Yao Chen93fe3a32017-11-02 13:52:59 -0700176
Yangster-mac330af582018-02-08 15:24:38 -0800177 // The timestamp set by the logd.
178 int64_t mLogdTimestampNs;
179
180 // The elapsed timestamp set by statsd log writer.
181 int64_t mElapsedTimestampNs;
Yao Chen93fe3a32017-11-02 13:52:59 -0700182
Joe Onoratoc4dfae52017-10-17 23:38:21 -0700183 int mTagId;
Yao Chend10f7b12017-12-18 12:53:50 -0800184
185 uint32_t mLogUid;
Joe Onoratoc4dfae52017-10-17 23:38:21 -0700186};
187
188} // namespace statsd
189} // namespace os
190} // namespace android
191