Instalación de Cacti en openSUSE 15.1

Cacti es una herramienta que ofrece una solución completa para el análisis de redes y equipos, su uso en tareas de monitoreo está ampliamente extendido y es capaz de generar potentes gráficos mediante la plataforma RRDtools.

En este artículo se documentarán todos los pasos a seguir para instalar la versión 1.2.5 de Cacti en openSUSE 15.1, incluyendo también los pasos para instalar nuevos complementos que permiten agregar nuevas funcionalidades a la herramienta.

Queda a cargo de los lectores investigar y aprender a usar la herramienta, y la manera de sacar el mayor provecho a la misma. Pueden visitar el artículo sobre Cacti en wikipedia o su página oficial (cuyo enlace se encuentra al final de este artículo) para obtener mayor información acerca de la misma.

Requisitos

  1. Para comenzar primero tenemos que instalar y configurar el motor de base de datos MariaDB, para lo cual les recomiendo seguir la guía que escribí recientemente y que la pueden consultar aquí.

  2. A continuación se necesitan tener instalados los siguientes paquetes:
    apache2
    apache2-mod_php7
    rrdtool
    php7
    php7-mysql
    php7-snmp
    php7-gmp
    php7-ldap
    php7-openssl
    php7-sockets
    php7-posix
    net-snmp
    
    Para instalar los paquetes con zypper tenemos que ejecutar el siguiente comando:
    testsrv:~ # zypper in apache2 apache2-mod_php7 rrdtool php7 php7-mysql php7-snmp php7-gd php7-gettext php7-gmp php7-ldap php7-openssl php7-sockets php7-posix net-snmp
    


Instalación de la herramienta

