Commit 20797f83 authored by PICHOU Kyâne's avatar PICHOU Kyâne

Migration vers Victoria Metrics

parent 80070dd7
# Grafana et Prometheus
Ce dossier contient les ressources nécessaires pour lancer une instance de Grafana **et** de Prometheus, qui nous servent à collecter et visualiser les métriques des services (via [pica-metrics-bot](../pica-metrics-bot)) et des machines (via Prometheus).
Pour plus de facilité, ces deux services doivent communiquer via le même réseau, c'est pourquoi ils sont dans le même Docker Compose. Il n'y a pas de raisons de mettre ces deux services sur une machine différente, ce qui aurait pour seul effet de créer de la complexité supplémentaire.
## Configuration
Prometheus est un logiciel libre qui permet la collecte et le traitement de métriques, ainsi que le déclenchement d'alertes. Son fonctionnement est simple : un serveur va collecter régulièrement des métriques auprès de plusieurs *exporters*. Par exemple pour exporter des métriques systèmes, on utilise un *node_exporter* que l'on installe sur la machine, et on configure le serveur Prometheus (distant potentiellement) pour scraper cet exporter régulièrement.
### Prometheus
La configuration se fait dans [prometheus.yml](./prometheus.yml).
Pour collecter des métriques, il est nécessaire d'installer des *exporters* sur les machines cible : [voir la documentation](https://wiki.picasoft.net/doku.php?id=technique:monitoring:metrics:system_metrics).
### Grafana
Attention : même si l'authentification LDAP est activée, elle semble ne pas fonctionner : la connexion ne fonctionne que grâce à l'utilisateur administrateur. Voir [cette page](https://grafana.com/docs/grafana/latest/auth/ldap/#ldap-debug-view) pour investiguer et régler le problème.
#### Emplacements
La configuration est réalisée :
* Par les variables d'environnement de [Compose](./docker-compose.yml), qui permettent d'accéder à tous les paramètres de la configuration (voir la [documentation](https://grafana.com/docs/grafana/latest/administration/configuration/#configure-with-environment-variables)) : cette méthode est utilisée pour tous les paramètres non-critiques.
* Par le fichier [ldap.toml](./ldap.toml) pour la configuration spécifique au LDAP. Ce fichier peut faire référence à des variables d'environnement avec [cette syntaxe](https://grafana.com/docs/grafana/latest/auth/ldap/#using-environment-variables), pour les données critiques (*e.g.* mot de passe)
* Par le fichier [grafana.secrets](./secrets/grafana.secrets.example), pour les secrets.
#### Utilisateurs
Il y a trois types d'utilisateurs :
* L'administrateur de l'instance, configuré via l'environnement (Compose et secret)
* Les utilisateurs LDAP
* Les utilisateurs créés manuellement, comme Rhizome
### Lancement
Copier `grafana.secrets.example` dans `grafana.secrets` et remplacer les valeurs. Le mot de passe LDAP de `grafana` se trouve dans le [pass](https://gitlab.utc.fr/picasoft/interne/pass).
Lancer :
```bash
docker-compose up -d
```
Attention, lors du lancement Prometheus doit pouvoir écrire dans le volume monté sur `/prometheus`, il est possible qu'il faille se rendre dans le conteneur en tant que `root` et faire un `chown nobody:nogroup /prometheus` si les logs indiquent des problèmes de permissions.
### Mise à jour
Il suffit de mettre à jour le tag dans Compose.
Il ne devrait pas y avoir de manipulation spécifiques pour mettre à jour une instance Docker : voir [la documentation de Grafana](https://grafana.com/docs/grafana/latest/installation/upgrading/#docker) et la [documentation de Prometheus](https://hub.docker.com/r/prom/prometheus) pour le vérifier.
# my global config
global:
scrape_interval: 1m # Set the scrape interval to every 1 minute
evaluation_interval: 1m # Evaluate rules every 1 minute
scrape_configs:
- job_name: 'pica01'
static_configs:
- targets:
- 'pica01.picasoft.net:9100'
relabel_configs:
- source_labels: [__address__]
regex: '.*'
target_label: instance
replacement: 'pica01'
- job_name: 'pica02'
static_configs:
- targets:
- 'pica02.picasoft.net:9100'
relabel_configs:
- source_labels: [__address__]
regex: '.*'
target_label: instance
replacement: 'pica02'
- job_name: 'monitoring'
static_configs:
- targets:
- 'monitoring.picasoft.net:9100'
relabel_configs:
- source_labels: [__address__]
regex: '.*'
target_label: instance
replacement: 'monitoring'
- job_name: 'voice-mumble'
static_configs:
- targets:
- 'voice.picasoft.net'
- job_name: codimd
honor_timestamps: true
scrape_interval: 5s
scrape_timeout: 5s
metrics_path: '/metrics/codimd'
scheme: 'https'
static_configs:
- targets:
- 'md.picasoft.net'
# Métriques des services Picasoft
Dans ce dossier se trouvent les éléments de configuration permettant de faire fonctionner [Picasoft Metrics Bot](https://gitlab.utc.fr/picasoft/projets/picasoft-metrics-bot).
Par rapport au projet original :
* La configuration en production est versionnée ici, et un Docker Compose adapté est proposé
* Un [entrypoint](./entrypoint.sh) modifié permet d'injecter des secrets sous forme de variables d'environnement
* Ajout d'InfluxDB directement adossé à Picasoft Metrics Bot, dans un seul Docker Compose
## Premier lancement
Copier les fichiers `.secrets.example` en `.secrets` et remplacez les valeurs.
L'utilisateur InfluxDB qui doit être utilisé dans Picasoft Metrics Bot est celui avec les droits d'écriture (mais pas d'administrateur). Dans le fichier d'exemple, c'est `picasoft-write`.
## Mise à jour
Il suffit de changer `METRICS_BOT_VERSION` du `Dockerfile` et d'ajuster le tag de l'image dans le fichier Compose.
Les releases sont disponibles ici : https://gitlab.utc.fr/picasoft/projets/picasoft-metrics-bot/-/releases
## TODO
Le `sed` utilisé pour injecter les secrets dans l'entrypoint est dégueulasse, si jamais il y a certains caractères dans les mots de passe ça marchera pas, il faut faire mieux, en Python par exemple.
{
"influxdb": {
"url": "https://influxdb.picasoft.net",
"user": "INFLUXDB_USER",
"password": "INFLUXDB_PASSWORD",
"database": "picasoft"
},
"modules" : {
"etherpad" : [
{
"url" : "https://pad.picasoft.net",
"name" : "pad.picasoft.net"
},
{
"url" : "https://week.pad.picasoft.net",
"name" : "week.pad.picasoft.net"
}
],
"mattermost" : [
{
"url" : "https://team.picasoft.net",
"user" : "MATTERMOST_USER",
"password" : "MATTERMOST_PASSWORD",
"name" : "team.picasoft.net"
}
],
"wekan" : [
{
"url" : "https://kanban.picasoft.net",
"user" : "WEKAN_USER",
"password" : "WEKAN_PASSWORD",
"name" : "kanban.picasoft.net"
}
]
}
}
version: "3.7"
volumes:
data:
name: influxdb-services
networks:
proxy:
external: true
metrics:
services:
metrics-bot:
image: registry.picasoft.net/pica-metrics-bot:v1.1
build: .
container_name: pica-metrics-services
volumes:
- ./config.json:/config.json
environment:
- INTERVAL_SECONDS=120
env_file: ./secrets/account.secrets
networks:
- metrics
restart: unless-stopped
influxdb:
image: influxdb:1.7.10-alpine
container_name: influxdb-services
volumes:
- data:/var/lib/influxdb
environment:
- INFLUXDB_HTTP_AUTH_ENABLED=true
- INFLUXDB_DATA_MAX_VALUES_PER_TAG=0
# See https://docs.influxdata.com/influxdb/v1.7/administration/upgrading/#switch-between-tsm-and-tsi-indexes
- INFLUXDB_DATA_INDEX_VERSION=tsi1
- INFLUXDB_REPORTING_DISABLED=true
env_file: ./secrets/influxdb.secrets
labels:
traefik.http.routers.influxdb-services.entrypoints: websecure
traefik.http.routers.influxdb-services.rule: Host(`influxdb.picasoft.net`)
traefik.http.services.influxdb-services.loadbalancer.server.port: 8086
traefik.enable: true
networks:
- metrics
- proxy
restart: always
INFLUXDB_DB=picasoft
INFLUXDB_ADMIN_USER=picasoft-admin
INFLUXDB_ADMIN_PASSWORD=password
INFLUXDB_WRITE_USER=picasoft-write
INFLUXDB_WRITE_USER_PASSWORD=password
INFLUXDB_READ_USER=picasoft-read
INFLUXDB_READ_USER_PASSWORD=password
# Stack de métrologie
Ce dossier contient les ressources nécessaires pour déployer la partie serveur de la stack de métrologie de Picasoft, à savoir :
- Victoria Metrics pour le stockage de métriques
- `vmagent` pour l'ingestion de métriques
- Grafana pour visualiser les métriques
- `pica-metrics-bot` pour la collecte des métriques de certains services
Pour des raisons de simplicités mais aussi de sécurité, ces 4 services sont déployés sur la même machine, en partageant un même réseau Docker.
Il est fortement recommandé de consulter la [documentation associée](https://wiki.picasoft.net/doku.php?id=technique:adminsys:monitoring:metrologie:stack-picasoft) pour comprendre l'architecture de cette stack de métrologie.
## Lancement
[Documentation générique](https://wiki.picasoft.net/doku.php?id=technique:docker:picasoft:admin#lancement_d_un_nouveau_service).
## Configuration
### Victoria Metrics
Victoria Metrics est la base de données orienté métriques (on parle de TSDB pour _time serie database_) [utilisée par Picasoft](https://wiki.picasoft.net/doku.php?id=technique:adminsys:monitoring:metrologie:victoriametrics).
Sa configuration est simple, et se fait entièrement à l'aide de paramètres en ligne de commande. Picasoft utilise les paramètres suivants :
- `-retentionPeriod=1200` : Configuration de la rétention des métriques pour 1200 mois, soit 100 ans, c'est à dire quasiment illimité
- `-storageDataPath=/victoria-metrics-data` : Dossier de stockage des métriques, ce dossier est monté dans un volume Docker pour persister les données
- `-selfScrapeInterval=10s` : Indique à Victoria Metrics d'auto-collecter des métriques sur son état de fonctionnement, toutes les 10 secondes
- `-selfScrapeInstance=vm-tsdb` : Indique le nom que l'on donne à cette instance de Victoria Metrics, qui sera inscrit en label sur les propres métriques de l'instance
### vmagent
`vmagent` est l'outil proposé par Victoria Metrics pour gérer l'ingestion de métriques, compatible avec plusieurs protocoles.
Sa principale utilisation à Picasoft est pour le scraping de métriques au format Prometheus. Pour cela `vmagent` prends en paramètre un fichier de configuration [identique à celui de Prometheus](https://prometheus.io/docs/prometheus/latest/configuration/configuration/), ici le fichier [`vmagent-prom.yml`](./vmagent-prom.yml), qui est monté dans le conteneur.
Le reste de la configuration de `vmagent` se fait entièrement à l'aide de paramètres en ligne de commandes :
- `-promscrape.config=/config/vmagent-prom.yml` : Indique le chemin vers le fichier de configuration Prometheus.
- `-promscrape.config.strictParse` : Indique que l'on veut une interprétation stricte du fichier de configuration Prometheus (retourner une erreur en cas de format invalide ou de paramètres non supportés dans le fichier)
- `-remoteWrite.url=http://victoria-metrics:8428/api/v1/write` : Adresse vers laquelle `vmagent` doit envoyer les métriques collectées (l'instance Victoria Metrics)
- `-remoteWrite.tmpDataPath=/vmagent-remotewrite-data` : Dossier temporaire dans lequel `vmagent` stocke les métriques avant envoie vers Victoria Metrics (ou en cas d'indisponibilité de l'instance)
Pour une meilleure fiabilité, le dossier `/vmagent-remotewrite-data` qui stocke les données temporaires de `vmagent` est un volume Docker dédié : `vmagent-buffer`.
### Grafana
Grafana est l'outil de visualisation de métriques [utilisé par Picasoft](https://wiki.picasoft.net/doku.php?id=technique:adminsys:monitoring:metrologie:grafana).
Attention : même si l'authentification LDAP est activée, elle semble ne pas fonctionner : la connexion ne fonctionne que grâce à l'utilisateur administrateur. Voir [cette page](https://grafana.com/docs/grafana/latest/auth/ldap/#ldap-debug-view) pour investiguer et régler le problème.
#### Emplacements
La configuration est réalisée :
- Par les variables d'environnement de [Compose](./docker-compose.yml), qui permettent d'accéder à tous les paramètres de la configuration (voir la [documentation](https://grafana.com/docs/grafana/latest/administration/configuration/#configure-with-environment-variables)) : cette méthode est utilisée pour tous les paramètres non-critiques.
- Par le fichier [ldap.toml](./ldap.toml) pour la configuration spécifique au LDAP. Ce fichier peut faire référence à des variables d'environnement avec [cette syntaxe](https://grafana.com/docs/grafana/latest/auth/ldap/#using-environment-variables), pour les données critiques (_e.g._ mot de passe)
- Par le fichier [grafana.secrets](./secrets/grafana.secrets.example), pour les secrets.
#### Utilisateurs
Il y a trois types d'utilisateurs :
- L'administrateur de l'instance, configuré via l'environnement (Compose et secret)
- Les utilisateurs LDAP
- Les utilisateurs créés manuellement, non utilisés par Picasoft
### Metrics bot
Le [`pica-metrics-bot`](https://gitlab.utc.fr/picasoft/projets/picasoft-metrics-bot) est un script qui permet de collecter et générer des métriques de certains services (Etherpad, Mattermost, Wekan) à partir des APIs de ces services, et de pousser les métriques dans `vmagent` (_via_ le réseau Docker commun) en utilisant le protocole de InfluxDB.
Le nécessaire pour déployer ce script avec Docker se trouve dans le dossier [`pica-metrics-bot`](./pica-metrics-bot). Cette image Docker permet :
- d'exécuter le script à intervalles réguliers, configuré avec la variable d'environnement `INTERVAL_SECONDS`
- d'injecter des secrets (identifiants d'accès aux APIs) dans le fichier de configuration JSON du script à l'aide de variables d'environnement
#### TODO
Le `sed` utilisé pour injecter les secrets dans l'entrypoint est dégueulasse, si jamais il y a certains caractères dans les mots de passe ça marchera pas, il faut faire mieux, en Python par exemple.
## Mise à jour
Pour Victoria Metrics et `vmagent` il suffit de changer les tags utilisés dans le fichier `docker-compose.yml`. On fera attention à utilise la même version pour les deux outils.
Pour Grafana il suffit aussi de changer le tag utilisé dans le fichier Docker Compose, on peut suivre les nouvelles version [sur la page des releases](https://github.com/grafana/grafana/releases).
Pour le `pica-metrics-bot` il suffit de changer `METRICS_BOT_VERSION` dans le `Dockerfile`, de build/push la nouvelle image et d'ajuster le tag de l'image dans le fichier Compose, on peut suivre les nouvelles version [sur la page des releases](https://gitlab.utc.fr/picasoft/projets/picasoft-metrics-bot/-/releases).
version: '3.7'
version: "3.7"
networks:
metrics:
name: metrics
proxy:
external: true
volumes:
grafana:
name: grafana
prometheus:
name: prometheus
victoria-metrics:
name: victoria-metrics
vmagent-buffer:
name: vmagent-buffer
services:
grafana:
image: grafana/grafana:7.1.3
image: grafana/grafana:7.3.1
container_name: grafana
volumes:
- grafana:/var/lib/grafana
......@@ -36,12 +39,44 @@ services:
- metrics
restart: unless-stopped
prometheus:
image: prom/prometheus:v2.20.1
container_name: prometheus
victoria-metrics:
image: victoriametrics/victoria-metrics:v1.46.0
container_name: victoria-metrics
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml
- prometheus:/prometheus
- victoria-metrics:/victoria-metrics-data
command:
- "-retentionPeriod=1200"
- "-storageDataPath=/victoria-metrics-data"
- "-selfScrapeInterval=10s"
- "-selfScrapeInstance=vm-tsdb"
networks:
- metrics
restart: unless-stopped
vmagent:
image: victoriametrics/vmagent:v1.46.0
container_name: vmagent
command:
- "-promscrape.config=/config/vmagent-prom.yml"
- "-promscrape.config.strictParse"
- "-remoteWrite.url=http://victoria-metrics:8428/api/v1/write"
- "-remoteWrite.tmpDataPath=/vmagent-remotewrite-data"
volumes:
- ./vmagent-prom.yml:/config/vmagent-prom.yml
- vmagent-buffer:/vmagent-remotewrite-data
networks:
- metrics
restart: unless-stopped
metrics-bot:
image: registry.picasoft.net/pica-metrics-bot:v2.0
build: ./pica-metrics-bot
container_name: pica-metrics-services-test
volumes:
- ./pica-metrics-bot/config.json:/config.json
environment:
- INTERVAL_SECONDS=120
env_file: ./secrets/services-accounts.secrets
networks:
- metrics
restart: unless-stopped
Pour les prochaines versions, voir le changelog des releases ici : https://gitlab.utc.fr/picasoft/picasoft-metrics-bot
Désormais, les images construites ici sont synchronisées avec le numéro de tag des releases.
# Version 2.0
- Ajout de la possibilité de ne pas utiliser d'authentification InfluxDB
- Ajout de la compatibilité avec `vmagent`
# Version 1.1
- Retrait de la métrique "private boards" pour Wekan
- Bugfix sur une variable mal initialisée
# Version 1.0
* Synchronisation du numéro de version avec les tags sur le dépôt distant
* Ajout de Wekan et meilleure gestion d'erreur pour Etherpad
- Synchronisation du numéro de version avec les tags sur le dépôt distant
- Ajout de Wekan et meilleure gestion d'erreur pour Etherpad
# Version 1.0.2
* Mise à jour avec le code permettant de récupérer le nombre de connexion websocket sur Mattermost.
- Mise à jour avec le code permettant de récupérer le nombre de connexion websocket sur Mattermost.
# Version 1.0.1
* Mise à jour avec le code permettant de récupérer le nombre d'utilisateurs actifs d'Etherpad.
* Injection des secrets via un entrypoint personnalisé.
* Passage d'InfluxDB en volume Docker.
* Isolation réseau du bot (pas besoin d'être contacté de l'extérieur)
- Mise à jour avec le code permettant de récupérer le nombre d'utilisateurs actifs d'Etherpad.
- Injection des secrets via un entrypoint personnalisé.
- Passage d'InfluxDB en volume Docker.
- Isolation réseau du bot (pas besoin d'être contacté de l'extérieur)
# Version 1.0.0
......
FROM python:3.8-alpine
LABEL maintainer quentinduchemin@tuta.io
ARG METRICS_BOT_VERSION=v1.1
ARG METRICS_BOT_VERSION=v2.0
# Get release
RUN wget -O code.tar.gz https://gitlab.utc.fr/picasoft/projets/picasoft-metrics-bot/-/archive/${METRICS_BOT_VERSION}/picasoft-metrics-bot-${METRICS_BOT_VERSION}.tar.gz \
......
{
"influxdb": {
"url": "http://vmagent",
"port": 8429,
"database": "picasoft"
},
"modules": {
"etherpad": [
{
"url": "https://pad.picasoft.net",
"name": "pad.picasoft.net"
},
{
"url": "https://week.pad.picasoft.net",
"name": "week.pad.picasoft.net"
}
],
"mattermost": [
{
"url": "https://team.picasoft.net",
"user": "MATTERMOST_USER",
"password": "MATTERMOST_PASSWORD",
"name": "team.picasoft.net"
}
],
"wekan": [
{
"url": "https://kanban.picasoft.net",
"user": "WEKAN_USER",
"password": "WEKAN_PASSWORD",
"name": "kanban.picasoft.net"
}
]
}
}
......@@ -2,16 +2,6 @@
set -e
if [ -z "${INFLUXDB_USER}" ]; then
echo >&2 'Error : missing required ${INFLUXDB_USER} environment variable, exiting.'
exit 1
fi
if [ -z "${INFLUXDB_PASSWORD}" ]; then
echo >&2 'Error : missing required ${INFLUXDB_PASSWORD} environment variable, exiting.'
exit 1
fi
if [ -z "${MATTERMOST_USER}" ]; then
echo >&2 'Error : missing required ${MATTERMOST_USER} environment variable, exiting.'
exit 1
......@@ -33,13 +23,19 @@ if [ -z "${WEKAN_PASSWORD}" ]; then
fi
cp /config.json /code/config/config.json
sed -i "s/INFLUXDB_USER/${INFLUXDB_USER}/g" /code/config/config.json
sed -i "s/INFLUXDB_PASSWORD/${INFLUXDB_PASSWORD}/g" /code/config/config.json
sed -i "s/MATTERMOST_USER/${MATTERMOST_USER}/g" /code/config/config.json
sed -i "s/MATTERMOST_PASSWORD/${MATTERMOST_PASSWORD}/g" /code/config/config.json
sed -i "s/WEKAN_USER/${WEKAN_USER}/g" /code/config/config.json
sed -i "s/WEKAN_PASSWORD/${WEKAN_PASSWORD}/g" /code/config/config.json
if [ -n "${INFLUXDB_USER}" ]; then
sed -i "s/INFLUXDB_USER/${INFLUXDB_USER}/g" /code/config/config.json
fi
if [ -n "${INFLUXDB_PASSWORD}" ]; then
sed -i "s/INFLUXDB_PASSWORD/${INFLUXDB_PASSWORD}/g" /code/config/config.json
fi
INTERVAL_SECONDS=${INTERVAL_SECONDS:-60}
while :
......
INFLUXDB_USER=picasoft-write
INFLUXDB_PASSWORD=password
MATTERMOST_USER=user
MATTERMOST_PASSWORD=password
WEKAN_USER=user
......
# This file is compatible with Prometheus configuration file for "global" and "scrape_configs" sections.
# See https://github.com/VictoriaMetrics/VictoriaMetrics/blob/master/app/vmagent/README.md#how-to-collect-metrics-in-prometheus-format
# Global configuration. Might be overrided
global:
scrape_interval: 1m # Interval between 2 scrapping - 1 minute
# All scraping rules
scrape_configs:
# Scrape own vmagent metrics
- job_name: "vmagent"
scheme: "http"
static_configs:
- targets:
- "localhost:8429"
relabel_configs:
- source_labels: [__address__]
regex: ".*"
target_label: instance
replacement: "vmagent"
# Scrape murmur (mumble server) metrics
- job_name: "voice-mumble"
scheme: "https"
static_configs:
- targets:
- "voice.picasoft.net"
# Scrape CodiMD metrics
- job_name: codimd
honor_timestamps: true
scrape_interval: 5s
scrape_timeout: 5s
metrics_path: "/metrics/codimd"
scheme: "https"
static_configs:
- targets:
- "md.picasoft.net"
# Scrape Picasoft servers node-exporter
- job_name: "pica01"
static_configs:
- targets:
- "pica01.picasoft.net:9100"
relabel_configs:
- source_labels: [__address__]
regex: ".*"
target_label: instance
replacement: "pica01"
- job_name: "pica02"
static_configs:
- targets:
- "pica02.picasoft.net:9100"
relabel_configs:
- source_labels: [__address__]
regex: ".*"
target_label: instance
replacement: "pica02"
- job_name: "monitoring"
static_configs:
- targets:
- "monitoring.picasoft.net:9100"
relabel_configs:
- source_labels: [__address__]
regex: ".*"
target_label: instance
replacement: "monitoring"
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment