/*
* Copyright (C) 2013 TagServlet Ltd
*
* This file is part of Open BlueDragon (OpenBD) CFML Server Engine.
*
* OpenBD is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* Free Software Foundation,version 3.
*
* OpenBD is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with OpenBD. If not, see http://www.gnu.org/licenses/
*
* Additional permission under GNU GPL version 3 section 7
*
* If you modify this Program, or any covered work, by linking or combining
* it with any of the JARS listed in the README.txt (or a modified version of
* (that library), containing parts covered by the terms of that JAR, the
* licensors of this Program grant you additional permission to convey the
* resulting work.
* README.txt @ http://www.openbluedragon.org/license/README.txt
*
* http://openbd.org/
* $Id: ProfileSession.java 2378 2013-06-10 23:08:14Z alan $
*/
package com.bluedragon.profiler;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.bson.Document;
import com.mongodb.client.MongoCollection;
import com.naryx.tagfusion.cfm.engine.cfCatchData;
import com.naryx.tagfusion.cfm.engine.cfData;
import com.naryx.tagfusion.cfm.engine.cfEngine;
import com.naryx.tagfusion.cfm.engine.cfFormData;
import com.naryx.tagfusion.cfm.engine.cfSession;
import com.naryx.tagfusion.cfm.engine.cfUrlData;
import com.naryx.tagfusion.cfm.engine.cfmRunTimeException;
import com.naryx.tagfusion.cfm.engine.variableStore;
import com.naryx.tagfusion.cfm.file.cfFile;
import com.naryx.tagfusion.cfm.sql.cfSQLQueryData;
import com.naryx.tagfusion.cfm.sql.preparedData;
import com.naryx.tagfusion.cfm.sql.resultSetHolder;
import com.naryx.tagfusion.cfm.tag.cfTag;
import com.naryx.tagfusion.cfm.tag.tagUtils;
import com.naryx.tagfusion.util.debugRecorder;
public class ProfileSession extends Object implements debugRecorder {
public static String SESSION_DATA_BIN_PROFILE = "profile-data";
private cfSession session;
private long startTime;
private int countQuery = 0, countMongo = 0, countException = 0;
@SuppressWarnings( "rawtypes" )
private List<Map> listMap;
@SuppressWarnings( "rawtypes" )
public ProfileSession( cfSession session ){
this.session = session;
this.startTime = System.currentTimeMillis();
this.listMap = new ArrayList<Map>();
this.session.registerDebugRecorder( this );
}
public void startRequest() {}
public void startFile(cfFile thisFile) {}
public void setShow(boolean _show) {}
public boolean getShow() {return false;}
public boolean getShowDBActivity() {return false;}
public void recordTracepoint(String tracePoint) {}
public void recordTimer(String timing) {}
public debugRecorder copy() {return this;}
public void dump(cfSession session) {}
public void execOnStart(cfData sqlData) {}
public void endFile(cfFile thisFile) {}
public void storedProcRan(String _template, String _datasrc, String _procName, long _execTime, List<preparedData> _params, List<resultSetHolder> _results) {}
public void queryRan(String template, String qname, cfSQLQueryData query, List<preparedData> _qp) {}
public void updateRan(String template, String datasrc, String sql) {}
public void insertRan(String template, String datasrc, String sql) {}
@Override
public void exceptionThrown(cfmRunTimeException exception, cfFile f, cfTag t) {
Map<String,Object> m = new HashMap<String,Object>();
cfCatchData catchdata = exception.getCatchData();
m.put("exception", catchdata.getMessage() + "; " + catchdata.getDetail() );
m.put("file", f.getURI() );
listMap.add(m);
countException++;
}
public void execOnEnd(cfData sqlData) {
countQuery++;
Map<String,Object> m = new HashMap<String,Object>();
if ( sqlData instanceof cfSQLQueryData ){
cfSQLQueryData sqd = (cfSQLQueryData)sqlData;
m.put("ds", sqd.getDataSourceName() );
m.put("sql", sqd.queryString );
m.put("ms", sqd.executeTime );
if ( sqd.getNoRows() > 0 )
m.put("rows", sqd.getNoRows() );
listMap.add(m);
}
}
@SuppressWarnings( "rawtypes" )
@Override
public void endRequest() {
Map<String,Object> requestM = new HashMap<String,Object>();
cfFormData form = (cfFormData)session.getQualifiedData( variableStore.FORM_SCOPE );
if ( form.size() > 0 ){
Map frm = (Map)tagUtils.getNatural(form, true);
frm.remove("FIELDNAMES");
requestM.put("form", frm);
}
if ( !cfEngine.isFormUrlScopeCombined() ){
cfUrlData url = (cfUrlData)session.getQualifiedData( variableStore.URL_SCOPE );
if ( url.size() > 0 )
requestM.put("url", tagUtils.getNatural(url, true));
}
// Is there an extra data
cfData extraData = (cfData)session.getDataBin(SESSION_DATA_BIN_PROFILE);
if ( extraData != null )
requestM.put("_extra", tagUtils.getNatural(extraData, true) );
requestM.put("ms", (System.currentTimeMillis() - startTime) );
requestM.put("bytes", session.getBytesSent() );
requestM.put("uri", session.REQ.getContextPath() + session.REQ.getServletPath() );
// ip address
requestM.put("ip", session.REQ.getRemoteAddr() );
String xforwardedfor = session.REQ.getHeader("x-forwarded-for");
if ( xforwardedfor != null && !xforwardedfor.isEmpty() )
requestM.put("xip", xforwardedfor );
// query data
if ( session.getMetricQueryTotalTime() > 0 )
requestM.put("msquery", session.getMetricQueryTotalTime() );
if ( countQuery > 0 )
requestM.put("noquery", countQuery );
if ( countMongo > 0 )
requestM.put("nomongo", countMongo );
if ( countException > 0 )
requestM.put("noexc", countException );
String query = cfUrlData.getQueryString(session);
if ( query != null )
requestM.put("query", query );
if ( listMap.size() > 0 )
requestM.put("io", listMap );
ProfilerExtension.log(requestM);
}
@Override
public void execStoredProc(String datasourceName, String callString, String procName, long execTime) {
Map<String,Object> m = new HashMap<String,Object>();
m.put("ms", execTime );
m.put("call", callString );
m.put("proc", procName );
m.put("ds", datasourceName );
listMap.add(m);
}
@Override
public void execMongo( MongoCollection<Document> col, String action, Document qry, long execTime ) {
Map<String,Object> m = new HashMap<String,Object>();
m.put("ms", execTime );
m.put("action", action );
m.put("col", col.getNamespace().getCollectionName() );
m.put("db", col.getNamespace().getDatabaseName() );
if ( qry != null )
m.put("qry", qry.toString() );
listMap.add(m);
}
}