Wiki source code of Project Wonder additions to wotaskd and JavaMonitor
Version 136.1 by David Avendasora on 2010/11/29 19:35
Show last authors
| author | version | line-number | content |
|---|---|---|---|
| 1 | {{toc}}{{/toc}} | ||
| 2 | |||
| 3 | === Introduction === | ||
| 4 | |||
| 5 | WebObject's wotaskd and JavaMonitor deployment tools were open sourced in WebObjects 5.4. The source was then quickly modified and included in Project Wonder. Substantial improvements in both functionality and look-and-feel have been made over the years since their release as open source. These improved versions of **wotaskd.woa** and **JavaMonitor.woa** are available as full Wonder applications. | ||
| 6 | |||
| 7 | [[image:WonderJavaMonitor.png||border="1"]] | ||
| 8 | |||
| 9 | === Where to get them === | ||
| 10 | |||
| 11 | You can either download them pre-built from [[Wonder's Hudson build server>>http://webobjects.mdimension.com/hudson/job/Wonder54/lastSuccessfulBuild/artifact/dist/]] or build them from the source code. | ||
| 12 | |||
| 13 | To build them from the source, simply run the following Command from the Wonder directory at the root of the Wonder source code directory: | ||
| 14 | |||
| 15 | {{code}} | ||
| 16 | ant frameworks deployment.tools -Dwonder.patch=54 -Ddeployment.standalone=true | ||
| 17 | {{/code}} | ||
| 18 | |||
| 19 | {{info title="What this command does:"}} | ||
| 20 | |||
| 21 | * *ant*: calls Ant | ||
| 22 | * *frameworks*: tells Ant to build the "frameworks" target | ||
| 23 | * *deployment.tools* tells Ant to build the "deployment.tools" target | ||
| 24 | * *\-Ddeployment.standalone=true*: argument will embed the required Wonder and WebObjects frameworks in the wotaskd.woa | ||
| 25 | |||
| 26 | |||
| 27 | |||
| 28 | {{/info}} | ||
| 29 | |||
| 30 | === Statistics === | ||
| 31 | |||
| 32 | If you call [[http://monitorhost:port/cgi-bin/WebObjects/JavaMonitor.woa/wa/statistics]], the answer send you back statistics, in JSON format, about instances, per application. Sample : | ||
| 33 | |||
| 34 | {{code}} | ||
| 35 | |||
| 36 | ( | ||
| 37 | { | ||
| 38 | "configuredInstances" = "2"; | ||
| 39 | "maxSessions" = "0"; | ||
| 40 | "maxAvgIdleTime" = "2.078"; | ||
| 41 | "avgTransactions" = "44.0000"; | ||
| 42 | "sumSessions" = "0"; | ||
| 43 | "avgAvgTransactionTime" = "0.0985000"; | ||
| 44 | "refusingInstances" = "0"; | ||
| 45 | "avgSessions" = "0.0000"; | ||
| 46 | "maxTransactions" = "88"; | ||
| 47 | "applicationName" = "AjaxExample"; | ||
| 48 | "avgAvgIdleTime" = "1.0390000"; | ||
| 49 | "maxAvgTransactionTime" = "0.197"; | ||
| 50 | "runningInstances" = "2"; | ||
| 51 | "sumTransactions" = "88"; | ||
| 52 | }, | ||
| 53 | { | ||
| 54 | "configuredInstances" = "2"; | ||
| 55 | "maxSessions" = "0"; | ||
| 56 | "maxAvgIdleTime" = "325.443"; | ||
| 57 | "avgTransactions" = "0.5000"; | ||
| 58 | "sumSessions" = "0"; | ||
| 59 | "avgAvgTransactionTime" = "0.00000"; | ||
| 60 | "refusingInstances" = "0"; | ||
| 61 | "avgSessions" = "0.0000"; | ||
| 62 | "maxTransactions" = "1"; | ||
| 63 | "applicationName" = "AjaxExample2"; | ||
| 64 | "avgAvgIdleTime" = "162.7215000"; | ||
| 65 | "maxAvgTransactionTime" = "0.0"; | ||
| 66 | "runningInstances" = "2"; | ||
| 67 | "sumTransactions" = "1"; | ||
| 68 | } | ||
| 69 | ) | ||
| 70 | |||
| 71 | {{/code}} | ||
| 72 | |||
| 73 | If JavaMonitor is configured with a password, and I hope you do, pass //pw=monitorpassword// as a argument to the query : | ||
| 74 | |||
| 75 | [[http://monitorhost:port/cgi-bin/WebObjects/JavaMonitor.woa/wa/statistics?pw=monitorpassword]] | ||
| 76 | |||
| 77 | === Direct Actions to many tasks === | ||
| 78 | |||
| 79 | You can do most of the standard tasks you do in Monitor by calling direct actions. They are in a different query handler, ///admin//. They follow the same format and use the same query parameters. Those DA can be useful if you need to restart instances or other tasks within ant or other build/deployment systems. | ||
| 80 | |||
| 81 | //?type=all// : return details about all applications and instances | ||
| 82 | //?type=app&name=AppName// : return details about all instances of a specific application | ||
| 83 | //?type=ins&name=AppName-InstanceNo// : return details about one specific instance | ||
| 84 | |||
| 85 | For example, if you want to get details about all instances and applications, you call : | ||
| 86 | |||
| 87 | [[http://hostname:56789/cgi-bin/WebObjects/JavaMonitor.woa/admin/info?type=all]] | ||
| 88 | |||
| 89 | To get details about the //AjaxExample// application : | ||
| 90 | |||
| 91 | [[http://hostname:56789/cgi-bin/WebObjects/JavaMonitor.woa/admin/info?type=app&name=AjaxExample]] | ||
| 92 | |||
| 93 | And for a specific instance : | ||
| 94 | |||
| 95 | [[http://hostname:56789/cgi-bin/WebObjects/JavaMonitor.woa/admin/info?type=ins&name=AjaxExample-1]] | ||
| 96 | |||
| 97 | The response for the direct actions will either send a JSON array or YES/NO. For example, the query //info// for all instances will return : | ||
| 98 | |||
| 99 | {{code}} | ||
| 100 | |||
| 101 | [Hudson Build Server for Wonder|http://webobjects.mdimension.com/hudson/job/Wonder54/lastSuccessfulBuild/artifact/dist/] | ||
| 102 | |||
| 103 | {{/code}} | ||
| 104 | |||
| 105 | List of available direct actions : | ||
| 106 | |||
| 107 | ///info// : return details (number of deaths, state, etc.; see above), in JSON, about an instance. | ||
| 108 | ///running// : return YES if the instance is running, NO if not. | ||
| 109 | ///stopped// : return NO if the instance is running, YES if not. | ||
| 110 | ///bounce//: more on it later. | ||
| 111 | ///clearDeaths// : clear the number of deaths (same action as clicking the "Clear deaths" in JavaMonitor) | ||
| 112 | ///turnScheduledOn// : turn scheduling on for an application or instance. Call ///turnScheduledOff// to do the opposite. | ||
| 113 | ///turnRefuseNewSessionsOn// : turn "Refuse new sessions" on, call //turnRefuseNewSessionsOff// to do the opposite. | ||
| 114 | ///turnAutoRecoverOn// : guess what? It activate "Auto recover" And guess again? ///turnAutoRecoverOff// do the opposite | ||
| 115 | ///forceQuit// : force quit an application, might be useful to call it from a monitoring system. | ||
| 116 | ///stop// : stop an application/instance the normal way. | ||
| 117 | ///start// : start an application/instance the normal way. | ||
| 118 | |||
| 119 | === Automatic archive of SiteConfig.xml === | ||
| 120 | |||
| 121 | On every change you do to the configuration, a backup of SiteConfig.xml will be done in, by default, /Library/WebObjects/Configuration. | ||
| 122 | |||
| 123 | === Bounce feature === | ||
| 124 | |||
| 125 | In the "list instances" page, you get a "Bounce" action link. This action only work if you have at least one active instance and one inactive. What it does is : | ||
| 126 | |||
| 127 | * Find the inactive (eg : not started) instance and start it | ||
| 128 | * Find the active instances (minus the one started the step below) and enable "Refuse New Session" | ||
| 129 | * Bounce the active instances when the minimum session count is reached | ||
| 130 | |||
| 131 | This feature, from my understanding, allow you to upload new versions of your app, start up the new version and refuse sessions for the instances running on the older version. I don't know how this will work if your new version use migrations to change your schema (eg : old instances might raise exceptions because of database schema changes), so try it out on a test server before and put your results here. | ||
| 132 | |||
| 133 | === REST routes === | ||
| 134 | |||
| 135 | On September 28th 2010, REST routes were added in JavaMonitor. Those routes + the direct actions explained in this document allow you to control almost everything remotely (make sure that your JavaMonitor installation is secure). As the direct actions, append //?pw=XXXX// to the URLs if JavaMonitor is password protected. | ||
| 136 | |||
| 137 | Examples of REST calls : | ||
| 138 | |||
| 139 | Fetching the details of all applications : | ||
| 140 | |||
| 141 | {{code}} | ||
| 142 | |||
| 143 | curl -X GET http://127.0.0.1:56789/cgi-bin/WebObjects/JavaMonitor.woa/ra/mApplications.json | ||
| 144 | |||
| 145 | {{/code}} | ||
| 146 | |||
| 147 | Adding a new application : | ||
| 148 | |||
| 149 | {{code}} | ||
| 150 | |||
| 151 | curl -X POST -d "{id: 'AjaxExample',type: 'MApplication', name: 'AjaxExample',unixOutputPath: '/opt/Local/Library/WebObjects/Logs', unixPath: '/opt/Local/Library/WebObjects/Applications/AjaxExample.woa/AjaxExample'}" http://127.0.0.1:56789/cgi-bin/WebObjects/JavaMonitor.woa/ra/mApplications.json | ||
| 152 | |||
| 153 | {{/code}} | ||
| 154 | |||
| 155 | Adding a new instance : | ||
| 156 | |||
| 157 | {{code}} | ||
| 158 | |||
| 159 | curl -X GET http://127.0.0.1:56789/cgi-bin/WebObjects/JavaMonitor.woa/ra/mApplications/AjaxExample/addInstance&host=localhost | ||
| 160 | |||
| 161 | {{/code}} | ||
| 162 | |||
| 163 | Delete an application : | ||
| 164 | |||
| 165 | {{code}} | ||
| 166 | |||
| 167 | curl -X DELETE http://127.0.0.1:56789/cgi-bin/WebObjects/JavaMonitor.woa/ra/mApplications/AjaxExample.json | ||
| 168 | |||
| 169 | {{/code}} | ||
| 170 | |||
| 171 | Delete an instance : | ||
| 172 | |||
| 173 | {{code}} | ||
| 174 | |||
| 175 | curl -X GET http://127.0.0.1:56789/cgi-bin/WebObjects/JavaMonitor.woa/ra/mApplications/AjaxExample/deleteInstance?id=1 | ||
| 176 | |||
| 177 | {{/code}} | ||
| 178 | |||
| 179 | Adding a new host : | ||
| 180 | |||
| 181 | {{code}} | ||
| 182 | |||
| 183 | curl -X POST -d "{id: 'otherserver.com',type: 'MHost', osType: 'MACOSX',address: '192.168.20.5', name: 'otherserver.com'}" http://127.0.0.1:56789/apps/WebObjects/JavaMonitor.woa/ra/mHosts.json | ||
| 184 | |||
| 185 | {{/code}} |