This article is available in French.
1. Les bases de VRL #
Un langage sûr et rapide.
Syntaxe #
# Le point (.) est l'événement courant
.service = "boutique"
.status = to_int!(.status) # « ! » : erreur fatale si la conversion échoue
# Gestion explicite des erreurs
parsed, err = parse_json(.message)
if err == null {
. = merge(., parsed)
del(.message)
} else {
.parse_error = err
}
# Conditions
if .status >= 500 { .severity = "error" } else if .status >= 400 { .severity = "warning" } else { .severity = "info" }À savoir : VRL est vérifié à la compilation : une fonction qui peut échouer doit être traitée (! ou affectation de l'erreur). Une configuration qui démarre ne plantera pas sur un événement inattendu.2. Recettes #
Les transformations courantes.
Analyser un log nginx #
parsed = parse_regex!(.message, r'^(?P<ip>\S+) \S+ \S+ \[(?P<ts>[^\]]+)\] "(?P<method>\S+) (?P<path>\S+) \S+" (?P<status>\d+) (?P<bytes>\d+)')
. = merge(., parsed)
.status = to_int!(.status)
.bytes = to_int!(.bytes)
.timestamp = parse_timestamp!(.ts, "%d/%b/%Y:%H:%M:%S %z")
del(.ts)Masquer des données personnelles #
.message = redact(.message, filters: [r'\b[\w.+-]+@[\w-]+\.[\w.]+\b', "us_social_security_number"])
.client_ip = ip_cidr_contains!("10.0.0.0/8", .ip) ? "interne" : "externe"
del(.authorization)Bonne Pratique : Masquez au plus près de la source : un e-mail qui atteint Elasticsearch ou Loki se retrouve dans les sauvegardes et les index pour toute la durée de rétention.
Router et produire des métriques #
transforms:
aiguillage:
type: route
inputs: [parse]
route:
securite: .source == "auth"
lent: .duration_ms > 1000
requetes_metriques:
type: log_to_metric
inputs: [parse]
metrics:
- type: counter
field: status
name: http_requests_total
tags: { status: "{{ status }}", method: "{{ method }}" }
sinks:
prom:
type: prometheus_exporter
inputs: [requetes_metriques]
address: 0.0.0.0:95983. Tests unitaires #
Une configuration testée comme du code.
vector test #
tests:
- name: analyse nginx
inputs:
- insert_at: parse
type: log
log_fields:
message: '10.0.0.1 - - [19/Oct/2026:10:00:00 +0200] "GET /panier HTTP/1.1" 502 120'
outputs:
- extract_from: parse
conditions:
- type: vrl
source: |
assert_eq!(.status, 502)
assert_eq!(.path, "/panier")vector test vector.yamlBonne Pratique : Ajoutezvector validateetvector testà la CI du dépôt de configuration : une regex cassée ne part plus en production.
My progress
Sign in to track your progress and take notes. Sign in
Recommended Articles
OpenTelemetry Collector : les Processors (transformer, filtrer et protéger la télémétrie)
Maîtriser les processors du Collector OpenTelemetry : batch, memory_limiter, attributes, resource...
Logs Datadog avancés : index, filtres d'exclusion, Flex Logs, archives et Sensitive Data Scanner
Maîtriser coût et conformité des logs Datadog : pipelines et processeurs, index et rétention, fil...
Logs dans Datadog : collecte, pipelines, index et maîtrise du volume
Collecter les logs avec l'agent, les structurer avec pipelines et processeurs (grok), utiliser fa...
Grail et DQL avancés : jointures, lookup, séries temporelles et optimisation
Aller plus loin avec DQL : join et lookup, makeTimeseries et timeseries, parse avec DPL, entités ...
DQL en pratique : explorer logs et événements, notebooks, tableaux de bord et performance
Utiliser le Dynatrace Query Language au quotidien : explorer logs et événements, enchaîner les co...
Ingestion Elasticsearch : Bulk API, ingest pipelines, enrich et reindex
Ingérer et transformer des données dans Elasticsearch : Bulk API, ingest pipelines et processeurs...
LogQL (2/2) : transformer les logs en métriques
Créer des métriques à partir des logs avec LogQL : rate, count_over_time, bytes_rate, agrégations...
Traefik : les logs (journaux applicatifs et access logs)
Configurer les deux journaux de Traefik : le journal de fonctionnement (niveaux, format) et les a...
RUM et Synthetic Monitoring avec Datadog : synthetic transaction monitoring et expérience utilisateur
Mesurer l'expérience utilisateur avec Datadog : RUM navigateur et mobile, Core Web Vitals, Sessio...