Los pasos que se siguieron para instalar esta herramienta de monitoreo son los siguientes:
  1. Lo mejor es descargar la última versión desde el propio sitio web de Cacti:
    testsrv:~ # cd /srv/www
    testsrv:/srv/www/cacti # wget https://www.cacti.net/downloads/cacti-1.2.5.zip
    testsrv:/srv/www/cacti # unzip cacti-1.2.5.zip
    testsrv:/srv/www/cacti # mv cacti-1.2.5/ cacti
    testsrv:/srv/www/cacti # rm cacti-1.2.5.zip
    
  2. El siguiente paso consiste en crear en el motor de base de datos MariaDB una nueva base de datos para la herramienta Cacti.
    testsrv:~ # mysqladmin -u root -p create cacti
    
  3. Nos conectamos a la base de datos MariaDB con el usuario root para cambiar el juego de caracteres a UTF8, crear un nuevo usuario denominado cactiuser y otorgarle los permisos necesarios para acceder y modificar el contenido de la base de datos cacti creada en el punto dos.
    testsrv:~ # mysql -u root -p mysql
    
    Reading table information for completion of table and column names
    You can turn off this feature to get a quicker startup with -A
    
    Welcome to the MariaDB monitor.  Commands end with ; or \g.
    Your MariaDB connection id is 4601
    Server version: 10.2.22-MariaDB openSUSE package
    
    Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
    
    Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
    
    MariaDB [mysql]> ALTER DATABASE cacti CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
    Query OK, 0 rows affected (0.00 sec)
    
    MariaDB [mysql]> GRANT ALL ON cacti.* TO cactiuser@localhost IDENTIFIED BY 'contraseña_para_cactiuser';
    Query OK, 0 rows affected (0.00 sec)
    
    MariaDB [mysql]> GRANT SELECT ON mysql.time_zone_name TO cactiuser@localhost;
    Query OK, 0 rows affected (0.00 sec)
    
    MariaDB [mysql]> flush privileges;
    Query OK, 0 rows affected (0.00 sec)
    
    MariaDB [mysql]> exit
    Bye
    
  4. Luego cargamos registros relacionados con la configuración de timezones para MariaDB e importamos la base de datos inicial para la herramienta Cacti:
    testsrv:~ # mysql -u root -p mysql < /usr/share/mariadb/mysql_test_data_timezone.sql
    testsrv:~ # mysql -u root -p cacti < /srv/www/cacti/cacti.sql
    
  5. Editamos el archivo config.php ubicado en el directorio /srv/www/cacti/include,
    testsrv:~ # vim /srv/www/cacti/include/config.php
    
    y a continuación configuramos el tipo de base de datos ($database_type), la base de datos por defecto a ser utilizada por la herramienta ($database_default), el nombre del host en la cual se encuentra la base de datos ($database_hostname) y la definición del nombre del usuario y su respectiva contraseña con el cual Cacti se conectará a su base de datos ($database_username y $database_password). Por otro lado, en el caso de que hayamos modificado el número de puerto por defecto en el que el motor de base de datos MariaDB atiende las peticiones de conexión, tendremos que especificar ese mismo puerto en la directiva $database_port. El archivo config.php deberá quedar similar a lo que sigue:
    $database_type = "mysql";
    $database_default = "cacti";
    $database_hostname = "localhost";
    $database_username = "cactiuser";
    $database_password = "contraseña_de_cactiuser";
    $database_port = "3306";
    
    Realizado lo anterior guardamos los cambios y cerramos el archivo config.php para pasar al siguiente punto de configuración.

  6. En este paso tenemos que aplicar los permisos apropiados para varios directorios. Como la herramienta será ejecutada a través del servicio Apache, debemos asignar a los directorios el usuario/grupo wwwrun/www respectivamente de forma recursiva, para que el servicio pueda leer y escribir en dichos directorios.
    testsrv:~ # chown -Rf wwwrun:www /srv/www/cacti/rra
    testsrv:~ # chown -Rf wwwrun:www /srv/www/cacti/log
    testsrv:~ # chown -Rf wwwrun:www /srv/www/cacti/resource
    testsrv:~ # chown -Rf wwwrun:www /srv/www/cacti/scripts
    testsrv:~ # chown -Rf wwwrun:www /srv/www/cacti/cache/boost
    testsrv:~ # chown -Rf wwwrun:www /srv/www/cacti/cache/mibcache
    testsrv:~ # chown -Rf wwwrun:www /srv/www/cacti/cache/realtime
    testsrv:~ # chown -Rf wwwrun:www /srv/www/cacti/cache/spikekill
    
  7. A continuación creamos un archivo para la herramienta Cacti en el directorio /etc/cron.d y luego lo editamos:
    testsrv:~ # touch /etc/cron.d/cacti
    testsrv:~ # vi /etc/cron.d/cacti
    
    Una vez abierto le agregamos el siguiente contenido:
    # Ejecución de la graficación de Cacti cada cinco minutos.
    */5 * * * * wwwrun php /srv/www/cacti/poller.php > /dev/null 2>&1
    
    Finalmente guardamos los cambios y reiniciamos el servicio cron.
    testsrv:~ # systemctl restart cron
    
  8. También tenemos que configurar las directivas memory_limit, max_execution_time y date.timezone de PHP7 que afecta el despliegue de las fechas y horas en Cacti. Comenzamos por editar el archivo php.ini del directorio /etc/php7/apache2:
    testsrv:~ # vi /etc/php7/apache2/php.ini
    
    En el archivo buscamos las directivas memory_limit y max_execution_time, y las dejamos como sigue:
    ; Maximum amount of memory a script may consume (128MB)
    ; http://php.net/memory-limit
    ;memory_limit = 128M
    memory_limit = 500M
    
    ; Maximum execution time of each script, in seconds
    ; http://php.net/max-execution-time
    ; Note: This directive is hardcoded to 0 for the CLI SAPI
    ;max_execution_time = 30
    max_execution_time = 60
    
    Finalmente buscamos la directiva date.timezone de la sección [Date] que por defecto está configurada en UTC, la comentamos y justo abajo agregamos la misma directiva pero configurada con el timezone que corresponda para nuestro huso horario, en este ejemplo America/Asuncion (La lista de timezones de PHP se pueden ver en éste enlace).
    [Date]
    ; Defines the default timezone used by the date functions
    ; http://php.net/date.timezone
    ;date.timezone = 'UTC'
    date.timezone = 'America/Asuncion'
    
    Por otro lado, solo la directiva date.timezone configuramos en el archivo de mismo nombre php.ini pero del directorio /etc/php7/cli:
    testsrv:~ # vi /etc/php7/cli/php.ini
    
  9. Luego en el directorio /etc/apache2/conf.d creamos y editamos el archivo de configuración cacti.conf:
    testsrv:~ # touch /etc/apache2/conf.d/cacti.conf
    testsrv:~ # vim /etc/apache2/conf.d/cacti.conf
    
    Y dejamos el contenido del archivo como se detalla a continuación:
    # Cacti - the complete rrdtool-based graphing solution
    # 
    # Allows only localhost by default
    #
    # Allowing cacti to anyone other than localhost should be considered
    # dangerous unless properly secured by SSL
    
    # Make sure, that httpd can read your cacti directories.
    # At minimum, you need
    #    chmod ugo+r -R /your/cacti/dir
    # Make sure to replace with your directories
    
    # When using SELinux, set the following:
    #    chcon -R -h -t httpd_sys_content_t /your/cacti/dir
    # when using SELinux and you private homedir, enable
    #    setsebool -P httpd_enable_homedirs 1
    #    setsebool -P httpd_read_user_content 1
    Alias /cacti /srv/www/cacti
    <Directory /srv/www/cacti>
       # AllowOverride None
       # Order Deny,Allow
       # Deny from all
       # Allow from 127.0.0.1
       # Allow from ::1
       Options Indexes Includes FollowSymLinks
       Require all granted
    </Directory>
    
    # These directories do not require access over HTTP 
    #
    <Directory /srv/www/cacti/cli>
        # Order Deny,Allow
        # Deny from All
        # Allow from None
        AllowOverride none
        Require all denied
    </Directory>
    
  10. En cuanto a la configuración de Apache propiamente dicha, lo primero que debemos hacer es editar el archivo apache2 del directorio /etc/sysconfig:
    testsrv:~ # vi /etc/sysconfig/apache2
    
    Una vez en el archivo nos dirigimos a la sección APACHE_MODULES para verificar que los módulos ssl y php7 estén debidamente habilitados:
    APACHE_MODULES="actions alias auth_basic authn_core authn_file authz_host authz_groupfile authz_core authz_user autoindex cgi dir env expires include log_config mime negotiation setenvif ssl socache_shmcb userdir reqtimeout php7"
    
    También, en el mismo archivo tenemos que asignar a la directiva APACHE_SERVER_FLAGS el valor SSL para habilitar la función en el Apache:
    APACHE_SERVER_FLAGS="SSL"
    
  11. El siguiente paso consiste en verificar que Apache esté correctamente configurado para que escuche en los puertos indicados tanto para el protocolo http, que por defecto usa el puerto 80, como así también para las conexiones seguras bajo el protocolo https que normalmente usa el puerto 443. Para ello abrimos el archivo llamado listen.conf ubicado en el directorio /etc/apache2,
    testsrv:~ # vi /etc/apache2/listen.conf
    
    que debería tener una configuración similar a lo que sigue:
    Listen 80
    
    <IfDefine SSL>
        <IfDefine !NOSSL>
            <IfModule mod_ssl.c>
    
                Listen 443
    
            </IfModule>
        </IfDefine>
    </IfDefine>
    
  12. A continuación generamos un certificado personalizado mediante el comando gensslcert al que le pasamos varios argumentos para enriquecer el contenido del certificado como se muestra a continuación:
    testsrv:~ # gensslcert -N "Este es un Certificado de Ejemplo" -c PY -s It -l HO -o "Gabriel-Corp." -u "Informatica" -n "tdb.gknet.local" -e "contacto(ARROBA)tdb.com" -y 60
    
    Al ejecutar el comando se crearán una serie de archivos inicialmente llamados con el nombre tdb.gknet.local- en los siguientes directorios:
    /etc/apache2/ssl.crt/tdb.gknet.local-ca.crt
    /etc/apache2/ssl.crt/tdb.gknet.local-server.crt
    /etc/apache2/ssl.csr/tdb.gknet.local-server.csr
    /etc/apache2/ssl.key/tdb.gknet.local-ca.key
    /etc/apache2/ssl.key/tdb.gknet.local-server.key
    /srv/www/htdocs/TDB.GKNET.LOCAL-CA.crt
    
  13. A continuación nos dirigimos al directorio de configuración /etc/apache2/vhosts.d y creamos una copia a partir del archivo vhost-ssl.template con el nombre vhost-ssl.conf, que luego lo editamos:
    testsrv:~ # cd /etc/apache2/vhosts.d
    testsrv:/etc/apache2/vhosts.d # cp vhost-ssl.template vhost-ssl.conf
    testsrv:/etc/apache2/vhosts.d # vim vhost-ssl.conf
    
    En el archivo vhost-ssl.conf dejamos las directivas SSLCertificateFile y SSLCertificateKeyFile configuradas como sigue:
    #   You can use per vhost certificates if SNI is supported.
    SSLCertificateFile /etc/apache2/ssl.crt/tdb.gknet.local-server.crt
    SSLCertificateKeyFile /etc/apache2/ssl.key/tdb.gknet.local-server.key
    
  14. Antes de iniciar el servicio Apache2 debemos verificar si el nombre del host se encuentra correctamente definido para nuestra dirección IP en el archivo /etc/hosts:
    testsrv:~ # cat /etc/hosts
    #
    # hosts         This file describes a number of hostname-to-address
    #               mappings for the TCP/IP subsystem.  It is mostly
    #               used at boot time, when no name servers are running.
    #               On small systems, this file can be used instead of a
    #               "named" name server.
    # Syntax:
    #
    # IP-Address  Full-Qualified-Hostname  Short-Hostname
    #
    
    127.0.0.1       localhost
    
    # special IPv6 addresses
    ::1             localhost ipv6-localhost ipv6-loopback
    
    fe00::0         ipv6-localnet
    
    ff00::0         ipv6-mcastprefix
    ff02::1         ipv6-allnodes
    ff02::2         ipv6-allrouters
    ff02::3         ipv6-allhosts
    192.168.1.100   tdb.gknet.local tdb
    testsrv:~ #
    
    Sino está la línea accedemos al apartado de configuración de redes de Yast y configuramos el campo Hostname de la ventana que se muestra a continuación:
    YaST2 - lan @ testsrv
    
     Network Card Setup
     ┌General──Address──Hardware────────────────────────────────────────┐
     │ Device Type             Configuration Name                       │
     │ Ethernet▒▒▒▒▒▒▒▒▒▒▒▒▒â  eth0▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ │
     │( ) No Link and IP Setup (Bonding Slaves) [ ] Use iBFT Values     │
     │( ) Dynamic Address  DHCP▒▒▒▒▒▒▒▒▒▒â  DHCP both version 4 and 6▒â │
     │(x) Statically Assigned IP Address                                │
     │IP Address          Subnet Mask          Hostname                 │
     │192.168.1.100▒▒▒▒▒▒ /24▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ tdb.gknet.local▒▒        │
     │┌Additional Addresses────────────────────────────────────────────┐│
     ││   ┌─────────────────────────────────────────────────────────┐  ││
     ││   │IPv4 Address Label│IP Address│Netmask                    │  ││
     ││   │                                                         │  ││
     ││   └─────────────────────────────────────────────────────────┘  ││
     ││   [Add][Edit][Delete]                                          ││
     │└────────────────────────────────────────────────────────────────┘│
     └──────────────────────────────────────────────────────────────────┘
    [Help]               [Back]               [Cancel]              [Next]
    
    F1 Help  F3 Add  F9 Cancel  F10 Next
    
  15. A continuación verificamos que la configuración del servicio apache2 esté correcta:
    testsrv:~ # apache2ctl configtest
    Syntax OK
    testsrv:~ #
    
    Y luego activamos y reiniciamos el servicio apache2.
    testsrv:~ # systemctl enable apache2
    testsrv:~ # systemctl restart apache2
    
    Una vez iniciado el servicio apache2 podemos verificar si funciona el servicio https de la siguiente manera.
    testsrv:~ # openssl s_client -connect tdb.gknet.local:443
    CONNECTED(00000003)
    depth=0 C = PY, ST = It, L = HO, O = Gabriel-Corp, OU = Informatica, CN = tdb.gknet.local, emailAddress = contacto(ARROBA)tdb.com
    verify error:num=20:unable to get local issuer certificate
    verify return:1
    
    depth=0 C = PY, ST = It, L = HO, O = Gabriel-Corp, OU = Informatica, CN = tdb.gknet.local, emailAddress = contacto(ARROBA)tdb.com
    verify error:num=21:unable to verify the first certificate
    verify return:1
    ---
    Certificate chain
     0 s:/C=PY/ST=It/L=HO/O=Gabriel-Corp/OU=Informatica/CN=tdb.gknet.local/emailAddress=contacto(ARROBA)tdb.com
       i:/C=PY/ST=It/L=HO/O=Gabriel-Corp/OU=CA/CN=tdb.gknet.local/emailAddress=contacto(ARROBA)tdb.com
    ---
    Server certificate
    -----BEGIN CERTIFICATE-----
    MIIEQzCCAyugAwIBAgIBBTANBgkqhkiG9w0BAQsFADCBqjELMAkGA1UEBhMCUFkx
    ..
    ..
    
  16. Luego habilitamos el servicio Apache en el cortafuegos de openSUSE, para ello editamos el archivo /etc/firewalld/zones/public.xml:
    testsrv:~ # vi /etc/firewalld/zones/public.xml
    
    y el contenido debería quedar como se muestra a continuación:
    <zone>
      <short>Public</short>
      <description>For use in public areas. You do not trust the other computers on networks to not harm your computer. Only selected incoming connections are accepted.</description>
      <service name="ssh"/>
      <service name="http"/>
      <service name="https"/>
      <service name="dhcpv6-client"/>
    </zone>
    Guardamos los cambios, salimos del editor y procedemos a reiniciar el cortafuegos con el siguiente comando:
    testsrv:~ # systemctl restart firewalld
    
  17. En este punto ya podemos acceder a la interfaz web de la herramienta Cacti colocando en la barra de direcciones de nuestro navegador favorito la siguiente URL:
    https://nombre_o_ip_servidor/cacti/
    
    Sin embargo, aún nos falta trabajo por hacer que consiste en seguir las instrucciones que nos muestra la interfaz web para culminar la instalación y configuración de la herramienta. En la primera pantalla la herramienta nos solicitará actualizar la contraseña por defecto del usuario admin, que suele ser la palabra admin también:
  18. En el siguiente paso podemos definir el tema y el idioma predeterminado de la herramienta, además de tener que aceptar el acuerdo de la licencia, requisito obligatorio para avanzar al siguiente paso. Presionamos el botón Comenzar para avanzar.
  19. A continuación el asistente nos informará acerca de todas las dependencias que faltan instalar o configurar para que el entorno quede correctamente configurado para la herramienta Cacti. Uno de los casos que se requirió configurar fue el motor de base de datos MariaDB, que por defecto trae las configuraciones mínimas para funcionar pero que son insuficientes para un buen desempeño de la herramienta Cacti.
    En base a la información del asistente de instalación se procedió entonces a configurar el motor de base de datos con los parámetros recomendados. Se comenzó por editar el siguiente archivo de configuración:
    testsrv:~ # vi /etc/my.cnf
    
    En el cual se configuraron las directivas con sus respectivos valores dentro de la sección [mysqld], justo por encima de la sección [mysqld_multi]:
    # Parametros de configuracion para Cacti.
    collation_server = utf8mb4_unicode_ci
    max_heap_table_size = 300M
    tmp_table_size = 100M
    join_buffer_size = 200M
    innodb_buffer_pool_size = 1500M
    innodb_doublewrite = OFF
    innodb_flush_log_at_timeout = 3
    innodb_read_io_threads = 32
    innodb_write_io_threads = 16
    innodb_buffer_pool_instances = 17
    innodb_io_capacity = 5000
    innodb_io_capacity_max = 10000
    
    Finalmente es importante recordar que si instalamos dependencias php y/o configuramos el motor de base de datos MariaDB, tendremos que reiniciar los servicios apache2 y mariadb respectivamente para que los cambios tomen efecto:
    testsrv:~ # systemctl restart apache2
    testsrv:~ # systemctl restart mariadb
    
    Luego de reiniciar los servicios y de refrescar el asistente de instalación web se debería observar que todos los requisitos fueron cumplidos:
  20. En el paso que sigue el asistente nos solicitará seleccionar el tipo de instalación, dejamos la configuración por defecto Nuevo servidor primario y presionamos el botón Siguiente para continuar:
  21. En el siguiente paso el asistente verifica que los permisos de los directorios sean correctos:
  22. En este paso el asistente desplegará un formulario en el que muestra las rutas hacia los distintos directorios y librerías requeridos por la aplicación. Como se podrá ver más abajo en la imagen, el propio sistema informa si las rutas a los directorios son correctas, en el caso del ejemplo no fue necesario realizar ninguna modificación:
  23. El asistente nos permitirá configurar el intervalo de recopilación de información que recomiendo dejar por defecto, sin embargo, recomiendo desactivar la opción de escaneo automático de la red en búsqueda de dispositivos (encerrado en rojo).
  24. En el siguiente paso el asistente nos dejará elegir que plantillas de dispositivos vamos a usar, recomiendo que todos queden marcados como se muestra en la captura que sigue:
  25. Si pasamos al siguiente paso el asistente verificará que la configuración del juego de caracteres sea adecuado en la base de datos y en la configuración de la herramienta Cacti:
  26. Finalmente llegamos al último paso, donde marcamos la opción Confirmar instalación y presionamos el botón Instalar para iniciar el proceso de instalación:
    El asistente de instalación nos mantendrá al tanto con el avance de la misma como se puede observar a continuación:
    Con la siguiente captura el asistente nos estará avisando que el proceso de instalación ha finalizado, podemos presionar el botón Comenzar que nos llevará directamente a la consola principal de la herramienta:

Instalación de plugins

Cacti cuenta con varios plugins que permiten ampliar su funcionalidad y el procedimiento de instalación es muy sencillo.
  1. Antes que nada debemos dirigirnos a la carpeta plugins de Cacti ubicada en el directorio /srv/www/cacti:
    testsrv:~ # cd /srv/www/cacti/plugins
    
  2. En la página de plugins de cacti podemos buscar la URL del complemento que nos interesa instalar, de entre los cuales recomiendo los siguientes:
  3. En el siguiente paso procedemos a descargar ambos complementos con el programa wget para posteriormente descomprimirlos:
    testsrv:/srv/www/cacti/plugins # wget https://github.com/Cacti/plugin_cycle/archive/develop.zip -O cycle.zip
    testsrv:/srv/www/cacti/plugins # unzip cycle.zip
    testsrv:/srv/www/cacti/plugins # mv plugin_cycle-develop cycle
    
    testsrv:/srv/www/cacti/plugins # wget https://github.com/Cacti/plugin_thold/archive/develop.zip -O thold.zip
    testsrv:/srv/www/cacti/plugins # unzip thold.zip
    testsrv:/srv/www/cacti/plugins # mv plugin_thold-develop/ thold
    
  4. Para activar los nuevos complementos nos dirigimos a la consola de administración web de Cacti y seleccionamos la opción Plugins de la barra lateral izquierda. En esta interfaz solo resta instalar y habilitar los plugins presionando los botones Instalar Plugin y Habilitar Plugin respectivamente de la columna Acciones como se muestra en las siguientes capturas:

