ServerAdmin.ru
31.6K subscribers
855 photos
57 videos
23 files
3K links
Авторская информация о системном администрировании.

Информация о рекламе: @srv_admin_reklama_bot
Автор: @zeroxzed

Второй канал: @srv_admin_live
Сайт: serveradmin.ru

Ресурс включён в перечень Роскомнадзора
Download Telegram
​​Хочу посоветовать простой и удобный сервис для тех, кто работает с json. Если не хочется ставить локально различные утилиты для json, например jq, то можно использовать онлайн сервис.

https://jsonlint.com/

Например, есть у вас вот такая колбаса в машиночитаемом формате:

{"result":{"chain":"main","blocks":1206936,"initial_block_download_complete":true,"headers":1206936,"bestblockhash":"0000000000bf1b4a488dc634abbc9f0868dd2f5cc5549f423210b8ec0d5637a7","difficulty":77902739.72413671,"verificationprogress":0.9999957873385094,"chainwork":"00000000000000000000000000000000000000000000000005bdbaed4c3860ce","pruned":false,"size_on_disk":29244718826,"estimatedheight":1206936,"commitments":1543822,"valuePools":[{"id":"sprout","monitored":true,"chainValue":30474.03751237,"chainValueZat":3047403751237},{"id":"sapling","monitored":true,"chainValue":578237.33269554,"chainValueZat":57823733269554}],"softforks":[{"id":"bip34","version":2,"enforce":{"status":true,"found":4000,"required":750,"window":4000},"reject":{"status":true,"found":4000,"required":950,"window":4000}},{"id":"bip66","version":3,"enforce":{"status":true,"found":4000,"required":750,"window":4000},"reject":{"status":true,"found":4000,"required":950,"window":4000}},{"id":"bip65","version":4,"enforce":{"status":true,"found":4000,"required":750,"window":4000},"reject":{"status":true,"found":4000,"required":950,"window":4000}}],"upgrades":{"5ba81b19":{"name":"Overwinter","activationheight":347500,"status":"active","info":"See https://z.cash/upgrade/overwinter/ for details."},"76b809bb":{"name":"Sapling","activationheight":419200,"status":"active","info":"See https://z.cash/upgrade/sapling/ for details."},"2bb40e60":{"name":"Blossom","activationheight":653600,"status":"active","info":"See https://z.cash/upgrade/blossom/ for details."},"f5b9230b":{"name":"Heartwood","activationheight":903000,"status":"active","info":"See https://z.cash/upgrade/heartwood/ for details."},"e9ff75a6":{"name":"Canopy","activationheight":1046400,"status":"active","info":"See https://z.cash/upgrade/canopy/ for details."}},"consensus":{"chaintip":"e9ff75a6","nextblock":"e9ff75a6"}},"error":null,"id":"curltext"}

А вам надо понять, есть тут ошибки или нет, а так же желательно посмотреть все это в человекочитаемом формате. Сервис вам как раз поможет в этом. Отформатирует все и проверит не потерялась ли где скобка или запятая.

Если кто-то знает сервис удобнее и функциональнее, поделитесь ссылкой.

#сервис #json
👍1
​​Делал ранее несколько заметок на тему форматирования json. Формат популярный, приходится постоянно с ним работать. В качестве локальной программы лично я обычно использую jq, если ее нет, то какой-то онлайн сервис. Их много и не принципиально, каким именно пользоваться.

Но оказывается, что отформатировать в удобочитаемый вид json умеет python из коробки. С учетом того, что он присутствует по дефолту почти во всех современных дистрибутивах, ставить что-то со стороны или использовать онлайн сервисы нет никакого смысла.

Я лично не знал и не слышал, пока мне не показали, что можно сделать вот так:

cat file.json | python -m json.tool

Спасибо за подсказку тому, кто это сделал в комментариях.

#json
​​Существует небольшая, но очень полезная утилита в Linux - jo. Она создаёт json вывод из поданных в неё данных. Покажу на условном примере:
# jo name=vova name=sasha name=dima
{"name":"vova","name":"sasha","name":"dima"}

А вот более прикладной пример, который может существенно упростить некоторые проверки в мониторинге. Формируем массив из файлов в директории:
# jo -p -a /backup/mysql/*
[
  "/backup/mysql/daily_mysql_2021-09-28_16h11m_Tuesday.sql.gz",
  "/backup/mysql/daily_mysql_2021-09-29_16h15m_Wednesday.sql.gz",
  "/backup/mysql/daily_mysql_2021-09-30_16h14m_Friday.sql.gz"
]

