Skip to main content

openadapt-telemetry

License: MIT Python 3.10+

Unified telemetry and error tracking for OpenAdapt packages.

Features

  • Unified Error Tracking: Consistent error reporting across all OpenAdapt packages
  • Usage Counters (PostHog): Lightweight product usage events for adoption metrics
  • Privacy-First Design: Automatic PII scrubbing and path sanitization
  • Configurable Opt-Out: Respects DO_NOT_TRACK and custom environment variables
  • Internal Usage Tagging: Explicit flags + CI detection with optional git heuristic
  • GlitchTip/Sentry Compatible: Uses the Sentry SDK for maximum compatibility
  • Failure recurrence without customer evidence: Closed categorical failure signatures omit application, tenant, workflow, step, text, input, screenshot, origin, and exception details

Installation

pip install openadapt-telemetry

Or with development dependencies:

pip install openadapt-telemetry[dev]

Quick Start

Initialize Telemetry

from openadapt_telemetry import get_telemetry

# Initialize once at package startup
get_telemetry().initialize(
    dsn="https://xxx@app.glitchtip.com/XXXX",
    package_name="openadapt-mypackage",
    package_version="0.1.0",
)

Capture Exceptions

from openadapt_telemetry import get_telemetry

try:
    risky_operation()
except Exception as e:
    get_telemetry().capture_exception(e)
    raise

Capture Usage Events (PostHog)

from openadapt_telemetry import capture_usage_event

capture_usage_event(
    "agent_run",
    properties={"entrypoint": "oa evals run", "mode": "live"},
    package_name="openadapt-evals",
)

Capture an automation failure safely

Use the closed-schema failure API rather than sending an exception message or run report as analytics. Its grouping key is derived only from categorical runtime facts; it is not an installation or tenant identifier.

from openadapt_telemetry import (
    ActionKind, AutomationFailureSignal, DeliveryState, ExecutionOutcome,
    FailureKind, RiskClass, Substrate, capture_automation_failure,
)

capture_automation_failure(AutomationFailureSignal(
    failure_kind=FailureKind.DELIVERY_UNCERTAIN,
    substrate=Substrate.CITRIX,
    action_kind=ActionKind.CLICK,
    risk_class=RiskClass.CONSEQUENTIAL,
    delivery_state=DeliveryState.UNCERTAIN,
    outcome=ExecutionOutcome.HALTED,
))

This signal supports aggregate discovery only. Full evidence remains local, and no signal can authorize or promote a repair.

Using Decorators

from openadapt_telemetry import track_errors, track_performance, track_feature

@track_errors()
def process_data(data):
    """Exceptions are automatically captured."""
    return transform(data)

@track_performance("indexing.build_faiss")
def build_index(vectors):
    """Execution time is automatically tracked."""
    return create_index(vectors)

@track_feature("retrieval.add_demo")
def add_demo(demo_id, task):
    """Feature usage is tracked for analytics."""
    save_demo(demo_id, task)

Span Context Manager

from openadapt_telemetry import TelemetrySpan

with TelemetrySpan("indexing", "build_faiss_index") as span:
    span.set_tag("num_vectors", 1000)
    # ... indexing operations ...

Configuration

Environment Variables

Variable Default Description
DO_NOT_TRACK - Universal opt-out (1 = disabled)
OPENADAPT_TELEMETRY_ENABLED true Enable/disable telemetry
OPENADAPT_INTERNAL false Tag as internal usage
OPENADAPT_DEV false Development mode
OPENADAPT_INTERNAL_FROM_GIT false Optional: tag as internal when running from a git checkout
OPENADAPT_TELEMETRY_DSN - GlitchTip/Sentry DSN
OPENADAPT_POSTHOG_PROJECT_API_KEY embedded default PostHog ingestion project token (phc_...)
OPENADAPT_POSTHOG_HOST https://us.i.posthog.com PostHog ingestion host
OPENADAPT_TELEMETRY_DISTINCT_ID generated UUID Stable anonymous identifier override
OPENADAPT_TELEMETRY_TIMEOUT_SECONDS 1.0 PostHog network timeout
OPENADAPT_TELEMETRY_IN_CI false Enable usage events in CI pipelines
OPENADAPT_TELEMETRY_ENVIRONMENT production Environment name
OPENADAPT_TELEMETRY_SAMPLE_RATE 1.0 Error sampling rate (0.0-1.0)
OPENADAPT_TELEMETRY_TRACES_SAMPLE_RATE 0.01 Performance sampling rate
OPENADAPT_TELEMETRY_ANON_SALT generated Optional anonymization salt override (advanced use only)

