Parsery danych
Parsery danych przekształcają i analizują dane zewnętrzne i zwracają metryki liczników NetCruncha i obiekty stanu
Parsery danych umożliwiają przekształcanie danych zewnętrznych do formatu JSON NetCruncha opisującego liczniki i obiekty statusu. Istnieje kilka czujników, które mogą wykorzystywać parsery danych do pobierania tych danych ze źródeł zewnętrznych.
Czujniki używające parserów danych
Data File
Ten czujnik może pobierać dane z różnych źródeł, takich jak:
- plik Windows
- HTTP (plik lub strona)
- FTP/S
- SSH (SFTP or Bash)
Generic Agent
Czujnik Generic Agent umożliwia odbieranie danych z zewnętrznego źródła (agenta). Dane mogą być wysyłane w formacie JSON (natywny format NetCruncha) oraz w dowolnym innym formacie, który można przekształcić za pomocą parsera danych NetCruncha.
REST HTTP
Może wysyłać dowolne zapytania HTTP, w tym zapytania niestandardowe (własne), i umożliwia łatwe dodawanie parametrów zapytań URL. Umożliwia także ustawienie niestandardowych (własnych) nagłówków i plików cookie dla zapytania. W połączeniu z parserem danych może pobrać dowolne dane z zewnętrznego źródła.
Parser danych XPath/DOM
Możesz zdefiniować listę liczników i obiektów statusu oraz ścieżki dla każdego z nich. Możesz użyć XPath lub - jeśli lepiej znasz - selektor CSS. Ponieważ selektory CSS są zaprojektowane do wybierania tylko węzłów DOM, rozszerzyliśmy składnię, dodając nazwę atrybutu po znaku '|'.
Przykład
<doc>
<amount>10.2</amount>
<user name="John" age="123"/>
</doc>
Selektory
- Aby uzyskać Amount, możesz użyć selektora XPath
//doc/amountor DOM selectordoc > amount - Aby uzyskać konkretny wiek Johna, możesz go wybrać przez
//doc/user[@name='John']/@agelub za pomocą rozszerzonego selektora DOMdoc > user[name='John'] | age
JSONPath
JSONPath jest podobny do XPath i ma podobne możliwości. W przypadku prostych ścieżek można użyć prostych, kropkowanych ścieżek.
Przykład
{
"main" : {
"temperature" : 10.2,
"humidity" : 66
}
}
Jest to prosty przykład, ale bardzo podobny do rzeczywistych danych dostarczanych przez jeden z publicznych pogodowych API.
- Temperature może być wybrany poprzez
main.temperature - Dla Humidity możemy użyć ścieżki JSONPath
$..humidity
Parser danych skryptowych (JavaScript)
JavaScript jest dobrym rozwiązaniem do analizowania danych, ponieważ możesz używać wyrażeń regularnych i wszystkich możliwości silnika JavaScript (V8) implementującego najnowszy standard języka ECMAScript.
Twój skrypt jest uruchamiany w trybie ścisłym (strict mode) w oddzielnym i piaskowanym (snadboxed) silniku NodeJS i zostaje zabity, jeśli przekroczy limit czasowy. Oprócz zwykłego runtime (nie można załadować żadnych zewnętrznych modułów), udostępniliśmy najbardziej pożądane narzędzia do analizowania formatów danych JSON, XML i HTML.
Konsola testowa
Edytor parsera danych to małe środowisko programistyczne, które umożliwia testowanie skryptu poprzez uruchomienie go w rzeczywistym silniku skryptowym NetCruncha. Możesz podać dane testowe i możesz użyć obiektu konsoli do protokołowania komunikatów do testowania konsoli.
Parametry skryptu i wynik
Twój skrypt otrzymuje dwa parametry:
- data - zawiera dane wejściowe. Może to być tekst, obiekt bufora. To zależy od typu danych, których oczekujesz ze źródła.
- result - obiekt wyniku skryptu, który upraszcza dostarczanie listy liczników i obiektów stanu.
Liczniki
Metryki licznika reprezentują wartości liczbowe obserwowane przez NetCruncha. Jest to jeden z podstawowych elementów składowych NetCruncha.
Ścieżka licznika opisuje:
- Object - jeśli pozostanie puste, jako obiekt zostanie użyty identyfikator czujnika. Opisuje on mierzony obiekt. W terminologii programowania raczej opisuje klasę mierzonego przedmiotu. Na przykład Process, Disk
- Counter - nazwa metryki. Na przykład, Temperature, *% Utilization%.
- Instance - identyfikuje instancję obiektu. Jest opcjonalna. Może to być identyfikator dysku, nazwa procesu itp.
Format ścieżki licznika
<Object>/<Counter>.<Instance>
Przykłady
Process/% Processor Utilization.NCServer.exe
WebSite/Current Visitors
Obiekty statusu
Obiekt statusu opisuje stan monitorowanego obiektu. Może po prostu ciąg znaków lub może bardziej złożone dane. W przeciwieństwie do liczników, nie ma specjalnych wymagań dla nazwy obiektu statusu.
Dobrze znane wartości statusu
- unknown
- ok
- warning
- error
Złożone obiekty statusu
"Disk C:" : {
"value" : "ok",
"message" : "Working fine",
"retain" : 5,
"critical": true,
"data" : {
"type" : "SDD",
"upTimeSec" : 123431
}
}
Obiekt statusu może zawierać pola takie jak:
-
Value - wartość statusu, która może być dowolnym ciągiem znaków, ale jeśli jedna z użytych wartości jest standardowa, NetCrunch będzie mógł użyć tej wartości do wyliczenia warunków alertowych. Pole jest wymagane, aby rozpoznać obiekt statusu, w przeciwnym razie cały obiekt będzie traktowany jako ciąg tekstowy. Standardowe wartości to: ok, error, warning, disabled, unknown,
-
Name - nazwa obiektu, która nie musi być unikalna (opcjonalne)
- Message - może to być komunikat opisujący stan (na przykład komunikat o błędzie) (opcjonalne)
- Received - czas, kiedy status został odczytany (opcjonalne)
- Retain - jak długo status będzie ważny, jeśli nie otrzyma nowego statusu. Po upływie tego czasu status staje się unknown
- Class - klasa statusu. Jeśli określono, historia stanu zostanie zapisana w bazie danych. Klasa pomaga interfejsowi zrozumieć dane związane ze statusem i odpowiednio je wyświetlić.
- Data - niestandardowe dane. Może to być dowolny obiekt JSON, chyba że klasa wskazuje na jedną z dobrze znanych klas. Musi być zgodny z formatem danych klasy.
Dostarczanie wyniku
Wszystkie funkcje wyników mogą być powiązane.
result.counter('Value', 10).counter('Value 2', 20);
result.counter(path,value)
Dodaj wartość licznika do wyniku czujnika.
result.counter('% Utilization', 23.5);
result.counter(obj)
Można dodać wiele liczników jako pojedynczy obiekt.
result.counter( {
"Temperature" : 33,
"Humidity" : 65
});
result.status(name,value[,message])
Po prostu ustaw status obiektu:
result.status('Door 1', 'closed' ).status('Door 2', 'opened');
result.status(obj)
Ustaw złożony status obiektu.
result.status('Light 1', {
value : 'ok',
data : {
color: 'red'
switchedOn : "2018-03-11T22:20:59.903Z"
}
result.error(message)
Możesz ustawić obiekt statusu' @parser', który zmieni status czujnika, ponieważ jego status jest oznaczony jako krytyczny. W ten sposób, jeśli dane nie są zgodne z oczekiwaniami, możesz przekazać błąd do czujnika.
result.error('Missing section')
result.warning(message)
Użyj tego w sytuacji, gdy chcesz zmienićstatus czujnika na 'warning'.
Przykłady
Zakładamy, że znasz ES6, możesz użyć starszej składni, ponieważ JavaScript jest kompatybilny wstecz.
Prosty
Jednym z najprostszych formatów jest po prostu seria wartości bez żadnych nazw oddzielonych przecinkami.
Dane testowe
10.2, 30, 100
Skrypt
data.split(',').forEach((value,ix) => result.counter(`Value ${ix}`, value));
Parsowanie danych XML/HTML
Ponieważ natywnie Javascript nie zawiera parsera XML, dodaliśmy go. Możesz użyć selektora XPath i CSS, aby wybrać elementy lub atrybuty.
Prosty dokument XML
NetCrunch zawiera parser DOM. Możesz go używać na niskim poziomie (zapoznaj się z xmldom.js w Internecie) za pomocą konstruktora DOMParser lub korzystając z wygodnej klasy DOM, którą dla Ciebie przygotowaliśmy.
DOM
doc.nodes(xpath)
zwraca wszystkie elementy pasujące do danej ścieżki XPath.
Przykład
<doc>
<value name="Temp">10.2</value>
<value name="Fan Speed">100.2</value>
</doc>
Skrypt
const doc = new DOM(data);
doc
.nodes('//value')
.map(e => ([e.getAttribute('name'), e.firstChild.data ])
.forEach(([name,value]) => result.counter(name, value));
Powyższy skrypt zwróci wszystkie wartości z właściwymi nazwami jako liczniki.
doc.selectByXPath(path)
zwraca wartości elementów pasujące do ścieżki.
doc.valueByXPath(path)
zwraca pojedynczą (pierwszą) wartość niezależnie od liczby pasujących elementów;
valueByCSS(path)
konwertuje selektor CSS na XPath i wywołuje valueByXPath w celu pobrania pojedynczej wartości; Dodaj nazwę atrybutu za znakiem |, aby wybrać wartość atrybutu.
Na przykład:
val[name='Temperature'] | value
Pozwala po prostu wybrać wartość z następującego elementu:
<val name="Temperature" value="23.5"></val>
cssToXPath(selector)
Ta funkcja przekształca selektor CSS na XPath. Możesz dołączyć nazwę atrybutu za separatorem |, aby wybrać wartość atrybutu.
Na przykład:
val[device='Fan'] | rpm
Parser Dom może być również używany do analizowania dokumentów HTML, nawet jeśli nie są zgodne z XML.
Dane
<doc>
<value1>13.10</value1>
<value2>345</value2>
</doc>
Skrypt
const doc = new DOM(data);
result
.counter('Values/Value 1', doc.valueByXPath('//value1'))
.counter('Values/Value 2', doc.valueByXPath('//value2'));
Selektory CSS
Możesz także użyć znanych selektorów CSS używając doc.selectByCSS
doc.selectByCSS('value1')
Parsowanie danych JSON
JavaScript ma wbudowany analizator składni danych JSON i konwertuje natywne obiekty JavaScript. Twój skrypt może korzystać z dwóch metod uzyskiwania dostępu do atrybutów obiektów.
selectProperty(obj,path)
Wybierz właściwość według wykropkowanej ścieżki.
selectByJSONPath(obj,path)
Wybierz element property według JSONPath.
Przykład
Spróbujmy przeanalizować dane bardzo podobne do danych dostarczanych przez API usługi pogodowej.
Dane
{
"main" : {
"Temperature" : 22,
"Humidity" : 66
}
}
Skrypt
const doc = JSON.parse(data);
result
.counter('Temperature', selectProperty(doc, 'main.Temperature'))
.counter('Humidity', selectByJSONPath(doc, '$..Humidity'));