Aller au contenu

Elastic Stack (ELK)

Maintenu par OrkyvoVersion 1.0.0Inclus dans l'offre DevOps7 actions · 1 déclencheur

Elasticsearch (recherche, agrégations, documents), envoi vers Logstash et alertes Kibana.

Intégration maintenue par Orkyvo pour Elastic Stack, avec des opérations séparées par composant. Elasticsearch : recherche Query DSL avec pagination (from/size, search_after) et limites, agrégations, lecture, indexation et mise à jour de documents, avec une clé d'API. Logstash : envoi d'un événement JSON vers une entrée HTTP que vous configurez côté Logstash (exemple de pipeline fourni). Kibana : réception des notifications d'alerte envoyées par un connecteur Webhook. Fonctionne avec Elastic Cloud et les déploiements autohébergés (autorité de certification interne acceptée).

Opérations

OpérationTypeDescription
Elasticsearch · RechercheractionRecherche Query DSL avec tri, pagination (from/size ou search_after) et limite de 1 000 résultats par appel.
Elasticsearch · AgrégationsactionExécute des agrégations (sans documents) sur une requête.
Elasticsearch · Obtenir un documentactionLit un document par index et identifiant.
Elasticsearch · Indexer un documenteffet externe : demande une confirmation avant une exécution manuelleactionCrée ou remplace un document. Sans identifiant, un identifiant déterministe est dérivé de l'étape : une nouvelle tentative ne crée pas de doublon.
Elasticsearch · Mettre à jour un documenteffet externe : demande une confirmation avant une exécution manuelleactionMise à jour partielle (doc), création possible si absent (upsert), 3 essais en cas de conflit de version.
Elasticsearch · Lister les indexactionIndex, état de santé, nombre de documents et taille (privilège monitor).
Logstash · Envoyer un événementeffet externe : demande une confirmation avant une exécution manuelleactionEnvoie un événement JSON à l'entrée HTTP configurée côté Logstash (plugin http). Un identifiant orkyvo.event_id permet le dédoublonnage en aval.
Kibana · Alerte reçuedéclencheurDémarre le workflow à chaque notification d'une règle d'alerte Kibana envoyée par un connecteur Webhook (en-tête secret vérifié, doublons écartés).

Connexion

