18
18
import org .elasticsearch .xcontent .XContentBuilder ;
19
19
import org .elasticsearch .xcontent .json .JsonXContent ;
20
20
import org .elasticsearch .xpack .esql .CsvTestsDataLoader ;
21
+ import org .elasticsearch .xpack .esql .SupportsObservabilityTier ;
22
+ import org .elasticsearch .xpack .esql .SupportsObservabilityTier .ObservabilityTier ;
21
23
import org .elasticsearch .xpack .esql .core .type .DataType ;
22
24
import org .elasticsearch .xpack .esql .expression .function .fulltext .MatchOperator ;
23
25
import org .elasticsearch .xpack .esql .expression .function .scalar .string .regex .RLike ;
@@ -572,7 +574,7 @@ private void renderDocs(FunctionDefinition definition) throws Exception {
572
574
boolean hasAppendix = renderAppendix (info .appendix ());
573
575
renderFullLayout (info , hasExamples , hasAppendix , hasFunctionOptions );
574
576
renderKibanaInlineDocs (name , null , info );
575
- renderKibanaFunctionDefinition (name , null , info , description .args (), description .variadic ());
577
+ renderKibanaFunctionDefinition (name , null , info , description .args (), description .variadic (), getObservabilityTier () );
576
578
}
577
579
578
580
private void renderFunctionNamedParams (EsqlFunctionRegistry .MapArgSignature mapArgSignature ) throws IOException {
@@ -666,6 +668,11 @@ private String addInclude(String section) {
666
668
:::
667
669
""" .replace ("$NAME$" , name ).replace ("$SECTION$" , section );
668
670
}
671
+
672
+ private ObservabilityTier getObservabilityTier () {
673
+ SupportsObservabilityTier supportsObservabilityTier = definition .clazz ().getAnnotation (SupportsObservabilityTier .class );
674
+ return supportsObservabilityTier != null ? supportsObservabilityTier .tier () : null ;
675
+ }
669
676
}
670
677
671
678
/** Operator specific docs generating, since it is currently quite different from the function docs generating */
@@ -712,7 +719,7 @@ public void renderDocs() throws Exception {
712
719
if (ctor != null ) {
713
720
FunctionInfo functionInfo = ctor .getAnnotation (FunctionInfo .class );
714
721
assert functionInfo != null ;
715
- renderDocsForOperators (op .name (), op .titleName (), ctor , functionInfo , op .variadic ());
722
+ renderDocsForOperators (op .name (), op .titleName (), ctor , functionInfo , op .variadic (), getObservabilityTier () );
716
723
} else {
717
724
logger .info ("Skipping rendering docs for operator '" + op .name () + "' with no @FunctionInfo" );
718
725
}
@@ -787,11 +794,17 @@ public Example[] examples() {
787
794
}
788
795
};
789
796
String name = "not_" + baseName ;
790
- renderDocsForOperators (name , null , ctor , functionInfo , op .variadic ());
797
+ renderDocsForOperators (name , null , ctor , functionInfo , op .variadic (), getObservabilityTier () );
791
798
}
792
799
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 {
795
808
renderKibanaInlineDocs (name , titleName , info );
796
809
797
810
var params = ctor .getParameters ();
@@ -808,7 +821,7 @@ void renderDocsForOperators(String name, String titleName, Constructor<?> ctor,
808
821
}
809
822
}
810
823
}
811
- renderKibanaFunctionDefinition (name , titleName , info , args , variadic );
824
+ renderKibanaFunctionDefinition (name , titleName , info , args , variadic , observabilityTier );
812
825
renderDetailedDescription (info .detailedDescription (), info .note ());
813
826
renderTypes (name , args );
814
827
renderExamples (info );
@@ -831,17 +844,35 @@ void renderDetailedDescription(String detailedDescription, String note) throws I
831
844
writeToTempSnippetsDir ("detailedDescription" , rendered .toString ());
832
845
}
833
846
}
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
+ }
834
857
}
835
858
836
859
/** Command specific docs generating, currently very empty since we only render kibana definition files */
837
860
public static class CommandsDocsSupport extends DocsV3Support {
838
861
private final LogicalPlan command ;
839
862
private final XPackLicenseState licenseState ;
863
+ private final ObservabilityTier observabilityTier ;
840
864
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
+ ) {
842
872
super ("commands" , name , testClass , Map ::of );
843
873
this .command = command ;
844
874
this .licenseState = licenseState ;
875
+ this .observabilityTier = observabilityTier ;
845
876
}
846
877
847
878
@ Override
@@ -867,6 +898,9 @@ void renderKibanaCommandDefinition() throws Exception {
867
898
if (license != null && license != License .OperationMode .BASIC ) {
868
899
builder .field ("license" , license .toString ());
869
900
}
901
+ if (observabilityTier != null && observabilityTier != ObservabilityTier .LOGS_ESSENTIALS ) {
902
+ builder .field ("observability_tier" , observabilityTier .toString ());
903
+ }
870
904
String rendered = Strings .toString (builder .endObject ());
871
905
logger .info ("Writing kibana command definition for [{}]:\n {}" , name , rendered );
872
906
writeToTempKibanaDir ("definition" , "json" , rendered );
@@ -1044,7 +1078,8 @@ void renderKibanaFunctionDefinition(
1044
1078
String titleName ,
1045
1079
FunctionInfo info ,
1046
1080
List <EsqlFunctionRegistry .ArgSignature > args ,
1047
- boolean variadic
1081
+ boolean variadic ,
1082
+ ObservabilityTier observabilityTier
1048
1083
) throws Exception {
1049
1084
1050
1085
try (XContentBuilder builder = JsonXContent .contentBuilder ().prettyPrint ().lfAtEnd ().startObject ()) {
@@ -1067,6 +1102,9 @@ void renderKibanaFunctionDefinition(
1067
1102
if (license != null && license != License .OperationMode .BASIC ) {
1068
1103
builder .field ("license" , license .toString ());
1069
1104
}
1105
+ if (observabilityTier != null && observabilityTier != ObservabilityTier .LOGS_ESSENTIALS ) {
1106
+ builder .field ("observability_tier" , observabilityTier .toString ());
1107
+ }
1070
1108
if (titleName != null && titleName .equals (name ) == false ) {
1071
1109
builder .field ("titleName" , titleName );
1072
1110
}
0 commit comments