{"record":{"id":"0533c2402c0a8670","repo":"jaegertracing/jaeger","slug":"unexpected-metrics-valuetype-s","errorCode":null,"errorMessage":"unexpected metrics ValueType: %s","messagePattern":"unexpected metrics ValueType: (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"internal/storage/metricstore/prometheus/metricstore/dbmodel/to_domain.go","lineNumber":31,"sourceCode":")\n\n// Translator translates Prometheus's metrics model to Jaeger's.\ntype Translator struct {\n\tlabelMap map[string]string\n}\n\n// New returns a new Translator.\nfunc New(spanNameLabel string) Translator {\n\treturn Translator{\n\t\t// \"operation\" is the label name that Jaeger UI expects.\n\t\tlabelMap: map[string]string{spanNameLabel: \"operation\"},\n\t}\n}\n\n// ToDomainMetricsFamily converts Prometheus' representation of metrics query results to Jaeger's.\nfunc (d Translator) ToDomainMetricsFamily(name, description string, mv model.Value) (*metrics.MetricFamily, error) {\n\tif mv.Type() != model.ValMatrix {\n\t\treturn &metrics.MetricFamily{}, fmt.Errorf(\"unexpected metrics ValueType: %s\", mv.Type())\n\t}\n\treturn &metrics.MetricFamily{\n\t\tName:    name,\n\t\tType:    metrics.MetricType_GAUGE,\n\t\tHelp:    description,\n\t\tMetrics: d.toDomainMetrics(mv.(model.Matrix)),\n\t}, nil\n}\n\n// toDomainMetrics converts Prometheus' representation of metrics to Jaeger's.\nfunc (d Translator) toDomainMetrics(matrix model.Matrix) []*metrics.Metric {\n\tms := make([]*metrics.Metric, matrix.Len())\n\tfor i, ss := range matrix {\n\t\tms[i] = &metrics.Metric{\n\t\t\tLabels:       d.toDomainLabels(ss.Metric),\n\t\t\tMetricPoints: toDomainMetricPoints(ss.Values),\n\t\t}\n\t}","sourceCodeStart":13,"sourceCodeEnd":49,"githubUrl":"https://github.com/jaegertracing/jaeger/blob/806f4447841ecdb60519f408b004a599d515f437/internal/storage/metricstore/prometheus/metricstore/dbmodel/to_domain.go#L13-L49","documentation":"The Prometheus Translator.ToDomainMetricsFamily expects Prometheus query results as a model.Matrix (range vector), since Jaeger metrics are returned as time series. If the model.Value's type is anything other than model.ValMatrix (e.g. ValVector, ValScalar, ValString), translation is impossible and this error reports the unexpected value type.","triggerScenarios":"Calling ToDomainMetricsFamily with a result from a Prometheus query that returned an instant vector/scalar instead of a matrix — e.g. using an instant query API response or a query expression yielding a scalar.","commonSituations":"Feeding results from /api/v1/query (instant) instead of /api/v1/query_range; a metric name typo causing Prometheus to return an empty/scalar-typed value; custom storage plugins passing the wrong model.Value variant.","solutions":["Use a range query (query_range) so Prometheus returns a model.Matrix.","Verify the PromQL expression selects an existing metric series over a range (e.g. rate(...[5m])).","Check the caller that fetched mv: it must pass mv from a Matrix-typed response, not a Vector.","Add a caller-side check `if mv.Type() != model.ValMatrix { ... }` before invoking the translator."],"exampleFix":"// before\nfam, err := translator.ToDomainMetricsFamily(name, desc, result.Vector)\n// after\nif result.Value.Type() != model.ValMatrix {\n  return nil, fmt.Errorf(\"expected matrix, got %s\", result.Value.Type())\n}\nfam, err := translator.ToDomainMetricsFamily(name, desc, result.Value)","handlingStrategy":"type-guard","validationCode":"if mv.Type() != model.ValMatrix {\n  return fmt.Errorf(\"expected range-vector (matrix) result, got %s; use query_range\", mv.Type())\n}","typeGuard":"func isMatrix(v model.Value) (model.Matrix, bool) {\n  m, ok := v.(model.Matrix)\n  return m, ok && v.Type() == model.ValMatrix\n}","tryCatchPattern":"fam, err := translator.ToDomainMetricsFamily(name, desc, mv)\nif err != nil {\n  log.Printf(\"prometheus result unusable: %v\", err) // names the actual type\n  return nil, err\n}","preventionTips":["Always query Prometheus range endpoints (/query_range) for Jaeger metrics.","Assert the PromQL expression returns series, not scalars or instant vectors.","Type-assert with the comma-ok form after checking model.ValMatrix."],"tags":["prometheus","metrics","type-mismatch"],"backgroundTag":"unexpected-response-type","analyzedSha":"806f4447841ecdb60519f408b004a599d515f437","analyzedAt":"2026-09-01T02:39:22.140Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-08T05:18:18.240Z"}