Economisim timp, nervi și ore umane

Proiectele noastre sunt de obicei regionale, iar clienții sunt de obicei ministere. Dar, pe lângă sectorul public, organizațiile private folosesc și sistemele noastre. Practic nu sunt probleme cu ele.

Deci, principalele proiecte sunt regionale, iar uneori apar probleme cu ele. De exemplu, cu performanță, atunci când în regiuni există mai mult de 20 dintre utilizatorii noștri prețioși în perioada de lansare a noilor funcționalități pe serverele de produse. Este o durere…

Mă numesc Ruslan și susțin sistemele informaționale ale Grupului BARS și dezvoltarea unui bot ucigaș pentru DBA-uri în serie violente. Această postare nu este pentru cei slabi de inimă - există o mulțime de scrisori și imagini.

Economisim timp, nervi și ore umane

/awr

Unele dintre aplicațiile noastre rulează pe Oracle DBMS. Există și proiecte pe SGBD-ul PostgreSQL. Oracle are un lucru minunat - colectarea de statistici privind încărcarea pe SGBD, care evidențiază problemele existente și chiar face recomandări pentru eliminare - Automatic Workload Repository (AWR). La un moment dat (și anume în momentul durerii), dezvoltatorii au cerut constant să colecteze Rapoarte AWR pentru analiza performanței. Am mers sincer la serverul DBMS, am colectat rapoarte, ni le-am dus la noi și le-am trimis în producție pentru analiză. După a 5-a oară a devenit enervant... după a 10-a a devenit enervant...

Unul dintre colegii mei a exprimat odată ideea că tot ce se face de mai multe ori ar trebui automatizat. Până în momentul iritației, să fiu sincer, nu m-am gândit la asta și am încercat să automatizez tot ce putea fi automatizat, dar de multe ori nu era solicitat și era mai mult o cercetare decât o natură aplicată.

Și apoi m-am gândit: „Nu sunt necesari administratori pentru a genera un raport...”. La urma urmei, colectarea unui raport înseamnă executarea scriptului sql @$ORACLE_HOME/rdbms/admin/awrrpt.sql și preluarea raportului de pe server la locul tău... Da, nu permitem dezvoltarea pentru producție.

Apoi am căutat pe Google informațiile necesare, am creat funcția din articolul de pe baza de testare, am rulat scriptul și miracolul - raportul a fost compilat și poate fi salvat local. Am creat funcții în care rapoartele AWR erau adesea necesare și le-au spus dezvoltatorilor cum să le folosească.

În această perioadă, în timpul meu liber, după ce am vorbit cu @BotFather, mi-am creat un bot Telegram pentru mine, doar pentru distracție. Am înșurubat o funcționalitate simplă acolo - arăta ora curentă, cursurile de schimb, vremea, am învățat-o să-i trimită complimente soției mele (atunci prietenei) într-un program. Poate că, la acel moment, trimiterea de complimente era cea mai populară funcționalitate a botului meu, iar soția mea a apreciat-o.

Asa de. Dezvoltatorii ne scriu în Telegram, le trimitem un raport în Telegram... Dacă ne scriu nu nouă, ci unui bot? La urma urmei, va fi mai bine pentru toată lumea, raportul va fi primit mai repede și, cel mai important, ocolindu-ne. Așa s-a născut ideea primei funcționalități populare pentru botul meu.

Am început implementarea. Am făcut-o, cât am putut mai bine, în PHP (aplicația noastră în sine este în PHP, sunt mai versat în el decât în ​​Python). Nu sunt un programator bun, așa că nu vă voi arăta codul meu :)

Botul locuiește în rețeaua noastră corporativă și are acces la anumite proiecte, inclusiv baze de date țintă. Ca să nu mă deranjez cu parametrii din echipă sau din meniu, am adăugat această funcționalitate la chat-ul de grup cu notificări de monitorizare. În acest fel, botul știe imediat din ce bază de date să colecteze raportul.

După ce a primit o comandă ca /awr N, unde N este numărul de ore întregi pentru care este necesar un raport (implicit - 1 oră), chiar și pentru o săptămână, dacă baza de date nu a fost repornită, botul începe imediat să lucreze, colectează raportul, îl publică ca un pagina web și imediat (aproape chiar acolo) oferă un link către raportul atât de necesar.

Urmați linkul și iată-l, raportul AWR:

Economisim timp, nervi și ore umane

Așa cum era de așteptat, dezvoltatorii au făcut față unei astfel de generări de rapoarte, iar unii chiar ne-au mulțumit.

După ce au apreciat confortul echipei, managerii de proiect din alte regiuni și-au dorit același lucru, deoarece primesc cel mai mult de la client și sunt îngrijorați de performanța și disponibilitatea sistemelor. Am adăugat botul la alte chat-uri. Îl mai folosesc și mă bucur de asta.

Ulterior, colegii de la CIT au aflat despre modul în care colectăm rapoarte și au vrut să o facem și ei. Nu le-am adăugat la chat-urile noastre, am creat un chat separat cu generarea de rapoarte în program și la cerere.

/pgBadger

Avem și alte aplicații în PHP împreună cu PostgreSQL. Am implementat colecția de rapoarte pgBadger pentru cei care au nevoie folosind același principiu - în chat-urile de grup. La început l-au folosit, dar apoi s-au oprit. Funcționalitatea a fost eliminată ca fiind inutilă.

/datorie

Departamentul nostru are ture de noapte și, în consecință, are un program. Este în Foi de calcul Google. Nu este întotdeauna convenabil să cauți un link, să deschizi o diagramă, să cauți singur... Unul dintre foștii mei colegi s-a jucat și cu botul lui Telegram și l-a introdus în chat-ul departamentului nostru notificări despre începerea schimbului de serviciu pentru angajații departamentului. Botul analizează programul, determină persoana de serviciu după data curentă și, conform programului sau la cerere, raportează cine este de serviciu astăzi. A ieșit grozav și convenabil. Adevărat, nu mi-a plăcut foarte mult formatul mesajelor. De asemenea, pentru angajații unui alt departament (de exemplu, BC „Medicina”), informațiile despre cei de serviciu în alte direcții nu sunt cu adevărat necesare, dar trebuie să știi cine este de serviciu în „Medicina” în caz de probleme. Am decis să „împrumut” funcționalitatea, dar să schimb ceea ce nu mi-a plăcut. Am creat un format de mesaj convenabil pentru mine și pentru alții, eliminând informațiile inutile.

/tnls

După ce am încercat automatizarea folosind un bot Telegram, au apărut multe idei diferite, dar am vrut să fac lucruri strict necesare. Am decis să conduc statistici privind cererile. Pentru a accesa proiectele clienților noștri, am implementat un așa-numit „server de salt” sau server de redirecționare. Conexiunile VPN sunt ridicate pe acesta, apoi porturile de aplicații, bazele de date și alte redirecționări auxiliare sunt redirecționate către rețeaua noastră locală prin ssh, pentru acces facil la proiectele angajaților noștri, fără probleme cu conexiunile VPN. Tot ce trebuie să faceți este să configurați o conexiune VPN la rețeaua noastră corporativă.

Statistica solicitărilor a arătat că de multe ori, după ce unul dintre tuneluri eșuează (în cazul problemelor de rețea, din cauza unui timeout, de exemplu), oamenii ne contactează pentru restabilirea accesului la proiect. În cele mai multe cazuri, este suficient doar repornirea conexiunii și totul este în regulă. Hai să o facem singur. Iată comanda:
Economisim timp, nervi și ore umane

„Cadeți” în elementul de meniu dorit, vă selectați proiectul, așteptați un minut și toată lumea este fericită și mulțumită...

La primirea unei comenzi, cu o ușoară mișcare a octeților și biților, bot-ul se conectează la serverul de redirecționare, știind în prealabil care redirecționare trebuie repornită și își face treaba - restabilește conexiunea la proiect. Am scris instrucțiuni astfel încât să puteți rezolva singur astfel de probleme. Și oamenii ne-au contactat doar dacă instrumentul furnizat nu a funcționat...

/ecp_to_pem

Alte statistici au arătat că este adesea necesară conversia EDS Crypto Pro în format pem(Baza64) pentru diverse integrări și avem destul de multe dintre ele. Sarcină: luați un container, copiați-l pe un computer Windows cu utilitarul P12FromGostCSP instalat (plătit, apropo), convertiți-l în pfx și apoi convertiți pfx folosind OpenSSL (cu suport pentru criptarea GOST) în pem. Nu este foarte convenabil, dar îl dorești dintr-o pocnire de degete.

