Korzystanie z usług Google Stackdriver Debug, Trace, Logging i Logpoints

Ten samouczek przedstawia Google Stackdriver, które umożliwia wykonywanie tych czynności w przypadku aplikacji Google Cloud Platform:

  • Rób migawki debugowania w aplikacjach działających w App Engine, Compute Engine i Container Engine.
  • Wyświetl logi aplikacji.
  • Skonfiguruj wskaźniki, monitoruj je i otrzymuj alerty.
  • Śledź wywołania interfejsu API i uzyskuj szczegółowe informacje o czasach odpowiedzi oraz potencjalnych wąskich gardłach w kodzie.
  • Dodawanie punktów logowania do działającej aplikacji bez konieczności wdrażania aplikacji. Jest to naprawdę wyjątkowa (i mamy nadzieję przydatna) funkcja.

W tym samouczku wykonamy od podstaw te czynności:

  1. Tworzenie projektu Google Cloud Platform (w szczególności App Engine)
  2. Konfigurowanie repozytorium źródłowego projektu Google Cloud Platform
  3. korzystać ze standardowego źródła aplikacji w Pythonie Guestbook dostępnego w GitHubie;
  4. Wdrażanie kodu
  5. Dowiedz się, jak uzyskać zrzuty debugowania działającej aplikacji
  6. Sprawdzanie logów i logów czasu z aplikacji
  7. Dodaj punkty logowania do aktualnie działającej aplikacji. Ta funkcja została opisana w tym poście na blogu : Dodawanie logów aplikacji do aplikacji bez ponownego uruchamiania

Możemy zaczynać.

Te treści zostały pierwotnie utworzone przez Romina Iraniego i opublikowane tutaj.

Samodzielne konfigurowanie środowiska

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:

Screenshot from 2016-02-10 12:45:26.png

Zapamiętaj identyfikator projektu, czyli unikalną nazwę we wszystkich projektach Google Cloud (podana powyżej nazwa jest już zajęta i nie będzie działać w Twoim przypadku). W dalszej części tego laboratorium będzie on nazywany PROJECT_ID.

Następnie musisz włączyć płatności w konsoli Cloud, aby móc korzystać z zasobów Google Cloud.

Wykonanie tego samouczka nie powinno kosztować więcej niż kilka dolarów, ale może okazać się droższe, jeśli zdecydujesz się wykorzystać więcej zasobów lub pozostawisz je uruchomione (patrz sekcja „Czyszczenie” na końcu tego dokumentu).

Nowi użytkownicy Google Cloud Platform mogą skorzystać z bezpłatnego okresu próbnego, w którym mają do dyspozycji środki w wysokości 300 USD.

Google Cloud Shell

W tym module praktycznym będziemy używać Google Cloud Shell, czyli środowiska wiersza poleceń działającego w chmurze.

Ta maszyna wirtualna oparta na Debianie zawiera wszystkie potrzebne narzędzia dla programistów. Zawiera stały katalog domowy o pojemności 5 GB i działa w Google Cloud, co znacznie zwiększa wydajność sieci i uwierzytelniania. Oznacza to, że do ukończenia tego ćwiczenia potrzebujesz tylko przeglądarki (tak, działa ona na Chromebooku).

Aby aktywować Google Cloud Shell, w konsoli dewelopera kliknij przycisk w prawym górnym rogu (przygotowanie środowiska i połączenie z nim zajmie tylko kilka sekund):

activateCloudShell.png

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

x.png

Screen Shot 2017-06-14 at 10.13.43 PM.png

Po połączeniu z Cloud Shell zobaczysz, że jesteś już uwierzytelniony, a projekt jest już ustawiony na PROJECT_ID :

gcloud auth list

Wynik polecenia

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

Wynik polecenia

[core]
project = <PROJECT_ID>

Jeśli z jakiegoś powodu projekt nie jest ustawiony, po prostu wydaj to polecenie :

gcloud config set project <PROJECT_ID>

Szukasz urządzenia PROJECT_ID? Sprawdź, jakiego identyfikatora użyto w krokach konfiguracji, lub wyszukaj go w panelu konsoli:

Project_ID.png

WAŻNE: na koniec 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 (w języku angielskim).

Sprawdź włączone interfejsy StackDriver API

Przyjrzyjmy się interfejsom API, które zostały włączone w Twoim projekcie. Użyj paska wyszukiwania, aby znaleźć panel interfejsu API, jak pokazano poniżej.

