Nakakatipid tayo ng oras, nerbiyos at oras ng tao

Ang aming mga proyekto ay karaniwang panrehiyon, at ang mga kliyente ay karaniwang mga ministeryo. Ngunit, bilang karagdagan sa pampublikong sektor, ginagamit din ng mga pribadong organisasyon ang aming mga sistema. Halos walang problema sa kanila.

Kaya, ang mga pangunahing proyekto ay panrehiyon, at kung minsan ay may mga problema sa kanila. Halimbawa, sa pagganap, kapag sa mga rehiyon mayroong higit sa 20k ng aming mga mahalagang user sa panahon ng paglulunsad ng bagong functionality sa mga server ng produkto. Ito ay isang sakit…

Ang pangalan ko ay Ruslan at sinusuportahan ko ang mga sistema ng impormasyon ng BARS Group at pagbuo ng isang killer bot para sa mga marahas na serial DBA. Ang post na ito ay hindi para sa mahina ang puso - mayroong maraming mga titik at larawan.

Nakakatipid tayo ng oras, nerbiyos at oras ng tao

/awr

Ang ilan sa aming mga application ay tumatakbo sa Oracle DBMS. Mayroon ding mga proyekto sa PostgreSQL DBMS. Ang Oracle ay may isang kahanga-hangang bagay - pagkolekta ng mga istatistika sa pagkarga sa DBMS, na nagha-highlight ng mga umiiral na problema at kahit na gumagawa ng mga rekomendasyon para sa pag-aalis - Automatic Workload Repository (AWR). Sa isang punto (lalo na sa sandali ng sakit), patuloy na hiniling ng mga developer na mangolekta Mga ulat ng AWR para sa pagsusuri sa pagganap. Matapat kaming nagpunta sa DBMS server, nangolekta ng mga ulat, dinala sa amin at ipinadala ang mga ito sa produksyon para sa pagsusuri. After the 5th time naging nakakainis... after the 10th nakakairita na...

Ang isa sa aking mga kasamahan ay minsang nagpahayag ng ideya na ang lahat ng ginagawa nang higit sa isang beses ay dapat na awtomatiko. Hanggang sa sandali ng pangangati, sa totoo lang, hindi ko ito inisip at sinubukan kong i-automate ang lahat ng bagay na maaaring i-automate, ngunit kadalasan ay hindi ito in demand at higit pa sa isang pananaliksik sa halip na isang inilapat na kalikasan.

At pagkatapos ay naisip ko: β€œHindi kailangan ng mga admin para makabuo ng ulat...”. Pagkatapos ng lahat, ang pagkolekta ng isang ulat ay nangangahulugan ng pagpapatupad ng sql script @$ORACLE_HOME/rdbms/admin/awrrpt.sql at pagdadala ng ulat mula sa server patungo sa iyong lugar... Oh oo, hindi namin pinapayagan ang pagbuo para sa produksyon.

Pagkatapos ay nag-Google ako ng kinakailangang impormasyon, nilikha ang function mula sa artikulo sa base ng pagsubok, pinatakbo ang script at himala - ang ulat ay pinagsama-sama at maaaring mai-save nang lokal. Gumawa ng mga function kung saan ang mga ulat ng AWR ay madalas na kailangan at sinabi sa mga developer kung paano gamitin ang mga ito.

Sa panahong ito, sa aking bakanteng oras, pagkatapos makipag-usap kay @BotFather, gumawa ako ng Telegram bot para sa aking sarili, para lang sa kasiyahan. Ako screwed sa isang simpleng pag-andar doon - ipakita ang kasalukuyang oras, exchange rate, panahon, itinuro ito upang magpadala ng mga papuri sa aking asawa (noon kasintahan) sa isang iskedyul. Marahil, sa oras na iyon, ang pagpapadala ng mga papuri ay ang pinakasikat na pag-andar ng aking bot, at pinahahalagahan ito ng aking asawa.

Kaya. Sumulat sa amin ang mga developer sa Telegram, nagpapadala kami ng ulat sa kanila sa Telegram... Paano kung sumulat sila hindi sa amin, ngunit sa isang bot? Pagkatapos ng lahat, ito ay magiging mas mahusay para sa lahat, ang ulat ay matatanggap nang mas mabilis, at higit sa lahat, ang pag-bypass sa amin. Ito ay kung paano ipinanganak ang ideya ng unang tanyag na pag-andar para sa aking bot.

Sinimulan ko ang pagpapatupad. Ginawa ko ito, sa abot ng aking makakaya, sa PHP (ang aming application mismo ay nasa PHP, mas bihasa ako dito kaysa sa Python). Hindi ako magaling na coder, kaya hindi ko ipapakita sa iyo ang aking code :)