Google a venit din nou în ajutor. Găsite utilitatea unei persoane amabile. L-am asamblat așa cum este scris în README - a funcționat. Am învățat botul să lucreze cu utilitarul și am obținut o conversie aproape instantanee.
Economisim timp, nervi și ore umane

Până la momentul implementării finale, a fost emis un ordin de trecere la un nou format de criptare - gost-2012. Din câte îmi amintesc, utilitatea în acel moment funcționa doar cu vechiul GOST (2001), poate a fost o altă utilitate similară de la o altă persoană amabilă, nu îmi amintesc exact.
După trecerea la noul GOST, funcționalitatea botului a fost eliminată din motive de securitate. L-am implementat într-un container docker.

Dockerfile, în cazul în care cineva are nevoie de el:

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

Pentru a converti, trebuie să plasați containerul original (director ca xxx.000) în directorul /srv/in și să duceți pem-ul finit în /srv/out.

A converti:

 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

Într-o zi, un DBA Oracle foarte cool, cu multă experiență în administrarea și dezvoltarea DBMS, s-a angajat la compania noastră. Și a avut imediat probleme în conectarea la serverele DBMS cu ssh: nu știe unde sau cum să se conecteze, accesul nu este descris clar sau nu poate transmite ceva de care are nevoie. Ei bine, suntem bucuroși să vă ajutăm, i-am spus cum să se conecteze și i-am transmis Enterprise Manager. Dar lucrurile încă nu au funcționat cu ssh. Unul dintre colegii mei mi-a explicat simplu: un DBA de rasă :) Am decis că dacă trebuie să modificăm ceva pe server, o vom face singuri.

EM se blochează uneori sub sarcină grea, iar pentru a-l reporni... trebuie să vă conectați prin ssh și să reporniți prin terminal. „Administratorii se pricep la asta”, a decis noul nostru coleg. Încărcările grele pe SGBD nu sunt neobișnuite pentru noi, iar solicitările de repornire a EM sunt, de asemenea, frecvente. Apoi același scenariu: tensiune, iritare și căutarea unei soluții la problemă. Deci, în același grup de chat au apărut următoarele comenzi: /emstop și /emstart.

Economisim timp, nervi și ore umane

/ucide

Dacă există o concurență puternică pe baza de date, iar acest lucru se întâmplă uneori, este necesar să descărcați rapid baza de date. Cea mai rapidă cale este să omorâți procesul problematic... Pentru a face acest lucru, conectați-vă prin ssh, kill -9... Botul vă va ajuta!

Economisim timp, nervi și ore umane

Alexey a apreciat echipa și i-a dat un nume afectuos - "Kilyalka" sau un pistol.
Într-o zi, după ce am văzut cum a încercat și a suferit Alexey, introducând /kill xxx de fiecare dată pentru fiecare proces, am decis să adaug „multi-baril” la arma noastră:

Economisim timp, nervi și ore umane

Asa e mai bine! Totul este pentru tine, Alexey, doar muncă, dragă!

Desigur, o echipă atât de importantă era limitată acces prin user_id - „foolproof”. Văzând cum Lesha ucide cu îndemânare procesele de pe serverul bazei de date, mai multe persoane au încercat să introducă o comandă cu un număr de proces aleatoriu, dar nu poți păcăli robotul meu inteligent, a refuzat imediat.

/alertlog

Ei bine, pentru orice eventualitate, am dat comanda:
/alertlog — obțineți numărul specificat de linii de jurnal de alerte
Botul trage un jurnal de alertă și îl trimite serviciului nostru, cum ar fi pastebin, numit pyste, și trimite un link către paste către chat-ul de solicitare.

/cecuri

Urmează o cerere pentru monitorizarea performanței reale a aplicației noastre. Până acum, suportul tehnic al proiectului colecta aceste date manual. Indiferent de! Testerii noștri curajoși au dezvoltat cazuri de testare pentru asta. Jurnalul de testare rezultat nu este foarte convenabil de citit; un utilizator neexperimentat va lua mult timp pentru a înțelege și nu este sigur că va evidenția informațiile necesare. Și nu ne place să facem cu mâinile noastre ceea ce nu putem face cu mâinile noastre... O nouă sarcină pentru bot!

Economisim timp, nervi și ore umane

Comanda /checks afișează un meniu simplu și lipsit de ambiguitate; de ​​data aceasta, băieții noștri au învățat cum să folosească această comandă fără instrucțiuni!

