Skip to main content

A pytest plugin in order to provide logs via fluentbit

Project description

pytest-fluent

Documentation Build Status PyPI Versions PyPI - Downloads PyPI Status PyPI License

A Python package in order to extend pytest by fluentd logging

Description

Pytest is one of the most powerful testing suites with a lot of functionality and many plugins. Fluentd is a well-established log collector which is used in many modern web architectures. So, why not putting both worlds together in order to gain real-time log access to your distributed test runs.

pytest-fluent enables you to forward your test data immediately to your prefered log-sink from any node spread around your infrastructure. The streamed data are available for each pytest stage and formatted in JSON.

Each pytest session gets an unique identifier (UID) assigned as well as each executed test case. With these UIDs, you can filter easily for sessions and testcase data entries, for instance in your favorite database.

Installation

The package is available at pypi.org and can be installed by typing

pip install pytest-fluentbit

Usage

pytest-fluent-logging forwards meta data from pytest to Fluentd for further processing. The meta data are

  • unique session ID
  • unique test ID
  • status of the session respectively test case
  • test case name
  • test results
  • record_property entries
  • custom testcase information
  • custom session information

Furthermore, the Python logging instance can be extended in order to forward test case runtime logging.

from logging import getLogger

def test_my_runtime_log():
    value = 1
    getLogger().info(f"Setting value to {value}")
    assert value == 1

or

from logging import getLogger

def test_my_runtime_log():
    value = 1
    getLogger('fluent').info(f"Setting value to {value}")
    assert value == 1

Fixtures

In order to create your own logger, request the following fixture

def test_my_runtime_log(get_logger):
    logger = get_logger('my.Logger')
    value = 1
    logger.info(f"Setting value to {value}")
    assert value == 1

If you want to get the current UIDs, use the following fixtures

def test_unique_identifier(session_uid, test_uid):
    logger = get_logger('fluent')
    logger.info(f"Session ID: {session_uid}")
    logger.info(f"Test ID: {test_uid}")
    value = 1
    assert value == 1

Callbacks

If you want to add custom data to the datasets of the pytest_sessionstart and pytest_runtest_logstart stages, decorate your callback functions with the following decorators.

from pytest_fluentbit import (
    additional_session_information_callback,
    additional_test_information_callback
)

@additional_session_information_callback
def provide_more_session_information() -> dict:
    return {
        "more": "session information"
    }

@additional_test_information_callback
def provide_more_test_information() -> dict:
    return {
        "more": "test information"
    }

pytest CLI extensions

The pytest CLI can be called with the following arguments in order to configure fluent-logging.

argument description default
--session-uuid Use a custom externally created UUID, e.g. link a CI job with the pytest session.
--fluentd-host Fluentd host address. If not provided, a local Fluentd instance will be called.
--fluentd-port Fluent host port 24224
--fluentd-tag Set a custom Fluentd tag 'test'
--fluentd-label Set a custom Fluentd label 'pytest'
--extend-logging Extend the Python logging with a Fluent handler False
--add-docstrings Add test docstrings to testcase call messages

Ini Configuration Support

Default values of the CLI arguments for a project could also be defined in one of the following ini configuration files:

  1. pytest.ini: Arguments are defined under pytest section in the file. This file takes precedence over all other configuration files even if empty.
[pytest]
addopts= --session-uuid="ac2f7600-a079-46cf-a7e0-6408b166364c" --fluentd-port=24224  --fluentd-host=localhost --fluentd-tag='dummytest' --fluentd-label='pytest' --extend-logging
  1. pyproject.toml: are considered for configuration when they contain a tool.pytest.ini_options section is available
[tool.pytest.ini_options]
addopts="--fluentd-port=24224 --fluentd-host=localhost --fluentd-tag='test' --fluentd-label='pytest' --extend-logging"
  1. tox.ini: can also be used to hold pytest configuration if they have a [pytest] section.
[pytest]
addopts= --fluentd-port=24224 --fluentd-host=localhost --fluentd-tag='test' --fluentd-label='pytest'

If the same option is specified in both CLI and ini file, then CLI option would have higher priority and override the ini file values.

What data are sent?

pytest-fluent sends any information, e.g. stage information or logging from a test case, as a single chunk. For instance, the data collection from test_addoptions.py test looks as following

[
    {
        "status": "start",
        "stage": "session",
        "sessionId": "d8f01de3-8416-4801-9406-0ea3d5cfe3c0"
    },
    {
        "status": "start",
        "stage": "testcase",
        "sessionId": "d8f01de3-8416-4801-9406-0ea3d5cfe3c0",
        "testId": "6b444275-4450-4eff-b5d9-8355f0f99ab0",
        "name": "test_fluentd_logged_parameters.py::test_base"
    },
    {
        "type": "logging",
        "host": "myComputer",
        "where": "test_fluentd_logged_parameters.test_base",
        "level": "INFO",
        "stack_trace": "None",
        "message": "Logged from test_base",
        "sessionId": "d8f01de3-8416-4801-9406-0ea3d5cfe3c0",
        "testId": "6b444275-4450-4eff-b5d9-8355f0f99ab0",
        "stage": "testcase"
    },
    {
        "type": "logging",
        "host": "myComputer",
        "where": "test_fluentd_logged_parameters.test_base",
        "level": "INFO",
        "stack_trace": "None",
        "message": "Logged from test_base",
        "sessionId": "d8f01de3-8416-4801-9406-0ea3d5cfe3c0",
        "testId": "6b444275-4450-4eff-b5d9-8355f0f99ab0",
        "stage": "testcase"
    },
    {
        "name": "test_fluentd_logged_parameters.py::test_base",
        "outcome": "passed",
        "duration": 0.0013457999999999526,
        "markers": {
            "test_base": 1,
            "test_fluentd_logged_parameters.py": 1,
            "test_fluentd_logged_parameters0": 1
        },
        "stage": "testcase",
        "when": "call",
        "sessionId": "d8f01de3-8416-4801-9406-0ea3d5cfe3c0",
        "testId": "6b444275-4450-4eff-b5d9-8355f0f99ab0"
    },
    {
        "status": "finish",
        "stage": "testcase",
        "sessionId": "d8f01de3-8416-4801-9406-0ea3d5cfe3c0",
        "testId": "6b444275-4450-4eff-b5d9-8355f0f99ab0",
        "name": "test_fluentd_logged_parameters.py::test_base"
    },
    {
        "status": "finish",
        "duration": 0.00297708511352539,
        "stage": "session",
        "sessionId": "d8f01de3-8416-4801-9406-0ea3d5cfe3c0"
    }
]

whereat each object in the array is sent independently via Fluentd.

Changelog

The changelog.

Contributing

We welcome any contributions, enhancements, and bug-fixes. Open an issue on Github and submit a pull request.

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

pytest-fluentbit-0.1.5.tar.gz (18.8 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

pytest_fluentbit-0.1.5-py3-none-any.whl (11.1 kB view details)

Uploaded Python 3

File details

Details for the file pytest-fluentbit-0.1.5.tar.gz.

File metadata

  • Download URL: pytest-fluentbit-0.1.5.tar.gz
  • Upload date:
  • Size: 18.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.7.5

File hashes

Hashes for pytest-fluentbit-0.1.5.tar.gz
Algorithm Hash digest
SHA256 cc37856eb035a744f9e9c986b8c4a9806c87520fe7f456040567af001c6152ad
MD5 2382ce3692e4375b5033b5553370a211
BLAKE2b-256 f5311f8a40524275615f11ca5c6c4a6b829898df0272f0a810bf8b77bf3fdfed

See more details on using hashes here.

File details

Details for the file pytest_fluentbit-0.1.5-py3-none-any.whl.

File metadata

File hashes

Hashes for pytest_fluentbit-0.1.5-py3-none-any.whl
Algorithm Hash digest
SHA256 e01ef219b01edc21587eede360e4f630d893d95118adb61f7bf6e8f0a7a577cf
MD5 b977b77a8d6142b3d19bcbe1a0dbaa98
BLAKE2b-256 f05ee9373c8d79c49d88caa3e4592571e4ffcb49efb02f1fdd0134fb33b925c2

See more details on using hashes here.

Supported by

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