diff options
Diffstat (limited to 'conf.d/project/lua.d')
-rw-r--r-- | conf.d/project/lua.d/CMakeLists.txt | 32 | ||||
-rw-r--r-- | conf.d/project/lua.d/xds-supervisor.lua | 119 |
2 files changed, 151 insertions, 0 deletions
diff --git a/conf.d/project/lua.d/CMakeLists.txt b/conf.d/project/lua.d/CMakeLists.txt new file mode 100644 index 0000000..1e64cf2 --- /dev/null +++ b/conf.d/project/lua.d/CMakeLists.txt @@ -0,0 +1,32 @@ +########################################################################### +# Copyright 2018 IoT.bzh +# +# author: Fulup Ar Foll <fulup@iot.bzh> +# +# Licensed 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. +########################################################################### + + +################################################## +# XDS Lua Scripts +################################################## +PROJECT_TARGET_ADD(xds-lua) + + file(GLOB LUA_FILES "*.lua") + + add_input_files("${LUA_FILES}") + + SET_TARGET_PROPERTIES(${TARGET_NAME} PROPERTIES + LABELS "DATA" + OUTPUT_NAME ${TARGET_NAME} + ) diff --git a/conf.d/project/lua.d/xds-supervisor.lua b/conf.d/project/lua.d/xds-supervisor.lua new file mode 100644 index 0000000..747d33d --- /dev/null +++ b/conf.d/project/lua.d/xds-supervisor.lua @@ -0,0 +1,119 @@ +--[[ + Copyright (C) 2018 "IoT.bzh" + Author Sebastien Douheret <sebastien@iot.bzh> + + Licensed 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. + + + NOTE: strict mode: every global variables should be prefixed by '_' +--]] + +-- return serialised version of printable table +function ToJson(o) + if type(o) == "table" then + local s = "{" + local i = 0 + for k, v in pairs(o) do + if (i > 0) then + s = s .. "," + end + i = i + 1 + if type(k) ~= "number" then + k = '"' .. k .. '"' + end + s = s .. k .. ":" .. ToJson(v) + end + return s .. "}" + else + return '"' .. tostring(o) .. '"' + end +end + +function _trace_hello_events_(source, args, event) + -- TODO nothing for now +end + +function _trace_Async_CB(source, response, context) + --AFB:debug(source, "--InLua-- _trace_Async_CB response=%s context=%s\n", Dump_Table(response), Dump_Table(context)) + + if (response["request"]["status"] ~= "success") then + AFB:error(source, "--InLua-- _trace_Async_CB response=%s context=%s", Dump_Table(response), Dump_Table(context)) + return + end +end + +function _trace_events_(source, args, event) + --AFB:notice(source, "--InLua-- ENTER _trace_events_ event=%s\n", Dump_Table(event)) + + local query = { + ["host"] = "localhost", + ["port"] = 8086, + ["metric"] = { + { + ["name"] = "supervisor/trace", + ["metadata"] = { + ["identity"] = "xds supervisor", + ["tag"] = event["tag"], + }, + ["values"] = { + ["id"] = event["id"] + }, + ["timestamp"] = event["time"] + } + } + } + + if event.request then + local request = event.request + -- Filter out some traces + -- if (request.action == "begin" and request.action == "end" and request.action == "json") then + -- AFB:debug(source, "--InLua-- _trace_events_ IGNORED event=%s\n", Dump_Table(event)) + -- return + -- end + AFB:notice(source, ">>> PROCESS request %s", request) + query.metric[1].metadata.api = request.api + query.metric[1].metadata.verb = request.verb + query.metric[1].metadata.action = request.action + query.metric[1].metadata.session = request.session + query.metric[1].metadata.req_index = tostring(request.index) + if event.data then + query.metric[1].values.data = ToJson(event.data) + end + + elseif event.event then + local evt = event.event + AFB:notice(source, ">>> PROCESS event %s", evt) + query.metric[1].metadata.id = evt.id + query.metric[1].metadata.name = evt.name + query.metric[1].metadata.action = evt.action + if event.data then + query.metric[1].values.data = ToJson(event.data) + end + + else + AFB:warning(source, "--InLua-- UNKNOWN _trace_events_ event type: %s\n", Dump_Table(event)) + return + end + + AFB:debug(source, "CALL harvester write query=%s", Dump_Table(query)) + local err, response = AFB:service(source, "harvester", "write", query, "_trace_Async_CB", query) + + -- FIXME SEB : still true ? + -- Note: in current version controls only return a status. Also we may safely ignore API response + if (err) then + AFB:error(source, "--LUA:_trace_events_ harvester write refuse response=%s", response) + return 1 + end + + return 0 +end |