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

1. Wprowadzenie

Z tego ćwiczenia w Codelabs dowiesz się, jak korzystać z narzędzi do logowania i monitorowania dostępnych dla wszystkich deweloperów, którzy korzystają z Cloud Functions. Te narzędzia są dostarczane z każdą funkcją w Cloud Functions, którą wdrażasz we wszystkich obsługiwanych językach. Powinny one umożliwić Ci większą wydajność podczas pisania i obsługiwania kodu bezserwerowego.

5815064fec87444b

Będziesz korzystać z funkcji w Cloud Functions aktywowanej przez HTTP, ale informacje, które omówisz, będą również miały zastosowanie do innych języków i funkcji w Cloud Functions wywoływanych przez inne zdarzenia.

2. Konfiguracja i wymagania

Samodzielne konfigurowanie środowiska

  1. Zaloguj się w konsoli Google Cloud i utwórz nowy projekt lub wykorzystaj już istniejący. 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, unikalną nazwę we wszystkich projektach Google Cloud (powyższa nazwa jest już zajęta i nie będzie Ci odpowiadać). W dalszej części tego ćwiczenia w Codelabs będzie ona określana jako PROJECT_ID.

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

Ukończenie tego ćwiczenia z programowania nie powinno kosztować zbyt wiele. Postępuj zgodnie z instrukcjami podanymi w sekcji „Czyszczenie” W tym samouczku znajdziesz wskazówki, jak wyłączyć zasoby, aby uniknąć naliczania opłat. Nowi użytkownicy Google Cloud mogą skorzystać z programu bezpłatnego okresu próbnego o wartości 300 USD.

Cloud Shell

Z Cloud Functions oraz funkcji logowania i monitorowania można korzystać zdalnie z laptopa, ale korzystasz z Cloud Shell – środowiska wiersza poleceń działającego w Google Cloud.

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 uwierzytelnianie. Oznacza to, że do tego ćwiczenia z programowania wystarczy przeglądarka (tak, działa ona na Chromebooku).

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

I5aEsuNurCxHoDFjZRZrKBdarPPKPoKuExYpdagmdaOLKe7eig3DAKJitIKyuOpuwmrMAyZhp5AXpmD_k66cBuc1aUnWlJeSfo_aTKPY9aNMurhfegg1CYaE11jdpSTYNNIYARe01A

Zrzut ekranu 2017-06-14 o 10.13.43 PM.png

Po nawiązaniu połączenia z Cloud Shell powinno pojawić się potwierdzenie, że użytkownik jest już uwierzytelniony, a projekt jest już ustawiony na PROJECT_ID.

gcloud auth list

Dane wyjściowe polecenia

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

Dane wyjściowe polecenia

[core]
project = <PROJECT_ID>

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

gcloud config set project <PROJECT_ID>

Szukasz urządzenia PROJECT_ID? Sprawdź identyfikator użyty w krokach konfiguracji lub wyszukaj go w panelu Cloud Console:

R7chO4PKQfLC3bvFBNZJALLTUiCgyLEq_67ECX7ohs_0ZnSjC7GxDNxWrJJUaoM53LnqABYamrBJhCuXF-J9XBzuUgaz7VvaxNrkP2TAn93Drxccyj2-5zz4AxL-G3hzxZ4PsM5HHQ

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

echo $GOOGLE_CLOUD_PROJECT

Dane wyjściowe 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 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 wartości domyślne kodu źródłowego. Możesz jednak wybrać inny język lub inne środowisko wykonawcze.

7aadf164450484e.png

Na koniec kliknij Utwórz.

dc74cd21000d6c91.png

Funkcja w Cloud Functions powinna być widoczna z zielonym znacznikiem wyboru. Oznacza to, że jest gotowa do wywołania.

5363a34eb001d5ed.png

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

Po wdrożeniu funkcji w Cloud Functions przetestuj ją z poziomu wiersza poleceń.

Najpierw przy użyciu Cloud Shell wyślij to polecenie:

$ gcloud functions describe hello-monitor

Powinno to spowodować zwrócenie opisu funkcji w Cloud Functions, w tym adresu URL obiektu httpsTrigger – punktu końcowego HTTP(S), który wywołuje funkcję w Cloud Functions. Powinien wyglądać podobnie do tego: https://<region>-<identyfikator-projektu>.cloudfunctions.net/hello-monitor.

Aktywowanie funkcji w Cloud Functions powinno być teraz równie proste jak użycie polecenia curl z tego adresu URL.

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

Teraz użyj Vegeta – 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 dziennikach

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

b24157fd3376e6a8.png

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

5a36fa75d2fb0165.png

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

