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.

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
- 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ć).
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ć 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).
- Aby aktywować Cloud Shell w konsoli Cloud, kliknij Aktywuj Cloud Shell
(udostępnienie środowiska i połączenie się z nim powinno zająć tylko kilka chwil).
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:
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>
- 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ę.

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

Zachowaj wszystkie domyślne ustawienia kodu źródłowego. (Możesz jednak wybrać inny język lub środowisko wykonawcze).

Na koniec kliknij Utwórz.

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

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.

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

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

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:
- Dodaj pakiet ratujący życie
node-emojijako zależność. - Zaktualizuj kod funkcji, aby używać modułu node-emoji i wprowadzić pewne opóźnienie.
- Dodaj zmienną środowiskową, aby włączyć Stackdriver Trace w Cloud Functions.
W sekcji Szczegóły funkcji kliknij Edytuj, aby zmodyfikować funkcję.

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:

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

Powinien pojawić się ekran podobny do tego:

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.

Aby powiększyć wykres, kliknij go i przeciągnij. 
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:

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

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.

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.


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

9. Co dalej?
Więcej informacji znajdziesz w tych artykułach:
/