Korzystanie z usług Stackdriver Logging i Stackdriver Trace dla Cloud Functions

1. Wprowadzenie

Z tego przewodnika dowiesz się, jak korzystać z narzędzi do logowania i monitorowania dostępnych dla wszystkich deweloperów pracujących z Cloud Functions. Narzędzia są dostępne w każdej funkcji Cloud Functions wdrażanej we wszystkich obsługiwanych językach i powinny zwiększać produktywność podczas pisania i obsługi kodu bezserwerowego.

5815064fec87444b.png

Użyjesz funkcji Cloud Functions aktywowanej przez HTTP, ale wszystko, czego się dowiesz, będzie dotyczyć również innych języków i funkcji Cloud Functions aktywowanych przez inne zdarzenia.

2. Konfiguracja i wymagania

Samodzielne konfigurowanie środowiska

  1. Zaloguj się w konsoli Google Cloud i utwórz nowy projekt lub użyj istniejącego. (Jeśli nie masz jeszcze konta Gmail lub G Suite, musisz je utworzyć).

dMbN6g9RawQj_VXCSYpdYncY-DbaRzr2GbnwoV7jFf1u3avxJtmGPmKpMYgiaMH-qu80a_NJ9p2IIXFppYk8x3wyymZXavjglNLJJhuXieCem56H30hwXtd8PvXGpXJO9gEUDu3cZw

ci9Oe6PgnbNuSYlMyvbXF1JdQyiHoEgnhl4PlV_MFagm2ppzhueRkqX4eLjJllZco_2zCp0V0bpTupUSKji9KkQyWqj11pqit1K1faS1V6aFxLGQdkuzGp4rsQTan7F01iePL5DtqQ

8-tA_Lheyo8SscAVKrGii2coplQp2_D1Iosb2ViABY0UUO1A8cimXUu6Wf1R9zJIRExL5OB2j946aIiFtyKTzxDcNnuznmR45vZ2HMoK3o67jxuoUJCAnqvEX6NgPGFjCVNgASc-lg

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.

  1. Następnie musisz włączyć rozliczenia w konsoli Cloud, aby korzystać z zasobów Google Cloud.

Ukończenie tego laboratorium nie powinno wiązać się z dużymi kosztami, a nawet z żadnymi. Wykonaj instrukcje z sekcji „Czyszczenie”, w której znajdziesz informacje o tym, jak wyłączyć zasoby, aby uniknąć naliczenia opłat po zakończeniu tego samouczka. Nowi użytkownicy Google Cloud mogą skorzystać z programu bezpłatnego okresu próbnego, w którym mają do dyspozycji środki w wysokości 300 USD.

Cloud Shell

Z Cloud Functions oraz jej funkcjami rejestrowania i monitorowania możesz korzystać zdalnie na laptopie, ale w tym module użyjesz Cloud Shell, czyli środowiska wiersza poleceń działającego w Google Cloud.

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

  1. Aby aktywować Cloud Shell w konsoli Cloud, kliknij Aktywuj Cloud Shell fEbHefbRynwXpq1vj2wJw6Dr17O0np8l-WOekxAZYlZQIORsWQE_xJl-cNhogjATLn-YxLVz8CgLvIW1Ncc0yXKJsfzJGMYgUeLsVB7zSwz7p6ItNgx4tXqQjag7BfWPcZN5kP-X3Q (udostępnienie środowiska i połączenie się z nim powinno zająć tylko kilka chwil).

I5aEsuNurCxHoDFjZRZrKBdarPPKPoKuExYpdagmdaOLKe7eig3DAKJitIKyuOpuwmrMAyZhp5AXpmD_k66cBuc1aUnWlJeSfo_aTKPY9aNMurhfegg1CYaE11jdpSTYNNIYARe01A

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

Po połączeniu z Cloud Shell zobaczysz, że uwierzytelnianie zostało już przeprowadzone, a projekt jest już ustawiony na Twój identyfikator projektu 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 Cloud:

R7chO4PKQfLC3bvFBNZJALLTUiCgyLEq_67ECX7ohs_0ZnSjC7GxDNxWrJJUaoM53LnqABYamrBJhCuXF-J9XBzuUgaz7VvaxNrkP2TAn93Drxccyj2-5zz4AxL-G3hzxZ4PsM5HHQ

Cloud Shell domyślnie ustawia też niektóre zmienne środowiskowe, które mogą być przydatne podczas wykonywania kolejnych poleceń.

echo $GOOGLE_CLOUD_PROJECT

Wynik polecenia

<PROJECT_ID>
  1. 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 artykule Regiony i strefy.

3. Wdrażanie prostej funkcji w Cloud Functions

Aby mieć coś do monitorowania, utwórz funkcję „Hello, World” w Cloud Functions. W menu po lewej stronie konsoli Google Cloud kliknij Cloud Functions, a następnie Utwórz funkcję.

3c13aa20af602aa7.png

Wpisz „hello-monitor” jako nazwę nowej funkcji w Cloud Functions.

fa6816c96d6d5b94.png

Zachowaj wszystkie domyślne ustawienia kodu źródłowego. (Jeśli chcesz, możesz wybrać inny język lub środowisko wykonawcze).

7aadf164450484e.png

Na koniec kliknij Utwórz.

dc74cd21000d6c91.png

Powinna być widoczna funkcja w Cloud Functions z zielonym znacznikiem wyboru obok niej, co oznacza, że jest gotowa do wywołania.

5363a34eb001d5ed.png

4. Testowanie funkcji w Cloud Functions i wysyłanie ruchu za pomocą generatora obciążenia

Gdy funkcja w Cloud Functions zostanie wdrożona, przetestuj ją w wierszu poleceń.

Najpierw w Cloud Shell wpisz to polecenie:

$ gcloud functions describe hello-monitor

Powinien on zwrócić opis funkcji w Cloud Functions, w tym adres URL httpsTrigger, który jest punktem końcowym HTTP(S) do wywoływania funkcji w Cloud Functions. Powinien on wyglądać tak: https://<region>-<project-id>.cloudfunctions.net/hello-monitor.

Wywoływanie funkcji Cloud Functions powinno być teraz tak proste, jak użycie polecenia curl w przypadku tego adresu URL.

$ curl https://<region>-<project-id>.cloudfunctions.net/hello-monitor
Hello World!

Teraz użyj Vegety, prostego narzędzia do testowania obciążenia HTTP. Aby go zainstalować, wpisz w Cloud Shell to polecenie :

$ go get -u github.com/tsenart/vegeta

Aby wysłać część ruchu do funkcji w Cloud Functions (5 żądań na sekundę przez kilka minut), użyj tego polecenia:

$ echo "GET https://<region>-<project-id>.cloudfunctions.net/hello-monitor" \
   | vegeta attack -rate=5 -duration=120s \
   > results.bin

5. Poruszanie się po logach

W widoku szczegółów funkcji Cloud Function kliknij Wyświetl logi.

b24157fd3376e6a8.png

Powinno to spowodować przejście do sekcji Stackdriver Logging w projekcie, w której będą widoczne tylko logi funkcji w Cloud Functions.

5a36fa75d2fb0165.png

Wszystkie żądania do funkcji w Cloud Functions powinny zwracać kod stanu 200.

Podczas przeglądania logów możesz wykonać te czynności:

  • Filtruj według poziomu logu (w Twoim przypadku wszystkie logi są na poziomie debug).
  • Wybierz konkretny okres (względny lub bezwzględny).
  • Włącz przesyłanie strumieniowe logów (u góry ekranu kliknij Odtwórz 751a4600016f34a7.png).
  • Skopiuj link do wpisu logu (aby udostępnić go członkom zespołu).
  • Wyświetl wpis logu w kontekście zasobu.
  • Przypnij wpis logu (jako wskazówkę wizualną).
  • Eksportuj logi do BigQuery, Cloud Storage lub Pub/Sub (albo po prostu pobierz je jako pliki JSON lub CSV).

6. Aktualizowanie funkcji

W konsoli Cloud otwórz widok Szczegóły funkcji i zwróć uwagę na wzrost, który spowodował tester obciążenia, w liczbie wywołań na sekundę i czasie ich wykonania.

aaee3159bbe395d3.png 7ed347101da5eca0.png

Innym, bardziej szczegółowym narzędziem do obserwowania opóźnień i wywołań RPC jest Stackdriver Trace, ale zanim zaczniesz go używać, musisz wprowadzić kilka zmian w Cloud Functions. Wykonaj te czynności:

  1. Dodaj pakiet ratujący życie node-emoji jako zależność.
  2. Zaktualizuj kod funkcji, aby używać modułu node-emoji i wprowadzić pewne opóźnienie.
  3. Dodaj zmienną środowiskową, aby włączyć Stackdriver Trace dla Cloud Functions.

