Rejestrowanie i śledzenie logów w Cloud Functions

Celem tego ćwiczenia jest zapoznanie się z zaletami narzędzi do logowania i monitorowania dostępnych dla wszystkich deweloperów Cloud Function. Te narzędzia są dostarczane z każdą funkcją Cloud Functions, którą wdrażasz we wszystkich obsługiwanych językach, i powinny zapewnić Ci większą produktywność podczas pisania i obsługi kodu bezserwerowego.

Wykorzystamy tutaj wywołaną przez HTTP funkcję, ale wszystko, co omówiliśmy, dotyczy też innych języków i funkcji aktywowanych przez inne zdarzenia (zasobnik na dane, pub/sub itp.)

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,

O ile funkcje Google Cloud Functions i ich funkcji logowania i monitorowania mogą być używane zdalnie z laptopa, w tym ćwiczeniu z programowania będziemy używać Google Cloud Shell – środowiska wiersza poleceń działającego 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

Kliknij przycisk „Rozpocznij” w Cloud Shell:

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>

Cloud Shell domyślnie ustawia też niektóre zmienne środowiskowe, co może być przydatne podczas uruchamiania kolejnych poleceń.

echo $GOOGLE_CLOUD_PROJECT

Polecenie wyjściowe

<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.

Aby mieć coś do monitorowania, utwórzmy funkcję Hello World w chmurze. W menu po lewej stronie konsoli kliknij funkcje Cloud Functions, a następnie "Create function" :

Nazwij nową funkcję "hello-monitor" :

... i zachowaj domyślne wartości kodu źródłowego (możesz jednak wybrać inny język i czas działania) :

Na koniec utwórz funkcję za pomocą przycisku &"Create :

Po chwili powinna pojawić się informacja o tym, że Twoja funkcja jest gotowa do wywołania (co wskazuje zielony znacznik wyboru) :

Po wdrożeniu funkcji w chmurze przetestujemy ją z poziomu wiersza poleceń.

Najpierw użyj tego polecenia, używając polecenia Cloud Shell :

$ gcloud functions describe hello-monitor

Powinien zwrócić opis funkcji, w tym adres URL dla httpsTrigger, który jest punktem końcowym HTTP(S) wywołującym funkcję. Powinien mieć format : https://<region>-<project-id>.cloudfunctions.net/hello-monitor

Wywołanie funkcji powinno być teraz tak proste jak curl'ing ten adres URL :

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

Wykorzystamy teraz Vegeta, proste narzędzie do testowania obciążenia HTTP. Aby go zainstalować, wpisz w Cloud Shell to polecenie :

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

