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