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/amount or DOM selector doc > amount
  • Aby uzyskać konkretny wiek Johna, możesz go wybrać przez //doc/user[@name='John']/@age lub za pomocą rozszerzonego selektora DOM doc > user[name='John'] | age
Parser danych XPath

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 JSONPAth

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));

Prosty skrypt

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'));
XML Parsing

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'));
JSON Script

datadomhtmljsonpathparserparsingxmlxpath