Skip to main content

Send predictions to Grafana Cloud

A Grafana Cloud destination pushes every prediction served to your account into your stack's Prometheus as metrics, over OpenTelemetry (OTLP). Nothing polls the API: forecasts arrive when they are served, and you chart them with the ready-made dashboard.

Destinations receive predictions served through the API and through agents over MCP. Playground runs are not sent. Deliveries do not count toward your plan's predictions.

What you need​

SettingWhere to find it
OTLP endpointIn Grafana Cloud, your stack, then Connections, then OpenTelemetry (OTLP). For example https://otlp-gateway-prod-us-east-3.grafana.net/otlp.
Instance IDThe same page. It is your stack's numeric ID.
Access tokenCreate it on the same page with the metrics:write scope.

The endpoint must be https on grafana.net. It works with or without the trailing /otlp.

Connect​

  1. Open Destinations in the Platform and fill in the Grafana Cloud card: OTLP endpoint, instance ID, and access token.
  2. Choose Connect Grafana Cloud. The destination starts as Pending while Constellation writes a check metric, constellation_destination_check, to your stack.
  3. It turns Active when the check is accepted, or Error with the reason Grafana gave.

The token is write-only: Constellation never shows it again; to change it, remove the destination and connect it again. You can connect up to three destinations per account.

Use Test on a connected destination to send another check at any time.

View the dashboard​

The dashboard lives in your own Grafana Cloud stack, not in the Platform: forecasts arrive there as metrics, and you import the Constellation dashboard once to chart them.

  1. On the Destinations page, open your Grafana Cloud destination and choose Download dashboard to save constellation-fleet.json.
  2. In Grafana Cloud, open your stack, then Dashboards > New > Import, and upload the file.
  3. When asked for Prometheus, pick your stack's Prometheus data source, usually named grafanacloud-<stack>-prom.

From then on, open Dashboards in your stack and choose Constellation fleet.

The dashboard refreshes every minute and shows:

PanelAnswers
At a glanceHow many links are forecast under 6 dB (p10) or within 3 dB of it in the next 5 minutes, the worst link margin and which link it is, how many demand pools are near their 24 hour peak in the next hour, and how old the newest forecast is (red after 15 minutes).
Fade watchEvery link, weakest first, with its station, satellite and band, the p10 forecast at +1, +3 and +5 minutes (the first red cell is when it crosses 6 dB), the median, and the p90 to p10 spread.
SNR outlookOne row per link over time, colored by its weakest p10 forecast: red under 6 dB, amber within 3 dB of it, green clear.
DemandEach pool's next hour peak as a share of its 24 hour peak, the next hour by pool, when each pool peaks, and the offered load forecast over time, as an average rate.
Forecast confidenceHow wide the bands are per horizon, and which model versions served the forecasts.
Link drill-downCollapsed. p50 inside the p10 to p90 band for each selected link, with the 6 dB threshold shaded.
Delivery healthCollapsed. Forecast points received per interval and the latest connection check.

Filter by Station, Band, Demand pool or Link; all default to All. Each point is the forecast issued at that time for that many minutes ahead.

Metrics​

MetricUnitLabels
constellation_link_snr_dbdBentity_id, quantile (p10, p50, p90), horizon_minutes (1, 3, 5), model_version, station, station_name, satellite, satellite_name, band, pool
constellation_pool_offered_bytesbytes per ten-minute intervalentity_id, quantile (p10, p50, p99), horizon_minutes (10 to 60), model_version, pool, stations
constellation_destination_checknoneWritten on connect and on Test.

All are gauges. entity_id is the link or pool ID from your telemetry, as in Predictions. The other labels come from your topology: a link's ground station (source tag and its name), its satellite (target tag and its name), its band from frequency_ghz, and the station's pop_id as pool; a pool lists the names of the stations whose pop_id it is. A label is left out when your telemetry does not report it, and the dashboard still works on entity_id alone.

# Weakest p10 SNR per link over the next 5 minutes
min by (entity_id, station_name) (last_over_time(constellation_link_snr_db{quantile="p10"}[10m]))

# Links forecast under 6 dB, per station
count by (station_name) (min by (entity_id, station_name) (last_over_time(constellation_link_snr_db{quantile="p10"}[10m])) < 6)

Series count​

Grafana Cloud bills by active series. Each link adds 9 series (3 quantiles at 3 horizons) and each pool adds 18 (3 quantiles at 6 horizons). A fleet of 100 links and 10 pools is about 1,080 series, plus a new set for a while after a model version changes. Check the limit on your Grafana Cloud plan. The topology labels do not add series, but a link starts a new set when its satellite changes.

Troubleshooting​

SymptomCause and fix
Station, Satellite and Band are empty, or the dashboard looks like the old oneForecasts delivered before topology labels existed carry only entity_id. Report ground_station and satellite records with a name, and link source and target tags; new forecasts are labelled. If you imported the dashboard before, download it again and import it over the old one.
Error mentioning 401 or 403The token is wrong, expired, or lacks metrics:write. Create a new token, remove the destination, and connect again.
Error mentioning 404The endpoint is for another region than your stack. Copy it again from the OpenTelemetry (OTLP) page.
Active, but panels say no forecastsDestinations send only predictions that are served. Request forecasts through the API or an agent, and check that your links have recent telemetry: a link without it gets an entity_errors entry, not a metric.
Gaps in the linesPrometheus treats a gauge as stale five minutes after its last sample, so gaps appear when nothing requested a forecast. The dashboard joins gaps up to 15 minutes.
The Link or Demand pool list is emptyNo series of that metric exists yet in the selected time range. Widen the range or serve a forecast first.
Not available in this environmentDestinations are switched off in this environment. Read forecasts from the API instead.

To stop deliveries, choose Remove on the destination. Revoking the token in Grafana Cloud also stops them; the destination then shows Error.