From: Julien Desfossez Date: Fri, 3 Jul 2015 21:48:27 +0000 (-0400) Subject: Display discarded and lost events at destroy and stop X-Git-Tag: v2.8.0-rc1~91 X-Git-Url: https://git.lttng.org/?p=lttng-tools.git;a=commitdiff_plain;h=20fb9e0220fe6ca9d6fd52e4e3e41b898452a8f1 Display discarded and lost events at destroy and stop Signed-off-by: Julien Desfossez Reviewed-by: Mathieu Desnoyers Signed-off-by: Jérémie Galarneau --- diff --git a/src/bin/lttng/commands/destroy.c b/src/bin/lttng/commands/destroy.c index 87231858f..ad181d7c4 100644 --- a/src/bin/lttng/commands/destroy.c +++ b/src/bin/lttng/commands/destroy.c @@ -23,6 +23,7 @@ #include #include #include +#include #include "../command.h" @@ -79,11 +80,13 @@ static int destroy_session(struct lttng_session *session) { int ret; char *session_name = NULL; + bool session_was_stopped; ret = lttng_stop_tracing_no_wait(session->name); if (ret < 0 && ret != -LTTNG_ERR_TRACE_ALREADY_STOPPED) { ERR("%s", lttng_strerror(ret)); } + session_was_stopped = ret == -LTTNG_ERR_TRACE_ALREADY_STOPPED; if (!opt_no_wait) { _MSG("Waiting for data availability"); fflush(stdout); @@ -106,6 +109,13 @@ static int destroy_session(struct lttng_session *session) } while (ret != 0); MSG(""); } + if (!session_was_stopped) { + /* + * Don't print the event and packet loss warnings since the user + * already saw them when stopping the trace. + */ + print_session_stats(session->name); + } ret = lttng_destroy_session_no_wait(session->name); if (ret < 0) { diff --git a/src/bin/lttng/commands/stop.c b/src/bin/lttng/commands/stop.c index affc3985b..b3fff0753 100644 --- a/src/bin/lttng/commands/stop.c +++ b/src/bin/lttng/commands/stop.c @@ -155,6 +155,7 @@ static int stop_tracing(void) ret = CMD_SUCCESS; + print_session_stats(session_name); MSG("Tracing stopped for session %s", session_name); if (lttng_opt_mi) { ret = mi_print_session(session_name, 0); diff --git a/src/bin/lttng/utils.c b/src/bin/lttng/utils.c index ea9108fba..802e0971b 100644 --- a/src/bin/lttng/utils.c +++ b/src/bin/lttng/utils.c @@ -25,6 +25,7 @@ #include #include #include +#include #include #include @@ -415,3 +416,66 @@ int print_missing_or_multiple_domains(unsigned int sum) return ret; } + +/* + * Get the discarded events and lost packet counts. + */ +void print_session_stats(const char *session_name) +{ + int count, nb_domains, domain_idx, channel_idx; + struct lttng_domain *domains; + struct lttng_channel *channels; + uint64_t discarded_total = 0, lost_total = 0; + + nb_domains = lttng_list_domains(session_name, &domains); + if (nb_domains < 0) { + goto end; + } + for (domain_idx = 0; domain_idx < nb_domains; domain_idx++) { + struct lttng_handle *handle = lttng_create_handle(session_name, + &domains[domain_idx]); + + if (!handle) { + ERR("Failed to create session handle while printing session stats."); + goto end; + } + + count = lttng_list_channels(handle, &channels); + for (channel_idx = 0; channel_idx < count; channel_idx++) { + int ret; + uint64_t discarded = 0, lost = 0; + struct lttng_channel *channel = &channels[channel_idx]; + + ret = lttng_channel_get_discarded_event_count(channel, + &discarded); + if (ret) { + ERR("Failed to retrieve discarded event count from channel %s", + channel->name); + } + + ret = lttng_channel_get_lost_packet_count(channel, + &lost); + if (ret) { + ERR("Failed to retrieve lost packet count from channel %s", + channel->name); + } + + discarded_total += discarded; + lost_total += lost; + } + lttng_destroy_handle(handle); + } + if (discarded_total > 0) { + MSG("[warning] %" PRIu64 " events discarded, please refer to " + "the documentation on channel configuration.", + discarded_total); + } + if (lost_total > 0) { + MSG("[warning] %" PRIu64 " packets lost, please refer to " + "the documentation on channel configuration.", + lost_total); + } + +end: + return; +} diff --git a/src/bin/lttng/utils.h b/src/bin/lttng/utils.h index 662975a76..0d70cf751 100644 --- a/src/bin/lttng/utils.h +++ b/src/bin/lttng/utils.h @@ -59,5 +59,6 @@ int print_missing_or_multiple_domains(unsigned int sum); int spawn_relayd(const char *pathname, int port); int check_relayd(void); +void print_session_stats(const char *session_name); #endif /* _LTTNG_UTILS_H */