Jika saya akan memasukkan sebuah program ke dalam produksi, ada beberapa hal yang saya perlu program itu lakukan untuk menganggapnya "dioperasionalkan" - yaitu, berjalan dan dapat dipelihara dengan cara yang terukur dan dapat diverifikasi oleh insinyur dan staf operasi. Untuk tujuan saya, program yang dioperasionalkan harus:
- Mampu masuk di berbagai level (mis: debug, peringatan, dll.).
- Mampu mengumpulkan dan berbagi metrik / statistik tentang jenis pekerjaan yang dilakukan program dan berapa lama waktu yang dibutuhkan untuk pekerjaan itu. Idealnya, metrik yang dikumpulkan tersedia dalam format yang kompatibel dengan alat pemantauan yang umum digunakan seperti Ganglia , atau bisa sangat disesuaikan.
- Dapat dikonfigurasi, idealnya melalui sistem yang memungkinkan properti yang dikonfigurasi dalam menjalankan program diperbarui tanpa memulai ulang program tersebut.
- Dapat diterapkan ke server jarak jauh dengan cara yang berulang.
Di dunia Scala, ada perpustakaan yang bagus untuk menangani setidaknya tiga persyaratan pertama. Contoh:
- Logula untuk penebangan.
- Metrik atau Burung Unta untuk mengumpulkan dan melaporkan metrik.
- Configgy atau Fig untuk konfigurasi.
Adapun penerapan, salah satu pendekatan yang diambil di dunia Scala adalah menggabungkan bersama bytecode dan pustaka yang membentuk program seseorang dengan sesuatu seperti assembly-sbt , lalu mendorong bundel yang dihasilkan ("JAR gemuk") ke server jarak jauh dengan alat seperti Capistrano yang menjalankan perintah secara paralel melalui SSH. Ini bukan masalah yang memerlukan alat khusus bahasa, tapi saya penasaran apakah alat semacam itu ada di komunitas Haskell.
Mungkin ada perpustakaan Haskell yang menyediakan ciri-ciri yang saya jelaskan di atas. Saya ingin tahu perpustakaan mana yang dianggap "terbaik"; yaitu, yang paling matang, terpelihara dengan baik, biasa digunakan dalam komunitas Haskell, dan contoh praktik terbaik Haskell.
Jika ada pustaka, alat, atau praktik lain seputar pembuatan kode Haskell "siap produksi", saya juga ingin mengetahuinya.
Jawaban:
Ini pertanyaan yang bagus! Ini potongan pertama.
hslogger adalah framework logging yang paling populer.
Saya tidak mengetahui adanya alat pelaporan standar, namun, mengekstrak laporan dari
+RTS -s
aliran (atau melalui tanda keluaran profil) telah menjadi sesuatu yang telah saya lakukan di masa lalu.Anda juga bisa mendapatkan ini dalam format yang dapat dibaca mesin:
Idealnya Anda dapat melampirkan ke runtime GHC yang berjalan melalui soket dan melihat statistik GC ini secara interaktif, tetapi saat ini itu tidak super mudah (memerlukan FFI yang mengikat ke antarmuka "rts / Stats.h"). Anda dapat melampirkan ke proses menggunakan
ThreadScope
dan memantau GC dan perilaku threading.Bendera serupa tersedia untuk pembuatan profil waktu dan ruang tambahan, yang dicatat , yang dapat digunakan untuk pemantauan (misalnya, grafik ini dapat dibuat secara bertahap).
hpc
mengumpulkan banyak statistik tentang eksekusi program, melaluiTix
tipenya, dan orang-orang telah menulis alat untuk mencatat menurut pembagian waktu kode apa yang sedang dijalankan.Beberapa alat tersedia untuk ini, Anda dapat melakukan pemuatan status gaya xmonad; atau pindah ke hotswapping kode melalui
plugins
* paket atauhint
. Beberapa di antaranya lebih eksperimental daripada yang lain.Galois baru-baru ini dirilis
cabal-dev
, yang merupakan alat untuk melakukan build yang dapat direproduksi (yaitu dependensi dibatasi dan dikontrol).sumber
EventLog
kerangka logging baru GHC (menggunakan+RTS -l
saat runtime) mengalirkan output ke file, yang dapat divisualisasikan dengan alat apa pun yang membaca format eventlog.Contoh ConfigFile:
sumber
Saya akan mengulangi semua yang dikatakan Don dan menambahkan beberapa nasihat umum.
Misalnya, dua alat dan pustaka tambahan yang mungkin ingin Anda pertimbangkan:
-Wall
Keduanya ditargetkan pada kualitas kode.
Sebagai praktik coding, hindari Lazy IO. Jika Anda memerlukan streaming IO, gunakan salah satu library iteratee seperti enumerator . Jika Anda melihat Hackage Anda akan melihat perpustakaan seperti http-enumerator yang menggunakan gaya enumerator untuk permintaan http.
Sedangkan untuk memilih pustaka pada peretasan terkadang dapat membantu untuk melihat berapa banyak paket yang bergantung pada sesuatu. Dengan mudah melihat ketergantungan kebalikan dari sebuah paket, Anda dapat menggunakan situs web ini, yang mencerminkan peretasan:
Jika aplikasi Anda akhirnya melakukan loop ketat, seperti server web yang menangani banyak permintaan, kemalasan bisa menjadi masalah dalam bentuk kebocoran ruang. Seringkali ini adalah masalah menambahkan anotasi ketelitian di tempat yang tepat. Profiling, pengalaman, dan inti membaca adalah teknik utama yang saya ketahui untuk memerangi hal semacam ini. Referensi pembuatan profil terbaik yang saya tahu adalah Bab 25 dari Dunia Nyata Haskell .
sumber