3535import java .util .stream .Collectors ;
3636import java .util .stream .Stream ;
3737
38+ import static org .elasticsearch .common .settings .Setting .Property .Deprecated ;
39+ import static org .elasticsearch .common .settings .Setting .Property .NodeScope ;
40+ import static org .elasticsearch .common .settings .Setting .Property .OperatorDynamic ;
3841import static org .elasticsearch .xpack .core .security .authc .RealmSettings .RESERVED_REALM_AND_DOMAIN_NAME_PREFIX ;
3942
4043public class NodeDeprecationChecks {
@@ -96,15 +99,13 @@ static DeprecationIssue checkRemovedSetting(
9699 return null ;
97100 }
98101 final String removedSettingKey = removedSetting .getKey ();
99- Object removedSettingValue = removedSetting .exists (clusterSettings )
100- ? removedSetting .get (clusterSettings )
101- : removedSetting .get (nodeSettings );
102- String value ;
103- if (removedSettingValue instanceof TimeValue ) {
104- value = ((TimeValue ) removedSettingValue ).getStringRep ();
102+ // read setting to force the deprecation warning
103+ if (removedSetting .exists (clusterSettings )) {
104+ removedSetting .get (clusterSettings );
105105 } else {
106- value = removedSettingValue . toString ( );
106+ removedSetting . get ( nodeSettings );
107107 }
108+
108109 final String message = String .format (Locale .ROOT , "Setting [%s] is deprecated" , removedSettingKey );
109110 final String details = additionalDetailMessage == null
110111 ? String .format (Locale .ROOT , "Remove the [%s] setting." , removedSettingKey )
@@ -114,6 +115,45 @@ static DeprecationIssue checkRemovedSetting(
114115 return new DeprecationIssue (deprecationLevel , message , url , details , false , meta );
115116 }
116117
118+ static DeprecationIssue checkMultipleRemovedSettings (
119+ final Settings clusterSettings ,
120+ final Settings nodeSettings ,
121+ final List <Setting <?>> removedSettings ,
122+ final String url ,
123+ String additionalDetailMessage ,
124+ DeprecationIssue .Level deprecationLevel
125+ ) {
126+
127+ var removedSettingsRemaining = removedSettings .stream ().filter (s -> s .exists (clusterSettings ) || s .exists (nodeSettings )).toList ();
128+ if (removedSettingsRemaining .isEmpty ()) {
129+ return null ;
130+ }
131+ if (removedSettingsRemaining .size () == 1 ) {
132+ Setting <?> removedSetting = removedSettingsRemaining .get (0 );
133+ return checkRemovedSetting (clusterSettings , nodeSettings , removedSetting , url , additionalDetailMessage , deprecationLevel );
134+ }
135+
136+ // read settings to force the deprecation warning
137+ removedSettingsRemaining .forEach (s -> {
138+ if (s .exists (clusterSettings )) {
139+ s .get (clusterSettings );
140+ } else {
141+ s .get (nodeSettings );
142+ }
143+ });
144+
145+ var removedSettingKeysRemaining = removedSettingsRemaining .stream ().map (Setting ::getKey ).sorted ().toList ();
146+ final String message = String .format (Locale .ROOT , "Settings %s are deprecated" , removedSettingKeysRemaining );
147+ final String details = additionalDetailMessage == null
148+ ? String .format (Locale .ROOT , "Remove each setting in %s." , removedSettingKeysRemaining )
149+ : String .format (Locale .ROOT , "Remove each setting in %s. %s" , removedSettingKeysRemaining , additionalDetailMessage );
150+
151+ var canAutoRemoveSettings = removedSettingsRemaining .stream ()
152+ .allMatch (s -> s .exists (clusterSettings ) && s .exists (nodeSettings ) == false );
153+ var meta = createMetaMapForRemovableSettings (canAutoRemoveSettings , removedSettingKeysRemaining );
154+ return new DeprecationIssue (deprecationLevel , message , url , details , false , meta );
155+ }
156+
117157 static DeprecationIssue checkMultipleDataPaths (
118158 Settings nodeSettings ,
119159 PluginsAndModules plugins ,
@@ -967,4 +1007,32 @@ static DeprecationIssue checkWatcherBulkConcurrentRequestsSetting(
9671007 DeprecationIssue .Level .WARNING
9681008 );
9691009 }
1010+
1011+ static DeprecationIssue checkTracingApmSettings (
1012+ final Settings settings ,
1013+ final PluginsAndModules pluginsAndModules ,
1014+ final ClusterState clusterState ,
1015+ final XPackLicenseState licenseState
1016+ ) {
1017+ String url = "https://ela.st/es-deprecation-9-tracing-apm-settings" ;
1018+ Setting .Property [] properties = { NodeScope , OperatorDynamic , Deprecated };
1019+ List <Setting <?>> tracingApmSettings = List .of (
1020+ Setting .prefixKeySetting ("tracing.apm.agent." , key -> Setting .simpleString (key , properties )),
1021+ Setting .stringListSetting ("tracing.apm.names.include" , properties ),
1022+ Setting .stringListSetting ("tracing.apm.names.exclude" , properties ),
1023+ Setting .stringListSetting ("tracing.apm.sanitize_field_names" , properties ),
1024+ Setting .boolSetting ("tracing.apm.enabled" , false , properties ),
1025+ SecureSetting .secureString ("tracing.apm.api_key" , null , Deprecated ),
1026+ SecureSetting .secureString ("tracing.apm.secret_token" , null , Deprecated )
1027+ );
1028+ return checkMultipleRemovedSettings (
1029+ clusterState .metadata ().settings (),
1030+ settings ,
1031+ tracingApmSettings ,
1032+ url ,
1033+ "[tracing.apm.*] settings are no longer accepted as of 9.0.0"
1034+ + " and should be replaced by [telemetry.*] or [telemetry.tracing.*] settings." ,
1035+ DeprecationIssue .Level .CRITICAL
1036+ );
1037+ }
9701038}
0 commit comments