Sprawdź, które interfejsy API zostały włączone w Twoim projekcie :

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

Kliknij „UTWÓRZ REPOZYTORIUM”, aby utworzyć nowe repozytorium kodu o nazwie „default”:

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

mkdir stackdriver-demo
cd stackdriver-demo/

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

gcloud source repos clone default

Oto dane wyjściowe, które powinny się wyświetlić w 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! Przyjrzyjmy się dokładniej skonfigurowanym zdalnym repozytoriom Git. Nie jest to konieczne, ale pomoże Ci lepiej zrozumieć, co się stało.

Przejdź do utworzonego domyślnego katalogu i uruchom polecenie git remote -v, jak pokazano poniżej.

cd default
git remote -v

W konsoli powinny pojawić się dane wyjściowe podobne do tych:

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)

Widzisz, że wskazuje on prawidłowo repozytorium Git powiązane z naszym projektem GCP.

Pobieranie aplikacji księgi gości z GitHuba

Aplikacja, której będziemy używać, to standardowa aplikacja App Engine o nazwie Guestbook, która jest dostępna w oficjalnym repozytorium Google Cloud Platform w GitHubie. Ta aplikacja jest też częścią oficjalnej dokumentacji dla początkujących. Projekt w GitHubie jest dostępny pod adresem : https://github.com/GoogleCloudPlatform/appengine-guestbook-python

Teraz pobierzemy ten kod do instancji Cloud Shell. Polecenie i jego dane wyjściowe są widoczne tutaj :

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

Oto dane wyjściowe, które powinny się wyświetlić w 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. Zobaczysz różne pliki pobrane z projektu w GitHubie.

Wypychanie bieżącego kodu za pomocą Cloud Shell do repozytorium Git projektu

Teraz umieśćmy ten kod w repozytorium Git projektu GCP, abyśmy mogli ustawiać punkty przerwania, punkty logowania i inne elementy w naszym kodzie. Pamiętaj, że nie jest to krok obowiązkowy, ponieważ możesz zintegrować się bezpośrednio z GitHubem, komputerem lokalnym i innymi sposobami łączenia kodu źródłowego.

Na potrzeby tego przykładu wypchniemy jednak ten kod do repozytorium Git projektu GCP. Możesz to zrobić za pomocą standardowego polecenia git push, jak pokazano poniżej:

git push origin master

Oto dane wyjściowe, które powinny się wyświetlić w 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 konsoli Google Cloud Platform, a konkretnie do sekcji Development (Programowanie). Kliknij Kod źródłowy. W przypadku domyślnego repozytorium powinny być widoczne wszystkie pliki projektu. Przykładowe dane wyjściowe są widoczne poniżej:

Wszystko jest już gotowe do wdrożenia aplikacji księgi gości App Engine. Aby wdrożyć aplikację, upewnij się, że jesteś w Google Cloud Shell i w domyślnym katalogu, tak jak przez cały czas. Użyj polecenia gcloud app deploy w sposób pokazany poniżej:

gcloud app deploy --version 1

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

Oto dane wyjściowe, które powinny się wyświetlić w 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 do polecenia wdrażania aplikacji dodaliśmy parametr wersji. Nadaliśmy mu wartość "1".

Aplikacja Guestbook korzysta z Google Cloud Datastore do przechowywania danych, więc musimy zaktualizować indeksy Datastore. Indeksy są określone w pliku index.yaml. Używamy po prostu polecenia gcloud datastore create-indexes, jak pokazano poniżej:

gcloud datastore create-indexes index.yaml

Oto dane wyjściowe, które powinny się wyświetlić w 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 potrwać. Aby sprawdzić stan, wyszukaj „Indeksy Datastore” i kliknij Indeksy. Podczas tworzenia indeksów zobaczysz stan o wartości „Indeksowanie”, jak pokazano poniżej:

Aby sprawdzić, czy aplikacja w wersji 1 jest wdrożona i dostępna, otwórz Compute → App Engine, a potem kliknij Wersje, jak pokazano poniżej:

Wszystko powinno teraz wyglądać dobrze. Możesz sprawdzić projekt, przechodząc na stronę https://<PROJECT_ID>.appspot.com. Ponownie: zanim indeksy bazy danych będą gotowe, może minąć kilka minut. Jeśli aplikacja wyświetli błąd (np. wewnętrzny błąd serwera), spróbuj ponownie za kilka minut.

