Supervision
This chapter presents some supervision and monitoring aspects of the functioning of the platform and Tock bots.
Coming soon: more details on how to monitor bots, even examples of dashboards for some classic monitoring technologies. Feel free to share yours.
Healthchecks
The APIs of the different Tock components include different probes or lifelines (healthchecks) to check if everything is working properly.
These lifelines can be used by automated monitoring systems.
Probes & paths
Each WebVerticle exposes 3 probes returning the HTTP 200 code if everything is working.
| Default path | Description | Property to modify the path |
|---|---|---|
/healthcheck |
The component is working properly. (Detailed mode: see below) | tock_vertx_healthcheck_path |
/health/readiness |
The component is ready to process requests. | tock_vertx_readinesscheck_path |
/health/liveness |
The component is started. | tock_vertx_livenesscheck_path |
For some components and images, the lifeline cannot be exposed directly at the root, the path is modified. In particular:
- For
tock/admin, the lifeline is located by default in/rest/admin/healthcheck - For
tock/nlp_api, the lifeline is/rest/nlp/healthcheck
Each default path can be modified with a dedicated property (see table above).
Detailed mode
The main lifeline /healthcheck can perform a more detailed inspection (ie. usually check
the connection to other components) if the tock_detailed_healthcheck_enabled property is enabled.
The lifeline response then specifies the components checked.
Here is an example of activation in the bot_admin Docker image:
-
{: data-hl-lines="6"} docker-compose.yml
version: '3' services: admin_web: image: tock/bot_admin:$TAG environment: - tock_detailed_healthcheck_enabled=true -
{: data-hl-lines="8"} dockerrun.aws.json
{ "AWSEBDockerrunVersion": 2, "containerDefinitions": [ { "name": "admin_web", "image": "tock/bot_admin:${TAG}", "environment": [ { "name": "tock_detailed_healthcheck_enabled", "value": "true" } ] } ] }
Example of a lifeline response in detailed mode:
{
"results": [
{
"id": "duckling_service",
"status": "OK"
},
{
"id": "tock_front_database",
"status": "OK"
},
{
"id": "tock_model_database",
"status": "OK"
},
{
"id": "tock_bot_database",
"status": "OK"
}
]
}
See below for a summary of the lifelines component by component.
Details by component
The table below details the path and checks performed by the main lifeline component by component, in normal and detailed mode:
| Component / Image | Default Path | Default Check | Detailed Check (tock_detailed_healthcheck_enabled=true) |
|---|---|---|---|
| NLP | /rest/nlp/healthcheck |
Duckling / entity providers OK. | front and model databases OK. |
| Duckling / RestEntityProvider | /healthcheck |
Duckling bridge initialized. | Idem |
| Build Worker | /healthcheck |
Worker ready to analyze the model. | front and model databases OK. |
| Bot / Bot Api | /healthcheck |
Bot installed, connected to the database, NLP OK. | Idem |
| WebHook (Bot Api) | /healthcheck |
OK | Idem |
| Kotlin Compile | /healthcheck |
OK | Idem |
| NLP / Bot Admin | /rest/admin/healthcheck |
OK | Duckling / entity providers OK, front model and bot databases OK. |
Below are examples of responses from different components in verbose mode:
-
NLP
{ "results": [ { "id": "duckling_service", "status": "OK" }, { "id": "tock_front_database", "status": "OK" }, { "id": "tock_model_database", "status": "OK" } ] } -
Duckling
{ "results": [ { "id": "duckling_bridge", "status": "OK" } ] } -
Build Worker
{ "results": [ { "id": "tock_front_database", "status": "OK" }, { "id": "tock_model_database", "status": "OK" } ] } -
Bot Api
{ "results": [ { "id": "nlp_client", "status": "OK" } ] } -
Kotlin Compiler
{ "results": [] } -
Bot Admin
{ "results": [ { "id": "duckling_service", "status": "OK" }, { "id": "tock_front_database", "status": "OK" }, { "id": "tock_model_database", "status": "OK" }, { "id": "tock_bot_database", "status": "OK" } ] }
Lifeline Monitoring
The different probes and lifelines can be used to configure monitoring systems and other container orchestrators, for example, to measure service availability, trigger alerts or dynamically remediate problems.
Depending on the tools and technologies used, lifeline configuration can be done in different ways. Here are some examples for reference:
- At the level of the Cloud or on-premise load balancers (load balancers), for example:
- in the Health checks section at the ELB level in AWS
- with the
health_checkdirective in NGINX - with the
httpchk optionin HAProxy - In Docker (
Dockerfiledescriptors): - with the
health_checkinstructionHEALTHCHECKto check the component status - with
ENTRYPOINTorCMDto wait for the component to be ready at startup - In Docker Compose (
docker-compose.ymldescriptors): - with
healthcheck - In Kubernetes:
- with
livenessProbeandreadinessProbe - Etc.
Logging
Application logs
Tock uses SLF4J and Logback to generate its server-side application logs.
By default, Tock automatically configures its logs and a few properties allow you to modify the configuration.
It is possible to finely configure the logs according to your needs, in particular with Logback configuration files or with Docker Compose.
Auto-configuration
By default, in the absence of specific configuration, Tock configures its logs automatically using the class
LogbackConfigurator.
This configures Logback programmatically, with the following behavior:
- General log level
DEBUGiftock_env=dev(default), orINFOfor other environments and production - Exception for
org.mongodb.driverlogs always atINFO - Exception for
io.nettylogs always atINFO - Exception for
okhttp3logs always atINFO - Exception for
io.mockklogs always atINFO - Logs directed to the console (standard output) by default, but possibility to write to files
- In file log mode, writing to
log/logFile.log, archiving a file every day (log/logFile.%d{yyyy-MM-dd}.log), maximum30days or3GBof logs kept
To learn more about automatic configuration of Tock logs, refer to the implementation
LogbackConfigurator.
Environment variables allow to configure these different logging modes. They can be defined independently on each component producing logs.
| Environment variable | Default value | Description |
|---|---|---|
tock_env |
dev |
Environment (warning: controls other mechanisms than logs). |
tock_logback_enabled |
true |
Enable logs. |
tock_default_log_level |
DEBUG if tock_env=dev (otherwise INFO) |
General log level (except exceptions, see above). |
tock_retrofit_log_level |
BASIC if tock_env=dev (otherwise NONE) |
Log level (requests and responses) for application client services using Retrofit (TockNlpClient, BotApiClient, and many connectors...) |
tock_logback_file_appender |
false |
Logs files (see details above) instead of console logs (standard output). |
Depending on the deployment mode used, these environment variables can be added either
directly on the command line, or in a descriptor like docker-compose.yml, dockerrun.aws.json or other.
Here is an example configuring Tock Studio logs (admin_web) in Docker:
-
{: data-hl-lines="6 7"} docker-compose.yml
version: '3' services: admin_web: image: tock/bot_admin:$TAG environment: - tock_default_log_level=WARN - tock_logback_file_appender=true -
{: data-hl-lines="8"} dockerrun.aws.json
{ "AWSEBDockerrunVersion": 2, "containerDefinitions": [ { "name": "admin_web", "image": "tock/bot_admin:${TAG}", "environment": [ { "name": "tock_default_log_level", "value": "WARN" }, { "name": "tock_logback_file_appender", "value": "true" } ] } ] }
Logback Files
It is possible to finely configure the Tock logs by directly configuring Logback. For this, different possibilities exist, in particular configuration files in XML or Groovy format. Below is an example configuration:
- logback.xml
<?xml version="1.0" encoding="UTF-8"?> <configuration debug="false"> <logger name="ai.tock" level="DEBUG" /> <logger name="org.mongodb" level="WARN" /> <appender name="console" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern> %d %-5level [%thread] %logger{1}: %msg%n </pattern> </encoder> </appender> <root level="INFO"> <appender-ref ref="console" /> </root> </configuration> - logback.groovy
import ch.qos.logback.classic.encoder.PatternLayoutEncoder import ch.qos.logback.core.ConsoleAppender import static ch.qos.logback.classic.Level.DEBUG import static ch.qos.logback.classic.Level.INFO import static ch.qos.logback.classic.Level.WARN appender("console", ConsoleAppender) { encoder(PatternLayoutEncoder) { pattern = "%d %-5level [%thread] %logger{1}: %msg%n" } } logger("ai.tock", DEBUG) logger("org.mongodb", WARN) root(INFO, ["console"])
In this example:
- The general log level is
INFO, with exceptions: - Exception for
ai.tocklogs always atDEBUG - Exception for
org.mongodblogs always atWARN - Logs are directed to the console (standard output)
Many possibilities are offered to configure the logs thanks to these configuration files:
log levels adjusted according to the embedded packages/frameworks, modification of the default pattern,
logging of log files and automatic archiving with a
RollingFileAppender, redirection of logs
to a database or email server, etc.
For more information, refer to the Logback documentation.
Once the Logback configuration file has been created, you must ensure that it is in the classpath of the
Tock component and that Logback identifies it as the configuration to follow (for this, you generally use
the -Dlogback.configurationFile property when starting the Java component).
Below is a complete example in Docker Compose with:
- A
logback.xmlfile embedded by Maven (pom.xml) in the Docker image - Some environment variables defined to be able to quickly adjust the main log levels directly in Docker-Compose (without having to modify the XML file or the Docker image)'
^ - logback.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false">
<!-- Leverage env variables with defaults, for more flexibility -->
<variable name="tock_default_log_level" value="${tock_default_log_level:-WARN}" />
<variable name="tock_service_log_level" value="${tock_service_log_level:-INFO}" />
<variable name="tock_database_log_level" value="${tock_database_log_level:-WARN}" />
<logger name="ai.tock" level="${tock_service_log_level}" />
<logger name="org.mongodb" level="${tock_database_log_level}" />
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>
%d %-5level [%thread] %logger{1}: %msg%n
</pattern>
</encoder>
</appender>
<root level="${tock_default_log_level}">
<appender-ref ref="console" />
</root>
</configuration>
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<artifactId>tock-docker-bot-admin</artifactId>
<build>
<plugins>
<plugin>
<groupId>io.fabric8</groupId>
<artifactId>docker-maven-plugin</artifactId>
<configuration>
<images>
<image>
<name>tock/bot_admin:${project.version}</name>
<build>
<assembly>
<inline>
<dependencySets>
...
</dependencySets>
<files>
<file>
<source>logback.xml</source>
<outputDirectory>.</outputDirectory>
</file>
</files>
</inline>
</assembly>
<cmd>
<shell>java $JAVA_ARGS -Dlogback.configurationFile='file:///maven/logback.xml' -Dfile.encoding=UTF-8 -Dtock_nlp_model_refresh_rate=10 -cp '/maven/*' ai.tock.bot.admin.StartBotAdminServerKt</shell>
</cmd>
...
version: '3'
services:
admin_web:
image: tock/bot_admin:$TAG
environment:
- tock_default_log_level=WARN # Default, see logback.xml
- tock_service_log_level=INFO # Default, see logback.xml
- tock_database_log_level=WARN # Default, see logback.xml
The full code for this example applied to all Tock modules is available in the
tock-dockerrepository on thelogbackxmlbranch.
Docker Compose
For Docker Compose users, a mechanism allows to configure logs directly in YAML descriptors. See the tock-docker repository for an
example of Tock implementation in Docker Compose.
Each application component can have its own configuration:
- docker-compose.yml
logging: driver: "json-file" options: max-size: "10m" max-file: "5"
The example above configures an automatic rotation of log files, so as to have a maximum of
5 log files of maximum 10 MB each (the oldest being deleted to create a new one if necessary).
For more information, see the Docker Compose documentation for this mechanism.
Encryption and anonymization
See the security page for log encryption and anonymization options.