Economizamos tempo, nervosismo e horas de trabalho

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

Então, os principais projetos são regionais e às vezes há problemas com eles. Por exemplo, com desempenho, quando nas regiões há mais de 20 mil de nossos preciosos usuários durante o período de implementação de novas funcionalidades nos servidores do produto. É uma dor…

Meu nome é Ruslan e apoio os sistemas de informação do Grupo BARS e desenvolvendo um bot assassino para DBAs em série violentos. Esta postagem não é para os fracos de coração - há muitas cartas e fotos.

Economizamos tempo, nervosismo e horas de trabalho

/awr

Algumas de nossas aplicações são executadas em Oracle DBMS. Existem também projetos no SGBD PostgreSQL. A Oracle tem uma coisa maravilhosa - coletar estatísticas sobre a carga do SGBD, que destaca os problemas existentes e até faz recomendações para eliminação - Repositório Automático de Carga de Trabalho (AWR). A certa altura (ou seja, no momento de dor), os desenvolvedores pediam constantemente para coletar Relatórios AWR para análise de desempenho. Honestamente, fomos ao servidor DBMS, coletamos relatórios, os levamos para nós e os enviamos para produção para análise. Depois da 5ª vez tornou-se irritante... depois da 10ª tornou-se irritante...

Certa vez, um de meus colegas expressou a ideia de que tudo o que é feito mais de uma vez deveria ser automatizado. Até o momento da irritação, para ser sincero, não pensei nisso e tentei automatizar tudo o que pudesse ser automatizado, mas muitas vezes não tinha demanda e era mais uma pesquisa do que aplicada.

E então pensei: “Os administradores não são necessários para gerar um relatório...”. Afinal, coletar um relatório significa executar o script sql @$ORACLE_HOME/rdbms/admin/awrrpt.sql e levar o relatório do servidor para sua casa... Ah, sim, não permitimos desenvolvimento para produção.

Depois pesquisei no Google as informações necessárias, criei a função a partir do artigo na base de testes, executei o script e milagre - o relatório foi compilado e pode ser salvo localmente. Funções criadas onde os relatórios AWR eram frequentemente necessários e instruídos aos desenvolvedores como usá-los.

Nessa época, nas horas vagas, depois de conversar com @BotFather, criei um bot do Telegram para mim, só por diversão. Apertei lá uma funcionalidade simples - mostrar a hora atual, taxas de câmbio, clima, ensinei a mandar elogios para minha esposa (então namorada) de acordo com uma programação. Talvez, naquela época, enviar elogios fosse a funcionalidade mais popular do meu bot, e minha esposa gostou disso.

Então. Os desenvolvedores nos escrevem no Telegram, nós enviamos um relatório para eles no Telegram... E se eles não escreverem para nós, mas para um bot? Afinal, será melhor para todos, o relatório chegará mais rápido e, o mais importante, nos contornará. Foi assim que nasceu a ideia da primeira funcionalidade popular para o meu bot.

Comecei a implementação. Fiz isso, da melhor maneira que pude, em PHP (nossa aplicação em si é em PHP, sou mais versado nisso do que em Python). Não sou um bom programador, então não vou mostrar meu código :)

O bot reside em nossa rede corporativa e tem acesso a determinados projetos, incluindo bancos de dados de destino. Para não me preocupar com parâmetros no comando ou menu, adicionei essa funcionalidade ao chat em grupo com notificações de monitoramento. Dessa forma, o bot sabe imediatamente de qual banco de dados coletar o relatório.

Tendo recebido um comando como /awrN, onde 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 tiver sido reiniciado, o bot imediatamente começa a trabalhar, coleta o relatório, publica-o como um página da web e imediatamente (quase ali) fornece um link para o relatório tão necessário.

Siga o link e aqui está o relatório AWR:

Economizamos tempo, nervosismo e horas de trabalho

Como esperado, os desenvolvedores lidaram com a geração de relatórios e alguns até nos agradeceram.

Tendo apreciado a comodidade da equipe, os gerentes de projetos de outras regiões desejaram o mesmo, pois recebem o máximo do cliente e se preocupam com o desempenho e a disponibilidade dos sistemas. Adicionei o bot a outros chats. Eles ainda usam e estou feliz com isso.

Mais tarde, colegas do CIT descobriram como coletamos relatórios e quiseram fazer isso também. Não os adicionei aos nossos chats, criei um chat separado com geração de relatórios agendados e mediante solicitação.

/pgTexugo

Também temos outras aplicações em PHP em conjunto com PostgreSQL. Implementei a coleta de relatórios pgBadger para quem precisa usando o mesmo princípio - em chats em grupo. No começo eles usaram, mas depois pararam. A funcionalidade foi eliminada como desnecessária.

/obrigação

Nosso departamento tem turno noturno e, portanto, tem horário. Está no Planilhas Google. Nem sempre é conveniente procurar um link, abrir um gráfico, procurar você mesmo... Um dos meus ex-colegas também brincou com seu bot do Telegram e o introduziu no chat do nosso departamento notificações sobre o início do plantão dos funcionários do departamento. O bot analisa o horário, determina o plantonista pela data atual e, de acordo com o horário ou mediante solicitação, informa quem está de plantão hoje. Ficou ótimo e conveniente. É verdade que não gostei muito do formato das mensagens. Além disso, para funcionários de outro departamento (por exemplo, BC “Medicina”), não são realmente necessárias informações sobre os plantonistas em outras direções, mas é preciso saber quem está de plantão na “Medicina” em caso de problemas. Resolvi “pegar emprestada” a funcionalidade, mas mudei o que não gostei. Criei um formato de mensagem conveniente para mim e para outras pessoas, removendo informações desnecessárias.

/tnls

Depois de experimentar a automação usando um bot do Telegram, surgiram muitas ideias diferentes, mas eu queria fazer coisas estritamente necessárias. Eu decidi liderar estatísticas sobre solicitações. Para acessar os projetos de nossos clientes, implementamos o chamado “servidor de salto” ou servidor de encaminhamento. Nele são levantadas conexões VPN, em seguida portas de aplicação, bancos de dados e outros encaminhamentos auxiliares são encaminhados para nossa rede local via ssh, para facilitar o acesso aos projetos de nossos funcionários, sem problemas com conexões VPN. Tudo o que você precisa fazer é configurar uma conexão VPN à nossa rede corporativa.

As estatísticas de solicitações mostram que muitas vezes, após a falha de um dos túneis (no caso de problemas de rede, por timeout, por exemplo), as pessoas nos contactam para restaurar o acesso ao projeto. Na maioria dos casos, basta reiniciar a conexão e está tudo bem. Vamos fazer isso sozinho. Aqui está o comando:
Economizamos tempo, nervosismo e horas de trabalho

Você “cai” no item de menu desejado, seleciona seu projeto, espera um minuto e todos ficam felizes e satisfeitos...

Ao receber um comando, com um leve movimento de bytes e bits, o bot se conecta ao servidor de encaminhamento, sabendo antecipadamente qual encaminhamento precisa ser reiniciado, e faz seu trabalho - restaura a conexão com o projeto. Escrevi instruções para que você mesmo possa resolver esses problemas. E as pessoas só nos contactavam se a ferramenta fornecida não funcionasse...

/ecp_to_pem

Outras estatísticas mostraram que muitas vezes é necessário converter EDS Crypto Pro em formato pem(Base 64) para várias integrações, e temos muitas delas. Tarefa: pegue um contêiner, copie-o para um computador Windows com o utilitário P12FromGostCSP instalado (pago, aliás), converta-o para PFX e, em seguida, converta PFX usando OpenSSL (com suporte para criptografia GOST) para PEM. Não é muito conveniente, mas você quer isso com um estalar de dedos.

O Google veio ao resgate novamente. Encontrado utilidade de alguma pessoa gentil. Eu montei conforme está escrito no README - funcionou. Ensinei o bot a trabalhar com o utilitário e consegui uma conversão quase instantânea.
Economizamos tempo, nervosismo e horas de trabalho

No momento da implementação final, foi emitida uma ordem para mudar para um novo formato de criptografia - gost-2012. Pelo que me lembro, o utilitário naquele momento só funcionava com o antigo GOST (2001), talvez fosse outro utilitário semelhante de outra pessoa gentil, 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 docker.

Dockerfile, caso alguém precise:

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 original (diretório como xxx.000) no diretório /srv/in e levar o pem finalizado para /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

Um dia, um DBA Oracle muito bacana, com muita experiência em administração e desenvolvimento de SGBD, conseguiu emprego em nossa empresa. E ele imediatamente teve problemas para se conectar aos servidores DBMS com ssh: ele não sabe onde ou como se conectar, o acesso não está claramente descrito ou ele não consegue encaminhar algo que precisa para si mesmo. Bem, estamos felizes em ajudar, dissemos a ele como se conectar e encaminhamos para ele o Enterprise Manager. Mas as coisas ainda não funcionaram com o ssh. Um dos meus colegas explicou de forma simples: um DBA de raça pura :) Decidimos que, se precisarmos ajustar algo no servidor, faremos nós mesmos.

O EM às vezes trava sob carga pesada e para reiniciá-lo... você precisa se conectar via ssh e reiniciar através do terminal. “Os administradores são bons nisso”, decidiu nosso novo colega. Cargas pesadas no DBMS não são incomuns para nós, e solicitações para reiniciar o EM também são comuns. Depois o mesmo cenário: tensão, irritação e busca de solução para o problema. Assim, nos mesmos chats em grupo apareceram os seguintes comandos: /emstop e /emstart.

Economizamos tempo, nervosismo e horas de trabalho

/ matar

Se houver forte concorrência no banco de dados, e isso às vezes acontece, é necessário 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 vai ajudar!

Economizamos tempo, nervosismo e horas de trabalho

Alexey apreciou a equipe e deu-lhe um nome carinhoso - "Kilyalka" ou uma arma.
Um dia, depois de observar como Alexey tentou e sofreu, digitando /kill xxx todas as vezes para cada um dos processos, decidi adicionar “multi-cano” à nossa arma:

Economizamos tempo, nervosismo e horas de trabalho

