Štedimo vrijeme, živce i radne sate

Naši projekti su uglavnom regionalni, a naručioci su uglavnom ministarstva. Ali, pored javnog sektora, naše sisteme koriste i privatne organizacije. Sa njima praktično nema problema.

Dakle, glavni projekti su regionalni i ponekad ima problema s njima. Na primjer, sa performansama, kada u regijama ima više od 20 hiljada naših dragocjenih korisnika tokom perioda uvođenja nove funkcionalnosti na servere proizvoda. To je bol…

Moje ime je Ruslan i podržavam informacione sisteme BARS Grupe i razvoj bota ubice za nasilne serijske DBA. Ovaj post nije za one sa slabim srcem - ima puno pisama i slika.

Štedimo vrijeme, živce i radne sate

/awr

Neke od naših aplikacija rade na Oracle DBMS-u. Postoje i projekti na PostgreSQL DBMS. Oracle ima divnu stvar - prikupljanje statistike o opterećenju DBMS-a, koja naglašava postojeće probleme, pa čak i daje preporuke za eliminaciju - Automatsko spremište radnog opterećenja (AWR). U jednom trenutku (naime u trenutku bola), programeri su stalno tražili da naplate AWR izvještaji za analizu performansi. Iskreno smo otišli na DBMS server, prikupili izvještaje, odnijeli ih nama i poslali u proizvodnju na analizu. Posle 5. puta je postalo dosadno... posle 10. je postalo iritantno...

Jedan od mojih kolega je jednom izrazio ideju da sve što se radi više puta treba automatizovati. Do trenutka iritacije, da budem iskren, nisam razmišljao o tome i pokušavao sam automatizirati sve što se moglo automatizirati, ali često to nije bilo traženo i više je bilo istraživačke nego primijenjene prirode.

A onda sam pomislio: “Administratori nisu potrebni za generiranje izvještaja...”. Na kraju krajeva, prikupljanje izvještaja znači izvršavanje sql skripte @$ORACLE_HOME/rdbms/admin/awrrpt.sql i odnošenje izvještaja sa servera na vaše mjesto... O da, ne dozvoljavamo razvoj za proizvodnju.

Zatim sam izguglao potrebne informacije, napravio funkciju iz članka na test bazi, pokrenuo skriptu i čudo - izvještaj je sastavljen i može se spremiti lokalno. Kreirao funkcije gdje su AWR izvještaji često bili potrebni i rekao programerima kako da ih koriste.

Otprilike u to vrijeme, u slobodno vrijeme, nakon razgovora sa @BotFather-om, napravio sam Telegram bot za sebe, samo iz zabave. Tu sam zeznuo jednostavnu funkcionalnost - prikaz trenutnog vremena, kursa, vremena, naučio sam da šalje komplimente mojoj ženi (tada devojci) po rasporedu. Možda je u to vrijeme slanje komplimenata bila najpopularnija funkcionalnost mog bota i moja žena je to cijenila.

Dakle. Programeri nam pišu u Telegram, mi im šaljemo izveštaj u Telegram... Šta ako ne pišu nama, već botu? Na kraju krajeva, svima će biti bolje, prijava će biti primljena brže, a što je najvažnije, zaobilazeći nas. Tako se rodila ideja o prvoj popularnoj funkcionalnosti za mog bota.

Počeo sam sa implementacijom. Uradio sam to, najbolje što sam mogao, u PHP-u (sama naša aplikacija je u PHP-u, ja sam više upućen u nju nego u Python). Nisam dobar koder, pa ti neću pokazivati ​​svoj kod :)

Bot živi na našoj korporativnoj mreži i ima pristup određenim projektima, uključujući ciljne baze podataka. Kako se ne bih zamarao parametrima u timu ili menijem, ovu funkcionalnost sam priložio grupnom ćaskanju uz praćenje obavijesti. Na ovaj način bot odmah zna iz koje baze podataka da prikupi izvještaj.

Dobivši komandu poput /awr N, gde je N broj punih sati za koje je potreban izveštaj (podrazumevano - 1 sat), čak i za nedelju dana, ako baza podataka nije ponovo pokrenuta, bot odmah počinje da radi, prikuplja izveštaj, objavljuje ga kao web stranicu i odmah (skoro tu) daje link do prijeko potrebnog izvještaja.

Pratite link i evo ga, AWR izvještaj:

