Skip to main content

A library for instrumenting Python code at runtime.

Project description

Diagnose

A library for instrumenting Python code at runtime.

Probes

Structured logs and metrics and observability are great, but almost always require you to alter your code, which interrupts the flow when reading code. It also typically requires a build cycle to alter; it's no fun making a ticket, getting review, waiting for a build and deploy, and then doing it all again to back out your temporary additions. This is doubly true when doing research, where you might perform a dozen small experiments to measure your live code.

This library allows you to dynamically add probes at runtime instead. Probes are:

  • reliable: errors will never affect your production code
  • ephemeral: set a "lifespan" (in minutes) for each instrument
  • comprehensive: all references to the target function are instrumented
  • fast: measure most functions with fast local lookups; uses hunter (in Cython) for more invasive internal probes.

Individual probes can be created directly by calling attach_to(target):

>>> from path.to.module import myclass
>>> myclass().add13(arg=5)
18
>>> p = diagnose.probes.attach_to("path.to.module.myclass.add13")
>>> p.instruments["foo"] = diagnose.LogInstrument("foo", "arg")
>>> p.start()
>>> myclass().add13(arg=5)
Probe (foo) = 5
18

Instruments aren't limited to recording devices! Use probes to fire off any kind of event handler. Instruments are free to maintain state themselves, or read it from somewhere else, to control their own behavior or even implement feedback mechanisms. A truly evil instrument could even alter the args/kwargs passed to a function on the fly, or call arbitrary Python code to do any number of crazy things. Consequently, it's up to you to govern what instruments are added to your environment.

Managers

In a running system, we want to add, remove, start, and stop probes and instruments without having to code at an interactive prompt or restart the system; we do this with an InstrumentManager. Start by configuring the global diagnose.manager:

>>> diagnose.manager.instrument_classes = {
    "log": LogInstrument,
    "hist": MyHistogramInstrument,
    "incr": MyIncrementInstrument,
}
>>> diagnose.manager.global_namespace.update({"foo": foo})

Later, you can define instruments:

>>> diagnose.manager.specs["instr-1"] = {
    "target": "myapp.module.file.class.method",
    "instrument": {
        "type": "log",
        "name": "myapp.method",
        "value": "result",
        "event": "return",
        "custom": {},
    },
    "lifespan": 10,
    "lastmodified": datetime.datetime.utcnow(),
    "applied": {},
}

Then call diagnose.manager.apply(), either when you add an instrument, or on a schedule if your store is in MongoDB and the process defining probes is not the target process.

The applied dictionary will be filled with information about which processes have applied the probe, and whether they encountered any errors.

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

diagnose-2.1.1.tar.gz (13.5 kB view details)

Uploaded Source

Built Distributions

diagnose-2.1.1-py3-none-any.whl (13.3 kB view details)

Uploaded Python 3

diagnose-2.1.1-py2-none-any.whl (14.7 kB view details)

Uploaded Python 2

File details

Details for the file diagnose-2.1.1.tar.gz.

File metadata

  • Download URL: diagnose-2.1.1.tar.gz
  • Upload date:
  • Size: 13.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.13.0 pkginfo/1.4.2 requests/2.18.4 setuptools/41.0.1 requests-toolbelt/0.8.0 tqdm/4.23.4 CPython/2.7.6

File hashes

Hashes for diagnose-2.1.1.tar.gz
Algorithm Hash digest
SHA256 fd0f904e077e61758a398f1ec9c81c62bb870d04811973d52a5c698dd479d615
MD5 c5d431f3eae05784bc640af7cfc1ce88
BLAKE2b-256 9ae827b61a90168128aafc86cc7c53b5076059151e18d8b77e473af1f35505a3

See more details on using hashes here.

File details

Details for the file diagnose-2.1.1-py3-none-any.whl.

File metadata

  • Download URL: diagnose-2.1.1-py3-none-any.whl
  • Upload date:
  • Size: 13.3 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.13.0 pkginfo/1.4.2 requests/2.18.4 setuptools/41.0.1 requests-toolbelt/0.8.0 tqdm/4.23.4 CPython/2.7.6

File hashes

Hashes for diagnose-2.1.1-py3-none-any.whl
Algorithm Hash digest
SHA256 57ff94f15f2463cc5954b6016a5640909ed34a7c5ff5def51946a21ec50accfc
MD5 c2ccbeae658e26ccbef36e82b8ed6624
BLAKE2b-256 cea2d139a4e771d2ba77ff1f46e9f8a7a2ab09a9ff5b089e8b03c92eaf102808

See more details on using hashes here.

File details

Details for the file diagnose-2.1.1-py2-none-any.whl.

File metadata

  • Download URL: diagnose-2.1.1-py2-none-any.whl
  • Upload date:
  • Size: 14.7 kB
  • Tags: Python 2
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.13.0 pkginfo/1.4.2 requests/2.18.4 setuptools/41.0.1 requests-toolbelt/0.8.0 tqdm/4.23.4 CPython/2.7.6

File hashes

Hashes for diagnose-2.1.1-py2-none-any.whl
Algorithm Hash digest
SHA256 a6e592803a27b22f557dd0dcf22bfc1368d8842bd438a2db2cbb044b806527c3
MD5 524019ab089560e3337a24d759a04c98
BLAKE2b-256 dddd45f5ebca2ceb1c768fce9e6e05ba8f50a7bd27bb7aa98399da94a91078ab

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