Oszczędzamy czas, nerwy i roboczogodziny

Nasze projekty mają zazwyczaj charakter regionalny, a klientami są zazwyczaj ministerstwa. Jednak oprócz sektora publicznego z naszych systemów korzystają także organizacje prywatne. Praktycznie nie ma z nimi żadnych problemów.

Zatem główne projekty mają charakter regionalny i czasem pojawiają się z nimi problemy. Na przykład z wydajnością, gdy w regionach jest ponad 20 tys. naszych cennych użytkowników w okresie wdrażania nowych funkcjonalności na serwerach produktów. To jest ból…

Nazywam się Ruslan i zajmuję się obsługą systemów informatycznych Grupy BARS opracowywanie zabójczego bota dla brutalnych seryjnych administratorów baz danych. Ten post nie jest dla osób o słabych nerwach – jest w nim dużo listów i obrazków.

Oszczędzamy czas, nerwy i roboczogodziny

/owr

Niektóre z naszych aplikacji działają w systemie Oracle DBMS. Istnieją również projekty w systemie DBMS PostgreSQL. Oracle ma cudowną rzecz - zbiera statystyki dotyczące obciążenia DBMS, które podkreślają istniejące problemy, a nawet przedstawia zalecenia dotyczące ich eliminacji - Automatyczne Repozytorium Obciążeń (AWR). W pewnym momencie (mianowicie w momencie bólu) twórcy nieustannie prosili o zbieranie Raporty AWR do analizy wydajności. Szczerze udaliśmy się na serwer DBMS, zebraliśmy raporty, zabraliśmy je do nas i wysłaliśmy na produkcję do analizy. Po piątym razie stało się to irytujące, po dziesiątym stało się irytujące...

Jeden z moich kolegów wyraził kiedyś pogląd, że wszystko, co jest wykonywane więcej niż raz, powinno zostać zautomatyzowane. Do momentu irytacji szczerze mówiąc nie myślałem o tym i próbowałem zautomatyzować wszystko, co dało się zautomatyzować, ale często nie było na to popytu i miało to raczej charakter badawczy niż stosowany.

A potem pomyślałem: „Administratorzy nie są potrzebni do generowania raportu…”. W końcu zebranie raportu oznacza wykonanie skryptu sql @$ORACLE_HOME/rdbms/admin/awrrpt.sql i zabranie raportu z serwera na swoje miejsce... O tak, nie pozwalamy na rozwój do celów produkcyjnych.

Następnie wyszukałem w Google potrzebne informacje, stworzyłem funkcję z artykułu w bazie testowej, uruchomiłem skrypt i cud - raport został skompilowany i można go zapisać lokalnie. Stworzyłem funkcje, w których często potrzebne były raporty AWR, i poinstruowałem programistów, jak z nich korzystać.

Mniej więcej w tym czasie, w wolnym czasie, po rozmowie z @BotFather, stworzyłem dla siebie bota Telegrama, po prostu dla zabawy. Wkręciłem tam prostą funkcjonalność - pokazuję aktualny czas, kursy walut, pogodę, nauczyłem go, aby zgodnie z harmonogramem przesyłał komplementy mojej żonie (wówczas dziewczynie). Być może w tamtym czasie najpopularniejszą funkcjonalnością mojego bota było przesyłanie komplementów i moja żona to doceniała.

Więc. Programiści piszą do nas w Telegramie, my wysyłamy im raport w Telegramie... A co jeśli napiszą nie do nas, ale do bota? Przecież tak będzie lepiej dla wszystkich, zgłoszenie wpłynie szybciej i co najważniejsze z pominięciem nas. Tak narodził się pomysł na pierwszą popularną funkcjonalność dla mojego bota.

Zacząłem wdrażać. Zrobiłem to najlepiej jak mogłem, w PHP (sama nasza aplikacja jest w PHP, jestem w tym bardziej obeznany niż w Pythonie). Nie jestem dobrym programistą, więc nie pokażę Ci mojego kodu :)

Bot żyje w naszej sieci korporacyjnej i ma dostęp do niektórych projektów, w tym docelowych baz danych. Aby nie zawracać sobie głowy parametrami w zespole czy menu, dodałem tę funkcjonalność do czatu grupowego z powiadomieniami monitorującymi. Dzięki temu bot od razu wie, z której bazy danych ma pobrać raport.

Otrzymawszy polecenie typu /awr N, gdzie N to liczba pełnych godzin, za które potrzebny jest raport (domyślnie - 1 godzina), nawet za tydzień, jeśli baza danych nie została zrestartowana, bot natychmiast rozpoczyna pracę, zbiera raport, publikuje go jako stronę internetową i od razu (prawie na miejscu) udostępnia link do tak potrzebnego raportu.

Kliknij link, a oto raport AWR:

Oszczędzamy czas, nerwy i roboczogodziny

Zgodnie z oczekiwaniami programiści poradzili sobie z takim generowaniem raportów, a niektórzy nawet nam podziękowali.

Doceniwszy wygodę zespołu, kierownicy projektów z innych regionów chcieli tego samego, ponieważ to oni otrzymują najwięcej od klienta i martwią się o wydajność i dostępność systemów. Dodałem bota do innych czatów. Nadal z tego korzystają i bardzo się z tego cieszę.

Później koledzy z CIT dowiedzieli się, jak zbieramy raporty i też chcieli to zrobić. Nie dodawałem ich do naszych czatów, stworzyłem osobny czat z generowaniem raportów według harmonogramu i na żądanie.

/pgBadger

Mamy również inne aplikacje w PHP w połączeniu z PostgreSQL. Zbiór raportów pgBadger dla potrzebujących wdrożyłem na tej samej zasadzie – w czatach grupowych. Na początku to stosowali, ale potem przestali. Funkcjonalność została wycięta jako niepotrzebna.

/obowiązek

Nasz dział ma nocne zmiany i odpowiednio ma harmonogram. Jest w Arkuszach Google. Nie zawsze wygodnie jest szukać linku, otwierać wykres, szukać samemu… Jeden z moich byłych kolegów również bawił się swoim botem Telegram i umieścił go na czacie naszego działu powiadomienia o rozpoczęciu dyżuru dla pracowników działu. Bot analizuje harmonogram, ustala osobę dyżurującą według aktualnego terminu i zgodnie z harmonogramem lub na żądanie zgłasza, kto pełni dyżur w danym dniu. Okazało się świetnie i wygodnie. To prawda, że ​​\uXNUMXb\uXNUMXbnie podobał mi się format wiadomości. Również w przypadku pracowników innego działu (na przykład BC „Medycyna”) informacje o osobach dyżurujących w innych kierunkach tak naprawdę nie są potrzebne, ale w przypadku problemów trzeba wiedzieć, kto dyżuruje w „Medycynie”. Postanowiłem „pożyczyć” funkcjonalność, ale zmienić to, co mi się nie podobało. Dostosowałem format wiadomości dogodny dla siebie i innych, usuwając niepotrzebne informacje.

/tnls

Po wypróbowaniu automatyzacji za pomocą bota Telegramu pojawiło się wiele różnych pomysłów, ale chciałem zrobić absolutnie niezbędne rzeczy. Postanowiłem poprowadzić statystyki dotyczące żądań. Aby uzyskać dostęp do projektów naszych klientów, wdrożyliśmy tzw. „serwer skokowy” lub serwer przekazujący. Na nim nawiązywane są połączenia VPN, następnie porty aplikacji, bazy danych i inne przekierowania pomocnicze przekazywane są do naszej sieci lokalnej poprzez ssh, co pozwala na łatwy dostęp do projektów naszych pracowników, bez problemów z połączeniami VPN. Wystarczy, że skonfigurujesz połączenie VPN z naszą siecią firmową.

Statystyka zapytań pokazała, że ​​często po awarii jednego z tuneli (w przypadku problemów z siecią, np. wskutek przekroczenia limitu czasu) ludzie kontaktują się z nami w sprawie przywrócenia dostępu do projektu. W większości przypadków wystarczy zrestartować połączenie i wszystko jest w porządku. Zróbmy to sami. Oto polecenie:
Oszczędzamy czas, nerwy i roboczogodziny

„Wpadasz” do żądanej pozycji menu, wybierasz projekt, czekasz chwilę i wszyscy są szczęśliwi i usatysfakcjonowani…

Po otrzymaniu polecenia, po lekkim przesunięciu bajtów i bitów, bot łączy się z serwerem przekazującym, wiedząc z góry, które przekazywanie należy ponownie uruchomić, i wykonuje swoje zadanie - przywraca połączenie z projektem. Napisałem instrukcje, abyś mógł sam rozwiązać takie problemy. A ludzie kontaktowali się z nami tylko wtedy, gdy dostarczone narzędzie nie działało...

/ecp_to_pem

Dalsze statystyki pokazały, że często konieczna jest konwersja EDS Crypto Pro w formacie pem(Baza 64) do różnych integracji, a jest ich całkiem sporo. Zadanie: weź kontener, skopiuj go na komputer z systemem Windows z zainstalowanym narzędziem P12FromGostCSP (swoją drogą płatnym), skonwertuj go na pfx, a następnie skonwertuj pfx za pomocą OpenSSL (z obsługą szyfrowania GOST) na pem. Nie jest to zbyt wygodne, ale chcesz mieć to na pstryknięcie palcami.

