blob: 16d623ab46fa343bbe0ea8b90d8fc0b710f0b5c2 [file] [log] [blame]
/**
* 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.timelineservice.storage;
import java.io.IOException;
import java.util.Set;
import org.apache.hadoop.classification.InterfaceAudience.Private;
import org.apache.hadoop.classification.InterfaceStability.Unstable;
import org.apache.hadoop.service.Service;
import org.apache.hadoop.yarn.api.records.timelineservice.TimelineEntity;
import org.apache.hadoop.yarn.server.timelineservice.reader.TimelineDataToRetrieve;
import org.apache.hadoop.yarn.server.timelineservice.reader.TimelineEntityFilters;
import org.apache.hadoop.yarn.server.timelineservice.reader.TimelineReaderContext;
/** ATSv2 reader interface. */
@Private
@Unstable
public interface TimelineReader extends Service {
/**
* Possible fields to retrieve for {@link #getEntities} and
* {@link #getEntity}.
*/
public enum Field {
ALL,
EVENTS,
INFO,
METRICS,
CONFIGS,
RELATES_TO,
IS_RELATED_TO
}
/**
* <p>The API to fetch the single entity given the identifier(depending on
* the entity type) in the scope of the given context.</p>
* @param context Context which defines the scope in which query has to be
* made. Use getters of {@link TimelineReaderContext} to fetch context
* fields. Context contains the following :<br>
* <ul>
* <li><b>entityType</b> - Entity type(mandatory).</li>
* <li><b>clusterId</b> - Identifies the cluster(mandatory).</li>
* <li><b>userId</b> - Identifies the user.</li>
* <li><b>flowName</b> - Context flow name.</li>
* <li><b>flowRunId</b> - Context flow run id.</li>
* <li><b>appId</b> - Context app id.</li>
* <li><b>entityId</b> - Entity id.</li>
* </ul>
* Fields in context which are mandatory depends on entity type. Entity
* type is always mandatory. In addition to entity type, below is the list
* of context fields which are mandatory, based on entity type.<br>
* <ul>
* <li>If entity type is YARN_FLOW_RUN (i.e. query to fetch a specific flow
* run), clusterId, userId, flowName and flowRunId are mandatory.</li>
* <li>If entity type is YARN_APPLICATION (i.e. query to fetch a specific
* app), query is within the scope of clusterId, userId, flowName,
* flowRunId and appId. But out of this, only clusterId and appId are
* mandatory. If only clusterId and appId are supplied, backend storage
* must fetch the flow context information i.e. userId, flowName and
* flowRunId first and based on that, fetch the app. If flow context
* information is also given, app can be directly fetched.
* </li>
* <li>For other entity types (i.e. query to fetch generic entity), query
* is within the scope of clusterId, userId, flowName, flowRunId, appId,
* entityType and entityId. But out of this, only clusterId, appId,
* entityType and entityId are mandatory. If flow context information is
* not supplied, backend storage must fetch the flow context information
* i.e. userId, flowName and flowRunId first and based on that, fetch the
* entity. If flow context information is also given, entity can be
* directly queried.
* </li>
* </ul>
* @param dataToRetrieve Specifies which data to retrieve for the entity. Use
* getters of TimelineDataToRetrieve class to fetch dataToRetrieve
* fields. All the dataToRetrieve fields are optional. Refer to
* {@link TimelineDataToRetrieve} for details.
* @return A <cite>TimelineEntity</cite> instance or null. The entity will
* contain the metadata plus the given fields to retrieve.<br>
* If entityType is YARN_FLOW_RUN, entity returned is of type
* <cite>FlowRunEntity</cite>.<br>
* For all other entity types, entity returned is of type
* <cite>TimelineEntity</cite>.
* @throws IOException if there is an exception encountered while fetching
* entity from backend storage.
*/
TimelineEntity getEntity(TimelineReaderContext context,
TimelineDataToRetrieve dataToRetrieve) throws IOException;
/**
* <p>The API to search for a set of entities of the given entity type in
* the scope of the given context which matches the given predicates. The
* predicates include the created time window, limit to number of entities to
* be returned, and the entities can be filtered by checking whether they
* contain the given info/configs entries in the form of key/value pairs,
* given metrics in the form of metricsIds and its relation with metric
* values, given events in the form of the Ids, and whether they relate to/are
* related to other entities. For those parameters which have multiple
* entries, the qualified entity needs to meet all or them.</p>
*
* @param context Context which defines the scope in which query has to be
* made. Use getters of {@link TimelineReaderContext} to fetch context
* fields. Context contains the following :<br>
* <ul>
* <li><b>entityType</b> - Entity type(mandatory).</li>
* <li><b>clusterId</b> - Identifies the cluster(mandatory).</li>
* <li><b>userId</b> - Identifies the user.</li>
* <li><b>flowName</b> - Context flow name.</li>
* <li><b>flowRunId</b> - Context flow run id.</li>
* <li><b>appId</b> - Context app id.</li>
* </ul>
* Although entityIdPrefix and entityId are also part of context,
* it has no meaning for getEntities.<br>
* Fields in context which are mandatory depends on entity type. Entity
* type is always mandatory. In addition to entity type, below is the list
* of context fields which are mandatory, based on entity type.<br>
* <ul>
* <li>If entity type is YARN_FLOW_ACTIVITY (i.e. query to fetch flows),
* only clusterId is mandatory.
* </li>
* <li>If entity type is YARN_FLOW_RUN (i.e. query to fetch flow runs),
* clusterId, userId and flowName are mandatory.</li>
* <li>If entity type is YARN_APPLICATION (i.e. query to fetch apps), we
* can either get all apps within the context of flow name or within the
* context of flow run. If apps are queried within the scope of flow name,
* clusterId, userId and flowName are supplied. If they are queried within
* the scope of flow run, clusterId, userId, flowName and flowRunId are
* supplied.</li>
* <li>For other entity types (i.e. query to fetch generic entities), query
* is within the scope of clusterId, userId, flowName, flowRunId, appId and
* entityType. But out of this, only clusterId, appId and entityType are
* mandatory. If flow context information is not supplied, backend storage
* must fetch the flow context information i.e. userId, flowName and
* flowRunId first and based on that, fetch the entities. If flow context
* information is also given, entities can be directly queried.
* </li>
* </ul>
* @param filters Specifies filters which restrict the number of entities
* to return. Use getters of TimelineEntityFilters class to fetch
* various filters. All the filters are optional. Refer to
* {@link TimelineEntityFilters} for details.
* @param dataToRetrieve Specifies which data to retrieve for each entity. Use
* getters of TimelineDataToRetrieve class to fetch dataToRetrieve
* fields. All the dataToRetrieve fields are optional. Refer to
* {@link TimelineDataToRetrieve} for details.
* @return A set of <cite>TimelineEntity</cite> instances of the given entity
* type in the given context scope which matches the given predicates
* ordered by enitityIdPrefix(for generic entities only).
* Each entity will only contain
* the metadata(id, type , idPrefix and created time) plus the given
* fields to retrieve.
* <br>
* If entityType is YARN_FLOW_ACTIVITY, entities returned are of type
* <cite>FlowActivityEntity</cite>.<br>
* If entityType is YARN_FLOW_RUN, entities returned are of type
* <cite>FlowRunEntity</cite>.<br>
* For all other entity types, entities returned are of type
* <cite>TimelineEntity</cite>.
* @throws IOException if there is an exception encountered while fetching
* entity from backend storage.
*/
Set<TimelineEntity> getEntities(
TimelineReaderContext context,
TimelineEntityFilters filters,
TimelineDataToRetrieve dataToRetrieve) throws IOException;
/**
* The API to list all available entity types of the given context.
*
* @param context A context defines the scope of this query. The incoming
* context should contain at least the cluster id and application id.
*
* @return A set of entity types available in the given context.
*
* @throws IOException if an exception occurred while listing from backend
* storage.
*/
Set<String> getEntityTypes(TimelineReaderContext context) throws IOException;
}