Kami menghemat waktu, kegelisahan, dan jam kerja

Proyek kami biasanya bersifat regional, dan kliennya biasanya kementerian. Namun, selain sektor publik, organisasi swasta juga menggunakan sistem kami. Praktis tidak ada masalah dengan mereka.

Jadi, proyek utamanya bersifat regional, dan terkadang ada masalah dengannya. Misalnya, dalam hal kinerja, ketika di suatu wilayah terdapat lebih dari 20 ribu pengguna berharga kami selama periode peluncuran fungsi baru di server produk. Itu menyakitkan…

Nama saya Ruslan dan saya mendukung sistem informasi BARS Group dan mengembangkan bot pembunuh untuk DBA serial yang penuh kekerasan. Postingan ini bukan untuk orang yang lemah hati - ada banyak surat dan gambar.

Kami menghemat waktu, kegelisahan, dan jam kerja

/ awr

Beberapa aplikasi kami berjalan di Oracle DBMS. Ada juga proyek di DBMS PostgreSQL. Oracle memiliki hal yang luar biasa - mengumpulkan statistik beban pada DBMS, yang menyoroti masalah yang ada dan bahkan membuat rekomendasi untuk penghapusan - Automatic Workload Repository (AWR). Pada satu titik (yaitu pada saat kesakitan), para pengembang terus-menerus meminta untuk mengumpulkan Laporan AWR untuk analisis kinerja. Kami dengan jujur ​​​​pergi ke server DBMS, mengumpulkan laporan, membawanya ke kami dan mengirimkannya ke produksi untuk dianalisis. Setelah yang ke 5 kali jadi menjengkelkan...setelah yang ke 10 menjadi menjengkelkan...

Salah satu rekan saya pernah mengutarakan gagasan bahwa segala sesuatu yang dilakukan lebih dari satu kali harus diotomatisasi. Sampai saat saya merasa kesal, sejujurnya, saya tidak memikirkannya dan mencoba mengotomatiskan segala sesuatu yang dapat diotomatisasi, tetapi seringkali hal itu tidak diminati dan lebih bersifat penelitian daripada terapan.

Dan kemudian saya berpikir: “Admin tidak diperlukan untuk membuat laporan…”. Lagi pula, mengumpulkan laporan berarti mengeksekusi skrip sql @$ORACLE_HOME/rdbms/admin/awrrpt.sql dan membawa laporan dari server ke tempat Anda... Oh ya, kami tidak mengizinkan pengembangan untuk produksi.

Kemudian saya mencari informasi yang diperlukan di Google, membuat fungsi dari artikel di basis pengujian, menjalankan skrip dan keajaiban - laporan telah dikompilasi dan dapat disimpan secara lokal. Membuat fungsi yang sering kali membutuhkan laporan AWR dan memberi tahu pengembang cara menggunakannya.

Sekitar waktu ini, di waktu senggang, setelah ngobrol dengan @Botfather, saya membuat bot Telegram untuk diri saya sendiri, hanya untuk bersenang-senang. Saya memasang fungsi sederhana di sana - menunjukkan waktu saat ini, nilai tukar, cuaca, mengajarkannya untuk mengirim pujian kepada istri saya (saat itu pacar) sesuai jadwal. Mungkin, pada saat itu, mengirimkan pujian adalah fungsi bot saya yang paling populer, dan istri saya menghargainya.

Jadi. Pengembang menulis kepada kami di Telegram, kami mengirimkan laporan kepada mereka di Telegram... Bagaimana jika mereka menulis bukan kepada kami, tetapi ke bot? Bagaimanapun, itu akan lebih baik bagi semua orang, laporan akan diterima lebih cepat, dan yang paling penting, melewati kita. Dari sinilah ide fungsionalitas populer pertama untuk bot saya lahir.

Saya memulai implementasi. Saya melakukannya sebaik mungkin dalam PHP (aplikasi kami sendiri menggunakan PHP, saya lebih ahli di dalamnya daripada Python). Saya bukan pembuat kode yang baik, jadi saya tidak akan menunjukkan kode saya :)

