Skip to content

Commit

Permalink
Tab completion for empty name queries
Browse files Browse the repository at this point in the history
* starts off with job and instance
* remembers other labels that it sees

Fixes #14
  • Loading branch information
davkal committed Jan 26, 2018
1 parent e11a735 commit d8f255c
Showing 1 changed file with 72 additions and 1 deletion.
73 changes: 72 additions & 1 deletion promeditor/src/QueryField.js
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ import { processLabels, RATE_RANGES, cleanText } from './utils/prometheus';
import Typeahead from './Typeahead';
import './QueryField.css';

const EMPTY_METRIC = '';
const TYPEAHEAD_DEBOUNCE = 300;

function flattenSuggestions(s) {
Expand Down Expand Up @@ -212,6 +213,46 @@ class QueryField extends React.Component {
} else {
this.fetchMetricLabels(metric);
}
} else if (wrapperClasses.contains('context-labels') && !metricNode) {
// Empty name queries
const defaultKeys = ['job', 'instance'];
const labelKeys = [
...new Set(
Object.values(this.state.labelKeys).reduce(
(acc, keys) => acc.concat(keys),
defaultKeys
)
),
];
if (labelKeys) {
if (
(text && text.startsWith('=')) ||
wrapperClasses.contains('attr-value')
) {
// Label values
const labelKeyNode = wrapperNode.previousCousin('.attr-name');
if (labelKeyNode) {
const labelKey = labelKeyNode.textContent;
if (this.state.labelValues[EMPTY_METRIC]) {
const labelValues = this.state.labelValues[EMPTY_METRIC][
labelKey
];
typeaheadContext = 'context-label-values';
suggestionGroups.push({
label: 'Label values',
items: labelValues,
});
} else {
// Can only query label values for now (API to query keys is under development)
this.fetchLabelValues(labelKey);
}
}
} else {
// Label keys
typeaheadContext = 'context-labels';
suggestionGroups.push({ label: 'Labels', items: labelKeys });
}
}
} else if (metricNode && wrapperClasses.contains('context-aggregation')) {
typeaheadContext = 'context-aggregation';
const metric = metricNode.textContent;
Expand All @@ -222,7 +263,9 @@ class QueryField extends React.Component {
this.fetchMetricLabels(metric);
}
} else if (
(this.state.metrics && (prefix || text.match(/[+\-*/^%]/))) ||
(this.state.metrics &&
((prefix && !wrapperClasses.contains('token')) ||
text.match(/[+\-*/^%]/))) ||
wrapperClasses.contains('context-function')
) {
// Need prefix for metrics
Expand Down Expand Up @@ -376,6 +419,34 @@ class QueryField extends React.Component {
});
};

async fetchLabelValues(key) {
const url = `/api/v1/label/${key}/values`;
try {
const res = await this.request(url);
const body = await res.json();
const pairs = this.state.labelValues[EMPTY_METRIC];
const values = {
...pairs,
[key]: body.data,
};
// const labelKeys = {
// ...this.state.labelKeys,
// [EMPTY_METRIC]: keys,
// };
const labelValues = {
...this.state.labelValues,
[EMPTY_METRIC]: values,
};
this.setState({ labelValues }, this.handleTypeahead);
} catch (e) {
if (this.props.onRequestError) {
this.props.onRequestError(e);
} else {
console.error(e);
}
}
}

async fetchMetricLabels(name) {
const url = `/api/v1/series?match[]=${name}`;
try {
Expand Down

0 comments on commit d8f255c

Please sign in to comment.