Metadata-Version: 2.1
Name: request-time-tracker
Version: 0.0.6
Summary: Requests time tracker from being captured by proxy (e.g. nginx) till being executed by wsgi handler
Home-page: https://github.com/razortheory/request-time-tracker
Author: Roman Karpovich
Author-email: roman@razortheory.com
License: UNKNOWN
Project-URL: Home, https://github.com/razortheory/request-time-tracker
Project-URL: Bug Tracker, https://github.com/razortheory/request-time-tracker/issues
Platform: UNKNOWN
Classifier: Programming Language :: Python :: 3
Classifier: License :: OSI Approved :: MIT License
Classifier: Operating System :: OS Independent
Requires-Python: >=3.6
Description-Content-Type: text/markdown

#Queue time tracker
Reads time when request was processed by nginx & send time spent in queue before it was handled by wsgi.  
Designed mostly for autoscaling. Instance cpu is not trustworthy enough, sometimes there can be external bottlenecks, 
so even if instance cpu is fine, application can hang in queue between nginx(for example) and gunicorn or another wsgi processor.  

##Configuration
1. Add header with request timestamp.

   nginx:
    ```
   proxy_set_header X-RequestTime $msec;
   ```

2. Read header value & send metric value

### Django application
1. Configure django settings:
   - QUEUE_TIME_TRACKER_NOTIFY_EVERY_SECONDS = 10
   - QUEUE_TIME_TRACKER_HEADER = 'HTTP_X_REQUESTTIME'
   - QUEUE_TIME_TRACKER_CACHE_NAME = 'default'
   - QUEUE_TIME_TRACKER_CACHE_KEY_PREFIX = 'foobar'
   - QUEUE_TIME_TRACKER_CLOUDWATCH_NAMESPACE = 'FooBar Web'
   - QUEUE_TIME_TRACKER_CLOUDWATCH_ACCESS_KEY = 'AK****A'
   - QUEUE_TIME_TRACKER_CLOUDWATCH_SECRET_KEY = 'so******BS'
   - QUEUE_TIME_TRACKER_CLOUDWATCH_REGION = 'us-west-1'
2. Wrap wsgi application with time tracker:
```python
from request_time_tracker.django_wsgi import CloudWatchQueueTimeTracker

application = get_wsgi_application()

application = CloudWatchQueueTimeTracker(application)
```

### Non-django application
1. Wrap wsgi application with time tracker. Example:
```python
from functools import partial
from request_time_tracker.trackers.cache.redis import RedisCacheQueueTimeTracker
from request_time_tracker.notifiers.cloudwatch import CloudWatchNotifier

tracker = partial(
    RedisCacheQueueTimeTracker, 
    queue_time_header_name='HTTP_X_REQUESTTIME',
    redis_url='redis://localhost:6379/0',
    notifier=CloudWatchNotifier(
        namespace='FooBar Web',
        aws_access_key='AK****A',
        aws_secret_key='so******BS',
        aws_region='us-west-1',
    ),
)

wsgi_application = tracker(wsgi_application)
```


##Cloudwatch role policy:
```
{
    “Version”: “2012-10-17",
    “Statement”: [
        {
            “Sid”: “VisualEditor0”,
            “Effect”: “Allow”,
            “Action”: [“cloudwatch:PutMetricData”],
            “Resource”: “*”
        }
    ]
}
```