Aby wysłać ruch do funkcji w chmurze (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

W widoku szczegółów funkcji kliknij menu „Wyświetl logi” po prawej stronie :

Powinno to spowodować przejście do sekcji Stackdriver Logging w projekcie, gdzie znajdziesz tylko logi funkcji Cloud :

Mamy nadzieję, że wszystkie żądania wysyłane do funkcji zwracają kod stanu 200.

Za pomocą tej przeglądarki logów możesz :

  • filtrowanie według poziomu logu (w naszym przypadku wszystkie logi są na poziomie Debug)
  • wybierz konkretny przedział czasu (względny lub bezwzględny);
  • Włącz strumieniowe przesyłanie logów (przycisk „"play"” u góry ekranu)
  • skopiuj link do wpisu w dzienniku (aby udostępnić go członkom zespołu);
  • pokaż wpis logu w kontekście zasobów
  • przypinanie wpisu logu (w formie wizualnej wskazówki)
  • wyeksportować dzienniki do BigQuery, Cloud Storage lub Cloud Pub/Sub (albo pobrać je w formacie JSON lub CSV);

Pamiętaj, że selektor w lewym górnym rogu umożliwia filtrowanie logów według funkcji. Możesz też szukać etykiet lub pełnego wyszukiwania tekstowego na pasku wyszukiwania u góry okna. W tym przypadku etykiety to hello-monitor (nazwa funkcji), a także identyfikator wykonania dla każdego żądania.

Filtry można też kopiować, aby je udostępniać (sprawdź menu rozwijane w polu wyszukiwania) :

W konsoli przejdź do &Szczegóły funkcji i wyświetl gwałtowny wzrost, który opracowaliśmy za pomocą naszego testera obciążenia, uwzględniając liczbę wywołań na sekundę i czas wykonywania :

Kolejnym bardziej szczegółowym narzędziem do sprawdzania czasów oczekiwania i wywołań RPC jest funkcja Stackdriver Trace, ale zanim będziemy mogli zacząć korzystać z tej funkcji, musimy wprowadzić kilka zmian w naszych funkcjach, takich jak:

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

Na stronie &Szczegóły funkcji kliknij Edytuj, aby zmodyfikować funkcję :

Edytuj plik package.json, by dodać zależność do pakietu node-emoji :

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

Zmień funkcję, zmieniając treść właściwości index.js na :

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 zwróconej przez funkcję po 300 milisekundach.

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

Nie zapomnij kliknąć Zapisz!

Wróć do Cloud Shell i wycofaj polecenie, aby wygenerować obciążenie nowo wdrożonej funkcji :

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

Teraz możemy już wyświetlić listę utworzonych logów czasu bez konieczności przeprowadzania innych konfiguracji i braku biblioteki śledzenia w Twoim kodzie.

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

Powinien zostać wyświetlony komunikat podobny do tego zrzutu ekranu :

Powinno to oczywiście wskazywać, że opóźnienie spowodowane przez funkcję jest mierzone na poziomie 300 ms.

Każda kropka na tym wykresie to żądanie, które pozwala wyświetlić szczegółowe informacje, takie jak sygnatura czasowa, metoda i stan HTTP, etykiety, link zwrotny względem odpowiedniego wpisu logu oraz kolejne wywołanie RPC wykonywane przez funkcję :

Jeśli chcesz powiększyć widok, kliknij i przeciągnij wykres:Wybieranie niestandardowego przedziału czasu na wykresie śledzenia

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

Ponieważ wdrożyliśmy jedną funkcję, wykres zawiera tylko tyle żądań: GET przy identyfikatorze URI hello-monitor. Możesz jednak filtrować logi według metody HTTP (GET, POST, DELETE, ...), stanu HTTP (2XX, 3XX, ...) lub filtra żądań.

Przejdź do sekcji „Logi czasu i przeglądy” w menu po lewej stronie :

Na tej stronie znajdziesz najnowsze logi czasu i inne statystyki.

... oraz możliwość tworzenia raportów niestandardowych na podstawie połączenia filtra żądań URI, metody HTTP, stanu HTTP i zakresu czasu. Umożliwia nawet porównywanie wygenerowanych wartości z wartościami czasowymi :

Jeśli uda Ci się skonfigurować prawidłowe zakresy czasu i uzyskać wystarczającą liczbę punktów danych, możesz wygenerować raport zawierający ważne opóźnienie opóźnienia między funkcją początkową a nową :

Raport niestandardowy może służyć do wykrywania problemów związanych ze skutecznością, a także do śledzenia wskaźnika poziomu usług (SLI), np. czasu oczekiwania na żądanie użytkownika.

Na tym zakończyliśmy nasze ćwiczenia z programowania, które obejmowały wdrożenie nowej funkcji w chmurze, poruszanie się po logach i obserwowanie logów żądań.

Cloud Functions i narzędzia Stackdriver to platformy bezserwerowe, które nie wiążą się z kosztami, gdy nie są używane, ale są dobrymi obywatelami chmury i mogą usunąć tę funkcję.

Wystarczy wybrać funkcję hello-monitor na stronie przeglądu Cloud Functions i kliknąć "delete".

To już koniec tego krótkiego wprowadzenia do ćwiczeń z logowania i logowania Cloud Functions.

Oto kilka wskazówek :

/