Podczas wyświetlania dzienników możesz wykonać te czynności:

  • Filtruj według poziomu logowania (w Twoim przypadku wszystkie logi są na poziomie debug).
  • Wybierz konkretny okres (względny lub bezwzględny).
  • Włącz strumieniowe przesyłanie dzienników (z przyciskiem Odtwórz 751a4600016f34a7.png u góry ekranu).
  • Skopiuj link do wpisu w dzienniku (na potrzeby udostępnienia go członkom zespołu).
  • Pokaż wpis logu w kontekście zasobów.
  • 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. Zaktualizuj funkcję

W konsoli Cloud otwórz widok Szczegóły funkcji i obserwuj, jak szybko udało się utworzyć go za pomocą testera obciążenia. Dotyczy to liczby wywołań na sekundę i czasu ich wykonywania.

aaee3159bbe395d3.png 7ed347101da5eca0.png

Kolejnym bardziej szczegółowym narzędziem do obserwowania czasu oczekiwania i wywołań RPC jest Stackdriver Trace, ale zanim go użyjesz, musisz wprowadzić kilka zmian w swoich funkcjach w Cloud Functions. Wykonaj te czynności:

  1. Dodaj ratujący życie pakiet node-emoji jako zależność.
  2. Zaktualizuj kod funkcji, aby korzystał z modułu node-emoji i wprowadzał pewne opóźnienia.
  3. Dodaj zmienną środowiskową, aby włączyć usługę 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ść do pakietu node-emoji.

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

Zmodyfikuj funkcję, zmieniając zawartość 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
  
};

Powoduje to dodanie losowego emotikona do wiadomości zwracanej przez funkcję w Cloud Functions po 300 milisekundach wstrzymania.

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

9205bd277b76aa21.png

Kliknij Zapisz.

Wróć do Cloud Shell i wywołaj polecenie, aby wygenerować część obciążenia nowo wdrożonej funkcji w Cloud Functions:

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

Teraz możesz zobaczyć listę logów czasu generowanych bez innych wymagań konfiguracyjnych i bez konkretnej biblioteki śledzenia w kodzie.

7. Śledzenie zaktualizowanej funkcji w Cloud Functions

W menu po lewej stronie przejdź do sekcji Lista logów czasu (w sekcji Stackdriver Trace).

576373f38cad6f8.png

Wyświetli się zrzut ekranu podobny do tego:

44a36b758b49f88f.png

Powinno być jasne, że opóźnienie wprowadzone w funkcji w Cloud Functions jest rzeczywiście mierzone na poziomie 300 milisekund.

Każda kropka na wykresie to żądanie, w przypadku którego możesz wyświetlić szczegółowe informacje, takie jak sygnatura czasowa, metoda HTTP i stan, jej etykiety, link do odpowiedniego wpisu logu i wszystkie kolejne wywołanie RPC wykonane przez funkcję w Cloud Functions.

5815064fec87444b

Aby powiększyć widok, wystarczy kliknąć i przeciągnąć wykres. Wybieranie niestandardowego zakresu czasu na wykresie śledzenia

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

Ponieważ wdrożono jedną funkcję w Cloud Functions, wykres pokazuje tylko żądania GET dla identyfikatora URI hello-monitor. Logi możesz filtrować według metody HTTP (GET, POST, DELETE) według stanu HTTP (2XX, 3XX) lub filtra żądań.

W menu po lewej stronie wybierz Przegląd:

e920cfca2a50899e.png

Na tej stronie przeglądu znajdziesz najnowsze logi czasu 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 on nawet porównanie wygenerowanych wartości z punktem odniesienia w czasie.

5bd34e9d13b47fb6.png

Jeśli uda Ci się skonfigurować odpowiednie zakresy czasu z wystarczającą liczbą punktów danych, możesz wygenerować raport, który pokazuje ważne przesunięcie czasu oczekiwania między początkową funkcją w Cloud Functions a nową.

2cc0e9a3212b91bb.png

2e7b1ebf2f0a2b4f.png

Takiego raportu niestandardowego można używać do określania, kiedy wystąpił problem z wydajnością, i do śledzenia wskaźnika poziomu usług (SLI), np. czasu oczekiwania na żądanie użytkownika.

8. Czas wyczyścić zasoby

To już koniec ćwiczenia z programowania.

Narzędzia w Cloud Functions i narzędzia Stackdriver to platformy bezserwerowe, które w przypadku nieużywania tej funkcji nie generują kosztów, jednak dobrze zachowaj się w chmurze i usuń swoją funkcję w Cloud Functions. Po prostu wybierz hello-monitor w sekcji Overview (Przegląd) w sekcji Cloud Functions (Cloud Functions) i kliknij Usuń.

aceb633cf70a4a27.png

9. Co dalej?

Oto kilka dodatkowych artykułów:

/