Risparmiamo tempo, nervi e ore di lavoro

I nostri progetti sono generalmente regionali e i clienti sono solitamente ministeri. Ma oltre al settore pubblico, anche le organizzazioni private utilizzano i nostri sistemi. Non ci sono praticamente problemi con loro.

Quindi, i progetti principali sono regionali e talvolta ci sono problemi con essi. Ad esempio, con le prestazioni, quando nelle regioni sono presenti più di 20 dei nostri preziosi utenti durante il periodo di implementazione delle nuove funzionalità sui server dei prodotti. È un dolore…

Mi chiamo Ruslan e supporto i sistemi informativi di BARS Group e sviluppare un bot killer per DBA seriali violenti. Questo post non è per i deboli di cuore: ci sono molte lettere e immagini.

Risparmiamo tempo, nervi e ore di lavoro

/awr

Alcune delle nostre applicazioni funzionano su Oracle DBMS. Esistono anche progetti sul DBMS PostgreSQL. Oracle ha una cosa meravigliosa: raccoglie statistiche sul carico sul DBMS, che evidenzia i problemi esistenti e fornisce persino raccomandazioni per l'eliminazione: Automatic Workload Repository (AWR). Ad un certo punto (vale a dire nel momento del dolore), gli sviluppatori hanno costantemente chiesto di riscuotere Report AWR per l'analisi delle prestazioni. Onestamente siamo andati al server DBMS, abbiamo raccolto i report, ce li abbiamo portati e li abbiamo inviati alla produzione per l'analisi. Dopo la quinta volta è diventato fastidioso... dopo la decima volta è diventato irritante...

Uno dei miei colleghi una volta espresse l’idea che tutto ciò che viene fatto più di una volta dovrebbe essere automatizzato. Fino al momento dell'irritazione, a dire il vero, non ci ho pensato e ho cercato di automatizzare tutto ciò che poteva essere automatizzato, ma spesso non era richiesto ed era più di natura di ricerca che di applicazione.

E poi ho pensato: “Non sono necessari amministratori per generare un report...”. Dopotutto, raccogliere un report significa eseguire lo script sql @$ORACLE_HOME/rdbms/admin/awrrpt.sql e portare il report dal server a casa tua... Oh sì, non consentiamo lo sviluppo per la produzione.

Quindi ho cercato su Google le informazioni necessarie, ho creato la funzione dall'articolo sulla base di test, ho eseguito lo script e il miracolo: il rapporto è stato compilato e può essere salvato localmente. Ha creato funzioni in cui i report AWR erano spesso necessari e ha spiegato agli sviluppatori come utilizzarli.

In questo periodo, nel mio tempo libero, dopo aver parlato con @BotFather, ho creato per me un bot di Telegram, solo per divertimento. Lì ho inserito una semplice funzionalità: mostra l'ora corrente, i tassi di cambio, il tempo, gli ho insegnato a inviare complimenti a mia moglie (allora fidanzata) secondo un programma. Forse, a quel tempo, inviare complimenti era la funzionalità più popolare del mio bot e mia moglie lo apprezzava.

COSÌ. Gli sviluppatori ci scrivono su Telegram, noi inviamo loro un rapporto su Telegram... E se non scrivono a noi, ma a un bot? Dopotutto, sarà meglio per tutti, il rapporto verrà ricevuto più velocemente e, soprattutto, aggirandoci. È così che è nata l’idea della prima funzionalità popolare per il mio bot.

Ho iniziato l'implementazione. L'ho fatto, come meglio ho potuto, in PHP (la nostra stessa applicazione è in PHP, ne sono più esperto che in Python). Non sono un buon programmatore, quindi non ti mostrerò il mio codice :)

Il bot risiede nella nostra rete aziendale e ha accesso a determinati progetti, inclusi i database di destinazione. Per non preoccuparmi dei parametri nel team o nel menu, ho aggiunto questa funzionalità alla chat di gruppo con notifiche di monitoraggio. In questo modo il bot sa immediatamente da quale database raccogliere il report.

Dopo aver ricevuto un comando simile /awr N, dove N è il numero di ore intere per le quali è necessario un report (per impostazione predefinita - 1 ora), anche per una settimana, se il database non è stato riavviato, il bot inizia immediatamente a funzionare, raccoglie il report, lo pubblica come pagina web e immediatamente (quasi proprio lì) fornisce un collegamento al tanto necessario rapporto.

Segui il link ed eccolo qui, il rapporto AWR:

Risparmiamo tempo, nervi e ore di lavoro

Come previsto, gli sviluppatori si sono occupati della generazione di report e alcuni ci hanno addirittura ringraziato.

Avendo apprezzato la comodità del team, i project manager di altre regioni hanno voluto lo stesso, poiché ricevono il massimo dal cliente e sono preoccupati per le prestazioni e la disponibilità dei sistemi. Ho aggiunto il bot ad altre chat. Lo usano ancora e ne sono felice.

Successivamente, i colleghi del CIT hanno scoperto come raccogliamo i report e hanno voluto farlo anche loro. Non li ho aggiunti alle nostre chat, ho creato una chat separata con la generazione di report su pianificazione e su richiesta.

/pgBadger

Abbiamo anche altre applicazioni in PHP insieme a PostgreSQL. Ho implementato la raccolta di report pgBadger per chi ne ha bisogno utilizzando lo stesso principio: nelle chat di gruppo. All'inizio l'hanno usato, ma poi hanno smesso. La funzionalità è stata eliminata perché non necessaria.

/dovere

Il nostro dipartimento ha turni notturni e, di conseguenza, ha un programma. È in Fogli Google. Non è sempre conveniente cercare un collegamento, aprire un grafico, cercare da soli... Anche un mio ex collega ha giocato con il suo bot di Telegram e lo ha introdotto nella chat del nostro dipartimento notifiche di inizio turno per i dipendenti del dipartimento. Il bot analizza l'orario, determina la persona in servizio entro la data corrente e, in base all'orario o su richiesta, segnala chi è in servizio oggi. Si è rivelato fantastico e conveniente. È vero, non mi piaceva molto il formato dei messaggi. Inoltre, per i dipendenti di un altro dipartimento (ad esempio BC "Medicina"), le informazioni su chi è in servizio in altre direzioni non sono realmente necessarie, ma è necessario sapere chi è in servizio in "Medicina" in caso di problemi. Ho deciso di "prendere in prestito" la funzionalità, ma di cambiare ciò che non mi piaceva. Ho creato un formato di messaggio conveniente per me e per gli altri, rimuovendo le informazioni non necessarie.

/tnls

Dopo aver provato l'automazione utilizzando un bot di Telegram, sono emerse molte idee diverse, ma volevo fare cose strettamente necessarie. Ho deciso di guidare statistiche sulle richieste. Per accedere ai progetti dei nostri clienti, abbiamo implementato un cosiddetto “jump server” o server di inoltro. Su di esso vengono attivate le connessioni VPN, quindi le porte delle applicazioni, i database e altri inoltri ausiliari vengono inoltrati alla nostra rete locale tramite ssh, per un facile accesso ai progetti dei nostri dipendenti, senza problemi con le connessioni VPN. Tutto quello che devi fare è configurare una connessione VPN alla nostra rete aziendale.

Le statistiche delle richieste hanno dimostrato che spesso, dopo che uno dei tunnel fallisce (in caso di problemi di rete, ad esempio a causa di un timeout), le persone ci contattano per ripristinare l'accesso al progetto. Nella maggior parte dei casi è sufficiente riavviare la connessione e tutto va bene. Facciamolo da solo. Ecco il comando:
Risparmiamo tempo, nervi e ore di lavoro

Si “cade” nella voce di menu desiderata, si seleziona il progetto, si attende un minuto e tutti sono contenti e soddisfatti...

Dopo aver ricevuto un comando, con un leggero spostamento di byte e bit, il bot si connette al server di inoltro, sapendo in anticipo quale inoltro deve essere riavviato, e fa il suo lavoro: ripristina la connessione al progetto. Ho scritto le istruzioni in modo che tu possa risolvere tali problemi da solo. E le persone ci contattavano solo se lo strumento fornito non funzionava...

/ecp_to_pem

Ulteriori statistiche hanno dimostrato che spesso è necessario convertirsi EDS Crypto Pro in formato pem(Base64) per varie integrazioni e ne abbiamo parecchie. Compito: prendi un contenitore, copialo su un computer Windows con l'utilità P12FromGostCSP installata (a pagamento, tra l'altro), convertilo in pfx e quindi converti pfx utilizzando OpenSSL (con supporto per la crittografia GOST) in pem. Non è molto conveniente, ma lo vuoi con uno schiocco di dita.

Google è nuovamente venuta in soccorso. Trovato l'utilità di qualche persona gentile. L'ho assemblato come scritto nel README: ha funzionato. Ho insegnato al bot a lavorare con l'utilità e ho ottenuto una conversione quasi istantanea.
Risparmiamo tempo, nervi e ore di lavoro

Al momento dell'implementazione finale, è stato emesso un ordine per passare a un nuovo formato di crittografia: gost-2012. Per quanto ricordo, l'utilità in quel momento funzionava solo con il vecchio GOST (2001), forse era un'altra utilità simile di un'altra persona gentile, non ricordo esattamente.
Dopo il passaggio al nuovo GOST, la funzionalità del bot è stata rimossa per motivi di sicurezza. Implementato in un contenitore docker.

Dockerfile, nel caso qualcuno ne abbia bisogno:

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

Per convertire, è necessario posizionare il contenitore originale (directory come xxx.000) nella directory /srv/in e portare il pem finito in /srv/out.

Convertire:

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

Un giorno, un DBA Oracle molto interessante, con molta esperienza nell'amministrazione e nello sviluppo di DBMS, trovò lavoro presso la nostra azienda. E ha subito avuto problemi a connettersi ai server DBMS con ssh: non sa dove e come connettersi, l'accesso non è descritto chiaramente, oppure non riesce a inoltrarsi qualcosa di cui ha bisogno. Bene, siamo felici di aiutarti, gli abbiamo spiegato come connettersi e gli abbiamo inoltrato Enterprise Manager. Ma le cose ancora non funzionavano con ssh. Uno dei miei colleghi lo ha spiegato semplicemente: un DBA di razza :) Abbiamo deciso che se avessimo bisogno di modificare qualcosa sul server, lo faremo da soli.

EM a volte si blocca sotto carico pesante e per riavviarlo... è necessario connettersi tramite ssh e riavviare tramite il terminale. "Gli amministratori sono bravi in ​​questo", ha deciso il nostro nuovo collega. Carichi pesanti sul DBMS non sono rari per noi e anche le richieste di riavvio di EM sono comuni. Quindi lo stesso scenario: tensione, irritazione e ricerca di una soluzione al problema. Quindi nelle stesse chat di gruppo apparivano i seguenti comandi: /emstop e /emstart.

Risparmiamo tempo, nervi e ore di lavoro

/ uccidere

Se c'è una forte concorrenza sul database, e questo a volte accade, è necessario scaricare rapidamente il database. Il modo più veloce è terminare il processo problematico... Per fare ciò, connettiti tramite ssh, kill -9... Il bot ti aiuterà!

Risparmiamo tempo, nervi e ore di lavoro

Alexey ha apprezzato la squadra e le ha dato un nome affettuoso: "Kilalka" o una pistola.
Un giorno, dopo aver visto come Alexey ha provato e sofferto, inserendo /kill xxx ogni volta per ciascuno dei processi, ho deciso di aggiungere "multi-canna" alla nostra pistola:

Risparmiamo tempo, nervi e ore di lavoro

Così va meglio! Tutto è per te, Alexey, lavora e basta, caro!

Naturalmente una squadra così importante era limitata accesso tramite user_id - "infallibile". Vedendo come Lesha uccide abilmente i processi sul server del database, diverse persone hanno provato a inserire un comando con un numero di processo casuale, ma non puoi ingannare il mio robot intelligente, ha immediatamente rifiutato.

/alertlog

Bene, per ogni evenienza, ho dato il comando:
/alertlog - ottiene il numero specificato di righe del registro degli avvisi
Il bot estrae un alertlog e lo invia al nostro servizio, come pastebin, chiamato pyste, e invia un collegamento all'incolla nella chat di richiesta.

/controlli

Poi è arrivata una richiesta per monitorare le prestazioni reali della nostra applicazione. Fino ad ora, il supporto tecnico del progetto raccoglieva questi dati manualmente. Non importa! I nostri valorosi tester hanno sviluppato casi di test per questo. Il registro del test risultante non è molto comodo da leggere, un utente inesperto impiegherà molto tempo a capirlo e non è sicuro di evidenziare le informazioni necessarie. E non ci piace fare con le mani ciò che non possiamo fare con le mani... Un nuovo compito per il bot!

Risparmiamo tempo, nervi e ore di lavoro

Il comando /checks visualizza un menu semplice e inequivocabile; questa volta i nostri ragazzi hanno imparato ad utilizzare questo comando senza istruzioni!

Quando si seleziona la voce desiderata, al posto del menu, appare una notifica sull'inizio del test, in modo che gli utenti impazienti non eseguano il nostro test 100500 volte:

Risparmiamo tempo, nervi e ore di lavoro

A seconda della voce di menu selezionata, viene avviato un test specifico dalla nostra rete, cioè dalla macchina su cui risiede il bot (jmeter è preconfigurato lì, si trovano i test necessari...) o direttamente dal data center (da un macchina predisposta accanto all'applicazione), in modo da escludere ritardi nelle connessioni di rete durante il test, o ridurli al minimo.

Dopo aver completato il test e ricevuto il registro, il bot lo analizza e produce il risultato in un formato “leggibile dall’uomo”:

Risparmiamo tempo, nervi e ore di lavoro

Raccolta delle metriche

La funzionalità è arrivata e i project manager interessati hanno ricevuto tale funzione per le loro regioni. E un compassionevole Project Manager ha detto: “Voglio avere statistiche sul tempo!” Qualcuno del CIT le ha detto che sarebbe stato conveniente monitorare tutto questo su Zabbix. Zabbix, quindi Zabbix...

Pensavo di dovermi preparare alla necessità di replicare la soluzione... Ho inserito l'idea in un contenitore docker. Nel contenitore, jmeter viene avviato secondo una pianificazione (una volta ogni 10 minuti), inserisce il registro in un determinato luogo, php lo analizza e visualizza i dati necessari sotto forma di una pagina web. Zabbix, utilizzando la chiave web.page.get, riceve questa pagina, seleziona regolarmente i dati necessari per alcuni elementi dipendenti e costruisce un grafico.

Risparmiamo tempo, nervi e ore di lavoro

Penso che non sia andata male. Osservando il grafico vediamo innanzitutto la velocità approssimativa dell'applicazione e, se sul grafico vengono rilevati dei picchi, sappiamo approssimativamente dove si trova la “spina”. È semplice. Finora si è rivelato richiesto solo per una regione, ma sono pronto a replicarlo per chi è interessato.

Sviluppo di applicazioni

Le statistiche su compiti simili hanno recentemente dato origine a più idee per semplificare e facilitare il lavoro. Su alcuni progetti, sui server delle applicazioni, è necessario installare i contenitori chiave Crypto Pro, ce ne sono molti e la firma digitale scade nel tempo. A volte arrivano 2 attività al giorno. Ma ho ritenuto non sicuro utilizzare un bot per questi scopi e ho deciso di creare la funzionalità direttamente nell'applicazione. Naturalmente con autorizzazione e verifica dei diritti di accesso. Se disponi dei privilegi necessari, sarà disponibile una voce di menu aggiuntiva per lavorare con firme digitali, installazione, cancellazione, visualizzazione di informazioni, ecc. La funzionalità è attualmente in fase di sviluppo. Come si è scoperto, questo non è molto difficile, devi solo leggere un po 'le istruzioni esistenti, guardare esempi di codice, chiedere ai colleghi più esperti nello sviluppo e poi farlo. Durante il processo di ricerca sono emerse idee da aggiungere all'applicazione. Non farò piani napoleonici: c'è sviluppo, lasciamo che ognuno si faccia gli affari propri. Ma anche se è interessante, lo sto facendo da solo.

Piani

Come ho detto, sono nate tante idee diverse per l'utilizzo del nostro bot e non solo - in generale, diciamo, idee per i “punti di automazione”, molte di queste sono state dimenticate, poiché non ho avuto il tempo di scriverle. Adesso provo a scrivere tutto quello che mi viene in mente, e consiglio ad altri di fare lo stesso.

Ma Alexey non dimentica di esprimere i suoi desideri. Dall'ultimo:
/kill_sql ID_SQL - termina tutte le sessioni con questa richiesta SQL_ID
/uccidi_blocco - termina la sessione di blocco root
/mostra_em — mostrare un quadro della performance dei mercati emergenti
È un ragazzo furbo, vuole cucire DBA dal suo telefono =)

È così che lavoriamo a beneficio della Patria!

Come ti sbarazzi dei compiti di routine e poco interessanti?

Spero che la lettura sia stata interessante, e magari anche utile a qualcuno, e non ho avuto il tempo di annoiare il lettore... In bocca al lupo a tutti noi.

Fonte: habr.com

Aggiungi un commento