{"version":3,"file":"result_transformer.cjs","sources":["../../src/result_transformer.ts"],"sourcesContent":["// Core Grafana history https://github.com/grafana/grafana/blob/v11.0.0-preview/public/app/plugins/datasource/prometheus/result_transformer.ts\nimport { flatten, forOwn, groupBy, partition } from 'lodash';\n\nimport {\n  CoreApp,\n  type DataFrame,\n  DataFrameType,\n  type DataLink,\n  type DataQueryRequest,\n  type DataQueryResponse,\n  DataTopic,\n  type Field,\n  FieldType,\n  findCommonLabels,\n  getDisplayProcessor,\n  getFieldDisplayName,\n  type Labels,\n  sortDataFrame,\n  TIME_SERIES_TIME_FIELD_NAME,\n  TIME_SERIES_VALUE_FIELD_NAME,\n} from '@grafana/data';\nimport { getDataSourceSrv } from '@grafana/runtime';\n\nimport { type ExemplarTraceIdDestination, type PromMetric, type PromQuery, type PromValue } from './types';\n\n// handles case-insensitive Inf, +Inf, -Inf (with optional \"inity\" suffix)\nconst INFINITY_SAMPLE_REGEX = /^[+-]?inf(?:inity)?$/i;\n\nconst isTableResult = (dataFrame: DataFrame, options: DataQueryRequest<PromQuery>): boolean => {\n  // We want to process vector and scalar results in Explore as table\n  if (\n    options.app === CoreApp.Explore &&\n    (dataFrame.meta?.custom?.resultType === 'vector' || dataFrame.meta?.custom?.resultType === 'scalar')\n  ) {\n    return true;\n  }\n\n  // We want to process all dataFrames with target.format === 'table' as table\n  const target = options.targets.find((target) => target.refId === dataFrame.refId);\n  return target?.format === 'table';\n};\n\nconst isCumulativeHeatmapResult = (dataFrame: DataFrame, options: DataQueryRequest<PromQuery>): boolean => {\n  if (dataFrame.meta?.type === DataFrameType.HeatmapCells) {\n    return false;\n  }\n\n  const target = options.targets.find((target) => target.refId === dataFrame.refId);\n  return target?.format === 'heatmap';\n};\n\n// get each frame's (named) field's labels\nfunction getAllLabels(frames: DataFrame[]): Labels[] {\n  // for each frame, take all fields with matching __name__ label in a flat list of labels (instead of Labels[][])\n  return frames\n    .map((frame: DataFrame) =>\n      frame.fields\n        .filter((field: Field) => field.labels?.__name__ && field.labels?.__name__ === field.name)\n        .map((field: Field) => field.labels)\n    )\n    .flat()\n    .filter((labels?: Labels) => labels !== undefined);\n}\n\n// V2 result transformer used to transform query results from queries that were run through prometheus backend\nexport function transformV2(\n  response: DataQueryResponse,\n  request: DataQueryRequest<PromQuery>,\n  options: { exemplarTraceIdDestinations?: ExemplarTraceIdDestination[] }\n) {\n  // migration for dataplane field name issue\n  // update displayNameFromDS in the field config\n  response.data.forEach((f: DataFrame) => {\n    const target = request.targets.find((t) => t.refId === f.refId);\n    // check that the legend is selected as auto\n    if (target && target.legendFormat === '__auto') {\n      f.fields.forEach((field) => {\n        if (field.labels?.__name__ && field.labels?.__name__ === field.name) {\n          const framesWithSameRefId = response.data.filter((frame: DataFrame) => frame.refId === target.refId);\n          // don't ignore all labels when we have only one frame -> we don't know which are static\n          const commonLabels =\n            framesWithSameRefId.length === 1 ? {} : findCommonLabels(getAllLabels(framesWithSameRefId));\n          const fieldCopy = { ...field, name: TIME_SERIES_VALUE_FIELD_NAME };\n          field.config.displayNameFromDS = getFieldDisplayName(fieldCopy, f, response.data, commonLabels);\n        }\n      });\n    }\n  });\n\n  const [tableFrames, framesWithoutTable] = partition<DataFrame>(response.data, (df) => isTableResult(df, request));\n  const processedTableFrames = transformDFToTable(tableFrames);\n\n  const [exemplarFrames, framesWithoutTableAndExemplars] = partition<DataFrame>(\n    framesWithoutTable,\n    (df) => df.meta?.custom?.resultType === 'exemplar'\n  );\n\n  // EXEMPLAR FRAMES: We enrich exemplar frames with data links and add dataTopic meta info\n  const { exemplarTraceIdDestinations: destinations } = options;\n  const processedExemplarFrames = exemplarFrames.map((dataFrame) => {\n    if (destinations?.length) {\n      for (const exemplarTraceIdDestination of destinations) {\n        const traceIDField = dataFrame.fields.find((field) => field.name === exemplarTraceIdDestination.name);\n        if (traceIDField) {\n          const links = getDataLinks(exemplarTraceIdDestination);\n          traceIDField.config.links = traceIDField.config.links?.length\n            ? [...traceIDField.config.links, ...links]\n            : links;\n        }\n      }\n    }\n\n    return { ...dataFrame, meta: { ...dataFrame.meta, dataTopic: DataTopic.Annotations } };\n  });\n\n  const [heatmapResults, framesWithoutTableHeatmapsAndExemplars] = partition<DataFrame>(\n    framesWithoutTableAndExemplars,\n    (df) => isCumulativeHeatmapResult(df, request)\n  );\n\n  // this works around the fact that we only get back frame.name with le buckets when legendFormat == {{le}}...which is not the default\n  heatmapResults.forEach((df) => {\n    if (df.name == null) {\n      let f = df.fields.find((f) => f.type === FieldType.number);\n\n      if (f) {\n        let le = f.labels?.le;\n\n        if (le) {\n          // this is used for sorting the frames by numeric ascending le labels for de-accum\n          df.name = le;\n          // this is used for renaming the Value fields to le label\n          f.config.displayNameFromDS = le;\n        }\n      }\n    }\n  });\n\n  // Group heatmaps by query\n  const heatmapResultsGroupedByQuery = groupBy<DataFrame>(heatmapResults, (h) => h.refId);\n\n  // Initialize empty array to push grouped histogram frames to\n  let processedHeatmapResultsGroupedByQuery: DataFrame[][] = [];\n\n  // Iterate through every query in this heatmap\n  for (const query in heatmapResultsGroupedByQuery) {\n    // Get reference to dataFrames for heatmap\n    const heatmapResultsGroup = heatmapResultsGroupedByQuery[query];\n\n    // Create a new grouping by iterating through the data frames...\n    const heatmapResultsGroupedByValues = groupBy<DataFrame>(heatmapResultsGroup, (dataFrame) => {\n      // Each data frame has `Time` and `Value` properties, we want to get the values\n      const values = dataFrame.fields.find((field) => field.type === FieldType.number);\n      // 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\n      if (values?.labels && HISTOGRAM_QUANTILE_LABEL_NAME in values.labels) {\n        const { le, ...notLE } = values?.labels;\n        return Object.values(notLE).join();\n      }\n\n      // Return a string made from the concatenation of this frame's values to represent a grouping in the query\n      return Object.values(values?.labels ?? []).join();\n    });\n\n    // Then iterate through the resultant object\n    forOwn(heatmapResultsGroupedByValues, (dataFrames, key) => {\n      // Sort frames within each grouping\n      const sortedHeatmap = dataFrames.sort(sortSeriesByLabel);\n      // And push the sorted grouping with the rest\n      processedHeatmapResultsGroupedByQuery.push(mergeHeatmapFrames(transformToHistogramOverTime(sortedHeatmap)));\n    });\n  }\n\n  // Everything else is processed as time_series result and graph preferredVisualisationType\n  const otherFrames = framesWithoutTableHeatmapsAndExemplars.map((dataFrame) => {\n    const df: DataFrame = {\n      ...dataFrame,\n      meta: {\n        ...dataFrame.meta,\n        preferredVisualisationType: 'graph',\n      },\n    };\n    return df;\n  });\n\n  const flattenedProcessedHeatmapFrames = flatten(processedHeatmapResultsGroupedByQuery);\n\n  return {\n    ...response,\n    data: [...otherFrames, ...processedTableFrames, ...flattenedProcessedHeatmapFrames, ...processedExemplarFrames],\n  };\n}\n\nconst HISTOGRAM_QUANTILE_LABEL_NAME = 'le';\n\nexport function transformDFToTable(dfs: DataFrame[]): DataFrame[] {\n  // If no dataFrames or if 1 dataFrames with no values, return original dataFrame\n  if (dfs.length === 0 || (dfs.length === 1 && dfs[0].length === 0)) {\n    return dfs;\n  }\n\n  // Group results by refId and process dataFrames with the same refId as 1 dataFrame\n  const dataFramesByRefId = groupBy(dfs, 'refId');\n  const refIds = Object.keys(dataFramesByRefId);\n\n  const frames = refIds.map((refId) => {\n    // Create timeField, valueField and labelFields\n    const valueText = getValueText(refIds.length, refId);\n    const valueField = getValueField({ data: [], valueName: valueText });\n    const timeField = getTimeField([]);\n    const labelFields: Field[] = [];\n\n    // Fill labelsFields with labels from dataFrames\n    dataFramesByRefId[refId].forEach((df) => {\n      const frameValueField = df.fields[1];\n      const promLabels = frameValueField?.labels ?? {};\n\n      Object.keys(promLabels)\n        .sort()\n        .forEach((label) => {\n          // If we don't have label in labelFields, add it\n          if (!labelFields.some((l) => l.name === label)) {\n            labelFields.push({\n              name: label,\n              config: { filterable: true },\n              type: FieldType.string,\n              values: [],\n            });\n          }\n        });\n    });\n\n    let prevTime = -Infinity;\n    let needsSort = false;\n\n    // Fill valueField, timeField and labelFields with values\n    dataFramesByRefId[refId].forEach((df) => {\n      timeField.config.interval ??= df.fields[0]?.config.interval;\n\n      const timeFields = df.fields[0]?.values ?? [];\n      const dataFields = df.fields[1]?.values ?? [];\n\n      timeFields.forEach((value) => {\n        timeField.values.push(value);\n\n        if (value < prevTime) {\n          needsSort = true;\n        }\n\n        prevTime = value;\n      });\n\n      dataFields.forEach((value) => {\n        valueField.values.push(parseSampleValue(value));\n        const labelsForField = df.fields[1].labels ?? {};\n        labelFields.forEach((field) => field.values.push(getLabelValue(labelsForField, field.name)));\n      });\n    });\n\n    const fields = [timeField, ...labelFields, valueField];\n\n    const frame: DataFrame = {\n      refId,\n      fields,\n      // Prometheus specific UI for instant queries\n      meta: {\n        ...dataFramesByRefId[refId][0].meta,\n        preferredVisualisationType: 'rawPrometheus' as const,\n      },\n      length: timeField.values.length,\n    };\n\n    return needsSort ? sortDataFrame(frame, 0) : frame;\n  });\n\n  return frames;\n}\n\nfunction getValueText(responseLength: number, refId = '') {\n  return responseLength > 1 ? `Value #${refId}` : 'Value';\n}\n\nfunction getDataLinks(options: ExemplarTraceIdDestination): DataLink[] {\n  const dataLinks: DataLink[] = [];\n\n  if (options.datasourceUid) {\n    const dataSourceSrv = getDataSourceSrv();\n    const dsSettings = dataSourceSrv.getInstanceSettings(options.datasourceUid);\n\n    // dsSettings is undefined because of the reasons below:\n    // - permissions issues (probably most likely)\n    // - deleted datasource\n    // - misconfiguration\n    if (dsSettings) {\n      dataLinks.push({\n        title: options.urlDisplayLabel || `Query with ${dsSettings?.name}`,\n        url: '',\n        internal: {\n          query: { query: '${__value.raw}', queryType: 'traceql' },\n          panelsState: {\n            trace: {\n              spanId: '${__data.fields[\"span_id\"]}',\n            },\n          },\n          datasourceUid: options.datasourceUid,\n          datasourceName: dsSettings?.name ?? 'Data source not found',\n        },\n      });\n    }\n  }\n\n  if (options.url) {\n    dataLinks.push({\n      title: options.urlDisplayLabel || `Go to ${options.url}`,\n      url: options.url,\n      targetBlank: true,\n    });\n  }\n  return dataLinks;\n}\n\nfunction getLabelValue(metric: PromMetric, label: string): string | number {\n  if (metric.hasOwnProperty(label)) {\n    return metric[label];\n  }\n  return '';\n}\n\nfunction getTimeField(data: PromValue[], isMs = false): Field<number> {\n  return {\n    name: TIME_SERIES_TIME_FIELD_NAME,\n    type: FieldType.time,\n    config: {},\n    values: data.map((val) => (isMs ? val[0] : val[0] * 1000)),\n  };\n}\n\ntype ValueFieldOptions = {\n  data: PromValue[];\n  valueName?: string;\n  parseValue?: boolean;\n  labels?: Labels;\n  displayNameFromDS?: string;\n};\n\nfunction getValueField({\n  data,\n  valueName = TIME_SERIES_VALUE_FIELD_NAME,\n  parseValue = true,\n  labels,\n  displayNameFromDS,\n}: ValueFieldOptions): Field {\n  return {\n    name: valueName,\n    type: FieldType.number,\n    display: getDisplayProcessor(),\n    config: {\n      displayNameFromDS,\n    },\n    labels,\n    values: data.map((val) => (parseValue ? parseSampleValue(val[1]) : val[1])),\n  };\n}\n\nexport function getOriginalMetricName(labelData: { [key: string]: string }) {\n  const metricName = labelData.__name__ || '';\n  delete labelData.__name__;\n  const labelPart = Object.entries(labelData)\n    .map((label) => `${label[0]}=\"${label[1]}\"`)\n    .join(',');\n  return `${metricName}{${labelPart}}`;\n}\n\nfunction mergeHeatmapFrames(frames: DataFrame[]): DataFrame[] {\n  if (frames.length === 0 || (frames.length === 1 && frames[0].length === 0)) {\n    return [];\n  }\n\n  const timeField = frames[0].fields.find((field) => field.type === FieldType.time)!;\n  const countFields = frames.map((frame) => {\n    let field = frame.fields.find((field) => field.type === FieldType.number)!;\n\n    return {\n      ...field,\n      name: field.config.displayNameFromDS!,\n    };\n  });\n\n  return [\n    {\n      ...frames[0],\n      meta: {\n        ...frames[0].meta,\n        type: DataFrameType.HeatmapRows,\n      },\n      fields: [timeField!, ...countFields],\n    },\n  ];\n}\n\n/** @internal */\nexport function transformToHistogramOverTime(seriesList: DataFrame[]): DataFrame[] {\n  /*      t1 = timestamp1, t2 = timestamp2 etc.\n            t1  t2  t3          t1  t2  t3\n    le10    10  10  0     =>    10  10  0\n    le20    20  10  30    =>    10  0   30\n    le30    30  10  35    =>    10  0   5\n    */\n\n  for (let i = seriesList.length - 1; i > 0; i--) {\n    const topSeries = seriesList[i].fields.find((s) => s.type === FieldType.number);\n    const bottomSeries = seriesList[i - 1].fields.find((s) => s.type === FieldType.number);\n    if (!topSeries || !bottomSeries) {\n      throw new Error('Prometheus heatmap transform error: data should be a time series');\n    }\n\n    for (let j = 0; j < topSeries.values.length; j++) {\n      const bottomPoint = bottomSeries.values[j] || [0];\n      topSeries.values[j] -= bottomPoint;\n\n      if (topSeries.values[j] < 1e-9) {\n        topSeries.values[j] = 0;\n      }\n    }\n  }\n\n  return seriesList;\n}\n\nexport function sortSeriesByLabel(s1: DataFrame, s2: DataFrame): number {\n  let le1, le2;\n\n  try {\n    // the state.displayName conditions are here because we also use this sorting util fn\n    // in panels where isHeatmapResult was false but we still want to sort numerically-named\n    // fields after the full unique displayName is cached in field state\n    le1 = parseSampleValue(s1.fields[1].state?.displayName ?? s1.name ?? s1.fields[1].name);\n    le2 = parseSampleValue(s2.fields[1].state?.displayName ?? s2.name ?? s2.fields[1].name);\n  } catch (err) {\n    // fail if not integer. might happen with bad queries\n    console.error(err);\n    return 0;\n  }\n\n  if (le1 > le2) {\n    return 1;\n  }\n\n  if (le1 < le2) {\n    return -1;\n  }\n\n  return 0;\n}\n\n/** @internal */\nexport function parseSampleValue(value: string): number {\n  if (INFINITY_SAMPLE_REGEX.test(value)) {\n    return value[0] === '-' ? Number.NEGATIVE_INFINITY : Number.POSITIVE_INFINITY;\n  }\n  return parseFloat(value);\n}\n"],"names":["CoreApp","target","DataFrameType","findCommonLabels","TIME_SERIES_VALUE_FIELD_NAME","getFieldDisplayName","partition","DataTopic","f","FieldType","groupBy","forOwn","flatten","_a","sortDataFrame","getDataSourceSrv","data","TIME_SERIES_TIME_FIELD_NAME","getDisplayProcessor","field"],"mappings":"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"}