# Changelog of OTel Cost & Cardinality Analyzer (`michiganpublictech/otel-cardinality-analyzer`) Actor

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

## Changelog — OTel Cost & Cardinality Analyzer

### 0.1.0 — unreleased

- Initial version.
- Inputs: metric definitions (distinct-value counts, sample values or both; histogram buckets/boundaries,
  exponential `max_size`, temporality, export interval, resource attributes, combination factor, measured
  series), OTLP/JSON `ExportMetricsServiceRequest` samples (an object; lists and JSON Lines inside `analyses`;
  cardinality, types, temporality, bucket counts and export interval inferred) and an existing Collector configuration.
- Estimation: worst-case series (upper bound), realistic series (observed → user estimate → combination factor →
  correlation-aware heuristic), samples per month, monthly cost before / after / worst case; per-metric and total
  risk levels.
- Pricing: `generic` and `generic-samples` presets (clearly labelled illustrative assumptions) or `custom`;
  per-series and per-million-samples prices, currency label, series and cost budgets.
- 47 rules (`CARD-*`): identifiers by name and by value shape, raw routes, status codes, series levels, budgets,
  concentration, histograms, redundant metrics and attributes (semantic-convention migrations), temporality, export
  interval, resource attributes, spanmetrics connector and pricing. See [RULES.md](RULES.md).
- Recommendations with quantified savings (series, samples, cost) and top-10 attribute contributors.
- Optimized Collector configuration: `filter`, `resource`, `transform` (OTTL `delete_key`, `replace_pattern`,
  status class) and `metricstransform` (`aggregate_labels`) processors, merged into the supplied config and wired
  after `memory_limiter` / before `batch`; delta-aware of processors already in metrics pipelines; credentials in
  the supplied config replaced by `${env:…}` placeholders. SDK / pipeline hints for intervals, buckets, exponential
  histograms and temporality conversion.
- Prometheus text exposition input (`prometheusMetrics`): classic 0.0.4 and OpenMetrics text, quoted UTF-8 names,
  families from `# TYPE` or inferred from `le` / `quantile`, histogram boundaries, summary quantiles, `job` /
  `instance` as resource attributes, scrape interval inferred from timestamped scrapes.
- SDK View hint (`sdk-views`): one View per instrument combining attribute allow-list, explicit buckets, exponential
  `max_size` and drop, rendered for Python, Java, Go, .NET and JavaScript (`@opentelemetry/sdk-metrics` 2.x).
- Delta-awareness credits only unconditional existing actions: compound OTTL `where` clauses and block-level
  `conditions`, `attributes` processor `include` / `exclude`, `metricstransform` regexp `include` / `action:
  update`, `filter` `or` conditions. Conditional actions are listed in `existing_collector.conditional_not_credited`.
- Generated Collector YAML validated with `otelcol-contrib` 0.115.1, 0.148.0 and 0.150.1 (and run end to end on
  0.115.1 / 0.150.1); snapshot tests freeze the validated output. The standalone config's exporter endpoint defaults
  to `http://localhost:4318` so it validates without environment variables.
- Batch mode (`analyses`).
- Pay-per-event: `analysis-completed` ($0.25) per analysis, `optimized-config` ($0.10) only when an optimized
  configuration with at least one change was produced. Unparsable analyses are free.
