aboutsummaryrefslogtreecommitdiffstats
path: root/container-accesslogging/src/main/java/com/yahoo/container/logging/AccessLogSampler.java
diff options
context:
space:
mode:
Diffstat (limited to 'container-accesslogging/src/main/java/com/yahoo/container/logging/AccessLogSampler.java')
-rw-r--r--container-accesslogging/src/main/java/com/yahoo/container/logging/AccessLogSampler.java37
1 files changed, 37 insertions, 0 deletions
diff --git a/container-accesslogging/src/main/java/com/yahoo/container/logging/AccessLogSampler.java b/container-accesslogging/src/main/java/com/yahoo/container/logging/AccessLogSampler.java
new file mode 100644
index 00000000000..987035bb0e9
--- /dev/null
+++ b/container-accesslogging/src/main/java/com/yahoo/container/logging/AccessLogSampler.java
@@ -0,0 +1,37 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package com.yahoo.container.logging;
+
+import java.util.concurrent.atomic.AtomicLong;
+
+/**
+ * Samples entries from access log. It first samples every query until it have some data, and then sub-samples
+ * much less frequently to reduce CPU usage and latency impact. It only samples successful requests and requests
+ * that starts with /search.
+ *
+ * @author dybdahl
+ */
+public class AccessLogSampler implements AccessLogInterface {
+
+ private final AtomicLong accessLineCounter = new AtomicLong(0);
+ private final CircularArrayAccessLogKeeper circularArrayAccessLogKeeper;
+
+ public AccessLogSampler(CircularArrayAccessLogKeeper circularArrayAccessLogKeeper) {
+ this.circularArrayAccessLogKeeper = circularArrayAccessLogKeeper;
+ }
+
+ @Override
+ public void log(AccessLogEntry accessLogEntry) {
+ if (accessLogEntry.getStatusCode() != 200) {
+ return;
+ }
+ String uriString = accessLogEntry.getURI().toString();
+ if (! uriString.startsWith("/search")) {
+ return;
+ }
+ final long count = accessLineCounter.incrementAndGet();
+ if (count >= CircularArrayAccessLogKeeper.SIZE && count % CircularArrayAccessLogKeeper.SIZE != 0) {
+ return;
+ }
+ circularArrayAccessLogKeeper.addUri(uriString);
+ }
+}