Skip to main content

Pure C lib for python3 (or C if u wanna) to analyze traces check for compliance with the OpenTelemetry standard

Project description

Pure C lib for python3 (or C if u wanna) to analyze traces and check for compliance with the OpenTelemetry standard.

Example:

from otelanalyzer import *
import json

def testTrace(a: Analyzer, t: str):
    tr = Trace()
    tr.traceString = t
    tr.traceId = "1" * 32
    tr.serviceName = "some-name"
    a.analyze_btrace(tr)
    r = a.get_counters('some-name')
    print(json.dumps(r, indent=4))

if __name__ == '__main__':
    t = "[{'spanId': '0000000000000000', 'serviceName': 'some-name', 'traceId': '00000000000000000000000000000000', 'project': 'some-project', 'service': 'some-service'}]"
    a = Analyzer()
    testTrace(a, t)

Result

$ python3 test_lib.py
{
    "UndefTraceStatus": 0,
    "myMissingParent": 0,
    "notmyMissingParent": 0,
    "myNoParentInTrace": 0,
    "notmyNoParentInTrace": 0,
    "myDuplicateSpan": 0,
    "notmyDuplicateSpan": 0,
    "myBadSpanIdSize": 0,
    "notmyBadSpanIdSize": 0,
    "myBadTraceIdSize": 0,
    "notmyBadTraceIdSize": 0,
    "myExamples": [],
    "notmyExamples": [],
    "badTraceCount": 0,
    "mySpanCount": 1,
    "traceCount": 1
}
$ valgrind --tool=memcheck --leak-check=full python3 test_lib.py

==374573== HEAP SUMMARY:

==374573==     in use at exit: 397,058 bytes in 11 blocks
==374573==   total heap usage: 3,462 allocs, 3,451 frees, 4,881,009 bytes allocated
==374573==
==374573== LEAK SUMMARY:
==374573==    definitely lost: 0 bytes in 0 blocks
==374573==    indirectly lost: 0 bytes in 0 blocks
==374573==      possibly lost: 0 bytes in 0 blocks
==374573==    still reachable: 397,058 bytes in 11 blocks
==374573==         suppressed: 0 bytes in 0 blocks

Plugins

Plugins for this package can add more robust trace analysis and edge case management. They will be called after splitting traces into spans, so you can work more comfortably. The motivation for this feature is to be able to add NDA-protected features without forking the project.

They are called during traceString analyzation. Steps are as follows:

  1. Split traceString into spans, add span statuses, and increase error counters accordingly
  2. Call all plugins
  3. Free the trace object for optimization reasons

C plugins

You can add your C analysis plugins in the src/plugin_manager.c file. Their source files should be placed in the src/plugins/ folder. A plugin should have a function with Analyzer* and Trace* parameters and should return void. There is an example plugin in src/plugins/example_plugin.*

You are strongly encouraged to write your plugins with header files, as demonstrated in example_plugin.

Your function will be called after parsing the trace into separate spans. Please keep in mind that trace.traceString will be freed at this point for optimization reasons.

Python plugins

You can add your own Python plugin to modify the existing behavior of the analyzer. To do this, create a function that takes dict[str, Counter] and Trace as input parameters. Then, pass a pointer (just the function's name without brackets or parameters) to Analyzer.plg_manager.add_plugin(your_func). Plugins will be executed in a first-in, first-out order.

Your function's behaviour is not restricted in any way except for input-output types: feel free to call your custom classes, write raw data right into DB and whatever.

dict[str, Counter] contains service names as keys and their corresponding ErrorCounter values. Only services that appear at least once in the trace spans are included.

Trace is the current trace object being analyzed. See the plugin execution steps for reference.

IF YOU WANT TO MODIFY the Counter value corresponding to your service, YOU MUST return the updated dict[str, Counter] object. Keep in mind that the Trace object is read-only, so your changes will not be applied directly.

If you want to modify the examples property of a counter, YOU MUST also update ExamplesCount, or your changes will not take effect.

Plugin example:

def example_plugin(d: dict[str, Counter], t: Trace):
    d["some-name"].mySpanCount = 9999999
    d["some-name"].myBadTraceExamples.append("pipa")
    d["some-name"].myExamplesCount += 1
    return d

def test_plugin(a: Analyzer, t: str):
    a.plg_manager.add_plugin(lambda_func)

Installation

$ pip install otelanalyzer

or

$ python3 setup.py build_ext --inplace && mv ./otelanalyzer.so ./otelanalyzer

Dependencies

The package has no dependencies.

Planned features

  • Python unit tests
  • Wheels for Python 3.13 (you can already build it locally, check installation)

Project details


Download files

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

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

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

otelanalyzer-1.0.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (78.8 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ x86-64

otelanalyzer-1.0.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (77.1 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ x86-64

otelanalyzer-1.0.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (75.7 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ x86-64

File details

Details for the file otelanalyzer-1.0.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for otelanalyzer-1.0.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 8bd947e37f7505a68adef847e58fe4a0c9150ca39e80301da5b809e9191dea4a
MD5 9200df8510d1765d650257f1a26438c9
BLAKE2b-256 5278b23568d010aed77ce0cb2f464e3505fdee2d638341376841f6faaccde6bc

See more details on using hashes here.

File details

Details for the file otelanalyzer-1.0.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for otelanalyzer-1.0.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 9d2610b7c211548c009a3a670f89728f4d77ab490d641c8f210ec7c6391fe890
MD5 3c8501ad71392777b70ed10d98f6eebc
BLAKE2b-256 1783429a093fc741f4fefd25699a0f6d7a4179a7dcbd8fc32b9a9d210f57f6f4

See more details on using hashes here.

File details

Details for the file otelanalyzer-1.0.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for otelanalyzer-1.0.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 0acd55b92b5a9d669e1d8b6f0e3ce686fe11644c426aa5fb89396afb0cfe682b
MD5 e479e0505c6e75f9e36302b45a5000f0
BLAKE2b-256 abf44859f1ed9fae552ba559d26ef745e0737ce4d4694d6a975dfc75cd6ab8e2

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