diff --git a/public/app/containers/Explore/Legend.tsx b/public/app/containers/Explore/Legend.tsx index e00932fe566..439b6c3e54f 100644 --- a/public/app/containers/Explore/Legend.tsx +++ b/public/app/containers/Explore/Legend.tsx @@ -5,7 +5,9 @@ const LegendItem = ({ series }) => (
- {series.alias} + + {series.alias} + ); diff --git a/public/app/containers/Explore/PromQueryField.tsx b/public/app/containers/Explore/PromQueryField.tsx index 491e7005bd0..8188e516161 100644 --- a/public/app/containers/Explore/PromQueryField.tsx +++ b/public/app/containers/Explore/PromQueryField.tsx @@ -255,6 +255,8 @@ class PromQueryField extends React.Component 3; // Determine candidates by CSS context if (_.includes(wrapperClasses, 'context-range')) { // Suggestions for metric[|] @@ -266,7 +268,7 @@ class PromQueryField extends React.Component { handler(event, change); expect(Plain.serialize(change.value)).toEqual('sum(rate(metric{namespace="dev", cluster="c1"}[2m]))'); }); + + it('removes closing brace when opening brace is removed', () => { + const change = Plain.deserialize('time()').change(); + let event; + change.move(5); + event = new window.KeyboardEvent('keydown', { key: 'Backspace' }); + handler(event, change); + expect(Plain.serialize(change.value)).toEqual('time'); + }); + + it('keeps closing brace when opening brace is removed and inner values exist', () => { + const change = Plain.deserialize('time(value)').change(); + let event; + change.move(5); + event = new window.KeyboardEvent('keydown', { key: 'Backspace' }); + const handled = handler(event, change); + expect(handled).toBeFalsy(); + }); }); diff --git a/public/app/containers/Explore/slate-plugins/braces.ts b/public/app/containers/Explore/slate-plugins/braces.ts index 2ea58569ef0..f3a76263ad6 100644 --- a/public/app/containers/Explore/slate-plugins/braces.ts +++ b/public/app/containers/Explore/slate-plugins/braces.ts @@ -43,6 +43,22 @@ export default function BracesPlugin() { return true; } + case 'Backspace': { + const text = value.anchorText.text; + const offset = value.anchorOffset; + const previousChar = text[offset - 1]; + const nextChar = text[offset]; + if (BRACES[previousChar] && BRACES[previousChar] === nextChar) { + event.preventDefault(); + // Remove closing brace if directly following + change + .deleteBackward() + .deleteForward() + .focus(); + return true; + } + } + default: { break; } diff --git a/public/app/plugins/datasource/prometheus/datasource.ts b/public/app/plugins/datasource/prometheus/datasource.ts index ca80b3760a7..b53b9eb34c1 100644 --- a/public/app/plugins/datasource/prometheus/datasource.ts +++ b/public/app/plugins/datasource/prometheus/datasource.ts @@ -46,7 +46,7 @@ export function determineQueryHints(series: any[], datasource?: any): any[] { // Check for monotony const datapoints: number[][] = s.datapoints; - if (datapoints.length > 1) { + if (query.indexOf('rate(') === -1 && datapoints.length > 1) { let increasing = false; const monotonic = datapoints.filter(dp => dp[0] !== null).every((dp, index) => { if (index === 0) { diff --git a/public/app/plugins/datasource/prometheus/specs/datasource.test.ts b/public/app/plugins/datasource/prometheus/specs/datasource.test.ts index eef2bbd56b6..692a1827247 100644 --- a/public/app/plugins/datasource/prometheus/specs/datasource.test.ts +++ b/public/app/plugins/datasource/prometheus/specs/datasource.test.ts @@ -247,6 +247,12 @@ describe('PrometheusDatasource', () => { }); }); + it('returns no rate hint for a monotonously increasing series that already has a rate', () => { + const series = [{ datapoints: [[23, 1000], [24, 1001]], query: 'rate(metric[1m])', responseIndex: 0 }]; + const hints = determineQueryHints(series); + expect(hints).toEqual([null]); + }); + it('returns a rate hint w/o action for a complex monotonously increasing series', () => { const series = [{ datapoints: [[23, 1000], [24, 1001]], query: 'sum(metric)', responseIndex: 0 }]; const hints = determineQueryHints(series);