diff --git common/src/java/org/apache/hadoop/hive/common/metrics/common/MetricsConstant.java common/src/java/org/apache/hadoop/hive/common/metrics/common/MetricsConstant.java
index 65b914c7fd816a2b348fae95edade7f7dfe79d91..b0d2b854f3b3ed143636f86b98837b2af619c2eb 100644
--- common/src/java/org/apache/hadoop/hive/common/metrics/common/MetricsConstant.java
+++ common/src/java/org/apache/hadoop/hive/common/metrics/common/MetricsConstant.java
@@ -55,4 +55,6 @@
public static final String DELETE_TOTAL_DATABASES = "delete_total_count_dbs";
public static final String DELETE_TOTAL_TABLES = "delete_total_count_tables";
public static final String DELETE_TOTAL_PARTITIONS = "delete_total_count_partitions";
+
+ public static final String DIRECTSQL_ERRORS = "directsql_errors";
}
\ No newline at end of file
diff --git metastore/pom.xml metastore/pom.xml
index 18c1f9cc10e958f81b98f55df46037c8c810b4c5..88168299dd4cadae70ff266ccaebb51ecb82bfdf 100644
--- metastore/pom.xml
+++ metastore/pom.xml
@@ -207,6 +207,14 @@
tephra-hbase-compat-1.0
${tephra.version}
+
+
+ org.apache.hive
+ hive-common
+ ${project.version}
+ test-jar
+ test
+
junit
diff --git metastore/src/java/org/apache/hadoop/hive/metastore/ObjectStore.java metastore/src/java/org/apache/hadoop/hive/metastore/ObjectStore.java
index ae6f084f0499318d83679d91f275db0ed37e1041..9b7a93bf974cb96c9e723a79be9cc9aa75fa948e 100644
--- metastore/src/java/org/apache/hadoop/hive/metastore/ObjectStore.java
+++ metastore/src/java/org/apache/hadoop/hive/metastore/ObjectStore.java
@@ -63,6 +63,9 @@
import org.apache.hadoop.hive.common.StatsSetupConst;
import org.apache.hadoop.hive.common.classification.InterfaceAudience;
import org.apache.hadoop.hive.common.classification.InterfaceStability;
+import org.apache.hadoop.hive.common.metrics.common.Metrics;
+import org.apache.hadoop.hive.common.metrics.common.MetricsConstant;
+import org.apache.hadoop.hive.common.metrics.common.MetricsFactory;
import org.apache.hadoop.hive.conf.HiveConf;
import org.apache.hadoop.hive.conf.HiveConf.ConfVars;
import org.apache.hadoop.hive.metastore.api.AggrStats;
@@ -2517,7 +2520,8 @@ private void dropPartitionsNoTxn(String dbName, String tblName, List par
}
/** Helper class for getting stuff w/transaction, direct SQL, perf logging, etc. */
- private abstract class GetHelper {
+ @VisibleForTesting
+ public abstract class GetHelper {
private final boolean isInTxn, doTrace, allowJdo;
private boolean doUseDirectSql;
private long start;
@@ -2629,6 +2633,16 @@ private void handleDirectSqlError(Exception ex) throws MetaException, NoSuchObje
} else {
start = doTrace ? System.nanoTime() : 0;
}
+
+ Metrics metrics = MetricsFactory.getInstance();
+ if (metrics != null) {
+ try {
+ metrics.incrementCounter(MetricsConstant.DIRECTSQL_ERRORS);
+ } catch (Exception e) {
+ LOG.warn("Error reporting Direct SQL errors to metrics system", e);
+ }
+ }
+
doUseDirectSql = false;
}
@@ -2668,7 +2682,8 @@ protected String describeResult() {
}
}
- private abstract class GetDbHelper extends GetHelper {
+ @VisibleForTesting
+ public abstract class GetDbHelper extends GetHelper {
/**
* GetHelper for returning db info using directSql/JDO.
* Since this is a db-level call, tblName is ignored, and null is passed irrespective of what is passed in.
diff --git metastore/src/test/org/apache/hadoop/hive/metastore/TestObjectStore.java metastore/src/test/org/apache/hadoop/hive/metastore/TestObjectStore.java
index 2e1f5f41e194a1c420b0abf9527552d09667dd7d..6cb062abaee03350ba6da568a475f8bcb71d1276 100644
--- metastore/src/test/org/apache/hadoop/hive/metastore/TestObjectStore.java
+++ metastore/src/test/org/apache/hadoop/hive/metastore/TestObjectStore.java
@@ -21,6 +21,11 @@
import java.util.HashMap;
import java.util.List;
+import org.apache.hadoop.hive.common.metrics.common.MetricsConstant;
+import org.apache.hadoop.hive.common.metrics.common.MetricsFactory;
+import org.apache.hadoop.hive.common.metrics.metrics2.CodahaleMetrics;
+import org.apache.hadoop.hive.common.metrics.metrics2.MetricsReporting;
+import org.apache.hadoop.hive.common.metrics.MetricsTestUtils;
import org.apache.hadoop.hive.conf.HiveConf;
import org.apache.hadoop.hive.metastore.api.Database;
import org.apache.hadoop.hive.metastore.api.FieldSchema;
@@ -244,6 +249,51 @@ public void testRoleOps() throws InvalidObjectException, MetaException, NoSuchOb
objectStore.removeRole(ROLE1);
}
+ @Test
+ public void testDirectSqlErrorMetrics() throws Exception {
+ HiveConf conf = new HiveConf();
+ conf.setBoolVar(HiveConf.ConfVars.HIVE_SERVER2_METRICS_ENABLED, true);
+ conf.setVar(HiveConf.ConfVars.HIVE_METRICS_REPORTER, MetricsReporting.JSON_FILE.name()
+ + "," + MetricsReporting.JMX.name());
+
+ MetricsFactory.init(conf);
+ CodahaleMetrics metrics = (CodahaleMetrics) MetricsFactory.getInstance();
+
+ objectStore.new GetDbHelper("foo", null, true, true) {
+ @Override
+ protected Database getSqlResult(ObjectStore.GetHelper ctx) throws MetaException {
+ return null;
+ }
+
+ @Override
+ protected Database getJdoResult(ObjectStore.GetHelper ctx) throws MetaException,
+ NoSuchObjectException {
+ return null;
+ }
+ }.run(false);
+
+ String json = metrics.dumpJson();
+ MetricsTestUtils.verifyMetricsJson(json, MetricsTestUtils.COUNTER,
+ MetricsConstant.DIRECTSQL_ERRORS, "");
+
+ objectStore.new GetDbHelper("foo", null, true, true) {
+ @Override
+ protected Database getSqlResult(ObjectStore.GetHelper ctx) throws MetaException {
+ throw new RuntimeException();
+ }
+
+ @Override
+ protected Database getJdoResult(ObjectStore.GetHelper ctx) throws MetaException,
+ NoSuchObjectException {
+ return null;
+ }
+ }.run(false);
+
+ json = metrics.dumpJson();
+ MetricsTestUtils.verifyMetricsJson(json, MetricsTestUtils.COUNTER,
+ MetricsConstant.DIRECTSQL_ERRORS, 1);
+ }
+
public static void dropAllStoreObjects(RawStore store) throws MetaException, InvalidObjectException, InvalidInputException {
try {
Deadline.registerIfNot(100000);