{"version":3,"file":"DataSourceWithBackend.cjs","sources":["../../../src/utils/DataSourceWithBackend.ts"],"sourcesContent":["import { defer, lastValueFrom, merge, type Observable, of } from 'rxjs';\nimport { catchError, switchMap } from 'rxjs/operators';\n\nimport {\n  type DataFrame,\n  dataFrameToJSON,\n  type DataQuery,\n  type DataQueryRequest,\n  type DataQueryResponse,\n  type TestDataSourceResponse,\n  DataSourceApi,\n  type DataSourceInstanceSettings,\n  type DataSourceJsonData,\n  type DataSourceRef,\n  getDataSourceRef,\n  makeClassES5Compatible,\n  parseLiveChannelAddress,\n  type ScopedVars,\n  type AdHocVariableFilter,\n} from '@grafana/data';\n\nimport { reportInteraction } from '../analytics/utils';\nimport { config } from '../config';\nimport { getFeatureFlagClient } from '../internal/openFeature';\nimport { FlagKeys } from '../internal/openFeature/openfeature.gen';\nimport {\n  type BackendSrvRequest,\n  type FetchResponse,\n  getBackendSrv,\n  getGrafanaLiveSrv,\n  StreamingFrameAction,\n  type StreamingFrameOptions,\n} from '../services';\nimport { getDataSourceInstanceSettings } from '../services/dataSource/settings';\n\nimport { ExpressionDatasourceRef, isExpressionReference } from './expressionRef';\nimport { publicDashboardQueryHandler } from './publicDashboardQueryHandler';\nimport { isQueryServiceCompatible } from './qscheck';\nimport { type BackendDataSourceResponse, toDataQueryResponse } from './queryResponse';\nimport { UserStorage } from './userStorage';\n\nexport class HealthCheckError extends Error {\n  details: HealthCheckResultDetails;\n\n  constructor(message: string, details: HealthCheckResultDetails) {\n    super(message);\n    this.details = details;\n    this.name = 'HealthCheckError';\n  }\n}\n\n/**\n * Describes the current health status of a data source plugin.\n *\n * @public\n */\nexport enum HealthStatus {\n  Unknown = 'UNKNOWN',\n  OK = 'OK',\n  Error = 'ERROR',\n}\n\n// Internal for now\nenum PluginRequestHeaders {\n  PluginID = 'X-Plugin-Id', // can be used for routing\n  DatasourceUID = 'X-Datasource-Uid', // can be used for routing/ load balancing\n  DashboardUID = 'X-Dashboard-Uid', // mainly useful for debugging slow queries\n  PanelID = 'X-Panel-Id', // mainly useful for debugging slow queries\n  PanelPluginId = 'X-Panel-Plugin-Id',\n  QueryGroupID = 'X-Query-Group-Id', // mainly useful to find related queries with query splitting\n  FromExpression = 'X-Grafana-From-Expr', // used by datasources to identify expression queries\n  SkipQueryCache = 'X-Cache-Skip', // used by datasources to skip the query cache\n  DashboardTitle = 'X-Dashboard-Title', // used by datasources to identify the dashboard title\n  PanelTitle = 'X-Panel-Title', // used by datasources to identify the panel title\n}\n\n/**\n * Describes the details in the payload returned when checking the health of a data source\n * plugin.\n *\n * If the 'message' key exists, this will be displayed in the error message in DataSourceSettingsPage\n * If the 'verboseMessage' key exists, this will be displayed in the expandable details in the error message in DataSourceSettingsPage\n *\n * @public\n */\nexport type HealthCheckResultDetails = Record<string, unknown> | undefined;\n\n/**\n * Describes the payload returned when checking the health of a data source\n * plugin.\n *\n * @public\n */\nexport interface HealthCheckResult {\n  status: HealthStatus;\n  message: string;\n  details: HealthCheckResultDetails;\n}\n\n/**\n * Response shape from the /apis/{group}/v0alpha1/.../datasources/{uid}/health endpoint.\n * Used when datasourcesApiServerEnableHealthEndpointFrontend is enabled.\n *\n * @internal\n */\ninterface DatasourcesV0HealthCheckResult {\n  kind?: string;\n  apiVersion?: string;\n  status: string;\n  code?: number;\n  message: string;\n  details?: HealthCheckResultDetails;\n}\n\nfunction toHealthCheckResult(v: DatasourcesV0HealthCheckResult): HealthCheckResult {\n  const status: HealthStatus =\n    v.status === HealthStatus.OK || v.status === HealthStatus.Error || v.status === HealthStatus.Unknown\n      ? v.status\n      : HealthStatus.Unknown;\n  return {\n    status,\n    message: v.message,\n    details: v.details,\n  };\n}\n\ninterface PreparedQuery {\n  query: DataQuery;\n  /** Absent for expression queries, which are not backed by a data source instance. */\n  resolved?: {\n    settings: DataSourceInstanceSettings;\n    ref: DataSourceRef;\n  };\n}\n\n/**\n * Extend this class to implement a data source plugin that is depending on the Grafana\n * backend API.\n *\n * @public\n */\nclass DataSourceWithBackend<\n  TQuery extends DataQuery = DataQuery,\n  TOptions extends DataSourceJsonData = DataSourceJsonData,\n> extends DataSourceApi<TQuery, TOptions> {\n  userStorage: UserStorage;\n  datasourceInstanceSettings: DataSourceInstanceSettings<TOptions>;\n\n  constructor(instanceSettings: DataSourceInstanceSettings<TOptions>) {\n    super(instanceSettings);\n    this.userStorage = new UserStorage(instanceSettings.type);\n    this.datasourceInstanceSettings = instanceSettings;\n  }\n\n  private async createBackendRequest(request: DataQueryRequest<TQuery>): Promise<[BackendSrvRequest, DataQuery[]]> {\n    const { intervalMs, maxDataPoints, queryCachingTTL, range, requestId, hideFromInspector = false } = request;\n    let targets = request.targets;\n\n    let hasExpr = false;\n    const prepared: PreparedQuery[] = await Promise.all(\n      targets.map(async (q) => {\n        let datasource = this.getRef();\n        let datasourceId = this.id;\n        let shouldApplyTemplateVariables = true;\n\n        if (isExpressionReference(q.datasource)) {\n          hasExpr = true;\n          return {\n            query: {\n              ...q,\n              datasource: ExpressionDatasourceRef,\n            },\n          };\n        }\n\n        // if there is no per-query datasource, we use the implicit datasource\n        let settings: DataSourceInstanceSettings = this.datasourceInstanceSettings;\n\n        if (q.datasource) {\n          const ds = await getDataSourceInstanceSettings(q.datasource, request.scopedVars);\n\n          if (!ds) {\n            throw new Error(`Unknown Datasource: ${JSON.stringify(q.datasource)}`);\n          }\n\n          settings = ds;\n\n          const dsRef = ds.rawRef ?? getDataSourceRef(ds);\n          const dsId = ds.id;\n          if (dsRef.uid !== datasource.uid || datasourceId !== dsId) {\n            datasource = dsRef;\n            datasourceId = dsId;\n            // If the query is using a different datasource, we would need to retrieve the datasource\n            // instance (async) and apply the template variables but it seems it's not necessary for now.\n            shouldApplyTemplateVariables = false;\n          }\n        }\n\n        return {\n          query: {\n            ...(shouldApplyTemplateVariables ? this.applyTemplateVariables(q, request.scopedVars, request.filters) : q),\n            datasource,\n            datasourceId, // deprecated!\n            intervalMs,\n            maxDataPoints,\n            queryCachingTTL,\n          },\n          resolved: { settings, ref: datasource },\n        };\n      })\n    );\n\n    // Collected after the fan-out rather than inside it: the settings lookups resolve in an\n    // arbitrary order, so accumulating from within the callbacks would make the routing header\n    // values and the query-service decision depend on resolution order instead of query order.\n    const pluginIDs = new Set<string>();\n    const dsUIDs = new Set<string>();\n    const datasources: DataSourceInstanceSettings[] = [];\n    const queries: DataQuery[] = [];\n\n    for (const { query, resolved } of prepared) {\n      queries.push(query);\n      if (!resolved) {\n        // an expression query is not backed by a datasource instance\n        continue;\n      }\n      datasources.push(resolved.settings);\n      if (resolved.ref.type?.length) {\n        pluginIDs.add(resolved.ref.type);\n      }\n      if (resolved.ref.uid?.length) {\n        dsUIDs.add(resolved.ref.uid);\n      }\n    }\n\n    const body = {\n      queries,\n      from: range?.from.valueOf().toString(),\n      to: range?.to.valueOf().toString(),\n    };\n\n    const headers: Record<string, string> = request.headers ?? {};\n    headers[PluginRequestHeaders.PluginID] = Array.from(pluginIDs).join(', ');\n    headers[PluginRequestHeaders.DatasourceUID] = Array.from(dsUIDs).join(', ');\n\n    let url = '/api/ds/query?ds_type=' + this.type;\n\n    // Use the new query service\n    if (config.featureToggles.queryServiceFromUI) {\n      // @ts-expect-error featuremgmt/registry.go does not support object feature flags yet\n      const allowedTypes = getFeatureFlagClient().getObjectValue('datasources.querier.fe-allowed-types', {\n        types: [],\n      });\n      if (isQueryServiceCompatible(datasources, allowedTypes)) {\n        url = `/apis/query.grafana.app/v0alpha1/namespaces/${config.namespace}/query?ds_type=${this.type}`;\n      }\n    }\n\n    if (hasExpr) {\n      headers[PluginRequestHeaders.FromExpression] = 'true';\n      url += '&expression=true';\n    }\n\n    // Appending request ID to url to facilitate client-side performance metrics. See #65244 for more context.\n    if (requestId) {\n      url += `&requestId=${requestId}`;\n    }\n\n    if (request.dashboardUID) {\n      headers[PluginRequestHeaders.DashboardUID] = request.dashboardUID;\n      if (request.dashboardTitle) {\n        headers[PluginRequestHeaders.DashboardTitle] = request.dashboardTitle;\n      }\n      if (request.panelId) {\n        headers[PluginRequestHeaders.PanelID] = `${request.panelId}`;\n      }\n      if (request.panelName) {\n        headers[PluginRequestHeaders.PanelTitle] = request.panelName;\n      }\n    }\n    if (request.panelPluginId) {\n      headers[PluginRequestHeaders.PanelPluginId] = `${request.panelPluginId}`;\n    }\n    if (request.queryGroupId) {\n      headers[PluginRequestHeaders.QueryGroupID] = `${request.queryGroupId}`;\n    }\n    if (request.skipQueryCache) {\n      headers[PluginRequestHeaders.SkipQueryCache] = 'true';\n    }\n\n    return [\n      {\n        url,\n        method: 'POST',\n        data: body,\n        requestId,\n        hideFromInspector,\n        headers,\n      },\n      queries,\n    ];\n  }\n\n  /**\n   * Ideally final -- any other implementation may not work as expected\n   */\n  query(request: DataQueryRequest<TQuery>): Observable<DataQueryResponse> {\n    if (config.publicDashboardAccessToken) {\n      return publicDashboardQueryHandler(request);\n    }\n\n    if (request.targets.length === 0) {\n      return of({ data: [] });\n    }\n\n    // defer keeps the observable cold: without it the request preparation would start when\n    // query() is called rather than when it is subscribed to, and a rejection (e.g. an unknown\n    // datasource) on a never-subscribed observable would surface as an unhandled rejection.\n    return defer(() => this.createBackendRequest(request)).pipe(\n      switchMap(([req, queries]) =>\n        getBackendSrv()\n          .fetch<BackendDataSourceResponse>(req)\n          .pipe(\n            switchMap((raw) => {\n              const rsp = toDataQueryResponse(raw, queries);\n              // Check if any response should subscribe to a live stream\n              if (rsp.data?.length && rsp.data.find((f: DataFrame) => f.meta?.channel)) {\n                return toStreamingDataResponse(rsp, request, this.streamOptionsProvider);\n              }\n              return of(rsp);\n            }),\n            // Scoped to the fetch chain on purpose: toDataQueryResponse can only map fetch-shaped\n            // errors, and would turn a plain thrown Error (e.g. the unknown-datasource throw in\n            // createBackendRequest) into a silent empty success. Those errors are left to reach the\n            // subscriber, where runRequest turns them into a query error.\n            catchError((err) => {\n              return of(toDataQueryResponse(err));\n            })\n          )\n      )\n    );\n  }\n\n  /** Get request headers with plugin ID+UID set */\n  protected getRequestHeaders(): Record<string, string> {\n    const headers: Record<string, string> = {};\n    headers[PluginRequestHeaders.PluginID] = this.type;\n    headers[PluginRequestHeaders.DatasourceUID] = this.uid;\n    return headers;\n  }\n\n  /**\n   * Apply template variables for explore\n   */\n  interpolateVariablesInQueries(queries: TQuery[], scopedVars: ScopedVars, filters?: AdHocVariableFilter[]): TQuery[] {\n    return queries.map((q) => this.applyTemplateVariables(q, scopedVars, filters));\n  }\n\n  /**\n   * Override to apply template variables and adhoc filters.  The result is usually also `TQuery`, but sometimes this can\n   * be used to modify the query structure before sending to the backend.\n   *\n   * NOTE: if you do modify the structure or use template variables, alerting queries may not work\n   * as expected\n   *\n   * @virtual\n   */\n  applyTemplateVariables(query: TQuery, scopedVars: ScopedVars, filters?: AdHocVariableFilter[]) {\n    return query;\n  }\n\n  /**\n   * Optionally override the streaming behavior\n   */\n  streamOptionsProvider: StreamOptionsProvider<TQuery> = standardStreamOptionsProvider;\n\n  /**\n   * Make a GET request to the datasource resource path\n   */\n  async getResource<T = any>(\n    path: string,\n    params?: BackendSrvRequest['params'],\n    options?: Partial<BackendSrvRequest>\n  ): Promise<T> {\n    const headers = this.getRequestHeaders();\n    const result = await lastValueFrom(\n      getBackendSrv().fetch<T>({\n        ...options,\n        method: 'GET',\n        headers: options?.headers ? { ...options.headers, ...headers } : headers,\n        params: params ?? options?.params,\n        url: this.buildResourcesDatasourceUrl(path),\n      })\n    );\n    return result.data;\n  }\n\n  /**\n   * Send a POST request to the datasource resource path\n   */\n  async postResource<T = unknown>(\n    path: string,\n    data?: BackendSrvRequest['data'],\n    options?: Partial<BackendSrvRequest>\n  ): Promise<T> {\n    const headers = this.getRequestHeaders();\n    const result = await lastValueFrom(\n      getBackendSrv().fetch<T>({\n        ...options,\n        method: 'POST',\n        headers: options?.headers ? { ...options.headers, ...headers } : headers,\n        data: data ?? { ...data },\n        url: this.buildResourcesDatasourceUrl(path),\n      })\n    );\n    return result.data;\n  }\n\n  /**\n   * Internal function to build the datasource URL based on the feature toggle\n   */\n  buildResourcesDatasourceUrl(path: string): string {\n    const enabledRedirect = getFeatureFlagClient().getBooleanValue(\n      'datasources.apiserver.useNewAPIsForDatasourceResources',\n      false\n    );\n    if (enabledRedirect) {\n      // example:\n      // /apis/prometheus.datasource.grafana.app/v0alpha1/namespaces/stacks-1/datasources/local-prometheus/resources/api/v1/labels\n      const apiVersion = 'v0alpha1';\n      return `/apis/${this.meta?.id ?? this.type}.datasource.grafana.app/${apiVersion}/namespaces/${config.namespace}/datasources/${this.uid}/resources/${path}`;\n    }\n    return `/api/datasources/uid/${this.uid}/resources/${path}`;\n  }\n\n  /**\n   * Run the datasource healthcheck\n   */\n  async callHealthCheck(): Promise<HealthCheckResult> {\n    const useNewApi = getFeatureFlagClient().getBooleanValue(\n      FlagKeys.DatasourcesApiServerEnableHealthEndpointFrontend,\n      false\n    );\n    const healthCheckURL = useNewApi\n      ? `/apis/${this.meta?.id ?? this.type}.datasource.grafana.app/v0alpha1/namespaces/${config.namespace}/datasources/${this.uid}/health`\n      : `/api/datasources/uid/${this.uid}/health`;\n\n    if (useNewApi) {\n      return lastValueFrom(\n        getBackendSrv().fetch<DatasourcesV0HealthCheckResult>({\n          method: 'GET',\n          url: healthCheckURL,\n          showErrorAlert: false,\n          headers: this.getRequestHeaders(),\n        })\n      )\n        .then((v: FetchResponse<DatasourcesV0HealthCheckResult>) => toHealthCheckResult(v.data))\n        .catch((err) => {\n          const properties: Record<string, string> = {\n            plugin_id: this.meta?.id || '',\n            plugin_version: this.meta?.info?.version || '',\n            datasource_healthcheck_status: err?.data?.status || 'error',\n            datasource_healthcheck_message: err?.data?.message || '',\n          };\n          reportInteraction('datasource_health_check_completed', properties);\n          return err?.data;\n        });\n    }\n\n    return lastValueFrom(\n      getBackendSrv().fetch<HealthCheckResult>({\n        method: 'GET',\n        url: healthCheckURL,\n        showErrorAlert: false,\n        headers: this.getRequestHeaders(),\n      })\n    )\n      .then((v: FetchResponse<HealthCheckResult>) => v.data)\n      .catch((err) => {\n        const properties: Record<string, string> = {\n          plugin_id: this.meta?.id || '',\n          plugin_version: this.meta?.info?.version || '',\n          datasource_healthcheck_status: err?.data?.status || 'error',\n          datasource_healthcheck_message: err?.data?.message || '',\n        };\n        reportInteraction('datasource_health_check_completed', properties);\n        return err?.data;\n      });\n  }\n\n  /**\n   * Checks the plugin health\n   * see public/app/features/datasources/state/actions.ts for what needs to be returned here\n   */\n  async testDatasource(): Promise<TestDataSourceResponse> {\n    return this.callHealthCheck().then((res) => {\n      if (res.status === HealthStatus.OK) {\n        return {\n          status: 'success',\n          message: res.message,\n        };\n      }\n\n      return Promise.reject({\n        status: 'error',\n        message: res.message,\n        error: new HealthCheckError(res.message, res.details),\n      });\n    });\n  }\n}\n\n/**\n * @internal exported for tests\n */\nexport function toStreamingDataResponse<TQuery extends DataQuery = DataQuery>(\n  rsp: DataQueryResponse,\n  req: DataQueryRequest<TQuery>,\n  getter: (req: DataQueryRequest<TQuery>, frame: DataFrame) => Partial<StreamingFrameOptions>\n): Observable<DataQueryResponse> {\n  const live = getGrafanaLiveSrv();\n  if (!live) {\n    return of(rsp); // add warning?\n  }\n\n  const staticdata: DataFrame[] = [];\n  const streams: Array<Observable<DataQueryResponse>> = [];\n  for (const f of rsp.data) {\n    const addr = parseLiveChannelAddress(f.meta?.channel);\n    if (addr) {\n      const frame: DataFrame = f;\n      streams.push(\n        live.getDataStream({\n          addr,\n          buffer: getter(req, frame),\n          frame: dataFrameToJSON(f),\n        })\n      );\n    } else {\n      staticdata.push(f);\n    }\n  }\n  if (staticdata.length) {\n    streams.push(of({ ...rsp, data: staticdata }));\n  }\n  if (streams.length === 1) {\n    return streams[0]; // avoid merge wrapper\n  }\n  return merge(...streams);\n}\n\n/**\n * This allows data sources to customize the streaming connection query\n *\n * @public\n */\nexport type StreamOptionsProvider<TQuery extends DataQuery = DataQuery> = (\n  request: DataQueryRequest<TQuery>,\n  frame: DataFrame\n) => Partial<StreamingFrameOptions>;\n\n/**\n * @public\n */\nexport const standardStreamOptionsProvider: StreamOptionsProvider = (request: DataQueryRequest, frame: DataFrame) => {\n  const opts: Partial<StreamingFrameOptions> = {\n    maxLength: request.maxDataPoints ?? 500,\n    action: StreamingFrameAction.Append,\n  };\n\n  // For recent queries, clamp to the current time range\n  if (request.rangeRaw?.to === 'now') {\n    opts.maxDelta = request.range.to.valueOf() - request.range.from.valueOf();\n  }\n  return opts;\n};\n\n//@ts-ignore\nDataSourceWithBackend = makeClassES5Compatible(DataSourceWithBackend);\n\nexport { DataSourceWithBackend };\n"],"names":["HealthStatus","PluginRequestHeaders","DataSourceApi","UserStorage","_a","isExpressionReference","ExpressionDatasourceRef","settings","getDataSourceInstanceSettings","getDataSourceRef","config","getFeatureFlagClient","isQueryServiceCompatible","publicDashboardQueryHandler","of","defer","switchMap","getBackendSrv","toDataQueryResponse","catchError","lastValueFrom","FlagKeys","_b","reportInteraction","live","getGrafanaLiveSrv","parseLiveChannelAddress","dataFrameToJSON","merge","StreamingFrameAction","makeClassES5Compatible"],"mappings":"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"}