glutenfree
Version:
A profiler/loganalyzer for nginx/Cetrea Aw.
86 lines (65 loc) • 2.11 kB
text/coffeescript
cluster = require("cluster")
winston = require("winston")
util = require("util")
_ = require("underscore")
nl = require("nodeload")
logger = new (winston.Logger)({
transports: [
new (winston.transports.Console)({'timestamp':true})
]
})
logger.info "PrWrkr##{cluster.worker.id}: online, waiting for input"
# holds timeout
reporter = {}
# cluster id - holds id of master
clusterId = ""
# handle message, specifically "targeting"
cluster.worker.on(
"message"
(msg) ->
switch msg.subject
when "targeting"
logger.info "PrWorker##{cluster.worker.id}: targeting received (http://#{msg.server}:#{msg.port} w #{msg.user}:#{msg.password}), hitting #{msg.targeting.length} targets"
clusterId = msg.clusterId
# start hitting targets
#hit(msg.server, msg.port, msg.user, msg.password, msg.targeting)
nl.run(
numClients: 10
targetRps: 100
timeLimit: 10
requestGenerator: (client) ->
# select a target, targets most used functions
r = Math.random()*100
target = _.find(msg.targeting, ((t) -> r < t.acc_percentage))
request = client.request(
"GET"
"/#{target.path}"
{
method: "GET"
host: msg.server
port: msg.port
headers: target.headers
auth: "#{msg.user}:#{msg.password}"
}
(res) ->
console.log "---> hit"
target.headers =
"If-None-Match" : res.headers["etag"] || target?.headers?["If-None-Match"]
)
request.end()
)
# report back to master
#reporter = report(msg.reportinterval || 10000)
)
# report is an array containing all results which have not yet been shipped to master
# handle disconnect
cluster.worker.on(
"disconnect",
->
# cancel existing report
clearTimeout(reporter)
# report remaining
report(0)
logger.info "report, disconnect"
process.exit(0)
)