http://git-wip-us.apache.org/repos/asf/accumulo/blob/0ca5cd33/server/monitor/src/main/java/org/apache/accumulo/monitor/rest/api/xml/XMLInformation.java ---------------------------------------------------------------------- diff --git a/server/monitor/src/main/java/org/apache/accumulo/monitor/rest/api/xml/XMLInformation.java b/server/monitor/src/main/java/org/apache/accumulo/monitor/rest/api/xml/XMLInformation.java new file mode 100644 index 0000000..12730b8 --- /dev/null +++ b/server/monitor/src/main/java/org/apache/accumulo/monitor/rest/api/xml/XMLInformation.java @@ -0,0 +1,115 @@ +/* + * 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.rest.api.xml; + +import java.util.ArrayList; +import java.util.List; + +import javax.xml.bind.annotation.XmlRootElement; + +import org.apache.accumulo.monitor.rest.api.log.DeadLoggerList; +import org.apache.accumulo.monitor.rest.api.master.MasterInformation; +import org.apache.accumulo.monitor.rest.api.table.TableInformation; +import org.apache.accumulo.monitor.rest.api.table.TableInformationList; +import org.apache.accumulo.monitor.rest.api.table.TableNamespace; +import org.apache.accumulo.monitor.rest.api.table.TablesList; +import org.apache.accumulo.monitor.rest.api.tserver.BadTabletServers; +import org.apache.accumulo.monitor.rest.api.tserver.DeadServerList; +import org.apache.accumulo.monitor.rest.api.tserver.ServersShuttingDown; +import org.apache.accumulo.monitor.rest.api.tserver.TabletServer; + +/** + * + * Generate XML summary of Monitor + * + * @since 2.0.0 + * + */ +@XmlRootElement(name = "stats") +public class XMLInformation { + + // Variable names become JSON keys + public List<TabletServer> servers; + + public String masterGoalState, masterState; + + public BadTabletServers badTabletServers; + public ServersShuttingDown tabletServersShuttingDown; + public Integer unassignedTablets; + public DeadServerList deadTabletServers; + + public DeadLoggerList deadLoggers; + + public TableInformationList tables; + + public Totals totals; + + public XMLInformation() { + servers = new ArrayList<>(); + } + + /** + * Stores Monitor information as XML + * + * @param size + * Number of tservers + * @param info + * Master information + * @param tablesList + * Table list + */ + public XMLInformation(int size, MasterInformation info, TablesList tablesList) { + this.servers = new ArrayList<>(size); + + this.masterGoalState = info.masterGoalState; + this.masterState = info.masterState; + + this.badTabletServers = info.badTabletServers; + this.tabletServersShuttingDown = info.tabletServersShuttingDown; + this.unassignedTablets = info.unassignedTablets; + this.deadTabletServers = info.deadTabletServers; + this.deadLoggers = info.deadLoggers; + + getTableInformationList(tablesList.tables); + + this.totals = new Totals(info.ingestrate, info.queryrate, info.numentries); + } + + /** + * Adds a new tablet to the XML + * + * @param tablet + * Tablet to add + */ + public void addTablet(TabletServer tablet) { + servers.add(tablet); + } + + /** + * For backwards compatibility, gets all the tables without namespace information + */ + private void getTableInformationList(List<TableNamespace> namespaces) { + + this.tables = new TableInformationList(); + + for (TableNamespace namespace : namespaces) { + for (TableInformation info : namespace.table) { + tables.addTable(info); + } + } + } +}
http://git-wip-us.apache.org/repos/asf/accumulo/blob/0ca5cd33/server/monitor/src/main/java/org/apache/accumulo/monitor/rest/api/xml/XMLResource.java ---------------------------------------------------------------------- diff --git a/server/monitor/src/main/java/org/apache/accumulo/monitor/rest/api/xml/XMLResource.java b/server/monitor/src/main/java/org/apache/accumulo/monitor/rest/api/xml/XMLResource.java new file mode 100644 index 0000000..38f3e08 --- /dev/null +++ b/server/monitor/src/main/java/org/apache/accumulo/monitor/rest/api/xml/XMLResource.java @@ -0,0 +1,67 @@ +/* + * 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.rest.api.xml; + +import javax.ws.rs.GET; +import javax.ws.rs.Path; +import javax.ws.rs.Produces; +import javax.ws.rs.WebApplicationException; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.Response.Status; + +import org.apache.accumulo.core.master.thrift.MasterMonitorInfo; +import org.apache.accumulo.core.master.thrift.TabletServerStatus; +import org.apache.accumulo.monitor.Monitor; +import org.apache.accumulo.monitor.rest.api.master.MasterResource; +import org.apache.accumulo.monitor.rest.api.table.TablesResource; +import org.apache.accumulo.monitor.rest.api.tserver.TabletServer; + +/** + * + * Responsible for generating an XML summary of the Monitor + * + * @since 2.0.0 + * + */ +@Path("/xml") +public class XMLResource { + + /** + * Generates an XML summary of the Monitor + * + * @return XML summary + */ + @GET + @Produces(MediaType.APPLICATION_XML) + public XMLInformation getXMLInformation() { + + MasterMonitorInfo mmi = Monitor.getMmi(); + if (null == mmi) { + throw new WebApplicationException(Status.INTERNAL_SERVER_ERROR); + } + + // Add Monitor information + XMLInformation xml = new XMLInformation(mmi.tServerInfo.size(), new MasterResource().getTables(), new TablesResource().getTables()); + + // Add tserver information + for (TabletServerStatus status : mmi.tServerInfo) { + xml.addTablet(new TabletServer(status)); + } + + return xml; + } +} http://git-wip-us.apache.org/repos/asf/accumulo/blob/0ca5cd33/server/monitor/src/main/java/org/apache/accumulo/monitor/rest/api/zookeeper/ZKInformation.java ---------------------------------------------------------------------- diff --git a/server/monitor/src/main/java/org/apache/accumulo/monitor/rest/api/zookeeper/ZKInformation.java b/server/monitor/src/main/java/org/apache/accumulo/monitor/rest/api/zookeeper/ZKInformation.java new file mode 100644 index 0000000..78f877d --- /dev/null +++ b/server/monitor/src/main/java/org/apache/accumulo/monitor/rest/api/zookeeper/ZKInformation.java @@ -0,0 +1,50 @@ +/* + * 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.rest.api.zookeeper; + +import java.util.ArrayList; +import java.util.List; + +/** + * + * Generates a list of Zookeeper server information + * + * @since 2.0.0 + * + */ +public class ZKInformation { + + // Variable names become JSON keys + public List<ZooKeeper> zkServers; + + /** + * Initializes zk servers list + */ + public ZKInformation() { + zkServers = new ArrayList<>(); + } + + /** + * Adds a new zk server to the list + * + * @param server + * ZK server to add + */ + public void addZK(ZooKeeper server) { + zkServers.add(server); + } +} http://git-wip-us.apache.org/repos/asf/accumulo/blob/0ca5cd33/server/monitor/src/main/java/org/apache/accumulo/monitor/rest/api/zookeeper/ZooKeeper.java ---------------------------------------------------------------------- diff --git a/server/monitor/src/main/java/org/apache/accumulo/monitor/rest/api/zookeeper/ZooKeeper.java b/server/monitor/src/main/java/org/apache/accumulo/monitor/rest/api/zookeeper/ZooKeeper.java new file mode 100644 index 0000000..0a9df0c --- /dev/null +++ b/server/monitor/src/main/java/org/apache/accumulo/monitor/rest/api/zookeeper/ZooKeeper.java @@ -0,0 +1,49 @@ +/* + * 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.rest.api.zookeeper; + +/** + * + * Generates a new zookeeper information as a JSON object + * + * @since 2.0.0 + * + */ +public class ZooKeeper { + + // Variable names become JSON keys + public String server, mode; + public Integer clients; + + public ZooKeeper() {} + + /** + * Stores Zookeeper information + * + * @param server + * Location of the ZK + * @param mode + * ZK mode + * @param clients + * Number of clients per ZK + */ + public ZooKeeper(String server, String mode, Integer clients) { + this.server = server; + this.mode = mode; + this.clients = clients; + } +} http://git-wip-us.apache.org/repos/asf/accumulo/blob/0ca5cd33/server/monitor/src/main/java/org/apache/accumulo/monitor/rest/api/zookeeper/ZookeeperResource.java ---------------------------------------------------------------------- diff --git a/server/monitor/src/main/java/org/apache/accumulo/monitor/rest/api/zookeeper/ZookeeperResource.java b/server/monitor/src/main/java/org/apache/accumulo/monitor/rest/api/zookeeper/ZookeeperResource.java new file mode 100644 index 0000000..3b40d78 --- /dev/null +++ b/server/monitor/src/main/java/org/apache/accumulo/monitor/rest/api/zookeeper/ZookeeperResource.java @@ -0,0 +1,52 @@ +/* + * 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.rest.api.zookeeper; + +import javax.ws.rs.GET; + +import org.apache.accumulo.monitor.ZooKeeperStatus; +import org.apache.accumulo.monitor.ZooKeeperStatus.ZooKeeperState; +import org.apache.accumulo.monitor.rest.api.BasicResource; + +/** + * + * Generates a new ZooKeeper information as a JSON object + * + * @since 2.0.0 + * + */ +public class ZookeeperResource extends BasicResource { + + /** + * Generates a list of zookeeper information + * + * @return Zookeeper information + */ + @GET + public ZKInformation getZKInformation() { + + ZKInformation zk = new ZKInformation(); + + // Adds new zk to the list + for (ZooKeeperState k : ZooKeeperStatus.getZooKeeperStatus()) { + if (k.clients >= 0) { + zk.addZK(new ZooKeeper(k.keeper, k.mode, k.clients)); + } + } + return zk; + } +} http://git-wip-us.apache.org/repos/asf/accumulo/blob/0ca5cd33/server/monitor/src/main/java/org/apache/accumulo/monitor/rest/resources/BasicResource.java ---------------------------------------------------------------------- diff --git a/server/monitor/src/main/java/org/apache/accumulo/monitor/rest/resources/BasicResource.java b/server/monitor/src/main/java/org/apache/accumulo/monitor/rest/resources/BasicResource.java deleted file mode 100644 index 1abc71d..0000000 --- a/server/monitor/src/main/java/org/apache/accumulo/monitor/rest/resources/BasicResource.java +++ /dev/null @@ -1,98 +0,0 @@ -/* - * 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.rest.resources; - -import javax.ws.rs.Path; -import javax.ws.rs.Produces; -import javax.ws.rs.core.MediaType; - -@Path("/rest") -@Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML}) -public class BasicResource { - - @Path("/master") - public MasterResource getMasterResource() { - - return new MasterResource(); - } - - @Path("/bulkImports") - public BulkImportResource getBulkImportResource() { - - return new BulkImportResource(); - } - - @Path("/gc") - public GarbageCollectorResource getGarbageCollectorResource() { - - return new GarbageCollectorResource(); - } - - @Path("/logs") - public LogResource getLogResource() { - - return new LogResource(); - } - - @Path("/problems") - public ProblemsResource getProblemsResource() { - - return new ProblemsResource(); - } - - @Path("/replication") - public ReplicationResource getReplicationResource() { - - return new ReplicationResource(); - } - - @Path("/scans") - public ScansResource getScansResource() { - - return new ScansResource(); - } - - @Path("/statistics") - public StatisticsResource getStatisticsResource() { - - return new StatisticsResource(); - } - - @Path("/tables") - public TablesResource getTablesResource() { - - return new TablesResource(); - } - - @Path("/{parameter: tservers|json}") - public TabletServerResource getTabletServerResource() { - - return new TabletServerResource(); - } - - @Path("/trace") - public TracesResource getTracesResource() { - - return new TracesResource(); - } - - @Path("/zk") - public ZookeeperResource getZookeeperResource() { - - return new ZookeeperResource(); - } -} http://git-wip-us.apache.org/repos/asf/accumulo/blob/0ca5cd33/server/monitor/src/main/java/org/apache/accumulo/monitor/rest/resources/BulkImportResource.java ---------------------------------------------------------------------- diff --git a/server/monitor/src/main/java/org/apache/accumulo/monitor/rest/resources/BulkImportResource.java b/server/monitor/src/main/java/org/apache/accumulo/monitor/rest/resources/BulkImportResource.java deleted file mode 100644 index 7958600..0000000 --- a/server/monitor/src/main/java/org/apache/accumulo/monitor/rest/resources/BulkImportResource.java +++ /dev/null @@ -1,64 +0,0 @@ -/* - * 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.rest.resources; - -import java.util.List; - -import javax.ws.rs.GET; - -import org.apache.accumulo.core.master.thrift.BulkImportStatus; -import org.apache.accumulo.core.master.thrift.TabletServerStatus; -import org.apache.accumulo.monitor.Monitor; -import org.apache.accumulo.monitor.rest.api.BulkImport; -import org.apache.accumulo.monitor.rest.api.BulkImportInformation; -import org.apache.accumulo.monitor.rest.api.TabletServerBulkImportInformation; - -public class BulkImportResource extends BasicResource { - - @GET - public BulkImport getTables() { - - BulkImport bulkImport = new BulkImport(); - - for (BulkImportStatus bulk : Monitor.getMmi().bulkImports) { - bulkImport.addBulkImport(new BulkImportInformation(bulk.filename, bulk.startTime, bulk.state)); - } - - for (TabletServerStatus tserverInfo : Monitor.getMmi().getTServerInfo()) { - - int size = 0; - long oldest = 0L; - - List<BulkImportStatus> stats = tserverInfo.bulkImports; - if (stats != null) { - size = stats.size(); - oldest = Long.MAX_VALUE; - for (BulkImportStatus bulk : stats) { - oldest = Math.min(oldest, bulk.startTime); - } - if (oldest == Long.MAX_VALUE) { - oldest = 0L; - } - } - - bulkImport.addTabletServerBulkImport(new TabletServerBulkImportInformation(tserverInfo, size, oldest)); - - } - - return bulkImport; - } -} http://git-wip-us.apache.org/repos/asf/accumulo/blob/0ca5cd33/server/monitor/src/main/java/org/apache/accumulo/monitor/rest/resources/GarbageCollectorResource.java ---------------------------------------------------------------------- diff --git a/server/monitor/src/main/java/org/apache/accumulo/monitor/rest/resources/GarbageCollectorResource.java b/server/monitor/src/main/java/org/apache/accumulo/monitor/rest/resources/GarbageCollectorResource.java deleted file mode 100644 index 0ec2075..0000000 --- a/server/monitor/src/main/java/org/apache/accumulo/monitor/rest/resources/GarbageCollectorResource.java +++ /dev/null @@ -1,97 +0,0 @@ -/* - * 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.rest.resources; - -import javax.ws.rs.GET; -import javax.ws.rs.Path; - -import org.apache.accumulo.core.gc.thrift.GCStatus; -import org.apache.accumulo.monitor.Monitor; -import org.apache.accumulo.monitor.rest.api.GarbageCollection; -import org.apache.accumulo.monitor.rest.api.GarbageCollectorCycle; -import org.apache.accumulo.monitor.rest.api.GarbageCollectorStatus; - -/** - * GarbageCollector metrics - */ -public class GarbageCollectorResource extends BasicResource { - - @GET - public GarbageCollectorStatus getStatus() { - return new GarbageCollectorStatus(Monitor.getGcStatus()); - } - - @Path("/files") - @GET - public GarbageCollection getFileStatus() { - GCStatus gcStatus = Monitor.getGcStatus(); - if (null == gcStatus) { - return GarbageCollection.EMPTY; - } - return new GarbageCollection(gcStatus.last, gcStatus.current); - } - - @Path("/files/last") - @GET - public GarbageCollectorCycle getLastCycle() { - GCStatus status = Monitor.getGcStatus(); - if (null == status) { - return GarbageCollectorCycle.EMPTY; - } - return new GarbageCollectorCycle(status.last); - } - - @Path("/files/current") - @GET - public GarbageCollectorCycle getCurrentCycle() { - GCStatus status = Monitor.getGcStatus(); - if (null == status) { - return GarbageCollectorCycle.EMPTY; - } - return new GarbageCollectorCycle(status.current); - } - - @Path("/wals") - @GET - public GarbageCollection getWalStatus() { - GCStatus gcStatus = Monitor.getGcStatus(); - if (null == gcStatus) { - return GarbageCollection.EMPTY; - } - return new GarbageCollection(gcStatus.lastLog, gcStatus.currentLog); - } - - @Path("/wals/last") - @GET - public GarbageCollectorCycle getLastWalCycle() { - GCStatus status = Monitor.getGcStatus(); - if (null == status) { - return GarbageCollectorCycle.EMPTY; - } - return new GarbageCollectorCycle(status.lastLog); - } - - @Path("/wals/current") - @GET - public GarbageCollectorCycle getCurrentWalCycle() { - GCStatus status = Monitor.getGcStatus(); - if (null == status) { - return GarbageCollectorCycle.EMPTY; - } - return new GarbageCollectorCycle(status.currentLog); - } -} http://git-wip-us.apache.org/repos/asf/accumulo/blob/0ca5cd33/server/monitor/src/main/java/org/apache/accumulo/monitor/rest/resources/LogResource.java ---------------------------------------------------------------------- diff --git a/server/monitor/src/main/java/org/apache/accumulo/monitor/rest/resources/LogResource.java b/server/monitor/src/main/java/org/apache/accumulo/monitor/rest/resources/LogResource.java deleted file mode 100644 index 87830c1..0000000 --- a/server/monitor/src/main/java/org/apache/accumulo/monitor/rest/resources/LogResource.java +++ /dev/null @@ -1,54 +0,0 @@ -/* - * 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.rest.resources; - -import java.util.ArrayList; -import java.util.List; - -import javax.ws.rs.GET; - -import org.apache.accumulo.monitor.rest.api.LogEvent; -import org.apache.accumulo.server.monitor.DedupedLogEvent; -import org.apache.accumulo.server.monitor.LogService; -import org.apache.log4j.spi.LoggingEvent; - -public class LogResource extends BasicResource { - - @GET - public List<LogEvent> getRecentLogs() { - List<DedupedLogEvent> dedupedLogEvents = LogService.getInstance().getEvents(); - ArrayList<LogEvent> logEvents = new ArrayList<>(dedupedLogEvents.size()); - - final StringBuilder msg = new StringBuilder(64); - for (DedupedLogEvent dev : dedupedLogEvents) { - msg.setLength(0); - final LoggingEvent ev = dev.getEvent(); - Object application = ev.getMDC("application"); - if (application == null) - application = ""; - - msg.append(ev.getMessage().toString()); - if (ev.getThrowableStrRep() != null) - for (String line : ev.getThrowableStrRep()) - msg.append("\n\t").append(line); - - logEvents.add(new LogEvent(ev.getTimeStamp(), application, dev.getCount(), ev.getLevel().toString(), msg.toString().trim())); - } - - return logEvents; - } -} http://git-wip-us.apache.org/repos/asf/accumulo/blob/0ca5cd33/server/monitor/src/main/java/org/apache/accumulo/monitor/rest/resources/MasterResource.java ---------------------------------------------------------------------- diff --git a/server/monitor/src/main/java/org/apache/accumulo/monitor/rest/resources/MasterResource.java b/server/monitor/src/main/java/org/apache/accumulo/monitor/rest/resources/MasterResource.java deleted file mode 100644 index 54a77bb..0000000 --- a/server/monitor/src/main/java/org/apache/accumulo/monitor/rest/resources/MasterResource.java +++ /dev/null @@ -1,205 +0,0 @@ -/* - * 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.rest.resources; - -import java.lang.management.ManagementFactory; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; - -import javax.ws.rs.GET; -import javax.ws.rs.Path; - -import org.apache.accumulo.core.master.thrift.DeadServer; -import org.apache.accumulo.core.master.thrift.MasterMonitorInfo; -import org.apache.accumulo.core.master.thrift.TabletServerStatus; -import org.apache.accumulo.core.util.AddressUtil; -import org.apache.accumulo.monitor.Monitor; -import org.apache.accumulo.monitor.rest.api.BadTabletServerInformation; -import org.apache.accumulo.monitor.rest.api.BadTabletServers; -import org.apache.accumulo.monitor.rest.api.DeadLoggerInformation; -import org.apache.accumulo.monitor.rest.api.DeadLoggerList; -import org.apache.accumulo.monitor.rest.api.DeadServerInformation; -import org.apache.accumulo.monitor.rest.api.DeadServerList; -import org.apache.accumulo.monitor.rest.api.MasterInformation; -import org.apache.accumulo.monitor.rest.api.ServerShuttingDownInformation; -import org.apache.accumulo.monitor.rest.api.ServersShuttingDown; -import org.apache.accumulo.server.master.state.TabletServerState; - -public class MasterResource extends BasicResource { - public static final String NO_MASTERS = "No Masters running"; - - /** - * Gets the MasterMonitorInfo, allowing for mocking frameworks for testability - */ - protected MasterMonitorInfo getMmi() { - return Monitor.getMmi(); - } - - @GET - public MasterInformation getTables() { - - MasterInformation masterInformation; - - if (Monitor.getMmi() != null) { - String gcStatus = "Waiting"; - String label = ""; - if (Monitor.getGcStatus() != null) { - long start = 0; - if (Monitor.getGcStatus().current.started != 0 || Monitor.getGcStatus().currentLog.started != 0) { - start = Math.max(Monitor.getGcStatus().current.started, Monitor.getGcStatus().currentLog.started); - label = "Running"; - } else if (Monitor.getGcStatus().lastLog.finished != 0) { - start = Monitor.getGcStatus().lastLog.finished; - } - if (start != 0) { - gcStatus = String.valueOf(start); - } - } else { - gcStatus = "Down"; - } - - List<String> tservers = new ArrayList<>(); - for (TabletServerStatus up : Monitor.getMmi().tServerInfo) { - tservers.add(up.name); - } - for (DeadServer down : Monitor.getMmi().deadTabletServers) { - tservers.add(down.server); - } - List<String> masters = Monitor.getContext().getInstance().getMasterLocations(); - - String master = masters.size() == 0 ? "Down" : AddressUtil.parseAddress(masters.get(0), false).getHostText(); - Integer onlineTabletServers = Monitor.getMmi().tServerInfo.size(); - Integer totalTabletServers = tservers.size(); - Integer tablets = Monitor.getTotalTabletCount(); - Integer unassignedTablets = Monitor.getMmi().unassignedTablets; - long entries = Monitor.getTotalEntries(); - double ingest = Monitor.getTotalIngestRate(); - double entriesRead = Monitor.getTotalScanRate(); - double entriesReturned = Monitor.getTotalQueryRate(); - long holdTime = Monitor.getTotalHoldTime(); - double osLoad = ManagementFactory.getOperatingSystemMXBean().getSystemLoadAverage(); - - int tables = Monitor.getTotalTables(); - int deadTabletServers = Monitor.getMmi().deadTabletServers.size(); - long lookups = Monitor.getTotalLookups(); - long uptime = System.currentTimeMillis() - Monitor.getStartTime(); // TODO Check that this works when starting accumulo - - System.out.println(Monitor.getStartTime()); - - masterInformation = new MasterInformation(master, onlineTabletServers, totalTabletServers, gcStatus, tablets, unassignedTablets, entries, ingest, - entriesRead, entriesReturned, holdTime, osLoad, tables, deadTabletServers, lookups, uptime, label, getGoalState(), getState(), getNumBadTservers(), - getServersShuttingDown(), getDeadTservers(), getDeadLoggers()); - - } else { - masterInformation = new MasterInformation(); - } - - return masterInformation; - } - - public String getState() { - MasterMonitorInfo mmi = getMmi(); - if (null == mmi) { - return NO_MASTERS; - } - - return mmi.state.toString(); - } - - public String getGoalState() { - MasterMonitorInfo mmi = getMmi(); - if (null == mmi) { - return NO_MASTERS; - } - - return mmi.goalState.name(); - } - - public DeadServerList getDeadTservers() { - MasterMonitorInfo mmi = getMmi(); - if (null == mmi) { - return new DeadServerList(); - } - - DeadServerList deadServers = new DeadServerList(); - for (DeadServer dead : mmi.deadTabletServers) { - deadServers.addDeadServer(new DeadServerInformation(dead.server, dead.lastStatus, dead.status)); - } - return deadServers; - } - - public DeadLoggerList getDeadLoggers() { - MasterMonitorInfo mmi = getMmi(); - if (null == mmi) { - return new DeadLoggerList(); - } - - DeadLoggerList deadLoggers = new DeadLoggerList(); - for (DeadServer dead : mmi.deadTabletServers) { - deadLoggers.addDeadLogger(new DeadLoggerInformation(dead.server, dead.lastStatus, dead.status)); - } - return deadLoggers; - } - - public BadTabletServers getNumBadTservers() { - MasterMonitorInfo mmi = getMmi(); - if (null == mmi) { - return new BadTabletServers(); - } - - Map<String,Byte> badServers = mmi.getBadTServers(); - - if (null == badServers || badServers.isEmpty()) { - return new BadTabletServers(); - } - - BadTabletServers readableBadServers = new BadTabletServers(); - for (Entry<String,Byte> badServer : badServers.entrySet()) { - try { - TabletServerState state = TabletServerState.getStateById(badServer.getValue()); - readableBadServers.addBadServer(new BadTabletServerInformation(badServer.getKey(), state.name())); - } catch (IndexOutOfBoundsException e) { - readableBadServers.addBadServer(new BadTabletServerInformation(badServer.getKey(), "Unknown state")); - } - } - return readableBadServers; - } - - public ServersShuttingDown getServersShuttingDown() { - ServersShuttingDown servers = new ServersShuttingDown(); - - for (String server : Monitor.getMmi().serversShuttingDown) { - servers.addServerShuttingDown(new ServerShuttingDownInformation(server)); - } - - return servers; - } - - @Path("/tserver_info") - @GET - public List<TabletServerStatus> getTabletServerInfo() { - MasterMonitorInfo mmi = getMmi(); - if (null == mmi) { - return Collections.emptyList(); - } - - return mmi.getTServerInfo(); - } -} http://git-wip-us.apache.org/repos/asf/accumulo/blob/0ca5cd33/server/monitor/src/main/java/org/apache/accumulo/monitor/rest/resources/ProblemsResource.java ---------------------------------------------------------------------- diff --git a/server/monitor/src/main/java/org/apache/accumulo/monitor/rest/resources/ProblemsResource.java b/server/monitor/src/main/java/org/apache/accumulo/monitor/rest/resources/ProblemsResource.java deleted file mode 100644 index 61e544d..0000000 --- a/server/monitor/src/main/java/org/apache/accumulo/monitor/rest/resources/ProblemsResource.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * 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.rest.resources; - -import java.util.Map; - -import javax.ws.rs.GET; -import javax.ws.rs.Path; - -import org.apache.accumulo.monitor.Monitor; -import org.apache.accumulo.server.problems.ProblemType; - -public class ProblemsResource extends BasicResource { - - @GET - public Map<String,Map<ProblemType,Integer>> getSummary() { - return Monitor.getProblemSummary(); - } - - @GET - @Path("/exception") - public Exception getException() { - return Monitor.getProblemException(); - } - -} http://git-wip-us.apache.org/repos/asf/accumulo/blob/0ca5cd33/server/monitor/src/main/java/org/apache/accumulo/monitor/rest/resources/ReplicationResource.java ---------------------------------------------------------------------- diff --git a/server/monitor/src/main/java/org/apache/accumulo/monitor/rest/resources/ReplicationResource.java b/server/monitor/src/main/java/org/apache/accumulo/monitor/rest/resources/ReplicationResource.java deleted file mode 100644 index 711b84c..0000000 --- a/server/monitor/src/main/java/org/apache/accumulo/monitor/rest/resources/ReplicationResource.java +++ /dev/null @@ -1,188 +0,0 @@ -/* - * 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.rest.resources; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; -import java.util.Set; - -import javax.ws.rs.GET; - -import org.apache.accumulo.core.client.AccumuloException; -import org.apache.accumulo.core.client.AccumuloSecurityException; -import org.apache.accumulo.core.client.BatchScanner; -import org.apache.accumulo.core.client.Connector; -import org.apache.accumulo.core.client.TableNotFoundException; -import org.apache.accumulo.core.client.TableOfflineException; -import org.apache.accumulo.core.client.admin.TableOperations; -import org.apache.accumulo.core.conf.Property; -import org.apache.accumulo.core.data.Key; -import org.apache.accumulo.core.data.Range; -import org.apache.accumulo.core.data.Value; -import org.apache.accumulo.core.metadata.MetadataTable; -import org.apache.accumulo.core.metadata.RootTable; -import org.apache.accumulo.core.replication.ReplicationSchema.WorkSection; -import org.apache.accumulo.core.replication.ReplicationTable; -import org.apache.accumulo.core.replication.ReplicationTarget; -import org.apache.accumulo.core.security.Authorizations; -import org.apache.accumulo.monitor.Monitor; -import org.apache.accumulo.monitor.rest.api.ReplicationInformation; -import org.apache.accumulo.server.replication.ReplicaSystem; -import org.apache.accumulo.server.replication.ReplicaSystemFactory; -import org.apache.hadoop.io.Text; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class ReplicationResource extends BasicResource { - private static final Logger log = LoggerFactory.getLogger(ReplicationResource.class); - - @GET - public List<ReplicationInformation> getReplicationInformation() throws AccumuloException, AccumuloSecurityException { - final Connector conn = Monitor.getContext().getConnector(); - - final TableOperations tops = conn.tableOperations(); - - final Map<String,String> properties = conn.instanceOperations().getSystemConfiguration(); - final Map<String,String> peers = new HashMap<>(); - final String definedPeersPrefix = Property.REPLICATION_PEERS.getKey(); - final ReplicaSystemFactory replicaSystemFactory = new ReplicaSystemFactory(); - - // Get the defined peers and what ReplicaSystem impl they're using - for (Entry<String,String> property : properties.entrySet()) { - String key = property.getKey(); - // Filter out cruft that we don't want - if (key.startsWith(definedPeersPrefix) && !key.startsWith(Property.REPLICATION_PEER_USER.getKey()) - && !key.startsWith(Property.REPLICATION_PEER_PASSWORD.getKey())) { - String peerName = property.getKey().substring(definedPeersPrefix.length()); - ReplicaSystem replica; - try { - replica = replicaSystemFactory.get(property.getValue()); - } catch (Exception e) { - log.warn("Could not instantiate ReplicaSystem for {} with configuration {}", property.getKey(), property.getValue(), e); - continue; - } - - peers.put(peerName, replica.getClass().getName()); - } - } - - final String targetPrefix = Property.TABLE_REPLICATION_TARGET.getKey(); - - // The total set of configured targets - Set<ReplicationTarget> allConfiguredTargets = new HashSet<>(); - - // Number of files per target we have to replicate - Map<ReplicationTarget,Long> targetCounts = new HashMap<>(); - - Map<String,String> tableNameToId = tops.tableIdMap(); - Map<String,String> tableIdToName = invert(tableNameToId); - - for (String table : tops.list()) { - if (MetadataTable.NAME.equals(table) || RootTable.NAME.equals(table)) { - continue; - } - String localId = tableNameToId.get(table); - if (null == localId) { - log.trace("Could not determine ID for {}", table); - continue; - } - - Iterable<Entry<String,String>> propertiesForTable; - try { - propertiesForTable = tops.getProperties(table); - } catch (TableNotFoundException e) { - log.warn("Could not fetch properties for {}", table, e); - continue; - } - - for (Entry<String,String> prop : propertiesForTable) { - if (prop.getKey().startsWith(targetPrefix)) { - String peerName = prop.getKey().substring(targetPrefix.length()); - String remoteIdentifier = prop.getValue(); - ReplicationTarget target = new ReplicationTarget(peerName, remoteIdentifier, localId); - - allConfiguredTargets.add(target); - } - } - } - - // Read over the queued work - BatchScanner bs; - try { - bs = conn.createBatchScanner(ReplicationTable.NAME, Authorizations.EMPTY, 4); - } catch (TableOfflineException | TableNotFoundException e) { - log.error("Could not read replication table", e); - return Collections.emptyList(); - } - - bs.setRanges(Collections.singleton(new Range())); - WorkSection.limit(bs); - try { - Text buffer = new Text(); - for (Entry<Key,Value> entry : bs) { - Key k = entry.getKey(); - k.getColumnQualifier(buffer); - ReplicationTarget target = ReplicationTarget.from(buffer); - - // TODO ACCUMULO-2835 once explicit lengths are tracked, we can give size-based estimates instead of just file-based - Long count = targetCounts.get(target); - if (null == count) { - targetCounts.put(target, Long.valueOf(1l)); - } else { - targetCounts.put(target, count + 1); - } - } - } finally { - bs.close(); - } - - List<ReplicationInformation> replicationInformation = new ArrayList<>(); - for (ReplicationTarget configuredTarget : allConfiguredTargets) { - String tableName = tableIdToName.get(configuredTarget.getSourceTableId()); - if (null == tableName) { - log.trace("Could not determine table name from id {}", configuredTarget.getSourceTableId()); - continue; - } - - String replicaSystemClass = peers.get(configuredTarget.getPeerName()); - if (null == replicaSystemClass) { - log.trace("Could not determine configured ReplicaSystem for {}", configuredTarget.getPeerName()); - continue; - } - - Long numFiles = targetCounts.get(configuredTarget); - - replicationInformation.add(new ReplicationInformation(tableName, configuredTarget.getPeerName(), configuredTarget.getRemoteIdentifier(), - replicaSystemClass, (null == numFiles) ? 0 : numFiles)); - } - - return replicationInformation; - } - - protected Map<String,String> invert(Map<String,String> map) { - Map<String,String> newMap = new HashMap<>(map.size()); - for (Entry<String,String> entry : map.entrySet()) { - newMap.put(entry.getValue(), entry.getKey()); - } - return newMap; - } -} http://git-wip-us.apache.org/repos/asf/accumulo/blob/0ca5cd33/server/monitor/src/main/java/org/apache/accumulo/monitor/rest/resources/ScansResource.java ---------------------------------------------------------------------- diff --git a/server/monitor/src/main/java/org/apache/accumulo/monitor/rest/resources/ScansResource.java b/server/monitor/src/main/java/org/apache/accumulo/monitor/rest/resources/ScansResource.java deleted file mode 100644 index f7ab180..0000000 --- a/server/monitor/src/main/java/org/apache/accumulo/monitor/rest/resources/ScansResource.java +++ /dev/null @@ -1,49 +0,0 @@ -/* - * 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.rest.resources; - -import java.util.Map; - -import javax.ws.rs.GET; - -import org.apache.accumulo.core.master.thrift.TabletServerStatus; -import org.apache.accumulo.monitor.Monitor; -import org.apache.accumulo.monitor.Monitor.ScanStats; -import org.apache.accumulo.monitor.rest.api.ScanInformation; -import org.apache.accumulo.monitor.rest.api.Scans; - -import com.google.common.net.HostAndPort; - -public class ScansResource extends BasicResource { - - @GET - public Scans getTables() { - - Scans scans = new Scans(); - - Map<HostAndPort,ScanStats> entry = Monitor.getScans(); - - for (TabletServerStatus tserverInfo : Monitor.getMmi().getTServerInfo()) { - ScanStats stats = entry.get(HostAndPort.fromString(tserverInfo.name)); - if (stats != null) { - scans.addScan(new ScanInformation(tserverInfo, stats.scanCount, stats.oldestScan)); - } - } - - return scans; - } -} http://git-wip-us.apache.org/repos/asf/accumulo/blob/0ca5cd33/server/monitor/src/main/java/org/apache/accumulo/monitor/rest/resources/StatisticsResource.java ---------------------------------------------------------------------- diff --git a/server/monitor/src/main/java/org/apache/accumulo/monitor/rest/resources/StatisticsResource.java b/server/monitor/src/main/java/org/apache/accumulo/monitor/rest/resources/StatisticsResource.java deleted file mode 100644 index 28a33c7..0000000 --- a/server/monitor/src/main/java/org/apache/accumulo/monitor/rest/resources/StatisticsResource.java +++ /dev/null @@ -1,175 +0,0 @@ -/* - * 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.rest.resources; - -import java.util.ArrayList; -import java.util.List; - -import javax.ws.rs.GET; -import javax.ws.rs.Path; - -import org.apache.accumulo.core.gc.thrift.GCStatus; -import org.apache.accumulo.core.util.Pair; -import org.apache.accumulo.monitor.Monitor; - -/** - * - */ -public class StatisticsResource extends BasicResource { - - @GET - @Path("lookupRate") - public double getLookupRate() { - return Monitor.getLookupRate(); - } - - @GET - @Path("totalTables") - public int getTotalTables() { - return Monitor.getTotalTables(); - } - - @GET - @Path("totalTabletCount") - public int getTotalTabletCount() { - return Monitor.getTotalTabletCount(); - } - - @GET - @Path("totalEntries") - public long getTotalEntries() { - return Monitor.getTotalEntries(); - } - - @GET - @Path("totalIngestRate") - public double getTotalIngestRate() { - return Monitor.getTotalIngestRate(); - } - - @GET - @Path("totalQueryRate") - public double getTotalQueryRate() { - return Monitor.getTotalQueryRate(); - } - - @GET - @Path("totalScanRate") - public double getTotalScanRate() { - return Monitor.getTotalScanRate(); - } - - @GET - @Path("totalHoldTime") - public long getTotalHoldTime() { - return Monitor.getTotalHoldTime(); - } - - @GET - @Path("gcStatus") - public GCStatus getGcStatus() { - return Monitor.getGcStatus(); - } - - @GET - @Path("totalLookups") - public long getTotalLookups() { - return Monitor.getTotalLookups(); - } - - @GET - @Path("time/scanRate") - public List<Pair<Long,Integer>> getScanRate() { - return Monitor.getScanRateOverTime(); - } - - @GET - @Path("time/queryRate") - public List<Pair<Long,Integer>> getQueryRate() { - return Monitor.getQueryRateOverTime(); - } - - @GET - @Path("time/scanEntries") - public List<Pair<String,List<Pair<Long,Integer>>>> getScanEntries() { - - List<Pair<String,List<Pair<Long,Integer>>>> scanEntries = new ArrayList<>(); - - Pair<String,List<Pair<Long,Integer>>> read = new Pair<>("Read", Monitor.getScanRateOverTime()); - Pair<String,List<Pair<Long,Integer>>> returned = new Pair<>("Returned", Monitor.getQueryRateOverTime()); - - scanEntries.add(read); - scanEntries.add(returned); - - return scanEntries; - } - - @GET - @Path("time/queryByteRate") - public List<Pair<Long,Double>> getQueryByteRate() { - return Monitor.getQueryByteRateOverTime(); - } - - @GET - @Path("time/load") - public List<Pair<Long,Double>> getLoad() { - return Monitor.getLoadOverTime(); - } - - @GET - @Path("time/ingestRate") - public List<Pair<Long,Double>> getIngestRate() { - return Monitor.getIngestRateOverTime(); - } - - @GET - @Path("time/ingestByteRate") - public List<Pair<Long,Double>> getIngestByteRate() { - return Monitor.getIngestByteRateOverTime(); - } - - @GET - @Path("time/minorCompactions") - public List<Pair<Long,Integer>> getMinorCompactions() { - return Monitor.getMinorCompactionsOverTime(); - } - - @GET - @Path("time/majorCompactions") - public List<Pair<Long,Integer>> getMajorCompactions() { - return Monitor.getMajorCompactionsOverTime(); - } - - @GET - @Path("time/lookups") - public List<Pair<Long,Double>> getLookups() { - return Monitor.getLookupsOverTime(); - } - - @GET - @Path("time/indexCacheHitRate") - public List<Pair<Long,Double>> getIndexCacheHitRate() { - return Monitor.getIndexCacheHitRateOverTime(); - } - - @GET - @Path("time/dataCacheHitRate") - public List<Pair<Long,Double>> getDataCacheHitRate() { - return Monitor.getDataCacheHitRateOverTime(); - } - -} http://git-wip-us.apache.org/repos/asf/accumulo/blob/0ca5cd33/server/monitor/src/main/java/org/apache/accumulo/monitor/rest/resources/TablesResource.java ---------------------------------------------------------------------- diff --git a/server/monitor/src/main/java/org/apache/accumulo/monitor/rest/resources/TablesResource.java b/server/monitor/src/main/java/org/apache/accumulo/monitor/rest/resources/TablesResource.java deleted file mode 100644 index 0c02d47..0000000 --- a/server/monitor/src/main/java/org/apache/accumulo/monitor/rest/resources/TablesResource.java +++ /dev/null @@ -1,166 +0,0 @@ -/* - * 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.rest.resources; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; -import java.util.SortedMap; -import java.util.TreeMap; -import java.util.TreeSet; - -import javax.ws.rs.GET; -import javax.ws.rs.Path; -import javax.ws.rs.PathParam; - -import org.apache.accumulo.core.client.Instance; -import org.apache.accumulo.core.client.impl.Namespaces; -import org.apache.accumulo.core.client.impl.Tables; -import org.apache.accumulo.core.data.Range; -import org.apache.accumulo.core.data.impl.KeyExtent; -import org.apache.accumulo.core.master.thrift.TableInfo; -import org.apache.accumulo.core.master.thrift.TabletServerStatus; -import org.apache.accumulo.core.metadata.MetadataTable; -import org.apache.accumulo.core.metadata.RootTable; -import org.apache.accumulo.monitor.Monitor; -import org.apache.accumulo.monitor.rest.api.TableInformation; -import org.apache.accumulo.monitor.rest.api.TableNamespace; -import org.apache.accumulo.monitor.rest.api.TablesList; -import org.apache.accumulo.monitor.rest.api.TabletServer; -import org.apache.accumulo.monitor.rest.api.TabletServers; -import org.apache.accumulo.server.client.HdfsZooInstance; -import org.apache.accumulo.server.master.state.MetaDataTableScanner; -import org.apache.accumulo.server.master.state.TabletLocationState; -import org.apache.accumulo.server.tables.TableManager; -import org.apache.accumulo.server.util.TableInfoUtil; -import org.apache.hadoop.io.Text; - -public class TablesResource extends BasicResource { - - private static final TabletServerStatus NO_STATUS = new TabletServerStatus(); - - @GET - public TablesList getTables() { - Map<String,String> tidToNameMap = Tables.getIdToNameMap(HdfsZooInstance.getInstance()); - SortedMap<String,TableInfo> tableStats = new TreeMap<>(); - - if (Monitor.getMmi() != null && Monitor.getMmi().tableMap != null) - for (Entry<String,TableInfo> te : Monitor.getMmi().tableMap.entrySet()) - tableStats.put(Tables.getPrintableTableNameFromId(tidToNameMap, te.getKey()), te.getValue()); - - Map<String,Double> compactingByTable = TableInfoUtil.summarizeTableStats(Monitor.getMmi()); - TableManager tableManager = TableManager.getInstance(); - - SortedMap<String,String> namespaces = Namespaces.getNameToIdMap(Monitor.getContext().getInstance()); - - TablesList tableNamespace = new TablesList(); - List<TableInformation> tables = new ArrayList<>(); - - for (String key : namespaces.keySet()) { - tableNamespace.addTable(new TableNamespace(key)); - } - - for (Entry<String,String> entry : Tables.getNameToIdMap(HdfsZooInstance.getInstance()).entrySet()) { - String tableName = entry.getKey(), tableId = entry.getValue(); - TableInfo tableInfo = tableStats.get(tableName); - if (null != tableInfo) { - Double holdTime = compactingByTable.get(tableId); - if (holdTime == null) - holdTime = Double.valueOf(0.); - - for (TableNamespace name : tableNamespace.tables) { - if (!tableName.contains(".") && name.namespace.equals("")) { - name.addTable(new TableInformation(tableName, tableId, tableInfo, holdTime, tableManager.getTableState(tableId).name())); - } else if (tableName.startsWith(name.namespace + ".")) { - name.addTable(new TableInformation(tableName, tableId, tableInfo, holdTime, tableManager.getTableState(tableId).name())); - } - } - - tables.add(new TableInformation(tableName, tableId, tableInfo, holdTime, tableManager.getTableState(tableId).name())); - } else { - for (TableNamespace name : tableNamespace.tables) { - if (!tableName.contains(".") && name.namespace.equals("")) { - name.addTable(new TableInformation(tableName, tableId, tableManager.getTableState(tableId).name())); - } else if (tableName.startsWith(name.namespace + ".")) { - name.addTable(new TableInformation(tableName, tableId, tableManager.getTableState(tableId).name())); - } - } - tables.add(new TableInformation(tableName, tableId, tableManager.getTableState(tableId).name())); - } - } - - return tableNamespace; - } - - @Path("/{tableId}") - @GET - public TabletServers getParticipatingTabletServers(@PathParam("tableId") String tableId) throws Exception { - Instance instance = Monitor.getContext().getInstance(); - - TreeSet<String> locs = new TreeSet<>(); - if (RootTable.ID.equals(tableId)) { - locs.add(instance.getRootTabletLocation()); - } else { - String systemTableName = MetadataTable.ID.equals(tableId) ? RootTable.NAME : MetadataTable.NAME; - MetaDataTableScanner scanner = new MetaDataTableScanner(Monitor.getContext(), new Range(KeyExtent.getMetadataEntry(tableId, new Text()), - KeyExtent.getMetadataEntry(tableId, null)), systemTableName); - - while (scanner.hasNext()) { - TabletLocationState state = scanner.next(); - if (state.current != null) { - try { - locs.add(state.current.hostPort()); - } catch (Exception ex) {} - } - } - scanner.close(); - } - - TabletServers tabletServers = new TabletServers(Monitor.getMmi().tServerInfo.size()); - - List<TabletServerStatus> tservers = new ArrayList<>(); - if (Monitor.getMmi() != null) { - for (TabletServerStatus tss : Monitor.getMmi().tServerInfo) { - try { - if (tss.name != null && locs.contains(tss.name)) - tservers.add(tss); - } catch (Exception ex) { - - } - } - } - - for (TabletServerStatus status : tservers) { - if (status == null) - status = NO_STATUS; - TableInfo summary = TableInfoUtil.summarizeTableStats(status); - if (tableId != null) - summary = status.tableMap.get(tableId); - if (summary == null) - continue; - - TabletServer tabletServerInfo = new TabletServer(); - tabletServerInfo.updateTabletServerInfo(status, summary); - - tabletServers.addTablet(tabletServerInfo); - } - - return tabletServers; - - } -} http://git-wip-us.apache.org/repos/asf/accumulo/blob/0ca5cd33/server/monitor/src/main/java/org/apache/accumulo/monitor/rest/resources/TabletServerResource.java ---------------------------------------------------------------------- diff --git a/server/monitor/src/main/java/org/apache/accumulo/monitor/rest/resources/TabletServerResource.java b/server/monitor/src/main/java/org/apache/accumulo/monitor/rest/resources/TabletServerResource.java deleted file mode 100644 index 5036f3f..0000000 --- a/server/monitor/src/main/java/org/apache/accumulo/monitor/rest/resources/TabletServerResource.java +++ /dev/null @@ -1,255 +0,0 @@ -/* - * 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.rest.resources; - -import java.lang.management.ManagementFactory; -import java.security.MessageDigest; -import java.util.ArrayList; -import java.util.Base64; -import java.util.List; -import java.util.Map; - -import javax.ws.rs.GET; -import javax.ws.rs.Path; -import javax.ws.rs.PathParam; -import javax.ws.rs.WebApplicationException; -import javax.ws.rs.core.Response.Status; - -import org.apache.accumulo.core.client.impl.ClientContext; -import org.apache.accumulo.core.client.impl.Tables; -import org.apache.accumulo.core.conf.Property; -import org.apache.accumulo.core.data.impl.KeyExtent; -import org.apache.accumulo.core.master.thrift.MasterMonitorInfo; -import org.apache.accumulo.core.master.thrift.TabletServerStatus; -import org.apache.accumulo.core.rpc.ThriftUtil; -import org.apache.accumulo.core.tabletserver.thrift.ActionStats; -import org.apache.accumulo.core.tabletserver.thrift.TabletClientService; -import org.apache.accumulo.core.tabletserver.thrift.TabletStats; -import org.apache.accumulo.core.trace.Tracer; -import org.apache.accumulo.monitor.Monitor; -import org.apache.accumulo.monitor.rest.api.AllTimeTabletResults; -import org.apache.accumulo.monitor.rest.api.CurrentOperations; -import org.apache.accumulo.monitor.rest.api.CurrentTabletResults; -import org.apache.accumulo.monitor.rest.api.ServerStat; -import org.apache.accumulo.monitor.rest.api.ServerStats; -import org.apache.accumulo.monitor.rest.api.TabletServer; -import org.apache.accumulo.monitor.rest.api.TabletServerDetailInformation; -import org.apache.accumulo.monitor.rest.api.TabletServerSummary; -import org.apache.accumulo.monitor.rest.api.TabletServers; -import org.apache.accumulo.server.client.HdfsZooInstance; -import org.apache.accumulo.server.util.ActionStatsUpdator; - -import com.google.common.net.HostAndPort; - -public class TabletServerResource extends BasicResource { - - private TabletStats total, historical; - - @GET - public TabletServers getTserverSummary() { - MasterMonitorInfo mmi = Monitor.getMmi(); - if (null == mmi) { - throw new WebApplicationException(Status.INTERNAL_SERVER_ERROR); - } - - TabletServers tserverInfo = new TabletServers(mmi.tServerInfo.size()); - for (TabletServerStatus status : mmi.tServerInfo) { - tserverInfo.addTablet(new TabletServer(status)); - } - - return tserverInfo; - } - - @Path("/{address}") - @GET - public TabletServerSummary getTserverDetails(@PathParam("address") String tserverAddr) throws Exception { - - String tserverAddress = tserverAddr; - - boolean tserverExists = false; - if (tserverAddress != null && tserverAddress.isEmpty() == false) { - for (TabletServerStatus ts : Monitor.getMmi().getTServerInfo()) { - if (tserverAddress.equals(ts.getName())) { - tserverExists = true; - break; - } - } - } - - if (tserverAddress == null || tserverAddress.isEmpty() || tserverExists == false) { - - return null; - } - - double totalElapsedForAll = 0; - double splitStdDev = 0; - double minorStdDev = 0; - double minorQueueStdDev = 0; - double majorStdDev = 0; - double majorQueueStdDev = 0; - double currentMinorAvg = 0; - double currentMajorAvg = 0; - double currentMinorStdDev = 0; - double currentMajorStdDev = 0; - total = new TabletStats(null, new ActionStats(), new ActionStats(), new ActionStats(), 0, 0, 0, 0); - HostAndPort address = HostAndPort.fromString(tserverAddress); - historical = new TabletStats(null, new ActionStats(), new ActionStats(), new ActionStats(), 0, 0, 0, 0); - List<TabletStats> tsStats = new ArrayList<>(); - - try { - ClientContext context = Monitor.getContext(); - TabletClientService.Client client = ThriftUtil.getClient(new TabletClientService.Client.Factory(), address, context); - try { - for (String tableId : Monitor.getMmi().tableMap.keySet()) { - tsStats.addAll(client.getTabletStats(Tracer.traceInfo(), context.rpcCreds(), tableId)); - } - historical = client.getHistoricalStats(Tracer.traceInfo(), context.rpcCreds()); - } finally { - ThriftUtil.returnClient(client); - } - } catch (Exception e) { - return null; - } - - List<CurrentOperations> currentOps = doCurrentOperations(tsStats); - - if (total.minors.num != 0) - currentMinorAvg = (long) (total.minors.elapsed / total.minors.num); - if (total.minors.elapsed != 0 && total.minors.num != 0) - currentMinorStdDev = stddev(total.minors.elapsed, total.minors.num, total.minors.sumDev); - if (total.majors.num != 0) - currentMajorAvg = total.majors.elapsed / total.majors.num; - if (total.majors.elapsed != 0 && total.majors.num != 0 && total.majors.elapsed > total.majors.num) - currentMajorStdDev = stddev(total.majors.elapsed, total.majors.num, total.majors.sumDev); - - ActionStatsUpdator.update(total.minors, historical.minors); - ActionStatsUpdator.update(total.majors, historical.majors); - totalElapsedForAll += total.majors.elapsed + historical.splits.elapsed + total.minors.elapsed; - - minorStdDev = stddev(total.minors.elapsed, total.minors.num, total.minors.sumDev); - minorQueueStdDev = stddev(total.minors.queueTime, total.minors.num, total.minors.queueSumDev); - majorStdDev = stddev(total.majors.elapsed, total.majors.num, total.majors.sumDev); - majorQueueStdDev = stddev(total.majors.queueTime, total.majors.num, total.majors.queueSumDev); - splitStdDev = stddev(historical.splits.num, historical.splits.elapsed, historical.splits.sumDev); - - TabletServerDetailInformation details = doDetails(address, tsStats.size()); - - List<AllTimeTabletResults> allTime = doAllTimeResults(majorQueueStdDev, minorQueueStdDev, totalElapsedForAll, splitStdDev, majorStdDev, minorStdDev); - - CurrentTabletResults currentRes = doCurrentTabletResults(currentMinorAvg, currentMinorStdDev, currentMajorAvg, currentMajorStdDev); - - TabletServerSummary tserverDetails = new TabletServerSummary(details, allTime, currentRes, currentOps); - - return tserverDetails; - } - - private static final int concurrentScans = Monitor.getContext().getConfiguration().getCount(Property.TSERV_READ_AHEAD_MAXCONCURRENT); - - @Path("/serverStats") - @GET - public ServerStats getServerStats() { - - ServerStats stats = new ServerStats(); - - stats.addStats(new ServerStat(ManagementFactory.getOperatingSystemMXBean().getAvailableProcessors(), true, 100, "OS Load", "osload")); - stats.addStats(new ServerStat(1000, true, 1, "Ingest Entries", "ingest")); - stats.addStats(new ServerStat(10000, true, 1, "Scan Entries", "query")); - stats.addStats(new ServerStat(10, true, 10, "Ingest MB", "ingestMB")); - stats.addStats(new ServerStat(5, true, 10, "Scan MB", "queryMB")); - stats.addStats(new ServerStat(concurrentScans * 2, false, 1, "Running Scans", "scans")); - stats.addStats(new ServerStat(50, true, 10, "Scan Sessions", "scansessions")); - stats.addStats(new ServerStat(60000, false, 1, "Hold Time", "holdtime")); - stats.addStats(new ServerStat(1, false, 100, "Overall Avg", true, "allavg")); - stats.addStats(new ServerStat(1, false, 100, "Overall Max", true, "allmax")); - - return stats; - } - - private TabletServerDetailInformation doDetails(HostAndPort address, int numTablets) { - - return new TabletServerDetailInformation(numTablets, total.numEntries, total.minors.status, total.majors.status, historical.splits.status); - } - - private List<AllTimeTabletResults> doAllTimeResults(double majorQueueStdDev, double minorQueueStdDev, double totalElapsedForAll, double splitStdDev, - double majorStdDev, double minorStdDev) { - - List<AllTimeTabletResults> allTime = new ArrayList<>(); - - // Minor Compaction Operation - allTime.add(new AllTimeTabletResults("Minor Compaction", total.minors.num, total.minors.fail, - total.minors.num != 0 ? (total.minors.queueTime / total.minors.num) : null, minorQueueStdDev, - total.minors.num != 0 ? (total.minors.elapsed / total.minors.num) : null, minorStdDev, total.minors.elapsed)); - - // Major Compaction Operation - allTime.add(new AllTimeTabletResults("Major Compaction", total.majors.num, total.majors.fail, - total.majors.num != 0 ? (total.majors.queueTime / total.majors.num) : null, majorQueueStdDev, - total.majors.num != 0 ? (total.majors.elapsed / total.majors.num) : null, majorStdDev, total.majors.elapsed)); - // Split Operation - allTime.add(new AllTimeTabletResults("Split", historical.splits.num, historical.splits.fail, null, null, - historical.splits.num != 0 ? (historical.splits.elapsed / historical.splits.num) : null, splitStdDev, historical.splits.elapsed)); - - return allTime; - } - - private CurrentTabletResults doCurrentTabletResults(double currentMinorAvg, double currentMinorStdDev, double currentMajorAvg, double currentMajorStdDev) { - - return new CurrentTabletResults(currentMinorAvg, currentMinorStdDev, currentMajorAvg, currentMajorStdDev); - } - - private List<CurrentOperations> doCurrentOperations(List<TabletStats> tsStats) throws Exception { - - Map<String,String> tidToNameMap = Tables.getIdToNameMap(HdfsZooInstance.getInstance()); - - List<CurrentOperations> currentOperations = new ArrayList<>(); - - for (TabletStats info : tsStats) { - if (info.extent == null) { - historical = info; - continue; - } - total.numEntries += info.numEntries; - ActionStatsUpdator.update(total.minors, info.minors); - ActionStatsUpdator.update(total.majors, info.majors); - - KeyExtent extent = new KeyExtent(info.extent); - String tableId = extent.getTableId(); - MessageDigest digester = MessageDigest.getInstance("MD5"); - if (extent.getEndRow() != null && extent.getEndRow().getLength() > 0) { - digester.update(extent.getEndRow().getBytes(), 0, extent.getEndRow().getLength()); - } - String obscuredExtent = Base64.getEncoder().encodeToString(digester.digest()); - String displayExtent = String.format("[%s]", obscuredExtent); - - String tableName = Tables.getPrintableTableNameFromId(tidToNameMap, tableId); - - currentOperations.add(new CurrentOperations(tableName, tableId, displayExtent, info.numEntries, info.ingestRate, info.queryRate, - info.minors.num != 0 ? info.minors.elapsed / info.minors.num : null, stddev(info.minors.elapsed, info.minors.num, info.minors.sumDev), - info.minors.elapsed != 0 ? info.minors.count / info.minors.elapsed : null, info.majors.num != 0 ? info.majors.elapsed / info.majors.num : null, - stddev(info.majors.elapsed, info.majors.num, info.majors.sumDev), info.majors.elapsed != 0 ? info.majors.count / info.majors.elapsed : null)); - } - - return currentOperations; - } - - private static double stddev(double elapsed, double num, double sumDev) { - if (num != 0) { - double average = elapsed / num; - return Math.sqrt((sumDev / num) - (average * average)); - } - return 0; - } -} http://git-wip-us.apache.org/repos/asf/accumulo/blob/0ca5cd33/server/monitor/src/main/java/org/apache/accumulo/monitor/rest/resources/TracesResource.java ---------------------------------------------------------------------- diff --git a/server/monitor/src/main/java/org/apache/accumulo/monitor/rest/resources/TracesResource.java b/server/monitor/src/main/java/org/apache/accumulo/monitor/rest/resources/TracesResource.java deleted file mode 100644 index fb169fc..0000000 --- a/server/monitor/src/main/java/org/apache/accumulo/monitor/rest/resources/TracesResource.java +++ /dev/null @@ -1,354 +0,0 @@ -/* - * 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.rest.resources; - -import static java.lang.Math.min; -import static java.nio.charset.StandardCharsets.UTF_8; - -import java.io.IOException; -import java.security.PrivilegedAction; -import java.security.PrivilegedExceptionAction; -import java.util.AbstractMap; -import java.util.Collection; -import java.util.Map; -import java.util.Map.Entry; -import java.util.Set; -import java.util.TreeMap; - -import javax.ws.rs.GET; -import javax.ws.rs.Path; -import javax.ws.rs.PathParam; - -import org.apache.accumulo.core.client.AccumuloException; -import org.apache.accumulo.core.client.AccumuloSecurityException; -import org.apache.accumulo.core.client.Connector; -import org.apache.accumulo.core.client.Scanner; -import org.apache.accumulo.core.client.TableNotFoundException; -import org.apache.accumulo.core.client.security.tokens.AuthenticationToken; -import org.apache.accumulo.core.client.security.tokens.AuthenticationToken.Properties; -import org.apache.accumulo.core.client.security.tokens.KerberosToken; -import org.apache.accumulo.core.client.security.tokens.PasswordToken; -import org.apache.accumulo.core.conf.AccumuloConfiguration; -import org.apache.accumulo.core.conf.Property; -import org.apache.accumulo.core.data.Key; -import org.apache.accumulo.core.data.Range; -import org.apache.accumulo.core.data.Value; -import org.apache.accumulo.monitor.Monitor; -import org.apache.accumulo.monitor.rest.api.AddlInformation; -import org.apache.accumulo.monitor.rest.api.AnnotationInformation; -import org.apache.accumulo.monitor.rest.api.DataInformation; -import org.apache.accumulo.monitor.rest.api.RecentTracesInformation; -import org.apache.accumulo.monitor.rest.api.RecentTracesList; -import org.apache.accumulo.monitor.rest.api.TraceInformation; -import org.apache.accumulo.monitor.rest.api.TraceList; -import org.apache.accumulo.monitor.rest.api.TraceType; -import org.apache.accumulo.monitor.rest.api.TracesForTypeInformation; -import org.apache.accumulo.monitor.servlets.trace.NullScanner; -import org.apache.accumulo.server.client.HdfsZooInstance; -import org.apache.accumulo.server.security.SecurityUtil; -import org.apache.accumulo.tracer.SpanTree; -import org.apache.accumulo.tracer.SpanTreeVisitor; -import org.apache.accumulo.tracer.TraceDump; -import org.apache.accumulo.tracer.TraceFormatter; -import org.apache.accumulo.tracer.thrift.Annotation; -import org.apache.accumulo.tracer.thrift.RemoteSpan; -import org.apache.hadoop.io.Text; -import org.apache.hadoop.security.UserGroupInformation; - -public class TracesResource extends BasicResource { - - @Path("/summary/{minutes}") - @GET - public RecentTracesList getTraces(@PathParam("minutes") int minutes) throws Exception { - - RecentTracesList recentTraces = new RecentTracesList(); - - Entry<Scanner,UserGroupInformation> pair = getScanner(); - final Scanner scanner = pair.getKey(); - if (scanner == null) { - return null; - } - - Range range = getRangeForTrace(minutes); - scanner.setRange(range); - - final Map<String,RecentTracesInformation> summary = new TreeMap<>(); - if (null != pair.getValue()) { - pair.getValue().doAs(new PrivilegedAction<Void>() { - @Override - public Void run() { - parseSpans(scanner, summary); - return null; - } - }); - } else { - parseSpans(scanner, summary); - } - - for (Entry<String,RecentTracesInformation> entry : summary.entrySet()) { - RecentTracesInformation stat = entry.getValue(); - recentTraces.addTrace(stat); - } - - return recentTraces; - } - - @Path("/listType/{type}/{minutes}") - @GET - public TraceType getTracesType(@PathParam("type") String type, @PathParam("minutes") int minutes) throws Exception { - - TraceType typeTraces = new TraceType(type); - - Entry<Scanner,UserGroupInformation> pair = getScanner(); - final Scanner scanner = pair.getKey(); - if (scanner == null) { - return null; - } - - Range range = getRangeForTrace(minutes); - - scanner.setRange(range); - - if (null != pair.getValue()) { - pair.getValue().doAs(new PrivilegedAction<Void>() { - @Override - public Void run() { - for (Entry<Key,Value> entry : scanner) { - RemoteSpan span = TraceFormatter.getRemoteSpan(entry); - - if (span.description.equals(type)) { - typeTraces.addTrace(new TracesForTypeInformation(span)); - } - } - return null; - } - }); - } else { - for (Entry<Key,Value> entry : scanner) { - RemoteSpan span = TraceFormatter.getRemoteSpan(entry); - if (span.description.equals(type)) { - typeTraces.addTrace(new TracesForTypeInformation(span)); - } - - } - } - - return typeTraces; - } - - @Path("/show/{id}") - @GET - public TraceList getTracesType(@PathParam("id") String id) throws Exception { - TraceList traces = new TraceList(id); - - if (id == null) { - return null; - } - - Entry<Scanner,UserGroupInformation> entry = getScanner(); - final Scanner scanner = entry.getKey(); - if (scanner == null) { - return null; - } - - Range range = new Range(new Text(id)); - scanner.setRange(range); - final SpanTree tree = new SpanTree(); - long start; - - if (null != entry.getValue()) { - start = entry.getValue().doAs(new PrivilegedAction<Long>() { - @Override - public Long run() { - return addSpans(scanner, tree, Long.MAX_VALUE); - } - }); - } else { - start = addSpans(scanner, tree, Long.MAX_VALUE); - } - - traces.addStartTime(start); - - final long finalStart = start; - Set<Long> visited = tree.visit(new SpanTreeVisitor() { - @Override - public void visit(int level, RemoteSpan parent, RemoteSpan node, Collection<RemoteSpan> children) { - traces.addTrace(addTraceInformation(level, node, finalStart)); - } - }); - tree.nodes.keySet().removeAll(visited); - if (!tree.nodes.isEmpty()) { - for (RemoteSpan span : TraceDump.sortByStart(tree.nodes.values())) { - traces.addTrace(addTraceInformation(0, span, finalStart)); - } - } - - return traces; - } - - private static TraceInformation addTraceInformation(int level, RemoteSpan node, long finalStart) { - - boolean hasData = node.data != null && !node.data.isEmpty(); - boolean hasAnnotations = node.annotations != null && !node.annotations.isEmpty(); - - AddlInformation addlData = new AddlInformation(); - - if (hasData || hasAnnotations) { - - if (hasData) { - for (Entry<String,String> entry : node.data.entrySet()) { - DataInformation data = new DataInformation(entry.getKey(), entry.getValue()); - addlData.addData(data); - } - } - if (hasAnnotations) { - for (Annotation entry : node.annotations) { - AnnotationInformation annotations = new AnnotationInformation(entry.getMsg(), entry.getTime() - finalStart); - addlData.addAnnotations(annotations); - } - } - } - - return new TraceInformation(level, node.stop - node.start, node.start - finalStart, node.svc + "@" + node.sender, node.description, addlData); - } - - protected Range getRangeForTrace(long minutesSince) { - long endTime = System.currentTimeMillis(); - long millisSince = minutesSince * 60 * 1000; - // Catch the overflow - if (millisSince < minutesSince) { - millisSince = endTime; - } - long startTime = endTime - millisSince; - - String startHexTime = Long.toHexString(startTime), endHexTime = Long.toHexString(endTime); - while (startHexTime.length() < endHexTime.length()) { - startHexTime = "0" + startHexTime; - } - - return new Range(new Text("start:" + startHexTime), new Text("start:" + endHexTime)); - } - - private void parseSpans(Scanner scanner, Map<String,RecentTracesInformation> summary) { - for (Entry<Key,Value> entry : scanner) { - RemoteSpan span = TraceFormatter.getRemoteSpan(entry); - RecentTracesInformation stats = summary.get(span.description); - if (stats == null) { - summary.put(span.description, stats = new RecentTracesInformation(span.description)); - } - stats.addSpan(span); - } - } - - protected Entry<Scanner,UserGroupInformation> getScanner() throws AccumuloException, AccumuloSecurityException { - AccumuloConfiguration conf = Monitor.getContext().getConfiguration(); - final boolean saslEnabled = conf.getBoolean(Property.INSTANCE_RPC_SASL_ENABLED); - UserGroupInformation traceUgi = null; - final String principal; - final AuthenticationToken at; - Map<String,String> loginMap = conf.getAllPropertiesWithPrefix(Property.TRACE_TOKEN_PROPERTY_PREFIX); - // May be null - String keytab = loginMap.get(Property.TRACE_TOKEN_PROPERTY_PREFIX.getKey() + "keytab"); - if (keytab == null || keytab.length() == 0) { - keytab = conf.getPath(Property.GENERAL_KERBEROS_KEYTAB); - } - - if (saslEnabled && null != keytab) { - principal = SecurityUtil.getServerPrincipal(conf.get(Property.TRACE_USER)); - try { - traceUgi = UserGroupInformation.loginUserFromKeytabAndReturnUGI(principal, keytab); - } catch (IOException e) { - throw new RuntimeException("Failed to login as trace user", e); - } - } else { - principal = conf.get(Property.TRACE_USER); - } - - if (!saslEnabled) { - if (loginMap.isEmpty()) { - Property p = Property.TRACE_PASSWORD; - at = new PasswordToken(conf.get(p).getBytes(UTF_8)); - } else { - Properties props = new Properties(); - int prefixLength = Property.TRACE_TOKEN_PROPERTY_PREFIX.getKey().length(); - for (Entry<String,String> entry : loginMap.entrySet()) { - props.put(entry.getKey().substring(prefixLength), entry.getValue()); - } - - AuthenticationToken token = Property.createInstanceFromPropertyName(conf, Property.TRACE_TOKEN_TYPE, AuthenticationToken.class, new PasswordToken()); - token.init(props); - at = token; - } - } else { - at = null; - } - - final String table = conf.get(Property.TRACE_TABLE); - Scanner scanner; - if (null != traceUgi) { - try { - scanner = traceUgi.doAs(new PrivilegedExceptionAction<Scanner>() { - - @Override - public Scanner run() throws Exception { - // Make the KerberosToken inside the doAs - AuthenticationToken token = at; - if (null == token) { - token = new KerberosToken(); - } - return getScanner(table, principal, token); - } - - }); - } catch (IOException | InterruptedException e) { - throw new RuntimeException("Failed to obtain scanner", e); - } - } else { - if (null == at) { - throw new AssertionError("AuthenticationToken should not be null"); - } - scanner = getScanner(table, principal, at); - } - - return new AbstractMap.SimpleEntry<>(scanner, traceUgi); - } - - private Scanner getScanner(String table, String principal, AuthenticationToken at) throws AccumuloException, AccumuloSecurityException { - try { - Connector conn = HdfsZooInstance.getInstance().getConnector(principal, at); - if (!conn.tableOperations().exists(table)) { - return new NullScanner(); - } - Scanner scanner = conn.createScanner(table, conn.securityOperations().getUserAuthorizations(principal)); - return scanner; - } catch (AccumuloSecurityException ex) { - return null; - } catch (TableNotFoundException ex) { - return new NullScanner(); - } - } - - private long addSpans(Scanner scanner, SpanTree tree, long start) { - for (Entry<Key,Value> entry : scanner) { - RemoteSpan span = TraceFormatter.getRemoteSpan(entry); - tree.addNode(span); - start = min(start, span.start); - } - return start; - } - -} http://git-wip-us.apache.org/repos/asf/accumulo/blob/0ca5cd33/server/monitor/src/main/java/org/apache/accumulo/monitor/rest/resources/XMLResource.java ---------------------------------------------------------------------- diff --git a/server/monitor/src/main/java/org/apache/accumulo/monitor/rest/resources/XMLResource.java b/server/monitor/src/main/java/org/apache/accumulo/monitor/rest/resources/XMLResource.java deleted file mode 100644 index a7f671d..0000000 --- a/server/monitor/src/main/java/org/apache/accumulo/monitor/rest/resources/XMLResource.java +++ /dev/null @@ -1,52 +0,0 @@ -/* - * 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.rest.resources; - -import javax.ws.rs.GET; -import javax.ws.rs.Path; -import javax.ws.rs.Produces; -import javax.ws.rs.WebApplicationException; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.Response.Status; - -import org.apache.accumulo.core.master.thrift.MasterMonitorInfo; -import org.apache.accumulo.core.master.thrift.TabletServerStatus; -import org.apache.accumulo.monitor.Monitor; -import org.apache.accumulo.monitor.rest.api.TabletServer; -import org.apache.accumulo.monitor.rest.api.XMLInformation; - -@Path("/xml") -public class XMLResource { - - @GET - @Produces(MediaType.APPLICATION_XML) - public XMLInformation getXMLInformation() { - - MasterMonitorInfo mmi = Monitor.getMmi(); - if (null == mmi) { - throw new WebApplicationException(Status.INTERNAL_SERVER_ERROR); - } - - XMLInformation xml = new XMLInformation(mmi.tServerInfo.size(), new MasterResource().getTables(), new TablesResource().getTables()); - - for (TabletServerStatus status : mmi.tServerInfo) { - xml.addTablet(new TabletServer(status)); - } - - return xml; - } -}
