diff --git a/stacktach/models.py b/stacktach/models.py index 0e403a7..0959809 100644 --- a/stacktach/models.py +++ b/stacktach/models.py @@ -20,6 +20,8 @@ from django.db import models class Tenant(models.Model): email = models.CharField(max_length=50) project_name = models.CharField(max_length=50) + nova_stats_template = models.CharField(max_length=200) + loggly_template = models.CharField(max_length=200) tenant_id = models.AutoField(primary_key=True, unique=True) @@ -35,13 +37,13 @@ class RawData(models.Model): blank=True, db_index=True) when = models.DateTimeField(db_index=True) microseconds = models.IntegerField(default=0) - publisher = models.CharField(max_length=50, null=True, + publisher = models.CharField(max_length=100, null=True, blank=True, db_index=True) event = models.CharField(max_length=50, null=True, blank=True, db_index=True) service = models.CharField(max_length=50, null=True, blank=True, db_index=True) - host = models.CharField(max_length=50, null=True, + host = models.CharField(max_length=100, null=True, blank=True, db_index=True) instance = models.CharField(max_length=50, null=True, blank=True, db_index=True) @@ -50,4 +52,4 @@ class RawData(models.Model): class TenantForm(forms.ModelForm): class Meta: model = Tenant - fields = ('email', 'project_name') + fields = ('email', 'project_name', 'nova_stats_template', 'loggly_template') diff --git a/stacktach/views.py b/stacktach/views.py index 03ff951..95907cc 100644 --- a/stacktach/views.py +++ b/stacktach/views.py @@ -83,13 +83,22 @@ def _parse(tenant, args, json_args): return {} -def _post_process_raw_data(rows, highlight=None): +def _post_process_raw_data(rows, state, highlight=None): for row in rows: if "error" in row.routing_key: row.is_error = True if highlight and row.id == int(highlight): row.highlight = True row.when += datetime.timedelta(microseconds=row.microseconds) + novastats = state.tenant.nova_stats_template + if novastats and row.instance: + novastats = novastats.replace("[instance]", row.instance) + row.novastats = novastats + loggly = state.tenant.loggly_template + if loggly and row.instance: + loggly = loggly.replace("[instance]", row.instance) + row.loggly = loggly + class State(object): def __init__(self): @@ -203,12 +212,13 @@ def details(request, tenant_id, column, row_id): if column != 'when': rows = rows.filter(**{column:value}) else: + value += datetime.timedelta(microseconds=row.microseconds) from_time = value - datetime.timedelta(minutes=1) to_time = value + datetime.timedelta(minutes=1) rows = rows.filter(when__range=(from_time, to_time)) rows = rows.order_by('-when', '-microseconds')[:200] - _post_process_raw_data(rows, highlight=row_id) + _post_process_raw_data(rows, state, highlight=row_id) c['rows'] = rows c['allow_expansion'] = True c['show_absolute_time'] = True @@ -231,21 +241,25 @@ def host_status(request, tenant_id): state = _get_state(request, tenant_id) c = _default_context(state) hosts = models.RawData.objects.filter(tenant=tenant_id).\ - filter(host__gt='').\ order_by('-when', '-microseconds')[:20] - _post_process_raw_data(hosts) + _post_process_raw_data(hosts, state) c['rows'] = hosts return render_to_response('host_status.html', c) @tenant_check -def instance_status(request, tenant_id): +def search(request, tenant_id): state = _get_state(request, tenant_id) c = _default_context(state) - instances = models.RawData.objects.filter(tenant=tenant_id).\ - exclude(instance='n/a').\ - exclude(instance__isnull=True).\ - order_by('-when', '-microseconds')[:20] - _post_process_raw_data(instances) - c['rows'] = instances - return render_to_response('instance_status.html', c) + column = request.POST.get('field', None) + value = request.POST.get('value', None) + rows = None + if column != None and value != None: + rows = models.RawData.objects.filter(tenant=tenant_id).\ + filter(**{column:value}).\ + order_by('-when', '-microseconds')[:200] + _post_process_raw_data(rows, state) + c['rows'] = rows + c['allow_expansion'] = True + c['show_absolute_time'] = True + return render_to_response('rows.html', c) diff --git a/templates/index.html b/templates/index.html index 497f375..2a9a54c 100644 --- a/templates/index.html +++ b/templates/index.html @@ -28,8 +28,8 @@ {% endblock %} {% block body %} -
{{state.tenant.email}} (TID:{{state.tenant.tenant_id}}) - {{state.tenant.project_name}} logout
-
Recent Activity
+
logout
+
Recent Activity - {{state.tenant.project_name}} (TID:{{state.tenant.tenant_id}})
{% include "host_status.html" %} diff --git a/templates/rows.html b/templates/rows.html index d2570a1..c80abcc 100644 --- a/templates/rows.html +++ b/templates/rows.html @@ -34,11 +34,13 @@ {{row.host}} {{row.event}} - {% if row.instance %} + (L) + (S) + {{row.instance}} - {% endif %} + {% endif %} {% if show_absolute_time %}{{row.when}} (+{{row.when.microsecond}}){%else%}{{row.when|timesince:utc}} ago{%endif%} diff --git a/urls.py b/urls.py index 08885f1..5ae73fa 100644 --- a/urls.py +++ b/urls.py @@ -1,20 +1,9 @@ from django.conf.urls.defaults import patterns, include, url +# Uncomment the next two lines to enable the admin: +# from django.contrib import admin +# admin.autodiscover() + urlpatterns = patterns('', - url(r'^$', 'stacktach.views.welcome', name='welcome'), - url(r'new_tenant', 'stacktach.views.new_tenant', name='new_tenant'), - url(r'logout', 'stacktach.views.logout', name='logout'), - url(r'^(?P\d+)/$', 'stacktach.views.home', name='home'), - url(r'^(?P\d+)/data/$', 'stacktach.views.data', - name='data'), - url(r'^(?P\d+)/details/(?P\w+)/(?P\d+)/$', - 'stacktach.views.details', name='details'), - url(r'^(?P\d+)/search/$', - 'stacktach.views.search', name='search'), - url(r'^(?P\d+)/expand/(?P\d+)/$', - 'stacktach.views.expand', name='expand'), - url(r'^(?P\d+)/host_status/$', - 'stacktach.views.host_status', name='host_status'), - url(r'^(?P\d+)/instance_status/$', - 'stacktach.views.instance_status', name='instance_status'), + url(r'^', include('stacktach.url')), )