Skip to content

Commit

Permalink
feat: How to distinguish whether the 5xx status code (eg 500) comes f…
Browse files Browse the repository at this point in the history
…rom upstream or apisix.

close apache#2501
  • Loading branch information
Firstsawyou committed Nov 25, 2020
1 parent f4161d3 commit b10b036
Show file tree
Hide file tree
Showing 3 changed files with 175 additions and 0 deletions.
6 changes: 6 additions & 0 deletions apisix/init.lua
Original file line number Diff line number Diff line change
Expand Up @@ -629,6 +629,12 @@ end
function _M.http_header_filter_phase()
core.response.set_header("Server", ver_header)

local status_code = tonumber(get_var("upstream_status"))
if status_code >= 500 and status_code <=599 then
core.response.set_header("X-Apisix-Upstream-Status", status_code)
core.log.info("X-Apisix-Upstream-Status:", status_code)
end

common_phase("header_filter")
end

Expand Down
4 changes: 4 additions & 0 deletions t/lib/server.lua
Original file line number Diff line number Diff line change
Expand Up @@ -365,4 +365,8 @@ function _M.log()
end


function _M.server_error()
error("500 Internal Server Error")
end

return _M
165 changes: 165 additions & 0 deletions t/node/upstream-status-5xx.t
Original file line number Diff line number Diff line change
@@ -0,0 +1,165 @@
#
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements. See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
use t::APISIX 'no_plan';

repeat_each(1);
log_level('info');
worker_connections(256);
no_root_location();
no_shuffle();

run_tests();

__DATA__

=== TEST 1: set route(id: 1)
--- config
location /t {
content_by_lua_block {
local t = require("lib.test_admin").test
local code, body = t('/apisix/admin/routes/1',
ngx.HTTP_PUT,
[[{
"methods": ["GET"],
"upstream": {
"nodes": {
"127.0.0.1:1980": 1
},
"type": "roundrobin",
"timeout": {
"connect": 0.5,
"send": 0.5,
"read": 0.5
}
},
"uri": "/sleep1"
}]]
)

if code >= 300 then
ngx.status = code
end
ngx.say(body)
}
}
--- request
GET /t
--- response_body
passed
--- no_error_log
[error]



=== TEST 2: hit routes (timeout)
--- request
GET /sleep1
--- error_code: 504
--- response_body eval
qr/504 Gateway Time-out/
--- error_log
X-Apisix-Upstream-Status:504



=== TEST 3: set route(id: 1), upstream service is not available
--- config
location /t {
content_by_lua_block {
local t = require("lib.test_admin").test
local code, body = t('/apisix/admin/routes/1',
ngx.HTTP_PUT,
[[{
"methods": ["GET"],
"upstream": {
"nodes": {
"127.0.0.1:1880": 1
},
"type": "roundrobin"
},
"uri": "/hello"
}]]
)

if code >= 300 then
ngx.status = code
end
ngx.say(body)
}
}
--- request
GET /t
--- response_body
passed
--- no_error_log
[error]



=== TEST 4: hit routes (502 Bad Gateway)
--- request
GET /hello
--- error_code: 502
--- response_body eval
qr/502 Bad Gateway/
--- error_log
X-Apisix-Upstream-Status:502



=== TEST 5: set route(id: 1)
--- config
location /t {
content_by_lua_block {
local t = require("lib.test_admin").test
local code, body = t('/apisix/admin/routes/1',
ngx.HTTP_PUT,
[[{
"methods": ["GET"],
"upstream": {
"nodes": {
"127.0.0.1:1980": 1
},
"type": "roundrobin"
},
"uri": "/server_error"
}]]
)

if code >= 300 then
ngx.status = code
end
ngx.say(body)
}
}
--- request
GET /t
--- response_body
passed
--- no_error_log
[error]



=== TEST 6: hit routes(500 Internal Server Error)
--- request
GET /server_error
--- error_code: 500
--- response_body eval
qr/>500 Internal Server Error/
--- error_log
X-Apisix-Upstream-Status:500

0 comments on commit b10b036

Please sign in to comment.