Problèmes de mise à niveau

Échappement et éléments associés

Limite de caractères dépassée pour les paramètres de fonction après la mise à niveau

Depuis Zabbix 7.0, une barre oblique inverse dans un paramètre de chaîne entre guillemets d'une fonction d'historique est traitée comme un caractère d'échappement et non comme un caractère littéral.

Lors de la mise à niveau depuis une version antérieure à la 7.0, ces barres obliques inverses sont doublées afin que la fonction reçoive la même valeur qu'auparavant. Par exemple, find(/host/key,,"regexp","error \d+") devient find(/host/key,,"regexp","error \\d+"). Cela entraîne des paramètres plus longs et peut provoquer la rupture des fonctions de déclencheur lorsque la longueur du paramètre dépasse 255 caractères.

Pour éviter ce problème, déplacez manuellement les paramètres longs dans des macros utilisateur avant ou après la mise à niveau, comme indiqué dans l'exemple ci-dessous.

Pour faciliter la lecture, les longues séquences de barres obliques inverses dans l'exemple ci-dessous sont représentées par des espaces réservés. Chaque espace réservé représente le nombre indiqué de caractères barre oblique inverse écrits les uns à la suite des autres, sans espaces (par exemple, <3 backslashes> signifie \\\).

Supposons que, dans Zabbix 6.0, vous disposez de ce qui suit :

  • Un élément vfs.file.contents[/tmp/ONE] qui lit le fichier /tmp/ONE, lequel contient 114 barres obliques inverses suivies de a :
<114 backslashes>a
  • Calculated_item_228 et Trigger_228 qui utilisent une expression recherchant 114 barres obliques inverses suivies de a (dans les expressions régulières, \\ représente une barre oblique inverse littérale) :
find(/Zabbix server/vfs.file.contents[/tmp/ONE],1m:now,"regexp","<228 backslashes>a")
  • Calculated_item_232 et Trigger_232 qui utilisent une expression recherchant 116 barres obliques inverses suivies de a :
find(/Zabbix server/vfs.file.contents[/tmp/ONE],1m:now,"regexp","<232 backslashes>a")

Avec cette configuration :

  • Calculated_item_228 renvoie 1 et Trigger_228 passe à l'état PROBLEM, car le fichier contient les 114 barres obliques inverses suivies de a recherchées par l'expression.
  • Calculated_item_232 renvoie 0 et Trigger_232 reste à l'état OK, car le fichier contient seulement 114 barres obliques inverses, tandis que l'expression en recherche 116.

Lors de la mise à niveau vers Zabbix 8.0, le serveur Zabbix consignera un avertissement pour chaque paramètre de fonction de déclencheur trop long pour être converti (recherchez MANUAL INTERVENTION IS REQUIRED dans le journal pour trouver tous les paramètres concernés). Par exemple, l'avertissement suivant sera consigné pour Trigger_228 :

2485502:20250228:115442.236 DBpatch_6050165(): cannot save in DB function parameter: resulting size 477 is longer than the maximum 255.
functionid:33792 function:'find'
used on host: 'Zabbix server'
  in trigger: 'Trigger_228'.
Current parameter value:
'$,1m:now,"regexp","<228 backslashes>a"'
Resulting escaped value would be:
'$,1m:now,"regexp","<456 backslashes>a"'
DB upgrade and Zabbix server can continue to run, but to make sure this function works correctly
MANUAL INTERVENTION IS REQUIRED !
Need to manually reduce the size of this parameter with macro as a workaround.

Après la mise à niveau, les éléments calculés fonctionneront comme auparavant (par exemple, 228 barres obliques inverses deviendront 456). Cependant, les deux déclencheurs passeront à l'état PROBLEM, car leurs paramètres n'ont pas été convertis. Zabbix 8.0 lit chaque paire de barres obliques inverses comme une seule, et l'expression régulière les réduit encore de moitié : Trigger_228 recherche 57 barres obliques inverses suivies de a, et Trigger_232 en recherche 58. Le fichier contient 114 barres obliques inverses suivies de a, les deux motifs y sont donc trouvés.

Pour corriger ce problème, déplacez les valeurs longues dans des macros utilisateur :

Macro Value
{$228_BACKSLASHES_A} <228 backslashes>a
{$232_BACKSLASHES_A} <232 backslashes>a

Utilisez ensuite les macros dans les expressions de Trigger_228 et Trigger_232 :

find(/Zabbix server/vfs.file.contents[/tmp/ONE],1m:now,"regexp",{$228_BACKSLASHES_A})
find(/Zabbix server/vfs.file.contents[/tmp/ONE],1m:now,"regexp",{$232_BACKSLASHES_A})

Désormais, seul Trigger_228 passera à l'état PROBLEM, comme avant la mise à niveau. Les éléments calculés n'ont pas besoin d'être modifiés, mais vous pouvez les mettre à jour de la même manière pour assurer la cohérence.