127 lines
3.8 KiB
Lua
127 lines
3.8 KiB
Lua
--
|
|
-- 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.
|
|
--
|
|
|
|
function rewrite_body(tag, timestamp, record)
|
|
log = record["log"]
|
|
record["log"] = nil
|
|
record["date"] = nil
|
|
record["tags"] = {data={{key="LOG_KIND", value="SLOW_SQL"}}}
|
|
|
|
res = {}
|
|
|
|
res["time"] = os.time() * 1000
|
|
|
|
res["layer"] = "POSTGRESQL"
|
|
record["layer"] = "POSTGRESQL"
|
|
|
|
|
|
res["statement"] = log:match("statement: (.+)", statementIndex)
|
|
res["statement"] = string.gsub(res["statement"], '"', '\\"')
|
|
|
|
|
|
local durationString = log:match("duration: (%d+.%d+) ms", durationIndex)
|
|
res["query_time"] = math.floor(tonumber(durationString))
|
|
|
|
record["service"]="postgresql::postgres:5432"
|
|
res["service"]= "postgresql::postgres:5432"
|
|
|
|
res["id"] = uuid()
|
|
|
|
jsonstr = table2json(res)
|
|
record["body"]={json={}}
|
|
record["body"]["json"]["json"] = jsonstr
|
|
return 1, timestamp, record
|
|
end
|
|
|
|
local UUID_TEMPLATE = '%s-%s-%s-%s-%s'
|
|
|
|
local random_hex = {}
|
|
|
|
function random_hex.generate(n)
|
|
local seed = {'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'}
|
|
local s = ""
|
|
for i = 1, n do
|
|
s = s .. seed[math.random(1, 16)]
|
|
end
|
|
return s
|
|
end
|
|
|
|
function uuid(seed)
|
|
if seed then
|
|
math.randomseed(seed)
|
|
else
|
|
math.randomseed(os.time())
|
|
end
|
|
local sid = string.format(UUID_TEMPLATE,
|
|
random_hex.generate(4), random_hex.generate(4), random_hex.generate(4),
|
|
random_hex.generate(4), random_hex.generate(8)
|
|
)
|
|
return sid
|
|
end
|
|
|
|
function table2json(t)
|
|
local function serialize(tbl, structure)
|
|
local tmp = {}
|
|
for k, v in pairs(tbl) do
|
|
local k_type = type(k)
|
|
local v_type = type(v)
|
|
local key
|
|
if k_type == "string" then
|
|
key = '"' .. k .. '":'
|
|
elseif k_type == "number" then
|
|
key = ""
|
|
if structure == "array" then
|
|
key = ""
|
|
else
|
|
key = '"' .. k .. '":'
|
|
end
|
|
else
|
|
key = '"' .. tostring(k) .. '":'
|
|
end
|
|
local value
|
|
if v_type == "table" then
|
|
if next(v) == nil then
|
|
value = "null"
|
|
else
|
|
value = serialize(v, structure)
|
|
end
|
|
elseif v_type == "boolean" then
|
|
value = tostring(v)
|
|
elseif v_type == "string" then
|
|
value = '"' .. v .. '"'
|
|
else
|
|
value = v
|
|
end
|
|
tmp[#tmp + 1] = key and value and tostring(key) .. tostring(value) or nil
|
|
end
|
|
if structure == "array" then
|
|
return "[" .. table.concat(tmp, ",") .. "]"
|
|
else
|
|
return "{" .. table.concat(tmp, ",") .. "}"
|
|
end
|
|
end
|
|
assert(type(t) == "table")
|
|
if next(t) == nil then
|
|
return "null"
|
|
elseif next(t, next(t)) == nil and type(next(t)) == "number" then
|
|
return serialize(t, "array")
|
|
else
|
|
return serialize(t, "table")
|
|
end
|
|
end
|
|
|