Skip to content
Snippets Groups Projects
README.md 2.72 KiB
Newer Older
John Harris's avatar
John Harris committed
# nexus_semantic_logger
John Harris's avatar
John Harris committed

Configures a [semantic_logger](https://rubygems.org/gems/rails_semantic_logger) as required for NexusMods components.
## Telemetry

As well as providing a semantic logger, this gem handles datadog telemetry associated with the logging approach:

* logs
* traces
* metrics
    * statsd is automatically attached to datadog runtime metrics and may also be used for custom metrics.

### Customise log level per logger

For example, to show debug logging for `MySubscriber` while having all other logs on info.

```
# The log level must be set to the lowest level which can be dynamically controlled.
LOG_LEVEL=DEBUG
# The default level for filtered logs.
LOG_NAMES_DEFAULT_LEVEL=INFO
# Per level overrides for filtered logs.
LOG_NAMES_DEBUG=MySubscriber
```

* Customised log names are available for each level e.g. `LOG_NAMES_TRACE`
* Log names are matched on prefix.
* Multiple log names are supported via comma separated values.

### Changing log level dynamically

The default level for filtered logs (`LOG_NAMES_DEFAULT_LEVEL`) may be changed on a running instance with the `WINCH`
signal. This cycles through the available levels `[trace debug info warn error fatal]`.

Note that you cannot dynamically enable a level lower than the `LOG_LEVEL`. Instead the env var must be adjusted and the
instance restarted.

Send signal: `pkill --signal WINCH --count --full "^puma.*"`

Instance output: `WINCH signal changed LOG_NAMES_DEFAULT_LEVEL from debug to info`

### Querying current log level

The `SYS` signal will print the levels used by the running instance.

Send signal: `pkill --signal SYS --count --full "^puma.*"`

Instance output: `SYS signal reports LOG_LEVEL=debug LOG_NAMES_DEFAULT_LEVEL=warn`
### Sending metrics

Ensure the metric name is in the format: `nexus.{component}.{major}.{minor}`

Where _major and minor_ are specific to the component logic e.g. `nexus.uploads.clamscan.pass`

For example, to increment a count:

```
NexusSemanticLogger.metrics.increment('nexus.users.registration.complete')
```

# Local gem development

Steps to run this gem from local sources in one the nexus 'staged build' rails components:

## Copy gem sources to component

```
cd ~/legacy/users
cp -r ../nexus_semantic_logger .
```

## Adjust component Dockerfile to include gem sources

Within stage 1, append a COPY after the Gemfile copy:

```
COPY --chown=nexus:nexus Gemfile* ./
COPY --chown=nexus:nexus nexus_semantic_logger/ ./nexus_semantic_logger/
```

Within stage 2, append a COPY after the bundle copy:

```
COPY --from=stage1 /usr/local/bundle /usr/local/bundle
COPY --from=stage1 /app/nexus_semantic_logger/ /app/nexus_semantic_logger/
```

## Adjust Gemfile to use local path

```
gem 'nexus_semantic_logger', :path => "/app/nexus_semantic_logger"