Till Westmann has uploaded a new change for review.
https://asterix-gerrit.ics.uci.edu/2087
Change subject: [WIP] Tracing experiment
......................................................................
[WIP] Tracing experiment
Change-Id: I3f26ae988d3786ef4ddb17e8fe78f911e7e628f1
---
M
asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/operators/FeedMetaStoreNodePushable.java
M
hyracks-fullstack/hyracks/hyracks-dataflow-common/src/main/java/org/apache/hyracks/dataflow/common/comm/io/AbstractFrameAppender.java
M
hyracks-fullstack/hyracks/hyracks-dataflow-common/src/main/java/org/apache/hyracks/dataflow/common/comm/util/FrameUtils.java
M
hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/TracedIOOperation.java
M
hyracks-fullstack/hyracks/hyracks-util/src/main/java/org/apache/hyracks/util/trace/Event.java
M
hyracks-fullstack/hyracks/hyracks-util/src/main/java/org/apache/hyracks/util/trace/ITracer.java
A
hyracks-fullstack/hyracks/hyracks-util/src/main/java/org/apache/hyracks/util/trace/TraceCategoryRegistry.java
M
hyracks-fullstack/hyracks/hyracks-util/src/main/java/org/apache/hyracks/util/trace/Tracer.java
A
hyracks-fullstack/hyracks/hyracks-util/src/test/java/org/apache/hyracks/util/trace/TraceCategoryRegistryTest.java
9 files changed, 224 insertions(+), 14 deletions(-)
git pull ssh://asterix-gerrit.ics.uci.edu:29418/asterixdb
refs/changes/87/2087/1
diff --git
a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/operators/FeedMetaStoreNodePushable.java
b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/operators/FeedMetaStoreNodePushable.java
index 3791f61..fcd00a1 100644
---
a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/operators/FeedMetaStoreNodePushable.java
+++
b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/operators/FeedMetaStoreNodePushable.java
@@ -140,7 +140,8 @@
@Override
public void nextFrame(ByteBuffer buffer) throws HyracksDataException {
- long tid = tracer.durationB("Ingestion-Store", "Process-Frame", null);
+ final String cat = "Process-Frame";
+ long tid = tracer.durationB("Ingestion-Store", cat, null);
try {
FeedUtils.processFeedMessage(buffer, message, fta);
writer.nextFrame(buffer);
@@ -148,7 +149,7 @@
LOGGER.log(Level.WARNING, "Failure Processing a frame at store
side", e);
throw HyracksDataException.create(e);
} finally {
- tracer.durationE(tid, null);
+ tracer.durationE(tid, cat, null);
}
}
diff --git
a/hyracks-fullstack/hyracks/hyracks-dataflow-common/src/main/java/org/apache/hyracks/dataflow/common/comm/io/AbstractFrameAppender.java
b/hyracks-fullstack/hyracks/hyracks-dataflow-common/src/main/java/org/apache/hyracks/dataflow/common/comm/io/AbstractFrameAppender.java
index a377d75..9e46798 100644
---
a/hyracks-fullstack/hyracks/hyracks-dataflow-common/src/main/java/org/apache/hyracks/dataflow/common/comm/io/AbstractFrameAppender.java
+++
b/hyracks-fullstack/hyracks/hyracks-dataflow-common/src/main/java/org/apache/hyracks/dataflow/common/comm/io/AbstractFrameAppender.java
@@ -123,7 +123,7 @@
try {
flush(writer);
} finally {
- ITracer.check(tracer).durationE(tid, args);
+ ITracer.check(tracer).durationE(tid, cat, args);
}
}
}
diff --git
a/hyracks-fullstack/hyracks/hyracks-dataflow-common/src/main/java/org/apache/hyracks/dataflow/common/comm/util/FrameUtils.java
b/hyracks-fullstack/hyracks/hyracks-dataflow-common/src/main/java/org/apache/hyracks/dataflow/common/comm/util/FrameUtils.java
index ea53c25..ae2e691 100644
---
a/hyracks-fullstack/hyracks/hyracks-dataflow-common/src/main/java/org/apache/hyracks/dataflow/common/comm/util/FrameUtils.java
+++
b/hyracks-fullstack/hyracks/hyracks-dataflow-common/src/main/java/org/apache/hyracks/dataflow/common/comm/util/FrameUtils.java
@@ -157,7 +157,7 @@
flushedBytes = frameTupleAppender.getBuffer().capacity();
long tid = ITracer.check(tracer).durationB(name, cat, args);
frameTupleAppender.write(writer, true);
- ITracer.check(tracer).durationE(tid, args);
+ ITracer.check(tracer).durationE(tid, cat, args);
if (!frameTupleAppender.append(tupleAccessor, tIndex)) {
throw
HyracksDataException.create(ErrorCode.TUPLE_CANNOT_FIT_INTO_EMPTY_FRAME,
tupleAccessor.getTupleLength(tIndex));
diff --git
a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/TracedIOOperation.java
b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/TracedIOOperation.java
index 9cc8022..af743da 100644
---
a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/TracedIOOperation.java
+++
b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/TracedIOOperation.java
@@ -87,7 +87,7 @@
try {
return ioOp.call();
} finally {
- tracer.durationE(tid, "{\"optional\":\"value\"}");
+ tracer.durationE(tid, cat, "{\"optional\":\"value\"}");
}
}
diff --git
a/hyracks-fullstack/hyracks/hyracks-util/src/main/java/org/apache/hyracks/util/trace/Event.java
b/hyracks-fullstack/hyracks/hyracks-util/src/main/java/org/apache/hyracks/util/trace/Event.java
index b3f5c98..aa29086 100644
---
a/hyracks-fullstack/hyracks/hyracks-util/src/main/java/org/apache/hyracks/util/trace/Event.java
+++
b/hyracks-fullstack/hyracks/hyracks-util/src/main/java/org/apache/hyracks/util/trace/Event.java
@@ -23,8 +23,10 @@
final class Event {
private static final long NANOTIME_DELTA_TO_EPOCH =
System.nanoTime() -
TimeUnit.MILLISECONDS.toNanos(System.currentTimeMillis());
+ private final TraceCategoryRegistry registry =
TraceCategoryRegistry.INSTANCE;
+
public final String name;
- public final String cat;
+ public final long cat;
public final ITracer.Phase ph;
public final long ts;
public final int pid;
@@ -32,7 +34,7 @@
public final ITracer.Scope scope;
public final String args;
- private Event(String name, String cat, ITracer.Phase ph, long ts, int pid,
long tid, ITracer.Scope scope,
+ private Event(String name, long cat, ITracer.Phase ph, long ts, int pid,
long tid, ITracer.Scope scope,
String args) {
this.name = name;
this.cat = cat;
@@ -49,6 +51,12 @@
}
public static Event create(String name, String cat, ITracer.Phase ph, int
pid, long tid, ITracer.Scope scope,
+ String args, TraceCategoryRegistry registry) {
+ long catCode = registry.get(cat);
+ return new Event(name, catCode, ph, timestamp(), pid, tid, scope,
args);
+ }
+
+ public static Event create(String name, long cat, ITracer.Phase ph, int
pid, long tid, ITracer.Scope scope,
String args) {
return new Event(name, cat, ph, timestamp(), pid, tid, scope, args);
}
@@ -62,8 +70,9 @@
if (name != null) {
sb.append("\"name\":\"").append(name).append("\",");
}
- if (cat != null) {
- sb.append("\"cat\":\"").append(cat).append("\",");
+ if (cat != 0L) {
+ final String catName = registry.getName(cat);
+ sb.append("\"cat\":\"").append(catName).append("\",");
}
sb.append("\"ph\":\"").append(ph).append("\",");
sb.append("\"pid\":\"").append(pid).append("\",");
diff --git
a/hyracks-fullstack/hyracks/hyracks-util/src/main/java/org/apache/hyracks/util/trace/ITracer.java
b/hyracks-fullstack/hyracks/hyracks-util/src/main/java/org/apache/hyracks/util/trace/ITracer.java
index 01b78da..ddff568 100644
---
a/hyracks-fullstack/hyracks/hyracks-util/src/main/java/org/apache/hyracks/util/trace/ITracer.java
+++
b/hyracks-fullstack/hyracks/hyracks-util/src/main/java/org/apache/hyracks/util/trace/ITracer.java
@@ -68,12 +68,27 @@
}
@Override
- public void durationE(long tid, String args) {
+ public void durationE(long tid, String cat, String args) {
// nothing to do here
}
@Override
public void instant(String name, String cat, Scope scope, String args)
{
+ // nothing to do here
+ }
+
+ @Override
+ public long durationB(String name, long cat, String args) {
+ return -1;
+ }
+
+ @Override
+ public void durationE(long tid, long cat, String args) {
+ // nothing to do here
+ }
+
+ @Override
+ public void instant(String name, long cat, Scope scope, String args) {
// nothing to do here
}
};
@@ -91,10 +106,16 @@
long durationB(String name, String cat, String args);
- void durationE(long tid, String args);
+ void durationE(long tid, String cat, String args);
void instant(String name, String cat, Scope scope, String args);
+ long durationB(String name, long cat, String args);
+
+ void durationE(long tid, long cat, String args);
+
+ void instant(String name, long cat, Scope scope, String args);
+
@Override
String toString();
}
diff --git
a/hyracks-fullstack/hyracks/hyracks-util/src/main/java/org/apache/hyracks/util/trace/TraceCategoryRegistry.java
b/hyracks-fullstack/hyracks/hyracks-util/src/main/java/org/apache/hyracks/util/trace/TraceCategoryRegistry.java
new file mode 100644
index 0000000..c72f241
--- /dev/null
+++
b/hyracks-fullstack/hyracks/hyracks-util/src/main/java/org/apache/hyracks/util/trace/TraceCategoryRegistry.java
@@ -0,0 +1,65 @@
+/*
+ * 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.hyracks.util.trace;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class TraceCategoryRegistry {
+
+ public static TraceCategoryRegistry INSTANCE = new TraceCategoryRegistry();
+
+ static final int NO_CATEGORIES = 64;
+ private Map<String, Long> categories = new HashMap<>();
+ private int bitPos = 0;
+
+ public long register(String name) {
+ if (categories.containsKey(name)) {
+ throw new IllegalStateException("Category " + name + " already
exsits");
+ }
+ if (bitPos > NO_CATEGORIES - 1) {
+ throw new IllegalStateException("Cannot add category " + name);
+ }
+ final long categoryCode = 1L << bitPos++;
+ categories.put(name, categoryCode);
+ return categoryCode;
+ }
+
+ public long get(String name) {
+ return categories.get(name);
+ }
+
+ public long get(String... names) {
+ long result = 0;
+ for (String name : names) {
+ result |= get(name);
+ }
+ return result;
+ }
+
+ public String getName(long categoryCode) {
+ for (Map.Entry<String, Long> e : categories.entrySet()) {
+ if (categoryCode == e.getValue()) {
+ return e.getKey();
+ }
+ }
+ throw new IllegalArgumentException("No category for code " +
categoryCode);
+ }
+}
diff --git
a/hyracks-fullstack/hyracks/hyracks-util/src/main/java/org/apache/hyracks/util/trace/Tracer.java
b/hyracks-fullstack/hyracks/hyracks-util/src/main/java/org/apache/hyracks/util/trace/Tracer.java
index 00991e4..518ad42 100644
---
a/hyracks-fullstack/hyracks/hyracks-util/src/main/java/org/apache/hyracks/util/trace/Tracer.java
+++
b/hyracks-fullstack/hyracks/hyracks-util/src/main/java/org/apache/hyracks/util/trace/Tracer.java
@@ -35,6 +35,8 @@
public static final Logger LOGGER =
Logger.getLogger(Tracer.class.getName());
+ private final TraceCategoryRegistry registry =
TraceCategoryRegistry.INSTANCE;
+
protected static final Level TRACE_LOG_LEVEL = Level.INFO;
protected static final String CAT = "Tracer";
protected static final DateFormat DATE_FORMAT = new
SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX");
@@ -77,19 +79,38 @@
@Override
public long durationB(String name, String cat, String args) {
+ Event e = Event.create(name, cat, Phase.B, pid,
Thread.currentThread().getId(), null, args, registry);
+ traceLog.log(TRACE_LOG_LEVEL, e.toJson());
+ return e.tid;
+ }
+
+ @Override
+ public void durationE(long tid, String cat, String args) {
+ Event e = Event.create(null, null, Phase.E, pid, tid, null, args,
registry);
+ traceLog.log(TRACE_LOG_LEVEL, e.toJson());
+ }
+
+ @Override
+ public void instant(String name, String cat, Scope scope, String args) {
+ Event e = Event.create(name, cat, Phase.i, pid,
Thread.currentThread().getId(), scope, args, registry);
+ traceLog.log(TRACE_LOG_LEVEL, e.toJson());
+ }
+
+ @Override
+ public long durationB(String name, long cat, String args) {
Event e = Event.create(name, cat, Phase.B, pid,
Thread.currentThread().getId(), null, args);
traceLog.log(TRACE_LOG_LEVEL, e.toJson());
return e.tid;
}
@Override
- public void durationE(long tid, String args) {
- Event e = Event.create(null, null, Phase.E, pid, tid, null, args);
+ public void durationE(long tid, long cat, String args) {
+ Event e = Event.create(null, 0L, Phase.E, pid, tid, null, args);
traceLog.log(TRACE_LOG_LEVEL, e.toJson());
}
@Override
- public void instant(String name, String cat, Scope scope, String args) {
+ public void instant(String name, long cat, Scope scope, String args) {
Event e = Event.create(name, cat, Phase.i, pid,
Thread.currentThread().getId(), scope, args);
traceLog.log(TRACE_LOG_LEVEL, e.toJson());
}
diff --git
a/hyracks-fullstack/hyracks/hyracks-util/src/test/java/org/apache/hyracks/util/trace/TraceCategoryRegistryTest.java
b/hyracks-fullstack/hyracks/hyracks-util/src/test/java/org/apache/hyracks/util/trace/TraceCategoryRegistryTest.java
new file mode 100644
index 0000000..fc725cb
--- /dev/null
+++
b/hyracks-fullstack/hyracks/hyracks-util/src/test/java/org/apache/hyracks/util/trace/TraceCategoryRegistryTest.java
@@ -0,0 +1,93 @@
+/*
+ * 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.hyracks.util.trace;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+public class TraceCategoryRegistryTest {
+
+ @Test
+ public void limit() {
+ TraceCategoryRegistry registry = new TraceCategoryRegistry();
+
+ int success = 0;
+ int fail = 0;
+ String expectedError = "Cannot add category";
+ String actualError = null;
+ for (int i = 0; i < TraceCategoryRegistry.NO_CATEGORIES + 1; ++i) {
+ try {
+ final String name = "cat" + Integer.toHexString(i);
+ registry.register(name);
+ ++success;
+ } catch (IllegalStateException ise) {
+ actualError = ise.getMessage();
+ ++fail;
+ }
+ }
+ Assert.assertEquals(64, success);
+ Assert.assertEquals(1, fail);
+ Assert.assertTrue(actualError.contains(expectedError));
+ }
+
+ @Test
+ public void getNameValidCode() {
+ TraceCategoryRegistry registry = new TraceCategoryRegistry();
+ registry.register("catA");
+ registry.register("catB");
+ registry.register("catC");
+
+ int success = 0;
+ int fail = 0;
+ String expectedError = "No category for code";
+ String actualError = null;
+ String expectedResult = "catC";
+ String actualResult = null;
+ for (int i = 0; i < TraceCategoryRegistry.NO_CATEGORIES; ++i) {
+ try {
+ final long code = 1L << i;
+ actualResult = registry.getName(code);
+ ++success;
+ } catch (IllegalArgumentException iae) {
+ actualError = iae.getMessage();
+ ++fail;
+ }
+ }
+
+ Assert.assertEquals(3, success);
+ Assert.assertEquals(61, fail);
+ Assert.assertEquals(actualResult, expectedResult);
+ Assert.assertTrue(actualError.contains(expectedError));
+ }
+
+ @Test
+ public void getNameInvalidCode() {
+ TraceCategoryRegistry registry = new TraceCategoryRegistry();
+
+ final String expectedError = "No category for code";
+ String actualError = null;
+ try {
+ registry.getName(11);
+ } catch (IllegalArgumentException iae) {
+ actualError = iae.getMessage();
+ }
+ Assert.assertTrue(actualError.contains(expectedError));
+ }
+}
--
To view, visit https://asterix-gerrit.ics.uci.edu/2087
To unsubscribe, visit https://asterix-gerrit.ics.uci.edu/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: I3f26ae988d3786ef4ddb17e8fe78f911e7e628f1
Gerrit-PatchSet: 1
Gerrit-Project: asterixdb
Gerrit-Branch: master
Gerrit-Owner: Till Westmann <[email protected]>