Używanie usługi Google Stackdriver Debug, Trace, Logging i Logpoints

W tym samouczku omówiono usługę Google Stackdriver, dzięki której można wykonywać następujące czynności w aplikacjach Google Cloud Platform:

  • Wykonaj migawkę debugowania w aplikacjach działających w App Engine, Compute Engine i Container Engine.
  • Wyświetl logi aplikacji.
  • Skonfiguruj dane, monitoruj je i otrzymuj alerty.
  • Śledź wywołania interfejsu API, by uzyskać zestawienie czasu odpowiedzi i potencjalnych wąskiego gardła w kodzie.
  • Dodawanie punktów logowania do uruchomionej aplikacji bez konieczności wdrażania aplikacji. To naprawdę unikalna (i obiecująca) funkcja.

W tym samouczku wykonasz te czynności od zera:

  1. Tworzenie projektu Google Cloud Platform (w szczególności App Engine)
  2. Skonfiguruj repozytorium źródłowe projektu Google Cloud Platform
  3. Użyj standardowego źródła aplikacji Python dla gości dostępnej w GitHubie
  4. Wdróż kod
  5. Zobacz, jak możemy uzyskać zrzuty debugowania uruchomionej aplikacji
  6. Zapoznaj się z logami wywołań aplikacji i logami aplikacji
  7. Dodaj punkty logowania do bieżącej uruchomionej aplikacji. Tę funkcję omówiliśmy najpierw w tym poście na blogu: Dodawanie dzienników aplikacji do aplikacji bez ponownego uruchamiania.

Możemy zaczynać.

Autorem tych treści był Romin Irani, który został opublikowany tutaj.

Konfiguracja środowiska we własnym tempie

Jeśli nie masz jeszcze konta Google (Gmail lub Google Apps), musisz je utworzyć. Zaloguj się w konsoli Google Cloud Platform (console.cloud.google.com) i utwórz nowy projekt:

Zrzut ekranu z 10 września 2016 r., 12:45:26.png

Zapamiętaj identyfikator projektu, unikalną nazwę we wszystkich projektach Google Cloud (powyższa nazwa została już użyta i nie będzie działać). W ćwiczeniach nazywamy je później PROJECT_ID.

Aby móc używać zasobów Google Cloud, musisz najpierw włączyć płatności w Cloud Console.

Ćwiczenia z programowania nie powinny kosztować więcej niż kilka dolarów, ale mogą być większe, jeśli zdecydujesz się wykorzystać więcej zasobów lub pozostawisz to uruchomione (zobacz sekcję „Czyszczenie” na końcu tego dokumentu).

Nowi użytkownicy Google Cloud Platform mogą skorzystać z bezpłatnej wersji próbnej o wartości 300 USD.

Google Cloud Shell,

W tym ćwiczeniu wykorzystamy Google Cloud Shell – środowisko wiersza poleceń działające w chmurze.

Ta maszyna wirtualna oparta na Debianie jest wyposażona we wszystkie potrzebne narzędzia dla programistów. Oferuje trwały katalog domowy o pojemności 5 GB oraz działa w Google Cloud, co znacznie zwiększa wydajność sieci i uwierzytelnianie. Oznacza to, że do wykonania tych ćwiczeń z programowania wystarczy przeglądarka (tak, to działa na Chromebooku).

Aby aktywować Google Cloud Shell, w konsoli administracyjnej kliknij przycisk w prawym górnym rogu ekranu. Udostępnienie środowiska i połączenie się z nim powinno potrwać kilka minut:

aktywujCloudShell.png

Następnie zaakceptuj warunki korzystania z usługi i kliknij link „Rozpocznij Cloud Shell”.

x

Zrzut ekranu 2017-06-14 at 22.13.43 PM.png

Po połączeniu z Cloud Shell zobaczysz, że uwierzytelniono już projekt, a w projekcie ustawiono już PROJECT_ID:

gcloud auth list

Polecenie wyjściowe

Credentialed accounts:
 - <myaccount>@<mydomain>.com (active)
gcloud config list project

Polecenie wyjściowe

[core]
project = <PROJECT_ID>

Jeśli z jakiegoś powodu projekt nie jest skonfigurowany, uruchom to polecenie :

gcloud config set project <PROJECT_ID>

