{"version":3,"sources":["webpack:///./public/app/plugins/datasource/grafana/types.ts","webpack:///./public/app/plugins/datasource/grafana/datasource.ts","webpack:///./public/app/plugins/datasource/grafana/components/QueryEditor.tsx","webpack:///./public/app/plugins/datasource/grafana/annotation_ctrl.ts","webpack:///./public/app/plugins/datasource/grafana/module.ts"],"names":["GrafanaQueryType","GrafanaAnnotationType","defaultQuery","refId","queryType","RandomWalk","counter","GrafanaDatasource","instanceSettings","request","queries","targets","target","hide","LiveMeasurements","channel","measurements","push","getLiveMeasurementsObserver","scope","LiveChannelScope","Grafana","namespace","path","requestId","getRandomWalk","length","merge","of","options","Promise","resolve","templateSrv","getTemplateSrv","annotation","params","from","range","valueOf","to","limit","tags","matchAny","type","Dashboard","dashboard","id","dashboardId","Array","isArray","t","renderedValues","replace","value","join","split","tt","getBackendSrv","get","name","DataSourceApi","intervalMs","maxDataPoints","fetch","url","method","pipe","map","rsp","toDataQueryResponse","catchError","err","QueryEditor","queryTypes","label","description","onQueryTypeChange","sel","props","onChange","query","onRunQuery","onChannelChange","onMeasurementNameChanged","this","channels","currentChannel","find","c","names","info","undefined","foundName","getLiveMeasurements","getDistinctNames","console","log","className","grow","labelWidth","allowCustomValue","backspaceRemovesValue","placeholder","isClearable","noOptionsMessage","formatCreateLabel","input","v","isSearchable","title","featureState","FeatureState","alpha","defaults","renderMeasurementsQuery","PureComponent","annotationTypes","text","Tags","GrafanaAnnotationsQueryCtrl","types","templateUrl","plugin","DataSourcePlugin","setQueryEditor","setAnnotationQueryCtrl"],"mappings":"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","file":"grafanaPlugin.3817b8b78f33fc1605dc.js","sourcesContent":["import { AnnotationQuery, DataQuery } from '@grafana/data';\nimport { MeasurementsQuery } from '@grafana/runtime';\n\n//----------------------------------------------\n// Query\n//----------------------------------------------\n\nexport enum GrafanaQueryType {\n RandomWalk = 'randomWalk',\n LiveMeasurements = 'measurements',\n}\n\nexport interface GrafanaQuery extends DataQuery {\n queryType: GrafanaQueryType; // RandomWalk by default\n channel?: string;\n measurements?: MeasurementsQuery;\n}\n\nexport const defaultQuery: GrafanaQuery = {\n refId: 'A',\n queryType: GrafanaQueryType.RandomWalk,\n};\n\n//----------------------------------------------\n// Annotations\n//----------------------------------------------\n\nexport enum GrafanaAnnotationType {\n Dashboard = 'dashboard',\n Tags = 'tags',\n}\n\nexport interface GrafanaAnnotationQuery extends AnnotationQuery {\n type: GrafanaAnnotationType; // tags\n limit: number; // 100\n tags?: string[];\n matchAny?: boolean; // By default Grafana only shows annotations that match all tags in the query. Enabling this returns annotations that match any of the tags in the query.\n}\n","import _ from 'lodash';\nimport {\n AnnotationEvent,\n AnnotationQueryRequest,\n DataQueryRequest,\n DataQueryResponse,\n DataSourceApi,\n DataSourceInstanceSettings,\n LiveChannelScope,\n} from '@grafana/data';\n\nimport { GrafanaQuery, GrafanaAnnotationQuery, GrafanaAnnotationType, GrafanaQueryType } from './types';\nimport { getBackendSrv, getTemplateSrv, toDataQueryResponse, getLiveMeasurementsObserver } from '@grafana/runtime';\nimport { Observable, of, merge } from 'rxjs';\nimport { map, catchError } from 'rxjs/operators';\n\nlet counter = 100;\n\nexport class GrafanaDatasource extends DataSourceApi {\n constructor(instanceSettings: DataSourceInstanceSettings) {\n super(instanceSettings);\n }\n\n query(request: DataQueryRequest): Observable {\n const queries: Array> = [];\n for (const target of request.targets) {\n if (target.hide) {\n continue;\n }\n if (target.queryType === GrafanaQueryType.LiveMeasurements) {\n const { channel, measurements } = target;\n if (channel) {\n queries.push(\n getLiveMeasurementsObserver(\n {\n scope: LiveChannelScope.Grafana,\n namespace: 'measurements',\n path: channel,\n },\n `${request.requestId}.${counter++}`,\n measurements\n )\n );\n }\n } else {\n queries.push(getRandomWalk(request));\n }\n }\n // With a single query just return the results\n if (queries.length === 1) {\n return queries[0];\n }\n if (queries.length > 1) {\n return merge(...queries);\n }\n return of(); // nothing\n }\n\n metricFindQuery(options: any) {\n return Promise.resolve([]);\n }\n\n annotationQuery(options: AnnotationQueryRequest): Promise {\n const templateSrv = getTemplateSrv();\n const annotation = (options.annotation as unknown) as GrafanaAnnotationQuery;\n const params: any = {\n from: options.range.from.valueOf(),\n to: options.range.to.valueOf(),\n limit: annotation.limit,\n tags: annotation.tags,\n matchAny: annotation.matchAny,\n };\n\n if (annotation.type === GrafanaAnnotationType.Dashboard) {\n // if no dashboard id yet return\n if (!options.dashboard.id) {\n return Promise.resolve([]);\n }\n // filter by dashboard id\n params.dashboardId = options.dashboard.id;\n // remove tags filter if any\n delete params.tags;\n } else {\n // require at least one tag\n if (!Array.isArray(annotation.tags) || annotation.tags.length === 0) {\n return Promise.resolve([]);\n }\n const delimiter = '__delimiter__';\n const tags = [];\n for (const t of params.tags) {\n const renderedValues = templateSrv.replace(t, {}, (value: any) => {\n if (typeof value === 'string') {\n return value;\n }\n\n return value.join(delimiter);\n });\n for (const tt of renderedValues.split(delimiter)) {\n tags.push(tt);\n }\n }\n params.tags = tags;\n }\n\n return getBackendSrv().get(\n '/api/annotations',\n params,\n `grafana-data-source-annotations-${annotation.name}-${options.dashboard?.id}`\n );\n }\n\n testDatasource() {\n return Promise.resolve();\n }\n}\n\n// Note that the query does not actually matter\nfunction getRandomWalk(request: DataQueryRequest): Observable {\n const { intervalMs, maxDataPoints, range, requestId } = request;\n\n // Yes, this implementation ignores multiple targets! But that matches existing behavior\n const params: Record = {\n intervalMs,\n maxDataPoints,\n from: range.from.valueOf(),\n to: range.to.valueOf(),\n };\n\n return getBackendSrv()\n .fetch({\n url: '/api/tsdb/testdata/random-walk',\n method: 'GET',\n params,\n requestId,\n })\n .pipe(\n map((rsp: any) => {\n return toDataQueryResponse(rsp);\n }),\n catchError((err) => {\n return of(toDataQueryResponse(err));\n })\n );\n}\n","import defaults from 'lodash/defaults';\n\nimport React, { PureComponent } from 'react';\nimport { InlineField, Select, FeatureInfoBox } from '@grafana/ui';\nimport { QueryEditorProps, SelectableValue, LiveChannelScope, FeatureState } from '@grafana/data';\nimport { getLiveMeasurements, LiveMeasurements } from '@grafana/runtime';\nimport { GrafanaDatasource } from '../datasource';\nimport { defaultQuery, GrafanaQuery, GrafanaQueryType } from '../types';\n\ntype Props = QueryEditorProps;\n\nconst labelWidth = 12;\n\nexport class QueryEditor extends PureComponent {\n queryTypes: Array> = [\n {\n label: 'Random Walk',\n value: GrafanaQueryType.RandomWalk,\n description: 'Random signal within the selected time range',\n },\n {\n label: 'Live Measurements',\n value: GrafanaQueryType.LiveMeasurements,\n description: 'Stream real-time measurements from Grafana',\n },\n ];\n\n onQueryTypeChange = (sel: SelectableValue) => {\n const { onChange, query, onRunQuery } = this.props;\n onChange({ ...query, queryType: sel.value! });\n onRunQuery();\n };\n\n onChannelChange = (sel: SelectableValue) => {\n const { onChange, query, onRunQuery } = this.props;\n onChange({ ...query, channel: sel?.value });\n onRunQuery();\n };\n\n onMeasurementNameChanged = (sel: SelectableValue) => {\n const { onChange, query, onRunQuery } = this.props;\n onChange({\n ...query,\n measurements: {\n ...query.measurements,\n name: sel?.value,\n },\n });\n onRunQuery();\n };\n\n renderMeasurementsQuery() {\n let { channel, measurements } = this.props.query;\n const channels: Array> = [];\n let currentChannel = channels.find((c) => c.value === channel);\n if (channel && !currentChannel) {\n currentChannel = {\n value: channel,\n label: channel,\n description: `Connected to ${channel}`,\n };\n channels.push(currentChannel);\n }\n\n if (!measurements) {\n measurements = {};\n }\n const names: Array> = [\n { value: '', label: 'All measurements', description: 'Show every measurement streamed to this channel' },\n ];\n\n let info: LiveMeasurements | undefined = undefined;\n if (channel) {\n info = getLiveMeasurements({\n scope: LiveChannelScope.Grafana,\n namespace: 'measurements',\n path: channel,\n });\n\n let foundName = false;\n if (info) {\n for (const name of info.getDistinctNames()) {\n names.push({\n value: name,\n label: name,\n });\n if (name === measurements.name) {\n foundName = true;\n }\n }\n } else {\n console.log('NO INFO for', channel);\n }\n\n if (measurements.name && !foundName) {\n names.push({\n label: measurements.name,\n value: measurements.name,\n description: `Frames with name ${measurements.name}`,\n });\n }\n }\n\n return (\n <>\n
\n \n `Connect to: ${input}`}\n />\n \n
\n {channel && (\n
\n \n v.value === measurements?.name) || names[0]}\n onChange={this.onMeasurementNameChanged}\n allowCustomValue={true}\n backspaceRemovesValue={true}\n placeholder=\"Filter by name\"\n isClearable={true}\n noOptionsMessage=\"Filter by name\"\n formatCreateLabel={(input: string) => `Show: ${input}`}\n isSearchable={true}\n />\n \n
\n )}\n\n \n