Zalogujmy się teraz w aplikacji i utwórzmy kilka wpisów w księdze gości, jak pokazano poniżej:

Świetnie! Możemy teraz przejść do funkcji Stackdriver.

Najpierw przyjrzyjmy się, jak możemy robić zrzuty działającej aplikacji. Migawki są przydatne, jeśli chcesz debugować konkretny fragment kodu, sprawdzać zmienne i wykonywać inne czynności. Wszystko to dzieje się, gdy aplikacja jest nadal aktywna. Jest to bardzo przydatne, jeśli otrzymujesz zgłoszenia problemów z aplikacją i chcesz spróbować debugować ją, aby sprawdzić, co się w niej dzieje, przejrzeć wiele zmiennych, warunkowo wykonać zrzut i nie tylko.

Zróbmy to teraz w przypadku aplikacji Księga gości. Jeśli ktoś poprosi o stronę główną, poprosimy o zrzut. Chcemy, aby zawierał listę powitań, które są obecnie w Datastore.

Kod jest dostępny w pliku guestbook.py. Chcemy zacząć sprawdzać kod w czasie działania, gdy pobierze on listę powitań z pamięci danych. Odbywa się to w wierszu 72. Możemy więc po prostu umieścić punkt przerwania w wierszu 74, aby mieć pewność, że wiersz 72 został wykonany.

Aby to zrobić, kliknij „Debuguj” w widoku wersji App Engine lub otwórz Stackdriver → Debug . Wyświetli się ekran pokazany poniżej. Wybierz plik (guestbook.py) po lewej stronie, a następnie kliknij numer wiersza, jak pokazano na ilustracji.

Pojawi się komunikat wyróżniony w czerwonej ramce powyżej, że oczekuje na wywołanie migawki. Teraz wystarczy, że wejdziemy na naszą stronę pod adresem

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

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

Jeśli na przykład rozwiniesz zmienną pozdrowień, zobaczysz, że zawiera ona rekordy odpowiadające liczbie wpisów w księdze gości, które zostały utworzone.

Bardzo przydatną funkcją jest możliwość ponownego wykonania migawki w dowolnym momencie. Wystarczy w dowolnym momencie kliknąć ikonę aparatu, a ponownie pojawi się oczekiwanie na zrobienie zdjęcia, jak pokazano poniżej:

Aby śledzić określone zmienne, możesz użyć pola Wyrażenia, jak pokazano poniżej. Na przykład wiemy, że mamy zmienną greetings i chcemy sprawdzić jej wartość w momencie wykonania zrzutu. Możemy wstawić zmienną powitania, jak pokazano na zrzucie ekranu poniżej. Gdy zostanie osiągnięty punkt kontrolny, zostaną w nim umieszczone wartości widoczne na ilustracji.

Jeśli chcesz, aby migawka była aktywowana tylko pod pewnym warunkiem, możesz użyć pola Warunek, jak pokazano poniżej. Oznacza to, że migawka powinna zostać utworzona tylko wtedy, gdy liczba powitań jest większa niż 1. Jeśli chcesz, możesz to wypróbować.

Bardzo ważne jest, aby wydajność aplikacji internetowej spełniała ustalone przez Ciebie wymagania. Stackdriver Trace to kluczowe narzędzie, które pomaga zrozumieć opóźnienia w działaniu aplikacji.

Jest on domyślnie włączony w przypadku wszystkich aplikacji App Engine i zapewnia nam bardzo przydatne informacje o skuteczności wszystkich naszych punktów końcowych wraz z podziałem na różne wywołania.

W naszym przypadku odwiedzaliśmy stronę główną („/”) oraz wyświetlaliśmy i dodawaliśmy wpisy do księgi gości. Wystarczy to, aby ślad zawierał więcej informacji o czasie oczekiwania. Wystarczy przejść do sekcji Stackdriver Traces – przegląd, aby zobaczyć zrzut ekranu podobny do tego poniżej. Zwróć uwagę na ostatnie ślady i ich opóźnienia.

Jeśli klikniemy dowolny ślad, czyli link URI, wyświetli się szczegółowy ślad, jak pokazano poniżej:

Zwróć uwagę, jak dzieli on czas oczekiwania i które wywołania zajmują najwięcej czasu. Z powyższej wizualizacji widać, że zapytanie do bazy danych zajmuje dużo czasu. Jedną z opcji, którą warto rozważyć, jest buforowanie danych, aby zmniejszyć to wąskie gardło. Wszystko zależy od aplikacji. Te informacje mogą być bardzo przydatne do określenia, które obszary śledzenia wywołań mogą wymagać refaktoryzacji.

