grafana/pkg/registry/apis/query
Charandas f50c8566df
K8s: handle queries being an empty slice (#89928)
* K8s: handle queries being an empty slice

* remove unnecessary comment

* remove redundant break
2024-07-02 19:44:29 +00:00
..
client Chore: Remove legacydata package (#88790) 2024-06-05 22:31:06 +02:00
queryschema QueryTypes: Add feature toggle to show query types in datasource apiservers (#88213) 2024-05-23 18:46:28 +02:00
testdata QueryService: Return application/json and better errors (#84234) 2024-03-19 15:52:15 +02:00
client.go QueryService: Use types from sdk (#84029) 2024-03-08 18:12:59 +02:00
errors_test.go Chore: Move identity and errutil to apimachinery module (#89116) 2024-06-13 07:11:35 +03:00
errors.go Chore: Move identity and errutil to apimachinery module (#89116) 2024-06-13 07:11:35 +03:00
metrics.go Init dualwriter metrics (#89003) 2024-06-14 11:01:49 +02:00
parser_test.go QueryService: Return application/json and better errors (#84234) 2024-03-19 15:52:15 +02:00
parser.go QueryTypes: Add feature toggle to show query types in datasource apiservers (#88213) 2024-05-23 18:46:28 +02:00
plugins.go QueryService: Add feature toggles to better support testing (#86493) 2024-04-19 12:26:21 +03:00
query.go K8s: handle queries being an empty slice (#89928) 2024-07-02 19:44:29 +00:00
README.md QueryService: Add feature toggles to better support testing (#86493) 2024-04-19 12:26:21 +03:00
register.go Chore: Fix apiserver circular dependencies (#89918) 2024-07-01 11:42:34 -04:00

Query service

This query service aims to replace the existing /api/ds/query.

The key differences are:

  1. This service has a stronger type system (not simplejson)
  2. Same workflow regardless if expressions exist
  3. Datasource settings+access is managed in each datasource, not at the beginning

Current /api/ds/query workflow

sequenceDiagram
    autonumber
    actor User as User or Process
    participant api as /api/ds/query
    participant db as Storage<br/>(SQL)
    participant ds as Datasource<br/>Plugin
    participant expr as Expression<br/>Engine

    User->>api: POST Query
    loop Each query
        api->>api: Parse query
        api->>db: Get ds config<br>and secrets
        db->>api: 
    end
    alt No expressions
      alt Single datasource
          api->>ds: QueryData
      else Multiple datasources
        loop Each datasource (concurrently)
          api->>ds: QueryData
        end
        api->>api: Wait for results
      end
    else Expressions exist
        api->>expr: Calculate expressions graph
        loop Each node (eg, refID)
          alt Is query
              expr->>ds: QueryData
          else Is expression
            expr->>expr: Process
          end
        end
    end
    api->>User: return results

/apis/query.grafana.app (in single tenant grafana)

sequenceDiagram
    autonumber
    actor User as User or Process
    participant api as /apis/query.grafana.app
    participant ds as Datasource<br/>Handler/Plugin
    participant db as Storage<br/>(SQL)
    participant expr as Expression<br/>Engine

    User->>api: POST Query
    api->>api: Parse queries
    api->>api: Calculate dependencies
    loop Each datasource (concurrently)
        api->>ds: QueryData
        ds->>ds: Verify user access
        ds->>db: Get settings <br> and secrets
    end
    loop Each expression
        api->>expr: Execute
    end
    api->>api: Verify ResultExpectations
    api->>User: return results