Ошибка рентгеновского снимка AWS: aws_xray_sdk.core.context: не удается найти текущий сегмент / подсегмент - PullRequest
0 голосов
/ 13 мая 2018

Мы недавно добавили X-Ray в наш код, имея:

from aws_xray_sdk.core import xray_recorder
from aws_xray_sdk.core import patch_all

patch_all()

Хотя в AWS Lambda это работает нормально, но при попытке выполнить локально во время вызова ElasticSearch мы получили следующее исключение:

ERROR:aws_xray_sdk.core.context:cannot find the current segment/subsegment, please make sure you have a segment open
queryCustomers - DEBUG - Caught exception for <function search_customer at 0x10bfcf0d0>
Traceback (most recent call last):
  File "/Users/jameslin/virtualenvs/test-project/lib/python3.6/site-packages/chalice/app.py", line 659, in _get_view_function_response
    response = view_function(**function_args)
  File "/Users/jameslin/projects/test-project/src/app.py", line 57, in search_customer
    return query[0:size].execute().to_dict()['hits']['hits']
  File "/Users/jameslin/virtualenvs/test-project/lib/python3.6/site-packages/elasticsearch_dsl/search.py", line 639, in execute
    **self._params
  File "/Users/jameslin/virtualenvs/test-project/lib/python3.6/site-packages/elasticsearch/client/utils.py", line 73, in _wrapped
    return func(*args, params=params, **kwargs)
  File "/Users/jameslin/virtualenvs/test-project/lib/python3.6/site-packages/elasticsearch/client/__init__.py", line 632, in search
    doc_type, '_search'), params=params, body=body)
  File "/Users/jameslin/virtualenvs/test-project/lib/python3.6/site-packages/elasticsearch/transport.py", line 312, in perform_request
    status, headers, data = connection.perform_request(method, url, params, body, ignore=ignore, timeout=timeout)
  File "/Users/jameslin/virtualenvs/test-project/lib/python3.6/site-packages/elasticsearch/connection/http_requests.py", line 71, in perform_request
    prepared_request = self.session.prepare_request(request)
  File "/Users/jameslin/virtualenvs/test-project/lib/python3.6/site-packages/aws_xray_sdk/ext/requests/patch.py", line 38, in _inject_header
    inject_trace_header(headers, xray_recorder.current_subsegment())
  File "/Users/jameslin/virtualenvs/test-project/lib/python3.6/site-packages/aws_xray_sdk/core/recorder.py", line 251, in current_subsegment
    entity = self.get_trace_entity()
  File "/Users/jameslin/virtualenvs/test-project/lib/python3.6/site-packages/aws_xray_sdk/core/recorder.py", line 316, in get_trace_entity
    return self.context.get_trace_entity()
  File "/Users/jameslin/virtualenvs/test-project/lib/python3.6/site-packages/aws_xray_sdk/core/context.py", line 93, in get_trace_entity
    return self.handle_context_missing()
  File "/Users/jameslin/virtualenvs/test-project/lib/python3.6/site-packages/aws_xray_sdk/core/context.py", line 118, in handle_context_missing
    raise SegmentNotFoundException(MISSING_SEGMENT_MSG)
aws_xray_sdk.core.exceptions.exceptions.SegmentNotFoundException: cannot find the current segment/subsegment, please make sure you have a segment open

Я понятия не имею, что он имеет в виду и как от него избавиться, мои попытки в Google дают не так много релевантных результатов, и я также попытался запустить рентгеновский демон локально, но все еще с той же проблемой:

./xray_mac -o -n ap-southeast-2

1 Ответ

0 голосов
/ 11 июня 2018

Когда ваш код работает на AWS Lambda с включенной трассировкой, контейнер Lambda сгенерирует сегмент, представляющий весь вызов функции.Он также устанавливает контекст как переменную среды, чтобы SDK мог связать любой подсегмент, созданный внутри функции, с родительским сегментом.

Если вы выполняете тот же код локально, SDK все еще пытается создать подсегменты для фактического кода функции, но не может найти никакого контекста, таким образом, выдает ошибку, которую вы опубликовали.

Чтобы решить эту проблемувам нужно будет настроить некоторые переменные окружения, чтобы убедиться, что SDK содержит ту же информацию, что и в реальном Lambda-контейнере.

  1. Убедитесь, что SDK считает, что он работает в Lambda-контейнере, установив LAMBDA_TASK_ROOT с любым значением, которое вы хотите (имеет значение только наличие ключа).Вы можете увидеть исходный код здесь: https://github.com/aws/aws-xray-sdk-python/blob/master/aws_xray_sdk/core/lambda_launcher.py
  2. Установка LAMBDA_TRACE_HEADER_KEY, чтобы функция имела контекст трассировки.Значение должно быть заголовком трассировки, и вы можете увидеть более подробную информацию здесь: https://docs.aws.amazon.com/lambda/latest/dg/lambda-x-ray.html

Этот обходной путь не идеален, так как требует дополнительных изменений кода со стороны пользователя.Мы хотели бы обеспечить лучший опыт работы с клиентами для локального тестирования рентгеновской Лямбда-функции.Не могли бы вы поделиться более подробной информацией о том, как вы проводите локальное тестирование и как вы ожидаете, что в такой среде тестирования будет работать трассировка рентгеновских лучей, чтобы мы могли улучшить ваши варианты использования?

...