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
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.
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::
- 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
@@ -1,2 +1,5 @@
from ..utils import is_enabled
if is_enabled():
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)
import json
import logging
import time
from os import environ
from odoo import models
from odoo.http import request as http_request
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')
output_method = _logger.info
class IrHttp(models.AbstractModel):
@@ -80,4 +93,4 @@ class IrHttp(models.AbstractModel):
@classmethod
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()))