1 /*
2  * Copyright 2015 MongoDB, Inc.
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 #ifndef MONGOC_APM_H
18 #define MONGOC_APM_H
19 
20 #if !defined(MONGOC_INSIDE) && !defined(MONGOC_COMPILATION)
21 #error "Only <mongoc.h> can be included directly."
22 #endif
23 
24 #include <bson.h>
25 
26 #include "mongoc-macros.h"
27 #include "mongoc-host-list.h"
28 #include "mongoc-server-description.h"
29 #include "mongoc-topology-description.h"
30 
31 BSON_BEGIN_DECLS
32 
33 /*
34  * Application Performance Management (APM) interface, complies with two specs.
35  * MongoDB's Command Monitoring Spec:
36  *
37  * https://github.com/mongodb/specifications/tree/master/source/command-monitoring
38  *
39  * MongoDB's Spec for Monitoring Server Discovery and Monitoring (SDAM) events:
40  *
41  * https://github.com/mongodb/specifications/tree/master/source/server-discovery-and-monitoring
42  *
43  */
44 
45 /*
46  * callbacks to receive APM events
47  */
48 
49 typedef struct _mongoc_apm_callbacks_t mongoc_apm_callbacks_t;
50 
51 
52 /*
53  * command monitoring events
54  */
55 
56 typedef struct _mongoc_apm_command_started_t mongoc_apm_command_started_t;
57 typedef struct _mongoc_apm_command_succeeded_t mongoc_apm_command_succeeded_t;
58 typedef struct _mongoc_apm_command_failed_t mongoc_apm_command_failed_t;
59 
60 
61 /*
62  * SDAM monitoring events
63  */
64 
65 typedef struct _mongoc_apm_server_changed_t mongoc_apm_server_changed_t;
66 typedef struct _mongoc_apm_server_opening_t mongoc_apm_server_opening_t;
67 typedef struct _mongoc_apm_server_closed_t mongoc_apm_server_closed_t;
68 typedef struct _mongoc_apm_topology_changed_t mongoc_apm_topology_changed_t;
69 typedef struct _mongoc_apm_topology_opening_t mongoc_apm_topology_opening_t;
70 typedef struct _mongoc_apm_topology_closed_t mongoc_apm_topology_closed_t;
71 typedef struct _mongoc_apm_server_heartbeat_started_t
72    mongoc_apm_server_heartbeat_started_t;
73 typedef struct _mongoc_apm_server_heartbeat_succeeded_t
74    mongoc_apm_server_heartbeat_succeeded_t;
75 typedef struct _mongoc_apm_server_heartbeat_failed_t
76    mongoc_apm_server_heartbeat_failed_t;
77 
78 /*
79  * event field accessors
80  */
81 
82 /* command-started event fields */
83 
84 MONGOC_EXPORT (const bson_t *)
85 mongoc_apm_command_started_get_command (
86    const mongoc_apm_command_started_t *event);
87 MONGOC_EXPORT (const char *)
88 mongoc_apm_command_started_get_database_name (
89    const mongoc_apm_command_started_t *event);
90 MONGOC_EXPORT (const char *)
91 mongoc_apm_command_started_get_command_name (
92    const mongoc_apm_command_started_t *event);
93 MONGOC_EXPORT (int64_t)
94 mongoc_apm_command_started_get_request_id (
95    const mongoc_apm_command_started_t *event);
96 MONGOC_EXPORT (int64_t)
97 mongoc_apm_command_started_get_operation_id (
98    const mongoc_apm_command_started_t *event);
99 MONGOC_EXPORT (const mongoc_host_list_t *)
100 mongoc_apm_command_started_get_host (const mongoc_apm_command_started_t *event);
101 MONGOC_EXPORT (uint32_t)
102 mongoc_apm_command_started_get_server_id (
103    const mongoc_apm_command_started_t *event);
104 MONGOC_EXPORT (void *)
105 mongoc_apm_command_started_get_context (
106    const mongoc_apm_command_started_t *event);
107 
108 /* command-succeeded event fields */
109 
110 MONGOC_EXPORT (int64_t)
111 mongoc_apm_command_succeeded_get_duration (
112    const mongoc_apm_command_succeeded_t *event);
113 MONGOC_EXPORT (const bson_t *)
114 mongoc_apm_command_succeeded_get_reply (
115    const mongoc_apm_command_succeeded_t *event);
116 MONGOC_EXPORT (const char *)
117 mongoc_apm_command_succeeded_get_command_name (
118    const mongoc_apm_command_succeeded_t *event);
119 MONGOC_EXPORT (int64_t)
120 mongoc_apm_command_succeeded_get_request_id (
121    const mongoc_apm_command_succeeded_t *event);
122 MONGOC_EXPORT (int64_t)
123 mongoc_apm_command_succeeded_get_operation_id (
124    const mongoc_apm_command_succeeded_t *event);
125 MONGOC_EXPORT (const mongoc_host_list_t *)
126 mongoc_apm_command_succeeded_get_host (
127    const mongoc_apm_command_succeeded_t *event);
128 MONGOC_EXPORT (uint32_t)
129 mongoc_apm_command_succeeded_get_server_id (
130    const mongoc_apm_command_succeeded_t *event);
131 MONGOC_EXPORT (void *)
132 mongoc_apm_command_succeeded_get_context (
133    const mongoc_apm_command_succeeded_t *event);
134 
135 /* command-failed event fields */
136 
137 MONGOC_EXPORT (int64_t)
138 mongoc_apm_command_failed_get_duration (
139    const mongoc_apm_command_failed_t *event);
140 MONGOC_EXPORT (const char *)
141 mongoc_apm_command_failed_get_command_name (
142    const mongoc_apm_command_failed_t *event);
143 /* retrieve the error by filling out the passed-in "error" struct */
144 MONGOC_EXPORT (void)
145 mongoc_apm_command_failed_get_error (const mongoc_apm_command_failed_t *event,
146                                      bson_error_t *error);
147 MONGOC_EXPORT (int64_t)
148 mongoc_apm_command_failed_get_request_id (
149    const mongoc_apm_command_failed_t *event);
150 MONGOC_EXPORT (int64_t)
151 mongoc_apm_command_failed_get_operation_id (
152    const mongoc_apm_command_failed_t *event);
153 MONGOC_EXPORT (const mongoc_host_list_t *)
154 mongoc_apm_command_failed_get_host (const mongoc_apm_command_failed_t *event);
155 MONGOC_EXPORT (uint32_t)
156 mongoc_apm_command_failed_get_server_id (
157    const mongoc_apm_command_failed_t *event);
158 MONGOC_EXPORT (void *)
159 mongoc_apm_command_failed_get_context (
160    const mongoc_apm_command_failed_t *event);
161 
162 /* server-changed event fields */
163 
164 MONGOC_EXPORT (const mongoc_host_list_t *)
165 mongoc_apm_server_changed_get_host (const mongoc_apm_server_changed_t *event);
166 MONGOC_EXPORT (void)
167 mongoc_apm_server_changed_get_topology_id (
168    const mongoc_apm_server_changed_t *event, bson_oid_t *topology_id);
169 MONGOC_EXPORT (const mongoc_server_description_t *)
170 mongoc_apm_server_changed_get_previous_description (
171    const mongoc_apm_server_changed_t *event);
172 MONGOC_EXPORT (const mongoc_server_description_t *)
173 mongoc_apm_server_changed_get_new_description (
174    const mongoc_apm_server_changed_t *event);
175 MONGOC_EXPORT (void *)
176 mongoc_apm_server_changed_get_context (
177    const mongoc_apm_server_changed_t *event);
178 
179 /* server-opening event fields */
180 
181 MONGOC_EXPORT (const mongoc_host_list_t *)
182 mongoc_apm_server_opening_get_host (const mongoc_apm_server_opening_t *event);
183 MONGOC_EXPORT (void)
184 mongoc_apm_server_opening_get_topology_id (
185    const mongoc_apm_server_opening_t *event, bson_oid_t *topology_id);
186 MONGOC_EXPORT (void *)
187 mongoc_apm_server_opening_get_context (
188    const mongoc_apm_server_opening_t *event);
189 
190 /* server-closed event fields */
191 
192 MONGOC_EXPORT (const mongoc_host_list_t *)
193 mongoc_apm_server_closed_get_host (const mongoc_apm_server_closed_t *event);
194 MONGOC_EXPORT (void)
195 mongoc_apm_server_closed_get_topology_id (
196    const mongoc_apm_server_closed_t *event, bson_oid_t *topology_id);
197 MONGOC_EXPORT (void *)
198 mongoc_apm_server_closed_get_context (const mongoc_apm_server_closed_t *event);
199 
200 /* topology-changed event fields */
201 
202 MONGOC_EXPORT (void)
203 mongoc_apm_topology_changed_get_topology_id (
204    const mongoc_apm_topology_changed_t *event, bson_oid_t *topology_id);
205 MONGOC_EXPORT (const mongoc_topology_description_t *)
206 mongoc_apm_topology_changed_get_previous_description (
207    const mongoc_apm_topology_changed_t *event);
208 MONGOC_EXPORT (const mongoc_topology_description_t *)
209 mongoc_apm_topology_changed_get_new_description (
210    const mongoc_apm_topology_changed_t *event);
211 MONGOC_EXPORT (void *)
212 mongoc_apm_topology_changed_get_context (
213    const mongoc_apm_topology_changed_t *event);
214 
215 /* topology-opening event field */
216 
217 MONGOC_EXPORT (void)
218 mongoc_apm_topology_opening_get_topology_id (
219    const mongoc_apm_topology_opening_t *event, bson_oid_t *topology_id);
220 MONGOC_EXPORT (void *)
221 mongoc_apm_topology_opening_get_context (
222    const mongoc_apm_topology_opening_t *event);
223 
224 /* topology-closed event field */
225 
226 MONGOC_EXPORT (void)
227 mongoc_apm_topology_closed_get_topology_id (
228    const mongoc_apm_topology_closed_t *event, bson_oid_t *topology_id);
229 MONGOC_EXPORT (void *)
230 mongoc_apm_topology_closed_get_context (
231    const mongoc_apm_topology_closed_t *event);
232 
233 /* heartbeat-started event field */
234 
235 MONGOC_EXPORT (const mongoc_host_list_t *)
236 mongoc_apm_server_heartbeat_started_get_host (
237    const mongoc_apm_server_heartbeat_started_t *event);
238 MONGOC_EXPORT (void *)
239 mongoc_apm_server_heartbeat_started_get_context (
240    const mongoc_apm_server_heartbeat_started_t *event);
241 
242 /* heartbeat-succeeded event fields */
243 
244 MONGOC_EXPORT (int64_t)
245 mongoc_apm_server_heartbeat_succeeded_get_duration (
246    const mongoc_apm_server_heartbeat_succeeded_t *event);
247 MONGOC_EXPORT (const bson_t *)
248 mongoc_apm_server_heartbeat_succeeded_get_reply (
249    const mongoc_apm_server_heartbeat_succeeded_t *event);
250 MONGOC_EXPORT (const mongoc_host_list_t *)
251 mongoc_apm_server_heartbeat_succeeded_get_host (
252    const mongoc_apm_server_heartbeat_succeeded_t *event);
253 MONGOC_EXPORT (void *)
254 mongoc_apm_server_heartbeat_succeeded_get_context (
255    const mongoc_apm_server_heartbeat_succeeded_t *event);
256 
257 /* heartbeat-failed event fields */
258 
259 MONGOC_EXPORT (int64_t)
260 mongoc_apm_server_heartbeat_failed_get_duration (
261    const mongoc_apm_server_heartbeat_failed_t *event);
262 MONGOC_EXPORT (void)
263 mongoc_apm_server_heartbeat_failed_get_error (
264    const mongoc_apm_server_heartbeat_failed_t *event, bson_error_t *error);
265 MONGOC_EXPORT (const mongoc_host_list_t *)
266 mongoc_apm_server_heartbeat_failed_get_host (
267    const mongoc_apm_server_heartbeat_failed_t *event);
268 MONGOC_EXPORT (void *)
269 mongoc_apm_server_heartbeat_failed_get_context (
270    const mongoc_apm_server_heartbeat_failed_t *event);
271 
272 
273 /*
274  * callbacks
275  */
276 
277 typedef void (*mongoc_apm_command_started_cb_t) (
278    const mongoc_apm_command_started_t *event);
279 typedef void (*mongoc_apm_command_succeeded_cb_t) (
280    const mongoc_apm_command_succeeded_t *event);
281 typedef void (*mongoc_apm_command_failed_cb_t) (
282    const mongoc_apm_command_failed_t *event);
283 typedef void (*mongoc_apm_server_changed_cb_t) (
284    const mongoc_apm_server_changed_t *event);
285 typedef void (*mongoc_apm_server_opening_cb_t) (
286    const mongoc_apm_server_opening_t *event);
287 typedef void (*mongoc_apm_server_closed_cb_t) (
288    const mongoc_apm_server_closed_t *event);
289 typedef void (*mongoc_apm_topology_changed_cb_t) (
290    const mongoc_apm_topology_changed_t *event);
291 typedef void (*mongoc_apm_topology_opening_cb_t) (
292    const mongoc_apm_topology_opening_t *event);
293 typedef void (*mongoc_apm_topology_closed_cb_t) (
294    const mongoc_apm_topology_closed_t *event);
295 typedef void (*mongoc_apm_server_heartbeat_started_cb_t) (
296    const mongoc_apm_server_heartbeat_started_t *event);
297 typedef void (*mongoc_apm_server_heartbeat_succeeded_cb_t) (
298    const mongoc_apm_server_heartbeat_succeeded_t *event);
299 typedef void (*mongoc_apm_server_heartbeat_failed_cb_t) (
300    const mongoc_apm_server_heartbeat_failed_t *event);
301 
302 /*
303  * registering callbacks
304  */
305 
306 MONGOC_EXPORT (mongoc_apm_callbacks_t *)
307 mongoc_apm_callbacks_new (void);
308 MONGOC_EXPORT (void)
309 mongoc_apm_callbacks_destroy (mongoc_apm_callbacks_t *callbacks);
310 MONGOC_EXPORT (void)
311 mongoc_apm_set_command_started_cb (mongoc_apm_callbacks_t *callbacks,
312                                    mongoc_apm_command_started_cb_t cb);
313 MONGOC_EXPORT (void)
314 mongoc_apm_set_command_succeeded_cb (mongoc_apm_callbacks_t *callbacks,
315                                      mongoc_apm_command_succeeded_cb_t cb);
316 MONGOC_EXPORT (void)
317 mongoc_apm_set_command_failed_cb (mongoc_apm_callbacks_t *callbacks,
318                                   mongoc_apm_command_failed_cb_t cb);
319 MONGOC_EXPORT (void)
320 mongoc_apm_set_server_changed_cb (mongoc_apm_callbacks_t *callbacks,
321                                   mongoc_apm_server_changed_cb_t cb);
322 MONGOC_EXPORT (void)
323 mongoc_apm_set_server_opening_cb (mongoc_apm_callbacks_t *callbacks,
324                                   mongoc_apm_server_opening_cb_t cb);
325 MONGOC_EXPORT (void)
326 mongoc_apm_set_server_closed_cb (mongoc_apm_callbacks_t *callbacks,
327                                  mongoc_apm_server_closed_cb_t cb);
328 MONGOC_EXPORT (void)
329 mongoc_apm_set_topology_changed_cb (mongoc_apm_callbacks_t *callbacks,
330                                     mongoc_apm_topology_changed_cb_t cb);
331 MONGOC_EXPORT (void)
332 mongoc_apm_set_topology_opening_cb (mongoc_apm_callbacks_t *callbacks,
333                                     mongoc_apm_topology_opening_cb_t cb);
334 MONGOC_EXPORT (void)
335 mongoc_apm_set_topology_closed_cb (mongoc_apm_callbacks_t *callbacks,
336                                    mongoc_apm_topology_closed_cb_t cb);
337 MONGOC_EXPORT (void)
338 mongoc_apm_set_server_heartbeat_started_cb (
339    mongoc_apm_callbacks_t *callbacks,
340    mongoc_apm_server_heartbeat_started_cb_t cb);
341 MONGOC_EXPORT (void)
342 mongoc_apm_set_server_heartbeat_succeeded_cb (
343    mongoc_apm_callbacks_t *callbacks,
344    mongoc_apm_server_heartbeat_succeeded_cb_t cb);
345 MONGOC_EXPORT (void)
346 mongoc_apm_set_server_heartbeat_failed_cb (
347    mongoc_apm_callbacks_t *callbacks,
348    mongoc_apm_server_heartbeat_failed_cb_t cb);
349 BSON_END_DECLS
350 
351 #endif /* MONGOC_APM_H */
352