- Utilisation de 2 requêtes séparées + fusion en Python - 1ère requête: ml_detected_anomalies pour les détections récentes - 2ème requête: view_dashboard_entities avec IN clause pour les user-agents - La clause IN permet d'utiliser l'index ClickHouse (splitByChar ne l'utilise pas) - PREWHERE optimise les performances de requête Problème résolu: - unique_ua était toujours à 0 car la jointure LEFT JOIN ne fonctionnait pas - La solution avec IN clause fonctionne car elle utilise l'index sur entity_value Testé avec 141.98.11.0/24: - 5 IPs, 8 détections, 65 user-agents uniques - 141.98.11.209: 68 user-agents différents Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
80 lines
3.0 KiB
SQL
80 lines
3.0 KiB
SQL
-- =============================================================================
|
|
-- Vue materialisée pour les User-Agents - Dashboard Bot Detector
|
|
-- =============================================================================
|
|
--
|
|
-- Instructions d'installation :
|
|
-- -----------------------------
|
|
-- 1. Se connecter à ClickHouse en CLI :
|
|
-- clickhouse-client --host test-sdv-anubis.sdv.fr --port 8123 \
|
|
-- --user default --password <votre_mot_de_passe>
|
|
--
|
|
-- 2. Copier-coller CHAQUE BLOC séparément (un par un)
|
|
--
|
|
-- 3. Vérifier que la vue est créée :
|
|
-- SELECT count() FROM mabase_prod.view_dashboard_user_agents;
|
|
--
|
|
-- =============================================================================
|
|
|
|
USE mabase_prod;
|
|
|
|
-- =============================================================================
|
|
-- BLOC 1/3 : Créer la table
|
|
-- =============================================================================
|
|
|
|
CREATE TABLE IF NOT EXISTS mabase_prod.view_dashboard_user_agents
|
|
(
|
|
src_ip IPv4,
|
|
ja4 String,
|
|
hour DateTime,
|
|
log_date Date,
|
|
user_agents Array(String),
|
|
requests UInt64
|
|
)
|
|
ENGINE = AggregatingMergeTree()
|
|
PARTITION BY log_date
|
|
ORDER BY (src_ip, ja4, hour)
|
|
TTL log_date + INTERVAL 90 DAY -- Garder 90 jours (au lieu de 7)
|
|
SETTINGS index_granularity = 8192;
|
|
|
|
-- =============================================================================
|
|
-- BLOC 2/3 : Créer la vue materialisée
|
|
-- =============================================================================
|
|
|
|
CREATE MATERIALIZED VIEW IF NOT EXISTS mabase_prod.view_dashboard_user_agents_mv
|
|
TO mabase_prod.view_dashboard_user_agents
|
|
AS SELECT
|
|
src_ip,
|
|
ja4,
|
|
toStartOfHour(time) AS hour,
|
|
toDate(time) AS log_date,
|
|
groupArrayDistinct(header_user_agent) AS user_agents,
|
|
count() AS requests
|
|
FROM mabase_prod.http_logs
|
|
WHERE header_user_agent != '' AND header_user_agent IS NOT NULL
|
|
AND time >= now() - INTERVAL 7 DAY
|
|
GROUP BY src_ip, ja4, hour, log_date;
|
|
|
|
-- =============================================================================
|
|
-- BLOC 3/3 : Créer les index (optionnel - améliore les performances)
|
|
-- =============================================================================
|
|
|
|
ALTER TABLE mabase_prod.view_dashboard_user_agents
|
|
ADD INDEX IF NOT EXISTS idx_user_agents_ip (src_ip) TYPE minmax GRANULARITY 1;
|
|
|
|
ALTER TABLE mabase_prod.view_dashboard_user_agents
|
|
ADD INDEX IF NOT EXISTS idx_user_agents_ja4 (ja4) TYPE minmax GRANULARITY 1;
|
|
|
|
-- =============================================================================
|
|
-- FIN
|
|
-- =============================================================================
|
|
--
|
|
-- Pour vérifier que la vue fonctionne :
|
|
-- -------------------------------------
|
|
-- SELECT * FROM mabase_prod.view_dashboard_user_agents LIMIT 10;
|
|
--
|
|
-- Pour rafraîchir manuellement (si nécessaire) :
|
|
-- ----------------------------------------------
|
|
-- OPTIMIZE TABLE mabase_prod.view_dashboard_user_agents FINAL;
|
|
--
|
|
-- =============================================================================
|