trace2: make SIDs more unique

Update SID component construction to use the current UTC datetime
and a portion of the SHA1 of the hostname.

Use an simplified date/time format to make it easier to use the
SID component as a logfile filename.

Signed-off-by: Jeff Hostetler <jeffhost@microsoft.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Jeff Hostetler 2019-04-15 13:39:49 -07:00 committed by Junio C Hamano
parent bad229aef2
commit 08881b9a4c
4 changed files with 73 additions and 12 deletions

View File

@ -78,11 +78,11 @@ git version 2.20.1.155.g426c96fcdb
+ +
------------ ------------
$ cat ~/log.event $ cat ~/log.event
{"event":"version","sid":"1547659722619736-11614","thread":"main","time":"2019-01-16T17:28:42.620713Z","file":"common-main.c","line":38,"evt":"1","exe":"2.20.1.155.g426c96fcdb"} {"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":"1547659722619736-11614","thread":"main","time":"2019-01-16T17:28:42.621027Z","file":"common-main.c","line":39,"t_abs":0.001173,"argv":["git","version"]} {"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":"1547659722619736-11614","thread":"main","time":"2019-01-16T17:28:42.621122Z","file":"git.c","line":432,"name":"version","hierarchy":"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":"1547659722619736-11614","thread":"main","time":"2019-01-16T17:28:42.621236Z","file":"git.c","line":662,"t_abs":0.001227,"code":0} {"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":"1547659722619736-11614","thread":"main","time":"2019-01-16T17:28:42.621268Z","file":"trace2/tr2_tgt_event.c","line":163,"t_abs":0.001265,"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 == Enabling a Target
@ -540,11 +540,11 @@ The following key/value pairs are common to all events:
------------ ------------
{ {
"event":"version", "event":"version",
"sid":"1547659722619736-11614", "sid":"20190408T191827.272759Z-H9b68c35f-P011764",
"thread":"main", "thread":"main",
"time":"2019-01-16T17:28:42.620713Z", "time":"2019-04-08T19:18:27.282761Z",
"file":"common-main.c", "file":"common-main.c",
"line":38, "line":42,
... ...
} }
------------ ------------

View File

@ -1,4 +1,5 @@
#include "cache.h" #include "cache.h"
#include "trace2/tr2_tbuf.h"
#include "trace2/tr2_sid.h" #include "trace2/tr2_sid.h"
#define TR2_ENVVAR_PARENT_SID "GIT_TR2_PARENT_SID" #define TR2_ENVVAR_PARENT_SID "GIT_TR2_PARENT_SID"
@ -6,6 +7,53 @@
static struct strbuf tr2sid_buf = STRBUF_INIT; static struct strbuf tr2sid_buf = STRBUF_INIT;
static int tr2sid_nr_git_parents; static int tr2sid_nr_git_parents;
/*
* 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
* length for possible use as a database key.
*
* "<yyyymmdd>T<hhmmss>.<fraction>Z-<host>-<process>"
*
* where <host> is a 9 character string:
* "H<first_8_chars_of_sha1_of_hostname>"
* "Localhost" when no hostname.
*
* 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;
pid_t pid = getpid();
unsigned char hash[GIT_MAX_RAWSZ + 1];
char hex[GIT_MAX_HEXSZ + 1];
char hostname[HOST_NAME_MAX + 1];
tr2_tbuf_utc_datetime(&tb_now);
strbuf_addstr(&tr2sid_buf, tb_now.buf);
strbuf_addch(&tr2sid_buf, '-');
if (xgethostname(hostname, sizeof(hostname)))
strbuf_add(&tr2sid_buf, "Localhost", 9);
else {
algo->init_fn(&ctx);
algo->update_fn(&ctx, hostname, strlen(hostname));
algo->final_fn(hash, &ctx);
hash_to_hex_algop_r(hex, hash, algo);
strbuf_addch(&tr2sid_buf, 'H');
strbuf_add(&tr2sid_buf, hex, 8);
}
strbuf_addf(&tr2sid_buf, "-P%08"PRIx32, (uint32_t)pid);
}
/* /*
* Compute a "unique" session id (SID) for the current process. This allows * Compute a "unique" session id (SID) for the current process. This allows
* all events from this process to have a single label (much like a PID). * all events from this process to have a single label (much like a PID).
@ -20,7 +68,6 @@ static int tr2sid_nr_git_parents;
*/ */
static void tr2_sid_compute(void) static void tr2_sid_compute(void)
{ {
uint64_t us_now;
const char *parent_sid; const char *parent_sid;
if (tr2sid_buf.len) if (tr2sid_buf.len)
@ -38,9 +85,7 @@ static void tr2_sid_compute(void)
tr2sid_nr_git_parents++; tr2sid_nr_git_parents++;
} }
us_now = getnanotime() / 1000; tr2_sid_append_my_sid_component();
strbuf_addf(&tr2sid_buf, "%" PRIuMAX "-%" PRIdMAX, (uintmax_t)us_now,
(intmax_t)getpid());
setenv(TR2_ENVVAR_PARENT_SID, tr2sid_buf.buf, 1); setenv(TR2_ENVVAR_PARENT_SID, tr2sid_buf.buf, 1);
} }

View File

@ -30,3 +30,18 @@ void tr2_tbuf_utc_datetime_extended(struct tr2_tbuf *tb)
tm.tm_mon + 1, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec, tm.tm_mon + 1, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec,
(long)tv.tv_usec); (long)tv.tv_usec);
} }
void tr2_tbuf_utc_datetime(struct tr2_tbuf *tb)
{
struct timeval tv;
struct tm tm;
time_t secs;
gettimeofday(&tv, NULL);
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);
}

View File

@ -19,5 +19,6 @@ void tr2_tbuf_local_time(struct tr2_tbuf *tb);
* Fill buffer with formatted UTC datatime string. * Fill buffer with formatted UTC datatime string.
*/ */
void tr2_tbuf_utc_datetime_extended(struct tr2_tbuf *tb); void tr2_tbuf_utc_datetime_extended(struct tr2_tbuf *tb);
void tr2_tbuf_utc_datetime(struct tr2_tbuf *tb);
#endif /* TR2_TBUF_H */ #endif /* TR2_TBUF_H */