cloadyDocs
API ReferenceEndpointsApplications

Read a service's CPU, memory and traffic

Returns a service's CPU, memory and network over the range, read from the platform's own scrape, beside what the workspace has used this month toward the free tier's limits. It's what Monitor shows for an app on the free tier, and it answers on every plan. `serviceName` is a compose service.

GET
/api/workspaces/{workspaceSlug}/apps/{appSlug}/services/{serviceName}/usage
AuthorizationBearer <token>

Personal API token (cldy_…)

In: header

Path Parameters

workspaceSlug*string
appSlug*string
serviceName*string

Query Parameters

env?string

Value in

  • "production"
  • "preview"
  • "development"
region?string
range?string

How far back to look; the answer has 30 to 96 points across it

Default"1h"

Value in

  • "15m"
  • "1h"
  • "6h"
  • "24h"
  • "7d"

Response Body

application/json

application/json

application/json

application/json

application/json

curl -X GET "https://example.com/api/workspaces/string/apps/string/services/string/usage"
{  "start": 0,  "step": 0,  "series": {    "cpu": [      0    ],    "cpuLimit": [      0    ],    "memory": [      0    ],    "memoryLimit": [      0    ],    "netIn": [      0    ],    "netOut": [      0    ]  },  "month": {    "traffic": 0,    "requests": 0,    "cpu": 0,    "memory": 0  },  "limits": {    "traffic": 0,    "requests": 0,    "cpu": 0,    "memory": 0  }}

Transfer an app to another workspace POST

Previous Page

Query an app's metrics GET

Runs a PromQL query at one instant against the app's own metrics, kept for 62 days, and returns Prometheus's answer unchanged. Only the app's series are visible, whatever the query selects. Every series carries `namespace`, the app's (getWorkspace returns each app's), and most carry `container`, the compose service, and `pod`. Resources: `container_cpu_usage_seconds_total`, `container_spec_cpu_quota` / `container_spec_cpu_period` (the CPU limit), `container_memory_working_set_bytes`, `container_spec_memory_limit_bytes`, `container_fs_reads_bytes_total`, `container_fs_writes_bytes_total`, `container_oom_events_total`, and `container_network_receive_bytes_total` / `container_network_transmit_bytes_total`, which carry only `pod`, so match them as `pod=~"<service>-[a-z0-9]+-[a-z0-9]+"`. Replicas: `kube_pod_container_status_ready`, `kube_pod_container_status_restarts_total`, `kube_pod_container_status_waiting_reason` and `kube_pod_container_status_last_terminated_reason` (`reason`), and `kube_deployment_spec_replicas` / `kube_deployment_status_replicas_available`, whose `deployment` is the service. Volumes: `kubelet_volume_stats_used_bytes` and `kubelet_volume_stats_capacity_bytes`, whose `persistentvolumeclaim` is the compose volume (each service's `volumes` in getWorkspace). Requests to the service the app's address routes to: `traefik_service_requests_total` (`code`, `method`, `protocol`) and `traefik_service_request_duration_seconds_bucket` (`le`). Uptime checks are `method="HEAD"`, so leave them out with `method!="HEAD"`, and a scale-to-zero function reports as `container="<service>-fn"`. Uptime: `cloady:probe_success:serving` (`kind="auto"` is the check of the app's address) and `cloady:service_up:serving`, each service's availability from 0 to 1. Spans, once the app sends OpenTelemetry traces: `traces_spanmetrics_calls_total` and `traces_spanmetrics_latency_bucket` (`span_name`, `span_kind`, `status_code`, `http_status`). RabbitMQ: `rabbitmq_detailed_queue_messages_ready`. Alert rules: `ALERTS` (`alertname`, `alertstate`, `container`, `cloady_metric`), whose `alertstate="firing"` samples are the app's incident history. queryAppMetricsRange runs a query over a range. A query the store refuses comes back with the store's own status and `error`. The path is the store's own, so a Grafana data source can point here too.