Commit ffe64add by Robert Raposa

Add new relic custom metrics to course home.

- Add new utilities to monitoring_utils djangoapp.
- Use new utilities for all new course tabs.
parent 77f111b2
...@@ -52,6 +52,9 @@ from openedx.core.djangoapps.bookmarks.services import BookmarksService ...@@ -52,6 +52,9 @@ from openedx.core.djangoapps.bookmarks.services import BookmarksService
from openedx.core.djangoapps.crawlers.models import CrawlersConfig from openedx.core.djangoapps.crawlers.models import CrawlersConfig
from openedx.core.djangoapps.credit.services import CreditService from openedx.core.djangoapps.credit.services import CreditService
from openedx.core.djangoapps.util.user_utils import SystemUser from openedx.core.djangoapps.util.user_utils import SystemUser
from openedx.core.djangoapps.monitoring_utils import (
set_custom_metrics_for_course_key, set_monitoring_transaction_name
)
from openedx.core.lib.xblock_utils import ( from openedx.core.lib.xblock_utils import (
replace_course_urls, replace_course_urls,
replace_jump_to_id_urls, replace_jump_to_id_urls,
...@@ -81,11 +84,6 @@ from .field_overrides import OverrideFieldData ...@@ -81,11 +84,6 @@ from .field_overrides import OverrideFieldData
log = logging.getLogger(__name__) log = logging.getLogger(__name__)
try:
import newrelic.agent
except ImportError:
newrelic = None # pylint: disable=invalid-name
if settings.XQUEUE_INTERFACE.get('basic_auth') is not None: if settings.XQUEUE_INTERFACE.get('basic_auth') is not None:
REQUESTS_AUTH = HTTPBasicAuth(*settings.XQUEUE_INTERFACE['basic_auth']) REQUESTS_AUTH = HTTPBasicAuth(*settings.XQUEUE_INTERFACE['basic_auth'])
else: else:
...@@ -970,10 +968,7 @@ def _invoke_xblock_handler(request, course_id, usage_id, handler, suffix, course ...@@ -970,10 +968,7 @@ def _invoke_xblock_handler(request, course_id, usage_id, handler, suffix, course
except InvalidKeyError: except InvalidKeyError:
raise Http404 raise Http404
if newrelic: set_custom_metrics_for_course_key(course_key)
# Gather metrics for New Relic so we can slice data in New Relic Insights
newrelic.agent.add_custom_parameter('course_id', unicode(course_key))
newrelic.agent.add_custom_parameter('org', unicode(course_key.org))
with modulestore().bulk_operations(course_key): with modulestore().bulk_operations(course_key):
instance, tracking_context = get_module_by_usage_id(request, course_id, usage_id, course=course) instance, tracking_context = get_module_by_usage_id(request, course_id, usage_id, course=course)
...@@ -983,8 +978,7 @@ def _invoke_xblock_handler(request, course_id, usage_id, handler, suffix, course ...@@ -983,8 +978,7 @@ def _invoke_xblock_handler(request, course_id, usage_id, handler, suffix, course
# "handler" in those cases is always just "xmodule_handler". # "handler" in those cases is always just "xmodule_handler".
nr_tx_name = "{}.{}".format(instance.__class__.__name__, handler) nr_tx_name = "{}.{}".format(instance.__class__.__name__, handler)
nr_tx_name += "/{}".format(suffix) if (suffix and handler == "xmodule_handler") else "" nr_tx_name += "/{}".format(suffix) if (suffix and handler == "xmodule_handler") else ""
if newrelic: set_monitoring_transaction_name(nr_tx_name, group="Python/XBlock/Handler")
newrelic.agent.set_transaction_name(nr_tx_name, group="Python/XBlock/Handler")
tracking_context_name = 'module_callback_handler' tracking_context_name = 'module_callback_handler'
req = django_to_webob_request(request) req = django_to_webob_request(request)
......
...@@ -22,11 +22,6 @@ import logging ...@@ -22,11 +22,6 @@ import logging
log = logging.getLogger("edx.courseware.views.index") log = logging.getLogger("edx.courseware.views.index")
try:
import newrelic.agent
except ImportError:
newrelic = None # pylint: disable=invalid-name
import urllib import urllib
import waffle import waffle
...@@ -36,6 +31,7 @@ from opaque_keys.edx.keys import CourseKey ...@@ -36,6 +31,7 @@ from opaque_keys.edx.keys import CourseKey
from openedx.core.djangoapps.lang_pref import LANGUAGE_KEY from openedx.core.djangoapps.lang_pref import LANGUAGE_KEY
from openedx.core.djangoapps.user_api.preferences.api import get_user_preference from openedx.core.djangoapps.user_api.preferences.api import get_user_preference
from openedx.core.djangoapps.crawlers.models import CrawlersConfig from openedx.core.djangoapps.crawlers.models import CrawlersConfig
from openedx.core.djangoapps.monitoring_utils import set_custom_metrics_for_course_key
from request_cache.middleware import RequestCache from request_cache.middleware import RequestCache
from shoppingcart.models import CourseRegistrationCode from shoppingcart.models import CourseRegistrationCode
from student.models import CourseEnrollment from student.models import CourseEnrollment
...@@ -107,7 +103,7 @@ class CoursewareIndex(View): ...@@ -107,7 +103,7 @@ class CoursewareIndex(View):
self.url = request.path self.url = request.path
try: try:
self._init_new_relic() set_custom_metrics_for_course_key(self.course_key)
self._clean_position() self._clean_position()
with modulestore().bulk_operations(self.course_key): with modulestore().bulk_operations(self.course_key):
self.course = get_course_with_access(request.user, 'load', self.course_key, depth=CONTENT_DEPTH) self.course = get_course_with_access(request.user, 'load', self.course_key, depth=CONTENT_DEPTH)
...@@ -180,15 +176,6 @@ class CoursewareIndex(View): ...@@ -180,15 +176,6 @@ class CoursewareIndex(View):
) )
) )
def _init_new_relic(self):
"""
Initialize metrics for New Relic so we can slice data in New Relic Insights
"""
if not newrelic:
return
newrelic.agent.add_custom_parameter('course_id', unicode(self.course_key))
newrelic.agent.add_custom_parameter('org', unicode(self.course_key.org))
def _clean_position(self): def _clean_position(self):
""" """
Verify that the given position is an integer. If it is not positive, set it to 1. Verify that the given position is an integer. If it is not positive, set it to 1.
......
...@@ -87,8 +87,9 @@ from openedx.core.djangoapps.credit.api import ( ...@@ -87,8 +87,9 @@ from openedx.core.djangoapps.credit.api import (
) )
from openedx.core.djangoapps.programs.utils import ProgramMarketingDataExtender from openedx.core.djangoapps.programs.utils import ProgramMarketingDataExtender
from openedx.core.djangoapps.site_configuration import helpers as configuration_helpers from openedx.core.djangoapps.site_configuration import helpers as configuration_helpers
from shoppingcart.utils import is_shopping_cart_enabled
from openedx.core.djangoapps.self_paced.models import SelfPacedConfiguration from openedx.core.djangoapps.self_paced.models import SelfPacedConfiguration
from openedx.core.djangoapps.monitoring_utils import set_custom_metrics_for_course_key
from shoppingcart.utils import is_shopping_cart_enabled
from student.models import UserTestGroup, CourseEnrollment from student.models import UserTestGroup, CourseEnrollment
from student.roles import GlobalStaff from student.roles import GlobalStaff
from util.cache import cache, cache_if_anonymous from util.cache import cache, cache_if_anonymous
...@@ -502,6 +503,7 @@ class CourseTabView(EdxFragmentView): ...@@ -502,6 +503,7 @@ class CourseTabView(EdxFragmentView):
course = get_course_with_access(request.user, 'load', course_key) course = get_course_with_access(request.user, 'load', course_key)
tab = CourseTabList.get_tab_by_type(course.tabs, tab_type) tab = CourseTabList.get_tab_by_type(course.tabs, tab_type)
page_context = self.create_page_context(request, course=course, tab=tab, **kwargs) page_context = self.create_page_context(request, course=course, tab=tab, **kwargs)
set_custom_metrics_for_course_key(course_key)
return super(CourseTabView, self).get(request, course=course, page_context=page_context, **kwargs) return super(CourseTabView, self).get(request, course=course, page_context=page_context, **kwargs)
def create_page_context(self, request, course=None, tab=None, **kwargs): def create_page_context(self, request, course=None, tab=None, **kwargs):
......
...@@ -10,10 +10,6 @@ from django.db.utils import DatabaseError ...@@ -10,10 +10,6 @@ from django.db.utils import DatabaseError
from logging import getLogger from logging import getLogger
log = getLogger(__name__) log = getLogger(__name__)
try:
import newrelic.agent
except ImportError:
newrelic = None # pylint: disable=invalid-name
from celery_utils.logged_task import LoggedTask from celery_utils.logged_task import LoggedTask
from celery_utils.persist_on_failure import PersistOnFailureTask from celery_utils.persist_on_failure import PersistOnFailureTask
...@@ -22,6 +18,9 @@ from lms.djangoapps.course_blocks.api import get_course_blocks ...@@ -22,6 +18,9 @@ from lms.djangoapps.course_blocks.api import get_course_blocks
from lms.djangoapps.courseware import courses from lms.djangoapps.courseware import courses
from opaque_keys.edx.keys import CourseKey, UsageKey from opaque_keys.edx.keys import CourseKey, UsageKey
from opaque_keys.edx.locator import CourseLocator from opaque_keys.edx.locator import CourseLocator
from openedx.core.djangoapps.monitoring_utils import (
set_custom_metrics_for_course_key, set_custom_metric
)
from student.models import CourseEnrollment from student.models import CourseEnrollment
from submissions import api as sub_api from submissions import api as sub_api
from track.event_transaction_utils import ( from track.event_transaction_utils import (
...@@ -117,9 +116,8 @@ def _recalculate_subsection_grade(self, **kwargs): ...@@ -117,9 +116,8 @@ def _recalculate_subsection_grade(self, **kwargs):
course_key = CourseLocator.from_string(kwargs['course_id']) course_key = CourseLocator.from_string(kwargs['course_id'])
scored_block_usage_key = UsageKey.from_string(kwargs['usage_id']).replace(course_key=course_key) scored_block_usage_key = UsageKey.from_string(kwargs['usage_id']).replace(course_key=course_key)
if newrelic: set_custom_metrics_for_course_key(course_key)
newrelic.agent.add_custom_parameter('course_id', unicode(course_key)) set_custom_metric('usage_id', unicode(scored_block_usage_key))
newrelic.agent.add_custom_parameter('usage_id', unicode(scored_block_usage_key))
# The request cache is not maintained on celery workers, # The request cache is not maintained on celery workers,
# where this code runs. So we take the values from the # where this code runs. So we take the values from the
......
...@@ -22,6 +22,11 @@ TODO: supply additional public functions for storing strings and booleans. ...@@ -22,6 +22,11 @@ TODO: supply additional public functions for storing strings and booleans.
""" """
from . import middleware from . import middleware
try:
import newrelic.agent
except ImportError:
newrelic = None # pylint: disable=invalid-name
def accumulate(name, value): def accumulate(name, value):
""" """
...@@ -53,3 +58,40 @@ def increment(name): ...@@ -53,3 +58,40 @@ def increment(name):
middleware should automatically aggregate this metric. middleware should automatically aggregate this metric.
""" """
accumulate(name, 1) accumulate(name, 1)
def set_custom_metrics_for_course_key(course_key):
"""
Set monitoring custom metrics related to a course key.
This is not cached, and only support reporting to New Relic Insights.
"""
if not newrelic:
return
newrelic.agent.add_custom_parameter('course_id', unicode(course_key))
newrelic.agent.add_custom_parameter('org', unicode(course_key.org))
def set_custom_metric(key, value):
"""
Set monitoring custom metric.
This is not cached, and only support reporting to New Relic Insights.
"""
if not newrelic:
return
newrelic.agent.add_custom_parameter(key, value)
def set_monitoring_transaction_name(name, group=None, priority=None):
"""
Sets the transaction name for monitoring.
This is not cached, and only support reporting to New Relic.
"""
if not newrelic:
return
newrelic.agent.set_transaction_name(name, group, priority)
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment