Display discarded and lost events at destroy and stop
authorJulien Desfossez <jdesfossez@efficios.com>
Fri, 3 Jul 2015 21:48:27 +0000 (17:48 -0400)
committerJérémie Galarneau <jeremie.galarneau@efficios.com>
Thu, 10 Mar 2016 21:35:29 +0000 (16:35 -0500)
Signed-off-by: Julien Desfossez <jdesfossez@efficios.com>
Reviewed-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
Signed-off-by: Jérémie Galarneau <jeremie.galarneau@efficios.com>
src/bin/lttng/commands/destroy.c
src/bin/lttng/commands/stop.c
src/bin/lttng/utils.c
src/bin/lttng/utils.h

index 87231858f96ded25cb05c189b1c0464dc2f09c3f..ad181d7c4343b72182269556bf689d593bd21d4d 100644 (file)
@@ -23,6 +23,7 @@
 #include <sys/stat.h>
 #include <sys/types.h>
 #include <unistd.h>
 #include <sys/stat.h>
 #include <sys/types.h>
 #include <unistd.h>
+#include <stdbool.h>
 
 #include "../command.h"
 
 
 #include "../command.h"
 
@@ -79,11 +80,13 @@ static int destroy_session(struct lttng_session *session)
 {
        int ret;
        char *session_name = NULL;
 {
        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));
        }
 
        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);
        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("");
        }
                } 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) {
 
        ret = lttng_destroy_session_no_wait(session->name);
        if (ret < 0) {
index affc3985bb48f5977fdcb95a7241613166b7c62d..b3fff0753b1c93381e0eafe073ed1e60c4127d4e 100644 (file)
@@ -155,6 +155,7 @@ static int stop_tracing(void)
 
        ret = CMD_SUCCESS;
 
 
        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);
        MSG("Tracing stopped for session %s", session_name);
        if (lttng_opt_mi) {
                ret = mi_print_session(session_name, 0);
index ea9108fba5e207a0830e4468f492caea6b3ab1dc..802e0971bd6785c2853e0ffeb1d88b0edc03a5a4 100644 (file)
@@ -25,6 +25,7 @@
 #include <signal.h>
 #include <netinet/in.h>
 #include <arpa/inet.h>
 #include <signal.h>
 #include <netinet/in.h>
 #include <arpa/inet.h>
+#include <inttypes.h>
 
 #include <common/error.h>
 #include <common/utils.h>
 
 #include <common/error.h>
 #include <common/utils.h>
@@ -415,3 +416,66 @@ int print_missing_or_multiple_domains(unsigned int sum)
 
        return ret;
 }
 
        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;
+}
index 662975a7613cb8cf9e333f75792c1632ff1b94cf..0d70cf751e48612997e6f3546ea72366724d551e 100644 (file)
@@ -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);
 
 int spawn_relayd(const char *pathname, int port);
 int check_relayd(void);
+void print_session_stats(const char *session_name);
 
 #endif /* _LTTNG_UTILS_H */
 
 #endif /* _LTTNG_UTILS_H */
This page took 0.028017 seconds and 4 git commands to generate.