Szukasz urządzenia PROJECT_ID? Sprawdź identyfikator użyty w procesie konfiguracji lub znajdź go w panelu konsoli:

Identyfikator_projektu.png

WAŻNE: ustaw domyślną strefę i konfigurację projektu:

gcloud config set compute/zone us-central1-f

Możesz wybrać różne strefy. Więcej informacji znajdziesz w dokumentacji regionów i stref.

Sprawdź włączone interfejsy API StackDriver

Przyjrzyjmy się interfejsom API, które zostały włączone w Twoim projekcie. Korzystając z paska wyszukiwania, znajdź panel interfejsu API, jak pokazano poniżej.

Zwróć uwagę na konkretne interfejsy API, które zostały włączone w Twoim projekcie :

Każdy projekt Google Cloud Platform oferuje hosting prywatny w Git, ale najpierw musimy utworzyć domyślne repozytorium, z którym będziemy współpracować. Przejdź do źródłowych repozytoriów, korzystając z pola wyszukiwania w konsoli :

Aby utworzyć nowe repozytorium kodu o nazwie "default", kliknij:

Za pomocą Cloud Shell skopiujemy ten katalog do naszej instancji Google Cloud Shell. Aby to zrobić, utwórz najpierw katalog w instancji Google Cloud Shell i przejdź do niego w sposób przedstawiony poniżej (przykładowe dane wyjściowe):

mkdir stackdriver-demo
cd stackdriver-demo/

Teraz możesz skopiować domyślne repozytorium za pomocą polecenia gcloud, jak pokazano poniżej:

gcloud source repos clone default

Oto wyniki działania konsoli :

Cloning into '/home/gcp123_student/default'...
warning: You appear to have cloned an empty repository.
Project [qwiklabs-gcp-1234abc1234] repository [default] was cloned to [/home/gcp123_student/default].

Świetnie. Poświęćmy chwilę na przeanalizowanie skonfigurowanych pilota. To nie wszystko, co pozwoli Ci lepiej zrozumieć, co się kryje za kulisami.

Przejdź do utworzonego katalogu domyślnego i uruchom polecenie git remote -v w podany niżej sposób

cd default
git remote -v

Oto dane wyjściowe konsoli powinny wyglądać mniej więcej tak:

origin https://source.developers.google.com/p/qwiklabs-gcp-1234abc1234/r/default (fetch)
origin https://source.developers.google.com/p/qwiklabs-gcp-1234abc1234/r/default (push)

Jak widać, wskazuje to prawidłowo na repozytorium Git powiązane z naszym projektem GCP.

Pobierz aplikację Księga gości z GitHuba

Używana przez nas aplikacja to standardowa aplikacja App Engine o nazwie Księga gości, która jest dostępna w oficjalnym repozytorium GitHub Google Cloud Platform. Jest to też część oficjalnej dokumentacji ułatwiającej rozpoczęcie korzystania z usługi. Projekt na GitHubie jest dostępny na stronie https://github.com/GoogleCloudPlatform/appengine-guestbook-python

Teraz pobieramy ten kod do naszej instancji Cloud Shell. To polecenie i jego dane wyjściowe są widoczne tutaj :

git pull https://github.com/GoogleCloudPlatform/appengine-guestbook-python

Oto wyniki działania konsoli :

remote: Counting objects: 485, done.
remote: Total 485 (delta 0), reused 0 (delta 0), pack-reused 485
Receiving objects: 100% (485/485), 436.42 KiB | 163.00 KiB/s, done.
Resolving deltas: 100% (195/195), done.
From https://github.com/GoogleCloudPlatform/appengine-guestbook-python
* branch HEAD -> FETCH_HEAD

Cały kod znajduje się teraz lokalnie w instancji Google Cloud Shell. Możesz zobaczyć różne pliki pobrane z projektu na GitHubie.

Przekaż bieżący kod za pomocą Cloud Shell do repozytorium projektu w Git

Teraz przekażemy ten kod do repozytorium projektu GCP w GCP, abyśmy mogli skonfigurować punkty przerwania, punkty logowania i nie tylko. Nie jest to jednak konieczne, ponieważ możesz przeprowadzić bezpośrednią integrację z GitHubem, swoim komputerem lokalnym lub innymi sposobami połączenia kodu źródłowego.

