You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
yacy_search_server/source/net/yacy/search/snippet/TextSnippetStatistics.java

222 lines
6.5 KiB

// TextSnippetStatistics.java
// ---------------------------
// Copyright 2018 by luccioman; https://github.com/luccioman
//
// This is a part of YaCy, a peer-to-peer based web search engine
//
// LICENSE
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 2 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
package net.yacy.search.snippet;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicLong;
import java.util.function.LongBinaryOperator;
import net.yacy.cora.document.id.DigestURL;
import net.yacy.cora.util.ConcurrentLog;
import net.yacy.search.SwitchboardConstants;
import net.yacy.search.snippet.TextSnippet.ResultClass;
/**
* Handle statistics on TextSnippet processing.
*/
public class TextSnippetStatistics {
/** Logs handler */
private static final ConcurrentLog logger = new ConcurrentLog(TextSnippetStatistics.class.getName());
/** Total number of TextSnippet instances created since last JVM start */
private AtomicLong totalSnippets = new AtomicLong(0);
/**
* Total number of TextSnippet instances with resultStatus of type fail created
* since last JVM start
*/
private AtomicLong totalFailures = new AtomicLong(0);
/**
* Total number of TextSnippet instances with resultStatus of type
* ResultClass.SOURCE_DOLR created since last JVM start
*/
private AtomicLong totalFromSolr = new AtomicLong(0);
/**
* Total number of TextSnippet instances with resultStatus of type
* ResultClass.SOURCE_CACHE created since last JVM start
*/
private AtomicLong totalFromCache = new AtomicLong(0);
/**
* Total number of TextSnippet instances with resultStatus of type
* ResultClass.SOURCE_WEB created since last JVM start
*/
private AtomicLong totalFromWeb = new AtomicLong(0);
/**
* Total number of TextSnippet instances with resultStatus of type
* ResultClass.SOURCE_METADATA created since last JVM start
*/
private AtomicLong totalFromMetadata = new AtomicLong(0);
/**
* Total time (in milliseconds) spent in TextSnippet initialization since last
* JVM start
*/
private AtomicLong totalInitTime = new AtomicLong(0);
/**
* Maximum time (in milliseconds) spent in a single TextSnippet initialization
* since last JVM start
*/
private AtomicLong maxInitTime = new AtomicLong(0);
/**
* Statistics are effectively computed and stored only when this boolean is true
*/
private AtomicBoolean enabled = new AtomicBoolean(SwitchboardConstants.DEBUG_SNIPPETS_STATISTICS_ENABLED_DEFAULT);
/**
* @return the total number of TextSnippet instances created since last JVM
* start
*/
public long getTotalSnippets() {
return this.totalSnippets.get();
}
/**
* @return the total number of TextSnippet instances with resultStatus of type
* fail created since last JVM start
*/
public long getTotalFailures() {
return this.totalFailures.get();
}
/**
* @return the total number of TextSnippet instances with resultStatus of type
* ResultClass.SOURCE_SOLR created since last JVM start
*/
public long getTotalFromSolr() {
return this.totalFromSolr.get();
}
/**
* @return the total number of TextSnippet instances with resultStatus of type
* ResultClass.SOURCE_CACHE created since last JVM start
*/
public long getTotalFromCache() {
return this.totalFromCache.get();
}
/**
* @return the total number of TextSnippet instances with resultStatus of type
* ResultClass.SOURCE_METADATA created since last JVM start
*/
public long getTotalFromMetadata() {
return this.totalFromMetadata.get();
}
/**
* @return the total number of TextSnippet instances with resultStatus of type
* ResultClass.SOURCE_WEB created since last JVM start
*/
public long getTotalFromWeb() {
return this.totalFromWeb.get();
}
/**
* Update statistics after a new TextSnippet instance has been initialized. Do
* nothing when text snippet statistics are not enabled.
*
* @param initTime
* the time in milliseconds used for the snippet initialization
* @param resultStatus
* the snippet result status.
*/
public void addTextSnippetStatistics(final DigestURL url, final long initTime, final ResultClass resultStatus) {
if (this.enabled.get() && resultStatus != null) {
this.totalSnippets.incrementAndGet();
this.totalInitTime.addAndGet(initTime);
if(initTime == this.maxInitTime.accumulateAndGet(initTime, new LongBinaryOperator() {
@Override
public long applyAsLong(long currentValue, long updateValue) {
return currentValue < updateValue ? updateValue : currentValue;
}
})) {
if(logger.isFine()) {
logger.fine("New max snippet init time : status " + resultStatus + " in " + initTime + " ms for URL " + url);
}
}
if (resultStatus != null) {
switch (resultStatus) {
case SOURCE_SOLR:
this.totalFromSolr.incrementAndGet();
break;
case SOURCE_CACHE:
this.totalFromCache.incrementAndGet();
break;
case SOURCE_METADATA:
this.totalFromMetadata.incrementAndGet();
break;
case SOURCE_WEB:
this.totalFromWeb.incrementAndGet();
break;
default:
if (resultStatus.fail()) {
this.totalFailures.incrementAndGet();
}
break;
}
}
}
}
/**
* @return the total time (in milliseconds) spent in TextSnippet initialization
* since last JVM start
*/
public long getTotalInitTime() {
return this.totalInitTime.get();
}
/**
* @return the maximum time (in milliseconds) spent in a single TextSnippet
* initialization since last JVM start
*/
public long getMaxInitTime() {
return this.maxInitTime.get();
}
/**
* @return true when statistics are effectively computed and stored
*/
public boolean isEnabled() {
return this.enabled.get();
}
/**
* @param newValue
* set to true to effectively compute and store statistics
*/
public void setEnabled(final boolean newValue) {
this.enabled.set(newValue);
}
}