{"version":3,"file":"tracking.cjs","sources":["../../src/tracking.ts"],"sourcesContent":["// Core Grafana history https://github.com/grafana/grafana/blob/v11.0.0-preview/public/app/plugins/datasource/prometheus/tracking.ts\nimport {\n  Identifier,\n  LabelName,\n  NumberDurationLiteral,\n  NumberDurationLiteralInDurationContext,\n  parser,\n  StringLiteral,\n} from '@prometheus-io/lezer-promql';\n\nimport { CoreApp, type DataQueryRequest, type DataQueryResponse } from '@grafana/data';\nimport { config, reportInteraction } from '@grafana/runtime';\n\nimport { type PromQuery } from './types';\n\nconst tagsToObscure = [\n  StringLiteral,\n  Identifier,\n  LabelName,\n  NumberDurationLiteral,\n  NumberDurationLiteralInDurationContext,\n];\nconst partsToKeep = [\n  '__name__',\n  '__interval',\n  '__interval_ms',\n  '__rate_interval',\n  '__range',\n  '__range_s',\n  '__range_ms',\n];\n\nexport function obfuscate(query: string): string {\n  const replacements: Array<{ from: number; to: number; replacement: string }> = [];\n  const tree = parser.parse(query);\n  tree.iterate({\n    enter: ({ type, from, to }): false | void => {\n      const queryPart = query.substring(from, to);\n      // Skip empty parts, parts to keep, and Grafana variable syntax\n      if (\n        queryPart.length === 0 ||\n        partsToKeep.includes(queryPart) ||\n        queryPart.startsWith('$__') ||\n        !tagsToObscure.includes(type.id)\n      ) {\n        return;\n      }\n      // Use consistent name for duration literals\n      const replacement = type.id === NumberDurationLiteralInDurationContext ? 'NumberDurationLiteral' : type.name;\n      replacements.push({ from, to, replacement });\n    },\n  });\n\n  // Apply replacements from end to start to preserve positions\n  replacements.sort((a, b) => b.from - a.from);\n  let obfuscatedQuery = query;\n  for (const { from, to, replacement } of replacements) {\n    obfuscatedQuery = obfuscatedQuery.substring(0, from) + replacement + obfuscatedQuery.substring(to);\n  }\n  return obfuscatedQuery;\n}\n\nexport function trackQuery(\n  response: DataQueryResponse,\n  request: DataQueryRequest<PromQuery> & { targets: PromQuery[] },\n  startTime: Date\n): void {\n  const { app, targets: queries } = request;\n  // We only track queries run in Explore.\n  // We do not want to track queries from the dashboard, viewing a panel,\n  // cloud-alerting, unified-alerting, scenes and unknown\n  if (app !== CoreApp.Explore) {\n    return;\n  }\n\n  for (const query of queries) {\n    reportInteraction('grafana_prometheus_query_executed', {\n      app,\n      grafana_version: config.buildInfo.version,\n      has_data: response.data.some((frame) => frame.length > 0),\n      has_error: response.error !== undefined,\n      expr: query.expr,\n      obfuscated_query: obfuscate(query.expr),\n      format: query.format,\n      instant: query.instant,\n      range: query.range,\n      exemplar: query.exemplar,\n      hinting: query.hinting,\n      interval: query.interval,\n      intervalFactor: query.intervalFactor,\n      utcOffsetSec: query.utcOffsetSec,\n      legend: query.legendFormat,\n      valueWithRefId: query.valueWithRefId,\n      requestId: request.requestId,\n      showingGraph: query.showingGraph,\n      showingTable: query.showingTable,\n      editor_mode: query.editorMode,\n      simultaneously_sent_query_count: queries.length,\n      time_range_from: request?.range?.from?.toISOString(),\n      time_range_to: request?.range?.to?.toISOString(),\n      time_taken: Date.now() - startTime.getTime(),\n    });\n  }\n}\n"],"names":["StringLiteral","Identifier","LabelName","NumberDurationLiteral","NumberDurationLiteralInDurationContext","parser","CoreApp","reportInteraction","config"],"mappings":"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"}