Vi sparer tid, nerver og mandetimer

Vores projekter er normalt regionale, og kunderne er som regel ministerier. Men udover den offentlige sektor bruger private organisationer også vores systemer. Der er praktisk talt ingen problemer med dem.

Så hovedprojekterne er regionale, og nogle gange er der problemer med dem. For eksempel med ydeevne, når der i regioner er mere end 20 af vores dyrebare brugere i perioden med udrulning af ny funktionalitet på produktservere. Det er en smerte…

Mit navn er Ruslan og jeg støtter informationssystemerne i BARS Group og udvikle en dræber-bot til voldelige serielle DBA'er. Dette indlæg er ikke for sarte sjæle – der er en masse breve og billeder.

Vi sparer tid, nerver og mandetimer

/awr

Nogle af vores applikationer kører på Oracle DBMS. Der er også projekter på PostgreSQL DBMS. Oracle har en vidunderlig ting - at indsamle statistik om belastningen på DBMS, som fremhæver eksisterende problemer og endda giver anbefalinger til eliminering - Automatic Workload Repository (AWR). På et tidspunkt (nemlig i smerteøjeblikket) bad udviklerne konstant om at samle AWR rapporterer til præstationsanalyse. Vi gik ærligt hen til DBMS-serveren, samlede rapporter, tog dem til os og sendte dem til produktion til analyse. Efter 5. gang blev det irriterende... efter 10. blev det irriterende...

En af mine kolleger udtrykte engang ideen om, at alt, hvad der bliver gjort mere end én gang, skal automatiseres. Indtil irritationsøjeblikket, for at være ærlig, tænkte jeg ikke over det og forsøgte at automatisere alt, der kunne automatiseres, men ofte var det ikke efterspurgt og var mere en forskning snarere end en anvendt karakter.

Og så tænkte jeg: "Administratorer er ikke nødvendige for at generere en rapport...". Når alt kommer til alt, betyder det at indsamle en rapport at udføre sql-scriptet @$ORACLE_HOME/rdbms/admin/awrrpt.sql og tage rapporten fra serveren til dit sted... Åh ja, vi tillader ikke udvikling til produktion.

Derefter Googlede jeg de nødvendige oplysninger, oprettede funktionen fra artiklen om testbasen, kørte scriptet og miraklet - rapporten blev kompileret og kan gemmes lokalt. Oprettede funktioner, hvor der ofte var behov for AWR-rapporter, og fortalte udviklere, hvordan de skulle bruge dem.

Omkring dette tidspunkt, i min fritid, efter at have talt med @BotFather, oprettede jeg en Telegram-bot til mig selv, bare for sjov. Jeg skruede en simpel funktionalitet ind der - vis den aktuelle tid, valutakurser, vejret, lærte det at sende komplimenter til min kone (dengang kæreste) efter en tidsplan. Måske på det tidspunkt var det at sende komplimenter den mest populære funktionalitet i min bot, og min kone satte pris på det.

Så. Udviklere skriver til os i Telegram, vi sender en rapport til dem i Telegram... Hvad hvis de ikke skriver til os, men til en bot? Det vil trods alt være bedre for alle, rapporten vil blive modtaget hurtigere, og vigtigst af alt, omgå os. Sådan blev ideen om den første populære funktionalitet til min bot født.

Jeg startede implementeringen. Jeg gjorde det, så godt jeg kunne, i PHP (selve vores applikation er i PHP, jeg er mere bevandret i det end i Python). Jeg er ikke en god koder, så jeg vil ikke vise dig min kode :)

Botten bor på vores virksomhedsnetværk og har adgang til visse projekter, herunder måldatabaser. For ikke at genere parametre i teamet eller menuen, vedhæftede jeg denne funktionalitet til gruppechatten med overvågningsmeddelelser. På denne måde ved botten med det samme, hvilken database rapporten skal indsamles fra.

Efter at have modtaget en kommando som /awr N, hvor N er antallet af hele timer, som en rapport er nødvendig (som standard - 1 time), selv i en uge, hvis databasen ikke er blevet genstartet, begynder botten straks at arbejde, indsamler rapporten, udgiver den som en webside og giver straks (næsten lige der) et link til den hårdt tiltrængte rapport.

Følg linket og her er det, AWR-rapporten:

Vi sparer tid, nerver og mandetimer

Som forventet klarede udviklerne en sådan rapportgenerering, og nogle takkede os endda.

Efter at have værdsat holdets bekvemmelighed ønskede projektledere fra andre regioner det samme, da de får mest muligt fra kunden og er bekymrede for systemernes ydeevne og tilgængelighed. Jeg føjede botten til andre chats. De bruger det stadig, og jeg er glad for det.

Senere fandt kolleger fra CIT ud af, hvordan vi indsamler rapporter og ville også gøre det. Jeg føjede dem ikke til vores chats, jeg oprettede en separat chat med generering af rapporter på en tidsplan og efter anmodning.

/pgBadger

Vi har også andre applikationer i PHP i forbindelse med PostgreSQL. Jeg implementerede indsamlingen af ​​pgBadger-rapporter for dem i nød ved at bruge samme princip - i gruppechat. Først brugte de det, men så stoppede de. Funktionaliteten blev skåret ud som unødvendig.

/pligt

Vores afdeling har nattevagter og har derfor en tidsplan. Det er i Google Sheets. Det er ikke altid praktisk at lede efter et link, åbne et diagram, se selv... En af mine tidligere kollegaer legede også med sin Telegram-bot og introducerede den i chatten i vores afdeling meddelelser om start af vagtvagt for afdelingsansatte. Botten analyserer tidsplanen, bestemmer vagtpersonen på den aktuelle dato og rapporterer i henhold til tidsplanen eller efter anmodning, hvem der er på vagt i dag. Det viste sig fantastisk og praktisk. Sandt nok kunne jeg ikke rigtig lide formatet på beskederne. Også for ansatte i en anden afdeling (f.eks. BC "Medicin") er information om vagthavende i andre retninger ikke rigtig nødvendig, men du skal vide, hvem der er på vagt i "Medicin" i tilfælde af problemer. Jeg besluttede at "låne" funktionaliteten, men ændre det, jeg ikke kunne lide. Jeg lavede et beskedformat, der var praktisk for mig selv og andre, og fjernede unødvendig information.

/tnls

Efter at have prøvet automatisering ved hjælp af en Telegram-bot, dukkede mange forskellige ideer op, men jeg ville gøre strengt nødvendige ting. Jeg besluttede at lede statistik over forespørgsler. For at få adgang til vores kunders projekter har vi implementeret en såkaldt "jump server" eller forwarding server. VPN-forbindelser hæves på den, derefter videresendes applikationsporte, databaser og andre hjælpevideresendelser til vores lokale netværk via ssh, for nem adgang til vores medarbejderes projekter, uden problemer med VPN-forbindelser. Alt du skal gøre er at oprette en VPN-forbindelse til vores virksomhedsnetværk.

Statistikken over anmodninger har vist, at ofte, efter at en af ​​tunnelerne svigter (i tilfælde af netværksproblemer, f.eks. på grund af en timeout), kontakter folk os for at genoprette adgangen til projektet. I de fleste tilfælde er det nok at genstarte forbindelsen, og alt er i orden. Lad os gøre det selv. Her er kommandoen:
Vi sparer tid, nerver og mandetimer

Du "falder igennem" i det ønskede menupunkt, vælger dit projekt, vent et øjeblik og alle er glade og tilfredse...

Ved modtagelse af en kommando, med en lille bevægelse af bytes og bits, forbinder botten med videresendelsesserveren, ved på forhånd, hvilken videresendelse der skal genstartes, og gør sit job - genopretter forbindelsen til projektet. Jeg skrev instruktioner, så du selv kan løse sådanne problemer. Og folk kontaktede os kun, hvis det medfølgende værktøj ikke virkede...

/ecp_to_pem

Yderligere statistik viste, at det ofte er nødvendigt at konvertere EDS Crypto Pro i pem-format(Base 64) til forskellige integrationer, og dem har vi ret mange af. Opgave: Tag en beholder, kopier den til en Windows-computer med P12FromGostCSP-værktøjet installeret (betalt, i øvrigt), konverter den til pfx, og konverter derefter pfx ved hjælp af OpenSSL (med understøttelse af GOST-kryptering) til pem. Det er ikke særlig praktisk, men du vil have det med et enkelt fingertryk.

