X-Git-Url: https://git.lttng.org/?p=lttngtop.git;a=blobdiff_plain;f=src%2Flttngtop.c;h=554406aba21582b6d61dff59ae9de5154377c86c;hp=bfae663182c0cb89a9dd0d59da74a5627d66f09a;hb=113c1cacb39413f0449af5ad78a29f203def1b5e;hpb=bab469fc468832ae02c61e24bf3afaba24228c09 diff --git a/src/lttngtop.c b/src/lttngtop.c index bfae663..554406a 100644 --- a/src/lttngtop.c +++ b/src/lttngtop.c @@ -52,14 +52,16 @@ #include "common.h" #include "network-live.h" -#include "lttng-index.h" +#define NET_URL_PREFIX "net://" +#define NET4_URL_PREFIX "net4://" +#define NET6_URL_PREFIX "net6://" #define DEFAULT_FILE_ARRAY_SIZE 1 const char *opt_input_path; -static int opt_textdump; -static int opt_child; -static int opt_begin; +int opt_textdump; +int opt_child; +int opt_begin; int quit = 0; @@ -256,10 +258,17 @@ enum bt_cb_ret print_timestamp(struct bt_ctf_event *call_data, void *private_dat * print the newline in this case */ if (last_textdump_print_newline == 0) printf("\n"); - printf("%02d:%02d:%02d.%09" PRIu64 " (%s) (cpu %d) [%s (%d)] %s (", - start.tm_hour, start.tm_min, start.tm_sec, - ts_nsec_start, hostname, cpu_id, procname, pid, - bt_ctf_event_name(call_data)); + if (hostname) { + printf("%02d:%02d:%02d.%09" PRIu64 " (%s) (cpu %d) [%s (%d)] %s (", + start.tm_hour, start.tm_min, start.tm_sec, + ts_nsec_start, hostname, cpu_id, procname, pid, + bt_ctf_event_name(call_data)); + } else { + printf("%02d:%02d:%02d.%09" PRIu64 " (cpu %d) [%s (%d)] %s (", + start.tm_hour, start.tm_min, start.tm_sec, + ts_nsec_start, cpu_id, procname, pid, + bt_ctf_event_name(call_data)); + } print_fields(call_data); printf(") "); if (strncmp(bt_ctf_event_name(call_data), "sys_", 4) != 0) { @@ -540,8 +549,8 @@ void init_lttngtop() void usage(FILE *fp) { fprintf(fp, "LTTngTop %s\n\n", VERSION); - fprintf(fp, "Usage : lttngtop [OPTIONS] [TRACE]\n"); - fprintf(fp, " TRACE Path to the trace to analyse (no trace path for live tracing)\n"); + fprintf(fp, "Usage : lttngtop [OPTIONS] TRACE\n"); + fprintf(fp, " TRACE Path to the trace to analyse (-r for network live tracing, nothing for mmap live streaming)\n"); fprintf(fp, " -h, --help This help message\n"); fprintf(fp, " -t, --textdump Display live events in text-only\n"); fprintf(fp, " -p, --pid Comma-separated list of PIDs to display\n"); @@ -831,6 +840,19 @@ int bt_context_add_traces_recursive(struct bt_context *ctx, const char *path, char * const paths[2] = { lpath, NULL }; int ret = -1; + if ((strncmp(path, NET4_URL_PREFIX, sizeof(NET4_URL_PREFIX) - 1)) == 0 || + (strncmp(path, NET6_URL_PREFIX, sizeof(NET6_URL_PREFIX) - 1)) == 0 || + (strncmp(path, NET_URL_PREFIX, sizeof(NET_URL_PREFIX) - 1)) == 0) { + ret = bt_context_add_trace(ctx, + path, format_str, packet_seek, NULL, NULL); + if (ret < 0) { + fprintf(stderr, "[warning] [Context] cannot open trace \"%s\" " + "for reading.\n", path); + /* Allow to skip erroneous traces. */ + ret = 1; /* partial error */ + } + return ret; + } /* * Need to copy path, because fts_open can change it. * It is the pointer array, not the strings, that are constant. @@ -1039,11 +1061,15 @@ int main(int argc, char **argv) goto end; #else - fprintf(stderr, "Mmap live support not compiled\n"); + fprintf(stderr, "[ERROR] Mmap live support not compiled, specify a " + "trace directory or -r \n"); + usage(stdout); + ret = -1; goto end; #endif /* LTTNGTOP_MMAP_LIVE */ } else if (!opt_input_path && remote_live) { /* network live */ +#if 0 ret = setup_network_live(opt_relay_hostname, opt_begin); if (ret < 0) { goto end; @@ -1053,6 +1079,15 @@ int main(int argc, char **argv) if (ret < 0) { goto end; } +#endif + + bt_ctx = bt_context_create(); + ret = bt_context_add_traces_recursive(bt_ctx, opt_relay_hostname, + "lttng-live", NULL); + if (ret < 0) { + fprintf(stderr, "[error] Opening the trace\n"); + goto end; + } } else { //init_lttngtop(); @@ -1062,27 +1097,34 @@ int main(int argc, char **argv) fprintf(stderr, "[error] Opening the trace\n"); goto end; } - } - ret = check_requirements(bt_ctx); - if (ret < 0) { - fprintf(stderr, "[error] some mandatory contexts were missing, exiting.\n"); - goto end; - } - if (!opt_textdump) { - pthread_create(&display_thread, NULL, ncurses_display, (void *) NULL); - pthread_create(&timer_thread, NULL, refresh_thread, (void *) NULL); + ret = check_requirements(bt_ctx); + if (ret < 0) { + fprintf(stderr, "[error] some mandatory contexts " + "were missing, exiting.\n"); + goto end; + } + + if (!opt_textdump) { + pthread_create(&display_thread, NULL, ncurses_display, + (void *) NULL); + pthread_create(&timer_thread, NULL, refresh_thread, + (void *) NULL); + } + + iter_trace(bt_ctx); } - iter_trace(bt_ctx); pthread_join(display_thread, NULL); quit = 1; pthread_join(timer_thread, NULL); + ret = 0; + end: if (bt_ctx) bt_context_put(bt_ctx); - return 0; + return ret; }