master
h 188 lines 5.85 KB
Raw
1 // SPDX-License-Identifier: GPL-3.0-or-later
2
3 #ifndef NETDATA_ND_LOG_TO_WINDOWS_COMMON_H
4 #define NETDATA_ND_LOG_TO_WINDOWS_COMMON_H
5
6 // Helper macro to create wide string literals
7 #define WIDEN2(x) L ## x
8 #define WIDEN(x) WIDEN2(x)
9
10 #define NETDATA_ETW_PROVIDER_GUID_STR "{96c5ca72-9bd8-4634-81e5-000014e7da7a}"
11 #define NETDATA_ETW_PROVIDER_GUID_STR_W WIDEN(NETDATA_ETW_PROVIDER_GUID)
12
13 #define NETDATA_CHANNEL_NAME "Netdata"
14 #define NETDATA_CHANNEL_NAME_W WIDEN(NETDATA_CHANNEL_NAME)
15
16 #define NETDATA_WEL_CHANNEL_NAME "NetdataWEL"
17 #define NETDATA_WEL_CHANNEL_NAME_W WIDEN(NETDATA_WEL_CHANNEL_NAME)
18
19 #define NETDATA_ETW_CHANNEL_NAME "Netdata"
20 #define NETDATA_ETW_CHANNEL_NAME_W WIDEN(NETDATA_ETW_CHANNEL_NAME)
21
22 #define NETDATA_ETW_PROVIDER_NAME "Netdata"
23 #define NETDATA_ETW_PROVIDER_NAME_W WIDEN(NETDATA_ETW_PROVIDER_NAME)
24
25 #define NETDATA_WEL_PROVIDER_PREFIX "Netdata"
26 #define NETDATA_WEL_PROVIDER_PREFIX_W WIDEN(NETDATA_WEL_PROVIDER_PREFIX)
27
28 #define NETDATA_WEL_PROVIDER_ACCESS NETDATA_WEL_PROVIDER_PREFIX "Access"
29 #define NETDATA_WEL_PROVIDER_ACCESS_W WIDEN(NETDATA_WEL_PROVIDER_ACCESS)
30
31 #define NETDATA_WEL_PROVIDER_ACLK NETDATA_WEL_PROVIDER_PREFIX "Aclk"
32 #define NETDATA_WEL_PROVIDER_ACLK_W WIDEN(NETDATA_WEL_PROVIDER_ACLK)
33
34 #define NETDATA_WEL_PROVIDER_COLLECTORS NETDATA_WEL_PROVIDER_PREFIX "Collectors"
35 #define NETDATA_WEL_PROVIDER_COLLECTORS_W WIDEN(NETDATA_WEL_PROVIDER_COLLECTORS)
36
37 #define NETDATA_WEL_PROVIDER_DAEMON NETDATA_WEL_PROVIDER_PREFIX "Daemon"
38 #define NETDATA_WEL_PROVIDER_DAEMON_W WIDEN(NETDATA_WEL_PROVIDER_DAEMON)
39
40 #define NETDATA_WEL_PROVIDER_HEALTH NETDATA_WEL_PROVIDER_PREFIX "Health"
41 #define NETDATA_WEL_PROVIDER_HEALTH_W WIDEN(NETDATA_WEL_PROVIDER_HEALTH)
42
43
44 #define NETDATA_ETW_SUBCHANNEL_ACCESS "Access"
45 #define NETDATA_ETW_SUBCHANNEL_ACCESS_W WIDEN(NETDATA_ETW_SUBCHANNEL_ACCESS)
46
47 #define NETDATA_ETW_SUBCHANNEL_ACLK "Aclk"
48 #define NETDATA_ETW_SUBCHANNEL_ACLK_W WIDEN(NETDATA_ETW_SUBCHANNEL_ACLK)
49
50 #define NETDATA_ETW_SUBCHANNEL_COLLECTORS "Collectors"
51 #define NETDATA_ETW_SUBCHANNEL_COLLECTORS_W WIDEN(NETDATA_ETW_SUBCHANNEL_COLLECTORS)
52
53 #define NETDATA_ETW_SUBCHANNEL_DAEMON "Daemon"
54 #define NETDATA_ETW_SUBCHANNEL_DAEMON_W WIDEN(NETDATA_ETW_SUBCHANNEL_DAEMON)
55
56 #define NETDATA_ETW_SUBCHANNEL_HEALTH "Health"
57 #define NETDATA_ETW_SUBCHANNEL_HEALTH_W WIDEN(NETDATA_ETW_SUBCHANNEL_HEALTH)
58
59 // Define shift values
60 #define EVENT_ID_SEV_SHIFT 30
61 #define EVENT_ID_C_SHIFT 29
62 #define EVENT_ID_R_SHIFT 28
63 #define EVENT_ID_FACILITY_SHIFT 16
64 #define EVENT_ID_CODE_SHIFT 0
65
66 #define EVENT_ID_PRIORITY_SHIFT 0 // Shift 0 bits
67 #define EVENT_ID_SOURCE_SHIFT 4 // Shift 4 bits
68
69 // Define masks
70 #define EVENT_ID_SEV_MASK 0xC0000000 // Bits 31-30
71 #define EVENT_ID_C_MASK 0x20000000 // Bit 29
72 #define EVENT_ID_R_MASK 0x10000000 // Bit 28
73 #define EVENT_ID_FACILITY_MASK 0x0FFF0000 // Bits 27-16
74 #define EVENT_ID_CODE_MASK 0x0000FFFF // Bits 15-0
75
76 #define EVENT_ID_PRIORITY_MASK 0x000F // Bits 0-3
77 #define EVENT_ID_SOURCE_MASK 0x00F0 // Bits 4-7
78
79 typedef enum __attribute__((packed)) {
80 MSGID_MESSAGE_ONLY = 1,
81 MSGID_MESSAGE_ERRNO,
82 MSGID_REQUEST_ONLY,
83 MSGID_ALERT_TRANSITION,
84 MSGID_ACCESS,
85 MSGID_ACCESS_FORWARDER,
86 MSGID_ACCESS_USER,
87 MSGID_ACCESS_FORWARDER_USER,
88 MSGID_ACCESS_MESSAGE,
89 MSGID_ACCESS_MESSAGE_REQUEST,
90 MSGID_ACCESS_MESSAGE_USER,
91
92 // terminator
93 _MSGID_MAX,
94 } MESSAGE_ID;
95
96 static inline uint32_t get_event_type_from_priority(ND_LOG_FIELD_PRIORITY priority) {
97 switch (priority) {
98 case NDLP_EMERG:
99 case NDLP_ALERT:
100 case NDLP_CRIT:
101 case NDLP_ERR:
102 return EVENTLOG_ERROR_TYPE;
103
104 case NDLP_WARNING:
105 return EVENTLOG_WARNING_TYPE;
106
107 case NDLP_NOTICE:
108 case NDLP_INFO:
109 case NDLP_DEBUG:
110 default:
111 return EVENTLOG_INFORMATION_TYPE;
112 }
113 }
114
115 static inline uint8_t get_severity_from_priority(ND_LOG_FIELD_PRIORITY priority) {
116 switch (priority) {
117 case NDLP_EMERG:
118 case NDLP_ALERT:
119 case NDLP_CRIT:
120 case NDLP_ERR:
121 return STATUS_SEVERITY_ERROR;
122
123 case NDLP_WARNING:
124 return STATUS_SEVERITY_WARNING;
125
126 case NDLP_NOTICE:
127 case NDLP_INFO:
128 case NDLP_DEBUG:
129 default:
130 return STATUS_SEVERITY_INFORMATIONAL;
131 }
132 }
133
134 static inline uint8_t get_level_from_priority(ND_LOG_FIELD_PRIORITY priority) {
135 switch (priority) {
136 // return 0 = log an event regardless of any filtering applied
137
138 case NDLP_EMERG:
139 case NDLP_ALERT:
140 case NDLP_CRIT:
141 return 1;
142
143 case NDLP_ERR:
144 return 2;
145
146 case NDLP_WARNING:
147 return 3;
148
149 case NDLP_NOTICE:
150 case NDLP_INFO:
151 return 4;
152
153 case NDLP_DEBUG:
154 default:
155 return 5;
156 }
157 }
158
159 static inline const char *get_level_from_priority_str(ND_LOG_FIELD_PRIORITY priority) {
160 switch (priority) {
161 // return "win:LogAlways" to log an event regardless of any filtering applied
162
163 case NDLP_EMERG:
164 case NDLP_ALERT:
165 case NDLP_CRIT:
166 return "win:Critical";
167
168 case NDLP_ERR:
169 return "win:Error";
170
171 case NDLP_WARNING:
172 return "win:Warning";
173
174 case NDLP_NOTICE:
175 case NDLP_INFO:
176 return "win:Informational";
177
178 case NDLP_DEBUG:
179 default:
180 return "win:Verbose";
181 }
182 }
183
184 static inline uint16_t construct_event_code(ND_LOG_SOURCES source, ND_LOG_FIELD_PRIORITY priority, MESSAGE_ID messageID) {
185 return (source << 12 | priority << 8 | messageID << 0);
186 }
187
188 #endif //NETDATA_ND_LOG_TO_WINDOWS_COMMON_H