W sekcji Szczegóły funkcji kliknij Edytuj, aby zmodyfikować funkcję.

39b0f8f98b18a6c0.png

Edytuj plik package.json, aby dodać zależność dla pakietu node-emoji.

{
  "name": "sample-http",
  "version": "0.0.1",
  "dependencies": {
    "node-emoji": "^1.8.1"
  }
}

Edytuj funkcję, zmieniając zawartość pliku index.js na taką:

const emoji = require('node-emoji');

exports.helloWorld = (req, res) => {
  let message = req.query.message || req.body.message || 'Hello World!';

  // add some latency, functions are too quick!
  setTimeout(function() {
     message += emoji.random().emoji;  
     res.status(200).send(message);
  }, (3 * 100));  // 300ms
  
};

Spowoduje to dodanie losowego emotikona do wiadomości zwracanej przez funkcję w Cloud Functions po wstrzymaniu na 300 milisekund.

Na koniec dodaj zmienną środowiskową Cloud Functions o nazwie GOOGLE_CLOUD_TRACE_ENABLED i ustaw jej wartość na true w ten sposób:

9205bd277b76aa21.png

Kliknij Zapisz.

Wróć do Cloud Shell i przypomnij sobie polecenie, które generuje obciążenie nowo wdrożonej funkcji Cloud Functions:

$ echo "GET https://<region>-<project-id>.cloudfunctions.net/hello-monitor" \
   | vegeta attack -rate=5 -duration=120s \
   > results.bin

Teraz możesz obserwować listę śladów bez konieczności konfigurowania dodatkowych ustawień i bez używania w kodzie konkretnej biblioteki śledzenia.

7. Śledzenie zaktualizowanej funkcji w Cloud Functions

W menu po lewej stronie otwórz Listę logów czasu (w sekcji Stackdriver Trace).

576373f38cad6f8.png

Powinien pojawić się ekran podobny do tego:

44a36b758b49f88f.png

Powinno to wyraźnie pokazać, że opóźnienie wprowadzone w funkcji w Cloud Functions wynosi 300 milisekund.

Każda kropka na wykresie to żądanie, dla którego możesz wyświetlić szczegółowe informacje, takie jak sygnatura czasowa, metoda i stan HTTP, etykiety, link do odpowiedniego wpisu logu oraz wszelkie kolejne wywołania RPC, które wykonuje funkcja w Cloud Functions.

5815064fec87444b.png

Aby powiększyć wykres, kliknij go i przeciągnij. Wybieranie niestandardowego zakresu czasowego na wykresie śledzenia

Aby pomniejszyć widok, u góry strony kliknij Cofnij powiększenie.

Ponieważ wdrożono jedną funkcję w Cloud Functions, na wykresie widać tylko GET żądania w hello-monitor identyfikatorze URI, ale możesz filtrować ślady według metody HTTP (GET, POST, DELETE), stanu HTTP (2XX, 3XX) lub za pomocą filtra żądań.

W menu po lewej stronie kliknij Przegląd:

e920cfca2a50899e.png

Na tej stronie przeglądu możesz znaleźć ostatnie ślady i inne statystyki.

ef5a45647967d275.png

Możesz też tworzyć raporty niestandardowe na podstawie kombinacji filtra żądań URI, metody HTTP, stanu HTTP i zakresu czasu. Umożliwia nawet porównanie wygenerowanych wartości z wartościami odniesienia w określonym czasie.

5bd34e9d13b47fb6.png

Jeśli uda Ci się skonfigurować prawidłowe zakresy czasu z wystarczającą liczbą punktów danych, możesz wygenerować raport pokazujący istotną zmianę opóźnienia między początkową funkcją w Cloud Functions a nową.

2cc0e9a3212b91bb.png

2e7b1ebf2f0a2b4f.png

Taki raport niestandardowy może służyć do określania, kiedy pojawił się problem z wydajnością, oraz do śledzenia wskaźnika poziomu usług (SLI), takiego jak czas oczekiwania na żądanie użytkownika.

8. Czas zwolnić miejsce na zasoby

To koniec ćwiczenia.

Cloud Functions i narzędzia Stackdriver to platformy bezserwerowe, które nie generują kosztów, gdy nie są używane. Jednak w trosce o środowisko chmurowe usuń swoją funkcję Cloud. Wybierz hello-monitor w sekcji Przegląd w Cloud Functions i kliknij Usuń.

aceb633cf70a4a27.png

9. Co dalej?

Więcej informacji znajdziesz w tych artykułach:

/