Z pomocą ponownie przyszło Google. Znaleziony użyteczność jakiejś osoby. Zmontowałem tak jak napisano w README - zadziałało. Nauczyłem bota pracy z narzędziem i uzyskałem niemal natychmiastową konwersję.
Oszczędzamy czas, nerwy i roboczogodziny

Do czasu ostatecznego wdrożenia wydano polecenie przejścia na nowy format szyfrowania - gost-2012. O ile pamiętam, narzędzie w tym momencie działało tylko ze starym GOST (2001), być może było to kolejne podobne narzędzie od innej życzliwej osoby, nie pamiętam dokładnie.
Po przejściu na nowy GOST funkcjonalność bota została usunięta ze względów bezpieczeństwa. Zaimplementowano go w kontenerze dokowanym.

Dockerfile, na wypadek gdyby ktoś go potrzebował:

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

Aby przeprowadzić konwersję, musisz umieścić oryginalny kontener (katalog taki jak xxx.000) w katalogu /srv/in i przenieść gotowy plik pem do /srv/out.

Przekonwertować na:

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

Pewnego dnia bardzo fajny Oracle DBA, z dużym doświadczeniem w administracji i rozwoju DBMS, dostał pracę w naszej firmie. I od razu miał problem z połączeniem się z serwerami DBMS przez ssh: nie wie gdzie i jak się połączyć, dostęp nie jest jasno opisany lub nie może przekazać sobie czegoś, czego potrzebuje. Cóż, chętnie pomożemy, powiedzieliśmy mu, jak się połączyć i przesłaliśmy mu Enterprise Managera. Ale nadal coś nie wyszło z ssh. Jeden z moich kolegów wyjaśnił to prosto: rasowy DBA :) Stwierdziliśmy, że jeśli będziemy musieli coś poprawić na serwerze, zrobimy to sami.

EM czasami ulega awarii pod dużym obciążeniem i aby go zrestartować... musisz połączyć się przez ssh i uruchomić ponownie przez terminal. „Administratorzy są w tym dobrzy” – stwierdził nasz nowy kolega. Duże obciążenia w systemie DBMS nie są dla nas niczym niezwykłym, a prośby o ponowne uruchomienie EM są również częste. Potem ten sam scenariusz: napięcie, irytacja i szukanie rozwiązania problemu. Tak więc w tych samych czatach grupowych pojawiły się następujące polecenia: /emstop i /emstart.

Oszczędzamy czas, nerwy i roboczogodziny

/ zabić

Jeśli w bazie danych panuje silna konkurencja, a czasem się to zdarza, konieczne jest szybkie rozładowanie bazy danych. Najszybszym sposobem jest zabicie problematycznego procesu... Aby to zrobić, połącz się przez ssh, zabij -9... Bot pomoże!

Oszczędzamy czas, nerwy i roboczogodziny

Aleksiej docenił zespół i nadał mu czułe imię - „Kilyałka” lub pistolet.
Któregoś dnia, po obejrzeniu, jak Aleksiej próbował i cierpiał, wpisując za każdym razem /kill xxx dla każdego z procesów, zdecydowałem się dodać do naszej broni „multi-lufę”:

Oszczędzamy czas, nerwy i roboczogodziny

Tak jest lepiej! Wszystko jest dla ciebie, Aleksiej, po prostu pracuj, kochanie!

Oczywiście tak ważny zespół był ograniczony dostęp przez user_id - „niezawodny”. Widząc, jak Lesha zręcznie zabija procesy na serwerze bazy danych, kilka osób próbowało wprowadzić polecenie z losowym numerem procesu, ale mojego inteligentnego bota nie da się oszukać, natychmiast odmówił.

/alertlog

No cóż, na wszelki wypadek wydałem polecenie:
/alertlog <liczba wierszy> — pobierz określoną liczbę wierszy dziennika alertów
Bot pobiera dziennik alertów i wysyła go do naszej usługi, takiej jak pastebin, zwanej pyste, i wysyła link do wklejenia do czatu z żądaniem.

/czeki

Następnie przyszła prośba o monitorowanie rzeczywistego działania naszej aplikacji. Do tej pory wsparcie techniczne projektu zbierało te dane ręcznie. Bez znaczenia! Nasi dzielni testerzy opracowali w tym celu przypadki testowe. Powstały dziennik testów nie jest zbyt wygodny do odczytania, niedoświadczonemu użytkownikowi zajmie dużo czasu zrozumienie i nie jest pewien, czy podświetli niezbędne informacje. A my nie lubimy robić rękami tego, czego nie możemy zrobić rękami... Nowe zadanie dla bota!

Oszczędzamy czas, nerwy i roboczogodziny

Polecenie /checks wyświetla proste i jednoznaczne menu; tym razem nasi ludzie nauczyli się korzystać z tego polecenia bez instrukcji!

