Current File : //opt/cloudlinux/venv/lib64/python3.11/site-packages/cl_plus/collectors/apache.py |
# coding=utf-8
#
# Copyright © Cloud Linux GmbH & Cloud Linux Software, Inc 2010-2020 All Rights Reserved
#
# Licensed under CLOUD LINUX LICENSE AGREEMENT
# http://cloudlinux.com/docs/LICENCE.TXT
#
from .collector_base import CollectorBase
from cl_plus.utils.web_server_helper import WebServerHelper
class ApacheCollector(CollectorBase):
def __init__(self, _logger):
super(ApacheCollector, self).__init__(_logger)
self._current_connections = 0
self._old_total_connections_number = 0
self._is_get_current_connections_number_error = False
self._is_total_connections_error = False
self._is_get_connections_num_error = False
self._web_helper = None
def init(self):
"""
Initialize Apache collector
:return: None
"""
self._logger.info("Apache/Litespeed collector init")
self._reset_to_initial_state()
self._web_helper = WebServerHelper(self._logger)
def _reset_to_initial_state(self):
"""
Resets all counters to initial state
:return: None
"""
self._current_connections = 0
self._aggregated_data_count = 0
def _get_total_connections(self):
"""
Get web server total connections (from web server config)
:return: number of workers
"""
num, error_msg = self._web_helper.get_total_connections()
if error_msg != 'OK':
if not self._is_total_connections_error:
msg = "Apache collector: can't get web server total connections: {}".format(error_msg)
self._logger.warn(msg)
self._is_total_connections_error = True
else:
self._is_total_connections_error = False
return num
def _get_connections_number(self):
"""
Get apache connections number (from apache's mod_status - panel specific)
:return: number
"""
# From mod_status (panel specific)
new_connections_number, error_msg = self._web_helper.get_connections_number()
if error_msg != 'OK':
if not self._is_get_connections_num_error:
msg = "Apache collector: can't retrieve apache connections number: {}".format(error_msg)
self._logger.warn(msg)
self._is_get_connections_num_error = True
return 0
self._is_get_connections_num_error = False
if new_connections_number >= self._old_total_connections_number:
# Apache was not restarted
connections_number_diff = new_connections_number - self._old_total_connections_number
else:
connections_number_diff = new_connections_number
self._old_total_connections_number = new_connections_number
return connections_number_diff
def aggregate_new_data(self):
"""
Retrieve and aggregate new data (each 5 sec)
:return None
"""
# Retrieve current connection number for current web server (/bin/netstat -nt ...)
self._current_connections, error_msg = self._web_helper.get_current_connections_number()
if error_msg != 'OK':
if not self._is_get_current_connections_number_error:
self._logger.warn("Apache collector: can't obtain current connections number: {}".format(error_msg))
self._is_get_current_connections_number_error = True
else:
self._is_get_current_connections_number_error = False
self._aggregated_data_count += 1
def get_averages(self):
"""
Get collector's averages data (each minute)
:return: dict:
{"apache": {"total_connections": 150, "connections_number": 0, "requests_number": 1}}
or None if can't get data
"""
if not self._web_helper.detect_active_server() or self._aggregated_data_count == 0:
self._reset_to_initial_state()
return None
# Web server total connections (from config)
total_connections = self._get_total_connections()
# From apache's mod_status
requests_number = self._get_connections_number()
# From netstat -nt
connections_number = self._current_connections // self._aggregated_data_count
self._reset_to_initial_state()
return {"apache": {"total_connections": total_connections, # Web server total connections (from config)
"requests_number": requests_number, # From apache's mod_status
"connections_number": connections_number} # From netstat -nt
}