From f5d0deeb214af2bdc11313d7b621019cfd9fa675 Mon Sep 17 00:00:00 2001 From: Linden <65407488+thelindat@users.noreply.github.com> Date: Sun, 9 Oct 2022 00:24:49 +1100 Subject: [PATCH] refactor(server/logger): batch log submissions Create a temporary table and submit logs in a single batch after 500ms. Includes some micro-optimisation and a new convar to set logging service. --- .editorconfig | 2 +- imports/logger/server.lua | 68 +++++++++++++++++++++++++-------------- 2 files changed, 45 insertions(+), 25 deletions(-) diff --git a/.editorconfig b/.editorconfig index a127b12..7cc3d6a 100644 --- a/.editorconfig +++ b/.editorconfig @@ -5,7 +5,7 @@ root = true [*] end_of_line = lf -insert_final_newline = false +insert_final_newline = true charset = utf-8 trim_trailing_whitespace = false indent_size = 2 diff --git a/imports/logger/server.lua b/imports/logger/server.lua index d1e13d5..b31f876 100644 --- a/imports/logger/server.lua +++ b/imports/logger/server.lua @@ -1,30 +1,50 @@ -local key = GetConvar('datadog:key', '') +local service = GetConvar('ox:logger', 'datadog') +local hostname = GetConvar('sv_projectName', 'fxserver') +local buffer +local bufferSize = 0 -if key ~= '' then - local site = ('https://http-intake.logs.%s/api/v2/logs'):format(GetConvar('datadog:site', 'datadoghq.com')) - local resourceName = GetCurrentResourceName() - key = key:gsub("[\'\"]", '') +local function badResponse(endpoint, response) + print(('unable to submit logs to %s\n%s'):format(endpoint, json.encode(response, { indent = true }))) +end - function lib.logger(source, event, message, ...) - local data = json.encode({ - hostname = resourceName, - service = event, - message = message, - ddsource = tostring(source), - ddtags = string.strjoin(',', string.tostringall(...)) - }) +if service == 'datadog' then + local key = GetConvar('datadog:key', ''):gsub("[\'\"]", '') - PerformHttpRequest(site, function(status, _, _, response) - if status ~= 202 then - -- Thanks, I hate it - response = json.decode(response:sub(10)).errors[1] - print(('unable to submit logs to %s\n%s'):format(site, json.encode(response, {indent=true}))) - end - end, 'POST', data, { - ['Content-Type'] = 'application/json', - ['DD-API-KEY'] = key - }) - end + if key ~= '' then + local endpoint = ('https://http-intake.logs.%s/api/v2/logs'):format(GetConvar('datadog:site', 'datadoghq.com')) + + local headers = { + ['Content-Type'] = 'application/json', + ['DD-API-KEY'] = key, + } + + function lib.logger(source, event, message, ...) + if not buffer then + buffer = {} + + SetTimeout(500, function() + PerformHttpRequest(endpoint, function(status, _, _, response) + if status ~= 202 then + badResponse(endpoint, json.decode(response:sub(10)).errors[1]) + end + end, 'POST', json.encode(buffer), headers) + + buffer = nil + bufferSize = 0 + end) + end + + bufferSize += 1 + buffer[bufferSize] = { + hostname = hostname, + service = event, + message = message, + resource = cache.resource, + ddsource = tostring(source), + ddtags = string.strjoin(',', string.tostringall(...)) + } + end + end end return lib.logger or function() end