Skip to content

Commit db37b1f

Browse files
feat: expose upstream_unresolved_host as an nginx variable for the access log
Declare $upstream_unresolved_host in the nginx template and route writes through ctx.var (ngx_var_names), mirroring $llm_content_risk_level, so the pre-DNS upstream host is usable in the native access_log, not just APISIX logger plugins.
1 parent 347e12b commit db37b1f

5 files changed

Lines changed: 59 additions & 5 deletions

File tree

apisix/balancer.lua

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -252,7 +252,7 @@ local function pick_server(route, ctx)
252252
local node = up_conf.nodes[1]
253253
ctx.balancer_ip = node.host
254254
ctx.balancer_port = node.port
255-
ctx.upstream_unresolved_host = node.domain or node.host
255+
ctx.var.upstream_unresolved_host = node.domain or node.host
256256
node.upstream_host = parse_server_for_upstream_host(node, ctx.upstream_scheme)
257257
return node
258258
end
@@ -338,7 +338,7 @@ local function pick_server(route, ctx)
338338
res.domain = domain
339339
ctx.balancer_ip = res.host
340340
ctx.balancer_port = res.port
341-
ctx.upstream_unresolved_host = res.domain or res.host
341+
ctx.var.upstream_unresolved_host = res.domain or res.host
342342
ctx.server_picker = server_picker
343343
res.upstream_host = parse_server_for_upstream_host(res, ctx.upstream_scheme)
344344

apisix/cli/ngx_tpl.lua

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -810,6 +810,7 @@ http {
810810
811811
set $upstream_scheme 'http';
812812
set $upstream_host $http_host;
813+
set $upstream_unresolved_host '';
813814
set $upstream_uri '';
814815
set $request_line '';
815816
set $ctx_ref '';

apisix/core/ctx.lua

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,7 @@ do
190190
local ngx_var_names = {
191191
upstream_scheme = true,
192192
upstream_host = true,
193+
upstream_unresolved_host = true,
193194
upstream_upgrade = true,
194195
upstream_connection = true,
195196
upstream_uri = true,
@@ -244,8 +245,6 @@ do
244245
route_name = true,
245246
service_id = true,
246247
service_name = true,
247-
-- the upstream host before DNS resolution (configured domain/host)
248-
upstream_unresolved_host = true,
249248
}
250249

251250
local mt = {

t/APISIX.pm

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -718,7 +718,7 @@ _EOC_
718718
require("apisix").http_exit_worker()
719719
}
720720
721-
log_format main escape=default '\$remote_addr - \$remote_user [\$time_local] \$http_host "\$request_line" \$status \$body_bytes_sent \$request_time "\$http_referer" "\$http_user_agent" \$upstream_addr \$upstream_status \$apisix_upstream_response_time "\$upstream_scheme://\$upstream_host\$upstream_uri" \$request_llm_model \$llm_model \$llm_time_to_first_token \$llm_prompt_tokens \$llm_completion_tokens \$llm_total_tokens \$llm_stream \$llm_has_tool_calls \$llm_tool_count \$llm_end_user_id \$llm_cache_read_input_tokens \$llm_cache_creation_input_tokens \$llm_reasoning_tokens "\$rate_limiting_info"';
721+
log_format main escape=default '\$remote_addr - \$remote_user [\$time_local] \$http_host "\$request_line" \$status \$body_bytes_sent \$request_time "\$http_referer" "\$http_user_agent" \$upstream_addr \$upstream_status \$apisix_upstream_response_time "\$upstream_scheme://\$upstream_host\$upstream_uri" unresolved_host=\$upstream_unresolved_host \$request_llm_model \$llm_model \$llm_time_to_first_token \$llm_prompt_tokens \$llm_completion_tokens \$llm_total_tokens \$llm_stream \$llm_has_tool_calls \$llm_tool_count \$llm_end_user_id \$llm_cache_read_input_tokens \$llm_cache_creation_input_tokens \$llm_reasoning_tokens "\$rate_limiting_info"';
722722
723723
# fake server, only for test
724724
server {
@@ -896,6 +896,7 @@ _EOC_
896896
897897
set \$upstream_scheme 'http';
898898
set \$upstream_host \$http_host;
899+
set \$upstream_unresolved_host '';
899900
set \$upstream_uri '';
900901
set \$request_line '';
901902
set \$ctx_ref '';

t/core/ctx.t

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -915,3 +915,56 @@ GET /hello
915915
hello world
916916
--- error_log eval
917917
qr/request log: \{"route_id":"1","route_name":"my_route","service_id":"1","service_name":"my_service"\}/
918+
919+
920+
921+
=== TEST 36: upstream_unresolved_host is available in the nginx access log
922+
--- config
923+
location /t {
924+
content_by_lua_block {
925+
local t = require("lib.test_admin").test
926+
local code, body = t('/apisix/admin/routes/1',
927+
ngx.HTTP_PUT,
928+
[[{
929+
"uri": "/hello",
930+
"upstream": {
931+
"nodes": {
932+
"localhost:1980": 1
933+
},
934+
"type": "roundrobin"
935+
}
936+
}]]
937+
)
938+
if code >= 300 then
939+
ngx.status = code
940+
ngx.say(body)
941+
return
942+
end
943+
944+
-- a real proxied request so the access log line gets written
945+
local http = require("resty.http")
946+
local httpc = http.new()
947+
local res, err = httpc:request_uri(
948+
"http://127.0.0.1:" .. ngx.var.server_port .. "/hello")
949+
if not res or res.status ~= 200 then
950+
ngx.say("request failed: ", err or res.status)
951+
return
952+
end
953+
-- let the log phase flush the access log line
954+
ngx.sleep(0.1)
955+
956+
local fd = assert(io.open(ngx.config.prefix() .. "logs/access.log", "r"))
957+
local content = fd:read("*a")
958+
fd:close()
959+
-- the configured domain shows up before DNS resolution
960+
if content:find("unresolved_host=localhost", 1, true) then
961+
ngx.say("found")
962+
else
963+
ngx.say("not found")
964+
end
965+
}
966+
}
967+
--- request
968+
GET /t
969+
--- response_body
970+
found

0 commit comments

Comments
 (0)