Можно этот же массив предварительно отсортировать по дате с помощью ls:
# ls -t | jo -p -a
Свежие файлы будут отображаться первыми. Потом с помощью JSONPath $[0] можно получить имя самого свежего файла или самого старого: $[-1:].

Ещё практический пример. Массив процессов на хосте сразу с исключением дублей:
# ps ax | awk '{print $5}' | jo -a -p | uniq
[
.....
  "/usr/bin/newrelic-infra-service",
  "/usr/bin/newrelic-infra",
  "/bin/sh",
  "/usr/sbin/mysqld",
  "/usr/sbin/sshd",
  "/usr/sbin/rpc.mountd",
  "/usr/sbin/rpc.idmapd",
......
]

В зависимости от ключей ps можно формировать нужный список с различными сортировками.

Можно сразу же сформировать данные для LLD правил автообнаружения Zabbix:
# jo -a {#DOMAIN}:ya.ru {#DOMAIN}:r0.ru
["{#DOMAIN}:ya.ru","{#DOMAIN}:r0.ru"]
Не надо заморачиваться на баше с проставлением запятых и скобок.

Утилита jo, наравне с jq, однозначно пригодится тем, кто много работает с JSON. К тому же живёт в базовых репах и без проблем устанавливается:
# apt install jo
# dnf install jo

Исходники - https://github.com/jpmens/jo

#bash #linux #zabbix #json
👍69👎3
​​Много раз уже мельком в тематических заметках упоминал про инструмент, которым постоянно пользуюсь. Решил оформить отдельной заметкой, чтобы больше людей обратило внимание. Речь пойдёт о JSONPath Online Evaluator, который есть в виде публичного сервиса, и в виде исходников для установки где-то у себя.

Это простой и наглядный сервис для работы с JSON. Мне он нужен ровно для одной цели - вытаскивать значения с помощью JSONPath для предобработки в Zabbix. JSON очень популярный формат, так что работать с ним приходится постоянно. Возможность предобработки в Zabbix очень сильно упростила настройку мониторинга.

Раньше всё это обрабатывать в скриптах приходилось, но времена сие давно прошли, хотя куча скриптов с тех времён так и осталась. Но сейчас, если настраиваю что-то новое, то по максимум использую встроенную предобработку.

Если есть что-то лучше для этих же задач, поделитесь информацией.

#json
👍38👎3
Какой системный администратор Linux не любит хорошенько грепнуть? Это очень полезный навык, который осваиваешь практически сразу, как начинаешь работать в консоли и тем более писать какие-то скрипты. Но есть формат json, который бессмысленно грепать, потому что с большой вероятностью получишь не то, что тебе надо, так как там все данные либо в одной строке, либо построчно иерархически разбиты.

Какой-то добрый человек решил спасти системных администраторов из прошлого и придумал утилиту, которая позволяет успешно грепать json - gron. Лозунг программы - Make JSON greppable!

Покажу на примере, зачем она может понадобиться. У меня есть статья по мониторингу посещаемости сайтов, где данные берутся из Яндекс.Метрики в формате json. Беру обрезанный кусок json, для наглядного примера:
{
 "query" : {
  "ids" : [ 23506456 ],
  "dimensions" : [ "ym:s:searchEngine" ],
  "metrics" : [ "ym:s:users", "ym:s:visits", "ym:s:pageviews" ],
  "sort" : [ "-ym:s:users" ],
},
"data" : [ {
  "dimensions" : [ "ym:s:searchEngine" ],
  "metrics" : [ 2117.0, 2450.0, 3211.0 ]
 } ]
}

Вам надо выхватить все значения из data Так просто их не грепнешь в один присест. А через gron очень просто:
# curl ....... | gron | grep data
json.data = [];
json.data[0] = {};
json.data[0].dimensions = ["ym:s:searchEngine"];
json.data[0].metrics = [];
json.data[0].metrics[0] = 2147.0;
json.data[0].metrics[1] = 2489.0;
json.data[0].metrics[2] = 3271.0;
json.data_lag = 0;

Получили список всех значений data в построчном формате. При желании грепается любое конкретное значение (не забываем про экранирование):
# curl ....... | gron | grep "data\[0\].metrics\[2\]"
json.data[0].metrics[2] = 3271.0;

Эта утилита для тех, кто по какой-то причине не может или не хочет использовать jsonpath в jq. С его помощью какое-то одно конкретное значение вытащить гораздо проще:

# curl ....... | jq '.data[].metrics[2]'
3271.0

