yandex-cloud / python-sdk

Yandex.Cloud Python SDK
MIT License
85 stars 27 forks source link

_Rendezvous, Name resolution failure, Getting metadata from plugin failed, Internal #3

Closed kuk closed 5 years ago

kuk commented 5 years ago

Очень редко при использовании пакета случаются стектрейсы, который тяжело понять. Вы не могли помочь расшифровать что означают эти ошибки? Правильно ли я понимаю, что они означают, что на стороне YC что-то пошло не так и нужно просто попробовать сделать то же самое ещё раз (на практике я так и поступаю)?

Ошибки случаются, когда получаю список инстансов, дисков, подсетей, примеры кода:

    service = sdk.client(SubnetServiceStub)
    return service.List(
        ListSubnetsRequest(
            folder_id=FOLDER
        )
    ).subnets

    service = sdk.client(DiskServiceStub)
    return service.List(
        ListDisksRequest(
            folder_id=FOLDER
        )
    ).disks

    service = sdk.client(InstanceServiceStub)
    return service.List(
        ListInstancesRequest(
            folder_id=FOLDER
        )
    ).instances

Три типа стектрейсов:

...
  File "/usr/local/lib/python3.5/site-packages/yandexcloud/_sdk.py", line 18, in client
    channel = self._channels.channel(service)
  File "/usr/local/lib/python3.5/site-packages/yandexcloud/_channels.py", line 31, in channel
    resp = endpoint_service.List(ListApiEndpointsRequest())
  File "/usr/local/lib/python3.5/site-packages/grpc/_channel.py", line 549, in __call__
    return _end_unary_response_blocking(state, call, False, None)
  File "/usr/local/lib/python3.5/site-packages/grpc/_channel.py", line 466, in _end_unary_response_blocking
    raise _Rendezvous(state, None, None, deadline)
grpc._channel._Rendezvous: <_Rendezvous of RPC that terminated with:
        status = StatusCode.UNAVAILABLE
        details = "Name resolution failure"
        debug_error_string = "{"created":"@1555903974.737726324","description":"Failed to create subchannel","file":"src/core/ext/filters/client_channel/client_channel.cc","file_line":2267,"referenced_errors":[{"created":"@1555903974.737723239","description":"Name resolution failure","file":"src/core/ext/filters/client_channel/request_routing.cc","file_line":166,"grpc_status":14}]}"
...
File "/usr/local/lib/python3.5/site-packages/grpc/_channel.py", line 549, in __call__
    return _end_unary_response_blocking(state, call, False, None)
  File "/usr/local/lib/python3.5/site-packages/grpc/_channel.py", line 466, in _end_unary_response_blocking
    raise _Rendezvous(state, None, None, deadline)
grpc._channel._Rendezvous: <_Rendezvous of RPC that terminated with:
        status = StatusCode.UNAVAILABLE
        details = "Getting metadata from plugin failed with error: <_Rendezvous of RPC that terminated with:
        status = StatusCode.UNAVAILABLE
        details = "Name resolution failure"
        debug_error_string = "{"created":"@1554661349.281819740","description":"Failed to create subchannel","file":"src/core/ext/filters/client_channel/client_channel.cc","file_line":2267,"referenced_errors":[{"created":"@1554661349.281816407","description":"Name resolution failure","file":"src/core/ext/filters/client_channel/request_routing.cc","file_line":166,"grpc_status":14}]}"

"
        debug_error_string = "{"created":"@1554661349.282220432","description":"Getting metadata from plugin failed with error: <_Rendezvous of RPC that terminated with:\n\tstatus = StatusCode.UNAVAILABLE\n\tdetails = "Name resolution failure"\n\tdebug_error_string = "{"created":"@1554661349.281819740","description":"Failed to create subchannel","file":"src/core/ext/filters/client_channel/client_channel.cc","file_line":2267,"referenced_errors":[{"created":"@1554661349.281816407","description":"Name resolution failure","file":"src/core/ext/filters/client_channel/request_routing.cc","file_line":166,"grpc_status":14}]}"\n>","file":"src/core/lib/security/credentials/plugin/plugin_credentials.cc","file_line":79,"grpc_status":14}"
File "/usr/local/lib/python3.5/site-packages/grpc/_channel.py", line 550, in __call__
    return _end_unary_response_blocking(state, call, False, None)
  File "/usr/local/lib/python3.5/site-packages/grpc/_channel.py", line 467, in _end_unary_response_blocking
    raise _Rendezvous(state, None, None, deadline)
grpc._channel._Rendezvous: <_Rendezvous of RPC that terminated with:
        status = StatusCode.INTERNAL
        details = "Internal"
        debug_error_string = "{"created":"@1551904562.346117580","description":"Error received from peer","file":"src/core/lib/surface/call.cc","file_line":1036,"grpc_message":"Internal","grpc_status":13}"
Nyoroon commented 5 years ago

Это grpc так возвращает ошибки, могут быть как ошибки сервера, так и ошибки запроса (например, попытка создать два ресурса с одинаковым именем). Их нужно обрабатывать таким образом:

try:
    ...
except grpc.RpcError as e:
    print(e.details())
    status_code = e.code()
    print(status_code.name)
    print(status_code.value)
kuk commented 5 years ago

Да, спасибо. Вы показали по сути как проигнорировать эти ошибки (просто print). Мы сейчас так и делаем, только ещё несколько раз пытаемся повторить код из try ... except.

Хотелось бы понять причины этих ошибок, почему они случаются. Например, на сколько я помню, при попытке создать два ресурса с одинаковым именем, мы получаем понятный стектрейс, где написано что-то типа "такое имя уже есть".

В исходном вопросе есть три стектрейса, можно ли по ним понять причины их возникновения?

MAnyKey commented 5 years ago

Первые два трейсбека выглядят как ошибки клиентского DNS. Последний выглядит как ошибка API, к сожалению, только по нему сложно выявить причину.

В sdk можно настроить политику ретраев через interceptor:

interceptor = yandexcloud.RetryInterceptor(max_retry_count=5, back_off_func=yandexcloud.default_backoff())
sdk = yandexcloud.SDK(interceptor=interceptor, token=token)

По умолчанию мы повторяем запросы на Unavailable и на ResourceExhausted.

kuk commented 5 years ago

Большое спасибо!