Add vector counters to HTTP clients and servers; count the requests by method and responses by method and response code

This commit is contained in:
Paul "LeoNerd" Evans 2015-02-24 19:51:21 +00:00
parent c53ec53d80
commit 7d72e44eb9
3 changed files with 61 additions and 4 deletions

View File

@ -15,6 +15,7 @@
from synapse.api.errors import CodeMessageException from synapse.api.errors import CodeMessageException
from syutil.jsonutil import encode_canonical_json from syutil.jsonutil import encode_canonical_json
import synapse.metrics
from twisted.internet import defer, reactor from twisted.internet import defer, reactor
from twisted.web.client import ( from twisted.web.client import (
@ -31,6 +32,15 @@ import urllib
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
metrics = synapse.metrics.get_metrics_for(__name__)
outgoing_requests_counter = metrics.register_counter("outgoing_requests",
keys=["method"],
)
incoming_responses_counter = metrics.register_counter("incoming_responses",
keys=["method","code"],
)
class SimpleHttpClient(object): class SimpleHttpClient(object):
""" """
@ -48,7 +58,18 @@ class SimpleHttpClient(object):
def request(self, method, *args, **kwargs): def request(self, method, *args, **kwargs):
# A small wrapper around self.agent.request() so we can easily attach # A small wrapper around self.agent.request() so we can easily attach
# counters to it # counters to it
return self.agent.request(method, *args, **kwargs) outgoing_requests_counter.inc(method)
d = self.agent.request(method, *args, **kwargs)
def _cb(response):
incoming_responses_counter.inc(method, response.code)
return response
def _eb(failure):
incoming_responses_counter.inc(method, "ERR")
return failure
d.addCallbacks(_cb, _eb)
return d
@defer.inlineCallbacks @defer.inlineCallbacks
def post_urlencoded_get_json(self, uri, args={}): def post_urlencoded_get_json(self, uri, args={}):

View File

@ -23,6 +23,7 @@ from twisted.web._newclient import ResponseDone
from synapse.http.endpoint import matrix_federation_endpoint from synapse.http.endpoint import matrix_federation_endpoint
from synapse.util.async import sleep from synapse.util.async import sleep
from synapse.util.logcontext import PreserveLoggingContext from synapse.util.logcontext import PreserveLoggingContext
import synapse.metrics
from syutil.jsonutil import encode_canonical_json from syutil.jsonutil import encode_canonical_json
@ -40,6 +41,15 @@ import urlparse
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
metrics = synapse.metrics.get_metrics_for(__name__)
outgoing_requests_counter = metrics.register_counter("outgoing_requests",
keys=["method"],
)
incoming_responses_counter = metrics.register_counter("incoming_responses",
keys=["method","code"],
)
class MatrixFederationHttpAgent(_AgentBase): class MatrixFederationHttpAgent(_AgentBase):
@ -49,6 +59,8 @@ class MatrixFederationHttpAgent(_AgentBase):
def request(self, destination, endpoint, method, path, params, query, def request(self, destination, endpoint, method, path, params, query,
headers, body_producer): headers, body_producer):
outgoing_requests_counter.inc(method)
host = b"" host = b""
port = 0 port = 0
fragment = b"" fragment = b""
@ -59,9 +71,19 @@ class MatrixFederationHttpAgent(_AgentBase):
# Set the connection pool key to be the destination. # Set the connection pool key to be the destination.
key = destination key = destination
return self._requestWithEndpoint(key, endpoint, method, parsed_URI, d = self._requestWithEndpoint(key, endpoint, method, parsed_URI,
headers, body_producer, headers, body_producer,
parsed_URI.originForm) parsed_URI.originForm)
def _cb(response):
incoming_responses_counter.inc(method, response.code)
return response
def _eb(failure):
incoming_responses_counter.inc(method, "ERR")
return failure
d.addCallbacks(_cb, _eb)
return d
class MatrixFederationHttpClient(object): class MatrixFederationHttpClient(object):

View File

@ -18,6 +18,7 @@ from synapse.api.errors import (
cs_exception, SynapseError, CodeMessageException, UnrecognizedRequestError cs_exception, SynapseError, CodeMessageException, UnrecognizedRequestError
) )
from synapse.util.logcontext import LoggingContext from synapse.util.logcontext import LoggingContext
import synapse.metrics
from syutil.jsonutil import ( from syutil.jsonutil import (
encode_canonical_json, encode_pretty_printed_json encode_canonical_json, encode_pretty_printed_json
@ -34,6 +35,15 @@ import urllib
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
metrics = synapse.metrics.get_metrics_for(__name__)
incoming_requests_counter = metrics.register_counter("incoming_requests",
keys=["method"],
)
outgoing_responses_counter = metrics.register_counter("outgoing_responses",
keys=["method","code"],
)
class HttpServer(object): class HttpServer(object):
""" Interface for registering callbacks on a HTTP server """ Interface for registering callbacks on a HTTP server
@ -112,6 +122,8 @@ class JsonResource(HttpServer, resource.Resource):
This checks if anyone has registered a callback for that method and This checks if anyone has registered a callback for that method and
path. path.
""" """
incoming_requests_counter.inc(request.method)
code = None code = None
start = self.clock.time_msec() start = self.clock.time_msec()
try: try:
@ -190,6 +202,8 @@ class JsonResource(HttpServer, resource.Resource):
request) request)
return return
outgoing_responses_counter.inc(request.method, str(code))
# TODO: Only enable CORS for the requests that need it. # TODO: Only enable CORS for the requests that need it.
respond_with_json( respond_with_json(
request, code, response_json_object, request, code, response_json_object,