Wiki source code of Project Wonder additions to wotaskd and JavaMonitor
Version 126.1 by David Avendasora on 2010/11/29 19:45
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 [[Wonder source code>>WONDER:Download Wonder Source, Build, Install and Upgrade]], simply run the following command from the Wonder directory at the root of the Wonder source. | ||
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 Apache Ant. It is assumed that you have this already installed. | ||
22 | * *frameworks*: tells Ant to build the "frameworks" target. This may not be needed if you already have Wonder built and installed in a location Ant can find automatically. | ||
23 | * *deployment.tools*: tells Ant to build the "deployment.tools" target. This is the target that builds both wotaskd.woa and JavaMonitor.woa. You absolutely need this one. | ||
24 | * *\-Dwonder.patch=54*: tells Wonder to build for WebObjects version 5.4. You need this if you are building against Wonder Trunk. Some branches don't need it, but it doesn't hurt either. | ||
25 | * *\-Ddeployment.standalone=true*: argument will embed the required Wonder and WebObjects frameworks in built applications. You need this to ensure that the required frameworks are embedded in the built applications. | ||
26 | |||
27 | |||
28 | |||
29 | {{/info}} | ||
30 | |||
31 | === Statistics === | ||
32 | |||
33 | 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 : | ||
34 | |||
35 | {{code}} | ||
36 | |||
37 | ( | ||
38 | { | ||
39 | "configuredInstances" = "2"; | ||
40 | "maxSessions" = "0"; | ||
41 | "maxAvgIdleTime" = "2.078"; | ||
42 | "avgTransactions" = "44.0000"; | ||
43 | "sumSessions" = "0"; | ||
44 | "avgAvgTransactionTime" = "0.0985000"; | ||
45 | "refusingInstances" = "0"; | ||
46 | "avgSessions" = "0.0000"; | ||
47 | "maxTransactions" = "88"; | ||
48 | "applicationName" = "AjaxExample"; | ||
49 | "avgAvgIdleTime" = "1.0390000"; | ||
50 | "maxAvgTransactionTime" = "0.197"; | ||
51 | "runningInstances" = "2"; | ||
52 | "sumTransactions" = "88"; | ||
53 | }, | ||
54 | { | ||
55 | "configuredInstances" = "2"; | ||
56 | "maxSessions" = "0"; | ||
57 | "maxAvgIdleTime" = "325.443"; | ||
58 | "avgTransactions" = "0.5000"; | ||
59 | "sumSessions" = "0"; | ||
60 | "avgAvgTransactionTime" = "0.00000"; | ||
61 | "refusingInstances" = "0"; | ||
62 | "avgSessions" = "0.0000"; | ||
63 | "maxTransactions" = "1"; | ||
64 | "applicationName" = "AjaxExample2"; | ||
65 | "avgAvgIdleTime" = "162.7215000"; | ||
66 | "maxAvgTransactionTime" = "0.0"; | ||
67 | "runningInstances" = "2"; | ||
68 | "sumTransactions" = "1"; | ||
69 | } | ||
70 | ) | ||
71 | |||
72 | {{/code}} | ||
73 | |||
74 | If JavaMonitor is configured with a password, and I hope you do, pass //pw=monitorpassword// as a argument to the query : | ||
75 | |||
76 | [[http://monitorhost:port/cgi-bin/WebObjects/JavaMonitor.woa/wa/statistics?pw=monitorpassword]] | ||
77 | |||
78 | === Direct Actions to many tasks === | ||
79 | |||
80 | 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. | ||
81 | |||
82 | //?type=all// : return details about all applications and instances | ||
83 | //?type=app&name=AppName// : return details about all instances of a specific application | ||
84 | //?type=ins&name=AppName-InstanceNo// : return details about one specific instance | ||
85 | |||
86 | For example, if you want to get details about all instances and applications, you call : | ||
87 | |||
88 | [[http://hostname:56789/cgi-bin/WebObjects/JavaMonitor.woa/admin/info?type=all]] | ||
89 | |||
90 | To get details about the //AjaxExample// application : | ||
91 | |||
92 | [[http://hostname:56789/cgi-bin/WebObjects/JavaMonitor.woa/admin/info?type=app&name=AjaxExample]] | ||
93 | |||
94 | And for a specific instance : | ||
95 | |||
96 | [[http://hostname:56789/cgi-bin/WebObjects/JavaMonitor.woa/admin/info?type=ins&name=AjaxExample-1]] | ||
97 | |||
98 | 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 : | ||
99 | |||
100 | {{code}} | ||
101 | |||
102 | [Hudson Build Server for Wonder|http://webobjects.mdimension.com/hudson/job/Wonder54/lastSuccessfulBuild/artifact/dist/] | ||
103 | |||
104 | {{/code}} | ||
105 | |||
106 | List of available direct actions : | ||
107 | |||
108 | ///info// : return details (number of deaths, state, etc.; see above), in JSON, about an instance. | ||
109 | ///running// : return YES if the instance is running, NO if not. | ||
110 | ///stopped// : return NO if the instance is running, YES if not. | ||
111 | ///bounce//: more on it later. | ||
112 | ///clearDeaths// : clear the number of deaths (same action as clicking the "Clear deaths" in JavaMonitor) | ||
113 | ///turnScheduledOn// : turn scheduling on for an application or instance. Call ///turnScheduledOff// to do the opposite. | ||
114 | ///turnRefuseNewSessionsOn// : turn "Refuse new sessions" on, call //turnRefuseNewSessionsOff// to do the opposite. | ||
115 | ///turnAutoRecoverOn// : guess what? It activate "Auto recover" And guess again? ///turnAutoRecoverOff// do the opposite | ||
116 | ///forceQuit// : force quit an application, might be useful to call it from a monitoring system. | ||
117 | ///stop// : stop an application/instance the normal way. | ||
118 | ///start// : start an application/instance the normal way. | ||
119 | |||
120 | === Automatic archive of SiteConfig.xml === | ||
121 | |||
122 | On every change you do to the configuration, a backup of SiteConfig.xml will be done in, by default, /Library/WebObjects/Configuration. | ||
123 | |||
124 | === Bounce feature === | ||
125 | |||
126 | 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 : | ||
127 | |||
128 | * Find the inactive (eg : not started) instance and start it | ||
129 | * Find the active instances (minus the one started the step below) and enable "Refuse New Session" | ||
130 | * Bounce the active instances when the minimum session count is reached | ||
131 | |||
132 | 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. | ||
133 | |||
134 | === REST routes === | ||
135 | |||
136 | 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. | ||
137 | |||
138 | Examples of REST calls : | ||
139 | |||
140 | Fetching the details of all applications : | ||
141 | |||
142 | {{code}} | ||
143 | |||
144 | curl -X GET http://127.0.0.1:56789/cgi-bin/WebObjects/JavaMonitor.woa/ra/mApplications.json | ||
145 | |||
146 | {{/code}} | ||
147 | |||
148 | Adding a new application : | ||
149 | |||
150 | {{code}} | ||
151 | |||
152 | 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 | ||
153 | |||
154 | {{/code}} | ||
155 | |||
156 | Adding a new instance : | ||
157 | |||
158 | {{code}} | ||
159 | |||
160 | curl -X GET http://127.0.0.1:56789/cgi-bin/WebObjects/JavaMonitor.woa/ra/mApplications/AjaxExample/addInstance&host=localhost | ||
161 | |||
162 | {{/code}} | ||
163 | |||
164 | Delete an application : | ||
165 | |||
166 | {{code}} | ||
167 | |||
168 | curl -X DELETE http://127.0.0.1:56789/cgi-bin/WebObjects/JavaMonitor.woa/ra/mApplications/AjaxExample.json | ||
169 | |||
170 | {{/code}} | ||
171 | |||
172 | Delete an instance : | ||
173 | |||
174 | {{code}} | ||
175 | |||
176 | curl -X GET http://127.0.0.1:56789/cgi-bin/WebObjects/JavaMonitor.woa/ra/mApplications/AjaxExample/deleteInstance?id=1 | ||
177 | |||
178 | {{/code}} | ||
179 | |||
180 | Adding a new host : | ||
181 | |||
182 | {{code}} | ||
183 | |||
184 | 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 | ||
185 | |||
186 | {{/code}} |