\n This supports real-time event streams in Grafana core. This feature is under heavy development. Expect the\n interfaces and structures to change as this becomes more production ready.\n

\n
\n \n );\n }\n\n render() {\n const query = defaults(this.props.query, defaultQuery);\n return (\n <>\n
\n \n v.value === query.queryType) || this.queryTypes[0]}\n onChange={this.onQueryTypeChange}\n />\n \n
\n {query.queryType === GrafanaQueryType.LiveMeasurements && this.renderMeasurementsQuery()}\n \n );\n }\n}\n","import { SelectableValue } from '@grafana/data';\nimport { GrafanaAnnotationType } from './types';\n\nexport const annotationTypes: Array> = [\n { text: 'Dashboard', value: GrafanaAnnotationType.Dashboard },\n { text: 'Tags', value: GrafanaAnnotationType.Tags },\n];\n\nexport class GrafanaAnnotationsQueryCtrl {\n annotation: any;\n\n types = annotationTypes;\n\n constructor() {\n this.annotation.type = this.annotation.type || GrafanaAnnotationType.Tags;\n this.annotation.limit = this.annotation.limit || 100;\n }\n\n static templateUrl = 'partials/annotations.editor.html';\n}\n","import { DataSourcePlugin } from '@grafana/data';\nimport { GrafanaDatasource } from './datasource';\nimport { QueryEditor } from './components/QueryEditor';\nimport { GrafanaQuery } from './types';\nimport { GrafanaAnnotationsQueryCtrl } from './annotation_ctrl';\n\nexport const plugin = new DataSourcePlugin(GrafanaDatasource)\n .setQueryEditor(QueryEditor)\n .setAnnotationQueryCtrl(GrafanaAnnotationsQueryCtrl);\n"],"sourceRoot":""}