Isso é melhor! Tudo é para você, Alexey, é só trabalhar, querido!

Naturalmente, uma equipe tão importante era limitada acesso por user_id - “infalível”. Vendo como Lesha mata habilmente processos no servidor de banco de dados, várias pessoas tentaram inserir um comando com um número de processo aleatório, mas você não pode enganar meu bot inteligente, ele recusou imediatamente.

/alertlog

Bem, por precaução, eu dei o comando:
/alertlog <número de linhas> — obtém o número especificado de linhas de alertalog
O bot puxa um alertlog e o envia para nosso serviço, como pastebin, chamado pyste, e envia um link para colar para o chat de solicitação.

/Verificações

Em seguida veio um pedido de monitorando o desempenho real de nossa aplicação. Até agora, o suporte técnico do projeto coletava esses dados manualmente. Não importa! Nossos valentes testadores desenvolveram casos de teste para isso. O log de teste resultante não é muito conveniente de ler, um usuário inexperiente demorará muito para entender e não tem certeza se 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!

Economizamos tempo, nervosismo e horas de trabalho

O comando /checks exibe um menu simples e inequívoco; desta vez nossos rapazes aprenderam como usar este comando sem instruções!

Ao selecionar o item desejado, ao invés de um menu, aparece uma notificação sobre o início do teste, para que usuários impacientes não executem nosso teste 100500 vezes:

Economizamos tempo, nervosismo e horas de trabalho

Dependendo do item de menu selecionado, um teste específico é lançado a partir da nossa rede, nomeadamente a partir da máquina onde reside o bot (o jmeter está pré-configurado aí, os testes necessários estão localizados...) ou diretamente do data center (a partir de um máquina preparada próxima à aplicação), a fim de excluir conexões de rede ao testar atrasos, ou reduzi-los ao mínimo.

Depois de concluir o teste e receber o log, o bot o analisa e produz o resultado em um formato “legível por humanos”:

Economizamos tempo, nervosismo e horas de trabalho

Coleta de métricas

A funcionalidade chegou e os gerentes de projetos interessados ​​receberam tal função para suas regiões. E um gerente de projeto compassivo disse: “Quero ter estatísticas de tempo!” Alguém do CIT disse a ela que seria conveniente monitorar tudo isso no Zabbix. Zabbix, então Zabbix...

Achei que precisava me preparar para a necessidade de replicar a solução... Coloquei a ideia em um contêiner docker. No contêiner, o jmeter é iniciado de acordo com uma programação (uma vez a cada 10 minutos), coloca o log em um determinado local, o php o analisa e exibe os dados necessários na forma de uma página da web. O Zabbix, usando a chave web.page.get, recebe esta página, seleciona regularmente os dados necessários para determinados elementos dependentes e constrói um gráfico.

Economizamos tempo, nervosismo e horas de trabalho

Acho que não foi ruim. Ao observar o gráfico, primeiramente vemos a velocidade aproximada da aplicação, e caso sejam detectados picos no gráfico, sabemos aproximadamente onde está o “plug”. É simples. Até agora, a procura foi apenas para uma região, mas estou pronto para replicá-lo para os interessados.

Desenvolvimento de aplicações

As estatísticas sobre tarefas semelhantes deram recentemente origem a mais ideias para simplificar e facilitar o trabalho. Em alguns projetos, em servidores de aplicação, é necessário instalar contêineres chave do Crypto Pro, são muitos, e a assinatura digital expira com o tempo. Às vezes chegam 2 tarefas por dia. Mas considerei inseguro usar um bot para esses fins e decidi que criaria a funcionalidade diretamente no aplicativo. Naturalmente com autorização e verificação dos direitos de acesso. Se você tiver os privilégios necessários, um item de menu adicional estará disponível para trabalhar com assinaturas digitais, instalar, excluir, visualizar informações, etc. A funcionalidade está atualmente em desenvolvimento. Acontece que isso não é muito difícil, basta ler um pouco as instruções existentes, ver exemplos de código, perguntar aos colegas mais experientes em desenvolvimento e então fazê-lo. Durante o processo de pesquisa, surgiram ideias para agregar à aplicação. Não farei planos napoleônicos - há desenvolvimento, deixe que cada um cuide da sua vida. Mas embora seja interessante, estou fazendo isso sozinho.

Planos

Como eu disse, nasceram muitas ideias diferentes para usar o nosso bot e não só - em geral, digamos, ideias para “pontos de automação”, muitas delas foram esquecidas, pois não tive tempo de anotá-las. Agora tento anotar tudo o que me vem à cabeça e recomendo que outros façam o mesmo.

Mas Alexey não se esquece de realizar seus desejos. Do mais recente:
/kill_sql SQL_ID — encerra todas as sessões com esta solicitação SQL_ID
/kill_block - matar a sessão de bloqueio de root
/show_em — mostrar uma imagem do desempenho do ME
Ele é um cara manhoso, quer costurar DBA pelo celular =)

É assim que trabalhamos em benefício da Pátria!

Como você se livra de tarefas rotineiras e desinteressantes?

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

Fonte: habr.com

Adicionar um comentário