Skip to content

Commit 3c1e005

Browse files
HDDS-13804. Make server tracing config dynamically reconfigurable (#10056)
1 parent 914b99c commit 3c1e005

11 files changed

Lines changed: 137 additions & 19 deletions

File tree

hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/tracing/TracingConfig.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ public class TracingConfig extends ReconfigurableConfig {
4343
key = "ozone.tracing.enabled",
4444
defaultValue = "false",
4545
type = ConfigType.BOOLEAN,
46+
reconfigurable = true,
4647
tags = { ConfigTag.OZONE, ConfigTag.HDDS },
4748
description = "If true, tracing is initialized and spans may be exported (subject to sampling)."
4849
)
@@ -52,6 +53,7 @@ public class TracingConfig extends ReconfigurableConfig {
5253
key = "ozone.tracing.endpoint",
5354
defaultValue = "",
5455
type = ConfigType.STRING,
56+
reconfigurable = true,
5557
tags = { ConfigTag.OZONE, ConfigTag.HDDS },
5658
description = "OTLP gRPC receiver endpoint URL."
5759
)
@@ -61,6 +63,7 @@ public class TracingConfig extends ReconfigurableConfig {
6163
key = "ozone.tracing.sampler",
6264
defaultValue = "-1",
6365
type = ConfigType.DOUBLE,
66+
reconfigurable = true,
6467
tags = { ConfigTag.OZONE, ConfigTag.HDDS },
6568
description = "Root trace sampling ratio (0.0 to 1.0)."
6669
)
@@ -70,6 +73,7 @@ public class TracingConfig extends ReconfigurableConfig {
7073
key = "ozone.tracing.span.sampling",
7174
defaultValue = "",
7275
type = ConfigType.STRING,
76+
reconfigurable = true,
7377
tags = { ConfigTag.OZONE, ConfigTag.HDDS },
7478
description = "Optional per-span sampling: comma-separated spanName:rate entries."
7579
)

hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/tracing/TracingUtil.java

Lines changed: 45 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -51,31 +51,59 @@ public final class TracingUtil {
5151

5252
private static volatile boolean isInit = false;
5353
private static Tracer tracer = OpenTelemetry.noop().getTracer("noop");
54+
private static SdkTracerProvider sdkTracerProvider;
5455

5556
private TracingUtil() {
5657
}
5758

5859
/**
5960
* Initialize the tracing with the given service name.
6061
*/
61-
public static void initTracing(
62-
String serviceName, ConfigurationSource conf) {
63-
if (!isTracingEnabled(conf) || isInit) {
62+
public static synchronized void initTracing(
63+
String serviceName, TracingConfig tracingConfig) {
64+
if (!tracingConfig.isTracingEnabled() || isInit) {
6465
return;
6566
}
6667

6768
try {
68-
initialize(serviceName, conf);
69+
initialize(serviceName, tracingConfig);
6970
isInit = true;
7071
LOG.info("Initialized tracing service: {}", serviceName);
7172
} catch (Exception e) {
7273
LOG.error("Failed to initialize tracing", e);
7374
}
7475
}
7576

76-
private static void initialize(String serviceName, ConfigurationSource conf) {
77+
/**
78+
* Receives serviceName and configurationSource.
79+
* Delegates tracing initiation to {@link #initTracing(String, TracingConfig)}.
80+
*/
81+
public static synchronized void initTracing(
82+
String serviceName, ConfigurationSource conf) {
83+
initTracing(serviceName, conf.getObject(TracingConfig.class));
84+
}
85+
86+
/**
87+
* Shuts down and re-initializes tracing.
88+
* Called after tracing-related keys are reconfigured on OM/SCM/DN.
89+
*/
90+
public static synchronized void reconfigureTracing(
91+
String serviceName, TracingConfig tracingConfig) {
92+
shutdownTracing();
93+
initTracing(serviceName, tracingConfig);
94+
}
95+
96+
private static void shutdownTracing() {
97+
if (sdkTracerProvider != null) {
98+
sdkTracerProvider.shutdown();
99+
sdkTracerProvider = null;
100+
}
101+
tracer = OpenTelemetry.noop().getTracer("noop");
102+
isInit = false;
103+
}
104+
105+
private static void initialize(String serviceName, TracingConfig tracingConfig) {
77106
//Fetch and log the right tracing parameters based on config, environment variable and default value priority.
78-
TracingConfig tracingConfig = conf.getObject(TracingConfig.class);
79107
String otelEndPoint = tracingConfig.getTracingEndpoint();
80108
double samplerRatio = tracingConfig.getTraceSamplerRatio();
81109
LOG.info("Sampling Trace Config = '{}'", samplerRatio);
@@ -106,10 +134,17 @@ private static void initialize(String serviceName, ConfigurationSource conf) {
106134
.setResource(resource)
107135
.setSampler(sampler)
108136
.build();
109-
OpenTelemetry openTelemetry = OpenTelemetrySdk.builder()
110-
.setTracerProvider(tracerProvider)
111-
.build();
112-
tracer = openTelemetry.getTracer(serviceName);
137+
138+
try {
139+
OpenTelemetry openTelemetry = OpenTelemetrySdk.builder()
140+
.setTracerProvider(tracerProvider)
141+
.build();
142+
tracer = openTelemetry.getTracer(serviceName);
143+
sdkTracerProvider = tracerProvider;
144+
} catch (RuntimeException e) {
145+
tracerProvider.shutdown();
146+
throw e;
147+
}
113148
}
114149

115150
/**

hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/HddsDatanodeService.java

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@
6565
import org.apache.hadoop.hdds.conf.ConfigurationSource;
6666
import org.apache.hadoop.hdds.conf.OzoneConfiguration;
6767
import org.apache.hadoop.hdds.conf.ReconfigurationHandler;
68+
import org.apache.hadoop.hdds.conf.TracingReconfigurationCallback;
6869
import org.apache.hadoop.hdds.protocol.DatanodeDetails;
6970
import org.apache.hadoop.hdds.protocol.DatanodeID;
7071
import org.apache.hadoop.hdds.protocol.DiskBalancerProtocol;
@@ -78,7 +79,7 @@
7879
import org.apache.hadoop.hdds.server.OzoneAdmins;
7980
import org.apache.hadoop.hdds.server.http.HttpConfig;
8081
import org.apache.hadoop.hdds.server.http.RatisDropwizardExports;
81-
import org.apache.hadoop.hdds.tracing.TracingUtil;
82+
import org.apache.hadoop.hdds.tracing.TracingConfig;
8283
import org.apache.hadoop.hdds.utils.HddsServerUtil;
8384
import org.apache.hadoop.hdds.utils.HddsVersionInfo;
8485
import org.apache.hadoop.hdds.utils.IOUtils;
@@ -253,8 +254,10 @@ public String getNamespace() {
253254
datanodeDetails.setSetupTime(Time.now());
254255
datanodeDetails.setRevision(
255256
HddsVersionInfo.HDDS_VERSION_INFO.getRevision());
256-
TracingUtil.initTracing(
257-
"HddsDatanodeService." + datanodeDetails.getID(), conf);
257+
String tracingServiceName = "HddsDatanodeService." + datanodeDetails.getID();
258+
TracingConfig tracingConfig = conf.getObject(TracingConfig.class);
259+
TracingReconfigurationCallback tracingReconfigurationCallback =
260+
TracingReconfigurationCallback.init(tracingServiceName, tracingConfig);
258261
LOG.info("HddsDatanodeService {}", datanodeDetails);
259262
// Authenticate Hdds Datanode service if security is enabled
260263
if (OzoneSecurityUtil.isSecurityEnabled(conf)) {
@@ -304,6 +307,7 @@ public String getNamespace() {
304307

305308
reconfigurationHandler =
306309
new ReconfigurationHandler("DN", conf, this::checkAdminPrivilege)
310+
.register(tracingConfig)
307311
.register(HDDS_DATANODE_BLOCK_DELETE_THREAD_MAX,
308312
this::reconfigBlockDeleteThreadMax)
309313
.register(OZONE_BLOCK_DELETING_SERVICE_WORKERS,
@@ -324,6 +328,7 @@ public String getNamespace() {
324328
}
325329

326330
reconfigurationHandler.setReconfigurationCompleteCallback(reconfigurationHandler.defaultLoggingCallback());
331+
reconfigurationHandler.registerCompleteCallback(tracingReconfigurationCallback);
327332

328333
datanodeStateMachine = new DatanodeStateMachine(this, datanodeDetails, conf,
329334
dnCertClient, secretKeyClient, this::terminateDatanode,
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
/*
2+
* Licensed to the Apache Software Foundation (ASF) under one or more
3+
* contributor license agreements. See the NOTICE file distributed with
4+
* this work for additional information regarding copyright ownership.
5+
* The ASF licenses this file to You under the Apache License, Version 2.0
6+
* (the "License"); you may not use this file except in compliance with
7+
* the License. You may obtain a copy of the License at
8+
*
9+
* http://www.apache.org/licenses/LICENSE-2.0
10+
*
11+
* Unless required by applicable law or agreed to in writing, software
12+
* distributed under the License is distributed on an "AS IS" BASIS,
13+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14+
* See the License for the specific language governing permissions and
15+
* limitations under the License.
16+
*/
17+
18+
package org.apache.hadoop.hdds.conf;
19+
20+
import java.util.Map;
21+
import org.apache.hadoop.conf.Configuration;
22+
import org.apache.hadoop.hdds.tracing.TracingConfig;
23+
import org.apache.hadoop.hdds.tracing.TracingUtil;
24+
25+
/**
26+
* Reconfiguration hook for ozone.tracing settings.
27+
* init runs TracingUtil.initTracing once and returns this callback for registerCompleteCallback.
28+
* onPropertiesChanged calls TracingUtil.reconfigureTracing when any changed key starts with ozone.tracing.
29+
*/
30+
31+
public final class TracingReconfigurationCallback implements ReconfigurationChangeCallback {
32+
33+
private static final String TRACING_KEY_PREFIX = "ozone.tracing.";
34+
35+
private final String serviceName;
36+
private final TracingConfig tracingConfig;
37+
38+
private TracingReconfigurationCallback(String serviceName, TracingConfig tracingConfig) {
39+
this.serviceName = serviceName;
40+
this.tracingConfig = tracingConfig;
41+
}
42+
43+
/**
44+
* Initializes tracing and returns a callback for runtime reconfiguration.
45+
*/
46+
public static TracingReconfigurationCallback init(
47+
String serviceName, TracingConfig tracingConfig) {
48+
TracingUtil.initTracing(serviceName, tracingConfig);
49+
return new TracingReconfigurationCallback(serviceName, tracingConfig);
50+
}
51+
52+
@Override
53+
public void onPropertiesChanged(Map<String, Boolean> changedKeys, Configuration newConf) {
54+
if (changedKeys.keySet().stream().anyMatch(k -> k.startsWith(TRACING_KEY_PREFIX))) {
55+
TracingUtil.reconfigureTracing(serviceName, tracingConfig);
56+
}
57+
}
58+
}

hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/server/StorageContainerManager.java

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@
6363
import org.apache.hadoop.hdds.conf.ConfigurationSource;
6464
import org.apache.hadoop.hdds.conf.OzoneConfiguration;
6565
import org.apache.hadoop.hdds.conf.ReconfigurationHandler;
66+
import org.apache.hadoop.hdds.conf.TracingReconfigurationCallback;
6667
import org.apache.hadoop.hdds.protocol.proto.HddsProtos;
6768
import org.apache.hadoop.hdds.protocol.proto.HddsProtos.NodeState;
6869
import org.apache.hadoop.hdds.protocol.proto.StorageContainerDatanodeProtocolProtos.SCMCommandProto;
@@ -168,6 +169,7 @@
168169
import org.apache.hadoop.hdds.server.events.EventQueue;
169170
import org.apache.hadoop.hdds.server.events.FixedThreadPoolWithAffinityExecutor;
170171
import org.apache.hadoop.hdds.server.http.RatisDropwizardExports;
172+
import org.apache.hadoop.hdds.tracing.TracingConfig;
171173
import org.apache.hadoop.hdds.upgrade.HDDSLayoutVersionManager;
172174
import org.apache.hadoop.hdds.utils.HAUtils;
173175
import org.apache.hadoop.hdds.utils.HddsServerUtil;
@@ -351,12 +353,15 @@ private StorageContainerManager(OzoneConfiguration conf,
351353
super(HddsVersionInfo.HDDS_VERSION_INFO);
352354

353355
Objects.requireNonNull(configurator, "configurator cannot be null");
354-
Objects.requireNonNull(conf, "configuration cannot be null");
356+
configuration = Objects.requireNonNull(conf, "configuration cannot be null");
357+
TracingConfig tracingConfig = configuration.getObject(TracingConfig.class);
358+
TracingReconfigurationCallback tracingReconfigurationCallback =
359+
TracingReconfigurationCallback.init("StorageContainerManager", tracingConfig);
355360
// It is assumed the scm --init command creates the SCM Storage Config.
356361
scmStorageConfig = new SCMStorageConfig(conf);
357362

358363
scmHANodeDetails = SCMHANodeDetails.loadSCMHAConfig(conf, scmStorageConfig);
359-
configuration = conf;
364+
360365
initMetrics();
361366
initPerfMetrics();
362367

@@ -418,13 +423,15 @@ private StorageContainerManager(OzoneConfiguration conf,
418423
serviceManager = new SCMServiceManager();
419424
reconfigurationHandler =
420425
new ReconfigurationHandler("SCM", conf, this::checkAdminAccess)
426+
.register(tracingConfig)
421427
.register(OZONE_ADMINISTRATORS, this::reconfOzoneAdmins)
422428
.register(OZONE_READONLY_ADMINISTRATORS,
423429
this::reconfOzoneReadOnlyAdmins)
424430
.register(HddsConfigKeys.HDDS_SCM_SAFEMODE_LOG_INTERVAL,
425431
this::reconfigureSafeModeLogInterval);
426432

427433
reconfigurationHandler.setReconfigurationCompleteCallback(reconfigurationHandler.defaultLoggingCallback());
434+
reconfigurationHandler.registerCompleteCallback(tracingReconfigurationCallback);
428435

429436
initializeSystemManagers(conf, configurator);
430437

hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/server/StorageContainerManagerStarter.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@
2424
import org.apache.hadoop.hdds.cli.GenericCli;
2525
import org.apache.hadoop.hdds.cli.HddsVersionProvider;
2626
import org.apache.hadoop.hdds.conf.OzoneConfiguration;
27-
import org.apache.hadoop.hdds.tracing.TracingUtil;
2827
import org.apache.hadoop.hdds.utils.HddsServerUtil;
2928
import org.apache.hadoop.hdds.utils.HddsVersionInfo;
3029
import org.apache.hadoop.ozone.common.StorageInfo;
@@ -147,7 +146,6 @@ private void startScm() throws Exception {
147146
*/
148147
private void commonInit() {
149148
conf = getOzoneConf();
150-
TracingUtil.initTracing("StorageContainerManager", conf);
151149

152150
String[] originalArgs = getCmd().getParseResult().originalArgs()
153151
.toArray(new String[0]);

hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/reconfig/TestDatanodeReconfiguration.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
import java.util.concurrent.ThreadPoolExecutor;
3030
import org.apache.hadoop.conf.ReconfigurationException;
3131
import org.apache.hadoop.hdds.conf.ReconfigurationHandler;
32+
import org.apache.hadoop.hdds.tracing.TracingConfig;
3233
import org.apache.hadoop.ozone.HddsDatanodeService;
3334
import org.apache.hadoop.ozone.container.common.statemachine.DatanodeConfiguration;
3435
import org.apache.hadoop.ozone.container.common.statemachine.commandhandler.DeleteBlocksCommandHandler;
@@ -54,6 +55,7 @@ void reconfigurableProperties() {
5455
.add(OZONE_BLOCK_DELETING_SERVICE_TIMEOUT)
5556
.add(REPLICATION_STREAMS_LIMIT_KEY)
5657
.addAll(new DatanodeConfiguration().reconfigurableProperties())
58+
.addAll(new TracingConfig().reconfigurableProperties())
5759
.build();
5860

5961
assertProperties(getSubject(), expected);

hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/reconfig/TestOmReconfiguration.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141
import org.apache.commons.lang3.RandomStringUtils;
4242
import org.apache.hadoop.conf.ReconfigurationException;
4343
import org.apache.hadoop.hdds.conf.ReconfigurationHandler;
44+
import org.apache.hadoop.hdds.tracing.TracingConfig;
4445
import org.apache.hadoop.ozone.om.KeyManagerImpl;
4546
import org.apache.hadoop.ozone.om.OmConfig;
4647
import org.apache.hadoop.ozone.om.OzoneManager;
@@ -68,6 +69,7 @@ void reconfigurableProperties() {
6869
.add(OZONE_THREAD_NUMBER_DIR_DELETION)
6970
.add(OZONE_SNAPSHOT_SST_FILTERING_SERVICE_INTERVAL)
7071
.addAll(new OmConfig().reconfigurableProperties())
72+
.addAll(new TracingConfig().reconfigurableProperties())
7173
.add(OZONE_BLACKLIST_USERS)
7274
.add(OZONE_BLACKLIST_GROUPS)
7375
.add(OZONE_READ_BLACKLIST_USERS)

hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/reconfig/TestScmReconfiguration.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
import org.apache.hadoop.hdds.scm.block.SCMBlockDeletingService;
3333
import org.apache.hadoop.hdds.scm.container.replication.ReplicationManager.ReplicationManagerConfiguration;
3434
import org.apache.hadoop.hdds.scm.pipeline.WritableECContainerProvider.WritableECContainerProviderConfig;
35+
import org.apache.hadoop.hdds.tracing.TracingConfig;
3536
import org.junit.jupiter.api.Test;
3637

3738
/**
@@ -56,6 +57,7 @@ void reconfigurableProperties() {
5657
.addAll(new WritableECContainerProviderConfig()
5758
.reconfigurableProperties())
5859
.addAll(new ScmConfig().reconfigurableProperties())
60+
.addAll(new TracingConfig().reconfigurableProperties())
5961
.build();
6062

6163
assertProperties(getSubject(), expected);

hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OzoneManager.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -178,6 +178,7 @@
178178
import org.apache.hadoop.hdds.conf.ConfigurationSource;
179179
import org.apache.hadoop.hdds.conf.OzoneConfiguration;
180180
import org.apache.hadoop.hdds.conf.ReconfigurationHandler;
181+
import org.apache.hadoop.hdds.conf.TracingReconfigurationCallback;
181182
import org.apache.hadoop.hdds.protocol.SecretKeyProtocol;
182183
import org.apache.hadoop.hdds.protocol.proto.HddsProtos;
183184
import org.apache.hadoop.hdds.protocol.proto.ReconfigureProtocolProtos.ReconfigureProtocolService;
@@ -204,6 +205,7 @@
204205
import org.apache.hadoop.hdds.server.OzoneBlacklist;
205206
import org.apache.hadoop.hdds.server.ServiceRuntimeInfoImpl;
206207
import org.apache.hadoop.hdds.server.http.RatisDropwizardExports;
208+
import org.apache.hadoop.hdds.tracing.TracingConfig;
207209
import org.apache.hadoop.hdds.utils.HAUtils;
208210
import org.apache.hadoop.hdds.utils.HddsServerUtil;
209211
import org.apache.hadoop.hdds.utils.IOUtils;
@@ -517,6 +519,9 @@ private OzoneManager(OzoneConfiguration conf, StartupOption startupOption)
517519
super(OzoneVersionInfo.OZONE_VERSION_INFO);
518520
Objects.requireNonNull(conf, "conf == null");
519521
setConfiguration(conf);
522+
TracingConfig tracingConfig = conf.getObject(TracingConfig.class);
523+
TracingReconfigurationCallback tracingReconfigurationCallback =
524+
TracingReconfigurationCallback.init("OzoneManager", tracingConfig);
520525
// Load HA related configurations
521526
OMHANodeDetails omhaNodeDetails =
522527
OMHANodeDetails.loadOMHAConfig(configuration);
@@ -530,6 +535,7 @@ private OzoneManager(OzoneConfiguration conf, StartupOption startupOption)
530535
reconfigurationHandler =
531536
new ReconfigurationHandler("OM", conf, this::checkAdminUserPrivilege)
532537
.register(config)
538+
.register(tracingConfig)
533539
.register(OZONE_ADMINISTRATORS, this::reconfOzoneAdmins)
534540
.register(OZONE_READONLY_ADMINISTRATORS,
535541
this::reconfOzoneReadOnlyAdmins)
@@ -545,6 +551,7 @@ private OzoneManager(OzoneConfiguration conf, StartupOption startupOption)
545551
.register(OZONE_READ_BLACKLIST_GROUPS, this::reconfOzoneReadBlacklistGroups);
546552

547553
reconfigurationHandler.setReconfigurationCompleteCallback(reconfigurationHandler.defaultLoggingCallback());
554+
reconfigurationHandler.registerCompleteCallback(tracingReconfigurationCallback);
548555

549556
versionManager = new OMLayoutVersionManager(omStorage.getLayoutVersion());
550557
upgradeFinalizer = new OMUpgradeFinalizer(versionManager);

0 commit comments

Comments
 (0)