mirror of https://github.com/grafana/grafana
AzureMonitor: Kusto language support (#33528)
* Add Kusto custom language to Monaco * Load Kusto schema into monaco * cleanup + tests * cleanup + tests * cleanup :) * move monaco languages to a registrypull/33946/head
parent
4fabade35c
commit
72c9d806fd
@ -0,0 +1 @@ |
|||||||
|
export * from './languageRegistry'; |
@ -0,0 +1,7 @@ |
|||||||
|
import { Registry, RegistryItem } from '../utils/Registry'; |
||||||
|
|
||||||
|
export interface MonacoLanguageRegistryItem extends RegistryItem { |
||||||
|
init: () => Promise<void>; |
||||||
|
} |
||||||
|
|
||||||
|
export const monacoLanguageRegistry = new Registry<MonacoLanguageRegistryItem>(); |
File diff suppressed because one or more lines are too long
@ -1,37 +0,0 @@ |
|||||||
import ResponseParser from './response_parser'; |
|
||||||
import { expect } from '../../../../../test/lib/common'; |
|
||||||
|
|
||||||
describe('createSchemaFunctions', () => { |
|
||||||
describe('when called and results have functions', () => { |
|
||||||
it('then it should return correct result', () => { |
|
||||||
const functions = [ |
|
||||||
{ name: 'some name', body: 'some body', displayName: 'some displayName', category: 'some category' }, |
|
||||||
]; |
|
||||||
const parser = new ResponseParser({ functions }); |
|
||||||
|
|
||||||
const results = parser.createSchemaFunctions(); |
|
||||||
|
|
||||||
expect(results).toEqual({ |
|
||||||
['some name']: { |
|
||||||
Body: 'some body', |
|
||||||
DocString: 'some displayName', |
|
||||||
Folder: 'some category', |
|
||||||
FunctionKind: 'Unknown', |
|
||||||
InputParameters: [], |
|
||||||
Name: 'some name', |
|
||||||
OutputColumns: [], |
|
||||||
}, |
|
||||||
}); |
|
||||||
}); |
|
||||||
}); |
|
||||||
|
|
||||||
describe('when called and results have no functions', () => { |
|
||||||
it('then it should return an empty object', () => { |
|
||||||
const parser = new ResponseParser({}); |
|
||||||
|
|
||||||
const results = parser.createSchemaFunctions(); |
|
||||||
|
|
||||||
expect(results).toEqual({}); |
|
||||||
}); |
|
||||||
}); |
|
||||||
}); |
|
@ -0,0 +1,96 @@ |
|||||||
|
export interface AzureLogAnalyticsMetadata { |
||||||
|
functions: AzureLogAnalyticsMetadataFunction[]; |
||||||
|
resourceTypes: AzureLogAnalyticsMetadataResourceType[]; |
||||||
|
tables: AzureLogAnalyticsMetadataTable[]; |
||||||
|
solutions: AzureLogAnalyticsMetadataSolution[]; |
||||||
|
workspaces: AzureLogAnalyticsMetadataWorkspace[]; |
||||||
|
categories: AzureLogAnalyticsMetadataCategory[]; |
||||||
|
} |
||||||
|
|
||||||
|
export interface AzureLogAnalyticsMetadataCategory { |
||||||
|
id: string; |
||||||
|
displayName: string; |
||||||
|
related: AzureLogAnalyticsMetadataCategoryRelated; |
||||||
|
} |
||||||
|
|
||||||
|
export interface AzureLogAnalyticsMetadataCategoryRelated { |
||||||
|
tables: string[]; |
||||||
|
functions?: string[]; |
||||||
|
} |
||||||
|
|
||||||
|
export interface AzureLogAnalyticsMetadataFunction { |
||||||
|
id: string; |
||||||
|
name: string; |
||||||
|
displayName?: string; |
||||||
|
description: string; |
||||||
|
body: string; |
||||||
|
parameters?: string; |
||||||
|
related: AzureLogAnalyticsMetadataFunctionRelated; |
||||||
|
} |
||||||
|
|
||||||
|
export interface AzureLogAnalyticsMetadataFunctionRelated { |
||||||
|
solutions: string[]; |
||||||
|
categories?: string[]; |
||||||
|
tables: string[]; |
||||||
|
} |
||||||
|
|
||||||
|
export interface AzureLogAnalyticsMetadataResourceType { |
||||||
|
id: string; |
||||||
|
type: string; |
||||||
|
displayName: string; |
||||||
|
description: string; |
||||||
|
related: AzureLogAnalyticsMetadataResourceTypeRelated; |
||||||
|
} |
||||||
|
|
||||||
|
export interface AzureLogAnalyticsMetadataResourceTypeRelated { |
||||||
|
tables: string[]; |
||||||
|
workspaces: string[]; |
||||||
|
} |
||||||
|
|
||||||
|
export interface AzureLogAnalyticsMetadataSolution { |
||||||
|
id: string; |
||||||
|
name: string; |
||||||
|
related: AzureLogAnalyticsMetadataSolutionRelated; |
||||||
|
} |
||||||
|
|
||||||
|
export interface AzureLogAnalyticsMetadataSolutionRelated { |
||||||
|
tables: string[]; |
||||||
|
functions: string[]; |
||||||
|
workspaces: string[]; |
||||||
|
} |
||||||
|
|
||||||
|
export interface AzureLogAnalyticsMetadataTable { |
||||||
|
id: string; |
||||||
|
name: string; |
||||||
|
description?: string; |
||||||
|
timespanColumn: string; |
||||||
|
columns: AzureLogAnalyticsMetadataColumn[]; |
||||||
|
related: AzureLogAnalyticsMetadataTableRelated; |
||||||
|
isTroubleshootingAllowed?: boolean; |
||||||
|
hasData?: boolean; |
||||||
|
} |
||||||
|
|
||||||
|
export interface AzureLogAnalyticsMetadataColumn { |
||||||
|
name: string; |
||||||
|
type: string; |
||||||
|
description?: string; |
||||||
|
isPreferredFacet?: boolean; |
||||||
|
} |
||||||
|
|
||||||
|
export interface AzureLogAnalyticsMetadataTableRelated { |
||||||
|
categories?: string[]; |
||||||
|
solutions: string[]; |
||||||
|
functions?: string[]; |
||||||
|
} |
||||||
|
|
||||||
|
export interface AzureLogAnalyticsMetadataWorkspace { |
||||||
|
id: string; |
||||||
|
resourceId: string; |
||||||
|
name: string; |
||||||
|
region: string; |
||||||
|
related: AzureLogAnalyticsMetadataWorkspaceRelated; |
||||||
|
} |
||||||
|
|
||||||
|
export interface AzureLogAnalyticsMetadataWorkspaceRelated { |
||||||
|
solutions: string[]; |
||||||
|
} |
@ -0,0 +1,6 @@ |
|||||||
|
import loadKusto from './kusto'; |
||||||
|
|
||||||
|
export default function getDefaultMonacoLanguages() { |
||||||
|
const kusto = { id: 'kusto', name: 'kusto', init: loadKusto }; |
||||||
|
return [kusto]; |
||||||
|
} |
@ -0,0 +1,65 @@ |
|||||||
|
declare global { |
||||||
|
interface Window { |
||||||
|
__monacoKustoResolvePromise: (value: unknown) => void; |
||||||
|
__grafana_public_path__: string; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
const monacoPath = (window.__grafana_public_path__ ?? 'public/') + 'lib/monaco/min/vs'; |
||||||
|
|
||||||
|
const scripts = [ |
||||||
|
[`${monacoPath}/language/kusto/bridge.min.js`], |
||||||
|
[ |
||||||
|
`${monacoPath}/language/kusto/kusto.javascript.client.min.js`, |
||||||
|
`${monacoPath}/language/kusto/newtonsoft.json.min.js`, |
||||||
|
`${monacoPath}/language/kusto/Kusto.Language.Bridge.min.js`, |
||||||
|
], |
||||||
|
]; |
||||||
|
|
||||||
|
function loadScript(script: HTMLScriptElement | string): Promise<void> { |
||||||
|
return new Promise((resolve, reject) => { |
||||||
|
let scriptEl: HTMLScriptElement; |
||||||
|
|
||||||
|
if (typeof script === 'string') { |
||||||
|
scriptEl = document.createElement('script'); |
||||||
|
scriptEl.src = script; |
||||||
|
} else { |
||||||
|
scriptEl = script; |
||||||
|
} |
||||||
|
|
||||||
|
scriptEl.onload = () => resolve(); |
||||||
|
scriptEl.onerror = (err) => reject(err); |
||||||
|
document.body.appendChild(scriptEl); |
||||||
|
}); |
||||||
|
} |
||||||
|
|
||||||
|
const loadMonacoKusto = () => { |
||||||
|
return new Promise((resolve) => { |
||||||
|
window.__monacoKustoResolvePromise = resolve; |
||||||
|
|
||||||
|
const script = document.createElement('script'); |
||||||
|
script.innerHTML = `require(['vs/language/kusto/monaco.contribution'], function() {
|
||||||
|
window.__monacoKustoResolvePromise(); |
||||||
|
});`;
|
||||||
|
|
||||||
|
return document.body.appendChild(script); |
||||||
|
}); |
||||||
|
}; |
||||||
|
|
||||||
|
export default async function loadKusto() { |
||||||
|
let promise = Promise.resolve(); |
||||||
|
|
||||||
|
for (const parallelScripts of scripts) { |
||||||
|
await promise; |
||||||
|
|
||||||
|
// Load all these scripts in parallel, then wait for them all to finish before continuing
|
||||||
|
// to the next iteration
|
||||||
|
const allPromises = parallelScripts |
||||||
|
.filter((src) => !document.querySelector(`script[src="${src}"]`)) |
||||||
|
.map((src) => loadScript(src)); |
||||||
|
|
||||||
|
await Promise.all(allPromises); |
||||||
|
} |
||||||
|
|
||||||
|
await loadMonacoKusto(); |
||||||
|
} |
Loading…
Reference in new issue