Python distributed tracing SDK for JstVerify application mapping
Project description
jstverify-tracing
Python distributed tracing SDK for JstVerify application mapping. Auto-instruments your backend to produce trace spans that connect with the JstVerify JavaScript SDK, giving you a full frontend-to-backend service map.
Installation
pip install jstverify-tracing
With framework extras:
pip install jstverify-tracing[flask]
pip install jstverify-tracing[django]
pip install jstverify-tracing[fastapi]
Quick Start
1. Initialize (once at startup)
import jstverify_tracing
jstverify_tracing.init(
api_key="your-sdk-key",
service_name="my-backend",
)
The endpoint defaults to the production ingestion URL (
https://sdkapi.jstverify.com/v1/tracing/spans). Override for dev environments:jstverify_tracing.init( api_key="your-sdk-key", endpoint="https://sdkapi.dev.jstverify.com/v1/tracing/spans", service_name="my-backend", )
2. Add Framework Middleware
Flask:
from jstverify_tracing.integrations.flask import JstVerifyTracingMiddleware
JstVerifyTracingMiddleware(app)
Django (settings.py):
MIDDLEWARE = [
"jstverify_tracing.integrations.django.JstVerifyTracingMiddleware",
...
]
FastAPI:
from jstverify_tracing.integrations.fastapi import JstVerifyTracingMiddleware
app.add_middleware(JstVerifyTracingMiddleware)
AWS Lambda (API Gateway):
from jstverify_tracing.integrations.awslambda import JstVerifyTracingMiddleware
@JstVerifyTracingMiddleware
def lambda_handler(event, context):
return {"statusCode": 200, "body": "ok"}
Flask / Django on AWS Lambda (via apig_wsgi, Mangum, etc.):
When running a framework app on Lambda, use the framework middleware above for tracing — but you must also call jstverify_tracing.flush() at the end of each invocation. The framework middleware buffers spans for a background flush thread, but Lambda freezes the process between invocations so that thread never runs.
# handler.py (Flask + apig_wsgi example)
from apig_wsgi import make_lambda_handler
from app import app
import jstverify_tracing
_apig_handler = make_lambda_handler(app)
def handler(event, context):
try:
return _apig_handler(event, context)
finally:
jstverify_tracing.flush()
# handler.py (Django + Mangum example)
from mangum import Mangum
from myapp.asgi import application
import jstverify_tracing
_mangum_handler = Mangum(application, lifespan="off")
def handler(event, context):
try:
return _mangum_handler(event, context)
finally:
jstverify_tracing.flush()
Note: The
@JstVerifyTracingMiddlewareLambda decorator (below) handles flushing automatically — this manual flush is only needed when using framework middleware on Lambda.
AWS AppSync Lambda Resolver:
from jstverify_tracing.integrations.appsync import JstVerifyAppSyncMiddleware
@JstVerifyAppSyncMiddleware
def handler(event, context):
return [{"id": "1", "name": "Alice"}]
The AppSync middleware extracts trace context from event["request"]["headers"] and derives the operation name from event["info"]["parentTypeName"] and event["info"]["fieldName"] (e.g. Query.listUsers). Only direct transport mode is supported — relay mode is not available for AppSync since GraphQL responses cannot carry custom HTTP headers.
3. Manual Instrumentation (optional)
from jstverify_tracing import trace, trace_span
@trace("process-payment")
def process_payment(order_id):
...
def handle_order(order_id):
with trace_span("validate-order") as span:
...
span.set_status(200)
with trace_span("charge-card") as span:
...
span.set_http_metadata(method="POST", url="/payments/charge", status_code=201)
4. DynamoDB Tracing
The patch_requests=True option only patches the requests HTTP library. AWS SDK calls via boto3 use urllib3 directly, so DynamoDB, S3, and SQS operations are not auto-traced.
Use the trace_dynamodb() helper to wrap individual DynamoDB operations:
from jstverify_tracing import trace_dynamodb
# Instead of: table.get_item(Key={"UserID": "123"})
result = trace_dynamodb("GetItem", table, Key={"UserID": "123"})
# Works with any DynamoDB operation
result = trace_dynamodb("Query", table, KeyConditionExpression="pk = :pk",
ExpressionAttributeValues={":pk": org_id})
result = trace_dynamodb("PutItem", table, Item={"UserID": "456", "name": "Alice"})
Each call creates a child span with the operation name (e.g. DynamoDB.GetItem) and the table name in metadata.
5. Shutdown
jstverify_tracing.shutdown()
Shutdown is also registered via atexit automatically.
Configuration Options
| Parameter | Type | Default | Description |
|---|---|---|---|
api_key |
str | required | Your JstVerify SDK API key |
endpoint |
str | production URL | Span ingestion endpoint URL (defaults to https://sdkapi.jstverify.com/v1/tracing/spans) |
service_name |
str | required | Service name shown in the service map |
service_type |
str | "http" |
Service type identifier |
transport |
str | "direct" |
"direct" sends spans via HTTP; "relay" encodes spans into response headers |
flush_interval |
float | 5.0 |
Seconds between background flushes |
max_queue_size |
int | 200 |
Max buffered spans (circular buffer) |
max_batch_size |
int | 50 |
Max spans per API request |
debug |
bool | False |
Enable debug logging |
patch_requests |
bool | True |
Auto-patch requests library for outgoing HTTP tracing |
How It Works
Direct Mode (default)
- The middleware reads
X-JstVerify-Trace-IdandX-JstVerify-Parent-Span-Idheaders from incoming requests (injected by the JS SDK). - A root span is created for each request, with nested child spans for
@tracedecorated functions andtrace_spancontext managers. - Outgoing
requestslibrary calls are automatically instrumented — trace headers are injected so downstream services can continue the trace. - Spans are buffered in a thread-safe queue and flushed to the JstVerify API in batches by a background daemon thread.
Relay Mode
For backends without outbound internet access (private VPC, strict firewalls), relay mode encodes spans into the X-JstVerify-Spans response header. The JstVerify JS SDK reads this header and relays the spans to the ingestion API on behalf of the backend.
jstverify_tracing.init(
api_key="your-sdk-key",
service_name="my-backend",
transport="relay", # No endpoint needed
)
How it works:
- Each request collects spans in a per-request buffer (async-safe via
contextvars). - When the response is sent, all spans are base64url-encoded into the
X-JstVerify-Spansheader. - The JS SDK decodes the header and merges the spans into its own flush queue.
Limitations:
- ~20-30 spans per response max due to the 7500-byte header size limit.
- Only works for request-response flows — async background jobs have no response to carry spans.
- Cross-origin requests require the
Access-Control-Expose-Headersheader (set automatically by the middleware).
License
MIT
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file jstverify_tracing-0.10.6.tar.gz.
File metadata
- Download URL: jstverify_tracing-0.10.6.tar.gz
- Upload date:
- Size: 35.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.11
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7269f1feaed1a540fc3cf9c0fe40fdc78c5959ef6a77546d94ef1d2e2b7bfdda
|
|
| MD5 |
31ff19532b9554ae3e8b9b4fc8f777d4
|
|
| BLAKE2b-256 |
6f6c608c8d1e2cafd666338c744a63b0c3153b3a1ec1c61ff0aec4ccf51744a1
|
File details
Details for the file jstverify_tracing-0.10.6-py3-none-any.whl.
File metadata
- Download URL: jstverify_tracing-0.10.6-py3-none-any.whl
- Upload date:
- Size: 32.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.11
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f3eb6cf48cbd831f266a2c10d2bcd9af55f3df580b33caa36e4d6dd3c840ea5e
|
|
| MD5 |
54a150b98878c54708a2eaa5898eb01d
|
|
| BLAKE2b-256 |
dd40d5ea5ecdd4a2f817832a2946c82ccb6e919bd5ed5896f33f69e2cb3e2133
|