PCA — Prometheus Certified Associate
The Prometheus Certified Associate is the CNCF’s badge for the most load-bearing tool in cloud native operations. Almost every platform you will build scrapes metrics with Prometheus, stores them as labelled time series, queries them with PromQL and pages a human through Alertmanager — and PCA certifies you can do all four properly rather than by copy-paste. It is knowledge-based, not a lab, but it is no soft exam: more than a quarter of it is PromQL, which punishes anyone who has only ever pasted queries from a blog post. This page reproduces the five official domains and weights exactly as the CNCF publishes them, says honestly when to skip the cert, and maps every domain to lessons you can start reading here today.
Imagine a nurse who walks around a hospital every fifteen seconds and writes down everyone’s temperature on a giant notepad that never forgets. Later you can ask the notepad questions: “whose temperature went up fastest in the last five minutes?” or “how many people were too hot at 3pm yesterday?” Prometheus is that nurse and that notepad. PromQL is the language you use to ask it questions. And Alertmanager is the bit that runs to fetch a doctor when an answer looks scary. The PCA is the badge for knowing how to ask good questions and when to wake the doctor.
What the PCA is — and who it is for
☺ Like you’re 10: It’s an online multiple-choice test about Prometheus — how it collects numbers, how you ask it questions, and how it raises an alarm.
PCA is a knowledge-based, multiple-choice certification from the CNCF and The Linux Foundation, delivered online and remote-proctored. There is no live cluster and no terminal: you are not asked to install Prometheus under a clock, you are asked whether you understand it. That changes what “studying” means. Having helm install kube-prometheus-stack in your shell history will not pass it. Reading a PromQL expression and saying what it returns, reading an exposition-format payload and naming the metric type, reading an alerting rule and saying who it wakes and why — that will.
Who should sit it
- Platform and SRE engineers who own the monitoring stack and want the gaps in their self-taught PromQL closed properly.
- Developers instrumenting their own services — Dot the Duck’s people, who are asked to “add metrics” and would like to know which type to reach for.
- Anyone on call. The alerting domain is, quietly, a course in not destroying your team with pages.
What it deliberately does not test
PCA is scoped tightly. It is not a Kubernetes exam — you will not debug a Pod — and not a Grafana exam either, though “dashboarding basics” is in the blueprint. Nor does it test running Prometheus at scale: long-term storage, federation and HA designs are things an associate should know exist and why, not architect. The curriculum does list “Understanding Prometheus Limitations” as an explicit competency, which is the exam politely telling you it will ask what Prometheus is bad at.
PCA is 28% a language exam. Treat PromQL like a programming language you are learning, not a snippet library you are collecting. If you can explain — out loud, without hedging — why sum(rate(x[5m])) is correct and rate(sum(x)[5m]) is nonsense, you are most of the way through the hardest domain.
Why a platform engineer might take it — and when to skip it
☺ Like you’re 10: If you build platforms, you will use this tool every week. But if you already use it every week, the badge might not teach you much.
The honest case for taking it
Observability is not a bolt-on; it is one of the planes in the reference architecture, and Prometheus is what fills it. Most engineers’ Prometheus knowledge is a patchwork: strong on installing the operator, weak on rate() versus increase(), hazy on why their histogram quantile is a lie, and absent on cardinality until the day the TSDB falls over. PCA’s blueprint is unusually good at forcing you across all of it in one pass. The alerting domain alone — when, what and why to alert — is worth the study time even if you never sit the exam, because it is the difference between an on-call rotation people tolerate and one they quit over.
When to skip it
Skip PCA if you already write multi-line PromQL from memory, have tuned a cardinality problem in anger, and can explain a counter versus a gauge without notes — you will pass it cold, so the badge signals nothing your work history doesn’t. Skip it too if metrics are somebody else’s job and you are being pulled toward delivery or security: CGOA, KCSA or CKS pay back faster. And skip it if a job description names a different credential; chase the named cert, not the shelf.
“Our platform team told me to ‘add a metric for checkout latency.’ I added a gauge, set it to the last request’s duration, and built a dashboard on it. It looked beautiful and it was completely useless — one slow request out of ten thousand vanished between scrapes. After PCA I know that was a histogram, that the buckets need choosing on purpose, and that histogram_quantile exists. That one lesson has paid for the exam several times over.”
How it relates to the CNPE
The CNPE has an Observability & Operations domain worth 20%, and it is performance-based: you build and wire the stack rather than describe it. The two point in opposite directions on the same material, which makes them complementary rather than redundant — PCA gives you the depth (query language, data model, alerting philosophy) that stops CNPE’s observability tasks from being guesswork under a clock.
| Credential | Style | Certifies | Take it if… |
|---|---|---|---|
| PCA | Knowledge-based | You understand metrics, PromQL and alerting properly | You own or consume a metrics stack and your PromQL is patchy |
| OTCA | Knowledge-based | You understand OpenTelemetry — traces, and vendor-neutral instrumentation | You want the other half of the observability story |
| CNPA | Knowledge-based | You understand platform engineering as a discipline | You want the platform layer above the tooling |
| CNPE | Performance-based | You can build and operate a platform under time pressure | You do this work and want to prove it with your hands |
The official domains and their weights
☺ Like you’re 10: The test has five parts and they are not the same size. The biggest single part is the question language, PromQL.
The names, percentages and competency lists below are transcribed from the CNCF’s Prometheus Certified Associate (PCA) Exam Curriculum — not our interpretation of it. Five domains, 26 competencies, and the weights sum to exactly 100%; if a study guide you find elsewhere doesn’t add up, it has been paraphrased. Check the current version in the official CNCF curriculum repository before you build a plan on it:
Every competency, domain by domain
| Domain | Weight | Competencies (official) |
|---|---|---|
| PromQL | 28% | Selecting Data · Rates and Derivatives · Aggregating over time · Aggregating over dimensions · Binary operators · Histograms · Timestamp Metrics |
| Prometheus Fundamentals | 20% | System Architecture · Configuration and Scraping · Understanding Prometheus Limitations · Data Model and Labels · Exposition Format |
| Observability Concepts | 18% | Metrics · Understand logs and events · Tracing and Spans · Push vs Pull · Service Discovery · Basics of SLOs, SLAs, and SLIs |
| Alerting & Dashboarding | 18% | Dashboarding basics · Configuring Alerting rules · Understand and Use Alertmanager · Alerting basics (when, what, and why) |
| Instrumentation and Exporters | 16% | Client Libraries · Instrumentation · Exporters · Structuring and naming metrics |
Where the weight really sits
Read the shape rather than the list. PromQL plus Prometheus Fundamentals is 48%; add Instrumentation and Exporters and 64% of the exam is Prometheus proper. The remaining 36% splits between vendor-neutral observability theory and the alerting-and-dashboarding layer on top — and that is where careless candidates lose marks, because Observability Concepts reaches beyond metrics entirely, into logs, events, tracing and spans and the SLO/SLA/SLI vocabulary. It feels like reading rather than studying, so it gets skipped.
Two competencies are easy to under-read because they sound like filler and are not. “Timestamp Metrics” (in PromQL) is the time()-minus-a-timestamp pattern that answers “how long since this last succeeded?” — the backbone of freshness and batch-job alerting. And “Understanding Prometheus Limitations” (in Fundamentals) is a whole competency devoted to what Prometheus is not. Both are cheap marks if you read them once on purpose.
What you actually need to know
☺ Like you’re 10: Here’s the real stuff — how the numbers are shaped, how you ask questions about them, and how an alarm gets raised.
The data model, exposition format and the four metric types
Everything starts with the data model. A Prometheus time series is a metric name plus a set of labels, and every unique combination of label values is a separate series. That one sentence explains both Prometheus’ power (slice any dimension you recorded) and its most famous failure mode (put a user ID or request ID in a label and you create millions of series — a cardinality explosion that eats memory and takes the server down). Targets expose metrics over plain HTTP in the exposition format, a text payload scraped on an interval.
# What a target actually serves at /metrics — the exposition format.
# HELP http_requests_total Total HTTP requests served.
# TYPE http_requests_total counter
http_requests_total{code="200",method="get"} 42981
http_requests_total{code="500",method="get"} 17
# A gauge can go up AND down.
# TYPE node_memory_MemAvailable_bytes gauge
node_memory_MemAvailable_bytes 3.221225472e+09
# A histogram is really several series: cumulative _bucket, plus _sum and _count.
# TYPE http_request_duration_seconds histogram
http_request_duration_seconds_bucket{le="0.1"} 41230
http_request_duration_seconds_bucket{le="0.5"} 42800
http_request_duration_seconds_bucket{le="+Inf"} 42998
http_request_duration_seconds_sum 3120.5
http_request_duration_seconds_count 42998| Type | Behaviour | Use it for | Query it with |
|---|---|---|---|
| Counter | Only ever increases; resets to 0 on restart | Requests served, errors, bytes sent | rate(), increase() — never the raw value |
| Gauge | Goes up and down | Memory in use, queue depth, temperature | Read directly; avg_over_time(), delta() |
| Histogram | Cumulative buckets chosen in advance, plus sum and count | Request latency, response sizes | histogram_quantile() over rate(..._bucket[5m]) |
| Summary | Quantiles calculated in the client, per instance | Latency when you cannot pre-pick buckets | Read the quantile series — but it cannot be aggregated across instances |
The histogram-versus-summary distinction is both a reliable exam question and a reliable production mistake: buckets are cumulative and aggregatable, so you can compute a fleet-wide p99, while client-side summary quantiles are not, so averaging them across ten pods produces a meaningless number. Naming matters too — base units as a suffix (_seconds, _bytes), counters ending in _total, and a name that describes the thing measured rather than the dashboard you plan to build.
PromQL — the 28%
PromQL has two core value types and almost everything follows from telling them apart. An instant vector is one sample per series at one moment. A range vector — created by a duration selector like [5m] — is every sample in a window, and it cannot be graphed directly; it must be passed through a function that collapses it back down.
# SELECTING DATA — an instant vector, filtered by label matchers
# = equals != not-equals =~ regex-match !~ regex-not-match
http_requests_total{job="checkout", code=~"5.."}
# A RANGE VECTOR — every sample in the last 5 minutes
http_requests_total{job="checkout"}[5m]
# RATES — rate() gives the per-second average increase of a COUNTER,
# and it handles counter resets for you. Always rate() BEFORE you sum():
sum by (code) (rate(http_requests_total{job="checkout"}[5m]))
# BINARY OPERATORS — matching series by their labels gives an error RATIO
sum(rate(http_requests_total{job="checkout", code=~"5.."}[5m]))
/ sum(rate(http_requests_total{job="checkout"}[5m]))
# HISTOGRAMS — 99th-percentile latency in seconds. Keep `le` when aggregating!
histogram_quantile(0.99,
sum by (le) (rate(http_request_duration_seconds_bucket{job="checkout"}[5m])))
# AGGREGATING OVER TIME (a range vector collapses to one value per series)
min_over_time(node_memory_MemAvailable_bytes[1h])
# AGGREGATING OVER DIMENSIONS (collapse labels, keep the ones you name)
topk(5, sum by (pod) (rate(container_cpu_usage_seconds_total[5m])))
# TIMESTAMP METRICS — hours since the last successful backup
(time() - platform_backup_last_success_timestamp_seconds) / 3600Four traps carry most of the marks. One: rate() and increase() take a range vector and are for counters only — meaningless on a gauge, and applying rate() to an already-summed series discards the reset handling. Two: the range must span several scrape intervals; rate(x[15s]) with a 15-second scrape gives you nothing usable. Three: by keeps the labels you list and without does the reverse — and histogram_quantile needs le kept. Four: binary operations match on identical label sets, which is why an otherwise-correct ratio returns empty when one side carries a label the other doesn’t.
Architecture, scraping and service discovery
Prometheus is a single binary that pulls. On an interval it scrapes HTTP endpoints it discovered, appends samples to a local time-series database, evaluates recording and alerting rules, and forwards firing alerts to Alertmanager, which is a separate process responsible for grouping, silencing, inhibition and routing to receivers. The Pushgateway exists only for short-lived batch jobs that die before they can be scraped — it is a narrow exception, not a general push channel, and knowing that is a classic push vs pull question.
global:
scrape_interval: 15s # how often we pull every target
evaluation_interval: 15s # how often rules are evaluated
scrape_configs:
- job_name: kubernetes-pods
kubernetes_sd_configs: # SERVICE DISCOVERY: targets are not static
- role: pod
relabel_configs: # relabelling runs BEFORE the scrape
- source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_scrape]
action: keep # drop every pod that isn't opted in
regex: "true"
- source_labels: [__meta_kubernetes_pod_label_app]
target_label: app # promote a pod label to a metric label
alerting:
alertmanagers:
- static_configs: [ { targets: ["alertmanager:9093"] } ]
rule_files:
- /etc/prometheus/rules/*.yamlService discovery is why the pull model scales in Kubernetes: nothing has a stable IP, so Prometheus asks the API server what exists and re-derives its target list continuously. Relabelling is the filter in front of that — keep and drop decide what gets scraped at all, while metric_relabel_configs runs after the scrape and is your emergency brake on a high-cardinality metric. And the limitations: Prometheus stores data locally and is not a clustered database, is not built for long-term retention (that is Thanos, Mimir or Cortex), is not for event or per-request logging, and does not give billing-grade accuracy — it samples.
Instrumentation, exporters, alerting and dashboards
Metrics get in two ways. Client libraries (Go, Python, Java, Ruby, Rust and more) instrument your own code directly; exporters translate something that doesn’t speak Prometheus — node_exporter for machines, blackbox_exporter for probes, one for practically every database — into the exposition format.
from prometheus_client import Counter, Histogram, start_http_server
# Name in base units, counters end in _total, labels are LOW cardinality.
REQUESTS = Counter(
"http_requests_total", "Total HTTP requests served.",
["method", "code"], # NEVER user_id, request_id or raw URL path
)
LATENCY = Histogram(
"http_request_duration_seconds", "Request duration in seconds.",
buckets=[0.01, 0.05, 0.1, 0.25, 0.5, 1, 2.5, 5], # chosen up front
)
@LATENCY.time()
def handle(request):
response = do_work(request)
REQUESTS.labels(method=request.method, code=response.status).inc()
return response
start_http_server(8000) # exposes /metrics for Prometheus to scrapeAlerting is where the exam turns opinionated, rightly. Rules come in two kinds: recording rules precompute an expensive expression on a schedule under a new name (conventionally level:metric:operation), and alerting rules fire when an expression keeps returning series for longer than for:.
groups:
- name: checkout-slos
rules:
# RECORDING rule — precompute once, query it everywhere
- record: job:http_request_errors:ratio_rate5m
expr: |
sum by (job) (rate(http_requests_total{code=~"5.."}[5m]))
/ sum by (job) (rate(http_requests_total[5m]))
# ALERTING rule — a SYMPTOM, not a cause; `for` survives a blip
- alert: CheckoutHighErrorRate
expr: job:http_request_errors:ratio_rate5m{job="checkout"} > 0.05
for: 10m
labels:
severity: page # Alertmanager routes on labels
annotations:
summary: "Checkout is serving {{ $value | humanizePercentage }} errors"
runbook_url: https://runbooks.example.com/checkout-high-error-rateThe when, what and why competency is the philosophy behind that YAML. Alert on symptoms your users feel — error ratio, latency, saturation — not causes like “CPU is at 80%,” which may be entirely fine. Every page must be actionable and carry a runbook; anything not worth waking a human for is a ticket or a dashboard. In Alertmanager, grouping collapses a storm into one notification, inhibition suppresses downstream alerts when a parent is already firing, and silences mute known work. On the dashboard side: a panel is a PromQL query plus a visualisation, template variables make one dashboard serve many services, and the SLI/SLO/SLA vocabulary matters — an SLI is the measurement, an SLO your internal target, an SLA the contractual promise with consequences, and the error budget the gap between SLO and perfection.
Format, duration, question count, pass mark, price, retake policy, eligibility window, certification validity — and even the domain weights themselves — are revised by The Linux Foundation and CNCF over time. This page reflects the landscape in 2026, and the curriculum above is the version of the official CNCF PDF we read. Before you register, read the official PCA pages end to end and confirm the current figures, the candidate handbook and the system requirements. If anything here disagrees with them, they are right and this page is stale.
How to prepare using this site
☺ Like you’re 10: Every part of the test already has a page here. Read them in this order and you’ve read the whole syllabus.
This site was written for the CNPE, so its observability material sits one layer above PCA — deeper on how a platform team runs the stack, just as deep on the mechanics. Use the middle column to pass, the right column when a concept refuses to stick.
| PCA domain | Read these first | Go deeper |
|---|---|---|
| PromQL 28% | Prometheus — the PromQL essentials and rule sections | Command reference · Observability practice tasks · Know cold |
| Prometheus Fundamentals 20% | Prometheus — architecture, service discovery, relabelling, the TSDB | Observability & operations · Scaling & scheduling · KEDA (metrics-driven autoscaling) |
| Observability Concepts 18% | Observability & operations — the three pillars, golden signals, SLOs | Loki (logs) · Jaeger (traces & spans) · OpenTelemetry · Reliability & SLOs |
| Alerting & Dashboarding 18% | Grafana · Reliability & incidents | Observability lab · Troubleshooting playbook · Workload triage · Field notes |
| Instrumentation and Exporters 16% | OpenTelemetry · Prometheus — exporters and ServiceMonitors | Developer experience · OpenCost (an exporter in the wild) · Glossary |
Three to four weeks is comfortable if you have used Prometheus at all. Week one: fundamentals and the data model, until the exposition format and the four metric types are automatic. Week two: PromQL only — the largest domain and the only one needing daily repetition. Week three: alerting, Alertmanager, dashboards, instrumentation and exporters. Week four: observability concepts beyond metrics, then revise with the flashcards, quiz and glossary.
Run Prometheus and one exporter locally — node_exporter is enough — and live in the expression browser, not a dashboard. Type these seven and predict each answer before you press enter: a bare counter; that counter wrapped in rate(...[5m]); the same summed by (instance); a gauge with avg_over_time(...[1h]); a two-vector division; a histogram_quantile that keeps le; and the same one with le dropped — so you see exactly how it breaks. Then open /targets and /service-discovery in the UI and read what relabelling did to your labels. One evening of that beats a week of reading.
Exam logistics — and how to verify them
☺ Like you’re 10: It’s an online test you take from home with someone watching through your webcam. The price and length change, so always check the official page before you pay.
Some things about PCA are structural and safe to state; others are exactly the sort of detail The Linux Foundation revises without ceremony. This page separates the two on purpose.
What we can state with confidence
| Item | Detail |
|---|---|
| Full name | Prometheus Certified Associate (PCA) |
| Provider | CNCF & The Linux Foundation |
| Level | Associate — alongside KCNA, KCSA, CGOA, OTCA and CNPA |
| Format | Knowledge-based, multiple-choice. No cluster, no terminal, no performance tasks. |
| Delivery | Online and remote-proctored, with a system check, a webcam room scan, and a government-issued photo ID matching your registration |
| Blueprint | Five weighted domains, 26 competencies — exactly as tabulated above, from the official CNCF curriculum PDF |
| Prerequisites | None. PCA gates nothing and nothing gates it |
What you must check on the official page
These move: duration, question count, pass mark, price, retake policy, eligibility window and certification validity. Linux Foundation associate exams have historically clustered around a common closed-book shape — roughly a 90-minute sitting of about 60 multiple-choice questions, a price near US$250 including one free retake, a 12-month window in which to sit it, and a credential valid for two years. The question count in particular is a pattern, not a promise — no official page states one — so do not schedule against numbers from any third-party site, including this one. The pass mark is not in that category: the Linux Foundation’s Multiple Choice Exam FAQ states that “a score of 75% or above must be earned to pass the Multiple Choice Exam”, a published requirement that covers every Linux Foundation multiple-choice exam, PCA included. Aim well clear of 75%. Note too that PCA has no documentation allowlist the way the hands-on exams do — it is closed-book, so the Prometheus documentation is study material, not an exam-day resource. Don’t confuse the eligibility window (how long you have to sit the exam after buying it) with the certification validity (how long the credential lasts after you pass); both are on the official page, and both change.
↗ Official PCA page — Linux Foundation ◆ CNCF certification page ◆ Official CNCF curriculum repository
Foxy: Why would I certify one tool? Isn’t that the opposite of vendor-neutral?
Ellie: Because it isn’t really one tool, Foxy — it’s a data model and a query language the whole ecosystem borrowed. Learn PromQL once and you can read Thanos, Mimir, Cortex and half of Grafana.
Nutty: And the 18% Observability Concepts domain reaches well past metrics! Logs, events, traces, spans, push versus pull, SLOs versus SLAs — free marks nobody revises!
Gizmo: Easy. I’ll just alert on every metric. Full coverage. Nothing gets past Gizmo. 🔔🔔🔔
Timmy: That’s not coverage, that’s a denial-of-service attack on your own team. Alert on symptoms users feel. Everything else is a dashboard.
Dot: Can somebody just tell me why my p99 latency panel says 4 milliseconds when the page takes six seconds to load?
Ellie: You dropped the le label when you aggregated, so histogram_quantile is answering a question you didn’t ask. Twenty-eight percent of the exam, right there.
Where PCA sits in the ladder — and what to do next
☺ Like you’re 10: This badge is one specialist rung. From here you either widen to the rest of observability, or climb toward building whole platforms.
PCA is a specialist associate — narrow, deep and immediately useful, unlike the broad associates that survey a whole field. The certifications overview maps the shelf; here are the three sensible directions out.
Widen across observability
Prometheus covers metrics; its natural partner is OTCA, the OpenTelemetry associate, which covers vendor-neutral instrumentation and the traces-and-spans half PCA only touches. Together they make you the person who owns the observability plane — and this site’s OpenTelemetry, Jaeger, Loki and Grafana pages already cover most of it.
Climb toward the platform
If observability is one plane of a platform you want to build, go PCA → CNPA → CNPE: CNPA covers the discipline, CNPE puts your hands on the keyboard, and its 20% observability domain will feel like a gift after this. If the substrate underneath is still blurry, detour through KCNA or CKA first — PCA assumes you know what a Pod and a Service are.
Go build — the part that compounds
A certificate is a signal; a working stack is a skill. Take one real service and give it the full treatment: instrument it with a counter and a histogram, scrape it via a ServiceMonitor, write a recording rule and a symptom-based alert with a runbook link, route it through Alertmanager with sensible grouping, and put a four-panel golden-signals dashboard in front of it. Then define one honest SLO and watch the error budget move. That single loop is the whole PCA blueprint made real — the lab track walks it and the field notes show what it looks like when it goes wrong. And keep an eye on the official curriculum: the version you studied is not guaranteed to be the version you sit.
1. Name the five official PCA domains and their weights. 2. Which domain is the largest, and what percentage of the exam is Prometheus proper once you add Instrumentation and Exporters? 3. Why is sum(rate(x[5m])) correct while rate(sum(x)[5m]) is wrong? 4. What is the difference between a histogram and a summary, and why does it matter when you aggregate across instances? 5. What does the for: field on an alerting rule do? 6. What is Pushgateway actually for? 7. Which exam details should you never trust from a third-party page, and where do you check them?
Check your answers
- PromQL 28%; Prometheus Fundamentals 20%; Observability Concepts 18%; Alerting & Dashboarding 18%; Instrumentation and Exporters 16%.
- PromQL at 28%. PromQL (28) + Fundamentals (20) + Instrumentation and Exporters (16) = 64% of the exam on Prometheus itself.
rate()must be applied to a counter range vector so it can handle counter resets per series; summing first destroys the individual series and their resets. Rate first, then aggregate.- A histogram exposes cumulative
_bucketseries with pre-chosen boundaries, so buckets can be summed across instances and a fleet-wide quantile computed withhistogram_quantile(). A summary computes quantiles in the client, per instance — those quantiles cannot be aggregated; averaging them across pods is meaningless. for:requires the expression to keep returning that series continuously for the given duration before the alert moves from pending to firing — it suppresses transient blips.- Short-lived batch jobs that finish before Prometheus can scrape them. It is a narrow exception, not a general push endpoint — Prometheus is a pull system.
- Duration, question count, pass mark, price, retake policy, eligibility window and validity — and confirm the domain weights too. Check the official Linux Foundation PCA page and the CNCF certification page — they change, and they are the only authority.