You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@oozie.apache.org by rk...@apache.org on 2015/03/31 19:33:59 UTC
oozie git commit: OOZIE-2174 Add missing admin commands to
OozieClient and OozieCLI (rkanter)
Repository: oozie
Updated Branches:
refs/heads/master cc12e8f17 -> f9b3746ae
OOZIE-2174 Add missing admin commands to OozieClient and OozieCLI (rkanter)
Project: http://git-wip-us.apache.org/repos/asf/oozie/repo
Commit: http://git-wip-us.apache.org/repos/asf/oozie/commit/f9b3746a
Tree: http://git-wip-us.apache.org/repos/asf/oozie/tree/f9b3746a
Diff: http://git-wip-us.apache.org/repos/asf/oozie/diff/f9b3746a
Branch: refs/heads/master
Commit: f9b3746ae53d2544ef20510c2aa091e22813b1bc
Parents: cc12e8f
Author: Robert Kanter <rk...@cloudera.com>
Authored: Tue Mar 31 10:33:31 2015 -0700
Committer: Robert Kanter <rk...@cloudera.com>
Committed: Tue Mar 31 10:33:31 2015 -0700
----------------------------------------------------------------------
.../java/org/apache/oozie/cli/OozieCLI.java | 109 +++-
.../org/apache/oozie/client/OozieClient.java | 499 ++++++++++++++++++-
.../org/apache/oozie/client/TestOozieCLI.java | 184 ++++++-
docs/src/site/twiki/DG_CommandLineTool.twiki | 222 ++++++++-
release-log.txt | 1 +
5 files changed, 981 insertions(+), 34 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/oozie/blob/f9b3746a/client/src/main/java/org/apache/oozie/cli/OozieCLI.java
----------------------------------------------------------------------
diff --git a/client/src/main/java/org/apache/oozie/cli/OozieCLI.java b/client/src/main/java/org/apache/oozie/cli/OozieCLI.java
index 5feb360..5393f68 100644
--- a/client/src/main/java/org/apache/oozie/cli/OozieCLI.java
+++ b/client/src/main/java/org/apache/oozie/cli/OozieCLI.java
@@ -72,6 +72,7 @@ import java.util.Locale;
import java.util.Map;
import java.util.Properties;
import java.util.TimeZone;
+import java.util.TreeMap;
import java.util.concurrent.Callable;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@@ -154,7 +155,12 @@ public class OozieCLI {
public static final String SLA_ENABLE_ALERT = "sla_enable";
public static final String SLA_CHANGE = "sla_change";
+ public static final String SERVER_CONFIGURATION_OPTION = "configuration";
+ public static final String SERVER_OS_ENV_OPTION = "osenv";
+ public static final String SERVER_JAVA_SYSTEM_PROPERTIES_OPTION = "javasysprops";
+ public static final String METRICS_OPTION = "metrics";
+ public static final String INSTRUMENTATION_OPTION = "instrumentation";
public static final String AUTH_OPTION = "auth";
@@ -259,6 +265,11 @@ public class OozieCLI {
Option availServers = new Option(AVAILABLE_SERVERS_OPTION, false, "list available Oozie servers"
+ " (more than one only if HA is enabled)");
Option sharelibUpdate = new Option(UPDATE_SHARELIB_OPTION, false, "Update server to use a newer version of sharelib");
+ Option serverConfiguration = new Option(SERVER_CONFIGURATION_OPTION, false, "show Oozie system configuration");
+ Option osEnv = new Option(SERVER_OS_ENV_OPTION, false, "show Oozie system OS environment");
+ Option javaSysProps = new Option(SERVER_JAVA_SYSTEM_PROPERTIES_OPTION, false, "show Oozie Java system properties");
+ Option metrics = new Option(METRICS_OPTION, false, "show Oozie system metrics");
+ Option instrumentation = new Option(INSTRUMENTATION_OPTION, false, "show Oozie system instrumentation");
Option sharelib = new Option(LIST_SHARELIB_LIB_OPTION, false,
"List available sharelib that can be specified in a workflow action");
@@ -275,6 +286,11 @@ public class OozieCLI {
group.addOption(availServers);
group.addOption(sharelibUpdate);
group.addOption(sharelib);
+ group.addOption(serverConfiguration);
+ group.addOption(osEnv);
+ group.addOption(javaSysProps);
+ group.addOption(metrics);
+ group.addOption(instrumentation);
adminOptions.addOptionGroup(group);
addAuthOptions(adminOptions);
return adminOptions;
@@ -1816,9 +1832,38 @@ public class OozieCLI {
}
}
else if (options.contains(AVAILABLE_SERVERS_OPTION)) {
- Map<String, String> availableOozieServers = wc.getAvailableOozieServers();
- for (String key : availableOozieServers.keySet()) {
- System.out.println(key + " : " + availableOozieServers.get(key));
+ Map<String, String> availableOozieServers = new TreeMap<String, String>(wc.getAvailableOozieServers());
+ for (Map.Entry<String, String> ent : availableOozieServers.entrySet()) {
+ System.out.println(ent.getKey() + " : " + ent.getValue());
+ }
+ } else if (options.contains(SERVER_CONFIGURATION_OPTION)) {
+ Map<String, String> serverConfig = new TreeMap<String, String>(wc.getServerConfiguration());
+ for (Map.Entry<String, String> ent : serverConfig.entrySet()) {
+ System.out.println(ent.getKey() + " : " + ent.getValue());
+ }
+ } else if (options.contains(SERVER_OS_ENV_OPTION)) {
+ Map<String, String> osEnv = new TreeMap<String, String>(wc.getOSEnv());
+ for (Map.Entry<String, String> ent : osEnv.entrySet()) {
+ System.out.println(ent.getKey() + " : " + ent.getValue());
+ }
+ } else if (options.contains(SERVER_JAVA_SYSTEM_PROPERTIES_OPTION)) {
+ Map<String, String> javaSysProps = new TreeMap<String, String>(wc.getJavaSystemProperties());
+ for (Map.Entry<String, String> ent : javaSysProps.entrySet()) {
+ System.out.println(ent.getKey() + " : " + ent.getValue());
+ }
+ } else if (options.contains(METRICS_OPTION)) {
+ OozieClient.Metrics metrics = wc.getMetrics();
+ if (metrics == null) {
+ System.out.println("Metrics are unavailable. Try Instrumentation (-" + INSTRUMENTATION_OPTION + ") instead");
+ } else {
+ printMetrics(metrics);
+ }
+ } else if (options.contains(INSTRUMENTATION_OPTION)) {
+ OozieClient.Instrumentation instrumentation = wc.getInstrumentation();
+ if (instrumentation == null) {
+ System.out.println("Instrumentation is unavailable. Try Metrics (-" + METRICS_OPTION + ") instead");
+ } else {
+ printInstrumentation(instrumentation);
}
}
}
@@ -2186,4 +2231,62 @@ public class OozieCLI {
}
}
+ private void printMetrics(OozieClient.Metrics metrics) {
+ System.out.println("COUNTERS");
+ System.out.println("--------");
+ Map<String, Long> counters = new TreeMap<String, Long>(metrics.getCounters());
+ for (Map.Entry<String, Long> ent : counters.entrySet()) {
+ System.out.println(ent.getKey() + " : " + ent.getValue());
+ }
+ System.out.println("\nGAUGES");
+ System.out.println("------");
+ Map<String, Object> gauges = new TreeMap<String, Object>(metrics.getGauges());
+ for (Map.Entry<String, Object> ent : gauges.entrySet()) {
+ System.out.println(ent.getKey() + " : " + ent.getValue());
+ }
+ System.out.println("\nTIMERS");
+ System.out.println("------");
+ Map<String, OozieClient.Metrics.Timer> timers = new TreeMap<String, OozieClient.Metrics.Timer>(metrics.getTimers());
+ for (Map.Entry<String, OozieClient.Metrics.Timer> ent : timers.entrySet()) {
+ System.out.println(ent.getKey());
+ System.out.println(ent.getValue());
+ }
+ System.out.println("\nHISTOGRAMS");
+ System.out.println("----------");
+ Map<String, OozieClient.Metrics.Histogram> histograms =
+ new TreeMap<String, OozieClient.Metrics.Histogram>(metrics.getHistograms());
+ for (Map.Entry<String, OozieClient.Metrics.Histogram> ent : histograms.entrySet()) {
+ System.out.println(ent.getKey());
+ System.out.println(ent.getValue());
+ }
+ }
+
+ private void printInstrumentation(OozieClient.Instrumentation instrumentation) {
+ System.out.println("COUNTERS");
+ System.out.println("--------");
+ Map<String, Long> counters = new TreeMap<String, Long>(instrumentation.getCounters());
+ for (Map.Entry<String, Long> ent : counters.entrySet()) {
+ System.out.println(ent.getKey() + " : " + ent.getValue());
+ }
+ System.out.println("\nVARIABLES");
+ System.out.println("---------");
+ Map<String, Object> variables = new TreeMap<String, Object>(instrumentation.getVariables());
+ for (Map.Entry<String, Object> ent : variables.entrySet()) {
+ System.out.println(ent.getKey() + " : " + ent.getValue());
+ }
+ System.out.println("\nSAMPLERS");
+ System.out.println("---------");
+ Map<String, Double> samplers = new TreeMap<String, Double>(instrumentation.getSamplers());
+ for (Map.Entry<String, Double> ent : samplers.entrySet()) {
+ System.out.println(ent.getKey() + " : " + ent.getValue());
+ }
+ System.out.println("\nTIMERS");
+ System.out.println("---------");
+ Map<String, OozieClient.Instrumentation.Timer> timers =
+ new TreeMap<String, OozieClient.Instrumentation.Timer>(instrumentation.getTimers());
+ for (Map.Entry<String, OozieClient.Instrumentation.Timer> ent : timers.entrySet()) {
+ System.out.println(ent.getKey());
+ System.out.println(ent.getValue());
+ }
+ }
}
http://git-wip-us.apache.org/repos/asf/oozie/blob/f9b3746a/client/src/main/java/org/apache/oozie/client/OozieClient.java
----------------------------------------------------------------------
diff --git a/client/src/main/java/org/apache/oozie/client/OozieClient.java b/client/src/main/java/org/apache/oozie/client/OozieClient.java
index 416d066..61d7923 100644
--- a/client/src/main/java/org/apache/oozie/client/OozieClient.java
+++ b/client/src/main/java/org/apache/oozie/client/OozieClient.java
@@ -567,6 +567,30 @@ public class OozieClient {
protected abstract T call(HttpURLConnection conn) throws IOException, OozieClientException;
}
+ protected abstract class MapClientCallable extends ClientCallable<Map<String, String>> {
+
+ MapClientCallable(String method, String collection, String resource, Map<String, String> params) {
+ super(method, collection, resource, params);
+ }
+
+ @Override
+ protected Map<String, String> call(HttpURLConnection conn) throws IOException, OozieClientException {
+ if ((conn.getResponseCode() == HttpURLConnection.HTTP_OK)) {
+ Reader reader = new InputStreamReader(conn.getInputStream());
+ JSONObject json = (JSONObject) JSONValue.parse(reader);
+ Map<String, String> map = new HashMap<String, String>();
+ for (Object key : json.keySet()) {
+ map.put((String)key, (String)json.get(key));
+ }
+ return map;
+ }
+ else {
+ handleError(conn);
+ }
+ return null;
+ }
+ }
+
static void handleError(HttpURLConnection conn) throws IOException, OozieClientException {
int status = conn.getResponseCode();
String error = conn.getHeaderField(RestConstants.OOZIE_ERROR_CODE);
@@ -2000,7 +2024,6 @@ public class OozieClient {
}
bf.append(System.getProperty("line.separator"));
}
- return bf.toString();
}
else{
JSONObject obj = (JSONObject) ((JSONObject) sharelib).get(JsonTags.SHARELIB_LIB_UPDATE);
@@ -2010,6 +2033,7 @@ public class OozieClient {
}
bf.append(System.getProperty("line.separator"));
}
+ return bf.toString();
}
else {
handleError(conn);
@@ -2245,22 +2269,91 @@ public class OozieClient {
return new GetQueueDump().call();
}
- private class GetAvailableOozieServers extends ClientCallable<Map<String, String>> {
+ private class GetAvailableOozieServers extends MapClientCallable {
GetAvailableOozieServers() {
super("GET", RestConstants.ADMIN, RestConstants.ADMIN_AVAILABLE_OOZIE_SERVERS_RESOURCE, prepareParams());
}
+ }
+
+ /**
+ * Return the list of available Oozie servers.
+ *
+ * @return the list of available Oozie servers.
+ * @throws OozieClientException throw if it the list of available Oozie servers could not be retrieved.
+ */
+ public Map<String, String> getAvailableOozieServers() throws OozieClientException {
+ return new GetAvailableOozieServers().call();
+ }
+
+ private class GetServerConfiguration extends MapClientCallable {
+
+ GetServerConfiguration() {
+ super("GET", RestConstants.ADMIN, RestConstants.ADMIN_CONFIG_RESOURCE, prepareParams());
+ }
+ }
+
+ /**
+ * Return the Oozie system configuration.
+ *
+ * @return the Oozie system configuration.
+ * @throws OozieClientException throw if the system configuration could not be retrieved.
+ */
+ public Map<String, String> getServerConfiguration() throws OozieClientException {
+ return new GetServerConfiguration().call();
+ }
+
+ private class GetJavaSystemProperties extends MapClientCallable {
+
+ GetJavaSystemProperties() {
+ super("GET", RestConstants.ADMIN, RestConstants.ADMIN_JAVA_SYS_PROPS_RESOURCE, prepareParams());
+ }
+ }
+
+ /**
+ * Return the Oozie Java system properties.
+ *
+ * @return the Oozie Java system properties.
+ * @throws OozieClientException throw if the system properties could not be retrieved.
+ */
+ public Map<String, String> getJavaSystemProperties() throws OozieClientException {
+ return new GetJavaSystemProperties().call();
+ }
+
+ private class GetOSEnv extends MapClientCallable {
+
+ GetOSEnv() {
+ super("GET", RestConstants.ADMIN, RestConstants.ADMIN_OS_ENV_RESOURCE, prepareParams());
+ }
+ }
+
+ /**
+ * Return the Oozie system OS environment.
+ *
+ * @return the Oozie system OS environment.
+ * @throws OozieClientException throw if the system OS environment could not be retrieved.
+ */
+ public Map<String, String> getOSEnv() throws OozieClientException {
+ return new GetOSEnv().call();
+ }
+
+ private class GetMetrics extends ClientCallable<Metrics> {
+
+ GetMetrics() {
+ super("GET", RestConstants.ADMIN, RestConstants.ADMIN_METRICS_RESOURCE, prepareParams());
+ }
@Override
- protected Map<String, String> call(HttpURLConnection conn) throws IOException, OozieClientException {
+ protected Metrics call(HttpURLConnection conn) throws IOException, OozieClientException {
if ((conn.getResponseCode() == HttpURLConnection.HTTP_OK)) {
Reader reader = new InputStreamReader(conn.getInputStream());
JSONObject json = (JSONObject) JSONValue.parse(reader);
- Map<String, String> map = new HashMap<String, String>();
- for (Object key : json.keySet()) {
- map.put((String)key, (String)json.get(key));
- }
- return map;
+ Metrics metrics = new Metrics(json);
+ return metrics;
+ }
+ else if ((conn.getResponseCode() == HttpURLConnection.HTTP_UNAVAILABLE)) {
+ // Use Instrumentation endpoint
+ return null;
}
else {
handleError(conn);
@@ -2269,16 +2362,396 @@ public class OozieClient {
}
}
+ public class Metrics {
+ private Map<String, Long> counters;
+ private Map<String, Object> gauges;
+ private Map<String, Timer> timers;
+ private Map<String, Histogram> histograms;
+
+ @SuppressWarnings("unchecked")
+ public Metrics(JSONObject json) {
+ JSONObject jCounters = (JSONObject) json.get("counters");
+ counters = new HashMap<String, Long>(jCounters.size());
+ for (Object entO : jCounters.entrySet()) {
+ Entry<String, JSONObject> ent = (Entry<String, JSONObject>) entO;
+ counters.put(ent.getKey(), (Long)ent.getValue().get("count"));
+ }
+
+ JSONObject jGuages = (JSONObject) json.get("gauges");
+ gauges = new HashMap<String, Object>(jGuages.size());
+ for (Object entO : jGuages.entrySet()) {
+ Entry<String, JSONObject> ent = (Entry<String, JSONObject>) entO;
+ gauges.put(ent.getKey(), ent.getValue().get("value"));
+ }
+
+ JSONObject jTimers = (JSONObject) json.get("timers");
+ timers = new HashMap<String, Timer>(jTimers.size());
+ for (Object entO : jTimers.entrySet()) {
+ Entry<String, JSONObject> ent = (Entry<String, JSONObject>) entO;
+ timers.put(ent.getKey(), new Timer(ent.getValue()));
+ }
+
+ JSONObject jHistograms = (JSONObject) json.get("histograms");
+ histograms = new HashMap<String, Histogram>(jHistograms.size());
+ for (Object entO : jHistograms.entrySet()) {
+ Entry<String, JSONObject> ent = (Entry<String, JSONObject>) entO;
+ histograms.put(ent.getKey(), new Histogram(ent.getValue()));
+ }
+ }
+
+ public Map<String, Long> getCounters() {
+ return counters;
+ }
+
+ public Map<String, Object> getGauges() {
+ return gauges;
+ }
+
+ public Map<String, Timer> getTimers() {
+ return timers;
+ }
+
+ public Map<String, Histogram> getHistograms() {
+ return histograms;
+ }
+
+ public class Timer extends Histogram {
+ private double m15Rate;
+ private double m5Rate;
+ private double m1Rate;
+ private double meanRate;
+ private String durationUnits;
+ private String rateUnits;
+
+ public Timer(JSONObject json) {
+ super(json);
+ m15Rate = Double.valueOf(json.get("m15_rate").toString());
+ m5Rate = Double.valueOf(json.get("m5_rate").toString());
+ m1Rate = Double.valueOf(json.get("m1_rate").toString());
+ meanRate = Double.valueOf(json.get("mean_rate").toString());
+ durationUnits = json.get("duration_units").toString();
+ rateUnits = json.get("rate_units").toString();
+ }
+
+ public double get15MinuteRate() {
+ return m15Rate;
+ }
+
+ public double get5MinuteRate() {
+ return m5Rate;
+ }
+
+ public double get1MinuteRate() {
+ return m1Rate;
+ }
+
+ public double getMeanRate() {
+ return meanRate;
+ }
+
+ public String getDurationUnits() {
+ return durationUnits;
+ }
+
+ public String getRateUnits() {
+ return rateUnits;
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder(super.toString());
+ sb.append("\n\t15 minute rate : ").append(m15Rate);
+ sb.append("\n\t5 minute rate : ").append(m5Rate);
+ sb.append("\n\t1 minute rate : ").append(m15Rate);
+ sb.append("\n\tmean rate : ").append(meanRate);
+ sb.append("\n\tduration units : ").append(durationUnits);
+ sb.append("\n\trate units : ").append(rateUnits);
+ return sb.toString();
+ }
+ }
+
+ public class Histogram {
+ private double p999;
+ private double p99;
+ private double p98;
+ private double p95;
+ private double p75;
+ private double p50;
+ private double mean;
+ private double min;
+ private double max;
+ private double stdDev;
+ private long count;
+
+ public Histogram(JSONObject json) {
+ p999 = Double.valueOf(json.get("p999").toString());
+ p99 = Double.valueOf(json.get("p99").toString());
+ p98 = Double.valueOf(json.get("p98").toString());
+ p95 = Double.valueOf(json.get("p95").toString());
+ p75 = Double.valueOf(json.get("p75").toString());
+ p50 = Double.valueOf(json.get("p50").toString());
+ mean = Double.valueOf(json.get("mean").toString());
+ min = Double.valueOf(json.get("min").toString());
+ max = Double.valueOf(json.get("max").toString());
+ stdDev = Double.valueOf(json.get("stddev").toString());
+ count = Long.valueOf(json.get("count").toString());
+ }
+
+ public double get999thPercentile() {
+ return p999;
+ }
+
+ public double get99thPercentile() {
+ return p99;
+ }
+
+ public double get98thPercentile() {
+ return p98;
+ }
+
+ public double get95thPercentile() {
+ return p95;
+ }
+
+ public double get75thPercentile() {
+ return p75;
+ }
+
+ public double get50thPercentile() {
+ return p50;
+ }
+
+ public double getMean() {
+ return mean;
+ }
+
+ public double getMin() {
+ return min;
+ }
+
+ public double getMax() {
+ return max;
+ }
+
+ public double getStandardDeviation() {
+ return stdDev;
+ }
+
+ public long getCount() {
+ return count;
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ sb.append("\t999th percentile : ").append(p999);
+ sb.append("\n\t99th percentile : ").append(p99);
+ sb.append("\n\t98th percentile : ").append(p98);
+ sb.append("\n\t95th percentile : ").append(p95);
+ sb.append("\n\t75th percentile : ").append(p75);
+ sb.append("\n\t50th percentile : ").append(p50);
+ sb.append("\n\tmean : ").append(mean);
+ sb.append("\n\tmax : ").append(max);
+ sb.append("\n\tmin : ").append(min);
+ sb.append("\n\tcount : ").append(count);
+ sb.append("\n\tstandard deviation : ").append(stdDev);
+ return sb.toString();
+ }
+ }
+ }
+
/**
- * Return the list of available Oozie servers.
+ * Return the Oozie metrics. If null is returned, then try {@link #getInstrumentation()}.
*
- * @return the list of available Oozie servers.
- * @throws OozieClientException throw if it the list of available Oozie servers could not be retrieved.
+ * @return the Oozie metrics or null.
+ * @throws OozieClientException throw if the metrics could not be retrieved.
*/
- public Map<String, String> getAvailableOozieServers() throws OozieClientException {
- return new GetAvailableOozieServers().call();
+ public Metrics getMetrics() throws OozieClientException {
+ return new GetMetrics().call();
+ }
+
+ private class GetInstrumentation extends ClientCallable<Instrumentation> {
+
+ GetInstrumentation() {
+ super("GET", RestConstants.ADMIN, RestConstants.ADMIN_INSTRUMENTATION_RESOURCE, prepareParams());
+ }
+
+ @Override
+ protected Instrumentation call(HttpURLConnection conn) throws IOException, OozieClientException {
+ if ((conn.getResponseCode() == HttpURLConnection.HTTP_OK)) {
+ Reader reader = new InputStreamReader(conn.getInputStream());
+ JSONObject json = (JSONObject) JSONValue.parse(reader);
+ Instrumentation instrumentation = new Instrumentation(json);
+ return instrumentation;
+ }
+ else if ((conn.getResponseCode() == HttpURLConnection.HTTP_UNAVAILABLE)) {
+ // Use Metrics endpoint
+ return null;
+ }
+ else {
+ handleError(conn);
+ }
+ return null;
+ }
}
+ public class Instrumentation {
+ private Map<String, Long> counters;
+ private Map<String, Object> variables;
+ private Map<String, Double> samplers;
+ private Map<String, Timer> timers;
+
+ public Instrumentation(JSONObject json) {
+ JSONArray jCounters = (JSONArray) json.get("counters");
+ counters = new HashMap<String, Long>(jCounters.size());
+ for (Object groupO : jCounters) {
+ JSONObject group = (JSONObject) groupO;
+ String groupName = group.get("group").toString() + ".";
+ JSONArray data = (JSONArray) group.get("data");
+ for (Object datO : data) {
+ JSONObject dat = (JSONObject) datO;
+ counters.put(groupName + dat.get("name").toString(), Long.valueOf(dat.get("value").toString()));
+ }
+ }
+
+ JSONArray jVariables = (JSONArray) json.get("variables");
+ variables = new HashMap<String, Object>(jVariables.size());
+ for (Object groupO : jVariables) {
+ JSONObject group = (JSONObject) groupO;
+ String groupName = group.get("group").toString() + ".";
+ JSONArray data = (JSONArray) group.get("data");
+ for (Object datO : data) {
+ JSONObject dat = (JSONObject) datO;
+ variables.put(groupName + dat.get("name").toString(), dat.get("value"));
+ }
+ }
+
+ JSONArray jSamplers = (JSONArray) json.get("samplers");
+ samplers = new HashMap<String, Double>(jSamplers.size());
+ for (Object groupO : jSamplers) {
+ JSONObject group = (JSONObject) groupO;
+ String groupName = group.get("group").toString() + ".";
+ JSONArray data = (JSONArray) group.get("data");
+ for (Object datO : data) {
+ JSONObject dat = (JSONObject) datO;
+ samplers.put(groupName + dat.get("name").toString(), Double.valueOf(dat.get("value").toString()));
+ }
+ }
+
+ JSONArray jTimers = (JSONArray) json.get("timers");
+ timers = new HashMap<String, Timer>(jTimers.size());
+ for (Object groupO : jTimers) {
+ JSONObject group = (JSONObject) groupO;
+ String groupName = group.get("group").toString() + ".";
+ JSONArray data = (JSONArray) group.get("data");
+ for (Object datO : data) {
+ JSONObject dat = (JSONObject) datO;
+ timers.put(groupName + dat.get("name").toString(), new Timer(dat));
+ }
+ }
+ }
+
+ public class Timer {
+ private double ownTimeStdDev;
+ private long ownTimeAvg;
+ private long ownMaxTime;
+ private long ownMinTime;
+ private double totalTimeStdDev;
+ private long totalTimeAvg;
+ private long totalMaxTime;
+ private long totalMinTime;
+ private long ticks;
+
+ public Timer(JSONObject json) {
+ ownTimeStdDev = Double.valueOf(json.get("ownTimeStdDev").toString());
+ ownTimeAvg = Long.valueOf(json.get("ownTimeAvg").toString());
+ ownMaxTime = Long.valueOf(json.get("ownMaxTime").toString());
+ ownMinTime = Long.valueOf(json.get("ownMinTime").toString());
+ totalTimeStdDev = Double.valueOf(json.get("totalTimeStdDev").toString());
+ totalTimeAvg = Long.valueOf(json.get("totalTimeAvg").toString());
+ totalMaxTime = Long.valueOf(json.get("totalMaxTime").toString());
+ totalMinTime = Long.valueOf(json.get("totalMinTime").toString());
+ ticks = Long.valueOf(json.get("ticks").toString());
+ }
+
+ public double getOwnTimeStandardDeviation() {
+ return ownTimeStdDev;
+ }
+
+ public long getOwnTimeAverage() {
+ return ownTimeAvg;
+ }
+
+ public long getOwnMaxTime() {
+ return ownMaxTime;
+ }
+
+ public long getOwnMinTime() {
+ return ownMinTime;
+ }
+
+ public double getTotalTimeStandardDeviation() {
+ return totalTimeStdDev;
+ }
+
+ public long getTotalTimeAverage() {
+ return totalTimeAvg;
+ }
+
+ public long getTotalMaxTime() {
+ return totalMaxTime;
+ }
+
+ public long getTotalMinTime() {
+ return totalMinTime;
+ }
+
+ public long getTicks() {
+ return ticks;
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ sb.append("\town time standard deviation : ").append(ownTimeStdDev);
+ sb.append("\n\town average time : ").append(ownTimeAvg);
+ sb.append("\n\town max time : ").append(ownMaxTime);
+ sb.append("\n\town min time : ").append(ownMinTime);
+ sb.append("\n\ttotal time standard deviation : ").append(totalTimeStdDev);
+ sb.append("\n\ttotal average time : ").append(totalTimeAvg);
+ sb.append("\n\ttotal max time : ").append(totalMaxTime);
+ sb.append("\n\ttotal min time : ").append(totalMinTime);
+ sb.append("\n\tticks : ").append(ticks);
+ return sb.toString();
+ }
+ }
+
+ public Map<String, Long> getCounters() {
+ return counters;
+ }
+
+ public Map<String, Object> getVariables() {
+ return variables;
+ }
+
+ public Map<String, Double> getSamplers() {
+ return samplers;
+ }
+
+ public Map<String, Timer> getTimers() {
+ return timers;
+ }
+ }
+
+ /**
+ * Return the Oozie instrumentation. If null is returned, then try {@link #getMetrics()}.
+ *
+ * @return the Oozie intstrumentation or null.
+ * @throws OozieClientException throw if the intstrumentation could not be retrieved.
+ */
+ public Instrumentation getInstrumentation() throws OozieClientException {
+ return new GetInstrumentation().call();
+ }
/**
* Check if the string is not null or not empty.
http://git-wip-us.apache.org/repos/asf/oozie/blob/f9b3746a/core/src/test/java/org/apache/oozie/client/TestOozieCLI.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/oozie/client/TestOozieCLI.java b/core/src/test/java/org/apache/oozie/client/TestOozieCLI.java
index e55d5f6..83929f5 100644
--- a/core/src/test/java/org/apache/oozie/client/TestOozieCLI.java
+++ b/core/src/test/java/org/apache/oozie/client/TestOozieCLI.java
@@ -18,20 +18,27 @@
package org.apache.oozie.client;
+import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.OutputStream;
+import java.io.PrintStream;
import java.io.StringReader;
import java.util.Properties;
import java.util.concurrent.Callable;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
+import org.apache.oozie.BuildInfo;
import org.apache.oozie.cli.CLIParser;
import org.apache.oozie.cli.OozieCLI;
import org.apache.oozie.client.rest.RestConstants;
+import org.apache.oozie.service.InstrumentationService;
+import org.apache.oozie.service.MetricsInstrumentationService;
+import org.apache.oozie.service.Services;
+import org.apache.oozie.service.ShareLibService;
import org.apache.oozie.servlet.DagServletTestCase;
import org.apache.oozie.servlet.MockCoordinatorEngineService;
import org.apache.oozie.servlet.MockDagEngineService;
@@ -906,10 +913,12 @@ public class TestOozieCLI extends DagServletTestCase {
String oozieUrl = getContextURL();
String[] args = new String[]{"admin", "-status", "-oozie", oozieUrl};
- assertEquals(0, new OozieCLI().run(args));
+ String out = runOozieCLIAndGetStdout(args);
+ assertEquals("System mode: NORMAL\n", out);
args = new String[]{"admin", "-oozie", oozieUrl, "-systemmode", "NORMAL"};
- assertEquals(0, new OozieCLI().run(args));
+ out = runOozieCLIAndGetStdout(args);
+ assertEquals("System mode: NORMAL\n", out);
return null;
}
});
@@ -923,7 +932,9 @@ public class TestOozieCLI extends DagServletTestCase {
String oozieUrl = getContextURL();
String[] args = new String[]{"admin", "-version", "-oozie", oozieUrl};
- assertEquals(0, new OozieCLI().run(args));
+ String out = runOozieCLIAndGetStdout(args);
+ assertEquals("Oozie server build version: " + BuildInfo.getBuildInfo().getProperty(BuildInfo.BUILD_VERSION)+ "\n",
+ out);
return null;
}
@@ -932,7 +943,8 @@ public class TestOozieCLI extends DagServletTestCase {
public void testClientBuildVersion() throws Exception {
String[] args = new String[]{"version"};
- assertEquals(0, new OozieCLI().run(args));
+ String out = runOozieCLIAndGetStdout(args);
+ assertEquals("Oozie client build version: " + BuildInfo.getBuildInfo().getProperty(BuildInfo.BUILD_VERSION) + "\n", out);
}
public void testJobInfo() throws Exception {
@@ -1101,7 +1113,8 @@ public class TestOozieCLI extends DagServletTestCase {
String oozieUrl = getContextURL();
String[] args = new String[]{"admin", "-queuedump", "-oozie", oozieUrl};
- assertEquals(0, new OozieCLI().run(args));
+ String out = runOozieCLIAndGetStdout(args);
+ assertTrue(out.contains("Server Queue Dump"));
return null;
}
@@ -1113,7 +1126,8 @@ public class TestOozieCLI extends DagServletTestCase {
assertEquals(0, new OozieCLI().run(args));
args = new String[]{"info", "-timezones"};
- assertEquals(0, new OozieCLI().run(args));
+ String out = runOozieCLIAndGetStdout(args);
+ assertTrue(out.contains("Available Time Zones"));
}
public void testValidateWorkFlowCommand() throws Exception {
@@ -1135,11 +1149,13 @@ public class TestOozieCLI extends DagServletTestCase {
IOUtils.copyCharStream(new StringReader(validContent), new FileWriter(validfile));
String [] args = new String[] { "validate", validFileName };
- assertEquals(0, new OozieCLI().run(args));
+ String out = runOozieCLIAndGetStdout(args);
+ assertTrue(out.contains("Valid"));
IOUtils.copyCharStream(new StringReader(invalidContent), new FileWriter(invalidfile));
args = new String[] { "validate", invalidFileName };
- assertEquals(-1, new OozieCLI().run(args));
+ out = runOozieCLIAndGetStderr(args);
+ assertTrue(out.contains("Invalid"));
return null;
}
@@ -1183,7 +1199,8 @@ public class TestOozieCLI extends DagServletTestCase {
String oozieUrl = getContextURL();
String[] args = new String[] {"sla", "-oozie", oozieUrl, "-len", "1" };
- assertEquals(-1, new OozieCLI().run(args));
+ String out = runOozieCLIAndGetStderr(args);
+ assertTrue(out.contains("Could not authenticate, Authentication failed, status: 404, message: Not Found"));
return null;
}
@@ -1195,10 +1212,12 @@ public class TestOozieCLI extends DagServletTestCase {
@Override
public Void call() throws Exception {
HeaderTestingVersionServlet.OOZIE_HEADERS.clear();
+ Services.get().setService(ShareLibService.class);
String oozieUrl = getContextURL();
String[] args = new String[] { "admin", "-sharelibupdate", "-oozie", oozieUrl };
- assertEquals(0, new OozieCLI().run(args));
+ String out = runOozieCLIAndGetStdout(args);
+ assertTrue(out.contains("ShareLib update status"));
return null;
}
@@ -1213,7 +1232,8 @@ public class TestOozieCLI extends DagServletTestCase {
String oozieUrl = getContextURL();
String[] args = new String[] { "admin", "-sharelibupdate", "-oozie", oozieUrl };
- assertEquals(-1, new OozieCLI().run(args));
+ String out = runOozieCLIAndGetStderr(args);
+ assertEquals("Error: E0503 : E0503: User [test] does not have admin privileges\n", out);
return null;
}
@@ -1225,10 +1245,12 @@ public class TestOozieCLI extends DagServletTestCase {
@Override
public Void call() throws Exception {
HeaderTestingVersionServlet.OOZIE_HEADERS.clear();
+ Services.get().setService(ShareLibService.class);
String oozieUrl = getContextURL();
String[] args = new String[] { "admin", "-shareliblist", "-oozie", oozieUrl };
- assertEquals(0, new OozieCLI().run(args));
+ String out = runOozieCLIAndGetStdout(args);
+ assertTrue(out.contains("Available ShareLib"));
return null;
}
@@ -1240,10 +1262,12 @@ public class TestOozieCLI extends DagServletTestCase {
@Override
public Void call() throws Exception {
HeaderTestingVersionServlet.OOZIE_HEADERS.clear();
+ Services.get().setService(ShareLibService.class);
String oozieUrl = getContextURL();
String[] args = new String[] { "admin", "-shareliblist", "pig", "-oozie", oozieUrl };
- assertEquals(0, new OozieCLI().run(args));
+ String out = runOozieCLIAndGetStdout(args);
+ assertTrue(out.contains("Available ShareLib"));
return null;
}
@@ -1311,7 +1335,8 @@ public class TestOozieCLI extends DagServletTestCase {
String oozieUrl = getContextURL();
String[] args = new String[] { "job", "-oozie", oozieUrl };
- assertEquals(-1, new OozieCLI().run(args));
+ String out = runOozieCLIAndGetStderr(args);
+ assertTrue(out.contains("Invalid sub-command"));
return null;
}
});
@@ -1392,4 +1417,135 @@ public class TestOozieCLI extends DagServletTestCase {
});
}
+ public void testAdminConfiguration() throws Exception {
+ runTest(END_POINTS, SERVLET_CLASSES, IS_SECURITY_ENABLED, new Callable<Void>() {
+ @Override
+ public Void call() throws Exception {
+ HeaderTestingVersionServlet.OOZIE_HEADERS.clear();
+
+ String oozieUrl = getContextURL();
+ String[] args = new String[]{"admin", "-configuration", "-oozie", oozieUrl};
+ String out = runOozieCLIAndGetStdout(args);
+ assertTrue(out.contains("oozie.base.url"));
+
+ return null;
+ }
+ });
+ }
+
+ public void testAdminOsEnv() throws Exception {
+ runTest(END_POINTS, SERVLET_CLASSES, IS_SECURITY_ENABLED, new Callable<Void>() {
+ @Override
+ public Void call() throws Exception {
+ HeaderTestingVersionServlet.OOZIE_HEADERS.clear();
+
+ String oozieUrl = getContextURL();
+ String[] args = new String[]{"admin", "-osenv", "-oozie", oozieUrl};
+ String out = runOozieCLIAndGetStdout(args);
+ assertTrue(out.contains("JAVA_HOME"));
+
+ return null;
+ }
+ });
+ }
+
+ public void testAdminJavaSystemProperties() throws Exception {
+ runTest(END_POINTS, SERVLET_CLASSES, IS_SECURITY_ENABLED, new Callable<Void>() {
+ @Override
+ public Void call() throws Exception {
+ HeaderTestingVersionServlet.OOZIE_HEADERS.clear();
+
+ String oozieUrl = getContextURL();
+ String[] args = new String[]{"admin", "-javasysprops", "-oozie", oozieUrl};
+ String out = runOozieCLIAndGetStdout(args);
+ assertTrue(out.contains("java.vendor"));
+
+ return null;
+ }
+ });
+ }
+
+ public void testAdminInstrumentation() throws Exception {
+ runTest(END_POINTS, SERVLET_CLASSES, IS_SECURITY_ENABLED, new Callable<Void>() {
+ @Override
+ public Void call() throws Exception {
+ HeaderTestingVersionServlet.OOZIE_HEADERS.clear();
+ Services.get().setService(InstrumentationService.class);
+
+ String oozieUrl = getContextURL();
+ String[] args = new String[]{"admin", "-instrumentation", "-oozie", oozieUrl};
+ String out = runOozieCLIAndGetStdout(args);
+ assertTrue(out.contains("webservices.version-GET"));
+
+ args = new String[]{"admin", "-metrics", "-oozie", oozieUrl};
+ out = runOozieCLIAndGetStdout(args);
+ assertTrue(out.contains("Metrics are unavailable"));
+
+ return null;
+ }
+ });
+ }
+
+ public void testAdminMetrics() throws Exception {
+ runTest(END_POINTS, SERVLET_CLASSES, IS_SECURITY_ENABLED, new Callable<Void>() {
+ @Override
+ public Void call() throws Exception {
+ HeaderTestingVersionServlet.OOZIE_HEADERS.clear();
+ Services.get().setService(MetricsInstrumentationService.class);
+
+ String oozieUrl = getContextURL();
+ String[] args = new String[]{"admin", "-metrics", "-oozie", oozieUrl};
+ String out = runOozieCLIAndGetStdout(args);
+ assertTrue(out.contains("webservices.version-GET"));
+
+ args = new String[]{"admin", "-instrumentation", "-oozie", oozieUrl};
+ out = runOozieCLIAndGetStdout(args);
+ assertTrue(out.contains("Instrumentation is unavailable"));
+
+ return null;
+ }
+ });
+ }
+
+ private String runOozieCLIAndGetStdout(String[] args) {
+ PrintStream original = System.out;
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ PrintStream ps = new PrintStream(baos);
+ String outStr = null;
+ System.out.flush();
+ try {
+ System.setOut(ps);
+ assertEquals(0, new OozieCLI().run(args));
+ System.out.flush();
+ outStr = baos.toString();
+ } finally {
+ System.setOut(original);
+ if (outStr != null) {
+ System.out.print(outStr);
+ }
+ System.out.flush();
+ }
+ return outStr;
+ }
+
+ private String runOozieCLIAndGetStderr(String[] args) {
+ PrintStream original = System.err;
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ PrintStream ps = new PrintStream(baos);
+ String outStr = null;
+ System.err.flush();
+ try {
+ System.setErr(ps);
+ assertEquals(-1, new OozieCLI().run(args));
+ System.err.flush();
+ outStr = baos.toString();
+ } finally {
+ System.setErr(original);
+ if (outStr != null) {
+ System.err.print(outStr);
+ }
+ System.err.flush();
+ }
+ return outStr;
+ }
}
http://git-wip-us.apache.org/repos/asf/oozie/blob/f9b3746a/docs/src/site/twiki/DG_CommandLineTool.twiki
----------------------------------------------------------------------
diff --git a/docs/src/site/twiki/DG_CommandLineTool.twiki b/docs/src/site/twiki/DG_CommandLineTool.twiki
index 762e2f1..3c85eb6 100644
--- a/docs/src/site/twiki/DG_CommandLineTool.twiki
+++ b/docs/src/site/twiki/DG_CommandLineTool.twiki
@@ -118,17 +118,21 @@ usage:
.
oozie admin <OPTIONS> : admin operations
-auth <arg> select authentication type [SIMPLE|KERBEROS]
- -doas <arg> doAs user, impersonates as the specified user.
+ -configuration show Oozie system configuration
+ -doas <arg> doAs user, impersonates as the specified user
+ -instrumentation show Oozie system instrumentation
+ -javasysprops show Oozie Java system properties
+ -metrics show Oozie system metrics
-oozie <arg> Oozie URL
+ -osenv show Oozie system OS environment
-queuedump show Oozie server queue elements
-servers list available Oozie servers (more than one only if HA is enabled)
+ -shareliblist List available sharelib that can be specified in a workflow action
+ -sharelibupdate Update server to use a newer version of sharelib
-status show the current system status
-systemmode <arg> Supported in Oozie-2.0 or later versions ONLY. Change oozie
system mode [NORMAL|NOWEBSERVICE|SAFEMODE]
-version show Oozie server build version
- -shareliblist List available sharelib that can be specified in a workflow
- action
- -sharelibupdate Update server to use a newer version of sharelib
.
oozie validate <ARGS> : validate a workflow XML file
.
@@ -1191,6 +1195,216 @@ hostC : http://hostC:11000/oozie
It returns a list of available Oozie Servers. This is useful when Oozie is configured for [[AG_Install#HA][High Availability]]; if
not, it will simply return the one Oozie Server.
+---+++ Displaying the Oozie server configuration
+
+Example:
+
+<verbatim>
+$ oozie admin -oozie http://localhost:11000/oozie -configuration
+local.realm : LOCALHOST
+oozie.JobCommand.job.console.url : http://localhost:11000/oozie?job=
+oozie.action.fs.glob.max : 1000
+oozie.action.jobinfo.enable : false
+oozie.action.launcher.mapreduce.job.ubertask.enable : true
+oozie.action.launcher.yarn.timeline-service.enabled : false
+oozie.action.mapreduce.uber.jar.enable : false
+oozie.action.max.output.data : 2048
+oozie.action.retries.max : 3
+...
+</verbatim>
+
+It returns a list of the configuration properties and values from oozie-site.xml and oozie-default.xml being used by the Oozie
+server.
+
+---+++ Displaying the Oozie server OS environment
+
+Example:
+
+<verbatim>
+$ oozie admin -oozie http://localhost:11000/oozie -osenv
+Apple_PubSub_Socket_Render : /private/tmp/com.apple.launchd.V2oxXoP55M/Render
+CATALINA_BASE : /Users/rkanter/dev/oozie/oozie-server
+CATALINA_OUT : /Users/rkanter/dev/oozie/logs/catalina.out
+CATALINA_PID : /Users/rkanter/dev/oozie/oozie-server/temp/oozie.pid
+HADOOP_HOME : /Users/rkanter/dev/hadoop
+HADOOP_HOME_WARN_SUPPRESS : TRUE
+HADOOP_OPTS : -Djava.security.krb5.realm=OX.AC.UK -Djava.security.krb5.kdc=kdc0.ox.ac.uk:kdc1.ox.ac.uk
+...
+</verbatim>
+
+It returns a list of OS environment variables in the Oozie server.
+
+---+++ Displaying the Oozie server Java system properties
+
+Example:
+
+<verbatim>
+$ oozie admin -oozie http://localhost:11000/oozie -javasysprops
+awt.toolkit : sun.lwawt.macosx.LWCToolkit
+catalina.base : /Users/rkanter/dev/oozie/oozie-server
+catalina.home : /Users/rkanter/dev/oozie/oozie-server
+catalina.useNaming : true
+common.loader : ${catalina.base}/lib,${catalina.base}/lib/*.jar,${catalina.home}/lib,${catalina.home}/lib/*.jar
+derby.stream.error.file : /Users/rkanter/dev/oozie/logs/derby.log
+file.encoding : UTF-8
+file.encoding.pkg : sun.io
+file.separator : /
+...
+</verbatim>
+
+It returns a list of java system properties in the Oozie server.
+
+---+++ Displaying the Oozie server Instrumentation
+
+Example:
+
+<verbatim>
+$ oozie admin -oozie http://localhost:11000/oozie -instrumentation
+COUNTERS
+--------
+callablequeue.executed : 1
+callablequeue.queued : 1
+commands.purge.executions : 1
+...
+
+VARIABLES
+---------
+configuration.action.types : [hive, shell, :START:, :FORK:, switch, spark, ssh, hive2, pig, :END:, email, distcp, :KILL:, sub-workflow, fs, java, :JOIN:, sqoop, map-reduce]
+configuration.config.dir : /Users/rkanter/dev/oozie/conf
+configuration.config.file : /Users/rkanter/dev/oozie/conf/oozie-site.xml
+...
+
+SAMPLERS
+---------
+callablequeue.queue.size : 0.0
+callablequeue.threads.active : 0.0
+jdbc.connections.active : 0.0
+...
+
+TIMERS
+---------
+callablequeue.time.in.queue
+ own time standard deviation : -1.0
+ own average time : 1
+ own max time : 1
+ own min time : 1
+ total time standard deviation : -1.0
+ total average time : 1
+ total max time : 1
+ total min time : 1
+ ticks : 1
+commands.purge.call
+ own time standard deviation : -1.0
+ own average time : 222
+ own max time : 222
+ own min time : 222
+ total time standard deviation : -1.0
+ total average time : 222
+ total max time : 222
+ total min time : 222
+ ticks : 1
+...
+</verbatim>
+
+It returns the instrumentation from the Oozie server. Keep in mind that timers and counters that the Oozie server
+hasn't incremented yet will not show up.
+
+*Note:* If Instrumentation is enabled, then Metrics is unavailable.
+
+---+++ Displaying the Oozie server Metrics
+
+Example:
+
+<verbatim>
+$ oozie admin -oozie http://localhost:11000/oozie -metrics
+COUNTERS
+--------
+callablequeue.executed : 1
+callablequeue.queued : 1
+commands.purge.executions : 1
+...
+
+GAUGES
+------
+configuration.action.types : [hive, shell, :START:, :FORK:, switch, spark, ssh, hive2, pig, :END:, email, distcp, :KILL:, sub-workflow, fs, java, :JOIN:, sqoop, map-reduce]
+configuration.config.dir : /Users/rkanter/dev/oozie/conf
+configuration.config.file : /Users/rkanter/dev/oozie/conf/oozie-site.xml
+...
+
+TIMERS
+------
+callablequeue.time.in.queue.timer
+ 999th percentile : 4.0
+ 99th percentile : 4.0
+ 98th percentile : 4.0
+ 95th percentile : 4.0
+ 75th percentile : 4.0
+ 50th percentile : 4.0
+ mean : 4.0
+ max : 4.0
+ min : 4.0
+ count : 1
+ standard deviation : 0.0
+ 15 minute rate : 0.0
+ 5 minute rate : 0.0
+ 1 minute rate : 0.0
+ mean rate : 0.0
+ duration units : milliseconds
+ rate units : calls/millisecond
+commands.purge.call.timer
+ 999th percentile : 260.0
+ 99th percentile : 260.0
+ 98th percentile : 260.0
+ 95th percentile : 260.0
+ 75th percentile : 260.0
+ 50th percentile : 260.0
+ mean : 260.0
+ max : 260.0
+ min : 260.0
+ count : 1
+ standard deviation : 0.0
+ 15 minute rate : 0.0
+ 5 minute rate : 0.0
+ 1 minute rate : 0.0
+ mean rate : 0.0
+ duration units : milliseconds
+ rate units : calls/millisecond
+...
+
+HISTOGRAMS
+----------
+callablequeue.queue.size.histogram
+ 999th percentile : 0.0
+ 99th percentile : 0.0
+ 98th percentile : 0.0
+ 95th percentile : 0.0
+ 75th percentile : 0.0
+ 50th percentile : 0.0
+ mean : 0.0
+ max : 0.0
+ min : 0.0
+ count : 13
+ standard deviation : 0.0
+callablequeue.threads.active.histogram
+ 999th percentile : 10.0
+ 99th percentile : 10.0
+ 98th percentile : 10.0
+ 95th percentile : 10.0
+ 75th percentile : 0.0
+ 50th percentile : 0.0
+ mean : 0.8461538461538461
+ max : 10.0
+ min : 0.0
+ count : 13
+ standard deviation : 2.764240517940803
+...
+</verbatim>
+
+It returns the metrics from the Oozie server. Keep in mind that timers and counters that the Oozie server
+hasn't incremented yet will not show up.
+
+*Note:* If Metrics is enabled, then Instrumentation is unavailable.
+
---++ Validate Operations
---+++ Validating a Workflow XML
http://git-wip-us.apache.org/repos/asf/oozie/blob/f9b3746a/release-log.txt
----------------------------------------------------------------------
diff --git a/release-log.txt b/release-log.txt
index 7e0010d..a6c5d4b 100644
--- a/release-log.txt
+++ b/release-log.txt
@@ -1,5 +1,6 @@
-- Oozie 4.2.0 release (trunk - unreleased)
+OOZIE-2174 Add missing admin commands to OozieClient and OozieCLI (rkanter)
OOZIE-2186 Upgrade Tomcat to 6.0.43 (rkanter)
OOZIE-2181 JsonToBean has some missing and incorrect mappings (rkanter)
OOZIE-2184 Change default value of action tmp dir removal to true (Viji via harsh)