X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=src%2Fbin%2Flttng%2Futils.c;h=0e96ef0c3daf36f08b41c26749356a56705dac01;hb=e7ab49a85e4e5c5749949191bdeefa21a9aef9b1;hp=9957b378162b897a8743c8897425da51d27e0cb7;hpb=3ecec76a3cd1eb6b301d03895ab425976ba28dee;p=lttng-tools.git diff --git a/src/bin/lttng/utils.c b/src/bin/lttng/utils.c index 9957b3781..0e96ef0c3 100644 --- a/src/bin/lttng/utils.c +++ b/src/bin/lttng/utils.c @@ -15,7 +15,6 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -#define _GNU_SOURCE #define _LGPL_SOURCE #include #include @@ -26,9 +25,12 @@ #include #include #include +#include +#include #include #include +#include #include "conf.h" #include "utils.h" @@ -39,6 +41,12 @@ static const char *str_ust = "UST"; static const char *str_jul = "JUL"; static const char *str_log4j = "LOG4J"; static const char *str_python = "Python"; +static const char *str_all = "ALL"; +static const char *str_tracepoint = "Tracepoint"; +static const char *str_syscall = "Syscall"; +static const char *str_probe = "Probe"; +static const char *str_userspace_probe = "Userspace Probe"; +static const char *str_function = "Function"; static char *_get_session_name(int quiet) @@ -309,6 +317,37 @@ const char *get_domain_str(enum lttng_domain_type domain) return str_dom; } +const char *get_event_type_str(enum lttng_event_type type) +{ + const char *str_event_type; + + switch (type) { + case LTTNG_EVENT_ALL: + str_event_type = str_all; + break; + case LTTNG_EVENT_TRACEPOINT: + str_event_type = str_tracepoint; + break; + case LTTNG_EVENT_SYSCALL: + str_event_type = str_syscall; + break; + case LTTNG_EVENT_PROBE: + str_event_type = str_probe; + break; + case LTTNG_EVENT_USERSPACE_PROBE: + str_event_type = str_userspace_probe; + break; + case LTTNG_EVENT_FUNCTION: + str_event_type = str_function; + break; + default: + /* Should not have an unknown event type or else define it. */ + assert(0); + } + + return str_event_type; +} + /* * Spawn a lttng relayd daemon by forking and execv. */ @@ -385,7 +424,7 @@ int check_relayd(void) * A successful connect means the relayd exists thus returning 0 else a * negative value means it does NOT exists. */ - ret = connect(fd, &sin, sizeof(sin)); + ret = connect(fd, (struct sockaddr *) &sin, sizeof(sin)); if (ret < 0) { /* Not found. */ ret = 0; @@ -416,3 +455,102 @@ 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, session_idx; + struct lttng_domain *domains; + struct lttng_channel *channels; + uint64_t discarded_events_total = 0, lost_packets_total = 0; + struct lttng_session *sessions = NULL; + const struct lttng_session *selected_session = NULL; + + count = lttng_list_sessions(&sessions); + if (count < 1) { + ERR("Failed to retrieve session descriptions while printing session statistics."); + goto end; + } + + /* Identify the currently-selected sessions. */ + for (session_idx = 0; session_idx < count; session_idx++) { + if (!strcmp(session_name, sessions[session_idx].name)) { + selected_session = &sessions[session_idx]; + break; + } + } + if (!selected_session) { + ERR("Failed to retrieve session \"%s\" description while printing session statistics.", session_name); + goto end; + } + + 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 statistics."); + goto end; + } + + count = lttng_list_channels(handle, &channels); + for (channel_idx = 0; channel_idx < count; channel_idx++) { + int ret; + uint64_t discarded_events = 0, lost_packets = 0; + struct lttng_channel *channel = &channels[channel_idx]; + + ret = lttng_channel_get_discarded_event_count(channel, + &discarded_events); + if (ret) { + ERR("Failed to retrieve discarded event count from channel %s", + channel->name); + } + + ret = lttng_channel_get_lost_packet_count(channel, + &lost_packets); + if (ret) { + ERR("Failed to retrieve lost packet count from channel %s", + channel->name); + } + + discarded_events_total += discarded_events; + lost_packets_total += lost_packets; + } + lttng_destroy_handle(handle); + } + if (discarded_events_total > 0 && !selected_session->snapshot_mode) { + MSG("[warning] %" PRIu64 " events discarded, please refer to " + "the documentation on channel configuration.", + discarded_events_total); + } + if (lost_packets_total > 0 && !selected_session->snapshot_mode) { + MSG("[warning] %" PRIu64 " packets lost, please refer to " + "the documentation on channel configuration.", + lost_packets_total); + } + +end: + free(sessions); +} + +int show_cmd_help(const char *cmd_name, const char *help_msg) +{ + int ret; + char page_name[32]; + + ret = sprintf(page_name, "lttng-%s", cmd_name); + assert(ret > 0 && ret < 32); + ret = utils_show_help(1, page_name, help_msg); + if (ret && !help_msg) { + ERR("Cannot view man page `lttng-%s(1)`", cmd_name); + perror("exec"); + } + + return ret; +}