TensorFusion Metrics Reference
TensorFusion writes its metrics and component logs to GreptimeDB as nine tables, all prefixed with tf_. This page lists every table, its tags and its fields, so you can write SQL for dashboards, alert rules and cost reports.
How metrics are collected
| Source | Tables | Interval |
|---|---|---|
| Controller | tf_system_metrics, tf_pool_metrics, tf_node_metrics, tf_gpu_metrics, tf_worker_resources, tf_gpu_allocation | 1 minute |
| Hypervisor (one per GPU node) | tf_gpu_usage, tf_worker_usage | 1 minute by default, set with the hypervisor flag -metrics-interval |
| Vector (log collection) | tf_system_log | Continuous |
The controller and the hypervisor append metrics to a local file. A Vector sidecar tails the file and posts the lines to GreptimeDB over the InfluxDB line protocol. Metrics stay inside your cluster unless you point the chart at an external GreptimeDB.
Three keys under dynamicConfig in the Helm values control this pipeline:
| Key | Default | Meaning |
|---|---|---|
metricsTTL | 30d | Retention period of every tf_ table. Changes apply without a restart. |
metricsFormat | influx | Line format written to the metrics file: influx, json or otel. The bundled Vector sink expects influx. |
metricsExtraPodLabels | {} | Map of Pod label key to tag name. Each listed label is copied onto tf_worker_resources and tf_gpu_allocation rows as an extra tag. |
Conventions
- Tags identify a time series and are indexed. Fields are the measured values.
- Every table has a time index column,
greptime_timestamp, written with millisecond precision. Tables created by the start-up DDL of earlier releases usetsinstead; see which one a cluster has withSELECT table_name, column_name FROM information_schema.columns WHERE semantic_type = 'TIMESTAMP';. - TFLOPS values are FP16 TFLOPS. VRAM values are bytes. Fields whose name contains
percentorpercentagerange from 0 to 100. - "Allocated" means the sum of workload requests. "Limited" means the sum of workload limits.
- "Virtual capacity" is the physical capacity multiplied by the pool's oversubscription ratio.
Cluster and pool tables
tf_system_metrics
Scheduling and scaling counters, one row per pool. The counters are cumulative since the controller started and reset when it restarts, so query them as a difference over a time window.
| Tag | Description |
|---|---|
pool | GPUPool name |
| Field | Type | Description |
|---|---|---|
total_workers_cnt | int64 | Workers currently running in the pool |
total_nodes_cnt | int64 | GPU nodes currently in the pool |
total_allocation_success_cnt | int64 | Successful GPU allocations |
total_allocation_fail_cnt | int64 | Failed GPU allocations |
total_scale_up_cnt | int64 | Reserved for scale-up events. Not incremented in the current release; always 0. |
total_scale_down_cnt | int64 | Reserved for scale-down events. Not incremented in the current release; always 0. |
total_topo_satisfied_cnt | int64 | Scheduling attempts where at least one node met the GPU topology requirement |
total_topo_unsatisfied_cnt | int64 | Scheduling attempts where no node met the GPU topology requirement |
total_topo_fallback_cnt | int64 | Scheduling attempts that fell back to a looser topology |
total_topo_search_degraded_cnt | int64 | Scheduling attempts where the topology search ran in degraded mode |
The four total_topo_* fields are written only after the scheduler has handled at least one allocation for the pool.
tf_pool_metrics
Capacity and allocation summary per pool.
| Tag | Description |
|---|---|
pool | GPUPool name |
phase | GPUPool phase |
| Field | Type | Description |
|---|---|---|
allocated_tflops | float64 | TFLOPS requested by workloads |
allocated_tflops_percent | float64 | Requested TFLOPS as a share of physical capacity |
allocated_tflops_percent_virtual | float64 | Requested TFLOPS as a share of virtual capacity |
allocated_vram_bytes | float64 | VRAM requested by workloads |
allocated_vram_percent | float64 | Requested VRAM as a share of physical capacity |
allocated_vram_percent_virtual | float64 | Requested VRAM as a share of virtual capacity |
limited_tflops | float64 | Sum of workload TFLOPS limits |
limited_tflops_percent_virtual | float64 | TFLOPS limits as a share of virtual capacity |
limited_vram_bytes | float64 | Sum of workload VRAM limits |
limited_vram_percent_virtual | float64 | VRAM limits as a share of virtual capacity |
gpu_count | int64 | GPUs in the pool |
Node and GPU tables
tf_node_metrics
Allocation and hardware cost per GPU node.
| Tag | Description |
|---|---|
node | GPUNode name |
pool | GPUPool name |
phase | GPUNode phase |
| Field | Type | Description |
|---|---|---|
allocated_tflops | float64 | TFLOPS requested by workloads on the node |
allocated_tflops_percent | float64 | Requested TFLOPS as a share of the node's physical capacity |
allocated_tflops_percent_virtual | float64 | Requested TFLOPS as a share of the node's virtual capacity |
allocated_vram_bytes | float64 | VRAM requested by workloads on the node |
allocated_vram_percent | float64 | Requested VRAM as a share of the node's physical capacity |
allocated_vram_percent_virtual | float64 | Requested VRAM as a share of the node's virtual capacity |
gpu_count | int64 | GPUs on the node |
raw_cost | float64 | Hardware cost of the node's GPUs since the previous sample, in USD, from the hourly price of each GPU model |
tf_gpu_metrics
Capacity and allocation per GPU, as seen by the scheduler.
| Tag | Description |
|---|---|
gpu | GPU resource name |
node | GPUNode name |
pool | GPUPool name |
gpu_model | GPU model, for example A10G |
phase | GPU phase |
| Field | Type | Description |
|---|---|---|
capacity_tflops | float64 | TFLOPS capacity of the GPU |
available_tflops | float64 | TFLOPS not yet requested |
allocated_tflops | float64 | TFLOPS requested by workloads |
allocated_tflops_percent | float64 | Requested TFLOPS as a share of capacity |
capacity_vram_bytes | float64 | VRAM capacity of the GPU |
available_vram_bytes | float64 | VRAM not yet requested |
allocated_vram_bytes | float64 | VRAM requested by workloads |
allocated_vram_percent | float64 | Requested VRAM as a share of capacity |
tf_gpu_usage
Hardware readings per physical GPU, reported by the hypervisor through the vendor library.
| Tag | Description |
|---|---|
uuid | GPU UUID, lowercase |
node | GPUNode name |
pool | GPUPool name |
| Field | Type | Description |
|---|---|---|
compute_percentage | float64 | GPU utilization |
memory_bytes | int64 | VRAM in use |
temperature | float64 | GPU temperature in °C |
power_usage | float64 | Power draw in watts |
rx | float64 | PCIe receive throughput in bytes per second |
tx | float64 | PCIe transmit throughput in bytes per second |
memory_percentage | float64 | Reserved. The current hypervisor reports 0; divide memory_bytes by capacity_vram_bytes from tf_gpu_metrics instead. |
compute_tflops | float64 | Reserved. The current hypervisor reports 0. |
The table also has the columns graphics_clock_mhz, sm_clock_mhz, memory_clock_mhz, video_clock_mhz, nvlink_rx and nvlink_tx. They are filled only when the vendor library reports them as extra metrics; the bundled NVIDIA library does not, so they are normally empty.
Workload tables
tf_worker_resources
Requests, limits and billed cost per worker Pod, recorded by the controller.
| Tag | Description |
|---|---|
worker | Worker Pod name |
workload | TensorFusionWorkload name |
namespace | Namespace of the worker |
pool | GPUPool name |
qos | QoS level: low, medium, high or critical. Defaults to medium. |
| Field | Type | Description |
|---|---|---|
tflops_request | float64 | TFLOPS request per GPU |
tflops_limit | float64 | TFLOPS limit per GPU |
vram_bytes_request | float64 | VRAM request per GPU |
vram_bytes_limit | float64 | VRAM limit per GPU |
gpu_count | int64 | GPUs allocated to the worker |
raw_cost | float64 | Cost of the worker since the previous sample, in USD, from the pool's QoS pricing. 0 when the pool has no price for this QoS level. |
ready | bool | Whether the worker Pod is ready |
raw_cost is an increment, not a running total. Sum it over a time range to get the cost for that period.
tf_worker_usage
Actual GPU usage per worker and per GPU, measured by the hypervisor. A worker that uses two GPUs produces two rows per sample.
| Tag | Description |
|---|---|
worker | Pod UID of the worker |
pod_name | Worker Pod name |
workload | TensorFusionWorkload name, or unknown |
namespace | Namespace of the worker |
pool | GPUPool name |
node | GPUNode name |
uuid | UUID of the GPU the row refers to |
| Field | Type | Description |
|---|---|---|
compute_percentage | float64 | GPU utilization of the worker's processes, summed |
memory_bytes | int64 | VRAM used by the worker's processes |
memory_percentage | float64 | VRAM used as a share of the worker's VRAM limit |
compute_tflops | float64 | Reserved. The current hypervisor reports 0. |
The columns compute_throttled_cnt, vram_freezed_cnt and vram_resumed_cnt exist in the table schema, but the current hypervisor does not write them.
Note that worker holds the Pod name in tf_worker_resources and the Pod UID in tf_worker_usage. To join the two tables, match tf_worker_resources.worker with tf_worker_usage.pod_name.
tf_gpu_allocation
Which GPUs each Pod holds, one row per Pod.
| Tag | Description |
|---|---|
pod | Pod name |
namespace | Namespace of the Pod |
pod_uuid | Pod UID |
node | Node the Pod runs on |
gpu_name | Comma-separated names of the allocated GPUs |
gpu_model_index | Comma-separated model:index pairs, for example A10G:0,A10G:1 |
| Field | Type | Description |
|---|---|---|
gpu_count | int64 | GPUs allocated to the Pod |
Log table
tf_system_log
Container logs of the controller, the hypervisors and the workers, collected by Vector.
| Column | Type | Description |
|---|---|---|
component | string | Value of the Pod label tensor-fusion.ai/component: operator, hypervisor or worker |
namespace | string | Namespace of the Pod |
pod | string | Pod name |
container | string | Container name |
message | string | Log line, full-text indexed |
stream | string | stdout or stderr |
timestamp | string | Time the line was written |
greptime_timestamp | timestamp | Time index, millisecond precision |
Example queries
Requested versus used VRAM per workload over the last hour:
SELECT r.workload,
max(r.vram_bytes_request) AS requested_bytes,
max(u.memory_bytes) AS peak_used_bytes
FROM tf_worker_resources r
JOIN tf_worker_usage u ON r.worker = u.pod_name
WHERE r.greptime_timestamp > now() - INTERVAL '1 hour'
AND u.greptime_timestamp > now() - INTERVAL '1 hour'
GROUP BY r.workload;Cost per namespace over the last day:
SELECT namespace, sum(raw_cost) AS cost_usd
FROM tf_worker_resources
WHERE greptime_timestamp > now() - INTERVAL '1 day'
GROUP BY namespace;Next steps
- Query metrics and logs shows how to connect to GreptimeDB.
- Set up alerts covers alert rules built on these tables.
TensorFusion Docs