Prometheus Label Strategy
Grafana LabsOfficialPublished by Grafana Labs
- Skill
- Guidelines
- Cloud and DevOps
- Apache-2.0
- No issues found
AutoGineer summary
Written by AutoGineer from the skill’s own files, not by the author
This skill provides a comprehensive framework for auditing and designing Prometheus label schemas. It emphasizes preventing high-cardinality issues at the source—within application instrumentation and scrape configurations—rather than using destructive post-ingest filtering. It covers cardinality scoring, histogram bucket management, info-metric patterns, and the critical distinction between source-side prevention and post-ingest cost reduction.
What it does
- Evaluates label schemas using cardinality scoring and access-pattern alignment.
- Provides best practices for application-side instrumentation to prevent unbounded labels.
- Guides users on using relabel_configs for target-level metadata like env, cluster, and team.
- Explains the info-metric pattern to handle high-churn metadata like versions or git SHAs.
- Details the safe use of exemplars for high-cardinality correlation data like trace IDs.
- Outlines the risks of dropping unique labels at scrape time and provides safer alternatives.
When to use it
- When designing a new Prometheus instrumentation strategy for a service.
- When auditing existing metrics to identify sources of high cardinality or excessive series churn.
- When trying to reduce Prometheus storage costs by improving label hygiene.
- When troubleshooting why specific metrics are causing high memory usage or slow query performance.
Advantages
- Prevents data corruption caused by incorrectly dropping unique labels at scrape time.
- Reduces ingestion costs by stopping bad labels before they reach storage.
- Improves query performance by optimizing label sets for aggregation.
- Provides a clear, actionable audit framework for label strategy.
- Offers specific patterns for handling common high-cardinality traps like histograms and ephemeral IDs.
Usage examples
- “How should I handle version labels on my metrics to avoid high churn during deployments?”
- The agent will recommend the info-metric pattern, suggesting you move the version label to a separate, low-cardinality info metric and join it at query time.
- “I have high cardinality on my HTTP request metrics because of raw URL paths. How do I fix this?”
- The agent will advise you to template the paths in your application code (e.g., /users/:id) rather than emitting raw URLs, and explain why this is the most effective source-side fix.
- “Can I use labeldrop to remove the pod label to save money on my Prometheus bill?”
- The agent will explain why this is dangerous, detailing how it breaks counter resets and rate calculations, and will instead suggest using Adaptive Metrics for safe, post-ingest aggregation.
Install
Download the skill as a ZIP:
https://autogineer.com/agent-skills/grafana/prometheus-label-strategy/downloadUnzip it into the cross-client skills folder of your project:
mkdir -p .agents/skills && unzip prometheus-label-strategy.zip -d .agents/skills
Documentation by Grafana Labs
Prometheus Label Strategy Evaluator
You are an expert in Prometheus label strategy. When asked to evaluate, audit, design, or improve a Prometheus label schema — or when a user asks how to prevent high cardinality at the source — use this guide to provide structured, actionable advice.
This skill is about preventing bad labels at the source — in application instrumentation and in scrape target labels — so they never enter storage. It is not about stripping labels off metrics after they've been emitted: removing a label that makes a series unique at scrape time silently breaks the data (see The One Rule below). For reducing the cost of series that already exist in Grafana Cloud, route the user to the adaptive-metrics skill. For diagnosing an active cardinality fire, route to prometheus-cardinality-troubleshooter.
The One Rule: Never Drop a Label That Makes a Series Unique
You cannot remove, at scrape time, any label that makes a series unique. Not pod, not instance, not anything that distinguishes one real series from another. This includes metric_relabel_configs with action: labeldrop and the equivalent prometheus.relabel rules in Alloy.
It looks like a cardinality win. It is not — it breaks the data, silently and permanently:
Counter resets get mixed together. When two pods' counters collapse into one series, their independent restarts interleave on the merged series.
rate()andincrease()then return garbage — often absurdly high values, because every pod restart looks like a counter reset.DPM inflates instead of dropping. Multiple samples now land on the same series in the same scrape — duplicate samples, out-of-order errors, inflated samples-per-minute. People come back weeks later asking "why is my DPM so high?" or "why is
rate()returning absurd numbers?" — and there is no evidence left in the data of where it broke.The aggregation is wrong, not just coarse. A
sumover a label you dropped silently double-counts or under-counts depending on how the collapse happened.
The trap is that none of this errors at config time. The pipeline keeps running; the numbers are just quietly wrong, and the breakage point is invisible after the fact.
The right tools, in order:
Don't emit the bad label in the first place — fix the application code. This is the only place a label can be removed without consequence, because the series was never unique on it to begin with.
For series already flowing into Grafana Cloud that you can't fix at the source → Adaptive Metrics. This is exactly what it is for: it aggregates series correctly — counter-reset-aware, with a recorded audit trail, and reversible — instead of blindly stripping labels. Route the user to the
adaptive-metricsskill.
metric_relabel_configs has a couple of narrow, safe uses (dropping an entire unwanted metric; removing a label that exactly duplicates a target label) — covered in Source-Side Prevention — but reducing cardinality by dropping a distinguishing label is never one of them.
Core Concepts
Series are the fundamental unit in Prometheus. Each unique combination of metric name plus label key-value pairs creates a new active series. Too many series = memory pressure, slow queries, ingest pressure, high bill.
Cardinality = the number of unique values a label can have. Total series for a metric ≈ the product of cardinalities across its labels. A metric with path (100 values), status_code (10 values), method (5 values), and instance (50 values) = 250,000 series per metric. Adding one more high-cardinality label often 10–100×s the count.
The dual impact rule: High-cardinality labels hurt on both paths:
Ingestion path: More active series → larger head block, larger WAL, more memory, larger remote_write payloads, higher Grafana Cloud bill (Active Series + DPM)
Query path: PromQL operators (
sum by,rate, joins) must materialize matching series in memory. High cardinality balloons query memory and latency
Series churn is the silent killer. If a label value changes frequently (deploy version, pod name, ephemeral IDs), every change creates a new series while the old one continues to age out. Daily churn of 100% means you carry roughly 2× the steady-state series count for retention purposes.
The key question for any proposed label: "Will queries that use this metric reliably specify or aggregate on this label?" If no → it should NOT be a label.
Label Evaluation Framework
When auditing a label set, assess each label against these criteria.
Cardinality Scoring
| Label Example | Cardinality | Verdict |
|---|---|---|
env (prod/staging/dev) | 2–5 values | ✅ Good |
job (Prometheus scrape job) | 5–50 values | ✅ Good |
cluster, region | Tens | ✅ Good |
namespace (K8s) | Tens–low hundreds | ✅ Acceptable |
service, workload, container | Tens–hundreds | ✅ Acceptable |
instance (host:port) | Hundreds–low thousands | ⚠️ Evaluate — fine on per-instance metrics, risky on aggregated ones |
pod (K8s) | Thousands + transient = high churn | ⚠️ Required for K8s monitoring and series uniqueness — keep it. If pod-level series are too expensive, reduce them with Adaptive Metrics; never drop at scrape |
path / route (HTTP) | Bounded if templated; unbounded if raw URLs | ⚠️ Only with templated values (/users/:id) |
version, image_tag, git_sha | Grows on every deploy → churn | ⚠️ Use sparingly; consider info-metric pattern |
user_id, request_id, trace_id | Unbounded | ❌ Never as label — use exemplars |
customer_id, tenant_id | Often unbounded | ❌ Only acceptable for small fixed tenant counts |
error_message, query, sql | Unbounded text | ❌ Never |
Access Pattern Alignment
For each label, ask:
Do queries on this metric reliably aggregate by or filter on this label?
Does this label logically segment the metric the way users think about it?
Would removing this label force users to use exemplars, logs, or traces instead — and would that be acceptable for the rare lookup case?
Static vs. Dynamic Label Values
Static / target labels (set once per scrape target via
relabel_configs, e.g.,env=prod,cluster=us-east,team=payments) add cardinality proportional to targets, not requests. Cheap and high-value. Use freely.Dynamic / sample labels (emitted by the application per measurement, e.g.,
status_code,method,cache_hit) multiply cardinality by value count. Keep possible values in the single digits or low tens. The application code is the source of truth — fix it there, not in Prometheus.
Consistency Check
Label names consistent across services? (
statusvsstatus_codevshttp_statusproduces three separate label families — joins break)Label values normalized? (
200vs"200",GETvsget,Errorvserror)Naming convention consistent? Prometheus convention is
snake_casefor both metric and label namesSame concept, same name across services? (
servicevssvcvsapp_name)
Histogram Bucket Discipline (critical, often missed)
Every histogram metric multiplies its base cardinality by (bucket count + 3) — buckets via _bucket{le="..."} plus _sum, _count, and _created (Prometheus 2.39+).
Default
prometheus.DefBucketshas 11 buckets → 14× multiplierA histogram with
method,path,statusalready at 1,000 series becomes 14,000 series after adding histogram cardinalityAlways trim histogram label cardinality first — labels matter 14× more on histograms than on counters/gauges
Consider native histograms (Prometheus 2.40+) which use a single sparse series instead of one-per-bucket — major cardinality reduction for high-resolution latency tracking
Info-Metric Pattern (for high-churn metadata)
When you want to know about a label (e.g., version, git_sha, image_tag) without paying for it on every metric, use an info metric:
# A single low-cardinality counter/gauge of value 1, with the metadata attached
app_build_info{app="payment-api", version="2.4.1", git_sha="a1b2c3"} 1Then join at query time. The classic approach is a vector match with group_left:
sum by (version) (
rate(http_requests_total{app="payment-api"}[5m])
* on (app) group_left (version) app_build_info
)The version label lives on exactly one series per build, not on every metric.
The info() function (simpler join)
PromQL's info() function (experimental, Prometheus 3.0+; enable with --enable-feature=promql-experimental-functions) automates the info-metric join so you don't have to hand-write the * on (...) group_left (...) match:
info(
rate(http_requests_total{app="payment-api"}[5m]),
{version=~".+"}
)info(v, [labelselector]) takes a range/instant vector v and, for each series, finds matching info metrics and adds their labels. The optional second argument is a label-matcher restricting which info labels are attached (here, only version). By default info() joins against the conventional target_info metric and matches on identifying labels (e.g. instance, job), so it's especially ergonomic for OpenTelemetry-style target_info. For custom info metrics like app_build_info the explicit group_left form above is still the most portable.
Prefer info() when you're on Prometheus 3.x and joining against target_info; fall back to the explicit group_left match for older versions, custom info metrics, or when the experimental feature flag isn't enabled.
Evaluation Output Format
When auditing a label set, produce a report in this structure:
## Prometheus Label Strategy Audit
### Summary
[1-2 sentence overall assessment — total estimated active series, biggest risks]
### Per-Label Analysis
| Metric Family | Label | Cardinality | Used in Queries? | Verdict | Action |
|---|---|---|---|---|---|
| http_requests_total | path | Unbounded (raw URLs) | Sometimes | ❌ Remove | Template in code: `/users/:id` not `/users/12345` |
| http_requests_total | pod | High + churn | Rarely | ⚠️ Keep — makes the series unique | If too expensive, aggregate away with Adaptive Metrics; query by `workload` for the common case |
### Histogram-Specific Findings
[Highlight any histograms with high label cardinality — these are 14×+ amplified]
### Estimated Impact
- Active series reduction: [X series → Y series]
- DPM reduction: [X DPM → Y DPM] (samples-per-minute = series × ~6 at 10s scrape)
- Memory impact: [if measurable]
### Recommended Label Set
[Final recommended labels per metric family]
### Implementation Plan
1. [Code changes — instrumentation hygiene: stop emitting bad labels at the source]
2. [Scrape target labels — relabel_configs (additive: env, cluster, team, workload)]
3. [Post-ingest cost reduction on series you can't fix at the source — Adaptive Metrics]
4. [Recording rules to materialize useful aggregates]Recommended Common Target Labels
These should be set as target labels (via relabel_configs on the scrape job, NOT emitted by the app) — they're per-target, low cardinality, high query value:
| Label | Purpose | Notes |
|---|---|---|
job | Prometheus scrape job name | Set automatically by Prometheus |
instance | Target endpoint (host:port) | Set automatically; rename via relabel_configs to a friendlier value if needed |
env | Environment (prod, staging, dev) | Set via static_configs labels or service discovery |
cluster | Multi-cluster differentiation | Critical for federation/Mimir multi-tenant |
region | Geographic region | |
team / squad | Ownership — also useful for access control | |
service | Logical service identity | One service may span multiple jobs |
These should NOT be re-emitted by the application. If the app emits a cluster label, it duplicates the target label and creates collisions / honor_labels decisions you don't want to make.
Kubernetes Patterns
Recommended Labels (from kubernetes_sd_configs)
| Label | Source | Notes |
|---|---|---|
namespace | Pod metadata | Always keep |
container | Pod spec | Low cardinality, useful for multi-container pods |
workload | Derived: {controller_kind}/{controller_name} | Add as a stable aggregation key alongside pod — static, predictable. It's an addition, not a replacement: don't use it as an excuse to drop pod |
service | K8s Service | If scraping via Service |
Handling the pod Label
pod is high-cardinality and transient — it rolls on every deploy and restart, so it dominates churn and series count. But it is also a label that makes K8s series unique, and Kubernetes monitoring (per-pod resource attribution, kube-state-metrics joins) depends on it. The One Rule applies: do not drop pod at scrape time. Collapsing pods into one series mixes their counter resets and breaks rate().
Instead:
Add
workload({controller_kind}/{controller_name}) as a target label viarelabel_configs, so dashboards and alerts can aggregate on the stable workload identity (sum by (workload)) without touchingpod. This is additive — it removes nothing.Don't emit
podfrom application code — let it come from Kubernetes service discovery, so there is exactly one source of truth (see below).If
pod-level series are genuinely too expensive in Grafana Cloud, reduce them with Adaptive Metrics, which aggregatespodaway correctly (post-ingest, counter-reset-aware, reversible) rather than corrupting the raw data at scrape. Route to theadaptive-metricsskill.
Don't Map Ephemeral Fields into Labels in the First Place
uid regenerates on every pod recreation and has no legitimate query use. The fix is to never map it into a label — leave it out of your relabel_configs. (It isn't in default kubernetes_sd_configs output unless you explicitly target it.) Don't try to labeldrop it after the fact — by then it's already distinguishing series, and removing it breaks the data exactly like dropping any other unique label.
One Source of Truth for Target Identity
instance, pod, node, and host should come from scrape target labels, not from application code. If the app also emits its own instance/node, you get duplicates and honor_labels collisions. The fix is in the application — stop emitting them — not a scrape-time labeldrop. (Removing a label that exactly duplicates a target label is the one narrow exception; see metric_relabel_configs.)
kube-state-metrics label propagation ⚠️
kube_pod_labels{label_app_kubernetes_io_*=...}can carry dozens of metadata labelsEach unique pod label combination is a new series
Restrict at the source with kube-state-metrics'
--metric-labels-allowlist— this controls what is ever emitted, so it's prevention, not destructive after-the-fact dropping
Source-Side Prevention: Where to Fix What
There are five levers, in order of preference:
1. Fix in the Application (best)
Bad labels emitted by the app are the root cause. Examples:
HTTP paths: use templated routes (
/users/:id) not raw pathsError metrics: use a small enum (
error_type="timeout") not the error message stringUser-scoped metrics: don't include
user_id— use exemplars to point to logs/tracesFree-form input: never emit user-supplied strings as label values
If you control the code, this is always the right fix. It saves cost on every downstream system (Prometheus, remote_write, Mimir, Grafana Cloud).
2. relabel_configs (target-time relabeling)
Runs before the scrape. Used to:
Set target labels (
env,cluster,team) on discovered targetsDrop entire targets you don't want to scrape
Rewrite
instanceto a friendly valueAdd identity from service discovery metadata
scrape_configs:
- job_name: my-app
kubernetes_sd_configs:
- role: pod
relabel_configs:
# Set workload from controller metadata
- source_labels: [__meta_kubernetes_pod_controller_kind, __meta_kubernetes_pod_controller_name]
target_label: workload
separator: /
# Set env from a pod label
- source_labels: [__meta_kubernetes_pod_label_env]
target_label: env
# Only scrape pods explicitly opted in
- source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_scrape]
regex: "true"
action: keep3. Adaptive Metrics (Grafana Cloud — post-ingest, the safe way to reduce cardinality)
When the cardinality is structural and you can't fix it at the source — the label legitimately exists and makes series unique, you just don't need every value at full resolution — Adaptive Metrics is the correct tool, and the only safe way to reduce the cost of series that already exist.
It works after ingest, as aggregation rules applied in Grafana Cloud. Crucially, it aggregates series correctly:
It handles counter resets properly, so
rate()andincrease()stay accurate.It records what was aggregated, so there's an audit trail — you can answer "why did this change?" later.
It's reversible: drop a rule and the full-resolution series come back.
This is the difference between "the data is now cheaper" (Adaptive Metrics) and "the data is now wrong" (labeldrop at scrape). Route the user to the adaptive-metrics skill for rule design.
4. metric_relabel_configs (narrow, safe uses only)
Runs after the scrape, before storage.
⚠️ Do not use
metric_relabel_configs(or Alloyprometheus.relabel) to drop a label that distinguishes series —pod,instance,user_id,path, anything. See The One Rule. It looks like a cardinality fix and silently breaksrate(), inflates DPM, and corrupts aggregations. Use the application code (lever 1) or Adaptive Metrics (lever 3) instead. The same caution applies to normalizing a label value (e.g. collapsingstatus_codeto2xx) at scrape — it merges distinct series and produces duplicate-sample errors; do that in code or via Adaptive Metrics, never here.
The genuinely safe uses are:
Drop an entire metric you never want stored — you're discarding the whole metric, not collapsing distinct series into one:
metric_relabel_configs: - source_labels: [__name__] regex: my_app_request_details action: dropRemove a label that exactly duplicates a target label. If the app emits its own
cluster/instancethat already comes from the scrape target, the target label still provides uniqueness, so removing the duplicate breaks nothing. Prefer fixing the app, but this is a safe stopgap.
That's the whole list. If you're reaching for metric_relabel_configs to bring down a series count, you almost certainly want Adaptive Metrics instead.
5. Recording Rules (query-time cardinality reduction)
Pre-aggregate expensive series into a lower-cardinality recorded series. Stored at the same data point density but with far fewer series.
groups:
- name: http-requests-aggregates
interval: 30s
rules:
# Drop pod/instance dimension; keep only service-level rollup
- record: service:http_requests:rate5m
expr: sum by (service, env, cluster, status_code) (rate(http_requests_total[5m]))Queries that target the rollup are dramatically cheaper. The raw series still exist — recording rules don't reduce ingest cost (use Adaptive Metrics for that — not a scrape-time labeldrop). They reduce query cost.
Instrumentation Hygiene (for app developers)
If the user is writing instrumentation code, these are the rules:
| Rule | Why |
|---|---|
| Never use unbounded user input as a label value | email, user_id, query string, error message — they're the #1 cardinality bug |
| Template HTTP paths before recording | /users/{id} not /users/12345. Most frameworks do this via routing metadata |
| Bound error labels via small enums | error_type="timeout" not error="connection to db-shard-7 timed out at 14:32:09" |
Don't put version / git_sha / build_id on every metric | Use an info metric and join at query time |
Don't emit pod / node / host from code | Comes from scrape targets — duplicating creates collisions |
| Avoid dynamically constructed label names (keys) | metric{[user]=1} cannot be bounded — use a fixed key |
| Use histograms sparingly and trim labels first | 14× cardinality amplification |
| Prefer exemplars over labels for trace correlation | Exemplars carry trace_id without inflating cardinality |
Exemplars (the escape hatch)
Exemplars attach a trace_id (or any key-value pair) to specific samples without making it a label dimension. The ideal home for high-cardinality correlation data.
Requires OpenMetrics format, Prometheus 2.26+, scrape config:
scrape_configs:
- job_name: my-app
enable_protobuf_negotiation: true
# Or for text-format:
follow_redirects: trueAnd on the Prometheus server:
storage:
exemplars:
max_exemplars: 100000Use exemplars for:
trace_idcorrelation (Tempo, Jaeger)request_idfor specific debug lookupsAny sparse "useful when you need it" key
Query exemplars via Grafana's exemplars-on-graph feature, not via PromQL aggregation.
The 80/20 Rule
The most impactful improvements almost always come from these five changes:
Drop unbounded labels at the app layer —
path(untemplated),user_id,error_message. Single biggest win.Trim histogram label cardinality before anything else — 14× amplification on every histogram.
Don't emit
pod/instance/nodefrom application code — let them come from scrape targets, and add a stableworkloadtarget label to aggregate on. (Never drop the realpodat scrape to cut cardinality — ifpod-level series are too expensive, use Adaptive Metrics.)Use info metrics for
version/git_sha/image_tag— eliminates deploy-driven churn.Set target labels via
relabel_configs, not app code —env,cluster,team,serviceshould never be emitted by the application.
Focus on these before anything else.
Labels to Avoid — Quick Reference
| Label | Why | Alternative |
|---|---|---|
user_id, customer_id (large tenant base) | Unbounded | Exemplars; aggregate by tenant_tier |
request_id, trace_id | Unbounded | Exemplars |
path / route (raw URLs) | Unbounded | Template in code: /users/:id |
error_message, query, sql | Unbounded text | Bounded error_type enum |
version, git_sha, image_tag (on every metric) | Churn on every deploy | Info metric pattern |
App-emitted pod (duplicating SD) | Should come from K8s service discovery, not code | Stop emitting it in code; keep the discovered pod. Never drop the real pod to cut cardinality — use Adaptive Metrics |
uid (K8s) | Unbounded; regenerates on restart | Never map it into a label in the first place (leave it out of relabel_configs) |
Application-emitted instance, node, host | Should come from scrape target | Stop emitting in code (removing an exact target-label duplicate at scrape is the only safe drop) |
| Dynamically-named label keys | Cannot be bounded | Use fixed keys with bounded values |
Raw status_code on histograms | 14× amplification | Bucket to status_class (2xx, 4xx, 5xx) |
When to Route Elsewhere
"Reduce my Grafana Cloud bill" / "reduce cardinality on series already ingested" → engage
adaptive-metricsskill (post-ingest aggregation rules — the safe, counter-reset-aware way; neverlabeldropdistinguishing labels at scrape)"Which metrics are driving my DPM?" → engage
dpm-finderskill"My Prometheus is OOMing / scraping is failing right now" → engage
prometheus-cardinality-troubleshooterskill"How do I write the query to find the bad metric?" → engage
promqlskill"How do I configure relabel rules in Alloy?" → engage
alloyskill
This skill's lane is strategy and design. Other skills own diagnosis and operational remediation.
Files
- ATTRIBUTION.mdAdded by AutoGineer871 B
- LICENSELicence file added by AutoGineer11.1 KiB
- SKILL.md25.1 KiB
LICENSE
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright 2026 Grafana Labs
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
Requirements and compatibility
Works with: Claude Code, Claude apps, OpenAI Codex, GitHub Copilot, Cursor, Gemini CLI, Kiro, OpenCode, Goose, Amp, Roo Code, JetBrains Junie, Factory Droid, Devin (ex-Windsurf), Mistral Vibe, OpenHands, Letta
“Works with” means the tool reads the open Agent Skills format; a skill written for one tool may use features others lack.
Needs: Needs Node.js
Security
No issues found by our static scan· No issues found
A static scan is not a guarantee. Skills are third-party content: review a skill before you let an agent use it.
Attribution and licence
- Published by
- Grafana Labs
- Publisher
- Grafana Labs (Official)
- Source
- grafana/skills · skills/grafana-cloud/prometheus-label-strategy · commit 8fb72a5
- Licence
- Apache License 2.0 (redistribution allowed)
- LICENSE (added by AutoGineer from LICENSE)
- ATTRIBUTION.md (written by AutoGineer)
- Synced
AutoGineer is not affiliated with or endorsed by Grafana Labs or Grafana Labs.
Download ZIP
The ZIP holds the skill’s files, its licence files and an ATTRIBUTION.md. Download prometheus-label-strategy.zip