Подключение к удалённой JVM по протоколу JMX

12.03.2016 Java JVM monitoring JMX VisualVM AWS SSH

В процессе поиска утечек во всё том же Java-приложении сильно помогла утилита VisualVM, которая практически официально называется «All-in-one Java Troubleshooting Tool».

Для того, чтобы разрешить локальные подключения к JVM по протоколу JMX без авторизации и шифрования необходимо добавить следующие параметры командной строки при запуске Java-приложения:

-Dcom.sun.management.jmxremote.port=7091 \
-Dcom.sun.management.jmxremote.rmi.port=7091 \
-Dcom.sun.management.jmxremote.authenticate=false \
-Dcom.sun.management.jmxremote.ssl=false \
-Djava.rmi.server.hostname=127.0.0.1

В моем случае приложение было запущенно на виртуальном сервере в AWS, поэтому дополнительно использовался SSH-туннель, который запускался следующей командой на компьютере разработчика (не на удаленном сервере!):

ssh <логин>@<ip или hostname удаленного сервера> -v4N -L 7091:localhost:7091

Краткая памятка по используемым параметрам:

  • -v — выводить больше информации в консоль (удобно для отладки)
  • -4 — использовать только IPv4
  • -N — не выполнять команды, а только прокидывать порт
  • -L [bind_address:]port:host:hostport — настройки туннелирования

В VisualVM подключаться нужно на localhost:7091. Для просмотра метрик необходимо установить плагин MBeans.

Включение JMX в моем случае не влияло на производительность приложения заметным образом.

Обновление установленных приложений в Homebrew Cask

04.11.2015 Mac OS X Homebrew Homebrew Cask

Если для установленного с помощью Homebrew Cask приложения вышла новая версия, попытка удалить старую версию с помощью brew cask uninstall приведет к такой ошибке:

Error: <название пакета> is not installed

Проблема описана в баг-трекере. Для того, чтобы принудительно удалить старую версию приложения нужно использовать параметр --force следующим образом:

brew cask uninstall --force <название пакета>

После этого можно установить новую версию.

Отображение периодов для которых нет данных на графиках в Splunk

20.10.2015 Splunk

В Splunk есть возможность быстро построить график по времени для какой-либо величины с помощью команды timechart. Например, запрос для построения графика количества ошибок, предупреждений и INFO-записей в лог-файле Dropwizard-приложения может быть таким:

index=my-index sourcetype=access_combined 
host="my-shiny-java-server-*" 
dropwizard_log_level=* 
| timechart count by dropwizard_log_level

В случае, если за какой-то день не было ни одного сообщения, этот день будет пропущен на графике, чтобы решить проблему необходимо применить команду stat (способ подсмотрен тут):

index=my-index sourcetype=access_combined 
host="my-shiny-java-server-*" 
dropwizard_log_level=* 
| stats count AS myCount by dropwizard_log_level, _time 
| timechart span=1d sum(myCount) by dropwizard_log_level

Другой вариант запроса с использованием функции per_day():

index=my-index sourcetype=access_combined 
host="my-shiny-java-server-*" 
dropwizard_log_level=* 
| stats count AS myCount by dropwizard_log_level, _time 
| timechart span=1d per_day(myCount) by dropwizard_log_level

В зависимости от типа графика в его настройках может быть необходимо поменять способ отображения null-значений с помощью параметра General -> Null Values.

Как набирать немецкую диакритику на QWERTY-клавиатуре

13.10.2015 keyboard shortcuts век-живи-век-учись Mac OS X

Чтобы набирать специфичные для немецкого языка символы необязательно использовать клавиатуру с QWERTZ-раскладкой.

Для Mac OS X

Необходимо использовать раскладку U.S. Extended:

  • Для набора ä, ö, ü необходимо нажатьOption-u (появится знак умляута) и затем необходимую букву (строчную или прописную)
  • Для набора ß необходимо нажать Option-s (эта буква может быть только строчной)
  • Для набора необходимо нажать Option-Shift-2

Для Windows

