Overview
Prometheus is the standard open-source metrics database. This template deploys one Prometheus server with the remote-write receiver enabled and its TSDB on a persistent volume: your own senders push metrics in with Prometheusremote_write, or Prometheus scrapes targets you configure, and anything that speaks PromQL (your own Grafana, dashboards, scripts) queries them back. A Thanos sidecar in the same workload, on by default, exposes the Thanos Store API for a Thanos Query tier and can upload TSDB blocks to your own bucket.
Use it when you want metrics data you own, or metrics from sources outside your workloads; Control Plane’s built-in metrics keep collecting and dashboarding your workloads either way.
What Gets Created
9095 rather than its usual 9090, which is reserved by the platform. There is no public endpoint: Prometheus has no authentication of its own.
Prerequisites
None for a default install. Two optional features need a secret you create first. Secrets are org-level, so no GVC flag is involved.Optional - remote write with basic auth
remoteWrite entry that uses basic auth, create an opaque secret holding the password:remoteWrite[].basicAuth.passwordSecretName to this name.Optional - object storage
Installation
A default install needs no values at all:UI
CLI
Terraform
Pulumi
Configuration
Prometheus Server
maxCpu / maxMemory. Raise maxMemory as your number of active series grows.
TSDB and Retention
retention.time at least three times thanos.objectStorage.blockDuration so every block stays on the volume long enough to upload.
Metrics
prometheus: RELEASE_NAME-prometheus. Your externalLabels keys merge over it, and overriding prometheus is allowed (the HA pair needs it). External labels are attached only to data leaving the server (remote write, the Store API, uploads), never to local query results.
To scrape your own workloads, set extraScrapeConfigs to a raw YAML list of scrape_configs entries:
WORKLOAD_NAME.GVC_NAME.cpln.local form for every target inside Control Plane.
scrapeInterval, externalLabels, extraScrapeConfigs and remoteWrite are written into a mounted configuration file, and a running replica keeps the file it started with. After a cpln helm upgrade that changes any of them, force a redeployment so the server loads the new configuration:
Remote Write
remoteWrite pushes this server’s metrics to any Prometheus-remote-write-compatible store, for example this catalog’s Grafana Mimir template. It is the recommended shape when the Thanos sidecar is off:
basicAuth is optional. When set, both username and passwordSecretName are required; the password lives only in the opaque secret from Prerequisites, and the workload identity gets reveal on exactly that secret.
A remoteWrite change takes effect only after the forced redeployment described under Metrics.
Thanos Sidecar and Object Storage
remoteWrite instead. thanos.objectStorage.enabled: true is refused at render unless the sidecar is on, because the sidecar performs the uploads. Set type and fill in only that provider’s block; the setup steps per provider are under Backing Up.
Access
internalAccess.workloads take the form //gvc/GVC_NAME/workload/WORKLOAD_NAME. Use same-org or workload-list to let a Thanos Query tier in another GVC reach the Store API. Access changes are not instantaneous; re-test after a pause rather than concluding a setting did not work.
There is deliberately no public access option. To serve clients outside Control Plane, put your own authenticating proxy in front of Prometheus; the template does not provide one.
Connecting
Everything is internal. Prometheus serves ingest, PromQL and its web UI on port9095; the Thanos sidecar serves the Store API on 10901.
http://localhost:9095/query in a browser:
/targets) shows every scrape target and the exact error when a scrape fails; it is the first place to look when an expected metric never appears. Configuration (/config) shows the running prometheus.yml, which confirms your extraScrapeConfigs landed.
To push metrics here from another Prometheus:
RELEASE_NAME-prometheus.GVC_NAME.cpln.local:10901 as a store endpoint. Traffic between locations is billed as egress, so keep the query tier near its stores where practical.
Operations
Backing Up
The volume set keeps a final snapshot for 7 days when the release is uninstalled; there are no scheduled snapshots. For durable history, turn on object storage: the Thanos sidecar uploads each completed TSDB block to your bucket. Setthanos.objectStorage.enabled: true, set thanos.objectStorage.type, then complete the steps for that provider.
- AWS S3
- Google Cloud Storage
- S3-compatible (MinIO, R2, Wasabi)
Create a bucket
my-prometheus-bucket. Set thanos.objectStorage.aws.bucket and thanos.objectStorage.aws.region to match.Create a bucket-scoped IAM policy
my-prometheus-s3-policy, scoped to that bucket:thanos.objectStorage.aws.policyName to the policy name (the bare name, not the ARN).Create a cloud account
thanos.objectStorage.aws.cloudAccountName to its name.blockDuration after install. Do not change blockDuration unless you know you need to.
Restoring a Backup
No restore procedure has been verified for this template. Blocks in your bucket are not loaded back into this server; they are meant to be read by a Thanos object-storage tier such as the Thanos template’s. Restoring the volume set’s final snapshot into a new install is likewise unverified.Upgrading from 1.0.0
Version 1.1.0 renamed the resource limits in both blocks:resources.cpu and resources.memory became resources.maxCpu and resources.maxMemory, and the same for thanos.sidecar.resources. The old names are not read any more, so rename them in your values file or the defaults apply. Upgrade in place, passing your values file so nothing resets to its default:
Upgrading from 1.1.0
Version 1.2.0 moves the S3-compatible (minio) object-storage keys out of values. thanos.objectStorage.minio.accessKey and thanos.objectStorage.minio.accessSecret are gone; create the dictionary secret from the S3-compatible tab under Backing Up and set thanos.objectStorage.minio.credentialsSecretName to its name. A values file that still carries the old keys is refused at render with:
High Availability
Prometheus has no cluster mode, so the template has no replicas setting: one install is one server. The upstream HA pattern is two independent, identically configured servers deduplicated at query time. Install the template twice, for example as releasesprom-a and prom-b, with identical values except externalLabels.
Values for prom-a:
prom-b:
replica label (the default of the Thanos template’s queryReplicaLabels). Both installs must override prometheus to the same value so their label sets differ only in replica.
Troubleshooting
An expected metric never appears
An expected metric never appears
/targets) through a port-forward. It lists each scrape target, its last scrape and the exact scrape error. Then check Configuration (/config) to confirm your extraScrapeConfigs entry is in the running config, and that the target uses a fully qualified WORKLOAD_NAME.GVC_NAME.cpln.local address.Not ready for a long time after a restart
Not ready for a long time after a restart
/-/ready returns 503 until that finishes. On a large TSDB this can take minutes. It is normal recovery, not a failure; wait rather than redeploying.External labels do not show in queries
External labels do not show in queries
No blocks in the bucket yet
No blocks in the bucket yet
thanos.objectStorage.blockDuration (default 2h), so the first upload happens only after the first block completes. If it still has not appeared after that, read the sidecar logs:A Thanos Query tier in another GVC cannot reach the Store API
A Thanos Query tier in another GVC cannot reach the Store API
internalAccess.type to same-org, or to workload-list with the caller’s full link //gvc/GVC_NAME/workload/WORKLOAD_NAME. Use the fully qualified address RELEASE_NAME-prometheus.GVC_NAME.cpln.local:10901 with no scheme.Upgrade refused with minio.accessKey and minio.accessSecret were REMOVED
Upgrade refused with minio.accessKey and minio.accessSecret were REMOVED
Important Notes
- Do not open Prometheus to the internet without your own authentication in front. Anyone who can reach port
9095can read every metric and run any PromQL. - Create every secret you name before installing; a missing one wedges the deployment with nothing in
cpln logs. - After an upgrade that changes
scrapeInterval,externalLabels,extraScrapeConfigsorremoteWrite, runcpln workload force-redeployment RELEASE_NAME-prometheus --gvc GVC_NAME; the upgrade alone leaves the running server on its old configuration, and there is no hot reload. - With object storage on, keep
retention.timeat least three timesblockDuration; the defaults15dand2hsatisfy this. - Uninstalling deletes the volume set; only its final snapshot, kept 7 days, and anything already uploaded to your bucket remain.