Ejemplo n.º 1
0
 def get_context_data(self, **kwargs):
     context = super(RuleRegister, self).get_context_data(**kwargs)
     # Set a dummy rule, so that our header/breadcrumbs render correctly
     context['rule'] = models.Rule()
     context['rule'].pk = 0
     context['rule'].set_object(self.kwargs['content_type'], self.kwargs['object_id'])
     context['macro'] = macro.EXCLUSION_MACRO
     return context
Ejemplo n.º 2
0
 def get_context_data(self, **kwargs):
     context = super().get_context_data(**kwargs)
     # Set a dummy rule, so that our header/breadcrumbs render correctly
     context["rule"] = models.Rule()
     context["rule"].pk = 0
     context["rule"].set_object(self.kwargs["content_type"],
                                self.kwargs["object_id"])
     context["macro"] = macro.EXCLUSION_MACRO
     return context
Ejemplo n.º 3
0
    def clean(self):
        # Check our cleaned data then let Prometheus check our rule
        super().clean()
        rule = models.Rule(**self.cleaned_data)

        # Make sure we pull in our labels and annotations for
        # testing if needed
        # See django docs on cached_property
        rule.labels = self.instance.labels
        rule.annotations = self.instance.annotations

        prometheus.check_rules([rule])
Ejemplo n.º 4
0
    def post(self, request, pk):
        if pk == 0:
            rule = models.Rule()
            rule.set_object(request.POST['content_type'],
                            request.POST['object_id'])
        else:
            rule = get_object_or_404(models.Rule, id=pk)

        query = macro.rulemacro(rule, request.POST['query'])
        # Since our rules affect all servers we use Promgen's proxy-query to test our rule
        # against all the servers at once
        url = resolve_domain('proxy-query')

        logger.debug('Querying %s with %s', url, query)
        start = time.time()
        result = util.get(url, {'query': query}).json()
        duration = datetime.timedelta(seconds=(time.time() - start))

        context = {
            'status': result['status'],
            'duration': duration,
            'query': query
        }
        context['data'] = result.get('data', {})

        context['errors'] = {}

        metrics = context['data'].get('result', [])
        if metrics:
            context['collapse'] = len(metrics) > 5
            for row in metrics:
                if 'service' not in row['metric'] and \
                        'project' not in row['metric']:
                    context['errors'][
                        'routing'] = 'Some metrics are missing service and project labels so Promgen will be unable to route message'
                    context['status'] = 'warning'
        else:
            context['status'] = 'info'
            context['errors'][
                'no_results'] = 'No Results. May need to remove conditional check (> < ==) to verity'

        # Place this at the bottom to have a query error show up as danger
        if result['status'] != 'success':
            context['status'] = 'danger'
            context['errors']['Query'] = result['error']

        return JsonResponse({
            request.POST['target']:
            render_to_string('promgen/ajax_clause_check.html', context)
        })
Ejemplo n.º 5
0
 def clean(self):
     # Check our cleaned data then let Prometheus check our rule
     super().clean()
     rule = models.Rule(**self.cleaned_data)
     prometheus.check_rules([rule])