Configuration File

Create ~/.config/openadapt/telemetry.json:

{
  "enabled": true,
  "internal": false,
  "dsn": "https://xxx@app.glitchtip.com/XXXX",
  "environment": "production",
  "sample_rate": 1.0,
  "traces_sample_rate": 0.01
}

Priority Order

  1. Environment variables (highest priority)
  2. Configuration file
  3. Package defaults (lowest priority)

Opt-Out

To disable telemetry, set either:

# Universal standard
export DO_NOT_TRACK=1

# Or package-specific
export OPENADAPT_TELEMETRY_ENABLED=false

Privacy

What We Collect

Category Data Purpose
Errors Exception type, stack trace Bug fixing
Performance Function timing Optimization
Feature Usage Feature names, counts Prioritization
Environment OS, Python version Compatibility

What We Never Collect

  • Screenshots or images
  • Text content or file contents
  • Personal information (names, emails, IPs)
  • API keys or passwords
  • Full file paths with usernames

Automatic Scrubbing

  • File paths have usernames replaced with <user>
  • Sensitive fields (password, token, api_key, etc.) are redacted
  • Email addresses and phone numbers are scrubbed from messages
  • Top-level event messages/logentry strings are scrubbed
  • Tag keys are validated, sensitive/invalid keys are dropped, and values are scrubbed before upload
  • User IDs are HMAC-anonymized before upload (anon:v2:<hash>)
  • send_default_pii is enforced to false by the client
  • PostHog events set $geoip_disable: true to suppress IP geolocation enrichment

Internal Usage Tagging

Internal/developer usage is automatically detected via:

  1. OPENADAPT_INTERNAL=true environment variable
  2. OPENADAPT_DEV=true environment variable
  3. CI environment detected (GitHub Actions, GitLab CI, etc.)
  4. Optional git repository heuristic when OPENADAPT_INTERNAL_FROM_GIT=true

Filter in GlitchTip:

tag:internal IS false  # External users only
tag:internal IS true   # Internal users only

Development

# Clone and install
git clone https://github.com/OpenAdaptAI/openadapt-telemetry
cd openadapt-telemetry
pip install -e ".[dev]"

# Run tests
pytest tests/ -v

# Run with coverage
pytest tests/ --cov=openadapt_telemetry

License

MIT License - see LICENSE for details.

Links

Metadata

Release files for openadapt-telemetry 0.3.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for openadapt-telemetry 0.3.1
File Size Uploaded
openadapt_telemetry-0.3.1.tar.gz 37.5 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for openadapt-telemetry 0.3.1
File Interpreter ABI Platform
openadapt_telemetry-0.3.1-py3-none-any.whl Python 3 none any Details

Total release size: 65.2 kB

Release files / openadapt_telemetry-0.3.1.tar.gz

Download URL openadapt_telemetry-0.3.1.tar.gz
Size 37.5 kB
Tags Source
SHA-256 checksum
How to use checksums
b318f8e02ee8dcacef0ffa99a9f6d282610ea25196e75952a1f0774c9d7c3c29
BLAKE2b-256 checksum
How to use checksums
f86890e40df2ec363178cb4c7d868fed6829d889d53a8c46c5fe9ec02d4f5d96
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Jul 27, 2026.

Transparency log

Release files / openadapt_telemetry-0.3.1-py3-none-any.whl

Download URL openadapt_telemetry-0.3.1-py3-none-any.whl
Size 27.7 kB
Tags Python 3
SHA-256 checksum
How to use checksums
e08cddf639357dbcb28865187d51d9c9b71f24000abb44d7dd099d6eedcc4998
BLAKE2b-256 checksum
How to use checksums
286a4a1c6660352914bdba45f7caa27046200cf10070fa7d9542b30c8c81b6a4
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Jul 27, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

0.3.1 This release

2 release files

0.3.0

2 release files

0.2.0

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page