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