[v10.0.x] Prometheus: Fix heatmap query format (#71971) (#72017)

* Prometheus: Fix heatmap query format (#71971)

Check first numeric field instead of name: Value

---------

Co-authored-by: ismail simsek <ismailsimsek09@gmail.com>
(cherry picked from commit 1c358de190)

* fix conflicts in merge, add ts-ignore to ignore missing name in tests
This commit is contained in:
Galen Kistler
2023-07-20 16:26:46 +02:00
committed by GitHub
parent 340df22292
commit ad793b82c3
3 changed files with 26 additions and 24 deletions
@@ -264,6 +264,7 @@ export interface DataFrameDTO extends QueryResultBase {
export interface FieldCalcs extends Record<string, any> {}
/** @deprecated check data plane docs: https://grafana.github.io/dataplane/heatmap **/
export const TIME_SERIES_VALUE_FIELD_NAME = 'Value';
export const TIME_SERIES_TIME_FIELD_NAME = 'Time';
export const TIME_SERIES_METRIC_FIELD_NAME = 'Metric';
@@ -313,7 +313,7 @@ describe('Prometheus Result Transformer', () => {
expect(series.data[1].meta?.preferredVisualisationType).toEqual('rawPrometheus' as PreferredVisualisationType);
});
it('results with heatmap format should be correctly transformed', () => {
it('results with deprecated heatmap format should be correctly transformed', () => {
const options = {
targets: [
{
@@ -394,8 +394,8 @@ describe('Prometheus Result Transformer', () => {
refId: 'A',
fields: [
{ name: 'Time', type: FieldType.time, values: [6, 5, 4] },
//@ts-ignore missing name
{
name: 'Value',
type: FieldType.number,
values: [10, 10, 0],
labels: { le: '1' },
@@ -406,8 +406,8 @@ describe('Prometheus Result Transformer', () => {
refId: 'A',
fields: [
{ name: 'Time', type: FieldType.time, values: [6, 5, 4] },
//@ts-ignore missing name
{
name: 'Value',
type: FieldType.number,
values: [20, 10, 30],
labels: { le: '2' },
@@ -418,8 +418,8 @@ describe('Prometheus Result Transformer', () => {
refId: 'A',
fields: [
{ name: 'Time', type: FieldType.time, values: [6, 5, 4] },
//@ts-ignore missing name
{
name: 'Value',
type: FieldType.number,
values: [30, 10, 40],
labels: { le: '+Inf' },
@@ -430,8 +430,8 @@ describe('Prometheus Result Transformer', () => {
refId: 'B',
fields: [
{ name: 'Time', type: FieldType.time, values: [6, 5, 4] },
//@ts-ignore missing name
{
name: 'Value',
type: FieldType.number,
values: [10, 10, 0],
labels: { le: '1' },
@@ -442,8 +442,8 @@ describe('Prometheus Result Transformer', () => {
refId: 'B',
fields: [
{ name: 'Time', type: FieldType.time, values: [6, 5, 4] },
//@ts-ignore missing name
{
name: 'Value',
type: FieldType.number,
values: [20, 10, 30],
labels: { le: '2' },
@@ -454,8 +454,8 @@ describe('Prometheus Result Transformer', () => {
refId: 'B',
fields: [
{ name: 'Time', type: FieldType.time, values: [6, 5, 4] },
//@ts-ignore missing name
{
name: 'Value',
type: FieldType.number,
values: [30, 10, 40],
labels: { le: '+Inf' },
@@ -489,8 +489,8 @@ describe('Prometheus Result Transformer', () => {
refId: 'A',
fields: [
{ name: 'Time', type: FieldType.time, values: [6, 5, 4] },
//@ts-ignore missing name
{
name: 'Value',
type: FieldType.number,
values: [10, 10, 0],
labels: { le: '1', additionalProperty: '10' },
@@ -501,8 +501,8 @@ describe('Prometheus Result Transformer', () => {
refId: 'A',
fields: [
{ name: 'Time', type: FieldType.time, values: [6, 5, 4] },
//@ts-ignore missing name
{
name: 'Value',
type: FieldType.number,
values: [20, 10, 30],
labels: { le: '2', additionalProperty: '10' },
@@ -513,8 +513,8 @@ describe('Prometheus Result Transformer', () => {
refId: 'A',
fields: [
{ name: 'Time', type: FieldType.time, values: [6, 5, 4] },
//@ts-ignore missing name
{
name: 'Value',
type: FieldType.number,
values: [30, 10, 40],
labels: { le: '+Inf', additionalProperty: '10' },
@@ -526,8 +526,8 @@ describe('Prometheus Result Transformer', () => {
refId: 'A',
fields: [
{ name: 'Time', type: FieldType.time, values: [6, 5, 4] },
//@ts-ignore missing name
{
name: 'Value',
type: FieldType.number,
values: [0, 10, 10],
labels: { le: '1', additionalProperty: '20' },
@@ -538,8 +538,8 @@ describe('Prometheus Result Transformer', () => {
refId: 'A',
fields: [
{ name: 'Time', type: FieldType.time, values: [6, 5, 4] },
//@ts-ignore missing name
{
name: 'Value',
type: FieldType.number,
values: [20, 10, 40],
labels: { le: '2', additionalProperty: '20' },
@@ -550,8 +550,8 @@ describe('Prometheus Result Transformer', () => {
refId: 'A',
fields: [
{ name: 'Time', type: FieldType.time, values: [6, 5, 4] },
//@ts-ignore missing name
{
name: 'Value',
type: FieldType.number,
values: [30, 10, 60],
labels: { le: '+Inf', additionalProperty: '20' },
@@ -563,8 +563,8 @@ describe('Prometheus Result Transformer', () => {
refId: 'A',
fields: [
{ name: 'Time', type: FieldType.time, values: [6, 5, 4] },
//@ts-ignore missing name
{
name: 'Value',
type: FieldType.number,
values: [30, 30, 60],
labels: { le: '1', additionalProperty: '30' },
@@ -575,8 +575,8 @@ describe('Prometheus Result Transformer', () => {
refId: 'A',
fields: [
{ name: 'Time', type: FieldType.time, values: [6, 5, 4] },
//@ts-ignore missing name
{
name: 'Value',
type: FieldType.number,
values: [30, 40, 60],
labels: { le: '2', additionalProperty: '30' },
@@ -587,8 +587,8 @@ describe('Prometheus Result Transformer', () => {
refId: 'A',
fields: [
{ name: 'Time', type: FieldType.time, values: [6, 5, 4] },
//@ts-ignore missing name
{
name: 'Value',
type: FieldType.number,
values: [40, 40, 60],
labels: { le: '+Inf', additionalProperty: '30' },
@@ -629,8 +629,8 @@ describe('Prometheus Result Transformer', () => {
refId: 'A',
fields: [
{ name: 'Time', type: FieldType.time, values: [6, 5, 4] },
//@ts-ignore missing name
{
name: 'Value',
type: FieldType.number,
values: [10, 10, 0],
labels: { le: '1' },
@@ -647,8 +647,8 @@ describe('Prometheus Result Transformer', () => {
},
fields: [
{ name: 'Time', type: FieldType.time, values: [6, 5, 4, 3, 2, 1] },
//@ts-ignore missing name
{
name: 'Value',
type: FieldType.number,
values: [30, 10, 40, 90, 14, 21],
labels: { le: '6' },
@@ -679,8 +679,8 @@ describe('Prometheus Result Transformer', () => {
refId: 'A',
fields: [
{ name: 'Time', type: FieldType.time, values: [6, 5, 4] },
//@ts-ignore missing name
{
name: 'Value',
type: FieldType.number,
values: [10, 10, 0],
labels: { le: '1' },
@@ -697,8 +697,8 @@ describe('Prometheus Result Transformer', () => {
},
fields: [
{ name: 'Time', type: FieldType.time, values: [6, 5, 4, 3, 2, 1] },
//@ts-ignore missing name
{
name: 'Value',
type: FieldType.number,
values: [30, 10, 40, 90, 14, 21],
labels: { le: '6' },
@@ -121,7 +121,7 @@ export function transformV2(
// this works around the fact that we only get back frame.name with le buckets when legendFormat == {{le}}...which is not the default
heatmapResults.forEach((df) => {
if (df.name == null) {
let f = df.fields.find((f) => f.name === 'Value');
let f = df.fields.find((f) => f.type === FieldType.number);
if (f) {
let le = f.labels?.le;
@@ -150,7 +150,7 @@ export function transformV2(
// Create a new grouping by iterating through the data frames...
const heatmapResultsGroupedByValues = groupBy<DataFrame>(heatmapResultsGroup, (dataFrame) => {
// Each data frame has `Time` and `Value` properties, we want to get the values
const values = dataFrame.fields.find((field) => field.name === TIME_SERIES_VALUE_FIELD_NAME);
const values = dataFrame.fields.find((field) => field.type === FieldType.number);
// Specific functionality for special "le" quantile heatmap value, we know if this value exists, that we do not want to calculate the heatmap density across data frames from the same quartile
if (values?.labels && HISTOGRAM_QUANTILE_LABEL_NAME in values.labels) {
const { le, ...notLE } = values?.labels;
@@ -650,9 +650,10 @@ function transformToHistogramOverTime(seriesList: DataFrame[]) {
le20 20 10 30 => 10 0 30
le30 30 10 35 => 10 0 5
*/
for (let i = seriesList.length - 1; i > 0; i--) {
const topSeries = seriesList[i].fields.find((s) => s.name === TIME_SERIES_VALUE_FIELD_NAME);
const bottomSeries = seriesList[i - 1].fields.find((s) => s.name === TIME_SERIES_VALUE_FIELD_NAME);
const topSeries = seriesList[i].fields.find((s) => s.type === FieldType.number);
const bottomSeries = seriesList[i - 1].fields.find((s) => s.type === FieldType.number);
if (!topSeries || !bottomSeries) {
throw new Error('Prometheus heatmap transform error: data should be a time series');
}