Economize tempo, nervos e horas de trabalho

Nossos projetos são geralmente regionais e clientes, geralmente ministérios. Mas, além do setor público, organizações privadas também usam nossos sistemas. Praticamente não há problemas com eles.

Portanto, os principais projetos são regionais e, às vezes, há problemas com eles. Por exemplo, com desempenho, quando em regiões a partir de 20k, nossos usuários preciosos estão no período de implantação de novas funcionalidades nos servidores do produto. É uma dor ...

Meu nome é Ruslan e estou envolvido na escolta dos sistemas de informações do BARS Group e no desenvolvimento de um bot assassino para DBAs seriais brutais . O jejum não é para os fracos de coração - muitas cartas e fotos.



/ awr


Alguns de nossos aplicativos são executados no Oracle DBMS. Existem projetos no DBMS do PostgreSQL. A Oracle tem uma coisa maravilhosa: coletar estatísticas sobre a carga no DBMS, que destaca os problemas existentes e até fornece recomendações para eliminação - AWR (Automatic Workload Repository). Em um ponto (a saber, no momento da dor), os desenvolvedores constantemente pediam para coletar relatórios de AWR para análise de desempenho . Honestamente, fomos ao servidor DBMS, coletamos relatórios, arrastamos-os para nós e os enviamos para análise para produção. Uma vez após o dia 5 começou a esticar ... após o dia 10 - para causar irritação ...

Um dia, um dos meus colegas expressou a ideia de que tudo o que é feito mais de uma vez deve ser automatizado. Até o momento do aborrecimento, para ser sincero, eu não pensava nisso e tentava automatizar tudo o que pode ser automatizado, mas muitas vezes não era procurado e era mais pesquisa do que aplicada.

E então pensei: "Administradores não são necessários para gerar um relatório ..." . Afinal, coletar um relatório é executar o script sql @ $ ORACLE_HOME / rdbms / admin / awrrpt.sql e pegar o relatório do servidor para nós mesmos ... Ah, sim, não deixamos o desenvolvimento à venda.

Pesquisei as informações necessárias no Google, criei uma função a partir do artigo com base em testes, puxei o script e um milagre - o relatório foi coletado e pode ser salvo localmente. Funções criadas onde os relatórios AWR eram frequentemente necessários, informavam aos desenvolvedores como usá-lo.

Nessa época, no meu tempo livre, depois de conversar com o @BotFather, criei um bot do Telegram para mim, apenas por diversão. Eu estraguei um funcional simples lá - para mostrar a hora atual, as taxas de câmbio, o clima, o ensinei a enviar elogios para minha esposa (então uma garota) em um horário. Talvez naquele momento o envio de elogios fosse a funcionalidade mais procurada do meu bot, minha esposa apreciou.

Assim. Os desenvolvedores nos escrevem no Telegram, enviamos um relatório a eles no Telegram ... Mas e se eles não escrevem para nós, mas para o bot? De fato, será melhor para todos, o relatório será recebido mais rapidamente e, o mais importante, por nós. Assim, a ideia da primeira funcionalidade procurada nasceu para o meu bot.

Comecei a implementação. Fiz isso, como gerenciei, em PHP (na verdade, nosso aplicativo está em PHP, eu o entendo mais que Python). O codificador é muito parecido comigo, então não mostrarei meu código :) O

bot vive em nossa rede corporativa, tem acesso a determinados projetos, incluindo bancos de dados de destino. Para não me incomodar com os parâmetros no comando ou no menu, estraguei essa funcionalidade em um bate-papo em grupo com notificações de monitoramento. Portanto, o bot sabe imediatamente em qual banco de dados coletar o relatório.

Tendo recebido um comando do formulário / awr N, em que N é o número de horas completas para as quais um relatório é necessário (por padrão - 1 hora), mesmo por uma semana, se o banco de dados não for reiniciado, o bot começará a funcionar imediatamente, coletará o relatório, o publicará como uma página da web e logo ali (quase ali mesmo) fornece um link para um relatório muito necessário.

Seguimos o link e aqui está o relatório do AWR:



Como esperado, os desenvolvedores lidaram com essa geração de relatório, alguém até agradeceu.

Tendo apreciado a conveniência da equipe, os gerentes de projeto de outras regiões queriam o mesmo, porque, acima de tudo, recebem luli do cliente que se preocupa com o desempenho e a disponibilidade dos sistemas. Adicionado um bot para outros chats. Eles ainda usam, e eu estou feliz com isso.

Mais tarde, colegas do CIT escreveram sobre como coletamos relatórios, eles também queriam. Não os adicionei aos nossos bate-papos, criei um bate-papo separado com a geração de relatórios de acordo com o cronograma e a pedido.

/ pgBadger


Temos outras aplicações em PHP em conjunto com o PostgreSQL. Implementou a coleta do relatório pgBadger para os necessitados com o mesmo princípio - em bate-papos em grupo. A princípio eles usaram, mas depois pararam. Corte funcional como desnecessário.

/ dever


Em nosso departamento, há turnos da noite e, portanto, há um horário. Está nas tabelas do google. Nem sempre é conveniente procurar um link, abrir uma agenda, cuidar de si mesmo ... Um dos ex-colegas também brincou com seu bot do Telegram e introduziu notificações sobre o início de um turno de turno para os funcionários do departamento no bate-papo do departamento .O bot analisa a programação, determina o atendente pela data atual e, de acordo com a programação ou a pedido, informa quem está de plantão hoje. Acabou ótimo, confortável. É verdade que não gostei muito do formato da mensagem. Além disso, para funcionários de outro departamento (por exemplo, o centro de negócios "Medicina"), as informações sobre os oficiais de serviço em outras áreas não são realmente necessárias, mas você precisa saber quem é o oficial de serviço em "Medicina" em caso de problemas. Decidi "emprestar" a funcionalidade, mas mudar o que não gostei. Criei um formato de mensagem conveniente para mim e para os outros, removendo informações redundantes.

/ tnls


Após o "teste da caneta" da automação através do bot do Telegram, surgiram muitas idéias diferentes, mas eu queria fazer as coisas estritamente necessárias. Decidi manter as estatísticas dos recursos. Para acessar os projetos de nossos clientes, implementamos o chamado “servidor de salto” ou o servidor de encaminhamento. As conexões VPN são criadas nele e, por meio do ssh, as portas de aplicativos, os bancos de dados e outras sondas auxiliares são encaminhadas para a nossa rede local para facilitar o acesso aos projetos de nossos funcionários, sem problemas com as conexões VPN. Basta configurar uma conexão VPN para a nossa rede corporativa.

As estatísticas das chamadas sugerem que, muitas vezes, após a queda de um dos túneis (em caso de problemas na rede, por tempo limite, por exemplo), eles estão voltando para restaurar o acesso ao projeto. Na maioria dos casos, basta reiniciar a conexão e tudo fica bem. Vamos fazer você mesmo. Aqui é o comando:


“Queda através” para o item de menu desejado, selecione seu projeto, espere um minuto e todo mundo está feliz e satisfeito ...

Quando um comando é recebido, por um ligeiro movimento dos bytes e bits, as Ligações bot para o servidor de encaminhamento, sabendo de antemão necessidades que encaminhamento de ser reiniciado, e faz seu trabalho - restaura a conexão com o projeto. Escrevi instruções para resolver esses problemas por conta própria. E fomos contatados apenas se a ferramenta fornecida não funcionar ...

/ ecp_to_pem


Além disso, as estatísticas mostraram que muitas vezes é necessário converter a assinatura digital do Crypto Pro para o formato pem ( Base64 ) para várias integrações, e temos muitas delas. Tarefa: você pega o contêiner, copia-o para um computador Windows com o utilitário P12FromGostCSP instalado (a propósito, pago), converte-o em pfx e converte-o usando OpenSSL (com suporte à criptografia GOST) para pem. Não é muito conveniente, mas quero com um clique.

Google novamente veio para o resgate. Encontrou a utilidade de alguma pessoa gentil . Coletado, conforme escrito em README - ganho. Ele ensinou o bot a trabalhar com o utilitário e conseguiu uma conversão quase instantânea.


No momento da implementação final, um pedido foi emitido para mudar para um novo formato de criptografia - gost-2012. Tanto quanto me lembro, o utilitário naquele momento funcionava apenas com o antigo GOST (2001), talvez fosse geralmente outro utilitário semelhante de outra pessoa boa, não me lembro exatamente.
Após a transição para o novo GOST, a funcionalidade do bot foi removida por motivos de segurança. Implementado em um contêiner de docker.

Dockerfile, de repente quem 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, você precisa colocar o contêiner de origem (um diretório do formato xxx.000) no diretório / srv / in e selecionar o pem finalizado em / srv / out.

Converter:

 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


Uma vez, nossa empresa obteve um DBA Oracle muito interessante, com mais experiência na administração do DBMS e no desenvolvimento. E isso não aconteceu imediatamente com uma conexão ssh com os servidores DBMS: ou ele não sabe onde se conectar e como, então os acessos não são claramente descritos, é impossível encaminhar algo para si mesmo. Bem, estamos felizes em ajudar, conversamos sobre como conectar e encaminhamos o Enterprise Manager para ele. Mas com o ssh ainda não deu certo. Um dos colegas explicou simplesmente: DBA puro-sangue :) Decidimos que, se precisarmos reforçar algo no servidor, faremos sozinhos.

O EM trava com muita carga e, reiniciando-o ... você precisa se conectar via ssh e reiniciar através do terminal. "Os administradores sabem disso muito bem", decidiu nosso novo colega. Grandes cargas no DBMS não são incomuns, solicitações para reiniciar o EM também são frequentes. Depois, o mesmo cenário: tensão, irritação e a busca de uma solução para o problema. Portanto, no mesmo grupo de bate-papos, apareceu o comando: / emstop e / emstart.



/ mate


No caso de forte concorrência na base, e isso às vezes acontece, você precisa descarregar rapidamente o banco de dados. A maneira mais rápida é matar o processo problemático ... Para fazer isso, conecte-se via ssh, mate -9 ... O bot ajudará!



Alexey apreciou a equipe e deu um nome afetuoso - "Kilyalka" ou uma arma.
Uma vez, depois de ver como Alex está tentando e sofrendo, cada vez que entra / mata xxx em cada um dos processos, decidi adicionar "multilateralismo" à nossa arma:



É melhor! Tudo para você, Alex, apenas trabalhe, querida!

Naturalmente, o acesso a um comando tão importante foi limitado pelo user_id - "proteção contra o tolo". Vendo como Lesha acertou os processos no servidor de banco de dados, várias pessoas tentaram digitar um comando com um número de processo aleatório, mas você não pode enganar meu bot inteligente, ele imediatamente recusou.

/ alertlog


Bem, apenas no caso, eu fiz um comando:
/ alertlog <número de linhas> - obtém o número especificado de linhas alertlog'a O
bot puxa o alertlog e o envia para o nosso serviço, como pastebin, chamado pyste, e envia um link para a pasta para o chat de solicitação.

/ Verificações


Em seguida, veio uma solicitação para monitorar o desempenho real de nosso aplicativo. Até agora, o suporte técnico para o projeto coletava esses dados manualmente. Não é um acordo! Nossos valiosos testadores desenvolveram casos de teste para isso. O log de teste resultante não é muito conveniente de ler, um usuário inexperiente entenderá por um longo tempo e não o fato de destacar as informações necessárias. E não gostamos de fazer com as mãos o que não podemos fazer com as mãos ... Uma nova tarefa para o bot!



O comando / checks exibe um menu direto e inequívoco, desta vez nossos funcionários aprenderam a usar esse comando sem instruções!

Quando você seleciona o item desejado, em vez do menu, aparece uma notificação sobre o início do teste, para que usuários impacientes não executem nosso teste 100500 vezes:



Dependendo do item de menu selecionado, um teste específico é iniciado em nossa rede, a partir da máquina em que o bot vive (o jmeter é pré-configurado lá, os testes necessários são colocados ...) ou imediatamente no data center (da máquina preparada ao lado do aplicativo), para que ao testar elimine atrasos na rede, ou reduza-os.

Depois de concluir o teste e receber o log, o bot o analisa e exibe o resultado em um formulário “legível por humanos”:



Coleção de métricas


A funcionalidade foi "inserida" e os gerentes de projeto que desejam receber essa função para suas regiões. E um gerente de projeto compassivo disse: "Quero ter estatísticas a tempo!" Alguém do CIT disse a ela que seria conveniente monitorar tudo isso no Zabbix. Zabbix, então Zabbix ...

Pensei que era necessário se preparar para a necessidade de duplicar a solução ... Eu projetei a idéia em um contêiner de encaixe. No contêiner, de acordo com a programação (a cada 10 minutos), o jmeter é iniciado, adiciona o log em um local específico, o php o analisa e exibe os dados necessários na forma de uma página da web. O Zabbix usa a tecla web.page.get para acessar esta página, seleciona regularmente os dados necessários para certos elementos dependentes e constrói um gráfico.



Parece que acabou não sendo ruim. Observando o gráfico, em primeiro lugar, vemos a velocidade aproximada da aplicação e, se forem detectados picos no gráfico, sabemos aproximadamente onde está o “plugue”. Tudo é simples. Até o momento, acabou sendo demandado apenas por uma região, mas estou pronto para replicá-lo para aqueles que desejam.

Desenvolvimento de aplicações


As estatísticas de tarefas do mesmo tipo não faz muito tempo lançaram idéias para simplificar e facilitar o trabalho. Em alguns projetos, em servidores de aplicativos, é necessário instalar os principais contêineres do Crypto Pro, existem muitos, e a assinatura digital expirará com o tempo. Às vezes, 2 tarefas "voam" por dia. Mas considerei o uso do bot inseguro para esses fins e decidi que faria a funcionalidade diretamente no aplicativo. Naturalmente com autorização e controle de acesso. Se você tiver os privilégios necessários, um item de menu adicional estará disponível para trabalhar com assinaturas digitais, instalação, remoção, visualização de informações etc. etc. No momento, a funcionalidade está em desenvolvimento. Como se viu, isso não é muito difícil, você precisa ler um pouco as instruções, ver exemplos de código, perguntar a colegas mais experientes em desenvolvimento e pronto.No processo de pesquisa, surgiram idéias para adicionar ao aplicativo. Não construirei planos napoleônicos - há desenvolvimento, deixemos que todos façam suas próprias coisas. Mas, por enquanto, é interessante - estou fazendo isso sozinho.

Planos


Como eu disse, muitas idéias diferentes nasceram para usar nosso bot e não apenas - em geral, digamos, idéias para "pontos de automação", muitas delas foram esquecidas, pois não tive tempo de anotá-las. Agora, tento escrever tudo o que vem à mente e recomendo que outras pessoas façam o mesmo.

Mas Alex não esquece de jogar sua lista de desejos. Deste último:
/ kill_sql SQL_ID - mata todas as sessões com uma consulta SQL_ID
/ kill_block - mata a sessão de bloqueio de raiz
/ show_em - mostra uma imagem de desempenho EM
Trick, quer costurar DBA pelo telefone =)

É assim que trabalhamos para o bem da pátria!

E como você se salva de tarefas rotineiras e desinteressantes?

Espero que a leitura tenha sido interessante e talvez até útil para alguém, e não tive tempo de cansar o leitor ... Boa sorte para todos nós.

All Articles