trace2: create new combined trace facility
Create a new unified tracing facility for git. The eventual intent is to replace the current trace_printf* and trace_performance* routines with a unified set of git_trace2* routines. In addition to the usual printf-style API, trace2 provides higer-level event verbs with fixed-fields allowing structured data to be written. This makes post-processing and analysis easier for external tools. Trace2 defines 3 output targets. These are set using the environment variables "GIT_TR2", "GIT_TR2_PERF", and "GIT_TR2_EVENT". These may be set to "1" or to an absolute pathname (just like the current GIT_TRACE). * GIT_TR2 is intended to be a replacement for GIT_TRACE and logs command summary data. * GIT_TR2_PERF is intended as a replacement for GIT_TRACE_PERFORMANCE. It extends the output with columns for the command process, thread, repo, absolute and relative elapsed times. It reports events for child process start/stop, thread start/stop, and per-thread function nesting. * GIT_TR2_EVENT is a new structured format. It writes event data as a series of JSON records. Calls to trace2 functions log to any of the 3 output targets enabled without the need to call different trace_printf* or trace_performance* routines. Signed-off-by: Jeff Hostetler <jeffhost@microsoft.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
committed by
Junio C Hamano
parent
e544221d97
commit
ee4512ed48
65
git.c
65
git.c
@ -147,16 +147,20 @@ static int handle_options(const char ***argv, int *argc, int *envchanged)
|
||||
git_set_exec_path(cmd + 1);
|
||||
else {
|
||||
puts(git_exec_path());
|
||||
trace2_cmd_name("_query_");
|
||||
exit(0);
|
||||
}
|
||||
} else if (!strcmp(cmd, "--html-path")) {
|
||||
puts(system_path(GIT_HTML_PATH));
|
||||
trace2_cmd_name("_query_");
|
||||
exit(0);
|
||||
} else if (!strcmp(cmd, "--man-path")) {
|
||||
puts(system_path(GIT_MAN_PATH));
|
||||
trace2_cmd_name("_query_");
|
||||
exit(0);
|
||||
} else if (!strcmp(cmd, "--info-path")) {
|
||||
puts(system_path(GIT_INFO_PATH));
|
||||
trace2_cmd_name("_query_");
|
||||
exit(0);
|
||||
} else if (!strcmp(cmd, "-p") || !strcmp(cmd, "--paginate")) {
|
||||
use_pager = 1;
|
||||
@ -285,6 +289,7 @@ static int handle_options(const char ***argv, int *argc, int *envchanged)
|
||||
(*argv)++;
|
||||
(*argc)--;
|
||||
} else if (skip_prefix(cmd, "--list-cmds=", &cmd)) {
|
||||
trace2_cmd_name("_query_");
|
||||
if (!strcmp(cmd, "parseopt")) {
|
||||
struct string_list list = STRING_LIST_INIT_DUP;
|
||||
int i;
|
||||
@ -332,9 +337,14 @@ static int handle_alias(int *argcp, const char ***argv)
|
||||
commit_pager_choice();
|
||||
|
||||
child.use_shell = 1;
|
||||
child.trace2_child_class = "shell_alias";
|
||||
argv_array_push(&child.args, alias_string + 1);
|
||||
argv_array_pushv(&child.args, (*argv) + 1);
|
||||
|
||||
trace2_cmd_alias(alias_command, child.args.argv);
|
||||
trace2_cmd_list_config();
|
||||
trace2_cmd_name("_run_shell_alias_");
|
||||
|
||||
ret = run_command(&child);
|
||||
if (ret >= 0) /* normal exit */
|
||||
exit(ret);
|
||||
@ -369,6 +379,9 @@ static int handle_alias(int *argcp, const char ***argv)
|
||||
/* insert after command name */
|
||||
memcpy(new_argv + count, *argv + 1, sizeof(char *) * *argcp);
|
||||
|
||||
trace2_cmd_alias(alias_command, new_argv);
|
||||
trace2_cmd_list_config();
|
||||
|
||||
*argv = new_argv;
|
||||
*argcp += count - 1;
|
||||
|
||||
@ -417,6 +430,8 @@ static int run_builtin(struct cmd_struct *p, int argc, const char **argv)
|
||||
setup_work_tree();
|
||||
|
||||
trace_argv_printf(argv, "trace: built-in: git");
|
||||
trace2_cmd_name(p->cmd);
|
||||
trace2_cmd_list_config();
|
||||
|
||||
validate_cache_entries(the_repository->index);
|
||||
status = p->fn(argc, argv, prefix);
|
||||
@ -666,7 +681,14 @@ static void execv_dashed_external(const char **argv)
|
||||
cmd.clean_on_exit = 1;
|
||||
cmd.wait_after_clean = 1;
|
||||
cmd.silent_exec_failure = 1;
|
||||
cmd.trace2_child_class = "dashed";
|
||||
|
||||
trace2_cmd_name("_run_dashed_");
|
||||
|
||||
/*
|
||||
* The code in run_command() logs trace2 child_start/child_exit
|
||||
* events, so we do not need to report exec/exec_result events here.
|
||||
*/
|
||||
trace_argv_printf(cmd.args.argv, "trace: exec:");
|
||||
|
||||
/*
|
||||
@ -676,6 +698,12 @@ static void execv_dashed_external(const char **argv)
|
||||
* the program.
|
||||
*/
|
||||
status = run_command(&cmd);
|
||||
|
||||
/*
|
||||
* If the child process ran and we are now going to exit, emit a
|
||||
* generic string as our trace2 command verb to indicate that we
|
||||
* launched a dashed command.
|
||||
*/
|
||||
if (status >= 0)
|
||||
exit(status);
|
||||
else if (errno != ENOENT)
|
||||
@ -701,6 +729,43 @@ static int run_argv(int *argcp, const char ***argv)
|
||||
if (!done_alias)
|
||||
handle_builtin(*argcp, *argv);
|
||||
|
||||
#if 0 // TODO In GFW, need to amend a7924b655e940b06cb547c235d6bed9767929673 to include trace2_ and _tr2 lines.
|
||||
else if (get_builtin(**argv)) {
|
||||
struct argv_array args = ARGV_ARRAY_INIT;
|
||||
int i;
|
||||
|
||||
/*
|
||||
* The current process is committed to launching a
|
||||
* child process to run the command named in (**argv)
|
||||
* and exiting. Log a generic string as the trace2
|
||||
* command verb to indicate this. Note that the child
|
||||
* process will log the actual verb when it runs.
|
||||
*/
|
||||
trace2_cmd_name("_run_git_alias_");
|
||||
|
||||
if (get_super_prefix())
|
||||
die("%s doesn't support --super-prefix", **argv);
|
||||
|
||||
commit_pager_choice();
|
||||
|
||||
argv_array_push(&args, "git");
|
||||
for (i = 0; i < *argcp; i++)
|
||||
argv_array_push(&args, (*argv)[i]);
|
||||
|
||||
trace_argv_printf(args.argv, "trace: exec:");
|
||||
|
||||
/*
|
||||
* if we fail because the command is not found, it is
|
||||
* OK to return. Otherwise, we just pass along the status code.
|
||||
*/
|
||||
i = run_command_v_opt_tr2(args.argv, RUN_SILENT_EXEC_FAILURE |
|
||||
RUN_CLEAN_ON_EXIT, "git_alias");
|
||||
if (i >= 0 || errno != ENOENT)
|
||||
exit(i);
|
||||
die("could not execute builtin %s", **argv);
|
||||
}
|
||||
#endif // a7924b655e940b06cb547c235d6bed9767929673
|
||||
|
||||
/* .. then try the external ones */
|
||||
execv_dashed_external(*argv);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user