Var: $request_id variable.

This variable contains a string that is formed using random data and
can be used as a unique request identifier.

This closes #714 issue on GitHub.
This commit is contained in:
Andrei Zeliankou
2023-11-08 17:34:59 +00:00
parent 6ae7142840
commit a88e857b5b
3 changed files with 59 additions and 0 deletions

View File

@@ -26,6 +26,13 @@ NGINX Unit updated to 1.32.0.
</para>
</change>
<change type="feature">
<para>
$request_id variable contains a string that is formed using random data and
can be used as a unique request identifier.
</para>
</change>
</changes>

View File

@@ -28,6 +28,8 @@ static u_char *nxt_http_log_date(u_char *buf, nxt_realtime_t *now,
struct tm *tm, size_t size, const char *format);
static nxt_int_t nxt_http_var_request_line(nxt_task_t *task, nxt_str_t *str,
void *ctx, void *data);
static nxt_int_t nxt_http_var_request_id(nxt_task_t *task, nxt_str_t *str,
void *ctx, void *data);
static nxt_int_t nxt_http_var_status(nxt_task_t *task, nxt_str_t *str,
void *ctx, void *data);
static nxt_int_t nxt_http_var_body_bytes_sent(nxt_task_t *task, nxt_str_t *str,
@@ -89,6 +91,10 @@ static nxt_var_decl_t nxt_http_vars[] = {
.name = nxt_string("request_line"),
.handler = nxt_http_var_request_line,
.cacheable = 1,
}, {
.name = nxt_string("request_id"),
.handler = nxt_http_var_request_id,
.cacheable = 1,
}, {
.name = nxt_string("status"),
.handler = nxt_http_var_status,
@@ -395,6 +401,32 @@ nxt_http_var_request_line(nxt_task_t *task, nxt_str_t *str, void *ctx,
}
static nxt_int_t
nxt_http_var_request_id(nxt_task_t *task, nxt_str_t *str, void *ctx,
void *data)
{
nxt_random_t *rand;
nxt_http_request_t *r;
r = ctx;
str->start = nxt_mp_nget(r->mem_pool, 32);
if (nxt_slow_path(str->start == NULL)) {
return NXT_ERROR;
}
str->length = 32;
rand = &task->thread->random;
(void) nxt_sprintf(str->start, str->start + 32, "%08xD%08xD%08xD%08xD",
nxt_random(rand), nxt_random(rand),
nxt_random(rand), nxt_random(rand));
return NXT_OK;
}
static nxt_int_t
nxt_http_var_body_bytes_sent(nxt_task_t *task, nxt_str_t *str, void *ctx,
void *data)

View File

@@ -211,6 +211,26 @@ def test_variables_request_line(search_in_file, wait_for_record):
assert wait_for_record(reg, 'access.log') is not None
def test_variables_request_id(search_in_file, wait_for_record, findall):
set_format('$uri $request_id $request_id')
assert search_in_file(r'/request_id', 'access.log') is None
assert client.get(url='/request_id_1')['status'] == 200
assert client.get(url='/request_id_2')['status'] == 200
assert wait_for_record(r'/request_id_2', 'access.log') is not None
id1 = findall(
r'^\/request_id_1 ([0-9a-f]{32}) ([0-9a-f]{32})$', 'access.log'
)[0]
id2 = findall(
r'^\/request_id_2 ([0-9a-f]{32}) ([0-9a-f]{32})$', 'access.log'
)[0]
assert id1[0] == id1[1], 'same ids first'
assert id2[0] == id2[1], 'same ids second'
assert id1[0] != id2[0], 'first id != second id'
def test_variables_status(search_in_file, wait_for_record):
set_format('$status')