Python client library for DevStream logging service
Project description
DevStream Python Client
Python client library for sending logs to DevStream logging service.
For AI coding agents: a machine-readable integration guide is hosted at your DevStream server's
/llms.txt(e.g. https://devstream.fly.dev/llms.txt), covering this client, the raw HTTP API, and the OpenAPI spec.
Installation
pip install devstream-client
Or install from source:
cd client
pip install -e .
Quick Start
Basic Usage
from devstream_client import DevStreamClient
# Initialize client
client = DevStreamClient(
api_key="your-api-key",
app_key="my-app",
deployment_key="production",
base_url="http://localhost:8787" # or your production URL
)
# Send a simple log
client.log("Application started successfully")
# Send a log with tags
client.log_with_tags(
"User logged in",
user_id="12345",
level="info",
ip_address="192.168.1.1"
)
# Attach structured JSON data to a log
client.log(
"Order placed",
tags=[{"name": "level", "value": "info"}],
data={"order_id": 4823, "total": 19.99, "items": ["sku-1", "sku-2"]},
)
# data also works with the keyword-tag helper
client.log_with_tags(
"Order placed",
data={"order_id": 4823, "total": 19.99},
level="info",
)
Batch Sending
Send many messages in a single HTTP request (one bulk insert server-side):
client.log_batch([
{"message": "step 1", "correlation_id": "req-1"},
{"message": "step 2", "tags": [{"name": "level", "value": "info"}]},
{"message": "step 3", "data": {"rows": 42}},
])
Each entry accepts message (required), tags, data, and correlation_id.
Python Logging Integration
import logging
from devstream_client import DevStreamHandler
# Create logger
logger = logging.getLogger("myapp")
logger.setLevel(logging.INFO)
# Add DevStream handler
handler = DevStreamHandler(
api_key="your-api-key",
app_key="my-app",
deployment_key="production",
base_url="http://localhost:8787" # or your production URL
)
logger.addHandler(handler)
# Use standard Python logging
logger.info("Application started")
logger.error("Something went wrong", exc_info=True)
The handler is non-blocking: each record is queued and sent on a background
thread, so logging never blocks the calling thread on the network (important
under async servers like Daphne and in Celery tasks). If the queue fills up
(default 1000 pending records, configurable via queue_size), new records are
dropped rather than blocking. Pending records are flushed on interpreter exit.
For high-volume logging, pass batch=True to coalesce queued records into a
single batch request per drain (uses the server's batch endpoint):
handler = DevStreamHandler(..., batch=True, batch_max=100)
Context tags (correlation id, etc.)
Attach request-scoped context to every log line as a tag, without custom handler
code, using a filter that reads a contextvars.ContextVar:
import contextvars
from devstream_client import ContextVarTagFilter
slack_thread = contextvars.ContextVar("slack_thread", default=None)
handler.addFilter(ContextVarTagFilter(slack_thread, "slack_thread"))
slack_thread.set("T123.456") # set per request/task; appears as a tag on logs
If you use asgi-correlation-id,
there's a ready-made filter (install with pip install devstream-client[asgi]):
from devstream_client import CorrelationIdFilter
handler.addFilter(CorrelationIdFilter()) # adds a "correlation_id" tag
Django Integration
Add to your Django settings:
# settings.py
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'handlers': {
'devstream': {
'class': 'devstream_client.client.DevStreamHandler',
'api_key': 'your-api-key',
'app_key': 'my-django-app',
'deployment_key': os.environ.get('DEPLOYMENT', 'local'),
'base_url': 'http://localhost:8787', # or your production URL
},
},
'loggers': {
'django': {
'handlers': ['devstream'],
'level': 'INFO',
},
'myapp': {
'handlers': ['devstream'],
'level': 'DEBUG',
},
},
}
Configuration
Client Parameters
api_key(required): Your DevStream API keyapp_key(required): Application identifierdeployment_key(required): Deployment environment (e.g., 'local', 'dev', 'staging', 'production')base_url(optional): DevStream service URL (default: http://localhost:8787)timeout(optional): Per-request timeout in seconds (default: 5.0)max_retries(optional): Automatic retries on connection errors and transient 5xx responses (default: 2)
Structured Data
Pass a data dictionary to attach arbitrary JSON to a log message. It is stored
alongside the message and returned by the API and log viewer:
client.log("Payment failed", data={"amount": 50, "currency": "USD", "code": "card_declined"})
Tags
Tags are key-value pairs that help you filter and search logs. You can add tags in two ways:
- As a list of dictionaries:
client.log("User action", tags=[
{"name": "user_id", "value": "12345"},
{"name": "action", "value": "login"}
])
- As keyword arguments:
client.log_with_tags(
"User action",
user_id="12345",
action="login"
)
Features
- Simple API for sending logs
- Integration with Python's standard logging module
- Support for custom tags
- Automatic retry and error handling
- Django-ready configuration
License
MIT License
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
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 devstream_client-0.3.0.tar.gz.
File metadata
- Download URL: devstream_client-0.3.0.tar.gz
- Upload date:
- Size: 8.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.11
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
241e038fc3e67d0f987f594b22c21ec53abd44cb2513e3f15622fcf459dde980
|
|
| MD5 |
87479530308c14aedfc0aaf6ef922968
|
|
| BLAKE2b-256 |
311437a2cc28499e0478922c141577ed91a8a8ea0912cdaebbe06e188fdae7b6
|
File details
Details for the file devstream_client-0.3.0-py3-none-any.whl.
File metadata
- Download URL: devstream_client-0.3.0-py3-none-any.whl
- Upload date:
- Size: 8.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.11
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
fb3557c99b7d7e727cea1ffa3957dc82e232df66ac8e7541c803f9c08573f222
|
|
| MD5 |
794ba69f852db101713cf598fc213583
|
|
| BLAKE2b-256 |
d88bf521755c77eeb66b3314f327b3e0d8a70999b81365a3ac41842654709651
|