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.
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
- 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ć.
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
.
- 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).
- Aby aktywować Cloud Shell z poziomu konsoli Cloud, kliknij Aktywuj Cloud Shell (udostępnienie środowiska i połączenie z nim powinno zająć tylko chwilę).
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:
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>
- 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ę.
Wpisz „hello-monitor” jako nazwę nowej funkcji w Cloud Functions.
Zachowaj wszystkie wartości domyślne kodu źródłowego. Możesz jednak wybrać inny język lub inne środowisko wykonawcze.
Na koniec kliknij Utwórz.
Funkcja w Cloud Functions powinna być widoczna z zielonym znacznikiem wyboru. Oznacza to, że jest gotowa do wywołania.
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.
Powinno to spowodować przejście do sekcji Stackdriver Logging w projekcie, w której widoczne są tylko logi funkcji w Cloud Functions.
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 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.
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:
- Dodaj ratujący życie pakiet
node-emoji
jako zależność. - Zaktualizuj kod funkcji, aby korzystał z modułu node-emoji i wprowadzał pewne opóźnienia.
- Dodaj zmienną środowiskową, aby włączyć usługę Stackdriver Trace dla Cloud Functions.
W sekcji Szczegóły funkcji kliknij Edytuj, aby zmodyfikować funkcję.
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:
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).
Wyświetli się zrzut ekranu podobny do tego:
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.
Aby powiększyć widok, wystarczy kliknąć i przeciągnąć wykres.
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:
Na tej stronie przeglądu znajdziesz najnowsze logi czasu i inne statystyki.
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.
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ą.
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ń.
9. Co dalej?
Oto kilka dodatkowych artykułów:
/