Rozwiązywanie problemów podczas korzystania z zestawu SDK języka Python usługi Azure Cosmos DB z interfejsem API dla kont NoSQL
DOTYCZY: NoSQL
Ważne
W tym artykule opisano rozwiązywanie problemów tylko z zestawem SDK języka Python usługi Azure Cosmos DB. Aby uzyskać więcej informacji, zobacz informacje o wersji readme zestawu SDK języka Python dla usługi Azure Cosmos DB, pakiet (PyPI), pakiet (Conda) i porady dotyczące wydajności.
W tym artykule opisano typowe problemy, obejścia, kroki diagnostyczne i narzędzia podczas korzystania z zestawu SDK języka Python usługi Azure Cosmos DB z kontami noSQL w usłudze Azure Cosmos DB. Zestaw SDK języka Python usługi Azure Cosmos DB zapewnia logiczną reprezentację po stronie klienta w celu uzyskania dostępu do usługi Azure Cosmos DB for NoSQL. W tym artykule opisano narzędzia i podejścia pomocne w przypadku napotkania jakichkolwiek problemów.
Zacznij od tej listy:
- Zapoznaj się z sekcją Typowe problemy i obejścia w tym artykule.
- Zapoznaj się z zestawem SDK języka Python w centralnym repozytorium usługi Azure Cosmos DB, które jest dostępne w usłudze GitHub. Zawiera sekcję problemów, która jest aktywnie monitorowana. Sprawdź, czy wystąpił już podobny problem z obejściem. Jedną z przydatnych wskazówek jest filtrowanie problemów według tagu
*Cosmos*
. - Zapoznaj się z poradami dotyczącymi wydajności zestawu SDK języka Python usługi Azure Cosmos DB i postępuj zgodnie z sugerowaną praktyką.
- Przeczytaj resztę tego artykułu, jeśli nie znajdziesz rozwiązania. Następnie zgłoś problem z usługą GitHub. Jeśli istnieje opcja dodawania tagów do problemu z usługą
*Cosmos*
GitHub, dodaj tag.
Rejestrowanie i przechwytywanie diagnostyki
Ważne
Zalecamy korzystanie z najnowszej wersji zestawu PYTHON SDK. Historię wersji można sprawdzić tutaj
Ta biblioteka używa standardowej biblioteki rejestrowania na potrzeby diagnostyki rejestrowania. Podstawowe informacje o sesjach HTTP (adresach URL, nagłówkach itp.) są rejestrowane na poziomie INFORMACJI.
Szczegółowe rejestrowanie na poziomie DEBUG, w tym treść żądania/odpowiedzi i nieredagowane nagłówki, można włączyć na kliencie z argumentem logging_enable
:
import sys
import logging
from azure.cosmos import CosmosClient
# Create a logger for the 'azure' SDK
logger = logging.getLogger('azure')
logger.setLevel(logging.DEBUG)
# Configure a console output
handler = logging.StreamHandler(stream=sys.stdout)
logger.addHandler(handler)
# This client will log detailed information about its HTTP sessions, at DEBUG level
client = CosmosClient(URL, credential=KEY, logging_enable=True)
logging_enable
Podobnie można włączyć szczegółowe rejestrowanie dla pojedynczej operacji, nawet jeśli nie jest włączona dla klienta:
database = client.create_database(DATABASE_NAME, logging_enable=True)
Alternatywnie możesz zalogować się przy użyciu CosmosHttpLoggingPolicy
elementu , który rozciąga się od podstawowego HttpLoggingPolicy
elementu platformy Azure, przekazując rejestrator do argumentu logger
.
Domyślnie będzie on używać zachowania z klasy HttpLoggingPolicy
. Przekazanie argumentu enable_diagnostics_logging
CosmosHttpLoggingPolicy
spowoduje włączenie elementu i będzie zawierać dodatkowe informacje w odpowiedzi dotyczącej debugowania problemów z usługą Cosmos.
import logging
from azure.cosmos import CosmosClient
#Create a logger for the 'azure' SDK
logger = logging.getLogger('azure')
logger.setLevel(logging.DEBUG)
# Configure a file output
handler = logging.FileHandler(filename="azure")
logger.addHandler(handler)
# This client will log diagnostic information from the HTTP session by using the CosmosHttpLoggingPolicy.
# Since we passed in the logger to the client, it will log information on every request.
client = CosmosClient(URL, credential=KEY, logger=logger, enable_diagnostics_logging=True)
Podobnie rejestrowanie można włączyć dla pojedynczej operacji, przekazując rejestrator do pojedynczego żądania.
Jeśli jednak chcesz użyć elementu w CosmosHttpLoggingPolicy
celu uzyskania dodatkowych informacji, enable_diagnostics_logging
argument musi zostać przekazany w konstruktorze klienta.
# This example enables the `CosmosHttpLoggingPolicy` and uses it with the `logger` passed in to the `create_database` request.
client = CosmosClient(URL, credential=KEY, enable_diagnostics_logging=True)
database = client.create_database(DATABASE_NAME, logger=logger)
Ponawianie próby projektu
Zapoznaj się z naszym przewodnikiem dotyczącym projektowania odpornych aplikacji przy użyciu zestawów SDK usługi Azure Cosmos DB, aby uzyskać wskazówki dotyczące projektowania odpornych aplikacji i dowiedz się, które są semantyka ponawiania próby zestawu SDK.
Typowe problemy i ich rozwiązania
Sugestie ogólne
Aby uzyskać najlepszą wydajność:
- Upewnij się, że aplikacja działa w tym samym regionie co konto usługi Azure Cosmos DB.
- Sprawdź użycie procesora CPU na hoście, na którym działa aplikacja. Jeśli użycie procesora CPU wynosi co najmniej 50 procent, uruchom aplikację na hoście z wyższą konfiguracją. Możesz też rozłożyć obciążenie na więcej maszyn.
- Jeśli używasz aplikacji w usłudze Azure Kubernetes Service, możesz użyć usługi Azure Monitor do monitorowania wykorzystania procesora CPU.
Sprawdzanie metryk portalu
Sprawdzenie metryk portalu pomoże określić, czy jest to problem po stronie klienta, czy występuje problem z usługą. Jeśli na przykład metryki zawierają wysoką częstotliwość żądań ograniczonych szybkością (kod stanu HTTP 429), co oznacza, że żądanie jest ograniczane, sprawdź zbyt dużą sekcję Częstotliwość żądań.
Ograniczanie połączeń
Ograniczanie połączeń może wystąpić z powodu [limitu połączeń na maszynie hosta] lub [wyczerpania portów SNAT (PAT) platformy Azure].
Limit połączeń na maszynie hosta
Niektóre systemy Linux, takie jak Red Hat, mają górny limit całkowitej liczby otwartych plików. Gniazda w systemie Linux są implementowane jako pliki, więc ta liczba ogranicza łączną liczbę połączeń. Uruchom następujące polecenie.
ulimit -a
Liczba maksymalnych dozwolonych otwartych plików, które są identyfikowane jako "nofile", musi być co najmniej dwukrotnie większy niż rozmiar puli połączeń. Aby uzyskać więcej informacji, zobacz Porady dotyczące wydajności zestawu SDK języka Python usługi Azure Cosmos DB.
Wyczerpanie portów SNAT (PAT) platformy Azure
Jeśli aplikacja jest wdrażana na maszynach wirtualnych platformy Azure bez publicznego adresu IP, domyślnie porty SNAT platformy Azure nawiązują połączenia z dowolnym punktem końcowym poza maszyną wirtualną. Liczba połączeń dozwolonych z maszyny wirtualnej do punktu końcowego usługi Azure Cosmos DB jest ograniczona przez konfigurację protokołu SNAT platformy Azure.
Porty SNAT platformy Azure są używane tylko wtedy, gdy maszyna wirtualna ma prywatny adres IP i proces z maszyny wirtualnej próbuje nawiązać połączenie z publicznym adresem IP. Istnieją dwa obejścia, aby uniknąć ograniczenia usługi Azure SNAT:
Dodaj punkt końcowy usługi Azure Cosmos DB do podsieci sieci wirtualnej usługi Azure Virtual Machines. Aby uzyskać więcej informacji, zobacz Punkty końcowe usługi Azure Virtual Network.
Po włączeniu punktu końcowego usługi żądania nie są już wysyłane z publicznego adresu IP do usługi Azure Cosmos DB. Zamiast tego są wysyłane tożsamości sieci wirtualnej i podsieci. Ta zmiana może spowodować porzucenie zapory, jeśli dozwolone są tylko publiczne adresy IP. Jeśli używasz zapory, po włączeniu punktu końcowego usługi dodaj podsieć do zapory przy użyciu list ACL sieci wirtualnej.
Przypisz publiczny adres IP do maszyny wirtualnej platformy Azure.
Nie można nawiązać połączenia z usługą — zapora
azure.core.exceptions.ServiceRequestError:
wskazuje, że zestaw SDK nie może nawiązać połączenia z usługą. Postępuj zgodnie z limitem połączenia na maszynie hosta.
Niepowodzenie nawiązywania połączenia z emulatorem usługi Azure Cosmos DB
Certyfikat HTTPS emulatora usługi Azure Cosmos DB jest z podpisem własnym. Aby zestaw SDK języka Python działał z emulatorem, zaimportuj certyfikat emulatora. Aby uzyskać więcej informacji, zobacz Eksportowanie certyfikatów emulatora usługi Azure Cosmos DB.
Serwer proxy HTTP
Jeśli używasz serwera proxy HTTP, upewnij się, że może obsługiwać liczbę połączeń skonfigurowanych w zestawie SDK ConnectionPolicy
.
W przeciwnym razie występują problemy z połączeniem.
Typowe problemy z zapytaniami
Metryki zapytań pomogą określić, gdzie zapytanie spędza większość czasu. Z metryk zapytania możesz zobaczyć, ile z niego jest wydawane na zapleczu a klientem. Dowiedz się więcej na temat przewodnika dotyczącego wydajności zapytań.
Następne kroki
- Dowiedz się więcej o wytycznych dotyczących wydajności dla zestawu PYTHON SDK
- Dowiedz się więcej o najlepszych rozwiązaniach dotyczących zestawu PYTHON SDK