Nakatira ang bot sa aming corporate network at may access sa ilang partikular na proyekto, kabilang ang mga target na database. Upang hindi mag-abala sa mga parameter sa koponan o menu, idinagdag ko ang pagpapaandar na ito sa panggrupong chat na may mga notification sa pagsubaybay. Sa ganitong paraan malalaman kaagad ng bot kung saang database kukunin ang ulat.

Ang pagkakaroon ng nakatanggap ng isang utos tulad ng /awr N, kung saan ang N ay ang bilang ng buong oras kung saan kailangan ang isang ulat (bilang default - 1 oras), kahit sa loob ng isang linggo, kung hindi pa na-restart ang database, agad na magsisimulang gumana ang bot, kinokolekta ang ulat, ini-publish ito bilang isang web page at kaagad (halos doon mismo) ay nagbibigay ng link sa lubhang kailangan na ulat.

Sundin ang link at narito, ang ulat ng AWR:

Nakakatipid tayo ng oras, nerbiyos at oras ng tao

Gaya ng inaasahan, nakayanan ng mga developer ang naturang pagbuo ng ulat, at ang ilan ay nagpasalamat pa nga sa amin.

Ang pagkakaroon ng pahalagahan ang kaginhawahan ng koponan, ang mga tagapamahala ng proyekto mula sa ibang mga rehiyon ay nais na pareho, dahil natatanggap nila ang karamihan mula sa customer at nag-aalala tungkol sa pagganap at pagkakaroon ng mga system. Idinagdag ko ang bot sa iba pang mga chat. Ginagamit pa rin nila ito, at natutuwa ako tungkol dito.

Nang maglaon, nalaman ng mga kasamahan mula sa CIT ang tungkol sa kung paano namin kinokolekta ang mga ulat at gusto rin naming gawin ito. Hindi ko sila idinagdag sa aming mga chat, gumawa ako ng hiwalay na chat kasama ang pagbuo ng mga ulat sa isang iskedyul at sa kahilingan.

/pgBadger

Mayroon din kaming iba pang mga application sa PHP kasabay ng PostgreSQL. Ipinatupad ko ang koleksyon ng mga ulat ng pgBadger para sa mga nangangailangan gamit ang parehong prinsipyo - sa mga panggrupong chat. Noong una ay ginamit nila ito, ngunit pagkatapos ay tumigil sila. Ang pag-andar ay pinutol bilang hindi kailangan.

/ tungkulin

Ang aming departamento ay may mga night shift at, ayon dito, ay may iskedyul. Ito ay nasa Google Sheets. Hindi palaging maginhawang maghanap ng link, magbukas ng chart, maghanap para sa iyong sarili... Naglaro din ang isa sa aking mga dating kasamahan sa kanyang Telegram bot at ipinakilala ito sa chat ng aming departamento. mga abiso tungkol sa pagsisimula ng paglilipat ng tungkulin para sa mga empleyado ng departamento. Pino-parse ng bot ang iskedyul, tinutukoy ang taong naka-duty sa kasalukuyang petsa at, ayon sa iskedyul o kapag hiniling, iniuulat kung sino ang naka-duty ngayon. Ito ay naging mahusay at maginhawa. Totoo, hindi ko talaga gusto ang format ng mga mensahe. Gayundin, para sa mga empleyado ng ibang departamento (halimbawa, BC "Medicine"), hindi talaga kailangan ang impormasyon tungkol sa mga naka-duty sa ibang direksyon, ngunit kailangan mong malaman kung sino ang naka-duty sa "Medicine" kung sakaling magkaroon ng mga problema. Nagpasya akong "hiram" ang pag-andar, ngunit baguhin kung ano ang hindi ko gusto. Gumawa ako ng isang format ng mensahe na maginhawa para sa aking sarili at sa iba, na nag-aalis ng hindi kinakailangang impormasyon.

/tnls

Matapos subukan ang automation gamit ang isang Telegram bot, maraming iba't ibang ideya ang lumitaw, ngunit nais kong gawin ang mga mahigpit na kinakailangang bagay. Nagpasya akong manguna mga istatistika sa mga kahilingan. Upang ma-access ang mga proyekto ng aming mga customer, nagpatupad kami ng tinatawag na "jump server" o forwarding server. Itinataas dito ang mga koneksyon sa VPN, pagkatapos ay ipapasa ang mga application port, database at iba pang auxiliary forwarding sa aming lokal na network sa pamamagitan ng ssh, para sa madaling pag-access sa mga proyekto ng aming mga empleyado, nang walang problema sa mga koneksyon sa VPN. Ang kailangan mo lang gawin ay mag-set up ng koneksyon sa VPN sa aming corporate network.

