query.editor.html 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412
  1. <query-editor-row query-ctrl="ctrl" can-collapse="false" has-text-edit-mode="ctrl.target.queryType === 'Application Insights'">
  2. <div class="gf-form-inline">
  3. <div class="gf-form">
  4. <label class="gf-form-label query-keyword width-9">Service</label>
  5. <div class="gf-form-select-wrapper gf-form-select-wrapper--caret-indent">
  6. <select class="gf-form-input service-dropdown" ng-model="ctrl.target.queryType" ng-options="f as f for f in ['Application Insights', 'Azure Monitor', 'Azure Log Analytics']"
  7. ng-change="ctrl.onQueryTypeChange()"></select>
  8. </div>
  9. </div>
  10. <div class="gf-form" ng-if="ctrl.target.queryType === 'Azure Monitor'">
  11. <label class="gf-form-label query-keyword width-9">Query Mode</label>
  12. <div class="gf-form-select-wrapper gf-form-select-wrapper--caret-indent">
  13. <select class="gf-form-input service-dropdown" ng-model="ctrl.target.azureMonitor.queryMode"
  14. ng-options="f.value as f.text for f in [{value: 'singleResource', text: 'Single Resource'}, {value: 'crossResource', text: 'Multiple Resources'}]"
  15. ng-change="ctrl.refresh()"></select>
  16. </div>
  17. </div>
  18. <div class="gf-form gf-form--grow">
  19. <div class="gf-form-label gf-form-label--grow"></div>
  20. </div>
  21. </div>
  22. <div class="gf-form-inline" ng-if="(ctrl.target.queryType === 'Azure Monitor' && ctrl.target.azureMonitor.queryMode === 'singleResource') || ctrl.target.queryType === 'Azure Log Analytics'">
  23. <div class="gf-form" >
  24. <label class="gf-form-label query-keyword width-9">Subscription</label>
  25. <gf-form-dropdown model="ctrl.target.subscription" allow-custom="true" lookup-text="true"
  26. get-options="ctrl.getSubscriptions()" on-change="ctrl.onSubscriptionChange()" css-class="min-width-6">
  27. </gf-form-dropdown>
  28. </div>
  29. <div class="gf-form gf-form--grow">
  30. <div class="gf-form-label gf-form-label--grow"></div>
  31. </div>
  32. </div>
  33. <div class="gf-form-inline" ng-if="(ctrl.target.queryType === 'Azure Monitor' && ctrl.target.azureMonitor.queryMode === 'crossResource')">
  34. <div class="gf-form">
  35. <label class="gf-form-label query-keyword width-9">Subscriptions</label>
  36. <multi-select ng-if="ctrl.subscriptionValues.length"
  37. initial-values="ctrl.target.subscriptions"
  38. options="ctrl.subscriptionValues"
  39. on-updated="ctrl.onSubscriptionsChange(values)">
  40. </multi-select>
  41. </div>
  42. <div class="gf-form gf-form--grow">
  43. <div class="gf-form-label gf-form-label--grow"></div>
  44. </div>
  45. </div>
  46. <div class="gf-form-inline" ng-if="ctrl.target.queryType === 'Azure Monitor' && ctrl.target.azureMonitor.queryMode === 'singleResource'">
  47. <div class="gf-form">
  48. <label class="gf-form-label query-keyword width-9">Resource Group</label>
  49. <gf-form-dropdown model="ctrl.target.azureMonitor.data[ctrl.target.azureMonitor.queryMode].resourceGroup" allow-custom="true" lookup-text="true"
  50. get-options="ctrl.getResourceGroups($query)" on-change="ctrl.onResourceGroupChange()" css-class="min-width-12">
  51. </gf-form-dropdown>
  52. </div>
  53. <div class="gf-form">
  54. <label class="gf-form-label query-keyword width-9">Namespace</label>
  55. <gf-form-dropdown model="ctrl.target.azureMonitor.data[ctrl.target.azureMonitor.queryMode].metricDefinition" allow-custom="true" lookup-text="true"
  56. get-options="ctrl.getMetricDefinitions($query)" on-change="ctrl.onMetricDefinitionChange()" css-class="min-width-20">
  57. </gf-form-dropdown>
  58. </div>
  59. <div class="gf-form">
  60. <label class="gf-form-label query-keyword width-9">Resource Name</label>
  61. <gf-form-dropdown model="ctrl.target.azureMonitor.data[ctrl.target.azureMonitor.queryMode].resourceName" allow-custom="true" lookup-text="true"
  62. get-options="ctrl.getResourceNames($query)" on-change="ctrl.onResourceNameChange()" css-class="min-width-12">
  63. </gf-form-dropdown>
  64. </div>
  65. <div class="gf-form gf-form--grow">
  66. <div class="gf-form-label gf-form-label--grow"></div>
  67. </div>
  68. </div>
  69. <div class="gf-form-inline" ng-if="ctrl.target.azureMonitor.queryMode === 'crossResource'">
  70. <div class="gf-form">
  71. <label class="gf-form-label query-keyword width-9">Locations</label>
  72. <multi-select ng-if="ctrl.locations.length"
  73. initial-values="ctrl.target.azureMonitor.data.crossResource.locations"
  74. options="ctrl.locations"
  75. on-updated="ctrl.onLocationsChange(values)">
  76. </multi-select>
  77. </div>
  78. <div class="gf-form gf-form--grow">
  79. <div class="gf-form-label gf-form-label--grow"></div>
  80. </div>
  81. </div>
  82. <div class="gf-form-inline" ng-if="ctrl.target.azureMonitor.queryMode === 'crossResource'">
  83. <div class="gf-form">
  84. <label class="gf-form-label query-keyword width-9">Resource Groups</label>
  85. <multi-select class="az-multi-picker"
  86. initial-values="ctrl.target.azureMonitor.data.crossResource.resourceGroups"
  87. options="ctrl.resourceGroups"
  88. on-updated="ctrl.onCrossResourceGroupChange(values)">
  89. </multi-select>
  90. </div>
  91. <div class="gf-form gf-form--grow">
  92. <div class="gf-form-label gf-form-label--grow"></div>
  93. </div>
  94. </div>
  95. <div class="gf-form-inline" ng-if="ctrl.target.azureMonitor.queryMode === 'crossResource'">
  96. <div class="gf-form">
  97. <label class="gf-form-label query-keyword width-9">Resource Type</label>
  98. <gf-form-dropdown model="ctrl.target.azureMonitor.data.crossResource.metricDefinition" allow-custom="true" lookup-text="true"
  99. get-options="ctrl.getCrossResourceMetricDefinitions($query)" on-change="ctrl.onCrossResourceMetricDefinitionChange()" css-class="min-width-12">
  100. </gf-form-dropdown>
  101. </div>
  102. <div class="gf-form gf-form--grow">
  103. <div class="gf-form-label gf-form-label--grow"></div>
  104. </div>
  105. </div>
  106. <div class="gf-form-inline">
  107. <div class="gf-form" ng-if="ctrl.target.azureMonitor.queryMode === 'singleResource'">
  108. <label class="gf-form-label query-keyword width-9">Metric Namespace</label>
  109. <gf-form-dropdown model="ctrl.target.azureMonitor.data[ctrl.target.azureMonitor.queryMode].metricNamespace" allow-custom="true" lookup-text="true"
  110. get-options="ctrl.getMetricNamespaces($query)" on-change="ctrl.onMetricNamespacesChange()" css-class="min-width-12">
  111. </gf-form-dropdown>
  112. </div>
  113. <div class="gf-form">
  114. <label class="gf-form-label query-keyword width-9">Metric</label>
  115. <gf-form-dropdown ng-if="ctrl.target.azureMonitor.queryMode === 'singleResource'" model="ctrl.target.azureMonitor.data.singleResource.metricName" allow-custom="true" lookup-text="true"
  116. get-options="ctrl.getMetricNames($query)" on-change="ctrl.onMetricNameChange()" css-class="min-width-12">
  117. </gf-form-dropdown>
  118. <gf-form-dropdown ng-if="ctrl.target.azureMonitor.queryMode === 'crossResource'" model="ctrl.target.azureMonitor.data.crossResource.metricName" allow-custom="true" lookup-text="true"
  119. get-options="ctrl.getCrossResourceMetricNames($query)" on-change="ctrl.onCrossResourceMetricNameChange()" css-class="min-width-12">
  120. </gf-form-dropdown>
  121. </div>
  122. <div class="gf-form aggregation-dropdown-wrapper">
  123. <label class="gf-form-label query-keyword width-9">Aggregation</label>
  124. <div class="gf-form-select-wrapper gf-form-select-wrapper--caret-indent">
  125. <select class="gf-form-input width-11" ng-model="ctrl.target.azureMonitor.data[ctrl.target.azureMonitor.queryMode].aggregation" ng-options="f as f for f in ctrl.target.azureMonitor.data[ctrl.target.azureMonitor.queryMode].aggOptions"
  126. ng-change="ctrl.refresh()"></select>
  127. </div>
  128. </div>
  129. <div class="gf-form gf-form--grow">
  130. <div class="gf-form-label gf-form-label--grow"></div>
  131. </div>
  132. </div>
  133. <div class="gf-form-inline">
  134. <div class="gf-form">
  135. <label class="gf-form-label query-keyword width-9">Time Grain</label>
  136. <div class="gf-form-select-wrapper gf-form-select-wrapper--caret-indent timegrainunit-dropdown-wrapper">
  137. <select class="gf-form-input" ng-model="ctrl.target.azureMonitor.data[ctrl.target.azureMonitor.queryMode].timeGrain" ng-options="f.value as f.text for f in ctrl.target.azureMonitor.data[ctrl.target.azureMonitor.queryMode].timeGrains"
  138. ng-change="ctrl.refresh()"></select>
  139. </div>
  140. </div>
  141. <div class="gf-form" ng-show="ctrl.target.azureMonitor.data[ctrl.target.azureMonitor.queryMode].timeGrain.trim() === 'auto'">
  142. <label class="gf-form-label">Auto Interval</label>
  143. <label class="gf-form-label">{{ctrl.getAutoInterval()}}</label>
  144. </div>
  145. <div class="gf-form gf-form--grow">
  146. <div class="gf-form-label gf-form-label--grow"></div>
  147. </div>
  148. </div>
  149. <div class="gf-form-inline" ng-show="ctrl.target.azureMonitor.data[ctrl.target.azureMonitor.queryMode].dimensions.length > 0">
  150. <div class="gf-form">
  151. <label class="gf-form-label query-keyword width-9">Dimension</label>
  152. <div class="gf-form-select-wrapper gf-form-select-wrapper--caret-indent">
  153. <select class="gf-form-input min-width-12" ng-model="ctrl.target.azureMonitor.data[ctrl.target.azureMonitor.queryMode].dimension" ng-options="f.value as f.text for f in ctrl.target.azureMonitor.data[ctrl.target.azureMonitor.queryMode].dimensions"
  154. ng-change="ctrl.refresh()"></select>
  155. </div>
  156. </div>
  157. <div class="gf-form">
  158. <label class="gf-form-label query-keyword width-3">eq</label>
  159. <input type="text" class="gf-form-input width-17" ng-model="ctrl.target.azureMonitor.data[ctrl.target.azureMonitor.queryMode].dimensionFilter"
  160. spellcheck="false" placeholder="auto" ng-blur="ctrl.refresh()">
  161. </div>
  162. <div class="gf-form gf-form--grow">
  163. <div class="gf-form-label gf-form-label--grow"></div>
  164. </div>
  165. </div>
  166. <div class="gf-form-inline">
  167. <div class="gf-form">
  168. <label class="gf-form-label query-keyword width-9">Legend Format</label>
  169. <input type="text" class="gf-form-input width-30" ng-model="ctrl.target.azureMonitor.data[ctrl.target.azureMonitor.queryMode].alias" spellcheck="false"
  170. placeholder="alias patterns (see help for more info)" ng-blur="ctrl.refresh()">
  171. </div>
  172. <div class="gf-form gf-form--grow">
  173. <div class="gf-form-label gf-form-label--grow"></div>
  174. </div>
  175. </div>
  176. </div>
  177. <div ng-if="ctrl.target.queryType === 'Azure Log Analytics'">
  178. <div class="gf-form-inline">
  179. <div class="gf-form">
  180. <label class="gf-form-label query-keyword width-9">Workspace</label>
  181. <gf-form-dropdown model="ctrl.target.azureLogAnalytics.workspace" allow-custom="true" lookup-text="true"
  182. get-options="ctrl.workspaces" on-change="ctrl.refresh()" css-class="min-width-12">
  183. </gf-form-dropdown>
  184. <div class="gf-form">
  185. <div class="width-1"></div>
  186. </div>
  187. <div class="gf-form">
  188. <button class="btn btn-primary width-10" ng-click="ctrl.refresh()">Run</button>
  189. </div>
  190. <div class="gf-form">
  191. <label class="gf-form-label">(Run Query: Shift+Enter, Trigger Suggestion: Ctrl+Space)</label>
  192. </div>
  193. <div class="gf-form gf-form--grow">
  194. <div class="gf-form-label gf-form-label--grow"></div>
  195. </div>
  196. </div>
  197. </div>
  198. <div class="gf-form gf-form--grow">
  199. <kusto-editor
  200. class="gf-form gf-form--grow"
  201. query="ctrl.target.azureLogAnalytics.query"
  202. change="ctrl.onLogAnalyticsQueryChange"
  203. execute="ctrl.onLogAnalyticsQueryExecute"
  204. variables="ctrl.templateVariables"
  205. getSchema="ctrl.getAzureLogAnalyticsSchema"
  206. />
  207. </div>
  208. <div class="gf-form-inline">
  209. <div class="gf-form">
  210. <label class="gf-form-label query-keyword width-7">Format As</label>
  211. <div class="gf-form-select-wrapper">
  212. <select class="gf-form-input gf-size-auto" ng-model="ctrl.target.azureLogAnalytics.resultFormat" ng-options="f.value as f.text for f in ctrl.resultFormats"
  213. ng-change="ctrl.refresh()"></select>
  214. </div>
  215. </div>
  216. <div class="gf-form">
  217. <label class="gf-form-label query-keyword" ng-click="ctrl.showHelp = !ctrl.showHelp">
  218. Show Help
  219. <i class="fa fa-caret-down" ng-show="ctrl.showHelp"></i>
  220. <i class="fa fa-caret-right" ng-hide="ctrl.showHelp"></i>
  221. </label>
  222. </div>
  223. <div class="gf-form" ng-show="ctrl.lastQuery">
  224. <label class="gf-form-label query-keyword" ng-click="ctrl.showLastQuery = !ctrl.showLastQuery">
  225. Raw Query
  226. <i class="fa fa-caret-down" ng-show="ctrl.showLastQuery"></i>
  227. <i class="fa fa-caret-right" ng-hide="ctrl.showLastQuery"></i>
  228. </label>
  229. </div>
  230. <div class="gf-form gf-form--grow">
  231. <div class="gf-form-label gf-form-label--grow"></div>
  232. </div>
  233. </div>
  234. <div class="gf-form" ng-show="ctrl.showLastQuery">
  235. <pre class="gf-form-pre">{{ctrl.lastQuery}}</pre>
  236. </div>
  237. <div class="gf-form" ng-show="ctrl.showHelp">
  238. <pre class="gf-form-pre alert alert-info">
  239. Format as Table:
  240. - return any set of columns
  241. Format as Time series:
  242. - Requires a column of type datetime
  243. - returns the first column with a numeric datatype as the value
  244. - (Optional: returns the first column with type string to represent the series name. If no column is found the column name of the value column is used as series name)
  245. Example Time Series Query:
  246. AzureActivity
  247. | where $__timeFilter()
  248. | summarize count() by Category, bin(TimeGenerated, 60min)
  249. | order by TimeGenerated asc
  250. Macros:
  251. - $__timeFilter() -&gt; TimeGenerated &ge; datetime(2018-06-05T18:09:58.907Z) and TimeGenerated &le; datetime(2018-06-05T20:09:58.907Z)
  252. - $__timeFilter(datetimeColumn) -&gt; datetimeColumn &ge; datetime(2018-06-05T18:09:58.907Z) and datetimeColumn &le; datetime(2018-06-05T20:09:58.907Z)
  253. - $__escapeMulti($myTemplateVar) -&gt; $myTemplateVar should be a multi-value template variables that contains illegal characters
  254. - $__contains(aColumn, $myTemplateVar) -&gt; aColumn in ($myTemplateVar)
  255. If using the All option, then check the Include All Option checkbox and in the Custom all value field type in: all. If All is chosen -&gt; 1 == 1
  256. Or build your own conditionals using these built-in variables which just return the values:
  257. - $__timeFrom -&gt; datetime(2018-06-05T18:09:58.907Z)
  258. - $__timeTo -&gt; datetime(2018-06-05T20:09:58.907Z)
  259. - $__interval -&gt; 5m
  260. Examples:
  261. - ¡ where $__timeFilter
  262. - | where TimeGenerated &ge; $__timeFrom and TimeGenerated &le; $__timeTo
  263. - | summarize count() by Category, bin(TimeGenerated, $__interval)
  264. </pre>
  265. </div>
  266. </div>
  267. <div ng-if="ctrl.target.queryType === 'Application Insights'">
  268. <div ng-show="!ctrl.target.appInsights.rawQuery">
  269. <div class="gf-form-inline">
  270. <div class="gf-form">
  271. <label class="gf-form-label query-keyword width-9">Metric</label>
  272. <gf-form-dropdown model="ctrl.target.appInsights.metricName" allow-custom="true" lookup-text="true"
  273. get-options="ctrl.getAppInsightsMetricNames($query)" on-change="ctrl.onAppInsightsMetricNameChange()"
  274. css-class="min-width-20">
  275. </gf-form-dropdown>
  276. </div>
  277. <div class="gf-form">
  278. <label class="gf-form-label query-keyword width-9">Aggregation</label>
  279. <div class="gf-form-select-wrapper gf-form-select-wrapper--caret-indent">
  280. <select class="gf-form-input" ng-model="ctrl.target.appInsights.aggregation" ng-options="f as f for f in ctrl.target.appInsights.aggOptions"
  281. ng-change="ctrl.refresh()"></select>
  282. </div>
  283. </div>
  284. <div class="gf-form gf-form--grow">
  285. <div class="gf-form-label gf-form-label--grow"></div>
  286. </div>
  287. </div>
  288. <div class="gf-form-inline">
  289. <div class="gf-form">
  290. <label class="gf-form-label query-keyword width-9">Group By</label>
  291. <gf-form-dropdown allow-custom="true" ng-hide="ctrl.target.appInsights.groupBy !== 'none'" model="ctrl.target.appInsights.groupBy"
  292. lookup-text="true" get-options="ctrl.getAppInsightsGroupBySegments($query)" on-change="ctrl.refresh()"
  293. css-class="min-width-20">
  294. </gf-form-dropdown>
  295. <label class="gf-form-label min-width-20 pointer" ng-hide="ctrl.target.appInsights.groupBy === 'none'"
  296. ng-click="ctrl.resetAppInsightsGroupBy()">{{ctrl.target.appInsights.groupBy}}
  297. <i class="fa fa-remove"></i>
  298. </label>
  299. </div>
  300. <div class="gf-form-inline">
  301. <div class="gf-form">
  302. <label class="gf-form-label query-keyword width-9">Filter</label>
  303. <input type="text" class="gf-form-input width-17" ng-model="ctrl.target.appInsights.filter" spellcheck="false"
  304. placeholder="your/groupby eq 'a_value'" ng-blur="ctrl.refresh()">
  305. </div>
  306. </div>
  307. <div class="gf-form gf-form--grow">
  308. <div class="gf-form-label gf-form-label--grow"></div>
  309. </div>
  310. </div>
  311. <div class="gf-form-inline">
  312. <div class="gf-form">
  313. <label class="gf-form-label query-keyword width-9">Time Grain</label>
  314. <div class="gf-form-select-wrapper gf-form-select-wrapper--caret-indent">
  315. <select class="gf-form-input" ng-model="ctrl.target.appInsights.timeGrainType" ng-options="f as f for f in ['auto', 'none', 'specific']"
  316. ng-change="ctrl.updateTimeGrainType()"></select>
  317. </div>
  318. </div>
  319. <div class="gf-form" ng-hide="ctrl.target.appInsights.timeGrainType === 'auto' || ctrl.target.appInsights.timeGrainType === 'none'">
  320. <input type="text" class="gf-form-input width-3" ng-model="ctrl.target.appInsights.timeGrain" spellcheck="false"
  321. placeholder="" ng-blur="ctrl.refresh()">
  322. </div>
  323. <div class="gf-form" ng-hide="ctrl.target.appInsights.timeGrainType === 'auto' || ctrl.target.appInsights.timeGrainType === 'none'">
  324. <div class="gf-form-select-wrapper gf-form-select-wrapper--caret-indent timegrainunit-dropdown-wrapper">
  325. <select class="gf-form-input" ng-model="ctrl.target.appInsights.timeGrainUnit" ng-options="f as f for f in ['minute', 'hour', 'day', 'month', 'year']"
  326. ng-change="ctrl.refresh()"></select>
  327. </div>
  328. </div>
  329. <div class="gf-form" ng-hide="ctrl.target.appInsights.timeGrainType !== 'auto'">
  330. <label class="gf-form-label">Auto Interval</label>
  331. <label class="gf-form-label">{{ctrl.getAppInsightsAutoInterval()}}</label>
  332. </div>
  333. <div class="gf-form gf-form--grow">
  334. <div class="gf-form-label gf-form-label--grow"></div>
  335. </div>
  336. </div>
  337. <div class="gf-form-inline">
  338. <div class="gf-form">
  339. <label class="gf-form-label query-keyword width-9">Legend Format</label>
  340. <input type="text" class="gf-form-input width-30" ng-model="ctrl.target.appInsights.alias" spellcheck="false"
  341. placeholder="alias patterns (see help for more info)" ng-blur="ctrl.refresh()">
  342. </div>
  343. <div class="gf-form gf-form--grow">
  344. <div class="gf-form-label gf-form-label--grow"></div>
  345. </div>
  346. </div>
  347. </div>
  348. <div ng-show="ctrl.target.appInsights.rawQuery">
  349. <!-- <div class="gf-form">
  350. <textarea rows="3" class="gf-form-input" ng-model="ctrl.target.appInsights.rawQueryString" spellcheck="false"
  351. placeholder="Application Insights Query" ng-model-onblur ng-change="ctrl.refresh()"></textarea>
  352. </div> -->
  353. <div class="gf-form gf-form--grow">
  354. <kusto-editor
  355. class="gf-form gf-form--grow"
  356. query="ctrl.target.appInsights.rawQueryString"
  357. placeholder="'Application Insights Query'"
  358. change="ctrl.onAppInsightsQueryChange"
  359. execute="ctrl.onAppInsightsQueryExecute"
  360. variables="ctrl.templateVariables"
  361. getSchema="ctrl.getAppInsightsQuerySchema"
  362. />
  363. </div>
  364. <div class="gf-form-inline">
  365. <div class="gf-form">
  366. <label class="gf-form-label query-keyword width-9">X-axis</label>
  367. <gf-form-dropdown model="ctrl.target.appInsights.xaxis" allow-custom="true" placeholder="eg. 'timestamp'"
  368. get-options="ctrl.getAppInsightsColumns($query)" on-change="ctrl.onAppInsightsColumnChange()" css-class="min-width-20">
  369. </gf-form-dropdown>
  370. </div>
  371. <div class="gf-form">
  372. <label class="gf-form-label query-keyword width-9">Y-axis(es)</label>
  373. <gf-form-dropdown model="ctrl.target.appInsights.yaxis" allow-custom="true" get-options="ctrl.getAppInsightsColumns($query)"
  374. on-change="ctrl.onAppInsightsColumnChange()" css-class="min-width-20">
  375. </gf-form-dropdown>
  376. </div>
  377. <div class="gf-form gf-form--grow">
  378. <div class="gf-form-label gf-form-label--grow"></div>
  379. </div>
  380. </div>
  381. <div class="gf-form-inline">
  382. <div class="gf-form">
  383. <label class="gf-form-label query-keyword width-9">Split On</label>
  384. <gf-form-dropdown model="ctrl.target.appInsights.spliton" allow-custom="true" get-options="ctrl.getAppInsightsColumns($query)"
  385. on-change="ctrl.onAppInsightsColumnChange()" css-class="min-width-20">
  386. </gf-form-dropdown>
  387. </div>
  388. <div class="gf-form gf-form--grow">
  389. <div class="gf-form-label gf-form-label--grow"></div>
  390. </div>
  391. </div>
  392. </div>
  393. </div>
  394. <div class="gf-form" ng-show="ctrl.lastQueryError">
  395. <pre class="gf-form-pre alert alert-error">{{ctrl.lastQueryError}}</pre>
  396. </div>
  397. </query-editor-row>