diff --git a/changelog/unreleased/kong/fix-loggly-hostname-notfound.yml b/changelog/unreleased/kong/fix-loggly-hostname-notfound.yml new file mode 100644 index 000000000000..23ad46d028a5 --- /dev/null +++ b/changelog/unreleased/kong/fix-loggly-hostname-notfound.yml @@ -0,0 +1,2 @@ +message: "**Loggly**: Fixed an issue where `/bin/hostname` missing caused an error warning on startup." +type: bugfix diff --git a/kong/pdk/node.lua b/kong/pdk/node.lua index 9302c17cde1a..fe8bfbc72392 100644 --- a/kong/pdk/node.lua +++ b/kong/pdk/node.lua @@ -57,7 +57,9 @@ end local function new(self) - local _NODE = {} + local _NODE = { + hostname = nil, + } --- @@ -247,20 +249,23 @@ local function new(self) -- @usage -- local hostname = kong.node.get_hostname() function _NODE.get_hostname() - local SIZE = 253 -- max number of chars for a hostname + if not _NODE.hostname then + local SIZE = 253 -- max number of chars for a hostname - local buf = ffi_new("unsigned char[?]", SIZE) - local res = C.gethostname(buf, SIZE) + local buf = ffi_new("unsigned char[?]", SIZE) + local res = C.gethostname(buf, SIZE) - if res == 0 then - local hostname = ffi_str(buf, SIZE) - return gsub(hostname, "%z+$", "") + if res ~= 0 then + -- Return an empty string "" instead of nil and error message, + -- because strerror is not thread-safe and the behavior of strerror_r + -- is inconsistent across different systems. + return "" + end + + _NODE.hostname = gsub(ffi_str(buf, SIZE), "%z+$", "") end - local f = io.popen("/bin/hostname") - local hostname = f:read("*a") or "" - f:close() - return gsub(hostname, "\n$", "") + return _NODE.hostname end diff --git a/kong/plugins/loggly/handler.lua b/kong/plugins/loggly/handler.lua index 9288adb37b7c..39e70547e66f 100644 --- a/kong/plugins/loggly/handler.lua +++ b/kong/plugins/loggly/handler.lua @@ -1,6 +1,7 @@ local cjson = require "cjson" local sandbox = require "kong.tools.sandbox".sandbox local kong_meta = require "kong.meta" +local get_host_name = kong.node.get_hostname local kong = kong @@ -16,15 +17,6 @@ local insert = table.insert local sandbox_opts = { env = { kong = kong, ngx = ngx } } -local function get_host_name() - local f = io.popen("/bin/hostname") - local hostname = f:read("*a") or "" - f:close() - hostname = string.gsub(hostname, "\n$", "") - return hostname -end - - local HOSTNAME = get_host_name() local SENDER_NAME = "kong" local LOG_LEVELS = {