@ -1,8 +1,14 @@
import { SelectableValue } from '@grafana/data' ;
import { isFetchError } from '@grafana/runtime' ;
import type { Monaco , monacoTypes } from '@grafana/ui' ;
import { createErrorNotification } from '../../../../core/copy/appNotification' ;
import { notifyApp } from '../../../../core/reducers/appNotification' ;
import { dispatch } from '../../../../store/store' ;
import TempoLanguageProvider from '../language_provider' ;
import { intrinsics , scopes } from './traceql' ;
interface Props {
languageProvider : TempoLanguageProvider ;
}
@ -21,9 +27,6 @@ export class CompletionProvider implements monacoTypes.languages.CompletionItemP
}
triggerCharacters = [ '{' , '.' , '[' , '(' , '=' , '~' , ' ' , '"' ] ;
static readonly intrinsics : string [ ] = [ 'duration' , 'name' , 'status' ] ;
static readonly scopes : string [ ] = [ 'resource' , 'span' ] ;
static readonly operators : string [ ] = [ '=' , '-' , '+' , '<' , '>' , '>=' , '<=' , '=~' ] ;
static readonly logicalOps : string [ ] = [ '&&' , '||' ] ;
@ -139,7 +142,17 @@ export class CompletionProvider implements monacoTypes.languages.CompletionItemP
type : 'OPERATOR' ,
} ) ) ;
case 'SPANSET_IN_VALUE' :
const tagValues = await this . getTagValues ( situation . tagName ) ;
let tagValues ;
try {
tagValues = await this . getTagValues ( situation . tagName ) ;
} catch ( error ) {
if ( isFetchError ( error ) ) {
dispatch ( notifyApp ( createErrorNotification ( error . data . error , new Error ( error . data . message ) ) ) ) ;
} else if ( error instanceof Error ) {
dispatch ( notifyApp ( createErrorNotification ( 'Error' , error ) ) ) ;
}
}
const items : Completion [ ] = [ ] ;
const getInsertionText = ( val : SelectableValue < string > ) : string = > {
@ -149,7 +162,7 @@ export class CompletionProvider implements monacoTypes.languages.CompletionItemP
return val . type === 'string' ? ` " ${ val . label } " ` : val . label ! ;
} ;
tagValues . forEach ( ( val ) = > {
tagValues ? . forEach ( ( val ) = > {
if ( val ? . label ) {
items . push ( {
label : val.label ,
@ -181,7 +194,7 @@ export class CompletionProvider implements monacoTypes.languages.CompletionItemP
}
private getIntrinsicsCompletions ( prepend? : string ) : Completion [ ] {
return CompletionProvider . intrinsics . map ( ( key ) = > ( {
return intrinsics . map ( ( key ) = > ( {
label : key ,
insertText : ( prepend || '' ) + key ,
type : 'KEYWORD' ,
@ -189,7 +202,7 @@ export class CompletionProvider implements monacoTypes.languages.CompletionItemP
}
private getScopesCompletions ( prepend? : string ) : Completion [ ] {
return CompletionProvider . scopes . map ( ( key ) = > ( {
return scopes . map ( ( key ) = > ( {
label : key ,
insertText : ( prepend || '' ) + key ,
type : 'SCOPE' ,
@ -242,7 +255,7 @@ export class CompletionProvider implements monacoTypes.languages.CompletionItemP
if ( ! op ) {
// There's no operator so we check if the name is one of the known scopes
// { resource.|
if ( CompletionProvider . scopes . filter ( ( w ) = > w === nameMatched ? . groups ? . word ) && nameMatched ? . groups ? . post_dot ) {
if ( scopes . filter ( ( w ) = > w === nameMatched ? . groups ? . word ) && nameMatched ? . groups ? . post_dot ) {
return {
type : 'SPANSET_IN_NAME_SCOPE' ,
} ;