1 /*
2 * Copyright (c) 2023-2024 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #ifndef BASE_EVENT_RAW_INCLUDE_RAW_BASE_DEF_H
17 #define BASE_EVENT_RAW_INCLUDE_RAW_BASE_DEF_H
18
19 #include <cstdarg>
20 #include <cstddef>
21 #include <cstdint>
22 #include <sstream>
23 #include <string>
24
25 namespace OHOS {
26 namespace HiviewDFX {
27 namespace EventRaw {
28 constexpr unsigned int MAX_DOMAIN_LENGTH = 16;
29 constexpr unsigned int MAX_EVENT_NAME_LENGTH = 32;
30 constexpr unsigned int MAX_ARRAY_SIZE = 100;
31
32 constexpr char BASE_INFO_KEY_DOMAIN[] = "domain_";
33 constexpr char BASE_INFO_KEY_NAME[] = "name_";
34 constexpr char BASE_INFO_KEY_TYPE[] = "type_";
35 constexpr char BASE_INFO_KEY_TIME_STAMP[] = "time_";
36 constexpr char BASE_INFO_KEY_TIME_ZONE[] = "tz_";
37 constexpr char BASE_INFO_KEY_ID[] = "id_";
38 constexpr char BASE_INFO_KEY_PID[] = "pid_";
39 constexpr char BASE_INFO_KEY_TID[] = "tid_";
40 constexpr char BASE_INFO_KEY_UID[] = "uid_";
41 constexpr char BASE_INFO_KEY_LOG[] = "log_";
42 constexpr char BASE_INFO_KEY_TRACE_ID[] = "traceid_";
43 constexpr char BASE_INFO_KEY_SPAN_ID[] = "spanid_";
44 constexpr char BASE_INFO_KEY_PARENT_SPAN_ID[] = "pspanid_";
45 constexpr char BASE_INFO_KEY_TRACE_FLAG[] = "trace_flag_";
46
47 template<typename T>
48 inline static constexpr bool isUnsignedNum = std::is_same_v<std::decay_t<T>, std::uint8_t> ||
49 std::is_same_v<std::decay_t<T>, std::uint16_t> || std::is_same_v<std::decay_t<T>, std::uint32_t> ||
50 std::is_same_v<std::decay_t<T>, uint64_t>;
51
52 template<typename T>
53 inline static constexpr bool isSignedNum = std::is_same_v<std::decay_t<T>, std::int8_t> ||
54 std::is_same_v<std::decay_t<T>, std::int16_t> || std::is_same_v<std::decay_t<T>, std::int32_t> ||
55 std::is_same_v<std::decay_t<T>, int64_t>;
56
57 template<typename T>
58 inline static constexpr bool isFloatingPointNum = std::is_same_v<std::decay_t<T>, float> ||
59 std::is_same_v<std::decay_t<T>, double>;
60
61 template<typename T>
62 inline static constexpr bool isString = std::is_same_v<std::decay_t<T>, std::string> ||
63 std::is_same_v<std::decay_t<T>, const char*>;
64
65 template<typename T>
66 inline static constexpr bool isUnsignedNumArray = std::is_same_v<std::decay_t<T>, std::vector<uint8_t>> ||
67 std::is_same_v<std::decay_t<T>, std::vector<uint16_t>> ||
68 std::is_same_v<std::decay_t<T>, std::vector<uint32_t>> || std::is_same_v<std::decay_t<T>, std::vector<uint64_t>>;
69
70 template<typename T>
71 inline static constexpr bool isSignedNumArray = std::is_same_v<std::decay_t<T>, std::vector<int8_t>> ||
72 std::is_same_v<std::decay_t<T>, std::vector<int16_t>> ||
73 std::is_same_v<std::decay_t<T>, std::vector<int32_t>> || std::is_same_v<std::decay_t<T>, std::vector<int64_t>>;
74
75 template<typename T>
76 inline static constexpr bool isFloatingPointNumArray = std::is_same_v<std::decay_t<T>, std::vector<float>> ||
77 std::is_same_v<std::decay_t<T>, std::vector<double>>;
78
79 #pragma pack(1)
80 struct HiSysEventHeader {
81 /* Event domain */
82 char domain[MAX_DOMAIN_LENGTH + 1];
83
84 /* Event name */
85 char name[MAX_EVENT_NAME_LENGTH + 1];
86
87 /* Event timestamp */
88 uint64_t timestamp;
89
90 /* Time zone */
91 uint8_t timeZone;
92
93 /* User id */
94 uint32_t uid;
95
96 /* Process id */
97 uint32_t pid;
98
99 /* Thread id */
100 uint32_t tid;
101
102 /* Event hash code*/
103 uint64_t id;
104
105 /* Event type */
106 uint8_t type : 2;
107
108 /* Trace info flag*/
109 uint8_t isTraceOpened : 1;
110
111 /* Log packing flag */
112 uint8_t log;
113 };
114
115 struct TraceInfo {
116 /* Hitrace flag */
117 uint8_t traceFlag;
118
119 /* Hitrace id */
120 uint64_t traceId;
121
122 /* Hitrace span id */
123 uint32_t spanId;
124
125 /* Hitrace parent span id */
126 uint32_t pSpanId;
127 };
128
129 struct ParamValueType {
130 /* Array flag */
131 uint8_t isArray : 1;
132
133 /* Type of parameter value */
134 uint8_t valueType : 4;
135
136 /* Byte count of parameter value */
137 uint8_t valueByteCnt : 3;
138 };
139 #pragma pack()
140
141 enum ValueType: uint8_t {
142 // Unknown value
143 UNKNOWN = 0,
144
145 // Bool value
146 BOOL,
147
148 // Int8_t value
149 INT8,
150
151 // Uint8_t value
152 UINT8,
153
154 // Int16_t value
155 INT16,
156
157 // Uint16_t value
158 UINT16,
159
160 // Int32_t value
161 INT32,
162
163 // Uint32_t value
164 UINT32,
165
166 // Int64_t value
167 INT64,
168
169 // Uint64_t value
170 UINT64,
171
172 // Float value
173 FLOAT,
174
175 // Double value
176 DOUBLE,
177
178 // String value
179 STRING,
180 };
181
182 enum EncodeType: int8_t {
183 // Varint encoding
184 VARINT = 0,
185
186 // Length delimited encoding
187 LENGTH_DELIMITED = 1,
188
189 // Reserved
190 INVALID = 4,
191 };
192
193 constexpr uint32_t POS_OF_PID_IN_HEADER = sizeof(HiSysEventHeader::domain) + sizeof(HiSysEventHeader::name)
194 + sizeof(HiSysEventHeader::timestamp) + sizeof(HiSysEventHeader::timeZone) + sizeof(HiSysEventHeader::uid);
195
196 constexpr uint32_t POS_OF_ID_IN_HEADER = POS_OF_PID_IN_HEADER + sizeof(HiSysEventHeader::pid)
197 + sizeof(HiSysEventHeader::tid);
198
199 int ParseTimeZone(const std::string& tzStr);
200 std::string ParseTimeZone(const uint8_t tzVal);
201 size_t GetValidDataMinimumByteCount();
202
203 template<typename T>
TransNumToHexStr(T num)204 std::string TransNumToHexStr(T num)
205 {
206 std::stringstream ss;
207 ss << std::hex << num;
208 return ss.str();
209 }
210 } // namespace EventRaw
211 } // namespace HiviewDFX
212 } // namespace OHOS
213
214 #endif // HIVIEW_BASE_EVENT_RAW_INCLUDE_RAW_BASE_DEF_H