Štedimo vrijeme, živce i radne sate

Naši su projekti najčešće regionalni, a naručitelji su uglavnom ministarstva. No, osim javnog sektora, naše sustave koriste i privatne organizacije. S njima praktički nema problema.

Dakle, glavni projekti su regionalni i s njima ponekad ima problema. Na primjer, s izvedbom, kada u regijama postoji više od 20 tisuća naših dragocjenih korisnika tijekom razdoblja uvođenja nove funkcionalnosti na poslužitelje proizvoda. To je bol…

Moje ime je Ruslan i podržavam informacijske sustave BARS Grupe i razvijanje ubojitog bota za nasilne serijske DBA-ove. 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-u. Oracle ima divnu stvar - prikupljanje statistike o opterećenju DBMS-a, koja naglašava postojeće probleme i čak daje preporuke za uklanjanje - Automatic Workload Repository (AWR). U jednom trenutku (naime u trenutku boli), programeri su stalno tražili prikupljanje AWR izvješća za analizu učinka. Pošteno smo otišli do DBMS servera, prikupili izvještaje, odnijeli ih nama i poslali u proizvodnju na analizu. Nakon 5. puta postalo je dosadno... nakon 10. postalo je iritantno...

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

A onda sam pomislio: “Administratori nisu potrebni za generiranje izvješća...”. Uostalom, prikupljanje izvješća znači izvršavanje sql skripte @$ORACLE_HOME/rdbms/admin/awrrpt.sql i uzimanje izvješća s poslužitelja na vaše mjesto... O da, ne dopuštamo razvoj za proizvodnju.

Zatim sam guglao potrebne informacije, kreirao funkciju iz članka na testnoj bazi, pokrenuo skriptu i čudo - izvješće je sastavljeno i može se spremiti lokalno. Stvorio je funkcije gdje su AWR izvješća često bila potrebna i rekao programerima kako ih koristiti.

Otprilike u to vrijeme, u svoje slobodno vrijeme, nakon razgovora s @BotFather, napravio sam Telegram bota za sebe, samo iz zabave. Ubacio sam tamo jednostavnu funkcionalnost - prikaz trenutnog vremena, tečaja, vremena, naučio ga slati komplimente mojoj supruzi (tada djevojci) po rasporedu. Možda je u to vrijeme slanje komplimenata bila najpopularnija funkcija mog bota i moja je žena to cijenila.

Tako. Programeri nam pišu u Telegramu, mi im šaljemo izvještaj u Telegramu... Što ako oni ne pišu nama, nego botu? Uostalom, svima će biti bolje, prijava će se dobivati ​​brže, a što je najvažnije, zaobići nas. Tako se rodila ideja o prvoj popularnoj funkcionalnosti za mog bota.

Počeo sam s implementacijom. Napravio sam to, koliko sam mogao, u PHP-u (sama naša aplikacija je u PHP-u, više sam upućen u njega nego u Python). Nisam dobar koder, pa vam neću pokazati 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 s izbornikom, ovu sam funkcionalnost priključio grupnom chatu s obavijestima o praćenju. Na ovaj način bot odmah zna iz koje baze podataka prikuplja izvješće.

Dobivši naredbu poput /awr N, gdje je N broj punih sati za koje je potrebno izvješće (standardno - 1 sat), čak i za tjedan dana, ako baza nije ponovno pokrenuta, bot odmah počinje raditi, prikuplja izvješće, objavljuje ga kao web stranici i odmah (gotovo odmah tamo) daje poveznicu na prijeko potrebno izvješće.

Pratite link i evo ga, AWR izvješće:

Štedimo vrijeme, živce i radne sate

Očekivano, programeri su se nosili s takvim generiranjem izvješća, a neki su nam se i zahvalili.

Pošto su cijenili praktičnost tima, projektni menadžeri iz drugih regija željeli su isto, jer oni najviše dobivaju od kupca i brinu o performansama i dostupnosti sustava. Dodao sam bota drugim chatovima. Još uvijek ga koriste i drago mi je zbog toga.

