Aller au contenu principal
Version: ⭐ 25.10

Le protocole BBDO

Le protocole BBDO a été créé pour être le protocole par défaut de Centreon Broker. Il est léger, facile à décoder et spécialement conçu pour la surveillance des ressources avec Centreon Broker.

Introduction

BBDO est l’abréviation de Broker Binary Data Object. BBDO est conçu pour transférer des « paquets de données » d’un nœud à un autre. Ces « paquets de données » sont la plupart du temps des informations de supervision fournies par le moteur de supervision (par exemple le moteur Centreon Engine ou Nagios). Il utilise principalement des valeurs binaires brutes, ce qui lui permet d’utiliser très peu de mémoire.

Avec Broker 22.04.0, nous avons introduit une nouvelle version de BBDO basée sur Google Protobuf 3. Le nouveau protocole reste compatible avec le précédent mais introduit de nouveaux événements. Par exemple, les événements PbService et PbServiceStatus sont envoyés au lieu des événements Service et ServiceStatus. Configuré avec BBDO 3, Broker comprend toujours les événements Service et ServiceStatus mais il doit envoyer par défaut les nouvelles versions.

Types

En tant que protocole binaire, BBDO utilise des types de données pour sérialiser les données. Ils sont écrits dans un format Big Endian et décrits dans le tableau suivant.

TypeReprésentationTaille (octets)
entierbinaire4
entier courtbinaire2
entier longbinaire8
tempsbinaire (horodatage)8
booléenbinaire (0 est False, tout le reste est True)1
chaînechaîne UTF-8 non terminéevariable
réelchaîne UTF-8 non terminée (au format fixe (2013) ou scientifique (2.013e+3))variable

Format de paquet

Le format des paquets de Centreon Broker n’introduit que 16 octets d’en-tête pour transmettre chaque événement de supervision (généralement environ 100-200 octets chacun). Les champs sont fournis au format Big Endian.

ChampTypeDescription
checksumentier court non signéCRC-16-CCITT X.25 de la taille, de l’ID, de la source et de la destination. La somme de contrôle peut être utilisée pour récupérer un paquet de données incomplet envoyé dans le flux en laissant tomber les octets un par un.
sizeentier court non signéTaille du paquet, hors en-tête.
identier non signéID de l’événement.
source_identier non signéL’ID de l’instance source de cet événement.
destination_identier non signéL’ID de l’instance de destination de cet événement.
dataDonnées utiles.

Ici, la seule différence entre BBDO 3 et les versions précédentes est le contenu des données. Dans BBDO 3, cette partie est un objet Protobuf sérialisé alors que dans les versions précédentes, il s’agit de données sérialisées comme expliqué dans la section Types.

ID de paquet

Comme nous l’avons vu dans le paragraphe précédent, chaque paquet contient un ID qui exprime par lui-même la façon dont les données sont encodées. Cet ID peut être divisé en deux composants de 16 bits. Les 16 bits les plus significatifs sont la catégorie d’événement et les 16 bits les moins significatifs sont le type d’événement.

Les catégories d’événements sérialisent les propriétés des événements l’une après l’autre, l’ordre est donc très important pour ne pas perdre le fil lors de la désérialisation des événements.

Catégories d’événements

Les catégories actuellement disponibles sont décrites dans le tableau ci-dessous.

Catégoriemacro APIValeurDescription
NEBBBDO_NEB_TYPE1Événements classiques de supervision (hôtes, services, notifications, gestionnaires d’événements, exécution des plugins, ...).
BBDOBBDO_BBDO_TYPE2Catégorie interne au protocole BBDO.
StorageBBDO_STORAGE_TYPE3Catégorie liée à la création de graphiques RRD.
CorrelationBBDO_CORRELATION_TYPE4Corrélation d’état (obsolète).
DumperBBDO_DUMPER_TYPE5Événements de dumper (utilisés uniquement pour les tests).
BamBBDO_BAM_TYPE6Événements BAM.
ExtcmdBBDO_EXTCMD_TYPE7Commandes externes de Centreon Broker (obsolète).
InternalBBDO_INTERNAL_TYPE65535Réservé à l’usage interne du protocole.

