Application Logging
Application Logging
In FxA Javascript/Typescript server-side applications, logging is emitted via mozlog which adheres to the mozlog schema format. The log messages are captured from stdout
and aggregated into Google BigQuery via Stackdriver. Application exceptions are captured via Sentry and sent to our Sentry instance.
Stage and development logging is grouped under the fxa-nonprod
project, while accessing the fxa-prod
logs requires additional special access privileges.
Capturing Event Details
Once a mozlog
instance is created, log events are captured with a dot concatenated string indicating an (ideally) unique location of the logging statement that is clear where in the code-base it was made, along with any additional fields to include.
Creating a mozlog
instance can be done by instantiating the log object with a configuration object:
const logConfig = {
app: 'fxa-content-server',
fmt: 'heka',
level: 'info'
};
const log = require('mozlog')(logConfig);
It can then be used to log with:
log.error('push.sendPush', {uid, deviceId, err });
The above log event will have a jsonPayload.type
set to push.sendPush
, while the additional object properties will be attached as the jsonPayload.fields
object.
Viewing Event Logs
Using bigquery, the logs can be retrieved from the application service that generated them by narrowing down the stdout
table used and the originating service by its container name or querying the service table directly.
Container names for currently deployed services that output to stdout
tables:
payments
- FxA Payment Serveramplitude
- FxA Amplitude Sendeventbroker
- FxA Event Broker
As these change over time, a quick way to determine available container names can be done using a DISTINCT
query (using the desired date):
SELECT DISTINCT(resource.labels.container_name)
FROM `moz-fx-fxa-nonprod-375e.fxa_stage_logs.stdout_20191204`
The bigquery console has tab-complete for table-names and SQL statements to make query generation easy.
Accessing logs from the FxA Auth Server, FxA Auth Db MySQL Service, etc. requires querying the appropriate table. Some table prefix examples from stage
:
- fxa-auth-server -
moz-fx-fxa-nonprod-375e.fxa_stage_logs.docker_fxa_auth_20191205
- fxa-auth-db-server -
moz-fx-fxa-nonprod-375e.fxa_stage_logs.docker_fxa_auth_db_20191204
A full list of these tabale prefixes can be found in the bigquery console by clicking on the left side drop-down and expanding it under fxa_stage_logs
(or prod). FxA services all start with docker_fxa_
.
For the newer moz-fx-fxa-nonprod and moz-fx-fxa-prod projects in GCP, logs are in bigquery with separate tables based on the type of log. These include events, export_errors, requests, stderr, and stdout.
Below is an example of searching logs written to standard out for July 10, 2023.
SELECT LogName, resource.type, resource.labels.project_id, resource.labels.pod_name, resource.labels.location, resource.labels.location, resource.labels.namespace_name, resource.labels.cluster_name, textPayload FROM `moz-fx-fxa-nonprod.gke_fxa_stage_log.stdout` WHERE TIMESTAMP_TRUNC(_PARTITIONTIME, DAY) = TIMESTAMP("2023-07-10") LIMIT 1000