[Deploying Sakai] New BoF at the Jasig/Sakai 2012 conference

Martin B. Smith smithmb at ufl.edu
Mon Jun 18 11:26:07 PDT 2012


On 06/13/2012 05:26 PM, David Adams wrote:
> If anyone tries it out and has feedback, please let me know. This is my work email address, or my personal email address is in the README.

Hey Dave,

Your status servlet is infinitely more thorough than our JSP here... 
(attached). At some point, we may try to use yours and submit 
enhancements back :).

Most of the data we collect can be seen at:

http://open-systems.ufl.edu/static/rrd/
-> Dashboards
-> Sakai (Prod)

As others have said, I also really enjoyed the high concurrency BOF. 
Maybe we can get a 'high concurrency' panel or track next year? I'd love 
to see more sysadmins at the conference.

Cheers all,
-- 
Martin B. Smith
smithmb at ufl.edu - (352) 273-1374
CNS/Open Systems Group
University of Florida
-------------- next part --------------
<%@ page contentType="text/plain; charset=UTF-8" %><%
%><%@ page import="org.apache.commons.dbcp.BasicDataSource" %><%
%><%@ page import="org.sakaiproject.component.cover.ComponentManager" %><%
%><%@ page import="org.sakaiproject.presence.api.PresenceService" %><%
%><%@ page import="org.sakaiproject.tool.api.SessionManager" %><%
%><%@ page import="java.lang.management.*" %><%
%><%@ page import="javax.management.*" %><%
%><%@ page import="java.util.*" %><%
%><%

// print out some basic server information
String localMachine = java.net.InetAddress.getLocalHost().getHostName();
out.println("application_server|"+localMachine+"|");

// print out memory pool information
List<MemoryPoolMXBean> memPoolBeans = ManagementFactory.getMemoryPoolMXBeans();
for (MemoryPoolMXBean mpb : memPoolBeans) {

  if(!mpb.isValid()) 
    continue;

  MemoryUsage usage = null;
  try { usage = mpb.getUsage(); } catch (Throwable ex) { continue; }
  if(usage == null) continue;

  out.println("memory_" + mpb.getName().toLowerCase().replaceAll(" ","_") + "|" + usage.getUsed() + "|" + usage.getCommitted() + "|" + usage.getMax()+"|");
}

// print out thread counts
ThreadMXBean tmb = ManagementFactory.getThreadMXBean();
out.println("threads|" + tmb.getDaemonThreadCount() + "|" + tmb.getThreadCount() + "|" + tmb.getTotalStartedThreadCount()+"|");

// print out uptime
RuntimeMXBean rmb = ManagementFactory.getRuntimeMXBean();
out.println("uptime|" + rmb.getUptime()+"|");

// print out jmx attributes for cachestats mbeans with 'userdirectory' in the name
String [] attributesWeCareAbout = {
  "StatisticsAccuracy",
  "CacheHits",
  "CacheMisses",
  "ObjectCount",
  "StatisticsAccuracyDescription",
  "AssociatedCacheName",
  "InMemoryHits",
  "OnDiskHits"
};

MBeanServer pmbs = ManagementFactory.getPlatformMBeanServer();
Set<ObjectName> csmbs = pmbs.queryNames(new ObjectName("net.sf.ehcache:type=CacheStatistics*,name=*,*"),null);
for(ObjectName oi : csmbs) {

  String cacheName = oi.getKeyProperty("name");
  if(!cacheName.toLowerCase().contains("userdirectory")) continue;
  for(String attr : attributesWeCareAbout) {
    out.println(cacheName + "|" + attr + "|" + pmbs.getAttribute(oi, attr)+"|");
  }
}

BasicDataSource ds = (BasicDataSource)ComponentManager.get("javax.sql.DataSource");
SessionManager ss = (SessionManager)ComponentManager.get("org.sakaiproject.tool.api.SessionManager");

// print out important request headers from Apache
java.util.Enumeration headerNames = request.getHeaderNames();
while(headerNames.hasMoreElements()) {
   String headerName = (String)headerNames.nextElement();
   if(!headerName.equals("X-UF-SAKAI-WEBSERVER")) {
      continue;
   }

   out.println(headerName + "|" + request.getHeader(headerName)+"|");
}

