Mz Release Signoff
MaterializeInc/materialize
Verify a release candidate on the Grafana dashboards and sign off in release.
Expert evaluator for Grafana Loki label strategy. An agent skill from grafana/skills.
$ npx skills add grafana/skills --skill loki-label-analyzer -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install grafana/skills loki-label-analyzer --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/grafana/skills.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/grafana-cloud/loki-label-analyzer .claude/skills/loki-label-analyzer && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "loki-label-analyzer" agent skill from https://github.com/grafana/skills/tree/main/skills/grafana-cloud/loki-label-analyzer into .claude/skills/loki-label-analyzer/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "loki-label-analyzer", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/grafana/skills/tree/main/skills/grafana-cloud/loki-label-analyzerType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add grafana/skills --skill loki-label-analyzer -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install grafana/skills loki-label-analyzer --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/grafana/skills.git skills-src && mkdir -p .agents/skills && cp -r skills-src/skills/grafana-cloud/loki-label-analyzer .agents/skills/loki-label-analyzer && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "loki-label-analyzer" agent skill from https://github.com/grafana/skills/tree/main/skills/grafana-cloud/loki-label-analyzer into .agents/skills/loki-label-analyzer/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "loki-label-analyzer", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add grafana/skills --skill loki-label-analyzer -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install grafana/skills loki-label-analyzer --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/grafana/skills.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/skills/grafana-cloud/loki-label-analyzer .cursor/skills/loki-label-analyzer && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "loki-label-analyzer" agent skill from https://github.com/grafana/skills/tree/main/skills/grafana-cloud/loki-label-analyzer into .cursor/skills/loki-label-analyzer/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "loki-label-analyzer", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/grafana/skills.git --path skills/grafana-cloud/loki-label-analyzer--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add grafana/skills --skill loki-label-analyzer -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install grafana/skills loki-label-analyzer --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/grafana/skills.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/skills/grafana-cloud/loki-label-analyzer .gemini/skills/loki-label-analyzer && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "loki-label-analyzer" agent skill from https://github.com/grafana/skills/tree/main/skills/grafana-cloud/loki-label-analyzer into .gemini/skills/loki-label-analyzer/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "loki-label-analyzer", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install grafana/skills loki-label-analyzerInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add grafana/skills --skill loki-label-analyzer -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/grafana/skills.git skills-src && mkdir -p .github/skills && cp -r skills-src/skills/grafana-cloud/loki-label-analyzer .github/skills/loki-label-analyzer && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "loki-label-analyzer" agent skill from https://github.com/grafana/skills/tree/main/skills/grafana-cloud/loki-label-analyzer into .github/skills/loki-label-analyzer/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "loki-label-analyzer", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add grafana/skills --skill loki-label-analyzer -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install grafana/skills loki-label-analyzer --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/grafana/skills.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/skills/grafana-cloud/loki-label-analyzer .opencode/skills/loki-label-analyzer && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "loki-label-analyzer" agent skill from https://github.com/grafana/skills/tree/main/skills/grafana-cloud/loki-label-analyzer into .opencode/skills/loki-label-analyzer/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "loki-label-analyzer", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
loki-label-analyzerExpert evaluator for Grafana Loki label strategy. An agent skill from grafana/skills.
Loki Label Analyzer is an agent skill from grafana/skills, published by the product's own GitHub organization. Expert evaluator for Grafana Loki label strategy. Audits, designs, and improves label schemas using cardinality scoring, access-pattern alignment, static vs. dynamic label rules, and consistency checks. Use when the user asks to evaluate, audit, design, or improve a Loki label strategy — or asks why their Loki queries are slow.
Its SKILL.md is about 5.4k tokens, which your agent loads only when the skill is triggered. The skill folder holds 5 other files, including reference files (for example `references/cost-impact.md`, `references/disclaimer.md` and `references/log-line-optimization.md`).
It sits in DevOps & Cloud, covering Monitoring and alerting. It works with Grafana. The licence is Apache-2.0.
3 steps, taken from the first numbered list in SKILL.md.
Read from SKILL.md and the folder at commit 1ccacf2. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
No scripts in the folder and no shell commands in SKILL.md (its code samples are alloy, logql and yaml).
From the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Loki Label Analyzer loads about 5.4k tokens when it runs, and up to ~8.4k if it reads all its reference files. Until then it costs about 87 tokens; SKILL.md has 1,951 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from grafana/skills at commit 1ccacf2, republished under its Apache-2.0 licence (© grafana). 1,951 words, ~5,429 tokens.
.claude/skills/loki-label-analyzer/SKILL.md (or your agent's skills folder). This skill also uses 4 other files; get the full folder from GitHub.You are an expert in Grafana Loki label strategy. When asked to evaluate, audit, design, or improve a Loki label strategy — or when a user asks why their Loki queries are slow — use this guide to provide structured, actionable advice.
Streams are the fundamental unit in Loki. Each unique combination of label key-value pairs creates a new stream. Too many streams = performance problems. Too few = broad, slow queries.
Cardinality = the number of unique values a label can have. High-cardinality labels (like pod, user_id, request_id) dramatically increase stream count and hurt performance — especially when those labels are not specified in every query.
The dual impact rule: High-cardinality labels hurt on both paths:
The key question for any dynamic label: "Will this label be used in 9 out of 10 queries?" If no → it should NOT be a label — except platform / correlation labels (below).
Platform / correlation labels are exempt from drop recommendations. Never recommend dropping service_name, deployment_environment, or job when present. Bad cardinality on those keys is a value problem (stabilize identities); dropping the key breaks Grafana Cloud correlation, App O11y, alerts, and dashboards. Load references/protected-labels.md before any demote/label_keep advice.
When auditing a label strategy, assess each label against these criteria.
| Label Example | Cardinality | Verdict |
|---|---|---|
service_name / deployment_environment / job | Any | ✅ Keep key — remediate values if high-card (never drop) |
env (prod/staging/dev) | 2–5 values | ✅ Good |
level (info/warn/error) | 3–6 values | ✅ Good |
namespace (K8s) | Tens | ✅ Acceptable |
instance / hostname | Hundreds–thousands | ⚠️ Evaluate access patterns |
pod | Thousands + transient | ⚠️ Demote off index (structured metadata) — migrate selectors first |
user_id, request_id | Unbounded | ❌ Never use as label |
For each label, ask:
platform=linux, job=agent) add no cardinality cost relative to the query scope. Use freely for LBAC, exploration, and alert routing.Level ≠ level)INFO, info, Info should all become info)snake_case or camelCase — be consistent)When auditing a label set, produce a report in the structure below.
Hard requirements before finalizing any audit report:
### Disclaimer heading. An empty Disclaimer heading is a failed report — do not ship the audit until both paragraphs are present. Never paraphrase, summarize, or omit this text.service_name, deployment_environment, or job when present — only value remediation. Include a Downstream dependency check covering alerts, dashboards, LBAC, and correlation.Report completion check: Before delivering, confirm (a) the output contains the substring Confidential Information of Raintank, Inc. immediately after ### Disclaimer, (b) Cost Impact Analysis uses scenario cards (A/B/C) with a Billing note opener and a bullet Measured baseline — not a scenario table and not panelId/targets JSON, and (c) no Action cell recommends dropping an allowlisted correlation label. If (a) is missing, paste from references/disclaimer.md and re-emit. If (b) fails, rewrite Cost Impact from references/cost-impact.md. If (c) fails, rewrite Actions per references/protected-labels.md.
## Loki Label Strategy Audit
### Disclaimer
[Paste BOTH paragraphs from references/disclaimer.md HERE — never leave this heading empty]
### Summary
[1-2 sentence overall assessment]
### Downstream dependency check
[Alerts / dashboards / LBAC / correlation that select on labels proposed for demote or rename — or "unknown; confirm with customer before cutover"]
### Label Analysis
| Label | Cardinality | Used in Queries? | Verdict | Action |
|---|---|---|---|---|
| service_name | High (UUID values) | Always | ✅ Keep key | Stabilize values to durable service identity — do not drop label |
| deployment_environment | Low | Often | ✅ Keep | — |
| job | Low–medium | Often | ✅ Keep | — |
| pod | Very High (transient)| Rarely | ⚠️ Demote | Move to structured metadata or embed; migrate selectors first |
### Estimated Impact
- Stream count reduction: [X streams → Y streams]
- Query performance: [describe improvement]
- Storage impact: [if log line changes are involved]
- Correlation impact: [none if allowlist preserved; call out if aliases need dual-write]
### Cost Impact Analysis
[Follow references/cost-impact.md Required report shape — do not invent a table]
**Billing note:** Label hygiene alone does not reduce billable ingest bytes.
Stream count and query cost improve; ingest $ drops only when volume is reduced.
**Measured baseline** (Grafana Cloud usage metrics):
- Active streams: [N]
- Billable ingest: [rate]
- Overage: [units or $]
- Top ingest contributor: [name + rate] (omit if unavailable)
**Scenario A — Label hygiene only (this audit)**
- Actions / stream impact / volume=$0 / overage unchanged
**Scenario B — A + approved debug/trace drop**
- Actions / volume % / $ or overage estimate / customer-approval guardrail
**Scenario C — B + log-line compaction**
- Actions / additional volume % / highest-value target
**Attribution gap:** [...]
**Caveats:** [...]
### Recommended Label Set
[Final recommended labels — must include service_name, deployment_environment, job when present]
### Migration Notes
[How to implement changes via Alloy/Agent pipeline stages; dual-write / selector updates for any demote or rename]Every log source should consider these base labels — all low cardinality, high query value:
| Label | Purpose |
|---|---|
service_name | Identifying the generating application (OTel service.name — required for Grafana Cloud correlation / App O11y) |
deployment_environment | Deployment environment (OTel deployment.environment) — keep when present |
job | Collector / OTel job (namespace/service.name pattern common on span metrics) — keep when present |
app / service | Legacy aliases only — prefer aligning to service_name; do not delete without a migration plan |
env | Environment shorthand (prod, staging, dev) when deployment_environment is absent |
cluster | Multi-cluster differentiation |
region | Geographic region |
level | Log severity — normalize to: info, warn, error, debug |
team / squad | Ownership (also useful for LBAC) |
source | Log origin type (file, k8s-events, journal, syslog, etc.) |
classification | Data sensitivity level — for LBAC policies |
Always include allowlisted correlation labels in any label_keep list — see references/protected-labels.md.
| Label | Description |
|---|---|
service_name | Stable service identity (OTel service.name) — keep; remediate UUID/ephemeral values |
namespace | K8s namespace — delineates isolation boundaries |
container | Container name — low cardinality, differentiates log formats |
workload | {controller_kind}/{controller_name} e.g. ReplicaSet/payment-api — strongly recommended |
Why workload beats app for K8s: Derived from {{controller_kind}}/{{controller_name}} — static values that never change like pod names do. Unlike app (which may aggregate multiple workload types), workload is precise and predictable. Users always know exactly what value to query. Still keep service_name for cross-signal correlation even when using workload.
pod label ⚠️
pod → 10 × N streamsworkload as the index label; store pod in structured metadata or embed in the log line. Migrate any alerts/dashboards that select on pod before demoting.filename label (raw K8s path) ⚠️
/var/log/pods/{namespace}_{pod}_{pod_id}/{container}/{rotation}.logpod_id component makes this unbounded/var/log/pods/{namespace}/{controller_name}/{container}.log or demote entirely after checking selectors// Normalize K8s filename to remove pod UID
stage.replace {
source = "filename"
expression = "/var/log/pods/([^/]+)_[^_]+_[^/]+/([^/]+)/\\d+\\.log"
replace = "/var/log/pods/$1/$2/current.log"
}In addition to common labels, add:
| Label | Description | Notes |
|---|---|---|
instance | Hostname of the machine | Cardinality = number of machines; acceptable for fixed infrastructure |
filename | Full path to the file being tailed | Normalize rotating filenames — strip date suffixes |
// Remove date suffixes from rotating log file names
// /var/log/myapp/logfile-20230927.txt → /var/log/myapp/logfile.txt
stage.replace {
source = "filename"
expression = "-\\d{8}(\\.log|\\.txt)$"
replace = "$1"
}When collecting via loki.source.journal, many labels are auto-discovered under __journal__*:
boot_id, cap_effective, cmdline, comm, exe, gid, hostname, machine_id, pid, stream_id, systemd_cgroup, systemd_invocation_id, systemd_slice, systemd_unit, transport, uid
Almost all are high-cardinality. Keep instance (hostname) and unit (systemd_unit, e.g. nginx.service), plus any allowlisted correlation labels present on the stream (service_name, deployment_environment, job).
Drop other non-allowlisted high-cardinality journal labels (not platform keys):
loki.process "journal_labels" {
forward_to = [...]
stage.label_keep {
values = ["instance", "unit", "env", "cluster", "service_name", "deployment_environment", "job"]
}
}Structured metadata attaches key-value pairs to log entries without making them index labels. The ideal home for high-cardinality values users occasionally need.
Requires: Loki 2.9+, Grafana Agent/Alloy. Enable via limits_config:
limits_config:
allow_structured_metadata: trueGood candidates for structured metadata (not labels):
pod — K8s pod namenode — K8s worker nodeversion / image / tagtrace_id / user_idprocess_idrestarted — pod restart timestampQuery structured metadata at query time without a parser:
{service_name="payment-api"} | pod="payment-api-7f9d4b-xk2r9"When structured metadata isn't available, embed high-cardinality values into the log line rather than using them as labels.
loki.process "embed_pod" {
forward_to = [...]
// For JSON logs
stage.match {
selector = "{} |~ \"^\\s*\\{\""
stage.replace {
expression = "\\}$"
replace = ""
}
stage.template {
source = "log_line"
template = "{{ .Entry }},\"_pod\":\"{{ .pod }}\"}"
}
}
// For text logs
stage.match {
selector = "{} !~ \"^\\s*\\{\""
stage.template {
source = "log_line"
template = "{{ .Entry }} _pod={{ .pod }}"
}
}
stage.output { source = "log_line" }
}Result: ts=... msg="..." _pod=agent-logs-cqhfk
Query by aggregate (normal use):
sum(count_over_time({workload="ReplicaSet/payment-api", level="error"}[1m]))Query a specific pod (edge case debugging):
{workload="ReplicaSet/payment-api", level="error"} |= `_pod=payment-api-3`loki.process "pack_pod" {
forward_to = [...]
stage.pack {
labels = ["pod"]
ingest_timestamp = false
}
}Packed result: {"_entry": "original log line", "pod": "agent-logs-cqhfk"}
Unpack at query time:
{workload="ReplicaSet/payment-api", level="error"}
|= `agent-logs-cqhfk`
| unpackWhen a user reports slow queries, identify where time is spent using Querier metrics.go logs.
| Stage | Metric | High Value Means | Fix |
|---|---|---|---|
| Queue | queue_time | Not enough Queriers | Add Queriers or reduce parallelism |
| Index | chunk_refs_fetch_time | Need more Index Gateway instances | Scale index-gateways; check CPU |
| Storage | store_chunks_download_time | Chunks too small OR storage bottleneck | Check avg chunk size: total_bytes / cache_chunk_req |
| Execution | duration - chunk_refs_fetch_time - store_chunks_download_time | CPU-intensive regex, or too many tiny log lines | Reduce regex; add CPU; increase parallelism |
Ideally, the majority of time is spent in Execution. If not, that indicates infrastructure or label design problems.
avg chunk size = total_bytes / cache_chunk_reqIf the result is a few hundred bytes or kilobytes (instead of megabytes), chunks are too small. This means labels are over-splitting data into too many streams. Revisit cardinality — demote non-allowlisted high-card labels or stabilize protected-label values.
Problem: Query scans too many streams
Problem: High post_filter_lines discard ratio (post_filter_lines << total_lines)
level, workload, container, service_name)Problem: Small chunks
pod) to consolidate streams; remediate protected-label values if they are the splittercontainer or workload to narrow scope before line filterslevel label + always use it in queries (filters out 94%+ of logs when searching for errors)pod off the index → reduces stream count by ~5× in typical K8s deployments (migrate selectors first)|~) with exact filters (|=) where possibleservice_name (and peers); if values are UUIDs/ephemeral, normalize to a stable identity — do not drop the keyloki.process "normalize_level" {
forward_to = [...]
stage.replace { source = "level"; expression = "(?i)I(nfo)?"; replace = "info" }
stage.replace { source = "level"; expression = "(?i)W(arn(ing)?)?"; replace = "warn" }
stage.replace { source = "level"; expression = "(?i)E(rr(or)?)?"; replace = "error" }
stage.replace { source = "level"; expression = "(?i)D(ebug?)?"; replace = "debug" }
stage.labels { values = { level = "" } }
}// Only extract when the relevant field is present — avoids unnecessary cardinality
loki.process "conditional_extraction" {
forward_to = [...]
stage.match {
selector = "{app=\"loki\"} |= \"component\""
stage.logfmt { mapping = { "component" = "" } }
stage.labels { values = { component = "" } }
}
}Always include allowlisted correlation labels when present — never omit service_name, deployment_environment, or job from label_keep (protected-labels.md):
loki.process "enforce_labels" {
forward_to = [loki.write.default.receiver]
// ... other stages ...
stage.label_keep {
values = [
"service_name", "deployment_environment", "job",
"env", "cluster", "level", "namespace", "workload", "container",
]
}
}stage.template {
source = "team"
template = "{{ if .Value }}{{ .Value }}{{ else }}unknown{{ end }}"
}
stage.labels { values = { team = "" } }Byte-level reductions (timestamps, ANSI, null JSON fields) for Scenario C savings — see references/log-line-optimization.md.
Grafana Enterprise Logs (GEL) supports Label-Based Access Control (LBAC). Any label can serve as an access control selector.
Best labels for LBAC:
classification — data sensitivity (public, restricted, confidential, top-secret)source — controls which teams can see which log originsteam / squad — ownership-based accessenv — environment-level restrictionsStatic aggregate labels like owner=sysadmins or category=database are particularly effective: one label value gates access to many log files, rather than requiring a long allowlist of filenames or streams.
The most impactful improvements almost always come from these four changes:
pod off the index (structured metadata) — biggest stream reduction in K8s; migrate selectors firstlevel as a label AND always specify it in queries — can eliminate 94%+ of scanned data when searching for errorsservice_name, stabilize UUID/ephemeral values (never drop the key)filename in K8s — highly variable paths inflate stream count significantlyFocus on these before anything else. Never "fix" cardinality by dropping service_name, deployment_environment, or job.
| Label | Why | Alternative |
|---|---|---|
pod | Transient, high card | Demote: workload label + pod in structured metadata (migrate selectors) |
user_id | Unbounded — never valid as index label | Keep only in log content |
request_id / trace_id | Unbounded — never valid as index label | Structured metadata |
filename (raw K8s path) | Contains pod UID | Normalize or demote after selector check |
Unnormalized level | INFO/info/Info = 3 streams | Normalize at collection time |
UUID / ephemeral service_name values | Inflates streams; key is still required | Keep key; map values to stable service identity |
| Any dynamically-named label key | Cannot be bounded | Use fixed keys with bounded values |
Never drop: service_name, deployment_environment, job — see references/protected-labels.md.
Label hygiene alone does not cut billable ingest bytes ($0 direct). Volume savings come from enabled stage.drop / log-line cleanup. Load references/cost-impact.md when writing the report section: use its scenario-card shape, cite scalar metrics (optional short panel ID / PromQL), and never paste the agent-only reference table or panel JSON into the customer report.
© grafana, Apache-2.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 4 other files (references) in skills/grafana-cloud/loki-label-analyzer of grafana/skills.
Open the folder on GitHubat commit 1ccacf2
Loki Label Analyzer next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Loki Label Analyzer this skillgrafana/skills | 282 | — | ~5.4k | Automated safety check: Pass | Apache-2.0 | |
| Mz Release SignoffMaterializeInc/materialize | 6.4k | — | ~7.2k | Automated safety check: Pass | Custom licence | |
| Axiom Dashboard Builderopenclaw/clawhub | 9.5k | — | ~4.9k | Automated safety check: Pass | MIT | |
| Happy Infra Metrics and Grafanaslopus/happy | 24k | — | ~2k | Automated safety check: Notes | MIT | |
| Syncmetapawurb/hotpath-rs | 1.9k | — | ~1.2k | Automated safety check: Notes | MIT | |
| Optimize Slurm TopologyNVlabs/alpasim | 1.3k | — | ~1.6k | Automated safety check: Pass | Apache-2.0 |
MaterializeInc/materialize
Verify a release candidate on the Grafana dashboards and sign off in release.
openclaw/clawhub
Designs and deploys Axiom dashboards through the API, choosing chart types and writing APL or metrics queries, with templates and migration notes for Splunk and Grafana.
slopus/happy
Queries live Prometheus metrics and manages Grafana dashboards as code for Happy's infrastructure, using the grafanactl CLI and the Grafana datasource proxy API.
pawurb/hotpath-rs
Sync changes from the hotpath, hotpath-macros and hotpath-drain crates to their meta counterparts (hotpath-meta, hotpath-macros-meta and hotpath-drain-meta).
NVlabs/alpasim
Optimize AlpaSim Slurm topology throughput using persistent local Prometheus/Grafana telemetry and run artifacts.
comet-ml/opik
Specifies how to instrument an opik-backend pipeline with per-stage OpenTelemetry metrics for throughput, latency, errors and queue delay by workspace.
grafana/skills
Write or review k6 documentation across the three k6 repositories - k6-DefinitelyTyped (TypeScript types), k6-docs (user documentation), and k6 (release notes / changelog).
grafana/skills
Configure Grafana Alerting, Incident Response Management (IRM), and SLOs end-to-end — provisions Grafana-managed and data-source-managed alert rules, contact points (Slack/PagerDuty/email/webhook)…
grafana/skills
Build, modify, and ship Grafana dashboards as JSON via the HTTP API — panel types (timeseries / stat / gauge / table / heatmap / logs / traces / node-graph), gridPos 24-column layout, units…
grafana/skills
A skill your agent uses when the user wants to performance-test, load-test, or stress-test a public website end-to-end with k6.
grafana/skills
Write, validate, and optimize PromQL for Prometheus / Grafana Mimir / Grafana Cloud Metrics.
grafana/skills
Cut Grafana Cloud Metrics cost by shrinking active-series count with Adaptive Metrics aggregation rules — auto-recommendations from query history, custom exact/regex rules, label-drop config…
Works with
Categories
Expert evaluator for Grafana Loki label strategy. An agent skill from grafana/skills. Loki Label Analyzer is an agent skill from grafana/skills, published by the product's own GitHub organization. Expert evaluator for Grafana Loki label strategy.
Loki Label Analyzer fits situations like: the user asks to evaluate; improve a Loki label strategy —; asks why their Loki queries are slow.
Run `npx skills add grafana/skills --skill loki-label-analyzer -a claude-code`. Or copy the skill folder (skills/grafana-cloud/loki-label-analyzer in grafana/skills) into .claude/skills/loki-label-analyzer in your project. Claude Code loads it when a task matches its description.
Run `npx skills add grafana/skills --skill loki-label-analyzer -a codex`. Or copy the skill folder (skills/grafana-cloud/loki-label-analyzer in grafana/skills) into .agents/skills/loki-label-analyzer in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add grafana/skills --skill loki-label-analyzer -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/loki-label-analyzer, .gemini/skills/loki-label-analyzer, .github/skills/loki-label-analyzer and .opencode/skills/loki-label-analyzer in your project.
SKILL.md names no scripts, command-line tools or credentials: Loki Label Analyzer is instructions for the agent only.
SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Loki Label Analyzer is published under the Apache-2.0 licence (declared in SKILL.md). It allows redistribution, so the full SKILL.md is shown on this page.
About 5.4k tokens (SKILL.md is roughly 22k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full. Its references folder adds about 3k tokens, read only when the agent opens those files.
Skills that share tags, products or a category with Loki Label Analyzer: Mz Release Signoff (MaterializeInc/materialize, 6.4k stars), Axiom Dashboard Builder (openclaw/clawhub, 9.5k stars), Happy Infra Metrics and Grafana (slopus/happy, 24k stars) and Syncmeta (pawurb/hotpath-rs, 1.9k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
grafana (a GitHub organization, an official publisher) maintains it in grafana/skills, which has 282 GitHub stars. The repository holds 51 skills in this directory. The repository was last updated on October 8, 2026.
Source: grafana/skills on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.