Skip to content

Commit 838eb34

Browse files
authored
Merge pull request #14 from SoftwareAG/development
experimental-workflow-execution-analysis
2 parents f3db9a9 + 7d9a18b commit 838eb34

File tree

2 files changed

+157
-18
lines changed

2 files changed

+157
-18
lines changed

experimental.js

Lines changed: 133 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ var nextUrl,formUrl;
3333
var finalCall;
3434
var loginStageCounter = 0;
3535
var vbid;
36+
var format;
3637
var flowuid;
3738
var payloaduid;
3839
var projectuid;
@@ -172,6 +173,16 @@ function workflowResubmit(instartOrResume, inStartDate,inEndDate, inProjectId,in
172173
loginPhase1();
173174
}
174175

176+
177+
function vbidAnalysis(inVbid, inFormat)
178+
{
179+
vbid = inVbid
180+
format = inFormat;
181+
finalCall = getVbidAnalysis;
182+
loginPhase1();
183+
}
184+
185+
175186
function debugMonitorInfo()
176187
{
177188
debug("Monitor Project: [" + projectName + "]");
@@ -229,6 +240,18 @@ function setHeaders()
229240
return headers;
230241
}
231242

243+
244+
function getVbidAnalysis()
245+
{
246+
247+
dbg.message("<EXPERIMENTAL>Getting VBID analysis [" + vbid + "]");
248+
var endPoint = "https://" + domainName + "/enterprise/v1/tenant/logs/" + vbid + "?field=created_at&direction=asc";
249+
debug("Next URL [" + endPoint + "]");
250+
var headers = setHeaders();
251+
rest.custom(endPoint,undefined,undefined,timeout,undefined,undefined,"GET",processVbidResponse,undefined,headers,true,false);
252+
253+
}
254+
232255
function checkResubmissions()
233256
{
234257
debug("Check Resubmissions")
@@ -357,6 +380,107 @@ function processFinalSingleResubmissionResponse(url,err,body,res){
357380
}
358381
}
359382

