Skip to content

Commit bfd05ba

Browse files
authored
Merge pull request grafana#12617 from grafana/davkal/prometheus-value-formatting
Make prometheus value formatting more robust
2 parents e413f02 + 1f74b29 commit bfd05ba

File tree

4 files changed

+31
-22
lines changed

4 files changed

+31
-22
lines changed

public/app/features/panel/metrics_panel_ctrl.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -222,7 +222,7 @@ class MetricsPanelCtrl extends PanelCtrl {
222222
// and add built in variables interval and interval_ms
223223
var scopedVars = Object.assign({}, this.panel.scopedVars, {
224224
__interval: { text: this.interval, value: this.interval },
225-
__interval_ms: { text: String(this.intervalMs), value: String(this.intervalMs) },
225+
__interval_ms: { text: this.intervalMs, value: this.intervalMs },
226226
});
227227

228228
var metricsQuery = {

public/app/plugins/datasource/prometheus/datasource.ts

+9-3
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,17 @@ export function alignRange(start, end, step) {
1717
}
1818

1919
export function prometheusRegularEscape(value) {
20-
return value.replace(/'/g, "\\\\'");
20+
if (typeof value === 'string') {
21+
return value.replace(/'/g, "\\\\'");
22+
}
23+
return value;
2124
}
2225

2326
export function prometheusSpecialRegexEscape(value) {
24-
return prometheusRegularEscape(value.replace(/\\/g, '\\\\\\\\').replace(/[$^*{}\[\]+?.()]/g, '\\\\$&'));
27+
if (typeof value === 'string') {
28+
return prometheusRegularEscape(value.replace(/\\/g, '\\\\\\\\').replace(/[$^*{}\[\]+?.()]/g, '\\\\$&'));
29+
}
30+
return value;
2531
}
2632

2733
export class PrometheusDatasource {
@@ -196,7 +202,7 @@ export class PrometheusDatasource {
196202
interval = adjustedInterval;
197203
scopedVars = Object.assign({}, options.scopedVars, {
198204
__interval: { text: interval + 's', value: interval + 's' },
199-
__interval_ms: { text: String(interval * 1000), value: String(interval * 1000) },
205+
__interval_ms: { text: interval * 1000, value: interval * 1000 },
200206
});
201207
}
202208
query.step = interval;

public/app/plugins/datasource/prometheus/specs/datasource.jest.ts

+3
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,9 @@ describe('PrometheusDatasource', () => {
166166
});
167167

168168
describe('Prometheus regular escaping', function() {
169+
it('should not escape non-string', function() {
170+
expect(prometheusRegularEscape(12)).toEqual(12);
171+
});
169172
it('should not escape simple string', function() {
170173
expect(prometheusRegularEscape('cryptodepression')).toEqual('cryptodepression');
171174
});

public/app/plugins/datasource/prometheus/specs/datasource_specs.ts

+18-18
Original file line numberDiff line numberDiff line change
@@ -452,7 +452,7 @@ describe('PrometheusDatasource', function() {
452452
interval: '10s',
453453
scopedVars: {
454454
__interval: { text: '10s', value: '10s' },
455-
__interval_ms: { text: String(10 * 1000), value: String(10 * 1000) },
455+
__interval_ms: { text: 10 * 1000, value: 10 * 1000 },
456456
},
457457
};
458458
var urlExpected =
@@ -463,8 +463,8 @@ describe('PrometheusDatasource', function() {
463463

464464
expect(query.scopedVars.__interval.text).to.be('10s');
465465
expect(query.scopedVars.__interval.value).to.be('10s');
466-
expect(query.scopedVars.__interval_ms.text).to.be(String(10 * 1000));
467-
expect(query.scopedVars.__interval_ms.value).to.be(String(10 * 1000));
466+
expect(query.scopedVars.__interval_ms.text).to.be(10 * 1000);
467+
expect(query.scopedVars.__interval_ms.value).to.be(10 * 1000);
468468
});
469469
it('should be min interval when it is greater than auto interval', function() {
470470
var query = {
@@ -479,7 +479,7 @@ describe('PrometheusDatasource', function() {
479479
interval: '5s',
480480
scopedVars: {
481481
__interval: { text: '5s', value: '5s' },
482-
__interval_ms: { text: String(5 * 1000), value: String(5 * 1000) },
482+
__interval_ms: { text: 5 * 1000, value: 5 * 1000 },
483483
},
484484
};
485485
var urlExpected =
@@ -490,8 +490,8 @@ describe('PrometheusDatasource', function() {
490490

491491
expect(query.scopedVars.__interval.text).to.be('5s');
492492
expect(query.scopedVars.__interval.value).to.be('5s');
493-
expect(query.scopedVars.__interval_ms.text).to.be(String(5 * 1000));
494-
expect(query.scopedVars.__interval_ms.value).to.be(String(5 * 1000));
493+
expect(query.scopedVars.__interval_ms.text).to.be(5 * 1000);
494+
expect(query.scopedVars.__interval_ms.value).to.be(5 * 1000);
495495
});
496496
it('should account for intervalFactor', function() {
497497
var query = {
@@ -507,7 +507,7 @@ describe('PrometheusDatasource', function() {
507507
interval: '10s',
508508
scopedVars: {
509509
__interval: { text: '10s', value: '10s' },
510-
__interval_ms: { text: String(10 * 1000), value: String(10 * 1000) },
510+
__interval_ms: { text: 10 * 1000, value: 10 * 1000 },
511511
},
512512
};
513513
var urlExpected =
@@ -518,8 +518,8 @@ describe('PrometheusDatasource', function() {
518518

519519
expect(query.scopedVars.__interval.text).to.be('10s');
520520
expect(query.scopedVars.__interval.value).to.be('10s');
521-
expect(query.scopedVars.__interval_ms.text).to.be(String(10 * 1000));
522-
expect(query.scopedVars.__interval_ms.value).to.be(String(10 * 1000));
521+
expect(query.scopedVars.__interval_ms.text).to.be(10 * 1000);
522+
expect(query.scopedVars.__interval_ms.value).to.be(10 * 1000);
523523
});
524524
it('should be interval * intervalFactor when greater than min interval', function() {
525525
var query = {
@@ -535,7 +535,7 @@ describe('PrometheusDatasource', function() {
535535
interval: '5s',
536536
scopedVars: {
537537
__interval: { text: '5s', value: '5s' },
538-
__interval_ms: { text: String(5 * 1000), value: String(5 * 1000) },
538+
__interval_ms: { text: 5 * 1000, value: 5 * 1000 },
539539
},
540540
};
541541
var urlExpected =
@@ -546,8 +546,8 @@ describe('PrometheusDatasource', function() {
546546

547547
expect(query.scopedVars.__interval.text).to.be('5s');
548548
expect(query.scopedVars.__interval.value).to.be('5s');
549-
expect(query.scopedVars.__interval_ms.text).to.be(String(5 * 1000));
550-
expect(query.scopedVars.__interval_ms.value).to.be(String(5 * 1000));
549+
expect(query.scopedVars.__interval_ms.text).to.be(5 * 1000);
550+
expect(query.scopedVars.__interval_ms.value).to.be(5 * 1000);
551551
});
552552
it('should be min interval when greater than interval * intervalFactor', function() {
553553
var query = {
@@ -563,7 +563,7 @@ describe('PrometheusDatasource', function() {
563563
interval: '5s',
564564
scopedVars: {
565565
__interval: { text: '5s', value: '5s' },
566-
__interval_ms: { text: String(5 * 1000), value: String(5 * 1000) },
566+
__interval_ms: { text: 5 * 1000, value: 5 * 1000 },
567567
},
568568
};
569569
var urlExpected =
@@ -574,8 +574,8 @@ describe('PrometheusDatasource', function() {
574574

575575
expect(query.scopedVars.__interval.text).to.be('5s');
576576
expect(query.scopedVars.__interval.value).to.be('5s');
577-
expect(query.scopedVars.__interval_ms.text).to.be(String(5 * 1000));
578-
expect(query.scopedVars.__interval_ms.value).to.be(String(5 * 1000));
577+
expect(query.scopedVars.__interval_ms.text).to.be(5 * 1000);
578+
expect(query.scopedVars.__interval_ms.value).to.be(5 * 1000);
579579
});
580580
it('should be determined by the 11000 data points limit, accounting for intervalFactor', function() {
581581
var query = {
@@ -590,7 +590,7 @@ describe('PrometheusDatasource', function() {
590590
interval: '5s',
591591
scopedVars: {
592592
__interval: { text: '5s', value: '5s' },
593-
__interval_ms: { text: String(5 * 1000), value: String(5 * 1000) },
593+
__interval_ms: { text: 5 * 1000, value: 5 * 1000 },
594594
},
595595
};
596596
var end = 7 * 24 * 60 * 60;
@@ -609,8 +609,8 @@ describe('PrometheusDatasource', function() {
609609

610610
expect(query.scopedVars.__interval.text).to.be('5s');
611611
expect(query.scopedVars.__interval.value).to.be('5s');
612-
expect(query.scopedVars.__interval_ms.text).to.be(String(5 * 1000));
613-
expect(query.scopedVars.__interval_ms.value).to.be(String(5 * 1000));
612+
expect(query.scopedVars.__interval_ms.text).to.be(5 * 1000);
613+
expect(query.scopedVars.__interval_ms.value).to.be(5 * 1000);
614614
});
615615
});
616616
});

0 commit comments

Comments
 (0)