Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(metrics): Add geo data to metric calls #73

Merged
merged 11 commits into from Dec 5, 2018
7 changes: 7 additions & 0 deletions .travis.yml
@@ -1,4 +1,11 @@
language: python

addons:
apt:
update: true
packages:
- libgeoip-dev
billyvg marked this conversation as resolved.
Show resolved Hide resolved

install:
- make requirements-test
script:
Expand Down
12 changes: 10 additions & 2 deletions reload_app/app.py
Expand Up @@ -8,6 +8,7 @@
from json import load, dumps
from werkzeug.wrappers import Response
from uuid import uuid1
from geoip2.errors import AddressNotFoundError

from .events import VALID_EVENTS
from .metrics import VALID_METRICS, VALID_GLOBAL_TAGS
Expand All @@ -16,6 +17,7 @@
from .router import Router
from .worker import BigQueryWorker
from .utils import format_datetime, ip_from_request
from .geo import geo_by_addr

COMMON_FIELDS = ('url', 'referrer', 'title', 'path', 'search', 'anonymous_id', 'user_id')

Expand Down Expand Up @@ -182,7 +184,7 @@ def event(self, request):

return ok_response()

def track_single_metric(self, data):
def track_single_metric(self, data, request):
metric_name = data.get('metric_name')
tags = data.get('tags', {})

Expand All @@ -206,6 +208,12 @@ def track_single_metric(self, data):
else:
return '%s: bad request check if valid value for metric' % metric_name

try:
geo = geo_by_addr(ip_from_request(request))
tags['country_code'] = geo.country.iso_code
except AddressNotFoundError:
billyvg marked this conversation as resolved.
Show resolved Hide resolved
pass

try:
getattr(self.datadog_client, metric_type)(metric_name, value, tags=tags)
except Exception as e:
Expand All @@ -228,7 +236,7 @@ def metric(self, request):

errors = []
for metric_object in metric_objects:
error = self.track_single_metric(metric_object)
error = self.track_single_metric(metric_object, request)
if error is not None:
errors.append(error)

Expand Down
28 changes: 28 additions & 0 deletions reload_app/geo.py
@@ -0,0 +1,28 @@
import os

# default is no-op
billyvg marked this conversation as resolved.
Show resolved Hide resolved
def geo_by_addr(ip):
pass

def _init_geoip():
global geo_by_addr
try:
import geoip2.database
except ImportError:
return

geoip_path = os.environ.get('GEOIP_PATH')
if not geoip_path:
print("GEOIP_PATH environment variable required")
return

try:
geo_db = geoip2.database.Reader(geoip_path)
except Exception:
print("Error opening GeoIP database: %s" % geoip_path)
return

geo_by_addr = geo_db.city


_init_geoip()
2 changes: 2 additions & 0 deletions requirements.txt
Expand Up @@ -3,3 +3,5 @@ datadog==0.23.0
google-cloud-bigquery==0.24.0
google-cloud-pubsub==0.29.4
raven==6.6.0
geoip2==2.9.0