Bot berada di jaringan perusahaan kami dan memiliki akses ke proyek tertentu, termasuk database target. Agar tidak repot dengan parameter di tim atau menu, saya menambahkan fungsi ini ke obrolan grup dengan notifikasi pemantauan. Dengan cara ini bot segera mengetahui database mana yang akan mengumpulkan laporan.

Setelah menerima perintah seperti /awr N, di mana N adalah jumlah jam penuh yang memerlukan laporan (secara default - 1 jam), bahkan selama seminggu, jika database belum dimulai ulang, bot segera mulai bekerja, mengumpulkan laporan, menerbitkannya sebagai halaman web dan segera (hampir sampai di sana) menyediakan link ke laporan yang sangat dibutuhkan.

Ikuti tautannya dan ini dia, laporan AWR:

Kami menghemat waktu, kegelisahan, dan jam kerja

Seperti yang diharapkan, para pengembang mengatasi pembuatan laporan tersebut, dan beberapa bahkan berterima kasih kepada kami.

Karena menghargai kenyamanan tim, manajer proyek dari wilayah lain menginginkan hal yang sama, karena mereka menerima hasil maksimal dari pelanggan dan mengkhawatirkan kinerja dan ketersediaan sistem. Saya menambahkan bot ke obrolan lain. Mereka masih menggunakannya, dan saya senang karenanya.

Belakangan, rekan-rekan dari CIT mengetahui cara kami mengumpulkan laporan dan ingin melakukannya juga. Saya tidak menambahkan mereka ke obrolan kami, saya membuat obrolan terpisah dengan pembuatan laporan sesuai jadwal dan berdasarkan permintaan.

/pgBadger

Kami juga memiliki aplikasi lain dalam PHP bersama dengan PostgreSQL. Saya menerapkan pengumpulan laporan pgBadger bagi mereka yang membutuhkan menggunakan prinsip yang sama - dalam obrolan grup. Awalnya mereka menggunakannya, tapi kemudian berhenti. Fungsionalitasnya dihilangkan karena tidak diperlukan.

/tugas

Departemen kami memiliki shift malam dan, karenanya, memiliki jadwal. Itu ada di Google Spreadsheet. Tidak selalu mudah untuk mencari tautan, membuka grafik, mencari sendiri... Salah satu mantan kolega saya juga bermain-main dengan bot Telegramnya dan memperkenalkannya ke obrolan departemen kami pemberitahuan dimulainya shift tugas bagi pegawai departemen. Bot menguraikan jadwal, menentukan orang yang bertugas pada tanggal saat ini dan, menurut jadwal atau berdasarkan permintaan, melaporkan siapa yang bertugas hari ini. Ternyata bagus dan nyaman. Benar, saya tidak terlalu menyukai format pesannya. Selain itu, untuk karyawan departemen lain (misalnya, BC “Kedokteran”), informasi tentang mereka yang bertugas di arah lain tidak terlalu diperlukan, tetapi Anda perlu mengetahui siapa yang bertugas di “Kedokteran” jika ada masalah. Saya memutuskan untuk "meminjam" fungsinya, tetapi mengubah apa yang tidak saya sukai. Saya membuat format pesan nyaman untuk diri saya sendiri dan orang lain, menghapus informasi yang tidak perlu.

/tnls

Setelah mencoba otomatisasi menggunakan bot Telegram, banyak ide berbeda muncul, namun saya ingin melakukan hal-hal yang benar-benar diperlukan. Saya memutuskan untuk memimpin statistik permintaan. Untuk mengakses proyek pelanggan kami, kami telah menerapkan apa yang disebut “server lompat” atau server penerusan. Koneksi VPN dimunculkan di atasnya, kemudian port aplikasi, database, dan penerusan tambahan lainnya diteruskan ke jaringan lokal kami melalui ssh, untuk memudahkan akses ke proyek karyawan kami, tanpa masalah dengan koneksi VPN. Yang perlu Anda lakukan hanyalah mengatur koneksi VPN ke jaringan perusahaan kami.

Statistik permintaan menunjukkan bahwa seringkali, setelah salah satu terowongan gagal (dalam kasus masalah jaringan, karena waktu habis, misalnya), orang menghubungi kami untuk memulihkan akses ke proyek. Dalam kebanyakan kasus, memulai ulang koneksi saja sudah cukup dan semuanya baik-baik saja. Ayo lakukan sendiri. Inilah perintahnya:
Kami menghemat waktu, kegelisahan, dan jam kerja

