Browse code

Allow ceilometer-api to run under mod_wsgi

If CEILOMETER_USE_MOD_WSGI is True then the API app will
run under mod wsgi. The default is false (for now).

The changes are modeled on keystone's use of apache.

Note that these changes are dependent on
https://review.openstack.org/#/c/121823/ in ceilometer.

Using mod_wsgi allows the ceilometer api to handle "concurrent"
requests. This is extremely useful when trying to benchmark
various aspects of the service.

Change-Id: I4c220c3b52804cd8d9123b47780a98e0346ca81e

Chris Dent authored on 2014/09/16 23:17:13
Showing 2 changed files
1 1
new file mode 100644
... ...
@@ -0,0 +1,15 @@
0
+Listen %PORT%
1
+
2
+<VirtualHost *:%PORT%>
3
+    WSGIDaemonProcess ceilometer-api processes=2 threads=10 user=%USER% display-name=%{GROUP}
4
+    WSGIProcessGroup ceilometer-api
5
+    WSGIScriptAlias / %WSGIAPP%
6
+    WSGIApplicationGroup %{GLOBAL}
7
+    <IfVersion >= 2.4>
8
+        ErrorLogFormat "%{cu}t %M"
9
+    </IfVersion>
10
+    ErrorLog /var/log/%APACHE_NAME%/ceilometer.log
11
+    CustomLog /var/log/%APACHE_NAME%/ceilometer_access.log combined
12
+</VirtualHost>
13
+
14
+WSGISocketPrefix /var/run/%APACHE_NAME%
... ...
@@ -41,6 +41,7 @@ CEILOMETER_CONF_DIR=/etc/ceilometer
41 41
 CEILOMETER_CONF=$CEILOMETER_CONF_DIR/ceilometer.conf
42 42
 CEILOMETER_API_LOG_DIR=/var/log/ceilometer-api
43 43
 CEILOMETER_AUTH_CACHE_DIR=${CEILOMETER_AUTH_CACHE_DIR:-/var/cache/ceilometer}
44
+CEILOMETER_WSGI_DIR=${CEILOMETER_WSGI_DIR:-/var/www/ceilometer}
44 45
 
45 46
 # Support potential entry-points console scripts
46 47
 CEILOMETER_BIN_DIR=$(get_python_exec_prefix)
... ...
@@ -52,6 +53,7 @@ CEILOMETER_BACKEND=${CEILOMETER_BACKEND:-mysql}
52 52
 CEILOMETER_SERVICE_PROTOCOL=http
53 53
 CEILOMETER_SERVICE_HOST=$SERVICE_HOST
54 54
 CEILOMETER_SERVICE_PORT=${CEILOMETER_SERVICE_PORT:-8777}
55
+CEILOMETER_USE_MOD_WSGI=$(trueorfalse False $CEILOMETER_USE_MOD_WSGI)
55 56
 
56 57
 # To enable OSprofiler change value of this variable to "notifications,profiler"
57 58
 CEILOMETER_NOTIFICATION_TOPICS=${CEILOMETER_NOTIFICATION_TOPICS:-notifications}
... ...
@@ -105,12 +107,39 @@ create_ceilometer_accounts() {
105 105
 }
106 106
 
107 107
 
