/**
* 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.hadoop.hive.common.metrics.metrics2;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.lang.reflect.InvocationTargetException;
import org.apache.hadoop.fs.CommonConfigurationKeysPublic;
import org.apache.hadoop.hive.common.metrics.MetricsTestUtils;
import org.apache.hadoop.hive.common.metrics.common.MetricsFactory;
import org.apache.hadoop.hive.conf.HiveConf;
import org.junit.After;
import org.junit.Assert;
import org.junit.Test;
import java.io.File;
/**
* Unit tests for Codahale reporter config backward compatibility
*/
public class TestCodahaleReportersConf {
private static File workDir = new File(System.getProperty("test.tmp.dir"));
private static File jsonReportFile;
@After
public void after() throws Exception {
MetricsFactory.close();
}
/**
* Tests that the deprecated HIVE_METRICS_REPORTER config is used if the HIVE_CODAHALE_METRICS_REPORTER_CLASSES is missing.
*/
@Test
public void testFallbackToDeprecatedConfig() throws Exception {
HiveConf conf = new HiveConf();
jsonReportFile = new File(workDir, "json_reporting");
jsonReportFile.delete();
conf.set(CommonConfigurationKeysPublic.FS_DEFAULT_NAME_KEY, "local");
conf.setVar(HiveConf.ConfVars.HIVE_METRICS_CLASS, CodahaleMetrics.class.getCanonicalName());
conf.setVar(HiveConf.ConfVars.HIVE_METRICS_REPORTER, "JMX, JSON");
conf.setVar(HiveConf.ConfVars.HIVE_METRICS_JSON_FILE_LOCATION, jsonReportFile.toString());
conf.setVar(HiveConf.ConfVars.HIVE_METRICS_JSON_FILE_INTERVAL, "100ms");
MetricsFactory.init(conf);
int runs = 5;
for (int i = 0; i < runs; i++) {
MetricsFactory.getInstance().incrementCounter("count2");
}
// we expect json file to be updated
byte[] jsonData = MetricsTestUtils.getFileData(jsonReportFile.getAbsolutePath(), 2000, 3);
ObjectMapper objectMapper = new ObjectMapper();
JsonNode rootNode = objectMapper.readTree(jsonData);
JsonNode countersNode = rootNode.path("counters");
JsonNode methodCounterNode = countersNode.path("count2");
JsonNode countNode = methodCounterNode.path("count");
Assert.assertEquals(countNode.asInt(), 5);
}
/**
* Tests that the deprecated HIVE_METRICS_REPORTER config is not used if
* HIVE_CODAHALE_METRICS_REPORTER_CLASSES is present.
*
* The deprecated config specifies json reporters whereas the newer one doesn't. Validates that
* the JSON file is not created.
*/
@Test
public void testNoFallback() throws Exception {
HiveConf conf = new HiveConf();
jsonReportFile = new File(workDir, "json_reporting");
jsonReportFile.delete();
conf.set(CommonConfigurationKeysPublic.FS_DEFAULT_NAME_KEY, "local");
conf.setVar(HiveConf.ConfVars.HIVE_METRICS_CLASS, CodahaleMetrics.class.getCanonicalName());
conf.setVar(HiveConf.ConfVars.HIVE_METRICS_REPORTER, "JMX, JSON");
conf.setVar(HiveConf.ConfVars.HIVE_CODAHALE_METRICS_REPORTER_CLASSES,
"org.apache.hadoop.hive.common.metrics.metrics2.JmxMetricsReporter");
conf.setVar(HiveConf.ConfVars.HIVE_METRICS_JSON_FILE_LOCATION, jsonReportFile.toString());
conf.setVar(HiveConf.ConfVars.HIVE_METRICS_JSON_FILE_INTERVAL, "100ms");
MetricsFactory.init(conf);
int runs = 5;
for (int i = 0; i < runs; i++) {
MetricsFactory.getInstance().incrementCounter("count2");
}
Assert.assertFalse(jsonReportFile.exists());
}
/**
* Tests that the deprecated HIVE_METRICS_REPORTER config is not used if
* HIVE_CODAHALE_METRICS_REPORTER_CLASSES is present but incorrect.
*
* The deprecated config specifies json reporters whereas the newer one doesn't. Validates that
* the JSON file is not created.
*/
@Test
public void testNoFallbackOnIncorrectConf() throws Exception {
HiveConf conf = new HiveConf();
jsonReportFile = new File(workDir, "json_reporting");
jsonReportFile.delete();
conf.set(CommonConfigurationKeysPublic.FS_DEFAULT_NAME_KEY, "local");
conf.setVar(HiveConf.ConfVars.HIVE_METRICS_CLASS, CodahaleMetrics.class.getCanonicalName());
conf.setVar(HiveConf.ConfVars.HIVE_METRICS_REPORTER, "JMX, JSON");
conf.setVar(HiveConf.ConfVars.HIVE_CODAHALE_METRICS_REPORTER_CLASSES,
"org.apache.hadoop.hive.common.metrics.NonExistentReporter");
conf.setVar(HiveConf.ConfVars.HIVE_METRICS_JSON_FILE_LOCATION, jsonReportFile.toString());
conf.setVar(HiveConf.ConfVars.HIVE_METRICS_JSON_FILE_INTERVAL, "100ms");
try {
MetricsFactory.init(conf);
} catch (InvocationTargetException expectedException) {
}
Assert.assertFalse(jsonReportFile.exists());
}
}