Anda "jatuh" ke item menu yang diinginkan, pilih proyek Anda, tunggu sebentar dan semua orang senang dan puas...

Setelah menerima perintah, dengan sedikit pergerakan byte dan bit, bot terhubung ke server penerusan, mengetahui sebelumnya penerusan mana yang perlu dimulai ulang, dan melakukan tugasnya - memulihkan koneksi ke proyek. Saya menulis instruksi sehingga Anda dapat menyelesaikan sendiri masalah tersebut. Dan orang-orang menghubungi kami hanya jika alat yang disediakan tidak berfungsi...

/ecp_to_pem

Statistik lebih lanjut menunjukkan bahwa seringkali diperlukan konversi EDS Crypto Pro dalam format pem(Base64) untuk berbagai integrasi, dan kami memiliki cukup banyak integrasi. Tugas: mengambil wadah, menyalinnya ke komputer Windows dengan utilitas P12FromGostCSP terinstal (berbayar, omong-omong), mengonversinya menjadi pfx, lalu mengonversi pfx menggunakan OpenSSL (dengan dukungan enkripsi Gost) ke pem. Ini sangat tidak nyaman, tetapi Anda menginginkannya hanya dengan menjentikkan jari Anda.

Google kembali menyelamatkannya. Ditemukan utilitas beberapa orang. Saya merakitnya seperti yang tertulis di README - berhasil. Saya mengajarkan bot untuk bekerja dengan utilitas dan mendapatkan konversi hampir seketika.
Kami menghemat waktu, kegelisahan, dan jam kerja

Pada saat implementasi akhir, perintah dikeluarkan untuk beralih ke format enkripsi baru - gost-2012. Sejauh yang saya ingat, utilitas pada saat itu hanya berfungsi dengan Gost lama (2001), mungkin itu adalah utilitas serupa lainnya dari orang baik lainnya, saya tidak ingat persisnya.
Setelah transisi ke Gost baru, fungsi bot dihapus karena alasan keamanan. Menerapkannya dalam wadah buruh pelabuhan.

Dockerfile, kalau-kalau ada yang membutuhkannya:

FROM ubuntu:16.04                                                                                                                                                                        
RUN apt update && apt -y install git sudo wget unzip gcc g++ make &&                        
   cd /srv/ && git clone https://github.com/kov-serg/get-cpcert.git &&                     
   cd get-cpcert && chmod +x *.sh && ./prepare.sh && ./build.sh &&                         
   mkdir -p /srv/{in,out} &&                                                               
   echo '#!/bin/bash' > /srv/getpem.sh &&                                                  
   echo 'cd /srv/get-cpcert' >> /srv/getpem.sh &&                                          
   echo './get-cpcert /srv/in/$CONT.000 $PASS > /srv/out/$CONT.pem' >> /srv/getpem.sh &&   
   chmod +x /srv/getpem.sh                                                                  ENTRYPOINT /srv/getpem.sh

Untuk mengkonversi, Anda perlu menempatkan container asli (direktori seperti xxx.000) di direktori /srv/in, dan membawa pem yang sudah selesai ke /srv/out.

Untuk mengubah:

 docker run -t -i -e CONT='<имя директории с контейнером(без ".000")>' -e PASS='<пароль для контейнера>' -v /srv/in:/srv/in -v /srv/out:/srv/out --name ecptopem <адрес нашего репозитория>/med/ecptopem:latest 

/emstop dan /emstart

Suatu hari, Oracle DBA yang sangat keren, dengan banyak pengalaman dalam administrasi dan pengembangan DBMS, mendapat pekerjaan di perusahaan kami. Dan dia langsung mengalami kesulitan saat menyambung ke server DBMS dengan ssh: dia tidak tahu di mana atau bagaimana menghubungkannya, aksesnya tidak dijelaskan dengan jelas, atau dia tidak dapat meneruskan sesuatu yang dia butuhkan ke dirinya sendiri. Ya, kami dengan senang hati membantu, kami memberi tahu dia cara terhubung, dan meneruskannya ke Manajer Perusahaan. Tapi semuanya masih tidak berhasil dengan ssh. Salah satu rekan saya menjelaskannya secara sederhana: DBA murni :) Kami memutuskan bahwa jika kami perlu mengubah sesuatu di server, kami akan melakukannya sendiri.

