mirror of
https://github.com/simonw/datasette.git
synced 2026-09-26 11:54:07 +02:00
A survey of five plugin OTel plans (datasette-paper, -agent, -litestream,
-accounts, -cron) found every one hand-copying the same core machinery:
the registry classes, the conformance-test harness, the pytest fixtures,
the bucket boundaries and the detached-root-with-Link recipe. This makes
that machinery importable instead:
- The registry classes are documented public API. Attribute gains
values= (a closed enum the conformance helpers enforce - what makes an
attribute safe as a metric dimension); SpanName gains prefix=True for
span families like "chat {model}" whose names share a fixed prefix,
matched by span_for() after exact names. span_for()/attribute helpers
accept a spans= tuple so plugin registries can use them.
- datasette.telemetry.linked_root_span_kwargs(): the root-span-with-Link
shape for work a request caused without containing - background jobs,
scheduled ticks, block=False writes. Core's own write thread now uses
it instead of building the kwargs inline.
- datasette.telemetry_testing: the session provider fixtures, otel_spans
/ otel_metrics, a two-way registry conformance checker (including enum
and prefix handling, filtered by instrumentation scope) and an
assert_package_never_imports_sdk() guard. Core's conftest now imports
these instead of defining them, so the suite consumes the kit exactly
as a plugin's would.
- New "Telemetry for plugin authors" docs page: scope discipline,
registry usage, privacy/cardinality rules, named-callable guidance,
request_span(), the background root-with-link convention (one root per
tick, always emitted), provider-ordering facts and known caveats.
request_span() is now documented public API.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012U7coQfVu8nK2R4q2mCULA
|
||
|---|---|---|
| .. | ||
| default_permissions | ||
| publish | ||
| static | ||
| templates | ||
| utils | ||
| views | ||
| __init__.py | ||
| __main__.py | ||
| _pytest_plugin.py | ||
| actor_auth_cookie.py | ||
| app.py | ||
| background_tasks.py | ||
| blob_renderer.py | ||
| cli.py | ||
| column_types.py | ||
| csrf.py | ||
| database.py | ||
| default_actions.py | ||
| default_column_types.py | ||
| default_database_actions.py | ||
| default_debug_menu.py | ||
| default_jump_items.py | ||
| default_magic_parameters.py | ||
| default_query_actions.py | ||
| default_table_actions.py | ||
| events.py | ||
| extras.py | ||
| facets.py | ||
| filters.py | ||
| fixtures.py | ||
| forbidden.py | ||
| handle_exception.py | ||
| hookspecs.py | ||
| inspect.py | ||
| jump.py | ||
| permissions.py | ||
| plugins.py | ||
| renderer.py | ||
| resources.py | ||
| sql_functions.py | ||
| stored_queries.py | ||
| telemetry.py | ||
| telemetry_registry.py | ||
| telemetry_testing.py | ||
| template_contexts.py | ||
| tokens.py | ||
| tracer.py | ||
| url_builder.py | ||
| version.py | ||
| write_sql.py | ||