8 Własne 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.
W tym celu należy utworzyć niestandardową pozycja, 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 systemów plików), możliwe jest zwrócenie większej liczby.
Przykład
Wymagany format ciągu JSON najlepiej zilustrować na przykładzie. Załóżmy, że używasz starego agenta Zabbix 1.8 (takiego, który nie obsługuje klucza vfs.fs.discovery), ale nadal musisz wykrywać systemy plików. Poniżej znajduje się prosty skrypt Perl dla Linuksa, który wykrywa zamontowane systemy plików i zwraca dane w formacie JSON, zawierające zarówno nazwę, jak i typ systemu plików. Jednym ze sposobów jego 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 w nazwach makr LLD to 0-9 , A-Z , _ , . Małe litery nie są obsługiwane w nazwach.
Przykład danych wyjściowych (przeformatowany dla czytelności) pokazano poniżej. JSON dla niestandardowych kontroli 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żywanym w prototypach; alternatywnie można wyodrębnić wartości makr LLD
za pomocą JSONPath {#FSNAME} → $.fsname oraz {#FSTYPE} → $.fstype,
co umożliwia użycie takiego skryptu:
#!/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 danych wyjściowych (przeformatowany dla czytelności) pokazano poniżej.
[
{ "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 możesz określić "{#FSTYPE}" jako makro, a "rootfs|ext3" jako wyrażenie regularne.
Nie musisz używać nazw makr takich jak FSNAME/FSTYPE w niestandardowych regułach LLD; możesz używać dowolnych nazw. Jeśli używany jest JSONPath, wówczas wiersz LLD będzie elementem tablicy, który może być obiektem, ale może też być inną tablicą albo wartością.
Pamiętaj, że w przypadku użycia parametru użytkownika wartość zwracana jest ograniczona do 16 MB. Więcej szczegółów znajdziesz w sekcji limity danych dla wartości zwracanych LLD.