| /** |
| * 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.yarn.server.applicationhistoryservice.metrics.timeline.aggregators; |
| |
| import org.apache.commons.lang.StringUtils; |
| import org.apache.commons.logging.Log; |
| import org.apache.commons.logging.LogFactory; |
| import org.apache.hadoop.conf.Configuration; |
| |
| import java.util.ArrayList; |
| import java.util.Arrays; |
| import java.util.List; |
| import java.util.Map; |
| import java.util.Set; |
| |
| /** |
| * DownSampler utility class. Responsible for fetching downsampler configs from Metrics config, and determine if |
| * any downsamplers are configured. |
| */ |
| |
| public class DownSamplerUtils { |
| |
| public static final String downSamplerConfigPrefix = "timeline.metrics.downsampler."; |
| public static final String downSamplerMetricPatternsConfig = "metric.patterns"; |
| public static final String topNDownSampler = "topn"; |
| private static final Log LOG = LogFactory.getLog(DownSamplerUtils.class); |
| |
| |
| |
| /** |
| * Get the list of metrics that are requested to be downsampled. |
| * @param configuration |
| * @return List of metric patterns/names that are to be downsampled. |
| */ |
| public static List<String> getDownsampleMetricPatterns(Configuration configuration) { |
| Map<String, String> conf = configuration.getValByRegex(downSamplerConfigPrefix + "*"); |
| List<String> metricPatterns = new ArrayList<>(); |
| Set<String> keys = conf.keySet(); |
| for (String key : keys) { |
| if (key.endsWith(downSamplerMetricPatternsConfig)) { |
| String patternString = conf.get(key); |
| String[] patterns = StringUtils.split(patternString, ","); |
| for (String pattern : patterns) { |
| if (StringUtils.isNotEmpty(pattern)) { |
| String trimmedPattern = pattern.trim(); |
| metricPatterns.add(trimmedPattern); |
| } |
| } |
| } |
| } |
| return metricPatterns; |
| } |
| |
| /** |
| * Get the list of downsamplers that are configured in ams-site |
| * Sample config |
| <name>timeline.metrics.downsampler.topn.metric.patterns</name> |
| <value>dfs.NNTopUserOpCounts.windowMs=60000.op%,dfs.NNTopUserOpCounts.windowMs=300000.op%</value> |
| |
| <name>timeline.metrics.downsampler.topn.value</name> |
| <value>10</value> |
| |
| <name>timeline.metrics.downsampler.topn.function</name> |
| <value>max</value> |
| * @param configuration |
| * @return |
| */ |
| public static List<CustomDownSampler> getDownSamplers(Configuration configuration) { |
| |
| Map<String,String> conf = configuration.getValByRegex(downSamplerConfigPrefix + "*"); |
| List<CustomDownSampler> downSamplers = new ArrayList<>(); |
| Set<String> keys = conf.keySet(); |
| |
| try { |
| for (String key : keys) { |
| if (key.startsWith(downSamplerConfigPrefix) && key.endsWith(downSamplerMetricPatternsConfig)) { |
| String type = key.split("\\.")[3]; |
| CustomDownSampler downSampler = getDownSamplerByType(type, conf); |
| if (downSampler != null) { |
| downSamplers.add(downSampler); |
| } |
| } |
| } |
| } catch (Exception e) { |
| LOG.warn("Exception caught while parsing downsampler configs from ams-site : " + e.getMessage()); |
| } |
| return downSamplers; |
| } |
| |
| public static CustomDownSampler getDownSamplerByType(String type, Map<String, String> conf) { |
| if (type == null) { |
| return null; |
| } |
| |
| if (StringUtils.isNotEmpty(type) && type.equalsIgnoreCase(topNDownSampler)) { |
| return TopNDownSampler.fromConfig(conf); |
| } |
| |
| LOG.warn("Unknown downsampler requested : " + type); |
| return null; |
| } |
| } |