Štedimo vrijeme, živce i radne sate

Očekivano, programeri su se nosili sa ovakvim generiranjem izvještaja, a neki su nam se i zahvalili.

Pošto su cijenili udobnost tima, to su željeli i projekt menadžeri iz drugih regiona, jer od kupaca dobijaju najviše i brinu o performansama i dostupnosti sistema. Dodao sam bota u druge razgovore. I dalje ga koriste, i drago mi je zbog toga.

Kasnije su kolege iz CIT-a saznali kako prikupljamo izvještaje i htjeli su to i učiniti. Nisam ih dodao u naše razgovore, napravio sam poseban chat sa generiranjem izvještaja po rasporedu i na zahtjev.

/pgBadger

Imamo i druge aplikacije u PHP-u u sprezi sa PostgreSQL-om. Prikupljanje pgBadger izvještaja za one kojima je potrebno implementirao sam po istom principu - u grupnim razgovorima. U početku su ga koristili, ali su onda prestali. Funkcionalnost je uklonjena kao nepotrebna.

/dužnost

Naš odjel ima noćne smjene i shodno tome ima raspored. Nalazi se u Google tabelama. Nije uvek zgodno tražiti link, otvoriti grafikon, potražiti sebe... Jedan od mojih bivših kolega se takođe poigrao sa svojim Telegram botom i uveo ga u chat našeg odeljenja obavještenja o početku dežurstva službenika odjeljenja. Bot analizira raspored, određuje dežurnog prema trenutnom datumu i po rasporedu ili na zahtjev javlja ko je danas dežuran. Ispalo je odlično i zgodno. Istina, nije mi se baš dopao format poruka. Takođe, zaposlenima drugog odjeljenja (npr. KK „Medicina“) podaci o dežurnim na drugim smjerovima nisu baš potrebni, ali morate znati ko dežura u „Medicini“ u slučaju problema. Odlučio sam da "pozajmim" funkcionalnost, ali promijenim ono što mi se nije svidjelo. Napravio sam format poruke prikladan za sebe i druge, uklonivši nepotrebne informacije.

/tnls

Nakon što sam isprobao automatizaciju pomoću Telegram bota, pojavilo se mnogo različitih ideja, ali sam želio da uradim strogo neophodne stvari. Odlučio sam da vodim statistika o zahtjevima. Za pristup projektima naših klijenata implementirali smo takozvani „jump server“ ili server za prosljeđivanje. Na njemu se podižu VPN konekcije, zatim se portovi aplikacija, baze podataka i ostala pomoćna prosljeđivanja prosljeđuju u našu lokalnu mrežu putem ssh-a, radi lakšeg pristupa projektima naših zaposlenika, bez problema s VPN konekcijama. Sve što trebate učiniti je postaviti VPN vezu na našu korporativnu mrežu.

Statistika zahtjeva je pokazala da se često, nakon kvara nekog od tunela (u slučaju problema s mrežom, zbog tajm-auta, na primjer), kontaktiraju ljudi za vraćanje pristupa projektu. U većini slučajeva dovoljno je samo ponovno pokretanje veze i sve je u redu. Hajde da to uradimo sami. Evo naredbe:
Štedimo vrijeme, živce i radne sate

“Upadate” u željenu stavku menija, birate svoj projekat, čekate malo i svi su sretni i zadovoljni...

Po prijemu komande, uz lagano pomeranje bajtova i bitova, bot se povezuje sa serverom za prosleđivanje, znajući unapred koje prosleđivanje treba ponovo pokrenuti, i radi svoj posao - vraća vezu sa projektom. Napisao sam instrukcije kako biste sami riješili takve probleme. I ljudi su nas kontaktirali samo ako ponuđeni alat nije radio...

/ecp_to_pem

Dalja statistika je pokazala da je često potrebno izvršiti konverziju EDS Crypto Pro u pem formatu(Baza64) za razne integracije, a imamo ih dosta. Zadatak: uzmite kontejner, kopirajte ga na Windows računar sa instaliranim uslužnim programom P12FromGostCSP (usput rečeno plaćenim), konvertujte ga u pfx, a zatim konvertujte pfx koristeći OpenSSL (sa podrškom za GOST enkripciju) u pem. Nije baš zgodno, ali želite da vam bude na dodir.

