适用于Datadog APM客户端库的测试代理
项目描述
Datadog APM测试代理
APM测试代理是一个应用程序,它模拟了Datadog代理的APM端点,可用于测试Datadog APM客户端库。
有关提供的完整功能列表,请参阅功能部分。
有关可用端点,请参阅HTTP API部分。
有关如何在本地运行测试代理以添加额外检查或修复错误,请参阅开发部分。
安装
测试代理可以从PyPI
pip install ddapm-test-agent
ddapm-test-agent --port=8126
或从Docker
# Run the test agent and mount the snapshot directory
docker run --rm\
-p 8126:8126\
-e SNAPSHOT_CI=0\
-v $PWD/tests/snapshots:/snapshots\
ghcr.io/datadog/dd-apm-test-agent/ddapm-test-agent:latest
或从源
pip install git+https://github.com/Datadog/dd-apm-test-agent
或特定分支安装
pip install git+https://github.com/Datadog/dd-apm-test-agent@{branch}
功能
跟踪不变性检查
测试代理提供了许多检查,用于验证跟踪数据。默认情况下,所有检查都已启用,并可手动禁用。
有关选项,请参阅配置部分。
检查描述 | 检查名称 |
---|---|
跟踪计数头与跟踪数量匹配 | trace_count_header |
请求中包含客户端库版本头 | meta_tracer_version_header |
跟踪内容长度头与有效负载大小匹配 | trace_content_length |
返回数据
可以检索提交给测试代理的所有数据。
- 可以通过以下以下记录的
/test/traces
端点返回跟踪。
有用的日志记录
测试代理的INFO
日志级别会输出测试代理接收到的请求的有用信息。对于跟踪,这包括跟踪的可视化表示。
INFO:ddapm_test_agent.agent:received trace payload with 1 trace chunk
INFO:ddapm_test_agent.agent:Chunk 0
[parent]
├─ [child1]
├─ [child2]
└─ [child3]
INFO:ddapm_test_agent.agent:end of payload ----------------------------------------
代理
测试代理为Datadog代理提供代理功能。这可以通过将代理URL传递给测试代理来启用,无论是通过--agent-url
命令行参数,还是通过DD_TRACE_AGENT_URL
或DD_AGENT_URL
环境变量。
当代理启用时,将返回来自Datadog代理的响应,而不是来自测试代理的响应。
在跟踪级别,也可以通过包含带有值为true
的X-Datadog-Agent-Proxy-Disabled
头禁用代理。这将禁用代理,无论是否设置了代理URL。
快照测试
测试代理提供了一种我们称之为快照的特征测试形式。这允许库维护者确保在做出不相关的更改时,跟踪不会意外更改。
这可以通过让测试用例使用追踪器发出跟踪,并由测试代理收集并与之前存储的参考跟踪进行比较来实现。
使用测试代理进行快照测试
- 确保跟踪与一个会话令牌(通常是测试用例的名称)相关联,可以通过以下方式之一:
- 在发出跟踪之前调用
/test/session/start
,并带有令牌端点;或 - 在
/vX.Y/trace
请求上附加额外的查询字符串参数或头指定会话令牌(以下为API具体信息)。 (必需以并发运行测试)
- 在发出跟踪之前调用
- 发出跟踪(运行集成测试)。
- 通过调用带有会话令牌的
/tests/session/snapshot
端点来通知会话结束并执行快照比较。如果快照失败,则端点将返回400
响应代码,以及一个纯文本错误跟踪,该错误可以转发给测试框架以帮助分类问题。
快照输出
跟踪被标准化并以JSON格式输出到文件。对输入执行以下转换:
- 覆盖跟踪ID以匹配接收到的跟踪顺序。
- 覆盖跟踪ID以匹配跟踪树中跟踪的DFS顺序。
- 使用标准化后的跟踪ID覆盖父ID。但是,如果父ID不是跟踪中的跟踪,则不会覆盖父ID。这对于处理分布式跟踪是必要的,其中并非所有跟踪都发送到同一个代理。
- 对跟踪属性进行排序,以便更易于阅读,重要的属性列在前面。
- 否则按字母数字顺序对跟踪属性进行排序。
- 如果空,则排除跟踪元数据和度量映射。
配置
可以通过命令行选项或通过环境变量来配置测试代理。
命令行
ddapm-test-agent
ddapm-test-agent
是用于运行测试代理的命令。
请参阅ddapm-test-agent --help
获取更多信息。
ddapm-test-agent-fmt
ddapm-test-agent-fmt
是一个命令行工具,用于格式化或检查快照JSON文件。
# Format all snapshot json files
ddapm-test-agent-fmt path/to/snapshots
# Lint snapshot json files
ddapm-test-agent-fmt --check path/to/snapshots
请参阅ddapm-test-agent-fmt --help
获取更多信息。
环境变量
-
PORT
[8126
]: 监听的端口。 -
ENABLED_CHECKS
[""
]: 要启用的检查的逗号分隔值。有效值可以在跟踪不变性检查中找到。 -
LOG_LEVEL
["INFO"
]: 要使用的日志级别。DEBUG、INFO、WARNING、ERROR、CRITICAL。 -
LOG_SPAN_FMT
["[{name}]"
]: 输出日志中的跟踪时使用的格式字符串。 -
SNAPSHOT_DIR
["./snapshots"
]: 存储快照的目录。可以通过在/snapshot
上提供dir
查询参数来覆盖。 -
SNAPSHOT_CI
[0
]: 切换快照测试的 CI 模式。设置为1
以启用。CI 模式执行以下操作- 当意外地从测试用例中生成快照时,将引发失败。
-
SNAPSHOT_IGNORED_ATTRS
["span_id,trace_id,parent_id,duration,start,metrics.system.pid,metrics.process_id,metrics.system.process_id,meta.runtime-id"
]: 在快照中比较跨度时忽略的属性。 -
DD_AGENT_URL
[""
]: Datadog 代理的 URL。当提供时,请求将被代理到代理。 -
DD_APM_RECEIVER_SOCKET
[""
]: 当提供时,测试代理将在提供的路径上监听跟踪(例如,/var/run/datadog/apm.socket
) -
DD_SUPPRESS_TRACE_PARSE_ERRORS
[false
]: 设置为"true"
以禁用解码处理跟踪时的跨度解析错误。当禁用时,错误不会抛出,即使度量值错误地放置在元字段中,或者与跨度标记格式/类型相关的其他类型错误。也可以使用--suppress-trace-parse-errors=true
选项设置。 -
SNAPSHOT_REMOVED_ATTRS
[""
]: 从快照中的跨度中删除的属性。这对于删除与测试用例无关的属性很有用。**注意,不允许删除span_id
以维护跨度排序。** -
DD_POOL_TRACE_CHECK_FAILURES
[false
]: 设置为"true"
以在 Test-Agent 内存中池化 Trace Check 失败。可以使用/test/trace_check/failures
端点稍后查询这些失败。也可以使用--pool-trace-check-failures=true
选项设置。 -
DD_DISABLE_ERROR_RESPONSES
[false
]: 设置为"true"
以在 Trace Check 失败时禁用 Test-Agent<Response 400>
,而是发送有效的<Response 200>
。建议与DD_POOL_TRACE_CHECK_FAILURES
环境变量一起使用。也可以使用--disable-error-responses=true
选项设置。
HTTP API
/test/traces
返回代理收到的跟踪。可以使用以下选项请求与特定跟踪 ID 匹配的跟踪。
[可选] ?trace_ids=
[可选] X-Datadog-Trace-Ids
将跟踪 ID 指定为逗号分隔的值(例如,12345,7890,2468
)
/test/session/start
启动一个 同步 会话。随后接收的所有跟踪都将与提供的所需测试令牌相关联。
[可选] ?agent_sample_rate_by_service=
代理在响应 v0.4 和 v0.5 请求时返回的采样率。
示例:"{'service:test,env:staging': 0.5, 'service:test2,env:prod': 0.2}"
(注意 JSON 必须进行 URL 编码)。
[可选] ?test_session_token=
[可选] X-Datadog-Test-Session-Token
测试用例的测试会话令牌。**确保此值是唯一的,以避免会话之间的冲突。**
/test/session/snapshot
在会话期间执行数据生成或比较快照。
当测试代理不在 CI 模式下并且没有快照文件时,将生成快照。否则将执行快照比较。
[可选*] ?test_session_token=
[可选*] X-Datadog-Test-Session-Token
为了并行运行测试用例,必须指定此 HTTP 标头。所有共享测试令牌的测试用例将被分组。
* 必需用于并发测试。可以通过查询参数或 HTTP 标头进行。
[可选] ?ignores=
要忽略的值的键的逗号分隔列表。
默认内置忽略列表为:span_id
、trace_id
、parent_id
、duration
、start
、metrics.system.pid
、metrics.process_id
、metrics.system.process_id
、meta.runtime-id
。
[可选] ?dir=
默认:./snapshots
(相对于测试代理运行的位置)。
覆盖存储和检索快照的目录。 此目录必须已存在。
此值将覆盖环境变量 SNAPSHOT_DIR
。
警告:指定 dir
和 file
两者是错误的。
[可选] ?file=
[可选] X-Datadog-Test-Snapshot-Filename
将存储和检索快照的绝对或相对(相对于代理当前工作目录)文件名。
警告:指定 file
和 dir
两者是错误的。
注意:文件扩展名将被附加到文件名。
对于跟踪统计请求,将向文件名附加 _tracestats
。
[可选] ?removes=
要从快照中的跨度中删除的键的逗号分隔列表。
默认的内置删除列表不删除任何键。
/test/session/requests
返回代理接收到的给定会话令牌的所有请求。
[可选] ?test_session_token=
[可选] X-Datadog-Test-Session-Token
以以下 json 格式返回请求
[
{
"headers": {},
"body": "...",
"url": "http...",
"method": "GET"
}
]
body
是请求的 base64 编码正文。
/test/session/traces
返回代理接收到的给定会话令牌的跟踪。
[可选] ?test_session_token=
[可选] X-Datadog-Test-Session-Token
/test/session/stats
返回代理接收到的给定会话令牌的统计数据。
[可选] ?test_session_token=
[可选] X-Datadog-Test-Session-Token
统计数据以接收到的统计数据有效负载的 JSON 列表形式返回。
/test/session/responses/config (POST)
创建用于在端点 /v0.7/config
检索的远程配置有效负载。
[可选] ?test_session_token=
[可选] X-Datadog-Test-Session-Token
curl -X POST 'http://0.0.0.0:8126/test/session/responses/config/path' -d '{"roots": ["eyJ....fX0="], "targets": "ey...19", "target_files": [{"path": "datadog/2/ASM_DATA/blocked_users/config", "raw": "eyJydWxlc19kYXRhIjogW119"}], "client_configs": ["datadog/2/ASM_DATA/blocked_users/config"]}'
/test/session/responses/config/path (POST)
由于远程配置有效负载相当复杂,此端点类似于 /test/session/responses/config (POST)
,但您应发送路径和消息,然后此端点构建远程配置有效负载。
JSON 正文的键是 path
和 msg
[可选] ?test_session_token=
[可选] X-Datadog-Test-Session-Token
curl -X POST 'http://0.0.0.0:8126/test/session/responses/config/path' -d '{"path": "datadog/2/ASM_DATA/blocked_users/config", "msg": {"rules_data": []}}'
/test/trace_check/failures (GET)
获取发生的跟踪检查失败。如果包含令牌,则返回该会话令牌的跟踪失败,除非与 return_all
一起使用,后者可以用于返回所有失败,无论输入的令牌是什么。如果没有返回跟踪检查失败,则此方法返回 <Response 200>
,如果返回跟踪检查失败,则返回 <Response 400>
。跟踪检查失败作为文本内容类型返回,失败消息连接在响应正文。可选地,将 use_json
查询字符串参数设置为 true
以将跟踪检查失败作为以下格式的 JSON 响应返回
response = {
"<FAILING_CHECK_NAME>" : ["<FAILURE_MESSAGE_1>", "<FAILURE_MESSAGE_2>"]
}
注意:应与 DD_POOL_TRACE_CHECK_FAILURES
一起使用,否则失败将不会在测试代理内存中保存,并且将始终返回 <Response 200>
。
[可选] ?test_session_token=
[可选] X-Datadog-Test-Session-Token
[可选] ?use_json=
[可选] ?return_all=
curl -X GET 'http://0.0.0.0:8126/test/trace_check/failures'
/test/trace_check/clear (GET)
清除发生的跟踪检查失败。如果包含令牌,则清除该会话令牌的跟踪失败,除非与 clear_all
一起使用。此参数可以用于清除所有失败(无论输入的会话令牌是什么)。
[可选] ?test_session_token=
[可选] X-Datadog-Test-Session-Token
[可选] ?clear_all=
curl -X GET 'http://0.0.0.0:8126/test/trace_check/clear'
/test/trace_check/summary (GET)
获取跟踪检查摘要结果。如果包含令牌,则仅返回会话期间运行的跟踪检查的摘要结果。可以使用 return_all
可选查询字符串参数返回所有跟踪检查结果(无论输入的会话令牌是什么)。此方法以以下 JSON 格式返回跟踪检查结果
summary = {
"trace_content_length" : {
"Passed_Checks": 10,
"Failed_Checks": 0,
"Skipped_Checks": 4,
} ...
}
[可选] ?test_session_token=
[可选] X-Datadog-Test-Session-Token
[可选] ?return_all=
curl -X GET 'http://0.0.0.0:8126/test/trace_check/summary'
/test/session/integrations (PUT)
更新当前测试集成信息。
[可选] ?test_session_token=
[可选] X-Datadog-Test-Session-Token
curl -X PUT 'http://0.0.0.0:8126/test/session/integrations' -d '{"integration_name": [INTEGRATION_NAME], "integration_version": [INTEGRATION_VERSION],
"dependency_name": [DEPENDENCY_NAME], "tracer_language": [TRACER_LANGUAGE], "tracer_version": [TRACER_VERSION]}'
/test/integrations/tested_versions (GET)
返回代理接收到的所有测试集成的逗号分隔列表。返回数据格式为:tracer_language,tracer_version,integration_name,integration_version,dependency_name
。
[可选] ?test_session_token=
[可选] X-Datadog-Test-Session-Token
curl -X GET 'http://0.0.0.0:8126/test/integrations/tested_versions'
/v0.1/pipeline_stats
模仿代理的 pipeline_stats 端点,但总是返回 OK,并在每次调用时记录一行。
/tracer_flare/v1
模拟代理的tracer_flare端点。如果焰火包含所需的表单字段,则返回OK,否则返回400
。
每次调用时记录一行日志,并将tracer焰火详细信息存储在请求中的"_tracer_flare"
下。
/test/session/tracerflares
返回代理收到的给定会话令牌的所有tracer-flares。
[可选] ?test_session_token=
[可选] X-Datadog-Test-Session-Token
以下JSON格式返回tracer-flares
[
{
"source": "...",
"case_id": "...",
"email": "...",
"hostname": "...",
"flare_file": "...",
}
]
flare_file
是tracer-flare有效负载的base64编码内容。
如果解析tracer-flare表单时出现错误,将在error
下记录。
开发
先决条件
需要Python 3.8或更高版本和riot
。建议创建并使用虚拟环境。
python3.12 -m venv .venv
source .venv/bin/activate
pip install -e '.[testing]'
运行测试
要运行测试(在Python 3.12中)
riot run -p3.12 test
注意:如果需要在测试集中(重新)生成快照,请设置环境变量GENERATE_SNAPSHOTS=1
。
GENERATE_SNAPSHOTS=1 riot run --pass-env -p3.12 test -k test_trace_missing_received
代码风格和格式化
要检查代码风格、格式和类型
riot run -s flake8
riot run -s fmt
riot run -s mypy
Docker
构建(并标记)Dockerfile
docker build --tag testagent .
运行标记的镜像
docker run --rm -v ${PWD}/snaps:/snapshots --publish 8126:8126 agent
发行说明
本项目遵循semver
,因此必须为错误修复、重大更改、新功能等编写发行说明。要生成发行说明
riot run reno new <short-description-of-change>
在生成的文件中记录更改,删除不相关的部分,并与更改一起提交发行说明。
发布
- 检出
master
分支并确保其是最新的。
git checkout master && git pull
- 生成发行说明并使用
pandoc
格式化它们以供Github使用
riot run -s reno report --no-show-source | pandoc -f rst -t gfm --wrap=none
将输出复制到新发行版:https://github.com/DataDog/dd-apm-test-agent/releases/new。
- 输入发布标签(遵循
semver
)(例如,v1.1.3
、v1.0.3
、v1.2.0
)。 - 使用不带
v
的标签作为标题。 - 将发布保存为草稿并将链接传递给其他人进行快速审查。
- 如果一切正常,请点击发布
项目详情
ddapm-test-agent-1.18.0.tar.gz 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | da141ea207c73839edb92e0c06171104aaa70b6fa651244d977c8eb898ed7ee1 |
|
MD5 | dabebe4557f6f36b9952b519f67171d5 |
|
BLAKE2b-256 | 890f79dcb62c3f4519acf6eb283568d12101fcd2c68f543d92a2307045944fe6 |
ddapm_test_agent-1.18.0-py3-none-any.whl 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | d95a723e0908148f6d4588f826535de01293dfff8766b0001be4c09bf24702a4 |
|
MD5 | 615d49de15118a084fe0ba997f1091d7 |
|
BLAKE2b-256 | 201f08ee0d9cd0565289ffb078a45ab4fc4e2f28fb785d4e61a6727b4500d961 |