Ipinakita ng mga istatistika ng mga kahilingan na madalas, pagkatapos mabigo ang isa sa mga tunnel (sa kaso ng mga problema sa network, dahil sa timeout, halimbawa), ang mga tao ay nakikipag-ugnayan sa amin tungkol sa pagpapanumbalik ng access sa proyekto. Sa karamihan ng mga kaso, ang pag-restart lamang ng koneksyon ay sapat na at lahat ay maayos. Gawin natin ito sa iyong sarili. Narito ang utos:
Nakakatipid tayo ng oras, nerbiyos at oras ng tao

Ikaw ay "nahuhulog" sa nais na item sa menu, piliin ang iyong proyekto, maghintay ng isang minuto at lahat ay masaya at nasiyahan...

Sa pagtanggap ng isang command, na may bahagyang paggalaw ng mga byte at bits, ang bot ay kumokonekta sa pagpapasa ng server, alam nang maaga kung aling pagpapasa ang kailangang i-restart, at ginagawa ang trabaho nito - ibinabalik ang koneksyon sa proyekto. Sumulat ako ng mga tagubilin para malutas mo mismo ang mga naturang isyu. At nakipag-ugnayan lang sa amin ang mga tao kung hindi gumana ang ibinigay na tool...

/ecp_to_pem

Ang karagdagang mga istatistika ay nagpakita na ito ay madalas na kinakailangan upang mag-convert EDS Crypto Pro sa pem format(Basexnumx) para sa iba't ibang pagsasama, at marami kami sa kanila. Gawain: kumuha ng lalagyan, kopyahin ito sa isang Windows computer na may naka-install na P12FromGostCSP utility (may bayad pala), i-convert ito sa pfx, at pagkatapos ay i-convert ang pfx gamit ang OpenSSL (na may suporta para sa GOST encryption) sa pem. Ito ay hindi masyadong maginhawa, ngunit gusto mo ito sa isang snap ng iyong mga daliri.

Muling sumagip ang Google. Natagpuan utility ng ilang mabait na tao. Binuo ko ito tulad ng nakasulat sa README - gumana ito. Tinuruan ko ang bot na magtrabaho kasama ang utility at nakakuha ng halos instant conversion.
Nakakatipid tayo ng oras, nerbiyos at oras ng tao

Sa oras ng huling pagpapatupad, isang utos ang inisyu upang lumipat sa isang bagong format ng pag-encrypt - gost-2012. Sa pagkakatanda ko, ang utility sa sandaling iyon ay nagtrabaho lamang sa lumang GOST (2001), marahil ito ay isa pang katulad na utility mula sa ibang mabait na tao, hindi ko maalala nang eksakto.
Matapos ang paglipat sa bagong GOST, ang pag-andar ng bot ay inalis para sa mga kadahilanang pangseguridad. Ipinatupad ito sa isang lalagyan ng docker.

Dockerfile, kung sakaling kailanganin ito ng sinuman:

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

Upang mag-convert, kailangan mong ilagay ang orihinal na lalagyan (direktoryo tulad ng xxx.000) sa direktoryo ng /srv/in, at dalhin ang natapos na pem sa /srv/out.

Upang i-convert:

 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 at /emstart

Isang araw, isang napaka-cool na Oracle DBA, na may maraming karanasan sa pangangasiwa at pagpapaunlad ng DBMS, ay nakakuha ng trabaho sa aming kumpanya. At agad siyang nagkaroon ng problema sa pagkonekta sa mga server ng DBMS gamit ang ssh: hindi niya alam kung saan o kung paano kumonekta, hindi malinaw na inilarawan ang pag-access, o hindi niya maipasa ang isang bagay na kailangan niya sa kanyang sarili. Well, masaya kaming tumulong, sinabi namin sa kanya kung paano kumonekta, at ipinasa sa kanya ang Enterprise Manager. Ngunit hindi pa rin nagtagumpay ang mga bagay sa ssh. Ipinaliwanag ito ng isa sa aking mga kasamahan: isang puro DBA :) Napagpasyahan namin na kung kailangan naming mag-tweak ng isang bagay sa server, kami mismo ang gagawa nito.