Google je ponovo priskočio u pomoć. Pronađen korisnost neke ljubazne osobe. Sastavio sam ga kako je napisano u README-u - radilo je. Naučio sam bota da radi sa uslužnim programom i dobio sam skoro trenutnu konverziju.
Štedimo vrijeme, živce i radne sate

Do konačne implementacije izdata je naredba za prelazak na novi format šifriranja - gost-2012. Koliko se sjećam, uslužni program je u tom trenutku radio samo sa starim GOST-om (2001), možda je to bio još jedan sličan uslužni program od druge ljubazne osobe, ne sjećam se tačno.
Nakon prelaska na novi GOST, funkcionalnost bota je uklonjena iz sigurnosnih razloga. Implementirano u docker kontejner.

Dockerfile, u slučaju da nekom zatreba:

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

Da biste konvertovali, potrebno je da originalni kontejner (direktorij poput xxx.000) postavite u /srv/in direktorijum i odnesete gotov pem u /srv/out.

Za pretvaranje:

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

Jednog dana, vrlo cool Oracle DBA, sa mnogo iskustva u administraciji i razvoju DBMS-a, dobio je posao u našoj kompaniji. I odmah je imao problema da se poveže na DBMS servere preko ssh-a: ne zna gde i kako da se poveže, pristup nije jasno opisan ili ne može sebi da prosledi nešto što mu je potrebno. Pa, rado ćemo pomoći, rekli smo mu kako da se poveže i prosledili mu Enterprise Manager. Ali stvari i dalje nisu išle sa ssh-om. Jedan od mojih kolega je to jednostavno objasnio: čistokrvni DBA :) Odlučili smo da ako trebamo nešto podesiti na serveru, to ćemo učiniti sami.

EM se ponekad ruši pod velikim opterećenjem, a da biste ga ponovo pokrenuli... morate se povezati preko ssh-a i ponovo pokrenuti preko terminala. „Admini su dobri u ovome“, zaključio je naš novi kolega. Velika opterećenja na DBMS-u nisu neuobičajena za nas, a česti su i zahtjevi za ponovno pokretanje EM-a. Zatim isti scenario: napetost, iritacija i traženje rješenja za problem. Tako su se u istim grupnim razgovorima pojavile sljedeće komande: /emstop i /emstart.

Štedimo vrijeme, živce i radne sate

/ubiti

Ako postoji jaka konkurencija na bazi podataka, a to se ponekad dešava, potrebno je brzo rasterećenje baze podataka. Najbrži način je da ubijete problematičan proces... Da biste to učinili, povežite se preko ssh-a, ubijte -9... Bot će pomoći!

Štedimo vrijeme, živce i radne sate

Alexey je cijenio tim i dao mu ljubazno ime - "kiljalka" ili pištolj.
Jednog dana, nakon što sam gledao kako se Aleksej trudio i patio, unoseći /kill xxx svaki put za svaki od procesa, odlučio sam da našem pištolju dodam „multi-cijev“:

Štedimo vrijeme, živce i radne sate

To je bolje! Sve je za tebe, Aleksej, samo radi, draga!

Naravno, ovako važan tim je bio ograničen pristup po user_id - “bez greške”. Vidjevši kako Lesha spretno ubija procese na serveru baze podataka, nekoliko ljudi je pokušalo unijeti naredbu s nasumičnim brojem procesa, ali ne možete prevariti mog pametnog bota, on je odmah odbio.

/alertlog

Pa, za svaki slučaj, napravio sam komandu:
/alertlog <broj redaka> — dobiti određeni broj redova dnevnika upozorenja
Bot izvlači alertlog i šalje ga našem servisu, kao pastebin, koji se zove pyste, i šalje link na paste u chat sa zahtjevom.

/checks

Zatim je došao zahtjev za praćenje stvarnih performansi naše aplikacije. Do sada je tehnička podrška projekta prikupljala ove podatke ručno. Bez obzira! Naši hrabri testeri razvili su testne slučajeve za ovo. Rezultirajući testni dnevnik nije baš zgodan za čitanje; neiskusnom korisniku će trebati mnogo vremena da shvati i nije siguran da će istaknuti potrebne informacije. I ne volimo da radimo rukama ono što ne možemo rukama... Novi zadatak za bota!

Štedimo vrijeme, živce i radne sate

Naredba /checks prikazuje jednostavan i nedvosmislen meni; ovog puta su naši momci naučili kako koristiti ovu naredbu bez instrukcija!