Po wybraniu żądanej pozycji zamiast menu pojawia się powiadomienie o rozpoczęciu testu, aby niecierpliwi użytkownicy nie uruchamiali naszego testu 100500 XNUMX razy:

Oszczędzamy czas, nerwy i roboczogodziny

W zależności od wybranej pozycji menu, z naszej sieci uruchamiany jest konkretny test, czyli z maszyny, na której żyje bot (tam jest wstępnie skonfigurowany jmeter, znajdują się niezbędne testy...) lub bezpośrednio z centrum danych (z przygotowana maszyna obok aplikacji), aby podczas testowania wykluczyć połączenia sieciowe lub ograniczyć je do minimum.

Po zakończeniu testu i otrzymaniu logu bot analizuje go i generuje wynik w formie „czytelnej dla człowieka”:

Oszczędzamy czas, nerwy i roboczogodziny

Zbiór metryk

Funkcjonalność już dotarła i zainteresowani kierownicy projektów otrzymali taką funkcję dla swoich regionów. Pewien współczujący kierownik projektu powiedział: „Chcę mieć statystyki czasu!” Ktoś z CIT powiedział jej, że wygodnie byłoby to wszystko monitorować w Zabbix. Zabbix, więc Zabbix...

Pomyślałem, że trzeba się przygotować na konieczność replikacji rozwiązania... Pomysł umieściłem w kontenerze dokera. W kontenerze jmeter jest uruchamiany zgodnie z harmonogramem (raz na 10 minut), umieszcza logi w określonym miejscu, php je analizuje i wyświetla niezbędne dane w postaci strony internetowej. Zabbix za pomocą klucza web.page.get odbiera tę stronę, regularnie wybiera niezbędne dane dla poszczególnych elementów zależnych i buduje wykres.

Oszczędzamy czas, nerwy i roboczogodziny

Myślę, że wyszło nieźle. Obserwując wykres, najpierw widzimy przybliżoną prędkość aplikacji, a jeśli na wykresie zostaną wykryte piki, wiemy mniej więcej, gdzie znajduje się „wtyczka”. To proste. Jak dotąd okazało się, że jest zapotrzebowanie tylko w jednym regionie, ale jestem gotowy powielić go dla zainteresowanych.

Rozwój aplikacji

Statystyki dotyczące podobnych zadań dały ostatnio początek kolejnym pomysłom na uproszczenie i ułatwienie pracy. Na niektórych projektach, na serwerach aplikacji, zachodzi konieczność zainstalowania kluczowych kontenerów Crypto Pro, jest ich wiele, a podpis cyfrowy z czasem wygasa. Czasami dziennie przychodzą 2 zadania. Uznałem jednak, że używanie bota do tych celów jest niebezpieczne i zdecydowałem, że stworzę taką funkcjonalność bezpośrednio w aplikacji. Oczywiście z autoryzacją i sprawdzeniem praw dostępu. Jeśli posiadasz niezbędne uprawnienia, dostępna będzie dodatkowa pozycja menu umożliwiająca pracę z podpisami cyfrowymi, instalację, usuwanie, przeglądanie informacji itp. Funkcjonalność jest obecnie w fazie rozwoju. Jak się okazało, nie jest to bardzo trudne, wystarczy trochę przeczytać istniejącą instrukcję, przyjrzeć się przykładom kodu, zapytać kolegów bardziej doświadczonych w programowaniu, a następnie to zrobić. W trakcie procesu badawczego pojawiły się pomysły na dodanie do aplikacji. Nie będę snuł planów napoleońskich - jest rozwój, niech każdy zajmuje się swoimi sprawami. Ale chociaż jest to interesujące, robię to sam.

Plany

Jak mówiłem, narodziło się wiele różnych pomysłów na wykorzystanie naszego bota i nie tylko – w ogóle, powiedzmy, pomysłów na „punkty automatyzacji”, wiele z nich zostało zapomnianych, bo nie miałem czasu ich spisać. Teraz staram się zapisywać wszystko, co przychodzi mi do głowy i polecam innym zrobić to samo.

Ale Aleksiej nie zapomina spełnić swoich życzeń. Z najnowszych:
/kill_sql Identyfikator_SQL — zabij wszystkie sesje tym żądaniem SQL_ID
/kill_block - zakończ sesję blokującą root
/Pokaż em — pokaż zdjęcie wydajności EM
To cwaniak, chce uszyć DBA ze swojego telefonu =)

Tak działamy na rzecz Ojczyzny!

Jak pozbyć się rutynowych i nieciekawych zadań?

Mam nadzieję, że lektura okazała się dla kogoś ciekawa, a może nawet przydatna, a ja nie miałam czasu zanudzać czytelnika... Życzę nam wszystkim powodzenia.

Źródło: www.habr.com

Dodaj komentarz