Конкретно в данном примере gron не особо нужен. Это просто первое, что в голову пришло. Им будет удобно грепнуть очень большую лапшу json, которая прилетит к вам в терминал. А это обычное дело. Например, когда я настраивал мониторинг ZONT, мне в консоль вываливалась такая лапша, что на экран не помещалась.

Также с помощью gron удобно сравнить два json:
# diff <(gron first.json) <(gron second.json)
7c3
< json.data[0].metrics[2] = 3271.0;
---
> json.data[0].metrics[2] = 3531.0;

Исходники - https://github.com/tomnomnom/gron

#json
👍65👎5
У меня накопилось много заметок по поводу работы с JSON. Решил сделать подборку, что собрать информацию в одном месте. С этим форматом постоянно приходится работать, так что, думаю, будет полезно. Можно в закладки забрать.

обзорная статья по работе с json в zabbix
jq - утилита для преобразования однострочных json в удобочитаемый вид, а также для получения значений через jsonpath
онлайн сервис JSONLint для проверки синтаксиса
форматирование json в удобочитаемый вид с помощью python
онлайн сервис hcl2json для конвертации форматов json, yaml и hcl друг в друга
jo - консольная утилита, создаёт json из поданных в неё данных. Умеет, к примеру, список файлов в директории оборачивать в json или вывод какой-нибудь консольной команды, типа ps.
онлайн сервис JSONPath для извлечения данных из json
gron - консольная утилита, которая превращает json в текст, к которому можно эффективно применить утилиту grep. То есть делает json грепабельным. 

#json
👍61👎3
​​Делюсь с вами информацией об очень полезной консольной утилите JC. С её помощью можно поток данных из стандартных команд Linux конвертировать в json. Покажу сразу на простом примере:

# free | jc --free

Вывод имеет смысл сразу через jq пропустить, чтобы было удобнее смотреть.

# free | jc --free | jq

[
 {
  "type": "Mem",
  "total": 1014640,
  "used": 197868,
  "free": 276000,
  "shared": 31280,
  "buff_cache": 540772,
  "available": 634004
 },
 {
  "type": "Swap",
  "total": 999996,
  "used": 175740,
  "free": 824256
 }
]

JC поддерживает большое количество утилит. Это делает её удобной для настройки мониторинга. Например, очень просто сделать мониторинг бэкапов в виде файлов.

# ls -lh | jc --ls | jq

Отправляем вывод на Zabbix Server и парсим с помощью JSONPath нужные данные. Например, имя файла, дату и размер. А дальше делаем нужные триггеры. Я раньше всё это на баше через grep, awk, sed и т.д. делал. Но тут намного удобнее.

В репозитории приведён полный список утилит, которые поддерживает jc. Написана программа на python, ставится через pip:

# pip3 install jc

С помощью jc можно парсить вывод STDOUT у Ansible. В статье приведён простой и наглядный пример.

Утилита по нынешним временам очень актуальна и востребована. Рекомендую обратить внимание и сохранить информацию, если прямо сейчас не нужно.

Исходники / Много примеров

#json
👍108👎1
​​Короткая заметка про очень крутой сервис по визуализации JSON - jsoncrack.com. Это и готовый онлайн сервис, которым можно сразу пользоваться, и open source проект, который позволит этот сервис запустить у себя.

https://jsoncrack.com/editor
https://github.com/AykutSarac/jsoncrack.com

Особо писать тут нечего, просто посмотрите, как это выглядит на практике. Очень упрощает работу по разбору JSON строк. В закладки забрать обязательно и не забыть, наравне с jsonpath.com. Последним постоянно пользуюсь для предобработки айтемов в Zabbix.

Напомню, что у меня есть подборка утилит и сервисов для JSON. Посмотрите, может найдёте для себя что-то полезное. Без JSON сейчас никуда. В мониторинге и сборе логов постоянно приходится иметь с ним дело.

#json
👍84👎1
​​Простая и удобная утилита для работы в консоли с json - fx. Она умеет отображать данные в свёрнутом виде, раскрывая те ветки, что вам нужны. При этом поддерживает мышь. Настроек никаких нет, кроме выбора тем.

В некоторых системах fx есть в базовых репозиториях, например в MacOS, Ubuntu (snap), Arch, FreeBSD. Странно, что даже во фрюху заехала, но нет в rpm и deb репах. Можно просто скачать бинарник из репозитория.

Посмотреть, как fx работает, можно на тестовой публичной апишке:

# curl https://reqres.in/api/users?page=2 | fx

Либо сохранить какой-нибудь здоровенный json в файл и посмотреть его:

# fx data.json

Если много работаете с json, утилита точно пригодится.

Исходники

#json
👍50👎2