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.

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 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).
- 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. (Jeśli chcesz, możesz wybrać inny język lub środowisko wykonawcze).

Na koniec kliknij Utwórz.

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

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.

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 wzrost, który spowodował tester obciążenia, w liczbie wywołań na sekundę i czasie ich wykonania.

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:
- 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 dla 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 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:

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

Powinien pojawić się ekran podobny do tego:

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.

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

Na tej stronie przeglądu 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 określonym czasie.

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


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

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