Memantau aplikasi C ++


10

Kami menerapkan solusi pemantauan terpusat baru (Zenoss). Memasukkan server, jaringan, dan program Java sangat mudah dengan SNMP dan JMX.

Namun, pertanyaannya adalah apakah praktik terbaik untuk memantau dan mengelola aplikasi C ++ khusus di lingkungan besar, heterogen (Solaris x86, RHEL Linux, Windows)?

Kemungkinan yang saya lihat adalah:

  1. SNMP bersih
  • Keuntungan
  1. satu, pusat daemon di setiap server
  2. standar terkenal
  3. integrasi yang mudah ke dalam solusi pemantauan
  4. kami sudah menjalankan Net SNMP daemon di server kami
  • Kekurangan:
    1. implementasi kompleks (MIB, pustaka SNMP Net)
    2. teknologi baru yang akan diperkenalkan untuk pengembang C ++
  • rsyslog
    • Keuntungan
    1. satu, pusat daemon di setiap server
    2. standar terkenal
    3. integrasi yang tidak diketahui ke dalam solusi pemantauan (saya tahu mereka bisa melakukan peringatan berdasarkan teks, tetapi seberapa baik kerjanya untuk mengirim telemetri seperti penggunaan memori, kedalaman antrian, kapasitas utas, dll.)
    4. implementasi sederhana
  • Kekurangan:
    1. kemungkinan masalah integrasi
    2. teknologi yang agak baru untuk pengembang C ++
    3. kemungkinan masalah porting jika kami beralih dari vendor pemantauan
    4. mungkin melibatkan pembuatan protokol komunikasi ad-hoc (atau menggunakan data terstruktur RFC5424; saya tidak tahu apakah Zenoss mendukungnya tanpa pengkodean Zenpack kustom)
  • Embedded JMX (embed JVM dan gunakan JNI)
    • Keuntungan
    1. antarmuka manajemen yang konsisten untuk Java dan C ++
    2. standar terkenal
    3. integrasi yang mudah ke dalam solusi pemantauan
    4. implementasi agak sederhana (kami sudah melakukan ini hari ini untuk keperluan lain)
  • Kekurangan:
    1. kompleksitas (JNI, lapisan pemunculan antara asli C ++ dan Java, pada dasarnya menulis kode manajemen dua kali)
    2. kemungkinan masalah stabilitas
    3. membutuhkan JVM di setiap proses, menggunakan memori jauh lebih banyak
    4. JMX adalah teknologi baru untuk pengembang C ++
    5. setiap proses memiliki port JMX sendiri (kami menjalankan banyak proses pada setiap mesin)
  • Daemon JMX lokal, proses terhubung ke sana
    • Keuntungan
    1. satu, pusat daemon di setiap server
    2. antarmuka manajemen yang konsisten untuk Java dan C ++
    3. standar terkenal
    4. integrasi yang mudah ke dalam solusi pemantauan
  • Kekurangan:
    1. kompleksitas (pada dasarnya menulis kode manajemen dua kali)
    2. perlu menemukan atau menulis daemon semacam itu
    3. membutuhkan protokol antara daemon JMX dan proses C ++
    4. JMX adalah teknologi baru untuk pengembang C ++
  • Ion CodeMesh JunC ++
    • Keuntungan
    1. antarmuka manajemen yang konsisten untuk Java dan C ++
    2. standar terkenal
    3. integrasi yang mudah ke dalam solusi pemantauan
    4. daemon pusat tunggal pada setiap server ketika dijalankan dalam mode JVM bersama
    5. implementasi yang agak sederhana (memerlukan pembuatan kode)
  • Kekurangan:
    1. kompleksitas (pembuatan kode, membutuhkan GUI dan beberapa putaran penyesuaian untuk menghasilkan kode yang diproksi)
    2. kemungkinan masalah stabilitas JNI
    3. membutuhkan JVM di setiap proses, menggunakan jauh lebih banyak memori (dalam mode tertanam)
    4. Tidak mendukung Solaris x86 (deal breaker)
    5. Bahkan jika itu mendukung Solaris x86, ada kemungkinan masalah kompatibilitas kompiler (kami menggunakan kombinasi aneh STLPort dan Forte on Solaris
    6. setiap proses memiliki port JMX sendiri saat dijalankan dalam mode tertanam (kami menjalankan banyak proses pada setiap mesin)
    7. mungkin menghalangi server JMX bersama untuk proses non-C ++ (?)

    Apakah ada beberapa solusi sederhana yang distandarisasi dan sederhana yang saya lewatkan?

    Karena tidak ada solusi masuk akal lainnya, manakah dari solusi ini yang biasanya digunakan untuk program C ++ khusus?

    Perasaan saya adalah bahwa SNMP Net adalah cara orang melakukan ini, tetapi saya ingin masukan dan pengalaman orang lain sebelum saya mengambil keputusan.

    Jawaban:


    1

    Saya tidak super akrab dengan Zenoss tetapi ketika saya dulu menggunakan nagios untuk hal semacam ini kami akan membuat proses c / c ++ mendengarkan pada soket dan menulis plugin nagios khusus yang akan menyerahkan informasi status dan diagnostik.

    Langkah pertama adalah memilih lib yang ingin Anda gunakan untuk membuat proses Anda mendengarkan .. Sesuatu seperti C ++ Socket Library akan lakukan untuk itu. Tidak ada yang rumit di sana .. cukup buat proses mendengarkan.

    Maka Anda harus mendefinisikan respons yang akan dikirim oleh proses Anda dengan diberikan stimulus tertentu. Ini benar-benar berarti (paling tidak dengan nagios) mendefinisikan 'layanan' dan kemudian mengirimkan proses sinyal yang sesuai dengan layanan itu. Hal paling sederhana yang dapat Anda lakukan adalah membuat 'proses ping', lihat saja apakah Anda berhasil terhubung ke proses yang sedang berjalan. Jika Anda melakukannya daripada plugin nagios khusus tahu setidaknya prosesnya masih hidup.

    Ada banyak hal yang lebih canggih yang dapat Anda lakukan tetapi idenya cukup sederhana. Anda dapat menulis lib kecil Anda sendiri dari proses mendengarkan kode yang dienkapsulasi dalam objek dan menariknya ke item c ++ kustom Anda dengan cara standar setiap kali Anda membangun satu (atau semua) executable Anda

    Pemahaman saya adalah Zenoss dapat melakukan ini juga .

    Mungkin karena Zenoss adalah python maka Anda akan menulis plugin khusus untuknya menggunakan sesuatu seperti Twisted untuk menghubungkan ke c ++ yang dapat dieksekusi yang dapat dieksekusi.


    1

    saya tidak akrab dengan produk-produk ini, tetapi untuk windows saya memantau konsumsi memori menggunakan perfmon, ada beberapa counter khusus, seperti kesalahan pool non-paged, yang menunjukkan kepada Anda jika program Anda mengandung kebocoran memori, mereka mungkin sedikit dan dengan demikian membutuhkan waktu lama waktu untuk memantau tetapi menurut saya ini metode pemeriksaan sederhana.

    Pada windows Anda dapat melakukan banyak hal menggunakan perfmon, bahkan dari jarak jauh Atau memanfaatkan WMI untuk melampirkan penghitung yang sama, dan melakukan beberapa otomatisasi di atasnya (dalam wmi) untuk melakukan tindakan.


    1

    Saya memahami hal ini karena kami baru-baru ini melalui proses yang sama seperti Anda: Kami mencari solusi open-source yang ringan, tanpa pemblokiran, yang memungkinkan pemaparan dan pemantauan jarak jauh berikutnya dari metrik dari dalam layanan C / C ++ ( kami memiliki sekitar ~ 3000).

    SNMP datang paling dekat tetapi integrasi ke dalam sumber dan sistem pemantauan sangat merepotkan dan tidak cocok untuk proses waktu nyata kami.

    Pada akhirnya, kami memutuskan untuk mengembangkan solusi baru yang disebut CMX yang menggunakan teknologi memori bersama dan menjadikannya open-source. Anda dapat memeriksanya di sini: www.cern.ch/cmx .


    0

    Saya tidak super akrab dengan sisi c ++ tetapi di Jawa kami banyak menggunakan metrik CodaHale dalam hubungannya dengan Graphite . CodaHale menyimpan metrik pada basis per instance di memori lokal instance lalu menggunakan utas latar untuk membilas metrik ke server grafit setiap menit (dapat dikonfigurasi). Dalam grafit kita dapat mengumpulkan di seluruh instance serta mengidentifikasi contoh yang salah. Jika Anda tidak ingin kompleksitas mempertahankan cluster grafit, Anda dapat menggunakan HostedGraphite .

    Penyiapan ini berarti tidak ada titik tunggal kegagalan untuk agregasi metrik atau pelaporan sebagai (agregasi berbasis waktu terjadi pada node itu sendiri dan agregasi pelaporan di seluruh terjadi dalam gugus grafit terdistribusi (atau grafit yang dihosting).

    Terakhir, Anda dapat menggunakan Seyren untuk memberikan peringatan di atas data pemantauan.


    0

    Jika Anda menggunakan Windows, Anda cenderung menulis ke log peristiwa, dan kemudian menggunakan WMI atau proses serupa untuk membaca acara tersebut. Jika Anda ingin memantau, Anda menambahkan penghitung monitor kinerja ke aplikasi Anda dan biarkan perfmon membacanya. Keduanya adalah layanan sistem di Windows.

    Di Linux, itu jelas cenderung lebih fleksibel, tetapi saya selalu melihat monitor gaya nagios diimplementasikan, dengan soket kustom mengirim data ke server gaya nagios.

    Itu semua mengatakan, saya telah melihat beberapa tempat di mana SMNP digunakan, dan terus terang, saya tidak bisa melihat alasan mengapa Anda tidak menggunakannya - terutama jika Anda menjalankan lingkungan yang sepenuhnya heterogen.

    Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
    Licensed under cc by-sa 3.0 with attribution required.