Ad Widget

Collapse

Sledování procesů ve windows pomocí proc.get

Collapse
X
 
  • Time
  • Show
Clear All
new posts
  • Rudlafik
    Senior Member
    • Nov 2018
    • 144

    #1

    Sledování procesů ve windows pomocí proc.get

    Ahoj

    Mám dotaz nebo problém. testovali jste proc.get a widlích? Moc se m to líbí, ale nejsem si jist zda se myslelo na to, že procesy e widlích mají ve spoustě případů stejný název, tak i stejného uživatele. Možná je to jen moje neschopnost, ale nedostal jsem se dál než, že jsem vygeneroval nový item se jménem služby a uživatele a jeho zapisovanou hodnotou byl text ve kterém byly vypsány všechny metriky stejně se jmenujících a se stejným účtem procesů.

    Zadání:

    Zapisuj handles, konzumaci paměti a cpu u jednotlivých procesů ve windows. Odděluj procesy dle jména, uživatele a pid. Vyhni ce použití skriptů.

    Tak jsem hrábnul po: proc.get[<name>,<user>,<cmdline>,<mode>]

    Dotlačil jsem to do stádia, kdy jsem parametr user prasácky vyměnil za pid, čímž jsem dostal definici dotazu na jedinečnou položku. LDD proměné se do názvu a klíče vyplnili správně, taktéž jsem narval hodnoty do tagů což je také bomba, ale hodnota takto vygenerovaného itemu je [] prázná.

    Přemýšlel jsem zda nejít cestou dependent item, jak z rodičovského objektu v discovery, tak třeba z standardního itemu HTTP a JSON jako dependent item, ale to mi včera v noci asi už nešlo.
    Zkusil jsem Preprocesing tam jsem se také nehnul.

    Nechce se mi jít cestou PS a WMI to je vopruz když vidim, že to kluci, tak hezky v "žabákovi" připravili.

    Zdrojový/rodičovský item v LLD:

    zabbix agent
    key: proc.get

    LLD macros:

    {#CPUTIME_SYSTEM} $.cputime_system
    {#CPUTIME_USER} $.cputime_user
    {#HANDLES} $.handles
    {#NAME} $.name
    {#PAGE_FAULTS} $.page_faults
    {#PID} $.pid
    {#PPID} $.ppid
    {#SID} $.sid
    {#THREADS} $.threads
    {#USER} $.user
    {#VMSIZE} $.vmsize
    {#WKSET} $.wkset

    Item prototype

    name: Proc {#NAME} of {#USER} PID: {#PID}
    type: Zabbix agent
    A - key: proc.get[{#NAME},,,process] ​
    B - key: proc.get[{#NAME},{#USER},,process]
    C - key: proc.get[{#NAME},{#USER},,process]

    tagy:

    Handles {#HANDLES}
    Pid {#PID}
    Workingset {#WKSET}

    Sledovaný případ:
    Sledujme proces CSRSS.EXE, který je ve Windows procesech zobrazen 4x se stejným jménem a uživatelem. Podívejme se, jak se bude ZBX chovat při objevování těchto procesů:

    A - key: proc.get[{#NAME},,,process] ​
    Zde se prostě vrátí hodnota dvou procesů, které mají stejné thready. Tj. zobrazili 2 položky se stejnou hodnotou thread 10 ostatní dvě nejsou zobrazeny thread 9 a 11. V hodnotách u obou jsou uvedeny data ze všech 4 položek.

    B - key: proc.get[{#NAME},{#USER},,process]
    U tohoto klíče se zamaskuje duplicita pod jedním procesem a v hodnotě vygenerovaného itemu se načítá data pro všechny 4 procesy

    C - key: proc.get[{#NAME},{#USER},,process]

    U tohoto klíče se vytvoří správně item pro každý ze 4 procesů se stejným jménem a uživatelem avšak nenaplní se daty - []. Tagy jsou však korektně a správně vyplněny hledanými hodnotami.



    Co je otázkou, jak správně dále rozparsovat textovou informaci u varianty klíče B nebo jak vgenerovat nové itemy z hodnot v tagu u varianty C nebo začít hodnoty tagů ukládat.

    Něco jsem testoval s položkou <cmdline>,​ ale nedostavily se valné výsledky.

    Je tam nějaká cesta k řešení, kterou prostě nevidím? Nezdá se mi, že by vvojářům nedošlo, že procesy ve windows mohou mít stejného uživatele a i jméno a lišit se jen v PID.

    Děkuji za pomoc, radu, nasměrování

    Ruda


    Attached Files
    Last edited by Rudlafik; 31-05-2023, 09:56.
  • Rudlafik
    Senior Member
    • Nov 2018
    • 144

    #2
    Teď mě napadlo to udělat klasicky Item načíst -> a pak discovery -> item prototype
    Last edited by Rudlafik; 31-05-2023, 10:26.

    Comment


    • Rudlafik
      Rudlafik commented
      Editing a comment
      Vyřešeno: Standardním postupem:

      1. Do klasických itemů vytvořit std. item zbx agent a key dát proc.get. Pojmenujeme jej "ITEM"
      2 Vytvořit novou LLD rule dependent item jako rodičovský dát ITEM. Do LLD macro dát komplet níže uvedená makra. Key dát cokoliv co si vymyslíte.
      {#CPUTIME_SYSTEM} $.cputime_system
      {#CPUTIME_USER} $.cputime_user
      {#HANDLES} $.handles
      {#NAME} $.name
      {#PAGE_FAULTS} $.page_faults
      {#PID} $.pid
      {#PPID} $.ppid
      {#SID} $.sid
      {#THREADS} $.threads
      {#USER} $.user
      {#VMSIZE} $.vmsize
      {#WKSET} $.wkset
      3. vytvořit Item prototype např. Number of handlesNm: {#NAME}, Pid: {#PID}, usr: {#USER} zvolit dependent item, ale zde zase základní - ITEM (nikoliv discovery rule! pozor). Key handles[{#HANDLES}], Preprocesing JSONPath - $.[?(@.pid=='{#PID}')].handles.first() a je hotovo.

      teď už jen sbírejte data.
      Last edited by Rudlafik; 01-06-2023, 07:16.
Working...