EM terkadang crash saat beban berat, dan untuk memulai ulang... Anda perlu terhubung melalui ssh dan memulai ulang melalui terminal. “Admin pandai dalam hal ini,” rekan baru kami memutuskan. Beban berat pada DBMS bukanlah hal yang aneh bagi kami, dan permintaan untuk memulai ulang EM juga merupakan hal biasa. Kemudian skenario yang sama: ketegangan, kejengkelan dan pencarian solusi masalah. Jadi dalam obrolan grup yang sama muncul perintah berikut: /emstop dan /emstart.

Kami menghemat waktu, kegelisahan, dan jam kerja

/membunuh

Jika terdapat persaingan yang kuat pada database, dan hal ini terkadang terjadi, maka database perlu segera dibongkar. Cara tercepat adalah dengan mematikan proses yang bermasalah... Untuk melakukan ini, sambungkan melalui ssh, bunuh -9... Bot akan membantu!

Kami menghemat waktu, kegelisahan, dan jam kerja

Alexei menghargai tim tersebut dan memberinya nama yang penuh kasih sayang - "Kilyalka" atau pistol.
Suatu hari, setelah menyaksikan bagaimana Alexei mencoba dan menderita, memasukkan /kill xxx setiap kali untuk setiap proses, saya memutuskan untuk menambahkan "multi-barel" ke senjata kami:

Kami menghemat waktu, kegelisahan, dan jam kerja

Itu lebih baik! Semuanya untukmu, Alexei, bekerja saja, sayang!

Tentu saja, tim penting seperti itu terbatas akses oleh user_id - “sangat mudah”. Melihat bagaimana Lesha dengan cekatan mematikan proses di server database, beberapa orang mencoba memasukkan perintah dengan nomor proses acak, tetapi Anda tidak bisa menipu bot pintar saya, dia langsung menolak.

/alertlog

Untuk jaga-jaga, saya membuat perintah:
/alertlog <jumlah baris> — dapatkan jumlah baris log peringatan yang ditentukan
Bot menarik log peringatan dan mengirimkannya ke layanan kami, seperti pastebin, yang disebut pyste, dan mengirimkan tautan ke tempel ke obrolan permintaan.

/ memeriksa

Berikutnya datang permintaan untuk memantau kinerja sebenarnya dari aplikasi kita. Hingga saat ini, dukungan teknis proyek mengumpulkan data ini secara manual. Apa pun! Penguji kami yang gagah berani telah mengembangkan kasus uji untuk ini. Log pengujian yang dihasilkan sangat tidak nyaman untuk dibaca, pengguna yang tidak berpengalaman akan membutuhkan waktu lama untuk memahaminya dan tidak yakin bahwa dia akan menyorot informasi yang diperlukan. Dan kami tidak suka melakukan dengan tangan kami apa yang tidak dapat kami lakukan dengan tangan kami... Tugas baru untuk bot!

Kami menghemat waktu, kegelisahan, dan jam kerja

Perintah /checks menampilkan menu yang sederhana dan tidak ambigu; kali ini teman-teman kita belajar cara menggunakan perintah ini tanpa instruksi!

Saat Anda memilih item yang diinginkan, alih-alih menu, pemberitahuan tentang dimulainya pengujian akan muncul, sehingga pengguna yang tidak sabar tidak menjalankan pengujian kami 100500 kali:

Kami menghemat waktu, kegelisahan, dan jam kerja

Bergantung pada item menu yang dipilih, pengujian spesifik diluncurkan dari jaringan kami, yaitu dari mesin tempat bot berada (jmeter telah dikonfigurasi sebelumnya di sana, pengujian yang diperlukan berada...) atau langsung dari pusat data (dari a mesin yang disiapkan di sebelah aplikasi), untuk mengecualikan koneksi jaringan saat penundaan pengujian, atau menguranginya seminimal mungkin.

Setelah menyelesaikan tes dan menerima log, bot menguraikannya dan menghasilkan hasil dalam bentuk yang “dapat dibaca manusia”:

Kami menghemat waktu, kegelisahan, dan jam kerja

Pengumpulan metrik

Fungsionalitasnya telah hadir dan manajer proyek yang tertarik telah menerima fungsi tersebut untuk wilayah mereka. Dan salah satu Manajer Proyek yang penuh kasih berkata: “Saya ingin memiliki statistik waktu!” Seseorang dari CIT memberitahunya bahwa akan lebih mudah untuk memantau semua ini di Zabbix. Zabbix, jadi Zabbix...

Saya pikir saya perlu mempersiapkan kebutuhan untuk mereplikasi solusinya... Saya memasukkan ide tersebut ke dalam wadah buruh pelabuhan. Di dalam container, jmeter diluncurkan sesuai jadwal (setiap 10 menit sekali), meletakkan log di tempat tertentu, php mem-parsingnya dan menampilkan data yang diperlukan dalam bentuk halaman web. Zabbix, menggunakan kunci web.page.get, menerima halaman ini, secara teratur memilih data yang diperlukan untuk elemen dependen tertentu dan membuat grafik.

Kami menghemat waktu, kegelisahan, dan jam kerja

Menurut saya, hasilnya lumayan. Dengan mengamati grafik, pertama-tama kita melihat perkiraan kecepatan aplikasi, dan jika puncak terdeteksi pada grafik, kita mengetahui kira-kira di mana “steker” berada. Itu mudah. Selama ini ternyata peminatnya hanya di satu daerah saja, tapi saya siap mereplikasinya bagi yang berminat.

Pengembangan aplikasi

Statistik mengenai tugas-tugas serupa baru-baru ini memunculkan lebih banyak ide untuk menyederhanakan dan memfasilitasi pekerjaan. Pada beberapa proyek, di server aplikasi, ada kebutuhan untuk menginstal wadah utama Crypto Pro, jumlahnya banyak, dan tanda tangan digital akan kedaluwarsa seiring waktu. Terkadang 2 tugas tiba dalam sehari. Namun saya menganggap tidak aman menggunakan bot untuk tujuan ini dan memutuskan bahwa saya akan membuat fungsionalitas tersebut langsung di aplikasi. Tentu saja dengan otorisasi dan pengecekan hak akses. Jika Anda memiliki hak istimewa yang diperlukan, item menu tambahan akan tersedia untuk bekerja dengan tanda tangan digital, instalasi, penghapusan, melihat informasi, dll. Fungsionalitas tersebut sedang dalam pengembangan. Ternyata hal ini tidak terlalu sulit, Anda hanya perlu membaca sedikit instruksi yang ada, melihat contoh kode, bertanya kepada rekan yang lebih berpengalaman dalam pengembangan, lalu melakukannya. Selama proses penelitian, muncul ide-ide untuk ditambahkan pada aplikasi. Saya tidak akan membuat rencana Napoleon - ada pembangunan, biarkan semua orang mengurus urusan mereka sendiri. Tapi meski menarik, saya melakukannya sendiri.

Rencana

Seperti yang saya katakan, banyak ide berbeda yang lahir untuk menggunakan bot kami dan tidak hanya - secara umum, katakanlah, ide untuk "titik otomasi", banyak di antaranya yang terlupakan, karena saya tidak punya waktu untuk menuliskannya. Sekarang saya mencoba menuliskan semua yang terlintas dalam pikiran saya, dan saya menyarankan agar orang lain melakukan hal yang sama.

Namun Alexei tak lupa mengutarakan keinginannya. Dari yang terbaru:
/kill_sql SQL_ID — matikan semua sesi dengan permintaan SQL_ID ini
/kill_block - matikan sesi pemblokiran root
/tunjukkan_em — menunjukkan gambar kinerja EM
Dia orang yang licik, dia ingin menjahit DBA dari ponselnya =)

Beginilah cara kami bekerja untuk kepentingan Tanah Air!

Bagaimana Anda melepaskan diri dari tugas-tugas rutin dan tidak menarik?

Semoga bacaannya menarik, bahkan mungkin bermanfaat bagi seseorang, dan saya tidak sempat membuat pembaca bosan... Semoga sukses untuk kita semua.

Sumber: www.habr.com

Tambah komentar