Zabbix template item via json file

Pagina: 1
Acties:

Vraag


Acties:
  • 0 Henk 'm!

  • The-Source
  • Registratie: Augustus 2001
  • Laatst online: 07:56
Ik heb al een werkende template gemaakt die data uit een json file haalt.

De uitdaging zit is dat de data die retour komt als array wordt geleverd maar per host kan de array lengte verschillen.
Waar de ene host een array stuur van 7 items kan een andere 11 items sturen die op alfabetische volgorde zijn gevuld dus de extra items staan er tussenin.
Nu gebruik ik om de juiste code die ik wel gebruiken eruit te vissen.
code:
1
$.Applications[0].Status.StatusCode



De Json zit er als volgt uit:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
{"Applications": [
{
"Path": "/pathproduct1",
"Name": "product1",
"Status": {
"StatusDateTime": "2023-05-31T15:35:28.0186245+02:00",
"StatusCode": 0,
"Message": "product1 tekst veld,
"Comment": null,
"Information": null
},
{
"Path": "/pathproduct2",
"Name": "product2",
"Status": {
"StatusDateTime": "2023-05-31T15:35:28.0186245+02:00",
"StatusCode": 0,
"Message": "product2 tekst veld,
"Comment": null,
"Information": null
}]
}


Mijn vraag is dus concreet, hoe kan ik wellicht in de pre-processing, wellicht andere plek bijvoorbeeld bijvoorbeeld er voor zorgen dat ik niet een statisch array positie opgeef maar een Name kan gebruiken om dan als nog alleen de StatusCode op te halen.

ps Gaat om Zabbix 6.0 maar 6.4 zou hetzelfde moeten werken ;)

Taal fouten inbegrepen ;)
Mijn AI Art YouTube kanaal

Beste antwoord (via The-Source op 01-06-2023 08:11)


  • Spro
  • Registratie: Juli 2014
  • Laatst online: 14-09 16:48
Als ik je goed begrijp zoek je zoiets....

(je JSON voorbeeld klopte niet, die heb ik geparsed naar het volgende)
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
{"Applications": [
{
"Path": "/pathproduct1",
"Name": "product1",
"Status": {
"StatusDateTime": "2023-05-31T15:35:28.0186245+02:00",
"StatusCode": 0,
"Message": "product1 tekst veld",
"Comment": null,
"Information": null
}},
{
"Path": "/pathproduct2",
"Name": "product2",
"Status": {
"StatusDateTime": "2023-05-31T15:35:28.0186245+02:00",
"StatusCode": 0,
"Message": "product2 tekst veld",
"Comment": null,
"Information": null
}}]
}


Met deze JSONPath kan je de productnaam aangeven:
code:
1
$[Applications][?(@.Name=='product1')].[Status][StatusCode].first()


Tools die ik gebruik:
https://jsonformatter.curiousconcept.com/ om de json te valideren
https://jsonpath.com/ om het JSONPath te bouwen
(en als ik met sensitieve data werk, gebruik ik Cyberchef om alles binnenshuis te houden)

Uiteraard kan je dit ook in een LLD rule mikken, en vanaf daar weer alle corresponderende items aan te maken, dan hoef je er nooit meer over na te denken 8)

Alle reacties


Acties:
  • 0 Henk 'm!

  • Hero of Time
  • Registratie: Oktober 2004
  • Laatst online: 17-09 21:10

Hero of Time

Moderator LNX

There is only one Legend

Wat gebruik je om de JSON te parsen voor Zabbix? Ik ken namelijk het commando 'jq' om JSON te parsen en hoewel ik er geen directe ervaring mee heb, lijkt het mij dat die wel op zaken als name kan zoeken en verwerken.

Commandline FTW | Tweakt met mate


Acties:
  • Beste antwoord
  • 0 Henk 'm!

  • Spro
  • Registratie: Juli 2014
  • Laatst online: 14-09 16:48
Als ik je goed begrijp zoek je zoiets....