Când selectați elementul dorit, în loc de meniu, apare o notificare despre începerea testului, astfel încât utilizatorii nerăbdători să nu ruleze testul nostru de 100500 de ori:

Economisim timp, nervi și ore umane

În funcție de elementul de meniu selectat, se lansează un test specific din rețeaua noastră și anume de la mașina în care locuiește botul (acolo jmeter este preconfigurat, se află testele necesare...) sau direct din centrul de date (de la un mașină pregătită lângă aplicație), pentru a exclude conexiunile la rețea la testarea întârzierilor sau pentru a le reduce la minimum.

După finalizarea testului și primirea jurnalului, bot-ul îl analizează și produce rezultatul într-o formă „lizibilă de om”:

Economisim timp, nervi și ore umane

Colecția de valori

Funcționalitatea a ajuns și managerii de proiect interesați au primit o astfel de funcție pentru regiunile lor. Și un manager de proiect plin de compasiune a spus: „Vreau să am statistici despre timp!” Cineva de la CIT i-a spus că ar fi convenabil să monitorizeze toate acestea în Zabbix. Zabbix, deci Zabbix...

Am crezut că trebuie să mă pregătesc pentru nevoia de a replica soluția... Am pus ideea într-un container docker. În container, jmeter este lansat într-un program (o dată la 10 minute), pune jurnalul într-un anumit loc, php îl analizează și afișează datele necesare sub forma unei pagini web. Zabbix, folosind cheia web.page.get, primește această pagină, selectează în mod regulat datele necesare pentru anumite elemente dependente și construiește un grafic.

Economisim timp, nervi și ore umane

Cred că nu s-a dovedit rău. Prin observarea graficului, vedem, în primul rând, viteza aproximativă a aplicației, iar dacă pe grafic sunt detectate vârfuri, știm aproximativ unde se află „dop”. E simplu. Până acum s-a dovedit a fi solicitat doar pentru o singură regiune, dar sunt gata să o reproduc pentru cei interesați.

Dezvoltarea aplicației

Statisticile privind sarcini similare au dat naștere recent la mai multe idei pentru simplificarea și facilitarea muncii. Pe unele proiecte, pe servere de aplicații, este nevoie să se instaleze containere cheie Crypto Pro, sunt multe, iar semnătura digitală expiră în timp. Uneori sosesc 2 sarcini pe zi. Dar am considerat nesigur să folosesc un bot în aceste scopuri și am decis că voi crea funcționalitatea direct în aplicație. Desigur cu autorizare și verificarea drepturilor de acces. Dacă aveți privilegiile necesare, un element suplimentar de meniu va fi disponibil pentru lucrul cu semnături digitale, instalare, ștergere, vizualizare a informațiilor etc. Funcționalitatea este în prezent în curs de dezvoltare. După cum s-a dovedit, acest lucru nu este foarte dificil, trebuie doar să citiți puțin instrucțiunile existente, să vă uitați la exemple de cod, să întrebați colegii mai experimentați în dezvoltare și apoi să o faceți. În timpul procesului de cercetare, au apărut idei de adăugat la aplicație. Nu voi face planuri napoleoniene - există dezvoltare, lăsați fiecare să se ocupe de treburile lui. Dar, deși este interesant, o fac singur.

Planuri

După cum am spus, s-au născut multe idei diferite pentru utilizarea botului nostru și nu numai - în general, să spunem, idei pentru „puncte de automatizare”, multe dintre ele au fost uitate, deoarece nu am avut timp să le notez. Acum incerc sa notez tot ce imi vine in minte si recomand si altora sa faca la fel.

Dar Alexey nu uită să-și îndeplinească dorințele. Din cele mai recente:
/kill_sql SQL_ID — închideți toate sesiunile cu această solicitare SQL_ID
/kill_block - închideți sesiunea de blocare a rădăcinilor
/show_em — afișați o imagine a performanței EM
E un tip viclean, vrea să coase DBA de pe telefon =)

Așa lucrăm în folosul Patriei!

Cum scapi de sarcinile de rutină și neinteresante?

Sper că lectura s-a dovedit a fi interesantă, și poate chiar utilă cuiva și nu am avut timp să plictisesc cititorul... Mult succes tuturor.

Sursa: www.habr.com

Adauga un comentariu