Kasnije su kolege iz CIT-a saznali na koji način prikupljamo prijave i htjeli su to i učiniti. Nisam ih dodao u naše chatove, napravio sam zaseban chat s generiranjem izvješća po rasporedu i na zahtjev.

/pgJazavac

Imamo i druge aplikacije u PHP-u u kombinaciji s PostgreSQL-om. Implementirao sam prikupljanje pgBadger izvješća za one kojima je to potrebno koristeći isti princip - u grupnim razgovorima. Isprva su ga koristili, a onda su prestali. Funkcionalnost je izrezana kao nepotrebna.

/dužnost

Naš odjel ima noćne smjene i shodno tome ima raspored. Nalazi se u Google tablicama. Nije uvijek zgodno tražiti link, otvarati grafikon, tražiti se... Jedan moj bivši kolega također se poigrao sa svojim Telegram botom i uveo ga u chat našeg odjela obavijesti o početku dežurstva za djelatnike odjela. Bot analizira raspored, određuje dežurnog do trenutnog datuma i prema rasporedu ili na zahtjev javlja tko je danas dežuran. Ispalo je super i zgodno. Istina, nije mi se baš sviđao format poruka. Također, zaposlenicima drugog odjela (primjerice, KK “Medicina”) informacije o dežurnim u drugim smjerovima zapravo nisu potrebne, ali morate znati tko je dežuran u “Medicini” u slučaju problema. Odlučio sam "posuditi" funkcionalnost, ali promijeniti ono što mi se nije sviđalo. Napravio sam format poruke pogodan za sebe i druge, uklanjajući nepotrebne informacije.

/tnls

Nakon što sam isprobao automatizaciju pomoću Telegram bota, pojavilo se mnogo različitih ideja, ali ja sam želio raditi strogo potrebne stvari. Odlučio sam voditi statistika zahtjeva. Za pristup projektima naših kupaca implementirali smo takozvani "jump server" ili poslužitelj za prosljeđivanje. Na njemu se podižu VPN veze, zatim se portovi aplikacija, baze podataka i ostala pomoćna prosljeđivanja prosljeđuju u našu lokalnu mrežu putem ssh-a, za lak pristup projektima naših zaposlenika, bez problema s VPN vezama. Sve što trebate učiniti je postaviti VPN vezu s našom korporativnom mrežom.

Statistika zahtjeva je pokazala da nas često, nakon što jedan od tunela zakaže (u slučaju problema s mrežom, zbog timeouta, na primjer), ljudi kontaktiraju za vraćanje pristupa projektu. U većini slučajeva dovoljno je samo ponovno pokretanje veze i sve je u redu. Učinimo to sami. Evo naredbe:
Štedimo vrijeme, živce i radne sate

“Upadnete” u željenu točku izbornika, odaberete svoj projekt, pričekate minutu i svi sretni i zadovoljni...

Po primitku naredbe, uz lagano pomicanje bajtova i bitova, bot se spaja na server za prosljeđivanje, unaprijed znajući koje prosljeđivanje treba ponovno pokrenuti, te obavlja svoj posao – uspostavlja vezu s projektom. Napisao sam upute kako biste sami mogli riješiti takve probleme. I ljudi su nas kontaktirali samo ako im ponuđeni alat nije radio...

/ecp_to_pem

Daljnje statistike pokazale su da je često potrebno izvršiti konverziju EDS Crypto Pro u pem formatu(Base64) za razne integracije, a imamo ih dosta. Zadatak: uzmite spremnik, kopirajte ga na Windows računalo s instaliranim uslužnim programom P12FromGostCSP (usput rečeno), pretvorite ga u pfx, a zatim pretvorite pfx pomoću OpenSSL-a (s podrškom za GOST enkripciju) u pem. Nije baš prikladno, ali želite ga na trenutak.

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