Jednak ze względu na nasz cel kod ten zostanie przekazany do repozytorium projektu GCP. Można to zrobić za pomocą standardowego polecenia git push, jak pokazano poniżej:

git push origin master

Oto wyniki działania konsoli :

Counting objects: 485, done.
Compressing objects: 100% (280/280), done.
Writing objects: 100% (485/485), 436.42 KiB | 0 bytes/s, done.
Total 485 (delta 195), reused 485 (delta 195)
remote: Storing objects: 100% (485/485), done.
remote: Processing commits: 100% (152/152), done.
To https://source.developers.google.com/p/qwiklabs-gcp-1234abc1234/r/default
* [new branch] master -> master

Teraz wróć do sekcji GCP Cloud Console i do sekcji Programowanie. Kliknij Kod źródłowy, aby wyświetlić domyślne pliki projektu. Przykładowe dane wyjściowe są widoczne poniżej:

Wszystko gotowe do wdrożenia aplikacji Księga gości w App Engine. Aby wdrożyć aplikację, upewnij się, że jesteś w Google Cloud Shell i katalogu domyślnym. Użyj polecenia gcloud app deploy, jak pokazujemy poniżej:

gcloud app deploy --version 1

Gdy pojawi się prośba o wybranie regionu, kliknij [1] us-east1.

Oto wyniki działania konsoli :

