Skip to content

feat(muse-spark): add Meta Muse Spark dashboard template - #416

Merged
revmag merged 1 commit into
mainfrom
muse-spark-dashboard
Sep 11, 2026
Merged

revmag merged 1 commit into
mainfrom
muse-spark-dashboard

Conversation

@gkarthi-signoz

Copy link
Copy Markdown
Contributor

Adds a dashboard template for Meta Muse Spark accessed through the Meta Model API.

Where the telemetry comes from

Muse Spark is reached over an OpenAI-compatible endpoint (https://api.meta.ai/v1), so the OpenAI SDK plus opentelemetry-instrumentation-openai-v2 traces it with no provider-specific library. That instrumentation alone is not enough for a cost or latency board, for three reasons found while building this:

  • Reasoning tokens are never recorded. The extractor never reads completion_tokens_details, and reasoning is 90 to 98 percent of output tokens on every Muse Spark version.
  • Cached input tokens are dropped. cache_read_input_tokens is declared and read in util-genai but never assigned, so cost computed from spans overstates real spend by 3 to 5 times on any workload that reuses a prompt.
  • Time to first chunk is defined but never emitted, and on this model family it is most of the wall clock on a streaming call.

So the panels read an enriched wrapper span that records those three values from the response object, alongside the stock attributes.

Span shape

span kind provider carries
muse.chat <model> Internal meta usage, reasoning tokens, cache reads, cost, time to first chunk, finish reasons
chat <model> Client openai stock attributes only

Load-bearing query scoping

Every panel filters gen_ai.provider.name = 'meta'. This does two jobs and should not be removed:

  1. It separates Muse Spark from other providers reached through the same OpenAI-compatible SDK, which otherwise all report gen_ai.provider.name = openai with no server.address to tell them apart.
  2. It prevents double counting. The wrapper span and the SDK client span both carry gen_ai.request.model, so a request count grouped on model alone reports twice the real traffic.

The $model variable is a fixed list rather than a dynamic one, because a dynamic variable populates from every gen_ai.request.model in the workspace and will offer other providers' models on a Muse Spark board.

Panels

Section Panels
Overview Total Cost, Requests, Error Rate, Prompt Cache Hit Rate
Cost and Tokens Cost Over Time by Model, Cost Share by Model, Token Usage by Type, Per-Model Usage and Cost
Latency Call Duration (p50 / p95 / p99), Time to First Chunk (p50 / p95), Slowest Calls
Reliability Requests Over Time by Model, Errors Over Time by Model, Finish Reasons, Recent Errors

Notes for review

  • The README links https://signoz.io/docs/muse-spark-monitoring/, which does not exist yet. The slug is settled and the guide is in progress.
  • Errors cannot be broken down by type. The instrumentation sets no error.type attribute, so a 401, 404 and 400 are indistinguishable except by parsing the span status message. The Errors panel groups by model and the Recent Errors table carries the provider error string.
  • Series colours are set explicitly from a colourblind-safe palette. The four model ids differ by one or two characters, so relying on automatic colour assignment made adjacent series hard to tell apart.

Cost, token and latency monitoring for Meta Muse Spark accessed through the
Meta Model API, built on gen_ai.* trace attributes.

15 panels across Overview, Cost and Tokens, Latency and Reliability, with a
multi-select service picker and a fixed model picker covering the four Muse
Spark model ids.
@github-actions

Copy link
Copy Markdown

📊 Dashboard files added in this PR

✅ An issue has been created in SigNoz/signoz.io to track these dashboard changes.

@revmag
revmag merged commit 32d5156 into main Sep 11, 2026
1 check passed
@revmag
revmag deleted the muse-spark-dashboard branch September 11, 2026 09:49
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants