Aforramos tempo, nervios e horas de traballo

Os nosos proxectos adoitan ser rexionais e os clientes adoitan ser ministerios. Non obstante, ademais do sector público, os nosos sistemas tamén son empregados por organizacións privadas. Practicamente non hai problemas con eles.

Entón, os nosos proxectos principais son rexionais e, ás veces, teñen problemas. Por exemplo, co rendemento, cando hai 20 dos nosos valiosos usuarios nas rexións durante o lanzamento de novas funcionalidades nos servidores de produción. É unha dor de cabeza...

Chámome Ruslan e traballo no soporte dos sistemas de información de BARS Group e desenvolvendo un bot asasino para DBAs en serie brutaisEsta publicación non é para os pusilánimes: hai moitas letras e imaxes.

Aforramos tempo, nervios e horas de traballo

/awr

Algunhas das nosas aplicacións execútanse no SGBD de Oracle. Tamén temos proxectos no SGBD de PostgreSQL. Oracle ten unha función marabillosa chamada Repositorio automático de carga de traballo (AWR), unha ferramenta para recompilar estatísticas de carga de traballo do SGBD que destaca os problemas existentes e mesmo ofrece recomendacións para solucionalos. Nun momento dado (é dicir, nun momento de gran dor), os desenvolvedores pedían constantemente esta función. Informes AWR para a análise do rendementoFomos obedientemente ao servidor DBMS, recompilamos informes, incorporámolos e enviámolos a produción para a súa análise. Despois da quinta vez, volveuse molesto... despois da décima, volveuse irritante...

Un día, un dos meus compañeiros suxeriu que calquera cousa que se fixese máis dunha vez debería automatizarse. Ata que me molestei, para ser sincero, non o pensara realmente e tratei de automatizar todo o que se podía automatizar, pero a miúdo non había demanda para iso e era máis exploratorio que práctico.

E entón pensei: "Non se precisan administradores para xerar un informe..."Despois de todo, recompilar un informe significa executar o script SQL @$ORACLE_HOME/rdbms/admin/awrrpt.sql e obter o informe do servidor... Ah, si, non permitimos o desenvolvemento en produción.

Así que busquei a información necesaria en Google, creei a función a partir do artigo nunha base de datos de probas, executei o script e, velaquí, o informe estaba listo e podía gardarse localmente. Creei funcións onde se necesitaban informes de AWR con frecuencia e expliquei como usalos aos desenvolvedores.

Por estas datas, despois de falar con @BotFather, creei un bot de Telegram por diversión. Engadín algunhas funcionalidades sinxelas (mostrar a hora actual, os tipos de cambio e o tempo) e ensinéille a enviar eloxios á miña muller (daquela aínda era a miña moza) segundo unha programación. Enviar eloxios foi probablemente a función máis popular do meu bot naquel momento, e a miña muller apreciouno.

Entón. Os desenvolvedores escríbennos en Telegram, nós enviámoslles un informe en Telegram... Pero que pasa se lle escriben ao bot en vez de a nós? Será mellor para todos, o informe recibirase máis rápido e, o máis importante, non nos involucrará. Así foi como naceu a idea da primeira funcionalidade moi solicitada para o meu bot.

Comecei a implementalo. Fixen o mellor que puiden en PHP (a nosa aplicación está en realidade en PHP, no que son máis competente que, por exemplo, en Python). Non son moi programador, así que non vos amosarei o meu código :)

O bot reside na nosa rede corporativa e ten acceso a proxectos específicos, incluídas as bases de datos de destino. Para evitar xogar cos parámetros dos comandos ou os menús, integrei esta funcionalidade no chat de grupo con notificacións de monitorización. Deste xeito, o bot sabe inmediatamente que base de datos usar para a elaboración de informes.

Despois de recibir unha orde do formulario /awr N, onde N é o número de horas completas para as que se precisa un informe (por defecto, 1 hora), mesmo durante unha semana, se a base de datos non se reiniciou, o bot comeza a traballar inmediatamente, recolle o informe, publícao como unha páxina web e proporciona inmediatamente (case inmediatamente) unha ligazón ao informe tan necesario.

Segue a ligazón e aquí está o informe de AWR:

Aforramos tempo, nervios e horas de traballo

Como era de esperar, os desenvolvedores xestionaron ben esta xeración de informes e alguén incluso expresou a súa gratitude.

Despois de apreciar a comodidade do equipo, os xestores de proxectos doutras rexións tamén querían o mesmo, xa que adoitan recibir a maior parte das críticas dos clientes por preocuparse polo rendemento e a dispoñibilidade do sistema. Tamén engadín o bot aos outros chats. Aínda o están a usar e estou contento con iso.

Máis tarde, os meus compañeiros do CIT decatáronse de como recompilabamos informes e quixeron unirse. Non os engadín aos nosos chats, senón que creei un chat separado para a xeración de informes programados e baixo demanda.

/pgBadger

Tamén temos outras aplicacións en PHP en conxunto con PostgreSQL. Implementouse a recollida de informes de pgBadger para aqueles que o precisen usando o mesmo principio: en chats de grupo. Ao principio usámolo, pero despois paramos. A funcionalidade foi eliminada por ser innecesaria.

/deber

O noso departamento ten quendas de noite e, polo tanto, un horario. Está almacenado en Follas de cálculo de Google. Non sempre é cómodo buscar unha ligazón, abrir o horario e buscalo un mesmo... Un dos meus antigos compañeiros tamén xogou co seu bot de Telegram e implementouno no chat do noso departamento. notificacións sobre o inicio da quenda de traballo para o persoal do departamento. O bot analiza a programación, identifica a persoa de garda segundo a data actual e, segundo a programación ou se se lle solicita, notifica quen está de garda hoxe. É xenial e práctico. Non obstante, non quedei moi satisfeito co formato da mensaxe. Ademais, os empregados doutro departamento (por exemplo, o Centro de Negocios de Medicina) non precisan realmente información sobre as persoas de garda noutras áreas, pero si precisan saber quen está de garda en Medicina en caso de problemas. Decidín "tomar prestada" a funcionalidade pero cambiar o que non me gustaba. Creei un formato de mensaxe que é cómodo para min e para os demais, eliminando a información innecesaria.

/tnls

Despois de probar a automatización a través dun bot de Telegram, tiña moitas ideas diferentes, pero quería facer cousas estritamente necesarias. Decidín seguir estatísticas sobre recursos. Para acceder aos proxectos dos nosos clientes, implementamos un chamado "servidor hopper" ou servidor de reenvío. As conexións VPN establécense nel e, a continuación, os portos de aplicacións, as bases de datos e outros servizos auxiliares de reenvío reenvíanse á nosa rede local a través de SSH, o que garante un acceso cómodo aos proxectos dos nosos empregados sen a molestia das conexións VPN. Simplemente configure unha conexión VPN á nosa rede corporativa.

As estatísticas de solicitudes mostraron que, a miúdo, despois de que un túnel caia (debido a problemas de rede, como un tempo de espera), a xente pregunta sobre como restaurar o acceso ao proxecto. Na maioría dos casos, basta con reiniciar a conexión e todo vai ben. Entón, fagámolo nós mesmos. Aquí está o comando:
Aforramos tempo, nervios e horas de traballo

"Caes" no elemento do menú desexado, seleccionas o teu proxecto, esperas un minuto e todos están contentos e satisfeitos...

Ao recibir unha orde, cun só movemento do dedo, o bot conéctase ao servidor de reenvío, sabendo de antemán que reenvío hai que reiniciar, e fai o seu traballo: restaurar a conexión co proxecto. Escribín instrucións para que os usuarios puidesen resolver estes problemas de forma independente. A xente só se poñía en contacto connosco se a ferramenta proporcionada non funcionaba...

/ecp_a_pem

Outras estatísticas mostraron que a miúdo é necesario converter Sinatura dixital de Crypto Pro en formato PEM(Basexnumx) для различных интеграций, а их у нас достаточно много. Задача: берешь контейнер, копируешь его на компьютер с Windows с установленой утилитой P12FromGostCSP(к слову, платной), конвертируешь его в pfx, а уже pfx конвертируешь с помощью OpenSSL(c поддержкой ГОСТового шифрования) в pem. Не очень удобно, а хочется по щелчку пальцев.

Google volveu ao rescate. Atopouno. a utilidade dalgunha persoa amableCompileino como se describe no README e funcionou. Adestrei o bot para usar a utilidade e obtiven unha conversión case instantánea.
Aforramos tempo, nervios e horas de traballo

Cando se completou a implementación final, emitiuse unha orde para a transición a un novo formato de cifrado: GOST-2012. Polo que recordo, a utilidade daquela época só funcionaba co antigo GOST (2001). Quizais fose unha utilidade completamente diferente e similar, doutra persoa; non o recordo exactamente.
Despois de cambiar ao novo estándar GOST, eliminei a funcionalidade do bot por razóns de seguridade. Implementeino nun contedor Docker.

Dockerfile, por se alguén o precisa:

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

Para converter, debes colocar o contedor fonte (un directorio como xxx.000) no directorio /srv/in e recuperar o pem rematado desde /srv/out.

Para converter, siga estes pasos:

 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 día, un administrador de bases de datos de Oracle xenial con ampla experiencia en administración e desenvolvemento de SGBD uniuse á nosa empresa. De inmediato, tivo problemas para conectarse aos servidores de SGBD a través de SSH: non podía descubrir onde nin como conectarse, os detalles de acceso non estaban claros ou non podía reenviar algo que necesitaba. Estivemos encantados de axudar, explicámoslle como conectarse e configuramos Enterprise Manager para el. Pero o SSH seguía sen funcionar. Un dos nosos compañeiros explicouno de forma sinxela: é un administrador de bases de datos de pura raza. 🙂 Decidimos que se necesitaba axustar algo no servidor, o faríamos nós mesmos.

Ás veces, EM falla con cargas elevadas e, para reinicialo... tes que conectarte mediante SSH e reinicialo a través do terminal. "Os administradores son bos niso", decidiu o noso novo compañeiro. As cargas pesadas de DBMS non son infrecuentes aquí e as solicitudes para reiniciar EM tornáronse comúns. Entón ocorre o mesmo escenario: estrés, irritación e busca dunha solución. Entón, neses mesmos chats de grupo, apareceron os seguintes comandos: /emstop e /emstart.

Aforramos tempo, nervios e horas de traballo

/matar

Se hai unha forte disputa na base de datos, o que ás veces ocorre, é necesario descargala rapidamente. O xeito máis rápido é matar o proceso infractor... Para facelo, conéctate a través de SSH, mata -9... O bot axudarache!

Aforramos tempo, nervios e horas de traballo

Alexey apreciou o equipo e deulle un nome cariñoso... "Kilalka" ou unha pistola.
Un día, despois de ver a Alexey loitar e sufrir, escribindo /kill xxx cada vez para cada un dos procesos, decidín engadir "multi-barrel" á nosa arma:

Aforramos tempo, nervios e horas de traballo

Mellor así! Todo é por ti, Alexey, segue traballando, meu querido!

Naturalmente, un equipo tan importante era limitado acceso por user_id - "infalible". Ao ver como Lesha mataba con destreza procesos no servidor da base de datos, varias persoas intentaron introducir un comando cun número de proceso aleatorio, pero o meu bot intelixente non se deixou enganar; rexeitou inmediatamente.

/rexistrodealertas

Ben, por se acaso, fixen o comando:
/alertlog <número de liñas> — obter o número especificado de liñas de rexistro de alertas
O bot extrae o rexistro de alertas e envíao ao noso servizo, un servizo semellante a Pastebin chamado pyste, e envía unha ligazón ao ficheiro pegado no chat de solicitudes.

/cheques

Entón chegou unha solicitude Monitorización do rendemento real da nosa aplicación. Ata o de agora, o equipo de soporte técnico do proxecto estivera a recoller estes datos manualmente. Iso non é certo! Os nosos valentes probadores desenvolveron casos de proba para este propósito. Os rexistros de proba resultantes non son moi fáciles de usar; un usuario sen experiencia pasará moito tempo descubrindo e pode que non sexa capaz de extraer a información que necesita. E non nos gusta facer cousas manualmente que se poden facer sen intervención manual... Un novo desafío para o bot!

Aforramos tempo, nervios e horas de traballo

O comando /checks produce un menú sinxelo e directo; esta vez, os nosos rapaces aprenderon a usar este comando sen instrucións!

Ao seleccionar o elemento desexado, aparece unha notificación sobre o inicio da proba en lugar dun menú, para que os usuarios impacientes non executen a nosa proba 100500 veces:

Aforramos tempo, nervios e horas de traballo

Dependendo do elemento do menú seleccionado, iníciase unha proba específica desde a nosa rede, concretamente desde a máquina onde reside o bot (jmeter está preconfigurado alí, as probas necesarias están situadas, etc.) ou directamente desde o centro de datos (desde unha máquina preparada xunto á aplicación), para eliminar a latencia da rede durante as probas ou, polo menos, reducila ao mínimo.

Unha vez completada a proba e recibida a resposta ao rexistro, o bot analízaa e produce o resultado nun formato lexible para humanos:

Aforramos tempo, nervios e horas de traballo

Colección de métricas

A funcionalidade foi un éxito e os xestores de proxectos dispostos a usala recibiron a súa versión para as súas rexións. Un xestor de proxectos compasivo declarou: "Quero ter estatísticas baseadas no tempo!". Alguén do Centro Central de Tecnoloxía da Información suxeriu que sería conveniente monitorizar todo isto en Zabbix. Zabbix, entón Zabbix…

Pensei que necesitaba prepararme para a necesidade de replicar a solución... Implementei a idea nun contedor Docker. JMeter execútase no contedor segundo unha programación (cada 10 minutos), almacena o rexistro nunha localización específica, PHP analízao e produce os datos requiridos como unha páxina web. Zabbix usa a clave web.page.get para recuperar esta páxina, usa unha expresión regular para seleccionar os datos requiridos para elementos dependentes específicos e traza o gráfico.

Aforramos tempo, nervios e horas de traballo

Creo que resultou bastante ben. Observando o gráfico, podemos ver, en primeiro lugar, a velocidade aproximada da aplicación e, se detectamos algún pico no gráfico, podemos determinar aproximadamente onde está o colo de botella. É sinxelo. Ata o de agora, só demostrou ser útil nunha rexión, pero estou listo para implementalo para calquera persoa interesada.

Refinamento da aplicación

As estatísticas sobre tarefas semellantes déronme recentemente algunhas ideas para simplificar e facilitar o meu traballo. Algúns proxectos requiren instalar contedores de claves Crypto Pro en servidores de aplicacións. Hai moitos deles, e as sinaturas dixitais caducan co tempo. Ás veces recibo dúas tarefas ao día. Pero considerei que usar un bot para estes fins non era seguro e decidín implementar a funcionalidade directamente na aplicación. Naturalmente, requiriría autorización e verificación dos dereitos de acceso. Se se cumpren os privilexios necesarios, haberá un elemento de menú adicional dispoñible para traballar con sinaturas dixitais, instalación, eliminación, visualización de información, etc. Esta funcionalidade está actualmente en desenvolvemento. Resulta que non é moi difícil; só necesito ler as instrucións existentes, mirar exemplos de código, preguntar a colegas máis experimentados e despois facelo. Mentres investigaba, xurdíronse ideas para engadir á aplicación. Non farei grandes plans: o desenvolvemento xa está en marcha, así que deixemos que cada quen faga o que lle apeteza. Pero, por agora, estou a facelo eu mesmo.

Plans

Como dixen, ocorréronseme moitas ideas diferentes para usar o noso bot e outras cousas, basicamente, ideas para "puntos de automatización", por así dicilo. Moitas delas esquecínme porque non tiña tempo de escribilas. Agora tento escribir todo o que me vén á cabeza e recomendo que outros fagan o mesmo.

Non obstante, Alexey nunca esquece de compartir os seus propios desexos. Entre os máis recentes:
/kill_sql ID_SQL — matar todas as sesións con esta consulta SQL_ID
/bloque_de_matar - pechar a sesión de bloqueo de root
/mostrar_em — mostrar imaxe de rendemento EM
O astuto quere ser administrador de bases de datos desde o seu teléfono =)

Así traballamos polo ben da Patria!

Como te liberas das tarefas rutineiras e pouco interesantes?

Espero que esta lectura fose interesante, e quizais incluso útil para alguén, e non tivera tempo de aburrir ao lector... Moita sorte a todos nós.

Fonte: www.habr.com

Compre hospedaxe fiable para sitios con protección DDoS, servidores VPS VDS 🔥 Compra aloxamento web fiable con protección DDoS, servidores VPS VDS | ProHoster