All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.datatorrent.stram.client.StatsAgent Maven / Gradle / Ivy

There is a newer version: 3.7.0
Show newest version
/**
 * 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 com.datatorrent.stram.client;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.codehaus.jackson.map.annotate.JsonSerialize;
import org.codehaus.jackson.map.ser.std.ToStringSerializer;
import org.codehaus.jettison.json.JSONException;
import org.codehaus.jettison.json.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import org.apache.commons.io.IOUtils;
import org.apache.hadoop.fs.FileStatus;
import org.apache.hadoop.fs.Path;

import com.datatorrent.common.util.ObjectMapperString;
import com.datatorrent.stram.util.FSPartFileCollection;

/**
 * 

StatsAgent class.

* * @since 0.3.3 */ public final class StatsAgent extends FSPartFileAgent { private static final Logger LOG = LoggerFactory.getLogger(StatsAgent.class); public static class ContainerInfo { public String id; public String jvmName; public String host; public int memoryMBAllocated; } public static class ContainersInfo { public String appId; public Map containers; @JsonSerialize(using = ToStringSerializer.class) public long startTime; @JsonSerialize(using = ToStringSerializer.class) public long endTime; @JsonSerialize(using = ToStringSerializer.class) public long count; public boolean ended; } public static class OperatorsInfo { public String appId; public String operatorName; public List operatorIds; @JsonSerialize(using = ToStringSerializer.class) public long startTime; @JsonSerialize(using = ToStringSerializer.class) public long endTime; @JsonSerialize(using = ToStringSerializer.class) public long count; public boolean ended; } private static class StatsIndexLine extends IndexLine { @JsonSerialize(using = ToStringSerializer.class) public long startTime; @JsonSerialize(using = ToStringSerializer.class) public long endTime; @JsonSerialize(using = ToStringSerializer.class) public long count; } public static class OperatorStatsInfo { public int operatorId; @JsonSerialize(using = ToStringSerializer.class) public long timestamp; public ObjectMapperString stats; } public static class ContainerStatsInfo { public int containerId; @JsonSerialize(using = ToStringSerializer.class) public long timestamp; public ObjectMapperString stats; } public StatsAgent(StramAgent stramAgent) { super(stramAgent); } public String getOperatorStatsDirectory(String appId, String opName) { return getStatsDirectory(appId) + Path.SEPARATOR + "operators" + Path.SEPARATOR + opName; } public String getContainerStatsDirectory(String appId) { return getStatsDirectory(appId) + Path.SEPARATOR + "containers"; } public String getStatsDirectory(String appId) { String appPath = stramAgent.getAppPath(appId); if (appPath == null) { return null; } return appPath + Path.SEPARATOR + "stats"; } @Override protected StatsIndexLine parseIndexLine(String line) throws JSONException { StatsIndexLine info = new StatsIndexLine(); if (line.startsWith("E")) { info.isEndLine = true; return info; } line = line.trim(); int cursor = 2; int cursor2 = line.indexOf(':', cursor); info.partFile = line.substring(cursor, cursor2); cursor = cursor2 + 1; cursor2 = line.indexOf(':', cursor); String timeRange = line.substring(cursor, cursor2); String[] tmp = timeRange.split("-"); info.startTime = Long.valueOf(tmp[0]); info.endTime = Long.valueOf(tmp[1]); cursor = cursor2 + 1; info.count = Long.valueOf(line.substring(cursor)); return info; } public ContainersInfo getContainersInfo(String appId) { ContainersInfo info = new ContainersInfo(); info.appId = appId; info.containers = new HashMap<>(); String dir = getContainerStatsDirectory(appId); if (dir == null) { return null; } Path path = new Path(dir); JSONObject json; BufferedReader br = null; IndexFileBufferedReader ifbr = null; try { FileStatus fileStatus = stramAgent.getFileSystem().getFileStatus(path); if (!fileStatus.isDirectory()) { return null; } // META file processing br = new BufferedReader(new InputStreamReader(stramAgent.getFileSystem().open(new Path(dir, FSPartFileCollection.META_FILE)))); String line; line = br.readLine(); if (!line.equals("1.0")) { return null; } while ((line = br.readLine()) != null) { int cursor = line.indexOf(':'); int index = Integer.valueOf(line.substring(0, cursor)); json = new JSONObject(line.substring(cursor + 1)); ContainerInfo containerInfo = new ContainerInfo(); containerInfo.host = json.getString("host"); containerInfo.jvmName = json.getString("jvmName"); containerInfo.id = json.getString("id"); containerInfo.memoryMBAllocated = json.getInt("memoryMBAllocated"); info.containers.put(index, containerInfo); } // INDEX file processing ifbr = new IndexFileBufferedReader(new InputStreamReader(stramAgent.getFileSystem() .open(new Path(dir, FSPartFileCollection.INDEX_FILE))), dir); StatsIndexLine indexLine; while ((indexLine = (StatsIndexLine)ifbr.readIndexLine()) != null) { if (indexLine.isEndLine) { info.ended = true; } else { info.count += indexLine.count; if (info.startTime == 0 || info.startTime > indexLine.startTime) { info.startTime = indexLine.startTime; } if (info.endTime == 0 || info.endTime < indexLine.endTime) { info.endTime = indexLine.endTime; } } } } catch (Exception ex) { LOG.warn("Got exception when reading containers info", ex); return null; } finally { IOUtils.closeQuietly(br); IOUtils.closeQuietly(ifbr); } return info; } public OperatorsInfo getOperatorsInfo(String appId, String opName) { OperatorsInfo info = new OperatorsInfo(); info.appId = appId; info.operatorName = opName; info.operatorIds = new ArrayList<>(); String dir = getOperatorStatsDirectory(appId, opName); if (dir == null) { return null; } Path path = new Path(dir); JSONObject json; BufferedReader br = null; IndexFileBufferedReader ifbr = null; try { FileStatus fileStatus = stramAgent.getFileSystem().getFileStatus(path); if (!fileStatus.isDirectory()) { return null; } // META file processing br = new BufferedReader(new InputStreamReader(stramAgent.getFileSystem().open(new Path(dir, FSPartFileCollection.META_FILE)))); String line; line = br.readLine(); if (!line.equals("1.0")) { return null; } while ((line = br.readLine()) != null) { json = new JSONObject(line); info.operatorIds.add(json.getInt("id")); } // INDEX file processing ifbr = new IndexFileBufferedReader(new InputStreamReader(stramAgent.getFileSystem() .open(new Path(dir, FSPartFileCollection.INDEX_FILE))), dir); StatsIndexLine indexLine; while ((indexLine = (StatsIndexLine)ifbr.readIndexLine()) != null) { if (indexLine.isEndLine) { info.ended = true; } else { info.count += indexLine.count; if (info.startTime == 0 || info.startTime > indexLine.startTime) { info.startTime = indexLine.startTime; } if (info.endTime == 0 || info.endTime < indexLine.endTime) { info.endTime = indexLine.endTime; } } } } catch (Exception ex) { LOG.warn("Got exception when reading operators info", ex); return null; } finally { IOUtils.closeQuietly(ifbr); IOUtils.closeQuietly(br); } return info; } public List getOperatorsStats(String appId, String opName, Long startTime, Long endTime) { List result = new ArrayList<>(); String dir = getOperatorStatsDirectory(appId, opName); if (dir == null) { return null; } IndexFileBufferedReader ifbr = null; try { ifbr = new IndexFileBufferedReader(new InputStreamReader(stramAgent.getFileSystem().open(new Path(dir, FSPartFileCollection.INDEX_FILE))), dir); StatsIndexLine indexLine; String lastProcessPartFile = null; while ((indexLine = (StatsIndexLine)ifbr.readIndexLine()) != null) { if (!indexLine.isEndLine) { lastProcessPartFile = indexLine.partFile; if (startTime != null) { if (startTime > indexLine.endTime) { continue; } } if (endTime != null) { if (endTime < indexLine.startTime) { return result; } } try (BufferedReader partBr = new BufferedReader(new InputStreamReader(stramAgent.getFileSystem().open(new Path(dir, indexLine.partFile))))) { processOperatorPartFile(partBr, startTime, endTime, result); } } } BufferedReader partBr = null; try { String extraPartFile = getNextPartFile(lastProcessPartFile); if (extraPartFile != null) { partBr = new BufferedReader(new InputStreamReader(stramAgent.getFileSystem() .open(new Path(dir, extraPartFile)))); processOperatorPartFile(partBr, startTime, endTime, result); } } catch (Exception ex) { // ignore } finally { IOUtils.closeQuietly(partBr); } } catch (Exception ex) { LOG.warn("Got exception when reading operators stats", ex); } finally { IOUtils.closeQuietly(ifbr); } return result; } private void processOperatorPartFile(BufferedReader partBr, Long startTime, Long endTime, List result) throws IOException { String partLine; // advance until offset is reached while ((partLine = partBr.readLine()) != null) { OperatorStatsInfo os = new OperatorStatsInfo(); int cursor = 0; int cursor2; cursor2 = partLine.indexOf(':', cursor); os.operatorId = Integer.valueOf(partLine.substring(cursor, cursor2)); cursor = cursor2 + 1; cursor2 = partLine.indexOf(':', cursor); os.timestamp = Long.valueOf(partLine.substring(cursor, cursor2)); cursor = cursor2 + 1; os.stats = new ObjectMapperString(partLine.substring(cursor)); if ((startTime == null || os.timestamp >= startTime) && (endTime == null || os.timestamp <= endTime)) { result.add(os); } } } public List getContainersStats(String appId, Long startTime, Long endTime) { List result = new ArrayList<>(); String dir = getContainerStatsDirectory(appId); if (dir == null) { return null; } BufferedReader br = null; String lastProcessPartFile = null; try { br = new BufferedReader(new InputStreamReader(stramAgent.getFileSystem().open(new Path(dir, FSPartFileCollection.INDEX_FILE)))); String line; while ((line = br.readLine()) != null) { if (!line.startsWith("F:")) { continue; } StatsIndexLine indexLine = parseIndexLine(line); lastProcessPartFile = indexLine.partFile; if (startTime != null) { if (startTime > indexLine.endTime) { continue; } } if (endTime != null) { if (endTime < indexLine.startTime) { return result; } } try (BufferedReader partBr = new BufferedReader(new InputStreamReader(stramAgent.getFileSystem().open(new Path(dir, indexLine.partFile))))) { processContainerPartFile(partBr, startTime, endTime, result); } } BufferedReader partBr = null; try { String extraPartFile = getNextPartFile(lastProcessPartFile); if (extraPartFile != null) { partBr = new BufferedReader(new InputStreamReader(stramAgent.getFileSystem() .open(new Path(dir, extraPartFile)))); processContainerPartFile(partBr, startTime, endTime, result); } } catch (Exception ex) { // ignore } finally { IOUtils.closeQuietly(partBr); } } catch (Exception ex) { LOG.warn("Got exception when reading containers stats", ex); } finally { IOUtils.closeQuietly(br); } return result; } private void processContainerPartFile(BufferedReader partBr, Long startTime, Long endTime, List result) throws IOException { String partLine; while ((partLine = partBr.readLine()) != null) { ContainerStatsInfo cs = new ContainerStatsInfo(); int cursor = 0; int cursor2; cursor2 = partLine.indexOf(':', cursor); cs.containerId = Integer.valueOf(partLine.substring(cursor, cursor2)); cursor = cursor2 + 1; cursor2 = partLine.indexOf(':', cursor); cs.timestamp = Long.valueOf(partLine.substring(cursor, cursor2)); cursor = cursor2 + 1; cs.stats = new ObjectMapperString(partLine.substring(cursor)); if ((startTime == null || cs.timestamp >= startTime) && (endTime == null || cs.timestamp <= endTime)) { result.add(cs); } } } }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy