Merge pull request #292 from camptocamp/10.0-bp-monitoring_prometheus

[10.0] Backport monitoring_prometheus from 13.0
This commit is contained in:
Yannick Vaucher
2021-11-15 14:34:40 +01:00
committed by GitHub
co-authored by GitHub
8 changed files with 112 additions and 0 deletions
+17
View File
@@ -0,0 +1,17 @@
.. image:: https://img.shields.io/badge/licence-AGPL--3-blue.svg
:alt: License
==============================
Monitoring: Prometheus metrics
==============================
Add an endpoint */metrics* to allow a Prometheus server to fetch application metrics.
Current available metrics are:
* Request completion time with 3 differentiators:
* Filestore
* Assets
* Everything else
* Longpolling request count
No additional configuration is needed, just ensure that the Prometheus server is allowed to communicate with Odoo
+2
View File
@@ -0,0 +1,2 @@
from . import controllers
from . import models
+23
View File
@@ -0,0 +1,23 @@
# -*- coding: utf-8 -*-
# Copyright 2016-2021 Camptocamp SA
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html)
{
"name": "Monitoring: Prometheus Metrics",
"version": "10.0.1.0.0",
"author": "Camptocamp,Odoo Community Association (OCA)",
"license": "AGPL-3",
"category": "category",
"depends": [
"base",
"web",
"server_environment",
],
"website": "http://www.camptocamp.com",
"data": [],
"external_dependencies": {
"python": ["prometheus_client"],
},
"installable": True,
}
@@ -0,0 +1 @@
from . import prometheus_metrics
@@ -0,0 +1,19 @@
# -*- coding: utf-8 -*-
# Copyright 2016-2021 Camptocamp SA
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html)
import logging
from odoo.http import Controller, route
_logger = logging.getLogger(__name__)
try:
from prometheus_client import generate_latest
except (ImportError, IOError) as err:
_logger.warning(err)
class PrometheusController(Controller):
@route('/metrics', auth='public')
def metrics(self):
return generate_latest()
+1
View File
@@ -0,0 +1 @@
from . import ir_http
+48
View File
@@ -0,0 +1,48 @@
# -*- coding: utf-8 -*-
# Copyright 2016-2021 Camptocamp SA
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html)
import logging
from odoo import models
from odoo.http import request
_logger = logging.getLogger(__name__)
try:
from prometheus_client import Summary, Counter
except (ImportError, IOError) as err:
_logger.warning(err)
REQUEST_TIME = Summary(
"request_latency_sec", "Request response time in sec", ["query_type"]
)
LONGPOLLING_COUNT = Counter("longpolling", "Longpolling request count")
class IrHttp(models.AbstractModel):
_inherit = "ir.http"
@classmethod
def _dispatch(cls):
path_info = request.httprequest.environ.get("PATH_INFO")
if path_info.startswith("/longpolling/"):
LONGPOLLING_COUNT.inc()
return super(IrHttp, cls)._dispatch()
if path_info.startswith("/metrics"):
return super(IrHttp, cls)._dispatch()
if path_info.startswith("/web/static"):
label = "assets"
elif path_info.startswith("/web/content"):
label = "filestore"
else:
label = "client"
res = None
with REQUEST_TIME.labels(label).time():
res = super(IrHttp, cls)._dispatch()
return res
+1
View File
@@ -9,3 +9,4 @@ python-keystoneclient==3.22.0
keystoneauth1==3.14.0
# error with 5.x (ConstructorError: could not determine a constructor for the tag '!record')
PyYAML==4.2b4
prometheus_client==0.11.0