NEB

Le tableau ci-dessous répertorie les types d’événements disponibles dans la catégorie NEB. Ils doivent être combinés avec la catégorie BBDO_NEB_TYPE pour obtenir un ID d’événement BBDO.

TypeValeur
Pb Service27
Pb Adaptive Service28
Pb Service Status29
Pb Host30
Pb Adaptive Host31
Pb Host Status32
Pb Severity33
Pb Tag34

Storage

Le tableau ci-dessous répertorie les types d’événements disponibles dans la catégorie Storage. Ils doivent être combinés avec la catégorie BBDO_STORAGE_TYPE pour obtenir un ID d’événement BBDO.

TypeValue
Pb Rebuild Message7
Pb Remove Graph Message8
Pb Metric9
Pb Status10
Pb Index mapping11
Pb Metric mapping12

BBDO

Le tableau ci-dessous répertorie les types d’événements disponibles dans la catégorie BBDO. Ils doivent être combinés avec la catégorie BBDO_BBDO_TYPE pour obtenir un ID d’événement BBDO.

TypeValeur
Pb ack8
Pb stop9

BAM

Le tableau ci-dessous répertorie les types d’événements disponibles dans la catégorie BAM. Ils doivent être combinés avec la catégorie BBDO_BAM_TYPE pour obtenir un ID d’événement BBDO.

TypeValeur
Pb Inherited Downtime18
Pb BA status19
Pb BA event20
Pb KPI event21
Pb Dimension BV Event22
Pb Dimension BA BV Relation Event23
Pb Dimension Timeperiod24
Pb Dimension BA Event25
Pb Dimension KPI Event26
Pb KPI status27
Pb BA Duration Event28
Pb Dimension BA Timeperiod Relation29
Pb Dimension Truncate Table Signal30

Établissement de la connexion

BBDO est un protocole qui peut négocier des fonctionnalités. Lors de l’établissement d’une connexion, un message welcome est envoyé par le client. Il fournit la version du protocole BBDO qu’il supporte et ses extensions. Le serveur répond à ce message par un autre message welcome contenant sa propre version du protocole supportée et ses extensions. Si les versions du protocole correspondent, la négociation des extensions commence.

Actuellement, deux extensions sont supportées : TLS et COMPRESSION. Juste après le message welcome, chaque pair recherche dans la liste des extensions de l’autre pair les extensions qu’il supporte. Lorsqu’il en trouve une, elle est activée (c’est-à-dire qu’elle démarre immédiatement).

Exemple

Prenons C le client et S le serveur. Les étapes suivantes sont effectuées de manière séquentielle.

  • C initie une connexion TCP avec S et la connexion est établie.
  • C envoie un message welcome avec les attributs suivants
    • protocole majeur : 1
    • protocole mineur : 0
    • protocole correctif : 0
    • extensions : « TLS COMPRESSION »
  • S envoie son propre message welcome en réponse à C
    • protocole majeur : 1
    • protocole mineur : 0
    • protocole correctif : 0
    • extensions : « TLS COMPRESSION »
  • C et S déterminent les extensions qu’ils ont en commun (ici TLS et COMPRESSION)
  • si l’ordre est important, les extensions sont appliquées dans l’ordre fourni par le serveur
  • la connexion TLS est initiée, le handshake est effectué...
  • la connexion de compression est ouverte
  • les données transmises entre C et S sont maintenant à la fois chiffrées et compressées

Acquittement

Les clients/serveurs dits « intelligents » peuvent acquitter les paquets qui leur sont envoyés. Cette fonction est utilisée par Centreon Broker pour s’assurer que chaque paquet est pris en compte et pour lancer la procédure de rétention au cas où l’autre partie ne répondrait pas.

Pour cela, l’autre partie doit envoyer périodiquement un paquet BBDO « ack » sur le même canal TCP. Ce paquet comporte le numéro du paquet acquitté par le client.

Les modes « Clever »/« Dumb » sont configurés sur chaque sortie TCP, pour chaque Broker.