Google er kommet til undsætning igen. Fundet en venlig persons nytte. Jeg samlede det som skrevet i README - det virkede. Jeg lærte botten at arbejde med værktøjet og fik en næsten øjeblikkelig konvertering.
Vi sparer tid, nerver og mandetimer

På tidspunktet for den endelige implementering blev der udstedt en ordre om at skifte til et nyt krypteringsformat - gost-2012. Så vidt jeg husker, virkede værktøjet på det tidspunkt kun med den gamle GOST (2001), måske var det et andet lignende værktøj fra en anden venlig person, jeg husker ikke præcist.
Efter overgangen til den nye GOST blev bottens funktionalitet fjernet af sikkerhedsmæssige årsager. Implementerede det i en docker-container.

Dockerfile, hvis nogen har brug for det:

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

For at konvertere skal du placere den originale beholder (mappe som xxx.000) i mappen /srv/in og tage den færdige pem til /srv/out.

At konvertere:

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

En dag fik en meget sej Oracle DBA, med stor erfaring indenfor DBMS administration og udvikling, job i vores virksomhed. Og han havde straks problemer med at oprette forbindelse til DBMS-serverne med ssh: han ved ikke, hvor eller hvordan han skal oprette forbindelse, adgangen er ikke tydeligt beskrevet, eller han kan ikke videresende noget, han har brug for, til sig selv. Nå, vi er glade for at hjælpe, vi fortalte ham, hvordan man forbinder, og videresendte ham Enterprise Manager. Men tingene fungerede stadig ikke med ssh. En af mine kollegaer forklarede det enkelt: en rendyrket DBA :) Vi besluttede, at hvis vi skal justere noget på serveren, så gør vi det selv.

EM går nogle gange ned under hård belastning, og for at genstarte den... skal du oprette forbindelse via ssh og genstarte gennem terminalen. "Administratorer er gode til det her," besluttede vores nye kollega. Tunge belastninger på DBMS er ikke ualmindeligt for os, og anmodninger om at genstarte EM er også almindelige. Så det samme scenarie: spænding, irritation og søgen efter en løsning på problemet. Så i de samme gruppechats dukkede følgende kommandoer op: /emstop og /emstart.

Vi sparer tid, nerver og mandetimer

/dræbe

Hvis der er stærk konkurrence på databasen, og det sker nogle gange, er det nødvendigt at tømme databasen hurtigt. Den hurtigste måde er at dræbe den problematiske proces... For at gøre dette skal du oprette forbindelse via ssh, dræbe -9... Botten hjælper!

Vi sparer tid, nerver og mandetimer

Alexey satte pris på holdet og gav det et kærligt navn - "Kilyalka" eller en pistol.
En dag, efter at have set, hvordan Alexey prøvede og led, og gik ind i /kill xxx hver gang for hver af processerne, besluttede jeg at tilføje "multi-barrel" til vores pistol:

Vi sparer tid, nerver og mandetimer

Det er bedre! Alt er til dig, Alexey, bare arbejde, skat!

Naturligvis var et så vigtigt hold begrænset adgang via user_id - "idiotsikker". Da han så, hvordan Lesha behændigt dræber processer på databaseserveren, forsøgte flere personer at indtaste en kommando med et tilfældigt procesnummer, men du kan ikke narre min smarte bot, han nægtede straks.

/alertlog

Nå, for en sikkerheds skyld lavede jeg kommandoen:
/alertlog <antal linjer> — få det angivne antal advarselsloglinjer
Botten trækker en advarselslog og sender den til vores service, som pastebin, kaldet pyste, og sender et link til pastaen til anmodningschatten.

/tjek

Dernæst kom en anmodning om overvågning af vores applikations reelle ydeevne. Indtil nu har projektteknisk support indsamlet disse data manuelt. Lige meget! Vores tapre testere har udviklet testcases til dette. Den resulterende testlog er ikke særlig praktisk at læse; en uerfaren bruger vil tage lang tid at forstå og er ikke sikker på, at han vil fremhæve de nødvendige oplysninger. Og vi kan ikke lide at gøre med vores hænder, hvad vi ikke kan gøre med vores hænder... En ny opgave for botten!

Vi sparer tid, nerver og mandetimer

Kommandoen /checks viser en enkel og utvetydig menu; denne gang lærte vores fyre at bruge denne kommando uden instruktioner!

