1818import org .elasticsearch .xcontent .XContentBuilder ;
1919import org .elasticsearch .xcontent .json .JsonXContent ;
2020import org .elasticsearch .xpack .esql .CsvTestsDataLoader ;
21+ import org .elasticsearch .xpack .esql .SupportsObservabilityTier ;
22+ import org .elasticsearch .xpack .esql .SupportsObservabilityTier .ObservabilityTier ;
2123import org .elasticsearch .xpack .esql .core .type .DataType ;
2224import org .elasticsearch .xpack .esql .expression .function .fulltext .MatchOperator ;
2325import org .elasticsearch .xpack .esql .expression .function .scalar .string .regex .RLike ;
@@ -572,7 +574,7 @@ private void renderDocs(FunctionDefinition definition) throws Exception {
572574 boolean hasAppendix = renderAppendix (info .appendix ());
573575 renderFullLayout (info , hasExamples , hasAppendix , hasFunctionOptions );
574576 renderKibanaInlineDocs (name , null , info );
575- renderKibanaFunctionDefinition (name , null , info , description .args (), description .variadic ());
577+ renderKibanaFunctionDefinition (name , null , info , description .args (), description .variadic (), getObservabilityTier () );
576578 }
577579
578580 private void renderFunctionNamedParams (EsqlFunctionRegistry .MapArgSignature mapArgSignature ) throws IOException {
@@ -666,6 +668,11 @@ private String addInclude(String section) {
666668 :::
667669 """ .replace ("$NAME$" , name ).replace ("$SECTION$" , section );
668670 }
671+
672+ private ObservabilityTier getObservabilityTier () {
673+ SupportsObservabilityTier supportsObservabilityTier = definition .clazz ().getAnnotation (SupportsObservabilityTier .class );
674+ return supportsObservabilityTier != null ? supportsObservabilityTier .tier () : null ;
675+ }
669676 }
670677
671678 /** Operator specific docs generating, since it is currently quite different from the function docs generating */
@@ -712,7 +719,7 @@ public void renderDocs() throws Exception {
712719 if (ctor != null ) {
713720 FunctionInfo functionInfo = ctor .getAnnotation (FunctionInfo .class );
714721 assert functionInfo != null ;
715- renderDocsForOperators (op .name (), op .titleName (), ctor , functionInfo , op .variadic ());
722+ renderDocsForOperators (op .name (), op .titleName (), ctor , functionInfo , op .variadic (), getObservabilityTier () );
716723 } else {
717724 logger .info ("Skipping rendering docs for operator '" + op .name () + "' with no @FunctionInfo" );
718725 }
@@ -787,11 +794,17 @@ public Example[] examples() {
787794 }
788795 };
789796 String name = "not_" + baseName ;
790- renderDocsForOperators (name , null , ctor , functionInfo , op .variadic ());
797+ renderDocsForOperators (name , null , ctor , functionInfo , op .variadic (), getObservabilityTier () );
791798 }
792799
793- void renderDocsForOperators (String name , String titleName , Constructor <?> ctor , FunctionInfo info , boolean variadic )
794- throws Exception {
800+ void renderDocsForOperators (
801+ String name ,
802+ String titleName ,
803+ Constructor <?> ctor ,
804+ FunctionInfo info ,
805+ boolean variadic ,
806+ ObservabilityTier observabilityTier
807+ ) throws Exception {
795808 renderKibanaInlineDocs (name , titleName , info );
796809
797810 var params = ctor .getParameters ();
@@ -808,7 +821,7 @@ void renderDocsForOperators(String name, String titleName, Constructor<?> ctor,
808821 }
809822 }
810823 }
811- renderKibanaFunctionDefinition (name , titleName , info , args , variadic );
824+ renderKibanaFunctionDefinition (name , titleName , info , args , variadic , observabilityTier );
812825 renderDetailedDescription (info .detailedDescription (), info .note ());
813826 renderTypes (name , args );
814827 renderExamples (info );
@@ -831,17 +844,35 @@ void renderDetailedDescription(String detailedDescription, String note) throws I
831844 writeToTempSnippetsDir ("detailedDescription" , rendered .toString ());
832845 }
833846 }
847+
848+ private ObservabilityTier getObservabilityTier () {
849+ if (op != null ) {
850+ SupportsObservabilityTier supportsObservabilityTier = op .clazz ().getAnnotation (SupportsObservabilityTier .class );
851+ if (supportsObservabilityTier != null ) {
852+ return supportsObservabilityTier .tier ();
853+ }
854+ }
855+ return null ;
856+ }
834857 }
835858
836859 /** Command specific docs generating, currently very empty since we only render kibana definition files */
837860 public static class CommandsDocsSupport extends DocsV3Support {
838861 private final LogicalPlan command ;
839862 private final XPackLicenseState licenseState ;
863+ private final ObservabilityTier observabilityTier ;
840864
841- public CommandsDocsSupport (String name , Class <?> testClass , LogicalPlan command , XPackLicenseState licenseState ) {
865+ public CommandsDocsSupport (
866+ String name ,
867+ Class <?> testClass ,
868+ LogicalPlan command ,
869+ XPackLicenseState licenseState ,
870+ ObservabilityTier observabilityTier
871+ ) {
842872 super ("commands" , name , testClass , Map ::of );
843873 this .command = command ;
844874 this .licenseState = licenseState ;
875+ this .observabilityTier = observabilityTier ;
845876 }
846877
847878 @ Override
@@ -867,6 +898,9 @@ void renderKibanaCommandDefinition() throws Exception {
867898 if (license != null && license != License .OperationMode .BASIC ) {
868899 builder .field ("license" , license .toString ());
869900 }
901+ if (observabilityTier != null && observabilityTier != ObservabilityTier .LOGS_ESSENTIALS ) {
902+ builder .field ("observability_tier" , observabilityTier .toString ());
903+ }
870904 String rendered = Strings .toString (builder .endObject ());
871905 logger .info ("Writing kibana command definition for [{}]:\n {}" , name , rendered );
872906 writeToTempKibanaDir ("definition" , "json" , rendered );
@@ -1044,7 +1078,8 @@ void renderKibanaFunctionDefinition(
10441078 String titleName ,
10451079 FunctionInfo info ,
10461080 List <EsqlFunctionRegistry .ArgSignature > args ,
1047- boolean variadic
1081+ boolean variadic ,
1082+ ObservabilityTier observabilityTier
10481083 ) throws Exception {
10491084
10501085 try (XContentBuilder builder = JsonXContent .contentBuilder ().prettyPrint ().lfAtEnd ().startObject ()) {
@@ -1067,6 +1102,9 @@ void renderKibanaFunctionDefinition(
10671102 if (license != null && license != License .OperationMode .BASIC ) {
10681103 builder .field ("license" , license .toString ());
10691104 }
1105+ if (observabilityTier != null && observabilityTier != ObservabilityTier .LOGS_ESSENTIALS ) {
1106+ builder .field ("observability_tier" , observabilityTier .toString ());
1107+ }
10701108 if (titleName != null && titleName .equals (name ) == false ) {
10711109 builder .field ("titleName" , titleName );
10721110 }
0 commit comments