3434import java .util .stream .Collectors ;
3535import java .util .stream .Stream ;
3636
37+ import static org .elasticsearch .common .settings .Setting .Property .Deprecated ;
38+ import static org .elasticsearch .common .settings .Setting .Property .NodeScope ;
39+ import static org .elasticsearch .common .settings .Setting .Property .OperatorDynamic ;
3740import static org .elasticsearch .xpack .core .security .authc .RealmSettings .RESERVED_REALM_AND_DOMAIN_NAME_PREFIX ;
3841
3942public class NodeDeprecationChecks {
@@ -95,15 +98,13 @@ static DeprecationIssue checkRemovedSetting(
9598 return null ;
9699 }
97100 final String removedSettingKey = removedSetting .getKey ();
98- Object removedSettingValue = removedSetting .exists (clusterSettings )
99- ? removedSetting .get (clusterSettings )
100- : removedSetting .get (nodeSettings );
101- String value ;
102- if (removedSettingValue instanceof TimeValue ) {
103- value = ((TimeValue ) removedSettingValue ).getStringRep ();
101+ // read setting to force the deprecation warning
102+ if (removedSetting .exists (clusterSettings )) {
103+ removedSetting .get (clusterSettings );
104104 } else {
105- value = removedSettingValue . toString ( );
105+ removedSetting . get ( nodeSettings );
106106 }
107+
107108 final String message = String .format (Locale .ROOT , "Setting [%s] is deprecated" , removedSettingKey );
108109 final String details = additionalDetailMessage == null
109110 ? String .format (Locale .ROOT , "Remove the [%s] setting." , removedSettingKey )
@@ -113,6 +114,45 @@ static DeprecationIssue checkRemovedSetting(
113114 return new DeprecationIssue (deprecationLevel , message , url , details , false , meta );
114115 }
115116
117+ static DeprecationIssue checkMultipleRemovedSettings (
118+ final Settings clusterSettings ,
119+ final Settings nodeSettings ,
120+ final List <Setting <?>> removedSettings ,
121+ final String url ,
122+ String additionalDetailMessage ,
123+ DeprecationIssue .Level deprecationLevel
124+ ) {
125+
126+ var removedSettingsRemaining = removedSettings .stream ().filter (s -> s .exists (clusterSettings ) || s .exists (nodeSettings )).toList ();
127+ if (removedSettingsRemaining .isEmpty ()) {
128+ return null ;
129+ }
130+ if (removedSettingsRemaining .size () == 1 ) {
131+ Setting <?> removedSetting = removedSettingsRemaining .get (0 );
132+ return checkRemovedSetting (clusterSettings , nodeSettings , removedSetting , url , additionalDetailMessage , deprecationLevel );
133+ }
134+
135+ // read settings to force the deprecation warning
136+ removedSettingsRemaining .forEach (s -> {
137+ if (s .exists (clusterSettings )) {
138+ s .get (clusterSettings );
139+ } else {
140+ s .get (nodeSettings );
141+ }
142+ });
143+
144+ var removedSettingKeysRemaining = removedSettingsRemaining .stream ().map (Setting ::getKey ).sorted ().toList ();
145+ final String message = String .format (Locale .ROOT , "Settings %s are deprecated" , removedSettingKeysRemaining );
146+ final String details = additionalDetailMessage == null
147+ ? String .format (Locale .ROOT , "Remove each setting in %s." , removedSettingKeysRemaining )
148+ : String .format (Locale .ROOT , "Remove each setting in %s. %s" , removedSettingKeysRemaining , additionalDetailMessage );
149+
150+ var canAutoRemoveSettings = removedSettingsRemaining .stream ()
151+ .allMatch (s -> s .exists (clusterSettings ) && s .exists (nodeSettings ) == false );
152+ var meta = createMetaMapForRemovableSettings (canAutoRemoveSettings , removedSettingKeysRemaining );
153+ return new DeprecationIssue (deprecationLevel , message , url , details , false , meta );
154+ }
155+
116156 static DeprecationIssue checkMultipleDataPaths (
117157 Settings nodeSettings ,
118158 PluginsAndModules plugins ,
@@ -944,4 +984,32 @@ static DeprecationIssue checkWatcherBulkConcurrentRequestsSetting(
944984 DeprecationIssue .Level .WARNING
945985 );
946986 }
987+
988+ static DeprecationIssue checkTracingApmSettings (
989+ final Settings settings ,
990+ final PluginsAndModules pluginsAndModules ,
991+ final ClusterState clusterState ,
992+ final XPackLicenseState licenseState
993+ ) {
994+ String url = "https://ela.st/es-deprecation-9-tracing-apm-settings" ;
995+ Setting .Property [] properties = { NodeScope , OperatorDynamic , Deprecated };
996+ List <Setting <?>> tracingApmSettings = List .of (
997+ Setting .prefixKeySetting ("tracing.apm.agent." , key -> Setting .simpleString (key , properties )),
998+ Setting .stringListSetting ("tracing.apm.names.include" , properties ),
999+ Setting .stringListSetting ("tracing.apm.names.exclude" , properties ),
1000+ Setting .stringListSetting ("tracing.apm.sanitize_field_names" , properties ),
1001+ Setting .boolSetting ("tracing.apm.enabled" , false , properties ),
1002+ SecureSetting .secureString ("tracing.apm.api_key" , null , Deprecated ),
1003+ SecureSetting .secureString ("tracing.apm.secret_token" , null , Deprecated )
1004+ );
1005+ return checkMultipleRemovedSettings (
1006+ clusterState .metadata ().settings (),
1007+ settings ,
1008+ tracingApmSettings ,
1009+ url ,
1010+ "[tracing.apm.*] settings are no longer accepted as of 9.0.0"
1011+ + " and should be replaced by [telemetry.*] or [telemetry.tracing.*] settings." ,
1012+ DeprecationIssue .Level .CRITICAL
1013+ );
1014+ }
9471015}
0 commit comments