This is an automated email from the ASF dual-hosted git repository.
exceptionfactory pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/nifi.git
The following commit(s) were added to refs/heads/main by this push:
new b3b315fd916 NIFI-15645 Fixed AzureLogAnalyticsReportingTask URL
Validation (#10935)
b3b315fd916 is described below
commit b3b315fd916623723a6f65670c280e9036edcd16
Author: Pierre Villard <[email protected]>
AuthorDate: Tue Mar 10 21:31:42 2026 +0100
NIFI-15645 Fixed AzureLogAnalyticsReportingTask URL Validation (#10935)
- Added placeholder resolution before validating URL
Signed-off-by: David Handermann <[email protected]>
---
.../AbstractAzureLogAnalyticsReportingTask.java | 75 +++++++---
.../AzureLogAnalyticsProvenanceReportingTask.java | 157 +++++++++++++--------
.../AzureLogAnalyticsReportingTask.java | 21 ++-
3 files changed, 171 insertions(+), 82 deletions(-)
diff --git
a/nifi-extension-bundles/nifi-azure-bundle/nifi-azure-reporting-task/src/main/java/org/apache/nifi/reporting/azure/loganalytics/AbstractAzureLogAnalyticsReportingTask.java
b/nifi-extension-bundles/nifi-azure-bundle/nifi-azure-reporting-task/src/main/java/org/apache/nifi/reporting/azure/loganalytics/AbstractAzureLogAnalyticsReportingTask.java
index 3d4652f114e..12f8892480e 100644
---
a/nifi-extension-bundles/nifi-azure-bundle/nifi-azure-reporting-task/src/main/java/org/apache/nifi/reporting/azure/loganalytics/AbstractAzureLogAnalyticsReportingTask.java
+++
b/nifi-extension-bundles/nifi-azure-bundle/nifi-azure-reporting-task/src/main/java/org/apache/nifi/reporting/azure/loganalytics/AbstractAzureLogAnalyticsReportingTask.java
@@ -22,6 +22,7 @@ import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.nifi.components.PropertyDescriptor;
+import org.apache.nifi.components.ValidationResult;
import org.apache.nifi.expression.ExpressionLanguageScope;
import org.apache.nifi.migration.PropertyConfiguration;
import org.apache.nifi.processor.util.StandardValidators;
@@ -57,41 +58,79 @@ public abstract class
AbstractAzureLogAnalyticsReportingTask extends AbstractRep
.ofPattern("EEE, dd MMM yyyy HH:mm:ss O");
static final PropertyDescriptor LOG_ANALYTICS_WORKSPACE_ID = new
PropertyDescriptor.Builder()
- .name("Log Analytics Workspace Id").description("Log Analytics
Workspace Id").required(true)
+ .name("Log Analytics Workspace Id")
+ .description("Log Analytics Workspace Id")
+ .required(true)
.expressionLanguageSupported(ExpressionLanguageScope.ENVIRONMENT)
-
.addValidator(StandardValidators.NON_EMPTY_VALIDATOR).sensitive(true).build();
+ .addValidator(StandardValidators.NON_EMPTY_VALIDATOR)
+ .sensitive(true)
+ .build();
+
static final PropertyDescriptor LOG_ANALYTICS_WORKSPACE_KEY = new
PropertyDescriptor.Builder()
- .name("Log Analytics Workspace Key").description("Azure Log
Analytic Worskspace Key").required(true)
+ .name("Log Analytics Workspace Key")
+ .description("Azure Log Analytics Workspace Key")
+ .required(true)
.expressionLanguageSupported(ExpressionLanguageScope.ENVIRONMENT)
-
.addValidator(StandardValidators.NON_EMPTY_VALIDATOR).sensitive(true).build();
+ .addValidator(StandardValidators.NON_EMPTY_VALIDATOR)
+ .sensitive(true)
+ .build();
+
static final PropertyDescriptor APPLICATION_ID = new
PropertyDescriptor.Builder()
.name("Application ID")
.description("The Application ID to be included in the metrics
sent to Azure Log Analytics WS")
-
.required(true).expressionLanguageSupported(ExpressionLanguageScope.ENVIRONMENT).defaultValue("nifi")
- .addValidator(StandardValidators.NON_EMPTY_VALIDATOR).build();
+ .required(true)
+ .expressionLanguageSupported(ExpressionLanguageScope.ENVIRONMENT)
+ .defaultValue("nifi")
+ .addValidator(StandardValidators.NON_EMPTY_VALIDATOR)
+ .build();
+
static final PropertyDescriptor INSTANCE_ID = new
PropertyDescriptor.Builder()
.name("Instance ID")
.description("Id of this NiFi instance to be included in the
metrics sent to Azure Log Analytics WS")
-
.required(true).expressionLanguageSupported(ExpressionLanguageScope.ENVIRONMENT)
-
.defaultValue("${hostname(true)}").addValidator(StandardValidators.NON_EMPTY_VALIDATOR).build();
+ .required(true)
+ .expressionLanguageSupported(ExpressionLanguageScope.ENVIRONMENT)
+ .defaultValue("${hostname(true)}")
+ .addValidator(StandardValidators.NON_EMPTY_VALIDATOR)
+ .build();
+
static final PropertyDescriptor PROCESS_GROUP_IDS = new
PropertyDescriptor.Builder()
.name("Process Group IDs")
- .description(
- "If specified, the reporting task will send metrics the
configured ProcessGroup(s) only. Multiple IDs should be separated by a comma.
If"
- + " none of the group-IDs could be found or no IDs
are defined, the Root Process Group is used and global metrics are sent.")
-
.required(false).expressionLanguageSupported(ExpressionLanguageScope.ENVIRONMENT)
+ .description("""
+ If specified, the reporting task will send metrics the
configured ProcessGroup(s) only.
+ Multiple IDs should be separated by a comma. If none of
the group-IDs could be found or
+ no IDs are defined, the Root Process Group is used and
global metrics are sent.""")
+ .required(false)
+ .expressionLanguageSupported(ExpressionLanguageScope.ENVIRONMENT)
.addValidator(StandardValidators.createListValidator(true, true,
StandardValidators.createRegexMatchingValidator(Pattern.compile("[0-9a-z-]+"))))
.build();
- static final PropertyDescriptor JOB_NAME = new
PropertyDescriptor.Builder().name("Job Name")
- .description("The name of the exporting
job").defaultValue("nifi_reporting_job")
+
+ static final PropertyDescriptor JOB_NAME = new PropertyDescriptor.Builder()
+ .name("Job Name")
+ .description("The name of the exporting job")
+ .defaultValue("nifi_reporting_job")
.expressionLanguageSupported(ExpressionLanguageScope.ENVIRONMENT)
- .addValidator(StandardValidators.NON_EMPTY_VALIDATOR).build();
+ .addValidator(StandardValidators.NON_EMPTY_VALIDATOR)
+ .build();
+
static final PropertyDescriptor LOG_ANALYTICS_URL_ENDPOINT_FORMAT = new
PropertyDescriptor.Builder()
- .name("Log Analytics URL Endpoint Format").description("Log
Analytics URL Endpoint Format").required(false)
+ .name("Log Analytics URL Endpoint Format")
+ .description("""
+ Log Analytics URL Endpoint Format. The placeholder {0} is
replaced at runtime with the value
+ configured in the Log Analytics Workspace Id property.""")
+ .required(false)
.defaultValue("https://{0}.ods.opinsights.azure.com/api/logs?api-version=2016-04-01")
- .addValidator(StandardValidators.URL_VALIDATOR)
-
.expressionLanguageSupported(ExpressionLanguageScope.ENVIRONMENT).build();
+ .addValidator((subject, input, context) -> {
+ final ValidationResult result =
StandardValidators.URL_VALIDATOR.validate(
+ subject, MessageFormat.format(input, "workspace-id"),
context);
+ if (result.isValid()) {
+ return new
ValidationResult.Builder().subject(subject).input(input).valid(true).build();
+ }
+ return new
ValidationResult.Builder().subject(subject).input(input).valid(false)
+ .explanation("'%s' is not a valid URL
format".formatted(input)).build();
+ })
+ .expressionLanguageSupported(ExpressionLanguageScope.ENVIRONMENT)
+ .build();
private static final List<PropertyDescriptor> PROPERTY_DESCRIPTORS =
List.of(
LOG_ANALYTICS_WORKSPACE_ID,
diff --git
a/nifi-extension-bundles/nifi-azure-bundle/nifi-azure-reporting-task/src/main/java/org/apache/nifi/reporting/azure/loganalytics/AzureLogAnalyticsProvenanceReportingTask.java
b/nifi-extension-bundles/nifi-azure-bundle/nifi-azure-reporting-task/src/main/java/org/apache/nifi/reporting/azure/loganalytics/AzureLogAnalyticsProvenanceReportingTask.java
index 4dec6ed4951..e4ae30959fc 100644
---
a/nifi-extension-bundles/nifi-azure-bundle/nifi-azure-reporting-task/src/main/java/org/apache/nifi/reporting/azure/loganalytics/AzureLogAnalyticsProvenanceReportingTask.java
+++
b/nifi-extension-bundles/nifi-azure-bundle/nifi-azure-reporting-task/src/main/java/org/apache/nifi/reporting/azure/loganalytics/AzureLogAnalyticsProvenanceReportingTask.java
@@ -62,9 +62,13 @@ public class AzureLogAnalyticsProvenanceReportingTask
extends AbstractAzureLogAn
private static final DateTimeFormatter DATE_TIME_FORMATTER =
DateTimeFormatter.ofPattern(TIMESTAMP_FORMAT);
static final PropertyDescriptor LOG_ANALYTICS_CUSTOM_LOG_NAME = new
PropertyDescriptor.Builder()
- .name("Log Analytics Custom Log Name").description("Log Analytics
Custom Log Name").required(false)
-
.defaultValue("nifiprovenance").addValidator(StandardValidators.NON_EMPTY_VALIDATOR)
-
.expressionLanguageSupported(ExpressionLanguageScope.ENVIRONMENT).build();
+ .name("Log Analytics Custom Log Name")
+ .description("Log Analytics Custom Log Name")
+ .required(false)
+ .defaultValue("nifiprovenance")
+ .addValidator(StandardValidators.NON_EMPTY_VALIDATOR)
+ .expressionLanguageSupported(ExpressionLanguageScope.ENVIRONMENT)
+ .build();
static final AllowableValue BEGINNING_OF_STREAM = new
AllowableValue("beginning-of-stream",
"Beginning of Stream",
@@ -75,98 +79,135 @@ public class AzureLogAnalyticsProvenanceReportingTask
extends AbstractAzureLogAn
static final PropertyDescriptor FILTER_EVENT_TYPE = new
PropertyDescriptor.Builder()
.name("Event Type to Include")
- .description("Comma-separated list of event types that will be
used to filter the provenance events sent by the reporting task. "
- + "Available event types are "
- + Arrays.deepToString(ProvenanceEventType.values())
- + ". If no filter is set, all the events are sent. If "
- + "multiple filters are set, the filters are cumulative.")
-
.required(false).expressionLanguageSupported(ExpressionLanguageScope.ENVIRONMENT)
- .addValidator(StandardValidators.NON_EMPTY_VALIDATOR).build();
+ .description("""
+ Comma-separated list of event types that will be used to
filter the provenance events sent by the reporting task.
+ Available event types are %s. If no filter is set, all the
events are sent. If multiple filters are set, the filters
+ are cumulative."""
+
.formatted(Arrays.deepToString(ProvenanceEventType.values())))
+ .required(false)
+ .expressionLanguageSupported(ExpressionLanguageScope.ENVIRONMENT)
+ .addValidator(StandardValidators.NON_EMPTY_VALIDATOR)
+ .build();
static final PropertyDescriptor FILTER_EVENT_TYPE_EXCLUDE = new
PropertyDescriptor.Builder()
.name("Event Type to Exclude")
- .description("Comma-separated list of event types that will be
used to exclude the provenance events sent by the reporting task. "
- + "Available event types are "
- + Arrays.deepToString(ProvenanceEventType.values())
- + ". If no filter is set, all the events are sent. If "
- + "multiple filters are set, the filters are cumulative.
If an event type is included in Event Type to Include and excluded here, then
the "
- + "exclusion takes precedence and the event will not be
sent.")
-
.required(false).expressionLanguageSupported(ExpressionLanguageScope.ENVIRONMENT)
- .addValidator(StandardValidators.NON_EMPTY_VALIDATOR).build();
+ .description("""
+ Comma-separated list of event types that will be used to
exclude the provenance events sent by the reporting task.
+ Available event types are %s. If no filter is set, all the
events are sent. If multiple filters are set, the filters
+ are cumulative. If an event type is included in Event Type
to Include and excluded here, then the exclusion takes
+ precedence and the event will not be sent."""
+
.formatted(Arrays.deepToString(ProvenanceEventType.values())))
+ .required(false)
+ .expressionLanguageSupported(ExpressionLanguageScope.ENVIRONMENT)
+ .addValidator(StandardValidators.NON_EMPTY_VALIDATOR)
+ .build();
static final PropertyDescriptor FILTER_COMPONENT_TYPE = new
PropertyDescriptor.Builder()
.name("Component Type to Include")
- .description("Regular expression to filter the provenance events
based on the component type. Only the events matching the regular "
- + "expression will be sent. If no filter is set, all the
events are sent. If multiple filters are set, the filters are cumulative.")
-
.required(false).expressionLanguageSupported(ExpressionLanguageScope.ENVIRONMENT)
-
.addValidator(StandardValidators.REGULAR_EXPRESSION_VALIDATOR).build();
+ .description("""
+ Regular expression to filter the provenance events based
on the component type. Only the events matching the regular
+ expression will be sent. If no filter is set, all the
events are sent. If multiple filters are set, the filters are cumulative.""")
+ .required(false)
+ .expressionLanguageSupported(ExpressionLanguageScope.ENVIRONMENT)
+ .addValidator(StandardValidators.REGULAR_EXPRESSION_VALIDATOR)
+ .build();
static final PropertyDescriptor FILTER_COMPONENT_TYPE_EXCLUDE = new
PropertyDescriptor.Builder()
.name("Component Type to Exclude")
- .description("Regular expression to exclude the provenance events
based on the component type. The events matching the regular "
- + "expression will not be sent. If no filter is set, all
the events are sent. If multiple filters are set, the filters are cumulative. "
- + "If a component type is included in Component Type to
Include and excluded here, then the exclusion takes precedence and the event
will not be sent.")
-
.required(false).expressionLanguageSupported(ExpressionLanguageScope.ENVIRONMENT)
-
.addValidator(StandardValidators.REGULAR_EXPRESSION_VALIDATOR).build();
+ .description("""
+ Regular expression to exclude the provenance events based
on the component type. The events matching the regular
+ expression will not be sent. If no filter is set, all the
events are sent. If multiple filters are set, the filters are cumulative.
+ If a component type is included in Component Type to
Include and excluded here, then the exclusion takes precedence and the event
will not be sent.""")
+ .required(false)
+ .expressionLanguageSupported(ExpressionLanguageScope.ENVIRONMENT)
+ .addValidator(StandardValidators.REGULAR_EXPRESSION_VALIDATOR)
+ .build();
static final PropertyDescriptor FILTER_COMPONENT_ID = new
PropertyDescriptor.Builder()
.name("Component ID to Include")
- .description("Comma-separated list of component UUID that will be
used to filter the provenance events sent by the reporting task. If no "
- + "filter is set, all the events are sent. If multiple
filters are set, the filters are cumulative.")
-
.required(false).expressionLanguageSupported(ExpressionLanguageScope.ENVIRONMENT)
- .addValidator(StandardValidators.NON_EMPTY_VALIDATOR).build();
+ .description("""
+ Comma-separated list of component UUID that will be used
to filter the provenance events sent by the reporting task.
+ If no filter is set, all the events are sent. If multiple
filters are set, the filters are cumulative.""")
+ .required(false)
+ .expressionLanguageSupported(ExpressionLanguageScope.ENVIRONMENT)
+ .addValidator(StandardValidators.NON_EMPTY_VALIDATOR)
+ .build();
static final PropertyDescriptor FILTER_COMPONENT_ID_EXCLUDE = new
PropertyDescriptor.Builder()
.name("Component ID to Exclude")
- .description("Comma-separated list of component UUID that will be
used to exclude the provenance events sent by the reporting task. If no "
- + "filter is set, all the events are sent. If multiple
filters are set, the filters are cumulative. If a component UUID is included in
"
- + "Component ID to Include and excluded here, then the
exclusion takes precedence and the event will not be sent.")
-
.required(false).expressionLanguageSupported(ExpressionLanguageScope.ENVIRONMENT)
- .addValidator(StandardValidators.NON_EMPTY_VALIDATOR).build();
+ .description("""
+ Comma-separated list of component UUID that will be used
to exclude the provenance events sent by the reporting task.
+ If no filter is set, all the events are sent. If multiple
filters are set, the filters are cumulative. If a component UUID is included in
+ Component ID to Include and excluded here, then the
exclusion takes precedence and the event will not be sent.""")
+ .required(false)
+ .expressionLanguageSupported(ExpressionLanguageScope.ENVIRONMENT)
+ .addValidator(StandardValidators.NON_EMPTY_VALIDATOR)
+ .build();
static final PropertyDescriptor FILTER_COMPONENT_NAME = new
PropertyDescriptor.Builder()
.name("Component Name to Include")
- .description("Regular expression to filter the provenance events
based on the component name. Only the events matching the regular "
- + "expression will be sent. If no filter is set, all the
events are sent. If multiple filters are set, the filters are cumulative.")
-
.required(false).expressionLanguageSupported(ExpressionLanguageScope.ENVIRONMENT)
-
.addValidator(StandardValidators.REGULAR_EXPRESSION_VALIDATOR).build();
+ .description("""
+ Regular expression to filter the provenance events based
on the component name. Only the events matching the regular
+ expression will be sent. If no filter is set, all the
events are sent. If multiple filters are set, the filters are cumulative.""")
+ .required(false)
+ .expressionLanguageSupported(ExpressionLanguageScope.ENVIRONMENT)
+ .addValidator(StandardValidators.REGULAR_EXPRESSION_VALIDATOR)
+ .build();
static final PropertyDescriptor FILTER_COMPONENT_NAME_EXCLUDE = new
PropertyDescriptor.Builder()
.name("Component Name to Exclude")
- .description("Regular expression to exclude the provenance events
based on the component name. The events matching the regular "
- + "expression will not be sent. If no filter is set, all
the events are sent. If multiple filters are set, the filters are cumulative. "
- + "If a component name is included in Component Name to
Include and excluded here, then the exclusion takes precedence and the event
will not be sent.")
-
.required(false).expressionLanguageSupported(ExpressionLanguageScope.ENVIRONMENT)
-
.addValidator(StandardValidators.REGULAR_EXPRESSION_VALIDATOR).build();
+ .description("""
+ Regular expression to exclude the provenance events based
on the component name. The events matching the regular
+ expression will not be sent. If no filter is set, all the
events are sent. If multiple filters are set, the filters are cumulative.
+ If a component name is included in Component Name to
Include and excluded here, then the exclusion takes precedence and the event
will not be sent.""")
+ .required(false)
+ .expressionLanguageSupported(ExpressionLanguageScope.ENVIRONMENT)
+ .addValidator(StandardValidators.REGULAR_EXPRESSION_VALIDATOR)
+ .build();
static final PropertyDescriptor START_POSITION = new
PropertyDescriptor.Builder()
.name("Start Position")
- .description("If the Reporting Task has never been run, or if its
state has been reset by a user, "
- + "specifies where in the stream of Provenance Events the
Reporting Task should start")
+ .description("""
+ If the Reporting Task has never been run, or if its state
has been reset by a user,
+ specifies where in the stream of Provenance Events the
Reporting Task should start""")
.allowableValues(BEGINNING_OF_STREAM, END_OF_STREAM)
- .defaultValue(BEGINNING_OF_STREAM).required(true).build();
+ .defaultValue(BEGINNING_OF_STREAM)
+ .required(true)
+ .build();
static final PropertyDescriptor ALLOW_NULL_VALUES = new
PropertyDescriptor.Builder()
.name("Include Null Values")
.description("Indicate if null values should be included in
records. Default will be false")
- .required(true).allowableValues("true",
"false").defaultValue("false").build();
-
- static final PropertyDescriptor PLATFORM = new
PropertyDescriptor.Builder().name("Platform")
- .description("The value to use for the platform field in each
event.").required(true)
-
.expressionLanguageSupported(ExpressionLanguageScope.ENVIRONMENT).defaultValue("nifi")
- .addValidator(StandardValidators.NON_EMPTY_VALIDATOR).build();
+ .required(true)
+ .allowableValues("true", "false")
+ .defaultValue("false")
+ .build();
+
+ static final PropertyDescriptor PLATFORM = new PropertyDescriptor.Builder()
+ .name("Platform")
+ .description("The value to use for the platform field in each
event.")
+ .required(true)
+ .expressionLanguageSupported(ExpressionLanguageScope.ENVIRONMENT)
+ .defaultValue("nifi")
+ .addValidator(StandardValidators.NON_EMPTY_VALIDATOR)
+ .build();
static final PropertyDescriptor INSTANCE_URL = new
PropertyDescriptor.Builder()
.name("Instance URL")
- .description("The URL of this instance to use in the Content URI
of each event.").required(true)
+ .description("The URL of this instance to use in the Content URI
of each event.")
+ .required(true)
.expressionLanguageSupported(ExpressionLanguageScope.ENVIRONMENT)
.defaultValue("http://${hostname(true)}:8080/nifi")
- .addValidator(StandardValidators.URL_VALIDATOR).build();
+ .addValidator(StandardValidators.URL_VALIDATOR)
+ .build();
static final PropertyDescriptor BATCH_SIZE = new
PropertyDescriptor.Builder()
.name("Batch Size")
- .description("Specifies how many records to send in a single
batch, at most.").required(true)
-
.defaultValue("1000").addValidator(StandardValidators.POSITIVE_INTEGER_VALIDATOR).build();
+ .description("Specifies how many records to send in a single
batch, at most.")
+ .required(true)
+ .defaultValue("1000")
+ .addValidator(StandardValidators.POSITIVE_INTEGER_VALIDATOR)
+ .build();
private static final List<PropertyDescriptor> PROPERTY_DESCRIPTORS =
List.of(
LOG_ANALYTICS_WORKSPACE_ID,
diff --git
a/nifi-extension-bundles/nifi-azure-bundle/nifi-azure-reporting-task/src/main/java/org/apache/nifi/reporting/azure/loganalytics/AzureLogAnalyticsReportingTask.java
b/nifi-extension-bundles/nifi-azure-bundle/nifi-azure-reporting-task/src/main/java/org/apache/nifi/reporting/azure/loganalytics/AzureLogAnalyticsReportingTask.java
index a5e1169aa4c..33460cee957 100644
---
a/nifi-extension-bundles/nifi-azure-bundle/nifi-azure-reporting-task/src/main/java/org/apache/nifi/reporting/azure/loganalytics/AzureLogAnalyticsReportingTask.java
+++
b/nifi-extension-bundles/nifi-azure-bundle/nifi-azure-reporting-task/src/main/java/org/apache/nifi/reporting/azure/loganalytics/AzureLogAnalyticsReportingTask.java
@@ -50,13 +50,22 @@ public class AzureLogAnalyticsReportingTask extends
AbstractAzureLogAnalyticsRep
private static final String JVM_JOB_NAME = "jvm_global";
private final JvmMetrics virtualMachineMetrics =
JmxJvmMetrics.getInstance();
- static final PropertyDescriptor SEND_JVM_METRICS = new
PropertyDescriptor.Builder().name("Send JVM Metrics")
- .description("Send JVM Metrics in addition to the
NiFi-metrics").allowableValues("true", "false")
- .defaultValue("false").required(true).build();
+ static final PropertyDescriptor SEND_JVM_METRICS = new
PropertyDescriptor.Builder()
+ .name("Send JVM Metrics")
+ .description("Send JVM Metrics in addition to the NiFi-metrics")
+ .allowableValues("true", "false")
+ .defaultValue("false")
+ .required(true)
+ .build();
+
static final PropertyDescriptor LOG_ANALYTICS_CUSTOM_LOG_NAME = new
PropertyDescriptor.Builder()
- .name("Log Analytics Custom Log Name").description("Log Analytics
Custom Log Name").required(false)
-
.defaultValue("nifimetrics").addValidator(StandardValidators.NON_EMPTY_VALIDATOR)
-
.expressionLanguageSupported(ExpressionLanguageScope.ENVIRONMENT).build();
+ .name("Log Analytics Custom Log Name")
+ .description("Log Analytics Custom Log Name")
+ .required(false)
+ .defaultValue("nifimetrics")
+ .addValidator(StandardValidators.NON_EMPTY_VALIDATOR)
+ .expressionLanguageSupported(ExpressionLanguageScope.ENVIRONMENT)
+ .build();
private static final List<PropertyDescriptor> PROPERTY_DESCRIPTORS =
List.of(
SEND_JVM_METRICS,