This is an automated email from the ASF dual-hosted git repository.
zaynt4606 pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/celeborn.git
The following commit(s) were added to refs/heads/main by this push:
new 2fcd8a1ead [CELEBORN-2397][CLI] Expose logger level get/set endpoints
in celeborn-cli (#3774)
2fcd8a1ead is described below
commit 2fcd8a1ead664936267afb1a97702b5d57fb87a3
Author: yew1eb <[email protected]>
AuthorDate: Fri Jul 31 15:56:17 2026 +0800
[CELEBORN-2397][CLI] Expose logger level get/set endpoints in celeborn-cli
(#3774)
* [CELEBORN-2397][CLI] Expose logger level get/set endpoints in celeborn-cli
* [CELEBORN-2397][CLI] Trigger CI
* [CELEBORN-2397][CLI] Trigger CI
---
.../apache/celeborn/cli/common/BaseCommand.scala | 33 +++++++++++++++++-
.../apache/celeborn/cli/common/CommonOptions.scala | 13 +++++++
.../apache/celeborn/cli/master/MasterOptions.scala | 6 ++++
.../celeborn/cli/master/MasterSubcommand.scala | 7 +++-
.../celeborn/cli/master/MasterSubcommandImpl.scala | 9 +++++
.../apache/celeborn/cli/worker/WorkerOptions.scala | 6 ++++
.../celeborn/cli/worker/WorkerSubcommand.scala | 7 +++-
.../celeborn/cli/worker/WorkerSubcommandImpl.scala | 9 +++++
.../celeborn/cli/TestCelebornCliCommands.scala | 40 ++++++++++++++++++++++
docs/celeborn_cli.md | 25 ++++++++++++--
10 files changed, 149 insertions(+), 6 deletions(-)
diff --git
a/cli/src/main/scala/org/apache/celeborn/cli/common/BaseCommand.scala
b/cli/src/main/scala/org/apache/celeborn/cli/common/BaseCommand.scala
index e794b826f2..e74f86b6aa 100644
--- a/cli/src/main/scala/org/apache/celeborn/cli/common/BaseCommand.scala
+++ b/cli/src/main/scala/org/apache/celeborn/cli/common/BaseCommand.scala
@@ -25,7 +25,7 @@ import org.apache.commons.lang3.StringUtils
import picocli.CommandLine.{Command, ParameterException}
import picocli.CommandLine.Model.CommandSpec
-import org.apache.celeborn.rest.v1.model.{DeleteDynamicConfigRequest,
HandleResponse, UpsertDynamicConfigRequest}
+import org.apache.celeborn.rest.v1.model.{DeleteDynamicConfigRequest,
HandleResponse, LoggerInfo, UpsertDynamicConfigRequest}
@Command(mixinStandardHelpOptions = true, versionProvider =
classOf[CliVersionProvider])
abstract class BaseCommand extends Runnable with CliLogging {
@@ -82,4 +82,35 @@ abstract class BaseCommand extends Runnable with CliLogging {
.name(commonOptions.configName),
commonOptions.getAuthHeader)
}
+
+ private[cli] val validLoggerLevels =
+ Seq("OFF", "FATAL", "ERROR", "WARN", "INFO", "DEBUG", "TRACE", "ALL")
+
+ private[cli] def setLogLevel(
+ commonOptions: CommonOptions,
+ spec: CommandSpec,
+ set: (LoggerInfo, util.Map[String, String]) => HandleResponse):
HandleResponse = {
+ if (StringUtils.isBlank(commonOptions.loggerName)) {
+ throw new ParameterException(
+ spec.commandLine(),
+ "Logger name must be provided via --logger-name for this command.")
+ }
+ if (StringUtils.isBlank(commonOptions.loggerLevel)) {
+ throw new ParameterException(
+ spec.commandLine(),
+ "Logger level must be provided via --logger-level for this command.")
+ }
+ val level = commonOptions.loggerLevel.toUpperCase
+ if (!validLoggerLevels.contains(level)) {
+ throw new ParameterException(
+ spec.commandLine(),
+ s"Invalid logger level `${commonOptions.loggerLevel}`, must be one of
" +
+ validLoggerLevels.mkString(", "))
+ }
+ set(
+ new LoggerInfo()
+ .name(commonOptions.loggerName)
+ .level(level),
+ commonOptions.getAuthHeader)
+ }
}
diff --git
a/cli/src/main/scala/org/apache/celeborn/cli/common/CommonOptions.scala
b/cli/src/main/scala/org/apache/celeborn/cli/common/CommonOptions.scala
index 6d1fff6c42..305f0aa980 100644
--- a/cli/src/main/scala/org/apache/celeborn/cli/common/CommonOptions.scala
+++ b/cli/src/main/scala/org/apache/celeborn/cli/common/CommonOptions.scala
@@ -93,6 +93,19 @@ class CommonOptions {
description = Array("The application Id list separated by comma."))
private[cli] var apps: String = _
+ @Option(
+ names = Array("--logger-name"),
+ paramLabel = "logger_name",
+ description = Array("The logger name to query or set the level for. " +
+ "If not specified for --show-loggers, all configured loggers are
returned."))
+ private[cli] var loggerName: String = _
+
+ @Option(
+ names = Array("--logger-level"),
+ paramLabel = "level",
+ description = Array("The logger level to set, e.g. DEBUG, INFO, WARN,
ERROR."))
+ private[cli] var loggerLevel: String = _
+
@Option(
names = Array("--auth-header"),
paramLabel = "authHeader",
diff --git
a/cli/src/main/scala/org/apache/celeborn/cli/master/MasterOptions.scala
b/cli/src/main/scala/org/apache/celeborn/cli/master/MasterOptions.scala
index 7f67df1f15..83f6c1d09b 100644
--- a/cli/src/main/scala/org/apache/celeborn/cli/master/MasterOptions.scala
+++ b/cli/src/main/scala/org/apache/celeborn/cli/master/MasterOptions.scala
@@ -104,6 +104,12 @@ final class MasterOptions {
@Option(names = Array("--show-thread-dump"), description = Array("Show
master thread dump"))
private[master] var showThreadDump: Boolean = _
+ @Option(names = Array("--show-loggers"), description = Array("Show logger
levels"))
+ private[master] var showLoggers: Boolean = _
+
+ @Option(names = Array("--set-loglevel"), description = Array("Set logger
level"))
+ private[master] var setLogLevel: Boolean = _
+
@Option(names = Array("--show-container-info"), description = Array("Show
container info"))
private[master] var showContainerInfo: Boolean = _
diff --git
a/cli/src/main/scala/org/apache/celeborn/cli/master/MasterSubcommand.scala
b/cli/src/main/scala/org/apache/celeborn/cli/master/MasterSubcommand.scala
index cfc0221179..3b6d609f80 100644
--- a/cli/src/main/scala/org/apache/celeborn/cli/master/MasterSubcommand.scala
+++ b/cli/src/main/scala/org/apache/celeborn/cli/master/MasterSubcommand.scala
@@ -25,7 +25,7 @@ import picocli.CommandLine.Model.CommandSpec
import org.apache.celeborn.cli.CelebornCli
import org.apache.celeborn.cli.common.{BaseCommand, CliLogging, CommonOptions}
import org.apache.celeborn.cli.config.CliConfigManager
-import org.apache.celeborn.rest.v1.master.{ApplicationApi, ConfApi,
DefaultApi, MasterApi, ShuffleApi, WorkerApi}
+import org.apache.celeborn.rest.v1.master.{ApplicationApi, ConfApi,
DefaultApi, LoggerApi, MasterApi, ShuffleApi, WorkerApi}
import org.apache.celeborn.rest.v1.master.invoker.ApiClient
import org.apache.celeborn.rest.v1.model._
@@ -67,6 +67,7 @@ trait MasterSubcommand extends BaseCommand {
private[master] def applicationApi: ApplicationApi = new
ApplicationApi(apiClient)
private[master] def confApi: ConfApi = new ConfApi(apiClient)
private[master] def defaultApi: DefaultApi = new DefaultApi(apiClient)
+ private[master] def loggerApi: LoggerApi = new LoggerApi(apiClient)
private[master] def masterApi: MasterApi = new MasterApi(apiClient)
private[master] def shuffleApi: ShuffleApi = new ShuffleApi(apiClient)
private[master] def workerApi: WorkerApi = new WorkerApi(apiClient)
@@ -115,6 +116,10 @@ trait MasterSubcommand extends BaseCommand {
private[master] def runShowThreadDump: ThreadStackResponse
+ private[master] def runShowLoggers: LoggerInfos
+
+ private[master] def runSetLogLevel: HandleResponse
+
private[master] def reviseLostShuffles: HandleResponse
private[master] def deleteApps: HandleResponse
diff --git
a/cli/src/main/scala/org/apache/celeborn/cli/master/MasterSubcommandImpl.scala
b/cli/src/main/scala/org/apache/celeborn/cli/master/MasterSubcommandImpl.scala
index 6efe9bf166..acc735d617 100644
---
a/cli/src/main/scala/org/apache/celeborn/cli/master/MasterSubcommandImpl.scala
+++
b/cli/src/main/scala/org/apache/celeborn/cli/master/MasterSubcommandImpl.scala
@@ -55,6 +55,8 @@ class MasterSubcommandImpl extends MasterSubcommand {
if (masterOptions.upsertDynamicConf) log(runUpsertDynamicConf)
if (masterOptions.deleteDynamicConf) log(runDeleteDynamicConf)
if (masterOptions.showThreadDump) log(runShowThreadDump)
+ if (masterOptions.showLoggers) log(runShowLoggers)
+ if (masterOptions.setLogLevel) log(runSetLogLevel)
if (masterOptions.reviseLostShuffles) log(reviseLostShuffles)
if (masterOptions.deleteApps) log(deleteApps)
if (!StringUtils.isBlank(masterOptions.updateInterruptionNotices))
@@ -229,6 +231,13 @@ class MasterSubcommandImpl extends MasterSubcommand {
private[master] def runShowThreadDump: ThreadStackResponse =
defaultApi.getThreadDump(commonOptions.getAuthHeader)
+ private[master] def runShowLoggers: LoggerInfos =
+ loggerApi.getLogger(commonOptions.loggerName, null,
commonOptions.getAuthHeader)
+
+ private[master] def runSetLogLevel: HandleResponse = {
+ setLogLevel(commonOptions, spec, loggerApi.setLogger)
+ }
+
private[master] def runAddClusterAlias: Unit = {
val aliasToAdd = masterOptions.addClusterAlias
val hosts = commonOptions.hostList
diff --git
a/cli/src/main/scala/org/apache/celeborn/cli/worker/WorkerOptions.scala
b/cli/src/main/scala/org/apache/celeborn/cli/worker/WorkerOptions.scala
index 206ff1196c..3d0ec71223 100644
--- a/cli/src/main/scala/org/apache/celeborn/cli/worker/WorkerOptions.scala
+++ b/cli/src/main/scala/org/apache/celeborn/cli/worker/WorkerOptions.scala
@@ -79,4 +79,10 @@ final class WorkerOptions {
@Option(names = Array("--show-thread-dump"), description = Array("Show
worker thread dump"))
private[worker] var showThreadDump: Boolean = _
+ @Option(names = Array("--show-loggers"), description = Array("Show logger
levels"))
+ private[worker] var showLoggers: Boolean = _
+
+ @Option(names = Array("--set-loglevel"), description = Array("Set logger
level"))
+ private[worker] var setLogLevel: Boolean = _
+
}
diff --git
a/cli/src/main/scala/org/apache/celeborn/cli/worker/WorkerSubcommand.scala
b/cli/src/main/scala/org/apache/celeborn/cli/worker/WorkerSubcommand.scala
index 42f20d1606..75a2e409a5 100644
--- a/cli/src/main/scala/org/apache/celeborn/cli/worker/WorkerSubcommand.scala
+++ b/cli/src/main/scala/org/apache/celeborn/cli/worker/WorkerSubcommand.scala
@@ -23,7 +23,7 @@ import picocli.CommandLine.Model.CommandSpec
import org.apache.celeborn.cli.CelebornCli
import org.apache.celeborn.cli.common.{BaseCommand, CliLogging, CommonOptions}
import org.apache.celeborn.rest.v1.model._
-import org.apache.celeborn.rest.v1.worker.{ApplicationApi, ConfApi,
DefaultApi, ShuffleApi, WorkerApi}
+import org.apache.celeborn.rest.v1.worker.{ApplicationApi, ConfApi,
DefaultApi, LoggerApi, ShuffleApi, WorkerApi}
import org.apache.celeborn.rest.v1.worker.invoker.ApiClient
trait WorkerSubcommand extends BaseCommand {
@@ -53,6 +53,7 @@ trait WorkerSubcommand extends BaseCommand {
private[worker] def applicationApi = new ApplicationApi(apiClient)
private[worker] def confApi = new ConfApi(apiClient)
private[worker] def defaultApi = new DefaultApi(apiClient)
+ private[worker] def loggerApi = new LoggerApi(apiClient)
private[worker] def shuffleApi = new ShuffleApi(apiClient)
private[worker] def workerApi = new WorkerApi(apiClient)
@@ -86,4 +87,8 @@ trait WorkerSubcommand extends BaseCommand {
private[worker] def runShowThreadDump: ThreadStackResponse
+ private[worker] def runShowLoggers: LoggerInfos
+
+ private[worker] def runSetLogLevel: HandleResponse
+
}
diff --git
a/cli/src/main/scala/org/apache/celeborn/cli/worker/WorkerSubcommandImpl.scala
b/cli/src/main/scala/org/apache/celeborn/cli/worker/WorkerSubcommandImpl.scala
index 19b4388fe3..f8f31615cf 100644
---
a/cli/src/main/scala/org/apache/celeborn/cli/worker/WorkerSubcommandImpl.scala
+++
b/cli/src/main/scala/org/apache/celeborn/cli/worker/WorkerSubcommandImpl.scala
@@ -41,6 +41,8 @@ class WorkerSubcommandImpl extends WorkerSubcommand {
if (workerOptions.upsertDynamicConf) log(runUpsertDynamicConf)
if (workerOptions.deleteDynamicConf) log(runDeleteDynamicConf)
if (workerOptions.showThreadDump) log(runShowThreadDump)
+ if (workerOptions.showLoggers) log(runShowLoggers)
+ if (workerOptions.setLogLevel) log(runSetLogLevel)
}
private[worker] def runShowWorkerInfo: WorkerInfoResponse =
@@ -91,6 +93,13 @@ class WorkerSubcommandImpl extends WorkerSubcommand {
private[worker] def runShowThreadDump: ThreadStackResponse =
defaultApi.getThreadDump(commonOptions.getAuthHeader)
+ private[worker] def runShowLoggers: LoggerInfos =
+ loggerApi.getLogger(commonOptions.loggerName, null,
commonOptions.getAuthHeader)
+
+ private[worker] def runSetLogLevel: HandleResponse = {
+ setLogLevel(commonOptions, spec, loggerApi.setLogger)
+ }
+
private[worker] def runShowContainerInfo: ContainerInfo =
defaultApi.getContainerInfo(commonOptions.getAuthHeader)
}
diff --git
a/cli/src/test/scala/org/apache/celeborn/cli/TestCelebornCliCommands.scala
b/cli/src/test/scala/org/apache/celeborn/cli/TestCelebornCliCommands.scala
index c702d1c264..36246e952c 100644
--- a/cli/src/test/scala/org/apache/celeborn/cli/TestCelebornCliCommands.scala
+++ b/cli/src/test/scala/org/apache/celeborn/cli/TestCelebornCliCommands.scala
@@ -178,6 +178,26 @@ class TestCelebornCliCommands extends CelebornFunSuite
with MiniClusterFeature {
captureOutputAndValidateResponse(args, "ThreadStackResponse")
}
+ test("worker --show-loggers") {
+ val args = prepareWorkerArgs() :+ "--show-loggers"
+ captureOutputAndValidateResponse(args, "LoggerInfos")
+ }
+
+ test("worker --set-loglevel") {
+ val setArgs = prepareWorkerArgs() ++ Array(
+ "--set-loglevel",
+ "--logger-name",
+ "org.apache.celeborn.cli.TestWorkerLogger",
+ "--logger-level",
+ "DEBUG")
+ captureOutputAndValidateResponse(setArgs, "success: true")
+ val showArgs = prepareWorkerArgs() ++ Array(
+ "--show-loggers",
+ "--logger-name",
+ "org.apache.celeborn.cli.TestWorkerLogger")
+ captureOutputAndValidateResponse(showArgs, "level: DEBUG")
+ }
+
test("master --show-masters-info") {
cancel("This test is temporarily disabled since HA is not enabled in the
unit tests.")
val args = prepareMasterArgs() :+ "--show-masters-info"
@@ -284,6 +304,26 @@ class TestCelebornCliCommands extends CelebornFunSuite
with MiniClusterFeature {
captureOutputAndValidateResponse(args, "ThreadStackResponse")
}
+ test("master --show-loggers") {
+ val args = prepareMasterArgs() :+ "--show-loggers"
+ captureOutputAndValidateResponse(args, "LoggerInfos")
+ }
+
+ test("master --set-loglevel") {
+ val setArgs = prepareMasterArgs() ++ Array(
+ "--set-loglevel",
+ "--logger-name",
+ "org.apache.celeborn.cli.TestMasterLogger",
+ "--logger-level",
+ "DEBUG")
+ captureOutputAndValidateResponse(setArgs, "success: true")
+ val showArgs = prepareMasterArgs() ++ Array(
+ "--show-loggers",
+ "--logger-name",
+ "org.apache.celeborn.cli.TestMasterLogger")
+ captureOutputAndValidateResponse(showArgs, "level: DEBUG")
+ }
+
test("master --exclude-worker and --remove-excluded-worker") {
val excludeArgs = prepareMasterArgs() ++ Array(
"--exclude-worker",
diff --git a/docs/celeborn_cli.md b/docs/celeborn_cli.md
index feb6d1c2b2..996139aa38 100644
--- a/docs/celeborn_cli.md
+++ b/docs/celeborn_cli.md
@@ -82,7 +82,8 @@ Usage: celeborn-cli master [-hV] [--apps=appId]
[--auth-header=authHeader]
[--cluster=cluster_alias] [--config-level=level]
[--config-name=username] [--config-tenant=tenant_id]
[--delete-configs=c1,c2,c3...] [--host-list=h1,h2,
- h3...] [--hostport=host:port] [--upsert-configs=k1:
+ h3...] [--hostport=host:port] [--logger-level=level]
+ [--logger-name=logger_name] [--upsert-configs=k1:
v1,k2:v2,k3:v3...] [--worker-ids=w1,w2,w3...]
(--show-masters-info | --show-cluster-apps |
--show-cluster-apps-info | --show-cluster-shuffles |
@@ -98,6 +99,7 @@ Usage: celeborn-cli master [-hV] [--apps=appId]
[--auth-header=authHeader]
--show-workers-topology | --show-conf |
--show-dynamic-conf | --upsert-dynamic-conf |
--delete-dynamic-conf | --show-thread-dump |
+ --show-loggers | --set-loglevel |
--show-container-info | --add-cluster-alias=alias |
--remove-cluster-alias=alias |
--remove-workers-unavailable-info |
@@ -129,6 +131,12 @@ Usage: celeborn-cli master [-hV] [--apps=appId]
[--auth-header=authHeader]
--host-list=h1,h2,h3...
List of hosts to pass to the command
--hostport=host:port The host and http port
+ --logger-level=level The logger level to set, e.g. DEBUG, INFO, WARN,
+ ERROR.
+ --logger-name=logger_name
+ The logger name to query or set the level for. If
+ not specified for --show-loggers, all configured
+ loggers are returned.
--remove-cluster-alias=alias
Remove alias to use in the cli for the given set
of masters
@@ -142,6 +150,7 @@ Usage: celeborn-cli master [-hV] [--apps=appId]
[--auth-header=authHeader]
--send-worker-event=IMMEDIATELY | DECOMMISSION | DECOMMISSION_THEN_IDLE |
GRACEFUL | RECOMMISSION | NONE
Send an event to a worker
+ --set-loglevel Set logger level
--show-cluster-apps Show cluster application's ids
--show-cluster-apps-info
Show cluster application's info
@@ -156,6 +165,7 @@ Usage: celeborn-cli master [-hV] [--apps=appId]
[--auth-header=authHeader]
Show excluded workers
--show-lifecycle-managers
Show lifecycle managers
+ --show-loggers Show logger levels
--show-lost-workers Show lost workers
--show-manual-excluded-workers
Show manual excluded workers
@@ -192,7 +202,8 @@ Usage: celeborn-cli worker [-hV] [--apps=appId]
[--auth-header=authHeader]
[--cluster=cluster_alias] [--config-level=level]
[--config-name=username] [--config-tenant=tenant_id]
[--delete-configs=c1,c2,c3...] [--host-list=h1,h2,
- h3...] [--hostport=host:port] [--upsert-configs=k1:
+ h3...] [--hostport=host:port] [--logger-level=level]
+ [--logger-name=logger_name] [--upsert-configs=k1:
v1,k2:v2,k3:v3...] [--worker-ids=w1,w2,w3...]
(--show-worker-info | --show-apps-on-worker |
--show-shuffles-on-worker |
@@ -202,7 +213,7 @@ Usage: celeborn-cli worker [-hV] [--apps=appId]
[--auth-header=authHeader]
--exit=exit_type | --show-conf |
--show-container-info | --show-dynamic-conf |
--upsert-dynamic-conf | --delete-dynamic-conf |
- --show-thread-dump)
+ --show-thread-dump | --show-loggers |
--set-loglevel)
--apps=appId The application Id list separated by comma.
--auth-header=authHeader
The http `Authorization` header for
@@ -226,10 +237,18 @@ Usage: celeborn-cli worker [-hV] [--apps=appId]
[--auth-header=authHeader]
--is-decommissioning Check if the system is decommissioning
--is-registered Check if the system is registered
--is-shutdown Check if the system is shutdown
+ --logger-level=level The logger level to set, e.g. DEBUG, INFO, WARN,
+ ERROR.
+ --logger-name=logger_name
+ The logger name to query or set the level for. If
+ not specified for --show-loggers, all configured
+ loggers are returned.
+ --set-loglevel Set logger level
--show-apps-on-worker Show applications running on the worker
--show-conf Show worker conf
--show-container-info Show container info
--show-dynamic-conf Show dynamic worker conf
+ --show-loggers Show logger levels
--show-partition-location-info
Show partition location information
--show-shuffles-on-worker