monitoring_log_requests: Improve data output

* Add environment var to enable/disable requests log
* Add ability to send data to an UDP listener instead of stdout
This commit is contained in:
Patrick Tombez
2020-09-03 10:48:59 +02:00
parent af8cee48fb
commit 41ce092562
5 changed files with 44 additions and 5 deletions
+13 -1
View File
@@ -6,7 +6,14 @@ Monitoring: Requests Logging
This addon is used to output in the logs informations about the user's This addon is used to output in the logs informations about the user's
requests. Data such as *what* is the request, *who* requested it and *how requests. Data such as *what* is the request, *who* requested it and *how
much* time did it took to complete could then be extracted from the logs and much* time did it took to complete.
The requests logging is activated with the environment variable `ODOO_REQUESTS_LOGGING` set to `1`.
Data output
###########
The data could then be extracted from the logs and
loaded in an analysis tool such as ElasticSearch/Kibana. loaded in an analysis tool such as ElasticSearch/Kibana.
Each log line is a JSON with the monitored fields, so it is easier to parse. Each log line is a JSON with the monitored fields, so it is easier to parse.
@@ -15,3 +22,8 @@ The logs are prefixed with ``monitoring.http.requests`` so be sure to enable
this path in the log handler:: this path in the log handler::
- LOG_HANDLER=":WARNING,monitoring.http.requests:INFO" - LOG_HANDLER=":WARNING,monitoring.http.requests:INFO"
It is also possible to send the data directly to an UDP listener without
outputting anything to the logs to avoid flooding on busy instances.
To do so, use the environment variable `ODOO_REQUESTS_LOGGING_UDP`
set to a value like `<address>:<port>` (`address` can be an IP or a domain).
+1
View File
@@ -1,2 +1,3 @@
from . import utils
from . import models from . import models
@@ -1,2 +1,5 @@
from ..utils import is_enabled
if is_enabled():
from . import ir_http from . import ir_http
+15 -2
View File
@@ -2,15 +2,28 @@
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html) # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html)
import json import json
import logging
import time import time
from os import environ
from odoo import models from odoo import models
from odoo.http import request as http_request from odoo.http import request as http_request
from odoo.tools.config import config from odoo.tools.config import config
udp_dest = environ.get('ODOO_REQUESTS_LOGGING_UDP')
if udp_dest:
import socket
import atexit
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, 0)
atexit.register(sock.close)
ip, port = udp_dest.split(':')
def output_method(data):
sock.sendto(data.encode('utf-8'), (ip, port))
else:
import logging
_logger = logging.getLogger('monitoring.http.requests') _logger = logging.getLogger('monitoring.http.requests')
output_method = _logger.info
class IrHttp(models.AbstractModel): class IrHttp(models.AbstractModel):
@@ -80,4 +93,4 @@ class IrHttp(models.AbstractModel):
@classmethod @classmethod
def _monitoring_log(cls, info): def _monitoring_log(cls, info):
_logger.info(json.dumps(info)) output_method(json.dumps(info))
+10
View File
@@ -0,0 +1,10 @@
# Copyright 2020 Camptocamp SA
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html)
from distutils.util import strtobool
from os import environ
def is_enabled():
env_val = environ.get('ODOO_REQUESTS_LOGGING')
return bool(strtobool(env_val or '0'.lower()))