/* * 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.accumulo.monitor.servlets; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.accumulo.core.master.thrift.DeadServer; import org.apache.accumulo.core.master.thrift.TableInfo; import org.apache.accumulo.core.master.thrift.TabletServerStatus; import org.apache.accumulo.monitor.Monitor; import org.apache.accumulo.monitor.util.celltypes.TServerLinkType; import org.apache.accumulo.server.util.TableInfoUtil; import com.google.gson.Gson; public class JSONServlet extends BasicServlet { private static final long serialVersionUID = 1L; @Override protected String getTitle(HttpServletRequest req) { return "JSON Report"; } @Override protected void pageStart(HttpServletRequest req, HttpServletResponse resp, StringBuilder sb) { resp.setContentType("application/json"); } private static Map<String,Object> addServer(String ip, String hostname, double osload, double ingest, double query, double ingestMB, double queryMB, int scans, double scansessions, long holdtime) { Map<String,Object> map = new HashMap<>(); map.put("ip", ip); map.put("hostname", hostname); map.put("osload", osload); map.put("ingest", ingest); map.put("query", query); map.put("ingestMB", ingestMB); map.put("queryMB", queryMB); map.put("scans", scans); map.put("scanssessions", scansessions); map.put("holdtime", holdtime); return map; } @Override protected void pageBody(HttpServletRequest req, HttpServletResponse resp, StringBuilder sb) { if (Monitor.getMmi() == null || Monitor.getMmi().tableMap == null) { return; } Map<String,Object> results = new HashMap<>(); List<Map<String,Object>> servers = new ArrayList<>(); for (TabletServerStatus status : Monitor.getMmi().tServerInfo) { TableInfo summary = TableInfoUtil.summarizeTableStats(status); servers.add(addServer(status.name, TServerLinkType.displayName(status.name), status.osLoad, summary.ingestRate, summary.queryRate, summary.ingestByteRate / 1000000.0, summary.queryByteRate / 1000000.0, summary.scans.running + summary.scans.queued, Monitor.getLookupRate(), status.holdTime)); } for (Entry<String,Byte> entry : Monitor.getMmi().badTServers.entrySet()) { Map<String,Object> badServer = new HashMap<>(); badServer.put("ip", entry.getKey()); badServer.put("bad", true); servers.add(badServer); } for (DeadServer dead : Monitor.getMmi().deadTabletServers) { Map<String,Object> deadServer = new HashMap<>(); deadServer.put("ip", dead.server); deadServer.put("dead", true); servers.add(deadServer); } results.put("servers", servers); sb.append(new Gson().toJson(results)); } @Override protected void pageEnd(HttpServletRequest req, HttpServletResponse resp, StringBuilder sb) {} }