This is an automated email from the ASF dual-hosted git repository. dpavlov pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/ignite-teamcity-bot.git
The following commit(s) were added to refs/heads/master by this push: new aeb9c40 Add logging from monitoring interceptor, all tasks added to monitoring log aeb9c40 is described below commit aeb9c40d53885727460ed7b3ecff2ce4a37a1fa7 Author: Dmitriy Pavlov <dpav...@apache.org> AuthorDate: Tue Jul 30 14:58:45 2019 +0300 Add logging from monitoring interceptor, all tasks added to monitoring log --- .../ci/tcbot/TcBotBusinessServicesModule.java | 48 -------- .../TcBotWebAppModule.java} | 49 +++------ .../java/org/apache/ignite/ci/web/CtxListener.java | 12 +- .../ci/web/rest/monitoring/MonitoringService.java | 4 +- .../org/apache/ignite/ci/di/DiContextTest.java | 6 +- .../org/apache/ignite/ci/di/cache/CachingTest.java | 1 + .../ignite/tcbot/common/TcBotCommonModule.java | 18 ++- .../interceptor}/AutoProfilingInterceptor.java | 2 +- .../AutoProfilingInterceptorModule.java | 22 ++-- .../interceptor}/GuavaCachedInterceptor.java | 8 +- .../common/interceptor}/GuavaCachedModule.java | 3 +- .../tcbot/common/interceptor/MonitoredTask.java | 5 + .../interceptor}/MonitoredTaskInterceptor.java | 122 +++++++++++++++++++-- .../MonitoredTaskInterceptorModule.java | 23 ++-- .../apache/ignite/tcbot/common/util/TimeUtil.java | 4 + .../ignite/tcbot/engine/TcBotEngineModule.java | 7 ++ .../persistence/scheduler/TcBotScheduler.java | 2 +- 17 files changed, 195 insertions(+), 141 deletions(-) diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/TcBotBusinessServicesModule.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/TcBotBusinessServicesModule.java deleted file mode 100644 index 804bb89..0000000 --- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/TcBotBusinessServicesModule.java +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.ignite.ci.tcbot; - -import com.google.inject.AbstractModule; -import com.google.inject.internal.SingletonScope; -import org.apache.ignite.ci.issue.IssuesStorage; -import org.apache.ignite.tcbot.engine.buildtime.BuildTimeService; -import org.apache.ignite.tcbot.engine.conf.ITcBotConfig; -import org.apache.ignite.ci.tcbot.conf.LocalFilesBasedConfig; -import org.apache.ignite.ci.tcbot.issue.IIssuesStorage; -import org.apache.ignite.ci.tcbot.trends.MasterTrendsService; -import org.apache.ignite.ci.tcbot.user.IUserStorage; -import org.apache.ignite.ci.tcbot.user.UserAndSessionsStorage; -import org.apache.ignite.tcbot.common.conf.IDataSourcesConfigSupplier; - -/** - * TC Bot self services mapping (without 3rd party integrations configuration. - */ -public class TcBotBusinessServicesModule extends AbstractModule { - /** {@inheritDoc} */ - @Override protected void configure() { - bind(ITcBotConfig.class).to(LocalFilesBasedConfig.class).in(new SingletonScope()); - //todo remove - bind(IDataSourcesConfigSupplier.class).to(LocalFilesBasedConfig.class).in(new SingletonScope()); - bind(IUserStorage.class).to(UserAndSessionsStorage.class).in(new SingletonScope()); - bind(IIssuesStorage.class).to(IssuesStorage.class).in(new SingletonScope()); - bind(MasterTrendsService.class).in(new SingletonScope()); - bind(ITcBotBgAuth.class).to(TcBotBgAuthImpl.class).in(new SingletonScope()); - - //todo move to bot engine module - bind(BuildTimeService.class).in(new SingletonScope()); - } -} diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/di/IgniteTcBotModule.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/TcBotWebAppModule.java similarity index 75% rename from ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/di/IgniteTcBotModule.java rename to ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/TcBotWebAppModule.java index 67f5ad1..e613ccf 100644 --- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/di/IgniteTcBotModule.java +++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/TcBotWebAppModule.java @@ -14,28 +14,33 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.ignite.ci.di; +package org.apache.ignite.ci.tcbot; import com.google.common.base.Preconditions; import com.google.inject.AbstractModule; import com.google.inject.Injector; import com.google.inject.internal.SingletonScope; -import com.google.inject.matcher.Matchers; import java.util.concurrent.Future; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; import javax.inject.Provider; import org.apache.ignite.Ignite; import org.apache.ignite.ci.db.Ignite1Init; -import org.apache.ignite.ci.di.cache.GuavaCachedModule; +import org.apache.ignite.ci.issue.IssuesStorage; +import org.apache.ignite.ci.tcbot.conf.LocalFilesBasedConfig; +import org.apache.ignite.ci.tcbot.issue.IIssuesStorage; +import org.apache.ignite.ci.tcbot.trends.MasterTrendsService; +import org.apache.ignite.ci.tcbot.user.IUserStorage; +import org.apache.ignite.ci.tcbot.user.UserAndSessionsStorage; +import org.apache.ignite.tcbot.common.conf.IDataSourcesConfigSupplier; import org.apache.ignite.tcbot.engine.TcBotEngineModule; +import org.apache.ignite.tcbot.engine.conf.ITcBotConfig; import org.apache.ignite.tcbot.notify.TcBotNotificationsModule; import org.apache.ignite.tcbot.persistence.scheduler.SchedulerModule; import org.apache.ignite.githubignited.GitHubIgnitedModule; import org.apache.ignite.jiraignited.JiraIgnitedModule; import org.apache.ignite.ci.observer.BuildObserver; import org.apache.ignite.ci.observer.ObserverTask; -import org.apache.ignite.ci.tcbot.TcBotBusinessServicesModule; import org.apache.ignite.ci.tcbot.issue.IssueDetector; import org.apache.ignite.tcbot.common.exeption.ServicesStartingException; import org.apache.ignite.tcbot.persistence.TcBotPersistenceModule; @@ -43,22 +48,16 @@ import org.apache.ignite.tcignited.TeamcityIgnitedModule; import org.apache.ignite.tcbot.common.exeption.ExceptionUtil; import org.apache.ignite.tcbot.engine.pool.TcUpdatePool; import org.apache.ignite.ci.web.model.hist.VisasHistoryStorage; -import org.apache.ignite.tcbot.common.interceptor.AutoProfiling; -import org.apache.ignite.tcbot.common.interceptor.MonitoredTask; /** * */ -public class IgniteTcBotModule extends AbstractModule { +public class TcBotWebAppModule extends AbstractModule { /** Ignite future. */ private Future<Ignite> igniteFut; /** {@inheritDoc} */ @Override protected void configure() { - install(new GuavaCachedModule()); - configProfiling(); - configTaskMonitor(); - bind(Ignite.class).toProvider((Provider<Ignite>)() -> { Preconditions.checkNotNull(igniteFut, "Ignite future is not yet initialized"); @@ -90,27 +89,13 @@ public class IgniteTcBotModule extends AbstractModule { // common services install(new TcBotEngineModule()); - install(new TcBotBusinessServicesModule()); - } - - private void configProfiling() { - AutoProfilingInterceptor profilingInterceptor = new AutoProfilingInterceptor(); - - bindInterceptor(Matchers.any(), - Matchers.annotatedWith(AutoProfiling.class), - profilingInterceptor); - - bind(AutoProfilingInterceptor.class).toInstance(profilingInterceptor); - } - - private void configTaskMonitor() { - MonitoredTaskInterceptor profilingInterceptor = new MonitoredTaskInterceptor(); - - bindInterceptor(Matchers.any(), - Matchers.annotatedWith(MonitoredTask.class), - profilingInterceptor); - - bind(MonitoredTaskInterceptor.class).toInstance(profilingInterceptor); + bind(ITcBotConfig.class).to(LocalFilesBasedConfig.class).in(new SingletonScope()); + //todo remove duplication of instances for base and for overriden class + bind(IDataSourcesConfigSupplier.class).to(LocalFilesBasedConfig.class).in(new SingletonScope()); + bind(IUserStorage.class).to(UserAndSessionsStorage.class).in(new SingletonScope()); + bind(IIssuesStorage.class).to(IssuesStorage.class).in(new SingletonScope()); + bind(MasterTrendsService.class).in(new SingletonScope()); + bind(ITcBotBgAuth.class).to(TcBotBgAuthImpl.class).in(new SingletonScope()); } public void setIgniteFut(Future<Ignite> igniteFut) { diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/CtxListener.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/CtxListener.java index e637738..12dcf88 100644 --- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/CtxListener.java +++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/CtxListener.java @@ -27,7 +27,8 @@ import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; import org.apache.ignite.Ignite; import org.apache.ignite.ci.db.TcHelperDb; -import org.apache.ignite.ci.di.IgniteTcBotModule; +import org.apache.ignite.ci.tcbot.TcBotWebAppModule; +import org.apache.ignite.tcbot.common.interceptor.MonitoredTaskInterceptor; import org.apache.ignite.tcbot.engine.pool.TcUpdatePool; import org.apache.ignite.tcbot.persistence.scheduler.IScheduler; import org.apache.ignite.ci.observer.BuildObserver; @@ -51,7 +52,7 @@ public class CtxListener implements ServletContextListener { /** {@inheritDoc} */ @Override public void contextInitialized(ServletContextEvent sctxEvt) { initLoggerBridge(); - IgniteTcBotModule igniteTcBotModule = new IgniteTcBotModule(); + TcBotWebAppModule igniteTcBotModule = new TcBotWebAppModule(); Injector injectorPreCreated = Guice.createInjector(igniteTcBotModule); Injector injector = igniteTcBotModule.startIgniteInit(injectorPreCreated); @@ -107,6 +108,13 @@ public class CtxListener implements ServletContextListener { } try { + injector.getInstance(MonitoredTaskInterceptor.class).close(); + } + catch (Exception e) { + e.printStackTrace(); + } + + try { TcHelperDb.stop(injector.getInstance(Ignite.class)); } catch (Exception e) { diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/rest/monitoring/MonitoringService.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/rest/monitoring/MonitoringService.java index 576a38d..b631639 100644 --- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/rest/monitoring/MonitoringService.java +++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/rest/monitoring/MonitoringService.java @@ -21,8 +21,8 @@ import org.apache.ignite.Ignite; import org.apache.ignite.IgniteCache; import org.apache.ignite.cache.CacheMetrics; import org.apache.ignite.cache.affinity.Affinity; -import org.apache.ignite.ci.di.AutoProfilingInterceptor; -import org.apache.ignite.ci.di.MonitoredTaskInterceptor; +import org.apache.ignite.tcbot.common.interceptor.AutoProfilingInterceptor; +import org.apache.ignite.tcbot.common.interceptor.MonitoredTaskInterceptor; import org.apache.ignite.ci.web.CtxListener; import javax.annotation.security.PermitAll; diff --git a/ignite-tc-helper-web/src/test/java/org/apache/ignite/ci/di/DiContextTest.java b/ignite-tc-helper-web/src/test/java/org/apache/ignite/ci/di/DiContextTest.java index 01a7b88..10e1bcd 100644 --- a/ignite-tc-helper-web/src/test/java/org/apache/ignite/ci/di/DiContextTest.java +++ b/ignite-tc-helper-web/src/test/java/org/apache/ignite/ci/di/DiContextTest.java @@ -26,6 +26,8 @@ import org.apache.ignite.IgniteCache; import org.apache.ignite.ci.observer.BuildObserver; import org.apache.ignite.ci.observer.ObserverTask; import org.apache.ignite.ci.tcbot.ITcBotBgAuth; +import org.apache.ignite.ci.tcbot.TcBotWebAppModule; +import org.apache.ignite.tcbot.common.interceptor.MonitoredTaskInterceptor; import org.apache.ignite.tcbot.engine.chain.BuildChainProcessor; import org.apache.ignite.tcbot.engine.conf.ITcBotConfig; import org.apache.ignite.tcbot.engine.pool.TcUpdatePool; @@ -55,7 +57,7 @@ public class DiContextTest { } public Injector getInjector() { - IgniteTcBotModule igniteTcBotModule = new IgniteTcBotModule(); + TcBotWebAppModule igniteTcBotModule = new TcBotWebAppModule(); Ignite ignite = mock(Ignite.class); when(ignite.getOrCreateCache(anyString())).thenReturn(Mockito.mock(IgniteCache.class)); when(ignite.getOrCreateCache(any(CacheConfiguration.class))).thenReturn(Mockito.mock(IgniteCache.class)); @@ -89,7 +91,7 @@ public class DiContextTest { @Test public void testMonitoring() { - IgniteTcBotModule igniteTcBotModule = new IgniteTcBotModule(); + TcBotWebAppModule igniteTcBotModule = new TcBotWebAppModule(); final Injector injector = Guice.createInjector(igniteTcBotModule); final MonitorTest instance = injector.getInstance(MonitorTest.class); diff --git a/ignite-tc-helper-web/src/test/java/org/apache/ignite/ci/di/cache/CachingTest.java b/ignite-tc-helper-web/src/test/java/org/apache/ignite/ci/di/cache/CachingTest.java index ede1feb..b5a2906 100644 --- a/ignite-tc-helper-web/src/test/java/org/apache/ignite/ci/di/cache/CachingTest.java +++ b/ignite-tc-helper-web/src/test/java/org/apache/ignite/ci/di/cache/CachingTest.java @@ -21,6 +21,7 @@ import com.google.inject.Injector; import java.util.concurrent.atomic.AtomicInteger; import org.apache.ignite.tcbot.common.interceptor.GuavaCached; +import org.apache.ignite.tcbot.common.interceptor.GuavaCachedModule; import org.junit.Test; import static org.junit.Assert.assertEquals; diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/di/cache/GuavaCachedModule.java b/tcbot-common/src/main/java/org/apache/ignite/tcbot/common/TcBotCommonModule.java similarity index 65% copy from ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/di/cache/GuavaCachedModule.java copy to tcbot-common/src/main/java/org/apache/ignite/tcbot/common/TcBotCommonModule.java index 393ebb8..bb5e532 100644 --- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/di/cache/GuavaCachedModule.java +++ b/tcbot-common/src/main/java/org/apache/ignite/tcbot/common/TcBotCommonModule.java @@ -14,25 +14,23 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - -package org.apache.ignite.ci.di.cache; +package org.apache.ignite.tcbot.common; import com.google.inject.AbstractModule; -import com.google.inject.matcher.Matchers; -import org.apache.ignite.tcbot.common.interceptor.GuavaCached; +import org.apache.ignite.tcbot.common.interceptor.AutoProfilingInterceptorModule; +import org.apache.ignite.tcbot.common.interceptor.GuavaCachedModule; +import org.apache.ignite.tcbot.common.interceptor.MonitoredTaskInterceptorModule; /** * */ -public class GuavaCachedModule extends AbstractModule { +public class TcBotCommonModule extends AbstractModule { /** {@inheritDoc} */ @Override protected void configure() { - GuavaCachedInterceptor cachedInterceptor = new GuavaCachedInterceptor(); + install(new MonitoredTaskInterceptorModule()); - bindInterceptor(Matchers.any(), - Matchers.annotatedWith(GuavaCached.class), - cachedInterceptor); + install(new AutoProfilingInterceptorModule()); - bind(GuavaCachedInterceptor.class).toInstance(cachedInterceptor); + install(new GuavaCachedModule()); } } diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/di/AutoProfilingInterceptor.java b/tcbot-common/src/main/java/org/apache/ignite/tcbot/common/interceptor/AutoProfilingInterceptor.java similarity index 98% rename from ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/di/AutoProfilingInterceptor.java rename to tcbot-common/src/main/java/org/apache/ignite/tcbot/common/interceptor/AutoProfilingInterceptor.java index fe7709b..fda3d11 100644 --- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/di/AutoProfilingInterceptor.java +++ b/tcbot-common/src/main/java/org/apache/ignite/tcbot/common/interceptor/AutoProfilingInterceptor.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.ignite.ci.di; +package org.apache.ignite.tcbot.common.interceptor; import com.google.common.base.Stopwatch; import java.util.Collection; diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/di/cache/GuavaCachedModule.java b/tcbot-common/src/main/java/org/apache/ignite/tcbot/common/interceptor/AutoProfilingInterceptorModule.java similarity index 68% copy from ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/di/cache/GuavaCachedModule.java copy to tcbot-common/src/main/java/org/apache/ignite/tcbot/common/interceptor/AutoProfilingInterceptorModule.java index 393ebb8..f0448c9 100644 --- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/di/cache/GuavaCachedModule.java +++ b/tcbot-common/src/main/java/org/apache/ignite/tcbot/common/interceptor/AutoProfilingInterceptorModule.java @@ -14,25 +14,23 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - -package org.apache.ignite.ci.di.cache; +package org.apache.ignite.tcbot.common.interceptor; import com.google.inject.AbstractModule; import com.google.inject.matcher.Matchers; -import org.apache.ignite.tcbot.common.interceptor.GuavaCached; -/** - * - */ -public class GuavaCachedModule extends AbstractModule { - /** {@inheritDoc} */ +public class AutoProfilingInterceptorModule extends AbstractModule { @Override protected void configure() { - GuavaCachedInterceptor cachedInterceptor = new GuavaCachedInterceptor(); + configProfiling(); + } + + private void configProfiling() { + AutoProfilingInterceptor profilingInterceptor = new AutoProfilingInterceptor(); bindInterceptor(Matchers.any(), - Matchers.annotatedWith(GuavaCached.class), - cachedInterceptor); + Matchers.annotatedWith(AutoProfiling.class), + profilingInterceptor); - bind(GuavaCachedInterceptor.class).toInstance(cachedInterceptor); + bind(AutoProfilingInterceptor.class).toInstance(profilingInterceptor); } } diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/di/cache/GuavaCachedInterceptor.java b/tcbot-common/src/main/java/org/apache/ignite/tcbot/common/interceptor/GuavaCachedInterceptor.java similarity index 96% rename from ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/di/cache/GuavaCachedInterceptor.java rename to tcbot-common/src/main/java/org/apache/ignite/tcbot/common/interceptor/GuavaCachedInterceptor.java index 5629694..6c0180f 100644 --- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/di/cache/GuavaCachedInterceptor.java +++ b/tcbot-common/src/main/java/org/apache/ignite/tcbot/common/interceptor/GuavaCachedInterceptor.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.ignite.ci.di.cache; +package org.apache.ignite.tcbot.common.interceptor; import com.google.common.base.Preconditions; import com.google.common.base.Throwables; @@ -28,10 +28,9 @@ import java.util.concurrent.Callable; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; import java.util.concurrent.TimeUnit; +import javax.annotation.Nonnull; import org.aopalliance.intercept.MethodInterceptor; import org.aopalliance.intercept.MethodInvocation; -import org.apache.ignite.tcbot.common.interceptor.GuavaCached; -import org.jetbrains.annotations.NotNull; public class GuavaCachedInterceptor implements MethodInterceptor { private final ConcurrentMap<String, Cache<List, Optional>> caches = new ConcurrentHashMap<>(); @@ -95,7 +94,7 @@ public class GuavaCachedInterceptor implements MethodInterceptor { return optional.orElse(null); } - @NotNull + @Nonnull private String cacheId(MethodInvocation invocation) { final Method invocationMtd = invocation.getMethod(); final String cls = invocationMtd.getDeclaringClass().getName(); @@ -103,5 +102,4 @@ public class GuavaCachedInterceptor implements MethodInterceptor { return cls + "." + mtd; } - } diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/di/cache/GuavaCachedModule.java b/tcbot-common/src/main/java/org/apache/ignite/tcbot/common/interceptor/GuavaCachedModule.java similarity index 92% copy from ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/di/cache/GuavaCachedModule.java copy to tcbot-common/src/main/java/org/apache/ignite/tcbot/common/interceptor/GuavaCachedModule.java index 393ebb8..a73cd40 100644 --- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/di/cache/GuavaCachedModule.java +++ b/tcbot-common/src/main/java/org/apache/ignite/tcbot/common/interceptor/GuavaCachedModule.java @@ -15,11 +15,10 @@ * limitations under the License. */ -package org.apache.ignite.ci.di.cache; +package org.apache.ignite.tcbot.common.interceptor; import com.google.inject.AbstractModule; import com.google.inject.matcher.Matchers; -import org.apache.ignite.tcbot.common.interceptor.GuavaCached; /** * diff --git a/tcbot-common/src/main/java/org/apache/ignite/tcbot/common/interceptor/MonitoredTask.java b/tcbot-common/src/main/java/org/apache/ignite/tcbot/common/interceptor/MonitoredTask.java index 2849109..54de520 100644 --- a/tcbot-common/src/main/java/org/apache/ignite/tcbot/common/interceptor/MonitoredTask.java +++ b/tcbot-common/src/main/java/org/apache/ignite/tcbot/common/interceptor/MonitoredTask.java @@ -37,4 +37,9 @@ public @interface MonitoredTask { * Array of Argument indexes (0-based) to be used to extend name. */ int[] nameExtArgsIndexes() default {}; + + /** + * Add log record to monitoring.txt log + */ + boolean log() default true; } diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/di/MonitoredTaskInterceptor.java b/tcbot-common/src/main/java/org/apache/ignite/tcbot/common/interceptor/MonitoredTaskInterceptor.java similarity index 62% rename from ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/di/MonitoredTaskInterceptor.java rename to tcbot-common/src/main/java/org/apache/ignite/tcbot/common/interceptor/MonitoredTaskInterceptor.java index 85a6519..20a5a85 100644 --- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/di/MonitoredTaskInterceptor.java +++ b/tcbot-common/src/main/java/org/apache/ignite/tcbot/common/interceptor/MonitoredTaskInterceptor.java @@ -14,33 +14,69 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.ignite.ci.di; +package org.apache.ignite.tcbot.common.interceptor; import com.google.common.base.Strings; +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; import java.lang.reflect.Method; import java.util.Collection; import java.util.Collections; import java.util.Objects; +import java.util.StringJoiner; import java.util.concurrent.ConcurrentMap; import java.util.concurrent.ConcurrentSkipListMap; +import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicLong; import java.util.concurrent.atomic.AtomicReference; +import javax.annotation.Nonnull; import org.aopalliance.intercept.MethodInterceptor; import org.aopalliance.intercept.MethodInvocation; -import org.apache.ignite.tcbot.common.interceptor.MonitoredTask; +import org.apache.ignite.tcbot.common.conf.TcBotWorkDir; import org.apache.ignite.tcbot.common.util.TimeUtil; -import org.jetbrains.annotations.NotNull; -public class MonitoredTaskInterceptor implements MethodInterceptor { +import static org.apache.ignite.tcbot.common.util.TimeUtil.timestampForLogsSimpleDate; + +public class MonitoredTaskInterceptor implements MethodInterceptor, AutoCloseable { private final ConcurrentMap<String, Invocation> totalTime = new ConcurrentSkipListMap<>(); + private FileWriter fileWriter; + + private final AtomicBoolean init = new AtomicBoolean(); + + public void initLogging() { + try { + final File workDir = TcBotWorkDir.resolveWorkDir(); + File tcbotLogs = new File(workDir, "tcbot_logs"); + File file = new File(tcbotLogs, "monitoring"+ + timestampForLogsSimpleDate(System.currentTimeMillis())+".log"); + + if (!tcbotLogs.exists()) + file.mkdirs(); + + fileWriter = new FileWriter(file); + } + catch (IOException e) { + e.printStackTrace(); + } + } + + /** {@inheritDoc} */ + @Override public void close() throws Exception { + if (fileWriter != null) + fileWriter.close(); + fileWriter = null; + } + public static class Invocation { private final AtomicLong lastStartTs = new AtomicLong(); private final AtomicLong lastEndTs = new AtomicLong(); private final AtomicReference<Object> lastResult = new AtomicReference<>(); private final AtomicInteger callsCnt = new AtomicInteger(); + /** Name and full key for monitored task. */ private String name; Invocation(String name) { @@ -95,18 +131,34 @@ public class MonitoredTaskInterceptor implements MethodInterceptor { return Objects.toString(lastResult.get()); } + + /** {@inheritDoc} */ + @Override public String toString() { + return new StringJoiner(", ", Invocation.class.getSimpleName() + "[", "]") + .add("name='" + name + "'") + .add("startTs=" + lastStartTs) + .add("endTs=" + lastEndTs) + .add("result=" + lastResult) + .add("callsCnt=" + callsCnt) + .toString(); + } } /** {@inheritDoc} */ @Override public Object invoke(MethodInvocation invocation) throws Throwable { - final long startTs = System.currentTimeMillis(); + if(init.compareAndSet(false,true)) + initLogging(); - String fullKey = taskName(invocation); + final long startTs = System.currentTimeMillis(); - final Invocation monitoredInvoke = totalTime.computeIfAbsent(fullKey, Invocation::new); + TaskSettings settings = taskName(invocation); + final Invocation monitoredInvoke = totalTime.computeIfAbsent(settings.name, Invocation::new); monitoredInvoke.saveStart(startTs); + if (settings.log) + log(monitoredInvoke.toString(), -1); + Object res = null; try { res = invocation.proceed(); @@ -119,18 +171,56 @@ public class MonitoredTaskInterceptor implements MethodInterceptor { throw t; } finally { - monitoredInvoke.saveEnd(System.currentTimeMillis(), res); + long end = System.currentTimeMillis(); + monitoredInvoke.saveEnd(end, res); + + if (settings.log) + log(monitoredInvoke.toString(), end - startTs); } } - @NotNull - private String taskName(MethodInvocation invocation) { + public void log(String str, long duration) { + if (fileWriter == null) + return; + + try { + StringBuilder sb = new StringBuilder(); + sb.append(str); + + if (duration > 1) { + sb.append(", duration: "); + sb.append(TimeUtil.millisToDurationPrintable(duration)); + } + + sb.append(String.format("%n")); + + fileWriter.write(sb.toString()); + fileWriter.flush(); + } + catch (IOException e) { + e.printStackTrace(); + } + } + + private static class TaskSettings { + private final String name; + private final boolean log; + + public TaskSettings(String name, boolean log) { + this.name = name; + this.log = log; + } + } + + @Nonnull + private TaskSettings taskName(MethodInvocation invocation) { final Method invocationMtd = invocation.getMethod(); final String cls = invocationMtd.getDeclaringClass().getSimpleName(); final String mtd = invocationMtd.getName(); StringBuilder fullKey = new StringBuilder(); + boolean log; final MonitoredTask annotation = invocationMtd.getAnnotation(MonitoredTask.class); if (annotation != null) { String activityName = annotation.name(); @@ -160,11 +250,19 @@ public class MonitoredTaskInterceptor implements MethodInterceptor { } } + if (annotation.log()) + log = true; + else + log = false; + } - else + else { fullKey.append(cls).append(".").append(mtd); - return fullKey.toString(); + log = false; + } + + return new TaskSettings(fullKey.toString(), log); } public Collection<Invocation> getList() { diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/di/cache/GuavaCachedModule.java b/tcbot-common/src/main/java/org/apache/ignite/tcbot/common/interceptor/MonitoredTaskInterceptorModule.java similarity index 68% rename from ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/di/cache/GuavaCachedModule.java rename to tcbot-common/src/main/java/org/apache/ignite/tcbot/common/interceptor/MonitoredTaskInterceptorModule.java index 393ebb8..10cd706 100644 --- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/di/cache/GuavaCachedModule.java +++ b/tcbot-common/src/main/java/org/apache/ignite/tcbot/common/interceptor/MonitoredTaskInterceptorModule.java @@ -14,25 +14,24 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - -package org.apache.ignite.ci.di.cache; +package org.apache.ignite.tcbot.common.interceptor; import com.google.inject.AbstractModule; import com.google.inject.matcher.Matchers; -import org.apache.ignite.tcbot.common.interceptor.GuavaCached; -/** - * - */ -public class GuavaCachedModule extends AbstractModule { - /** {@inheritDoc} */ +public class MonitoredTaskInterceptorModule extends AbstractModule { @Override protected void configure() { - GuavaCachedInterceptor cachedInterceptor = new GuavaCachedInterceptor(); + configTaskMonitor(); + } + + private void configTaskMonitor() { + MonitoredTaskInterceptor profilingInterceptor = new MonitoredTaskInterceptor(); bindInterceptor(Matchers.any(), - Matchers.annotatedWith(GuavaCached.class), - cachedInterceptor); + Matchers.annotatedWith(MonitoredTask.class), + profilingInterceptor); - bind(GuavaCachedInterceptor.class).toInstance(cachedInterceptor); + bind(MonitoredTaskInterceptor.class).toInstance(profilingInterceptor); } + } diff --git a/tcbot-common/src/main/java/org/apache/ignite/tcbot/common/util/TimeUtil.java b/tcbot-common/src/main/java/org/apache/ignite/tcbot/common/util/TimeUtil.java index 82ae16e..c596ab2 100644 --- a/tcbot-common/src/main/java/org/apache/ignite/tcbot/common/util/TimeUtil.java +++ b/tcbot-common/src/main/java/org/apache/ignite/tcbot/common/util/TimeUtil.java @@ -94,4 +94,8 @@ public class TimeUtil { public static String timestampToTcSimpleDate(long ts) { return new SimpleDateFormat("yyyyMMdd'T'HHmmssZ").format(new Date(ts)); } + + public static String timestampForLogsSimpleDate(long ts) { + return new SimpleDateFormat("yyyyMMdd-HHmmss").format(new Date(ts)); + } } diff --git a/tcbot-engine/src/main/java/org/apache/ignite/tcbot/engine/TcBotEngineModule.java b/tcbot-engine/src/main/java/org/apache/ignite/tcbot/engine/TcBotEngineModule.java index 3b8dd80..44a9465 100644 --- a/tcbot-engine/src/main/java/org/apache/ignite/tcbot/engine/TcBotEngineModule.java +++ b/tcbot-engine/src/main/java/org/apache/ignite/tcbot/engine/TcBotEngineModule.java @@ -19,6 +19,9 @@ package org.apache.ignite.tcbot.engine; import com.google.inject.AbstractModule; import com.google.inject.internal.SingletonScope; +import org.apache.ignite.tcbot.common.TcBotCommonModule; +import org.apache.ignite.tcbot.common.interceptor.MonitoredTaskInterceptorModule; +import org.apache.ignite.tcbot.engine.buildtime.BuildTimeService; import org.apache.ignite.tcbot.engine.chain.BuildChainProcessor; import org.apache.ignite.tcbot.engine.tracked.IDetailedStatusForTrackedBranch; import org.apache.ignite.tcbot.engine.tracked.TrackedBranchChainsProcessor; @@ -31,5 +34,9 @@ public class TcBotEngineModule extends AbstractModule { @Override protected void configure() { bind(BuildChainProcessor.class).in(new SingletonScope()); bind(IDetailedStatusForTrackedBranch.class).to(TrackedBranchChainsProcessor.class).in(new SingletonScope()); + + bind(BuildTimeService.class).in(new SingletonScope()); + + install(new TcBotCommonModule()); } } \ No newline at end of file diff --git a/tcbot-persistence/src/main/java/org/apache/ignite/tcbot/persistence/scheduler/TcBotScheduler.java b/tcbot-persistence/src/main/java/org/apache/ignite/tcbot/persistence/scheduler/TcBotScheduler.java index 5728e0e..495cb2d 100644 --- a/tcbot-persistence/src/main/java/org/apache/ignite/tcbot/persistence/scheduler/TcBotScheduler.java +++ b/tcbot-persistence/src/main/java/org/apache/ignite/tcbot/persistence/scheduler/TcBotScheduler.java @@ -81,7 +81,7 @@ class TcBotScheduler implements IScheduler { * @param threadNme Runner name to be used in display. */ @SuppressWarnings({"UnusedReturnValue", "WeakerAccess"}) - @MonitoredTask(name = "Scheduled", nameExtArgIndex = 0) + @MonitoredTask(name = "Scheduled", nameExtArgIndex = 0, log = false) protected String checkNamedTasks(String threadNme) { AtomicInteger run = new AtomicInteger(); List<Throwable> problems = new ArrayList<>();