Kada odaberete željenu stavku, umjesto menija, pojavljuje se obavijest o početku testa, kako nestrpljivi korisnici ne bi pokrenuli naš test 100500 puta:

Štedimo vrijeme, živce i radne sate

U zavisnosti od izabrane stavke menija, određeni test se pokreće sa naše mreže, odnosno sa mašine na kojoj živi bot (tu je unapred konfigurisan jmeter, nalaze se potrebni testovi...) ili direktno iz data centra (sa pripremljenu mašinu pored aplikacije), kako biste isključili mrežne veze prilikom testiranja kašnjenja ili ih sveli na minimum.

Nakon završetka testa i prijema dnevnika, bot ga analizira i proizvodi rezultat u "ljudski čitljivom" obliku:

Štedimo vrijeme, živce i radne sate

Kolekcija metrika

Funkcionalnost je stigla i zainteresovani projekt menadžeri su dobili takvu funkciju za svoje regije. A jedan saosećajni menadžer projekta je rekao: „Želim da imam statistiku vremena!” Neko iz CIT-a joj je rekao da bi bilo zgodno sve ovo pratiti u Zabbixu. Zabbix, pa Zabbix...

Mislio sam da se moram pripremiti za potrebu repliciranja rješenja... Stavio sam ideju u docker kontejner. U kontejneru se jmeter pokreće po rasporedu (jednom svakih 10 minuta), stavlja log na određeno mjesto, php ga analizira i prikazuje potrebne podatke u obliku web stranice. Zabbix, koristeći ključ web.page.get, prima ovu stranicu, redovno bira potrebne podatke za određene zavisne elemente i pravi graf.

Štedimo vrijeme, živce i radne sate

Mislim da nije loše ispalo. Posmatrajući graf, prvo vidimo približnu brzinu aplikacije, a ako se na grafu detektuju pikovi, otprilike znamo gdje se nalazi “čep”. To je jednostavno. Do sada se pokazalo da je tražen samo za jednu regiju, ali sam spreman da ga repliciram za zainteresovane.

Razvoj aplikacija

Statistički podaci o sličnim zadacima nedavno su doveli do više ideja za pojednostavljenje i olakšavanje rada. Na nekim projektima, na serverima aplikacija, postoji potreba za instaliranjem ključnih Crypto Pro kontejnera, ima ih mnogo, a digitalni potpis ističe vremenom. Ponekad stignu 2 zadatka dnevno. Ali smatrao sam da nije sigurno koristiti bot u ove svrhe i odlučio sam da kreiram funkcionalnost direktno u aplikaciji. Naravno uz autorizaciju i provjeru prava pristupa. Ukoliko imate potrebne privilegije biće dostupna dodatna stavka menija za rad sa digitalnim potpisima, instalaciju, brisanje, pregled informacija itd. Funkcionalnost je trenutno u razvoju. Kako se pokazalo, to nije baš teško, samo treba malo pročitati postojeće upute, pogledati primjere koda, pitati kolege iskusnije u razvoju i onda to učiniti. Tokom procesa istraživanja pojavile su se ideje za dodavanje u aplikaciju. Neću praviti Napoleonove planove - ima razvoja, neka svako gleda svoja posla. Ali iako je zanimljivo, ja to radim sam.

Planovi

Kao što sam rekao, rodilo se mnogo različitih ideja za korištenje našeg bota i ne samo - općenito, recimo, ideje za "tačke automatizacije", mnoge od njih su zaboravljene, jer nisam imao vremena da ih zapišem. Sada pokušavam da zapišem sve što mi padne na pamet, a preporučujem i drugima da to učine.

Ali Aleksej ne zaboravlja da izrazi svoje želje. Od najnovijih:
/kill_sql SQL_ID — ukinuti sve sesije sa ovim SQL_ID zahtjevom
/kill_block - ubiti root sesiju blokiranja
/show_em — pokažite sliku EM performansi
On je lukav tip, hoće da sašije DBA sa svog telefona =)

Ovako radimo za dobrobit Otadžbine!

Kako se riješiti rutinskih i nezanimljivih zadataka?

Nadam se da je čitanje bilo zanimljivo, a možda i nekome korisno, a nisam imao vremena da dosadim čitaocu... Srećno svima.

izvor: www.habr.com

Dodajte komentar