Skip to content

Commit

Permalink
SONAR-6194 SONAR-5009 profiling api + unique property sonar.log.level
Browse files Browse the repository at this point in the history
  • Loading branch information
Simon Brandhof committed Feb 19, 2015
1 parent 6adb553 commit d5a8ab3
Show file tree
Hide file tree
Showing 113 changed files with 1,566 additions and 1,450 deletions.
Expand Up @@ -198,11 +198,6 @@ sonar.jdbc.timeBetweenEvictionRunsMillis=30000
#sonar.notifications.delay=60 #sonar.notifications.delay=60




#--------------------------------------------------------------------------------------------------
# PROFILING
# Level of information displayed in the logs: NONE (default), BASIC (functional information) and FULL (functional and technical details)
#sonar.log.profilingLevel=NONE



#-------------------------------------------------------------------------------------------------- #--------------------------------------------------------------------------------------------------
# DEVELOPMENT MODE # DEVELOPMENT MODE
Expand Down
Expand Up @@ -198,11 +198,6 @@ sonar.jdbc.timeBetweenEvictionRunsMillis=30000
#sonar.notifications.delay=60 #sonar.notifications.delay=60




#--------------------------------------------------------------------------------------------------
# PROFILING
# Level of information displayed in the logs: NONE (default), BASIC (functional information) and FULL (functional and technical details)
#sonar.log.profilingLevel=NONE



#-------------------------------------------------------------------------------------------------- #--------------------------------------------------------------------------------------------------
# DEVELOPMENT MODE # DEVELOPMENT MODE
Expand Down
Expand Up @@ -24,6 +24,7 @@
import ch.qos.logback.classic.LoggerContext; import ch.qos.logback.classic.LoggerContext;
import ch.qos.logback.core.ConsoleAppender; import ch.qos.logback.core.ConsoleAppender;
import org.slf4j.bridge.SLF4JBridgeHandler; import org.slf4j.bridge.SLF4JBridgeHandler;
import org.sonar.api.utils.MessageException;
import org.sonar.process.LogbackHelper; import org.sonar.process.LogbackHelper;
import org.sonar.process.Props; import org.sonar.process.Props;


Expand All @@ -35,7 +36,8 @@
*/ */
class WebLogging { class WebLogging {


private static final String LOG_FORMAT = "%d{yyyy.MM.dd HH:mm:ss} %-5level web[%logger{20}] %X %msg%n"; private static final String LOG_FORMAT = "%d{yyyy.MM.dd HH:mm:ss} %-5level web[%logger{20}] %msg%n";
public static final String LOG_LEVEL_PROPERTY = "sonar.log.level";


private final LogbackHelper helper = new LogbackHelper(); private final LogbackHelper helper = new LogbackHelper();


Expand Down Expand Up @@ -72,7 +74,17 @@ private void configureLevels(LoggerContext ctx, Props props) {
helper.configureLogger(ctx, "org.elasticsearch.node", Level.INFO); helper.configureLogger(ctx, "org.elasticsearch.node", Level.INFO);
helper.configureLogger(ctx, "org.elasticsearch.http", Level.INFO); helper.configureLogger(ctx, "org.elasticsearch.http", Level.INFO);
helper.configureLogger(ctx, "ch.qos.logback", Level.WARN); helper.configureLogger(ctx, "ch.qos.logback", Level.WARN);
boolean debug = props.valueAsBoolean("sonar.log.debug", false); String levelCode = props.value(LOG_LEVEL_PROPERTY, "INFO");
helper.configureLogger(ctx, Logger.ROOT_LOGGER_NAME, debug ? Level.DEBUG : Level.INFO); Level level;
if ("TRACE".equals(levelCode)) {
level = Level.TRACE;
} else if ("DEBUG".equals(levelCode)) {
level = Level.DEBUG;
} else if ("INFO".equals(levelCode)) {
level = Level.INFO;
} else {
throw MessageException.of(String.format("Unsupported log level: %s. Please check property %s", levelCode, LOG_LEVEL_PROPERTY));
}
helper.configureLogger(ctx, Logger.ROOT_LOGGER_NAME, level);
} }
} }
Expand Up @@ -22,11 +22,11 @@


