我们如何使用 aws x-ray 跟踪 axios http 请求?

Posted

技术标签:

【中文标题】我们如何使用 aws x-ray 跟踪 axios http 请求?【英文标题】:How can we trace axios http requests with aws x-ray? 【发布时间】:2019-03-13 23:47:28 【问题描述】:

我正在寻找一种方法来在我的基于 node.js 的 aws lambda 函数中跟踪 axios http 请求。我在 aws 官方文档上找到了一种跟踪 HTTP 请求的方法 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";

我需要这方面的帮助。 谢谢!

【问题讨论】:

您好,您能否详细说明“它不起作用”?您是否收到任何错误或 http 信息完全丢失?您使用 axios 进行 http 调用的语法或代码 sn-p 是什么?请注意,AWS X-Ray SDK for Nodejs 并未正式支持 axios,您可以在此处查看内置 http 客户端的补丁代码github.com/aws/aws-xray-sdk-node/blob/master/packages/core/lib/… 嗨,在我的 lambda 函数中添加这些行没有任何错误。从“aws-xray-sdk”导入 AWSXRay; AWSXRay.captureHTTPsGlobal("../../common/http/HttpClient");从“../../common/http/HttpClient”导入 HttpClient ;实际上,在我的 lambda 函数中,我正在发出 axios 发布请求并测试返回 500 代码的端点。理想情况下,应通过 aws x-ray 记录此错误,但不会记录错误。但是在部署时打印此消息:“AWS_XRAY_CONTEXT_MISSING 已设置。将上下文丢失策略配置为 LOG_ERROR” @haotian465 我刚刚找到了一种使用 captureAsyncFunc 记录 axios 错误的方法,但我想知道是否可以将其转换为 Promise,以便代码变得更清晰。我在这里添加了一段代码:jsfiddle.net/zeeshantariq/1b68eLdr/77938 但我收到错误:错误:参数“fcn”必须是一个函数。 这在待办事项中。您可以在github.com/aws/aws-xray-sdk-node 此处打开问题或提交 PR 以进行捕获 【参考方案1】:

由于 axios 将在后台使用 node 的 http/https 模块,如果您在导入/需要 axios 之前全局捕获 http 和 https,则应该可以按预期工作。

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

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

const axios = require('axios');

【讨论】:

【参考方案2】:

应该可以工作的简单示例是

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 具有正确的访问权限。

【讨论】:

这不起作用,它说 capturePromise 不是一个函数。这些变量需要在哪里声明?全球?

以上是关于我们如何使用 aws x-ray 跟踪 axios http 请求?的主要内容,如果未能解决你的问题,请参考以下文章

AWS X-Ray

将 SpringCloudSleuth 与 AWS X-Ray 集成

AWS使用X-Ray做AWS云上全链路追踪监控系统

在 AWS X-Ray 控制台中配置采样规则

在 Amazon EC2 上运行 X-Ray 守护程序

AWS的性能检测服务X-Ray(APM)