Repository: qpid-dispatch Updated Branches: refs/heads/crolke-DISPATCH-188-1 c9c6b2002 -> 2ecb6685c
Add global connection statistics to policy entity. Project: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/repo Commit: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/commit/2ecb6685 Tree: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/tree/2ecb6685 Diff: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/diff/2ecb6685 Branch: refs/heads/crolke-DISPATCH-188-1 Commit: 2ecb6685ca251d6025ad76330b883524820ebcf6 Parents: c9c6b20 Author: Chuck Rolke <[email protected]> Authored: Thu Nov 12 14:10:46 2015 -0500 Committer: Chuck Rolke <[email protected]> Committed: Thu Nov 12 14:10:46 2015 -0500 ---------------------------------------------------------------------- python/qpid_dispatch/management/qdrouter.json | 7 ++- .../qpid_dispatch_internal/management/agent.py | 6 +++ src/dispatch.c | 2 +- src/policy.c | 51 ++++++++++++++------ src/policy_private.h | 2 +- 5 files changed, 49 insertions(+), 19 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/2ecb6685/python/qpid_dispatch/management/qdrouter.json ---------------------------------------------------------------------- diff --git a/python/qpid_dispatch/management/qdrouter.json b/python/qpid_dispatch/management/qdrouter.json index 1aa1e7d..74f9b77 100644 --- a/python/qpid_dispatch/management/qdrouter.json +++ b/python/qpid_dispatch/management/qdrouter.json @@ -1008,10 +1008,13 @@ "maximumConnections": { "type": "integer", "default": 0, - "description": "The maximum number of client connections allowed. Zero implies no limit.", + "description": "The maximum number of concurrent client connections allowed. Zero implies no limit.", "required": false, "create": true - } + }, + "connectionsProcessed": {"type": "integer", "graph": true}, + "connectionsDenied": {"type": "integer", "graph": true}, + "connectionsCurrent": {"type": "integer", "graph": true} } }, http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/2ecb6685/python/qpid_dispatch_internal/management/agent.py ---------------------------------------------------------------------- diff --git a/python/qpid_dispatch_internal/management/agent.py b/python/qpid_dispatch_internal/management/agent.py index 3efe1ff..1930c30 100644 --- a/python/qpid_dispatch_internal/management/agent.py +++ b/python/qpid_dispatch_internal/management/agent.py @@ -270,6 +270,12 @@ class LogEntity(EntityAdapter): self._qd.qd_log_source_reset(self.attributes['module']) class PolicyEntity(EntityAdapter): + def __init__(self, agent, entity_type, attributes=None): + super(PolicyEntity, self).__init__(agent, entity_type, attributes, validate=False) + # Policy is a mix of configuration and operational entity. + # The statistics attributes are operational not configured. + self._add_implementation( + CImplementation(agent.qd, entity_type, self._dispatch)) def create(self): self._qd.qd_dispatch_configure_policy(self._dispatch, self) http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/2ecb6685/src/dispatch.c ---------------------------------------------------------------------- diff --git a/src/dispatch.c b/src/dispatch.c index d9575e2..15b3b97 100644 --- a/src/dispatch.c +++ b/src/dispatch.c @@ -143,7 +143,7 @@ qd_error_t qd_dispatch_configure_lrp(qd_dispatch_t *qd, qd_entity_t *entity) { qd_error_t qd_dispatch_configure_policy(qd_dispatch_t *qd, qd_entity_t *entity) { - qd_router_configure_policy(qd->policy, entity); + qd_entity_configure_policy(qd->policy, entity); return QD_ERROR_NONE; } http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/2ecb6685/src/policy.c ---------------------------------------------------------------------- diff --git a/src/policy.c b/src/policy.c index 7b4e98e..dbade77 100644 --- a/src/policy.c +++ b/src/policy.c @@ -64,6 +64,8 @@ void policy_engine_step() // reconfiguration of policy settings. // static int n_connections = 0; +static int n_denied = 0; +static int n_processed = 0; // // error conditions signaled to effect denial @@ -84,10 +86,12 @@ static char* CONNECTION_DISALLOWED = "connection disallowed by local pol struct qd_policy_t { qd_dispatch_t *qd; qd_log_source_t *log_source; - - int max_connections; - - int current_connections; + // configured settings + int max_connection_limit; + // live statistics + int connections_processed; + int connections_denied; + int connections_current; }; @@ -95,10 +99,12 @@ qd_policy_t *qd_policy(qd_dispatch_t *qd) { qd_policy_t *policy = NEW(qd_policy_t); - policy->qd = qd; - policy->log_source = qd_log_source("POLICY"); - policy->max_connections = 0; - policy->current_connections = 0; + policy->qd = qd; + policy->log_source = qd_log_source("POLICY"); + policy->max_connection_limit = 0; + policy->connections_processed= 0; + policy->connections_denied = 0; + policy->connections_current = 0; qd_log(policy->log_source, QD_LOG_TRACE, "Policy Initialized"); return policy; @@ -112,17 +118,30 @@ void qd_policy_free(qd_policy_t *policy) // // -qd_error_t qd_router_configure_policy(qd_policy_t *policy, qd_entity_t *entity) +qd_error_t qd_entity_configure_policy(qd_policy_t *policy, qd_entity_t *entity) { - policy->max_connections = qd_entity_opt_long(entity, "maximumConnections", 0); QD_ERROR_RET(); - if (policy->max_connections < 0) + policy->max_connection_limit = qd_entity_opt_long(entity, "maximumConnections", 0); QD_ERROR_RET(); + if (policy->max_connection_limit < 0) return qd_error(QD_ERROR_CONFIG, "maximumConnections must be >= 0"); - qd_log(policy->log_source, QD_LOG_INFO, "Configured maximumConnections: %d", policy->max_connections); + qd_log(policy->log_source, QD_LOG_INFO, "Configured maximumConnections: %d", policy->max_connection_limit); return QD_ERROR_NONE; } // +// +qd_error_t qd_entity_refresh_policy(qd_entity_t* entity, void *impl) { + // Return global stats + if (!qd_entity_set_long(entity, "connectionsProcessed", n_processed) && + !qd_entity_set_long(entity, "connectionsDenied", n_denied) && + !qd_entity_set_long(entity, "connectionsCurrent", n_connections) + ) + return QD_ERROR_NONE; + return qd_error_code(); +} + + +// // Functions related to absolute connection counts. // These handle connections at the socket level with // no regard to user identity. Simple yes/no decisions @@ -134,21 +153,23 @@ bool qd_policy_socket_accept(void *context, const char *hostname) qd_policy_t *policy = (qd_policy_t *)context; bool result = true; - if (policy->max_connections == 0) { + if (policy->max_connection_limit == 0) { // Policy not in force; connection counted and allowed n_connections += 1; } else { // Policy in force - if (n_connections < policy->max_connections) { + if (n_connections < policy->max_connection_limit) { // connection counted and allowed n_connections += 1; qd_log(policy->log_source, POLICY_LOG_LEVEL, "Connection '%s' allowed. N= %d", hostname, n_connections); } else { // connection denied result = false; + n_denied += 1; qd_log(policy->log_source, POLICY_LOG_LEVEL, "Connection '%s' denied, N=%d", hostname, n_connections); } } + n_processed += 1; return result; } @@ -159,7 +180,7 @@ void qd_policy_socket_close(void *context, const char *hostname) n_connections -= 1; assert (n_connections >= 0); - if (policy->max_connections > 0) { + if (policy->max_connection_limit > 0) { qd_log(policy->log_source, POLICY_LOG_LEVEL, "Connection '%s' closed, N=%d", hostname, n_connections); } qd_log(policy->log_source, POLICY_LOG_LEVEL, "Connection '%s' closed, N=%d", hostname, n_connections); // HACK EXTRA http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/2ecb6685/src/policy_private.h ---------------------------------------------------------------------- diff --git a/src/policy_private.h b/src/policy_private.h index 2647b85..f6a4937 100644 --- a/src/policy_private.h +++ b/src/policy_private.h @@ -32,7 +32,7 @@ typedef struct qd_policy_t qd_policy_t; -qd_error_t qd_router_configure_policy(qd_policy_t *policy, qd_entity_t *entity); +qd_error_t qd_entity_configure_policy(qd_policy_t *policy, qd_entity_t *entity); /** Allow or deny an incoming connection based on connection count(s). --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
