Как мы можем отследить http-запросы axios с помощью aws x-ray?

Я ищу метод для отслеживания HTTP-запросов axios в моей лямбда-функции aws на основе node.js. Я нашел способ отслеживать HTTP-запрос в официальных документах aws https://docs.aws.amazon.com/xray/latest/devguide/xray-sdk-nodejs-httpclients.html

var AWSXRay = require('aws-xray-sdk');
var http = AWSXRay.captureHTTPs(require('http'));

Но я не нашел ни одного документа или блога, посвященного отслеживанию запросов axios. Я тоже пробовал этот код, но он не работает.

import AWSXRay from 'aws-xray-sdk';
AWSXRay.captureHTTPsGlobal("../../common/http/HttpClient");
import { HttpClient } from "../../common/http/HttpClient";

Мне нужна помощь в этом отношении. Спасибо!


person Zeeshan Tariq    schedule 09.10.2018    source источник
comment
Привет, не могли бы вы подробнее рассказать о том, что он не работает? Получаете ли вы какие-либо ошибки, или информация http просто отсутствует? Какой синтаксис или фрагмент кода вы используете для HTTP-вызовов с помощью axios? Обратите внимание, что AWS X-Ray SDK для Nodejs официально не поддерживает axios, и вы можете увидеть код исправления для встроенного http-клиента здесь github.com/aws/aws-xray-sdk-node/blob/master/packages/core/ lib /   -  person haotian465    schedule 10.10.2018
comment
Привет, я не получаю никаких ошибок, добавляя эти строки в свою лямбда-функцию. импортировать AWSXRay из aws-xray-sdk; AWSXRay.captureHTTPsGlobal (../../ common / http / HttpClient); импортировать {HttpClient} из ../../common/http/HttpClient; На самом деле в своей лямбда-функции я делаю запрос на отправку axios и тестирую конечную точку, которая возвращает код 500. В идеале эта ошибка должна регистрироваться через рентгеновский снимок aws, но она не регистрирует ошибку. Но для вывода этого сообщения при развертывании установлено: AWS_XRAY_CONTEXT_MISSING. Настроена стратегия отсутствия контекста для LOG_ERROR   -  person Zeeshan Tariq    schedule 10.10.2018
comment
@ haotian465 Я только что нашел метод для регистрации ошибок axios с помощью captureAsyncFunc, но мне интересно, могу ли я преобразовать его в обещание, чтобы код стал чище. Я добавил сюда фрагмент кода: jsfiddle.net/zeeshantariq/1b68eLdr/77938 Но я получаю сообщение об ошибке: Ошибка: Param fcn должен быть функцией.   -  person Zeeshan Tariq    schedule 10.10.2018
comment
это в отставке. Вы можете открыть проблему здесь github.com/aws/aws-xray-sdk-node или отправить PR для обещания захвата   -  person haotian465    schedule 19.10.2018


Ответы (2)


Поскольку axios будет использовать модули node http / https под крышками, если вы глобально захватите http и https перед тем, как импортировать / потребовать axios, все должно работать, как ожидалось.

import AWSXRay from 'aws-xray-sdk';
import http from 'http';
import https from 'https';

AWSXRay.captureHTTPsGlobal(http);
AWSXRay.captureHTTPsGlobal(https);

const axios = require('axios');
person ericf89    schedule 06.12.2018

Простой пример, который должен работать, это

const
  axios = require('axios'),
  AWSXRay = require('aws-xray-sdk-core');

AWSXRay.captureHTTPsGlobal(require('http')); // Globally instrument http client
AWSXRay.captureHTTPsGlobal(require('https')); // Globally instrument https client

const http = require('http');
const https = require('https');

AWSXRay.capturePromise(); // We should capture promies
const instance = axios.create({
  httpAgent: new http.Agent(),
  httpsAgent: new https.Agent(),
}); // Instrument axious instance

const post = async (url, body) => {
  return await instance.post(url, body);
}

Убедитесь, что у Lambda правильные права доступа.

person Tanzwud    schedule 27.12.2019