This is an automated email from the ASF dual-hosted git repository. wusheng pushed a commit to branch log in repository https://gitbox.apache.org/repos/asf/incubator-skywalking.git
The following commit(s) were added to refs/heads/log by this push: new 1a82915 Submit the draft codes of logs. 1a82915 is described below commit 1a82915665f4f51532b4410ec408c6d208d3c34e Author: Wu Sheng <wu.sh...@foxmail.com> AuthorDate: Wed Apr 3 23:33:28 2019 -0700 Submit the draft codes of logs. --- .../oap/server/core/CoreModuleProvider.java | 1 + .../analysis/manual/log/AbstractLogRecord.java | 9 +- .../manual/log/HTTPAccessLogDispatcher.java | 2 + .../oap/server/core/query/LogQueryService.java | 91 +++++++++++++++ .../oap/server/core/query/entity/Logs.java | 6 +- .../oap/server/core/source/AbstractLog.java | 3 +- .../oap/server/core/storage/StorageModule.java | 2 +- .../server/core/storage/query/ILogQueryDAO.java} | 20 +--- .../oap/query/graphql/resolver/LogQuery.java | 22 +++- .../oap/query/graphql/type/LogQueryCondition.java | 7 +- .../StorageModuleElasticsearchProvider.java | 51 ++------- .../plugin/elasticsearch/query/LogQueryEsDAO.java | 100 +++++++++++++++++ .../storage/plugin/jdbc/h2/H2StorageProvider.java | 1 + .../storage/plugin/jdbc/h2/dao/H2LogQueryDAO.java | 123 +++++++++++++++++++++ .../plugin/jdbc/h2/dao/H2TraceQueryDAO.java | 6 +- .../plugin/jdbc/mysql/MySQLLogQueryDAO.java} | 24 ++-- .../plugin/jdbc/mysql/MySQLStorageProvider.java | 1 + .../plugin/jdbc/mysql/MySQLTraceQueryDAO.java | 101 +---------------- 18 files changed, 392 insertions(+), 178 deletions(-) diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/CoreModuleProvider.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/CoreModuleProvider.java index 0cfe991..9b677ec 100644 --- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/CoreModuleProvider.java +++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/CoreModuleProvider.java @@ -145,6 +145,7 @@ public class CoreModuleProvider extends ModuleProvider { this.registerServiceImplementation(TopologyQueryService.class, new TopologyQueryService(getManager())); this.registerServiceImplementation(MetricQueryService.class, new MetricQueryService(getManager())); this.registerServiceImplementation(TraceQueryService.class, new TraceQueryService(getManager())); + this.registerServiceImplementation(LogQueryService.class, new LogQueryService(getManager())); this.registerServiceImplementation(MetadataQueryService.class, new MetadataQueryService(getManager())); this.registerServiceImplementation(AggregationQueryService.class, new AggregationQueryService(getManager())); this.registerServiceImplementation(AlarmQueryService.class, new AlarmQueryService(getManager())); diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/log/AbstractLogRecord.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/log/AbstractLogRecord.java index 6e29f82..21c6d50 100644 --- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/log/AbstractLogRecord.java +++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/log/AbstractLogRecord.java @@ -39,6 +39,7 @@ public abstract class AbstractLogRecord extends Record { public static final String STATUS_CODE = "status_code"; public static final String CONTENT_TYPE = "content_type"; public static final String CONTENT = "content"; + public static final String TIMESTAMP = "timestamp"; @Setter @Getter @Column(columnName = SERVICE_ID) private int serviceId; @Setter @Getter @Column(columnName = SERVICE_INSTANCE_ID) private int serviceInstanceId; @@ -47,6 +48,7 @@ public abstract class AbstractLogRecord extends Record { @Setter @Getter @Column(columnName = STATUS_CODE) private String statusCode; @Setter @Getter @Column(columnName = CONTENT_TYPE) private int contentType = ContentType.NONE.value(); @Setter @Getter @Column(columnName = CONTENT) private String content; + @Setter @Getter @Column(columnName = TIMESTAMP) private long timestamp; @Override public String id() { throw new UnexpectedException("AbstractLogRecord doesn't provide id()"); @@ -59,8 +61,10 @@ public abstract class AbstractLogRecord extends Record { record.setEndpointId(((Number)dbMap.get(ENDPOINT_ID)).intValue()); record.setIsError(((Number)dbMap.get(IS_ERROR)).intValue()); record.setStatusCode((String)dbMap.get(STATUS_CODE)); - record.setIsError(((Number)dbMap.get(CONTENT_TYPE)).intValue()); - record.setStatusCode((String)dbMap.get(CONTENT)); + record.setContentType(((Number)dbMap.get(CONTENT_TYPE)).intValue()); + record.setContent((String)dbMap.get(CONTENT)); + record.setTimestamp(((Number)dbMap.get(TIMESTAMP)).longValue()); + record.setTimeBucket(((Number)dbMap.get(TIME_BUCKET)).longValue()); } @Override public Map<String, Object> data2Map(AbstractLogRecord record) { @@ -73,6 +77,7 @@ public abstract class AbstractLogRecord extends Record { map.put(TIME_BUCKET, record.getTimeBucket()); map.put(CONTENT_TYPE, record.getContentType()); map.put(CONTENT, record.getContent()); + map.put(TIMESTAMP, record.getTimestamp()); return map; } } diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/log/HTTPAccessLogDispatcher.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/log/HTTPAccessLogDispatcher.java index 58e53b9..59fca35 100644 --- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/log/HTTPAccessLogDispatcher.java +++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/log/HTTPAccessLogDispatcher.java @@ -28,6 +28,8 @@ import org.apache.skywalking.oap.server.core.source.HTTPAccessLog; public class HTTPAccessLogDispatcher implements SourceDispatcher<HTTPAccessLog> { @Override public void dispatch(HTTPAccessLog source) { HTTPAccessLogRecord record = new HTTPAccessLogRecord(); + record.setTimestamp(source.getTimestamp()); + record.setTimeBucket(source.getTimeBucket()); record.setServiceId(source.getServiceId()); record.setServiceInstanceId(source.getServiceInstanceId()); record.setEndpointId(source.getEndpointId()); diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/LogQueryService.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/LogQueryService.java new file mode 100644 index 0000000..888b323 --- /dev/null +++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/LogQueryService.java @@ -0,0 +1,91 @@ +/* + * 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.skywalking.oap.server.core.query; + +import java.io.IOException; +import org.apache.skywalking.oap.server.core.*; +import org.apache.skywalking.oap.server.core.cache.*; +import org.apache.skywalking.oap.server.core.query.entity.*; +import org.apache.skywalking.oap.server.core.storage.StorageModule; +import org.apache.skywalking.oap.server.core.storage.query.*; +import org.apache.skywalking.oap.server.library.module.*; +import org.apache.skywalking.oap.server.library.module.Service; + +/** + * @author wusheng + */ +public class LogQueryService implements Service { + private final ModuleManager moduleManager; + private ILogQueryDAO logQueryDAO; + private ServiceInventoryCache serviceInventoryCache; + private ServiceInstanceInventoryCache serviceInstanceInventoryCache; + private EndpointInventoryCache endpointInventoryCache; + + public LogQueryService(ModuleManager moduleManager) { + this.moduleManager = moduleManager; + } + + private ILogQueryDAO getLogQueryDAO() { + if (logQueryDAO == null) { + this.logQueryDAO = moduleManager.find(StorageModule.NAME).provider().getService(ILogQueryDAO.class); + } + return logQueryDAO; + } + + private ServiceInventoryCache getServiceInventoryCache() { + if (serviceInventoryCache == null) { + this.serviceInventoryCache = moduleManager.find(CoreModule.NAME).provider().getService(ServiceInventoryCache.class); + } + return serviceInventoryCache; + } + + private ServiceInstanceInventoryCache getServiceInstanceInventoryCache() { + if (serviceInstanceInventoryCache == null) { + this.serviceInstanceInventoryCache = moduleManager.find(CoreModule.NAME).provider().getService(ServiceInstanceInventoryCache.class); + } + return serviceInstanceInventoryCache; + } + + private EndpointInventoryCache getEndpointInventoryCache() { + if (endpointInventoryCache == null) { + this.endpointInventoryCache = moduleManager.find(CoreModule.NAME).provider().getService(EndpointInventoryCache.class); + } + return endpointInventoryCache; + } + + public Logs queryLogs(final String metricName, int serviceId, int serviceInstanceId, int endpointId, + LogState state, String stateCode, Pagination paging, final long startTB, final long endTB) throws IOException { + PaginationUtils.Page page = PaginationUtils.INSTANCE.exchange(paging); + + Logs logs = getLogQueryDAO().queryLogs(metricName, serviceId, serviceInstanceId, endpointId, + state, stateCode, paging, page.getFrom(), page.getLimit(), startTB, endTB); + logs.getLogs().forEach(log -> { + if (log.getServiceId() != Const.NONE) { + log.setServiceName(getServiceInventoryCache().get(log.getServiceId()).getName()); + } + if (log.getServiceInstanceId() != Const.NONE) { + log.setServiceInstanceName(getServiceInstanceInventoryCache().get(log.getServiceInstanceId()).getName()); + } + if (log.getEndpointId() != Const.NONE) { + log.setEndpointName(getEndpointInventoryCache().get(log.getEndpointId()).getName()); + } + }); + return logs; + } +} diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/Logs.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/Logs.java index 2fe81c6..7386576 100644 --- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/Logs.java +++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/Logs.java @@ -19,14 +19,16 @@ package org.apache.skywalking.oap.server.core.query.entity; import java.util.*; -import lombok.Setter; +import lombok.*; /** * @author wusheng */ +@Setter +@Getter public class Logs { private final List<Log> logs; - @Setter private int total; + private int total; public Logs() { this.logs = new ArrayList<>(); diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/AbstractLog.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/AbstractLog.java index f73fca7..7fb840b 100644 --- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/AbstractLog.java +++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/AbstractLog.java @@ -25,7 +25,8 @@ import org.apache.skywalking.oap.server.core.query.entity.ContentType; @Setter @Getter public abstract class AbstractLog extends Source { - + private long timeBucket; + private long timestamp; private int serviceId; private int serviceInstanceId; private int endpointId; diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/storage/StorageModule.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/storage/StorageModule.java index 6072912..eef5c12 100644 --- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/storage/StorageModule.java +++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/storage/StorageModule.java @@ -40,6 +40,6 @@ public class StorageModule extends ModuleDefine { IServiceInventoryCacheDAO.class, IServiceInstanceInventoryCacheDAO.class, IEndpointInventoryCacheDAO.class, INetworkAddressInventoryCacheDAO.class, ITopologyQueryDAO.class, IMetricQueryDAO.class, ITraceQueryDAO.class, IMetadataQueryDAO.class, IAggregationQueryDAO.class, IAlarmQueryDAO.class, - ITopNRecordsQueryDAO.class}; + ITopNRecordsQueryDAO.class, ILogQueryDAO.class}; } } diff --git a/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/type/LogQueryCondition.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/storage/query/ILogQueryDAO.java similarity index 67% copy from oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/type/LogQueryCondition.java copy to oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/storage/query/ILogQueryDAO.java index dd178a3..31f39af 100644 --- a/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/type/LogQueryCondition.java +++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/storage/query/ILogQueryDAO.java @@ -16,24 +16,16 @@ * */ -package org.apache.skywalking.oap.query.graphql.type; +package org.apache.skywalking.oap.server.core.storage.query; -import lombok.*; +import java.io.IOException; import org.apache.skywalking.oap.server.core.query.entity.*; +import org.apache.skywalking.oap.server.library.module.Service; /** * @author wusheng */ -@Getter -@Setter -public class LogQueryCondition { - private String metricName; - private String serviceId; - private String serviceInstanceId; - private String traceId; - private String endpointId; - private LogState state; - private String stateCode; - private Duration queryDuration; - private Pagination paging; +public interface ILogQueryDAO extends Service { + Logs queryLogs(final String metricName, int serviceId, int serviceInstanceId, int endpointId, + LogState state, String stateCode, Pagination paging, int from, int limit, final long startTB, final long endTB) throws IOException; } diff --git a/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/resolver/LogQuery.java b/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/resolver/LogQuery.java index 08dfe97..e373f06 100644 --- a/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/resolver/LogQuery.java +++ b/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/resolver/LogQuery.java @@ -21,20 +21,40 @@ package org.apache.skywalking.oap.query.graphql.resolver; import com.coxautodev.graphql.tools.GraphQLQueryResolver; import java.io.IOException; import org.apache.skywalking.oap.query.graphql.type.LogQueryCondition; +import org.apache.skywalking.oap.server.core.CoreModule; +import org.apache.skywalking.oap.server.core.query.*; import org.apache.skywalking.oap.server.core.query.entity.Logs; import org.apache.skywalking.oap.server.library.module.ModuleManager; +import static java.util.Objects.nonNull; + /** * @author wusheng */ public class LogQuery implements GraphQLQueryResolver { private final ModuleManager moduleManager; + private LogQueryService logQueryService; public LogQuery(ModuleManager moduleManager) { this.moduleManager = moduleManager; } + private LogQueryService getQueryService() { + if (logQueryService == null) { + this.logQueryService = moduleManager.find(CoreModule.NAME).provider().getService(LogQueryService.class); + } + return logQueryService; + } + public Logs queryLogs(LogQueryCondition condition) throws IOException { - return null; + long startSecondTB = 0; + long endSecondTB = 0; + if (nonNull(condition.getQueryDuration())) { + startSecondTB = DurationUtils.INSTANCE.startTimeDurationToSecondTimeBucket(condition.getQueryDuration().getStep(), condition.getQueryDuration().getStart()); + endSecondTB = DurationUtils.INSTANCE.endTimeDurationToSecondTimeBucket(condition.getQueryDuration().getStep(), condition.getQueryDuration().getEnd()); + } + + return getQueryService().queryLogs(condition.getMetricName(), condition.getServiceId(), condition.getServiceInstanceId(), condition.getEndpointId(), + condition.getState(), condition.getStateCode(), condition.getPaging(), startSecondTB, endSecondTB); } } diff --git a/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/type/LogQueryCondition.java b/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/type/LogQueryCondition.java index dd178a3..0b00e75 100644 --- a/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/type/LogQueryCondition.java +++ b/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/type/LogQueryCondition.java @@ -28,10 +28,9 @@ import org.apache.skywalking.oap.server.core.query.entity.*; @Setter public class LogQueryCondition { private String metricName; - private String serviceId; - private String serviceInstanceId; - private String traceId; - private String endpointId; + private int serviceId; + private int serviceInstanceId; + private int endpointId; private LogState state; private String stateCode; private Duration queryDuration; diff --git a/oap-server/server-storage-plugin/storage-elasticsearch-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/elasticsearch/StorageModuleElasticsearchProvider.java b/oap-server/server-storage-plugin/storage-elasticsearch-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/elasticsearch/StorageModuleElasticsearchProvider.java index ed3bc4b..bff66df 100644 --- a/oap-server/server-storage-plugin/storage-elasticsearch-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/elasticsearch/StorageModuleElasticsearchProvider.java +++ b/oap-server/server-storage-plugin/storage-elasticsearch-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/elasticsearch/StorageModuleElasticsearchProvider.java @@ -20,48 +20,16 @@ package org.apache.skywalking.oap.server.storage.plugin.elasticsearch; import org.apache.skywalking.apm.util.StringUtil; import org.apache.skywalking.oap.server.core.CoreModule; -import org.apache.skywalking.oap.server.core.storage.IBatchDAO; -import org.apache.skywalking.oap.server.core.storage.IHistoryDeleteDAO; -import org.apache.skywalking.oap.server.core.storage.IRegisterLockDAO; -import org.apache.skywalking.oap.server.core.storage.StorageDAO; -import org.apache.skywalking.oap.server.core.storage.StorageException; -import org.apache.skywalking.oap.server.core.storage.StorageModule; -import org.apache.skywalking.oap.server.core.storage.cache.IEndpointInventoryCacheDAO; -import org.apache.skywalking.oap.server.core.storage.cache.INetworkAddressInventoryCacheDAO; -import org.apache.skywalking.oap.server.core.storage.cache.IServiceInstanceInventoryCacheDAO; -import org.apache.skywalking.oap.server.core.storage.cache.IServiceInventoryCacheDAO; -import org.apache.skywalking.oap.server.core.storage.query.IAggregationQueryDAO; -import org.apache.skywalking.oap.server.core.storage.query.IAlarmQueryDAO; -import org.apache.skywalking.oap.server.core.storage.query.IMetadataQueryDAO; -import org.apache.skywalking.oap.server.core.storage.query.IMetricQueryDAO; -import org.apache.skywalking.oap.server.core.storage.query.ITopNRecordsQueryDAO; -import org.apache.skywalking.oap.server.core.storage.query.ITopologyQueryDAO; -import org.apache.skywalking.oap.server.core.storage.query.ITraceQueryDAO; +import org.apache.skywalking.oap.server.core.storage.*; +import org.apache.skywalking.oap.server.core.storage.cache.*; +import org.apache.skywalking.oap.server.core.storage.query.*; import org.apache.skywalking.oap.server.library.client.elasticsearch.ElasticSearchClient; -import org.apache.skywalking.oap.server.library.module.ModuleConfig; -import org.apache.skywalking.oap.server.library.module.ModuleDefine; -import org.apache.skywalking.oap.server.library.module.ModuleProvider; -import org.apache.skywalking.oap.server.library.module.ModuleStartException; -import org.apache.skywalking.oap.server.library.module.ServiceNotProvidedException; -import org.apache.skywalking.oap.server.storage.plugin.elasticsearch.base.BatchProcessEsDAO; -import org.apache.skywalking.oap.server.storage.plugin.elasticsearch.base.HistoryDeleteEsDAO; -import org.apache.skywalking.oap.server.storage.plugin.elasticsearch.base.StorageEsDAO; -import org.apache.skywalking.oap.server.storage.plugin.elasticsearch.base.StorageEsInstaller; -import org.apache.skywalking.oap.server.storage.plugin.elasticsearch.cache.EndpointInventoryCacheEsDAO; -import org.apache.skywalking.oap.server.storage.plugin.elasticsearch.cache.NetworkAddressInventoryCacheEsDAO; -import org.apache.skywalking.oap.server.storage.plugin.elasticsearch.cache.ServiceInstanceInventoryCacheDAO; -import org.apache.skywalking.oap.server.storage.plugin.elasticsearch.cache.ServiceInventoryCacheEsDAO; -import org.apache.skywalking.oap.server.storage.plugin.elasticsearch.lock.RegisterLockDAOImpl; -import org.apache.skywalking.oap.server.storage.plugin.elasticsearch.lock.RegisterLockInstaller; -import org.apache.skywalking.oap.server.storage.plugin.elasticsearch.query.AggregationQueryEsDAO; -import org.apache.skywalking.oap.server.storage.plugin.elasticsearch.query.AlarmQueryEsDAO; -import org.apache.skywalking.oap.server.storage.plugin.elasticsearch.query.MetadataQueryEsDAO; -import org.apache.skywalking.oap.server.storage.plugin.elasticsearch.query.MetricQueryEsDAO; -import org.apache.skywalking.oap.server.storage.plugin.elasticsearch.query.TopNRecordsQueryEsDAO; -import org.apache.skywalking.oap.server.storage.plugin.elasticsearch.query.TopologyQueryEsDAO; -import org.apache.skywalking.oap.server.storage.plugin.elasticsearch.query.TraceQueryEsDAO; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import org.apache.skywalking.oap.server.library.module.*; +import org.apache.skywalking.oap.server.storage.plugin.elasticsearch.base.*; +import org.apache.skywalking.oap.server.storage.plugin.elasticsearch.cache.*; +import org.apache.skywalking.oap.server.storage.plugin.elasticsearch.lock.*; +import org.apache.skywalking.oap.server.storage.plugin.elasticsearch.query.*; +import org.slf4j.*; /** * @author peng-yongsheng @@ -117,6 +85,7 @@ public class StorageModuleElasticsearchProvider extends ModuleProvider { this.registerServiceImplementation(IAggregationQueryDAO.class, new AggregationQueryEsDAO(elasticSearchClient)); this.registerServiceImplementation(IAlarmQueryDAO.class, new AlarmQueryEsDAO(elasticSearchClient)); this.registerServiceImplementation(ITopNRecordsQueryDAO.class, new TopNRecordsQueryEsDAO(elasticSearchClient)); + this.registerServiceImplementation(ILogQueryDAO.class, new LogQueryEsDAO(elasticSearchClient)); } @Override diff --git a/oap-server/server-storage-plugin/storage-elasticsearch-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/elasticsearch/query/LogQueryEsDAO.java b/oap-server/server-storage-plugin/storage-elasticsearch-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/elasticsearch/query/LogQueryEsDAO.java new file mode 100644 index 0000000..d234323 --- /dev/null +++ b/oap-server/server-storage-plugin/storage-elasticsearch-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/elasticsearch/query/LogQueryEsDAO.java @@ -0,0 +1,100 @@ +/* + * 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.skywalking.oap.server.storage.plugin.elasticsearch.query; + +import com.google.common.base.Strings; +import java.io.IOException; +import java.util.List; +import org.apache.skywalking.oap.server.core.Const; +import org.apache.skywalking.oap.server.core.analysis.manual.log.AbstractLogRecord; +import org.apache.skywalking.oap.server.core.analysis.manual.segment.SegmentRecord; +import org.apache.skywalking.oap.server.core.query.entity.*; +import org.apache.skywalking.oap.server.core.storage.query.ILogQueryDAO; +import org.apache.skywalking.oap.server.library.client.elasticsearch.ElasticSearchClient; +import org.apache.skywalking.oap.server.library.util.BooleanUtils; +import org.apache.skywalking.oap.server.storage.plugin.elasticsearch.base.EsDAO; +import org.elasticsearch.action.search.SearchResponse; +import org.elasticsearch.index.query.*; +import org.elasticsearch.search.SearchHit; +import org.elasticsearch.search.builder.SearchSourceBuilder; + +/** + * @author wusheng + */ +public class LogQueryEsDAO extends EsDAO implements ILogQueryDAO { + public LogQueryEsDAO(ElasticSearchClient client) { + super(client); + } + + @Override + public Logs queryLogs(String metricName, int serviceId, int serviceInstanceId, int endpointId, + LogState state, String stateCode, Pagination paging, int from, int limit, long startSecondTB, + long endSecondTB) throws IOException { + SearchSourceBuilder sourceBuilder = SearchSourceBuilder.searchSource(); + + BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery(); + sourceBuilder.query(boolQueryBuilder); + List<QueryBuilder> mustQueryList = boolQueryBuilder.must(); + + if (startSecondTB != 0 && endSecondTB != 0) { + mustQueryList.add(QueryBuilders.rangeQuery(SegmentRecord.TIME_BUCKET).gte(startSecondTB).lte(endSecondTB)); + } + + if (serviceId != Const.NONE) { + boolQueryBuilder.must().add(QueryBuilders.termQuery(AbstractLogRecord.SERVICE_ID, serviceId)); + } + if (serviceInstanceId != Const.NONE) { + boolQueryBuilder.must().add(QueryBuilders.termQuery(AbstractLogRecord.SERVICE_INSTANCE_ID, serviceInstanceId)); + } + if (endpointId != Const.NONE) { + boolQueryBuilder.must().add(QueryBuilders.termQuery(AbstractLogRecord.ENDPOINT_ID, endpointId)); + } + if (!Strings.isNullOrEmpty(stateCode)) { + boolQueryBuilder.must().add(QueryBuilders.termQuery(AbstractLogRecord.STATUS_CODE, stateCode)); + } + if (LogState.ERROR.equals(state)) { + boolQueryBuilder.must().add(QueryBuilders.termQuery(AbstractLogRecord.IS_ERROR, BooleanUtils.booleanToValue(true))); + } else if (LogState.ERROR.equals(state)) { + boolQueryBuilder.must().add(QueryBuilders.termQuery(AbstractLogRecord.IS_ERROR, BooleanUtils.booleanToValue(false))); + } + + sourceBuilder.size(limit); + sourceBuilder.from(from); + + SearchResponse response = getClient().search(metricName, sourceBuilder); + + Logs logs = new Logs(); + logs.setTotal((int)response.getHits().totalHits); + + for (SearchHit searchHit : response.getHits().getHits()) { + Log log = new Log(); + log.setServiceId(((Number)searchHit.getSourceAsMap().get(AbstractLogRecord.SERVICE_ID)).intValue()); + log.setServiceInstanceId(((Number)searchHit.getSourceAsMap().get(AbstractLogRecord.SERVICE_INSTANCE_ID)).intValue()); + log.setEndpointId(((Number)searchHit.getSourceAsMap().get(AbstractLogRecord.ENDPOINT_ID)).intValue()); + log.setError(BooleanUtils.valueToBoolean(((Number)searchHit.getSourceAsMap().get(AbstractLogRecord.IS_ERROR)).intValue())); + log.setStatusCode((String)searchHit.getSourceAsMap().get(AbstractLogRecord.STATUS_CODE)); + log.setContentType(ContentType.instanceOf(((Number)searchHit.getSourceAsMap().get(AbstractLogRecord.CONTENT_TYPE)).intValue())); + log.setContent((String)searchHit.getSourceAsMap().get(AbstractLogRecord.CONTENT)); + + logs.getLogs().add(log); + } + + return logs; + } +} diff --git a/oap-server/server-storage-plugin/storage-jdbc-hikaricp-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/jdbc/h2/H2StorageProvider.java b/oap-server/server-storage-plugin/storage-jdbc-hikaricp-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/jdbc/h2/H2StorageProvider.java index addd6a0..281c30c 100644 --- a/oap-server/server-storage-plugin/storage-jdbc-hikaricp-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/jdbc/h2/H2StorageProvider.java +++ b/oap-server/server-storage-plugin/storage-jdbc-hikaricp-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/jdbc/h2/H2StorageProvider.java @@ -87,6 +87,7 @@ public class H2StorageProvider extends ModuleProvider { this.registerServiceImplementation(IAlarmQueryDAO.class, new H2AlarmQueryDAO(h2Client)); this.registerServiceImplementation(IHistoryDeleteDAO.class, new H2HistoryDeleteDAO(h2Client)); this.registerServiceImplementation(ITopNRecordsQueryDAO.class, new H2TopNRecordsQueryDAO(h2Client)); + this.registerServiceImplementation(ILogQueryDAO.class, new H2LogQueryDAO(h2Client)); } @Override public void start() throws ServiceNotProvidedException, ModuleStartException { diff --git a/oap-server/server-storage-plugin/storage-jdbc-hikaricp-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/jdbc/h2/dao/H2LogQueryDAO.java b/oap-server/server-storage-plugin/storage-jdbc-hikaricp-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/jdbc/h2/dao/H2LogQueryDAO.java new file mode 100644 index 0000000..72db42d --- /dev/null +++ b/oap-server/server-storage-plugin/storage-jdbc-hikaricp-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/jdbc/h2/dao/H2LogQueryDAO.java @@ -0,0 +1,123 @@ +/* + * 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.skywalking.oap.server.storage.plugin.jdbc.h2.dao; + +import com.google.common.base.Strings; +import java.io.IOException; +import java.sql.*; +import java.util.*; +import org.apache.skywalking.oap.server.core.Const; +import org.apache.skywalking.oap.server.core.analysis.manual.log.AbstractLogRecord; +import org.apache.skywalking.oap.server.core.query.entity.*; +import org.apache.skywalking.oap.server.core.storage.query.ILogQueryDAO; +import org.apache.skywalking.oap.server.library.client.jdbc.hikaricp.JDBCHikariCPClient; +import org.apache.skywalking.oap.server.library.util.BooleanUtils; + +import static org.apache.skywalking.oap.server.core.analysis.manual.log.AbstractLogRecord.*; + +/** + * @author wusheng + */ +public class H2LogQueryDAO implements ILogQueryDAO { + private JDBCHikariCPClient h2Client; + + public H2LogQueryDAO(JDBCHikariCPClient h2Client) { + this.h2Client = h2Client; + } + + @Override + public Logs queryLogs(String metricName, int serviceId, int serviceInstanceId, int endpointId, LogState state, + String stateCode, Pagination paging, int from, int limit, long startSecondTB, + long endSecondTB) throws IOException { + StringBuilder sql = new StringBuilder(); + List<Object> parameters = new ArrayList<>(10); + + sql.append("from ").append(metricName).append(" where "); + sql.append(" 1=1 "); + if (startSecondTB != 0 && endSecondTB != 0) { + sql.append(" and ").append(AbstractLogRecord.TIME_BUCKET).append(" >= ?"); + parameters.add(startSecondTB); + sql.append(" and ").append(AbstractLogRecord.TIME_BUCKET).append(" <= ?"); + parameters.add(endSecondTB); + } + + if (serviceId != Const.NONE) { + sql.append(" and ").append(SERVICE_ID).append(" = ?"); + parameters.add(serviceId); + } + if (serviceInstanceId != Const.NONE) { + sql.append(" and ").append(AbstractLogRecord.SERVICE_INSTANCE_ID).append(" = ?"); + parameters.add(serviceInstanceId); + } + if (endpointId != Const.NONE) { + sql.append(" and ").append(AbstractLogRecord.ENDPOINT_ID).append(" = ?"); + parameters.add(endpointId); + } + if (!Strings.isNullOrEmpty(stateCode)) { + sql.append(" and ").append(AbstractLogRecord.STATUS_CODE).append(" = ?"); + parameters.add(stateCode); + } + if (LogState.ERROR.equals(state)) { + sql.append(" and ").append(AbstractLogRecord.IS_ERROR).append(" = ?"); + parameters.add(BooleanUtils.booleanToValue(true)); + } else if (LogState.ERROR.equals(state)) { + sql.append(" and ").append(AbstractLogRecord.IS_ERROR).append(" = ?"); + parameters.add(BooleanUtils.booleanToValue(false)); + } + + Logs logs = new Logs(); + try (Connection connection = h2Client.getConnection()) { + + try (ResultSet resultSet = h2Client.executeQuery(connection, buildCountStatement(sql.toString()), parameters.toArray(new Object[0]))) { + while (resultSet.next()) { + logs.setTotal(resultSet.getInt("total")); + } + } + + buildLimit(sql, from, limit); + + try (ResultSet resultSet = h2Client.executeQuery(connection, "select * " + sql.toString(), parameters.toArray(new Object[0]))) { + while (resultSet.next()) { + Log log = new Log(); + log.setServiceId(resultSet.getInt(SERVICE_ID)); + log.setServiceInstanceId(resultSet.getInt(SERVICE_INSTANCE_ID)); + log.setEndpointId(resultSet.getInt(ENDPOINT_ID)); + log.setTimestamp(resultSet.getString(TIMESTAMP)); + log.setStatusCode(resultSet.getString(STATUS_CODE)); + log.setContentType(ContentType.instanceOf(resultSet.getInt(CONTENT_TYPE))); + log.setContent(resultSet.getString(CONTENT)); + logs.getLogs().add(log); + } + } + } catch (SQLException e) { + throw new IOException(e); + } + + return logs; + } + + protected String buildCountStatement(String sql) { + return "select count(1) total from (select 1 " + sql + " )"; + } + + protected void buildLimit(StringBuilder sql, int from, int limit) { + sql.append(" LIMIT ").append(limit); + sql.append(" OFFSET ").append(from); + } +} diff --git a/oap-server/server-storage-plugin/storage-jdbc-hikaricp-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/jdbc/h2/dao/H2TraceQueryDAO.java b/oap-server/server-storage-plugin/storage-jdbc-hikaricp-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/jdbc/h2/dao/H2TraceQueryDAO.java index ec231e5..6b11467 100644 --- a/oap-server/server-storage-plugin/storage-jdbc-hikaricp-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/jdbc/h2/dao/H2TraceQueryDAO.java +++ b/oap-server/server-storage-plugin/storage-jdbc-hikaricp-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/jdbc/h2/dao/H2TraceQueryDAO.java @@ -103,7 +103,7 @@ public class H2TraceQueryDAO implements ITraceQueryDAO { TraceBrief traceBrief = new TraceBrief(); try (Connection connection = h2Client.getConnection()) { - try (ResultSet resultSet = h2Client.executeQuery(connection, "select count(1) total from (select 1 " + sql.toString() + " )", parameters.toArray(new Object[0]))) { + try (ResultSet resultSet = h2Client.executeQuery(connection, buildCountStatement(sql.toString()), parameters.toArray(new Object[0]))) { while (resultSet.next()) { traceBrief.setTotal(resultSet.getInt("total")); } @@ -132,6 +132,10 @@ public class H2TraceQueryDAO implements ITraceQueryDAO { return traceBrief; } + protected String buildCountStatement(String sql) { + return "select count(1) total from (select 1 " + sql + " )"; + } + protected void buildLimit(StringBuilder sql, int from, int limit) { sql.append(" LIMIT ").append(limit); sql.append(" OFFSET ").append(from); diff --git a/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/resolver/LogQuery.java b/oap-server/server-storage-plugin/storage-jdbc-hikaricp-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/jdbc/mysql/MySQLLogQueryDAO.java similarity index 55% copy from oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/resolver/LogQuery.java copy to oap-server/server-storage-plugin/storage-jdbc-hikaricp-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/jdbc/mysql/MySQLLogQueryDAO.java index 08dfe97..d61be02 100644 --- a/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/resolver/LogQuery.java +++ b/oap-server/server-storage-plugin/storage-jdbc-hikaricp-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/jdbc/mysql/MySQLLogQueryDAO.java @@ -16,25 +16,25 @@ * */ -package org.apache.skywalking.oap.query.graphql.resolver; +package org.apache.skywalking.oap.server.storage.plugin.jdbc.mysql; -import com.coxautodev.graphql.tools.GraphQLQueryResolver; -import java.io.IOException; -import org.apache.skywalking.oap.query.graphql.type.LogQueryCondition; -import org.apache.skywalking.oap.server.core.query.entity.Logs; -import org.apache.skywalking.oap.server.library.module.ModuleManager; +import org.apache.skywalking.oap.server.library.client.jdbc.hikaricp.JDBCHikariCPClient; +import org.apache.skywalking.oap.server.storage.plugin.jdbc.h2.dao.H2LogQueryDAO; /** * @author wusheng */ -public class LogQuery implements GraphQLQueryResolver { - private final ModuleManager moduleManager; +public class MySQLLogQueryDAO extends H2LogQueryDAO { + public MySQLLogQueryDAO(JDBCHikariCPClient h2Client) { + super(h2Client); + } - public LogQuery(ModuleManager moduleManager) { - this.moduleManager = moduleManager; + protected String buildCountStatement(String sql) { + return "select count(1) total from (select 1 " + sql + " )"; } - public Logs queryLogs(LogQueryCondition condition) throws IOException { - return null; + protected void buildLimit(StringBuilder sql, int from, int limit) { + sql.append(" LIMIT ").append(limit); + sql.append(" OFFSET ").append(from); } } diff --git a/oap-server/server-storage-plugin/storage-jdbc-hikaricp-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/jdbc/mysql/MySQLStorageProvider.java b/oap-server/server-storage-plugin/storage-jdbc-hikaricp-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/jdbc/mysql/MySQLStorageProvider.java index 6f2ac94..4d0e00d 100644 --- a/oap-server/server-storage-plugin/storage-jdbc-hikaricp-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/jdbc/mysql/MySQLStorageProvider.java +++ b/oap-server/server-storage-plugin/storage-jdbc-hikaricp-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/jdbc/mysql/MySQLStorageProvider.java @@ -93,6 +93,7 @@ public class MySQLStorageProvider extends ModuleProvider { this.registerServiceImplementation(IAlarmQueryDAO.class, new MySQLAlarmQueryDAO(mysqlClient)); this.registerServiceImplementation(IHistoryDeleteDAO.class, new H2HistoryDeleteDAO(mysqlClient)); this.registerServiceImplementation(ITopNRecordsQueryDAO.class, new H2TopNRecordsQueryDAO(mysqlClient)); + this.registerServiceImplementation(ILogQueryDAO.class, new MySQLTraceQueryDAO(mysqlClient)); } @Override public void start() throws ServiceNotProvidedException, ModuleStartException { diff --git a/oap-server/server-storage-plugin/storage-jdbc-hikaricp-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/jdbc/mysql/MySQLTraceQueryDAO.java b/oap-server/server-storage-plugin/storage-jdbc-hikaricp-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/jdbc/mysql/MySQLTraceQueryDAO.java index 639fe63..384d67e 100644 --- a/oap-server/server-storage-plugin/storage-jdbc-hikaricp-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/jdbc/mysql/MySQLTraceQueryDAO.java +++ b/oap-server/server-storage-plugin/storage-jdbc-hikaricp-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/jdbc/mysql/MySQLTraceQueryDAO.java @@ -18,16 +18,8 @@ package org.apache.skywalking.oap.server.storage.plugin.jdbc.mysql; -import com.google.common.base.Strings; -import java.io.IOException; -import java.sql.*; -import java.util.*; -import org.apache.skywalking.oap.server.core.analysis.manual.segment.SegmentRecord; -import org.apache.skywalking.oap.server.core.query.entity.*; import org.apache.skywalking.oap.server.library.client.jdbc.hikaricp.JDBCHikariCPClient; -import org.apache.skywalking.oap.server.library.util.BooleanUtils; import org.apache.skywalking.oap.server.storage.plugin.jdbc.h2.dao.H2TraceQueryDAO; -import org.elasticsearch.search.sort.SortOrder; /** * @author wusheng @@ -37,97 +29,8 @@ public class MySQLTraceQueryDAO extends H2TraceQueryDAO { super(mysqlClient); } - @Override - public TraceBrief queryBasicTraces(long startSecondTB, long endSecondTB, long minDuration, long maxDuration, - String endpointName, int serviceId, int serviceInstanceId, int endpointId, String traceId, int limit, int from, - TraceState traceState, QueryOrder queryOrder) throws IOException { - StringBuilder sql = new StringBuilder(); - List<Object> parameters = new ArrayList<>(10); - - sql.append("from ").append(SegmentRecord.INDEX_NAME).append(" where "); - sql.append(" 1=1 "); - if (startSecondTB != 0 && endSecondTB != 0) { - sql.append(" and ").append(SegmentRecord.TIME_BUCKET).append(" >= ?"); - parameters.add(startSecondTB); - sql.append(" and ").append(SegmentRecord.TIME_BUCKET).append(" <= ?"); - parameters.add(endSecondTB); - } - if (minDuration != 0 || maxDuration != 0) { - if (minDuration != 0) { - sql.append(" and ").append(SegmentRecord.LATENCY).append(" >= ?"); - parameters.add(minDuration); - } - if (maxDuration != 0) { - sql.append(" and ").append(SegmentRecord.LATENCY).append(" <= ?"); - parameters.add(maxDuration); - } - } - if (!Strings.isNullOrEmpty(endpointName)) { - sql.append(" and ").append(SegmentRecord.ENDPOINT_NAME).append(" like '%" + endpointName + "%'"); - } - if (serviceId != 0) { - sql.append(" and ").append(SegmentRecord.SERVICE_ID).append(" = ?"); - parameters.add(serviceId); - } - if (serviceInstanceId != 0) { - sql.append(" and ").append(SegmentRecord.SERVICE_INSTANCE_ID).append(" = ?"); - parameters.add(serviceInstanceId); - } - if (endpointId != 0) { - sql.append(" and ").append(SegmentRecord.ENDPOINT_ID).append(" = ?"); - parameters.add(endpointId); - } - if (!Strings.isNullOrEmpty(traceId)) { - sql.append(" and ").append(SegmentRecord.TRACE_ID).append(" = ?"); - parameters.add(traceId); - } - switch (traceState) { - case ERROR: - sql.append(" and ").append(SegmentRecord.IS_ERROR).append(" = ").append(BooleanUtils.TRUE); - break; - case SUCCESS: - sql.append(" and ").append(SegmentRecord.IS_ERROR).append(" = ").append(BooleanUtils.FALSE); - break; - } - switch (queryOrder) { - case BY_START_TIME: - sql.append(" order by ").append(SegmentRecord.START_TIME).append(" ").append(SortOrder.DESC); - break; - case BY_DURATION: - sql.append(" order by ").append(SegmentRecord.LATENCY).append(" ").append(SortOrder.DESC); - break; - } - - TraceBrief traceBrief = new TraceBrief(); - try (Connection connection = getClient().getConnection()) { - - try (ResultSet resultSet = getClient().executeQuery(connection, "select count(1) total from (select 1 " + sql.toString() + " ) AS TRACE", parameters.toArray(new Object[0]))) { - while (resultSet.next()) { - traceBrief.setTotal(resultSet.getInt("total")); - } - } - - buildLimit(sql, from, limit); - - try (ResultSet resultSet = getClient().executeQuery(connection, "select * " + sql.toString(), parameters.toArray(new Object[0]))) { - while (resultSet.next()) { - BasicTrace basicTrace = new BasicTrace(); - - basicTrace.setSegmentId(resultSet.getString(SegmentRecord.SEGMENT_ID)); - basicTrace.setStart(resultSet.getString(SegmentRecord.START_TIME)); - basicTrace.getEndpointNames().add(resultSet.getString(SegmentRecord.ENDPOINT_NAME)); - basicTrace.setDuration(resultSet.getInt(SegmentRecord.LATENCY)); - basicTrace.setError(BooleanUtils.valueToBoolean(resultSet.getInt(SegmentRecord.IS_ERROR))); - String traceIds = resultSet.getString(SegmentRecord.TRACE_ID); - basicTrace.getTraceIds().add(traceIds); - traceBrief.getTraces().add(basicTrace); - } - } - } catch (SQLException e) { - throw new IOException(e); - } - - return traceBrief; + @Override protected String buildCountStatement(String sql) { + return "select count(1) total from (select 1 " + sql + " ) AS TRACE"; } @Override protected void buildLimit(StringBuilder sql, int from, int limit) {