363 lines
9.9 KiB
Lua
363 lines
9.9 KiB
Lua
local helpers = require "spec.helpers"
|
|
local cjson = require "cjson"
|
|
|
|
|
|
local UDP_PORT = 20000
|
|
|
|
|
|
for _, strategy in helpers.each_strategy() do
|
|
describe("Plugin: loggly (log) [#" .. strategy .. "]", function()
|
|
local proxy_client
|
|
local proxy_client_grpc
|
|
|
|
lazy_setup(function()
|
|
local bp = helpers.get_db_utils(strategy, {
|
|
"routes",
|
|
"services",
|
|
"plugins",
|
|
})
|
|
|
|
local route1 = bp.routes:insert {
|
|
hosts = { "logging.test" },
|
|
}
|
|
|
|
local route2 = bp.routes:insert {
|
|
hosts = { "logging1.test" },
|
|
}
|
|
|
|
local route3 = bp.routes:insert {
|
|
hosts = { "logging2.test" },
|
|
}
|
|
|
|
local route4 = bp.routes:insert {
|
|
hosts = { "logging3.test" },
|
|
}
|
|
|
|
local route5 = bp.routes:insert {
|
|
hosts = { "logging4.test" },
|
|
}
|
|
|
|
bp.plugins:insert {
|
|
route = { id = route1.id },
|
|
name = "loggly",
|
|
config = {
|
|
host = "127.0.0.1",
|
|
port = UDP_PORT,
|
|
key = "123456789",
|
|
log_level = "info",
|
|
successful_severity = "warning"
|
|
}
|
|
}
|
|
|
|
bp.plugins:insert {
|
|
route = { id = route2.id },
|
|
name = "loggly",
|
|
config = {
|
|
host = "127.0.0.1",
|
|
port = UDP_PORT,
|
|
key = "123456789",
|
|
log_level = "debug",
|
|
timeout = 2000,
|
|
successful_severity = "info",
|
|
}
|
|
}
|
|
|
|
bp.plugins:insert {
|
|
route = { id = route3.id },
|
|
name = "loggly",
|
|
config = {
|
|
host = "127.0.0.1",
|
|
port = UDP_PORT,
|
|
key = "123456789",
|
|
log_level = "crit",
|
|
successful_severity = "crit",
|
|
client_errors_severity = "warning",
|
|
}
|
|
}
|
|
|
|
bp.plugins:insert {
|
|
route = { id = route4.id },
|
|
name = "loggly",
|
|
config = {
|
|
host = "127.0.0.1",
|
|
port = UDP_PORT,
|
|
key = "123456789"
|
|
}
|
|
}
|
|
|
|
bp.plugins:insert {
|
|
route = { id = route5.id },
|
|
name = "loggly",
|
|
config = {
|
|
host = "127.0.0.1",
|
|
port = UDP_PORT,
|
|
key = "123456789",
|
|
custom_fields_by_lua = {
|
|
new_field = "return 123",
|
|
["nested.keys"] = "return 456",
|
|
["escape\\.dots"] = "return 789",
|
|
["nested.escape\\.dots"] = "return 135",
|
|
route = "return nil", -- unset route field
|
|
}
|
|
}
|
|
}
|
|
|
|
-- grpc [[
|
|
local grpc_service = bp.services:insert {
|
|
name = "grpc-service",
|
|
url = helpers.grpcbin_url,
|
|
}
|
|
|
|
local grpc_route1 = bp.routes:insert {
|
|
service = grpc_service,
|
|
hosts = { "grpc_logging.test" },
|
|
}
|
|
|
|
local grpc_route2 = bp.routes:insert {
|
|
service = grpc_service,
|
|
hosts = { "grpc_logging1.test" },
|
|
}
|
|
|
|
local grpc_route3 = bp.routes:insert {
|
|
service = grpc_service,
|
|
hosts = { "grpc_logging2.test" },
|
|
}
|
|
|
|
bp.plugins:insert {
|
|
route = { id = grpc_route1.id },
|
|
name = "loggly",
|
|
config = {
|
|
host = "127.0.0.1",
|
|
port = UDP_PORT,
|
|
key = "123456789",
|
|
log_level = "info",
|
|
successful_severity = "warning"
|
|
}
|
|
}
|
|
|
|
bp.plugins:insert {
|
|
route = { id = grpc_route2.id },
|
|
name = "loggly",
|
|
config = {
|
|
host = "127.0.0.1",
|
|
port = UDP_PORT,
|
|
key = "123456789",
|
|
log_level = "debug",
|
|
timeout = 2000,
|
|
successful_severity = "info",
|
|
}
|
|
}
|
|
|
|
bp.plugins:insert {
|
|
route = { id = grpc_route3.id },
|
|
name = "loggly",
|
|
config = {
|
|
host = "127.0.0.1",
|
|
port = UDP_PORT,
|
|
key = "123456789",
|
|
log_level = "crit",
|
|
successful_severity = "crit",
|
|
client_errors_severity = "warning",
|
|
}
|
|
}
|
|
|
|
-- grpc ]]
|
|
|
|
assert(helpers.start_kong({
|
|
database = strategy,
|
|
nginx_conf = "spec/fixtures/custom_nginx.template",
|
|
}))
|
|
|
|
proxy_client_grpc = helpers.proxy_client_grpc()
|
|
end)
|
|
|
|
lazy_teardown(function()
|
|
helpers.stop_kong()
|
|
end)
|
|
|
|
before_each(function()
|
|
proxy_client = helpers.proxy_client()
|
|
end)
|
|
|
|
after_each(function()
|
|
if proxy_client then
|
|
proxy_client:close()
|
|
end
|
|
end)
|
|
|
|
-- Helper; performs a single http request and catches the udp log output.
|
|
-- @param message the message table for the http client
|
|
-- @param status expected status code from the request, defaults to 200 if omitted
|
|
-- @return 2 values; 'pri' field (string) and the decoded json content (table)
|
|
local function run(message, status)
|
|
local thread = assert(helpers.udp_server(UDP_PORT))
|
|
local response = assert(proxy_client:send(message))
|
|
assert.res_status(status or 200, response)
|
|
|
|
local ok, res = thread:join()
|
|
assert.truthy(ok)
|
|
assert.truthy(res)
|
|
|
|
local pri = assert(res:match("^<(%d-)>"))
|
|
local json = assert(res:match("{.*}"))
|
|
|
|
return pri, cjson.decode(json)
|
|
end
|
|
|
|
local function run_grpc(host)
|
|
local thread = assert(helpers.udp_server(UDP_PORT))
|
|
|
|
local ok, resp = proxy_client_grpc({
|
|
service = "hello.HelloService.SayHello",
|
|
body = {
|
|
greeting = "world!"
|
|
},
|
|
opts = {
|
|
["-authority"] = host,
|
|
}
|
|
})
|
|
assert.truthy(ok)
|
|
assert.truthy(resp)
|
|
|
|
local ok, res = thread:join()
|
|
assert.truthy(ok)
|
|
assert.truthy(res)
|
|
|
|
local pri = assert(res:match("^<(%d-)>"))
|
|
local json = assert(res:match("{.*}"))
|
|
|
|
return pri, cjson.decode(json)
|
|
end
|
|
|
|
it("logs to UDP when severity is warning and log level info", function()
|
|
local pri, message = run({
|
|
method = "GET",
|
|
path = "/request",
|
|
headers = {
|
|
host = "logging.test"
|
|
}
|
|
})
|
|
assert.equal("12", pri)
|
|
assert.equal("127.0.0.1", message.client_ip)
|
|
end)
|
|
|
|
it("logs to UDP when severity is warning and log level info #grpc", function()
|
|
local pri, message = run_grpc("grpc_logging.test")
|
|
assert.equal("12", pri)
|
|
assert.equal("127.0.0.1", message.client_ip)
|
|
end)
|
|
|
|
it("logs to UDP when severity is info and log level debug", function()
|
|
local pri, message = run({
|
|
method = "GET",
|
|
path = "/request",
|
|
headers = {
|
|
host = "logging1.test"
|
|
}
|
|
})
|
|
assert.equal("14", pri)
|
|
assert.equal("127.0.0.1", message.client_ip)
|
|
end)
|
|
|
|
it("logs to UDP when severity is info and log level debug #grpc", function()
|
|
local pri, message = run_grpc("grpc_logging1.test")
|
|
assert.equal("14", pri)
|
|
assert.equal("127.0.0.1", message.client_ip)
|
|
end)
|
|
|
|
it("logs to UDP when severity is critical and log level critical", function()
|
|
local pri, message = run({
|
|
method = "GET",
|
|
path = "/request",
|
|
headers = {
|
|
host = "logging2.test"
|
|
}
|
|
})
|
|
assert.equal("10", pri)
|
|
assert.equal("127.0.0.1", message.client_ip)
|
|
end)
|
|
|
|
it("logs to UDP when severity is critical and log level critical #grpc", function()
|
|
local pri, message = run_grpc("grpc_logging2.test")
|
|
assert.equal("10", pri)
|
|
assert.equal("127.0.0.1", message.client_ip)
|
|
end)
|
|
|
|
it("logs to UDP when severity and log level are default values", function()
|
|
local pri, message = run({
|
|
method = "GET",
|
|
path = "/",
|
|
headers = {
|
|
host = "logging3.test"
|
|
}
|
|
})
|
|
assert.equal("14", pri)
|
|
assert.equal("127.0.0.1", message.client_ip)
|
|
end)
|
|
|
|
it("logs to UDP when severity and log level are default values and response status is 200", function()
|
|
local pri, message = run({
|
|
method = "GET",
|
|
path = "/",
|
|
headers = {
|
|
host = "logging3.test"
|
|
}
|
|
})
|
|
assert.equal("14", pri)
|
|
assert.equal("127.0.0.1", message.client_ip)
|
|
end)
|
|
|
|
it("logs to UDP when severity and log level are default values and response status is 401", function()
|
|
local pri, message = run({
|
|
method = "GET",
|
|
path = "/status/401",
|
|
headers = {
|
|
host = "logging3.test"
|
|
}
|
|
}, 401)
|
|
assert.equal("14", pri)
|
|
assert.equal("127.0.0.1", message.client_ip)
|
|
end)
|
|
|
|
it("logs to UDP when severity and log level are default values and response status is 500", function()
|
|
local pri, message = run({
|
|
method = "GET",
|
|
path = "/status/500",
|
|
headers = {
|
|
host = "logging3.test"
|
|
}
|
|
}, 500)
|
|
assert.equal("14", pri)
|
|
assert.equal("127.0.0.1", message.client_ip)
|
|
end)
|
|
|
|
describe("custom log values by lua", function()
|
|
it("logs custom values", function()
|
|
local pri, message = run({
|
|
method = "GET",
|
|
path = "/status/500",
|
|
headers = {
|
|
host = "logging4.test"
|
|
}
|
|
}, 500)
|
|
assert.equal("14", pri)
|
|
assert.equal(123, message.new_field)
|
|
assert.same(456, message.nested.keys)
|
|
assert.same(789, message["escape.dots"])
|
|
assert.same(135, message.nested["escape.dots"])
|
|
end)
|
|
it("unsets existing log values", function()
|
|
local pri, message = run({
|
|
method = "GET",
|
|
path = "/status/500",
|
|
headers = {
|
|
host = "logging4.test"
|
|
}
|
|
}, 500)
|
|
assert.equal("14", pri)
|
|
assert.equal(nil, message.route)
|
|
end)
|
|
end)
|
|
end)
|
|
end
|