You are about to deploy the following services:
— qwiklabs-gcp-1234abc1234/default/1 (from [/home/gcp123-student/default/app.yaml])
Deployed URL: [https://qwiklabs-gcp-1234abc1234.appspot.com]
Do you want to continue (Y/n)? Y
Beginning deployment of service [default]...
File upload done.
Updating service [default]...done.
Deployed service [default] to https://qwiklabs-gcp-1234abc1234.appspot.com]

Zwróć uwagę, że parametr wersji został podany do polecenia wdrożenia aplikacji. Podaliśmy wartość "1".

Ponieważ aplikacja Książka gościnna jest trwała, musimy zaktualizować indeksy Datastore. Indeksy określamy w pliku index.yaml. Używamy po prostu polecenia gcloud datastore create-indexes w taki sposób:

gcloud datastore create-indexes index.yaml

Oto wyniki działania konsoli :

You are about to update the following configurations:
— qwiklabs-gcp-1234abc1234/index From: [/home/gcp123_student/default/index.yaml]
Do you want to continue (Y/n)? Y

Aktualizacja indeksów Datastore może zająć trochę czasu. Aby sprawdzić stan indeksu, wyszukaj "indeksy Datastore i kliknij Indeksy. Podczas tworzenia indeksów będzie widoczny stan o wartości „Indeksowanie”, jak pokazano poniżej:

Aby sprawdzić, czy nasza aplikacja w wersji 1 została wdrożona i dostępna, otwórz Compute → App Engine i kliknij Wersje w sposób pokazany poniżej:

Wszystko powinno już od razu wyglądać dobrze. Aby zobaczyć projekt, wejdź na https://<PROJECT_ID>.appspot.com. Indeksowanie indeksów magazynu danych może potrwać kilka minut, więc jeśli w aplikacji pojawi się błąd (na przykład wewnętrzny błąd serwera), spróbuj ponownie za kilka minut.

Teraz możemy korzystać z aplikacji, logując się i tworząc kilka wpisów w książce gości w sposób podany poniżej:

Świetnie. Teraz możemy zacząć korzystać z funkcji Stackdriver.

Najpierw zobaczmy, jak można robić zrzuty uruchomionej aplikacji. Zrzuty są przydatne, gdy chcesz debugować konkretny fragment kodu, sprawdzać zmienne itp. Wszystko to ma miejsce jeszcze w trakcie udostępniania aplikacji. Jest to bardzo przydatne, gdy otrzymujesz raporty o problemach z aplikacją i chcesz przeprowadzić debugowanie, aby sprawdzić, co się dzieje z aplikacją, sprawdzić wiele zmiennych i warunkowo zrobić zdjęcie zrzutu ekranu.

Zróbmy to teraz w aplikacji Księga gości. Poprosimy Cię o zrzut ekranu, jeśli ktoś poprosi o stronę główną, a dokładnie o tę, o której będzie pobierać listę powitań, które są obecnie w Datastore.

Kod znajdziesz w pliku guestbook.py. Przede wszystkim analizujemy kod w czasie działania, gdy pobrano z bazy danych listę powitań. Odbywa się to w wierszu nr 72. Możemy więc umieścić punkt przerwania w wierszu 74, aby mieć pewność, że kod #72 zostałby wykonany.

Aby to zrobić, kliknij „"Debug"” w widoku wersji App Engine lub wybierz Stackdriver → Debuguj . Spowoduje to wyświetlenie ekranu widocznego poniżej. Musisz wybrać plik (guestbook.py) po lewej stronie i kliknąć widoczny numer wiersza.

Spowoduje to wyświetlenie komunikatu zaznaczonego na czerwono w polu powyżej i poczekanie na uruchomienie zrzutu. Teraz wystarczy wejść na stronę

https://<PROJECT_ID>.appspot.com.

Gdy to zrobisz, zrzut zostanie aktywowany i zobaczysz sekcje Zmienne i Stos wywołań, jak pokazano poniżej. Sprawdź, jak są wyświetlane zmienne, i rozwiń je, aby sprawdzić ich wartości. Jest to bardzo przydatne.

Jeśli na przykład rozwiniesz zmienną powitania, zobaczysz, że zawiera ona rekordy odpowiadające liczbie utworzonych wpisów w księdze gości.

Bardzo przydatną funkcją jest możliwość ponownego wykonania zrzutu. W każdej chwili możesz kliknąć ikonę aparatu, by ponownie zaczekać na wykonanie zrzutu, jak widać poniżej:

Aby śledzić określone zmienne, użyj pola Wyrażenia poniżej. Na przykład wiemy, że mamy zmienną powitania i chcemy sprawdzić jej wartość w momencie wyświetlenia zrzutu. Możemy umieścić zmienną powitalną tak jak na poniższym zrzucie ekranu. Po kliknięciu zrzutu zostaną one zapełnione w postaci wyświetlanej wartości.

Jeśli chcesz, aby zrzut był aktywowany tylko w określonym warunku, możesz skorzystać z pola Stan, jak pokazano poniżej. Należy stwierdzić, że zrzut powinien być wykonany tylko wtedy, gdy liczba powitań jest większa niż 1. Możesz z nimi poeksperymentować.

Bardzo ważne jest, aby wydajność aplikacji internetowej odpowiadała określonym przez Ciebie wymaganiom. Stackdriver Trace to kluczowe narzędzie, które pomaga zrozumieć czas oczekiwania w aplikacjach.

Domyślnie jest ona włączona we wszystkich aplikacjach App Engine i zapewnia nam bardzo przydatne szczegółowe informacje o wydajności wszystkich punktów końcowych oraz zestawienie poszczególnych wywołań.

W Twoim przypadku trafiliśmy na stronę główną ("/") i wyświetlamy / dodajemy wpisy w księdze gości. To wystarczy, aby narzędzie Trace mogło nam przekazać więcej informacji o czasie oczekiwania. Przejdź do Przeglądu logów usługi Stackdriver Traces, a zobaczysz zrzut ekranu, który pokazano poniżej. Zwróć uwagę na ostatnie logi czasu i ich opóźnienia.

Jeśli klikniesz dowolny log czasu, czyli link URI, wyświetli on szczegółowy log:

Zwróć uwagę na to, jak udaje nam się dzielić czas oczekiwania oraz które połączenia zajmują najwięcej czasu. Z powyższej wizualizacji dowiesz się, że zapytanie magazynu danych zajmuje dużo czasu. Jedną z rzeczy, które warto rozważyć, jest zapisywanie danych w pamięci podręcznej, by ograniczyć wąskie gardło. Wszystko to zależy od aplikacji, co bardzo ułatwia ustalenie, które obszary na potrzeby śledzenia połączeń wymagają refaktoryzacji.

Logi aplikacji możesz wyświetlić w każdej chwili, przechodząc do usługi Stackdriver Logging (jak pokazano poniżej). Dostępnych jest kilka filtrów, począwszy od różnych usług GCP → Typy logów → Poziom rejestrowania → Data i nie tylko.

Poniższy zrzut ekranu przedstawia logi naszej aplikacji App Engine i domyślną wersję 1.

logowanie.png

Na koniec przyjrzyjmy się funkcji, która powinna zainteresować Cię możliwościami. Zazwyczaj jako deweloper dokładamy wszelkich starań, aby umieszczać w kodzie dzienniki, wdrażamy nasz kod i mamy nadzieję, że wszystko znajdzie się w dzienniku.

Wiemy jednak, że to nie wszystko i tylko podczas debugowania wiemy, że warto tu umieścić więcej instrukcji logu. Następnie należy zmodyfikować kod, umieścić w innej instrukcji logowania, ponownie go wdrożyć i monitorować.

To nie problem, ale co możesz zrobić, jeśli możesz dodać te instrukcje logu (nazwijmy je teraz punktami logowania) do uruchomionej aplikacji. Oznacza to, że nie musimy zatrzymywać procesu zmiany, zmieniać kodu ani ponownie wdrażać aplikacji. Zamiast tego możemy zarządzać listą punktów logowania spoza naszej aplikacji, korzystając z obsługi punktów logowania.

Korzystając z Cloud Shell, sprawdźmy bieżącą listę punktów logowania, które zostały skonfigurowane (oczywiście powinny to być 0). Aby to zrobić, użyj polecenia gcloud, jak pokazano poniżej:

gcloud debug logpoints list

Oto wyniki działania konsoli :

Debug target not specified. Using default target: default-1
Listed 0 items.

Teraz dodamy punkt logowania do uruchomionej aplikacji. Aby dodać punkt logowania, wykonaj te czynności:

  • Znajdź plik z kodem źródłowym i numer wiersza, w którym chcesz dodać punkt logowania.
  • Zidentyfikuj komunikat logu. Ten komunikat logu może być zakodowany na stałe, a nawet musi być wyrażeniem.

W tym przypadku chcemy dodać punkt logowania do pliku guestbook.py w wierszu nr 74 przy użyciu polecenia tworzenia punktów logowania, jak pokazano poniżej:

gcloud debug logpoints create guestbook.py:74 "Fetched greetings from Datastore. Count of greetings : {len(greetings)}"

Oto wyniki działania konsoli :

Debug target not specified. Using default target: default-1
— id: 53538243519d4-f9a0-bdbce
location: guestbook.py:74
logLevel: INFO
logMessageFormat: Fetched greetings from Datastore. Count of greetings : {len(greetings)}
condition: None
status: ACTIVE

Podajemy powyżej filename:linenumber i komunikat logu. Pamiętaj, że nasza wiadomość dziennika zawiera wyrażenie, które spowoduje wydrukowanie powitań, które pobraliśmy z bazy danych.

Polecenie wyświetli komunikat o dodaniu punktu logowania. Poniżej znajdziesz zrzut ekranu z Cloud Shell:

Teraz po uruchomieniu polecenia listy punktów logowania zobaczysz te dane wyjściowe:

gcloud debug logpoints list

Oto wyniki działania konsoli :

Debug target not specified. Using default target: default-1
STATUS LOCATION CONDITION LOG_LEVEL LOG_MESSAGE_FORMAT ID
ACTIVE
guestbook.py:74 INFO Fetched greetings from Datastore. Count of greetings : {len(greetings)} 53538243519d4-f9a0-bdbce

Aby sprawdzić, jak to działa, ponownie możemy kliknąć stronę główną pod adresem https://<PROJECT_ID>.appspot.com. Spowoduje to wywołanie kodu, a z kolei nasz punkt logowania. Pamiętaj, że zostanie on domyślnie zapisany w naszych dziennikach aplikacji. Musimy jeszcze raz odwiedzić usługę Stackdriver Logging, jak pokazano poniżej:

Kliknij wybraną prośbę i Gotowe! W szczegółach zobaczysz nasz punkt logowania oraz wyświetlany komunikat logu.

Mamy nadzieję, że nasz samouczek Ci się podobał. Omawiamy w nim tylko niektóre funkcje oferowane przez platformę Stackdriver. To jeszcze nie wszystko. Więcej samouczków dotyczących Google Cloud Platform znajdziesz na blogu Romina Iraniego i pierwszego z nich na blogu https://rominirani.com/.

Możesz też sprawdzić inne ćwiczenia z programowania o nazwie "Używanie Stackdriver Monitoring i logowania w celu lepszego wglądu w stan aplikacji.

Jeśli chcesz przesłać opinię lub zgłosić problemy z ćwiczeniami z programowania, użyj linku „Znajdź błąd” w lewym dolnym rogu strony.