Skip to main content

Shared metrics + dashboard for Demystify services (Python mirror): canonical RED metric names, a prometheus-client registry with RED helpers, a framework-neutral /metrics handler, an offline HTML dashboard, and a span->metrics bridge.

Project description

platform-observability — shared metrics + dashboard

@demystify/platform-observability (TS) · demystify-platform-observability (Py) · v0.2.0 · MIT

What it is / when to use it

The single source of truth for RED metrics across all six Demystify services. Canonical dmstfy_* metric names, a metrics registry with RED helpers, a framework-neutral /metrics handler, an offline HTML dashboard, and a bridge that turns a module's existing span instrumentation into duration metrics for free.

Leaf package: depends only on prom-client (TS) / prometheus-client (Py). Zero dependency on any module. Keyless, offline, deterministic.

Install standalone

pnpm add @demystify/platform-observability        # TS
uv add demystify-platform-observability           # Py

Canonical metric names

Defined once, shared by both languages (METRIC_NAMES / fixture-locked):

name type labels
dmstfy_http_requests_total counter method, route, status, tenant
dmstfy_http_request_duration_seconds histogram method, route, status, tenant
dmstfy_provider_calls_total counter provider, model, status
dmstfy_provider_call_duration_seconds histogram provider, model, status
dmstfy_provider_cost_micro_usd_total counter provider, model
dmstfy_queue_depth gauge queue
dmstfy_span_duration_seconds histogram span, module

Durations are seconds; cost is integer µUSD (CONVENTIONS.md §2). Buckets: [0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1, 2.5, 5, 10].

SDK usage

import {
  createMetrics, mountMetricsHono, renderDashboardHtml, spanExporterToMetrics,
} from "@demystify/platform-observability";

const metrics = createMetrics();
metrics.httpRequest("GET", "/v1/chat", 200, tenantId, 12.4);         // RED helper
metrics.providerCall("openai", "gpt-4o", "ok", 210, 1500);          // count+dur+cost
metrics.queueDepth("gateway", 7);

mountMetricsHono(app, metrics);                    // GET /metrics (Prometheus text)
setSpanExporter(spanExporterToMetrics(metrics));   // spans -> duration histogram
const html = renderDashboardHtml(metrics.snapshot());
from demystify_platform_observability import (
    create_metrics, mount_metrics_fastapi, render_dashboard_html, span_exporter_to_metrics,
)

metrics = create_metrics()
metrics.http_request("GET", "/v1/chat", 200, tenant_id, 12.4)
metrics.provider_call("openai", "gpt-4o", "ok", 210, 1500)
metrics.queue_depth("gateway", 7)

mount_metrics_fastapi(app, metrics)                 # GET /metrics
set_span_exporter(span_exporter_to_metrics(metrics))
html = render_dashboard_html(metrics.snapshot())

Mounting /metrics

  • Hono: mountMetricsHono(app, metrics, "/metrics").
  • FastAPI: mount_metrics_fastapi(app, metrics, "/metrics").
  • Anything else: metricsHandler(metrics) / metrics_handler(metrics) returns {status, contentType, body} — wire it to your framework.

Span → metrics bridge

spanExporterToMetrics(metrics) returns an object matching the Wave-7 SpanExporter shape (export(span) in TS; a Callable[[Span], None] in Py). Pass it to a module's setSpanExporter(...) / set_span_exporter(...) and every finished span becomes an observation on dmstfy_span_duration_seconds. Off by default (no exporter registered = zero cost), exactly like §14.3.

Architecture & ports/adapters

seam implementation notes
metric store private prom-client / prometheus-client registry per Metrics isolated; no global default registry
snapshot deterministic in-memory tally ordering-stable; powers dashboard + parity
exposition metricsText() / metrics_text() Prometheus v0.0.4 text

Testing

make -C packages/platform-observability setup lint test build. Unit tests only (offline). Parity: TS and Py replay the same fixtures/snapshot.json and must produce byte-identical snapshots; metric names locked to fixtures/metric-names.json.

v1 scope

RED + cost + queue-depth + span-duration. No exemplars, no push-gateway, no histogram-quantile helpers (scrape + PromQL do that). Real Prometheus scrape is the standard opt-in path; nothing here requires it to run.

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

demystify_platform_observability-0.2.0.tar.gz (66.5 kB view details)

Uploaded Source

Built Distribution

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

File details

Details for the file demystify_platform_observability-0.2.0.tar.gz.

File metadata

File hashes

Hashes for demystify_platform_observability-0.2.0.tar.gz
Algorithm Hash digest
SHA256 f3118e479ba07dd5e676104cb8bd83ac3c8a4571388b6bc532202ea861661797
MD5 a0d112874f26f7e4f0243646fa6a64aa
BLAKE2b-256 b3325ac612a59ee4eb872934d786de42fa3606103d1182c4f3a242ea68f13952

See more details on using hashes here.

Provenance

The following attestation bundles were made for demystify_platform_observability-0.2.0.tar.gz:

Publisher: publish-pypi.yml on demystify-systems/ai-services-tools

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file demystify_platform_observability-0.2.0-py3-none-any.whl.

File metadata

File hashes

Hashes for demystify_platform_observability-0.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 f08ba8cb9c0e7e5ca64cee5ebd85dbd48767c35210ab365697f9ab1a6a2bb48a
MD5 50e0ef6a285fa3dc263a96c0e9d2b94b
BLAKE2b-256 df0379bcc27ee466b0449798e989a362c40df00941950005a6a0f5744bc884d6

See more details on using hashes here.

Provenance

The following attestation bundles were made for demystify_platform_observability-0.2.0-py3-none-any.whl:

Publisher: publish-pypi.yml on demystify-systems/ai-services-tools

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

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