tags) {
+ executor.setThreadFactory(
+ new CountedThreadFactory(executor.getThreadFactory(), registry, name, tags));
+ }
+}
diff --git a/core/commons/che-core-commons-observability/src/main/java/org/eclipse/che/commons/observability/ExecutorServiceWrapper.java b/core/commons/che-core-commons-observability/src/main/java/org/eclipse/che/commons/observability/ExecutorServiceWrapper.java
new file mode 100644
index 0000000000..50ef304f33
--- /dev/null
+++ b/core/commons/che-core-commons-observability/src/main/java/org/eclipse/che/commons/observability/ExecutorServiceWrapper.java
@@ -0,0 +1,60 @@
+/*
+ * Copyright (c) 2012-2018 Red Hat, Inc.
+ * This program and the accompanying materials are made
+ * available under the terms of the Eclipse Public License 2.0
+ * which is available at https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * Red Hat, Inc. - initial API and implementation
+ */
+package org.eclipse.che.commons.observability;
+
+import com.google.common.annotations.Beta;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.ScheduledExecutorService;
+import org.eclipse.che.commons.schedule.executor.CronExecutorService;
+
+/**
+ * Wrapper of different implemntations of {@link ExecutorService}. At this moment supported: {@link
+ * ExecutorService}, {@link ScheduledExecutorService} and {@link CronExecutorService}.
+ *
+ * Depending on implementation and environment configuration wrapper can add to the original
+ * class different capabilities like monitoring or tracing.
+ *
+ * @author Sergii Kabashniuk
+ */
+@Beta
+public interface ExecutorServiceWrapper {
+
+ /**
+ * Creates wrapper for the given executor.
+ *
+ * @param executor {@link ExecutorService} that has to be wrapped.
+ * @param name unique name that can identify concrete instance of executor.
+ * @param tags key/value pairs that gives some context about provided executor.
+ * @return wrapped instance of given executor.
+ */
+ ExecutorService wrap(ExecutorService executor, String name, String... tags);
+
+ /**
+ * Creates wrapper for the given executor.
+ *
+ * @param executor {@link ScheduledExecutorService} that has to be wrapped.
+ * @param name unique name that can identify concrete instance of executor.
+ * @param tags key/value pairs that gives some context about provided executor.
+ * @return wrapped instance of given executor.
+ */
+ ScheduledExecutorService wrap(ScheduledExecutorService executor, String name, String... tags);
+
+ /**
+ * Creates wrapper for the given executor.
+ *
+ * @param executor {@link CronExecutorService} that has to be wrapped.
+ * @param name unique name that can identify concrete instance of executor.
+ * @param tags key/value pairs that gives some context about provided executor.
+ * @return wrapped instance of given executor.
+ */
+ CronExecutorService wrap(CronExecutorService executor, String name, String... tags);
+}
diff --git a/core/commons/che-core-commons-observability/src/main/java/org/eclipse/che/commons/observability/MeteredAndTracedExecutorServiceWrapper.java b/core/commons/che-core-commons-observability/src/main/java/org/eclipse/che/commons/observability/MeteredAndTracedExecutorServiceWrapper.java
new file mode 100644
index 0000000000..d0b75a38ec
--- /dev/null
+++ b/core/commons/che-core-commons-observability/src/main/java/org/eclipse/che/commons/observability/MeteredAndTracedExecutorServiceWrapper.java
@@ -0,0 +1,57 @@
+/*
+ * Copyright (c) 2012-2018 Red Hat, Inc.
+ * This program and the accompanying materials are made
+ * available under the terms of the Eclipse Public License 2.0
+ * which is available at https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * Red Hat, Inc. - initial API and implementation
+ */
+package org.eclipse.che.commons.observability;
+
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.ScheduledExecutorService;
+import javax.inject.Inject;
+import javax.inject.Singleton;
+import org.eclipse.che.commons.schedule.executor.CronExecutorService;
+
+/**
+ * Implementation of {@code ExecutorServiceWrapper} that add all sort of monitoring and tracing
+ * capabilities. Monitoring allayed first, tracing second.
+ */
+@Singleton
+public class MeteredAndTracedExecutorServiceWrapper implements ExecutorServiceWrapper {
+
+ private final MeteredExecutorServiceWrapper meteredExecutorServiceWrapper;
+ private final TracedExecutorServiceWrapper tracedExecutorServiceWrapper;
+
+ @Inject
+ public MeteredAndTracedExecutorServiceWrapper(
+ MeteredExecutorServiceWrapper meteredExecutorServiceWrapper,
+ TracedExecutorServiceWrapper tracedExecutorServiceWrapper) {
+
+ this.meteredExecutorServiceWrapper = meteredExecutorServiceWrapper;
+ this.tracedExecutorServiceWrapper = tracedExecutorServiceWrapper;
+ }
+
+ @Override
+ public ExecutorService wrap(ExecutorService executor, String name, String... tags) {
+ return tracedExecutorServiceWrapper.wrap(
+ meteredExecutorServiceWrapper.wrap(executor, name, tags), name, tags);
+ }
+
+ @Override
+ public ScheduledExecutorService wrap(
+ ScheduledExecutorService executor, String name, String... tags) {
+ return tracedExecutorServiceWrapper.wrap(
+ meteredExecutorServiceWrapper.wrap(executor, name, tags), name, tags);
+ }
+
+ @Override
+ public CronExecutorService wrap(CronExecutorService executor, String name, String... tags) {
+ return tracedExecutorServiceWrapper.wrap(
+ meteredExecutorServiceWrapper.wrap(executor, name, tags), name, tags);
+ }
+}
diff --git a/core/commons/che-core-commons-observability/src/main/java/org/eclipse/che/commons/observability/MeteredExecutorServiceWrapper.java b/core/commons/che-core-commons-observability/src/main/java/org/eclipse/che/commons/observability/MeteredExecutorServiceWrapper.java
new file mode 100644
index 0000000000..3ff8fac4c1
--- /dev/null
+++ b/core/commons/che-core-commons-observability/src/main/java/org/eclipse/che/commons/observability/MeteredExecutorServiceWrapper.java
@@ -0,0 +1,120 @@
+/*
+ * Copyright (c) 2012-2018 Red Hat, Inc.
+ * This program and the accompanying materials are made
+ * available under the terms of the Eclipse Public License 2.0
+ * which is available at https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * Red Hat, Inc. - initial API and implementation
+ */
+package org.eclipse.che.commons.observability;
+
+import io.micrometer.core.instrument.MeterRegistry;
+import io.micrometer.core.instrument.Tags;
+import io.micrometer.core.instrument.binder.jvm.ExecutorServiceMetrics;
+import io.micrometer.core.instrument.internal.TimedCronExecutorService;
+import io.micrometer.core.lang.Nullable;
+import java.lang.reflect.Field;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.ThreadPoolExecutor;
+import javax.inject.Inject;
+import javax.inject.Singleton;
+import org.eclipse.che.commons.schedule.executor.CronExecutorService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Implementation of {@code ExecutorServiceWrapper} that add all sort of monitoring capabilities
+ * from {@code ExecutorServiceMetrics}.
+ *
+ *
Also in case if a provided executor is an instance of {@code ThreadPoolExecutor} it will add
+ * metrics provided by {@code CountedThreadFactory} and {@code CountedRejectedExecutionHandler}. In
+ * case if {@code ExecutorService} provided by {@code Executors} class are the instances of
+ * java.util.concurrent.Executors$DelegatedScheduledExecutorService or
+ * java.util.concurrent.Executors$FinalizableDelegatedExecutorService there would be an attempt to
+ * unwrap them to get underlying {@code ThreadPoolExecutor} to be able to provide {@code
+ * CountedThreadFactory} and {@code CountedRejectedExecutionHandler} statistics. Failed unwrapping
+ * attempt would be only logged, no exception would be raised and no additional statistic would be
+ * published.
+ */
+@Singleton
+public class MeteredExecutorServiceWrapper implements ExecutorServiceWrapper {
+ private static final Logger LOG = LoggerFactory.getLogger(MeteredExecutorServiceWrapper.class);
+
+ private final MeterRegistry meterRegistry;
+
+ @Inject
+ public MeteredExecutorServiceWrapper(MeterRegistry meterRegistry) {
+ this.meterRegistry = meterRegistry;
+ }
+
+ @Override
+ public ScheduledExecutorService wrap(
+ ScheduledExecutorService executor, String name, String... tags) {
+
+ monitorThreadPoolExecutor(executor, name, tags);
+ return ExecutorServiceMetrics.monitor(meterRegistry, executor, name, Tags.of(tags));
+ }
+
+ @Override
+ public ExecutorService wrap(ExecutorService executor, String name, String... tags) {
+ monitorThreadPoolExecutor(executor, name, tags);
+ return ExecutorServiceMetrics.monitor(meterRegistry, executor, name, Tags.of(tags));
+ }
+
+ @Override
+ public CronExecutorService wrap(CronExecutorService executor, String name, String... tags) {
+ monitorThreadPoolExecutor(executor, name, tags);
+ new io.micrometer.core.instrument.binder.jvm.ExecutorServiceMetrics(
+ executor, name, Tags.of(tags))
+ .bindTo(meterRegistry);
+
+ return new TimedCronExecutorService(meterRegistry, executor, name, Tags.of(tags));
+ }
+
+ private void monitorThreadPoolExecutor(ExecutorService executor, String name, String... tags) {
+ String className = executor.getClass().getName();
+ ThreadPoolExecutor unwrappedThreadPoolExecutor = null;
+ if (executor instanceof ThreadPoolExecutor) {
+ unwrappedThreadPoolExecutor = (ThreadPoolExecutor) executor;
+ } else if (className.equals(
+ "java.util.concurrent.Executors$DelegatedScheduledExecutorService")) {
+ unwrappedThreadPoolExecutor = unwrapThreadPoolExecutor(executor, executor.getClass());
+ } else if (className.equals(
+ "java.util.concurrent.Executors$FinalizableDelegatedExecutorService")) {
+ unwrappedThreadPoolExecutor =
+ unwrapThreadPoolExecutor(executor, executor.getClass().getSuperclass());
+ }
+ if (unwrappedThreadPoolExecutor != null) {
+ CountedThreadFactory.monitorThreads(
+ meterRegistry, unwrappedThreadPoolExecutor, name, Tags.of(tags));
+ CountedRejectedExecutionHandler.monitorRejections(
+ meterRegistry, unwrappedThreadPoolExecutor, name, Tags.of(tags));
+ }
+ }
+
+ /**
+ * Every ScheduledThreadPoolExecutor created by {@link Executors} is wrapped. Also, {@link
+ * Executors#newSingleThreadExecutor()} wrap a regular {@link ThreadPoolExecutor}.
+ */
+ @Nullable
+ private ThreadPoolExecutor unwrapThreadPoolExecutor(ExecutorService executor, Class> wrapper) {
+ try {
+ Field e = wrapper.getDeclaredField("e");
+ e.setAccessible(true);
+ return (ThreadPoolExecutor) e.get(executor);
+ } catch (NoSuchFieldException | IllegalAccessException e) {
+ LOG.error(
+ String.format(
+ "Unable to unwrap ThreadPoolExecutor from %s instance of %s."
+ + " CountedThreadFactory and CountedThreadFactory statistic would be omitted",
+ executor, wrapper),
+ e);
+ }
+ return null;
+ }
+}
diff --git a/core/commons/che-core-commons-observability/src/main/java/org/eclipse/che/commons/observability/NoopExecutorServiceWrapper.java b/core/commons/che-core-commons-observability/src/main/java/org/eclipse/che/commons/observability/NoopExecutorServiceWrapper.java
new file mode 100644
index 0000000000..0b73222013
--- /dev/null
+++ b/core/commons/che-core-commons-observability/src/main/java/org/eclipse/che/commons/observability/NoopExecutorServiceWrapper.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright (c) 2012-2018 Red Hat, Inc.
+ * This program and the accompanying materials are made
+ * available under the terms of the Eclipse Public License 2.0
+ * which is available at https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * Red Hat, Inc. - initial API and implementation
+ */
+package org.eclipse.che.commons.observability;
+
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.ScheduledExecutorService;
+import javax.inject.Singleton;
+import org.eclipse.che.commons.schedule.executor.CronExecutorService;
+
+/**
+ * Implementation of {@link ExecutorServiceWrapper} that adds nothing. All wrap methods return the
+ * same instance as result.
+ *
+ * @author Sergii Kabashniuk
+ */
+@Singleton
+public class NoopExecutorServiceWrapper implements ExecutorServiceWrapper {
+
+ @Override
+ public ExecutorService wrap(ExecutorService executor, String name, String... tags) {
+ return executor;
+ }
+
+ @Override
+ public ScheduledExecutorService wrap(
+ ScheduledExecutorService executor, String name, String... tags) {
+ return executor;
+ }
+
+ @Override
+ public CronExecutorService wrap(CronExecutorService executor, String name, String... tags) {
+ return executor;
+ }
+}
diff --git a/core/commons/che-core-commons-observability/src/main/java/org/eclipse/che/commons/observability/ObservableThreadPullLauncher.java b/core/commons/che-core-commons-observability/src/main/java/org/eclipse/che/commons/observability/ObservableThreadPullLauncher.java
new file mode 100644
index 0000000000..27c634c15c
--- /dev/null
+++ b/core/commons/che-core-commons-observability/src/main/java/org/eclipse/che/commons/observability/ObservableThreadPullLauncher.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright (c) 2012-2018 Red Hat, Inc.
+ * This program and the accompanying materials are made
+ * available under the terms of the Eclipse Public License 2.0
+ * which is available at https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * Red Hat, Inc. - initial API and implementation
+ */
+package org.eclipse.che.commons.observability;
+
+import com.google.common.util.concurrent.ThreadFactoryBuilder;
+import javax.inject.Inject;
+import javax.inject.Named;
+import javax.inject.Singleton;
+import org.eclipse.che.commons.lang.concurrent.LoggingUncaughtExceptionHandler;
+import org.eclipse.che.commons.schedule.executor.CronThreadPoolExecutor;
+import org.eclipse.che.commons.schedule.executor.ThreadPullLauncher;
+
+/** Monitored and traced implementation of {@code ThreadPullLauncher}. */
+@Singleton
+public class ObservableThreadPullLauncher extends ThreadPullLauncher {
+
+ @Inject
+ public ObservableThreadPullLauncher(
+ ExecutorServiceWrapper wrapper, @Named("schedule.core_pool_size") Integer corePoolSize) {
+ super(
+ wrapper.wrap(
+ new CronThreadPoolExecutor(
+ corePoolSize,
+ new ThreadFactoryBuilder()
+ .setNameFormat("Annotated-scheduler-%d")
+ .setUncaughtExceptionHandler(LoggingUncaughtExceptionHandler.getInstance())
+ .setDaemon(false)
+ .build()),
+ CronThreadPoolExecutor.class.getName()));
+ }
+}
diff --git a/core/commons/che-core-commons-observability/src/main/java/org/eclipse/che/commons/observability/TracedCronExecutorService.java b/core/commons/che-core-commons-observability/src/main/java/org/eclipse/che/commons/observability/TracedCronExecutorService.java
new file mode 100644
index 0000000000..5a48554be6
--- /dev/null
+++ b/core/commons/che-core-commons-observability/src/main/java/org/eclipse/che/commons/observability/TracedCronExecutorService.java
@@ -0,0 +1,42 @@
+/*
+ * Copyright (c) 2012-2018 Red Hat, Inc.
+ * This program and the accompanying materials are made
+ * available under the terms of the Eclipse Public License 2.0
+ * which is available at https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * Red Hat, Inc. - initial API and implementation
+ */
+package org.eclipse.che.commons.observability;
+
+import io.opentracing.Tracer;
+import io.opentracing.contrib.concurrent.TracedRunnable;
+import io.opentracing.contrib.concurrent.TracedScheduledExecutorService;
+import java.util.concurrent.Future;
+import javax.inject.Inject;
+import org.eclipse.che.commons.schedule.executor.CronExecutorService;
+import org.eclipse.che.commons.schedule.executor.CronExpression;
+
+/**
+ * Executor which propagates span from parent thread to submitted. Optionally it creates parent span
+ * if traceWithActiveSpanOnly = false.
+ */
+public class TracedCronExecutorService extends TracedScheduledExecutorService
+ implements CronExecutorService {
+
+ private final CronExecutorService delegate;
+
+ @Inject
+ public TracedCronExecutorService(CronExecutorService delegate, Tracer tracer) {
+ super(delegate, tracer);
+ this.delegate = delegate;
+ }
+
+ @Override
+ public Future> schedule(Runnable task, CronExpression expression) {
+ return delegate.schedule(
+ tracer.activeSpan() == null ? task : new TracedRunnable(task, tracer), expression);
+ }
+}
diff --git a/core/commons/che-core-commons-observability/src/main/java/org/eclipse/che/commons/observability/TracedExecutorServiceWrapper.java b/core/commons/che-core-commons-observability/src/main/java/org/eclipse/che/commons/observability/TracedExecutorServiceWrapper.java
new file mode 100644
index 0000000000..94e769210f
--- /dev/null
+++ b/core/commons/che-core-commons-observability/src/main/java/org/eclipse/che/commons/observability/TracedExecutorServiceWrapper.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright (c) 2012-2018 Red Hat, Inc.
+ * This program and the accompanying materials are made
+ * available under the terms of the Eclipse Public License 2.0
+ * which is available at https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * Red Hat, Inc. - initial API and implementation
+ */
+package org.eclipse.che.commons.observability;
+
+import io.opentracing.Tracer;
+import io.opentracing.contrib.concurrent.TracedExecutorService;
+import io.opentracing.contrib.concurrent.TracedScheduledExecutorService;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.ScheduledExecutorService;
+import javax.inject.Inject;
+import javax.inject.Singleton;
+import org.eclipse.che.commons.schedule.executor.CronExecutorService;
+
+/**
+ * Implementation of {@code ExecutorServiceWrapper} that add all sort of tracing capabilities with
+ * help of traced implementation.
+ */
+@Singleton
+public class TracedExecutorServiceWrapper implements ExecutorServiceWrapper {
+
+ private final Tracer tracer;
+
+ @Inject
+ public TracedExecutorServiceWrapper(Tracer tracer) {
+ this.tracer = tracer;
+ }
+
+ @Override
+ public ExecutorService wrap(ExecutorService executor, String name, String... tags) {
+ return new TracedExecutorService(executor, tracer);
+ }
+
+ @Override
+ public ScheduledExecutorService wrap(
+ ScheduledExecutorService executor, String name, String... tags) {
+ return new TracedScheduledExecutorService(executor, tracer);
+ }
+
+ @Override
+ public CronExecutorService wrap(CronExecutorService executor, String name, String... tags) {
+ return new TracedCronExecutorService(executor, tracer);
+ }
+}
diff --git a/core/commons/che-core-commons-observability/src/main/java/org/eclipse/che/commons/observability/deploy/ExecutorWrapperModule.java b/core/commons/che-core-commons-observability/src/main/java/org/eclipse/che/commons/observability/deploy/ExecutorWrapperModule.java
new file mode 100644
index 0000000000..f85de327a7
--- /dev/null
+++ b/core/commons/che-core-commons-observability/src/main/java/org/eclipse/che/commons/observability/deploy/ExecutorWrapperModule.java
@@ -0,0 +1,45 @@
+/*
+ * Copyright (c) 2012-2018 Red Hat, Inc.
+ * This program and the accompanying materials are made
+ * available under the terms of the Eclipse Public License 2.0
+ * which is available at https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * Red Hat, Inc. - initial API and implementation
+ */
+package org.eclipse.che.commons.observability.deploy;
+
+import com.google.inject.AbstractModule;
+import org.eclipse.che.commons.observability.*;
+import org.eclipse.che.commons.schedule.executor.ThreadPullLauncher;
+
+public class ExecutorWrapperModule extends AbstractModule {
+
+ @Override
+ protected void configure() {
+
+ if (Boolean.parseBoolean(System.getenv("CHE_METRICS_ENABLED"))) {
+ if (Boolean.parseBoolean(System.getenv("CHE_TRACING_ENABLED"))) {
+ bind(ExecutorServiceWrapper.class)
+ .to(MeteredAndTracedExecutorServiceWrapper.class)
+ .asEagerSingleton();
+ } else {
+ bind(ExecutorServiceWrapper.class)
+ .to(MeteredExecutorServiceWrapper.class)
+ .asEagerSingleton();
+ }
+ } else {
+ if (Boolean.parseBoolean(System.getenv("CHE_TRACING_ENABLED"))) {
+ bind(ExecutorServiceWrapper.class)
+ .to(TracedExecutorServiceWrapper.class)
+ .asEagerSingleton();
+ } else {
+ bind(ExecutorServiceWrapper.class).to(NoopExecutorServiceWrapper.class).asEagerSingleton();
+ }
+ }
+
+ bind(ThreadPullLauncher.class).to(ObservableThreadPullLauncher.class);
+ }
+}
diff --git a/core/commons/che-core-commons-observability/src/test/java/io/micrometer/core/instrument/internal/TimedCronExecutorServiceTest.java b/core/commons/che-core-commons-observability/src/test/java/io/micrometer/core/instrument/internal/TimedCronExecutorServiceTest.java
new file mode 100644
index 0000000000..5c09c0338a
--- /dev/null
+++ b/core/commons/che-core-commons-observability/src/test/java/io/micrometer/core/instrument/internal/TimedCronExecutorServiceTest.java
@@ -0,0 +1,76 @@
+/*
+ * Copyright (c) 2012-2018 Red Hat, Inc.
+ * This program and the accompanying materials are made
+ * available under the terms of the Eclipse Public License 2.0
+ * which is available at https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * Red Hat, Inc. - initial API and implementation
+ */
+package io.micrometer.core.instrument.internal;
+
+import static org.testng.Assert.assertEquals;
+
+import io.micrometer.core.instrument.MockClock;
+import io.micrometer.core.instrument.Tag;
+import io.micrometer.core.instrument.Tags;
+import io.micrometer.core.instrument.simple.SimpleConfig;
+import io.micrometer.core.instrument.simple.SimpleMeterRegistry;
+import java.text.ParseException;
+import java.util.concurrent.CountDownLatch;
+import org.eclipse.che.commons.schedule.executor.CronExpression;
+import org.eclipse.che.commons.schedule.executor.CronThreadPoolExecutor;
+import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.Test;
+
+public class TimedCronExecutorServiceTest {
+
+ private SimpleMeterRegistry registry;
+
+ private Iterable userTags = Tags.of("userTagKey", "userTagValue");
+
+ @BeforeMethod
+ public void setup() {
+ registry = new SimpleMeterRegistry(SimpleConfig.DEFAULT, new MockClock());
+ }
+
+ @Test
+ public void executor() throws InterruptedException, ParseException {
+ // given
+ TimedCronExecutorService executorService =
+ new TimedCronExecutorService(
+ registry,
+ new CronThreadPoolExecutor(1),
+ TimedCronExecutorServiceTest.class.getName(),
+ userTags);
+ CountDownLatch lock = new CountDownLatch(1);
+ // when
+ executorService.schedule(
+ () -> {
+ lock.countDown();
+ },
+ // one time per second
+ new CronExpression(" * * * ? * * *"));
+
+ lock.await();
+ // then
+ assertEquals(
+ registry
+ .get("executor.scheduled.cron")
+ .tags(userTags)
+ .tag("name", TimedCronExecutorServiceTest.class.getName())
+ .counter()
+ .count(),
+ 1.0);
+ assertEquals(
+ registry
+ .get("executor")
+ .tags(userTags)
+ .tag("name", TimedCronExecutorServiceTest.class.getName())
+ .timer()
+ .count(),
+ 1L);
+ }
+}
diff --git a/core/commons/che-core-commons-observability/src/test/java/org/eclipse/che/commons/observability/CountedRejectedExecutionHandlerTest.java b/core/commons/che-core-commons-observability/src/test/java/org/eclipse/che/commons/observability/CountedRejectedExecutionHandlerTest.java
new file mode 100644
index 0000000000..0120a1262b
--- /dev/null
+++ b/core/commons/che-core-commons-observability/src/test/java/org/eclipse/che/commons/observability/CountedRejectedExecutionHandlerTest.java
@@ -0,0 +1,78 @@
+/*
+ * Copyright (c) 2012-2018 Red Hat, Inc.
+ * This program and the accompanying materials are made
+ * available under the terms of the Eclipse Public License 2.0
+ * which is available at https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * Red Hat, Inc. - initial API and implementation
+ */
+package org.eclipse.che.commons.observability;
+
+import static org.testng.Assert.assertEquals;
+
+import io.micrometer.core.instrument.MockClock;
+import io.micrometer.core.instrument.Tag;
+import io.micrometer.core.instrument.Tags;
+import io.micrometer.core.instrument.simple.SimpleConfig;
+import io.micrometer.core.instrument.simple.SimpleMeterRegistry;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.SynchronousQueue;
+import java.util.concurrent.ThreadPoolExecutor;
+import java.util.concurrent.TimeUnit;
+import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.Test;
+
+public class CountedRejectedExecutionHandlerTest {
+
+ private SimpleMeterRegistry registry;
+ private Iterable userTags = Tags.of("userTagKey", "userTagValue");
+
+ @BeforeMethod
+ public void setup() {
+ registry = new SimpleMeterRegistry(SimpleConfig.DEFAULT, new MockClock());
+ }
+
+ @Test
+ public void countRejections() {
+ // given
+ ThreadPoolExecutor executor =
+ new ThreadPoolExecutor(0, 1, 60L, TimeUnit.SECONDS, new SynchronousQueue<>());
+ executor.setRejectedExecutionHandler((r, executor1) -> {});
+
+ CountedRejectedExecutionHandler.monitorRejections(
+ registry, executor, CountedRejectedExecutionHandler.class.getName(), userTags);
+ CountDownLatch runnableTaskComplete = new CountDownLatch(1);
+ Runnable stub =
+ () -> {
+ try {
+ runnableTaskComplete.await(10, TimeUnit.SECONDS);
+ } catch (InterruptedException e) {
+ throw new IllegalStateException("runnable interrupted before completion");
+ }
+ };
+ executor.submit(stub);
+
+ // then
+ for (int i = 0; i < 14; i++) {
+ executor.submit(
+ () -> {
+ // do nothing. Task has to be rejected.
+ });
+ }
+ // when
+ assertEquals(
+ registry
+ .get("executor.rejected")
+ .tags(userTags)
+ .tag("name", CountedRejectedExecutionHandler.class.getName())
+ .counter()
+ .count(),
+ 14.0);
+ // cleanup
+ runnableTaskComplete.countDown();
+ executor.shutdownNow();
+ }
+}
diff --git a/core/commons/che-core-commons-observability/src/test/java/org/eclipse/che/commons/observability/CountedThreadFactoryTest.java b/core/commons/che-core-commons-observability/src/test/java/org/eclipse/che/commons/observability/CountedThreadFactoryTest.java
new file mode 100644
index 0000000000..20f8c8aa39
--- /dev/null
+++ b/core/commons/che-core-commons-observability/src/test/java/org/eclipse/che/commons/observability/CountedThreadFactoryTest.java
@@ -0,0 +1,224 @@
+/*
+ * Copyright (c) 2012-2018 Red Hat, Inc.
+ * This program and the accompanying materials are made
+ * available under the terms of the Eclipse Public License 2.0
+ * which is available at https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * Red Hat, Inc. - initial API and implementation
+ */
+package org.eclipse.che.commons.observability;
+
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertFalse;
+import static org.testng.Assert.assertNotNull;
+
+import io.micrometer.core.instrument.MockClock;
+import io.micrometer.core.instrument.Tag;
+import io.micrometer.core.instrument.Tags;
+import io.micrometer.core.instrument.simple.SimpleConfig;
+import io.micrometer.core.instrument.simple.SimpleMeterRegistry;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
+import java.util.concurrent.ThreadFactory;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
+import org.testng.Assert;
+import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.Test;
+
+public class CountedThreadFactoryTest {
+
+ private SimpleMeterRegistry registry;
+ private Iterable userTags = Tags.of("userTagKey", "userTagValue");
+
+ @BeforeMethod
+ public void setup() {
+ registry = new SimpleMeterRegistry(SimpleConfig.DEFAULT, new MockClock());
+ }
+
+ @Test
+ public void shouldCountCreatedThreads() {
+ // given
+ ThreadFactory factory =
+ new CountedThreadFactory(
+ Executors.defaultThreadFactory(),
+ registry,
+ CountedThreadFactoryTest.class.getName(),
+ userTags);
+ // when
+ factory.newThread(() -> {});
+
+ // then
+ assertEquals(
+ registry
+ .get("thread.factory.created")
+ .tags(userTags)
+ .tag("name", CountedThreadFactoryTest.class.getName())
+ .counter()
+ .count(),
+ 1.0);
+ }
+
+ @Test
+ public void shouldCountRunningThreads() throws InterruptedException {
+ // given
+ ThreadFactory factory =
+ new CountedThreadFactory(
+ Executors.defaultThreadFactory(),
+ registry,
+ CountedThreadFactoryTest.class.getName(),
+ userTags);
+
+ CountDownLatch runnableTaskStart = new CountDownLatch(1);
+ CountDownLatch runnableTaskComplete = new CountDownLatch(1);
+ Runnable task =
+ () -> {
+ runnableTaskStart.countDown();
+ try {
+ Assert.assertTrue(runnableTaskComplete.await(10, TimeUnit.SECONDS));
+ } catch (InterruptedException e) {
+ throw new IllegalStateException("runnable interrupted before completion");
+ }
+ };
+
+ // when
+ Thread thread = factory.newThread(task);
+ thread.start();
+
+ // then
+ runnableTaskStart.await();
+ assertEquals(
+ registry
+ .get("thread.factory.running")
+ .tags(userTags)
+ .tag("name", CountedThreadFactoryTest.class.getName())
+ .gauge()
+ .value(),
+ 1.0);
+
+ runnableTaskComplete.countDown();
+ thread.join();
+ assertEquals(
+ registry
+ .get("thread.factory.running")
+ .tags(userTags)
+ .tag("name", CountedThreadFactoryTest.class.getName())
+ .gauge()
+ .value(),
+ 0.0);
+
+ // put here to ensure that thread are not GCd
+ assertFalse(thread.isAlive());
+ // put here to ensure that factory are not GCd
+ assertNotNull(factory);
+ }
+
+ @Test
+ public void shouldCountRunningAndTerminatedThreadsInExecutorPool()
+ throws InterruptedException, TimeoutException, ExecutionException {
+ // given
+ JoinableThreadFactory factory =
+ new JoinableThreadFactory(
+ new CountedThreadFactory(
+ Executors.defaultThreadFactory(),
+ registry,
+ CountedThreadFactoryTest.class.getName(),
+ userTags));
+ ExecutorService executor = Executors.newCachedThreadPool(factory);
+
+ CountDownLatch runnableTaskStart = new CountDownLatch(10);
+ CountDownLatch runnableTaskComplete = new CountDownLatch(1);
+
+ Runnable task =
+ () -> {
+ runnableTaskStart.countDown();
+ try {
+ Assert.assertTrue(runnableTaskComplete.await(10, TimeUnit.SECONDS));
+ } catch (InterruptedException e) {
+ throw new IllegalStateException("runnable interrupted before completion");
+ }
+ };
+ List futures = new ArrayList<>(10);
+ for (int i = 0; i < 10; i++) {
+ futures.add(executor.submit(task));
+ }
+ runnableTaskStart.await();
+ assertEquals(
+ registry
+ .get("thread.factory.running")
+ .tags(userTags)
+ .tag("name", CountedThreadFactoryTest.class.getName())
+ .gauge()
+ .value(),
+ 10.0);
+ assertEquals(
+ registry
+ .get("thread.factory.terminated")
+ .tags(userTags)
+ .tag("name", CountedThreadFactoryTest.class.getName())
+ .counter()
+ .count(),
+ 0.0);
+
+ runnableTaskComplete.countDown();
+
+ for (Future future : futures) {
+ future.get(1, TimeUnit.MINUTES);
+ }
+ executor.shutdownNow();
+ Assert.assertTrue(executor.awaitTermination(10, TimeUnit.SECONDS));
+ factory.joinAll();
+ assertEquals(
+ registry
+ .get("thread.factory.running")
+ .tags(userTags)
+ .tag("name", CountedThreadFactoryTest.class.getName())
+ .gauge()
+ .value(),
+ 0.0);
+ assertEquals(
+ registry
+ .get("thread.factory.terminated")
+ .tags(userTags)
+ .tag("name", CountedThreadFactoryTest.class.getName())
+ .counter()
+ .count(),
+ 10.0);
+ // put here to ensure that factory are not GCd
+ assertNotNull(factory);
+ }
+
+ public static class JoinableThreadFactory implements ThreadFactory {
+
+ private final ThreadFactory delegate;
+ private final List threads;
+
+ public JoinableThreadFactory(ThreadFactory delegate) {
+ this.delegate = delegate;
+ this.threads = new ArrayList<>();
+ }
+
+ @Override
+ public Thread newThread(Runnable r) {
+ Thread result = delegate.newThread(r);
+ threads.add(result);
+ return result;
+ }
+
+ public void joinAll() throws InterruptedException {
+ for (Thread thread : threads) {
+ if (thread.isAlive()) {
+ thread.join();
+ }
+ }
+ }
+ }
+}
diff --git a/core/commons/che-core-commons-observability/src/test/java/org/eclipse/che/commons/observability/MeteredExecutorServiceWrapperTest.java b/core/commons/che-core-commons-observability/src/test/java/org/eclipse/che/commons/observability/MeteredExecutorServiceWrapperTest.java
new file mode 100644
index 0000000000..57bdaf2421
--- /dev/null
+++ b/core/commons/che-core-commons-observability/src/test/java/org/eclipse/che/commons/observability/MeteredExecutorServiceWrapperTest.java
@@ -0,0 +1,459 @@
+/*
+ * Copyright (c) 2012-2018 Red Hat, Inc.
+ * This program and the accompanying materials are made
+ * available under the terms of the Eclipse Public License 2.0
+ * which is available at https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * Red Hat, Inc. - initial API and implementation
+ */
+package org.eclipse.che.commons.observability;
+
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertTrue;
+
+import io.micrometer.core.instrument.MeterRegistry;
+import io.micrometer.core.instrument.MockClock;
+import io.micrometer.core.instrument.Tag;
+import io.micrometer.core.instrument.Tags;
+import io.micrometer.core.instrument.simple.SimpleConfig;
+import io.micrometer.core.instrument.simple.SimpleMeterRegistry;
+import java.text.ParseException;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
+import java.util.function.Supplier;
+import org.eclipse.che.commons.schedule.executor.CronExecutorService;
+import org.eclipse.che.commons.schedule.executor.CronExpression;
+import org.eclipse.che.commons.schedule.executor.CronThreadPoolExecutor;
+import org.testng.Assert;
+import org.testng.annotations.AfterMethod;
+import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.Test;
+
+public class MeteredExecutorServiceWrapperTest {
+
+ private MeterRegistry registry;
+
+ private ExecutorServiceWrapper executorServiceWrapper;
+ private Iterable userTags = Tags.of("userTagKey", "userTagValue");
+
+ private ExecutorService executor;
+
+ @BeforeMethod
+ public void setup() {
+ registry = new SimpleMeterRegistry(SimpleConfig.DEFAULT, new MockClock());
+ executorServiceWrapper = new MeteredExecutorServiceWrapper(registry);
+ }
+
+ @AfterMethod
+ public void cleanup() {
+ if (executor == null) return;
+ // Tell threads to finish off.
+ executor.shutdown(); // Disable new tasks from being submitted
+ try {
+ // Wait a while for existing tasks to terminate
+ if (!executor.awaitTermination(60, TimeUnit.SECONDS)) {
+ executor.shutdownNow(); // Cancel currently executing tasks
+ // Wait a while for tasks to respond to being cancelled
+ if (!executor.awaitTermination(60, TimeUnit.SECONDS))
+ System.out.println("Pool did not terminate");
+ }
+ } catch (InterruptedException ie) {
+ // (Re-)Cancel if current thread also interrupted
+ executor.shutdownNow();
+ // Preserve interrupt status
+ Thread.currentThread().interrupt();
+ }
+ }
+
+ @Test
+ public void shouldRecordExecutorServiceMetrics()
+ throws InterruptedException, TimeoutException, ExecutionException {
+ // given
+ executor =
+ executorServiceWrapper.wrap(
+ Executors.newSingleThreadExecutor(),
+ MeteredExecutorServiceWrapperTest.class.getName(),
+ "userTagKey",
+ "userTagValue");
+ CountDownLatch runnableTaskStart = new CountDownLatch(1);
+ // when
+ Future> future =
+ executor.submit(
+ () -> {
+ runnableTaskStart.countDown();
+ });
+ // then
+ runnableTaskStart.await(10, TimeUnit.SECONDS);
+ future.get(1, TimeUnit.MINUTES);
+
+ assertEquals(
+ registry
+ .get("thread.factory.terminated")
+ .tag("name", MeteredExecutorServiceWrapperTest.class.getName())
+ .counter()
+ .count(),
+ 0.0);
+ assertEquals(
+ registry
+ .get("thread.factory.running")
+ .tag("name", MeteredExecutorServiceWrapperTest.class.getName())
+ .gauge()
+ .value(),
+ 1.0);
+ assertEquals(
+ registry
+ .get("thread.factory.created")
+ .tag("name", MeteredExecutorServiceWrapperTest.class.getName())
+ .counter()
+ .count(),
+ 1.0);
+ assertEquals(
+ registry
+ .get("executor.rejected")
+ .tag("name", MeteredExecutorServiceWrapperTest.class.getName())
+ .counter()
+ .count(),
+ 0.0);
+
+ assertEquals(
+ registry
+ .get("executor.pool.size")
+ .tag("name", MeteredExecutorServiceWrapperTest.class.getName())
+ .tags(userTags)
+ .gauge()
+ .value(),
+ 1.0);
+ assertEquals(
+ registry
+ .get("executor.completed")
+ .tag("name", MeteredExecutorServiceWrapperTest.class.getName())
+ .tags(userTags)
+ .functionCounter()
+ .count(),
+ 1.0);
+ assertEquals(
+ registry
+ .get("executor.queued")
+ .tag("name", MeteredExecutorServiceWrapperTest.class.getName())
+ .tags(userTags)
+ .gauge()
+ .value(),
+ 0.0);
+ assertEquals(
+ registry
+ .get("executor.idle")
+ .tag("name", MeteredExecutorServiceWrapperTest.class.getName())
+ .tags(userTags)
+ .timer()
+ .count(),
+ 1);
+ assertEquals(
+ registry
+ .get("executor.queue.remaining")
+ .tag("name", MeteredExecutorServiceWrapperTest.class.getName())
+ .tags(userTags)
+ .gauge()
+ .value(),
+ new Double(Integer.MAX_VALUE));
+ assertEquals(
+ registry
+ .get("executor")
+ .tag("name", MeteredExecutorServiceWrapperTest.class.getName())
+ .tags(userTags)
+ .timer()
+ .count(),
+ 1);
+ assertEquals(
+ registry
+ .get("executor.active")
+ .tag("name", MeteredExecutorServiceWrapperTest.class.getName())
+ .tags(userTags)
+ .gauge()
+ .value(),
+ 0.0);
+ }
+
+ @Test
+ public void shouldRecordScheduledExecutorServiceMetrics() throws InterruptedException {
+ // given
+ executor =
+ executorServiceWrapper.wrap(
+ Executors.newSingleThreadScheduledExecutor(),
+ MeteredExecutorServiceWrapperTest.class.getName(),
+ "userTagKey",
+ "userTagValue");
+ CountDownLatch runnableTaskStart = new CountDownLatch(1);
+ // when
+ ((ScheduledExecutorService) executor)
+ .scheduleAtFixedRate(
+ () -> {
+ runnableTaskStart.countDown();
+ },
+ 0,
+ 100,
+ TimeUnit.SECONDS);
+ // then
+
+ runnableTaskStart.await(10, TimeUnit.SECONDS);
+
+ assertEquals(
+ registry
+ .get("thread.factory.terminated")
+ .tag("name", MeteredExecutorServiceWrapperTest.class.getName())
+ .counter()
+ .count(),
+ 0.0);
+ assertEquals(
+ registry
+ .get("thread.factory.running")
+ .tag("name", MeteredExecutorServiceWrapperTest.class.getName())
+ .gauge()
+ .value(),
+ 1.0);
+ assertEquals(
+ registry
+ .get("thread.factory.created")
+ .tag("name", MeteredExecutorServiceWrapperTest.class.getName())
+ .counter()
+ .count(),
+ 1.0);
+ assertEquals(
+ registry
+ .get("executor.rejected")
+ .tag("name", MeteredExecutorServiceWrapperTest.class.getName())
+ .counter()
+ .count(),
+ 0.0);
+
+ assertEquals(
+ registry
+ .get("executor.pool.size")
+ .tag("name", MeteredExecutorServiceWrapperTest.class.getName())
+ .tags(userTags)
+ .gauge()
+ .value(),
+ 1.0);
+ assertWithRetry(
+ () ->
+ registry
+ .get("executor.completed")
+ .tag("name", MeteredExecutorServiceWrapperTest.class.getName())
+ .tags(userTags)
+ .functionCounter()
+ .count(),
+ 1.0,
+ 10,
+ 50);
+
+ assertEquals(
+ registry
+ .get("executor.queued")
+ .tag("name", MeteredExecutorServiceWrapperTest.class.getName())
+ .tags(userTags)
+ .gauge()
+ .value(),
+ 1.0);
+ assertEquals(
+ registry
+ .get("executor.idle")
+ .tag("name", MeteredExecutorServiceWrapperTest.class.getName())
+ .tags(userTags)
+ .timer()
+ .count(),
+ 0);
+ assertEquals(
+ registry
+ .get("executor.queue.remaining")
+ .tag("name", MeteredExecutorServiceWrapperTest.class.getName())
+ .tags(userTags)
+ .gauge()
+ .value(),
+ new Double(Integer.MAX_VALUE));
+ assertEquals(
+ registry
+ .get("executor")
+ .tag("name", MeteredExecutorServiceWrapperTest.class.getName())
+ .tags(userTags)
+ .timer()
+ .count(),
+ 1);
+ assertEquals(
+ registry
+ .get("executor.active")
+ .tag("name", MeteredExecutorServiceWrapperTest.class.getName())
+ .tags(userTags)
+ .gauge()
+ .value(),
+ 0.0);
+ assertEquals(
+ registry
+ .get("executor.scheduled.once")
+ .tag("name", MeteredExecutorServiceWrapperTest.class.getName())
+ .tags(userTags)
+ .counter()
+ .count(),
+ 0.0);
+ assertEquals(
+ registry
+ .get("executor.scheduled.repetitively")
+ .tag("name", MeteredExecutorServiceWrapperTest.class.getName())
+ .tags(userTags)
+ .counter()
+ .count(),
+ 1.0);
+ }
+
+ @Test
+ public void shouldRecordCronExecutorServiceMetrics() throws InterruptedException, ParseException {
+ // given
+ CronExecutorService executor =
+ executorServiceWrapper.wrap(
+ new CronThreadPoolExecutor(1),
+ MeteredExecutorServiceWrapperTest.class.getName(),
+ "userTagKey",
+ "userTagValue");
+ CountDownLatch runnableTaskStart = new CountDownLatch(1);
+ // when
+ executor.schedule(
+ () -> {
+ runnableTaskStart.countDown();
+ },
+ new CronExpression(" * * * ? * * *"));
+ // then
+ runnableTaskStart.await(10, TimeUnit.SECONDS);
+ assertEquals(
+ registry
+ .get("thread.factory.terminated")
+ .tag("name", MeteredExecutorServiceWrapperTest.class.getName())
+ .counter()
+ .count(),
+ 0.0);
+ assertEquals(
+ registry
+ .get("thread.factory.running")
+ .tag("name", MeteredExecutorServiceWrapperTest.class.getName())
+ .gauge()
+ .value(),
+ 2.0);
+ assertEquals(
+ registry
+ .get("thread.factory.created")
+ .tag("name", MeteredExecutorServiceWrapperTest.class.getName())
+ .counter()
+ .count(),
+ 2.0);
+ assertEquals(
+ registry
+ .get("executor.rejected")
+ .tag("name", MeteredExecutorServiceWrapperTest.class.getName())
+ .counter()
+ .count(),
+ 0.0);
+
+ assertEquals(
+ registry
+ .get("executor.pool.size")
+ .tag("name", MeteredExecutorServiceWrapperTest.class.getName())
+ .tags(userTags)
+ .gauge()
+ .value(),
+ 2.0);
+ assertEquals(
+ registry
+ .get("executor.completed")
+ .tag("name", MeteredExecutorServiceWrapperTest.class.getName())
+ .tags(userTags)
+ .functionCounter()
+ .count(),
+ 1.0);
+ assertWithRetry(
+ () ->
+ registry
+ .get("executor.queued")
+ .tag("name", MeteredExecutorServiceWrapperTest.class.getName())
+ .tags(userTags)
+ .gauge()
+ .value(),
+ 1.0,
+ 10,
+ 50);
+ assertEquals(
+ registry
+ .get("executor.idle")
+ .tag("name", MeteredExecutorServiceWrapperTest.class.getName())
+ .tags(userTags)
+ .timer()
+ .count(),
+ 0);
+ assertTrue(
+ registry
+ .get("executor.queue.remaining")
+ .tag("name", MeteredExecutorServiceWrapperTest.class.getName())
+ .tags(userTags)
+ .gauge()
+ .value()
+ > 0.0);
+ assertEquals(
+ registry
+ .get("executor")
+ .tag("name", MeteredExecutorServiceWrapperTest.class.getName())
+ .tags(userTags)
+ .timer()
+ .count(),
+ 1);
+ assertEquals(
+ registry
+ .get("executor.active")
+ .tag("name", MeteredExecutorServiceWrapperTest.class.getName())
+ .tags(userTags)
+ .gauge()
+ .value(),
+ 1.0);
+ assertEquals(
+ registry
+ .get("executor.scheduled.once")
+ .tag("name", MeteredExecutorServiceWrapperTest.class.getName())
+ .tags(userTags)
+ .counter()
+ .count(),
+ 0.0);
+ assertEquals(
+ registry
+ .get("executor.scheduled.repetitively")
+ .tag("name", MeteredExecutorServiceWrapperTest.class.getName())
+ .tags(userTags)
+ .counter()
+ .count(),
+ 0.0);
+ assertEquals(
+ registry
+ .get("executor.scheduled.cron")
+ .tag("name", MeteredExecutorServiceWrapperTest.class.getName())
+ .tags(userTags)
+ .counter()
+ .count(),
+ 1.0);
+ }
+
+ public void assertWithRetry(Supplier predicate, V expected, int times, int pause_millis)
+ throws InterruptedException {
+ for (int i = 0; i <= times; i++) {
+ V actual = predicate.get();
+ if (expected.equals(actual)) {
+ return;
+ } else if (i + 1 <= times) {
+ Thread.sleep(pause_millis);
+ }
+ }
+ Assert.fail("Not able to get expected value " + expected + " with " + times + " retries");
+ }
+}
diff --git a/core/commons/che-core-commons-observability/src/test/java/org/eclipse/che/commons/observability/NoopExecutorServiceWrapperTest.java b/core/commons/che-core-commons-observability/src/test/java/org/eclipse/che/commons/observability/NoopExecutorServiceWrapperTest.java
new file mode 100644
index 0000000000..33a3db8434
--- /dev/null
+++ b/core/commons/che-core-commons-observability/src/test/java/org/eclipse/che/commons/observability/NoopExecutorServiceWrapperTest.java
@@ -0,0 +1,60 @@
+/*
+ * Copyright (c) 2012-2018 Red Hat, Inc.
+ * This program and the accompanying materials are made
+ * available under the terms of the Eclipse Public License 2.0
+ * which is available at https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * Red Hat, Inc. - initial API and implementation
+ */
+package org.eclipse.che.commons.observability;
+
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledExecutorService;
+import org.eclipse.che.commons.schedule.executor.CronExecutorService;
+import org.eclipse.che.commons.schedule.executor.CronThreadPoolExecutor;
+import org.testng.Assert;
+import org.testng.annotations.Test;
+
+public class NoopExecutorServiceWrapperTest {
+ NoopExecutorServiceWrapper noopExecutorServiceWrapper = new NoopExecutorServiceWrapper();
+
+ @Test
+ public void testWrapExecutorService() {
+ // given
+ ExecutorService executorService = Executors.newSingleThreadExecutor();
+ // when
+ ExecutorService result =
+ noopExecutorServiceWrapper.wrap(
+ executorService, NoopExecutorServiceWrapper.class.getName(), "key", "value");
+ // then
+ Assert.assertSame(result, executorService);
+ }
+
+ @Test
+ public void testWrapScheduledExecutorService() {
+ // given
+ ScheduledExecutorService executorService = Executors.newSingleThreadScheduledExecutor();
+ // when
+ ScheduledExecutorService result =
+ noopExecutorServiceWrapper.wrap(
+ executorService, NoopExecutorServiceWrapper.class.getName(), "key", "value");
+ // then
+ Assert.assertSame(result, executorService);
+ }
+
+ @Test
+ public void testWrapCronExecutorService() {
+ // given
+ CronExecutorService executorService = new CronThreadPoolExecutor(1);
+ // when
+ CronExecutorService result =
+ noopExecutorServiceWrapper.wrap(
+ executorService, NoopExecutorServiceWrapper.class.getName(), "key", "value");
+ // then
+ Assert.assertSame(result, executorService);
+ }
+}
diff --git a/core/commons/che-core-commons-observability/src/test/resources/logback-test.xml b/core/commons/che-core-commons-observability/src/test/resources/logback-test.xml
new file mode 100644
index 0000000000..e6abf05f02
--- /dev/null
+++ b/core/commons/che-core-commons-observability/src/test/resources/logback-test.xml
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+ %-41(%date[%.15thread]) %-45([%-5level] [%.30logger{30} %L]) - %msg%n
+
+
+
+
+
+
+
+
diff --git a/core/commons/che-core-commons-schedule/src/main/java/org/eclipse/che/commons/schedule/executor/ThreadPullLauncher.java b/core/commons/che-core-commons-schedule/src/main/java/org/eclipse/che/commons/schedule/executor/ThreadPullLauncher.java
index 8a96c9ec86..10e85f2ca8 100644
--- a/core/commons/che-core-commons-schedule/src/main/java/org/eclipse/che/commons/schedule/executor/ThreadPullLauncher.java
+++ b/core/commons/che-core-commons-schedule/src/main/java/org/eclipse/che/commons/schedule/executor/ThreadPullLauncher.java
@@ -33,7 +33,7 @@ import org.slf4j.LoggerFactory;
@Singleton
public class ThreadPullLauncher implements Launcher {
private static final Logger LOG = LoggerFactory.getLogger(CronThreadPoolExecutor.class);
- private final CronThreadPoolExecutor service;
+ private final CronExecutorService service;
/**
* @param corePoolSize the number of threads to keep in the pool, even if they are idle, unless
@@ -41,14 +41,18 @@ public class ThreadPullLauncher implements Launcher {
*/
@Inject
public ThreadPullLauncher(@Named("schedule.core_pool_size") Integer corePoolSize) {
- this.service =
+ this(
new CronThreadPoolExecutor(
corePoolSize,
new ThreadFactoryBuilder()
.setNameFormat("Annotated-scheduler-%d")
.setUncaughtExceptionHandler(LoggingUncaughtExceptionHandler.getInstance())
.setDaemon(false)
- .build());
+ .build()));
+ }
+
+ protected ThreadPullLauncher(CronExecutorService service) {
+ this.service = service;
}
@PreDestroy
diff --git a/core/commons/pom.xml b/core/commons/pom.xml
index 1d1983eeea..4a67a9807a 100644
--- a/core/commons/pom.xml
+++ b/core/commons/pom.xml
@@ -36,5 +36,6 @@
che-core-commons-j2ee
che-core-commons-mail
che-core-commons-tracing
+ che-core-commons-observability
diff --git a/deploy/openshift/templates/monitoring/grafana-dashboards.yaml b/deploy/openshift/templates/monitoring/grafana-dashboards.yaml
index 2c6d40e1e3..69a724b0eb 100644
--- a/deploy/openshift/templates/monitoring/grafana-dashboards.yaml
+++ b/deploy/openshift/templates/monitoring/grafana-dashboards.yaml
@@ -3626,11 +3626,12 @@ data:
"gnetId": null,
"graphTooltip": 1,
"id": 2,
- "iteration": 1569330248249,
+ "iteration": 1570978807775,
"links": [],
"panels": [
{
"collapsed": false,
+ "datasource": "$datasource",
"gridPos": {
"h": 1,
"w": 24,
@@ -3818,6 +3819,7 @@ data:
},
{
"collapsed": false,
+ "datasource": "$datasource",
"gridPos": {
"h": 1,
"w": 24,
@@ -4251,7 +4253,7 @@ data:
"steppedLine": false,
"targets": [
{
- "expr": "rate(che_workspace_start_time_seconds_sum[1h])/rate(che_workspace_start_time_seconds_count [1h])",
+ "expr": "increase(che_workspace_start_time_seconds_sum[1h])/increase(che_workspace_start_time_seconds_count [1h])",
"format": "time_series",
"hide": false,
"intervalFactor": 1,
@@ -4343,7 +4345,7 @@ data:
"steppedLine": false,
"targets": [
{
- "expr": "rate(che_workspace_stop_time_seconds_sum[1h])/rate(che_workspace_stop_time_seconds_count [1h])",
+ "expr": "increase(che_workspace_stop_time_seconds_sum[1h])/increase(che_workspace_stop_time_seconds_count [1h])",
"format": "time_series",
"hide": false,
"intervalFactor": 1,
@@ -4615,7 +4617,7 @@ data:
"steppedLine": false,
"targets": [
{
- "expr": "rate(che_workspace_start_time_seconds_bucket{le=\"62.992853672\",result=\"success\"}[1h]) / ignoring(le) rate(che_workspace_start_time_seconds_count{result=\"success\"}[1h])",
+ "expr": "increase(che_workspace_start_time_seconds_bucket{le=\"62.992853672\",result=\"success\"}[1h]) / ignoring(le) increase(che_workspace_start_time_seconds_count{result=\"success\"}[1h])",
"format": "time_series",
"intervalFactor": 1,
"legendFormat": "workspace start ratio",
@@ -4759,6 +4761,7 @@ data:
},
{
"collapsed": false,
+ "datasource": "$datasource",
"gridPos": {
"h": 1,
"w": 24,
@@ -4864,6 +4867,7 @@ data:
},
{
"collapsed": false,
+ "datasource": "$datasource",
"gridPos": {
"h": 1,
"w": 24,
@@ -4968,6 +4972,7 @@ data:
},
{
"collapsed": false,
+ "datasource": "$datasource",
"gridPos": {
"h": 1,
"w": 24,
@@ -5498,6 +5503,7 @@ data:
},
{
"collapsed": false,
+ "datasource": "$datasource",
"gridPos": {
"h": 1,
"w": 24,
@@ -5506,7 +5512,7 @@ data:
},
"id": 22,
"panels": [],
- "title": "JsonRPC",
+ "title": "Executors",
"type": "row"
},
{
@@ -5519,17 +5525,19 @@ data:
"fillGradient": 0,
"gridPos": {
"h": 7,
- "w": 8,
+ "w": 12,
"x": 0,
"y": 50
},
"id": 18,
+ "interval": "",
"legend": {
"alignAsTable": false,
- "avg": false,
+ "avg": true,
"current": true,
"max": true,
"min": false,
+ "rightSide": false,
"show": true,
"total": false,
"values": true
@@ -5548,47 +5556,23 @@ data:
"renderer": "flot",
"seriesOverrides": [],
"spaceLength": 10,
- "stack": false,
+ "stack": true,
"steppedLine": false,
"targets": [
{
- "expr": "executor_pool_size_threads{name=\"che.core.jsonrpc.major_executor\",}",
+ "expr": "thread_factory_running_threads",
"format": "time_series",
"hide": false,
"intervalFactor": 1,
- "legendFormat": "major size",
+ "legendFormat": "{{name}}",
"refId": "A"
- },
- {
- "expr": "executor_active_threads{name=\"che.core.jsonrpc.major_executor\",}",
- "format": "time_series",
- "hide": false,
- "intervalFactor": 1,
- "legendFormat": "major active",
- "refId": "B"
- },
- {
- "expr": "executor_pool_size_threads{name=\"che.core.jsonrpc.minor_executor\",}",
- "format": "time_series",
- "hide": false,
- "intervalFactor": 1,
- "legendFormat": "minor size",
- "refId": "C"
- },
- {
- "expr": "executor_active_threads{name=\"che.core.jsonrpc.minor_executor\",}",
- "format": "time_series",
- "hide": false,
- "intervalFactor": 1,
- "legendFormat": "minor active",
- "refId": "D"
}
],
"thresholds": [],
"timeFrom": null,
"timeRegions": [],
"timeShift": null,
- "title": "che.core.jsonrpc.executor_pool",
+ "title": "Thread running",
"tooltip": {
"shared": true,
"sort": 0,
@@ -5605,10 +5589,10 @@ data:
"yaxes": [
{
"format": "short",
- "label": null,
+ "label": "",
"logBase": 1,
"max": null,
- "min": null,
+ "min": "0",
"show": true
},
{
@@ -5617,7 +5601,7 @@ data:
"logBase": 1,
"max": null,
"min": null,
- "show": true
+ "show": false
}
],
"yaxis": {
@@ -5635,16 +5619,15 @@ data:
"fillGradient": 0,
"gridPos": {
"h": 7,
- "w": 8,
- "x": 8,
+ "w": 12,
+ "x": 12,
"y": 50
},
- "id": 26,
+ "id": 30,
"legend": {
- "alignAsTable": false,
"avg": false,
"current": true,
- "max": true,
+ "max": false,
"min": false,
"show": true,
"total": false,
@@ -5668,27 +5651,18 @@ data:
"steppedLine": false,
"targets": [
{
- "expr": "executor_queued_threads{name=\"che.core.jsonrpc.major_executor\",}",
+ "expr": "thread_factory_terminated_threads_total",
"format": "time_series",
- "instant": false,
"intervalFactor": 1,
- "legendFormat": "major",
+ "legendFormat": "{{name}}",
"refId": "A"
- },
- {
- "expr": "executor_queued_threads{name=\"che.core.jsonrpc.minor_executor\",}",
- "format": "time_series",
- "instant": false,
- "intervalFactor": 1,
- "legendFormat": "minor",
- "refId": "B"
}
],
"thresholds": [],
"timeFrom": null,
"timeRegions": [],
"timeShift": null,
- "title": "JsonRpcQueue",
+ "title": "Thread terminated",
"tooltip": {
"shared": true,
"sort": 0,
@@ -5716,8 +5690,8 @@ data:
"label": null,
"logBase": 1,
"max": null,
- "min": "0",
- "show": true
+ "min": null,
+ "show": false
}
],
"yaxis": {
@@ -5736,9 +5710,9 @@ data:
"fillGradient": 0,
"gridPos": {
"h": 7,
- "w": 8,
- "x": 16,
- "y": 50
+ "w": 12,
+ "x": 0,
+ "y": 57
},
"id": 32,
"legend": {
@@ -5747,7 +5721,7 @@ data:
"current": true,
"hideEmpty": false,
"hideZero": false,
- "max": true,
+ "max": false,
"min": false,
"show": true,
"total": false,
@@ -5771,27 +5745,19 @@ data:
"steppedLine": false,
"targets": [
{
- "expr": "sum(deriv(executor_rejected_tasks_total{name=\"che.core.jsonrpc.major_executor\",}[1m]))",
+ "expr": "thread_factory_created_threads_total",
"format": "time_series",
"interval": "",
"intervalFactor": 1,
- "legendFormat": "major",
+ "legendFormat": "{{name}}",
"refId": "A"
- },
- {
- "expr": "sum(deriv(executor_rejected_tasks_total{name=\"che.core.jsonrpc.minor_executor\",}[1m]))",
- "format": "time_series",
- "interval": "",
- "intervalFactor": 1,
- "legendFormat": "minor",
- "refId": "B"
}
],
"thresholds": [],
"timeFrom": null,
"timeRegions": [],
"timeShift": null,
- "title": "Rejected message/minute",
+ "title": "Thread created",
"tooltip": {
"shared": true,
"sort": 0,
@@ -5821,7 +5787,7 @@ data:
"logBase": 1,
"max": null,
"min": "0",
- "show": true
+ "show": false
}
],
"yaxis": {
@@ -5835,15 +5801,17 @@ data:
"dashLength": 10,
"dashes": false,
"datasource": "$datasource",
+ "description": "",
"fill": 1,
"fillGradient": 0,
"gridPos": {
"h": 7,
- "w": 8,
- "x": 0,
+ "w": 12,
+ "x": 12,
"y": 57
},
- "id": 30,
+ "id": 28,
+ "interval": "",
"legend": {
"avg": false,
"current": true,
@@ -5871,25 +5839,19 @@ data:
"steppedLine": false,
"targets": [
{
- "expr": "executor_seconds_max{name=\"che.core.jsonrpc.major_executor\",}",
+ "expr": "increase(thread_factory_created_threads_total[1m])",
"format": "time_series",
+ "interval": "",
"intervalFactor": 1,
- "legendFormat": "major",
+ "legendFormat": "{{name}}",
"refId": "A"
- },
- {
- "expr": "executor_seconds_max{name=\"che.core.jsonrpc.minor_executor\",}",
- "format": "time_series",
- "intervalFactor": 1,
- "legendFormat": "minor",
- "refId": "B"
}
],
"thresholds": [],
"timeFrom": null,
"timeRegions": [],
"timeShift": null,
- "title": "Seconds Max",
+ "title": "Created thread/minute",
"tooltip": {
"shared": true,
"sort": 0,
@@ -5909,7 +5871,7 @@ data:
"label": null,
"logBase": 1,
"max": null,
- "min": null,
+ "min": "0",
"show": true
},
{
@@ -5917,7 +5879,7 @@ data:
"label": null,
"logBase": 1,
"max": null,
- "min": null,
+ "min": "0",
"show": true
}
],
@@ -5936,9 +5898,103 @@ data:
"fillGradient": 0,
"gridPos": {
"h": 7,
- "w": 8,
- "x": 8,
- "y": 57
+ "w": 12,
+ "x": 0,
+ "y": 64
+ },
+ "id": 26,
+ "interval": "",
+ "legend": {
+ "alignAsTable": false,
+ "avg": false,
+ "current": true,
+ "max": true,
+ "min": false,
+ "show": true,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "nullPointMode": "null as zero",
+ "options": {
+ "dataLinks": []
+ },
+ "paceLength": 10,
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "executor_active_threads",
+ "format": "time_series",
+ "instant": false,
+ "intervalFactor": 1,
+ "legendFormat": "{{name}}",
+ "refId": "A"
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "Executor threads active",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": "0",
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": "0",
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "$datasource",
+ "description": "",
+ "fill": 1,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 7,
+ "w": 12,
+ "x": 12,
+ "y": 64
},
"id": 34,
"legend": {
@@ -5968,26 +6024,19 @@ data:
"steppedLine": false,
"targets": [
{
- "expr": "sum(deriv(executor_seconds_sum{name=\"che.core.jsonrpc.major_executor\",}[1m]))",
+ "expr": "executor_pool_size_threads",
"format": "time_series",
"interval": "",
"intervalFactor": 1,
- "legendFormat": "major",
+ "legendFormat": "{{name}}",
"refId": "A"
- },
- {
- "expr": "sum(deriv(executor_seconds_sum{name=\"che.core.jsonrpc.minor_executor\",}[1m]))",
- "format": "time_series",
- "intervalFactor": 1,
- "legendFormat": "minor",
- "refId": "B"
}
],
"thresholds": [],
"timeFrom": null,
"timeRegions": [],
"timeShift": null,
- "title": "Seconds Sum",
+ "title": "Executor pool size",
"tooltip": {
"shared": true,
"sort": 0,
@@ -6016,7 +6065,7 @@ data:
"logBase": 1,
"max": null,
"min": "0",
- "show": true
+ "show": false
}
],
"yaxis": {
@@ -6025,112 +6074,1226 @@ data:
}
},
{
- "aliasColors": {},
- "bars": false,
- "dashLength": 10,
- "dashes": false,
- "datasource": "$datasource",
- "description": "",
- "fill": 1,
- "fillGradient": 0,
- "gridPos": {
- "h": 7,
- "w": 8,
- "x": 16,
- "y": 57
- },
- "id": 28,
- "legend": {
- "avg": false,
- "current": true,
- "max": true,
- "min": false,
- "show": true,
- "total": false,
- "values": true
- },
- "lines": true,
- "linewidth": 1,
- "links": [],
- "nullPointMode": "null as zero",
- "options": {
- "dataLinks": []
- },
- "paceLength": 10,
- "percentage": false,
- "pointradius": 5,
- "points": false,
- "renderer": "flot",
- "seriesOverrides": [],
- "spaceLength": 10,
- "stack": false,
- "steppedLine": false,
- "targets": [
- {
- "expr": "sum(deriv(executor_completed_tasks_total{name=\"che.core.jsonrpc.major_executor\",}[1m]))",
- "format": "time_series",
- "interval": "",
- "intervalFactor": 1,
- "legendFormat": "major",
- "refId": "A"
- },
- {
- "expr": "sum(deriv(executor_completed_tasks_total{name=\"che.core.jsonrpc.minor_executor\",}[1m]))",
- "format": "time_series",
- "interval": "",
- "intervalFactor": 1,
- "legendFormat": "minor",
- "refId": "B"
- }
- ],
- "thresholds": [],
- "timeFrom": null,
- "timeRegions": [],
- "timeShift": null,
- "title": "Completed Task/minute",
- "tooltip": {
- "shared": true,
- "sort": 0,
- "value_type": "individual"
- },
- "type": "graph",
- "xaxis": {
- "buckets": null,
- "mode": "time",
- "name": null,
- "show": true,
- "values": []
- },
- "yaxes": [
- {
- "format": "short",
- "label": null,
- "logBase": 1,
- "max": null,
- "min": "0",
- "show": true
- },
- {
- "format": "short",
- "label": null,
- "logBase": 1,
- "max": null,
- "min": "0",
- "show": true
- }
- ],
- "yaxis": {
- "align": false,
- "alignLevel": null
- }
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "$datasource",
+ "description": "",
+ "fill": 1,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 7,
+ "w": 12,
+ "x": 0,
+ "y": 71
+ },
+ "id": 85,
+ "interval": "",
+ "legend": {
+ "alignAsTable": false,
+ "avg": false,
+ "current": true,
+ "max": true,
+ "min": false,
+ "show": true,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "nullPointMode": "null as zero",
+ "options": {
+ "dataLinks": []
+ },
+ "paceLength": 10,
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "executor_queued_tasks",
+ "format": "time_series",
+ "instant": false,
+ "intervalFactor": 1,
+ "legendFormat": "{{name}}",
+ "refId": "A"
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "Queued tasks",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": "0",
+ "show": true
},
{
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": "0",
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "$datasource",
+ "description": "",
+ "fill": 1,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 7,
+ "w": 12,
+ "x": 12,
+ "y": 71
+ },
+ "id": 84,
+ "interval": "",
+ "legend": {
+ "alignAsTable": false,
+ "avg": false,
+ "current": true,
+ "max": true,
+ "min": false,
+ "show": true,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "nullPointMode": "null as zero",
+ "options": {
+ "dataLinks": []
+ },
+ "paceLength": 10,
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "100*(1-executor_queue_remaining_tasks/ (executor_queue_remaining_tasks + executor_queued_tasks ))",
+ "format": "time_series",
+ "instant": false,
+ "intervalFactor": 1,
+ "legendFormat": "{{name}}",
+ "refId": "A"
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "Queue occupancy",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "percent",
+ "label": null,
+ "logBase": 1,
+ "max": 100,
+ "min": "0",
+ "show": true
+ },
+ {
+ "format": "percentunit",
+ "label": null,
+ "logBase": 1,
+ "max": 100,
+ "min": "0",
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "$datasource",
+ "fill": 1,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 7,
+ "w": 12,
+ "x": 0,
+ "y": 78
+ },
+ "id": 83,
+ "interval": "",
+ "legend": {
+ "alignAsTable": false,
+ "avg": false,
+ "current": true,
+ "max": true,
+ "min": false,
+ "show": true,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "nullPointMode": "null as zero",
+ "options": {
+ "dataLinks": []
+ },
+ "paceLength": 10,
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "executor_rejected_tasks_total",
+ "format": "time_series",
+ "instant": false,
+ "intervalFactor": 1,
+ "legendFormat": "{{name}}",
+ "refId": "A"
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "Rejected task",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": "0",
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": "0",
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "$datasource",
+ "fill": 1,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 7,
+ "w": 12,
+ "x": 12,
+ "y": 78
+ },
+ "id": 82,
+ "interval": "",
+ "legend": {
+ "alignAsTable": false,
+ "avg": false,
+ "current": true,
+ "max": true,
+ "min": false,
+ "show": true,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "nullPointMode": "null as zero",
+ "options": {
+ "dataLinks": []
+ },
+ "paceLength": 10,
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "increase(executor_rejected_tasks_total[1m])",
+ "format": "time_series",
+ "instant": false,
+ "intervalFactor": 1,
+ "legendFormat": "{{name}}",
+ "refId": "A"
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "Rejected task/minute",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": "0",
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": "0",
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "$datasource",
+ "description": "",
+ "fill": 1,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 7,
+ "w": 12,
+ "x": 0,
+ "y": 85
+ },
+ "id": 86,
+ "interval": "",
+ "legend": {
+ "alignAsTable": false,
+ "avg": false,
+ "current": true,
+ "max": true,
+ "min": false,
+ "show": true,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "nullPointMode": "null as zero",
+ "options": {
+ "dataLinks": []
+ },
+ "paceLength": 10,
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "executor_completed_tasks_total",
+ "format": "time_series",
+ "instant": false,
+ "intervalFactor": 1,
+ "legendFormat": "{{name}}",
+ "refId": "A"
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "Completed tasks",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": "0",
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": "0",
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "$datasource",
+ "fill": 1,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 7,
+ "w": 12,
+ "x": 12,
+ "y": 85
+ },
+ "id": 88,
+ "interval": "",
+ "legend": {
+ "alignAsTable": false,
+ "avg": false,
+ "current": true,
+ "max": true,
+ "min": false,
+ "show": true,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "nullPointMode": "null as zero",
+ "options": {
+ "dataLinks": []
+ },
+ "paceLength": 10,
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "increase(executor_completed_tasks_total[1m])",
+ "format": "time_series",
+ "instant": false,
+ "intervalFactor": 1,
+ "legendFormat": "{{name}}",
+ "refId": "A"
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "Completed tasks/minute ",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": "0",
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": "0",
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "$datasource",
+ "fill": 1,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 7,
+ "w": 12,
+ "x": 0,
+ "y": 92
+ },
+ "id": 87,
+ "interval": "",
+ "legend": {
+ "alignAsTable": false,
+ "avg": false,
+ "current": true,
+ "max": true,
+ "min": false,
+ "show": true,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "nullPointMode": "null as zero",
+ "options": {
+ "dataLinks": []
+ },
+ "paceLength": 10,
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "executor_seconds_max",
+ "format": "time_series",
+ "instant": false,
+ "intervalFactor": 1,
+ "legendFormat": "{{name}}",
+ "refId": "A"
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "Tasks execution seconds max",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": "0",
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": "0",
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "$datasource",
+ "fill": 1,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 7,
+ "w": 12,
+ "x": 12,
+ "y": 92
+ },
+ "id": 90,
+ "interval": "",
+ "legend": {
+ "alignAsTable": false,
+ "avg": false,
+ "current": true,
+ "max": true,
+ "min": false,
+ "show": true,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "nullPointMode": "null as zero",
+ "options": {
+ "dataLinks": []
+ },
+ "paceLength": 10,
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "increase(executor_seconds_sum[1h])/increase(executor_seconds_count[1h])",
+ "format": "time_series",
+ "instant": false,
+ "intervalFactor": 1,
+ "legendFormat": "{{name}}",
+ "refId": "A"
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "Tasks execution seconds avg",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": "0",
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": "0",
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "$datasource",
+ "fill": 1,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 7,
+ "w": 12,
+ "x": 0,
+ "y": 99
+ },
+ "id": 89,
+ "interval": "",
+ "legend": {
+ "alignAsTable": false,
+ "avg": false,
+ "current": true,
+ "max": true,
+ "min": false,
+ "show": true,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "nullPointMode": "null as zero",
+ "options": {
+ "dataLinks": []
+ },
+ "paceLength": 10,
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "executor_idle_seconds_max",
+ "format": "time_series",
+ "instant": false,
+ "intervalFactor": 1,
+ "legendFormat": "{{name}}",
+ "refId": "A"
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "Executor idle seconds max",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": "0",
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": "0",
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "$datasource",
+ "fill": 1,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 7,
+ "w": 12,
+ "x": 12,
+ "y": 99
+ },
+ "id": 81,
+ "interval": "",
+ "legend": {
+ "alignAsTable": false,
+ "avg": false,
+ "current": true,
+ "max": true,
+ "min": false,
+ "show": true,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "nullPointMode": "null as zero",
+ "options": {
+ "dataLinks": []
+ },
+ "paceLength": 10,
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "increase(executor_idle_seconds_sum[1h])/increase(executor_idle_seconds_count[1h])",
+ "format": "time_series",
+ "instant": false,
+ "intervalFactor": 1,
+ "legendFormat": "{{name}}",
+ "refId": "A"
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "Executor idle seconds avg",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": "0",
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": "0",
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "$datasource",
+ "fill": 1,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 7,
+ "w": 12,
+ "x": 0,
+ "y": 106
+ },
+ "id": 92,
+ "interval": "",
+ "legend": {
+ "alignAsTable": false,
+ "avg": false,
+ "current": true,
+ "max": true,
+ "min": false,
+ "show": true,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "nullPointMode": "null as zero",
+ "options": {
+ "dataLinks": []
+ },
+ "paceLength": 10,
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "executor_scheduled_repetitively_total",
+ "format": "time_series",
+ "instant": false,
+ "intervalFactor": 1,
+ "legendFormat": "{{name}}",
+ "refId": "A"
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "Scheduled repetitively",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": "0",
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": "0",
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "$datasource",
+ "description": "",
+ "fill": 1,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 7,
+ "w": 12,
+ "x": 12,
+ "y": 106
+ },
+ "id": 93,
+ "interval": "",
+ "legend": {
+ "alignAsTable": false,
+ "avg": false,
+ "current": true,
+ "max": true,
+ "min": false,
+ "show": true,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "nullPointMode": "null as zero",
+ "options": {
+ "dataLinks": []
+ },
+ "paceLength": 10,
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "executor_scheduled_once_total",
+ "format": "time_series",
+ "instant": false,
+ "intervalFactor": 1,
+ "legendFormat": "{{name}}",
+ "refId": "A"
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "Executor scheduled once",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": "0",
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": "0",
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "$datasource",
+ "fill": 1,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 7,
+ "w": 12,
+ "x": 0,
+ "y": 113
+ },
+ "id": 91,
+ "interval": "",
+ "legend": {
+ "alignAsTable": false,
+ "avg": false,
+ "current": true,
+ "max": true,
+ "min": false,
+ "show": true,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "nullPointMode": "null as zero",
+ "options": {
+ "dataLinks": []
+ },
+ "paceLength": 10,
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "executor_scheduled_cron_total",
+ "format": "time_series",
+ "instant": false,
+ "intervalFactor": 1,
+ "legendFormat": "{{name}}",
+ "refId": "A"
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "Executor scheduled cron",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": "0",
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": "0",
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ },
+ {
"collapsed": false,
+ "datasource": "$datasource",
"gridPos": {
"h": 1,
"w": 24,
"x": 0,
- "y": 64
+ "y": 120
},
"id": 61,
"panels": [],
@@ -6149,7 +7312,7 @@ data:
"h": 7,
"w": 12,
"x": 0,
- "y": 65
+ "y": 121
},
"id": 55,
"legend": {
@@ -6175,38 +7338,18 @@ data:
"renderer": "flot",
"seriesOverrides": [],
"spaceLength": 10,
- "stack": false,
+ "stack": true,
"steppedLine": false,
"targets": [
{
"expr": "che_server_api_tracing_span_seconds_max{operation=\"WorkspaceRuntimes#startAsync\"}",
"legendFormat": "{{operation}}",
- "refId": "F"
- },
- {
- "expr": "che_server_api_tracing_span_seconds_max{operation=\"SidecarToolingProvisioner#provision\"}",
- "legendFormat": "{{operation}}",
"refId": "A"
},
{
- "expr": "che_server_api_tracing_span_seconds_max{operation=\"OpenShiftEnvironmentProvisioner#provision\"}",
+ "expr": "che_server_api_tracing_span_seconds_max{operation=\"OpenShiftInternalRuntime#start\"}",
"legendFormat": "{{operation}}",
"refId": "B"
- },
- {
- "expr": "che_server_api_tracing_span_seconds_max{operation=\"UniqueWorkspacePVCStrategy#prepare\"}",
- "legendFormat": "{{operation}}",
- "refId": "C"
- },
- {
- "expr": "che_server_api_tracing_span_seconds_max{operation=\"OpenShiftInternalRuntime#startMachines\"}",
- "legendFormat": "{{operation}}",
- "refId": "D"
- },
- {
- "expr": "che_server_api_tracing_span_seconds_max{operation=\"WaitMachinesStart\"}",
- "legendFormat": "{{operation}}",
- "refId": "E"
}
],
"thresholds": [],
@@ -6242,7 +7385,7 @@ data:
"logBase": 1,
"max": null,
"min": 0,
- "show": true
+ "show": false
}
],
"yaxis": {
@@ -6262,7 +7405,7 @@ data:
"h": 7,
"w": 12,
"x": 12,
- "y": 65
+ "y": 121
},
"id": 56,
"legend": {
@@ -6288,38 +7431,18 @@ data:
"renderer": "flot",
"seriesOverrides": [],
"spaceLength": 10,
- "stack": false,
+ "stack": true,
"steppedLine": false,
"targets": [
{
- "expr": "rate(che_server_api_tracing_span_seconds_sum{operation=\"WorkspaceRuntimes#startAsync\"}[1h]) / rate(che_server_api_tracing_span_seconds_count{operation=\"WorkspaceRuntimes#startAsync\"}[1h])",
+ "expr": "increase(che_server_api_tracing_span_seconds_sum{operation=\"WorkspaceRuntimes#startAsync\"}[1h]) / increase(che_server_api_tracing_span_seconds_count{operation=\"WorkspaceRuntimes#startAsync\"}[1h])",
"legendFormat": "{{operation}}",
"refId": "A"
},
{
- "expr": "rate(che_server_api_tracing_span_seconds_sum{operation=\"SidecarToolingProvisioner#provision\"}[1h]) / rate(che_server_api_tracing_span_seconds_count{operation=\"SidecarToolingProvisioner#provision\"}[1h])",
+ "expr": "increase(che_server_api_tracing_span_seconds_sum{operation=\"OpenShiftInternalRuntime#start\"}[1h]) / increase(che_server_api_tracing_span_seconds_count{operation=\"OpenShiftInternalRuntime#start\"}[1h])",
"legendFormat": "{{operation}}",
"refId": "B"
- },
- {
- "expr": "rate(che_server_api_tracing_span_seconds_sum{operation=\"OpenShiftEnvironmentProvisioner#provision\"}[1h]) / rate(che_server_api_tracing_span_seconds_count{operation=\"OpenShiftEnvironmentProvisioner#provision\"}[1h])",
- "legendFormat": "{{operation}}",
- "refId": "C"
- },
- {
- "expr": "rate(che_server_api_tracing_span_seconds_sum{operation=\"UniqueWorkspacePVCStrategy#prepare\"}[1h]) / rate(che_server_api_tracing_span_seconds_count{operation=\"UniqueWorkspacePVCStrategy#prepare\"}[1h])",
- "legendFormat": "{{operation}}",
- "refId": "D"
- },
- {
- "expr": "rate(che_server_api_tracing_span_seconds_sum{operation=\"OpenShiftInternalRuntime#startMachines\"}[1h]) / rate(che_server_api_tracing_span_seconds_count{operation=\"OpenShiftInternalRuntime#startMachines\"}[1h])",
- "legendFormat": "{{operation}}",
- "refId": "E"
- },
- {
- "expr": "rate(che_server_api_tracing_span_seconds_sum{operation=\"WaitMachinesStart\"}[1h]) / rate(che_server_api_tracing_span_seconds_count{operation=\"WaitMachinesStart\"}[1h])",
- "legendFormat": "{{operation}}",
- "refId": "F"
}
],
"thresholds": [],
@@ -6375,233 +7498,7 @@ data:
"h": 7,
"w": 12,
"x": 0,
- "y": 72
- },
- "id": 51,
- "legend": {
- "alignAsTable": false,
- "avg": false,
- "current": true,
- "max": true,
- "min": false,
- "rightSide": false,
- "show": true,
- "total": false,
- "values": true
- },
- "lines": true,
- "linewidth": 1,
- "nullPointMode": "null as zero",
- "options": {
- "dataLinks": []
- },
- "percentage": false,
- "pointradius": 2,
- "points": false,
- "renderer": "flot",
- "seriesOverrides": [],
- "spaceLength": 10,
- "stack": false,
- "steppedLine": false,
- "targets": [
- {
- "expr": "che_server_api_tracing_span_seconds_max{operation=\"OpenShiftInternalRuntime#createSecrets\"}",
- "legendFormat": "{{operation}}",
- "refId": "A"
- },
- {
- "expr": "che_server_api_tracing_span_seconds_max{operation=\"OpenShiftInternalRuntime#createConfigMaps\"}",
- "legendFormat": "{{operation}}",
- "refId": "B"
- },
- {
- "expr": "che_server_api_tracing_span_seconds_max{operation=\"OpenShiftInternalRuntime#createServices\"}",
- "legendFormat": "{{operation}}",
- "refId": "C"
- },
- {
- "expr": "che_server_api_tracing_span_seconds_max{operation=\"OpenShiftInternalRuntime#createRoutes\"}",
- "legendFormat": "{{operation}}",
- "refId": "D"
- },
- {
- "expr": "che_server_api_tracing_span_seconds_max{operation=\"OpenShiftInternalRuntime#doStartMachine\"}",
- "legendFormat": "{{operation}}",
- "refId": "E"
- },
- {
- "expr": "che_server_api_tracing_span_seconds_max{operation=\"OpenShiftInternalRuntime#listenEvents\"}",
- "legendFormat": "{{operation}}",
- "refId": "F"
- }
- ],
- "thresholds": [],
- "timeFrom": null,
- "timeRegions": [],
- "timeShift": null,
- "title": "OpenShiftInternalRuntime#startMachines Max",
- "tooltip": {
- "shared": true,
- "sort": 0,
- "value_type": "individual"
- },
- "type": "graph",
- "xaxis": {
- "buckets": null,
- "mode": "time",
- "name": null,
- "show": true,
- "values": []
- },
- "yaxes": [
- {
- "format": "short",
- "label": null,
- "logBase": 1,
- "max": null,
- "min": 0,
- "show": true
- },
- {
- "format": "short",
- "label": null,
- "logBase": 1,
- "max": null,
- "min": 0,
- "show": true
- }
- ],
- "yaxis": {
- "align": false,
- "alignLevel": null
- }
- },
- {
- "aliasColors": {},
- "bars": false,
- "dashLength": 10,
- "dashes": false,
- "datasource": "$datasource",
- "fill": 1,
- "fillGradient": 0,
- "gridPos": {
- "h": 7,
- "w": 12,
- "x": 12,
- "y": 72
- },
- "id": 54,
- "legend": {
- "alignAsTable": false,
- "avg": false,
- "current": true,
- "max": true,
- "min": false,
- "rightSide": false,
- "show": true,
- "total": false,
- "values": true
- },
- "lines": true,
- "linewidth": 1,
- "nullPointMode": "null as zero",
- "options": {
- "dataLinks": []
- },
- "percentage": false,
- "pointradius": 2,
- "points": false,
- "renderer": "flot",
- "seriesOverrides": [],
- "spaceLength": 10,
- "stack": false,
- "steppedLine": false,
- "targets": [
- {
- "expr": "rate(che_server_api_tracing_span_seconds_sum{operation=\"OpenShiftInternalRuntime#createSecrets\"}[1h]) / rate(che_server_api_tracing_span_seconds_count{operation=\"OpenShiftInternalRuntime#createSecrets\"}[1h])",
- "legendFormat": "{{operation}}",
- "refId": "A"
- },
- {
- "expr": "rate(che_server_api_tracing_span_seconds_sum{operation=\"OpenShiftInternalRuntime#createConfigMaps\"}[1h]) / rate(che_server_api_tracing_span_seconds_count{operation=\"OpenShiftInternalRuntime#createConfigMaps\"}[1h])",
- "legendFormat": "{{operation}}",
- "refId": "B"
- },
- {
- "expr": "rate(che_server_api_tracing_span_seconds_sum{operation=\"OpenShiftInternalRuntime#createServices\"}[1h]) / rate(che_server_api_tracing_span_seconds_count{operation=\"OpenShiftInternalRuntime#createServices\"}[1h])",
- "legendFormat": "{{operation}}",
- "refId": "C"
- },
- {
- "expr": "rate(che_server_api_tracing_span_seconds_sum{operation=\"OpenShiftInternalRuntime#createRoutes\"}[1h]) / rate(che_server_api_tracing_span_seconds_count{operation=\"OpenShiftInternalRuntime#createRoutes\"}[1h])",
- "legendFormat": "{{operation}}",
- "refId": "D"
- },
- {
- "expr": "rate(che_server_api_tracing_span_seconds_sum{operation=\"OpenShiftInternalRuntime#listenEvents\"}[1h]) / rate(che_server_api_tracing_span_seconds_count{operation=\"OpenShiftInternalRuntime#listenEvents\"}[1h])",
- "legendFormat": "{{operation}}",
- "refId": "E"
- },
- {
- "expr": "rate(che_server_api_tracing_span_seconds_sum{operation=\"OpenShiftInternalRuntime#doStartMachine\"}[1h]) / rate(che_server_api_tracing_span_seconds_count{operation=\"OpenShiftInternalRuntime#doStartMachine\"}[1h])",
- "legendFormat": "{{operation}}",
- "refId": "F"
- }
- ],
- "thresholds": [],
- "timeFrom": null,
- "timeRegions": [],
- "timeShift": null,
- "title": "OpenShiftInternalRuntime#startMachines Avg",
- "tooltip": {
- "shared": true,
- "sort": 0,
- "value_type": "individual"
- },
- "type": "graph",
- "xaxis": {
- "buckets": null,
- "mode": "time",
- "name": null,
- "show": true,
- "values": []
- },
- "yaxes": [
- {
- "format": "short",
- "label": null,
- "logBase": 1,
- "max": null,
- "min": 0,
- "show": true
- },
- {
- "format": "short",
- "label": null,
- "logBase": 1,
- "max": null,
- "min": 0,
- "show": true
- }
- ],
- "yaxis": {
- "align": false,
- "alignLevel": null
- }
- },
- {
- "aliasColors": {},
- "bars": false,
- "dashLength": 10,
- "dashes": false,
- "datasource": "$datasource",
- "fill": 1,
- "fillGradient": 0,
- "gridPos": {
- "h": 7,
- "w": 12,
- "x": 0,
- "y": 79
+ "y": 128
},
"id": 57,
"legend": {
@@ -6627,7 +7524,7 @@ data:
"renderer": "flot",
"seriesOverrides": [],
"spaceLength": 10,
- "stack": false,
+ "stack": true,
"steppedLine": false,
"targets": [
{
@@ -6674,7 +7571,7 @@ data:
"logBase": 1,
"max": null,
"min": 0,
- "show": true
+ "show": false
}
],
"yaxis": {
@@ -6694,7 +7591,7 @@ data:
"h": 7,
"w": 12,
"x": 12,
- "y": 79
+ "y": 128
},
"id": 58,
"legend": {
@@ -6720,16 +7617,16 @@ data:
"renderer": "flot",
"seriesOverrides": [],
"spaceLength": 10,
- "stack": false,
+ "stack": true,
"steppedLine": false,
"targets": [
{
- "expr": "rate(che_server_api_tracing_span_seconds_sum{operation=\"WorkspaceRuntimes#stopAsync\"}[1h]) / rate(che_server_api_tracing_span_seconds_count{operation=\"WorkspaceRuntimes#stopAsync\"}[1h])",
+ "expr": "increase(che_server_api_tracing_span_seconds_sum{operation=\"WorkspaceRuntimes#stopAsync\"}[1h]) / increase(che_server_api_tracing_span_seconds_count{operation=\"WorkspaceRuntimes#stopAsync\"}[1h])",
"legendFormat": "{{operation}}",
"refId": "A"
},
{
- "expr": "rate(che_server_api_tracing_span_seconds_sum{operation=\"OpenShiftInternalRuntime#internalStop\"}[1h]) / rate(che_server_api_tracing_span_seconds_count{operation=\"OpenShiftInternalRuntime#internalStop\"}[1h])",
+ "expr": "increase(che_server_api_tracing_span_seconds_sum{operation=\"OpenShiftInternalRuntime#internalStop\"}[1h]) / increase(che_server_api_tracing_span_seconds_count{operation=\"OpenShiftInternalRuntime#internalStop\"}[1h])",
"legendFormat": "{{operation}}",
"refId": "B"
}
@@ -6761,6 +7658,107 @@ data:
"min": 0,
"show": true
},
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": 0,
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "$datasource",
+ "description": "",
+ "fill": 1,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 7,
+ "w": 12,
+ "x": 0,
+ "y": 135
+ },
+ "id": 51,
+ "legend": {
+ "alignAsTable": false,
+ "avg": false,
+ "current": true,
+ "max": true,
+ "min": false,
+ "rightSide": false,
+ "show": true,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "nullPointMode": "null as zero",
+ "options": {
+ "dataLinks": []
+ },
+ "percentage": false,
+ "pointradius": 2,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": true,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "che_server_api_tracing_span_seconds_max{operation=\"SidecarToolingProvisioner#provision\"}",
+ "legendFormat": "{{operation}}",
+ "refId": "A"
+ },
+ {
+ "expr": "che_server_api_tracing_span_seconds_max{operation=\"OpenShiftEnvironmentProvisioner#provision\"}",
+ "legendFormat": "{{operation}}",
+ "refId": "B"
+ },
+ {
+ "expr": "che_server_api_tracing_span_seconds_max{operation=\"PerWorkspacePVCStrategy#prepare\"}",
+ "legendFormat": "{{operation}}",
+ "refId": "C"
+ },
+ {
+ "expr": "che_server_api_tracing_span_seconds_max{operation=\"OpenShiftInternalRuntime#startMachines\"}",
+ "legendFormat": "{{operation}}",
+ "refId": "D"
+ },
+ {
+ "expr": "che_server_api_tracing_span_seconds_max{operation=\"WaitMachinesStart\"}",
+ "legendFormat": "{{operation}}",
+ "refId": "E"
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "OpenShiftInternalRuntime#start Max",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
{
"format": "short",
"label": null,
@@ -6768,6 +7766,1212 @@ data:
"max": null,
"min": 0,
"show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": 0,
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "$datasource",
+ "fill": 1,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 7,
+ "w": 12,
+ "x": 12,
+ "y": 135
+ },
+ "id": 54,
+ "legend": {
+ "alignAsTable": false,
+ "avg": false,
+ "current": true,
+ "max": true,
+ "min": false,
+ "rightSide": false,
+ "show": true,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "nullPointMode": "null as zero",
+ "options": {
+ "dataLinks": []
+ },
+ "percentage": false,
+ "pointradius": 2,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": true,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "increase(che_server_api_tracing_span_seconds_sum{operation=\"SidecarToolingProvisioner#provision\"}[1h]) / increase(che_server_api_tracing_span_seconds_count{operation=\"SidecarToolingProvisioner#provision\"}[1h])",
+ "legendFormat": "{{operation}}",
+ "refId": "A"
+ },
+ {
+ "expr": "increase(che_server_api_tracing_span_seconds_sum{operation=\"OpenShiftEnvironmentProvisioner#provision\"}[1h]) / increase(che_server_api_tracing_span_seconds_count{operation=\"OpenShiftEnvironmentProvisioner#provision\"}[1h])",
+ "legendFormat": "{{operation}}",
+ "refId": "B"
+ },
+ {
+ "expr": "increase(che_server_api_tracing_span_seconds_sum{operation=\"PerWorkspacePVCStrategy#prepare\"}[1h]) / increase(che_server_api_tracing_span_seconds_count{operation=\"PerWorkspacePVCStrategy#prepare\"}[1h])",
+ "legendFormat": "{{operation}}",
+ "refId": "C"
+ },
+ {
+ "expr": "increase(che_server_api_tracing_span_seconds_sum{operation=\"OpenShiftInternalRuntime#startMachines\"}[1h]) / increase(che_server_api_tracing_span_seconds_count{operation=\"OpenShiftInternalRuntime#startMachines\"}[1h])",
+ "legendFormat": "{{operation}}",
+ "refId": "D"
+ },
+ {
+ "expr": "increase(che_server_api_tracing_span_seconds_sum{operation=\"WaitMachinesStart\"}[1h]) / increase(che_server_api_tracing_span_seconds_count{operation=\"WaitMachinesStart\"}[1h])",
+ "legendFormat": "{{operation}}",
+ "refId": "E"
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "OpenShiftInternalRuntime#start avg",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": 0,
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": 0,
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "$datasource",
+ "description": "",
+ "fill": 1,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 7,
+ "w": 12,
+ "x": 0,
+ "y": 142
+ },
+ "id": 94,
+ "legend": {
+ "alignAsTable": false,
+ "avg": false,
+ "current": true,
+ "max": true,
+ "min": false,
+ "rightSide": false,
+ "show": true,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "nullPointMode": "null as zero",
+ "options": {
+ "dataLinks": []
+ },
+ "percentage": false,
+ "pointradius": 2,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": true,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "che_server_api_tracing_span_seconds_max{operation=\"PluginBrokerManager#getTooling\"}",
+ "legendFormat": "{{operation}}",
+ "refId": "A"
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "Plugin Brokering Execution Max",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": 0,
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": 0,
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "$datasource",
+ "description": "",
+ "fill": 1,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 7,
+ "w": 12,
+ "x": 12,
+ "y": 142
+ },
+ "id": 97,
+ "legend": {
+ "alignAsTable": false,
+ "avg": false,
+ "current": true,
+ "max": true,
+ "min": false,
+ "rightSide": false,
+ "show": true,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "nullPointMode": "null as zero",
+ "options": {
+ "dataLinks": []
+ },
+ "percentage": false,
+ "pointradius": 2,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": true,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "increase(che_server_api_tracing_span_seconds_sum{operation=\"PluginBrokerManager#getTooling\"}[1h]) / increase(che_server_api_tracing_span_seconds_count{operation=\"PluginBrokerManager#getTooling\"}[1h])",
+ "legendFormat": "{{operation}}",
+ "refId": "A"
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "Plugin Brokering Execution Avg",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": 0,
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": 0,
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "$datasource",
+ "description": "",
+ "fill": 1,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 7,
+ "w": 12,
+ "x": 0,
+ "y": 149
+ },
+ "id": 96,
+ "legend": {
+ "alignAsTable": false,
+ "avg": false,
+ "current": true,
+ "max": true,
+ "min": false,
+ "rightSide": false,
+ "show": true,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "nullPointMode": "null as zero",
+ "options": {
+ "dataLinks": []
+ },
+ "percentage": false,
+ "pointradius": 2,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": true,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "che_server_api_tracing_span_seconds_max{operation=\"LogsVolumeMachineProvisioner#provision\"}",
+ "legendFormat": "{{operation}}",
+ "refId": "A"
+ },
+ {
+ "expr": "che_server_api_tracing_span_seconds_max{operation=\"ServersConverter#provision\"}",
+ "legendFormat": "{{operation}}",
+ "refId": "B"
+ },
+ {
+ "expr": "che_server_api_tracing_span_seconds_max{operation=\"EnvVarsConverter#provision\"}",
+ "legendFormat": "{{operation}}",
+ "refId": "C"
+ },
+ {
+ "expr": "che_server_api_tracing_span_seconds_max{operation=\"RestartPolicyRewriter#provision\"}",
+ "legendFormat": "{{operation}}",
+ "refId": "D"
+ },
+ {
+ "expr": "che_server_api_tracing_span_seconds_max{operation=\"RouteTlsProvisioner#provision\"}",
+ "legendFormat": "{{operation}}",
+ "refId": "E"
+ },
+ {
+ "expr": "che_server_api_tracing_span_seconds_max{operation=\"RamLimitRequestProvisioner#provision\"}",
+ "legendFormat": "{{operation}}",
+ "refId": "F"
+ },
+ {
+ "expr": "che_server_api_tracing_span_seconds_max{operation=\"PodTerminationGracePeriodProvisioner#provision\"}",
+ "legendFormat": "{{operation}}",
+ "refId": "G"
+ },
+ {
+ "expr": "che_server_api_tracing_span_seconds_max{operation=\"ImagePullSecretProvisioner#provision\"}",
+ "legendFormat": "{{operation}}",
+ "refId": "H"
+ },
+ {
+ "expr": "che_server_api_tracing_span_seconds_max{operation=\"ProxySettingsProvisioner#provision\"}",
+ "legendFormat": "{{operation}}",
+ "refId": "I"
+ },
+ {
+ "expr": "che_server_api_tracing_span_seconds_max{operation=\"ServiceAccountProvisioner#provision\"}",
+ "legendFormat": "{{operation}}",
+ "refId": "J"
+ },
+ {
+ "expr": "che_server_api_tracing_span_seconds_max{operation=\"VcsSshKeysProvisioner#provision\"}",
+ "legendFormat": "{{operation}}",
+ "refId": "K"
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "OpenShiftEnvironmentProvisioner#provision Max",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": 0,
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": 0,
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "$datasource",
+ "description": "",
+ "fill": 1,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 7,
+ "w": 12,
+ "x": 12,
+ "y": 149
+ },
+ "id": 98,
+ "legend": {
+ "alignAsTable": false,
+ "avg": false,
+ "current": true,
+ "max": true,
+ "min": false,
+ "rightSide": false,
+ "show": true,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "nullPointMode": "null as zero",
+ "options": {
+ "dataLinks": []
+ },
+ "percentage": false,
+ "pointradius": 2,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": true,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "increase(che_server_api_tracing_span_seconds_sum{operation=\"LogsVolumeMachineProvisioner#provision\"}[1h]) / increase(che_server_api_tracing_span_seconds_count{operation=\"LogsVolumeMachineProvisioner#provision\"}[1h])",
+ "legendFormat": "{{operation}}",
+ "refId": "A"
+ },
+ {
+ "expr": "increase(che_server_api_tracing_span_seconds_sum{operation=\"ServersConverter#provision\"}[1h]) / increase(che_server_api_tracing_span_seconds_count{operation=\"ServersConverter#provision\"}[1h])",
+ "legendFormat": "{{operation}}",
+ "refId": "B"
+ },
+ {
+ "expr": "increase(che_server_api_tracing_span_seconds_sum{operation=\"EnvVarsConverter#provision\"}[1h]) / increase(che_server_api_tracing_span_seconds_count{operation=\"EnvVarsConverter#provision\"}[1h])",
+ "legendFormat": "{{operation}}",
+ "refId": "C"
+ },
+ {
+ "expr": "increase(che_server_api_tracing_span_seconds_sum{operation=\"RestartPolicyRewriter#provision\"}[1h]) / increase(che_server_api_tracing_span_seconds_count{operation=\"RestartPolicyRewriter#provision\"}[1h])",
+ "legendFormat": "{{operation}}",
+ "refId": "D"
+ },
+ {
+ "expr": "increase(che_server_api_tracing_span_seconds_sum{operation=\"RouteTlsProvisioner#provision\"}[1h]) / increase(che_server_api_tracing_span_seconds_count{operation=\"RouteTlsProvisioner#provision\"}[1h])",
+ "legendFormat": "{{operation}}",
+ "refId": "E"
+ },
+ {
+ "expr": "increase(che_server_api_tracing_span_seconds_sum{operation=\"RamLimitRequestProvisioner#provision\"}[1h]) / increase(che_server_api_tracing_span_seconds_count{operation=\"RamLimitRequestProvisioner#provision\"}[1h])",
+ "legendFormat": "{{operation}}",
+ "refId": "F"
+ },
+ {
+ "expr": "increase(che_server_api_tracing_span_seconds_sum{operation=\"PodTerminationGracePeriodProvisioner#provision\"}[1h]) / increase(che_server_api_tracing_span_seconds_count{operation=\"PodTerminationGracePeriodProvisioner#provision\"}[1h])",
+ "legendFormat": "{{operation}}",
+ "refId": "G"
+ },
+ {
+ "expr": "increase(che_server_api_tracing_span_seconds_sum{operation=\"ImagePullSecretProvisioner#provision\"}[1h]) / increase(che_server_api_tracing_span_seconds_count{operation=\"ImagePullSecretProvisioner#provision\"}[1h])",
+ "legendFormat": "{{operation}}",
+ "refId": "H"
+ },
+ {
+ "expr": "increase(che_server_api_tracing_span_seconds_sum{operation=\"ProxySettingsProvisioner#provision\"}[1h]) / increase(che_server_api_tracing_span_seconds_count{operation=\"ProxySettingsProvisioner#provision\"}[1h])",
+ "legendFormat": "{{operation}}",
+ "refId": "I"
+ },
+ {
+ "expr": "increase(che_server_api_tracing_span_seconds_sum{operation=\"ServiceAccountProvisioner#provision\"}[1h]) / increase(che_server_api_tracing_span_seconds_count{operation=\"ServiceAccountProvisioner#provision\"}[1h])",
+ "legendFormat": "{{operation}}",
+ "refId": "J"
+ },
+ {
+ "expr": "increase(che_server_api_tracing_span_seconds_sum{operation=\"VcsSshKeysProvisioner#provision\"}[1h]) / increase(che_server_api_tracing_span_seconds_count{operation=\"VcsSshKeysProvisioner#provision\"}[1h])",
+ "legendFormat": "{{operation}}",
+ "refId": "K"
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "OpenShiftEnvironmentProvisioner#provision avg",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": 0,
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": 0,
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "$datasource",
+ "description": "",
+ "fill": 1,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 7,
+ "w": 12,
+ "x": 0,
+ "y": 156
+ },
+ "id": 100,
+ "legend": {
+ "alignAsTable": false,
+ "avg": false,
+ "current": true,
+ "max": true,
+ "min": false,
+ "rightSide": false,
+ "show": true,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "nullPointMode": "null as zero",
+ "options": {
+ "dataLinks": []
+ },
+ "percentage": false,
+ "pointradius": 2,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": true,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "che_server_api_tracing_span_seconds_max{operation=\"OpenShiftEnvironmentProvisioner#provision\"}",
+ "legendFormat": "{{operation}}",
+ "refId": "A"
+ },
+ {
+ "expr": "che_server_api_tracing_span_seconds_max{operation=\"PrepareStorage\"}",
+ "legendFormat": "{{operation}}",
+ "refId": "B"
+ },
+ {
+ "expr": "che_server_api_tracing_span_seconds_max{operation=\"PerWorkspacePVCStrategy#prepare\"}",
+ "legendFormat": "{{operation}}",
+ "refId": "C"
+ },
+ {
+ "expr": "che_server_api_tracing_span_seconds_max{operation=\"DeployBroker\"}",
+ "legendFormat": "{{operation}}",
+ "refId": "D"
+ },
+ {
+ "expr": "che_server_api_tracing_span_seconds_max{operation=\"WaitBrokerResult\"}",
+ "legendFormat": "{{operation}}",
+ "refId": "E"
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "Plugin Brokering Execution Max",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": 0,
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": 0,
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "$datasource",
+ "description": "",
+ "fill": 1,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 7,
+ "w": 12,
+ "x": 12,
+ "y": 156
+ },
+ "id": 99,
+ "legend": {
+ "alignAsTable": false,
+ "avg": false,
+ "current": true,
+ "max": true,
+ "min": false,
+ "rightSide": false,
+ "show": true,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "nullPointMode": "null as zero",
+ "options": {
+ "dataLinks": []
+ },
+ "percentage": false,
+ "pointradius": 2,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": true,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "increase(che_server_api_tracing_span_seconds_sum{operation=\"OpenShiftEnvironmentProvisioner#provision\"}[1h]) / increase(che_server_api_tracing_span_seconds_count{operation=\"OpenShiftEnvironmentProvisioner#provision\"}[1h])",
+ "legendFormat": "{{operation}}",
+ "refId": "A"
+ },
+ {
+ "expr": "increase(che_server_api_tracing_span_seconds_sum{operation=\"PrepareStorage\"}[1h]) / increase(che_server_api_tracing_span_seconds_count{operation=\"PPrepareStorage\"}[1h])",
+ "legendFormat": "{{operation}}",
+ "refId": "B"
+ },
+ {
+ "expr": "increase(che_server_api_tracing_span_seconds_sum{operation=\"PerWorkspacePVCStrategy#prepare\"}[1h]) / increase(che_server_api_tracing_span_seconds_count{operation=\"PerWorkspacePVCStrategy#prepare\"}[1h])",
+ "legendFormat": "{{operation}}",
+ "refId": "C"
+ },
+ {
+ "expr": "increase(che_server_api_tracing_span_seconds_sum{operation=\"DeployBroker\"}[1h]) / increase(che_server_api_tracing_span_seconds_count{operation=\"DeployBroker\"}[1h])",
+ "legendFormat": "{{operation}}",
+ "refId": "D"
+ },
+ {
+ "expr": "increase(che_server_api_tracing_span_seconds_sum{operation=\"WaitBrokerResult\"}[1h]) / increase(che_server_api_tracing_span_seconds_count{operation=\"WaitBrokerResult\"}[1h])",
+ "legendFormat": "{{operation}}",
+ "refId": "E"
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "Plugin Brokering Execution Avg",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": 0,
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": 0,
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "$datasource",
+ "description": "",
+ "fill": 1,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 7,
+ "w": 12,
+ "x": 0,
+ "y": 163
+ },
+ "id": 95,
+ "legend": {
+ "alignAsTable": false,
+ "avg": false,
+ "current": true,
+ "max": true,
+ "min": false,
+ "rightSide": false,
+ "show": true,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "nullPointMode": "null as zero",
+ "options": {
+ "dataLinks": []
+ },
+ "percentage": false,
+ "pointradius": 2,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": true,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "che_server_api_tracing_span_seconds_max{operation=\"WaitRunningAsync\"}",
+ "legendFormat": "{{operation}}",
+ "refId": "A"
+ },
+ {
+ "expr": "che_server_api_tracing_span_seconds_max{operation=\"CheckServers\"}",
+ "legendFormat": "{{operation}}",
+ "refId": "B"
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "WaitMachinesStart Max",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": 0,
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": 0,
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "$datasource",
+ "description": "",
+ "fill": 1,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 7,
+ "w": 12,
+ "x": 12,
+ "y": 163
+ },
+ "id": 101,
+ "legend": {
+ "alignAsTable": false,
+ "avg": false,
+ "current": true,
+ "max": true,
+ "min": false,
+ "rightSide": false,
+ "show": true,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "nullPointMode": "null as zero",
+ "options": {
+ "dataLinks": []
+ },
+ "percentage": false,
+ "pointradius": 2,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": true,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "increase(che_server_api_tracing_span_seconds_sum{operation=\"WaitRunningAsync\"}[1h]) / increase(che_server_api_tracing_span_seconds_count{operation=\"WaitRunningAsync\"}[1h])",
+ "legendFormat": "{{operation}}",
+ "refId": "A"
+ },
+ {
+ "expr": "increase(che_server_api_tracing_span_seconds_sum{operation=\"CheckServers\"}[1h]) / increase(che_server_api_tracing_span_seconds_count{operation=\"CheckServers\"}[1h])",
+ "legendFormat": "{{operation}}",
+ "refId": "B"
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "WaitMachinesStart avg",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": 0,
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": 0,
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "$datasource",
+ "description": "",
+ "fill": 1,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 7,
+ "w": 12,
+ "x": 0,
+ "y": 170
+ },
+ "id": 102,
+ "legend": {
+ "alignAsTable": false,
+ "avg": false,
+ "current": true,
+ "max": true,
+ "min": false,
+ "rightSide": false,
+ "show": true,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "nullPointMode": "null as zero",
+ "options": {
+ "dataLinks": []
+ },
+ "percentage": false,
+ "pointradius": 2,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": true,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "che_server_api_tracing_span_seconds_max{operation=\"OpenShiftInternalRuntime#createSecrets\"}",
+ "legendFormat": "{{operation}}",
+ "refId": "A"
+ },
+ {
+ "expr": "che_server_api_tracing_span_seconds_max{operation=\"OpenShiftInternalRuntime#createConfigMaps\"}",
+ "legendFormat": "{{operation}}",
+ "refId": "B"
+ },
+ {
+ "expr": "che_server_api_tracing_span_seconds_max{operation=\"OpenShiftInternalRuntime#createServices\"}",
+ "legendFormat": "{{operation}}",
+ "refId": "C"
+ },
+ {
+ "expr": "che_server_api_tracing_span_seconds_max{operation=\"OpenShiftInternalRuntime#createRoutes\"}",
+ "legendFormat": "{{operation}}",
+ "refId": "D"
+ },
+ {
+ "expr": "che_server_api_tracing_span_seconds_max{operation=\"OpenShiftInternalRuntime#listenEvents\"}",
+ "legendFormat": "{{operation}}",
+ "refId": "E"
+ },
+ {
+ "expr": "che_server_api_tracing_span_seconds_max{operation=\"OpenShiftInternalRuntime#doStartMachine\"}",
+ "legendFormat": "{{operation}}",
+ "refId": "F"
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "OpenShiftInternalRuntime#startMachines Max",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": 0,
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": 0,
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "$datasource",
+ "description": "",
+ "fill": 1,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 7,
+ "w": 12,
+ "x": 12,
+ "y": 170
+ },
+ "id": 103,
+ "legend": {
+ "alignAsTable": false,
+ "avg": false,
+ "current": true,
+ "max": true,
+ "min": false,
+ "rightSide": false,
+ "show": true,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "nullPointMode": "null as zero",
+ "options": {
+ "dataLinks": []
+ },
+ "percentage": false,
+ "pointradius": 2,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": true,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "increase(che_server_api_tracing_span_seconds_sum{operation=\"OpenShiftInternalRuntime#createSecrets\"}[1h]) / increase(che_server_api_tracing_span_seconds_count{operation=\"OpenShiftInternalRuntime#createSecrets\"}[1h])",
+ "legendFormat": "{{operation}}",
+ "refId": "A"
+ },
+ {
+ "expr": "increase(che_server_api_tracing_span_seconds_sum{operation=\"OpenShiftInternalRuntime#createConfigMaps\"}[1h]) / increase(che_server_api_tracing_span_seconds_count{operation=\"OpenShiftInternalRuntime#createConfigMaps\"}[1h])",
+ "legendFormat": "{{operation}}",
+ "refId": "B"
+ },
+ {
+ "expr": "increase(che_server_api_tracing_span_seconds_sum{operation=\"OpenShiftInternalRuntime#createServices\"}[1h]) / increase(che_server_api_tracing_span_seconds_count{operation=\"OpenShiftInternalRuntime#createServices\"}[1h])",
+ "legendFormat": "{{operation}}",
+ "refId": "C"
+ },
+ {
+ "expr": "increase(che_server_api_tracing_span_seconds_sum{operation=\"OpenShiftInternalRuntime#createRoutes\"}[1h]) / increase(che_server_api_tracing_span_seconds_count{operation=\"OpenShiftInternalRuntime#createRoutes\"}[1h])",
+ "legendFormat": "{{operation}}",
+ "refId": "D"
+ },
+ {
+ "expr": "increase(che_server_api_tracing_span_seconds_sum{operation=\"OpenShiftInternalRuntime#listenEvents\"}[1h]) / increase(che_server_api_tracing_span_seconds_count{operation=\"OpenShiftInternalRuntime#listenEvents\"}[1h])",
+ "legendFormat": "{{operation}}",
+ "refId": "E"
+ },
+ {
+ "expr": "increase(che_server_api_tracing_span_seconds_sum{operation=\"OpenShiftInternalRuntime#doStartMachine\"}[1h]) / increase(che_server_api_tracing_span_seconds_count{operation=\"OpenShiftInternalRuntime#doStartMachine\"}[1h])",
+ "legendFormat": "{{operation}}",
+ "refId": "F"
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "OpenShiftInternalRuntime#startMachines avg",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": 0,
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": 0,
+ "show": false
}
],
"yaxis": {
@@ -6777,11 +8981,12 @@ data:
},
{
"collapsed": true,
+ "datasource": "$datasource",
"gridPos": {
"h": 1,
"w": 24,
"x": 0,
- "y": 86
+ "y": 177
},
"id": 42,
"panels": [
diff --git a/infrastructures/kubernetes/pom.xml b/infrastructures/kubernetes/pom.xml
index df0c5e5bdc..6ace709803 100644
--- a/infrastructures/kubernetes/pom.xml
+++ b/infrastructures/kubernetes/pom.xml
@@ -150,6 +150,10 @@
org.eclipse.che.core
che-core-commons-lang