Files

204 lines
4.1 KiB
Markdown
Raw Permalink Normal View History

2025-12-04 07:43:14 +01:00
# TP 2 Supervision d'un programme en C
Dans Visual Studio Code, assurez vous d'avoir l'extension suivante installée :
- [Dev Containers](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers)
2025-12-04 14:34:34 +01:00
Démarrer Docker en lançant Docker Desktop
Créer un réseau qui permettra à vos machines de communiquer entre elles.
```shell
docker network create tp_net
```
2025-12-04 07:43:14 +01:00
Cloner le dépot contenant les [sources](https://sources.neotech.fr/medina474/c_pompes) C programme sur les pompes
```shell
2025-12-04 14:08:50 +01:00
git clone https://sources.neotech.fr/Universite/c_pompes
2025-12-04 07:43:14 +01:00
```
```shell
cd c_pompes
```
2025-12-04 14:34:34 +01:00
run task CMake configure
2025-12-04 07:43:14 +01:00
2025-12-04 14:34:34 +01:00
tache config
2025-12-04 07:43:14 +01:00
Dans Visual Studio Code, chercher la commande Open Folder in Dev Container.... (Menu View - Command Palette ...)
2025-12-04 16:03:43 +01:00
L'extension va créer un conteneur Docker configuré avec les extensions nécessaires au dévelopement de l'application
2025-12-04 07:43:14 +01:00
2025-12-04 13:05:07 +01:00
### Ajouter un conteneur pour Prometheus
2025-12-04 16:03:43 +01:00
Créer un fichier de configuration prometheus.yml
2025-12-04 13:08:19 +01:00
```json
global:
scrape_interval: 5s
scrape_configs:
- job_name: 'prometheus'
scrape_interval: 1m
static_configs:
- targets: ['localhost:9090']
- job_name: 'apps_dynamiques'
file_sd_configs:
- files:
- /etc/prometheus/targets/*.yml
- job_name: docker
docker_sd_configs:
- host: unix:///var/run/docker.sock
refresh_interval: 15s
filters:
- name: label
values: ['prometheus=true']
relabel_configs:
- source_labels: ['__meta_docker_container_name']
regex: '/(.*)'
target_label: 'container'
```
2025-12-04 16:03:43 +01:00
Créer un dossier prometheus
2025-12-04 13:08:19 +01:00
```shell
2025-12-04 14:35:14 +01:00
docker run --detach --name prometheus ^
--network tp_net ^
-p "9090:9090" ^
-v prometheus:/prometheus ^
-v ./prometheus.yml:/etc/prometheus/prometheus.yml ^
-v ./prometheus:/etc/prometheus/targets ^
-v /var/run/docker.sock:/var/run/docker.sock:ro ^
-l "caddy=prometheus.localhost" ^
-l "caddy.reverse_proxy={{upstreams 9090}}" ^
-l "caddy.tls=internal" ^
2025-12-04 13:08:19 +01:00
prom/prometheus:v3.8.0
```
2025-12-04 16:03:43 +01:00
Rendez vous à l'adresse http://localhost:9000
2025-12-04 13:08:19 +01:00
### Ajouter un conteneur pour Grafana
```shell
2025-12-04 14:34:34 +01:00
docker run --detach --name grafana ^
--network tp_net ^
2025-12-04 14:37:35 +01:00
-p "3000:3000" ^
2025-12-04 14:35:14 +01:00
-e "GF_SECURITY_ADMIN_USER=admin" ^
-e "GF_SECURITY_ADMIN_PASSWORD=geii2025" ^
-e "GF_USERS_ALLOW_SIGN_UP=false" ^
-e "GF_USERS_DEFAULT_THEME=system" ^
--label "caddy=grafana.localhost" ^
--label "caddy.reverse_proxy={{upstreams 3000}}" ^
--label "caddy.tls=internal" ^
2025-12-04 13:08:19 +01:00
grafana/grafana:12.1
```
2025-12-04 13:05:07 +01:00
2025-12-04 16:03:43 +01:00
```yml
- labels:
job: "c"
targets:
- "pompes:8099"
```
2025-12-04 13:05:07 +01:00
### Ajouter un conteneur pour Mailpits
2025-12-04 16:03:43 +01:00
### Modifier le programme C
Inclure les bibliothèques
```Cpp
#include <prometheus/counter.h>
#include <prometheus/gauge.h>
#include <prometheus/registry.h>
#include <prometheus/exposer.h>
```
Déclarer les variables
```Cpp
using namespace prometheus;
std::shared_ptr<Registry> registry;
Gauge* debit_entree = nullptr;
Gauge* debit_sortie = nullptr;
```
Initialiser
```Cpp
static Exposer exposer{"0.0.0.0:8099"};
// Le registre central
registry = std::make_shared<Registry>();
exposer.RegisterCollectable(registry);
auto& gauge_family = BuildGauge()
.Name("geii_debit")
.Help("Débit en l/s")
.Register(*registry);
debit_entree = &gauge_family.Add({{"numero", "entree"}});
debit_sortie = &gauge_family.Add({{"numero", "sortie"}});
```
Affecter les valeurs
```Cpp
debit_entree->Set(_digital[IN_FLOW_OUT].dvalue);
debit_sortie->Set(_digital[IN_FLOW_IN].dvalue);
```
### Construire un tableau de bord dans Grafana
### Ajouter d'autres métriques
Les gauges :
- IN_TANK_LEVEL
- IN_FLOW_1
- IN_FLOW_2
- IN_FLOW_3
- IN_FLOW_4
2025-12-05 13:43:23 +01:00
Comparer avec des compteurs
- Volume_p1
- Volume_p2
- Volume_p3
- Volume_p4
Ajouter un histogramme pour le volume dans le réservoir
- 2
- 5
- 6
- 7
- 8
- 9
- 9.5
2025-12-05 17:25:27 +01:00
2025-12-09 13:47:29 +01:00
```c
2025-12-05 17:25:27 +01:00
#include <prometheus/histogram.h>
2025-12-09 13:47:29 +01:00
Histogram::BucketBoundaries buckets = {
2, 5, 6, 7, 8, 9, 9.5
};
2025-12-05 17:25:27 +01:00
2025-12-09 13:47:29 +01:00
auto& hist_family = BuildHistogram()
.Name("volume")
.Help("volume du reservoir en m3")
.Register(*registry);
2025-12-05 17:25:27 +01:00
auto& request_volume = hist_family.Add({}, buckets);
2025-12-09 13:47:29 +01:00
request_volume.Observe(0.42);
```