Når du vælger det ønskede punkt, i stedet for en menu, vises en notifikation om starten af ​​testen, så utålmodige brugere ikke kører vores test 100500 gange:

Vi sparer tid, nerver og mandetimer

Afhængigt af det valgte menupunkt startes en specifik test fra vores netværk, nemlig fra den maskine, hvor botten bor (jmeter er forudkonfigureret der, de nødvendige test findes...) eller direkte fra datacenteret (fra en forberedt maskine ved siden af ​​applikationen), for at udelukke netværksforbindelser ved testning af forsinkelser eller reducere dem til et minimum.

Efter at have gennemført testen og modtaget loggen, parser botten den og producerer resultatet i en "læselig" form:

Vi sparer tid, nerver og mandetimer

Indsamling af metrics

Funktionaliteten er kommet og interesserede projektledere har fået sådan en funktion til deres regioner. Og en medfølende projektleder sagde: "Jeg vil gerne have tidsstatistikker!" Nogen fra CIT fortalte hende, at det ville være praktisk at overvåge alt dette i Zabbix. Zabbix, så Zabbix...

Jeg tænkte, at jeg skulle forberede mig på behovet for at kopiere løsningen... Jeg lagde ideen ind i en havnemandscontainer. I containeren lanceres jmeter efter en tidsplan (en gang hvert 10. minut), placerer loggen et bestemt sted, php parser den og viser de nødvendige data i form af en webside. Zabbix, ved hjælp af web.page.get-nøglen, modtager denne side, vælger regelmæssigt de nødvendige data for visse afhængige elementer og bygger en graf.

Vi sparer tid, nerver og mandetimer

Jeg synes, det blev ikke dårligt. Ved at observere grafen ser vi for det første den omtrentlige hastighed af applikationen, og hvis der registreres toppe på grafen, ved vi omtrent hvor "stikket" er. Det er simpelt. Indtil videre har det vist sig kun at være efterspurgt for én region, men jeg er klar til at kopiere det for interesserede.

Applikationsudvikling

Statistik over lignende opgaver har på det seneste givet anledning til flere ideer til at forenkle og lette arbejdet. På nogle projekter, på applikationsservere, er der behov for at installere centrale Crypto Pro-containere, der er mange af dem, og den digitale signatur udløber over tid. Nogle gange kommer der 2 opgaver om dagen. Men jeg anså det for usikkert at bruge en bot til disse formål og besluttede, at jeg ville oprette funktionaliteten direkte i applikationen. Naturligvis med autorisation og kontrol af adgangsrettigheder. Hvis du har de nødvendige rettigheder, vil et ekstra menupunkt være tilgængeligt til at arbejde med digital signatur, installation, sletning, visning af information osv. Funktionaliteten er i øjeblikket under udvikling. Som det viste sig, er dette ikke særlig svært, du skal bare læse de eksisterende instruktioner lidt, se på kodeeksempler, spørg kolleger, der er mere erfarne i udvikling, og så gør det. Under researchprocessen opstod der ideer til at tilføje ansøgningen. Jeg vil ikke lave Napoleonske planer - der er udvikling, lad alle passe deres egen sag. Men selvom det er interessant, gør jeg det selv.

Planer

Som jeg sagde, blev der født mange forskellige ideer til at bruge vores bot og ikke kun - generelt, lad os sige, ideer til "automatiseringspunkter", mange af dem blev glemt, da jeg ikke havde tid til at skrive dem ned. Nu forsøger jeg at skrive alt ned, der falder mig ind, og jeg anbefaler, at andre gør det samme.

Men Alexey glemmer ikke at give sine ønsker. Fra det seneste:
/kill_sql SQL_ID — dræb alle sessioner med denne SQL_ID-anmodning
/kill_block - dræb rodblokeringssessionen
/vis_em — vis et billede af EM ydeevne
Han er en snu fyr, han vil gerne sy DBA fra sin telefon =)

Sådan arbejder vi til gavn for fædrelandet!

Hvordan slipper du for rutinemæssige og uinteressante opgaver?

Jeg håber, at læsningen viste sig at være interessant, og måske endda nyttig for nogen, og jeg havde ikke tid til at kede læseren... Held og lykke til os alle.

Kilde: www.habr.com

Tilføj en kommentar