Если я собираюсь запустить программу в производство, мне нужно, чтобы эта программа сделала несколько вещей, чтобы считать ее «введенной в действие», то есть запустить и поддерживать измеримым и проверяемым образом как инженерами, так и оперативным персоналом. Для моих целей действующая программа должна:
- Уметь вести журнал на нескольких уровнях (например, отладка, предупреждение и т. Д.).
- Уметь собирать и обмениваться метриками / статистикой о типах работы, которую выполняет программа, и о том, сколько времени она занимает. В идеале собранные метрики доступны в формате, совместимом с широко используемыми инструментами мониторинга, такими как Ganglia , или могут быть изменены.
- Быть настраиваемым, в идеале через систему, которая позволяет обновлять настроенные свойства в запущенных программах без перезапуска указанных программ.
- Возможность повторного развертывания на удаленных серверах.
В мире Scala есть хорошие библиотеки для выполнения хотя бы первых трех требований. Примеры:
- Логула для вырубки.
- Метрики или Страус для сбора и отчетности по метрикам.
- Configgy или рис для настройки.
Что касается развертывания, один из подходов, принятых в мире Scala, состоит в том, чтобы связать вместе байт-код и библиотеки, составляющие вашу программу, с чем-то вроде assembly-sbt , а затем отправить полученный пакет («толстый JAR») на удаленные серверы с помощью такого инструмента, как Capistrano. который выполняет команды параллельно через SSH. Это не проблема, для решения которой требуются инструменты, специфичные для языка, но мне любопытно, существует ли такой инструмент в сообществе Haskell.
Вероятно, существуют библиотеки Haskell, которые предоставляют свойства, которые я описал выше. Я хотел бы знать, какие из доступных библиотек считаются «лучшими»; то есть наиболее зрелые, хорошо поддерживаемые, обычно используемые в сообществе Haskell и являющиеся образцом лучших практик Haskell.
Если есть какие-либо другие библиотеки, инструменты или методы, позволяющие сделать код Haskell «готовым к производству», я бы тоже хотел узнать о них.
Ответы:
Это большой вопрос! Вот первый вариант.
hslogger - самая популярная платформа для ведения журналов.
Мне не известны какие-либо стандартизированные инструменты отчетности, однако извлечение отчетов из
+RTS -s
потоков (или с помощью флагов вывода профилирования) было чем-то, что я делал в прошлом.Вы также можете получить это в машиночитаемом формате:
В идеале вы могли бы подключиться к работающей среде выполнения GHC через сокет и просматривать эту статистику сборщика мусора в интерактивном режиме, но в настоящее время это непросто (требуется привязка FFI к интерфейсу «rts / Stats.h»). Вы можете подключиться к процессу, используя
ThreadScope
сборщик мусора и потоковое поведение, и отслеживать их.Аналогичные флаги доступны для инкрементного, регистрируемого профилирования времени и пространства , которое можно использовать для мониторинга (например, эти графики могут быть построены инкрементально).
hpc
собирает много статистических данных о выполнении программы по ееTix
типу, и люди написали инструменты для регистрации выполняемого кода по временному интервалу.Для этого доступно несколько инструментов, вы можете выполнить перезагрузку состояния в стиле xmonad; или перейти на горячую замену кода через
plugins
* packages илиhint
. Некоторые из них более экспериментальны, чем другие.Недавно Галуа выпустил
cabal-dev
инструмент для создания воспроизводимых сборок (т. Е. Зависимости ограничены и контролируются).источник
EventLog
структура ведения журнала GHC (использующаяся+RTS -l
во время выполнения) передает потоки вывода в файл, который можно визуализировать с помощью любого инструмента, считывающего формат журнала событий.Пример ConfigFile:
источник
Я бы повторил все, что сказал Дон, и добавил несколько общих советов.
Например, вы можете рассмотреть два дополнительных инструмента и библиотеки:
-Wall
Оба они ориентированы на качество кода.
В качестве практики кодирования избегайте ленивого ввода-вывода. Если вам нужен потоковый ввод-вывод, воспользуйтесь одной из итерационных библиотек, например enumerator . Если вы посмотрите Hackage, вы увидите библиотеки, такие как http-enumerator, которые используют стиль перечислителя для HTTP-запросов.
Что касается выбора библиотек при взломе, иногда может помочь посмотреть, сколько пакетов от чего-то зависит. Легко увидеть обратные зависимости пакета, который вы можете использовать на этом веб-сайте, который отражает взлом:
Если ваше приложение в конечном итоге выполняет жесткие циклы, например, веб-сервер, обрабатывающий множество запросов, лень может стать проблемой в виде утечки пространства. Часто это вопрос добавления аннотаций строгости в нужных местах. Профилирование, опыт и ядро чтения - вот основные методы, которые я знаю для борьбы с подобными вещами. Лучший справочник профилирования я знаю, это глава 25 из Real-World Haskell .
источник