As I’ve said before, I love collecting samples of interesting 404/error pages. Here’s a sample from Google’s search console help site:
As I’ve said before, I love documenting error pages from popular web sites: they often have a sense of humor or show off another face of the company.
Here’s an example of an Amazon error page. What a handsome looking dog!
I love seeing error pages – it’s great to see how many companies customize their web pages to reflect their corporate character. Disney is no exception.
App Engine downtime and maintenance notices are posted to the Google Group google-appengine-downtime-notify, located at https://groups.google.com/forum/#!forum/google-appengine-downtime-notify . It’s a good idea to monitor this list for any issues with the App Engine platform.
It’s especially important to subscribe to these notices if your application is still on the M/S datastore. The M/S datastore is occasionally moved into a read-only state for maintenance, and these maintenance periods are announced over the downtime list.
Subscribing to the google-appengine-downtime-notify list is easy: go to the above linked address and click on the button marked Join Group. As you can see from the below pictures, this list is extremely low-traffic (less than 1 email a day).
The App Engine system status console is located at https://code.google.com/status/appengine . It’s a good idea to keep this page bookmarked to monitor GAE’s performance.
Here’s how the status page looks like when everything is running well:
Here’s an example of how performance issues are reported:
While using certain libraries on App Engine, you may encounter the following exception notice:
javax.servlet.ServletContext log: Exception while dispatching incoming RPC call threw an unexpected exception: java.security.AccessControlException: access denied (java.lang.RuntimePermission modifyThreadGroup)
If you see this exception message, your application or (more frequently the case) a library is attempting to create a new thread. App Engine doesn’t allow frontend instances to spawn threads, so any attempt to start up a thread will result in AccessControlExceptions.
However, App Engine does allow backend threads: threads which run within backend instances. If your application absolutely needs to run threads, run the threading component within a backend or a backend module.
On rare occasions, an application may spawn errors similar to the below:
com.google.appengine.api.datastore.DatastoreFailureException: internal error. at com.google.appengine.api.datastore.DatastoreApiHelper.translateError (DatastoreApiHelper.java:50) at com.google.appengine.api.datastore.DatastoreApiHelper$1.convertException (DatastoreApiHelper.java:70)
As the exception message suggests, this log indicates that the datastore encountered an internal error while handling the datastore operation. Unfortunately, there’s nothing that a developer can do to fix this error since it’s an internal App Engine issue.
Generally this type of exception fixes itself sooner or later; if it persists, file an issue at the App Engine bug tracker: https://code.google.com/p/googleappengine/issues/entry?template=Production%20issue
A few weeks ago I wrote a post about how designing good error pages is important for UX. For another demonstration of a good error page, look at Google’s 404 error page:
And here’s a closeup of the robot:
It’s a simple, straightforward error page. It explains the error, pokes fun at the problem with a broken robot picture, and links the user to the root page (the Google logo links to the Google home page).
On high traffic App Engine applications, you may occasionally see a request fail with error code 202. You’ll see the following text in your logs:
A problem was encountered with the process that handled this request, causing it to exit. This is likely to cause a new process to be used for the next request to your application. (Error code 202)
The request log will look similar to the picture below:
Error code 202 is an internal App Engine failure code: an unknown error occurred within App Engine or its associated services, not from your application. This is not an error that your application can catch or recover from, nor is the application at fault for this error. The current request will fail, but the client is free to retry the request. If this request is from the task queue service, the task queue will automatically retry the request if you set the appropriate settings while creating the task.
A note about error codes: the code 202 relates to App Engine; it is NOT a HTTP status code. When a request encounters this internal error, it fails with the HTTP status code 500 (as you can see from the above picture).