// print out some basic statistics about dbcp pool
out.println("active_database_connections|"+ds.getNumActive()+"|");
out.println("idle_database_connections|"+ds.getNumIdle()+"|");
//out.println("active_users_last_hour|"+ss.getActiveUserCount(60*60)+"|");

// query for the number of active sessions on this node
String lquery =	"select "+
		"regexp_replace(session_server, '-[0-9]*$', '') as server_name, "+
		"count(distinct(session_user)) as num_users, "+
		"count(session_id) as num_sessions "+
		"from sakai.sakai_session "+
		"where session_server like '"+localMachine+"%' "; //+
//		"and session_start >= SYSDATE - 1 "+
String rquery = "and session_start = session_end "+
		"group by regexp_replace(session_server, '-[0-9]*$', '')";

java.sql.Connection conn = ds.getConnection();
java.sql.Statement stmt = conn.createStatement();
java.sql.ResultSet rs = null; // = stmt.executeQuery(lquery + "and session_start >= SYSDATE - 1 " + rquery);

// print the results for active sessions
// out.println("app_server|num_users|num_sessions");

long ct = 0;

// begin repeated stanza
ct=0;
rs = stmt.executeQuery(lquery + "and session_start >= SYSDATE - 1 " + rquery);
while (rs.next()) {
  String server_name = rs.getString("server_name");
  long num_users = rs.getLong("num_users");
  long num_sessions = rs.getLong("num_sessions");
  out.println("active_users_count|"+num_users+"|"+num_sessions+"|");
  ct++;
}

if(ct == 0) {
  // no users = no results, so print zero
  out.println("active_users_count|0|0|");
}
rs.close();
// end repeated stanza


// begin repeated stanza
ct=0;
rs = stmt.executeQuery(lquery + "AND session_start >= (SELECT systimestamp AT TIME ZONE 'GMT' from dual) - 5/1440 " + rquery);
while (rs.next()) { 
  String server_name = rs.getString("server_name");
  long num_users = rs.getLong("num_users");
  long num_sessions = rs.getLong("num_sessions");
  out.println("active_users_5mins|"+num_users+"|"+num_sessions+"|");
  ct++;
}

if(ct == 0) {
  // no users = no results, so print zero
  out.println("active_users_5mins|0|0|");
}
rs.close();
// end repeated stanza

// begin repeated stanza
ct=0;
rs = stmt.executeQuery(lquery + "AND session_start >= (SELECT systimestamp AT TIME ZONE 'GMT' from dual) - 30/1440 " + rquery);
while (rs.next()) {
  String server_name = rs.getString("server_name");
  long num_users = rs.getLong("num_users");
  long num_sessions = rs.getLong("num_sessions");
  out.println("active_users_30mins|"+num_users+"|"+num_sessions+"|");
  ct++;
}

if(ct == 0) {
  // no users = no results, so print zero
  out.println("active_users_30mins|0|0|");
}
rs.close();
// end repeated stanza

// begin repeated stanza
ct=0;
rs = stmt.executeQuery(lquery + "AND session_start >= (SELECT systimestamp AT TIME ZONE 'GMT' from dual) - 60/1440 " + rquery);
while (rs.next()) {
  String server_name = rs.getString("server_name");
  long num_users = rs.getLong("num_users");
  long num_sessions = rs.getLong("num_sessions");
  out.println("active_users_60mins|"+num_users+"|"+num_sessions+"|");
  ct++;
}

if(ct == 0) {
  // no users = no results, so print zero
  out.println("active_users_60mins|0|0|");
}
rs.close();
// end repeated stanza


stmt.close();
conn.close();

%>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: smime.p7s
Type: application/pkcs7-signature
Size: 4893 bytes
Desc: S/MIME Cryptographic Signature
Url : http://collab.sakaiproject.org/pipermail/production/attachments/20120618/546e24d1/attachment.bin 


More information about the production mailing list