This is an automated email from the ASF dual-hosted git repository.
shoothzj pushed a commit to branch branch-4.16
in repository https://gitbox.apache.org/repos/asf/bookkeeper.git
The following commit(s) were added to refs/heads/branch-4.16 by this push:
new 2fa28a843f fix OrderedExecutor lost some metric (#4374)
2fa28a843f is described below
commit 2fa28a843f7959370592cc4dc83ea6b7b00a8284
Author: ken <[email protected]>
AuthorDate: Sat May 25 10:30:23 2024 +0800
fix OrderedExecutor lost some metric (#4374)
Fix [#4373](https://github.com/apache/bookkeeper/issues/4373)
### Motivation
As shown in the issue.
This is the first pr to fix the lost metric problem. And the other pr
improve the metric in SingleThreadExecutor.
Co-authored-by: fanjianye <[email protected]>
(cherry picked from commit e5300a0a2cbee6f50e20e24e79d1927d6500652a)
---
.../bookkeeper/common/util/OrderedExecutor.java | 46 ++---------------
.../common/util/TestOrderedExecutor.java | 58 ++++++++++++++++++++++
2 files changed, 63 insertions(+), 41 deletions(-)
diff --git
a/bookkeeper-common/src/main/java/org/apache/bookkeeper/common/util/OrderedExecutor.java
b/bookkeeper-common/src/main/java/org/apache/bookkeeper/common/util/OrderedExecutor.java
index 982a5d4951..f856a4ea32 100644
---
a/bookkeeper-common/src/main/java/org/apache/bookkeeper/common/util/OrderedExecutor.java
+++
b/bookkeeper-common/src/main/java/org/apache/bookkeeper/common/util/OrderedExecutor.java
@@ -391,6 +391,10 @@ public class OrderedExecutor implements ExecutorService {
ExecutorService thread = createSingleThreadExecutor(
new ThreadFactoryBuilder().setNameFormat(name + "-" +
getClass().getSimpleName() + "-" + i + "-%d")
.setThreadFactory(threadFactory).build());
+ SingleThreadExecutor ste = null;
+ if (thread instanceof SingleThreadExecutor) {
+ ste = (SingleThreadExecutor) thread;
+ }
if (traceTaskExecution || preserveMdcForTaskExecution) {
thread = addExecutorDecorators(thread);
@@ -425,48 +429,8 @@ public class OrderedExecutor implements ExecutorService {
throw new RuntimeException("Couldn't start thread " + i, e);
}
- if (thread instanceof SingleThreadExecutor) {
- SingleThreadExecutor ste = (SingleThreadExecutor) thread;
+ if (ste != null) {
ste.registerMetrics(statsLogger);
- } else if (thread instanceof ThreadPoolExecutor) {
- ThreadPoolExecutor threadPoolExecutor = (ThreadPoolExecutor)
thread;
- // Register gauges
- statsLogger.scopeLabel("thread", String.valueOf(idx))
- .registerGauge(String.format("%s-queue", name), new
Gauge<Number>() {
- @Override
- public Number getDefaultValue() {
- return 0;
- }
-
- @Override
- public Number getSample() {
- return threadPoolExecutor.getQueue().size();
- }
- });
- statsLogger.scopeLabel("thread", String.valueOf(idx))
- .registerGauge(String.format("%s-completed-tasks",
name), new Gauge<Number>() {
- @Override
- public Number getDefaultValue() {
- return 0;
- }
-
- @Override
- public Number getSample() {
- return
threadPoolExecutor.getCompletedTaskCount();
- }
- });
- statsLogger.scopeLabel("thread", String.valueOf(idx))
- .registerGauge(String.format("%s-total-tasks", name),
new Gauge<Number>() {
- @Override
- public Number getDefaultValue() {
- return 0;
- }
-
- @Override
- public Number getSample() {
- return threadPoolExecutor.getTaskCount();
- }
- });
}
}
diff --git
a/bookkeeper-common/src/test/java/org/apache/bookkeeper/common/util/TestOrderedExecutor.java
b/bookkeeper-common/src/test/java/org/apache/bookkeeper/common/util/TestOrderedExecutor.java
new file mode 100644
index 0000000000..f8419ec304
--- /dev/null
+++
b/bookkeeper-common/src/test/java/org/apache/bookkeeper/common/util/TestOrderedExecutor.java
@@ -0,0 +1,58 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.bookkeeper.common.util;
+
+import org.apache.bookkeeper.test.TestStatsProvider;
+import org.junit.Assert;
+import org.junit.Test;
+
+/**
+ * Test OrderedExecutor/Scheduler .
+ */
+public class TestOrderedExecutor {
+
+ @Test
+ public void testOrderExecutorPrometheusMetric() {
+ testGenerateMetric(false);
+ testGenerateMetric(true);
+ }
+
+ private void testGenerateMetric(boolean isTraceTaskExecution) {
+ TestStatsProvider provider = new TestStatsProvider();
+
+ TestStatsProvider.TestStatsLogger rootStatsLogger =
provider.getStatsLogger("");
+ TestStatsProvider.TestStatsLogger bookieStats =
+ (TestStatsProvider.TestStatsLogger)
rootStatsLogger.scope("bookkeeper_server");
+
+ OrderedExecutor executor =
OrderedExecutor.newBuilder().statsLogger(bookieStats)
+
.name("test").numThreads(1).traceTaskExecution(isTraceTaskExecution).build();
+
+ TestStatsProvider.TestStatsLogger testStatsLogger =
(TestStatsProvider.TestStatsLogger)
+ bookieStats.scope("thread_test_OrderedExecutor_0_0");
+
+
Assert.assertNotNull(testStatsLogger.getGauge("thread_executor_queue").getSample());
+
Assert.assertNotNull(testStatsLogger.getGauge("thread_executor_completed").getSample());
+
Assert.assertNotNull(testStatsLogger.getGauge("thread_executor_tasks_completed").getSample());
+
Assert.assertNotNull(testStatsLogger.getGauge("thread_executor_tasks_rejected").getSample());
+
Assert.assertNotNull(testStatsLogger.getGauge("thread_executor_tasks_failed").getSample());
+ }
+}