/**
 * 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;

import org.apache.hadoop.metrics2.sink.timeline.AggregationResult;
import org.apache.hadoop.metrics2.sink.timeline.ContainerMetric;
import org.apache.hadoop.metrics2.sink.timeline.Precision;
import org.apache.hadoop.metrics2.sink.timeline.TimelineMetric;
import org.apache.hadoop.metrics2.sink.timeline.TimelineMetricKey;
import org.apache.hadoop.metrics2.sink.timeline.TimelineMetricMetadata;
import org.apache.hadoop.metrics2.sink.timeline.TimelineMetrics;
import org.apache.hadoop.metrics2.sink.timeline.TopNConfig;
import org.apache.hadoop.yarn.api.records.timeline.TimelinePutResponse;

import java.io.IOException;
import java.sql.SQLException;
import java.util.List;
import java.util.Map;
import java.util.Set;

public interface TimelineMetricStore {
  /**
   * This method retrieves metrics stored by the Timeline store.
   *
   * @param metricNames Names of the metric, e.g.: cpu_user
   * @param hostnames Names of the host where the metric originated from
   * @param applicationId Id of the application to which this metric belongs
   * @param instanceId Application instance id.
   * @param startTime Start timestamp
   * @param endTime End timestamp
   * @param precision Precision [ seconds, minutes, hours ]
   * @param limit Override default result limit
   * @param groupedByHosts Group {@link TimelineMetric} by metric name, hostname,
   *                app id and instance id
   * @param seriesAggregateFunction Specify this when caller want to aggregate multiple metrics
   *                                series into one. [ SUM, AVG, MIN, MAX ]
   *
   * @return {@link TimelineMetric}
   * @throws java.sql.SQLException
   */
  TimelineMetrics getTimelineMetrics(List<String> metricNames, List<String> hostnames,
                                     String applicationId, String instanceId, Long startTime,
                                     Long endTime, Precision precision, Integer limit, boolean groupedByHosts,
                                     TopNConfig topNConfig, String seriesAggregateFunction)
    throws SQLException, IOException;

  /**
   * Stores metric information to the timeline store. Any errors occurring for
   * individual put request objects will be reported in the response.
   *
   * @param metrics An {@link TimelineMetrics}.
   * @return An {@link org.apache.hadoop.yarn.api.records.timeline.TimelinePutResponse}.
   * @throws SQLException, IOException
   */
  TimelinePutResponse putMetrics(TimelineMetrics metrics) throws SQLException, IOException;

  /**
   * Store container metric into the timeline tore
   */
  TimelinePutResponse putContainerMetrics(List<ContainerMetric> metrics)
      throws SQLException, IOException;

  /**
   * Return all metrics metadata that have been written to the store.
   * @return { appId : [ @TimelineMetricMetadata ] }
   * @throws SQLException
   * @throws IOException
   */
  Map<String, List<TimelineMetricMetadata>> getTimelineMetricMetadata(String appId, String metricPattern,
                                                                             boolean includeBlacklistedMetrics) throws SQLException, IOException;

  TimelinePutResponse putHostAggregatedMetrics(AggregationResult aggregationResult) throws SQLException, IOException;
  /**
   * Returns all hosts that have written metrics with the apps on the host
   * @return { hostname : [ appIds ] }
   * @throws SQLException
   * @throws IOException
   */
  Map<String, Set<String>> getHostAppsMetadata() throws SQLException, IOException;

  /**
   * Returns all instances and the set of hosts each instance is present on
   * @return { instanceId : [ hosts ] }
   * @throws SQLException
   * @throws IOException
   */
  Map<String, Map<String,Set<String>>> getInstanceHostsMetadata(String instanceId, String appId) throws SQLException, IOException;

  byte[] getUuid(String metricName, String appId, String instanceId, String hostname) throws SQLException, IOException;

    /**
     * Return a list of known live collector nodes
     * @return [ hostname ]
     */
  List<String> getLiveInstances();

  TimelineMetrics getAnomalyMetrics(String method, long startTime, long endTime, Integer limit) throws SQLException;

  Set<TimelineMetricKey> getTimelineMetricKey(String metricName, String appId, String instanceId, String hostname) throws SQLException, IOException;

}
