def search_admin_view(request): """Render the admin view containing search tools""" error_messages = [] stats = None es_deets = None indexes = [] reset_requested = 'reset' in request.POST if reset_requested: try: return handle_reset(request) except Exception as exc: error_messages.append(u'Error: %s' % exc.message) reindex_requested = 'reindex' in request.POST if reindex_requested: try: return handle_reindex(request) except Exception as exc: error_messages.append(u'Error: %s' % exc.message) try: # This gets index stats, but also tells us whether ES is in # a bad state. try: stats = get_index_stats() except NotFoundError: stats = None indexes = get_indexes() indexes.sort(key=lambda m: m[0]) # TODO: Input has a single ES_URL and that's the ZLB and does # the balancing. If that ever changes and we have multiple # ES_URLs, then this should get fixed. es_deets = requests.get(settings.ES_URLS[0]).json() except ConnectionError: error_messages.append('Error: Elastic Search is not set up on this ' 'machine or timed out trying to respond. ' '(ConnectionError/Timeout)') except NotFoundError: error_messages.append('Error: Index is missing. Press the reindex ' 'button below. (ElasticHttpNotFoundError)') outstanding_records = Record.outstanding() recent_records = Record.objects.order_by('-creation_time')[:20] return render( request, 'admin/search_admin_view.html', { 'title': 'Search', 'es_deets': es_deets, 'mapping_type_stats': stats, 'indexes': indexes, 'index': get_index(), 'error_messages': error_messages, 'recent_records': recent_records, 'outstanding_records': outstanding_records, 'now': datetime.now(), })
def search_admin_view(request): """Render the admin view containing search tools""" error_messages = [] stats = None es_deets = None indexes = [] reset_requested = 'reset' in request.POST if reset_requested: try: return handle_reset(request) except Exception as exc: error_messages.append(u'Error: %s' % exc.message) reindex_requested = 'reindex' in request.POST if reindex_requested: try: return handle_reindex(request) except Exception as exc: error_messages.append(u'Error: %s' % exc.message) try: # This gets index stats, but also tells us whether ES is in # a bad state. try: stats = get_index_stats() except NotFoundError: stats = None indexes = get_indexes() indexes.sort(key=lambda m: m[0]) # TODO: Input has a single ES_URL and that's the ZLB and does # the balancing. If that ever changes and we have multiple # ES_URLs, then this should get fixed. es_deets = requests.get(settings.ES_URLS[0]).json() except ConnectionError: error_messages.append('Error: Elastic Search is not set up on this ' 'machine or timed out trying to respond. ' '(ConnectionError/Timeout)') except NotFoundError: error_messages.append('Error: Index is missing. Press the reindex ' 'button below. (ElasticHttpNotFoundError)') outstanding_records = Record.outstanding() recent_records = Record.objects.order_by('-creation_time')[:20] return render(request, 'admin/search_admin_view.html', { 'title': 'Search', 'es_deets': es_deets, 'mapping_type_stats': stats, 'indexes': indexes, 'index': get_index(), 'error_messages': error_messages, 'recent_records': recent_records, 'outstanding_records': outstanding_records, 'now': datetime.now(), })
def search_admin_view(request): """Render the admin view containing search tools""" error_messages = [] stats = None indexes = [] reset_requested = 'reset' in request.POST if reset_requested: try: return handle_reset(request) except Exception as exc: error_messages.append(u'Error: %s' % exc.message) reindex_requested = 'reindex' in request.POST if reindex_requested: try: return handle_reindex(request) except Exception as exc: error_messages.append(u'Error: %s' % exc.message) try: # This gets index stats, but also tells us whether ES is in # a bad state. try: stats = get_index_stats() except pyes.exceptions.IndexMissingException: stats = None indexes = get_indexes() indexes.sort(key=lambda m: m[0]) except pyes.urllib3.MaxRetryError: error_messages.append('Error: Elastic Search is not set up on this ' 'machine or is not responding. (MaxRetryError)') except pyes.exceptions.IndexMissingException: error_messages.append('Error: Index is missing. Press the reindex ' 'button below. (IndexMissingException)') except pyes.urllib3.TimeoutError: error_messages.append('Error: Connection to Elastic Search timed out. ' '(TimeoutError)') outstanding_records = Record.outstanding() recent_records = Record.objects.order_by('-creation_time')[:20] return render( request, 'admin/search_admin_view.html', { 'title': 'Search', 'mapping_type_stats': stats, 'indexes': indexes, 'index': get_index(), 'error_messages': error_messages, 'recent_records': recent_records, 'outstanding_records': outstanding_records, 'now': datetime.now(), })
def search_admin_view(request): """Render the admin view containing search tools""" error_messages = [] stats = None indexes = [] reset_requested = 'reset' in request.POST if reset_requested: try: return handle_reset(request) except Exception as exc: error_messages.append(u'Error: %s' % exc.message) reindex_requested = 'reindex' in request.POST if reindex_requested: try: return handle_reindex(request) except Exception as exc: error_messages.append(u'Error: %s' % exc.message) try: # This gets index stats, but also tells us whether ES is in # a bad state. try: stats = get_index_stats() except pyes.exceptions.IndexMissingException: stats = None indexes = get_indexes() indexes.sort(key=lambda m: m[0]) except pyes.urllib3.MaxRetryError: error_messages.append('Error: Elastic Search is not set up on this ' 'machine or is not responding. (MaxRetryError)') except pyes.exceptions.IndexMissingException: error_messages.append('Error: Index is missing. Press the reindex ' 'button below. (IndexMissingException)') except pyes.urllib3.TimeoutError: error_messages.append('Error: Connection to Elastic Search timed out. ' '(TimeoutError)') outstanding_records = Record.outstanding() recent_records = Record.objects.order_by('-creation_time')[:20] return render(request, 'admin/search_admin_view.html', { 'title': 'Search', 'mapping_type_stats': stats, 'indexes': indexes, 'index': get_index(), 'error_messages': error_messages, 'recent_records': recent_records, 'outstanding_records': outstanding_records, 'now': datetime.now(), })
def monitor_view(request): """View for services monitor.""" # Dict of infrastructure name -> list of output tuples of (INFO, # msg) or (ERROR, msg) status = {} # Note: To add a new component, do your testing and then add a # name -> list of output tuples map to status. # Check memcached. memcache_results = [] try: for cache_name, cache_props in settings.CACHES.items(): result = True backend = cache_props['BACKEND'] location = cache_props['LOCATION'] # LOCATION can be a string or a list of strings if isinstance(location, basestring): location = location.split(';') if 'memcache' in backend: for loc in location: # TODO: this doesn't handle unix: variant ip, port = loc.split(':') result = test_memcached(ip, int(port)) memcache_results.append( (INFO, '%s:%s %s' % (ip, port, result))) if not memcache_results: memcache_results.append((ERROR, 'memcache is not configured.')) elif len(memcache_results) < 2: memcache_results.append( (ERROR, ('You should have at least 2 memcache servers. ' 'You have %s.' % len(memcache_results)))) else: memcache_results.append((INFO, 'memcached servers look good.')) except Exception as exc: memcache_results.append( (ERROR, 'Exception while looking at memcached: %s' % str(exc))) status['memcached'] = memcache_results # Check ES. es_results = [] try: get_index_stats() es_results.append( (INFO, ('Successfully connected to ElasticSearch and index ' 'exists.'))) except (ConnectionError, Timeout) as exc: es_results.append( (ERROR, 'Cannot connect to ElasticSearch: %s' % str(exc))) except ElasticHttpNotFoundError: es_results.append( (ERROR, 'Index "%s" missing.' % get_index())) except Exception as exc: es_results.append( (ERROR, 'Exception while looking at ElasticSearch: %s' % str(exc))) status['ElasticSearch'] = es_results # Check RabbitMQ. rabbitmq_results = [] try: rabbit_conn = establish_connection(connect_timeout=2) rabbit_conn.connect() rabbitmq_results.append( (INFO, 'Successfully connected to RabbitMQ.')) except (socket.error, IOError) as exc: rabbitmq_results.append( (ERROR, 'Error connecting to RabbitMQ: %s' % str(exc))) except Exception as exc: rabbitmq_results.append( (ERROR, 'Exception while looking at RabbitMQ: %s' % str(exc))) status['RabbitMQ'] = rabbitmq_results status_code = 200 status_summary = {} for component, output in status.items(): if ERROR in [item[0] for item in output]: status_code = 500 status_summary[component] = False else: status_summary[component] = True return render(request, 'services/monitor.html', {'component_status': status, 'status_summary': status_summary}, status=status_code)
def monitor_view(request): """View for services monitor.""" # Dict of infrastructure name -> list of output tuples of (INFO, # msg) or (ERROR, msg) status = {} # Note: To add a new component, do your testing and then add a # name -> list of output tuples map to status. # Check memcached. memcache_results = [] try: for cache_name, cache_props in settings.CACHES.items(): result = True backend = cache_props['BACKEND'] location = cache_props['LOCATION'] # LOCATION can be a string or a list of strings if isinstance(location, basestring): location = location.split(';') if 'memcache' in backend: for loc in location: # TODO: this doesn't handle unix: variant ip, port = loc.split(':') result = test_memcached(ip, int(port)) memcache_results.append( (INFO, '%s:%s %s' % (ip, port, result))) if not memcache_results: memcache_results.append((ERROR, 'memcache is not configured.')) elif len(memcache_results) < 2: memcache_results.append( (ERROR, ('You should have at least 2 memcache servers. ' 'You have %s.' % len(memcache_results)))) else: memcache_results.append((INFO, 'memcached servers look good.')) except Exception as exc: memcache_results.append( (ERROR, 'Exception while looking at memcached: %s' % str(exc))) status['memcached'] = memcache_results # Check ES. es_results = [] try: get_index_stats() es_results.append( (INFO, ('Successfully connected to ElasticSearch and index ' 'exists.'))) except ConnectionError as exc: es_results.append( (ERROR, 'Cannot connect to ElasticSearch: %s' % str(exc))) except NotFoundError: es_results.append( (ERROR, 'Index "%s" missing.' % get_index())) except Exception as exc: es_results.append( (ERROR, 'Exception while looking at ElasticSearch: %s' % str(exc))) status['ElasticSearch'] = es_results # Check RabbitMQ. rabbitmq_results = [] try: rabbit_conn = establish_connection(connect_timeout=2) rabbit_conn.connect() rabbitmq_results.append( (INFO, 'Successfully connected to RabbitMQ.')) except (socket.error, IOError) as exc: rabbitmq_results.append( (ERROR, 'Error connecting to RabbitMQ: %s' % str(exc))) except Exception as exc: rabbitmq_results.append( (ERROR, 'Exception while looking at RabbitMQ: %s' % str(exc))) status['RabbitMQ'] = rabbitmq_results status_code = 200 status_summary = {} for component, output in status.items(): if ERROR in [item[0] for item in output]: status_code = 500 status_summary[component] = False else: status_summary[component] = True return render(request, 'services/monitor.html', {'component_status': status, 'status_summary': status_summary}, status=status_code)