Wiki source code of Project Wonder additions to wotaskd and JavaMonitor
Version 135.1 by David Avendasora on 2010/11/29 19:35
Hide last authors
author | version | line-number | content |
---|---|---|---|
![]() |
77.1 | 1 | {{toc}}{{/toc}} |
2 | |||
![]() |
57.1 | 3 | === Introduction === |
4 | |||
![]() |
135.1 | 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. |
![]() |
57.1 | 6 | |
![]() |
133.1 | 7 | [[image:WonderJavaMonitor.png||border="1"]] |
![]() |
129.1 | 8 | |
![]() |
135.1 | 9 | === Where to get them === |
![]() |
129.1 | 10 | |
![]() |
135.1 | 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. |
![]() |
57.1 | 12 | |
![]() |
135.1 | 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: |
![]() |
77.1 | 14 | |
![]() |
57.1 | 15 | {{code}} |
![]() |
135.1 | 16 | ant frameworks deployment.tools -Dwonder.patch=54 -Ddeployment.standalone=true |
![]() |
77.1 | 17 | {{/code}} |
![]() |
57.1 | 18 | |
![]() |
135.1 | 19 | {{info title="What this command does:"}} |
![]() |
77.1 | 20 | |
![]() |
135.1 | 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 | ||
![]() |
77.1 | 25 | |
![]() |
135.1 | 26 | |
27 | |||
28 | {{/info}} | ||
29 | |||
![]() |
121.1 | 30 | === Statistics === |
![]() |
77.1 | 31 | |
![]() |
113.1 | 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 : |
![]() |
77.1 | 33 | |
![]() |
113.1 | 34 | {{code}} |
![]() |
77.1 | 35 | |
![]() |
57.1 | 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 | |||
![]() |
113.1 | 71 | {{/code}} |
![]() |
57.1 | 72 | |
![]() |
113.1 | 73 | If JavaMonitor is configured with a password, and I hope you do, pass //pw=monitorpassword// as a argument to the query : |
![]() |
57.1 | 74 | |
![]() |
113.1 | 75 | [[http://monitorhost:port/cgi-bin/WebObjects/JavaMonitor.woa/wa/statistics?pw=monitorpassword]] |
![]() |
57.1 | 76 | |
![]() |
121.1 | 77 | === Direct Actions to many tasks === |
![]() |
57.1 | 78 | |
![]() |
113.1 | 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. |
![]() |
57.1 | 80 | |
![]() |
113.1 | 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 | |||
![]() |
97.1 | 85 | For example, if you want to get details about all instances and applications, you call : |
![]() |
57.1 | 86 | |
![]() |
113.1 | 87 | [[http://hostname:56789/cgi-bin/WebObjects/JavaMonitor.woa/admin/info?type=all]] |
![]() |
57.1 | 88 | |
![]() |
113.1 | 89 | To get details about the //AjaxExample// application : |
![]() |
57.1 | 90 | |
![]() |
113.1 | 91 | [[http://hostname:56789/cgi-bin/WebObjects/JavaMonitor.woa/admin/info?type=app&name=AjaxExample]] |
![]() |
57.1 | 92 | |
![]() |
97.1 | 93 | And for a specific instance : |
![]() |
57.1 | 94 | |
![]() |
113.1 | 95 | [[http://hostname:56789/cgi-bin/WebObjects/JavaMonitor.woa/admin/info?type=ins&name=AjaxExample-1]] |
![]() |
57.1 | 96 | |
![]() |
113.1 | 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 : |
![]() |
105.1 | 98 | |
![]() |
113.1 | 99 | {{code}} |
100 | |||
![]() |
105.1 | 101 | [Hudson Build Server for Wonder|http://webobjects.mdimension.com/hudson/job/Wonder54/lastSuccessfulBuild/artifact/dist/] |
102 | |||
![]() |
113.1 | 103 | {{/code}} |
104 | |||
![]() |
105.1 | 105 | List of available direct actions : |
106 | |||
![]() |
113.1 | 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. | ||
![]() |
105.1 | 118 | |
![]() |
121.1 | 119 | === Automatic archive of SiteConfig.xml === |
![]() |
113.1 | 120 | |
![]() |
121.1 | 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 | |||
![]() |
113.1 | 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 | |||
![]() |
77.1 | 137 | Examples of REST calls : |
138 | |||
![]() |
111.1 | 139 | Fetching the details of all applications : |
![]() |
113.1 | 140 | |
141 | {{code}} | ||
142 | |||
![]() |
109.1 | 143 | curl -X GET http://127.0.0.1:56789/cgi-bin/WebObjects/JavaMonitor.woa/ra/mApplications.json |
![]() |
77.1 | 144 | |
![]() |
113.1 | 145 | {{/code}} |
146 | |||
![]() |
111.1 | 147 | Adding a new application : |
![]() |
77.1 | 148 | |
![]() |
113.1 | 149 | {{code}} |
150 | |||
![]() |
109.1 | 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 |
![]() |
77.1 | 152 | |
![]() |
113.1 | 153 | {{/code}} |
154 | |||
![]() |
111.1 | 155 | Adding a new instance : |
![]() |
77.1 | 156 | |
![]() |
113.1 | 157 | {{code}} |
158 | |||
![]() |
111.1 | 159 | curl -X GET http://127.0.0.1:56789/cgi-bin/WebObjects/JavaMonitor.woa/ra/mApplications/AjaxExample/addInstance&host=localhost |
![]() |
77.1 | 160 | |
![]() |
113.1 | 161 | {{/code}} |
162 | |||
![]() |
111.1 | 163 | Delete an application : |
164 | |||
![]() |
113.1 | 165 | {{code}} |
166 | |||
![]() |
105.1 | 167 | curl -X DELETE http://127.0.0.1:56789/cgi-bin/WebObjects/JavaMonitor.woa/ra/mApplications/AjaxExample.json |
168 | |||
![]() |
113.1 | 169 | {{/code}} |
170 | |||
![]() |
111.1 | 171 | Delete an instance : |
![]() |
77.1 | 172 | |
![]() |
113.1 | 173 | {{code}} |
174 | |||
![]() |
111.1 | 175 | curl -X GET http://127.0.0.1:56789/cgi-bin/WebObjects/JavaMonitor.woa/ra/mApplications/AjaxExample/deleteInstance?id=1 |
![]() |
77.1 | 176 | |
![]() |
113.1 | 177 | {{/code}} |
178 | |||
![]() |
111.1 | 179 | Adding a new host : |
![]() |
77.1 | 180 | |
![]() |
113.1 | 181 | {{code}} |
182 | |||
![]() |
111.1 | 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 |
![]() |
77.1 | 184 | |
![]() |
113.1 | 185 | {{/code}} |