Renseignez les composants utilisés : Elasticsearch (URL et clé d'API à privilèges limités) et/ou l'entrée HTTP Logstash. Les alertes Kibana arrivent par webhook et ne nécessitent pas d'identifiants ici.

Documentation

Elastic Stack (ELK)

Intégration maintenue par Orkyvo (non certifiée par Elastic N.V.) pour Elasticsearch, Logstash et Kibana 8.x (Elastic Cloud ou autohébergé). Chaque opération porte le nom de son composant : rien n'est supposé d'un composant à l'autre.

Connexion

ChampComposantDescription
URL d'ElasticsearchElasticsearchPoint de terminaison du cluster (Elastic Cloud : *Copy endpoint*).
Clé d'API (encodée)ElasticsearchValeur encoded d'une clé d'API, envoyée en Authorization: ApiKey ….
URL de l'entrée HTTPLogstashAdresse de l'entrée http de votre pipeline.
Utilisateur / mot de passeLogstashSi l'entrée http est protégée (user, password).
Autorité de certificationElasticsearch, LogstashPEM d'une autorité interne ; la vérification TLS reste active.

Les secrets sont chiffrés et masqués dans l'interface, les journaux, les erreurs et les exports. Une adresse privée (cluster sur site) doit être autorisée par un administrateur de la plateforme pour cette connexion ; l'entrée HTTP Logstash sans TLS n'est acceptée que si la règle l'autorise explicitement.

Clé d'API aux privilèges limités (exemple, à créer par POST /_security/api_key) :

{
"name": "orkyvo",
"expiration": "365d",
"role_descriptors": {
"orkyvo": {
"cluster": ["monitor"],
"indices": [
{ "names": ["logs-*"], "privileges": ["read", "view_index_metadata"] },
{ "names": ["incidents"], "privileges": ["read", "create_doc", "index", "write"] }
]
}
}
}

« Tester la connexion » lit GET / et GET /_security/_authenticate ; l'entrée Logstash n'est pas contactée (un envoi est une écriture).

Elasticsearch

OpérationAPILimites
RechercherPOST /{index}/_search (Query DSL)1 000 résultats par appel ; from + size ≤ 10 000 ; au-delà, search_after (renvoyé dans nextSearchAfter, tri obligatoire). Total compté jusqu'à 10 000 (exact en option).
AgrégationsPOST /{index}/_search avec size: 0Agrégations libres (terms, date_histogram, avg…).
Obtenir un documentGET /{index}/_doc/{id}
Indexer un documentPUT /{index}/_doc/{id} ou PUT /{index}/_create/{id}Sans identifiant : identifiant déterministe dérivé de l'étape et création seule → pas de doublon en cas de nouvelle tentative (existing: true).
Mettre à jour un documentPOST /{index}/_update/{id}Mise à jour partielle, doc_as_upsert en option, retry_on_conflict: 3.
Lister les indexGET /_cat/indices?format=jsonPrivilège monitor.

Le sélecteur d'index propose les index ouverts et des motifs (logs-api*) ; la saisie manuelle et les données des étapes précédentes restent possibles.

Logstash : entrée HTTP

Orkyvo envoie des événements à Logstash ; Logstash ne propose pas de recherche de journaux (la recherche se fait dans Elasticsearch). L'entrée HTTP doit exister côté Logstash avant tout envoi : sans elle, l'étape échoue (connexion refusée ou 404).

Exemple de pipeline (/etc/logstash/conf.d/orkyvo.conf) :

input {
http {
port => 8080
ssl_enabled => true
ssl_certificate => "/etc/logstash/certs/logstash.crt"
ssl_key => "/etc/logstash/certs/logstash.key"
user => "orkyvo"
password => "${ORKYVO_HTTP_PASSWORD}"
additional_codecs => { "application/json" => "json" }
}
}
filter {
# Dédoublonnage : un même orkyvo.event_id produit le même document.
fingerprint { source => ["[orkyvo][event_id]"] target => "[@metadata][fingerprint]" method => "SHA256" }
mutate { remove_field => ["[http][request][headers][authorization]"] }
}
output {
elasticsearch {
hosts => ["https://es.example.com:9200"]
api_key => "${ES_API_KEY}"
index => "orkyvo-events"
document_id => "%{[@metadata][fingerprint]}"
}
}

Logstash répond 200 ok dès réception. Chaque événement reçoit orkyvo.event_id (saisi, ou dérivé de l'étape et stable en cas de nouvelle tentative). Un envoi n'est jamais relancé automatiquement après une réponse réseau perdue (« Résultat incertain ») ; avec document_id ci-dessus, un renvoi manuel ne crée pas de doublon.

Kibana : alertes reçues par webhook

Prérequis :

  • Licence : le connecteur *Webhook* est disponible sur Elastic Cloud et, en autohébergé, à partir de la licence Gold (ou en période d'essai).
  • Kibana doit pouvoir joindre l'URL publique d'Orkyvo en HTTPS. En autohébergé, l'hôte peut devoir figurer dans xpack.actions.allowedHosts.

Mise en place :

  1. Ajoutez le déclencheur « Kibana · Alerte reçue » et publiez le workflow : l'URL du webhook et le secret s'affichent dans l'éditeur (« Afficher le secret »).
  2. Dans Kibana : *Stack Management → Connectors → Webhook*. Méthode POST, URL du workflow, en-tête X-Orkyvo-Token: <secret>, en-tête Content-Type: application/json.
  3. Dans la règle d'alerte, ajoutez une action avec ce connecteur et le corps suivant (variables disponibles selon le type de règle) :
{
"rule": { "id": "{{rule.id}}", "name": "{{rule.name}}", "url": "{{rule.url}}", "tags": "{{rule.tags}}" },
"alert": { "id": "{{alert.id}}", "uuid": "{{alert.uuid}}", "actionGroup": "{{alert.actionGroup}}", "actionGroupName": "{{alert.actionGroupName}}", "flapping": "{{alert.flapping}}" },
"context": { "reason": "{{context.reason}}", "value": "{{context.value}}", "conditions": "{{context.conditions}}", "link": "{{context.link}}" },
"date": "{{date}}",
"kibanaBaseUrl": "{{kibanaBaseUrl}}"
}

Chaque appel est vérifié (en-tête secret, comparaison à temps constant, jamais enregistré). Les nouvelles tentatives de Kibana pour une même notification sont dédoublonnées (règle, alerte, groupe d'action et date). Le workflow reçoit rule, alert, recovered (groupe recovered), context, date et kibanaBaseUrl.

Erreurs

401 clé d'API invalide ou expirée · 403 privilège manquant sur l'index · 404 index ou document introuvable · 409 document déjà existant (création) ou conflit de version · 429 / 5xx temporaires (lectures relancées selon Retry-After). Certificat refusé : ajoutez l'autorité interne.

Limites

  • Tests automatisés sur API simulées ; test réel sur un déploiement d'essai Elastic Cloud ou docker compose local : docs/INTEGRATIONS.md.