Logi aplikacji możesz wyświetlić w dowolnym momencie, otwierając Stackdriver Logging (jak pokazano poniżej). Dostępnych jest wiele filtrów, które można stosować w różnych usługach GCP → typach dzienników → poziomach dzienników → datach i innych.

Zrzut ekranu poniżej przedstawia dzienniki naszej aplikacji App Engine i domyślną wersję 1.

logging.png

Na koniec przyjrzyjmy się funkcji, która powinna Cię zainteresować ze względu na możliwości, jakie oferuje. Zwykle jako programiści staramy się umieszczać w kodzie instrukcje logowania, wdrażać kod, a potem liczyć na to, że dziennik zawiera wszystkie potrzebne informacje.

Wiemy jednak, że to nie wystarczy i dopiero podczas debugowania zdajemy sobie sprawę, że być może powinniśmy dodać tu i tam kilka instrukcji logowania. Zwykle modyfikujesz kod, dodajesz dodatkowe instrukcje logowania, ponownie wdrażasz i monitorujesz.

To jest w porządku, ale co by było, gdyby można było dodać te instrukcje logowania (nazwijmy je teraz punktami logowania) do działającej aplikacji? Oznacza to, że nie musimy zatrzymywać aplikacji, zmieniać kodu i wdrażać go ponownie. Zamiast tego możemy zarządzać listą punktów logowania spoza aplikacji, korzystając z obsługi punktów logowania.

W środowisku Cloud Shell sprawdźmy bieżącą listę skonfigurowanych punktów logowania (która powinna być pusta). Możesz to zrobić za pomocą polecenia gcloud, jak pokazano poniżej:

gcloud debug logpoints list

Oto dane wyjściowe, które powinny się wyświetlić w konsoli :

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

Teraz dodamy punkt logowania do działającej aplikacji. Aby dodać punkt rejestrowania, musimy wykonać te czynności:

  • Określ plik kodu źródłowego i numer wiersza, w którym chcesz dodać punkt logowania.
  • Określ komunikat logu. Ten komunikat dziennika może być zakodowany na stałe lub może być wyrażeniem.

W naszym przypadku dodamy punkt logowania do pliku guestbook.py w wierszu 74 za pomocą polecenia logpoints create, jak pokazano poniżej:

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

Oto dane wyjściowe, które powinny się wyświetlić w 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

Podaliśmy filename:linenumber i powyższy komunikat z dziennika. Zwróć uwagę, że nasz komunikat dziennika zawiera też wyrażenie, które wyświetli liczbę powitań pobranych z pamięci danych.

Polecenie zwraca komunikat o dodaniu punktu logowania. Poniżej znajduje się zrzut ekranu z Cloud Shell:

Jeśli teraz uruchomisz polecenie listy punktów logowania, zobaczysz te dane wyjściowe:

gcloud debug logpoints list

Oto dane wyjściowe, które powinny się wyświetlić w 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 zobaczyć to w praktyce, ponownie otwórz stronę główną pod adresem https://<PROJECT_ID>.appspot.com. Spowoduje to wywołanie kodu, a w konsekwencji naszego punktu rejestrowania. Pamiętaj, że domyślnie zostanie to zarejestrowane w naszych dziennikach aplikacji. Wystarczy, że jeszcze raz otworzymy Stackdriver Logging, jak pokazano poniżej:

Kliknij konkretną prośbę i gotowe. W szczegółach zobaczysz, że punkt rejestrowania został uruchomiony i wyświetlony został komunikat dziennika.

Mamy nadzieję, że ten samouczek był dla Ciebie przydatny. Omawia tylko niektóre funkcje platformy Stackdriver. Jest jeszcze wiele do odkrycia. Więcej samouczków dotyczących Google Cloud Platform znajdziesz na blogu Romina Iraniego (autora tego modułu) pod adresem https://rominirani.com/.

Możesz też zapoznać się z innym samouczkiem o nazwie „Using Stackdriver's monitoring and logging to get better visibility into your application's health” (Używanie monitorowania i rejestrowania w Stackdriver, aby lepiej poznać stan aplikacji).

Jeśli masz jakieś uwagi lub chcesz zgłosić problemy z tym kursem, kliknij link „Please find a bug” (Znajdź błąd) w lewym dolnym rogu tej strony.