| # Copyright 2016 The Chromium Authors |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| """A class to log client-side javascript error reports. |
| |
| Updates frontend/js_errors ts_mon metric. |
| """ |
| from __future__ import print_function |
| from __future__ import division |
| from __future__ import absolute_import |
| |
| import json |
| import logging |
| |
| from framework import jsonfeed |
| |
| from infra_libs import ts_mon |
| |
| |
| class ClientMonitor(jsonfeed.JsonFeed): |
| """JSON feed to track client side js errors in ts_mon.""" |
| |
| js_errors = ts_mon.CounterMetric('frontend/js_errors', |
| 'Number of uncaught client-side JS errors.', |
| None) |
| |
| def HandleRequest(self, mr): |
| """Build up a dictionary of data values to use when rendering the page. |
| |
| Args: |
| mr: commonly used info parsed from the request. |
| |
| Returns: |
| Dict of values used by EZT for rendering the page. |
| """ |
| |
| post_data = mr.request.values |
| errors = post_data.get('errors') |
| try: |
| errors = json.loads(errors) |
| |
| total_errors = 0 |
| for error_key in errors: |
| total_errors += errors[error_key] |
| logging.error('client monitor report (%d): %s', total_errors, |
| post_data.get('errors')) |
| self.js_errors.increment_by(total_errors) |
| except Exception as e: |
| logging.error('Problem processing client monitor report: %r', e) |
| |
| return {} |
| |
| def PostClientMonitor(self, **kwargs): |
| return self.handler(**kwargs) |