Do trenutka konačne implementacije izdana 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 druge ljubazne osobe, ne sjećam se točno.
Nakon prelaska na novi GOST, funkcionalnost bota je uklonjena iz sigurnosnih razloga. Implementirao ga u docker kontejner.

Dockerfile, u slučaju da nekome 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 pretvorili, trebate smjestiti izvorni spremnik (direktorij poput xxx.000) u direktorij /srv/in i odnijeti gotov pem u /srv/out.

Za pretvorbu:

 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, s puno iskustva u administraciji i razvoju DBMS-a, dobio je posao u našoj tvrtki. I odmah je imao problema sa spajanjem na DBMS poslužitelje sa ssh-om: ne zna gdje i kako se spojiti, pristup nije jasno opisan ili ne može sam sebi proslijediti nešto što mu treba. Pa, rado ćemo pomoći, rekli smo mu kako se spojiti i proslijedili mu Enterprise Manager. Ali stvari i dalje nisu funkcionirale sa ssh-om. Jedan moj kolega je to jednostavno objasnio: čistokrvni DBA :) Odlučili smo da ćemo, ako trebamo nešto podesiti na poslužitelju, to učiniti sami.

EM se ponekad ruši pod velikim opterećenjem, a za ponovno pokretanje... morate se spojiti preko ssh-a i ponovno pokrenuti preko terminala. "Admini su dobri u ovome", zaključio je naš novi kolega. Velika opterećenja DBMS-a nisu nam neuobičajena, a česti su i zahtjevi za ponovnim pokretanjem EM-a. Zatim isti scenarij: napetost, iritacija i potraga za rješenjem problema. Tako su se u istim grupnim razgovorima pojavile sljedeće naredbe: /emstop i /emstart.

Štedimo vrijeme, živce i radne sate

/ubiti

Ako postoji jaka konkurencija na bazi podataka, a to se ponekad događa, potrebno je brzo rasteretiti bazu podataka. Najbrži način je ubiti problematični proces... Da biste to učinili, spojite se preko ssh, ubijte -9... Bot će vam pomoći!

Štedimo vrijeme, živce i radne sate

Alexey je cijenio tim i dao mu nježno ime - "Kilyalka" ili pištolj.
Jednog dana, nakon što sam gledao kako se Alexey trudio i patio, unoseći /kill xxx svaki put za svaki od procesa, odlučio sam dodati "višecijevku" našem pištolju:

Štedimo vrijeme, živce i radne sate

Tako je bolje! Sve je za tebe, Alexey, samo radi, dragi!

Naravno, tako važan tim bio je ograničen pristup prema user_id - “bezgrešno”. Vidjevši kako Lesha vješto ubija procese na poslužitelju baze podataka, nekoliko je ljudi pokušalo unijeti naredbu s nasumičnim brojem procesa, ali ne možete prevariti mog pametnog bota, odmah je odbio.

/alertlog

Pa, za svaki slučaj, napravio sam naredbu:
/alertlog — dobiti navedeni broj redaka dnevnika upozorenja
Bot povlači alertlog i šalje ga našoj usluzi, kao što je pastebin, nazvan pyste, i šalje vezu na paste u chat sa zahtjevima.

/provjerava

Zatim je uslijedio zahtjev za praćenje stvarne izvedbe naše aplikacije. Do sada je tehnička podrška projekta prikupljala te podatke ručno. Nema veze! Naši hrabri testeri razvili su testne slučajeve za to. Rezultirajući dnevnik testa nije baš zgodan za čitanje; neiskusnom korisniku trebat će dugo vremena da ga razumije i nije siguran da će istaknuti potrebne informacije. A ne volimo raditi rukama ono što rukama ne možemo... Novi zadatak za bota!

Štedimo vrijeme, živce i radne sate

Naredba /checks prikazuje jednostavan i nedvosmislen izbornik, ovaj put su naši dečki naučili koristiti ovu naredbu bez instrukcija!

