microsoft/aspire · error

Unknown metric point type

Error message

Unknown metric point type '{point.PointType}'.

What it means

Metric points are stored with a discriminator (point.PointType) that is one of LongPointType, DoublePointType, or HistogramPointType. MaterializeMetricDimensions switches on that discriminator and throws InvalidOperationException when a stored point has a type value it does not recognize, indicating data or constants out of sync.

Solutions

  1. Point the dashboard at storage created by the same (or older, compatible) version; clear/reset old telemetry storage after upgrading.
  2. Locate which PointType value is present in the data and confirm whether a new type needs handling in the switch.
  3. Restore a consistent dashboard + storage version pair.
  4. If reproducible, file an issue with the PointType value observed.

Example fix

// before: reusing a database from a newer dashboard build
dashboard --data-dir /shared/telemetry-from-v9
// after: use fresh or matching-version storage
dashboard --data-dir /home/user/.aspire/dashboard-v10-telemetry
Defensive patterns

Strategy: try-catch

Try / catch

try
{
    var points = await repo.GetMetricsAsync(query);
}
catch (InvalidOperationException ex) when (ex.Message.StartsWith("Unknown metric point type"))
{
    logger.LogError(ex, "Telemetry storage written by an incompatible version; clearing store.");
    ResetTelemetryStore();
}

Prevention

When it happens

Trigger: A row read from the metric points table has a PointType not matching any of the three known constants (e.g. corrupted rows, stale rows from a newer schema version, or a new point type added upstream without updating this switch).

Common situations: Dashboard opened against telemetry storage written by a newer/newer-preview dashboard version; database file reused across version upgrades; manually edited or partially migrated SQLite data.

Understand the failure class

Background: "This is a bug, please report it": internal invariant violations, unreachable panics, and SNH errors explained — this error's family across 47 libraries.

Related errors


AI-assisted analysis of microsoft/aspire@25830f84bd (2026-09-16). Data as JSON: /api/errors/59d0a724db2bc8e1. Report an issue: GitHub.

Appendix: source

Thrown at src/Aspire.Dashboard/Otlp/Storage/SqliteTelemetryRepository.Metrics.Reads.cs:248

                dimensionQueryRangesCteSql,
                queryParameters,
                dataPointInterval,
                pointRecords,
                populateExemplarAttributes)
            : Array.Empty<KeyValuePair<long, MetricsExemplar>>().ToLookup(pair => pair.Key, pair => pair.Value);

        for (var dimensionIndex = 0; dimensionIndex < dimensions.Count; dimensionIndex++)
        {
            var dimensionId = dimensions[dimensionIndex].DimensionId;
            var dimension = results[dimensionIndex];
            foreach (var point in points[dimensionId])
            {
                MetricValueBase value = point.PointType switch
                {
                    LongPointType => new MetricValue<long>(point.IntegerValue!.Value, new DateTime(point.StartTimeTicks, DateTimeKind.Utc), new DateTime(point.EndTimeTicks, DateTimeKind.Utc)),
                    DoublePointType => new MetricValue<double>(point.DoubleValue!.Value, new DateTime(point.StartTimeTicks, DateTimeKind.Utc), new DateTime(point.EndTimeTicks, DateTimeKind.Utc)),
                    HistogramPointType => CreateHistogramValue(point),
                    _ => throw new InvalidOperationException($"Unknown metric point type '{point.PointType}'.")
                };
                if (point.PointType != HistogramPointType)
                {
                    value.Count = checked((ulong)point.RepeatCount);
                }
                value.Exemplars.AddRange(exemplars[point.PointId]);
                dimension.Values.Add(value);
            }
        }
        return results;
    }

    private List<StoredMetricDimension> GetMetricDimensions(
        SqliteConnection connection,
        IReadOnlyList<CachedInstrument> instruments,
        IReadOnlyDictionary<string, IReadOnlyList<string?>> dimensionFilters,
        Dictionary<string, List<string?>> knownAttributeValues,
        out bool hasOverflow)

View on GitHub (pinned to 25830f84bd)