X-Git-Url: http://git.efficios.com/?p=lttng-tools.git;a=blobdiff_plain;f=src%2Fbin%2Flttng%2Futils.c;h=802e0971bd6785c2853e0ffeb1d88b0edc03a5a4;hp=e40c3fd708e3d4c3d18bfcc7a0e8be1b7ee89ea3;hb=83cea427013b03a98811e88964f60b1f27bc4345;hpb=3c9bd23cc5999729bb49a973d8c1e2bedef939bb diff --git a/src/bin/lttng/utils.c b/src/bin/lttng/utils.c index e40c3fd70..802e0971b 100644 --- a/src/bin/lttng/utils.c +++ b/src/bin/lttng/utils.c @@ -15,10 +15,17 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -#define _GNU_SOURCE +#define _LGPL_SOURCE +#include #include #include #include +#include +#include +#include +#include +#include +#include #include #include @@ -27,13 +34,14 @@ #include "utils.h" #include "command.h" -/* - * get_session_name - * - * Return allocated string with the session name found in the config - * directory. - */ -char *get_session_name(void) +static const char *str_kernel = "Kernel"; +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 +char *_get_session_name(int quiet) { char *path, *session_name = NULL; @@ -44,7 +52,8 @@ char *get_session_name(void) } /* Get session name from config */ - session_name = config_read_session_name(path); + session_name = quiet ? config_read_session_name_quiet(path) : + config_read_session_name(path); if (session_name == NULL) { goto error; } @@ -57,6 +66,28 @@ error: return NULL; } +/* + * get_session_name + * + * Return allocated string with the session name found in the config + * directory. + */ +char *get_session_name(void) +{ + return _get_session_name(0); +} + +/* + * get_session_name_quiet (no warnings/errors emitted) + * + * Return allocated string with the session name found in the config + * directory. + */ +char *get_session_name_quiet(void) +{ + return _get_session_name(1); +} + /* * list_commands * @@ -249,3 +280,202 @@ int get_count_order_ulong(unsigned long x) return fls_ulong(x - 1); } + +const char *get_domain_str(enum lttng_domain_type domain) +{ + const char *str_dom; + + switch (domain) { + case LTTNG_DOMAIN_KERNEL: + str_dom = str_kernel; + break; + case LTTNG_DOMAIN_UST: + str_dom = str_ust; + break; + case LTTNG_DOMAIN_JUL: + str_dom = str_jul; + break; + case LTTNG_DOMAIN_LOG4J: + str_dom = str_log4j; + break; + case LTTNG_DOMAIN_PYTHON: + str_dom = str_python; + break; + default: + /* Should not have an unknown domain or else define it. */ + assert(0); + } + + return str_dom; +} + +/* + * Spawn a lttng relayd daemon by forking and execv. + */ +int spawn_relayd(const char *pathname, int port) +{ + int ret = 0; + pid_t pid; + char url[255]; + + if (!port) { + port = DEFAULT_NETWORK_VIEWER_PORT; + } + + ret = snprintf(url, sizeof(url), "tcp://localhost:%d", port); + if (ret < 0) { + goto end; + } + + MSG("Spawning a relayd daemon"); + pid = fork(); + if (pid == 0) { + /* + * Spawn session daemon and tell + * it to signal us when ready. + */ + execlp(pathname, "lttng-relayd", "-L", url, NULL); + /* execlp only returns if error happened */ + if (errno == ENOENT) { + ERR("No relayd found. Use --relayd-path."); + } else { + PERROR("execlp"); + } + kill(getppid(), SIGTERM); /* wake parent */ + exit(EXIT_FAILURE); + } else if (pid > 0) { + goto end; + } else { + PERROR("fork"); + ret = -1; + goto end; + } + +end: + return ret; +} + +/* + * Check if relayd is alive. + * + * Return 1 if found else 0 if NOT found. Negative value on error. + */ +int check_relayd(void) +{ + int ret, fd; + struct sockaddr_in sin; + + fd = socket(AF_INET, SOCK_STREAM, 0); + if (fd < 0) { + PERROR("socket check relayd"); + ret = -1; + goto error_socket; + } + + sin.sin_family = AF_INET; + sin.sin_port = htons(DEFAULT_NETWORK_VIEWER_PORT); + ret = inet_pton(sin.sin_family, "127.0.0.1", &sin.sin_addr); + if (ret < 1) { + PERROR("inet_pton check relayd"); + ret = -1; + goto error; + } + + /* + * 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)); + if (ret < 0) { + /* Not found. */ + ret = 0; + } else { + /* Already spawned. */ + ret = 1; + } + +error: + if (close(fd) < 0) { + PERROR("close relayd fd"); + } +error_socket: + return ret; +} + +int print_missing_or_multiple_domains(unsigned int sum) +{ + int ret = 0; + + if (sum == 0) { + ERR("Please specify a domain (-k/-u/-j)."); + ret = -1; + } else if (sum > 1) { + ERR("Multiple domains specified."); + ret = -1; + } + + 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; +}