Kada odaberete željenu stavku, umjesto izbornika pojavljuje se obavijest o početku testa, tako da nestrpljivi korisnici ne pokreću naš test 100500 puta:

Štedimo vrijeme, živce i radne sate

Ovisno o odabranoj stavci izbornika, određeni test se pokreće iz naše mreže, odnosno sa stroja na kojem se nalazi bot (tamo je unaprijed konfiguriran jmeter, nalaze se potrebni testovi...) ili izravno iz podatkovnog centra (iz pripremljenom stroju pored aplikacije), kako biste isključili mrežne veze prilikom testiranja kašnjenja ili ih sveli na minimum.

Nakon dovršetka testa i primanja dnevnika, bot ga analizira i daje rezultat u "čovjeku čitljivom" obliku:

Štedimo vrijeme, živce i radne sate

Zbirka metrike

Funkcionalnost je stigla i zainteresirani voditelji projekata dobili su takvu funkciju za svoje regije. A jedan suosjećajni voditelj projekta je rekao: "Želim imati statistiku vremena!" Netko iz CIT-a joj je rekao da bi bilo zgodno sve to 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), postavlja log na određeno mjesto, php ga analizira i prikazuje potrebne podatke u obliku web stranice. Zabbix pomoću ključa web.page.get prima ovu stranicu, redovito odabire potrebne podatke za pojedine zavisne elemente i gradi graf.

Štedimo vrijeme, živce i radne sate

Mislim da nije loše ispalo. Promatrajući graf, prvo vidimo približnu brzinu aplikacije, a ako se detektiraju pikovi na grafu, otprilike znamo gdje je “čep”. Jednostavno je. Do sada se pokazalo da je tražen samo u jednoj regiji, ali spreman sam ga replicirati za zainteresirane.

Razvoj aplikacija

Statistike o sličnim poslovima u posljednje su vrijeme potaknule više ideja za pojednostavljenje i olakšavanje rada. Na nekim projektima, na aplikacijskim poslužiteljima, potrebno je instalirati ključne Crypto Pro spremnike, ima ih mnogo, a digitalni potpis vremenom ističe. Ponekad stignu 2 zadatka dnevno. Ali smatrao sam da nije sigurno koristiti bota u te svrhe i odlučio sam stvoriti funkcionalnost izravno u aplikaciji. Naravno uz autorizaciju i provjeru prava pristupa. Ako imate potrebne privilegije, bit će dostupna dodatna stavka izbornika za rad s digitalnim potpisima, instalaciju, brisanje, pregled informacija itd. Funkcionalnost je trenutno u razvoju. Kako se pokazalo, to nije jako teško, samo trebate malo pročitati postojeće upute, pogledati primjere koda, pitati kolege iskusnije u razvoju i onda to učiniti. Tijekom procesa istraživanja pojavile su se ideje za dodavanje u aplikaciju. Neću praviti napoleonske planove - ima razvoja, neka svatko gleda svoja posla. Ali iako je zanimljivo, radim to 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 "točke automatizacije", mnoge od njih su zaboravljene, jer nisam imao vremena da ih zapišem. Sada pokušavam zapisati sve što mi padne na pamet, a preporučam i drugima da učine isto.

Ali Alexey ne zaboravlja izraziti svoje želje. Od najnovijeg:
/kill_sql SQL_ID — ubijte sve sesije s ovim SQL_ID zahtjevom
/kill_block - ubiti root blokirajuću sesiju
/pokaži_em — pokažite sliku EM izvedbe
On je lukav tip, želi šivati ​​DBA sa svog telefona =)

Tako radimo za dobrobit domovine!

Kako se riješiti rutine i nezanimljivih zadataka?

Nadam se da je štivo bilo zanimljivo, a možda i nekome korisno, a nisam imao vremena dosaditi čitatelju... Sretno svima nama.

Izvor: www.habr.com

Dodajte komentar