383+
384+
385+
function logsToCSV(logsJson){
386+
387+
var csv="ActivityId,ActivityLabel,ActivityType,Message,ActionDate,ElapsedMilliSeconds\n";
388+
var activityId, activityLabel,activityType, message, actype, actionDate, prevDate;
389+
var sep = ",";
390+
391+
for(var i=0;i<logsJson.output.objects.length;i++){
392+
dbg.message("<EXPERIMENTAL>"+"CSV Conversion [" + i + "]",4);
393+
activityId = logsJson.output.objects[i].activity_id;
394+
activityLabel = logsJson.output.objects[i].activity_label;
395+
activityType = logsJson.output.objects[i].type;
396+
message = logsJson.output.objects[i].message;
397+
actype = logsJson.output.objects[i].type;
398+
actionDate = logsJson.output.objects[i].updated_at;
399+
400+
if(activityType=="input")message="##DATA##";
401+
if(activityType=="output")message="##DATA##";
402+
if(activityType=="bill"){
403+
message="##DATA##";
404+
activityId = "bill";
405+
}
406+
if(activityLabel=="Logger")message="##DATA##";
407+
if(activityLabel===undefined)activityLabel=actype;
408+
activityLabel = "\"" + activityLabel + "\"";
409+
410+
activitId = "\"" + activityId + "\"";
411+
412+
413+
csv += activityId + sep + activityLabel + sep + activityType + sep + message + sep + actionDate + sep;
414+
if(i>0)
415+
{
416+
dbg.message("<EXPERIMENTAL>"+"CSV Conversion Calculating delta",4);
417+
var dateObjPrev = new Date(prevDate);
418+
var dateObjCurr = new Date(actionDate);
419+
var res = dateObjCurr.getTime() - dateObjPrev.getTime();
420+
csv += res;
421+
422+
}
423+
else
424+
{
425+
csv += 0;
426+
}
427+
csv += "\n";
428+
429+
prevDate = actionDate;
430+
}
431+
return csv;
432+
433+
}
434+
435+
function processVbidResponse(url,err,body,res){
436+
if(res.statusCode==200)
437+
{
438+
if(body.output.objects)
439+
{
440+
dbg.message("<EXPERIMENTAL>"+"Found Logs for - VBID",4);
441+
442+
var outputFormat = format.toUpperCase();
443+
444+
switch(outputFormat)
445+
{
446+
447+
case "JSON":
448+
dbg.message("<EXPERIMENTAL>"+"Outputting in JSON Format",4);
449+
if(prettyprint==true){
450+
dbg.message(JSON.stringify(body,null,4),-1);
451+
}
452+
else{
453+
dbg.message((JSON.stringify(body)),-1);
454+
}
455+
break;
456+
case "CSV":
457+
dbg.message("<EXPERIMENTAL>"+"Outputting in CSV Format",4);
458+
var csv = logsToCSV(body);
459+
dbg.message(csv,-1);
460+
break;
461+
462+
default:
463+
dbg.message("<EXPERIMENTAL>" + "Please provide a valid format - either JSON or CSV");
464+
break;
465+
}
466+
467+
468+
469+
}
470+
else{
471+
472+
dbg.message("<EXPERIMENTAL>"+ "Unable to find logs for VBID",1);
473+
}
474+
}
475+
else
476+
{
477+
dbg.message("<EXPERIMENTAL>"+"Failed to get logs for VBID",1)
478+
dbg.message(JSON.stringify(body),1);
479+
process.exit(99);
480+
}
481+
}
482+
483+
360484
function processSingleResubmissionResponse(url,err,body,res){
361485
if(res.statusCode==200)
362486
{
@@ -872,6 +996,12 @@ function loginResponse(url,err,body,res){
872996

873997
}
874998

875-
module.exports = {init,user,stages,projectWorkflows,projectFlowservices,connectorAccounts,
876-
getProjectAccountConfig,searchProject,getMonitorInfo,workflowResubmit,
877-
projectDeployments,messagingCreate,messagingStats,messagingDelete};
999+
module.exports = {init,
1000+
user,stages,
1001+
searchProject,
1002+
projectDeployments,
1003+
projectWorkflows,projectFlowservices,
1004+
connectorAccounts,getProjectAccountConfig,
1005+
getMonitorInfo,workflowResubmit,
1006+
messagingCreate,messagingStats,messagingDelete,
1007+
vbidAnalysis};

wmiocli.js

Lines changed: 24 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ var theme = require('./themes.js');
1616
var recipe = require('./recipe.js');
1717
var flowservice = require('./flowservice.js');
1818
var experimental = require('./experimental.js');
19+
var hideExperimental = true;
1920
const { setLogLevel } = require('./debug.js');
2021

2122

@@ -61,8 +62,7 @@ function checkOptions(){
6162

6263
ignoreTLS = program.opts().ignoreTLSErrors;
6364

64-
65-
65+
6666
if(program.opts().prettyprint == true)
6767
{
6868
prettyprint = true;
@@ -154,6 +154,7 @@ program
154154
.option('--proxy <proxyURL>','URL for proxy server if required')
155155
.option('--caCert <path-to-cert>','Path to a CACert PEM file if required')
156156
.option('--ignoreTLSErrors','Ignore TLS errors')
157+
.option('--experimental','Provide help information on experimental commands')
157158

158159

159160
//Additional help
@@ -594,7 +595,7 @@ program.command('flowservice-execute <project-id> <flow-name> [input-json]')
594595
* experimental non-public APIs
595596
* ------------------------------------------------------------------------------------------------------------------------------------
596597
*/
597-
program.command('experimental-user',{hidden: true})
598+
program.command('experimental-user',{hidden: hideExperimental})
598599
.addHelpCommand("HELP")
599600
.description('Get User information')
600601
.action(() => {
@@ -603,101 +604,109 @@ program.command('flowservice-execute <project-id> <flow-name> [input-json]')
603604
experimental.user();
604605
});
605606

606-
program.command('experimental-stages',{hidden: true})
607+
program.command('experimental-stages',{hidden: hideExperimental})
607608
.description('Get Stage information')
608609
.action(() => {
609610
checkOptions();
610611
experimental.init(tenantDomain,tenantUser,tenantPw,program.opts().timeout,program.opts().prettyprint)
611612
experimental.stages();
612613
});
613614

614-
program.command('experimental-project-workflows <project-id>',{hidden: true})
615+
program.command('experimental-project-workflows <project-id>',{hidden: hideExperimental})
615616
.description('Get information about project workflows')
616617
.action((projectId) => {
617618
checkOptions();
618619
experimental.init(tenantDomain,tenantUser,tenantPw,program.opts().timeout,program.opts().prettyprint)
619620
experimental.projectWorkflows(projectId);
620621
});
621622

622-
program.command('experimental-project-flowservices <project-id>',{hidden: true})
623+
program.command('experimental-project-flowservices <project-id>',{hidden: hideExperimental})
623624
.description('Get information about project FlowServices')
624625
.action((projectId) => {
625626
checkOptions();
626627
experimental.init(tenantDomain,tenantUser,tenantPw,program.opts().timeout,program.opts().prettyprint)
627628
experimental.projectFlowservices(projectId);
628629
});
629630

630-
program.command('experimental-project-connector-accounts <project-id>',{hidden: true})
631+
program.command('experimental-project-connector-accounts <project-id>',{hidden: hideExperimental})
631632
.description('Get Information about project connector accounts')
632633
.action((projectId) => {
633634
checkOptions();
634635
experimental.init(tenantDomain,tenantUser,tenantPw,program.opts().timeout,program.opts().prettyprint)
635636
experimental.connectorAccounts(projectId);
636637
});
637638

638-
program.command('experimental-project-connector-account-wf-config <project-id>',{hidden: true})
639+
program.command('experimental-project-connector-account-wf-config <project-id>',{hidden: hideExperimental})
639640
.description('Get configuration information about project connector accounts')
640641
.action((projectId) => {
641642
checkOptions();
642643
experimental.init(tenantDomain,tenantUser,tenantPw,program.opts().timeout,program.opts().prettyprint)
643644
experimental.getProjectAccountConfig(projectId);
644645
});
645646

646-
program.command('experimental-project-search <project-name>',{hidden: true})
647+
program.command('experimental-project-search <project-name>',{hidden: hideExperimental})
647648
.description('Search project info by name')
648649
.action((projectName) => {
649650
checkOptions();
650651
experimental.init(tenantDomain,tenantUser,tenantPw,program.opts().timeout,program.opts().prettyprint)
651652
experimental.searchProject(projectName);
652653
});
653654

654-
program.command('experimental-project-deployments <project-id>',{hidden: true})
655+
program.command('experimental-project-deployments <project-id>',{hidden: hideExperimental})
655656
.description('List all project deployments')
656657
.action((projectId) => {
657658
checkOptions();
658659
experimental.init(tenantDomain,tenantUser,tenantPw,program.opts().timeout,program.opts().prettyprint)
659660
experimental.projectDeployments(projectId);
660661
});
661662

662-
program.command('experimental-workflow-monitor [execution-status] [start-date] [end-date] [project-id] [workflow-id]',{hidden: true})
663+
program.command('experimental-workflow-monitor [execution-status] [start-date] [end-date] [project-id] [workflow-id]',{hidden: hideExperimental})
663664
.description('List Workflow Monitor')
664665
.action((executionStatus,startDate,endDate,projectId,workflowId) => {
665666
checkOptions();
666667
experimental.init(tenantDomain,tenantUser,tenantPw,program.opts().timeout,program.opts().prettyprint)
667668
experimental.getMonitorInfo(executionStatus,startDate,endDate,projectId,workflowId);
668669
});
669670

670-
program.command('experimental-workflow-resubmit [restart-or-resume] [start-date] [end-date] [project-id] [workflow-id]',{hidden: true})
671+
program.command('experimental-workflow-resubmit [restart-or-resume] [start-date] [end-date] [project-id] [workflow-id]',{hidden: hideExperimental})
671672
.description('Resubmit workflows from monitor')
672673
.action((restartOrResume,startDate,endDate,projectId,workflowId) => {
673674
checkOptions();
674675
experimental.init(tenantDomain,tenantUser,tenantPw,program.opts().timeout,program.opts().prettyprint)
675676
experimental.workflowResubmit(restartOrResume, startDate, endDate, projectId,workflowId);
676677
});
677678

678-
program.command('experimental-messaging-create <queue-or-topic> <name> <project-id>',{hidden: true})
679+
program.command('experimental-messaging-create <queue-or-topic> <name> <project-id>',{hidden: hideExperimental})
679680
.description('Create a messaging queue or topic')
680681
.action((queueOrTopc,name,projectId) => {
681682
checkOptions();
682683
experimental.init(tenantDomain,tenantUser,tenantPw,program.opts().timeout,program.opts().prettyprint)
683684
experimental.messagingCreate(queueOrTopc,projectId,name);
684685
});
685686

686-
program.command('experimental-messaging-delete <queue-or-topic> <name> <project-id>',{hidden: true})
687+
program.command('experimental-messaging-delete <queue-or-topic> <name> <project-id>',{hidden: hideExperimental})
687688
.description('Delete a messaging queue or topic')
688689
.action((queueOrTopc,name,projectId) => {
689690
checkOptions();
690691
experimental.init(tenantDomain,tenantUser,tenantPw,program.opts().timeout,program.opts().prettyprint)
691692
experimental.messagingDelete(queueOrTopc,projectId,name);
692693
});
693694

694-
program.command('experimental-messaging-stats <name> <project-id>',{hidden: true})
695+
program.command('experimental-messaging-stats <name> <project-id>',{hidden: hideExperimental})
695696
.description('Get Messaging Stats')
696697
.action((name,projectId) => {
697698
checkOptions();
698699
experimental.init(tenantDomain,tenantUser,tenantPw,program.opts().timeout,program.opts().prettyprint)
699700
experimental.messagingStats(projectId,name);
700701
});
702+
703+
program.command('experimental-workflow-execution-analysis <vbid> [format]',{hidden: hideExperimental})
704+
.description('Provide workflow exedcution analysis')
705+
.action((vbid,format) => {
706+
checkOptions();
707+
experimental.init(tenantDomain,tenantUser,tenantPw,program.opts().timeout,program.opts().prettyprint)
708+
experimental.vbidAnalysis(vbid,format);
709+
})
701710

702711
program.parse();
703712

0 commit comments

Comments
 (0)