(je JSON voorbeeld klopte niet, die heb ik geparsed naar het volgende)
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
{"Applications": [
{
"Path": "/pathproduct1",
"Name": "product1",
"Status": {
"StatusDateTime": "2023-05-31T15:35:28.0186245+02:00",
"StatusCode": 0,
"Message": "product1 tekst veld",
"Comment": null,
"Information": null
}},
{
"Path": "/pathproduct2",
"Name": "product2",
"Status": {
"StatusDateTime": "2023-05-31T15:35:28.0186245+02:00",
"StatusCode": 0,
"Message": "product2 tekst veld",
"Comment": null,
"Information": null
}}]
}


Met deze JSONPath kan je de productnaam aangeven:
code:
1
$[Applications][?(@.Name=='product1')].[Status][StatusCode].first()


Tools die ik gebruik:
https://jsonformatter.curiousconcept.com/ om de json te valideren
https://jsonpath.com/ om het JSONPath te bouwen
(en als ik met sensitieve data werk, gebruik ik Cyberchef om alles binnenshuis te houden)

Uiteraard kan je dit ook in een LLD rule mikken, en vanaf daar weer alle corresponderende items aan te maken, dan hoef je er nooit meer over na te denken 8)

Acties:
  • 0 Henk 'm!

  • The-Source
  • Registratie: Augustus 2001
  • Laatst online: 07:56
Hero of Time schreef op woensdag 31 mei 2023 @ 18:59:
Wat gebruik je om de JSON te parsen voor Zabbix? Ik ken namelijk het commando 'jq' om JSON te parsen en hoewel ik er geen directe ervaring mee heb, lijkt het mij dat die wel op zaken als name kan zoeken en verwerken.
gebruik http_agent om data op te halen (raw) en omdat het json is via jsonpath het commando.
suggestie van @Spro ziet er veel belovend uit en ga ik morgen gelijk testen

Taal fouten inbegrepen ;)
Mijn AI Art YouTube kanaal


Acties:
  • 0 Henk 'm!

  • The-Source
  • Registratie: Augustus 2001
  • Laatst online: 07:56
@Spro Je code heeft mij de goede weg op geholpen. Ware het niet dat in Zabbix de notatie net iets anders is
code:
1
$.Applications.[?(@.Name=='product2')].Status.StatusCode.first()

Die LLD rule moet ik wellicht nog wat over nalezen, weet niet zeker of het gaat doen waar ik naar op zoek ben.
Zoek namelijk nog wel een betere implementatie dan welke ik nu gebruikt
Voor 1 host wordt nu voor elk item (11x) dezelfde json file aangeroepen om dan 1 waarde eruit te halen dat lijkt mij nogal inefficient :x

[ Voor 45% gewijzigd door The-Source op 01-06-2023 08:15 ]

Taal fouten inbegrepen ;)
Mijn AI Art YouTube kanaal


Acties:
  • 0 Henk 'm!

  • Spro
  • Registratie: Juli 2014
  • Laatst online: 14-09 16:48
The-Source schreef op donderdag 1 juni 2023 @ 08:11:
@Spro Je code heeft mij de goede weg op geholpen. Ware het niet dat in Zabbix de notatie net iets anders is
code:
1
$.Applications.[?(@.Name=='product2')].Status.StatusCode.first()

Die LLD rule moet ik wellicht nog wat over nalezen, weet niet zeker of het gaat doen waar ik naar op zoek ben.
Zoek namelijk nog wel een betere implementatie dan welke ik nu gebruikt
Voor 1 host wordt nu voor elk item (11x) dezelfde json file aangeroepen om dan 1 waarde eruit te halen dat lijkt mij nogal inefficient :x
Bracket notation zou moeten werken in Zabbix, maar verbaasd me niets dat er ergens wat fout zat; ik typte hem zo even uit het blote hoofdje weg en had niet getest in Zabbix zelf.

mbt lld rule:
1x http agent item
1x dependent lld rule met daarop item prototype(s) van type dependent. Beide wijzen ze naar dat http agent item. De item prototypes zullen 't nodige aan preprocessing nodig hebben om de juiste values te filteren.

Op die manier krijg je de situatie dat de host 1x ondervraagd wordt, en de rest binnen Zabbix zelf gebeurd :P

[ Voor 4% gewijzigd door Spro op 01-06-2023 09:37 ]

Pagina: 1