108
+# _cleanup_keystone_apache_wsgi() - Remove wsgi files, disable and remove apache vhost file
109
+function _cleanup_ceilometer_apache_wsgi {
110
+    sudo rm -f $CEILOMETER_WSGI_DIR/*
111
+    sudo rm -f $(apache_site_config_for ceilometer)
112
+}
113
+
108 114
 # cleanup_ceilometer() - Remove residual data files, anything left over from previous
109 115
 # runs that a clean run would need to clean up
110 116
 function cleanup_ceilometer {
111 117
     if [ "$CEILOMETER_BACKEND" != 'mysql' ] && [ "$CEILOMETER_BACKEND" != 'postgresql' ] ; then
112 118
         mongo ceilometer --eval "db.dropDatabase();"
113 119
     fi
120
+    if [ "$CEILOMETER_USE_MOD_WSGI" == "True" ]; then
121
+        _cleanup_ceilometer_apache_wsgi
122
+    fi
123
+}
124
+
125
+function _config_ceilometer_apache_wsgi {
126
+    sudo mkdir -p $CEILOMETER_WSGI_DIR
127
+
128
+    local ceilometer_apache_conf=$(apache_site_config_for ceilometer)
129
+    local apache_version=$(get_apache_version)
130
+
131
+    # copy proxy vhost and wsgi file
132
+    sudo cp $CEILOMETER_DIR/ceilometer/api/app.wsgi $CEILOMETER_WSGI_DIR/app
133
+
134
+    sudo cp $FILES/apache-ceilometer.template $ceilometer_apache_conf
135
+    sudo sed -e "
136
+        s|%PORT%|$CEILOMETER_SERVICE_PORT|g;
137
+        s|%APACHE_NAME%|$APACHE_NAME|g;
138
+        s|%WSGIAPP%|$CEILOMETER_WSGI_DIR/app|g;
139
+        s|%USER%|$STACK_USER|g
140
+    " -i $ceilometer_apache_conf
114 141
 }
115 142
 
116 143
 # configure_ceilometer() - Set config files, create data dirs, etc
... ...
@@ -163,6 +192,11 @@ function configure_ceilometer {
163 163
         iniset $CEILOMETER_CONF vmware host_username "$VMWAREAPI_USER"
164 164
         iniset $CEILOMETER_CONF vmware host_password "$VMWAREAPI_PASSWORD"
165 165
     fi
166
+
167
+    if [ "$CEILOMETER_USE_MOD_WSGI" == "True" ]; then
168
+        iniset $CEILOMETER_CONF api pecan_debug "False"
169
+        _config_ceilometer_apache_wsgi
170
+    fi
166 171
 }
167 172
 
168 173
 function configure_mongodb {
... ...
@@ -223,7 +257,16 @@ function start_ceilometer {
223 223
     run_process ceilometer-acentral "ceilometer-agent-central --config-file $CEILOMETER_CONF"
224 224
     run_process ceilometer-anotification "ceilometer-agent-notification --config-file $CEILOMETER_CONF"
225 225
     run_process ceilometer-collector "ceilometer-collector --config-file $CEILOMETER_CONF"
226
-    run_process ceilometer-api "ceilometer-api -d -v --log-dir=$CEILOMETER_API_LOG_DIR --config-file $CEILOMETER_CONF"
226
+
227
+    if [[ "$CEILOMETER_USE_MOD_WSGI" == "False" ]]; then
228
+        run_process ceilometer-api "ceilometer-api -d -v --log-dir=$CEILOMETER_API_LOG_DIR --config-file $CEILOMETER_CONF"
229
+    else
230
+        enable_apache_site ceilometer
231
+        restart_apache_server
232
+        tail_log ceilometer /var/log/$APACHE_NAME/ceilometer.log
233
+        tail_log ceilometer-api /var/log/$APACHE_NAME/ceilometer_access.log
234
+    fi
235
+
227 236
 
228 237
     # Start the compute agent last to allow time for the collector to
229 238
     # fully wake up and connect to the message bus. See bug #1355809
... ...
@@ -248,6 +291,10 @@ function start_ceilometer {
248 248
 
249 249
 # stop_ceilometer() - Stop running processes
250 250
 function stop_ceilometer {
251
+    if [ "$CEILOMETER_USE_MOD_WSGI" == "True" ]; then
252
+        disable_apache_site ceilometer
253
+        restart_apache_server
254
+    fi
251 255
     # Kill the ceilometer screen windows
252 256
     for serv in ceilometer-acompute ceilometer-acentral ceilometer-anotification ceilometer-collector ceilometer-api ceilometer-alarm-notifier ceilometer-alarm-evaluator; do
253 257
         stop_process $serv