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>
Jeff Hostetler committed
Apr 15, 2019 at 13:39 UTC
08881b9a4c841b77bc2a4a17510ee33b98070b9e
4 files changed
+73
-12
Documentation/technical/api-trace2.txt
+8
-8
@@ -78,11 +78,11 @@ git version 2.20.1.155.g426c96fcdb
78
+
79
------------
80
$ cat ~/log.event
81
-{"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"}
82
-{"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"]}
83
-{"event":"cmd_name","sid":"1547659722619736-11614","thread":"main","time":"2019-01-16T17:28:42.621122Z","file":"git.c","line":432,"name":"version","hierarchy":"version"}
84
-{"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}
85
-{"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}
81
+{"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"}
82
+{"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"]}
83
+{"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"}
84
+{"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}
85
+{"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}
86
------------
87
88
== Enabling a Target
@@ -540,11 +540,11 @@ The following key/value pairs are common to all events:
540
------------
541
{
542
"event":"version",
543
- "sid":"1547659722619736-11614",
543
+ "sid":"20190408T191827.272759Z-H9b68c35f-P011764",
544
"thread":"main",
545
- "time":"2019-01-16T17:28:42.620713Z",
545
+ "time":"2019-04-08T19:18:27.282761Z",
546
"file":"common-main.c",
547
- "line":38,
547
+ "line":42,
548
...
549
}
550
------------
trace2/tr2_sid.c
+49
-4
@@ -1,4 +1,5 @@
1
#include "cache.h"
2
+#include "trace2/tr2_tbuf.h"
3
#include "trace2/tr2_sid.h"
4
5
#define TR2_ENVVAR_PARENT_SID "GIT_TR2_PARENT_SID"
@@ -6,6 +7,53 @@
7
static struct strbuf tr2sid_buf = STRBUF_INIT;
8
static int tr2sid_nr_git_parents;
9
10
+/*
11
+ * Compute the final component of the SID representing the current process.
12
+ * This should uniquely identify the process and be a valid filename (to
13
+ * allow writing trace2 data to per-process files). It should also be fixed
14
+ * length for possible use as a database key.
15
+ *
16
+ * "<yyyymmdd>T<hhmmss>.<fraction>Z-<host>-<process>"
17
+ *
18
+ * where <host> is a 9 character string:
19
+ * "H<first_8_chars_of_sha1_of_hostname>"
20
+ * "Localhost" when no hostname.
21
+ *
22
+ * where <process> is a 9 character string containing the least signifcant
23
+ * 32 bits in the process-id.
24
+ * "P<pid>"
25
+ * (This is an abribrary choice. On most systems pid_t is a 32 bit value,
26
+ * so limit doesn't matter. On larger systems, a truncated value is fine
27
+ * for our purposes here.)
28
+ */
29
+static void tr2_sid_append_my_sid_component(void)
30
+{
31
+ const struct git_hash_algo *algo = &hash_algos[GIT_HASH_SHA1];
32
+ struct tr2_tbuf tb_now;
33
+ git_hash_ctx ctx;
34
+ pid_t pid = getpid();
35
+ unsigned char hash[GIT_MAX_RAWSZ + 1];
36
+ char hex[GIT_MAX_HEXSZ + 1];
37
+ char hostname[HOST_NAME_MAX + 1];
38
+
39
+ tr2_tbuf_utc_datetime(&tb_now);
40
+ strbuf_addstr(&tr2sid_buf, tb_now.buf);
41
+
42
+ strbuf_addch(&tr2sid_buf, '-');
43
+ if (xgethostname(hostname, sizeof(hostname)))
44
+ strbuf_add(&tr2sid_buf, "Localhost", 9);
45
+ else {
46
+ algo->init_fn(&ctx);
47
+ algo->update_fn(&ctx, hostname, strlen(hostname));
48
+ algo->final_fn(hash, &ctx);
49
+ hash_to_hex_algop_r(hex, hash, algo);
50
+ strbuf_addch(&tr2sid_buf, 'H');
51
+ strbuf_add(&tr2sid_buf, hex, 8);
52
+ }
53
+
54
+ strbuf_addf(&tr2sid_buf, "-P%08"PRIx32, (uint32_t)pid);
55
+}
56
+
57
/*
58
* Compute a "unique" session id (SID) for the current process. This allows
59
* all events from this process to have a single label (much like a PID).
@@ -20,7 +68,6 @@ static int tr2sid_nr_git_parents;
68
*/
69
static void tr2_sid_compute(void)
70
{
23
- uint64_t us_now;
71
const char *parent_sid;
72
73
if (tr2sid_buf.len)
@@ -38,9 +85,7 @@ static void tr2_sid_compute(void)
85
tr2sid_nr_git_parents++;
86
}
87
41
- us_now = getnanotime() / 1000;
42
- strbuf_addf(&tr2sid_buf, "%" PRIuMAX "-%" PRIdMAX, (uintmax_t)us_now,
43
- (intmax_t)getpid());
88
+ tr2_sid_append_my_sid_component();
89
90
setenv(TR2_ENVVAR_PARENT_SID, tr2sid_buf.buf, 1);
91
}
trace2/tr2_tbuf.c
+15
@@ -30,3 +30,18 @@ void tr2_tbuf_utc_datetime_extended(struct tr2_tbuf *tb)
30
tm.tm_mon + 1, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec,
31
(long)tv.tv_usec);
32
}
33
+
34
+void tr2_tbuf_utc_datetime(struct tr2_tbuf *tb)
35
+{
36
+ struct timeval tv;
37
+ struct tm tm;
38
+ time_t secs;
39
+
40
+ gettimeofday(&tv, NULL);
41
+ secs = tv.tv_sec;
42
+ gmtime_r(&secs, &tm);
43
+
44
+ xsnprintf(tb->buf, sizeof(tb->buf), "%4d%02d%02dT%02d%02d%02d.%06ldZ",
45
+ tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday, tm.tm_hour,
46
+ tm.tm_min, tm.tm_sec, (long)tv.tv_usec);
47
+}
trace2/tr2_tbuf.h
+1
@@ -19,5 +19,6 @@ void tr2_tbuf_local_time(struct tr2_tbuf *tb);
19
* Fill buffer with formatted UTC datatime string.
20
*/
21
void tr2_tbuf_utc_datetime_extended(struct tr2_tbuf *tb);
22
+void tr2_tbuf_utc_datetime(struct tr2_tbuf *tb);
23
24
#endif /* TR2_TBUF_H */