Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "cave"
version = "0.1.0"
version = "0.1.1"
authors = ["Simvia <basile.marchand@simvia.tech>"]
edition = "2021"
description = "CLI for managing code_aster versions"
Expand Down
12 changes: 9 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ For detailed user documentation, please visit our [User Documentation](https://g

`cave` includes optional telemetry features to help improve the tool by collecting anonymous usage data. You can control telemetry settings via the configuration commands.

By default, version usage tracking is **enabled**, sending anonymous data about which code_aster versions you run. You can disable this tracking if you prefer.
By default, version usage tracking is **enabled**, sending anonymous data (see [Telemetry](https://github.com/simvia-tech/cave/blob/dev/docs/telemetry.md)) about which code_aster versions you run. You can disable this tracking if you prefer.

To deactivate telemetry, use:

Expand All @@ -77,11 +77,17 @@ cave config disable-usage-tracking
```
Telemetry respects your privacy and does not collect sensitive information.

## Contributors

- Lucas S.
- Basile M.
- Hadrien R.

## See Also

- [Code_Aster](https://www.code-aster.org)
- [Docker](https://www.docker.com)
- [code_aster](https://www.code-aster.org)
- [Simvia Docker Hub](https://hub.docker.com/r/simvia/code_aster)
- [code_aster catalog](https://simvia-tech.github.io/code-aster-dockerhub/)

## License

Expand Down
20 changes: 20 additions & 0 deletions docs/dev.md
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,26 @@ cargo test
```

---

## Variables d'environnement

Le CLI supporte deux variables d'environnement optionnelles :

1. `CAVE_DEBUG=true`
- Active l'affichage des traces en mode debug du CLI. Utile pour suivre les opérations internes et déboguer des problèmes.

2. `LOCAL_TELEMETRY=true`
- Force l'envoi de la télémétrie vers un serveur local sur un port personnalisé, au lieu du serveur distant par défaut Simvia.
- Utile pour tester la télémétrie en local sans impacter la production.

Pour les utiliser, exportez simplement les variables avant de lancer le CLI, par exemple :

```bash
export CAVE_DEBUG=true
export LOCAL_TELEMETRY=true
cave your-command
```

## Structure du projet

- `src/main.rs` → point d’entrée CLI
Expand Down
40 changes: 40 additions & 0 deletions docs/telemetry.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
# Telemetry

The `cave` CLI includes optional telemetry to help improve the tool by collecting **anonymous usage data**. You can control telemetry via the configuration commands.

## Collected Data

When telemetry is enabled, the following data is collected:

- **user_id**: a randomly generated UUID (`Uuid::new_v4()`) to identify usage anonymously.
- **time_execution**: execution duration in milliseconds.
- **valid_result**: whether the code_aster execution is valid
- **timezone**: the local timezone of the machine.
- **version**: the version of code\_aster used.
- **id_docker**: the Docker image ID.


## Example Data

Here is an example of what a telemetry record looks like:

```json
{
"user_id": "23806108-75e2-4fe7-8bcf-9b2da5659890",
"time_execution": 7899,
"valid_result": true,
"timezone": "+02:00",
"version": "17.2.13",
"id_docker": "e0d78ea06146"
}
```

## Control Telemetry

To disable telemetry, run:

```bash
cave config disable-usage-tracking
```


6 changes: 4 additions & 2 deletions src/docker.rs
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ use chrono::{Local, Offset};
use crate::config::{read_user_id};
use crate::telemetry::{send_execution_data, ExecutionData};
use log::debug;
use std::env;

// TODO : uncomment to have registry option
// use regex::Regex;
Expand Down Expand Up @@ -273,9 +274,10 @@ pub fn docker_aster(version: &str, export_file: &Option<String>, args: &Vec<Stri

debug!("Runtime tokio créé, envoi des données...");

let _ = rt.block_on(async {
rt.block_on(async {
debug!("Appel de send_execution_data()");
let _ = send_execution_data(execution_data).await;
let local_telemetry = env::var("LOCAL_TELEMETRY").map(|v| v == "true").unwrap_or(false);
let _ = send_execution_data(execution_data, local_telemetry).await;
debug!("Fin de send_execution_data()");
});

Expand Down
73 changes: 43 additions & 30 deletions src/telemetry.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,41 +2,57 @@ pub mod cave_telem {
tonic::include_proto!("cave_telem");
}

use tokio::time::{timeout, Duration};
use cave_telem::{cave_telemetry_client::CaveTelemetryClient, Telemetry};
use log::debug;
use tonic::transport::{Channel, ClientTlsConfig};

pub async fn send_execution_data(e: ExecutionData,) -> Result<(), Box<dyn std::error::Error>> {
pub async fn send_execution_data(e: ExecutionData, local: bool) -> Result<(), Box<dyn std::error::Error>> {
debug!("=== DÉBUT DE LA TÉLÉMÉTRIE ===");
debug!("Initialisation du client gRPC pour la télémétrie");
debug!("Données à envoyer: {:?}", e);
let mut client;

debug!("Configuration TLS pour le domaine: code-insight.simvia-app.fr");
let tls = ClientTlsConfig::new()
.domain_name("code-insight.simvia-app.fr");

debug!("Tentative de connexion à: https://code-insight.simvia-app.fr:8443");
let endpoint = Channel::from_static("https://code-insight.simvia-app.fr:8443")
.tls_config(tls)
.expect("Configuration TLS failed");
debug!("Configuration du canal TLS réussie");

debug!("Établissement de la connexion...");
let channel = match endpoint.connect().await {
Ok(ch) => {
debug!("Connexion TCP/TLS établie avec succès");
ch
}
Err(e) => {
debug!("Échec de la connexion TCP/TLS: {}", e);
debug!("Type d'erreur: {:?}", e);
return Err(e.into());
}
};

debug!("Création du client gRPC...");
let mut client = CaveTelemetryClient::new(channel);
debug!("Client gRPC créé avec succès et connecté avec TLS à code-insight.simvia-app.fr:8443");
if local {
debug!("=== CONNEXION EN LOCAL ===");
debug!("Initialisation du client gRPC");
client = CaveTelemetryClient::connect("http://127.0.0.1:50051").await?;
debug!("Client gRPC connecté à http://127.0.0.1:50051");
}
else {
debug!("=== CONNEXION A DISTANCE ===");
debug!("Configuration TLS pour le domaine: code-insight.simvia-app.fr");
let tls = ClientTlsConfig::new()
.domain_name("code-insight.simvia-app.fr");

debug!("Tentative de connexion à: https://code-insight.simvia-app.fr:8443");
let endpoint = Channel::from_static("https://code-insight.simvia-app.fr:8443")
.tls_config(tls)
.expect("Configuration TLS failed");
debug!("Configuration du canal TLS réussie");

debug!("Établissement de la connexion...");
let connect_timeout = Duration::from_millis(1000);
let channel = match timeout(connect_timeout, endpoint.connect()).await {
Ok(Ok(ch)) => {
debug!("Connexion TCP/TLS établie avec succès");
ch
}
Ok(Err(e)) => {
debug!("Échec de la connexion TCP/TLS: {}", e);
debug!("Type d'erreur: {:?}", e);
return Err(e.into());
}
Err(e) => {
debug!("Timeout atteint lors de la connexion TCP/TLS");
return Err(e.into());
}
};

debug!("Création du client gRPC...");
client = CaveTelemetryClient::new(channel);
debug!("Client gRPC créé avec succès et connecté avec TLS à code-insight.simvia-app.fr:8443");
}

debug!("Construction de la requête Telemetry:");
debug!(" - user_id: {}", e.user_id);
Expand Down Expand Up @@ -77,9 +93,6 @@ pub async fn send_execution_data(e: ExecutionData,) -> Result<(), Box<dyn std::e
}





#[derive(Debug)]
pub struct ExecutionData {
pub user_id: String,
Expand Down
Loading