¡Esta es una revisión vieja del documento!
Tabla de Contenidos
Thruk
Introducción
Thruk Monitoring - Es una interfaz web de monitoreo para Nagios, Icinga, Shinken y Naemon. Utiliza como backend MK Livestatus. Está diseñado para ser un reemplazo 'completo' y cubre casi el 100% de los elementos originales. Además añade mejoras adicionales para grandes instalaciones y una mayor facilidad de uso.
Características principales / Ventajas
- Múltiples backends
- Más rápido, sin necesidad de analizar status.dat para cada petición
- Menos uso de la CPU
- Mostrar los datos en vivo, no hay retraso entre el núcleo y la interfaz gráfica de usuario
- Independiente del núcleo de monitoreo, se puede instalar en un host remoto
- Clusterizable, se pueden agrupar hosts
- Cambiar el filtro status.cgi línea
- Búsqueda extendida archivo de registro
- Mejor registro, utiliza Log4perl
- Código HTML válido
- No hay marcos HTML
- Fácil de ampliar con plugins
- 100% Perl (usando catalizador marco)
- Paginación
- Múltiples temas incluidos
- Exportación a Excel para el estado y los archivos de registro
- Menú lateral ajustable
- CLI plugins para testeo
- Guardar búsquedas en marcadores personales
- Herramienta de configuración incluido
- Interfaz móvil incluido
- SLA informes/reportes en formato PDF
- Tiempos de parada Recurrente
- Dashboard completo
- Business Process Addon
Como trabaja
Thruk está escrito en Perl usando el Framework Catalyst. Como Backend se conecta por medio del módulo Perl Monitoring::Livestatus. Thruk se ejecuta como un proceso fastcgi. La Disponibilidad se calcula con el módulo Monitoring::Availability. La autenticación es proporcionada por el servidor web Apache (ejemplo mod_auth_basic, mod_auth_ldap, mod_auth_mysql, …).
Arquitectura
Soporte multisitio
Thruk conecta con tantos sistemas de monitoreo como quiera (pueden ser múltiples instancias de Nagios etc). Incluso se puede combinar instancias Naemon, Nagios, Icinga y Shinken en una vista combinada grande. De esta manera se obtiene la ventaja de varios lugares independientes y todavía tiene una visión general acerca de todas sus instalaciones. Los sitios pueden ser puestos en grupos para una mejor disposición.
Dashboard
El plugin Panorama ofrece una solución flexible para generar un tablero/dashboard. Cada usuario puede crear sus propios cuadros de mando con unos pocos clics y compartirlos con sus colegas. Varios elementos y fondos e imágenes se pueden posicionar libre sin ningún tipo de restricciones. Múltiples Dashboards pueden ser unidos entre sí y conectados a las acciones. Esto permite crear un centro de control propio.
Reportes SLA
El plug-in 'reportes' crea informes SLA completos en formato HTML y PDF que se pueden enviar por correo electrónico a intervalos regulares. Además de que puede convertir cualquier página Thruk en un informe periódico vía E-Mail.
Integración de procesos de negocio BP
El complemento de procesos de negocio permite modelar sus aplicaciones y procesos de negocio. Editor y notificaciones en línea incluidos.
Exportación Excel
La función Favoritos le permite guardar sus búsquedas y añadirlos como su elemento de menú personal. Además de los marcadores, se puede ajustar el menú fácilmente por medio de la configuración en menu_local.conf para todos los usuarios. La exportación de Excel crea archivos reales de Excel que se pueden enviar por correo o utilizarlos para extraer los nombres de host ú otra información.
Herramienta de configuración
La herramienta de configuración hace que sea muy fácil de cambiar la configuración de objetos de monitoreo. También permite realizar cambios rápidos en la configuración de Thruk, así como la gestión de acceso de los usuarios a través de archivos htpasswd o ajustar el archivo cgi.cfg.
Envío de múltiples comandos
Se pueden enviar varios comandos a la vez. Incluso es posible enviar comandos de host y de servicio al mismo tiempo. Cuando se reprogramen los chequeos de hosts y servicios, Thruk esperará hasta que su chequeo sea terminado y mostrará el resultado tan pronto como el chequeo vuelva.
Filtrado simple
Con Thruk es posible cambiar rápidamente su filtro de visualización. Se pueden combinar los filtros múltiples para crear tipos de vistas. También se soporta una búsqueda en Ajax, por lo que no es necesario adivinar los nombres de host o de servicio, además de utilizar el poder de las expresiones regulares.
PNP4Nagios
Cuando su action_url contiene /pnp4nagios/, habrá automáticamente un gráfico en pantalla. Esto otorga una vista rápida sobre el historial de rendimiento. La imagen se vincula a pnp4nagios para obtener información detallada.
Múltiples líneas en la salida del plugin
Cuando su chequeo devuelve varias líneas de salida. Thruk marca la salida en color azul y con un clic sobre ella muestra la salida completa. Esto es especialmente útil para los controles check_multi. Además de eso, los comentarios y los tiempos de parada también tienen una pequeña ventana emergente con sus datos. Así no es necesario abrir la página de host / servicio sólo para ver quien estableció un comentario y cuando hay un tiempo de inactividad o caída.
Mine Map
El Mine Map es la herramienta perfecta para obtener una visión general rápida. Es especialmente útil si se tiene una gran cantidad de servicios comunes a través de los hosts. De lo contrario usar se pueden utilizar hostgroups o servicegroups para obtener buenos resultados. Un filtrado normal es posible también.
Interfaz Móvil
La interfaz móvil da acceso a las cosas más importantes y permite una vista rápida para reconocer problemas.
Instalacion
Hay diferentes formas de instalar Thruk
Por medio de paquetes
Se puede realizar una instalación desde paquetes binarios, es la forma más simple de instalar Thruk.
Hay que descargar los paquetes desde la página de descargas.
Todos los paquetes tienen esta estructura de directorios :
/etc/thruk | Thruks config |
---|---|
/etc/httpd/conf.d/thruk.conf | Apache config |
/usr/share/thruk | shared files |
/usr/lib/thruk/perl5 | Perl libraries |
/var/cache/thruk | temporary files |
/var/lib/thruk | stored user settings |
Luego de la instalación, Thruk estará disponible en http://your_host/thruk/ y tiene un usuario predeterminado 'thrukadmin' con la contraseña 'thrukadmin' configurada. Puede que tenga que cambiar la configuración del servidor. Esto se debe hacer desde el archivo de configuración thruk_local.conf donde todos los ajustes se pueden modificar.
Debian / Ubuntu
#> dpkg -i thruk_1.84_debian6_amd64.deb
En caso de errores de dependencia, ejecutar 'apt-get -f install' y reintentar la orden 'dpkg -i …'.
Centos / Redhat
#> yum install --nogpgcheck thruk-1.84-1.rhel6.x86_64.rpm
Puede que haya que incluir un repositorio externo para el módulo mod_fastcgi. Epel o rpmforge deberían tenerlo.
SLES
#> zypper install thruk-1.84-1.sles11.x86_64.rpm
Es posible que necesite el DVD SDK SLES para incluir dependencias adicionales.
Por medio de código fuente
Una instalación desde el código fuente, a veces puede ser útil si tenemos requisitos especiales de los usuarios.
Requerimientos
Para instalar Thruk desde el código fuente, necesitaremos cumplir las siguientes dependencias en nuestro sistema :
- Perl
- Cliente GIT
- Herramientas de compilación: automake, make, g++, gcc
- Apache Webserver (opcional solo para fastcgi)
Creación de un usuario de ejecución
Deberemos crear los siguientes usuarios y grupos
- Usuario: thruk
- Grupo: thruk
Instalar librerías de Thruk
Todos los módulos Perl requeridos están disponibles desde el repositorio thruk_libs.
%> su - thruk %> cd /tmp %> git clone git://github.com/sni/thruk_libs.git %> cd /tmp/thruk_libs %> make
Ahora todos los módulos requeridos se encuentran en /tmp/thruk_libs/local-lib/dest.
Git Clone Thruk
%> cd /tmp %> git clone https://github.com/sni/Thruk.git %> cd /tmp/Thruk %> ./configure %> make
Mover las librerías de Perl
Deberemos mover las librerías al directorio principal de Thruk
%> mv /tmp/thruk_libs/local-lib/dest/lib/perl5 perl5 ~/Thruk/
Deremos agregar lo siguiente al perfil de usuario, generalmente dentro del archivo .profile.
PERL5LIB=lib:~/Thruk/perl5
Luego deremos reiniciar la sesión de usuario y verificar que la variable $PERL5LIB contiene la ruta correcta.
Finalmente podemo verificar si thruk correra correctamente por medio del siguiente comando :
%> cd ~/Thruk && ./script/thruk
O corriendo el servidor de desarrollo :
%> cd ~/Thruk && ./script/thruk_server.pl
Deberemos abrir el navegador y acceder a http://your_host:3000
Configuración
Deberemos copiar el archivo thruk.conf a thruk_local.conf y ajustar las opciones de livestatus que necesitemos.
%> cp thruk.conf thruk_local.conf
El archivo thruk.conf a menudo sera re-escrito cuando se apliquen actualizaciones. En cambio el archivo thruk_local.conf contiene las configuraciones locales que están por sobre la demás y nunca será sobre-escrito.
Luego habrá que editar el archivo cgi.conf y ajustar las configuraciones que se crean necesarias.
Configuración de Thruk
La configuración de Thruk es principalmente administrada en estos archivos de configuración :
thruk.conf | Configuración default principal de Thruk |
---|---|
thruk_local.conf | Configuración local principal, sobreescribe la default |
cgi.cfg | Naemon/Nagios cgi.cfg |
log4perl.conf | Configuración de logging |
menu.conf | Configuración default de menú de navegación de Thruk |
menu_local.conf | Configuración local de menú de navegación, sobreescribe la default |
thruk.conf
El achivos thruk.conf contiene los valores predeterminados. No debería editar este archivo directamente. Se debe sobrescribir la configuración dentro del archivo thruk_local.conf en su lugar.
thruk_local.conf
El archivo thruk_local.conf es una copia del archivo thruk.conf. Ambos archivos son utilizados por thruk. La idea es que el archivo thruk.conf proporcione los valores predeterminados y el archivo thruk_local.conf reemplace dichos ajustes cuando sea necesario.
Opciones generales
Valor | Descripción | Ejemplo |
---|---|---|
title_prefix | Establecer el prefijo de título para todas las urls, esta parte del texto se antepondrá a todos los títulos de las páginas | title_prefix = Prod |
use_bookmark_titles | Establece el título de la página con el nombre de un marcador | use_bookmark_titles = 1 |
use_dynamic_titles | Utiliza títulos de las páginas más descriptivos | use_dynamic_titles = 1 |
url_prefix | Cambia la ruta URL habitual para Thruk | url_prefix = / |
use_timezone | Cambia la zona horaria respecto de la predeterminada. Sólo usar esta opción si hay problemas con la visualización de timestamps | use_timezone = CET |
mobile_agent | Especifica los user-agent que se redireccionarán al plugin móvil (si está activado) | mobile_agent=iPhone,Android,IEMobile |
default_theme | Tema predeterminado para todos los usuarios | default_theme = Thruk |
first_day_of_week | Primer día de la semana. Se utiliza en los reportes Sunday: 0 Monday: 1 | first_day_of_week = 0 |
report_use_temp_files | Reportes grandes usarán archivos temporales para evitar el uso de memoria. Con report_use_temp_files se puede ajustar la duración en días del reporte que hará uso de archivos temporales. El valor predeterminado es 14 días, así que por ejemplo el informe last31days utilizará archivos temporales, el thisweek no. Se puede desactivar ajustando a 0. | report_use_temp_files = 14 |
report_max_objects | No crear informes con más equipos/servicios que este número. El propósito es no sobrecargar el servidor debido a uso de memoria. Aumente este número si es necesario | report_max_objects = 1000 |
start_page | Este enlace se utilizará como página de inicio | start_page = /thruk/main.html |
home_link | Este enlace se utiliza cada vez que se hace clic en uno de los principales logotipos. Predeterminadamente los logotipos son de Thruk y el enlace le llevará a la página de Thruk | home_link = http://www.thruk.org |
documentation_link | Este enlace es utilizado para acceder a los datos de Documentación | documentation_link = /thruk/docs/ |
all_problems_link | Enlace donde se muestran los problemas detectados | all_problems_link = /thruk/cgi-bin/status.cgi?… |
allowed_frame_links | Patrones de enlaces permitidos a mostrar en el marco de Thruk | allowed_frame_links = http://intranet.my-company.com allowed_frame_links = https://wiki.my-company.com |
Opciones de autorización
Valor | Descripción | Ejemplo |
---|---|---|
can_submit_commands | Permitir que enviar comandos por defecto para todos los contactos | can_submit_commands = 1 |
Configuración de CGI
Configuracion
FAQ
Plugins
Themas
Avanzado
Business Process
Dashboard
Reportes de SLA
Como trabajan
La generación de los reportes SLA consisten en :
- Configuración del reporte
- Plantilla del reporte
- Convertir el reporte HTML en PDF
- Opcionalmente ser envíados por email
Configuración del reporte
Se pueden crear y ajustar las opciones del reporte en la sección de Reportes. El plugin de reportes debe estar habilitado. Luego se debe seleccionar una plantilla para el reporte. Luego de seleccionar la plantilla hay opciones específicas.
Plantillas de reporte
Todas las plantillas usadas para los reportes se almacenan en la siguiente ubicación 'plugins/plugins-enabled/reports2/templates/reports'. Se pueden ajustar o sobreescribir todas las plantillas que sean necesarias dentro del subdirectorio 'reports' o se puede establecer por medio de la opción 'user_template_path'.
Nomenclatura de directorios del agregado de reportes | |
---|---|
reports | Contiene los reportes seleccionables |
comp | Contiene los componentes utilizados por los reportes |
locale | Contiene las opciones de localización |
style | Contiene las hojas de estilo CSS |
Las plantillas fueron desarrolladas utilizando Template::Toolkit documentado en : http://template-toolkit.org/docs/manual/index.html
Conversión
El reporte generado en HTML, puede ser convertido a PDF utilizando wkhtml2pdf con xvfb. Ambas herramientas deben ser instaladas en el mismo equipo que Thruk. Hay una descarga en formato binario de wkhtml2pdf disponible en : http://code.google.com/p/wkhtmltopdf/. Utilizar una version igual o mayor a 0.11.
Envío de reportes por email
Se puede enviar fácilmente reportes de disponibilidad SLA por email. Lo único que se necesita es establecer las opciones de envío en la configuración. También es posible enviar un mismo reporte múltiples veces.
Customized Reports
Los reportes pueden ser personalizados por medio de HTML y CSS. Los reportes en general tiene bloques específicos que detallan los pasos para su producción.
- styles
- edit
- prepare
- render
- mail
Hojas de estilo
Personalizar las hojas de estilos CSS es realmente simple. Para ellos es necesario crear un un archivo 'reports/style/custom.tt' dentro de 'user_template_path'.
Ejemplo :
<style type="text/css"> /* override css styles */ BODY { font-family: arial, sans-serif; font-size: 11px; line-height: 18px; font-size: 16px; } </style> <script language="javascript" type="text/javascript"> /* add complete new elements by javascript */ jQuery(document).ready(function() { jQuery('<img src="' + url_prefix + 'themes/Thruk/images/logo_thruk.png">').insertBefore('DIV.page.cover DIV.titletext'); }); </script>
Si eso no es suficiente, además se puede cambiar cada plantilla utilizada para crear los reportes.
Bloque de edición
El bloque de edición contiene elementos de configuración utilizados para la generación del reporte. El bloque es el encargado de definir la página de configuración que se presenta cuando alguien elige crear o editar un reporte de este tipo. Básicamente este bloque contiene todos los campos obligatorios y opcionales utilizados para el reporte.
Ejemplo :
[% IF block == 'edit' %] [% required_fields = [ { 'host' => [ 'Host', 'hosts', '' , '', 1 ] }, { 'timeperiod' => [ 'Timeperiod', 'rptimeperiod', 'last12months' ] }, ]; %] [% END %]
La clave en hash define el parámetro que definirá dicho valor. Cada campo tiene que apuntar a una matriz con al menos 3 valores. La opción de requerido es opcional.
- Nombre
- Tipo
- Valor por defecto
- Opción de requerido
Bloque de preparación
El bloque de preparación se utiliza para recopilar datos utilizados en el reporte. Por lo general, se ha utilizado para obtener datos sobre la disponibilidad a través livestatus o recuperar eventos de los archivos de registro.
Ejemplo :
[% IF block == 'prepare' %] [% set_unavailable_states(param.unavailable); calculate_availability(); %] [% END %]
Se pueden utilizar las funciones disponibles en http://www.thruk.org/api/Thruk/Utils/Reports/Render.html
Bloque de renderizado
El bloque de renderizado define la disposición del reporte.
Ejemplo :
[% IF block == 'render' %] [% PROCESS 'reports/locale/en.tt' %] [% title = 'Hello World Report' subtitle = r.name coverdetails = [ 'Report Timeperiod:', get_report_timeperiod(start, end, reportDateFormat), 'Host:', param.host, ] %] [% WRAPPER 'reports/comp/report.tt' %] [% WRAPPER 'reports/comp/page_cover.tt' %][% END %] [% WRAPPER 'reports/comp/page_standard.tt' %] <b>hello world</b> [% END %] [% END %] [% END %]
Este reporte contendrá dos páginas. En primero lugar dentro de report.tt definirá el diseño básico del reporte y contendrá las hojas de estilo. Entonces se deberá definir algunos parámetros utilizados por la portada. 'r' es una referencia al objeto del informe, en este ejemplo solo se utiliza como título secundario. 'converdetails' es una lista de nombres/valores, que se utiliza en los detalles a mostrar en la portada. Finalmente tenemos 'Hello World Report' en una página standard. El contenido puede tener etiquetas HTML estándar, como tablas e imágenes también.
Bloque de email
Este bloque define la imagén visual que tendrá el email en el cual se adjuntará el reporte a enviar.
Ejemplo :
[% IF block == 'mail' +%] SUBJECT: Report: [% r.name %] Your report is attached. [% IF r.desc %]Description: [%+ r.desc %][% END %] [%+ END %]
Utilizamos el nombre del reporte 'r.name' como asunto y ponemos la descripción del reporte 'r.desc' en el cuerpo del mensaje.
Renderizado personalizado
Es posible crear un módulo en Perl llamado 'Thruk::Utils::Reports::CustomRender', que estará disponibile automáticamente, por lo que las funciones de dicho módulo se podrán utilizar en las plantillas de reportes.
Menu Customizing
Action Menu
JSON Exporting
Logfile Cache
Logfiles
Server Side Includes
CLI & Scripting
thruk - Utilidad de línea de comandos para la GUI de Monitoreo Thruk
Este script da acceso a diversas partes de la GUI Thruk y permite generar informes de Excel, exportación CSV o cualquier otra URL usando la línea de comandos y sin pasar por el servidor web. Con esta herramienta se hace que sea fácil la forma de enviar reportes periódicos por cron/mail.
Lista de backends disponibles:
%> thruk -l
Exportar el log de evento a un archivo excel:
%> thruk -A thrukadmin -a 'url=/thruk/cgi-bin/showlog.cgi?view_mode=xls' > eventlog.xls
Las urls pueden ser acortadas. Exportar toda la información de servicios de un archivo Excel:
%> thruk 'status.cgi?view_mode=xls&host=all' > allservices.xls
Exportar datos de disponibilidad de servicio a un archivo CSV:
%> thruk -A thrukadmin -a 'url=avail.cgi?host=all&timeperiod=last7days&csvoutput=1' > all_host_availability.csv
Generar reporte pdf:
%> thruk -a 'report=1' > report.pdf
Generar reporte pdf y enviarlo por email:
%> thruk -a 'reportmail=1'
Re-programar el próximo chequeo para el host localhost para ahora:
%> thruk 'cmd.cgi?cmd_mod=2&cmd_typ=96&host=localhost&start_time=now'
CGI Parameter
Modified Attributes
Benchmarks
API
Thruk::Utils::CLI - Utilidades Colección de secuencias de comandos CLI. Permiten acceder a las estructuras internas y cambiar la información de configuración.
Rutas de búsqueda de librerias para el paquete Thruk :
/usr/share/thruk/lib /usr/share/thruk/plugins/plugins-available/conf/lib /usr/lib/thruk/perl5
Ruta de la configuración del Framework Catalyst :
/etc/thruk
Inclusión de los valores de configuración :
use lib qw(/usr/share/thruk/lib /usr/share/thruk/plugins/plugins-available/conf/lib /usr/lib/thruk/perl5); $ENV{ CATALYST_CONFIG } = "/etc/thruk";
Scripts de ejemplo
- list_hosts.pl
#!/usr/bin/perl use Thruk::Utils::CLI; my $cli = Thruk::Utils::CLI->new; my $odb = $cli->get_object_db(); my $hosts = $odb->get_objects_by_type('host'); printf("%-20s %s\n", "Host", "File"); print("===========================================================\n"); for my $h (@{$hosts}) { printf("%-20s %s:%d\n", $h->get_primary_name(), $h->{'file'}->{'display'}, $h->{'line'}); }
- dump_services.pl
#!/usr/bin/perl use Thruk::Utils::CLI; my $states = { '0' => 'Ok', '1' => 'Warning', '2' => 'Critical', '3' => 'Unknown', }; my $cli = Thruk::Utils::CLI->new; my $db = $cli->get_db(); my $services = $db->get_services(); printf("%-20s %-30s %-10s\n", "Host", "Service", "Status"); print("===============================================================\n"); for my $s (@{$services}) { printf("%-20s %-30s %-10s\n", $s->{'host_name'}, $s->{'description'}, $states->{$s->{'state'}}); }
contacts2csv /tmp/object.cache > /tmp/contacts.csv
- contacts2csv.pl
#!/usr/bin/perl use Pod::Usage; use Monitoring::Config; if(!defined $ARGV[0]) { pod2usage( { -verbose => 2, -exit => 3, -message => "\nERROR: missing argument: object.cache\n\n" } ); } if(!-f $ARGV[0]) { pod2usage( { -verbose => 2, -exit => 3, -message => "\nERROR: ".$ARGV[0].': '.$!."\n\n" } ); } my $odb = Monitoring::Config->new({ obj_file => $ARGV[0], 'force' => 1 })->init(); my $contacts = $odb->get_objects_by_type('contact'); my $groups = $odb->get_objects_by_type('contactgroup'); my $def = $odb->get_default_keys('contact', { no_alias => 1, sort => 1 }); # convert groups my $groups_by_contact = {}; for my $g (@{$groups}) { my $name = $g->{'conf'}->{'contactgroup_name'}; for my $m (@{$g->{'conf'}->{'members'}}) { $groups_by_contact->{$m}->{$name} = 1; } } # print header print join(';', map(ucfirst, @{$def})), ";Groups\n"; # print data for my $o (@{$contacts}) { for my $attr (@{$def}) { if(!defined $o->{'conf'}->{$attr}) { print ";"; } else { if(ref $o->{'conf'}->{$attr} eq 'ARRAY') { print join(',', @{$o->{'conf'}->{$attr}}), ";"; } else { print $o->{'conf'}->{$attr}, ";"; } } } my $name = $o->{'conf'}->{'contact_name'}; print join(',', keys %{$groups_by_contact->{$name}}); print "\n"; }
objectcache2csv /tmp/object.cache host > /tmp/hosts.csv
objectcache2csv /tmp/object.cache service > /tmp/hosts.csv
- objectcache2csv.pl
#!/usr/bin/perl use Pod::Usage; use Monitoring::Config; if(!defined $ARGV[0]) { pod2usage( { -verbose => 2, -exit => 3, -message => "\nERROR: missing argument: object.cache\n\n" } ); } if(!defined $ARGV[1]) { pod2usage( { -verbose => 2, -exit => 3, -message => "\nERROR: missing argument: object type\n\n" } ); } if(!-f $ARGV[0]) { pod2usage( { -verbose => 2, -exit => 3, -message => "\nERROR: ".$ARGV[0].': '.$!."\n\n" } ); } my $odb = Monitoring::Config->new({ obj_file => $ARGV[0], 'force' => 1 })->init(); my $objs = $odb->get_objects_by_type($ARGV[1]); my $def = $odb->get_default_keys($ARGV[1], { no_alias => 1, sort => 1 }); # print header print join(';', map(ucfirst, @{$def})), "\n"; # print data for my $o (@{$objs}) { my $first = 1; for my $attr (@{$def}) { if(!defined $o->{'conf'}->{$attr}) { print ";" unless $first; $first = 0; } else { if(ref $o->{'conf'}->{$attr} eq 'ARRAY') { print join(',', @{$o->{'conf'}->{$attr}}), ";"; } else { print $o->{'conf'}->{$attr}, ";"; } } } print "\n"; }
Acerca de la Guía
Esta guía no oficial esta inspirada en la documentación original de Thruk. Está pensada para ir presentando casos de uso que se van dando en la operatoria día a dia.
Thruk es un proyecto muy bueno que me ayuda en mostrar mi trabajo día a día y tiene una comunidad muy activa. Si estas leyendo esto y estas siendo beneficiado por Thruk, te invito a realizar una donación al proyecto