Consistently ensure dog_stats_api tags are formatted correctly

This commit is contained in:
Braden MacDonald
2014-09-26 22:35:47 -07:00
parent e2fbc09d9d
commit a8f622af7f
23 changed files with 88 additions and 37 deletions

View File

@@ -10,7 +10,7 @@ the recorded metrics.
from django.db.models.signals import post_save, post_delete, m2m_changed, post_init
from django.dispatch import receiver
from dogapi import dog_stats_api
import dogstats_wrapper as dog_stats_api
def _database_tags(action, sender, kwargs):

View File

@@ -17,7 +17,7 @@ import logging
from pytz import UTC
import uuid
from collections import defaultdict
from dogapi import dog_stats_api
import dogstats_wrapper as dog_stats_api
from django.db.models import Q
import pytz

View File

@@ -78,7 +78,7 @@ from lang_pref import LANGUAGE_KEY
import track.views
from dogapi import dog_stats_api
import dogstats_wrapper as dog_stats_api
from util.db import commit_on_success_with_read_committed
from util.json_request import JsonResponse

View File

@@ -9,7 +9,7 @@ from django.views.decorators.csrf import requires_csrf_token
from django.views.defaults import server_error
from django.http import (Http404, HttpResponse, HttpResponseNotAllowed,
HttpResponseServerError)
from dogapi import dog_stats_api
import dogstats_wrapper as dog_stats_api
from edxmako.shortcuts import render_to_response
import zendesk
from microsite_configuration import microsite

View File

@@ -33,7 +33,7 @@ from sys import float_info
from collections import namedtuple
from shapely.geometry import Point, MultiPoint
from dogapi import dog_stats_api
import dogstats_wrapper as dog_stats_api
# specific library imports
from calc import evaluator, UndefinedVariable

View File

@@ -5,7 +5,7 @@ import hashlib
import json
import logging
import requests
from dogapi import dog_stats_api
import dogstats_wrapper as dog_stats_api
log = logging.getLogger(__name__)

View File

@@ -0,0 +1 @@
from .wrapper import increment, histogram, timer

View File

@@ -0,0 +1,47 @@
"""
Wrapper for dog_stats_api, ensuring tags are valid.
See: http://help.datadoghq.com/customer/portal/questions/908720-api-guidelines
"""
from dogapi import dog_stats_api
def _clean_tags(tags):
"""
Helper method that does the actual cleaning of tags for sending to statsd.
1. Handles any type of tag - a plain string, UTF-8 binary, or a unicode
string, and converts it to UTF-8 encoded bytestring needed by statsd.
2. Escape pipe character - used by statsd as a field separator.
3. Trim to 200 characters (DataDog API limitation)
"""
def clean(tagstr):
if isinstance(tagstr, str):
return tagstr.replace('|', '_')[:200]
return unicode(tagstr).replace('|', '_')[:200].encode("utf-8")
return [clean(t) for t in tags]
def increment(metric_name, *args, **kwargs):
"""
Wrapper around dog_stats_api.increment that cleans any tags used.
"""
if "tags" in kwargs:
kwargs["tags"] = _clean_tags(kwargs["tags"])
dog_stats_api.increment(metric_name, *args, **kwargs)
def histogram(metric_name, *args, **kwargs):
"""
Wrapper around dog_stats_api.histogram that cleans any tags used.
"""
if "tags" in kwargs:
kwargs["tags"] = _clean_tags(kwargs["tags"])
dog_stats_api.histogram(metric_name, *args, **kwargs)
def timer(metric_name, *args, **kwargs):
"""
Wrapper around dog_stats_api.timer that cleans any tags used.
"""
if "tags" in kwargs:
kwargs["tags"] = _clean_tags(kwargs["tags"])
return dog_stats_api.timer(metric_name, *args, **kwargs)

View File

@@ -0,0 +1,10 @@
from setuptools import setup
setup(
name="dogstats_wrapper",
version="0.1",
packages=["dogstats_wrapper"],
install_requires=[
"dogapi",
],
)

View File

@@ -12,7 +12,7 @@ import sys
# We don't want to force a dependency on datadog, so make the import conditional
try:
from dogapi import dog_stats_api
import dogstats_wrapper as dog_stats_api
except ImportError:
# pylint: disable=invalid-name
dog_stats_api = None

View File

@@ -1,4 +1,4 @@
from dogapi import dog_stats_api
import dogstats_wrapper as dog_stats_api
import logging
from .grading_service_module import GradingService

View File

@@ -2,7 +2,7 @@
import json
import logging
import requests
from dogapi import dog_stats_api
import dogstats_wrapper as dog_stats_api
from requests.exceptions import RequestException, ConnectionError, HTTPError
from .combined_open_ended_rubric import CombinedOpenEndedRubric, RubricParsingError

View File

@@ -1,5 +1,5 @@
import logging
from dogapi import dog_stats_api
import dogstats_wrapper as dog_stats_api
from .grading_service_module import GradingService
from opaque_keys.edx.keys import UsageKey

View File

@@ -25,7 +25,7 @@ from xmodule.errortracker import exc_info_to_str
from xmodule.modulestore.exceptions import ItemNotFoundError
from opaque_keys.edx.keys import UsageKey
from xmodule.exceptions import UndefinedContext
from dogapi import dog_stats_api
import dogstats_wrapper as dog_stats_api
log = logging.getLogger(__name__)