[MRM-1440] add a system status page

Merged from: r1042625:1042631


git-svn-id: https://svn.apache.org/repos/asf/archiva/trunk@1042646 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Brett Porter 2010-12-06 13:58:34 +00:00
parent 23ebf87131
commit c795a64c84
4 changed files with 206 additions and 0 deletions

View File

@ -0,0 +1,114 @@
package org.apache.maven.archiva.web.action.admin;
/*
* 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.
*/
import com.opensymphony.xwork2.Preparable;
import org.apache.maven.archiva.configuration.ArchivaConfiguration;
import org.apache.maven.archiva.configuration.Configuration;
import org.apache.maven.archiva.configuration.ManagedRepositoryConfiguration;
import org.apache.maven.archiva.configuration.RemoteRepositoryConfiguration;
import org.apache.maven.archiva.configuration.functors.RepositoryConfigurationComparator;
import org.apache.maven.archiva.database.ArchivaDAO;
import org.apache.maven.archiva.database.constraints.MostRecentRepositoryScanStatistics;
import org.apache.maven.archiva.model.RepositoryContentStatistics;
import org.apache.maven.archiva.repository.scanner.RepositoryScanner;
import org.apache.maven.archiva.security.ArchivaRoleConstants;
import org.apache.maven.archiva.web.action.PlexusActionSupport;
import org.apache.maven.archiva.web.util.ContextUtils;
import org.apache.struts2.interceptor.ServletRequestAware;
import org.codehaus.plexus.cache.Cache;
import org.codehaus.plexus.redback.rbac.Resource;
import org.codehaus.plexus.taskqueue.TaskQueue;
import org.codehaus.redback.integration.interceptor.SecureAction;
import org.codehaus.redback.integration.interceptor.SecureActionBundle;
import org.codehaus.redback.integration.interceptor.SecureActionException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
/**
* Shows system status information for the administrator.
*
* @version $Id$
* @plexus.component role="com.opensymphony.xwork2.Action" role-hint="systemStatus" instantiation-strategy="per-lookup"
*/
public class SystemStatusAction
extends PlexusActionSupport
implements SecureAction
{
/**
* @plexus.requirement role="org.codehaus.plexus.taskqueue.TaskQueue"
*/
private Map<String,TaskQueue> queues;
/**
* @plexus.requirement role="org.codehaus.plexus.cache.Cache"
*/
private Map<String,Cache> caches;
private String memoryStatus;
public SecureActionBundle getSecureActionBundle()
throws SecureActionException
{
SecureActionBundle bundle = new SecureActionBundle();
bundle.setRequiresAuthentication( true );
bundle.addRequiredAuthorization( ArchivaRoleConstants.OPERATION_MANAGE_CONFIGURATION, Resource.GLOBAL );
return bundle;
}
public String execute()
{
Runtime runtime = Runtime.getRuntime();
runtime.gc();
long total = runtime.totalMemory();
long used = total - runtime.freeMemory();
long max = runtime.maxMemory();
memoryStatus = formatMemory(used) + "/" + formatMemory(total) + " (Max: " + formatMemory(max) + ")";
return SUCCESS;
}
private static String formatMemory( long l )
{
return l / ( 1024 * 1024 ) + "M";
}
public String getMemoryStatus()
{
return memoryStatus;
}
public Map<String, Cache> getCaches()
{
return caches;
}
public Map<String, TaskQueue> getQueues()
{
return queues;
}
}

View File

@ -479,6 +479,10 @@
</result> </result>
</action> </action>
<action name="systemStatus" class="systemStatus">
<result name="success">/WEB-INF/jsp/admin/systemStatus.jsp</result>
</action>
<!-- .\ LEGACY SUPPORT \.__________________________________________ --> <!-- .\ LEGACY SUPPORT \.__________________________________________ -->
<action name="legacyArtifactPath" class="legacyArtifactPathAction" method="input"> <action name="legacyArtifactPath" class="legacyArtifactPathAction" method="input">

View File

@ -0,0 +1,85 @@
<%--
~ 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.
--%>
<%@ page contentType="text/html; charset=UTF-8" %>
<%@ taglib prefix="s" uri="/struts-tags" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<html>
<head>
<title>Administration - System Status</title>
<s:head/>
</head>
<body>
<h1>Administration - System Status</h1>
<div id="contentArea">
<s:actionerror/>
<s:actionmessage/>
<h2>Queues</h2>
<table>
<tr>
<th>Queue</th>
<th>Size</th>
</tr>
<c:forEach var="queueEntry" items="${queues}">
<c:set var="queue" value="${queueEntry.value.queueSnapshot}"/>
<tr>
<td>${queueEntry.key}</td>
<td>${fn:length(queue)}</td>
</tr>
</c:forEach>
</table>
<h2>Caches</h2>
<table>
<tr>
<th>Cache</th>
<th>Size</th>
<th>Hits</th>
<th>Misses</th>
<th>Hit Ratio</th>
<th>&nbsp;</th>
</tr>
<c:forEach var="cacheEntry" items="${caches}">
<tr>
<td>${cacheEntry.key}</td>
<td>${cacheEntry.value.statistics.size}</td>
<td>${cacheEntry.value.statistics.cacheHits}</td>
<td>${cacheEntry.value.statistics.cacheMiss}</td>
<td><fmt:formatNumber value="${cacheEntry.value.statistics.cacheHitRate}" pattern="#%"/></td>
<td><a href="javascript:alert('Not yet implemented')">Flush</a></td>
</tr>
</c:forEach>
</table>
<h2>Memory</h2>
<p>${memoryStatus}</p>
</body>
</html>

View File

@ -146,6 +146,9 @@
</li> </li>
<li class="none"> <li class="none">
<my:currentWWUrl action="repositoryScanning" namespace="/admin">Repository Scanning</my:currentWWUrl> <my:currentWWUrl action="repositoryScanning" namespace="/admin">Repository Scanning</my:currentWWUrl>
</li>
<li class="none">
<my:currentWWUrl action="systemStatus" namespace="/admin">System Status</my:currentWWUrl>
</li> </li>
<%-- TODO: future options here. <%-- TODO: future options here.
* Repository Syncing Connectors. (rsync, ftp, scp, etc...) * Repository Syncing Connectors. (rsync, ftp, scp, etc...)