Необходимо добавить раскладку клавиатуры «США международная»:

  • Для набора ä, ö, ü необходимо нажать " (на экране ничего не отобразится) и затем необходимую букву
  • Для набора ß необходимо нажать AltGr + s (здесь и далее AltGr — правая клавиша Alt)
  • Для набора необходимо нажать AltGr-5 (вариант с набором кода символа будет работать при любой раскладке: Alt-0128)

Недостаток этого решения в том, что для набора символов «"» и «'» необходимо будет нажимать " и затем пробел. Отчасти эту проблему можно решить, добавив раскладку второй для английского языка, в этом случае одним сочетанием клавиш будут переключаться языки (например, Alt-Shift), а другим — раскладки внутри языка (например, Ctrl-Shift).

Памятка по созданию SSH-туннелей

04.09.2015 SSH

С помощью SSH-клиента можно довольно просто создать туннель, например, в случае использования OpenSSH для MongoDB синтаксис будет таким:

ssh -C -N -L 8080:127.0.0.1:27017 user@example.com

После запуска команды подключение к локальному порту 8080 будет перенаправлено на удаленный сервер example.com:27017. Краткая памятка по используемым параметрам:

  • -C — включение компрессии (может только мешать, если канал до сервера достаточно быстрый)
  • -N — не выполнять команды, а только прокидывать порт
  • -L [bind_address:]port:host:hostport — настройки туннелирования
  • user@example.com — параметры подключения к удаленному серверу

Переименование полей с датами в Splunk

31.08.2015 Splunk

Splunk — это система анализа логов (и не только). С помощью встроенных команд можно сгруппировать данные по дате, однако имена полей после этого выглядят не очень красиво, например _time. Поля можно переименовать с помощью команды rename, одна после этого Splunk забывает, что поле представляет собой дату и выводит данные в виде Unix timestamp.

Для решения проблемы необходимо после переименования сконвертировать дату в нужный формат командой ctime:

<запрос с timechart по полю count> | rename per_day(count) as "Errors Count" | rename _time as "Date" | convert timeformat="%d.%m.%Y" ctime("Date")

Фильтрация вывода команд AWS CLI в shell-скриптах

04.08.2015 shell AWS

В AWS CLI есть удобная возможность фильтровать вывод команд с помощью параметра --query.

Небольшая проблема возникает в случае, если вывод команды необходимо поместить в переменную. Выражение фильтрации должно быть заключено в одинарные кавычки, а все текстовые значения в нем в в т.н. backtick'и. Если текстовые значения необходимо подставить из переменных, придется применить неочевидное экранирование дополнительной парой одинарных кавычек:

STACK_ID=$(aws opsworks describe-stacks \
    --region ${region} \
    --output text \
    --profile $profile \
    --query 'Stacks[?Name==`'$stack'`].[StackId]')

Проблемы с некоторыми сайтами при подключении по PPPoE или Path MTU Discovery Black Hole

27.04.2015 FreeBSD mpd5 ppp PPPoE

После смены провайдера столкнулся со странной проблемой: с клиентских машин, выходящих в интернет через роутер на FreeBSD (да, ещё есть такое в хозяйстве :)) некоторые сайты работали отлично, некоторые -- не работали вообще (соединения отваливались по таймауту, https не работал и т.п.), причем симптомы были странные:

  • При подключении напрямую в одну из машин все работало отлично
  • При смене провайдера (по сути ничего кроме настройки mpd5 не менялось) все снова работало нормально
  • Проблема повторялась не для всех сайтов
  • С самого роутера с помощью wget можно было спокойно делать запросы на проблемные сайты

Первой идеей было покрутить MTU и спросить саппорт провайдера. Ни то ни другое не помогло. После внимательного гугления нашлось описание проблемы под названием Path MTU Discovery Black Hole (вариант1, вариант 2, вариант 3).

В моем случае оказалось достаточно добавить следующий параметр в конфигурацию mpd5, решения для других платформ есть по ссылкам выше:

set iface enable tcpmssfix