1 /* Copyright (c) 2011-2018 Dovecot authors, see the included COPYING file */
2 
3 #include "lib.h"
4 #include "ioloop.h"
5 #include "mail-stats.h"
6 #include "stats-carbon.h"
7 #include "stats-settings.h"
8 #include "str.h"
9 
10 struct mail_global mail_global_stats;
11 
12 static void
mail_global_stats_sent(void * ctx)13 mail_global_stats_sent(void *ctx)
14 {
15 	struct mail_global *stats = ctx;
16 	stats_carbon_destroy(&stats->stats_send_ctx);
17 }
18 
19 static void
mail_global_stats_send(void * u0 ATTR_UNUSED)20 mail_global_stats_send(void *u0 ATTR_UNUSED)
21 {
22 	time_t ts = ioloop_time;
23 	if (*stats_settings->carbon_name != '\0' &&
24 	    *stats_settings->carbon_server != '\0') {
25 		string_t *str = t_str_new(256);
26 		const char *prefix = t_strdup_printf("dovecot.%s.global",
27 						     stats_settings->carbon_name);
28 		str_printfa(str, "%s.logins %u %"PRIdTIME_T"\r\n", prefix,
29 			    mail_global_stats.num_logins, ts);
30 		str_printfa(str, "%s.cmds %u %"PRIdTIME_T"\r\n", prefix,
31 			    mail_global_stats.num_cmds, ts);
32 		str_printfa(str, "%s.connected_sessions %u %"PRIdTIME_T"\r\n",
33 			    prefix, mail_global_stats.num_connected_sessions,
34 			    ts);
35 		str_printfa(str, "%s.last_reset %"PRIdTIME_T" %"PRIdTIME_T"\r\n",
36 			    prefix, mail_global_stats.reset_timestamp, ts);
37 		/* then export rest of the stats */
38 		for(size_t i = 0; i < stats_field_count(); i++) {
39 			str_printfa(str, "%s.%s ", prefix,
40 				    stats_field_name(i));
41 			stats_field_value(str, mail_global_stats.stats, i);
42 			str_printfa(str, " %"PRIdTIME_T"\r\n", ts);
43 		}
44 
45 		/* and send them along */
46 		(void)stats_carbon_send(stats_settings->carbon_server, str_c(str),
47 					mail_global_stats_sent, &mail_global_stats,
48 					&mail_global_stats.stats_send_ctx);
49 	}
50 }
51 
mail_global_init(void)52 void mail_global_init(void)
53 {
54 	mail_global_stats.reset_timestamp = ioloop_time;
55 	mail_global_stats.stats = stats_alloc(default_pool);
56 	mail_global_stats.to_stats_send = timeout_add(stats_settings->carbon_interval*1000,
57 						      mail_global_stats_send,
58 						      NULL);
59 }
60 
mail_global_deinit(void)61 void mail_global_deinit(void)
62 {
63 	if (mail_global_stats.stats_send_ctx != NULL)
64 		stats_carbon_destroy(&mail_global_stats.stats_send_ctx);
65 	timeout_remove(&mail_global_stats.to_stats_send);
66 	i_free(mail_global_stats.stats);
67 }
68 
mail_global_login(void)69 void mail_global_login(void)
70 {
71 	mail_global_stats.num_logins++;
72 	mail_global_stats.num_connected_sessions++;
73 }
74 
mail_global_disconnected(void)75 void mail_global_disconnected(void)
76 {
77 	i_assert(mail_global_stats.num_connected_sessions > 0);
78 	mail_global_stats.num_connected_sessions--;
79 }
80 
mail_global_refresh(const struct stats * diff_stats)81 void mail_global_refresh(const struct stats *diff_stats)
82 {
83 	if (diff_stats != NULL)
84 		stats_add(mail_global_stats.stats, diff_stats);
85 	mail_global_stats.last_update = ioloop_timeval;
86 }
87