Сегменты трассировки AWS X-Ray отсутствуют или не подключены

У меня есть код, который создает сегмент при чтении очереди. В первой функции (в той же лямбде) у меня есть следующее:

import * as AWSXRay from 'aws-xray-sdk'; // (using TypeScrpt)
AWSXRay.enableManualMode();
var segment1 = new AWSXRay.Segment("A");

Во второй функции (внутри той же лямбды), вызываемой из первой, у меня есть что-то вроде этого:

var segment2 = new AWSXRay.Segment("B", segment1.trace_id, segment1.id);

Вместо того, чтобы видеть

*->A->B

На графике AWS (на сайте) я вижу:

*->A
*->B

... где они даже не связаны, даже если у них один и тот же идентификатор трассировки, а родительские идентификаторы установлены правильно. Кажется, я чего-то упускаю, но не знаю, что ...?

Я даже попытался вытащить X-Amzn-Trace-Id из запроса API, чтобы использовать его в качестве корневого идентификатора отслеживания для всего, но это тоже не сработало.

Это JSON для первого сегмента (A):

{
  "Duration": 0.808,
  "Id": "1-5d781a08-d41b49e35c3c0f38cdbd4912",
  "Segments": [
    {
      "Document": {
        "id": "74c99567f73185ce",
        "name": "router",
        "start_time": 1568152071.979,
        "end_time": 1568152072.787,
        "parent_id": "ef34fc0bcf23bbbe",
        "aws": {
          "xray": {
            "sdk": "X-Ray for Node.js",
            "sdk_version": "2.3.6",
            "package": "aws-xray-sdk"
          }
        },
        "service": {
          "version": "unknown",
          "runtime": "node",
          "runtime_version": "v10.16.3",
          "name": "unknown"
        },
        "trace_id": "1-5d781a08-d41b49e35c3c0f38cdbd4912"
      },
      "Id": "74c99567f73185ce"
    }
  ]
}

Это JSON для второго сегмента (B):

{
    "Duration": 0.801,
    "Id": "1-5d781a08-d9626abbab1cfbbfe4ff0dff",
    "Segments": [
        {
            "Document": {
                "id": "e2b4faaa6538bbb2",
                "name": "handleCreateLoad",
                "start_time": 1568152071.98,
                "end_time": 1568152072.781,
                "parent_id": "74c99567f73185ce",
                "aws": {
                    "xray": {
                        "sdk": "X-Ray for Node.js",
                        "sdk_version": "2.3.6",
                        "package": "aws-xray-sdk"
                    }
                },
                "service": {
                    "version": "unknown",
                    "runtime": "node",
                    "runtime_version": "v10.16.3",
                    "name": "unknown"
                },
                "trace_id": "1-5d781a08-d9626abbab1cfbbfe4ff0dff",
                "subsegments": [
                  {
                    "id": "08ccf2f374364066",
                    "name": "...-CreateLoad",
                    "start_time": 1568152071.981,
                    "end_time": 1568152072.781
                  }
                ]
            },
            "Id": "e2b4faaa6538bbb2"
        }
    ]
}

Совершенно ясно, что родительский идентификатор для «B» (74c99567f73185ce) указывает на идентификатор «A», но график не связывает их.

введите описание изображения здесь

Кроме того, я думаю, что _x_amzn_trace_id должен быть установлен при выполнении лямбда, но это не так. Это может быть корнем моих проблем.


person James Wilkins    schedule 10.09.2019    source источник
comment
Не могли бы вы предоставить пример документа трассировки json? Вы можете редактировать конфиденциальные поля. Это работает на лямбде или EC2?   -  person haotian465    schedule 10.09.2019
comment
Лямбда. Понятия не имею, где этот документ. Для графика трассировки нет экспорта JSON.   -  person James Wilkins    schedule 10.09.2019
comment
Предположим, что каждый запрос проходит через один и тот же набор компонентов в вашем приложении, было бы полезно, если у вас есть какой-либо документ трассировки json. Вы можете подписаться на docs.aws.amazon.com/xray/latest /devguide/xray-console.html раздел "Просмотр трассировки", в котором есть инструкции по получению необработанных данных трассировки,   -  person haotian465    schedule 10.09.2019
comment
Обновлено с более подробной информацией.   -  person James Wilkins    schedule 11.09.2019


Ответы (1)


Оказывается, process.env._x_amzn_trace_id, необходимый для AWS XRay SDK, НЕ существует, пока не будет вызван обработчик. Это может помочь другим узнать, через что я прошел:

  1. Сначала я попытался получить данные трассировки для текущей лямбды при запуске (до вызова обработчика) для подключения моих новых сегментов, но это не сработало. У меня много обработчиков в одном проекте, поэтому получить лямбда-сегмент при запуске - это то, что я надеялся сделать.
  2. Затем я приступил к созданию основного лямбда-сегмента (думая, что я должен был создать первый сегмент сам), но все, что он сделал, это создал потерянный сегмент. Что еще хуже, каждый сегмент создает новый идентификатор трассировки, если он не указан, и, поскольку я не смог получить идентификатор трассировки из глобальной области запуска, ничего не подключалось. Правильный идентификатор трассировки важен для передачи от начала до конца для каждого запроса, чтобы убедиться, что нисходящие вызовы отслеживаются правильно.
  3. Сброс переменных среды перед вызовом обработчика и после явного показа идентификатора трассировки не предоставляется до тех пор, пока не будет вызван обработчик. Печально, что большинство онлайн-примеров даже не предупреждают об этом. Затем я переместил вызываемый объект в AWSXRay.getSegment() в начале обработчика лямбда-выражения, а затем передал детали дочерним сегментам.
  4. НЕ устанавливайте context.callbackWaitsForEmptyEventLoop = false одновременно с вызовом обратного вызова callback(error, response), переданного обработчику лямбда. Это приведет к завершению лямбда-выражения, не дожидаясь, пока события обновления сегмента будут сброшены на демон, что приведет к появлению потерянных сегментов. :(

Примечание. Отсутствует эта документация: https://docs.aws.amazon.com/xray-sdk-for-nodejs/latest/reference/ В нем говорится: «Вы можете получить текущий сегмент или подсегмент в любое время», хотя на самом деле иногда это невозможно. Жаль, что нет подходящих примеров, использующих реальный рабочий код NodeJS Lambda вместо отдельных строк кода, разбросанных повсюду.

person James Wilkins    schedule 11.09.2019
comment
Приносим извинения за возможные недоразумения. Я отправил этот отзыв владельцу документации, и мы постараемся решить эти проблемы как можно скорее. - person haotian465; 11.09.2019
comment
Спасибо. Дайте мне знать, когда он обновится, и я тоже обновлю свой ответ. - person James Wilkins; 11.09.2019
comment
Обнаружена новая проблема: context.callbackWaitsForEmptyEventLoop = false вызывает сбой обновления сегмента; это тоже должно быть в документации. Установка значения true решила последнюю из моих проблем с сиротством. - person James Wilkins; 11.09.2019