import com.google.common.base.Throwables; import com.google.common.base.Throwables;
import org.apache.commons.lang.ArrayUtils; import org.apache.commons.lang.ArrayUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.sonar.api.ServerComponent; import org.sonar.api.ServerComponent;
import org.sonar.api.utils.System2; import org.sonar.api.utils.System2;
import org.sonar.api.utils.TimeProfiler; import org.sonar.api.utils.TimeProfiler;
import org.sonar.api.utils.log.Logger;
import org.sonar.api.utils.log.Loggers;
import org.sonar.core.activity.Activity; import org.sonar.core.activity.Activity;
import org.sonar.core.component.ComponentDto; import org.sonar.core.component.ComponentDto;
import org.sonar.core.computation.db.AnalysisReportDto; import org.sonar.core.computation.db.AnalysisReportDto;
Expand All @@ -39,7 +39,7 @@


public class ComputationService implements ServerComponent { public class ComputationService implements ServerComponent {


private static final Logger LOG = Loggers.get(ComputationService.class); private static final Logger LOG = LoggerFactory.getLogger(ComputationService.class);


private final DbClient dbClient; private final DbClient dbClient;
private final ComputationSteps steps; private final ComputationSteps steps;
Expand Down
72 changes: 45 additions & 27 deletions server/sonar-server/src/main/java/org/sonar/server/es/EsClient.java
Expand Up @@ -48,8 +48,28 @@
import org.elasticsearch.search.aggregations.AggregationBuilders; import org.elasticsearch.search.aggregations.AggregationBuilders;
import org.elasticsearch.search.aggregations.metrics.max.Max; import org.elasticsearch.search.aggregations.metrics.max.Max;
import org.picocontainer.Startable; import org.picocontainer.Startable;
import org.sonar.core.profiling.Profiling; import org.sonar.api.utils.log.Logger;
import org.sonar.server.es.request.*; import org.sonar.api.utils.log.Loggers;
import org.sonar.server.es.request.ProxyBulkRequestBuilder;
import org.sonar.server.es.request.ProxyClearCacheRequestBuilder;
import org.sonar.server.es.request.ProxyClusterHealthRequestBuilder;
import org.sonar.server.es.request.ProxyClusterStateRequestBuilder;
import org.sonar.server.es.request.ProxyClusterStatsRequestBuilder;
import org.sonar.server.es.request.ProxyCountRequestBuilder;
import org.sonar.server.es.request.ProxyCreateIndexRequestBuilder;
import org.sonar.server.es.request.ProxyDeleteByQueryRequestBuilder;
import org.sonar.server.es.request.ProxyDeleteRequestBuilder;
import org.sonar.server.es.request.ProxyFlushRequestBuilder;
import org.sonar.server.es.request.ProxyGetRequestBuilder;
import org.sonar.server.es.request.ProxyIndexRequestBuilder;
import org.sonar.server.es.request.ProxyIndicesExistsRequestBuilder;
import org.sonar.server.es.request.ProxyIndicesStatsRequestBuilder;
import org.sonar.server.es.request.ProxyMultiGetRequestBuilder;
import org.sonar.server.es.request.ProxyNodesStatsRequestBuilder;
import org.sonar.server.es.request.ProxyPutMappingRequestBuilder;
import org.sonar.server.es.request.ProxyRefreshRequestBuilder;
import org.sonar.server.es.request.ProxySearchRequestBuilder;
import org.sonar.server.es.request.ProxySearchScrollRequestBuilder;
import org.sonar.server.search.ClusterHealth; import org.sonar.server.search.ClusterHealth;
import org.sonar.server.search.SearchClient; import org.sonar.server.search.SearchClient;


Expand All @@ -59,16 +79,14 @@
*/ */
public class EsClient implements Startable { public class EsClient implements Startable {


private final Profiling profiling; public static final Logger LOGGER = Loggers.get("es");
private final Client client; private final Client client;


public EsClient(SearchClient deprecatedClient) { public EsClient(SearchClient deprecatedClient) {
this.profiling = deprecatedClient.getProfiling();
this.client = deprecatedClient; this.client = deprecatedClient;
} }


EsClient(Profiling profiling, Client client) { EsClient(Client client) {
this.profiling = profiling;
this.client = client; this.client = client;
} }


Expand All @@ -86,87 +104,87 @@ public ClusterHealth getClusterHealth() {
} }


public RefreshRequestBuilder prepareRefresh(String... indices) { public RefreshRequestBuilder prepareRefresh(String... indices) {
return new ProxyRefreshRequestBuilder(client, profiling).setIndices(indices); return new ProxyRefreshRequestBuilder(client).setIndices(indices);
} }


public FlushRequestBuilder prepareFlush(String... indices) { public FlushRequestBuilder prepareFlush(String... indices) {
return new ProxyFlushRequestBuilder(client, profiling).setIndices(indices); return new ProxyFlushRequestBuilder(client).setIndices(indices);
} }


public IndicesStatsRequestBuilder prepareStats(String... indices) { public IndicesStatsRequestBuilder prepareStats(String... indices) {
return new ProxyIndicesStatsRequestBuilder(client, profiling).setIndices(indices); return new ProxyIndicesStatsRequestBuilder(client).setIndices(indices);
} }


public NodesStatsRequestBuilder prepareNodesStats(String... nodesIds) { public NodesStatsRequestBuilder prepareNodesStats(String... nodesIds) {
return new ProxyNodesStatsRequestBuilder(client, profiling).setNodesIds(nodesIds); return new ProxyNodesStatsRequestBuilder(client).setNodesIds(nodesIds);
} }


public ClusterStatsRequestBuilder prepareClusterStats() { public ClusterStatsRequestBuilder prepareClusterStats() {
return new ProxyClusterStatsRequestBuilder(client, profiling); return new ProxyClusterStatsRequestBuilder(client);
} }


public ClusterStateRequestBuilder prepareState() { public ClusterStateRequestBuilder prepareState() {
return new ProxyClusterStateRequestBuilder(client, profiling); return new ProxyClusterStateRequestBuilder(client);
} }


public ClusterHealthRequestBuilder prepareHealth(String... indices) { public ClusterHealthRequestBuilder prepareHealth(String... indices) {
return new ProxyClusterHealthRequestBuilder(client, profiling).setIndices(indices); return new ProxyClusterHealthRequestBuilder(client).setIndices(indices);
} }


public void waitForStatus(ClusterHealthStatus status) { public void waitForStatus(ClusterHealthStatus status) {
prepareHealth().setWaitForEvents(Priority.LANGUID).setWaitForStatus(status).get(); prepareHealth().setWaitForEvents(Priority.LANGUID).setWaitForStatus(status).get();
} }


public IndicesExistsRequestBuilder prepareIndicesExist(String... indices) { public IndicesExistsRequestBuilder prepareIndicesExist(String... indices) {
return new ProxyIndicesExistsRequestBuilder(client, profiling, indices); return new ProxyIndicesExistsRequestBuilder(client, indices);
} }


public CreateIndexRequestBuilder prepareCreate(String index) { public CreateIndexRequestBuilder prepareCreate(String index) {
return new ProxyCreateIndexRequestBuilder(client, profiling, index); return new ProxyCreateIndexRequestBuilder(client, index);
} }


public PutMappingRequestBuilder preparePutMapping(String... indices) { public PutMappingRequestBuilder preparePutMapping(String... indices) {
return new ProxyPutMappingRequestBuilder(client, profiling).setIndices(indices); return new ProxyPutMappingRequestBuilder(client).setIndices(indices);
} }


public SearchRequestBuilder prepareSearch(String... indices) { public SearchRequestBuilder prepareSearch(String... indices) {
return new ProxySearchRequestBuilder(client, profiling).setIndices(indices); return new ProxySearchRequestBuilder(client).setIndices(indices);
} }


public SearchScrollRequestBuilder prepareSearchScroll(String scrollId) { public SearchScrollRequestBuilder prepareSearchScroll(String scrollId) {
return new ProxySearchScrollRequestBuilder(scrollId, client, profiling); return new ProxySearchScrollRequestBuilder(scrollId, client);
} }


public GetRequestBuilder prepareGet() { public GetRequestBuilder prepareGet() {
return new ProxyGetRequestBuilder(client, profiling); return new ProxyGetRequestBuilder(client);
} }


public GetRequestBuilder prepareGet(String index, String type, String id) { public GetRequestBuilder prepareGet(String index, String type, String id) {
return new ProxyGetRequestBuilder(client, profiling).setIndex(index).setType(type).setId(id); return new ProxyGetRequestBuilder(client).setIndex(index).setType(type).setId(id);
} }


public MultiGetRequestBuilder prepareMultiGet() { public MultiGetRequestBuilder prepareMultiGet() {
return new ProxyMultiGetRequestBuilder(client, profiling); return new ProxyMultiGetRequestBuilder(client);
} }


public CountRequestBuilder prepareCount(String... indices) { public CountRequestBuilder prepareCount(String... indices) {
return new ProxyCountRequestBuilder(client, profiling).setIndices(indices); return new ProxyCountRequestBuilder(client).setIndices(indices);
} }


public BulkRequestBuilder prepareBulk() { public BulkRequestBuilder prepareBulk() {
return new ProxyBulkRequestBuilder(client, profiling); return new ProxyBulkRequestBuilder(client);
} }


public DeleteRequestBuilder prepareDelete(String index, String type, String id) { public DeleteRequestBuilder prepareDelete(String index, String type, String id) {
return new ProxyDeleteRequestBuilder(profiling, client, index).setType(type).setId(id); return new ProxyDeleteRequestBuilder(client, index).setType(type).setId(id);
} }


public DeleteByQueryRequestBuilder prepareDeleteByQuery(String... indices) { public DeleteByQueryRequestBuilder prepareDeleteByQuery(String... indices) {
return new ProxyDeleteByQueryRequestBuilder(client, profiling).setIndices(indices); return new ProxyDeleteByQueryRequestBuilder(client).setIndices(indices);
} }


public IndexRequestBuilder prepareIndex(String index, String type) { public IndexRequestBuilder prepareIndex(String index, String type) {
return new ProxyIndexRequestBuilder(client, profiling).setIndex(index).setType(type); return new ProxyIndexRequestBuilder(client).setIndex(index).setType(type);
} }


public OptimizeRequestBuilder prepareOptimize(String indexName) { public OptimizeRequestBuilder prepareOptimize(String indexName) {
Expand All @@ -177,7 +195,7 @@ public OptimizeRequestBuilder prepareOptimize(String indexName) {
} }


public ClearIndicesCacheRequestBuilder prepareClearCache(String... indices) { public ClearIndicesCacheRequestBuilder prepareClearCache(String... indices) {
return new ProxyClearCacheRequestBuilder(client, profiling).setIndices(indices); return new ProxyClearCacheRequestBuilder(client).setIndices(indices);
} }


public long getLastUpdatedAt(String indexName, String typeName) { public long getLastUpdatedAt(String indexName, String typeName) {
Expand Down
Expand Up @@ -22,8 +22,6 @@


import com.google.common.collect.HashMultiset; import com.google.common.collect.HashMultiset;
import com.google.common.collect.Multiset.Entry; import com.google.common.collect.Multiset.Entry;
import org.apache.commons.lang.builder.EqualsBuilder;
import org.apache.commons.lang.builder.HashCodeBuilder;
import org.elasticsearch.action.ActionRequest; import org.elasticsearch.action.ActionRequest;
import org.elasticsearch.action.ListenableActionFuture; import org.elasticsearch.action.ListenableActionFuture;
import org.elasticsearch.action.bulk.BulkRequestBuilder; import org.elasticsearch.action.bulk.BulkRequestBuilder;
Expand All @@ -33,30 +31,27 @@
import org.elasticsearch.action.update.UpdateRequest; import org.elasticsearch.action.update.UpdateRequest;
import org.elasticsearch.client.Client; import org.elasticsearch.client.Client;
import org.elasticsearch.common.unit.TimeValue; import org.elasticsearch.common.unit.TimeValue;
import org.sonar.core.profiling.Profiling; import org.sonar.api.utils.log.Profiler;
import org.sonar.core.profiling.StopWatch; import org.sonar.server.es.EsClient;


import java.util.Set; import java.util.Set;


public class ProxyBulkRequestBuilder extends BulkRequestBuilder { public class ProxyBulkRequestBuilder extends BulkRequestBuilder {


private final Profiling profiling; public ProxyBulkRequestBuilder(Client client) {

public ProxyBulkRequestBuilder(Client client, Profiling profiling) {
super(client); super(client);
this.profiling = profiling;
} }


@Override @Override
public BulkResponse get() { public BulkResponse get() {
StopWatch fullProfile = profiling.start("bulk", Profiling.Level.FULL); Profiler profiler = Profiler.createIfTrace(EsClient.LOGGER).start();
try { try {
return super.execute().actionGet(); return super.execute().actionGet();
} catch (Exception e) { } catch (Exception e) {
throw new IllegalStateException(String.format("Fail to execute %s", toString()), e); throw new IllegalStateException(String.format("Fail to execute %s", toString()), e);
} finally { } finally {
if (profiling.isProfilingEnabled(Profiling.Level.BASIC)) { if (profiler.isTraceEnabled()) {
fullProfile.stop("%s", toString()); profiler.stopTrace(toString());
} }
} }
} }
Expand Down Expand Up @@ -86,7 +81,7 @@ public String toString() {
StringBuilder message = new StringBuilder(); StringBuilder message = new StringBuilder();
message.append("Bulk["); message.append("Bulk[");
HashMultiset<BulkRequestKey> groupedRequests = HashMultiset.create(); HashMultiset<BulkRequestKey> groupedRequests = HashMultiset.create();
for (int i=0 ; i<request.requests().size() ; i++) { for (int i = 0; i < request.requests().size(); i++) {
ActionRequest item = request.requests().get(i); ActionRequest item = request.requests().get(i);
String requestType, index, docType; String requestType, index, docType;
if (item instanceof IndexRequest) { if (item instanceof IndexRequest) {
Expand Down Expand Up @@ -138,13 +133,29 @@ private BulkRequestKey(String requestType, String index, String docType) {
} }


@Override @Override
public boolean equals(Object obj) { public boolean equals(Object o) {
return EqualsBuilder.reflectionEquals(this, obj); if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
BulkRequestKey that = (BulkRequestKey) o;
if (!docType.equals(that.docType)) {
return false;
}
if (!index.equals(that.index)) {
return false;
}
return requestType.equals(that.requestType);
} }


@Override @Override
public int hashCode() { public int hashCode() {
return HashCodeBuilder.reflectionHashCode(this); int result = requestType.hashCode();
result = 31 * result + index.hashCode();
result = 31 * result + docType.hashCode();
return result;
} }


@Override @Override
Expand Down
Expand Up @@ -26,28 +26,25 @@
import org.elasticsearch.action.admin.indices.cache.clear.ClearIndicesCacheResponse; import org.elasticsearch.action.admin.indices.cache.clear.ClearIndicesCacheResponse;
import org.elasticsearch.client.Client; import org.elasticsearch.client.Client;
import org.elasticsearch.common.unit.TimeValue; import org.elasticsearch.common.unit.TimeValue;
import org.sonar.core.profiling.Profiling; import org.sonar.api.utils.log.Profiler;
import org.sonar.core.profiling.StopWatch; import org.sonar.server.es.EsClient;


public class ProxyClearCacheRequestBuilder extends ClearIndicesCacheRequestBuilder { public class ProxyClearCacheRequestBuilder extends ClearIndicesCacheRequestBuilder {


private final Profiling profiling; public ProxyClearCacheRequestBuilder(Client client) {

public ProxyClearCacheRequestBuilder(Client client, Profiling profiling) {
super(client.admin().indices()); super(client.admin().indices());
this.profiling = profiling;
} }


@Override @Override
public ClearIndicesCacheResponse get() { public ClearIndicesCacheResponse get() {
StopWatch fullProfile = profiling.start("clear cache", Profiling.Level.FULL); Profiler profiler = Profiler.createIfTrace(EsClient.LOGGER).start();
try { try {
return super.execute().actionGet(); return super.execute().actionGet();
} catch (Exception e) { } catch (Exception e) {
throw new IllegalStateException(String.format("Fail to execute %s", toString()), e); throw new IllegalStateException(String.format("Fail to execute %s", toString()), e);
} finally { } finally {
if (profiling.isProfilingEnabled(Profiling.Level.FULL)) { if (profiler.isTraceEnabled()) {
fullProfile.stop("%s", toString()); profiler.stopTrace(toString());
} }
} }
} }
Expand Down

0 comments on commit d5a8ab3

Please sign in to comment.