mirror of
https://github.com/grafana/grafana.git
synced 2025-02-25 18:55:37 -06:00
Expressions: Create json schema for query types (#84032)
This commit is contained in:
parent
2e06677240
commit
4cda34ff7d
@ -1,143 +0,0 @@
|
|||||||
// Code generated - EDITING IS FUTILE. DO NOT EDIT.
|
|
||||||
//
|
|
||||||
// Generated by:
|
|
||||||
// public/app/plugins/gen.go
|
|
||||||
// Using jennies:
|
|
||||||
// TSTypesJenny
|
|
||||||
// PluginTsTypesJenny
|
|
||||||
//
|
|
||||||
// Run 'make gen-cue' from repository root to regenerate.
|
|
||||||
|
|
||||||
import * as common from '@grafana/schema';
|
|
||||||
|
|
||||||
export const pluginVersion = "%VERSION%";
|
|
||||||
|
|
||||||
export enum TestDataQueryType {
|
|
||||||
Annotations = 'annotations',
|
|
||||||
Arrow = 'arrow',
|
|
||||||
CSVContent = 'csv_content',
|
|
||||||
CSVFile = 'csv_file',
|
|
||||||
CSVMetricValues = 'csv_metric_values',
|
|
||||||
DataPointsOutsideRange = 'datapoints_outside_range',
|
|
||||||
ExponentialHeatmapBucketData = 'exponential_heatmap_bucket_data',
|
|
||||||
FlameGraph = 'flame_graph',
|
|
||||||
GrafanaAPI = 'grafana_api',
|
|
||||||
LinearHeatmapBucketData = 'linear_heatmap_bucket_data',
|
|
||||||
Live = 'live',
|
|
||||||
Logs = 'logs',
|
|
||||||
ManualEntry = 'manual_entry',
|
|
||||||
NoDataPoints = 'no_data_points',
|
|
||||||
NodeGraph = 'node_graph',
|
|
||||||
PredictableCSVWave = 'predictable_csv_wave',
|
|
||||||
PredictablePulse = 'predictable_pulse',
|
|
||||||
RandomWalk = 'random_walk',
|
|
||||||
RandomWalkTable = 'random_walk_table',
|
|
||||||
RandomWalkWithError = 'random_walk_with_error',
|
|
||||||
RawFrame = 'raw_frame',
|
|
||||||
ServerError500 = 'server_error_500',
|
|
||||||
Simulation = 'simulation',
|
|
||||||
SlowQuery = 'slow_query',
|
|
||||||
StreamingClient = 'streaming_client',
|
|
||||||
TableStatic = 'table_static',
|
|
||||||
Trace = 'trace',
|
|
||||||
USA = 'usa',
|
|
||||||
VariablesQuery = 'variables-query',
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface StreamingQuery {
|
|
||||||
bands?: number;
|
|
||||||
noise: number;
|
|
||||||
speed: number;
|
|
||||||
spread: number;
|
|
||||||
type: ('signal' | 'logs' | 'fetch' | 'traces');
|
|
||||||
url?: string;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface PulseWaveQuery {
|
|
||||||
offCount?: number;
|
|
||||||
offValue?: number;
|
|
||||||
onCount?: number;
|
|
||||||
onValue?: number;
|
|
||||||
timeStep?: number;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface SimulationQuery {
|
|
||||||
config?: Record<string, unknown>;
|
|
||||||
key: {
|
|
||||||
type: string;
|
|
||||||
tick: number;
|
|
||||||
uid?: string;
|
|
||||||
};
|
|
||||||
last?: boolean;
|
|
||||||
stream?: boolean;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface NodesQuery {
|
|
||||||
count?: number;
|
|
||||||
seed?: number;
|
|
||||||
type?: ('random' | 'response_small' | 'response_medium' | 'random edges' | 'feature_showcase');
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface USAQuery {
|
|
||||||
fields?: Array<string>;
|
|
||||||
mode?: string;
|
|
||||||
period?: string;
|
|
||||||
states?: Array<string>;
|
|
||||||
}
|
|
||||||
|
|
||||||
export const defaultUSAQuery: Partial<USAQuery> = {
|
|
||||||
fields: [],
|
|
||||||
states: [],
|
|
||||||
};
|
|
||||||
|
|
||||||
export interface CSVWave {
|
|
||||||
labels?: string;
|
|
||||||
name?: string;
|
|
||||||
timeStep?: number;
|
|
||||||
valuesCSV?: string;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* TODO: Should this live here given it's not used in the dataquery?
|
|
||||||
*/
|
|
||||||
export interface Scenario {
|
|
||||||
description?: string;
|
|
||||||
hideAliasField?: boolean;
|
|
||||||
id: string;
|
|
||||||
name: string;
|
|
||||||
stringInput: string;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface TestDataDataQuery extends common.DataQuery {
|
|
||||||
alias?: string;
|
|
||||||
channel?: string;
|
|
||||||
csvContent?: string;
|
|
||||||
csvFileName?: string;
|
|
||||||
csvWave?: Array<CSVWave>; // TODO can we prevent partial from being generated
|
|
||||||
/**
|
|
||||||
* Drop percentage (the chance we will lose a point 0-100)
|
|
||||||
*/
|
|
||||||
dropPercent?: number;
|
|
||||||
errorType?: ('server_panic' | 'frontend_exception' | 'frontend_observable');
|
|
||||||
flamegraphDiff?: boolean;
|
|
||||||
labels?: string;
|
|
||||||
levelColumn?: boolean;
|
|
||||||
lines?: number;
|
|
||||||
nodes?: NodesQuery;
|
|
||||||
points?: Array<Array<(string | number)>>;
|
|
||||||
pulseWave?: PulseWaveQuery;
|
|
||||||
rawFrameContent?: string;
|
|
||||||
scenarioId?: TestDataQueryType;
|
|
||||||
seriesCount?: number;
|
|
||||||
sim?: SimulationQuery;
|
|
||||||
spanCount?: number;
|
|
||||||
stream?: StreamingQuery;
|
|
||||||
stringInput?: string;
|
|
||||||
usa?: USAQuery;
|
|
||||||
}
|
|
||||||
|
|
||||||
export const defaultTestDataDataQuery: Partial<TestDataDataQuery> = {
|
|
||||||
csvWave: [],
|
|
||||||
points: [],
|
|
||||||
scenarioId: TestDataQueryType.RandomWalk,
|
|
||||||
};
|
|
162
pkg/expr/query.panel.example.json
Normal file
162
pkg/expr/query.panel.example.json
Normal file
@ -0,0 +1,162 @@
|
|||||||
|
{
|
||||||
|
"type": "table",
|
||||||
|
"targets": [
|
||||||
|
{
|
||||||
|
"refId": "A",
|
||||||
|
"datasource": {
|
||||||
|
"type": "__expr__",
|
||||||
|
"uid": "TheUID"
|
||||||
|
},
|
||||||
|
"expression": "$A + 10",
|
||||||
|
"type": "math"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"refId": "B",
|
||||||
|
"datasource": {
|
||||||
|
"type": "__expr__",
|
||||||
|
"uid": "TheUID"
|
||||||
|
},
|
||||||
|
"type": "math",
|
||||||
|
"expression": "$A - $B"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"refId": "C",
|
||||||
|
"datasource": {
|
||||||
|
"type": "__expr__",
|
||||||
|
"uid": "TheUID"
|
||||||
|
},
|
||||||
|
"type": "reduce",
|
||||||
|
"expression": "$A",
|
||||||
|
"reducer": "max",
|
||||||
|
"settings": {
|
||||||
|
"mode": "dropNN"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"refId": "D",
|
||||||
|
"datasource": {
|
||||||
|
"type": "__expr__",
|
||||||
|
"uid": "TheUID"
|
||||||
|
},
|
||||||
|
"expression": "$A",
|
||||||
|
"window": "1d",
|
||||||
|
"downsampler": "last",
|
||||||
|
"upsampler": "pad",
|
||||||
|
"type": "resample"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"refId": "E",
|
||||||
|
"datasource": {
|
||||||
|
"type": "__expr__",
|
||||||
|
"uid": "TheUID"
|
||||||
|
},
|
||||||
|
"conditions": [
|
||||||
|
{
|
||||||
|
"evaluator": {
|
||||||
|
"params": [
|
||||||
|
5
|
||||||
|
],
|
||||||
|
"type": "gt"
|
||||||
|
},
|
||||||
|
"operator": {
|
||||||
|
"type": "and"
|
||||||
|
},
|
||||||
|
"query": {
|
||||||
|
"params": [
|
||||||
|
"A"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"reducer": {
|
||||||
|
"type": "max"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"type": "classic_conditions"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"refId": "F",
|
||||||
|
"datasource": {
|
||||||
|
"type": "__expr__",
|
||||||
|
"uid": "TheUID"
|
||||||
|
},
|
||||||
|
"expression": "A",
|
||||||
|
"conditions": [
|
||||||
|
{
|
||||||
|
"evaluator": {
|
||||||
|
"params": [
|
||||||
|
5
|
||||||
|
],
|
||||||
|
"type": "gt"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"type": "threshold"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"refId": "G",
|
||||||
|
"datasource": {
|
||||||
|
"type": "__expr__",
|
||||||
|
"uid": "TheUID"
|
||||||
|
},
|
||||||
|
"expression": "B",
|
||||||
|
"conditions": [
|
||||||
|
{
|
||||||
|
"evaluator": {
|
||||||
|
"params": [
|
||||||
|
100
|
||||||
|
],
|
||||||
|
"type": "gt"
|
||||||
|
},
|
||||||
|
"loadedDimensions": {
|
||||||
|
"data": {
|
||||||
|
"values": [
|
||||||
|
[
|
||||||
|
18446744073709552000,
|
||||||
|
2,
|
||||||
|
3,
|
||||||
|
4,
|
||||||
|
5
|
||||||
|
]
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"schema": {
|
||||||
|
"fields": [
|
||||||
|
{
|
||||||
|
"name": "fingerprints",
|
||||||
|
"type": "number",
|
||||||
|
"typeInfo": {
|
||||||
|
"frame": "uint64"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"meta": {
|
||||||
|
"type": "fingerprints",
|
||||||
|
"typeVersion": [
|
||||||
|
1,
|
||||||
|
0
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"name": "test"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"unloadEvaluator": {
|
||||||
|
"params": [
|
||||||
|
31
|
||||||
|
],
|
||||||
|
"type": "lt"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"type": "threshold"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"refId": "H",
|
||||||
|
"datasource": {
|
||||||
|
"type": "__expr__",
|
||||||
|
"uid": "TheUID"
|
||||||
|
},
|
||||||
|
"expression": "SELECT * FROM A limit 1",
|
||||||
|
"type": "sql"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
989
pkg/expr/query.panel.schema.json
Normal file
989
pkg/expr/query.panel.schema.json
Normal file
@ -0,0 +1,989 @@
|
|||||||
|
{
|
||||||
|
"type": "object",
|
||||||
|
"required": [
|
||||||
|
"targets",
|
||||||
|
"type"
|
||||||
|
],
|
||||||
|
"properties": {
|
||||||
|
"targets": {
|
||||||
|
"type": "array",
|
||||||
|
"items": {
|
||||||
|
"type": "object",
|
||||||
|
"oneOf": [
|
||||||
|
{
|
||||||
|
"type": "object",
|
||||||
|
"required": [
|
||||||
|
"expression",
|
||||||
|
"type",
|
||||||
|
"refId"
|
||||||
|
],
|
||||||
|
"properties": {
|
||||||
|
"datasource": {
|
||||||
|
"description": "The datasource",
|
||||||
|
"type": "object",
|
||||||
|
"required": [
|
||||||
|
"type"
|
||||||
|
],
|
||||||
|
"properties": {
|
||||||
|
"type": {
|
||||||
|
"description": "The datasource plugin type",
|
||||||
|
"type": "string",
|
||||||
|
"pattern": "^__expr__$"
|
||||||
|
},
|
||||||
|
"uid": {
|
||||||
|
"description": "Datasource UID",
|
||||||
|
"type": "string"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"additionalProperties": false
|
||||||
|
},
|
||||||
|
"expression": {
|
||||||
|
"description": "General math expression",
|
||||||
|
"type": "string",
|
||||||
|
"minLength": 1,
|
||||||
|
"examples": [
|
||||||
|
"$A + 1",
|
||||||
|
"$A/$B"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"hide": {
|
||||||
|
"description": "true if query is disabled (ie should not be returned to the dashboard)\nNOTE: this does not always imply that the query should not be executed since\nthe results from a hidden query may be used as the input to other queries (SSE etc)",
|
||||||
|
"type": "boolean"
|
||||||
|
},
|
||||||
|
"queryType": {
|
||||||
|
"description": "QueryType is an optional identifier for the type of query.\nIt can be used to distinguish different types of queries.",
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"refId": {
|
||||||
|
"description": "RefID is the unique identifier of the query, set by the frontend call.",
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"resultAssertions": {
|
||||||
|
"description": "Optionally define expected query result behavior",
|
||||||
|
"type": "object",
|
||||||
|
"required": [
|
||||||
|
"typeVersion"
|
||||||
|
],
|
||||||
|
"properties": {
|
||||||
|
"maxFrames": {
|
||||||
|
"description": "Maximum frame count",
|
||||||
|
"type": "integer"
|
||||||
|
},
|
||||||
|
"type": {
|
||||||
|
"description": "Type asserts that the frame matches a known type structure.\n\n\nPossible enum values:\n - `\"\"` \n - `\"timeseries-wide\"` \n - `\"timeseries-long\"` \n - `\"timeseries-many\"` \n - `\"timeseries-multi\"` \n - `\"directory-listing\"` \n - `\"table\"` \n - `\"numeric-wide\"` \n - `\"numeric-multi\"` \n - `\"numeric-long\"` \n - `\"log-lines\"` ",
|
||||||
|
"type": "string",
|
||||||
|
"enum": [
|
||||||
|
"",
|
||||||
|
"timeseries-wide",
|
||||||
|
"timeseries-long",
|
||||||
|
"timeseries-many",
|
||||||
|
"timeseries-multi",
|
||||||
|
"directory-listing",
|
||||||
|
"table",
|
||||||
|
"numeric-wide",
|
||||||
|
"numeric-multi",
|
||||||
|
"numeric-long",
|
||||||
|
"log-lines"
|
||||||
|
],
|
||||||
|
"x-enum-description": {}
|
||||||
|
},
|
||||||
|
"typeVersion": {
|
||||||
|
"description": "TypeVersion is the version of the Type property. Versions greater than 0.0 correspond to the dataplane\ncontract documentation https://grafana.github.io/dataplane/contract/.",
|
||||||
|
"type": "array",
|
||||||
|
"maxItems": 2,
|
||||||
|
"minItems": 2,
|
||||||
|
"items": {
|
||||||
|
"type": "integer"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"additionalProperties": false
|
||||||
|
},
|
||||||
|
"timeRange": {
|
||||||
|
"description": "TimeRange represents the query range\nNOTE: unlike generic /ds/query, we can now send explicit time values in each query\nNOTE: the values for timeRange are not saved in a dashboard, they are constructed on the fly",
|
||||||
|
"type": "object",
|
||||||
|
"required": [
|
||||||
|
"from",
|
||||||
|
"to"
|
||||||
|
],
|
||||||
|
"properties": {
|
||||||
|
"from": {
|
||||||
|
"description": "From is the start time of the query.",
|
||||||
|
"type": "string",
|
||||||
|
"default": "now-6h",
|
||||||
|
"examples": [
|
||||||
|
"now-1h"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"to": {
|
||||||
|
"description": "To is the end time of the query.",
|
||||||
|
"type": "string",
|
||||||
|
"default": "now",
|
||||||
|
"examples": [
|
||||||
|
"now"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"additionalProperties": false
|
||||||
|
},
|
||||||
|
"type": {
|
||||||
|
"type": "string",
|
||||||
|
"pattern": "^math$"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"additionalProperties": false,
|
||||||
|
"$schema": "https://json-schema.org/draft-04/schema"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "object",
|
||||||
|
"required": [
|
||||||
|
"expression",
|
||||||
|
"reducer",
|
||||||
|
"type",
|
||||||
|
"refId"
|
||||||
|
],
|
||||||
|
"properties": {
|
||||||
|
"datasource": {
|
||||||
|
"description": "The datasource",
|
||||||
|
"type": "object",
|
||||||
|
"required": [
|
||||||
|
"type"
|
||||||
|
],
|
||||||
|
"properties": {
|
||||||
|
"type": {
|
||||||
|
"description": "The datasource plugin type",
|
||||||
|
"type": "string",
|
||||||
|
"pattern": "^__expr__$"
|
||||||
|
},
|
||||||
|
"uid": {
|
||||||
|
"description": "Datasource UID",
|
||||||
|
"type": "string"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"additionalProperties": false
|
||||||
|
},
|
||||||
|
"expression": {
|
||||||
|
"description": "Reference to single query result",
|
||||||
|
"type": "string",
|
||||||
|
"minLength": 1,
|
||||||
|
"examples": [
|
||||||
|
"$A"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"hide": {
|
||||||
|
"description": "true if query is disabled (ie should not be returned to the dashboard)\nNOTE: this does not always imply that the query should not be executed since\nthe results from a hidden query may be used as the input to other queries (SSE etc)",
|
||||||
|
"type": "boolean"
|
||||||
|
},
|
||||||
|
"queryType": {
|
||||||
|
"description": "QueryType is an optional identifier for the type of query.\nIt can be used to distinguish different types of queries.",
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"reducer": {
|
||||||
|
"description": "The reducer\n\n\nPossible enum values:\n - `\"sum\"` \n - `\"mean\"` \n - `\"min\"` \n - `\"max\"` \n - `\"count\"` \n - `\"last\"` ",
|
||||||
|
"type": "string",
|
||||||
|
"enum": [
|
||||||
|
"sum",
|
||||||
|
"mean",
|
||||||
|
"min",
|
||||||
|
"max",
|
||||||
|
"count",
|
||||||
|
"last"
|
||||||
|
],
|
||||||
|
"x-enum-description": {}
|
||||||
|
},
|
||||||
|
"refId": {
|
||||||
|
"description": "RefID is the unique identifier of the query, set by the frontend call.",
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"resultAssertions": {
|
||||||
|
"description": "Optionally define expected query result behavior",
|
||||||
|
"type": "object",
|
||||||
|
"required": [
|
||||||
|
"typeVersion"
|
||||||
|
],
|
||||||
|
"properties": {
|
||||||
|
"maxFrames": {
|
||||||
|
"description": "Maximum frame count",
|
||||||
|
"type": "integer"
|
||||||
|
},
|
||||||
|
"type": {
|
||||||
|
"description": "Type asserts that the frame matches a known type structure.\n\n\nPossible enum values:\n - `\"\"` \n - `\"timeseries-wide\"` \n - `\"timeseries-long\"` \n - `\"timeseries-many\"` \n - `\"timeseries-multi\"` \n - `\"directory-listing\"` \n - `\"table\"` \n - `\"numeric-wide\"` \n - `\"numeric-multi\"` \n - `\"numeric-long\"` \n - `\"log-lines\"` ",
|
||||||
|
"type": "string",
|
||||||
|
"enum": [
|
||||||
|
"",
|
||||||
|
"timeseries-wide",
|
||||||
|
"timeseries-long",
|
||||||
|
"timeseries-many",
|
||||||
|
"timeseries-multi",
|
||||||
|
"directory-listing",
|
||||||
|
"table",
|
||||||
|
"numeric-wide",
|
||||||
|
"numeric-multi",
|
||||||
|
"numeric-long",
|
||||||
|
"log-lines"
|
||||||
|
],
|
||||||
|
"x-enum-description": {}
|
||||||
|
},
|
||||||
|
"typeVersion": {
|
||||||
|
"description": "TypeVersion is the version of the Type property. Versions greater than 0.0 correspond to the dataplane\ncontract documentation https://grafana.github.io/dataplane/contract/.",
|
||||||
|
"type": "array",
|
||||||
|
"maxItems": 2,
|
||||||
|
"minItems": 2,
|
||||||
|
"items": {
|
||||||
|
"type": "integer"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"additionalProperties": false
|
||||||
|
},
|
||||||
|
"settings": {
|
||||||
|
"description": "Reducer Options",
|
||||||
|
"type": "object",
|
||||||
|
"required": [
|
||||||
|
"mode"
|
||||||
|
],
|
||||||
|
"properties": {
|
||||||
|
"mode": {
|
||||||
|
"description": "Non-number reduce behavior\n\n\nPossible enum values:\n - `\"dropNN\"` Drop non-numbers\n - `\"replaceNN\"` Replace non-numbers",
|
||||||
|
"type": "string",
|
||||||
|
"enum": [
|
||||||
|
"dropNN",
|
||||||
|
"replaceNN"
|
||||||
|
],
|
||||||
|
"x-enum-description": {
|
||||||
|
"dropNN": "Drop non-numbers",
|
||||||
|
"replaceNN": "Replace non-numbers"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"replaceWithValue": {
|
||||||
|
"description": "Only valid when mode is replace",
|
||||||
|
"type": "number"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"additionalProperties": false
|
||||||
|
},
|
||||||
|
"timeRange": {
|
||||||
|
"description": "TimeRange represents the query range\nNOTE: unlike generic /ds/query, we can now send explicit time values in each query\nNOTE: the values for timeRange are not saved in a dashboard, they are constructed on the fly",
|
||||||
|
"type": "object",
|
||||||
|
"required": [
|
||||||
|
"from",
|
||||||
|
"to"
|
||||||
|
],
|
||||||
|
"properties": {
|
||||||
|
"from": {
|
||||||
|
"description": "From is the start time of the query.",
|
||||||
|
"type": "string",
|
||||||
|
"default": "now-6h",
|
||||||
|
"examples": [
|
||||||
|
"now-1h"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"to": {
|
||||||
|
"description": "To is the end time of the query.",
|
||||||
|
"type": "string",
|
||||||
|
"default": "now",
|
||||||
|
"examples": [
|
||||||
|
"now"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"additionalProperties": false
|
||||||
|
},
|
||||||
|
"type": {
|
||||||
|
"type": "string",
|
||||||
|
"pattern": "^reduce$"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"additionalProperties": false,
|
||||||
|
"$schema": "https://json-schema.org/draft-04/schema"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"description": "QueryType = resample",
|
||||||
|
"type": "object",
|
||||||
|
"required": [
|
||||||
|
"expression",
|
||||||
|
"window",
|
||||||
|
"downsampler",
|
||||||
|
"upsampler",
|
||||||
|
"type",
|
||||||
|
"refId"
|
||||||
|
],
|
||||||
|
"properties": {
|
||||||
|
"datasource": {
|
||||||
|
"description": "The datasource",
|
||||||
|
"type": "object",
|
||||||
|
"required": [
|
||||||
|
"type"
|
||||||
|
],
|
||||||
|
"properties": {
|
||||||
|
"type": {
|
||||||
|
"description": "The datasource plugin type",
|
||||||
|
"type": "string",
|
||||||
|
"pattern": "^__expr__$"
|
||||||
|
},
|
||||||
|
"uid": {
|
||||||
|
"description": "Datasource UID",
|
||||||
|
"type": "string"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"additionalProperties": false
|
||||||
|
},
|
||||||
|
"downsampler": {
|
||||||
|
"description": "The downsample function\n\n\nPossible enum values:\n - `\"sum\"` \n - `\"mean\"` \n - `\"min\"` \n - `\"max\"` \n - `\"count\"` \n - `\"last\"` ",
|
||||||
|
"type": "string",
|
||||||
|
"enum": [
|
||||||
|
"sum",
|
||||||
|
"mean",
|
||||||
|
"min",
|
||||||
|
"max",
|
||||||
|
"count",
|
||||||
|
"last"
|
||||||
|
],
|
||||||
|
"x-enum-description": {}
|
||||||
|
},
|
||||||
|
"expression": {
|
||||||
|
"description": "The math expression",
|
||||||
|
"type": "string",
|
||||||
|
"minLength": 1,
|
||||||
|
"examples": [
|
||||||
|
"$A + 1",
|
||||||
|
"$A"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"hide": {
|
||||||
|
"description": "true if query is disabled (ie should not be returned to the dashboard)\nNOTE: this does not always imply that the query should not be executed since\nthe results from a hidden query may be used as the input to other queries (SSE etc)",
|
||||||
|
"type": "boolean"
|
||||||
|
},
|
||||||
|
"queryType": {
|
||||||
|
"description": "QueryType is an optional identifier for the type of query.\nIt can be used to distinguish different types of queries.",
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"refId": {
|
||||||
|
"description": "RefID is the unique identifier of the query, set by the frontend call.",
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"resultAssertions": {
|
||||||
|
"description": "Optionally define expected query result behavior",
|
||||||
|
"type": "object",
|
||||||
|
"required": [
|
||||||
|
"typeVersion"
|
||||||
|
],
|
||||||
|
"properties": {
|
||||||
|
"maxFrames": {
|
||||||
|
"description": "Maximum frame count",
|
||||||
|
"type": "integer"
|
||||||
|
},
|
||||||
|
"type": {
|
||||||
|
"description": "Type asserts that the frame matches a known type structure.\n\n\nPossible enum values:\n - `\"\"` \n - `\"timeseries-wide\"` \n - `\"timeseries-long\"` \n - `\"timeseries-many\"` \n - `\"timeseries-multi\"` \n - `\"directory-listing\"` \n - `\"table\"` \n - `\"numeric-wide\"` \n - `\"numeric-multi\"` \n - `\"numeric-long\"` \n - `\"log-lines\"` ",
|
||||||
|
"type": "string",
|
||||||
|
"enum": [
|
||||||
|
"",
|
||||||
|
"timeseries-wide",
|
||||||
|
"timeseries-long",
|
||||||
|
"timeseries-many",
|
||||||
|
"timeseries-multi",
|
||||||
|
"directory-listing",
|
||||||
|
"table",
|
||||||
|
"numeric-wide",
|
||||||
|
"numeric-multi",
|
||||||
|
"numeric-long",
|
||||||
|
"log-lines"
|
||||||
|
],
|
||||||
|
"x-enum-description": {}
|
||||||
|
},
|
||||||
|
"typeVersion": {
|
||||||
|
"description": "TypeVersion is the version of the Type property. Versions greater than 0.0 correspond to the dataplane\ncontract documentation https://grafana.github.io/dataplane/contract/.",
|
||||||
|
"type": "array",
|
||||||
|
"maxItems": 2,
|
||||||
|
"minItems": 2,
|
||||||
|
"items": {
|
||||||
|
"type": "integer"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"additionalProperties": false
|
||||||
|
},
|
||||||
|
"timeRange": {
|
||||||
|
"description": "TimeRange represents the query range\nNOTE: unlike generic /ds/query, we can now send explicit time values in each query\nNOTE: the values for timeRange are not saved in a dashboard, they are constructed on the fly",
|
||||||
|
"type": "object",
|
||||||
|
"required": [
|
||||||
|
"from",
|
||||||
|
"to"
|
||||||
|
],
|
||||||
|
"properties": {
|
||||||
|
"from": {
|
||||||
|
"description": "From is the start time of the query.",
|
||||||
|
"type": "string",
|
||||||
|
"default": "now-6h",
|
||||||
|
"examples": [
|
||||||
|
"now-1h"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"to": {
|
||||||
|
"description": "To is the end time of the query.",
|
||||||
|
"type": "string",
|
||||||
|
"default": "now",
|
||||||
|
"examples": [
|
||||||
|
"now"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"additionalProperties": false
|
||||||
|
},
|
||||||
|
"type": {
|
||||||
|
"type": "string",
|
||||||
|
"pattern": "^resample$"
|
||||||
|
},
|
||||||
|
"upsampler": {
|
||||||
|
"description": "The upsample function\n\n\nPossible enum values:\n - `\"pad\"` Use the last seen value\n - `\"backfilling\"` backfill\n - `\"fillna\"` Do not fill values (nill)",
|
||||||
|
"type": "string",
|
||||||
|
"enum": [
|
||||||
|
"pad",
|
||||||
|
"backfilling",
|
||||||
|
"fillna"
|
||||||
|
],
|
||||||
|
"x-enum-description": {
|
||||||
|
"backfilling": "backfill",
|
||||||
|
"fillna": "Do not fill values (nill)",
|
||||||
|
"pad": "Use the last seen value"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"window": {
|
||||||
|
"description": "The time duration",
|
||||||
|
"type": "string",
|
||||||
|
"minLength": 1,
|
||||||
|
"examples": [
|
||||||
|
"1d",
|
||||||
|
"10m"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"additionalProperties": false,
|
||||||
|
"$schema": "https://json-schema.org/draft-04/schema"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "object",
|
||||||
|
"required": [
|
||||||
|
"conditions",
|
||||||
|
"type",
|
||||||
|
"refId"
|
||||||
|
],
|
||||||
|
"properties": {
|
||||||
|
"conditions": {
|
||||||
|
"type": "array",
|
||||||
|
"items": {
|
||||||
|
"description": "ConditionJSON is the JSON model for a single condition in ConditionsCmd.",
|
||||||
|
"type": "object",
|
||||||
|
"required": [
|
||||||
|
"evaluator",
|
||||||
|
"operator",
|
||||||
|
"query",
|
||||||
|
"reducer"
|
||||||
|
],
|
||||||
|
"properties": {
|
||||||
|
"evaluator": {
|
||||||
|
"type": "object",
|
||||||
|
"required": [
|
||||||
|
"params",
|
||||||
|
"type"
|
||||||
|
],
|
||||||
|
"properties": {
|
||||||
|
"params": {
|
||||||
|
"type": "array",
|
||||||
|
"items": {
|
||||||
|
"type": "number"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"type": {
|
||||||
|
"description": "e.g. \"gt\"",
|
||||||
|
"type": "string"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"additionalProperties": false
|
||||||
|
},
|
||||||
|
"operator": {
|
||||||
|
"type": "object",
|
||||||
|
"required": [
|
||||||
|
"type"
|
||||||
|
],
|
||||||
|
"properties": {
|
||||||
|
"type": {
|
||||||
|
"type": "string",
|
||||||
|
"enum": [
|
||||||
|
"and",
|
||||||
|
"or"
|
||||||
|
],
|
||||||
|
"x-enum-description": {}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"additionalProperties": false
|
||||||
|
},
|
||||||
|
"query": {
|
||||||
|
"type": "object",
|
||||||
|
"required": [
|
||||||
|
"params"
|
||||||
|
],
|
||||||
|
"properties": {
|
||||||
|
"params": {
|
||||||
|
"type": "array",
|
||||||
|
"items": {
|
||||||
|
"type": "string"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"additionalProperties": false
|
||||||
|
},
|
||||||
|
"reducer": {
|
||||||
|
"type": "object",
|
||||||
|
"required": [
|
||||||
|
"type"
|
||||||
|
],
|
||||||
|
"properties": {
|
||||||
|
"type": {
|
||||||
|
"type": "string"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"additionalProperties": false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"additionalProperties": false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"datasource": {
|
||||||
|
"description": "The datasource",
|
||||||
|
"type": "object",
|
||||||
|
"required": [
|
||||||
|
"type"
|
||||||
|
],
|
||||||
|
"properties": {
|
||||||
|
"type": {
|
||||||
|
"description": "The datasource plugin type",
|
||||||
|
"type": "string",
|
||||||
|
"pattern": "^__expr__$"
|
||||||
|
},
|
||||||
|
"uid": {
|
||||||
|
"description": "Datasource UID",
|
||||||
|
"type": "string"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"additionalProperties": false
|
||||||
|
},
|
||||||
|
"hide": {
|
||||||
|
"description": "true if query is disabled (ie should not be returned to the dashboard)\nNOTE: this does not always imply that the query should not be executed since\nthe results from a hidden query may be used as the input to other queries (SSE etc)",
|
||||||
|
"type": "boolean"
|
||||||
|
},
|
||||||
|
"queryType": {
|
||||||
|
"description": "QueryType is an optional identifier for the type of query.\nIt can be used to distinguish different types of queries.",
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"refId": {
|
||||||
|
"description": "RefID is the unique identifier of the query, set by the frontend call.",
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"resultAssertions": {
|
||||||
|
"description": "Optionally define expected query result behavior",
|
||||||
|
"type": "object",
|
||||||
|
"required": [
|
||||||
|
"typeVersion"
|
||||||
|
],
|
||||||
|
"properties": {
|
||||||
|
"maxFrames": {
|
||||||
|
"description": "Maximum frame count",
|
||||||
|
"type": "integer"
|
||||||
|
},
|
||||||
|
"type": {
|
||||||
|
"description": "Type asserts that the frame matches a known type structure.\n\n\nPossible enum values:\n - `\"\"` \n - `\"timeseries-wide\"` \n - `\"timeseries-long\"` \n - `\"timeseries-many\"` \n - `\"timeseries-multi\"` \n - `\"directory-listing\"` \n - `\"table\"` \n - `\"numeric-wide\"` \n - `\"numeric-multi\"` \n - `\"numeric-long\"` \n - `\"log-lines\"` ",
|
||||||
|
"type": "string",
|
||||||
|
"enum": [
|
||||||
|
"",
|
||||||
|
"timeseries-wide",
|
||||||
|
"timeseries-long",
|
||||||
|
"timeseries-many",
|
||||||
|
"timeseries-multi",
|
||||||
|
"directory-listing",
|
||||||
|
"table",
|
||||||
|
"numeric-wide",
|
||||||
|
"numeric-multi",
|
||||||
|
"numeric-long",
|
||||||
|
"log-lines"
|
||||||
|
],
|
||||||
|
"x-enum-description": {}
|
||||||
|
},
|
||||||
|
"typeVersion": {
|
||||||
|
"description": "TypeVersion is the version of the Type property. Versions greater than 0.0 correspond to the dataplane\ncontract documentation https://grafana.github.io/dataplane/contract/.",
|
||||||
|
"type": "array",
|
||||||
|
"maxItems": 2,
|
||||||
|
"minItems": 2,
|
||||||
|
"items": {
|
||||||
|
"type": "integer"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"additionalProperties": false
|
||||||
|
},
|
||||||
|
"timeRange": {
|
||||||
|
"description": "TimeRange represents the query range\nNOTE: unlike generic /ds/query, we can now send explicit time values in each query\nNOTE: the values for timeRange are not saved in a dashboard, they are constructed on the fly",
|
||||||
|
"type": "object",
|
||||||
|
"required": [
|
||||||
|
"from",
|
||||||
|
"to"
|
||||||
|
],
|
||||||
|
"properties": {
|
||||||
|
"from": {
|
||||||
|
"description": "From is the start time of the query.",
|
||||||
|
"type": "string",
|
||||||
|
"default": "now-6h",
|
||||||
|
"examples": [
|
||||||
|
"now-1h"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"to": {
|
||||||
|
"description": "To is the end time of the query.",
|
||||||
|
"type": "string",
|
||||||
|
"default": "now",
|
||||||
|
"examples": [
|
||||||
|
"now"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"additionalProperties": false
|
||||||
|
},
|
||||||
|
"type": {
|
||||||
|
"type": "string",
|
||||||
|
"pattern": "^classic_conditions$"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"additionalProperties": false,
|
||||||
|
"$schema": "https://json-schema.org/draft-04/schema"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "object",
|
||||||
|
"required": [
|
||||||
|
"expression",
|
||||||
|
"conditions",
|
||||||
|
"type",
|
||||||
|
"refId"
|
||||||
|
],
|
||||||
|
"properties": {
|
||||||
|
"conditions": {
|
||||||
|
"description": "Threshold Conditions",
|
||||||
|
"type": "array",
|
||||||
|
"items": {
|
||||||
|
"type": "object",
|
||||||
|
"required": [
|
||||||
|
"evaluator"
|
||||||
|
],
|
||||||
|
"properties": {
|
||||||
|
"evaluator": {
|
||||||
|
"type": "object",
|
||||||
|
"required": [
|
||||||
|
"params",
|
||||||
|
"type"
|
||||||
|
],
|
||||||
|
"properties": {
|
||||||
|
"params": {
|
||||||
|
"type": "array",
|
||||||
|
"items": {
|
||||||
|
"type": "number"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"type": {
|
||||||
|
"description": "e.g. \"gt\"",
|
||||||
|
"type": "string",
|
||||||
|
"enum": [
|
||||||
|
"gt",
|
||||||
|
"lt",
|
||||||
|
"within_range",
|
||||||
|
"outside_range"
|
||||||
|
],
|
||||||
|
"x-enum-description": {}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"additionalProperties": false
|
||||||
|
},
|
||||||
|
"loadedDimensions": {
|
||||||
|
"type": "object",
|
||||||
|
"additionalProperties": true,
|
||||||
|
"x-grafana-type": "data.DataFrame"
|
||||||
|
},
|
||||||
|
"unloadEvaluator": {
|
||||||
|
"type": "object",
|
||||||
|
"required": [
|
||||||
|
"params",
|
||||||
|
"type"
|
||||||
|
],
|
||||||
|
"properties": {
|
||||||
|
"params": {
|
||||||
|
"type": "array",
|
||||||
|
"items": {
|
||||||
|
"type": "number"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"type": {
|
||||||
|
"description": "e.g. \"gt\"",
|
||||||
|
"type": "string",
|
||||||
|
"enum": [
|
||||||
|
"gt",
|
||||||
|
"lt",
|
||||||
|
"within_range",
|
||||||
|
"outside_range"
|
||||||
|
],
|
||||||
|
"x-enum-description": {}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"additionalProperties": false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"additionalProperties": false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"datasource": {
|
||||||
|
"description": "The datasource",
|
||||||
|
"type": "object",
|
||||||
|
"required": [
|
||||||
|
"type"
|
||||||
|
],
|
||||||
|
"properties": {
|
||||||
|
"type": {
|
||||||
|
"description": "The datasource plugin type",
|
||||||
|
"type": "string",
|
||||||
|
"pattern": "^__expr__$"
|
||||||
|
},
|
||||||
|
"uid": {
|
||||||
|
"description": "Datasource UID",
|
||||||
|
"type": "string"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"additionalProperties": false
|
||||||
|
},
|
||||||
|
"expression": {
|
||||||
|
"description": "Reference to single query result",
|
||||||
|
"type": "string",
|
||||||
|
"minLength": 1,
|
||||||
|
"examples": [
|
||||||
|
"$A"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"hide": {
|
||||||
|
"description": "true if query is disabled (ie should not be returned to the dashboard)\nNOTE: this does not always imply that the query should not be executed since\nthe results from a hidden query may be used as the input to other queries (SSE etc)",
|
||||||
|
"type": "boolean"
|
||||||
|
},
|
||||||
|
"queryType": {
|
||||||
|
"description": "QueryType is an optional identifier for the type of query.\nIt can be used to distinguish different types of queries.",
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"refId": {
|
||||||
|
"description": "RefID is the unique identifier of the query, set by the frontend call.",
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"resultAssertions": {
|
||||||
|
"description": "Optionally define expected query result behavior",
|
||||||
|
"type": "object",
|
||||||
|
"required": [
|
||||||
|
"typeVersion"
|
||||||
|
],
|
||||||
|
"properties": {
|
||||||
|
"maxFrames": {
|
||||||
|
"description": "Maximum frame count",
|
||||||
|
"type": "integer"
|
||||||
|
},
|
||||||
|
"type": {
|
||||||
|
"description": "Type asserts that the frame matches a known type structure.\n\n\nPossible enum values:\n - `\"\"` \n - `\"timeseries-wide\"` \n - `\"timeseries-long\"` \n - `\"timeseries-many\"` \n - `\"timeseries-multi\"` \n - `\"directory-listing\"` \n - `\"table\"` \n - `\"numeric-wide\"` \n - `\"numeric-multi\"` \n - `\"numeric-long\"` \n - `\"log-lines\"` ",
|
||||||
|
"type": "string",
|
||||||
|
"enum": [
|
||||||
|
"",
|
||||||
|
"timeseries-wide",
|
||||||
|
"timeseries-long",
|
||||||
|
"timeseries-many",
|
||||||
|
"timeseries-multi",
|
||||||
|
"directory-listing",
|
||||||
|
"table",
|
||||||
|
"numeric-wide",
|
||||||
|
"numeric-multi",
|
||||||
|
"numeric-long",
|
||||||
|
"log-lines"
|
||||||
|
],
|
||||||
|
"x-enum-description": {}
|
||||||
|
},
|
||||||
|
"typeVersion": {
|
||||||
|
"description": "TypeVersion is the version of the Type property. Versions greater than 0.0 correspond to the dataplane\ncontract documentation https://grafana.github.io/dataplane/contract/.",
|
||||||
|
"type": "array",
|
||||||
|
"maxItems": 2,
|
||||||
|
"minItems": 2,
|
||||||
|
"items": {
|
||||||
|
"type": "integer"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"additionalProperties": false
|
||||||
|
},
|
||||||
|
"timeRange": {
|
||||||
|
"description": "TimeRange represents the query range\nNOTE: unlike generic /ds/query, we can now send explicit time values in each query\nNOTE: the values for timeRange are not saved in a dashboard, they are constructed on the fly",
|
||||||
|
"type": "object",
|
||||||
|
"required": [
|
||||||
|
"from",
|
||||||
|
"to"
|
||||||
|
],
|
||||||
|
"properties": {
|
||||||
|
"from": {
|
||||||
|
"description": "From is the start time of the query.",
|
||||||
|
"type": "string",
|
||||||
|
"default": "now-6h",
|
||||||
|
"examples": [
|
||||||
|
"now-1h"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"to": {
|
||||||
|
"description": "To is the end time of the query.",
|
||||||
|
"type": "string",
|
||||||
|
"default": "now",
|
||||||
|
"examples": [
|
||||||
|
"now"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"additionalProperties": false
|
||||||
|
},
|
||||||
|
"type": {
|
||||||
|
"type": "string",
|
||||||
|
"pattern": "^threshold$"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"additionalProperties": false,
|
||||||
|
"$schema": "https://json-schema.org/draft-04/schema"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"description": "SQLQuery requires the sqlExpression feature flag",
|
||||||
|
"type": "object",
|
||||||
|
"required": [
|
||||||
|
"expression",
|
||||||
|
"type",
|
||||||
|
"refId"
|
||||||
|
],
|
||||||
|
"properties": {
|
||||||
|
"datasource": {
|
||||||
|
"description": "The datasource",
|
||||||
|
"type": "object",
|
||||||
|
"required": [
|
||||||
|
"type"
|
||||||
|
],
|
||||||
|
"properties": {
|
||||||
|
"type": {
|
||||||
|
"description": "The datasource plugin type",
|
||||||
|
"type": "string",
|
||||||
|
"pattern": "^__expr__$"
|
||||||
|
},
|
||||||
|
"uid": {
|
||||||
|
"description": "Datasource UID",
|
||||||
|
"type": "string"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"additionalProperties": false
|
||||||
|
},
|
||||||
|
"expression": {
|
||||||
|
"type": "string",
|
||||||
|
"minLength": 1,
|
||||||
|
"examples": [
|
||||||
|
"SELECT * FROM A LIMIT 1"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"hide": {
|
||||||
|
"description": "true if query is disabled (ie should not be returned to the dashboard)\nNOTE: this does not always imply that the query should not be executed since\nthe results from a hidden query may be used as the input to other queries (SSE etc)",
|
||||||
|
"type": "boolean"
|
||||||
|
},
|
||||||
|
"queryType": {
|
||||||
|
"description": "QueryType is an optional identifier for the type of query.\nIt can be used to distinguish different types of queries.",
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"refId": {
|
||||||
|
"description": "RefID is the unique identifier of the query, set by the frontend call.",
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"resultAssertions": {
|
||||||
|
"description": "Optionally define expected query result behavior",
|
||||||
|
"type": "object",
|
||||||
|
"required": [
|
||||||
|
"typeVersion"
|
||||||
|
],
|
||||||
|
"properties": {
|
||||||
|
"maxFrames": {
|
||||||
|
"description": "Maximum frame count",
|
||||||
|
"type": "integer"
|
||||||
|
},
|
||||||
|
"type": {
|
||||||
|
"description": "Type asserts that the frame matches a known type structure.\n\n\nPossible enum values:\n - `\"\"` \n - `\"timeseries-wide\"` \n - `\"timeseries-long\"` \n - `\"timeseries-many\"` \n - `\"timeseries-multi\"` \n - `\"directory-listing\"` \n - `\"table\"` \n - `\"numeric-wide\"` \n - `\"numeric-multi\"` \n - `\"numeric-long\"` \n - `\"log-lines\"` ",
|
||||||
|
"type": "string",
|
||||||
|
"enum": [
|
||||||
|
"",
|
||||||
|
"timeseries-wide",
|
||||||
|
"timeseries-long",
|
||||||
|
"timeseries-many",
|
||||||
|
"timeseries-multi",
|
||||||
|
"directory-listing",
|
||||||
|
"table",
|
||||||
|
"numeric-wide",
|
||||||
|
"numeric-multi",
|
||||||
|
"numeric-long",
|
||||||
|
"log-lines"
|
||||||
|
],
|
||||||
|
"x-enum-description": {}
|
||||||
|
},
|
||||||
|
"typeVersion": {
|
||||||
|
"description": "TypeVersion is the version of the Type property. Versions greater than 0.0 correspond to the dataplane\ncontract documentation https://grafana.github.io/dataplane/contract/.",
|
||||||
|
"type": "array",
|
||||||
|
"maxItems": 2,
|
||||||
|
"minItems": 2,
|
||||||
|
"items": {
|
||||||
|
"type": "integer"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"additionalProperties": false
|
||||||
|
},
|
||||||
|
"timeRange": {
|
||||||
|
"description": "TimeRange represents the query range\nNOTE: unlike generic /ds/query, we can now send explicit time values in each query\nNOTE: the values for timeRange are not saved in a dashboard, they are constructed on the fly",
|
||||||
|
"type": "object",
|
||||||
|
"required": [
|
||||||
|
"from",
|
||||||
|
"to"
|
||||||
|
],
|
||||||
|
"properties": {
|
||||||
|
"from": {
|
||||||
|
"description": "From is the start time of the query.",
|
||||||
|
"type": "string",
|
||||||
|
"default": "now-6h",
|
||||||
|
"examples": [
|
||||||
|
"now-1h"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"to": {
|
||||||
|
"description": "To is the end time of the query.",
|
||||||
|
"type": "string",
|
||||||
|
"default": "now",
|
||||||
|
"examples": [
|
||||||
|
"now"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"additionalProperties": false
|
||||||
|
},
|
||||||
|
"type": {
|
||||||
|
"type": "string",
|
||||||
|
"pattern": "^sql$"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"additionalProperties": false,
|
||||||
|
"$schema": "https://json-schema.org/draft-04/schema"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"$schema": "https://json-schema.org/draft-04/schema#"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"type": {
|
||||||
|
"description": "the panel type",
|
||||||
|
"type": "string"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"additionalProperties": true,
|
||||||
|
"$schema": "https://json-schema.org/draft-04/schema#"
|
||||||
|
}
|
147
pkg/expr/query.request.example.json
Normal file
147
pkg/expr/query.request.example.json
Normal file
@ -0,0 +1,147 @@
|
|||||||
|
{
|
||||||
|
"from": "now-1h",
|
||||||
|
"to": "now",
|
||||||
|
"queries": [
|
||||||
|
{
|
||||||
|
"refId": "A",
|
||||||
|
"maxDataPoints": 1000,
|
||||||
|
"intervalMs": 5,
|
||||||
|
"expression": "$A + 10",
|
||||||
|
"type": "math"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"refId": "B",
|
||||||
|
"maxDataPoints": 1000,
|
||||||
|
"intervalMs": 5,
|
||||||
|
"type": "math",
|
||||||
|
"expression": "$A - $B"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"refId": "C",
|
||||||
|
"maxDataPoints": 1000,
|
||||||
|
"intervalMs": 5,
|
||||||
|
"expression": "$A",
|
||||||
|
"reducer": "max",
|
||||||
|
"settings": {
|
||||||
|
"mode": "dropNN"
|
||||||
|
},
|
||||||
|
"type": "reduce"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"refId": "D",
|
||||||
|
"maxDataPoints": 1000,
|
||||||
|
"intervalMs": 5,
|
||||||
|
"upsampler": "pad",
|
||||||
|
"type": "resample",
|
||||||
|
"expression": "$A",
|
||||||
|
"window": "1d",
|
||||||
|
"downsampler": "last"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"refId": "E",
|
||||||
|
"maxDataPoints": 1000,
|
||||||
|
"intervalMs": 5,
|
||||||
|
"conditions": [
|
||||||
|
{
|
||||||
|
"evaluator": {
|
||||||
|
"params": [
|
||||||
|
5
|
||||||
|
],
|
||||||
|
"type": "gt"
|
||||||
|
},
|
||||||
|
"operator": {
|
||||||
|
"type": "and"
|
||||||
|
},
|
||||||
|
"query": {
|
||||||
|
"params": [
|
||||||
|
"A"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"reducer": {
|
||||||
|
"type": "max"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"type": "classic_conditions"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"refId": "F",
|
||||||
|
"maxDataPoints": 1000,
|
||||||
|
"intervalMs": 5,
|
||||||
|
"expression": "A",
|
||||||
|
"conditions": [
|
||||||
|
{
|
||||||
|
"evaluator": {
|
||||||
|
"params": [
|
||||||
|
5
|
||||||
|
],
|
||||||
|
"type": "gt"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"type": "threshold"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"refId": "G",
|
||||||
|
"maxDataPoints": 1000,
|
||||||
|
"intervalMs": 5,
|
||||||
|
"expression": "B",
|
||||||
|
"conditions": [
|
||||||
|
{
|
||||||
|
"evaluator": {
|
||||||
|
"params": [
|
||||||
|
100
|
||||||
|
],
|
||||||
|
"type": "gt"
|
||||||
|
},
|
||||||
|
"loadedDimensions": {
|
||||||
|
"data": {
|
||||||
|
"values": [
|
||||||
|
[
|
||||||
|
18446744073709552000,
|
||||||
|
2,
|
||||||
|
3,
|
||||||
|
4,
|
||||||
|
5
|
||||||
|
]
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"schema": {
|
||||||
|
"fields": [
|
||||||
|
{
|
||||||
|
"name": "fingerprints",
|
||||||
|
"type": "number",
|
||||||
|
"typeInfo": {
|
||||||
|
"frame": "uint64"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"meta": {
|
||||||
|
"type": "fingerprints",
|
||||||
|
"typeVersion": [
|
||||||
|
1,
|
||||||
|
0
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"name": "test"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"unloadEvaluator": {
|
||||||
|
"params": [
|
||||||
|
31
|
||||||
|
],
|
||||||
|
"type": "lt"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"type": "threshold"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"refId": "H",
|
||||||
|
"maxDataPoints": 1000,
|
||||||
|
"intervalMs": 5,
|
||||||
|
"expression": "SELECT * FROM A limit 1",
|
||||||
|
"type": "sql"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
1047
pkg/expr/query.request.schema.json
Normal file
1047
pkg/expr/query.request.schema.json
Normal file
File diff suppressed because it is too large
Load Diff
579
pkg/expr/query.types.json
Normal file
579
pkg/expr/query.types.json
Normal file
@ -0,0 +1,579 @@
|
|||||||
|
{
|
||||||
|
"kind": "QueryTypeDefinitionList",
|
||||||
|
"apiVersion": "query.grafana.app/v0alpha1",
|
||||||
|
"metadata": {
|
||||||
|
"resourceVersion": "1709168280033"
|
||||||
|
},
|
||||||
|
"items": [
|
||||||
|
{
|
||||||
|
"metadata": {
|
||||||
|
"name": "math",
|
||||||
|
"resourceVersion": "1709915973363",
|
||||||
|
"creationTimestamp": "2024-02-21T22:09:26Z"
|
||||||
|
},
|
||||||
|
"spec": {
|
||||||
|
"discriminators": [
|
||||||
|
{
|
||||||
|
"field": "type",
|
||||||
|
"value": "math"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"schema": {
|
||||||
|
"$schema": "https://json-schema.org/draft-04/schema",
|
||||||
|
"additionalProperties": false,
|
||||||
|
"properties": {
|
||||||
|
"expression": {
|
||||||
|
"description": "General math expression",
|
||||||
|
"examples": [
|
||||||
|
"$A + 1",
|
||||||
|
"$A/$B"
|
||||||
|
],
|
||||||
|
"minLength": 1,
|
||||||
|
"type": "string"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"required": [
|
||||||
|
"expression"
|
||||||
|
],
|
||||||
|
"type": "object"
|
||||||
|
},
|
||||||
|
"examples": [
|
||||||
|
{
|
||||||
|
"name": "constant addition",
|
||||||
|
"saveModel": {
|
||||||
|
"expression": "$A + 10"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "math with two queries",
|
||||||
|
"saveModel": {
|
||||||
|
"expression": "$A - $B"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"metadata": {
|
||||||
|
"name": "reduce",
|
||||||
|
"resourceVersion": "1709915979242",
|
||||||
|
"creationTimestamp": "2024-02-21T22:09:26Z"
|
||||||
|
},
|
||||||
|
"spec": {
|
||||||
|
"discriminators": [
|
||||||
|
{
|
||||||
|
"field": "type",
|
||||||
|
"value": "reduce"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"schema": {
|
||||||
|
"$schema": "https://json-schema.org/draft-04/schema",
|
||||||
|
"additionalProperties": false,
|
||||||
|
"properties": {
|
||||||
|
"expression": {
|
||||||
|
"description": "Reference to single query result",
|
||||||
|
"examples": [
|
||||||
|
"$A"
|
||||||
|
],
|
||||||
|
"minLength": 1,
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"reducer": {
|
||||||
|
"description": "The reducer\n\n\nPossible enum values:\n - `\"sum\"` \n - `\"mean\"` \n - `\"min\"` \n - `\"max\"` \n - `\"count\"` \n - `\"last\"` ",
|
||||||
|
"enum": [
|
||||||
|
"sum",
|
||||||
|
"mean",
|
||||||
|
"min",
|
||||||
|
"max",
|
||||||
|
"count",
|
||||||
|
"last"
|
||||||
|
],
|
||||||
|
"type": "string",
|
||||||
|
"x-enum-description": {}
|
||||||
|
},
|
||||||
|
"settings": {
|
||||||
|
"additionalProperties": false,
|
||||||
|
"description": "Reducer Options",
|
||||||
|
"properties": {
|
||||||
|
"mode": {
|
||||||
|
"description": "Non-number reduce behavior\n\n\nPossible enum values:\n - `\"dropNN\"` Drop non-numbers\n - `\"replaceNN\"` Replace non-numbers",
|
||||||
|
"enum": [
|
||||||
|
"dropNN",
|
||||||
|
"replaceNN"
|
||||||
|
],
|
||||||
|
"type": "string",
|
||||||
|
"x-enum-description": {
|
||||||
|
"dropNN": "Drop non-numbers",
|
||||||
|
"replaceNN": "Replace non-numbers"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"replaceWithValue": {
|
||||||
|
"description": "Only valid when mode is replace",
|
||||||
|
"type": "number"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"required": [
|
||||||
|
"mode"
|
||||||
|
],
|
||||||
|
"type": "object"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"required": [
|
||||||
|
"expression",
|
||||||
|
"reducer"
|
||||||
|
],
|
||||||
|
"type": "object"
|
||||||
|
},
|
||||||
|
"examples": [
|
||||||
|
{
|
||||||
|
"name": "get max value",
|
||||||
|
"saveModel": {
|
||||||
|
"expression": "$A",
|
||||||
|
"reducer": "max",
|
||||||
|
"settings": {
|
||||||
|
"mode": "dropNN"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"metadata": {
|
||||||
|
"name": "resample",
|
||||||
|
"resourceVersion": "1709915973363",
|
||||||
|
"creationTimestamp": "2024-02-21T22:09:26Z"
|
||||||
|
},
|
||||||
|
"spec": {
|
||||||
|
"discriminators": [
|
||||||
|
{
|
||||||
|
"field": "type",
|
||||||
|
"value": "resample"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"schema": {
|
||||||
|
"$schema": "https://json-schema.org/draft-04/schema",
|
||||||
|
"additionalProperties": false,
|
||||||
|
"description": "QueryType = resample",
|
||||||
|
"properties": {
|
||||||
|
"downsampler": {
|
||||||
|
"description": "The downsample function\n\n\nPossible enum values:\n - `\"sum\"` \n - `\"mean\"` \n - `\"min\"` \n - `\"max\"` \n - `\"count\"` \n - `\"last\"` ",
|
||||||
|
"enum": [
|
||||||
|
"sum",
|
||||||
|
"mean",
|
||||||
|
"min",
|
||||||
|
"max",
|
||||||
|
"count",
|
||||||
|
"last"
|
||||||
|
],
|
||||||
|
"type": "string",
|
||||||
|
"x-enum-description": {}
|
||||||
|
},
|
||||||
|
"expression": {
|
||||||
|
"description": "The math expression",
|
||||||
|
"examples": [
|
||||||
|
"$A + 1",
|
||||||
|
"$A"
|
||||||
|
],
|
||||||
|
"minLength": 1,
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"upsampler": {
|
||||||
|
"description": "The upsample function\n\n\nPossible enum values:\n - `\"pad\"` Use the last seen value\n - `\"backfilling\"` backfill\n - `\"fillna\"` Do not fill values (nill)",
|
||||||
|
"enum": [
|
||||||
|
"pad",
|
||||||
|
"backfilling",
|
||||||
|
"fillna"
|
||||||
|
],
|
||||||
|
"type": "string",
|
||||||
|
"x-enum-description": {
|
||||||
|
"backfilling": "backfill",
|
||||||
|
"fillna": "Do not fill values (nill)",
|
||||||
|
"pad": "Use the last seen value"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"window": {
|
||||||
|
"description": "The time duration",
|
||||||
|
"examples": [
|
||||||
|
"1d",
|
||||||
|
"10m"
|
||||||
|
],
|
||||||
|
"minLength": 1,
|
||||||
|
"type": "string"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"required": [
|
||||||
|
"expression",
|
||||||
|
"window",
|
||||||
|
"downsampler",
|
||||||
|
"upsampler"
|
||||||
|
],
|
||||||
|
"type": "object"
|
||||||
|
},
|
||||||
|
"examples": [
|
||||||
|
{
|
||||||
|
"name": "resample at a every day",
|
||||||
|
"saveModel": {
|
||||||
|
"downsampler": "last",
|
||||||
|
"expression": "$A",
|
||||||
|
"upsampler": "pad",
|
||||||
|
"window": "1d"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"metadata": {
|
||||||
|
"name": "classic_conditions",
|
||||||
|
"resourceVersion": "1709915973363",
|
||||||
|
"creationTimestamp": "2024-02-21T22:09:26Z"
|
||||||
|
},
|
||||||
|
"spec": {
|
||||||
|
"discriminators": [
|
||||||
|
{
|
||||||
|
"field": "type",
|
||||||
|
"value": "classic_conditions"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"schema": {
|
||||||
|
"$schema": "https://json-schema.org/draft-04/schema",
|
||||||
|
"additionalProperties": false,
|
||||||
|
"properties": {
|
||||||
|
"conditions": {
|
||||||
|
"items": {
|
||||||
|
"additionalProperties": false,
|
||||||
|
"description": "ConditionJSON is the JSON model for a single condition in ConditionsCmd.",
|
||||||
|
"properties": {
|
||||||
|
"evaluator": {
|
||||||
|
"additionalProperties": false,
|
||||||
|
"properties": {
|
||||||
|
"params": {
|
||||||
|
"items": {
|
||||||
|
"type": "number"
|
||||||
|
},
|
||||||
|
"type": "array"
|
||||||
|
},
|
||||||
|
"type": {
|
||||||
|
"description": "e.g. \"gt\"",
|
||||||
|
"type": "string"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"required": [
|
||||||
|
"params",
|
||||||
|
"type"
|
||||||
|
],
|
||||||
|
"type": "object"
|
||||||
|
},
|
||||||
|
"operator": {
|
||||||
|
"additionalProperties": false,
|
||||||
|
"properties": {
|
||||||
|
"type": {
|
||||||
|
"enum": [
|
||||||
|
"and",
|
||||||
|
"or"
|
||||||
|
],
|
||||||
|
"type": "string",
|
||||||
|
"x-enum-description": {}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"required": [
|
||||||
|
"type"
|
||||||
|
],
|
||||||
|
"type": "object"
|
||||||
|
},
|
||||||
|
"query": {
|
||||||
|
"additionalProperties": false,
|
||||||
|
"properties": {
|
||||||
|
"params": {
|
||||||
|
"items": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"type": "array"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"required": [
|
||||||
|
"params"
|
||||||
|
],
|
||||||
|
"type": "object"
|
||||||
|
},
|
||||||
|
"reducer": {
|
||||||
|
"additionalProperties": false,
|
||||||
|
"properties": {
|
||||||
|
"type": {
|
||||||
|
"type": "string"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"required": [
|
||||||
|
"type"
|
||||||
|
],
|
||||||
|
"type": "object"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"required": [
|
||||||
|
"evaluator",
|
||||||
|
"operator",
|
||||||
|
"query",
|
||||||
|
"reducer"
|
||||||
|
],
|
||||||
|
"type": "object"
|
||||||
|
},
|
||||||
|
"type": "array"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"required": [
|
||||||
|
"conditions"
|
||||||
|
],
|
||||||
|
"type": "object"
|
||||||
|
},
|
||||||
|
"examples": [
|
||||||
|
{
|
||||||
|
"name": "Where query A \u003e 5",
|
||||||
|
"saveModel": {
|
||||||
|
"conditions": [
|
||||||
|
{
|
||||||
|
"evaluator": {
|
||||||
|
"params": [
|
||||||
|
5
|
||||||
|
],
|
||||||
|
"type": "gt"
|
||||||
|
},
|
||||||
|
"operator": {
|
||||||
|
"type": "and"
|
||||||
|
},
|
||||||
|
"query": {
|
||||||
|
"params": [
|
||||||
|
"A"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"reducer": {
|
||||||
|
"type": "max"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"metadata": {
|
||||||
|
"name": "threshold",
|
||||||
|
"resourceVersion": "1709915973363",
|
||||||
|
"creationTimestamp": "2024-02-21T22:09:26Z"
|
||||||
|
},
|
||||||
|
"spec": {
|
||||||
|
"discriminators": [
|
||||||
|
{
|
||||||
|
"field": "type",
|
||||||
|
"value": "threshold"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"schema": {
|
||||||
|
"$schema": "https://json-schema.org/draft-04/schema",
|
||||||
|
"additionalProperties": false,
|
||||||
|
"properties": {
|
||||||
|
"conditions": {
|
||||||
|
"description": "Threshold Conditions",
|
||||||
|
"items": {
|
||||||
|
"additionalProperties": false,
|
||||||
|
"properties": {
|
||||||
|
"evaluator": {
|
||||||
|
"additionalProperties": false,
|
||||||
|
"properties": {
|
||||||
|
"params": {
|
||||||
|
"items": {
|
||||||
|
"type": "number"
|
||||||
|
},
|
||||||
|
"type": "array"
|
||||||
|
},
|
||||||
|
"type": {
|
||||||
|
"description": "e.g. \"gt\"",
|
||||||
|
"enum": [
|
||||||
|
"gt",
|
||||||
|
"lt",
|
||||||
|
"within_range",
|
||||||
|
"outside_range"
|
||||||
|
],
|
||||||
|
"type": "string",
|
||||||
|
"x-enum-description": {}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"required": [
|
||||||
|
"params",
|
||||||
|
"type"
|
||||||
|
],
|
||||||
|
"type": "object"
|
||||||
|
},
|
||||||
|
"loadedDimensions": {
|
||||||
|
"additionalProperties": true,
|
||||||
|
"type": "object",
|
||||||
|
"x-grafana-type": "data.DataFrame"
|
||||||
|
},
|
||||||
|
"unloadEvaluator": {
|
||||||
|
"additionalProperties": false,
|
||||||
|
"properties": {
|
||||||
|
"params": {
|
||||||
|
"items": {
|
||||||
|
"type": "number"
|
||||||
|
},
|
||||||
|
"type": "array"
|
||||||
|
},
|
||||||
|
"type": {
|
||||||
|
"description": "e.g. \"gt\"",
|
||||||
|
"enum": [
|
||||||
|
"gt",
|
||||||
|
"lt",
|
||||||
|
"within_range",
|
||||||
|
"outside_range"
|
||||||
|
],
|
||||||
|
"type": "string",
|
||||||
|
"x-enum-description": {}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"required": [
|
||||||
|
"params",
|
||||||
|
"type"
|
||||||
|
],
|
||||||
|
"type": "object"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"required": [
|
||||||
|
"evaluator"
|
||||||
|
],
|
||||||
|
"type": "object"
|
||||||
|
},
|
||||||
|
"type": "array"
|
||||||
|
},
|
||||||
|
"expression": {
|
||||||
|
"description": "Reference to single query result",
|
||||||
|
"examples": [
|
||||||
|
"$A"
|
||||||
|
],
|
||||||
|
"minLength": 1,
|
||||||
|
"type": "string"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"required": [
|
||||||
|
"expression",
|
||||||
|
"conditions"
|
||||||
|
],
|
||||||
|
"type": "object"
|
||||||
|
},
|
||||||
|
"examples": [
|
||||||
|
{
|
||||||
|
"name": "Where query A \u003e 5",
|
||||||
|
"saveModel": {
|
||||||
|
"conditions": [
|
||||||
|
{
|
||||||
|
"evaluator": {
|
||||||
|
"params": [
|
||||||
|
5
|
||||||
|
],
|
||||||
|
"type": "gt"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"expression": "A"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "With loaded+unloaded evaluators",
|
||||||
|
"saveModel": {
|
||||||
|
"conditions": [
|
||||||
|
{
|
||||||
|
"evaluator": {
|
||||||
|
"params": [
|
||||||
|
100
|
||||||
|
],
|
||||||
|
"type": "gt"
|
||||||
|
},
|
||||||
|
"loadedDimensions": {
|
||||||
|
"data": {
|
||||||
|
"values": [
|
||||||
|
[
|
||||||
|
18446744073709552000,
|
||||||
|
2,
|
||||||
|
3,
|
||||||
|
4,
|
||||||
|
5
|
||||||
|
]
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"schema": {
|
||||||
|
"fields": [
|
||||||
|
{
|
||||||
|
"name": "fingerprints",
|
||||||
|
"type": "number",
|
||||||
|
"typeInfo": {
|
||||||
|
"frame": "uint64"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"meta": {
|
||||||
|
"type": "fingerprints",
|
||||||
|
"typeVersion": [
|
||||||
|
1,
|
||||||
|
0
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"name": "test"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"unloadEvaluator": {
|
||||||
|
"params": [
|
||||||
|
31
|
||||||
|
],
|
||||||
|
"type": "lt"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"expression": "B"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"metadata": {
|
||||||
|
"name": "sql",
|
||||||
|
"resourceVersion": "1709915973363",
|
||||||
|
"creationTimestamp": "2024-02-29T00:58:00Z"
|
||||||
|
},
|
||||||
|
"spec": {
|
||||||
|
"discriminators": [
|
||||||
|
{
|
||||||
|
"field": "type",
|
||||||
|
"value": "sql"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"schema": {
|
||||||
|
"$schema": "https://json-schema.org/draft-04/schema",
|
||||||
|
"additionalProperties": false,
|
||||||
|
"description": "SQLQuery requires the sqlExpression feature flag",
|
||||||
|
"properties": {
|
||||||
|
"expression": {
|
||||||
|
"examples": [
|
||||||
|
"SELECT * FROM A LIMIT 1"
|
||||||
|
],
|
||||||
|
"minLength": 1,
|
||||||
|
"type": "string"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"required": [
|
||||||
|
"expression"
|
||||||
|
],
|
||||||
|
"type": "object"
|
||||||
|
},
|
||||||
|
"examples": [
|
||||||
|
{
|
||||||
|
"name": "Select the first row from A",
|
||||||
|
"saveModel": {
|
||||||
|
"expression": "SELECT * FROM A limit 1"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
174
pkg/expr/query_test.go
Normal file
174
pkg/expr/query_test.go
Normal file
@ -0,0 +1,174 @@
|
|||||||
|
package expr
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"reflect"
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
data "github.com/grafana/grafana-plugin-sdk-go/experimental/apis/data/v0alpha1"
|
||||||
|
"github.com/grafana/grafana-plugin-sdk-go/experimental/schemabuilder"
|
||||||
|
"github.com/stretchr/testify/require"
|
||||||
|
|
||||||
|
"github.com/grafana/grafana/pkg/expr/classic"
|
||||||
|
"github.com/grafana/grafana/pkg/expr/mathexp"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestQueryTypeDefinitions(t *testing.T) {
|
||||||
|
builder, err := schemabuilder.NewSchemaBuilder(
|
||||||
|
schemabuilder.BuilderOptions{
|
||||||
|
PluginID: []string{DatasourceType},
|
||||||
|
ScanCode: []schemabuilder.CodePaths{{
|
||||||
|
BasePackage: "github.com/grafana/grafana/pkg/expr",
|
||||||
|
CodePath: "./",
|
||||||
|
}},
|
||||||
|
Enums: []reflect.Type{
|
||||||
|
reflect.TypeOf(mathexp.ReducerSum), // pick an example value (not the root)
|
||||||
|
reflect.TypeOf(mathexp.UpsamplerPad), // pick an example value (not the root)
|
||||||
|
reflect.TypeOf(ReduceModeDrop), // pick an example value (not the root)
|
||||||
|
reflect.TypeOf(ThresholdIsAbove),
|
||||||
|
reflect.TypeOf(classic.ConditionOperatorAnd),
|
||||||
|
},
|
||||||
|
})
|
||||||
|
require.NoError(t, err)
|
||||||
|
err = builder.AddQueries(
|
||||||
|
schemabuilder.QueryTypeInfo{
|
||||||
|
Discriminators: data.NewDiscriminators("type", QueryTypeMath),
|
||||||
|
GoType: reflect.TypeOf(&MathQuery{}),
|
||||||
|
Examples: []data.QueryExample{
|
||||||
|
{
|
||||||
|
Name: "constant addition",
|
||||||
|
SaveModel: data.AsUnstructured(MathQuery{
|
||||||
|
Expression: "$A + 10",
|
||||||
|
}),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Name: "math with two queries",
|
||||||
|
SaveModel: data.AsUnstructured(MathQuery{
|
||||||
|
Expression: "$A - $B",
|
||||||
|
}),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
schemabuilder.QueryTypeInfo{
|
||||||
|
Discriminators: data.NewDiscriminators("type", QueryTypeReduce),
|
||||||
|
GoType: reflect.TypeOf(&ReduceQuery{}),
|
||||||
|
Examples: []data.QueryExample{
|
||||||
|
{
|
||||||
|
Name: "get max value",
|
||||||
|
SaveModel: data.AsUnstructured(ReduceQuery{
|
||||||
|
Expression: "$A",
|
||||||
|
Reducer: mathexp.ReducerMax,
|
||||||
|
Settings: &ReduceSettings{
|
||||||
|
Mode: ReduceModeDrop,
|
||||||
|
},
|
||||||
|
}),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
schemabuilder.QueryTypeInfo{
|
||||||
|
Discriminators: data.NewDiscriminators("type", QueryTypeResample),
|
||||||
|
GoType: reflect.TypeOf(&ResampleQuery{}),
|
||||||
|
Examples: []data.QueryExample{
|
||||||
|
{
|
||||||
|
Name: "resample at a every day",
|
||||||
|
SaveModel: data.AsUnstructured(ResampleQuery{
|
||||||
|
Expression: "$A",
|
||||||
|
Window: "1d",
|
||||||
|
Downsampler: mathexp.ReducerLast,
|
||||||
|
Upsampler: mathexp.UpsamplerPad,
|
||||||
|
}),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
schemabuilder.QueryTypeInfo{
|
||||||
|
Discriminators: data.NewDiscriminators("type", QueryTypeSQL),
|
||||||
|
GoType: reflect.TypeOf(&SQLExpression{}),
|
||||||
|
Examples: []data.QueryExample{
|
||||||
|
{
|
||||||
|
Name: "Select the first row from A",
|
||||||
|
SaveModel: data.AsUnstructured(SQLExpression{
|
||||||
|
Expression: "SELECT * FROM A limit 1",
|
||||||
|
}),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
schemabuilder.QueryTypeInfo{
|
||||||
|
Discriminators: data.NewDiscriminators("type", QueryTypeClassic),
|
||||||
|
GoType: reflect.TypeOf(&ClassicQuery{}),
|
||||||
|
Examples: []data.QueryExample{
|
||||||
|
{
|
||||||
|
Name: "Where query A > 5",
|
||||||
|
SaveModel: data.AsUnstructured(ClassicQuery{
|
||||||
|
Conditions: []classic.ConditionJSON{
|
||||||
|
{
|
||||||
|
Query: classic.ConditionQueryJSON{
|
||||||
|
Params: []string{"A"},
|
||||||
|
},
|
||||||
|
Reducer: classic.ConditionReducerJSON{
|
||||||
|
Type: "max",
|
||||||
|
},
|
||||||
|
Operator: classic.ConditionOperatorJSON{
|
||||||
|
Type: "and",
|
||||||
|
},
|
||||||
|
Evaluator: classic.ConditionEvalJSON{
|
||||||
|
Type: "gt",
|
||||||
|
Params: []float64{5},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
schemabuilder.QueryTypeInfo{
|
||||||
|
Discriminators: data.NewDiscriminators("type", QueryTypeThreshold),
|
||||||
|
GoType: reflect.TypeOf(&ThresholdQuery{}),
|
||||||
|
Examples: []data.QueryExample{
|
||||||
|
{
|
||||||
|
Name: "Where query A > 5",
|
||||||
|
SaveModel: data.AsUnstructured(ThresholdQuery{
|
||||||
|
Expression: "A",
|
||||||
|
Conditions: []ThresholdConditionJSON{{
|
||||||
|
Evaluator: ConditionEvalJSON{
|
||||||
|
Type: ThresholdIsAbove,
|
||||||
|
Params: []float64{5},
|
||||||
|
},
|
||||||
|
}},
|
||||||
|
}),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Name: "With loaded+unloaded evaluators",
|
||||||
|
SaveModel: toUnstructured(`{
|
||||||
|
"expression": "B",
|
||||||
|
"conditions": [
|
||||||
|
{
|
||||||
|
"evaluator": {
|
||||||
|
"params": [
|
||||||
|
100
|
||||||
|
],
|
||||||
|
"type": "gt"
|
||||||
|
},
|
||||||
|
"unloadEvaluator": {
|
||||||
|
"params": [
|
||||||
|
31
|
||||||
|
],
|
||||||
|
"type": "lt"
|
||||||
|
},
|
||||||
|
"loadedDimensions": {"schema":{"name":"test","meta":{"type":"fingerprints","typeVersion":[1,0]},"fields":[{"name":"fingerprints","type":"number","typeInfo":{"frame":"uint64"}}]},"data":{"values":[[18446744073709551615,2,3,4,5]]}}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}`),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
)
|
||||||
|
|
||||||
|
require.NoError(t, err)
|
||||||
|
_ = builder.UpdateQueryDefinition(t, "./")
|
||||||
|
}
|
||||||
|
|
||||||
|
func toUnstructured(ex string) data.Unstructured {
|
||||||
|
v := data.Unstructured{}
|
||||||
|
_ = json.Unmarshal([]byte(ex), &v.Object)
|
||||||
|
return v
|
||||||
|
}
|
@ -1,6 +1,7 @@
|
|||||||
package expr
|
package expr
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"embed"
|
||||||
"fmt"
|
"fmt"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
@ -177,6 +178,13 @@ func (h *ExpressionQueryReader) ReadQuery(
|
|||||||
return eq, err
|
return eq, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//go:embed query.types.json
|
||||||
|
var f embed.FS
|
||||||
|
|
||||||
|
func (h *ExpressionQueryReader) QueryTypeDefinitionListJSON() ([]byte, error) {
|
||||||
|
return f.ReadFile("query.types.json")
|
||||||
|
}
|
||||||
|
|
||||||
func getReferenceVar(exp string, refId string) (string, error) {
|
func getReferenceVar(exp string, refId string) (string, error) {
|
||||||
exp = strings.TrimPrefix(exp, "$")
|
exp = strings.TrimPrefix(exp, "$")
|
||||||
if exp == "" {
|
if exp == "" {
|
||||||
|
@ -173,8 +173,8 @@ type ThresholdCommandConfig struct {
|
|||||||
|
|
||||||
type ThresholdConditionJSON struct {
|
type ThresholdConditionJSON struct {
|
||||||
Evaluator ConditionEvalJSON `json:"evaluator"`
|
Evaluator ConditionEvalJSON `json:"evaluator"`
|
||||||
UnloadEvaluator *ConditionEvalJSON `json:"unloadEvaluator"`
|
UnloadEvaluator *ConditionEvalJSON `json:"unloadEvaluator,omitempty"`
|
||||||
LoadedDimensions *data.Frame `json:"loadedDimensions"`
|
LoadedDimensions *data.Frame `json:"loadedDimensions,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// IsHysteresisExpression returns true if the raw model describes a hysteresis command:
|
// IsHysteresisExpression returns true if the raw model describes a hysteresis command:
|
||||||
|
@ -88,16 +88,6 @@ func GetComposableKinds() ([]ComposableKind, error) {
|
|||||||
CueFile: grafanapyroscopeCue,
|
CueFile: grafanapyroscopeCue,
|
||||||
})
|
})
|
||||||
|
|
||||||
grafanatestdatadatasourceCue, err := loadCueFileWithCommon(root, filepath.Join(root, "./public/app/plugins/datasource/grafana-testdata-datasource/dataquery.cue"))
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
kinds = append(kinds, ComposableKind{
|
|
||||||
Name: "grafanatestdatadatasource",
|
|
||||||
Filename: "dataquery.cue",
|
|
||||||
CueFile: grafanatestdatadatasourceCue,
|
|
||||||
})
|
|
||||||
|
|
||||||
lokiCue, err := loadCueFileWithCommon(root, filepath.Join(root, "./public/app/plugins/datasource/loki/dataquery.cue"))
|
lokiCue, err := loadCueFileWithCommon(root, filepath.Join(root, "./public/app/plugins/datasource/loki/dataquery.cue"))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
|
@ -26,7 +26,7 @@ func (s *Service) handleCsvContentScenario(ctx context.Context, req *backend.Que
|
|||||||
return nil, fmt.Errorf("failed to parse query json: %v", err)
|
return nil, fmt.Errorf("failed to parse query json: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
csvContent := model.CSVContent
|
csvContent := model.CsvContent
|
||||||
if len(csvContent) == 0 {
|
if len(csvContent) == 0 {
|
||||||
return backend.NewQueryDataResponse(), nil
|
return backend.NewQueryDataResponse(), nil
|
||||||
}
|
}
|
||||||
@ -63,7 +63,7 @@ func (s *Service) handleCsvFileScenario(ctx context.Context, req *backend.QueryD
|
|||||||
return nil, fmt.Errorf("failed to parse query json %v", err)
|
return nil, fmt.Errorf("failed to parse query json %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
fileName := model.CSVFileName
|
fileName := model.CsvFileName
|
||||||
|
|
||||||
if len(fileName) == 0 {
|
if len(fileName) == 0 {
|
||||||
continue
|
continue
|
||||||
|
@ -1,211 +0,0 @@
|
|||||||
// Code generated - EDITING IS FUTILE. DO NOT EDIT.
|
|
||||||
//
|
|
||||||
// Generated by:
|
|
||||||
// public/app/plugins/gen.go
|
|
||||||
// Using jennies:
|
|
||||||
// PluginGoTypesJenny
|
|
||||||
//
|
|
||||||
// Run 'make gen-cue' from repository root to regenerate.
|
|
||||||
|
|
||||||
package dataquery
|
|
||||||
|
|
||||||
// Defines values for NodesQueryType.
|
|
||||||
const (
|
|
||||||
NodesQueryTypeFeatureShowcase NodesQueryType = "feature_showcase"
|
|
||||||
NodesQueryTypeRandom NodesQueryType = "random"
|
|
||||||
NodesQueryTypeRandomEdges NodesQueryType = "random edges"
|
|
||||||
NodesQueryTypeResponseMedium NodesQueryType = "response_medium"
|
|
||||||
NodesQueryTypeResponseSmall NodesQueryType = "response_small"
|
|
||||||
)
|
|
||||||
|
|
||||||
// Defines values for StreamingQueryType.
|
|
||||||
const (
|
|
||||||
StreamingQueryTypeFetch StreamingQueryType = "fetch"
|
|
||||||
StreamingQueryTypeLogs StreamingQueryType = "logs"
|
|
||||||
StreamingQueryTypeSignal StreamingQueryType = "signal"
|
|
||||||
StreamingQueryTypeTraces StreamingQueryType = "traces"
|
|
||||||
)
|
|
||||||
|
|
||||||
// Defines values for TestDataDataQueryErrorType.
|
|
||||||
const (
|
|
||||||
TestDataDataQueryErrorTypeFrontendException TestDataDataQueryErrorType = "frontend_exception"
|
|
||||||
TestDataDataQueryErrorTypeFrontendObservable TestDataDataQueryErrorType = "frontend_observable"
|
|
||||||
TestDataDataQueryErrorTypeServerPanic TestDataDataQueryErrorType = "server_panic"
|
|
||||||
)
|
|
||||||
|
|
||||||
// Defines values for TestDataQueryType.
|
|
||||||
const (
|
|
||||||
TestDataQueryTypeAnnotations TestDataQueryType = "annotations"
|
|
||||||
TestDataQueryTypeArrow TestDataQueryType = "arrow"
|
|
||||||
TestDataQueryTypeCsvContent TestDataQueryType = "csv_content"
|
|
||||||
TestDataQueryTypeCsvFile TestDataQueryType = "csv_file"
|
|
||||||
TestDataQueryTypeCsvMetricValues TestDataQueryType = "csv_metric_values"
|
|
||||||
TestDataQueryTypeDatapointsOutsideRange TestDataQueryType = "datapoints_outside_range"
|
|
||||||
TestDataQueryTypeExponentialHeatmapBucketData TestDataQueryType = "exponential_heatmap_bucket_data"
|
|
||||||
TestDataQueryTypeFlameGraph TestDataQueryType = "flame_graph"
|
|
||||||
TestDataQueryTypeGrafanaApi TestDataQueryType = "grafana_api"
|
|
||||||
TestDataQueryTypeLinearHeatmapBucketData TestDataQueryType = "linear_heatmap_bucket_data"
|
|
||||||
TestDataQueryTypeLive TestDataQueryType = "live"
|
|
||||||
TestDataQueryTypeLogs TestDataQueryType = "logs"
|
|
||||||
TestDataQueryTypeManualEntry TestDataQueryType = "manual_entry"
|
|
||||||
TestDataQueryTypeNoDataPoints TestDataQueryType = "no_data_points"
|
|
||||||
TestDataQueryTypeNodeGraph TestDataQueryType = "node_graph"
|
|
||||||
TestDataQueryTypePredictableCsvWave TestDataQueryType = "predictable_csv_wave"
|
|
||||||
TestDataQueryTypePredictablePulse TestDataQueryType = "predictable_pulse"
|
|
||||||
TestDataQueryTypeRandomWalk TestDataQueryType = "random_walk"
|
|
||||||
TestDataQueryTypeRandomWalkTable TestDataQueryType = "random_walk_table"
|
|
||||||
TestDataQueryTypeRandomWalkWithError TestDataQueryType = "random_walk_with_error"
|
|
||||||
TestDataQueryTypeRawFrame TestDataQueryType = "raw_frame"
|
|
||||||
TestDataQueryTypeServerError500 TestDataQueryType = "server_error_500"
|
|
||||||
TestDataQueryTypeSimulation TestDataQueryType = "simulation"
|
|
||||||
TestDataQueryTypeSlowQuery TestDataQueryType = "slow_query"
|
|
||||||
TestDataQueryTypeStreamingClient TestDataQueryType = "streaming_client"
|
|
||||||
TestDataQueryTypeTableStatic TestDataQueryType = "table_static"
|
|
||||||
TestDataQueryTypeTrace TestDataQueryType = "trace"
|
|
||||||
TestDataQueryTypeUsa TestDataQueryType = "usa"
|
|
||||||
TestDataQueryTypeVariablesQuery TestDataQueryType = "variables-query"
|
|
||||||
)
|
|
||||||
|
|
||||||
// CSVWave defines model for CSVWave.
|
|
||||||
type CSVWave struct {
|
|
||||||
Labels *string `json:"labels,omitempty"`
|
|
||||||
Name *string `json:"name,omitempty"`
|
|
||||||
TimeStep *int64 `json:"timeStep,omitempty"`
|
|
||||||
ValuesCSV *string `json:"valuesCSV,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// These are the common properties available to all queries in all datasources.
|
|
||||||
// Specific implementations will *extend* this interface, adding the required
|
|
||||||
// properties for the given context.
|
|
||||||
type DataQuery struct {
|
|
||||||
// For mixed data sources the selected datasource is on the query level.
|
|
||||||
// For non mixed scenarios this is undefined.
|
|
||||||
// TODO find a better way to do this ^ that's friendly to schema
|
|
||||||
// TODO this shouldn't be unknown but DataSourceRef | null
|
|
||||||
Datasource *any `json:"datasource,omitempty"`
|
|
||||||
|
|
||||||
// If hide is set to true, Grafana will filter out the response(s) associated with this query before returning it to the panel.
|
|
||||||
Hide *bool `json:"hide,omitempty"`
|
|
||||||
|
|
||||||
// Specify the query flavor
|
|
||||||
// TODO make this required and give it a default
|
|
||||||
QueryType *string `json:"queryType,omitempty"`
|
|
||||||
|
|
||||||
// A unique identifier for the query within the list of targets.
|
|
||||||
// In server side expressions, the refId is used as a variable name to identify results.
|
|
||||||
// By default, the UI will assign A->Z; however setting meaningful names may be useful.
|
|
||||||
RefId string `json:"refId"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// NodesQuery defines model for NodesQuery.
|
|
||||||
type NodesQuery struct {
|
|
||||||
Count *int64 `json:"count,omitempty"`
|
|
||||||
Seed *int64 `json:"seed,omitempty"`
|
|
||||||
Type *NodesQueryType `json:"type,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// NodesQueryType defines model for NodesQuery.Type.
|
|
||||||
type NodesQueryType string
|
|
||||||
|
|
||||||
// PulseWaveQuery defines model for PulseWaveQuery.
|
|
||||||
type PulseWaveQuery struct {
|
|
||||||
OffCount *int64 `json:"offCount,omitempty"`
|
|
||||||
OffValue *float64 `json:"offValue,omitempty"`
|
|
||||||
OnCount *int64 `json:"onCount,omitempty"`
|
|
||||||
OnValue *float64 `json:"onValue,omitempty"`
|
|
||||||
TimeStep *int64 `json:"timeStep,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO: Should this live here given it's not used in the dataquery?
|
|
||||||
type Scenario struct {
|
|
||||||
Description *string `json:"description,omitempty"`
|
|
||||||
HideAliasField *bool `json:"hideAliasField,omitempty"`
|
|
||||||
Id string `json:"id"`
|
|
||||||
Name string `json:"name"`
|
|
||||||
StringInput string `json:"stringInput"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// SimulationQuery defines model for SimulationQuery.
|
|
||||||
type SimulationQuery struct {
|
|
||||||
Config map[string]any `json:"config,omitempty"`
|
|
||||||
Key struct {
|
|
||||||
Tick float64 `json:"tick"`
|
|
||||||
Type string `json:"type"`
|
|
||||||
Uid *string `json:"uid,omitempty"`
|
|
||||||
} `json:"key"`
|
|
||||||
Last *bool `json:"last,omitempty"`
|
|
||||||
Stream *bool `json:"stream,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// StreamingQuery defines model for StreamingQuery.
|
|
||||||
type StreamingQuery struct {
|
|
||||||
Bands *int32 `json:"bands,omitempty"`
|
|
||||||
Noise int32 `json:"noise"`
|
|
||||||
Speed int32 `json:"speed"`
|
|
||||||
Spread int32 `json:"spread"`
|
|
||||||
Type StreamingQueryType `json:"type"`
|
|
||||||
Url *string `json:"url,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// StreamingQueryType defines model for StreamingQuery.Type.
|
|
||||||
type StreamingQueryType string
|
|
||||||
|
|
||||||
// TestDataDataQuery defines model for TestDataDataQuery.
|
|
||||||
type TestDataDataQuery struct {
|
|
||||||
Alias *string `json:"alias,omitempty"`
|
|
||||||
Channel *string `json:"channel,omitempty"`
|
|
||||||
CsvContent *string `json:"csvContent,omitempty"`
|
|
||||||
CsvFileName *string `json:"csvFileName,omitempty"`
|
|
||||||
CsvWave []CSVWave `json:"csvWave,omitempty"`
|
|
||||||
|
|
||||||
// For mixed data sources the selected datasource is on the query level.
|
|
||||||
// For non mixed scenarios this is undefined.
|
|
||||||
// TODO find a better way to do this ^ that's friendly to schema
|
|
||||||
// TODO this shouldn't be unknown but DataSourceRef | null
|
|
||||||
Datasource *any `json:"datasource,omitempty"`
|
|
||||||
|
|
||||||
// Drop percentage (the chance we will lose a point 0-100)
|
|
||||||
DropPercent *float64 `json:"dropPercent,omitempty"`
|
|
||||||
ErrorType *TestDataDataQueryErrorType `json:"errorType,omitempty"`
|
|
||||||
FlamegraphDiff *bool `json:"flamegraphDiff,omitempty"`
|
|
||||||
|
|
||||||
// If hide is set to true, Grafana will filter out the response(s) associated with this query before returning it to the panel.
|
|
||||||
Hide *bool `json:"hide,omitempty"`
|
|
||||||
Labels *string `json:"labels,omitempty"`
|
|
||||||
LevelColumn *bool `json:"levelColumn,omitempty"`
|
|
||||||
Lines *int64 `json:"lines,omitempty"`
|
|
||||||
Nodes *NodesQuery `json:"nodes,omitempty"`
|
|
||||||
Points [][]any `json:"points,omitempty"`
|
|
||||||
PulseWave *PulseWaveQuery `json:"pulseWave,omitempty"`
|
|
||||||
|
|
||||||
// Specify the query flavor
|
|
||||||
// TODO make this required and give it a default
|
|
||||||
QueryType *string `json:"queryType,omitempty"`
|
|
||||||
RawFrameContent *string `json:"rawFrameContent,omitempty"`
|
|
||||||
|
|
||||||
// A unique identifier for the query within the list of targets.
|
|
||||||
// In server side expressions, the refId is used as a variable name to identify results.
|
|
||||||
// By default, the UI will assign A->Z; however setting meaningful names may be useful.
|
|
||||||
RefId *string `json:"refId,omitempty"`
|
|
||||||
ScenarioId *TestDataQueryType `json:"scenarioId,omitempty"`
|
|
||||||
SeriesCount *int32 `json:"seriesCount,omitempty"`
|
|
||||||
Sim *SimulationQuery `json:"sim,omitempty"`
|
|
||||||
SpanCount *int32 `json:"spanCount,omitempty"`
|
|
||||||
Stream *StreamingQuery `json:"stream,omitempty"`
|
|
||||||
StringInput *string `json:"stringInput,omitempty"`
|
|
||||||
Usa *USAQuery `json:"usa,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// TestDataDataQueryErrorType defines model for TestDataDataQuery.ErrorType.
|
|
||||||
type TestDataDataQueryErrorType string
|
|
||||||
|
|
||||||
// TestDataQueryType defines model for TestDataQueryType.
|
|
||||||
type TestDataQueryType string
|
|
||||||
|
|
||||||
// USAQuery defines model for USAQuery.
|
|
||||||
type USAQuery struct {
|
|
||||||
Fields []string `json:"fields,omitempty"`
|
|
||||||
Mode *string `json:"mode,omitempty"`
|
|
||||||
Period *string `json:"period,omitempty"`
|
|
||||||
States []string `json:"states,omitempty"`
|
|
||||||
}
|
|
178
pkg/tsdb/grafana-testdata-datasource/kinds/query.go
Normal file
178
pkg/tsdb/grafana-testdata-datasource/kinds/query.go
Normal file
@ -0,0 +1,178 @@
|
|||||||
|
package kinds
|
||||||
|
|
||||||
|
import (
|
||||||
|
"embed"
|
||||||
|
"encoding/json"
|
||||||
|
)
|
||||||
|
|
||||||
|
// NodesQueryType defines model for NodesQuery.Type.
|
||||||
|
// +enum
|
||||||
|
type NodesQueryType string
|
||||||
|
|
||||||
|
const (
|
||||||
|
NodesQueryTypeRandom NodesQueryType = "random"
|
||||||
|
NodesQueryTypeRandomEdges NodesQueryType = "random edges"
|
||||||
|
NodesQueryTypeResponseMedium NodesQueryType = "response_medium"
|
||||||
|
NodesQueryTypeResponseSmall NodesQueryType = "response_small"
|
||||||
|
NodesQueryTypeFeatureShowcase NodesQueryType = "feature_showcase"
|
||||||
|
)
|
||||||
|
|
||||||
|
// StreamingQueryType defines model for StreamingQuery.Type.
|
||||||
|
// +enum
|
||||||
|
type StreamingQueryType string
|
||||||
|
|
||||||
|
const (
|
||||||
|
StreamingQueryTypeFetch StreamingQueryType = "fetch"
|
||||||
|
StreamingQueryTypeLogs StreamingQueryType = "logs"
|
||||||
|
StreamingQueryTypeSignal StreamingQueryType = "signal"
|
||||||
|
StreamingQueryTypeTraces StreamingQueryType = "traces"
|
||||||
|
)
|
||||||
|
|
||||||
|
// ErrorType defines model for TestDataQuery.ErrorType.
|
||||||
|
// +enum
|
||||||
|
type ErrorType string
|
||||||
|
|
||||||
|
const (
|
||||||
|
ErrorTypeFrontendException ErrorType = "frontend_exception"
|
||||||
|
ErrorTypeFrontendObservable ErrorType = "frontend_observable"
|
||||||
|
ErrorTypeServerPanic ErrorType = "server_panic"
|
||||||
|
)
|
||||||
|
|
||||||
|
// TestDataQueryType defines model for TestDataQueryType.
|
||||||
|
// +enum
|
||||||
|
type TestDataQueryType string
|
||||||
|
|
||||||
|
// Defines values for TestDataQueryType.
|
||||||
|
const (
|
||||||
|
TestDataQueryTypeAnnotations TestDataQueryType = "annotations"
|
||||||
|
TestDataQueryTypeArrow TestDataQueryType = "arrow"
|
||||||
|
TestDataQueryTypeCsvContent TestDataQueryType = "csv_content"
|
||||||
|
TestDataQueryTypeCsvFile TestDataQueryType = "csv_file"
|
||||||
|
TestDataQueryTypeCsvMetricValues TestDataQueryType = "csv_metric_values"
|
||||||
|
TestDataQueryTypeDatapointsOutsideRange TestDataQueryType = "datapoints_outside_range"
|
||||||
|
TestDataQueryTypeExponentialHeatmapBucketData TestDataQueryType = "exponential_heatmap_bucket_data"
|
||||||
|
TestDataQueryTypeFlameGraph TestDataQueryType = "flame_graph"
|
||||||
|
TestDataQueryTypeGrafanaApi TestDataQueryType = "grafana_api"
|
||||||
|
TestDataQueryTypeLinearHeatmapBucketData TestDataQueryType = "linear_heatmap_bucket_data"
|
||||||
|
TestDataQueryTypeLive TestDataQueryType = "live"
|
||||||
|
TestDataQueryTypeLogs TestDataQueryType = "logs"
|
||||||
|
TestDataQueryTypeManualEntry TestDataQueryType = "manual_entry"
|
||||||
|
TestDataQueryTypeNoDataPoints TestDataQueryType = "no_data_points"
|
||||||
|
TestDataQueryTypeNodeGraph TestDataQueryType = "node_graph"
|
||||||
|
TestDataQueryTypePredictableCsvWave TestDataQueryType = "predictable_csv_wave"
|
||||||
|
TestDataQueryTypePredictablePulse TestDataQueryType = "predictable_pulse"
|
||||||
|
TestDataQueryTypeRandomWalk TestDataQueryType = "random_walk"
|
||||||
|
TestDataQueryTypeRandomWalkTable TestDataQueryType = "random_walk_table"
|
||||||
|
TestDataQueryTypeRandomWalkWithError TestDataQueryType = "random_walk_with_error"
|
||||||
|
TestDataQueryTypeRawFrame TestDataQueryType = "raw_frame"
|
||||||
|
TestDataQueryTypeServerError500 TestDataQueryType = "server_error_500"
|
||||||
|
TestDataQueryTypeSimulation TestDataQueryType = "simulation"
|
||||||
|
TestDataQueryTypeSlowQuery TestDataQueryType = "slow_query"
|
||||||
|
TestDataQueryTypeStreamingClient TestDataQueryType = "streaming_client"
|
||||||
|
TestDataQueryTypeTableStatic TestDataQueryType = "table_static"
|
||||||
|
TestDataQueryTypeTrace TestDataQueryType = "trace"
|
||||||
|
TestDataQueryTypeUsa TestDataQueryType = "usa"
|
||||||
|
TestDataQueryTypeVariablesQuery TestDataQueryType = "variables-query"
|
||||||
|
)
|
||||||
|
|
||||||
|
// TestDataQuery defines model for TestDataQuery.
|
||||||
|
type TestDataQuery struct {
|
||||||
|
ScenarioId TestDataQueryType `json:"scenarioId,omitempty"`
|
||||||
|
Alias string `json:"alias,omitempty"`
|
||||||
|
Labels string `json:"labels,omitempty"`
|
||||||
|
|
||||||
|
// common parameter used by many query types
|
||||||
|
StringInput string `json:"stringInput,omitempty"`
|
||||||
|
|
||||||
|
CsvContent string `json:"csvContent,omitempty"`
|
||||||
|
CsvFileName string `json:"csvFileName,omitempty"`
|
||||||
|
CsvWave []CSVWave `json:"csvWave,omitempty"`
|
||||||
|
|
||||||
|
// Used for live query
|
||||||
|
Channel string `json:"channel,omitempty"`
|
||||||
|
|
||||||
|
// Drop percentage (the chance we will lose a point 0-100)
|
||||||
|
DropPercent float64 `json:"dropPercent,omitempty"`
|
||||||
|
ErrorType ErrorType `json:"errorType,omitempty"`
|
||||||
|
FlamegraphDiff bool `json:"flamegraphDiff,omitempty"`
|
||||||
|
LevelColumn bool `json:"levelColumn,omitempty"`
|
||||||
|
StartValue float64 `json:"startValue,omitempty"`
|
||||||
|
Spread float64 `json:"spread,omitempty"`
|
||||||
|
Noise float64 `json:"noise,omitempty"`
|
||||||
|
Min *float64 `json:"min,omitempty"`
|
||||||
|
Max *float64 `json:"max,omitempty"`
|
||||||
|
WithNil bool `json:"withNil,omitempty"`
|
||||||
|
Lines int64 `json:"lines,omitempty"`
|
||||||
|
Points [][]any `json:"points,omitempty"`
|
||||||
|
RawFrameContent string `json:"rawFrameContent,omitempty"`
|
||||||
|
SeriesCount int `json:"seriesCount,omitempty"`
|
||||||
|
SpanCount int `json:"spanCount,omitempty"`
|
||||||
|
|
||||||
|
Nodes *NodesQuery `json:"nodes,omitempty"`
|
||||||
|
PulseWave *PulseWaveQuery `json:"pulseWave,omitempty"`
|
||||||
|
Sim *SimulationQuery `json:"sim,omitempty"`
|
||||||
|
Stream *StreamingQuery `json:"stream,omitempty"`
|
||||||
|
Usa *USAQuery `json:"usa,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// CSVWave defines model for CSVWave.
|
||||||
|
type CSVWave struct {
|
||||||
|
TimeStep int64 `json:"timeStep,omitempty"`
|
||||||
|
ValuesCSV string `json:"valuesCSV,omitempty"`
|
||||||
|
Labels string `json:"labels,omitempty"`
|
||||||
|
Name string `json:"name,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// NodesQuery defines model for NodesQuery.
|
||||||
|
type NodesQuery struct {
|
||||||
|
Count int64 `json:"count,omitempty"`
|
||||||
|
Seed int64 `json:"seed,omitempty"`
|
||||||
|
Type NodesQueryType `json:"type,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// PulseWaveQuery defines model for PulseWaveQuery.
|
||||||
|
type PulseWaveQuery struct {
|
||||||
|
OffCount int64 `json:"offCount,omitempty"`
|
||||||
|
OffValue float64 `json:"offValue,omitempty"`
|
||||||
|
OnCount int64 `json:"onCount,omitempty"`
|
||||||
|
OnValue float64 `json:"onValue,omitempty"`
|
||||||
|
TimeStep int64 `json:"timeStep,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// SimulationQuery defines model for SimulationQuery.
|
||||||
|
type SimulationQuery struct {
|
||||||
|
Config map[string]any `json:"config,omitempty"`
|
||||||
|
Key struct {
|
||||||
|
Tick float64 `json:"tick"`
|
||||||
|
Type string `json:"type"`
|
||||||
|
Uid *string `json:"uid,omitempty"`
|
||||||
|
} `json:"key"`
|
||||||
|
Last bool `json:"last,omitempty"`
|
||||||
|
Stream bool `json:"stream,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// StreamingQuery defines model for StreamingQuery.
|
||||||
|
type StreamingQuery struct {
|
||||||
|
Bands int32 `json:"bands,omitempty"`
|
||||||
|
Noise float64 `json:"noise"`
|
||||||
|
Speed float64 `json:"speed"`
|
||||||
|
Spread float64 `json:"spread"`
|
||||||
|
Type StreamingQueryType `json:"type"`
|
||||||
|
Url string `json:"url,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// USAQuery defines model for USAQuery.
|
||||||
|
type USAQuery struct {
|
||||||
|
Fields []string `json:"fields,omitempty"`
|
||||||
|
Mode string `json:"mode,omitempty"`
|
||||||
|
Period string `json:"period,omitempty"`
|
||||||
|
States []string `json:"states,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
//go:embed query.types.json
|
||||||
|
var f embed.FS
|
||||||
|
|
||||||
|
// QueryTypeDefinitionsJSON returns the query type definitions
|
||||||
|
func QueryTypeDefinitionsJSON() (json.RawMessage, error) {
|
||||||
|
return f.ReadFile("query.types.json")
|
||||||
|
}
|
@ -0,0 +1,28 @@
|
|||||||
|
{
|
||||||
|
"type": "table",
|
||||||
|
"targets": [
|
||||||
|
{
|
||||||
|
"refId": "A",
|
||||||
|
"datasource": {
|
||||||
|
"type": "grafana-testdata-datasource",
|
||||||
|
"uid": "TheUID"
|
||||||
|
},
|
||||||
|
"scenarioId": "random_walk"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"refId": "B",
|
||||||
|
"datasource": {
|
||||||
|
"type": "grafana-testdata-datasource",
|
||||||
|
"uid": "TheUID"
|
||||||
|
},
|
||||||
|
"pulseWave": {
|
||||||
|
"offCount": 20,
|
||||||
|
"offValue": 1.23,
|
||||||
|
"onCount": 10,
|
||||||
|
"onValue": 4.56,
|
||||||
|
"timeStep": 1000
|
||||||
|
},
|
||||||
|
"scenarioId": "predictable_pulse"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
@ -0,0 +1,411 @@
|
|||||||
|
{
|
||||||
|
"type": "object",
|
||||||
|
"required": [
|
||||||
|
"targets",
|
||||||
|
"type"
|
||||||
|
],
|
||||||
|
"properties": {
|
||||||
|
"targets": {
|
||||||
|
"type": "array",
|
||||||
|
"items": {
|
||||||
|
"description": "TestDataQuery defines model for TestDataQuery.",
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"alias": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"channel": {
|
||||||
|
"description": "Used for live query",
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"csvContent": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"csvFileName": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"csvWave": {
|
||||||
|
"type": "array",
|
||||||
|
"items": {
|
||||||
|
"description": "CSVWave defines model for CSVWave.",
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"labels": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"name": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"timeStep": {
|
||||||
|
"type": "integer"
|
||||||
|
},
|
||||||
|
"valuesCSV": {
|
||||||
|
"type": "string"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"additionalProperties": false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"datasource": {
|
||||||
|
"description": "The datasource",
|
||||||
|
"type": "object",
|
||||||
|
"required": [
|
||||||
|
"type"
|
||||||
|
],
|
||||||
|
"properties": {
|
||||||
|
"type": {
|
||||||
|
"description": "The datasource plugin type",
|
||||||
|
"type": "string",
|
||||||
|
"pattern": "^grafana-testdata-datasource$|^testdata$"
|
||||||
|
},
|
||||||
|
"uid": {
|
||||||
|
"description": "Datasource UID",
|
||||||
|
"type": "string"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"additionalProperties": false
|
||||||
|
},
|
||||||
|
"dropPercent": {
|
||||||
|
"description": "Drop percentage (the chance we will lose a point 0-100)",
|
||||||
|
"type": "number"
|
||||||
|
},
|
||||||
|
"errorType": {
|
||||||
|
"description": "Possible enum values:\n - `\"frontend_exception\"` \n - `\"frontend_observable\"` \n - `\"server_panic\"` ",
|
||||||
|
"type": "string",
|
||||||
|
"enum": [
|
||||||
|
"frontend_exception",
|
||||||
|
"frontend_observable",
|
||||||
|
"server_panic"
|
||||||
|
],
|
||||||
|
"x-enum-description": {}
|
||||||
|
},
|
||||||
|
"flamegraphDiff": {
|
||||||
|
"type": "boolean"
|
||||||
|
},
|
||||||
|
"hide": {
|
||||||
|
"description": "true if query is disabled (ie should not be returned to the dashboard)\nNOTE: this does not always imply that the query should not be executed since\nthe results from a hidden query may be used as the input to other queries (SSE etc)",
|
||||||
|
"type": "boolean"
|
||||||
|
},
|
||||||
|
"intervalMs": {
|
||||||
|
"description": "Interval is the suggested duration between time points in a time series query.\nNOTE: the values for intervalMs is not saved in the query model. It is typically calculated\nfrom the interval required to fill a pixels in the visualization",
|
||||||
|
"type": "number"
|
||||||
|
},
|
||||||
|
"labels": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"levelColumn": {
|
||||||
|
"type": "boolean"
|
||||||
|
},
|
||||||
|
"lines": {
|
||||||
|
"type": "integer"
|
||||||
|
},
|
||||||
|
"max": {
|
||||||
|
"type": "number"
|
||||||
|
},
|
||||||
|
"maxDataPoints": {
|
||||||
|
"description": "MaxDataPoints is the maximum number of data points that should be returned from a time series query.\nNOTE: the values for maxDataPoints is not saved in the query model. It is typically calculated\nfrom the number of pixels visible in a visualization",
|
||||||
|
"type": "integer"
|
||||||
|
},
|
||||||
|
"min": {
|
||||||
|
"type": "number"
|
||||||
|
},
|
||||||
|
"nodes": {
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"count": {
|
||||||
|
"type": "integer"
|
||||||
|
},
|
||||||
|
"seed": {
|
||||||
|
"type": "integer"
|
||||||
|
},
|
||||||
|
"type": {
|
||||||
|
"description": "Possible enum values:\n - `\"random\"` \n - `\"random edges\"` \n - `\"response_medium\"` \n - `\"response_small\"` \n - `\"feature_showcase\"` ",
|
||||||
|
"type": "string",
|
||||||
|
"enum": [
|
||||||
|
"random",
|
||||||
|
"random edges",
|
||||||
|
"response_medium",
|
||||||
|
"response_small",
|
||||||
|
"feature_showcase"
|
||||||
|
],
|
||||||
|
"x-enum-description": {}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"additionalProperties": false
|
||||||
|
},
|
||||||
|
"noise": {
|
||||||
|
"type": "number"
|
||||||
|
},
|
||||||
|
"points": {
|
||||||
|
"type": "array",
|
||||||
|
"items": {
|
||||||
|
"type": "array"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"pulseWave": {
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"offCount": {
|
||||||
|
"type": "integer"
|
||||||
|
},
|
||||||
|
"offValue": {
|
||||||
|
"type": "number"
|
||||||
|
},
|
||||||
|
"onCount": {
|
||||||
|
"type": "integer"
|
||||||
|
},
|
||||||
|
"onValue": {
|
||||||
|
"type": "number"
|
||||||
|
},
|
||||||
|
"timeStep": {
|
||||||
|
"type": "integer"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"additionalProperties": false
|
||||||
|
},
|
||||||
|
"queryType": {
|
||||||
|
"description": "QueryType is an optional identifier for the type of query.\nIt can be used to distinguish different types of queries.",
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"rawFrameContent": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"refId": {
|
||||||
|
"description": "RefID is the unique identifier of the query, set by the frontend call.",
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"resultAssertions": {
|
||||||
|
"description": "Optionally define expected query result behavior",
|
||||||
|
"type": "object",
|
||||||
|
"required": [
|
||||||
|
"typeVersion"
|
||||||
|
],
|
||||||
|
"properties": {
|
||||||
|
"maxFrames": {
|
||||||
|
"description": "Maximum frame count",
|
||||||
|
"type": "integer"
|
||||||
|
},
|
||||||
|
"type": {
|
||||||
|
"description": "Type asserts that the frame matches a known type structure.\n\n\nPossible enum values:\n - `\"\"` \n - `\"timeseries-wide\"` \n - `\"timeseries-long\"` \n - `\"timeseries-many\"` \n - `\"timeseries-multi\"` \n - `\"directory-listing\"` \n - `\"table\"` \n - `\"numeric-wide\"` \n - `\"numeric-multi\"` \n - `\"numeric-long\"` \n - `\"log-lines\"` ",
|
||||||
|
"type": "string",
|
||||||
|
"enum": [
|
||||||
|
"",
|
||||||
|
"timeseries-wide",
|
||||||
|
"timeseries-long",
|
||||||
|
"timeseries-many",
|
||||||
|
"timeseries-multi",
|
||||||
|
"directory-listing",
|
||||||
|
"table",
|
||||||
|
"numeric-wide",
|
||||||
|
"numeric-multi",
|
||||||
|
"numeric-long",
|
||||||
|
"log-lines"
|
||||||
|
],
|
||||||
|
"x-enum-description": {}
|
||||||
|
},
|
||||||
|
"typeVersion": {
|
||||||
|
"description": "TypeVersion is the version of the Type property. Versions greater than 0.0 correspond to the dataplane\ncontract documentation https://grafana.github.io/dataplane/contract/.",
|
||||||
|
"type": "array",
|
||||||
|
"maxItems": 2,
|
||||||
|
"minItems": 2,
|
||||||
|
"items": {
|
||||||
|
"type": "integer"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"additionalProperties": false
|
||||||
|
},
|
||||||
|
"scenarioId": {
|
||||||
|
"description": "Possible enum values:\n - `\"annotations\"` \n - `\"arrow\"` \n - `\"csv_content\"` \n - `\"csv_file\"` \n - `\"csv_metric_values\"` \n - `\"datapoints_outside_range\"` \n - `\"exponential_heatmap_bucket_data\"` \n - `\"flame_graph\"` \n - `\"grafana_api\"` \n - `\"linear_heatmap_bucket_data\"` \n - `\"live\"` \n - `\"logs\"` \n - `\"manual_entry\"` \n - `\"no_data_points\"` \n - `\"node_graph\"` \n - `\"predictable_csv_wave\"` \n - `\"predictable_pulse\"` \n - `\"random_walk\"` \n - `\"random_walk_table\"` \n - `\"random_walk_with_error\"` \n - `\"raw_frame\"` \n - `\"server_error_500\"` \n - `\"simulation\"` \n - `\"slow_query\"` \n - `\"streaming_client\"` \n - `\"table_static\"` \n - `\"trace\"` \n - `\"usa\"` \n - `\"variables-query\"` ",
|
||||||
|
"type": "string",
|
||||||
|
"enum": [
|
||||||
|
"annotations",
|
||||||
|
"arrow",
|
||||||
|
"csv_content",
|
||||||
|
"csv_file",
|
||||||
|
"csv_metric_values",
|
||||||
|
"datapoints_outside_range",
|
||||||
|
"exponential_heatmap_bucket_data",
|
||||||
|
"flame_graph",
|
||||||
|
"grafana_api",
|
||||||
|
"linear_heatmap_bucket_data",
|
||||||
|
"live",
|
||||||
|
"logs",
|
||||||
|
"manual_entry",
|
||||||
|
"no_data_points",
|
||||||
|
"node_graph",
|
||||||
|
"predictable_csv_wave",
|
||||||
|
"predictable_pulse",
|
||||||
|
"random_walk",
|
||||||
|
"random_walk_table",
|
||||||
|
"random_walk_with_error",
|
||||||
|
"raw_frame",
|
||||||
|
"server_error_500",
|
||||||
|
"simulation",
|
||||||
|
"slow_query",
|
||||||
|
"streaming_client",
|
||||||
|
"table_static",
|
||||||
|
"trace",
|
||||||
|
"usa",
|
||||||
|
"variables-query"
|
||||||
|
],
|
||||||
|
"x-enum-description": {}
|
||||||
|
},
|
||||||
|
"seriesCount": {
|
||||||
|
"type": "integer"
|
||||||
|
},
|
||||||
|
"sim": {
|
||||||
|
"type": "object",
|
||||||
|
"required": [
|
||||||
|
"key"
|
||||||
|
],
|
||||||
|
"properties": {
|
||||||
|
"config": {
|
||||||
|
"type": "object"
|
||||||
|
},
|
||||||
|
"key": {
|
||||||
|
"type": "object",
|
||||||
|
"required": [
|
||||||
|
"tick",
|
||||||
|
"type"
|
||||||
|
],
|
||||||
|
"properties": {
|
||||||
|
"tick": {
|
||||||
|
"type": "number"
|
||||||
|
},
|
||||||
|
"type": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"uid": {
|
||||||
|
"type": "string"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"additionalProperties": false
|
||||||
|
},
|
||||||
|
"last": {
|
||||||
|
"type": "boolean"
|
||||||
|
},
|
||||||
|
"stream": {
|
||||||
|
"type": "boolean"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"additionalProperties": false
|
||||||
|
},
|
||||||
|
"spanCount": {
|
||||||
|
"type": "integer"
|
||||||
|
},
|
||||||
|
"spread": {
|
||||||
|
"type": "number"
|
||||||
|
},
|
||||||
|
"startValue": {
|
||||||
|
"type": "number"
|
||||||
|
},
|
||||||
|
"stream": {
|
||||||
|
"type": "object",
|
||||||
|
"required": [
|
||||||
|
"noise",
|
||||||
|
"speed",
|
||||||
|
"spread",
|
||||||
|
"type"
|
||||||
|
],
|
||||||
|
"properties": {
|
||||||
|
"bands": {
|
||||||
|
"type": "integer"
|
||||||
|
},
|
||||||
|
"noise": {
|
||||||
|
"type": "number"
|
||||||
|
},
|
||||||
|
"speed": {
|
||||||
|
"type": "number"
|
||||||
|
},
|
||||||
|
"spread": {
|
||||||
|
"type": "number"
|
||||||
|
},
|
||||||
|
"type": {
|
||||||
|
"description": "Possible enum values:\n - `\"fetch\"` \n - `\"logs\"` \n - `\"signal\"` \n - `\"traces\"` ",
|
||||||
|
"type": "string",
|
||||||
|
"enum": [
|
||||||
|
"fetch",
|
||||||
|
"logs",
|
||||||
|
"signal",
|
||||||
|
"traces"
|
||||||
|
],
|
||||||
|
"x-enum-description": {}
|
||||||
|
},
|
||||||
|
"url": {
|
||||||
|
"type": "string"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"additionalProperties": false
|
||||||
|
},
|
||||||
|
"stringInput": {
|
||||||
|
"description": "common parameter used by many query types",
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"timeRange": {
|
||||||
|
"description": "TimeRange represents the query range\nNOTE: unlike generic /ds/query, we can now send explicit time values in each query\nNOTE: the values for timeRange are not saved in a dashboard, they are constructed on the fly",
|
||||||
|
"type": "object",
|
||||||
|
"required": [
|
||||||
|
"from",
|
||||||
|
"to"
|
||||||
|
],
|
||||||
|
"properties": {
|
||||||
|
"from": {
|
||||||
|
"description": "From is the start time of the query.",
|
||||||
|
"type": "string",
|
||||||
|
"default": "now-6h",
|
||||||
|
"examples": [
|
||||||
|
"now-1h"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"to": {
|
||||||
|
"description": "To is the end time of the query.",
|
||||||
|
"type": "string",
|
||||||
|
"default": "now",
|
||||||
|
"examples": [
|
||||||
|
"now"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"additionalProperties": false
|
||||||
|
},
|
||||||
|
"usa": {
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"fields": {
|
||||||
|
"type": "array",
|
||||||
|
"items": {
|
||||||
|
"type": "string"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"mode": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"period": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"states": {
|
||||||
|
"type": "array",
|
||||||
|
"items": {
|
||||||
|
"type": "string"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"additionalProperties": false
|
||||||
|
},
|
||||||
|
"withNil": {
|
||||||
|
"type": "boolean"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"additionalProperties": false,
|
||||||
|
"$schema": "https://json-schema.org/draft-04/schema#"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"type": {
|
||||||
|
"description": "the panel type",
|
||||||
|
"type": "string"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"additionalProperties": true,
|
||||||
|
"$schema": "https://json-schema.org/draft-04/schema#"
|
||||||
|
}
|
@ -0,0 +1,25 @@
|
|||||||
|
{
|
||||||
|
"from": "now-1h",
|
||||||
|
"to": "now",
|
||||||
|
"queries": [
|
||||||
|
{
|
||||||
|
"refId": "A",
|
||||||
|
"maxDataPoints": 1000,
|
||||||
|
"intervalMs": 5,
|
||||||
|
"scenarioId": "random_walk"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"refId": "B",
|
||||||
|
"maxDataPoints": 1000,
|
||||||
|
"intervalMs": 5,
|
||||||
|
"pulseWave": {
|
||||||
|
"offCount": 20,
|
||||||
|
"offValue": 1.23,
|
||||||
|
"onCount": 10,
|
||||||
|
"onValue": 4.56,
|
||||||
|
"timeStep": 1000
|
||||||
|
},
|
||||||
|
"scenarioId": "predictable_pulse"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
@ -0,0 +1,421 @@
|
|||||||
|
{
|
||||||
|
"type": "object",
|
||||||
|
"required": [
|
||||||
|
"queries"
|
||||||
|
],
|
||||||
|
"properties": {
|
||||||
|
"$schema": {
|
||||||
|
"description": "helper",
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"debug": {
|
||||||
|
"type": "boolean"
|
||||||
|
},
|
||||||
|
"from": {
|
||||||
|
"description": "From Start time in epoch timestamps in milliseconds or relative using Grafana time units.",
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"queries": {
|
||||||
|
"type": "array",
|
||||||
|
"items": {
|
||||||
|
"description": "TestDataQuery defines model for TestDataQuery.",
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"alias": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"channel": {
|
||||||
|
"description": "Used for live query",
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"csvContent": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"csvFileName": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"csvWave": {
|
||||||
|
"type": "array",
|
||||||
|
"items": {
|
||||||
|
"description": "CSVWave defines model for CSVWave.",
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"labels": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"name": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"timeStep": {
|
||||||
|
"type": "integer"
|
||||||
|
},
|
||||||
|
"valuesCSV": {
|
||||||
|
"type": "string"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"additionalProperties": false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"datasource": {
|
||||||
|
"description": "The datasource",
|
||||||
|
"type": "object",
|
||||||
|
"required": [
|
||||||
|
"type"
|
||||||
|
],
|
||||||
|
"properties": {
|
||||||
|
"type": {
|
||||||
|
"description": "The datasource plugin type",
|
||||||
|
"type": "string",
|
||||||
|
"pattern": "^grafana-testdata-datasource$|^testdata$"
|
||||||
|
},
|
||||||
|
"uid": {
|
||||||
|
"description": "Datasource UID",
|
||||||
|
"type": "string"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"additionalProperties": false
|
||||||
|
},
|
||||||
|
"dropPercent": {
|
||||||
|
"description": "Drop percentage (the chance we will lose a point 0-100)",
|
||||||
|
"type": "number"
|
||||||
|
},
|
||||||
|
"errorType": {
|
||||||
|
"description": "Possible enum values:\n - `\"frontend_exception\"` \n - `\"frontend_observable\"` \n - `\"server_panic\"` ",
|
||||||
|
"type": "string",
|
||||||
|
"enum": [
|
||||||
|
"frontend_exception",
|
||||||
|
"frontend_observable",
|
||||||
|
"server_panic"
|
||||||
|
],
|
||||||
|
"x-enum-description": {}
|
||||||
|
},
|
||||||
|
"flamegraphDiff": {
|
||||||
|
"type": "boolean"
|
||||||
|
},
|
||||||
|
"hide": {
|
||||||
|
"description": "true if query is disabled (ie should not be returned to the dashboard)\nNOTE: this does not always imply that the query should not be executed since\nthe results from a hidden query may be used as the input to other queries (SSE etc)",
|
||||||
|
"type": "boolean"
|
||||||
|
},
|
||||||
|
"intervalMs": {
|
||||||
|
"description": "Interval is the suggested duration between time points in a time series query.\nNOTE: the values for intervalMs is not saved in the query model. It is typically calculated\nfrom the interval required to fill a pixels in the visualization",
|
||||||
|
"type": "number"
|
||||||
|
},
|
||||||
|
"labels": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"levelColumn": {
|
||||||
|
"type": "boolean"
|
||||||
|
},
|
||||||
|
"lines": {
|
||||||
|
"type": "integer"
|
||||||
|
},
|
||||||
|
"max": {
|
||||||
|
"type": "number"
|
||||||
|
},
|
||||||
|
"maxDataPoints": {
|
||||||
|
"description": "MaxDataPoints is the maximum number of data points that should be returned from a time series query.\nNOTE: the values for maxDataPoints is not saved in the query model. It is typically calculated\nfrom the number of pixels visible in a visualization",
|
||||||
|
"type": "integer"
|
||||||
|
},
|
||||||
|
"min": {
|
||||||
|
"type": "number"
|
||||||
|
},
|
||||||
|
"nodes": {
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"count": {
|
||||||
|
"type": "integer"
|
||||||
|
},
|
||||||
|
"seed": {
|
||||||
|
"type": "integer"
|
||||||
|
},
|
||||||
|
"type": {
|
||||||
|
"description": "Possible enum values:\n - `\"random\"` \n - `\"random edges\"` \n - `\"response_medium\"` \n - `\"response_small\"` \n - `\"feature_showcase\"` ",
|
||||||
|
"type": "string",
|
||||||
|
"enum": [
|
||||||
|
"random",
|
||||||
|
"random edges",
|
||||||
|
"response_medium",
|
||||||
|
"response_small",
|
||||||
|
"feature_showcase"
|
||||||
|
],
|
||||||
|
"x-enum-description": {}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"additionalProperties": false
|
||||||
|
},
|
||||||
|
"noise": {
|
||||||
|
"type": "number"
|
||||||
|
},
|
||||||
|
"points": {
|
||||||
|
"type": "array",
|
||||||
|
"items": {
|
||||||
|
"type": "array"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"pulseWave": {
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"offCount": {
|
||||||
|
"type": "integer"
|
||||||
|
},
|
||||||
|
"offValue": {
|
||||||
|
"type": "number"
|
||||||
|
},
|
||||||
|
"onCount": {
|
||||||
|
"type": "integer"
|
||||||
|
},
|
||||||
|
"onValue": {
|
||||||
|
"type": "number"
|
||||||
|
},
|
||||||
|
"timeStep": {
|
||||||
|
"type": "integer"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"additionalProperties": false
|
||||||
|
},
|
||||||
|
"queryType": {
|
||||||
|
"description": "QueryType is an optional identifier for the type of query.\nIt can be used to distinguish different types of queries.",
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"rawFrameContent": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"refId": {
|
||||||
|
"description": "RefID is the unique identifier of the query, set by the frontend call.",
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"resultAssertions": {
|
||||||
|
"description": "Optionally define expected query result behavior",
|
||||||
|
"type": "object",
|
||||||
|
"required": [
|
||||||
|
"typeVersion"
|
||||||
|
],
|
||||||
|
"properties": {
|
||||||
|
"maxFrames": {
|
||||||
|
"description": "Maximum frame count",
|
||||||
|
"type": "integer"
|
||||||
|
},
|
||||||
|
"type": {
|
||||||
|
"description": "Type asserts that the frame matches a known type structure.\n\n\nPossible enum values:\n - `\"\"` \n - `\"timeseries-wide\"` \n - `\"timeseries-long\"` \n - `\"timeseries-many\"` \n - `\"timeseries-multi\"` \n - `\"directory-listing\"` \n - `\"table\"` \n - `\"numeric-wide\"` \n - `\"numeric-multi\"` \n - `\"numeric-long\"` \n - `\"log-lines\"` ",
|
||||||
|
"type": "string",
|
||||||
|
"enum": [
|
||||||
|
"",
|
||||||
|
"timeseries-wide",
|
||||||
|
"timeseries-long",
|
||||||
|
"timeseries-many",
|
||||||
|
"timeseries-multi",
|
||||||
|
"directory-listing",
|
||||||
|
"table",
|
||||||
|
"numeric-wide",
|
||||||
|
"numeric-multi",
|
||||||
|
"numeric-long",
|
||||||
|
"log-lines"
|
||||||
|
],
|
||||||
|
"x-enum-description": {}
|
||||||
|
},
|
||||||
|
"typeVersion": {
|
||||||
|
"description": "TypeVersion is the version of the Type property. Versions greater than 0.0 correspond to the dataplane\ncontract documentation https://grafana.github.io/dataplane/contract/.",
|
||||||
|
"type": "array",
|
||||||
|
"maxItems": 2,
|
||||||
|
"minItems": 2,
|
||||||
|
"items": {
|
||||||
|
"type": "integer"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"additionalProperties": false
|
||||||
|
},
|
||||||
|
"scenarioId": {
|
||||||
|
"description": "Possible enum values:\n - `\"annotations\"` \n - `\"arrow\"` \n - `\"csv_content\"` \n - `\"csv_file\"` \n - `\"csv_metric_values\"` \n - `\"datapoints_outside_range\"` \n - `\"exponential_heatmap_bucket_data\"` \n - `\"flame_graph\"` \n - `\"grafana_api\"` \n - `\"linear_heatmap_bucket_data\"` \n - `\"live\"` \n - `\"logs\"` \n - `\"manual_entry\"` \n - `\"no_data_points\"` \n - `\"node_graph\"` \n - `\"predictable_csv_wave\"` \n - `\"predictable_pulse\"` \n - `\"random_walk\"` \n - `\"random_walk_table\"` \n - `\"random_walk_with_error\"` \n - `\"raw_frame\"` \n - `\"server_error_500\"` \n - `\"simulation\"` \n - `\"slow_query\"` \n - `\"streaming_client\"` \n - `\"table_static\"` \n - `\"trace\"` \n - `\"usa\"` \n - `\"variables-query\"` ",
|
||||||
|
"type": "string",
|
||||||
|
"enum": [
|
||||||
|
"annotations",
|
||||||
|
"arrow",
|
||||||
|
"csv_content",
|
||||||
|
"csv_file",
|
||||||
|
"csv_metric_values",
|
||||||
|
"datapoints_outside_range",
|
||||||
|
"exponential_heatmap_bucket_data",
|
||||||
|
"flame_graph",
|
||||||
|
"grafana_api",
|
||||||
|
"linear_heatmap_bucket_data",
|
||||||
|
"live",
|
||||||
|
"logs",
|
||||||
|
"manual_entry",
|
||||||
|
"no_data_points",
|
||||||
|
"node_graph",
|
||||||
|
"predictable_csv_wave",
|
||||||
|
"predictable_pulse",
|
||||||
|
"random_walk",
|
||||||
|
"random_walk_table",
|
||||||
|
"random_walk_with_error",
|
||||||
|
"raw_frame",
|
||||||
|
"server_error_500",
|
||||||
|
"simulation",
|
||||||
|
"slow_query",
|
||||||
|
"streaming_client",
|
||||||
|
"table_static",
|
||||||
|
"trace",
|
||||||
|
"usa",
|
||||||
|
"variables-query"
|
||||||
|
],
|
||||||
|
"x-enum-description": {}
|
||||||
|
},
|
||||||
|
"seriesCount": {
|
||||||
|
"type": "integer"
|
||||||
|
},
|
||||||
|
"sim": {
|
||||||
|
"type": "object",
|
||||||
|
"required": [
|
||||||
|
"key"
|
||||||
|
],
|
||||||
|
"properties": {
|
||||||
|
"config": {
|
||||||
|
"type": "object"
|
||||||
|
},
|
||||||
|
"key": {
|
||||||
|
"type": "object",
|
||||||
|
"required": [
|
||||||
|
"tick",
|
||||||
|
"type"
|
||||||
|
],
|
||||||
|
"properties": {
|
||||||
|
"tick": {
|
||||||
|
"type": "number"
|
||||||
|
},
|
||||||
|
"type": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"uid": {
|
||||||
|
"type": "string"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"additionalProperties": false
|
||||||
|
},
|
||||||
|
"last": {
|
||||||
|
"type": "boolean"
|
||||||
|
},
|
||||||
|
"stream": {
|
||||||
|
"type": "boolean"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"additionalProperties": false
|
||||||
|
},
|
||||||
|
"spanCount": {
|
||||||
|
"type": "integer"
|
||||||
|
},
|
||||||
|
"spread": {
|
||||||
|
"type": "number"
|
||||||
|
},
|
||||||
|
"startValue": {
|
||||||
|
"type": "number"
|
||||||
|
},
|
||||||
|
"stream": {
|
||||||
|
"type": "object",
|
||||||
|
"required": [
|
||||||
|
"noise",
|
||||||
|
"speed",
|
||||||
|
"spread",
|
||||||
|
"type"
|
||||||
|
],
|
||||||
|
"properties": {
|
||||||
|
"bands": {
|
||||||
|
"type": "integer"
|
||||||
|
},
|
||||||
|
"noise": {
|
||||||
|
"type": "number"
|
||||||
|
},
|
||||||
|
"speed": {
|
||||||
|
"type": "number"
|
||||||
|
},
|
||||||
|
"spread": {
|
||||||
|
"type": "number"
|
||||||
|
},
|
||||||
|
"type": {
|
||||||
|
"description": "Possible enum values:\n - `\"fetch\"` \n - `\"logs\"` \n - `\"signal\"` \n - `\"traces\"` ",
|
||||||
|
"type": "string",
|
||||||
|
"enum": [
|
||||||
|
"fetch",
|
||||||
|
"logs",
|
||||||
|
"signal",
|
||||||
|
"traces"
|
||||||
|
],
|
||||||
|
"x-enum-description": {}
|
||||||
|
},
|
||||||
|
"url": {
|
||||||
|
"type": "string"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"additionalProperties": false
|
||||||
|
},
|
||||||
|
"stringInput": {
|
||||||
|
"description": "common parameter used by many query types",
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"timeRange": {
|
||||||
|
"description": "TimeRange represents the query range\nNOTE: unlike generic /ds/query, we can now send explicit time values in each query\nNOTE: the values for timeRange are not saved in a dashboard, they are constructed on the fly",
|
||||||
|
"type": "object",
|
||||||
|
"required": [
|
||||||
|
"from",
|
||||||
|
"to"
|
||||||
|
],
|
||||||
|
"properties": {
|
||||||
|
"from": {
|
||||||
|
"description": "From is the start time of the query.",
|
||||||
|
"type": "string",
|
||||||
|
"default": "now-6h",
|
||||||
|
"examples": [
|
||||||
|
"now-1h"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"to": {
|
||||||
|
"description": "To is the end time of the query.",
|
||||||
|
"type": "string",
|
||||||
|
"default": "now",
|
||||||
|
"examples": [
|
||||||
|
"now"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"additionalProperties": false
|
||||||
|
},
|
||||||
|
"usa": {
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"fields": {
|
||||||
|
"type": "array",
|
||||||
|
"items": {
|
||||||
|
"type": "string"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"mode": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"period": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"states": {
|
||||||
|
"type": "array",
|
||||||
|
"items": {
|
||||||
|
"type": "string"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"additionalProperties": false
|
||||||
|
},
|
||||||
|
"withNil": {
|
||||||
|
"type": "boolean"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"additionalProperties": false,
|
||||||
|
"$schema": "https://json-schema.org/draft-04/schema#"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"to": {
|
||||||
|
"description": "To end time in epoch timestamps in milliseconds or relative using Grafana time units.",
|
||||||
|
"type": "string"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"additionalProperties": false,
|
||||||
|
"$schema": "https://json-schema.org/draft-04/schema#"
|
||||||
|
}
|
325
pkg/tsdb/grafana-testdata-datasource/kinds/query.types.json
Normal file
325
pkg/tsdb/grafana-testdata-datasource/kinds/query.types.json
Normal file
@ -0,0 +1,325 @@
|
|||||||
|
{
|
||||||
|
"kind": "QueryTypeDefinitionList",
|
||||||
|
"apiVersion": "query.grafana.app/v0alpha1",
|
||||||
|
"metadata": {
|
||||||
|
"resourceVersion": "1709261615323"
|
||||||
|
},
|
||||||
|
"items": [
|
||||||
|
{
|
||||||
|
"metadata": {
|
||||||
|
"name": "default",
|
||||||
|
"resourceVersion": "1711119846950",
|
||||||
|
"creationTimestamp": "2024-03-01T02:53:35Z"
|
||||||
|
},
|
||||||
|
"spec": {
|
||||||
|
"schema": {
|
||||||
|
"$schema": "https://json-schema.org/draft-04/schema",
|
||||||
|
"additionalProperties": false,
|
||||||
|
"description": "TestDataQuery defines model for TestDataQuery.",
|
||||||
|
"properties": {
|
||||||
|
"alias": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"channel": {
|
||||||
|
"description": "Used for live query",
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"csvContent": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"csvFileName": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"csvWave": {
|
||||||
|
"items": {
|
||||||
|
"additionalProperties": false,
|
||||||
|
"description": "CSVWave defines model for CSVWave.",
|
||||||
|
"properties": {
|
||||||
|
"labels": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"name": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"timeStep": {
|
||||||
|
"type": "integer"
|
||||||
|
},
|
||||||
|
"valuesCSV": {
|
||||||
|
"type": "string"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"type": "object"
|
||||||
|
},
|
||||||
|
"type": "array"
|
||||||
|
},
|
||||||
|
"dropPercent": {
|
||||||
|
"description": "Drop percentage (the chance we will lose a point 0-100)",
|
||||||
|
"type": "number"
|
||||||
|
},
|
||||||
|
"errorType": {
|
||||||
|
"description": "Possible enum values:\n - `\"frontend_exception\"` \n - `\"frontend_observable\"` \n - `\"server_panic\"` ",
|
||||||
|
"enum": [
|
||||||
|
"frontend_exception",
|
||||||
|
"frontend_observable",
|
||||||
|
"server_panic"
|
||||||
|
],
|
||||||
|
"type": "string",
|
||||||
|
"x-enum-description": {}
|
||||||
|
},
|
||||||
|
"flamegraphDiff": {
|
||||||
|
"type": "boolean"
|
||||||
|
},
|
||||||
|
"labels": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"levelColumn": {
|
||||||
|
"type": "boolean"
|
||||||
|
},
|
||||||
|
"lines": {
|
||||||
|
"type": "integer"
|
||||||
|
},
|
||||||
|
"max": {
|
||||||
|
"type": "number"
|
||||||
|
},
|
||||||
|
"min": {
|
||||||
|
"type": "number"
|
||||||
|
},
|
||||||
|
"nodes": {
|
||||||
|
"additionalProperties": false,
|
||||||
|
"properties": {
|
||||||
|
"count": {
|
||||||
|
"type": "integer"
|
||||||
|
},
|
||||||
|
"seed": {
|
||||||
|
"type": "integer"
|
||||||
|
},
|
||||||
|
"type": {
|
||||||
|
"description": "Possible enum values:\n - `\"random\"` \n - `\"random edges\"` \n - `\"response_medium\"` \n - `\"response_small\"` \n - `\"feature_showcase\"` ",
|
||||||
|
"enum": [
|
||||||
|
"random",
|
||||||
|
"random edges",
|
||||||
|
"response_medium",
|
||||||
|
"response_small",
|
||||||
|
"feature_showcase"
|
||||||
|
],
|
||||||
|
"type": "string",
|
||||||
|
"x-enum-description": {}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"type": "object"
|
||||||
|
},
|
||||||
|
"noise": {
|
||||||
|
"type": "number"
|
||||||
|
},
|
||||||
|
"points": {
|
||||||
|
"items": {
|
||||||
|
"type": "array"
|
||||||
|
},
|
||||||
|
"type": "array"
|
||||||
|
},
|
||||||
|
"pulseWave": {
|
||||||
|
"additionalProperties": false,
|
||||||
|
"properties": {
|
||||||
|
"offCount": {
|
||||||
|
"type": "integer"
|
||||||
|
},
|
||||||
|
"offValue": {
|
||||||
|
"type": "number"
|
||||||
|
},
|
||||||
|
"onCount": {
|
||||||
|
"type": "integer"
|
||||||
|
},
|
||||||
|
"onValue": {
|
||||||
|
"type": "number"
|
||||||
|
},
|
||||||
|
"timeStep": {
|
||||||
|
"type": "integer"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"type": "object"
|
||||||
|
},
|
||||||
|
"rawFrameContent": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"scenarioId": {
|
||||||
|
"description": "Possible enum values:\n - `\"annotations\"` \n - `\"arrow\"` \n - `\"csv_content\"` \n - `\"csv_file\"` \n - `\"csv_metric_values\"` \n - `\"datapoints_outside_range\"` \n - `\"exponential_heatmap_bucket_data\"` \n - `\"flame_graph\"` \n - `\"grafana_api\"` \n - `\"linear_heatmap_bucket_data\"` \n - `\"live\"` \n - `\"logs\"` \n - `\"manual_entry\"` \n - `\"no_data_points\"` \n - `\"node_graph\"` \n - `\"predictable_csv_wave\"` \n - `\"predictable_pulse\"` \n - `\"random_walk\"` \n - `\"random_walk_table\"` \n - `\"random_walk_with_error\"` \n - `\"raw_frame\"` \n - `\"server_error_500\"` \n - `\"simulation\"` \n - `\"slow_query\"` \n - `\"streaming_client\"` \n - `\"table_static\"` \n - `\"trace\"` \n - `\"usa\"` \n - `\"variables-query\"` ",
|
||||||
|
"enum": [
|
||||||
|
"annotations",
|
||||||
|
"arrow",
|
||||||
|
"csv_content",
|
||||||
|
"csv_file",
|
||||||
|
"csv_metric_values",
|
||||||
|
"datapoints_outside_range",
|
||||||
|
"exponential_heatmap_bucket_data",
|
||||||
|
"flame_graph",
|
||||||
|
"grafana_api",
|
||||||
|
"linear_heatmap_bucket_data",
|
||||||
|
"live",
|
||||||
|
"logs",
|
||||||
|
"manual_entry",
|
||||||
|
"no_data_points",
|
||||||
|
"node_graph",
|
||||||
|
"predictable_csv_wave",
|
||||||
|
"predictable_pulse",
|
||||||
|
"random_walk",
|
||||||
|
"random_walk_table",
|
||||||
|
"random_walk_with_error",
|
||||||
|
"raw_frame",
|
||||||
|
"server_error_500",
|
||||||
|
"simulation",
|
||||||
|
"slow_query",
|
||||||
|
"streaming_client",
|
||||||
|
"table_static",
|
||||||
|
"trace",
|
||||||
|
"usa",
|
||||||
|
"variables-query"
|
||||||
|
],
|
||||||
|
"type": "string",
|
||||||
|
"x-enum-description": {}
|
||||||
|
},
|
||||||
|
"seriesCount": {
|
||||||
|
"type": "integer"
|
||||||
|
},
|
||||||
|
"sim": {
|
||||||
|
"additionalProperties": false,
|
||||||
|
"properties": {
|
||||||
|
"config": {
|
||||||
|
"type": "object"
|
||||||
|
},
|
||||||
|
"key": {
|
||||||
|
"additionalProperties": false,
|
||||||
|
"properties": {
|
||||||
|
"tick": {
|
||||||
|
"type": "number"
|
||||||
|
},
|
||||||
|
"type": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"uid": {
|
||||||
|
"type": "string"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"required": [
|
||||||
|
"tick",
|
||||||
|
"type"
|
||||||
|
],
|
||||||
|
"type": "object"
|
||||||
|
},
|
||||||
|
"last": {
|
||||||
|
"type": "boolean"
|
||||||
|
},
|
||||||
|
"stream": {
|
||||||
|
"type": "boolean"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"required": [
|
||||||
|
"key"
|
||||||
|
],
|
||||||
|
"type": "object"
|
||||||
|
},
|
||||||
|
"spanCount": {
|
||||||
|
"type": "integer"
|
||||||
|
},
|
||||||
|
"spread": {
|
||||||
|
"type": "number"
|
||||||
|
},
|
||||||
|
"startValue": {
|
||||||
|
"type": "number"
|
||||||
|
},
|
||||||
|
"stream": {
|
||||||
|
"additionalProperties": false,
|
||||||
|
"properties": {
|
||||||
|
"bands": {
|
||||||
|
"type": "integer"
|
||||||
|
},
|
||||||
|
"noise": {
|
||||||
|
"type": "number"
|
||||||
|
},
|
||||||
|
"speed": {
|
||||||
|
"type": "number"
|
||||||
|
},
|
||||||
|
"spread": {
|
||||||
|
"type": "number"
|
||||||
|
},
|
||||||
|
"type": {
|
||||||
|
"description": "Possible enum values:\n - `\"fetch\"` \n - `\"logs\"` \n - `\"signal\"` \n - `\"traces\"` ",
|
||||||
|
"enum": [
|
||||||
|
"fetch",
|
||||||
|
"logs",
|
||||||
|
"signal",
|
||||||
|
"traces"
|
||||||
|
],
|
||||||
|
"type": "string",
|
||||||
|
"x-enum-description": {}
|
||||||
|
},
|
||||||
|
"url": {
|
||||||
|
"type": "string"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"required": [
|
||||||
|
"noise",
|
||||||
|
"speed",
|
||||||
|
"spread",
|
||||||
|
"type"
|
||||||
|
],
|
||||||
|
"type": "object"
|
||||||
|
},
|
||||||
|
"stringInput": {
|
||||||
|
"description": "common parameter used by many query types",
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"usa": {
|
||||||
|
"additionalProperties": false,
|
||||||
|
"properties": {
|
||||||
|
"fields": {
|
||||||
|
"items": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"type": "array"
|
||||||
|
},
|
||||||
|
"mode": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"period": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"states": {
|
||||||
|
"items": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"type": "array"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"type": "object"
|
||||||
|
},
|
||||||
|
"withNil": {
|
||||||
|
"type": "boolean"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"type": "object"
|
||||||
|
},
|
||||||
|
"examples": [
|
||||||
|
{
|
||||||
|
"name": "simple random walk",
|
||||||
|
"saveModel": {
|
||||||
|
"scenarioId": "random_walk"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "pulse wave example",
|
||||||
|
"saveModel": {
|
||||||
|
"pulseWave": {
|
||||||
|
"offCount": 20,
|
||||||
|
"offValue": 1.23,
|
||||||
|
"onCount": 10,
|
||||||
|
"onValue": 4.56,
|
||||||
|
"timeStep": 1000
|
||||||
|
},
|
||||||
|
"scenarioId": "predictable_pulse"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
62
pkg/tsdb/grafana-testdata-datasource/kinds/query_test.go
Normal file
62
pkg/tsdb/grafana-testdata-datasource/kinds/query_test.go
Normal file
@ -0,0 +1,62 @@
|
|||||||
|
package kinds
|
||||||
|
|
||||||
|
import (
|
||||||
|
"reflect"
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
data "github.com/grafana/grafana-plugin-sdk-go/experimental/apis/data/v0alpha1"
|
||||||
|
"github.com/grafana/grafana-plugin-sdk-go/experimental/schemabuilder"
|
||||||
|
"github.com/stretchr/testify/require"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestQueryTypeDefinitions(t *testing.T) {
|
||||||
|
builder, err := schemabuilder.NewSchemaBuilder(
|
||||||
|
schemabuilder.BuilderOptions{
|
||||||
|
PluginID: []string{"grafana-testdata-datasource", "testdata"},
|
||||||
|
ScanCode: []schemabuilder.CodePaths{{
|
||||||
|
BasePackage: "github.com/grafana/grafana/pkg/tsdb/grafana-testdata-datasource/kinds",
|
||||||
|
CodePath: "./",
|
||||||
|
}},
|
||||||
|
Enums: []reflect.Type{
|
||||||
|
reflect.TypeOf(NodesQueryTypeRandom), // pick an example value (not the root)
|
||||||
|
reflect.TypeOf(StreamingQueryTypeFetch), // pick an example value (not the root)
|
||||||
|
reflect.TypeOf(ErrorTypeServerPanic), // pick an example value (not the root)
|
||||||
|
reflect.TypeOf(TestDataQueryTypeAnnotations), // pick an example value (not the root)
|
||||||
|
},
|
||||||
|
})
|
||||||
|
require.NoError(t, err)
|
||||||
|
err = builder.AddQueries(
|
||||||
|
schemabuilder.QueryTypeInfo{
|
||||||
|
Name: "default",
|
||||||
|
GoType: reflect.TypeOf(&TestDataQuery{}),
|
||||||
|
Examples: []data.QueryExample{
|
||||||
|
{
|
||||||
|
Name: "simple random walk",
|
||||||
|
SaveModel: data.AsUnstructured(
|
||||||
|
TestDataQuery{
|
||||||
|
ScenarioId: TestDataQueryTypeRandomWalk,
|
||||||
|
},
|
||||||
|
),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Name: "pulse wave example",
|
||||||
|
SaveModel: data.AsUnstructured(
|
||||||
|
TestDataQuery{
|
||||||
|
ScenarioId: TestDataQueryTypePredictablePulse,
|
||||||
|
PulseWave: &PulseWaveQuery{
|
||||||
|
TimeStep: int64(1000),
|
||||||
|
OnCount: 10,
|
||||||
|
OffCount: 20,
|
||||||
|
OffValue: 1.23, // should be any (rather json any)
|
||||||
|
OnValue: 4.56, // should be any
|
||||||
|
},
|
||||||
|
},
|
||||||
|
),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
)
|
||||||
|
|
||||||
|
require.NoError(t, err)
|
||||||
|
builder.UpdateQueryDefinition(t, "./")
|
||||||
|
}
|
@ -10,6 +10,8 @@ import (
|
|||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/grafana/grafana-plugin-sdk-go/backend/log"
|
"github.com/grafana/grafana-plugin-sdk-go/backend/log"
|
||||||
|
|
||||||
|
"github.com/grafana/grafana/pkg/tsdb/grafana-testdata-datasource/kinds"
|
||||||
)
|
)
|
||||||
|
|
||||||
func (s *Service) registerRoutes() *http.ServeMux {
|
func (s *Service) registerRoutes() *http.ServeMux {
|
||||||
@ -46,12 +48,12 @@ func (s *Service) getScenariosHandler(rw http.ResponseWriter, req *http.Request)
|
|||||||
|
|
||||||
scenarioIds := make([]string, 0)
|
scenarioIds := make([]string, 0)
|
||||||
for id := range s.scenarios {
|
for id := range s.scenarios {
|
||||||
scenarioIds = append(scenarioIds, id)
|
scenarioIds = append(scenarioIds, string(id))
|
||||||
}
|
}
|
||||||
sort.Strings(scenarioIds)
|
sort.Strings(scenarioIds)
|
||||||
|
|
||||||
for _, scenarioID := range scenarioIds {
|
for _, scenarioID := range scenarioIds {
|
||||||
scenario := s.scenarios[scenarioID]
|
scenario := s.scenarios[kinds.TestDataQueryType(scenarioID)]
|
||||||
result = append(result, map[string]any{
|
result = append(result, map[string]any{
|
||||||
"id": scenario.ID,
|
"id": scenario.ID,
|
||||||
"name": scenario.Name,
|
"name": scenario.Name,
|
||||||
|
@ -17,42 +17,13 @@ import (
|
|||||||
"github.com/grafana/grafana-plugin-sdk-go/data"
|
"github.com/grafana/grafana-plugin-sdk-go/data"
|
||||||
"go.opentelemetry.io/otel/attribute"
|
"go.opentelemetry.io/otel/attribute"
|
||||||
"go.opentelemetry.io/otel/trace"
|
"go.opentelemetry.io/otel/trace"
|
||||||
)
|
|
||||||
|
|
||||||
const (
|
"github.com/grafana/grafana/pkg/tsdb/grafana-testdata-datasource/kinds"
|
||||||
randomWalkQuery queryType = "random_walk"
|
|
||||||
randomWalkSlowQuery queryType = "slow_query"
|
|
||||||
randomWalkWithErrorQuery queryType = "random_walk_with_error"
|
|
||||||
randomWalkTableQuery queryType = "random_walk_table"
|
|
||||||
exponentialHeatmapBucketDataQuery queryType = "exponential_heatmap_bucket_data"
|
|
||||||
linearHeatmapBucketDataQuery queryType = "linear_heatmap_bucket_data"
|
|
||||||
noDataPointsQuery queryType = "no_data_points"
|
|
||||||
datapointsOutsideRangeQuery queryType = "datapoints_outside_range"
|
|
||||||
csvMetricValuesQuery queryType = "csv_metric_values"
|
|
||||||
predictablePulseQuery queryType = "predictable_pulse"
|
|
||||||
predictableCSVWaveQuery queryType = "predictable_csv_wave"
|
|
||||||
streamingClientQuery queryType = "streaming_client"
|
|
||||||
simulation queryType = "simulation"
|
|
||||||
usaQueryKey queryType = "usa"
|
|
||||||
liveQuery queryType = "live"
|
|
||||||
grafanaAPIQuery queryType = "grafana_api"
|
|
||||||
arrowQuery queryType = "arrow"
|
|
||||||
annotationsQuery queryType = "annotations"
|
|
||||||
tableStaticQuery queryType = "table_static"
|
|
||||||
serverError500Query queryType = "server_error_500"
|
|
||||||
logsQuery queryType = "logs"
|
|
||||||
nodeGraphQuery queryType = "node_graph"
|
|
||||||
flameGraphQuery queryType = "flame_graph"
|
|
||||||
rawFrameQuery queryType = "raw_frame"
|
|
||||||
csvFileQueryType queryType = "csv_file"
|
|
||||||
csvContentQueryType queryType = "csv_content"
|
|
||||||
traceType queryType = "trace"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type queryType string
|
|
||||||
|
|
||||||
type Scenario struct {
|
type Scenario struct {
|
||||||
ID string `json:"id"`
|
ID kinds.TestDataQueryType `json:"id"`
|
||||||
|
|
||||||
Name string `json:"name"`
|
Name string `json:"name"`
|
||||||
StringInput string `json:"stringInput"`
|
StringInput string `json:"stringInput"`
|
||||||
Description string `json:"description"`
|
Description string `json:"description"`
|
||||||
@ -61,25 +32,25 @@ type Scenario struct {
|
|||||||
|
|
||||||
func (s *Service) registerScenarios() {
|
func (s *Service) registerScenarios() {
|
||||||
s.registerScenario(&Scenario{
|
s.registerScenario(&Scenario{
|
||||||
ID: string(exponentialHeatmapBucketDataQuery),
|
ID: kinds.TestDataQueryTypeExponentialHeatmapBucketData,
|
||||||
Name: "Exponential heatmap bucket data",
|
Name: "Exponential heatmap bucket data",
|
||||||
handler: s.handleExponentialHeatmapBucketDataScenario,
|
handler: s.handleExponentialHeatmapBucketDataScenario,
|
||||||
})
|
})
|
||||||
|
|
||||||
s.registerScenario(&Scenario{
|
s.registerScenario(&Scenario{
|
||||||
ID: string(linearHeatmapBucketDataQuery),
|
ID: kinds.TestDataQueryTypeLinearHeatmapBucketData,
|
||||||
Name: "Linear heatmap bucket data",
|
Name: "Linear heatmap bucket data",
|
||||||
handler: s.handleLinearHeatmapBucketDataScenario,
|
handler: s.handleLinearHeatmapBucketDataScenario,
|
||||||
})
|
})
|
||||||
|
|
||||||
s.registerScenario(&Scenario{
|
s.registerScenario(&Scenario{
|
||||||
ID: string(randomWalkQuery),
|
ID: kinds.TestDataQueryTypeRandomWalk,
|
||||||
Name: "Random Walk",
|
Name: "Random Walk",
|
||||||
handler: s.handleRandomWalkScenario,
|
handler: s.handleRandomWalkScenario,
|
||||||
})
|
})
|
||||||
|
|
||||||
s.registerScenario(&Scenario{
|
s.registerScenario(&Scenario{
|
||||||
ID: string(predictablePulseQuery),
|
ID: kinds.TestDataQueryTypePredictablePulse,
|
||||||
Name: "Predictable Pulse",
|
Name: "Predictable Pulse",
|
||||||
handler: s.handlePredictablePulseScenario,
|
handler: s.handlePredictablePulseScenario,
|
||||||
Description: `Predictable Pulse returns a pulse wave where there is a datapoint every timeStepSeconds.
|
Description: `Predictable Pulse returns a pulse wave where there is a datapoint every timeStepSeconds.
|
||||||
@ -89,100 +60,100 @@ Timestamps will line up evenly on timeStepSeconds (For example, 60 seconds means
|
|||||||
})
|
})
|
||||||
|
|
||||||
s.registerScenario(&Scenario{
|
s.registerScenario(&Scenario{
|
||||||
ID: string(predictableCSVWaveQuery),
|
ID: kinds.TestDataQueryTypePredictableCsvWave,
|
||||||
Name: "Predictable CSV Wave",
|
Name: "Predictable CSV Wave",
|
||||||
handler: s.handlePredictableCSVWaveScenario,
|
handler: s.handlePredictableCSVWaveScenario,
|
||||||
})
|
})
|
||||||
|
|
||||||
s.registerScenario(&Scenario{
|
s.registerScenario(&Scenario{
|
||||||
ID: string(randomWalkTableQuery),
|
ID: kinds.TestDataQueryTypeRandomWalkTable,
|
||||||
Name: "Random Walk Table",
|
Name: "Random Walk Table",
|
||||||
handler: s.handleRandomWalkTableScenario,
|
handler: s.handleRandomWalkTableScenario,
|
||||||
})
|
})
|
||||||
|
|
||||||
s.registerScenario(&Scenario{
|
s.registerScenario(&Scenario{
|
||||||
ID: string(randomWalkSlowQuery),
|
ID: kinds.TestDataQueryTypeSlowQuery,
|
||||||
Name: "Slow Query",
|
Name: "Slow Query",
|
||||||
StringInput: "5s",
|
StringInput: "5s",
|
||||||
handler: s.handleRandomWalkSlowScenario,
|
handler: s.handleRandomWalkSlowScenario,
|
||||||
})
|
})
|
||||||
|
|
||||||
s.registerScenario(&Scenario{
|
s.registerScenario(&Scenario{
|
||||||
ID: string(noDataPointsQuery),
|
ID: kinds.TestDataQueryTypeNoDataPoints,
|
||||||
Name: "No Data Points",
|
Name: "No Data Points",
|
||||||
handler: s.handleClientSideScenario,
|
handler: s.handleClientSideScenario,
|
||||||
})
|
})
|
||||||
|
|
||||||
s.registerScenario(&Scenario{
|
s.registerScenario(&Scenario{
|
||||||
ID: string(datapointsOutsideRangeQuery),
|
ID: kinds.TestDataQueryTypeDatapointsOutsideRange,
|
||||||
Name: "Datapoints Outside Range",
|
Name: "Datapoints Outside Range",
|
||||||
handler: s.handleDatapointsOutsideRangeScenario,
|
handler: s.handleDatapointsOutsideRangeScenario,
|
||||||
})
|
})
|
||||||
|
|
||||||
s.registerScenario(&Scenario{
|
s.registerScenario(&Scenario{
|
||||||
ID: string(csvMetricValuesQuery),
|
ID: kinds.TestDataQueryTypeCsvMetricValues,
|
||||||
Name: "CSV Metric Values",
|
Name: "CSV Metric Values",
|
||||||
StringInput: "1,20,90,30,5,0",
|
StringInput: "1,20,90,30,5,0",
|
||||||
handler: s.handleCSVMetricValuesScenario,
|
handler: s.handleCSVMetricValuesScenario,
|
||||||
})
|
})
|
||||||
|
|
||||||
s.registerScenario(&Scenario{
|
s.registerScenario(&Scenario{
|
||||||
ID: string(streamingClientQuery),
|
ID: kinds.TestDataQueryTypeStreamingClient,
|
||||||
Name: "Streaming Client",
|
Name: "Streaming Client",
|
||||||
handler: s.handleClientSideScenario,
|
handler: s.handleClientSideScenario,
|
||||||
})
|
})
|
||||||
|
|
||||||
s.registerScenario(&Scenario{
|
s.registerScenario(&Scenario{
|
||||||
ID: string(liveQuery),
|
ID: kinds.TestDataQueryTypeLive,
|
||||||
Name: "Grafana Live",
|
Name: "Grafana Live",
|
||||||
handler: s.handleClientSideScenario,
|
handler: s.handleClientSideScenario,
|
||||||
})
|
})
|
||||||
|
|
||||||
s.registerScenario(&Scenario{
|
s.registerScenario(&Scenario{
|
||||||
ID: string(simulation),
|
ID: kinds.TestDataQueryTypeSimulation,
|
||||||
Name: "Simulation",
|
Name: "Simulation",
|
||||||
handler: s.sims.QueryData,
|
handler: s.sims.QueryData,
|
||||||
})
|
})
|
||||||
|
|
||||||
s.registerScenario(&Scenario{
|
s.registerScenario(&Scenario{
|
||||||
ID: string(usaQueryKey),
|
ID: kinds.TestDataQueryTypeUsa,
|
||||||
Name: "USA generated data",
|
Name: "USA generated data",
|
||||||
handler: s.handleUSAScenario,
|
handler: s.handleUSAScenario,
|
||||||
})
|
})
|
||||||
|
|
||||||
s.registerScenario(&Scenario{
|
s.registerScenario(&Scenario{
|
||||||
ID: string(grafanaAPIQuery),
|
ID: kinds.TestDataQueryTypeGrafanaApi,
|
||||||
Name: "Grafana API",
|
Name: "Grafana API",
|
||||||
handler: s.handleClientSideScenario,
|
handler: s.handleClientSideScenario,
|
||||||
})
|
})
|
||||||
|
|
||||||
s.registerScenario(&Scenario{
|
s.registerScenario(&Scenario{
|
||||||
ID: string(arrowQuery),
|
ID: kinds.TestDataQueryTypeArrow,
|
||||||
Name: "Load Apache Arrow Data",
|
Name: "Load Apache Arrow Data",
|
||||||
handler: s.handleArrowScenario,
|
handler: s.handleArrowScenario,
|
||||||
})
|
})
|
||||||
|
|
||||||
s.registerScenario(&Scenario{
|
s.registerScenario(&Scenario{
|
||||||
ID: string(annotationsQuery),
|
ID: kinds.TestDataQueryTypeAnnotations,
|
||||||
Name: "Annotations",
|
Name: "Annotations",
|
||||||
handler: s.handleClientSideScenario,
|
handler: s.handleClientSideScenario,
|
||||||
})
|
})
|
||||||
|
|
||||||
s.registerScenario(&Scenario{
|
s.registerScenario(&Scenario{
|
||||||
ID: string(tableStaticQuery),
|
ID: kinds.TestDataQueryTypeTableStatic,
|
||||||
Name: "Table Static",
|
Name: "Table Static",
|
||||||
handler: s.handleTableStaticScenario,
|
handler: s.handleTableStaticScenario,
|
||||||
})
|
})
|
||||||
|
|
||||||
s.registerScenario(&Scenario{
|
s.registerScenario(&Scenario{
|
||||||
ID: string(randomWalkWithErrorQuery),
|
ID: kinds.TestDataQueryTypeRandomWalkWithError,
|
||||||
Name: "Random Walk (with error)",
|
Name: "Random Walk (with error)",
|
||||||
handler: s.handleRandomWalkWithErrorScenario,
|
handler: s.handleRandomWalkWithErrorScenario,
|
||||||
})
|
})
|
||||||
|
|
||||||
s.registerScenario(&Scenario{
|
s.registerScenario(&Scenario{
|
||||||
// Is no longer strictly a _server_ error scenario, but ID is kept for legacy :)
|
// Is no longer strictly a _server_ error scenario, but ID is kept for legacy :)
|
||||||
ID: string(serverError500Query),
|
ID: kinds.TestDataQueryTypeServerError500,
|
||||||
Name: "Conditional Error",
|
Name: "Conditional Error",
|
||||||
handler: s.handleServerError500Scenario,
|
handler: s.handleServerError500Scenario,
|
||||||
StringInput: "1,20,90,30,5,0",
|
StringInput: "1,20,90,30,5,0",
|
||||||
@ -190,40 +161,40 @@ Timestamps will line up evenly on timeStepSeconds (For example, 60 seconds means
|
|||||||
})
|
})
|
||||||
|
|
||||||
s.registerScenario(&Scenario{
|
s.registerScenario(&Scenario{
|
||||||
ID: string(logsQuery),
|
ID: kinds.TestDataQueryTypeLogs,
|
||||||
Name: "Logs",
|
Name: "Logs",
|
||||||
handler: s.handleLogsScenario,
|
handler: s.handleLogsScenario,
|
||||||
})
|
})
|
||||||
|
|
||||||
s.registerScenario(&Scenario{
|
s.registerScenario(&Scenario{
|
||||||
ID: string(nodeGraphQuery),
|
ID: kinds.TestDataQueryTypeNodeGraph,
|
||||||
Name: "Node Graph",
|
Name: "Node Graph",
|
||||||
})
|
})
|
||||||
|
|
||||||
s.registerScenario(&Scenario{
|
s.registerScenario(&Scenario{
|
||||||
ID: string(flameGraphQuery),
|
ID: kinds.TestDataQueryTypeFlameGraph,
|
||||||
Name: "Flame Graph",
|
Name: "Flame Graph",
|
||||||
})
|
})
|
||||||
|
|
||||||
s.registerScenario(&Scenario{
|
s.registerScenario(&Scenario{
|
||||||
ID: string(rawFrameQuery),
|
ID: kinds.TestDataQueryTypeRawFrame,
|
||||||
Name: "Raw Frames",
|
Name: "Raw Frames",
|
||||||
})
|
})
|
||||||
|
|
||||||
s.registerScenario(&Scenario{
|
s.registerScenario(&Scenario{
|
||||||
ID: string(csvFileQueryType),
|
ID: kinds.TestDataQueryTypeCsvFile,
|
||||||
Name: "CSV File",
|
Name: "CSV File",
|
||||||
handler: s.handleCsvFileScenario,
|
handler: s.handleCsvFileScenario,
|
||||||
})
|
})
|
||||||
|
|
||||||
s.registerScenario(&Scenario{
|
s.registerScenario(&Scenario{
|
||||||
ID: string(csvContentQueryType),
|
ID: kinds.TestDataQueryTypeCsvContent,
|
||||||
Name: "CSV Content",
|
Name: "CSV Content",
|
||||||
handler: s.handleCsvContentScenario,
|
handler: s.handleCsvContentScenario,
|
||||||
})
|
})
|
||||||
|
|
||||||
s.registerScenario(&Scenario{
|
s.registerScenario(&Scenario{
|
||||||
ID: string(traceType),
|
ID: kinds.TestDataQueryTypeTrace,
|
||||||
Name: "Trace",
|
Name: "Trace",
|
||||||
})
|
})
|
||||||
|
|
||||||
@ -232,14 +203,14 @@ Timestamps will line up evenly on timeStepSeconds (For example, 60 seconds means
|
|||||||
|
|
||||||
func (s *Service) registerScenario(scenario *Scenario) {
|
func (s *Service) registerScenario(scenario *Scenario) {
|
||||||
s.scenarios[scenario.ID] = scenario
|
s.scenarios[scenario.ID] = scenario
|
||||||
s.queryMux.HandleFunc(scenario.ID, instrumentScenarioHandler(s.logger, scenario.ID, scenario.handler))
|
s.queryMux.HandleFunc(string(scenario.ID), instrumentScenarioHandler(s.logger, scenario.ID, scenario.handler))
|
||||||
}
|
}
|
||||||
|
|
||||||
func instrumentScenarioHandler(logger log.Logger, scenario string, fn backend.QueryDataHandlerFunc) backend.QueryDataHandlerFunc {
|
func instrumentScenarioHandler(logger log.Logger, scenario kinds.TestDataQueryType, fn backend.QueryDataHandlerFunc) backend.QueryDataHandlerFunc {
|
||||||
return backend.QueryDataHandlerFunc(func(ctx context.Context, req *backend.QueryDataRequest) (*backend.QueryDataResponse, error) {
|
return backend.QueryDataHandlerFunc(func(ctx context.Context, req *backend.QueryDataRequest) (*backend.QueryDataResponse, error) {
|
||||||
ctx, span := tracing.DefaultTracer().Start(ctx, "testdatasource.queryData",
|
ctx, span := tracing.DefaultTracer().Start(ctx, "testdatasource.queryData",
|
||||||
trace.WithAttributes(
|
trace.WithAttributes(
|
||||||
attribute.String("scenario", scenario),
|
attribute.String("scenario", string(scenario)),
|
||||||
))
|
))
|
||||||
defer span.End()
|
defer span.End()
|
||||||
|
|
||||||
@ -250,52 +221,18 @@ func instrumentScenarioHandler(logger log.Logger, scenario string, fn backend.Qu
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
type JSONModel struct {
|
func GetJSONModel(j json.RawMessage) (kinds.TestDataQuery, error) {
|
||||||
ScenarioID string `json:"scenarioId"`
|
model := kinds.TestDataQuery{
|
||||||
SeriesCount int `json:"seriesCount"`
|
|
||||||
StringInput string `json:"stringInput"`
|
|
||||||
Lines int64 `json:"lines"`
|
|
||||||
IncludeLevelColumn bool `json:"includeLevelColumn"`
|
|
||||||
StartValue float64 `json:"startValue"`
|
|
||||||
Spread float64 `json:"spread"`
|
|
||||||
Noise float64 `json:"noise"`
|
|
||||||
Drop float64 `json:"drop"`
|
|
||||||
Min *float64 `json:"min,omitempty"`
|
|
||||||
Max *float64 `json:"max,omitempty"`
|
|
||||||
Labels string `json:"labels"`
|
|
||||||
WithNil bool `json:"withNil"`
|
|
||||||
PulseWave pulseWave `json:"pulseWave"`
|
|
||||||
Alias string `json:"alias"`
|
|
||||||
// Cannot specify a type for csvWave since legacy queries
|
|
||||||
// does not follow the same format as the new ones (and there is no migration).
|
|
||||||
CSVWave any `json:"csvWave"`
|
|
||||||
CSVContent string `json:"csvContent"`
|
|
||||||
CSVFileName string `json:"csvFileName"`
|
|
||||||
DropPercent float64 `json:"dropPercent"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type pulseWave struct {
|
|
||||||
TimeStep int64 `json:"timeStep"`
|
|
||||||
OnCount int64 `json:"onCount"`
|
|
||||||
OffCount int64 `json:"offCount"`
|
|
||||||
OnValue any `json:"onValue"`
|
|
||||||
OffValue any `json:"offValue"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func GetJSONModel(j json.RawMessage) (JSONModel, error) {
|
|
||||||
model := JSONModel{
|
|
||||||
// Default values
|
// Default values
|
||||||
ScenarioID: string(randomWalkQuery),
|
ScenarioId: kinds.TestDataQueryTypeRandomWalk,
|
||||||
SeriesCount: 1,
|
SeriesCount: 1,
|
||||||
Lines: 10,
|
Lines: 10,
|
||||||
StartValue: rand.Float64() * 100,
|
StartValue: rand.Float64() * 100,
|
||||||
Spread: 1,
|
Spread: 1,
|
||||||
}
|
}
|
||||||
if len(j) > 0 {
|
if len(j) > 0 {
|
||||||
err := json.Unmarshal(j, &model)
|
// csvWave has saved values that are single values, not arrays
|
||||||
if err != nil {
|
_ = json.Unmarshal(j, &model)
|
||||||
return JSONModel{}, err
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return model, nil
|
return model, nil
|
||||||
}
|
}
|
||||||
@ -303,7 +240,7 @@ func GetJSONModel(j json.RawMessage) (JSONModel, error) {
|
|||||||
// handleFallbackScenario handles the scenario where queryType is not set and fallbacks to scenarioId.
|
// handleFallbackScenario handles the scenario where queryType is not set and fallbacks to scenarioId.
|
||||||
func (s *Service) handleFallbackScenario(ctx context.Context, req *backend.QueryDataRequest) (*backend.QueryDataResponse, error) {
|
func (s *Service) handleFallbackScenario(ctx context.Context, req *backend.QueryDataRequest) (*backend.QueryDataResponse, error) {
|
||||||
ctxLogger := s.logger.FromContext(ctx)
|
ctxLogger := s.logger.FromContext(ctx)
|
||||||
scenarioQueries := map[string][]backend.DataQuery{}
|
scenarioQueries := map[kinds.TestDataQueryType][]backend.DataQuery{}
|
||||||
|
|
||||||
for _, q := range req.Queries {
|
for _, q := range req.Queries {
|
||||||
model, err := GetJSONModel(q.JSON)
|
model, err := GetJSONModel(q.JSON)
|
||||||
@ -312,7 +249,7 @@ func (s *Service) handleFallbackScenario(ctx context.Context, req *backend.Query
|
|||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
scenarioID := model.ScenarioID
|
scenarioID := model.ScenarioId
|
||||||
if _, exist := s.scenarios[scenarioID]; exist {
|
if _, exist := s.scenarios[scenarioID]; exist {
|
||||||
if _, ok := scenarioQueries[scenarioID]; !ok {
|
if _, ok := scenarioQueries[scenarioID]; !ok {
|
||||||
scenarioQueries[scenarioID] = []backend.DataQuery{}
|
scenarioQueries[scenarioID] = []backend.DataQuery{}
|
||||||
@ -654,7 +591,7 @@ func (s *Service) handleLogsScenario(ctx context.Context, req *backend.QueryData
|
|||||||
}
|
}
|
||||||
|
|
||||||
lines := model.Lines
|
lines := model.Lines
|
||||||
includeLevelColumn := model.IncludeLevelColumn
|
includeLevelColumn := model.LevelColumn
|
||||||
|
|
||||||
logLevelGenerator := newRandomStringProvider([]string{
|
logLevelGenerator := newRandomStringProvider([]string{
|
||||||
"emerg",
|
"emerg",
|
||||||
@ -726,14 +663,14 @@ func (s *Service) handleLogsScenario(ctx context.Context, req *backend.QueryData
|
|||||||
return resp, nil
|
return resp, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func RandomWalk(query backend.DataQuery, model JSONModel, index int) *data.Frame {
|
func RandomWalk(query backend.DataQuery, model kinds.TestDataQuery, index int) *data.Frame {
|
||||||
rand := rand.New(rand.NewSource(time.Now().UnixNano() + int64(index)))
|
rand := rand.New(rand.NewSource(time.Now().UnixNano() + int64(index)))
|
||||||
timeWalkerMs := query.TimeRange.From.UnixNano() / int64(time.Millisecond)
|
timeWalkerMs := query.TimeRange.From.UnixNano() / int64(time.Millisecond)
|
||||||
to := query.TimeRange.To.UnixNano() / int64(time.Millisecond)
|
to := query.TimeRange.To.UnixNano() / int64(time.Millisecond)
|
||||||
startValue := model.StartValue
|
startValue := model.StartValue
|
||||||
spread := model.Spread
|
spread := model.Spread
|
||||||
noise := model.Noise
|
noise := model.Noise
|
||||||
drop := model.Drop / 100.0 // value is 0-100
|
drop := model.DropPercent / 100.0 // value is 0-100
|
||||||
|
|
||||||
min := float64(0)
|
min := float64(0)
|
||||||
hasMin := false
|
hasMin := false
|
||||||
@ -795,7 +732,7 @@ func RandomWalk(query backend.DataQuery, model JSONModel, index int) *data.Frame
|
|||||||
return frame
|
return frame
|
||||||
}
|
}
|
||||||
|
|
||||||
func randomWalkTable(query backend.DataQuery, model JSONModel) *data.Frame {
|
func randomWalkTable(query backend.DataQuery, model kinds.TestDataQuery) *data.Frame {
|
||||||
rand := rand.New(rand.NewSource(time.Now().UnixNano()))
|
rand := rand.New(rand.NewSource(time.Now().UnixNano()))
|
||||||
timeWalkerMs := query.TimeRange.From.UnixNano() / int64(time.Millisecond)
|
timeWalkerMs := query.TimeRange.From.UnixNano() / int64(time.Millisecond)
|
||||||
to := query.TimeRange.To.UnixNano() / int64(time.Millisecond)
|
to := query.TimeRange.To.UnixNano() / int64(time.Millisecond)
|
||||||
@ -868,23 +805,8 @@ func randomWalkTable(query backend.DataQuery, model JSONModel) *data.Frame {
|
|||||||
return frame
|
return frame
|
||||||
}
|
}
|
||||||
|
|
||||||
type pCSVOptions struct {
|
func predictableCSVWave(query backend.DataQuery, model kinds.TestDataQuery) ([]*data.Frame, error) {
|
||||||
TimeStep int64 `json:"timeStep"`
|
queries := model.CsvWave
|
||||||
ValuesCSV string `json:"valuesCSV"`
|
|
||||||
Labels string `json:"labels"`
|
|
||||||
Name string `json:"name"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func predictableCSVWave(query backend.DataQuery, model JSONModel) ([]*data.Frame, error) {
|
|
||||||
queries := []pCSVOptions{}
|
|
||||||
input, err := json.Marshal(model.CSVWave)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
err = json.Unmarshal(input, &queries)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
frames := make([]*data.Frame, 0, len(queries))
|
frames := make([]*data.Frame, 0, len(queries))
|
||||||
|
|
||||||
@ -972,7 +894,7 @@ func predictableSeries(timeRange backend.TimeRange, timeStep, length int64, getV
|
|||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func predictablePulse(query backend.DataQuery, model JSONModel) (*data.Frame, error) {
|
func predictablePulse(query backend.DataQuery, model kinds.TestDataQuery) (*data.Frame, error) {
|
||||||
// Process Input
|
// Process Input
|
||||||
var timeStep int64
|
var timeStep int64
|
||||||
var onCount int64
|
var onCount int64
|
||||||
@ -1042,7 +964,7 @@ func randomHeatmapData(query backend.DataQuery, fnBucketGen func(index int) floa
|
|||||||
return frame
|
return frame
|
||||||
}
|
}
|
||||||
|
|
||||||
func doArrowQuery(query backend.DataQuery, model JSONModel) (*data.Frame, error) {
|
func doArrowQuery(query backend.DataQuery, model kinds.TestDataQuery) (*data.Frame, error) {
|
||||||
encoded := model.StringInput
|
encoded := model.StringInput
|
||||||
if encoded == "" {
|
if encoded == "" {
|
||||||
return nil, nil
|
return nil, nil
|
||||||
@ -1054,7 +976,7 @@ func doArrowQuery(query backend.DataQuery, model JSONModel) (*data.Frame, error)
|
|||||||
return data.UnmarshalArrowFrame(arrow)
|
return data.UnmarshalArrowFrame(arrow)
|
||||||
}
|
}
|
||||||
|
|
||||||
func newSeriesForQuery(query backend.DataQuery, model JSONModel, index int) *data.Frame {
|
func newSeriesForQuery(query backend.DataQuery, model kinds.TestDataQuery, index int) *data.Frame {
|
||||||
alias := model.Alias
|
alias := model.Alias
|
||||||
suffix := ""
|
suffix := ""
|
||||||
|
|
||||||
@ -1082,7 +1004,7 @@ func newSeriesForQuery(query backend.DataQuery, model JSONModel, index int) *dat
|
|||||||
*
|
*
|
||||||
* '{job="foo", instance="bar"} => {job: "foo", instance: "bar"}`
|
* '{job="foo", instance="bar"} => {job: "foo", instance: "bar"}`
|
||||||
*/
|
*/
|
||||||
func parseLabels(model JSONModel, seriesIndex int) data.Labels {
|
func parseLabels(model kinds.TestDataQuery, seriesIndex int) data.Labels {
|
||||||
return parseLabelsString(model.Labels, seriesIndex)
|
return parseLabelsString(model.Labels, seriesIndex)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1110,7 +1032,7 @@ func parseLabelsString(labelText string, seriesIndex int) data.Labels {
|
|||||||
return tags
|
return tags
|
||||||
}
|
}
|
||||||
|
|
||||||
func frameNameForQuery(query backend.DataQuery, model JSONModel, index int) string {
|
func frameNameForQuery(query backend.DataQuery, model kinds.TestDataQuery, index int) string {
|
||||||
name := model.Alias
|
name := model.Alias
|
||||||
suffix := ""
|
suffix := ""
|
||||||
|
|
||||||
|
@ -11,6 +11,8 @@ import (
|
|||||||
"github.com/grafana/grafana-plugin-sdk-go/data"
|
"github.com/grafana/grafana-plugin-sdk-go/data"
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
|
|
||||||
|
"github.com/grafana/grafana/pkg/tsdb/grafana-testdata-datasource/kinds"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestTestdataScenarios(t *testing.T) {
|
func TestTestdataScenarios(t *testing.T) {
|
||||||
@ -184,32 +186,32 @@ func TestParseLabels(t *testing.T) {
|
|||||||
|
|
||||||
tests := []struct {
|
tests := []struct {
|
||||||
name string
|
name string
|
||||||
model JSONModel
|
model kinds.TestDataQuery
|
||||||
expected data.Labels
|
expected data.Labels
|
||||||
}{
|
}{
|
||||||
{
|
{
|
||||||
name: "wrapped in {} and quoted value ",
|
name: "wrapped in {} and quoted value ",
|
||||||
model: JSONModel{Labels: `{job="foo", instance="bar"}`},
|
model: kinds.TestDataQuery{Labels: `{job="foo", instance="bar"}`},
|
||||||
expected: expectedTags,
|
expected: expectedTags,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "comma-separated non-quoted",
|
name: "comma-separated non-quoted",
|
||||||
model: JSONModel{Labels: `job=foo, instance=bar`},
|
model: kinds.TestDataQuery{Labels: `job=foo, instance=bar`},
|
||||||
expected: expectedTags,
|
expected: expectedTags,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "comma-separated quoted",
|
name: "comma-separated quoted",
|
||||||
model: JSONModel{Labels: `job="foo"", instance="bar"`},
|
model: kinds.TestDataQuery{Labels: `job="foo"", instance="bar"`},
|
||||||
expected: expectedTags,
|
expected: expectedTags,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "comma-separated with spaces, non quoted",
|
name: "comma-separated with spaces, non quoted",
|
||||||
model: JSONModel{Labels: `job = foo,instance = bar`},
|
model: kinds.TestDataQuery{Labels: `job = foo,instance = bar`},
|
||||||
expected: expectedTags,
|
expected: expectedTags,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "expands $seriesIndex",
|
name: "expands $seriesIndex",
|
||||||
model: JSONModel{Labels: `job=series-$seriesIndex,instance=bar`},
|
model: kinds.TestDataQuery{Labels: `job=series-$seriesIndex,instance=bar`},
|
||||||
expected: data.Labels{
|
expected: data.Labels{
|
||||||
"job": fmt.Sprintf("series-%d", seriesIndex),
|
"job": fmt.Sprintf("series-%d", seriesIndex),
|
||||||
"instance": "bar",
|
"instance": "bar",
|
||||||
|
@ -10,6 +10,7 @@ import (
|
|||||||
"github.com/grafana/grafana-plugin-sdk-go/backend/resource/httpadapter"
|
"github.com/grafana/grafana-plugin-sdk-go/backend/resource/httpadapter"
|
||||||
"github.com/grafana/grafana-plugin-sdk-go/data"
|
"github.com/grafana/grafana-plugin-sdk-go/data"
|
||||||
|
|
||||||
|
"github.com/grafana/grafana/pkg/tsdb/grafana-testdata-datasource/kinds"
|
||||||
"github.com/grafana/grafana/pkg/tsdb/grafana-testdata-datasource/sims"
|
"github.com/grafana/grafana/pkg/tsdb/grafana-testdata-datasource/sims"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -19,7 +20,7 @@ import (
|
|||||||
func ProvideService() *Service {
|
func ProvideService() *Service {
|
||||||
s := &Service{
|
s := &Service{
|
||||||
queryMux: datasource.NewQueryTypeMux(),
|
queryMux: datasource.NewQueryTypeMux(),
|
||||||
scenarios: map[string]*Scenario{},
|
scenarios: map[kinds.TestDataQueryType]*Scenario{},
|
||||||
frame: data.NewFrame("testdata",
|
frame: data.NewFrame("testdata",
|
||||||
data.NewField("Time", nil, make([]time.Time, 1)),
|
data.NewField("Time", nil, make([]time.Time, 1)),
|
||||||
data.NewField("Value", nil, make([]float64, 1)),
|
data.NewField("Value", nil, make([]float64, 1)),
|
||||||
@ -48,7 +49,7 @@ func ProvideService() *Service {
|
|||||||
|
|
||||||
type Service struct {
|
type Service struct {
|
||||||
logger log.Logger
|
logger log.Logger
|
||||||
scenarios map[string]*Scenario
|
scenarios map[kinds.TestDataQueryType]*Scenario
|
||||||
frame *data.Frame
|
frame *data.Frame
|
||||||
labelFrame *data.Frame
|
labelFrame *data.Frame
|
||||||
queryMux *datasource.QueryTypeMux
|
queryMux *datasource.QueryTypeMux
|
||||||
|
@ -3,7 +3,7 @@ import React from 'react';
|
|||||||
import { MetadataInspectorProps } from '@grafana/data';
|
import { MetadataInspectorProps } from '@grafana/data';
|
||||||
import { Stack } from '@grafana/ui';
|
import { Stack } from '@grafana/ui';
|
||||||
|
|
||||||
import { TestDataDataQuery } from './dataquery.gen';
|
import { TestDataDataQuery } from './dataquery';
|
||||||
import { TestDataDataSource } from './datasource';
|
import { TestDataDataSource } from './datasource';
|
||||||
|
|
||||||
export type Props = MetadataInspectorProps<TestDataDataSource, TestDataDataQuery>;
|
export type Props = MetadataInspectorProps<TestDataDataSource, TestDataDataQuery>;
|
||||||
|
@ -5,7 +5,7 @@ import React from 'react';
|
|||||||
import { QueryEditor, Props } from './QueryEditor';
|
import { QueryEditor, Props } from './QueryEditor';
|
||||||
import { scenarios } from './__mocks__/scenarios';
|
import { scenarios } from './__mocks__/scenarios';
|
||||||
import { defaultQuery } from './constants';
|
import { defaultQuery } from './constants';
|
||||||
import { TestDataQueryType } from './dataquery.gen';
|
import { TestDataQueryType } from './dataquery';
|
||||||
import { TestDataDataSource } from './datasource';
|
import { TestDataDataSource } from './datasource';
|
||||||
import { defaultStreamQuery } from './runStreams';
|
import { defaultStreamQuery } from './runStreams';
|
||||||
|
|
||||||
|
@ -17,7 +17,7 @@ import { RawFrameEditor } from './components/RawFrameEditor';
|
|||||||
import { SimulationQueryEditor } from './components/SimulationQueryEditor';
|
import { SimulationQueryEditor } from './components/SimulationQueryEditor';
|
||||||
import { USAQueryEditor, usaQueryModes } from './components/USAQueryEditor';
|
import { USAQueryEditor, usaQueryModes } from './components/USAQueryEditor';
|
||||||
import { defaultCSVWaveQuery, defaultPulseQuery, defaultQuery } from './constants';
|
import { defaultCSVWaveQuery, defaultPulseQuery, defaultQuery } from './constants';
|
||||||
import { CSVWave, NodesQuery, TestDataDataQuery, TestDataQueryType, USAQuery } from './dataquery.gen';
|
import { CSVWave, NodesQuery, TestDataDataQuery, TestDataQueryType, USAQuery } from './dataquery';
|
||||||
import { TestDataDataSource } from './datasource';
|
import { TestDataDataSource } from './datasource';
|
||||||
import { defaultStreamQuery } from './runStreams';
|
import { defaultStreamQuery } from './runStreams';
|
||||||
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
import { TestDataQueryType } from '../dataquery.gen';
|
import { TestDataQueryType } from '../dataquery';
|
||||||
|
|
||||||
export const scenarios = [
|
export const scenarios = [
|
||||||
{
|
{
|
||||||
|
@ -3,7 +3,7 @@ import React, { PureComponent, useState } from 'react';
|
|||||||
import { Button, InlineField, InlineFieldRow, Input } from '@grafana/ui';
|
import { Button, InlineField, InlineFieldRow, Input } from '@grafana/ui';
|
||||||
|
|
||||||
import { defaultCSVWaveQuery } from '../constants';
|
import { defaultCSVWaveQuery } from '../constants';
|
||||||
import type { CSVWave } from '../dataquery.gen';
|
import type { CSVWave } from '../dataquery';
|
||||||
|
|
||||||
interface WavesProps {
|
interface WavesProps {
|
||||||
waves?: CSVWave[];
|
waves?: CSVWave[];
|
||||||
|
@ -2,7 +2,7 @@ import React from 'react';
|
|||||||
|
|
||||||
import { Input, InlineFieldRow, InlineField, Select } from '@grafana/ui';
|
import { Input, InlineFieldRow, InlineField, Select } from '@grafana/ui';
|
||||||
|
|
||||||
import { NodesQuery, TestDataDataQuery } from '../dataquery.gen';
|
import { NodesQuery, TestDataDataQuery } from '../dataquery';
|
||||||
|
|
||||||
export interface Props {
|
export interface Props {
|
||||||
onChange: (value: NodesQuery) => void;
|
onChange: (value: NodesQuery) => void;
|
||||||
|
@ -3,7 +3,7 @@ import React, { ChangeEvent } from 'react';
|
|||||||
import { InlineField, InlineFieldRow, Input } from '@grafana/ui';
|
import { InlineField, InlineFieldRow, Input } from '@grafana/ui';
|
||||||
|
|
||||||
import { EditorProps } from '../QueryEditor';
|
import { EditorProps } from '../QueryEditor';
|
||||||
import { PulseWaveQuery } from '../dataquery.gen';
|
import { PulseWaveQuery } from '../dataquery';
|
||||||
|
|
||||||
const fields: Array<{
|
const fields: Array<{
|
||||||
label: string;
|
label: string;
|
||||||
|
@ -4,7 +4,7 @@ import { selectors } from '@grafana/e2e-selectors';
|
|||||||
import { InlineField, InlineFieldRow, Input } from '@grafana/ui';
|
import { InlineField, InlineFieldRow, Input } from '@grafana/ui';
|
||||||
|
|
||||||
import { EditorProps } from '../QueryEditor';
|
import { EditorProps } from '../QueryEditor';
|
||||||
import { TestDataDataQuery } from '../dataquery.gen';
|
import { TestDataDataQuery } from '../dataquery';
|
||||||
|
|
||||||
const randomWalkFields: Array<{
|
const randomWalkFields: Array<{
|
||||||
label: string;
|
label: string;
|
||||||
|
@ -5,7 +5,7 @@ import { DataFrameJSON, SelectableValue } from '@grafana/data';
|
|||||||
import { InlineField, InlineFieldRow, InlineSwitch, Input, Label, Select } from '@grafana/ui';
|
import { InlineField, InlineFieldRow, InlineSwitch, Input, Label, Select } from '@grafana/ui';
|
||||||
|
|
||||||
import { EditorProps } from '../QueryEditor';
|
import { EditorProps } from '../QueryEditor';
|
||||||
import { SimulationQuery } from '../dataquery.gen';
|
import { SimulationQuery } from '../dataquery';
|
||||||
|
|
||||||
import { SimulationSchemaForm } from './SimulationSchemaForm';
|
import { SimulationSchemaForm } from './SimulationSchemaForm';
|
||||||
|
|
||||||
|
@ -3,7 +3,7 @@ import React from 'react';
|
|||||||
import { SelectableValue } from '@grafana/data';
|
import { SelectableValue } from '@grafana/data';
|
||||||
import { InlineFieldRow, InlineField, Select, MultiSelect, Input } from '@grafana/ui';
|
import { InlineFieldRow, InlineField, Select, MultiSelect, Input } from '@grafana/ui';
|
||||||
|
|
||||||
import { USAQuery } from '../dataquery.gen';
|
import { USAQuery } from '../dataquery';
|
||||||
|
|
||||||
export interface Props {
|
export interface Props {
|
||||||
onChange: (value: USAQuery) => void;
|
onChange: (value: USAQuery) => void;
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
import { CSVWave, PulseWaveQuery, TestDataDataQuery, TestDataQueryType } from './dataquery.gen';
|
import { CSVWave, PulseWaveQuery, TestDataDataQuery, TestDataQueryType } from './dataquery';
|
||||||
|
|
||||||
export const defaultPulseQuery: PulseWaveQuery = {
|
export const defaultPulseQuery: PulseWaveQuery = {
|
||||||
timeStep: 60,
|
timeStep: 60,
|
||||||
|
@ -1,117 +0,0 @@
|
|||||||
// Copyright 2023 Grafana Labs
|
|
||||||
//
|
|
||||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
// you may not use this file except in compliance with the License.
|
|
||||||
// You may obtain a copy of the License at
|
|
||||||
//
|
|
||||||
// http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
//
|
|
||||||
// Unless required by applicable law or agreed to in writing, software
|
|
||||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
// See the License for the specific language governing permissions and
|
|
||||||
// limitations under the License.
|
|
||||||
|
|
||||||
package grafanaplugin
|
|
||||||
|
|
||||||
import (
|
|
||||||
"github.com/grafana/grafana/packages/grafana-schema/src/common"
|
|
||||||
)
|
|
||||||
|
|
||||||
composableKinds: DataQuery: {
|
|
||||||
maturity: "experimental"
|
|
||||||
|
|
||||||
lineage: {
|
|
||||||
schemas: [{
|
|
||||||
version: [0, 0]
|
|
||||||
schema: {
|
|
||||||
common.DataQuery
|
|
||||||
alias?: string
|
|
||||||
scenarioId?: #TestDataQueryType & (*"random_walk" | _)
|
|
||||||
stringInput?: string
|
|
||||||
stream?: #StreamingQuery
|
|
||||||
pulseWave?: #PulseWaveQuery
|
|
||||||
sim?: #SimulationQuery
|
|
||||||
csvWave?: [...#CSVWave] //TODO can we prevent partial from being generated
|
|
||||||
labels?: string
|
|
||||||
lines?: int64
|
|
||||||
levelColumn?: bool
|
|
||||||
channel?: string
|
|
||||||
nodes?: #NodesQuery
|
|
||||||
csvFileName?: string
|
|
||||||
csvContent?: string
|
|
||||||
rawFrameContent?: string
|
|
||||||
seriesCount?: int32
|
|
||||||
usa?: #USAQuery
|
|
||||||
errorType?: "server_panic" | "frontend_exception" | "frontend_observable"
|
|
||||||
spanCount?: int32
|
|
||||||
points?: [...[...string | int64]]
|
|
||||||
|
|
||||||
// Drop percentage (the chance we will lose a point 0-100)
|
|
||||||
dropPercent?: float64
|
|
||||||
|
|
||||||
flamegraphDiff?: bool
|
|
||||||
|
|
||||||
#TestDataQueryType: "random_walk" | "slow_query" | "random_walk_with_error" | "random_walk_table" | "exponential_heatmap_bucket_data" | "linear_heatmap_bucket_data" | "no_data_points" | "datapoints_outside_range" | "csv_metric_values" | "predictable_pulse" | "predictable_csv_wave" | "streaming_client" | "simulation" | "usa" | "live" | "grafana_api" | "arrow" | "annotations" | "table_static" | "server_error_500" | "logs" | "node_graph" | "flame_graph" | "raw_frame" | "csv_file" | "csv_content" | "trace" | "manual_entry" | "variables-query" @cuetsy(kind="enum", memberNames="RandomWalk|SlowQuery|RandomWalkWithError|RandomWalkTable|ExponentialHeatmapBucketData|LinearHeatmapBucketData|NoDataPoints|DataPointsOutsideRange|CSVMetricValues|PredictablePulse|PredictableCSVWave|StreamingClient|Simulation|USA|Live|GrafanaAPI|Arrow|Annotations|TableStatic|ServerError500|Logs|NodeGraph|FlameGraph|RawFrame|CSVFile|CSVContent|Trace|ManualEntry|VariablesQuery")
|
|
||||||
|
|
||||||
#StreamingQuery: {
|
|
||||||
type: "signal" | "logs" | "fetch" | "traces"
|
|
||||||
speed: int32
|
|
||||||
spread: int32
|
|
||||||
noise: int32
|
|
||||||
bands?: int32
|
|
||||||
url?: string
|
|
||||||
} @cuetsy(kind="interface")
|
|
||||||
|
|
||||||
#PulseWaveQuery: {
|
|
||||||
timeStep?: int64
|
|
||||||
onCount?: int64
|
|
||||||
offCount?: int64
|
|
||||||
onValue?: float64
|
|
||||||
offValue?: float64
|
|
||||||
} @cuetsy(kind="interface")
|
|
||||||
|
|
||||||
#SimulationQuery: {
|
|
||||||
key: {
|
|
||||||
type: string
|
|
||||||
tick: float64
|
|
||||||
uid?: string
|
|
||||||
}
|
|
||||||
config?: {...}
|
|
||||||
stream?: bool
|
|
||||||
last?: bool
|
|
||||||
} @cuetsy(kind="interface")
|
|
||||||
|
|
||||||
#NodesQuery: {
|
|
||||||
type?: "random" | "response_small" | "response_medium" | "random edges" | "feature_showcase"
|
|
||||||
count?: int64
|
|
||||||
seed?: int64
|
|
||||||
} @cuetsy(kind="interface")
|
|
||||||
|
|
||||||
#USAQuery: {
|
|
||||||
mode?: string
|
|
||||||
period?: string
|
|
||||||
fields?: [...string]
|
|
||||||
states?: [...string]
|
|
||||||
} @cuetsy(kind="interface")
|
|
||||||
|
|
||||||
#CSVWave: {
|
|
||||||
timeStep?: int64
|
|
||||||
name?: string
|
|
||||||
valuesCSV?: string
|
|
||||||
labels?: string
|
|
||||||
} @cuetsy(kind="interface")
|
|
||||||
|
|
||||||
// TODO: Should this live here given it's not used in the dataquery?
|
|
||||||
#Scenario: {
|
|
||||||
id: string
|
|
||||||
name: string
|
|
||||||
stringInput: string
|
|
||||||
description?: string
|
|
||||||
hideAliasField?: bool
|
|
||||||
} @cuetsy(kind="interface")
|
|
||||||
}
|
|
||||||
}]
|
|
||||||
lenses: []
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,12 +1,5 @@
|
|||||||
// Code generated - EDITING IS FUTILE. DO NOT EDIT.
|
// Code was originally generated from cue
|
||||||
//
|
// It must now be updated manually
|
||||||
// Generated by:
|
|
||||||
// public/app/plugins/gen.go
|
|
||||||
// Using jennies:
|
|
||||||
// TSTypesJenny
|
|
||||||
// PluginTsTypesJenny
|
|
||||||
//
|
|
||||||
// Run 'make gen-cue' from repository root to regenerate.
|
|
||||||
|
|
||||||
import * as common from '@grafana/schema';
|
import * as common from '@grafana/schema';
|
||||||
|
|
||||||
@ -47,7 +40,7 @@ export interface StreamingQuery {
|
|||||||
noise: number;
|
noise: number;
|
||||||
speed: number;
|
speed: number;
|
||||||
spread: number;
|
spread: number;
|
||||||
type: ('signal' | 'logs' | 'fetch' | 'traces');
|
type: 'signal' | 'logs' | 'fetch' | 'traces';
|
||||||
url?: string;
|
url?: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -73,14 +66,14 @@ export interface SimulationQuery {
|
|||||||
export interface NodesQuery {
|
export interface NodesQuery {
|
||||||
count?: number;
|
count?: number;
|
||||||
seed?: number;
|
seed?: number;
|
||||||
type?: ('random' | 'response_small' | 'response_medium' | 'random edges' | 'feature_showcase');
|
type?: 'random' | 'response_small' | 'response_medium' | 'random edges' | 'feature_showcase';
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface USAQuery {
|
export interface USAQuery {
|
||||||
fields?: Array<string>;
|
fields?: string[];
|
||||||
mode?: string;
|
mode?: string;
|
||||||
period?: string;
|
period?: string;
|
||||||
states?: Array<string>;
|
states?: string[];
|
||||||
}
|
}
|
||||||
|
|
||||||
export const defaultUSAQuery: Partial<USAQuery> = {
|
export const defaultUSAQuery: Partial<USAQuery> = {
|
||||||
@ -111,18 +104,18 @@ export interface TestDataDataQuery extends common.DataQuery {
|
|||||||
channel?: string;
|
channel?: string;
|
||||||
csvContent?: string;
|
csvContent?: string;
|
||||||
csvFileName?: string;
|
csvFileName?: string;
|
||||||
csvWave?: Array<CSVWave>; // TODO can we prevent partial from being generated
|
csvWave?: CSVWave[]; // TODO can we prevent partial from being generated
|
||||||
/**
|
/**
|
||||||
* Drop percentage (the chance we will lose a point 0-100)
|
* Drop percentage (the chance we will lose a point 0-100)
|
||||||
*/
|
*/
|
||||||
dropPercent?: number;
|
dropPercent?: number;
|
||||||
errorType?: ('server_panic' | 'frontend_exception' | 'frontend_observable');
|
errorType?: 'server_panic' | 'frontend_exception' | 'frontend_observable';
|
||||||
flamegraphDiff?: boolean;
|
flamegraphDiff?: boolean;
|
||||||
labels?: string;
|
labels?: string;
|
||||||
levelColumn?: boolean;
|
levelColumn?: boolean;
|
||||||
lines?: number;
|
lines?: number;
|
||||||
nodes?: NodesQuery;
|
nodes?: NodesQuery;
|
||||||
points?: Array<Array<(string | number)>>;
|
points?: Array<Array<string | number>>;
|
||||||
pulseWave?: PulseWaveQuery;
|
pulseWave?: PulseWaveQuery;
|
||||||
rawFrameContent?: string;
|
rawFrameContent?: string;
|
||||||
scenarioId?: TestDataQueryType;
|
scenarioId?: TestDataQueryType;
|
@ -20,7 +20,7 @@ import {
|
|||||||
} from '@grafana/data';
|
} from '@grafana/data';
|
||||||
import { DataSourceWithBackend, getBackendSrv, getGrafanaLiveSrv, getTemplateSrv, TemplateSrv } from '@grafana/runtime';
|
import { DataSourceWithBackend, getBackendSrv, getGrafanaLiveSrv, getTemplateSrv, TemplateSrv } from '@grafana/runtime';
|
||||||
|
|
||||||
import { Scenario, TestDataDataQuery, TestDataQueryType } from './dataquery.gen';
|
import { Scenario, TestDataDataQuery, TestDataQueryType } from './dataquery';
|
||||||
import { queryMetricTree } from './metricTree';
|
import { queryMetricTree } from './metricTree';
|
||||||
import { generateRandomEdges, generateRandomNodes, generateShowcaseData, savedNodesResponse } from './nodeGraphUtils';
|
import { generateRandomEdges, generateRandomNodes, generateShowcaseData, savedNodesResponse } from './nodeGraphUtils';
|
||||||
import { runStream } from './runStreams';
|
import { runStream } from './runStreams';
|
||||||
|
@ -20,7 +20,7 @@ import {
|
|||||||
} from '@grafana/data';
|
} from '@grafana/data';
|
||||||
|
|
||||||
import { getRandomLine } from './LogIpsum';
|
import { getRandomLine } from './LogIpsum';
|
||||||
import { TestDataDataQuery, StreamingQuery } from './dataquery.gen';
|
import { TestDataDataQuery, StreamingQuery } from './dataquery';
|
||||||
|
|
||||||
export const defaultStreamQuery: StreamingQuery = {
|
export const defaultStreamQuery: StreamingQuery = {
|
||||||
type: 'signal',
|
type: 'signal',
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
import { StandardVariableQuery, StandardVariableSupport } from '@grafana/data';
|
import { StandardVariableQuery, StandardVariableSupport } from '@grafana/data';
|
||||||
|
|
||||||
import { TestDataDataQuery, TestDataQueryType } from './dataquery.gen';
|
import { TestDataDataQuery, TestDataQueryType } from './dataquery';
|
||||||
import { TestDataDataSource } from './datasource';
|
import { TestDataDataSource } from './datasource';
|
||||||
|
|
||||||
export class TestDataVariableSupport extends StandardVariableSupport<TestDataDataSource> {
|
export class TestDataVariableSupport extends StandardVariableSupport<TestDataDataSource> {
|
||||||
|
Loading…
Reference in New Issue
Block a user