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);