Skip to main content

Test agent for Datadog APM client libraries

Project description

Datadog APM test agent

GitHub Workflow Status (branch) PyPI

bits agent

The APM test agent is an application which emulates the APM endpoints of the Datadog agent which can be used for testing Datadog APM client libraries.

See the features section for the complete list of functionalities provided.

See the API section for the endpoint available.

See the Development section for how to get the test agent running locally to add additional checks or fix bugs.

Installation

The test agent can be installed from PyPI:

pip install ddapm-test-agent

ddapm-test-agent --port=8126

from Docker:

# Run the test agent and mount the snapshot directory
docker run --rm\
        -p 8126:8126\
        -e CI_MODE=0\
        -v $PWD/tests/snapshots:/snapshots\
        ghcr.io/datadog/dd-apm-test-agent/ddapm-test-agent:latest

or from source:

pip install git+https://github.com/Datadog/dd-apm-test-agent

Features

Trace invariant checks

Many checks are provided by the test agent which will verify trace data. All checks are enabled by default and can be manually disabled.

See the configuration section for the options.

Check description Check name
Trace count header matches number of traces trace_count_header
Client library version header included in request meta_tracer_version_header
Trace content length header matches payload size trace_content_length

Returning data

All data that is submitted to the test agent can be retrieved.

  • Traces can be returned via the /test/traces endpoint documented below.

Helpful logging

The INFO log level of the test agent outputs useful information about the requests the test agent receives. For traces this includes a visual representation of the traces.

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 ----------------------------------------

Proxy

The test agent provides proxying to the Datadog agent. This is enabled by passing the agent url to the test agent either via the --agent-url commandline argument or by the DD_TRACE_AGENT_URL or DD_AGENT_URL environment variables.

When proxying is enabled the response from the Datadog agent will be returned instead of one from the test agent.

Snapshot testing

The test agent provides a form of characterization testing which we refer to as snapshotting. This allows library maintainers to ensure that traces don't change unexpectedly when making unrelated changes.

This can be used to write integration tests by having test cases use the tracer to emit traces which are collected by the test agent and compared against reference traces stored previously.

To do snapshot testing with the test agent:

  1. Ensure traces are associated with a session token (typically the name of the test case) by either:
    • Calling the /test/session/start with the token endpoint before emitting the traces; or
    • Attaching an additional query param or header specifying the session token on /vX.Y/trace requests (see below for the API specifics). (Required for concurrent test running)
  2. Emit traces (run the integration test).
  3. Signal the end of the session and perform the snapshot comparison by calling the /tests/session/snapshot endpoint with the session token. The endpoint will return a 400 response code if the snapshot failed along with a plain-text trace of the error which can be forwarded to the test framework to help triage the issue.

Snapshot output

The traces are normalized and output in JSON to a file. The following transformations are made to the input:

  • Trace ids are overwritten to match the order in which the traces were received.
  • Span ids are overwritten to be the DFS order of the spans in the trace tree.
  • Span attributes are ordered to be more human-readable, with the important attributes being listed first.
  • Span attributes are otherwise ordered alphanumerically.
  • The span meta and metrics maps if empty are excluded.

Configuration

The test agent can be configured via command-line options or via environment variables.

Command line

ddapm-test-agent

ddapm-test-agent is command used to run a test agent.

Please refer to ddapm-test-agent --help for more information.

ddapm-test-agent-fmt

ddapm-test-agent-fmt is a command line tool to format or lint snapshot json files.

# Format all snapshot json files
ddapm-test-agent-fmt path/to/snapshots

# Lint snapshot json files
ddapm-test-agent-fmt --check path/to/snapshots

Please refer to ddapm-test-agent-fmt --help for more information.

Environment Variables

  • PORT [8126]: Port to listen on.

  • DISABLED_CHECKS [""]: Comma-separated values of checks to disable.

  • LOG_LEVEL ["INFO"]: Log level to use. DEBUG, INFO, WARNING, ERROR, CRITICAL.

  • LOG_SPAN_FMT ["[{name}]"]: Format string to use when outputting spans in logs.

  • SNAPSHOT_DIR ["./snapshots"]: Directory in which snapshots will be stored. Can be overridden by providing the dir query param on /snapshot.

  • SNAPSHOT_CI [0]: Toggles CI mode for the snapshot tests. Set to 1 to enable. CI mode does the following:

    • When snapshots are unexpectedly generated from a test case a failure will be raised.
  • SNAPSHOT_IGNORED_ATTRS ["span_id,trace_id,parent_id,duration,start,metrics.system.pid,meta.runtime-id"]: The attributes to ignore when comparing spans in snapshots.

  • DD_AGENT_URL [""]: URL to a Datadog agent. When provided requests will be proxied to the agent.

API

/test/traces

Return traces that have been received by the agent. Traces matching specific trace ids can be requested with the options below.

[optional] ?trace_ids=

[optional] X-Datadog-Trace-Ids

Specify trace ids as comma separated values (eg. 12345,7890,2468)

/test/session/start

Initiate a synchronous session. All subsequent traces received will be associated with the required test token provided.

[optional] ?test_session_token=

[optional] X-Datadog-Test-Session-Token

Test session token for a test case. Ensure this value is unique to avoid conflicts between sessions.

/test/session/snapshot

[optional*] ?test_session_token=

[optional*] X-Datadog-Test-Session-Token

To run test cases in parallel this HTTP header must be specified. All test cases sharing a test token will be grouped.

* Required for concurrent tests. Either via query param or HTTP header.

[optional] ?ignores=

Comma-separated list of keys of which to ignore values for.

The default built-in ignore list is: span_id, trace_id, parent_id, duration, start, metrics.system.pid, meta.runtime-id.

[optional] ?dir=

default: ./snapshots (relative to where the test agent is run).

Override the directory where the snapshot will be stored and retrieved from. This directory must already exist.

This value will override the environment variable SNAPSHOT_DIR.

Warning: it is an error to specify both dir and file.

[optional] ?file=

An absolute or relative (to the current working directory of the agent) file name where the snap will be stored and retrieved.

Warning: it is an error to specify both file and dir.

/test/session/traces

Return traces that have been received by the agent for the given session token.

[optional] ?test_session_token=

[optional] X-Datadog-Test-Session-Token

Development

Prerequisites

A Python version of 3.8 or above and riot are required. It is recommended to create and work out of a virtualenv:

virtualenv --python=3.8 .venv
source .venv/bin/activate
pip install riot

Running the tests

To run the tests (in Python 3.8):

riot run -p3.8 test

Linting and formatting

To lint, format and type-check the code:

riot run -s flake8
riot run -s fmt
riot run -s mypy

Docker

To build (and tag) the dockerfile:

docker build --tag testagent .

Run the tagged image:

docker run --rm -v ${PWD}/snaps:/snapshots --publish 8126:8126 agent

Release notes

This project follows semver and so bug fixes, breaking changes, new features, etc must be accompanied by a release note. To generate a release note:

riot run reno new <short-description-of-change>

document the changes in the generated file, remove the irrelevant sections and commit the release note with the change.

Releasing

  1. Generate the release notes and use pandoc to format them for Github:
    riot run -s reno report --no-show-source | pandoc -f rst -t gfm --wrap=none

Copy the output into a new release: https://github.com/DataDog/dd-apm-test-agent/releases/new.

  1. Enter a tag for the release (following semver) (eg. v1.1.3, v1.0.3, v1.2.0).
  2. Use the tag without the v as the title.
  3. Save the release as a draft and pass the link to someone else to give a quick review.
  4. If all looks good hit publish

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

ddapm-test-agent-1.2.0.tar.gz (39.6 kB view details)

Uploaded Source

Built Distribution

ddapm_test_agent-1.2.0-py3-none-any.whl (26.5 kB view details)

Uploaded Python 3

File details

Details for the file ddapm-test-agent-1.2.0.tar.gz.

File metadata

  • Download URL: ddapm-test-agent-1.2.0.tar.gz
  • Upload date:
  • Size: 39.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.7.1 importlib_metadata/4.10.1 pkginfo/1.8.2 requests/2.27.1 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.9.10

File hashes

Hashes for ddapm-test-agent-1.2.0.tar.gz
Algorithm Hash digest
SHA256 b46e084f78fb07476cd0401dbfa1f0738ed7306dfd2aec897e73131666b75720
MD5 6730b566f1f57e6536eeef2af16f3bb9
BLAKE2b-256 df5904a63fdd326d67cd3132448adecb48bf340876552c8f2aa39287d64e34c2

See more details on using hashes here.

File details

Details for the file ddapm_test_agent-1.2.0-py3-none-any.whl.

File metadata

  • Download URL: ddapm_test_agent-1.2.0-py3-none-any.whl
  • Upload date:
  • Size: 26.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.7.1 importlib_metadata/4.10.1 pkginfo/1.8.2 requests/2.27.1 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.9.10

File hashes

Hashes for ddapm_test_agent-1.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 1e0d7457fd8990c419d719acddc9c0f2d5e3090593e23b3e45f093b8a3c625c2
MD5 4e4e60b01f04c6813226661bc643219e
BLAKE2b-256 015a55dc74a9d1bbdf4abd272f26d547e19a50009644ba29242d1284b8b6b8ac

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page