Why Apache sucks for hosting Python web applications.
Web Frameworks
Sed in nulla eu est vestibulum convallis. Praesent ante magna, molestie vel porttitor vel, aliquet ut dolor. Proin molestie massa eu tellu.
I am lazy when it comes to searching though documentation on hosting providers web sites. HHG was therefore awesome for me as it brought all the important stuff I needed to know into one place. An indispensable quick reference guide.
I can be lazy when it comes to searching web documentation. HHG is awesome as it combines the important stuff I need to know in one place.
import types | |
import sys | |
from newrelic.api.object_wrapper import callable_name | |
from newrelic.api.error_trace import wrap_error_trace | |
from newrelic.api.in_function import wrap_in_function | |
from newrelic.api.transaction_name import wrap_transaction_name | |
from newrelic.api.function_trace import wrap_function_trace, FunctionTraceWrapper | |
from newrelic.api.external_trace import wrap_external_trace | |
from newrelic.api.web_transaction import WSGIApplicationWrapper |
# Import hooks for nova. | |
[import-hook:nova.wsgi] | |
enabled = true | |
execute = nova-api-instrumentation:instrument_nova_wsgi | |
[import-hook:nova.api.openstack.wsgi] | |
enabled = true | |
execute = nova-api-instrumentation:instrument_nova_api_openstack_wsgi |
def __eq__(self, other): | |
if isinstance(other, ObjectWrapper): | |
return self._nr_last_object == other._nr_last_object | |
return self._nr_last_object == other | |
def __ne__(self, other): | |
result = self.__eq__(other) | |
if result is NotImplemented: | |
return result | |
return not result |
# Run this as: | |
# | |
# NEW_RELIC_CONFIG_FILE=newrelic.ini newrelic-admin run-python example.py | |
# | |
# If being run under Heroku, you can skip setting NEW_RELIC_CONFIG_FILE on the | |
# command line as the required environment variable settings added by the | |
# Heroku New Relic addon will be picked up automatically. | |
import time | |
import newrelic.agent |
import MySQLdb | |
def doit(database, query): | |
connection = MySQLdb.connect(db=database) | |
try: | |
cursor = connection.cursor() | |
try: | |
cursor.execute(query) | |
columns = [] | |
if cursor.description: |
I changed the django code in django/db/backends/postgresql_psycopg2/base.py to: | |
self.connection = Database.connect(**conn_params) | |
with newrelic.agent.FunctionTrace(newrelic.agent.current_transaction(), 'Set client encoding'): | |
self.connection.set_client_encoding('UTF8') | |
with newrelic.agent.FunctionTrace(newrelic.agent.current_transaction(), 'Set isolation level'): | |
self.connection.set_isolation_level(self.isolation_level) | |
with newrelic.agent.FunctionTrace(newrelic.agent.current_transaction(), 'connection_created signal'): | |
connection_created.send(sender=self.__class__, connection=self) | |
if new_connection: |
Update on this - turned out I was hitting this issue: | |
http://stackoverflow.com/questions/8198990/pgbouncer-closing-because-unclean-server-on-every-connection | |
We weren't getting any of the benefit of pgbouncer because pgbouncer was closing all connections when they were returned to the pool since they were still dirty. Supposedly the best way to fix this is to use autocommit in django, however that requires a careful audit of wherever you are doing db updates and wrapping that code with something like the @commit_on_success decorator. Since all of our API calls have the possibility of doing an update, I could take the easy way out and just add django.middleware.transaction.TransactionMiddleware to my list of middleware classes. Now I'm getting connection reuse from pgbouncer, and not incurring the overhead of establishing a new connection with each db request. Big improvement, and I'm no longer seeing the strange long periods of time in set_isolation_level (which were obviously due to setting up a connect |