Observaciones sobre Threshold

  • Si bien esta guía no tiene el propósito de documentar los procedimientos para agregar dispositivos, gráficos y configurar la herramienta Cacti para un entorno de producción, si quisiera hacer una pequeña observación sobre la funcionalidad Threshold proveída por el plugin Thold, y es que he tenido problemas a la hora de configurar la generación de alertas cuando el tráfico de red de un gráfico alcanzaba el valor cero o no disponible (N/D), debido a que la interfaz de red del equipo remoto que se monitoreaba no generaba información por el corte en la red de datos. Luego de investigar bastante en el foro de Cacti, pude idear un workaround que básicamente consiste en lo siguiente:

    Para que las alertas de tipo Warning o Alert se disparen lo que se tiene que hacer es asignarles en principio un valor mínimo en el campo Low Threshold que sea superior a cero; en el ejemplo se usó el valor 1.1, o lo que es lo mismo, 8.8 bits de velocidad. Luego, en el apartado de manipulación de datos se tiene que seleccionar de la lista Data Type el valor RPN Expression, y justo debajo introducir la expresión "|ds:traffic_in|,1,+", donde al tráfico del gráfico asociado (|ds:traffic_in|) se le suma el valor 1 que corresponde a 1 byte (8 bits), así cuando el valor del gráfico sea cero o N/D, la expresión le sumará 1 byte que justo quedará por debajo del umbral mínimo definido en 1.1 bytes, lo que finalmente disparará la alerta.

Fuentes

Comentarios