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

1. Wprowadzenie

W tym ćwiczeniu dowiesz się, jak korzystać z narzędzi do logowania i monitorowania dostępnych dla wszystkich programistó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_NJ9p2IIXFppYk8x3wyymZXavjglNLJJhuXieCem56H30hwXtd8PvXGpXJO9gEUDu3cZwci9Oe6PgnbNuSYlMyvbXF1JdQyiHoEgnhl4PlV_MFagm2ppzhueRkqX4eLjJllZco_2zCp0V0bpTupUSKji9KkQyWqj11pqit1K1faS1V6aFxLGQdkuzGp4rsQTan7F01iePL5DtqQ8-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 Cloud Console, 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 o wartości 300 USD.

Cloud Shell

Chociaż funkcji Cloud Functions oraz jej funkcji rejestrowania i monitorowania można używać zdalnie na laptopie, w tym module będziesz korzystać z 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_aTKPY9aNMurhfegg1CYaE11jdpSTYNNIYARe01AScreen 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. (Możesz jednak wybrać inny język lub środowisko wykonawcze).

7aadf164450484e.png

Na koniec kliknij Utwórz.

dc74cd21000d6c91.png

Powinna być widoczna na liście funkcji w Cloud Functions z zielonym znacznikiem wyboru obok nazwy, co oznacza, że można ją wywołać.

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

Powinna ona zwrócić opis funkcji Cloud Functions, w tym adres URL httpsTrigger, czyli punkt końcowy HTTP(S) do wywoływania funkcji 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ć przeciętny ruch 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 skok, który został wywołany przez tester obciążenia w liczbie wywołań na sekundę i czasie ich wykonywania.

aaee3159bbe395d3.png 7ed347101da5eca0.png

Innym, bardziej szczegółowym narzędziem do obserwowania opóźnień i wywołań RPC jest Stackdriver Trace, ale zanim zaczniesz z niego korzystać, 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 w 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 300-milisekundowej przerwie.

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 generujące obciążenie nowo wdrożonej funkcji Cloud Function:

$ 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 wygenerowanych bez żadnych innych wymagań konfiguracyjnych i bez konkretnej biblioteki śledzenia w kodzie.

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 jasno pokazywać, że opóźnienie wprowadzone w Cloud Function 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, kliknij Cofnij powiększenie u góry strony.

Ponieważ wdrożono jedną funkcję Cloud, na wykresie widać tylko GET żądań w hello-monitor 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 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 danym okresie.

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ą a nową funkcją Cloud Function.

2cc0e9a3212b91bb.png2e7b1ebf2f0a2b4f.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), np. czasu oczekiwania na żądanie użytkownika.

8. Czas zwolnić miejsce w zasobach

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 Podsumowanie w Cloud Functions i kliknij Usuń.

aceb633cf70a4a27.png

9. Co dalej?

Więcej informacji znajdziesz w tych artykułach:

/