Version 4 fixes a few clang-format warnings and simplifies the PID field in the SID. Jeff Hostetler (10): config: initialize opts structure in repo_read_config() trace2: refactor setting process starting time trace2: add absolute elapsed time to start event trace2: find exec-dir before trace2 initialization config: add read_very_early_config() trace2: use system/global config for default trace2 settings trace2: report peak memory usage of the process trace2: clarify UTC datetime formatting trace2: make SIDs more unique trace2: update docs to describe system/global config settings Documentation/config.txt | 2 + Documentation/config/trace2.txt | 56 ++++++++ Documentation/technical/api-trace2.txt | 176 +++++++++++++---------- Documentation/trace2-target-values.txt | 10 ++ Makefile | 1 + common-main.c | 8 +- compat/mingw.c | 2 + compat/win32/trace2_win32_process_info.c | 50 ++++++- config.c | 25 +++- config.h | 4 + t/t0210-trace2-normal.sh | 49 ++++++- t/t0211-trace2-perf.sh | 43 ++++-- t/t0212-trace2-event.sh | 42 +++++- trace2.c | 21 ++- trace2.h | 43 ++++-- trace2/tr2_cfg.c | 7 +- trace2/tr2_dst.c | 26 ++-- trace2/tr2_dst.h | 3 +- trace2/tr2_sid.c | 53 ++++++- trace2/tr2_sysenv.c | 127 ++++++++++++++++ trace2/tr2_sysenv.h | 36 +++++ trace2/tr2_tbuf.c | 19 ++- trace2/tr2_tbuf.h | 5 +- trace2/tr2_tgt.h | 1 + trace2/tr2_tgt_event.c | 53 +++---- trace2/tr2_tgt_normal.c | 19 +-- trace2/tr2_tgt_perf.c | 23 +-- trace2/tr2_tls.c | 38 +++-- trace2/tr2_tls.h | 8 +- 29 files changed, 747 insertions(+), 203 deletions(-) create mode 100644 Documentation/config/trace2.txt create mode 100644 Documentation/trace2-target-values.txt create mode 100644 trace2/tr2_sysenv.c create mode 100644 trace2/tr2_sysenv.h base-commit: 041f5ea1cf987a4068ef5f39ba0a09be85952064 Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-169%2Fjeffhostetler%2Fcore-tr2-startup-and-sysenv-v4 Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-169/jeffhostetler/core-tr2-startup-and-sysenv-v4 Pull-Request: https://github.com/gitgitgadget/git/pull/169 Range-diff vs v3: 1: ea8c199f91 ! 1: f6653f1c59 config: initialize opts structure in repo_read_config() @@ -25,7 +25,7 @@ static void repo_read_config(struct repository *repo) { - struct config_options opts; -+ struct config_options opts = {0}; ++ struct config_options opts = { 0 }; opts.respect_includes = 1; opts.commondir = repo->commondir; 2: 3dbcfc6a8d ! 2: 48e34834b6 trace2: refactor setting process starting time @@ -196,8 +196,8 @@ - * thread's array (because of reallocs). - */ - tr2tls_us_start_main = tr2tls_thread_main->array_us_start[0]; -+ tr2tls_thread_main = tr2tls_create_self("main", -+ tr2tls_us_start_process); ++ tr2tls_thread_main = ++ tr2tls_create_self("main", tr2tls_us_start_process); } void tr2tls_release(void) 3: 8b00025af5 = 3: 175371fb54 trace2: add absolute elapsed time to start event 4: c3c5f6a96b = 4: 94729b284c trace2: find exec-dir before trace2 initialization 5: d15be7b63a ! 5: b0fe1385f1 config: add read_very_early_config() @@ -16,8 +16,8 @@ current_parsing_scope = CONFIG_SCOPE_REPO; - if (repo_config && !access_or_die(repo_config, R_OK, 0)) -+ if (!opts->ignore_repo && -+ repo_config && !access_or_die(repo_config, R_OK, 0)) ++ if (!opts->ignore_repo && repo_config && ++ !access_or_die(repo_config, R_OK, 0)) ret += git_config_from_file(fn, repo_config, data); /* @@ -25,8 +25,7 @@ * But let's not complicate things before it's actually needed. */ - if (repository_format_worktree_config) { -+ if (!opts->ignore_worktree && -+ repository_format_worktree_config) { ++ if (!opts->ignore_worktree && repository_format_worktree_config) { char *path = git_pathdup("config.worktree"); if (!access_or_die(path, R_OK, 0)) ret += git_config_from_file(fn, path, data); @@ -35,8 +34,7 @@ current_parsing_scope = CONFIG_SCOPE_CMDLINE; - if (git_config_from_parameters(fn, data) < 0) -+ if (!opts->ignore_cmdline && -+ git_config_from_parameters(fn, data) < 0) ++ if (!opts->ignore_cmdline && git_config_from_parameters(fn, data) < 0) die(_("unable to parse command-line config")); current_parsing_scope = CONFIG_SCOPE_UNKNOWN; @@ -50,7 +48,7 @@ + */ +void read_very_early_config(config_fn_t cb, void *data) +{ -+ struct config_options opts = {0}; ++ struct config_options opts = { 0 }; + + opts.respect_includes = 1; + opts.ignore_repo = 1; 6: c085a482dd ! 6: 550cad6189 trace2: use system/global config for default trace2 settings @@ -41,16 +41,17 @@ --- a/t/t0210-trace2-normal.sh +++ b/t/t0210-trace2-normal.sh @@ - #!/bin/sh - -+# Turn off any inherited trace2 settings for this test. -+unset GIT_TR2 GIT_TR2_PERF GIT_TR2_EVENT -+unset GIT_TR2_BRIEF -+unset GIT_TR2_CONFIG_PARAMS -+ test_description='test trace2 facility (normal target)' . ./test-lib.sh ++# Turn off any inherited trace2 settings for this test. ++sane_unset GIT_TR2 GIT_TR2_PERF GIT_TR2_EVENT ++sane_unset GIT_TR2_BRIEF ++sane_unset GIT_TR2_CONFIG_PARAMS ++ + # Add t/helper directory to PATH so that we can use a relative + # path to run nested instances of test-tool.exe (see 004child). + # This helps with HEREDOC comparisons later. @@ # Warning: So you may see extra lines in artifact files when # Warning: interactively debugging. @@ -67,7 +68,7 @@ test_cmp expect actual ' -+unset GIT_TR2_BRIEF ++sane_unset GIT_TR2_BRIEF + +# Now test without environment variables and get all Trace2 settings +# from the global config. @@ -112,16 +113,17 @@ --- a/t/t0211-trace2-perf.sh +++ b/t/t0211-trace2-perf.sh @@ - #!/bin/sh - -+# Turn off any inherited trace2 settings for this test. -+unset GIT_TR2 GIT_TR2_PERF GIT_TR2_EVENT -+unset GIT_TR2_PERF_BRIEF -+unset GIT_TR2_CONFIG_PARAMS -+ test_description='test trace2 facility (perf target)' . ./test-lib.sh ++# Turn off any inherited trace2 settings for this test. ++sane_unset GIT_TR2 GIT_TR2_PERF GIT_TR2_EVENT ++sane_unset GIT_TR2_PERF_BRIEF ++sane_unset GIT_TR2_CONFIG_PARAMS ++ + # Add t/helper directory to PATH so that we can use a relative + # path to run nested instances of test-tool.exe (see 004child). + # This helps with HEREDOC comparisons later. @@ # Warning: So you may see extra lines in artifact files when # Warning: interactively debugging. @@ -138,7 +140,7 @@ test_cmp expect actual ' -+unset GIT_TR2_PERF_BRIEF ++sane_unset GIT_TR2_PERF_BRIEF + +# Now test without environment variables and get all Trace2 settings +# from the global config. @@ -165,16 +167,17 @@ --- a/t/t0212-trace2-event.sh +++ b/t/t0212-trace2-event.sh @@ - #!/bin/sh + test_description='test trace2 facility' + . ./test-lib.sh +# Turn off any inherited trace2 settings for this test. -+unset GIT_TR2 GIT_TR2_PERF GIT_TR2_EVENT -+unset GIT_TR2_BARE -+unset GIT_TR2_CONFIG_PARAMS ++sane_unset GIT_TR2 GIT_TR2_PERF GIT_TR2_EVENT ++sane_unset GIT_TR2_BARE ++sane_unset GIT_TR2_CONFIG_PARAMS + - test_description='test trace2 facility' - . ./test-lib.sh + perl -MJSON::PP -e 0 >/dev/null 2>&1 && test_set_prereq JSON_PP + # Add t/helper directory to PATH so that we can use a relative @@ # Warning: So you may see extra lines in artifact files when # Warning: interactively debugging. @@ -353,7 +356,8 @@ if (tr2_dst_want_warning()) warning("trace2: invalid AF_UNIX value '%s' for '%s' tracing", - tgt_value, dst->env_var_name); -+ tgt_value, tr2_sysenv_display_name(dst->sysenv_var)); ++ tgt_value, ++ tr2_sysenv_display_name(dst->sysenv_var)); tr2_dst_trace_disable(dst); return 0; @@ -371,7 +375,8 @@ if (tr2_dst_want_warning()) warning("trace2: could not connect to socket '%s' for '%s' tracing: %s", - path, dst->env_var_name, strerror(e)); -+ path, tr2_sysenv_display_name(dst->sysenv_var), strerror(e)); ++ path, tr2_sysenv_display_name(dst->sysenv_var), ++ strerror(e)); tr2_dst_trace_disable(dst); return 0; 7: 2a7a933875 ! 7: 56d8ce3fd6 trace2: report peak memory usage of the process @@ -40,8 +40,8 @@ + */ +static void get_peak_memory_info(void) +{ -+ DECLARE_PROC_ADDR(psapi.dll, BOOL, GetProcessMemoryInfo, -+ HANDLE, PPROCESS_MEMORY_COUNTERS, DWORD); ++ DECLARE_PROC_ADDR(psapi.dll, BOOL, GetProcessMemoryInfo, HANDLE, ++ PPROCESS_MEMORY_COUNTERS, DWORD); + + if (INIT_PROC_ADDR(GetProcessMemoryInfo)) { + PROCESS_MEMORY_COUNTERS pmc; 8: 56f357dc7b = 8: 196a9d2c85 trace2: clarify UTC datetime formatting 9: 156ffde489 ! 9: 9fdcb50140 trace2: make SIDs more unique @@ -63,7 +63,7 @@ + * Compute the final component of the SID representing the current process. + * This should uniquely identify the process and be a valid filename (to + * allow writing trace2 data to per-process files). It should also be fixed -+ * possible length for use as a database key. ++ * length for possible use as a database key. + * + * "<yyyymmdd>T<hhmmss>.<fraction>Z-<host>-<process>" + * @@ -71,17 +71,19 @@ + * "H<first_8_chars_of_sha1_of_hostname>" + * "Localhost" when no hostname. + * -+ * where <process> is a possibly wrapped PID: -+ * "P<6-digit-pid>" -+ * "W<wrapped-6-digit-pid>" when PID too big. -+ * ++ * where <process> is a 9 character string containing the least signifcant ++ * 32 bits in the process-id. ++ * "P<pid>" ++ * (This is an abribrary choice. On most systems pid_t is a 32 bit value, ++ * so limit doesn't matter. On larger systems, a truncated value is fine ++ * for our purposes here.) + */ +static void tr2_sid_append_my_sid_component(void) +{ + const struct git_hash_algo *algo = &hash_algos[GIT_HASH_SHA1]; + struct tr2_tbuf tb_now; + git_hash_ctx ctx; -+ uintmax_t pid = getpid(); ++ pid_t pid = getpid(); + unsigned char hash[GIT_MAX_RAWSZ + 1]; + char hex[GIT_MAX_HEXSZ + 1]; + char hostname[HOST_NAME_MAX + 1]; @@ -101,11 +103,7 @@ + strbuf_add(&tr2sid_buf, hex, 8); + } + -+ strbuf_addch(&tr2sid_buf, '-'); -+ if (pid > 999999) -+ strbuf_addf(&tr2sid_buf, "W%06d", (int)(pid % 1000000)); -+ else -+ strbuf_addf(&tr2sid_buf, "P%06d", (int)pid); ++ strbuf_addf(&tr2sid_buf, "-P%08"PRIx32, (uint32_t)pid); +} + /* @@ -149,10 +147,9 @@ + secs = tv.tv_sec; + gmtime_r(&secs, &tm); + -+ xsnprintf(tb->buf, sizeof(tb->buf), -+ "%4d%02d%02dT%02d%02d%02d.%06ldZ", tm.tm_year + 1900, -+ tm.tm_mon + 1, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec, -+ (long)tv.tv_usec); ++ xsnprintf(tb->buf, sizeof(tb->buf), "%4d%02d%02dT%02d%02d%02d.%06ldZ", ++ tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday, tm.tm_hour, ++ tm.tm_min, tm.tm_sec, (long)tv.tv_usec); +} diff --git a/trace2/tr2_tbuf.h b/trace2/tr2_tbuf.h 10: 285beb2b2d ! 10: 3414016d04 trace2: update docs to describe system/global config settings @@ -188,53 +188,59 @@ git version 2.20.1.155.g426c96fcdb ------------ -+ -+ -+or -+ -+------------ -+$ git config --global trace2.eventTarget ~/log.event -+$ git version -+git version 2.20.1.155.g426c96fcdb -+------------ -+ -+yields -+ - ------------ - $ cat ~/log.event - {"event":"version","sid":"sid":"20190408T191610.507018Z-H9b68c35f-P028492","thread":"main","time":"2019-01-16T17:28:42.620713Z","file":"common-main.c","line":38,"evt":"1","exe":"2.20.1.155.g426c96fcdb"} -@@ - {"event":"atexit","sid":"20190408T191610.507018Z-H9b68c35f-P028492","thread":"main","time":"2019-01-16T17:28:42.621268Z","file":"trace2/tr2_tgt_event.c","line":163,"t_abs":0.001265,"code":0} - ------------ - +------------- +-$ cat ~/log.event +-{"event":"version","sid":"sid":"20190408T191610.507018Z-H9b68c35f-P028492","thread":"main","time":"2019-01-16T17:28:42.620713Z","file":"common-main.c","line":38,"evt":"1","exe":"2.20.1.155.g426c96fcdb"} +-{"event":"start","sid":"20190408T191610.507018Z-H9b68c35f-P028492","thread":"main","time":"2019-01-16T17:28:42.621027Z","file":"common-main.c","line":39,"t_abs":0.001173,"argv":["git","version"]} +-{"event":"cmd_name","sid":"20190408T191610.507018Z-H9b68c35f-P028492","thread":"main","time":"2019-01-16T17:28:42.621122Z","file":"git.c","line":432,"name":"version","hierarchy":"version"} +-{"event":"exit","sid":"20190408T191610.507018Z-H9b68c35f-P028492","thread":"main","time":"2019-01-16T17:28:42.621236Z","file":"git.c","line":662,"t_abs":0.001227,"code":0} +-{"event":"atexit","sid":"20190408T191610.507018Z-H9b68c35f-P028492","thread":"main","time":"2019-01-16T17:28:42.621268Z","file":"trace2/tr2_tgt_event.c","line":163,"t_abs":0.001265,"code":0} +------------- +- -== Enabling a Target - -A Trace2 Target is enabled when the corresponding environment variable -(`GIT_TR2`, `GIT_TR2_PERF`, or `GIT_TR2_EVENT`) is set. The following -values are recognized. -+=== Enabling a Target - +- -`0`:: -`false`:: -+To enable a target, set the corresponding environment variable or -+system or global config value to one of the following: - -- Disables the target. - +- Disables the target. + -`1`:: -`true`:: -- ++or + - Enables the target and writes stream to `STDERR`. - -`[2-9]`:: -- ++------------ ++$ git config --global trace2.eventTarget ~/log.event ++$ git version ++git version 2.20.1.155.g426c96fcdb ++------------ + - Enables the target and writes to the already opened file descriptor. -- ++yields + -`<absolute-pathname>`:: -- ++------------ ++$ cat ~/log.event ++{"event":"version","sid":"sid":"20190408T191610.507018Z-H9b68c35f-P000059a8","thread":"main","time":"2019-01-16T17:28:42.620713Z","file":"common-main.c","line":38,"evt":"1","exe":"2.20.1.155.g426c96fcdb"} ++{"event":"start","sid":"20190408T191610.507018Z-H9b68c35f-P000059a8","thread":"main","time":"2019-01-16T17:28:42.621027Z","file":"common-main.c","line":39,"t_abs":0.001173,"argv":["git","version"]} ++{"event":"cmd_name","sid":"20190408T191610.507018Z-H9b68c35f-P000059a8","thread":"main","time":"2019-01-16T17:28:42.621122Z","file":"git.c","line":432,"name":"version","hierarchy":"version"} ++{"event":"exit","sid":"20190408T191610.507018Z-H9b68c35f-P000059a8","thread":"main","time":"2019-01-16T17:28:42.621236Z","file":"git.c","line":662,"t_abs":0.001227,"code":0} ++{"event":"atexit","sid":"20190408T191610.507018Z-H9b68c35f-P000059a8","thread":"main","time":"2019-01-16T17:28:42.621268Z","file":"trace2/tr2_tgt_event.c","line":163,"t_abs":0.001265,"code":0} ++------------ + - Enables the target, opens and writes to the file in append mode. -- ++=== Enabling a Target + -`af_unix:[<socket_type>:]<absolute-pathname>`:: -- ++To enable a target, set the corresponding environment variable or ++system or global config value to one of the following: + - Enables the target, opens and writes to a Unix Domain Socket - (on platforms that support them). -+ @@ -316,6 +322,15 @@ Each event is a JSON-object containing multiple key/value pairs written as a single line and followed by a LF. +@@ + ------------ + { + "event":"version", +- "sid":"20190408T191827.272759Z-H9b68c35f-P011764", ++ "sid":"20190408T191827.272759Z-H9b68c35f-P00003510", + "thread":"main", + "time":"2019-04-08T19:18:27.282761Z", + "file":"common-main.c", @@ `"repo":<repo-id>`:: when present, is the integer repo-id as described previously. -- gitgitgadget