summaryrefslogtreecommitdiff
path: root/ldap3/core/usage.py
diff options
context:
space:
mode:
authorSVN-Git Migration <python-modules-team@lists.alioth.debian.org>2015-10-08 12:22:32 -0700
committerSVN-Git Migration <python-modules-team@lists.alioth.debian.org>2015-10-08 12:22:32 -0700
commit9700da0a96f70b31b526815d265af33726253268 (patch)
tree5d7926a8ff1592334e68beca60a5485cb6076cd5 /ldap3/core/usage.py
parente9559fd8572507569c4adb5862373c3a44541141 (diff)
Imported Upstream version 0.9.7.4
Diffstat (limited to 'ldap3/core/usage.py')
-rw-r--r--ldap3/core/usage.py206
1 files changed, 206 insertions, 0 deletions
diff --git a/ldap3/core/usage.py b/ldap3/core/usage.py
new file mode 100644
index 0000000..b3b2395
--- /dev/null
+++ b/ldap3/core/usage.py
@@ -0,0 +1,206 @@
+"""
+"""
+
+# Created on 2014.03.15
+#
+# Author: Giovanni Cannata
+#
+# Copyright 2015 Giovanni Cannata
+#
+# This file is part of ldap3.
+#
+# ldap3 is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License as published
+# by the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# ldap3 is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public License
+# along with ldap3 in the COPYING and COPYING.LESSER files.
+# If not, see <http://www.gnu.org/licenses/>.
+
+from datetime import datetime, timedelta
+from os import linesep
+
+from .exceptions import LDAPMetricsError
+
+
+class ConnectionUsage(object):
+ """
+ Collect statistics on connection usage
+ """
+
+ def reset(self):
+ self.open_sockets = 0
+ self.closed_sockets = 0
+ self.wrapped_sockets = 0
+ self.bytes_transmitted = 0
+ self.bytes_received = 0
+ self.messages_transmitted = 0
+ self.messages_received = 0
+ self.operations = 0
+ self.abandon_operations = 0
+ self.add_operations = 0
+ self.bind_operations = 0
+ self.compare_operations = 0
+ self.delete_operations = 0
+ self.extended_operations = 0
+ self.modify_operations = 0
+ self.modify_dn_operations = 0
+ self.search_operations = 0
+ self.unbind_operations = 0
+ self.referrals_received = 0
+ self.referrals_followed = 0
+ self.restartable_failures = 0
+ self.restartable_successes = 0
+ self.servers_from_pool = 0
+
+ def __init__(self):
+ self.initial_connection_start_time = None
+ self.open_socket_start_time = None
+ self.connection_stop_time = None
+ self.open_sockets = 0
+ self.closed_sockets = 0
+ self.wrapped_sockets = 0
+ self.bytes_transmitted = 0
+ self.bytes_received = 0
+ self.messages_transmitted = 0
+ self.messages_received = 0
+ self.operations = 0
+ self.abandon_operations = 0
+ self.add_operations = 0
+ self.bind_operations = 0
+ self.compare_operations = 0
+ self.delete_operations = 0
+ self.extended_operations = 0
+ self.modify_operations = 0
+ self.modify_dn_operations = 0
+ self.search_operations = 0
+ self.unbind_operations = 0
+ self.referrals_received = 0
+ self.referrals_followed = 0
+ self.restartable_failures = 0
+ self.restartable_successes = 0
+ self.servers_from_pool = 0
+
+ def __repr__(self):
+ r = 'Connection Usage:' + linesep
+ r += ' Time: [elapsed: ' + str(self.elapsed_time) + ']' + linesep
+ r += ' Initial start time: ' + (str(self.initial_connection_start_time.isoformat()) if self.initial_connection_start_time else '') + linesep
+ r += ' Open socket time: ' + (str(self.open_socket_start_time.isoformat()) if self.open_socket_start_time else '') + linesep
+ r += ' Close socket time: ' + (str(self.connection_stop_time.isoformat()) if self.connection_stop_time else '') + linesep
+ r += ' Server:' + linesep
+ r += ' Servers from pool: ' + str(self.servers_from_pool) + linesep
+ r += ' Sockets open: ' + str(self.open_sockets) + linesep
+ r += ' Sockets closed: ' + str(self.closed_sockets) + linesep
+ r += ' Sockets wrapped: ' + str(self.wrapped_sockets) + linesep
+ r += ' Bytes: ' + str(self.bytes_transmitted + self.bytes_received) + linesep
+ r += ' Transmitted: ' + str(self.bytes_transmitted) + linesep
+ r += ' Received: ' + str(self.bytes_received) + linesep
+ r += ' Messages: ' + str(self.messages_transmitted + self.messages_received) + linesep
+ r += ' Transmitted: ' + str(self.messages_transmitted) + linesep
+ r += ' Received: ' + str(self.messages_received) + linesep
+ r += ' Operations: ' + str(self.operations) + linesep
+ r += ' Abandon: ' + str(self.abandon_operations) + linesep
+ r += ' Bind: ' + str(self.bind_operations) + linesep
+ r += ' Compare: ' + str(self.compare_operations) + linesep
+ r += ' Delete: ' + str(self.delete_operations) + linesep
+ r += ' Extended: ' + str(self.extended_operations) + linesep
+ r += ' Modify: ' + str(self.modify_operations) + linesep
+ r += ' ModifyDn: ' + str(self.modify_dn_operations) + linesep
+ r += ' Search: ' + str(self.search_operations) + linesep
+ r += ' Unbind: ' + str(self.unbind_operations) + linesep
+ r += ' Referrals: ' + linesep
+ r += ' Received: ' + str(self.referrals_received) + linesep
+ r += ' Followed: ' + str(self.referrals_followed) + linesep
+ r += ' Restartable tries: ' + str(self.restartable_failures + self.restartable_successes) + linesep
+ r += ' Failed restarts: ' + str(self.restartable_failures) + linesep
+ r += ' Successful restarts: ' + str(self.restartable_successes) + linesep
+ return r
+
+ def __str__(self):
+ return self.__repr__()
+
+ def __iadd__(self, other):
+ if not isinstance(other, ConnectionUsage):
+ raise LDAPMetricsError('unable to add to ConnectionUsage')
+
+ self.open_sockets += other.open_sockets
+ self.closed_sockets += other.closed_sockets
+ self.wrapped_sockets += other.wrapped_sockets
+ self.bytes_transmitted += other.bytes_transmitted
+ self.bytes_received += other.bytes_received
+ self.messages_transmitted += other.messages_transmitted
+ self.messages_received += other.messages_received
+ self.operations += other.operations
+ self.abandon_operations += other.abandon_operations
+ self.add_operations += other.add_operations
+ self.bind_operations += other.bind_operations
+ self.compare_operations += other.compare_operations
+ self.delete_operations += other.delete_operations
+ self.extended_operations += other.extended_operations
+ self.modify_operations += other.modify_operations
+ self.modify_dn_operations += other.modify_dn_operations
+ self.search_operations += other.search_operations
+ self.unbind_operations += other.unbind_operations
+ self.referrals_received += other.referrals_received
+ self.referrals_followed += other.referrals_followed
+ self.restartable_failures += other.restartable_failures
+ self.restartable_successes += other.restartable_successes
+ self.servers_from_pool += other.servers_from_pool
+ return self
+
+ def update_transmitted_message(self, message, length):
+ self.bytes_transmitted += length
+ self.operations += 1
+ self.messages_transmitted += 1
+ if message['type'] == 'abandonRequest':
+ self.abandon_operations += 1
+ elif message['type'] == 'addRequest':
+ self.add_operations += 1
+ elif message['type'] == 'bindRequest':
+ self.bind_operations += 1
+ elif message['type'] == 'compareRequest':
+ self.compare_operations += 1
+ elif message['type'] == 'delRequest':
+ self.delete_operations += 1
+ elif message['type'] == 'extendedReq':
+ self.extended_operations += 1
+ elif message['type'] == 'modifyRequest':
+ self.modify_operations += 1
+ elif message['type'] == 'modDNRequest':
+ self.modify_dn_operations += 1
+ elif message['type'] == 'searchRequest':
+ self.search_operations += 1
+ elif message['type'] == 'unbindRequest':
+ self.unbind_operations += 1
+ else:
+ raise LDAPMetricsError('unable to collect usage for unknown message type')
+
+ def update_received_message(self, length):
+ self.bytes_received += length
+ self.messages_received += 1
+
+ def start(self, reset=True):
+ if reset:
+ self.reset()
+ self.open_socket_start_time = datetime.now()
+ self.connection_stop_time = None
+ if not self.initial_connection_start_time:
+ self.initial_connection_start_time = self.open_socket_start_time
+
+ def stop(self):
+ if self.open_socket_start_time:
+ self.connection_stop_time = datetime.now()
+
+ @property
+ def elapsed_time(self):
+ if self.connection_stop_time:
+ return self.connection_stop_time - self.open_socket_start_time
+ else:
+ # noinspection PyTypeChecker
+ return (datetime.now() - self.open_socket_start_time) if self.open_socket_start_time else timedelta(0)