Consistently ensure dog_stats_api tags are formatted correctly
This commit is contained in:
@@ -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):
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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__)
|
||||
|
||||
1
common/lib/dogstats/dogstats_wrapper/__init__.py
Normal file
1
common/lib/dogstats/dogstats_wrapper/__init__.py
Normal file
@@ -0,0 +1 @@
|
||||
from .wrapper import increment, histogram, timer
|
||||
47
common/lib/dogstats/dogstats_wrapper/wrapper.py
Normal file
47
common/lib/dogstats/dogstats_wrapper/wrapper.py
Normal 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)
|
||||
10
common/lib/dogstats/setup.py
Normal file
10
common/lib/dogstats/setup.py
Normal file
@@ -0,0 +1,10 @@
|
||||
from setuptools import setup
|
||||
|
||||
setup(
|
||||
name="dogstats_wrapper",
|
||||
version="0.1",
|
||||
packages=["dogstats_wrapper"],
|
||||
install_requires=[
|
||||
"dogapi",
|
||||
],
|
||||
)
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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__)
|
||||
|
||||
Reference in New Issue
Block a user