prometheus_metrics.js 4.03 KB
Newer Older
1
import axios from '../lib/utils/axios_utils';
2
import PANEL_STATE from './constants';
3
import { backOff } from '../lib/utils/common_utils';
4

kushalpandya's avatar
kushalpandya committed
5 6 7 8 9 10 11 12 13 14 15 16
export default class PrometheusMetrics {
  constructor(wrapperSelector) {
    this.backOffRequestCounter = 0;

    this.$wrapper = $(wrapperSelector);

    this.$monitoredMetricsPanel = this.$wrapper.find('.js-panel-monitored-metrics');
    this.$monitoredMetricsCount = this.$monitoredMetricsPanel.find('.js-monitored-count');
    this.$monitoredMetricsLoading = this.$monitoredMetricsPanel.find('.js-loading-metrics');
    this.$monitoredMetricsEmpty = this.$monitoredMetricsPanel.find('.js-empty-metrics');
    this.$monitoredMetricsList = this.$monitoredMetricsPanel.find('.js-metrics-list');

17 18 19 20
    this.$missingEnvVarPanel = this.$wrapper.find('.js-panel-missing-env-vars');
    this.$panelToggle = this.$missingEnvVarPanel.find('.js-panel-toggle');
    this.$missingEnvVarMetricCount = this.$missingEnvVarPanel.find('.js-env-var-count');
    this.$missingEnvVarMetricsList = this.$missingEnvVarPanel.find('.js-missing-var-metrics-list');
kushalpandya's avatar
kushalpandya committed
21

Jacob Schatz's avatar
Jacob Schatz committed
22
    this.activeMetricsEndpoint = this.$monitoredMetricsPanel.data('activeMetrics');
kushalpandya's avatar
kushalpandya committed
23 24 25 26

    this.$panelToggle.on('click', e => this.handlePanelToggle(e));
  }

27
  /* eslint-disable class-methods-use-this */
kushalpandya's avatar
kushalpandya committed
28 29
  handlePanelToggle(e) {
    const $toggleBtn = $(e.currentTarget);
30 31 32
    const $currentPanelBody = $toggleBtn.closest('.panel').find('.panel-body');
    $currentPanelBody.toggleClass('hidden');
    if ($toggleBtn.hasClass('fa-caret-down')) {
kushalpandya's avatar
kushalpandya committed
33 34 35 36 37 38
      $toggleBtn.removeClass('fa-caret-down').addClass('fa-caret-right');
    } else {
      $toggleBtn.removeClass('fa-caret-right').addClass('fa-caret-down');
    }
  }

39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58
  showMonitoringMetricsPanelState(stateName) {
    switch (stateName) {
      case PANEL_STATE.LOADING:
        this.$monitoredMetricsLoading.removeClass('hidden');
        this.$monitoredMetricsEmpty.addClass('hidden');
        this.$monitoredMetricsList.addClass('hidden');
        break;
      case PANEL_STATE.LIST:
        this.$monitoredMetricsLoading.addClass('hidden');
        this.$monitoredMetricsEmpty.addClass('hidden');
        this.$monitoredMetricsList.removeClass('hidden');
        break;
      default:
        this.$monitoredMetricsLoading.addClass('hidden');
        this.$monitoredMetricsEmpty.removeClass('hidden');
        this.$monitoredMetricsList.addClass('hidden');
        break;
    }
  }

kushalpandya's avatar
kushalpandya committed
59 60
  populateActiveMetrics(metrics) {
    let totalMonitoredMetrics = 0;
61 62
    let totalMissingEnvVarMetrics = 0;

kushalpandya's avatar
kushalpandya committed
63
    metrics.forEach((metric) => {
64
      this.$monitoredMetricsList.append(`<li>${metric.group}<span class="badge">${metric.active_metrics}</span></li>`);
kushalpandya's avatar
kushalpandya committed
65
      totalMonitoredMetrics += metric.active_metrics;
66 67 68 69
      if (metric.metrics_missing_requirements > 0) {
        this.$missingEnvVarMetricsList.append(`<li>${metric.group}</li>`);
        totalMissingEnvVarMetrics += 1;
      }
kushalpandya's avatar
kushalpandya committed
70 71 72
    });

    this.$monitoredMetricsCount.text(totalMonitoredMetrics);
73
    this.showMonitoringMetricsPanelState(PANEL_STATE.LIST);
74 75 76

    if (totalMissingEnvVarMetrics > 0) {
      this.$missingEnvVarPanel.removeClass('hidden');
77
      this.$missingEnvVarPanel.find('.flash-container').off('click');
78 79
      this.$missingEnvVarMetricCount.text(totalMissingEnvVarMetrics);
    }
kushalpandya's avatar
kushalpandya committed
80 81 82
  }

  loadActiveMetrics() {
83
    this.showMonitoringMetricsPanelState(PANEL_STATE.LOADING);
84
    backOff((next, stop) => {
85 86 87 88
      axios.get(this.activeMetricsEndpoint)
        .then(({ data }) => {
          if (data && data.success) {
            stop(data);
kushalpandya's avatar
kushalpandya committed
89 90 91 92 93
          } else {
            this.backOffRequestCounter = this.backOffRequestCounter += 1;
            if (this.backOffRequestCounter < 3) {
              next();
            } else {
94
              stop(data);
kushalpandya's avatar
kushalpandya committed
95 96 97
            }
          }
        })
98
        .catch(stop);
kushalpandya's avatar
kushalpandya committed
99 100 101 102 103
    })
    .then((res) => {
      if (res && res.data && res.data.length) {
        this.populateActiveMetrics(res.data);
      } else {
104
        this.showMonitoringMetricsPanelState(PANEL_STATE.EMPTY);
kushalpandya's avatar
kushalpandya committed
105
      }
106 107
    })
    .catch(() => {
108
      this.showMonitoringMetricsPanelState(PANEL_STATE.EMPTY);
kushalpandya's avatar
kushalpandya committed
109 110 111
    });
  }
}