Minsan ay nag-crash ang EM sa ilalim ng mabigat na pagkarga, at upang i-restart ito... kailangan mong kumonekta sa pamamagitan ng ssh at i-restart sa terminal. β€œMagaling dito ang mga admin,” nagpasya ang aming bagong kasamahan. Ang mabibigat na load sa DBMS ay hindi karaniwan para sa amin, at ang mga kahilingang i-restart ang EM ay karaniwan din. Pagkatapos ang parehong senaryo: pag-igting, pangangati at paghahanap ng solusyon sa problema. Kaya sa parehong mga chat ng grupo ay lumitaw ang mga sumusunod na command: /emstop at /emstart.

Nakakatipid tayo ng oras, nerbiyos at oras ng tao

/patayin

Kung mayroong malakas na kumpetisyon sa database, at kung minsan ito ay nangyayari, kinakailangan upang mabilis na i-unload ang database. Ang pinakamabilis na paraan ay upang patayin ang may problemang proseso... Upang gawin ito, kumonekta sa pamamagitan ng ssh, patayin -9... Ang bot ay makakatulong!

Nakakatipid tayo ng oras, nerbiyos at oras ng tao

Pinahahalagahan ni Alexey ang koponan at binigyan ito ng isang mapagmahal na pangalan - "Kilyalka" o baril.
Isang araw, pagkatapos panoorin kung paano sinubukan at nagdusa si Alexey, pinapasok ang /kill xxx sa bawat oras para sa bawat proseso, nagpasya akong magdagdag ng "multi-barrel" sa aming baril:

Nakakatipid tayo ng oras, nerbiyos at oras ng tao

Mas maganda iyan! Ang lahat ay para sa iyo, Alexey, magtrabaho ka lang, mahal!

Natural, limitado ang gayong mahalagang pangkat access ng user_id - β€œfoolproof”. Nakikita kung paano mabilis na pinapatay ni Lesha ang mga proseso sa server ng database, sinubukan ng ilang tao na magpasok ng isang utos na may random na numero ng proseso, ngunit hindi mo maaaring lokohin ang aking matalinong bot, agad siyang tumanggi.

/alertlog

Well, kung sakali, ginawa ko ang utos:
/alertlog <bilang ng mga linya> β€” makuha ang tinukoy na bilang ng mga linya ng alertlog
Ang bot ay kumukuha ng alertlog at ipinapadala ito sa aming serbisyo, tulad ng pastebin, na tinatawag na pyste, at nagpapadala ng link sa i-paste sa kahilingang makipag-chat.

/nagsusuri

Sumunod na dumating ang isang kahilingan para sa pagsubaybay sa tunay na pagganap ng aming aplikasyon. Hanggang ngayon, manual na kinokolekta ng suportang teknikal ng proyekto ang data na ito. Hindi bagay! Ang aming magigiting na tagasubok ay nakabuo ng mga test case para dito. Ang resultang log ng pagsubok ay hindi masyadong maginhawang basahin; ang isang walang karanasan na gumagamit ay magtatagal upang maunawaan at hindi sigurado na i-highlight niya ang kinakailangang impormasyon. At hindi namin gustong gawin sa aming mga kamay ang hindi namin magawa sa aming mga kamay... Isang bagong gawain para sa bot!

Nakakatipid tayo ng oras, nerbiyos at oras ng tao

Ang utos na /checks ay nagpapakita ng simple at hindi malabo na menu; sa pagkakataong ito natutunan ng aming mga lalaki kung paano gamitin ang utos na ito nang walang mga tagubilin!

Kapag pinili mo ang nais na item, sa halip na isang menu, isang abiso tungkol sa pagsisimula ng pagsubok ay lilitaw, upang ang mga naiinip na user ay hindi patakbuhin ang aming pagsubok nang 100500 beses:

Nakakatipid tayo ng oras, nerbiyos at oras ng tao

Depende sa napiling item sa menu, ang isang partikular na pagsubok ay inilunsad mula sa aming network, lalo na mula sa makina kung saan nakatira ang bot (ang jmeter ay na-pre-configure doon, ang mga kinakailangang pagsubok ay matatagpuan...) o direkta mula sa data center (mula sa isang inihanda na makina sa tabi ng application), upang maibukod ang mga koneksyon sa network kapag naantala ang pagsubok, o bawasan ang mga ito sa pinakamababa.

Pagkatapos makumpleto ang pagsubok at matanggap ang log, i-parse ito ng bot at ilalabas ang resulta sa isang form na "nababasa ng tao":

Nakakatipid tayo ng oras, nerbiyos at oras ng tao

Koleksyon ng mga sukatan

