From 32cfb8adf760170061946d1f802677fb02f6dc96 Mon Sep 17 00:00:00 2001 From: Mathieu Desnoyers Date: Sun, 26 Aug 2012 20:22:27 -0400 Subject: [PATCH 1/1] Add support for trace:hostname field Very, very, incredibly useful for multi-node traces. Signed-off-by: Mathieu Desnoyers --- converter/babeltrace.c | 6 ++++-- doc/babeltrace.1 | 4 ++-- formats/ctf-text/ctf-text.c | 11 +++++++++++ .../metadata/ctf-visitor-generate-io-struct.c | 16 ++++++++++++++++ include/babeltrace/babeltrace-internal.h | 1 + include/babeltrace/ctf-ir/metadata.h | 1 + 6 files changed, 35 insertions(+), 4 deletions(-) diff --git a/converter/babeltrace.c b/converter/babeltrace.c index 21722d23..a6020737 100644 --- a/converter/babeltrace.c +++ b/converter/babeltrace.c @@ -133,8 +133,8 @@ static void usage(FILE *fp) fprintf(fp, " none, all, scope, header, (context OR ctx)\n"); fprintf(fp, " (default: payload,context)\n"); fprintf(fp, " -f, --fields name1<,name2,...> Print additional fields:\n"); - fprintf(fp, " all, trace, trace:domain, trace:procname,\n"); - fprintf(fp, " trace:vpid, loglevel.\n"); + fprintf(fp, " all, trace, trace:hostname, trace:domain,\n"); + fprintf(fp, " trace:procname, trace:vpid, loglevel.\n"); fprintf(fp, " --clock-cycles Timestamp in cycles\n"); fprintf(fp, " --clock-offset seconds Clock offset in seconds\n"); fprintf(fp, " --clock-seconds Print the timestamps as [sec.ns]\n"); @@ -203,6 +203,8 @@ static int get_fields_args(poptContext *pc) opt_trace_procname_field = 1; else if (!strcmp(str, "trace:vpid")) opt_trace_vpid_field = 1; + else if (!strcmp(str, "trace:hostname")) + opt_trace_hostname_field = 1; else if (!strcmp(str, "loglevel")) opt_loglevel_field = 1; else { diff --git a/doc/babeltrace.1 b/doc/babeltrace.1 index c41d4ddc..31962990 100644 --- a/doc/babeltrace.1 +++ b/doc/babeltrace.1 @@ -54,8 +54,8 @@ Print field names: (payload OR args OR arg), none, all, scope, header, (context OR ctx), (default: payload,context). .TP .BR "-f, --fields name1<,name2,...>" -Print additional fields: all, trace, trace:domain, trace:procname, -trace:vpid, loglevel. +Print additional fields: all, trace, trace:hostname, trace:domain, +trace:procname, trace:vpid, loglevel. .TP .BR "--clock-raw" Disregard internal clock offset (use raw value) diff --git a/formats/ctf-text/ctf-text.c b/formats/ctf-text/ctf-text.c index 55158caa..d209eca2 100644 --- a/formats/ctf-text/ctf-text.c +++ b/formats/ctf-text/ctf-text.c @@ -46,6 +46,7 @@ int opt_all_field_names, opt_trace_domain_field, opt_trace_procname_field, opt_trace_vpid_field, + opt_trace_hostname_field, opt_loglevel_field, opt_delta_field = 1; @@ -322,6 +323,16 @@ int ctf_text_write_event(struct stream_pos *ppos, struct ctf_stream_definition * else fprintf(pos->fp, " "); } + if ((opt_trace_hostname_field && !opt_all_fields) && stream_class->trace->env.hostname[0] != '\0') { + set_field_names_print(pos, ITEM_HEADER); + if (pos->print_names) { + fprintf(pos->fp, "trace:hostname = "); + } + fprintf(pos->fp, "%s", stream_class->trace->env.hostname); + if (pos->print_names) + fprintf(pos->fp, ", "); + dom_print = 1; + } if ((opt_trace_domain_field && !opt_all_fields) && stream_class->trace->env.domain[0] != '\0') { set_field_names_print(pos, ITEM_HEADER); if (pos->print_names) { diff --git a/formats/ctf/metadata/ctf-visitor-generate-io-struct.c b/formats/ctf/metadata/ctf-visitor-generate-io-struct.c index 43fdcb22..ea8148b2 100644 --- a/formats/ctf/metadata/ctf-visitor-generate-io-struct.c +++ b/formats/ctf/metadata/ctf-visitor-generate-io-struct.c @@ -2458,6 +2458,21 @@ int ctf_env_declaration_visit(FILE *fd, int depth, struct ctf_node *node, strncpy(env->procname, right, TRACER_ENV_LEN); env->procname[TRACER_ENV_LEN - 1] = '\0'; printf_verbose("env.procname = \"%s\"\n", env->procname); + } else if (!strcmp(left, "hostname")) { + char *right; + + if (env->hostname[0]) { + fprintf(fd, "[warning] %s: duplicated env hostname\n", __func__); + goto error; /* ret is 0, so not an actual error, just warn. */ + } + right = concatenate_unary_strings(&node->u.ctf_expression.right); + if (!right) { + fprintf(fd, "[warning] %s: unexpected unary expression for env hostname\n", __func__); + goto error; /* ret is 0, so not an actual error, just warn. */ + } + strncpy(env->hostname, right, TRACER_ENV_LEN); + env->hostname[TRACER_ENV_LEN - 1] = '\0'; + printf_verbose("env.hostname = \"%s\"\n", env->hostname); } else if (!strcmp(left, "domain")) { char *right; @@ -2562,6 +2577,7 @@ int ctf_env_visit(FILE *fd, int depth, struct ctf_node *node, struct ctf_trace * trace->env.vpid = -1; trace->env.procname[0] = '\0'; + trace->env.hostname[0] = '\0'; trace->env.domain[0] = '\0'; trace->env.sysname[0] = '\0'; trace->env.release[0] = '\0'; diff --git a/include/babeltrace/babeltrace-internal.h b/include/babeltrace/babeltrace-internal.h index 29354a4a..92e2f512 100644 --- a/include/babeltrace/babeltrace-internal.h +++ b/include/babeltrace/babeltrace-internal.h @@ -59,6 +59,7 @@ extern int opt_all_field_names, opt_trace_domain_field, opt_trace_procname_field, opt_trace_vpid_field, + opt_trace_hostname_field, opt_loglevel_field, opt_delta_field, opt_clock_cycles, diff --git a/include/babeltrace/ctf-ir/metadata.h b/include/babeltrace/ctf-ir/metadata.h index 85b0f2d5..63a6c2a9 100644 --- a/include/babeltrace/ctf-ir/metadata.h +++ b/include/babeltrace/ctf-ir/metadata.h @@ -123,6 +123,7 @@ struct ctf_tracer_env { /* All strings below: "" if unset. */ char procname[TRACER_ENV_LEN]; + char hostname[TRACER_ENV_LEN]; char domain[TRACER_ENV_LEN]; char sysname[TRACER_ENV_LEN]; char release[TRACER_ENV_LEN]; -- 2.34.1