blob: 15faf674767353c41aacc5dcc0e71eb0bc1f8ac1 [file] [log] [blame]
--@atlcompiler atl2006
-- ******************************************************************************
-- Copyright (c) 2007 INRIA.
-- All rights reserved. This program and the accompanying materials
-- are made available under the terms of the Eclipse Public License v2.0
-- which accompanies this distribution, and is available at
-- http://www.eclipse.org/legal/epl-v20.html
--
-- Contributors:
-- INRIA - Initial implementation
--
-- ******************************************************************************
--@author Hugo Bruneliere (Hugo.Bruneliere <at> gmail.com)
module Trace2PerformanceMetrics;
create OUT : Metrics from IN : Trace;
-------------------------------------------------------------------------------
-- HELPERS --------------------------------------------------------------------
-------------------------------------------------------------------------------
-- This helper returns the list of the methods called at a given level
-- CONTEXT: Trace!Level
-- RETURN: Sequence(String)
helper context Trace!Level def: getMethodsList() : Sequence(String) =
self.calls->iterate(call; list : Sequence(String) = Sequence{} |
if call.methodName <> 'Total DB-Ops' and list->excludes(call.methodName) then
list->append(call.methodName)
else
list
endif
);
-- This helper returns the overall list of the methods called
-- CONTEXT: Trace!Trace
-- RETURN: Sequence(String)
helper context Trace!Trace def: getMethodsList() : Sequence(String) =
self.levels->collect(l | l.getMethodsList())->flatten()->asSet();
helper def: methodsList : Sequence(String) = Sequence{};
-------------------------------------------------------------------------------
-- RULES ----------------------------------------------------------------------
-------------------------------------------------------------------------------
rule MetricsBuilding {
from
t : Trace!Trace
using {
totalNbOfMethodCall : Integer = 0;
totalNbOfDBAccesses : Integer = 0;
totalNbOfDBRows : Integer = 0;
totalCPUTime : Integer = 0;
}
to
mDBAccesses : Metrics!Metric (
name <- 'Average number of DB accesses by method'
),
mDBRows : Metrics!Metric (
name <- 'Average number of DB rows handled by method'
),
mCPU : Metrics!Metric (
name <- 'Average CPU time used by method'
)
do {
thisModule.methodsList <- t.getMethodsList();
for(methodName in thisModule.methodsList) {
for(level in t.levels) {
for(call in level.calls) {
if(call.methodName = methodName) {
totalNbOfMethodCall <- totalNbOfMethodCall + 1;
totalNbOfDBAccesses <- totalNbOfDBAccesses + call.DBAccessesNumber;
totalNbOfDBRows <- totalNbOfDBRows + call.DBRowsNumber;
totalCPUTime <- totalCPUTime + call.CPUTime;
}
}
}
mDBAccesses.values <- mDBAccesses.values->union(Sequence{
thisModule.CreateAverageNbOfDbAccessesMetricValue(methodName,
totalNbOfDBAccesses, totalNbOfMethodCall)
});
mDBRows.values <- mDBRows.values->union(Sequence{
thisModule.CreateAverageNbOfDbRowsMetricValue(methodName,
totalNbOfDBRows, totalNbOfMethodCall)
});
mCPU.values <- mCPU.values->union(Sequence{
thisModule.CreateAverageCPUTimeMetricValue(methodName,
totalCPUTime, totalNbOfMethodCall)
});
totalNbOfMethodCall <- 0;
totalNbOfDBAccesses <- 0;
totalNbOfDBRows <- 0;
totalCPUTime <- 0;
}
}
}
rule CreateAverageNbOfDbAccessesMetricValue(methodName : String,
totalNbOfDbAccesses : Integer, totalNbOfMethodCalls : Integer) {
to
mv : Metrics!IntegerMetricValue (
tag <- methodName,
value <- (totalNbOfDbAccesses / totalNbOfMethodCalls).round()
)
do {
mv;
}
}
rule CreateAverageNbOfDbRowsMetricValue(methodName : String,
totalNbOfDbRows : Integer, totalNbOfMethodCalls : Integer) {
to
mv : Metrics!IntegerMetricValue (
tag <- methodName,
value <- (totalNbOfDbRows / totalNbOfMethodCalls).round()
)
do {
mv;
}
}
rule CreateAverageCPUTimeMetricValue(methodName : String,
totalCPUTime : Integer, totalNbOfMethodCalls : Integer) {
to
mv : Metrics!IntegerMetricValue (
tag <- methodName,
value <- (totalCPUTime / totalNbOfMethodCalls).round()
)
do {
mv;
}
}