# Changelog of OTel Instrumentation Coverage Auditor (`michiganpublictech/otel-coverage-auditor`) Actor

- **URL**: https://apify.com/michiganpublictech/otel-coverage-auditor/changelog.md
- **Full Actor documentation**: https://apify.com/michiganpublictech/otel-coverage-auditor.md

## Changelog — OTel Instrumentation Coverage Auditor

### 0.1.0 — unreleased

#### Since the first draft

- **Storage input for large exports:** `traceDatasetId` (one span or export document per item, up to 200,000
  items), `traceRecordKey` + `traceKeyValueStoreId` (JSON or Collector JSON Lines text), and `datasetId` /
  `recordKey` / `keyValueStoreId` inside `traceSets` entries. Storage is read lazily, only for sets the budget
  covers. Unreadable storage produces a free `failed` item.
- **Baseline / regressions:** `baseline` (previous dataset items or `{services: {name: score}}` summaries) and
  `baselineDatasetId` add `data.regressions` (score deltas, regressed/improved/new/missing services, new and
  resolved findings). Improvement-plan actions touching regressed services get 1.5× priority and list
  `regressed_services`.
- **`clockSkewMs` input** (default 100 ms, 0–60,000) for propagation-break matching.
- **Billing:** the budget check now covers the combined USD cost of a set's primary units plus the correlation
  check (via `session.can_continue`), so the correlation check is skipped when only the audit fits.
- **False-positive tuning**, with healthy-fleet regression fixtures (`healthy_fleets.json`):
  - Service-mesh proxy spans (Envoy / Istio / Linkerd) are collapsed instead of being reported as services
    (no more META/SCOPE/`COV-PROP-010` findings for sidecars; calls through a mesh pair up again).
  - Route coverage (`COV-GAP-003`) no longer counts an async consumer below a PRODUCER as the request's own
    remote call, and treats requests that are faster by about the skipped call's duration as cache hits.
  - Instance comparison (`COV-GAP-004`) compares instances on the routes they both served.
  - Standalone jobs (INTERNAL roots, no SERVER/CONSUMER spans) are no longer reported as isolated (`COV-TOPO-008`).
- Span lists may now contain JSON / JSON Lines strings next to span objects.
- SDK version table refreshed (`2026-10` snapshot) and about 70 SaaS / managed-API host suffixes added
  (payments, messaging, identity, AI APIs, managed databases, observability backends).

#### Initial version

- Trace parsers: OTLP/JSON `ExportTraceServiceRequest` (hex or base64 IDs, legacy `instrumentationLibrarySpans`,
  Tempo `batches`, JSON Lines from the Collector file exporter), Jaeger JSON, Zipkin v2 (including `shared`
  spans) and a simplified span list. Formats can be mixed within a trace set.
- Optional logs (OTLP/JSON or simplified) and metrics (OTLP/JSON resources or simplified) for correlation checks.
- Peer resolution and dependency graph (JSON + Mermaid): paired child spans, `db.system`, `messaging.system`,
  `peer.service`, a learned host index and DNS-label matching. Hosts are classified as internal, SaaS or external.
- 55 rules (`COV-*`) across topology, propagation, gaps, resource metadata, instrumentation scopes, span
  semantics, logs/metrics correlation and data quality. See [RULES.md](RULES.md). All results are phrased as
  *suspected* coverage gaps and carry a confidence value.
- Propagation-break matching across traces: one-to-one, by timing (100 ms skew), route and method, plus
  parent IDs that appear in a different trace.
- Uninstrumented-time detection using an interval union of child spans (concurrency-safe). Per-route coverage
  is checked by downstream type and broken down by `service.version`.
- Per-service coverage scores with a propagation/depth/metadata/correlation breakdown, and a fleet coverage score.
- Prioritised improvement plan (effort, impact, generic and per-language hints for Java, Python, Node.js, Go
  and .NET).
- Pay-per-event: `coverage-audited` ($0.75 per trace set of up to 10,000 spans, plus one more event for each
  further started 10,000 spans) and `correlation-check` ($0.25, only when logs or metrics were correlated).
  Unparsable sets and per-service items are free.
