7 Niestandardowe reguły LLD
Przegląd
Możliwe jest również utworzenie całkowicie niestandardowej reguły LLD, wykrywającej dowolny typ encji - na przykład bazy danych na serwerze bazodanowym.
Aby to zrobić, należy utworzyć niestandardową pozycję, która zwraca ciąg JSON, określający znalezione obiekty oraz opcjonalnie - niektóre ich właściwości. Liczba makr na encję nie jest ograniczona - podczas gdy wbudowane reguły wykrywania zwracają jedno lub dwa makra (na przykład dwa dla wykrywania systemu plików), możliwe jest zwrócenie większej liczby.
Przykład
Wymagany format ciągu JSON najlepiej ilustruje przykład.
Załóżmy, że uruchamiamy stary agent Zabbix 1.8 (taki, który nie obsługuje vfs.fs.discovery), ale nadal musimy wykrywać systemy plików.
Poniżej znajduje się prosty skrypt Perl dla systemu Linux, który wykrywa zamontowane systemy plików i zwraca dane w formacie JSON, obejmującym zarówno nazwę systemu plików, jak i jego typ.
Jednym ze sposobów użycia byłoby zastosowanie go jako UserParameter z kluczem vfs.fs.discovery_perl:
#!/usr/bin/perl
$first = 1;
print "[\n";
for (`cat /proc/mounts`)
{
($fsname, $fstype) = m/\S+ (\S+) (\S+)/;
print "\t,\n" if not $first;
$first = 0;
print "\t{\n";
print "\t\t\"{#FSNAME}\":\"$fsname\",\n";
print "\t\t\"{#FSTYPE}\":\"$fstype\"\n";
print "\t}\n";
}
print "]\n";
Dozwolone symbole dla nazw makr LLD to 0-9 , A-Z , _ , .. Małe litery nie są obsługiwane w nazwach.
Przykład jego wyniku (sformatowany ponownie dla czytelności) pokazano poniżej. JSON dla niestandardowych sprawdzeń wykrywania musi mieć ten sam format.
[
{ "{#FSNAME}":"/", "{#FSTYPE}":"rootfs" },
{ "{#FSNAME}":"/sys", "{#FSTYPE}":"sysfs" },
{ "{#FSNAME}":"/proc", "{#FSTYPE}":"proc" },
{ "{#FSNAME}":"/dev", "{#FSTYPE}":"devtmpfs" },
{ "{#FSNAME}":"/dev/pts", "{#FSTYPE}":"devpts" },
{ "{#FSNAME}":"/lib/init/rw", "{#FSTYPE}":"tmpfs" },
{ "{#FSNAME}":"/dev/shm", "{#FSTYPE}":"tmpfs" },
{ "{#FSNAME}":"/home", "{#FSTYPE}":"ext3" },
{ "{#FSNAME}":"/tmp", "{#FSTYPE}":"ext3" },
{ "{#FSNAME}":"/usr", "{#FSTYPE}":"ext3" },
{ "{#FSNAME}":"/var", "{#FSTYPE}":"ext3" },
{ "{#FSNAME}":"/sys/fs/fuse/connections", "{#FSTYPE}":"fusectl" }
]
W poprzednim przykładzie wymagane jest, aby klucze odpowiadały nazwom makr LLD użytym w prototypach; alternatywnie można wyodrębnić wartości makr LLD za pomocą JSONPath {#FSNAME} → $.fsname oraz {#FSTYPE} → $.fstype, co umożliwia taki skrypt:
#!/usr/bin/perl
$first = 1;
print "[\n";
for (`cat /proc/mounts`)
{
($fsname, $fstype) = m/\S+ (\S+) (\S+)/;
print "\t,\n" if not $first;
$first = 0;
print "\t{\n";
print "\t\t\"fsname\":\"$fsname\",\n";
print "\t\t\"fstype\":\"$fstype\"\n";
print "\t}\n";
}
print "]\n";
Przykład jego wyniku (sformatowany ponownie dla czytelności) pokazano poniżej. JSON dla niestandardowych sprawdzeń wykrywania musi mieć ten sam format.
[
{ "fsname":"/", "fstype":"rootfs" },
{ "fsname":"/sys", "fstype":"sysfs" },
{ "fsname":"/proc", "fstype":"proc" },
{ "fsname":"/dev", "fstype":"devtmpfs" },
{ "fsname":"/dev/pts", "fstype":"devpts" },
{ "fsname":"/lib/init/rw", "fstype":"tmpfs" },
{ "fsname":"/dev/shm", "fstype":"tmpfs" },
{ "fsname":"/home", "fstype":"ext3" },
{ "fsname":"/tmp", "fstype":"ext3" },
{ "fsname":"/usr", "fstype":"ext3" },
{ "fsname":"/var", "fstype":"ext3" },
{ "fsname":"/sys/fs/fuse/connections", "fstype":"fusectl" }
]
Następnie w polu "Filter" reguły wykrywania moglibyśmy określić {#FSTYPE} jako makro oraz rootfs|ext3 jako wyrażenie regularne.
Nie musisz używać nazw makr FSNAME/FSTYPE w niestandardowych regułach LLD, możesz użyć dowolnych nazw.
Jeśli używany jest JSONPath, wiersz LLD będzie elementem tablicy, którym może być obiekt, ale może to być również inna tablica albo wartość.
Zwróć uwagę, że jeśli używasz parametru użytkownika, wartość zwracana jest ograniczona do 16 MB. Więcej informacji znajdziesz w sekcji ograniczenia danych dla zwracanych wartości LLD.