Dumating na ang functionality at nakatanggap ang mga interesadong project manager ng ganoong function para sa kanilang mga rehiyon. At sinabi ng isang mahabaging Project Manager: "Gusto kong magkaroon ng mga istatistika ng oras!" Isang tao mula sa CIT ang nagsabi sa kanya na magiging maginhawang subaybayan ang lahat ng ito sa Zabbix. Zabbix, kaya Zabbix...

Naisip ko na kailangan kong maghanda para sa pangangailangang kopyahin ang solusyon... Inilagay ko ang ideya sa isang lalagyan ng pantalan. Sa lalagyan, ang jmeter ay inilunsad sa isang iskedyul (isang beses bawat 10 minuto), inilalagay ang log sa isang tiyak na lugar, pina-parse ito ng php at ipinapakita ang kinakailangang data sa anyo ng isang web page. Ang Zabbix, gamit ang web.page.get key, ay tumatanggap ng page na ito, regular na pinipili ang kinakailangang data para sa ilang mga umaasang elemento at bumubuo ng graph.

Nakakatipid tayo ng oras, nerbiyos at oras ng tao

Sa tingin ko ito ay naging hindi masama. Sa pamamagitan ng pagmamasid sa graph, una, nakikita namin ang tinatayang bilis ng application, at kung ang mga peak ay nakita sa graph, alam namin ang humigit-kumulang kung nasaan ang "plug". Simple lang. Sa ngayon, ito ay naging in demand lamang para sa isang rehiyon, ngunit handa akong gayahin ito para sa mga interesado.

Pag-unlad ng aplikasyon

Ang mga istatistika sa mga katulad na gawain ay nagbigay kamakailan ng higit pang mga ideya para sa pagpapasimple at pagpapadali ng gawain. Sa ilang mga proyekto, sa mga server ng application, kailangang mag-install ng mga pangunahing lalagyan ng Crypto Pro, marami sa kanila, at ang digital na lagda ay mag-e-expire sa paglipas ng panahon. Minsan 2 gawain ang dumarating sa isang araw. Ngunit itinuring kong hindi ligtas na gumamit ng bot para sa mga layuning ito at nagpasya akong gagawa ako ng functionality nang direkta sa application. Natural na may pahintulot at pagsuri sa mga karapatan sa pag-access. Kung mayroon kang mga kinakailangang pribilehiyo, ang isang karagdagang item sa menu ay magagamit para sa pagtatrabaho sa mga digital na lagda, pag-install, pagtanggal, pagtingin sa impormasyon, atbp. Ang functionality ay kasalukuyang nasa ilalim ng pagbuo. Tulad ng nangyari, hindi ito napakahirap, kailangan mo lamang basahin nang kaunti ang umiiral na mga tagubilin, tingnan ang mga halimbawa ng code, tanungin ang mga kasamahan na mas may karanasan sa pag-unlad, at pagkatapos ay gawin ito. Sa panahon ng proseso ng pananaliksik, lumitaw ang mga ideya upang idagdag sa aplikasyon. Hindi ako gagawa ng mga planong Napoleoniko - mayroong pag-unlad, hayaan ang lahat na isipin ang kanilang sariling negosyo. Ngunit habang ito ay kawili-wili, ginagawa ko ito sa aking sarili.

Mga Plano

Tulad ng sinabi ko, maraming iba't ibang mga ideya ang ipinanganak para sa paggamit ng aming bot at hindi lamang - sa pangkalahatan, sabihin natin, mga ideya para sa "mga punto ng automation", marami sa kanila ang nakalimutan, dahil wala akong oras upang isulat ang mga ito. Ngayon ay sinusubukan kong isulat ang lahat ng pumapasok sa isip ko, at inirerekomenda ko na gawin din iyon ng iba.

Ngunit hindi nakakalimutan ni Alexey na ibigay ang kanyang mga kahilingan. Mula sa pinakabago:
/kill_sql SQL_ID β€” patayin ang lahat ng session sa kahilingang ito ng SQL_ID
/kill_block - patayin ang root blocking session
/show_em β€” magpakita ng larawan ng EM performance
Siya ay isang tusong tao, gusto niyang manahi ng DBA sa kanyang telepono =)

Ganito tayo gumagawa para sa kapakanan ng Inang Bayan!

Paano mo aalisin ang iyong sarili sa nakagawian at hindi kawili-wiling mga gawain?

Umaasa ako na ang pagbabasa ay naging kawili-wili, at maaaring maging kapaki-pakinabang sa isang tao, at wala akong oras upang mainip ang mambabasa ... Good luck sa ating lahat.

Pinagmulan: www.habr.com

Magdagdag ng komento