Observing Terraform-managed infrastructure means monitoring the resources Terraform provisions and the health of your apply pipeline, with OpenTelemetry collecting telemetry from the resulting cloud and Kubernetes resources..
Observing Terraform-managed infrastructure means monitoring the resources Terraform provisions and the health of your apply pipeline, with OpenTelemetry collecting telemetry from the resulting cloud and Kubernetes resources.
Terraform is a provisioning tool, not a runtime component, so there is no Terraform receiver and no live metric stream from Terraform itself. The honest framing is that you observe two other things: the delivery pipeline that runs plan and apply, and the infrastructure Terraform provisions, which you monitor with the ordinary OpenTelemetry receivers for that cloud or platform.
So the operational questions are: did the last apply succeed and how long did it take, has the real infrastructure drifted from the declared state, and are the provisioned resources healthy and within budget. Those are answered by pipeline telemetry and by the runtime telemetry of the resources, not by Terraform.
For the pipeline, instrument the CI job that runs Terraform so each plan and apply emits a span with its outcome and duration over OTLP, giving you a trace of every infrastructure change, who ran it, against which workspace, and whether it succeeded. For the resulting infrastructure, collect telemetry through the appropriate receivers, cloud metrics receivers for managed services, the Kubernetes receivers for clusters Terraform created, host metrics for VMs it provisioned.
Drift detection is its own signal: run terraform plan on a schedule and emit whether it would change anything, so a non-empty plan against a supposedly stable environment flags that reality has diverged from code. The value of tracing applies is correlation, when a resource's behaviour or cost changes, you can line it up with the exact apply that changed it.
The signals worth tracking around Terraform-managed infrastructure:
| Signal | How to capture | What it tells you / watch for |
|---|---|---|
apply success / failure | pipeline span status | Whether infrastructure changes are completing; repeated failures block delivery. |
apply / plan duration | pipeline span duration | How long changes take; a growing time can indicate state bloat or provider slowness. |
configuration drift | scheduled plan result | A non-empty plan against a stable environment means reality has diverged from code. |
provisioned resource health | cloud / k8s / host receivers | The runtime health of what Terraform created, monitored as any other resource. |
provisioned resource cost | cloud billing / FinOps | Cost of the resources, correlated back to the change that created them. |
change attribution | apply span attributes | Who applied what, when, and to which workspace, the audit trail for infrastructure change. |
A Terraform-adjacent dashboard has two halves. The change half: apply success and failure over time, apply duration, and a drift indicator from scheduled plans. The resource half: the health and cost of the provisioned infrastructure, from its own telemetry, with a way to overlay when applies happened so a change in behaviour or cost lines up with the apply that caused it.
# apply outcomes over time (from pipeline spans)
count(terraform.apply.result) by (workspace, result)
# drift: scheduled plans that would change something
count(terraform.plan.changes > 0) by (workspace)
# correlate a resource metric with the apply that changed it
# overlay apply span timestamps on the resource metric timeline
An apply fails or applies partially, leaving infrastructure in a state that does not match the code and may be internally inconsistent. The apply span status flags it. Because a partial apply can leave real resources half-changed, treat a failed apply as an incident, not a retry-and-forget, and reconcile state before the next change.
The real infrastructure diverges from what the code declares, because someone changed a resource in the console, so the next apply will either revert their change or fail. A scheduled plan that is not empty is the detector. Investigate the out-of-band change and bring it back under Terraform rather than letting drift accumulate.
A resource starts misbehaving or its cost jumps, and the cause is a specific Terraform apply, a resized instance, a changed configuration. Overlaying apply timestamps on the resource's own telemetry ties the effect to the change, which is the whole point of tracing applies: infrastructure incidents get a change to blame.
Starting conditions to tune:
| Condition | Signal | Meaning |
|---|---|---|
| apply failure | delivery | An infrastructure change did not complete. |
| scheduled plan not empty | drift | Reality has diverged from code. |
| provisioned resource unhealthy | runtime | Monitor the resource as any other. |
| resource cost jump after an apply | cost | A change inflated spend. |
Ops Singularity observes the infrastructure Terraform provisions through TelemetryOps and resolves incidents on those resources through governed Action Tickets, while linking them back to the change that caused them. Explore TelemetryOps and InfraOps.
You observe Terraform indirectly: instrument the pipeline that runs plan and apply to emit spans over OTLP, and collect runtime telemetry from the resources Terraform provisions through OpenTelemetry Collector receivers.
By emitting a span for each Terraform apply and correlating changes in resource behaviour or cost with the apply that produced them, so infrastructure incidents link back to the change that caused them.
Bring a real incident. We will show you Sentinel investigate, act and verify end to end, with every action reversible and audited.