[NEW] maintenance_service_http_monitoring : check HTTP 200 for services
Some checks failed
pre-commit / pre-commit (pull_request) Failing after 1m34s
Some checks failed
pre-commit / pre-commit (pull_request) Failing after 1m34s
This commit is contained in:
@@ -0,0 +1,69 @@
|
||||
import logging
|
||||
from datetime import datetime
|
||||
from odoo import models, fields, api
|
||||
|
||||
try:
|
||||
import requests
|
||||
except ImportError:
|
||||
requests = None
|
||||
|
||||
_logger = logging.getLogger(__name__)
|
||||
|
||||
HTTP_CHECK_TIMEOUT = 10 # seconds
|
||||
|
||||
class ServiceInstance(models.Model):
|
||||
_inherit = 'service.instance'
|
||||
|
||||
last_http_status_code = fields.Integer(
|
||||
string="Last HTTP Status Code",
|
||||
readonly=True,
|
||||
default=0,
|
||||
)
|
||||
last_http_check_date = fields.Datetime(
|
||||
string="Last HTTP Check Date",
|
||||
readonly=True,
|
||||
)
|
||||
http_status_ok = fields.Boolean(
|
||||
string="HTTP Status OK",
|
||||
readonly=True,
|
||||
default=True,
|
||||
)
|
||||
|
||||
def check_http_status(self):
|
||||
for rec in self:
|
||||
if not rec.service_url or not rec.equipment_id:
|
||||
continue
|
||||
equipment = rec.equipment_id
|
||||
if getattr(equipment, 'maintenance_mode', False):
|
||||
continue
|
||||
status_ok = False
|
||||
status_code = -1
|
||||
now = fields.Datetime.now()
|
||||
url = rec.service_url
|
||||
if not url.lower().startswith("https://"):
|
||||
url = "https://" + url.lstrip("http://")
|
||||
try:
|
||||
response = requests.get(url, timeout=HTTP_CHECK_TIMEOUT)
|
||||
status_code = response.status_code
|
||||
status_ok = (status_code == 200)
|
||||
except requests.exceptions.RequestException as e:
|
||||
_logger.warning(f"HTTP check failed for %s: %s", rec.service_url, e)
|
||||
rec.write({
|
||||
'last_http_status_code': status_code,
|
||||
'last_http_check_date': now,
|
||||
'http_status_ok': status_ok,
|
||||
})
|
||||
if not status_ok:
|
||||
# Delegate maintenance.request creation to equipment
|
||||
if hasattr(equipment, 'create_http_maintenance_request'):
|
||||
equipment.create_http_maintenance_request([rec])
|
||||
|
||||
@api.model
|
||||
def cron_check_http_services(self):
|
||||
domain = [('service_url', '!=', False), ('equipment_id', '!=', False)]
|
||||
services = self.search(domain)
|
||||
for service in services:
|
||||
equipment = service.equipment_id
|
||||
if getattr(equipment, 'maintenance_mode', False):
|
||||
continue
|
||||
service.check_http_status()
|
||||
Reference in New Issue
Block a user