Centralized logging for Unity game clients
Stream debug logs from your game clients to Google Cloud Platform. Browse and search your game client logs in the Stackdriver Logging web UI. See common errors with callstacks in the Stackdriver Error Reporting web UI.
This is primarily intended for use during internal development. If you use this in production, be aware that streaming all logs from all game clients can be costly.
This consists of three parts:
- An extension to UberLogger which regularly forwards logs from your client to Google Cloud Platform
- The Stackdriver Logging & Stackdriver Error Reporting web UIs
Create a project in Google Cloud (see https://cloud.google.com/functions/docs/quickstart)
Enable billing for the project (see https://cloud.google.com/functions/docs/quickstart)
Enable Google Cloud Functions API (see https://cloud.google.com/functions/docs/quickstart)
Install Google Cloud SDK (see https://cloud.google.com/sdk/)
Create a gcloud project config with
./commands/create_gcloud_configuration.sh <configuration name> <project name>
Create a Cloud Storage bucket with appropriate name via
./commands/create_storage_bucket.sh <project name>- note down the storage bucket URL
Deploy cloud function via
./commands/deploy_functions.sh <storage bucket URL>- note down the endpoint URL
Add the Frontend/Assets/* files to your Unity project
Add a UberLoggerLogToStackdriver component to your project
Update all endpoint URLs in UberLoggerLogToStackdriver component
Test printing something (verify with Stackdriver Logging web UI)
Filtering and browsing results
Visit the Stackdriver Logging web UI. Find a single line of text from the session that you are interested in. Expand the entry, and filter on the given logName. This gives you all logs for a single session.
Visit the Stackdriver Error Reporting web UI. Here you can see statistics for the errors reported by your application.
Reliability, performance and scalability
If there is a failure during posting to the Cloud Functions endpoint, the game clients will retry posting the same set of messages until it succeeds. With the current implementation this means that the game client will gradually consume more and more memory if the Cloud Function endpoint is down or not accepting the content. Temporary hiccups will result in entries with delayed timestamps but all messages will be delivered to the Stackdriver service.
If a game client posts messages to the Cloud Function when it is not actively deployed anywhere, it will take Google Cloud functions approximately 10 seconds to deploy it and accept the payload. Once the Cloud Function is deployed, messages are processed immediately. The Cloud Function does not buffer any messages.
The time between posting an exception message and seeing it in the Error Reporting view seems to be between 1 and 10 seconds when doing small-scale tests.
If a game client spams log messages at a high rate, it will result in rate limiting on the client side. More and more messages get queued up within the client, until either the client quits or the enqueue rate drops again.
Each game client is by default configured to post any messages once every second. The Cloud Function takes 300ms to execute in the average case. Cloud Functions have a quota of max 400c concurrent invocations. Stackdriver Logging has a quota of max 500 write calls per second. The bottleneck is therefore with 500 concurrent clients spamming messages to the system non-stop, or with 150.000 concurrent clients that send messages (probably errors) once every 5 minutes.
- For local dev, install the Cloud Functions emulator ( https://cloud.google.com/functions/docs/emulator )
- install nvm: follow instructions at https://github.com/creationix/nvm
- install & switch to nodejs 6.11.1 via
nvm install 6.11.1/
nvm use 6.11.1
- install cloud functions emulator via
npm install @google-cloud/functions-emulator
- Deploy scripts to cloud functions emulator via
- Run unit tests against cloud functions emulator & Stackdriver backend via
- Deploy to Cloud Functions via
./commands/deploy_functions.sh <storage bucket URL>