Ожидая в аэропорту в прошлые выходные, я работал над небольшой утилитой, которая поможет мне получить информацию о моих действиях в OpenWhisk. Как вы знаете (надеюсь, знаете!), Bluemix предоставляет страницу «статистики» для ваших материалов OpenWhisk, но она немного ограничена с точки зрения того, как далеко она уходит назад, и еще не предоставляет хороших сводных данных о ваших действиях. Так, например, я действительно хотел посмотреть, насколько хорошо мои действия реагируют в простой табличной форме. Имея это в виду, я создал инструмент командной строки, который предоставляет отчет:
Вы заметите на снимке экрана выше, что протестированное мной действие имеет ровно 2000 активаций. Это потому, что я установил верхний предел общего количества активаций, возвращаемых кодом. Это было несколько произвольно и, конечно, могло быть изменено. Это конкретное действие, getTraffic
, работает уже несколько месяцев и, вероятно, имеет около 20 тысяч активаций. Однако в настоящее время нет способа получить общее количество активаций. (Хотя я подал отчет об ошибке по этому поводу.)
Рассматриваемый код относительно прост, хотя и немного уродлив с точки зрения того, как я постепенно загружаю данные. Я попробовал подход на основе промисов, но мне было трудно понять, как заставить его работать с API. Обратите внимание, что код ожидает ваши учетные данные в файле с именем creds.json
. Это должно включать два значения, apihost
и api_key
, оба из которых вы можете получить из интерфейса командной строки OpenWhisk.
#!/usr/bin/env node
const openwhisk = require('openwhisk');
const creds = require('./creds.json');
const ow = openwhisk({
apihost: creds.apihost,
api_key: creds.api_key}
);
//used to max out the number of activations we fetch
const MAX_ACTS = 2000;
const chalk = require('chalk');
if(process.argv.length == 2) {
process.stdout.write(chalk.blue('Usage: ./index.js <<actionname>>\n'));
process.exit();
}
const action = process.argv[2];
process.stdout.write(chalk.blue('Fetching data for action '+action+'..'));
let results = {
total:0,
duration:0,
fastduration:99999999,
slowduration:0,
successful:0,
firstInvocation:'',
lastInvocation:''
};
/*
Going to store dates in an array and sort. Right now the package is returning
items reverse date sorted, but its not documented and may change in the future.
*/
let dates = [];
let activations = [];
function getAllActivations(cb,acts,skip) {
if(!acts) acts=[];
if(!skip) skip=0;
process.stdout.write(chalk.blue('.'));
ow.activations.list({limit:200, name:action, docs:true, skip:skip}).then(result => {
if(result.length === 0 || acts.length >= MAX_ACTS) return cb(acts);
acts = acts.concat(result);
getAllActivations(cb,acts,skip+200);
});
}
getAllActivations((result) => {
results.total = result.length;
result.forEach((act) => {
results.duration += act.duration
if(act.duration < results.fastduration) results.fastduration = act.duration;
if(act.duration > results.slowduration) results.slowduration = act.duration;
if(act.response.success) results.successful++;
dates.push(act.start);
});
dates.sort((a,b) => {
if(a < b) return -1;
if(a === b) return 0;
if(a > b) return 1;
});
results.firstInvocation = new Date(dates[0]);
results.lastInvocation = new Date(dates[dates.length-1]);
results.avgduration = Number((results.duration/results.total).toFixed(2));
results.successfulperc = Number((results.successful/results.total*100).toFixed(2));
let finalResult = `
Total Number of Invocations: ${results.total}
Total Successful: ${results.successful} (${results.successfulperc}%)
First Invocation: ${results.firstInvocation}
Last Invocation: ${results.lastInvocation}
Total Duration (ms): ${results.duration}
Quickest Duration (ms): ${results.fastduration}
Slowest Duration (ms): ${results.slowduration}
Average Duration (ms): ${results.avgduration}
`;
process.stdout.write(chalk.green(finalResult));
//console.log(results);
});
Вы можете найти этот код (и внести улучшения!) здесь, в моем репозитории GitHub:
https://github.com/cfjedimaster/Serverless-Examples/blob/master/stats2/getstats.js
Первоначально опубликовано на www.raymondcamden.com 15 мая 2017 г.