UNPKG

openclaw-grafana-lens

Version:

OpenClaw plugin that gives AI agents full Grafana access — 18 composable tools for PromQL/LogQL/TraceQL queries, dashboard creation, alerting, SRE investigation, security monitoring, data collection pipeline management via Grafana Alloy (29 recipes), and

62 lines (61 loc) 2.73 kB
import { AlloyConfigBuilder, componentLabel, escapeString, renderValue } from "../../config-builder.js"; const recipe = { name: "kubernetes-services", category: "metrics", signal: "metrics", summary: "Auto-discover and scrape Kubernetes service endpoints (requires K8s RBAC)", dashboardTemplate: "multi-kpi", credentialParams: [], requiredParams: [], optionalParams: [ { name: "namespaces", type: "string[]", description: "Namespaces to discover (empty = all)", default: [] }, { name: "scrapeInterval", type: "string", description: "Scrape interval", default: "15s" }, ], generateConfig(pipelineId, params, targets, _pipelineName) { const namespaces = params.namespaces || []; const scrapeInterval = params.scrapeInterval || "15s"; const jobName = params.jobName || "kubernetes-services"; const discLabel = componentLabel(pipelineId, "k8s_svc"); const scrapeLabel = componentLabel(pipelineId, "scrape"); const writeLabel = componentLabel(pipelineId, "write"); const builder = new AlloyConfigBuilder(); let discBlock = `discovery.kubernetes "${discLabel}" {\n role = "service"`; if (namespaces.length > 0) { discBlock += `\n namespaces {\n names = ${renderValue(namespaces)}\n }`; } discBlock += "\n}"; builder.addBlock(discBlock); const relabelLabel = componentLabel(pipelineId, "relabel"); builder.addBlock(`prometheus.scrape "${scrapeLabel}" { targets = discovery.kubernetes.${discLabel}.targets forward_to = [prometheus.relabel.${relabelLabel}.receiver] job_name = "${escapeString(jobName)}" scrape_interval = "${escapeString(scrapeInterval)}" }`); builder.addBlock(`prometheus.relabel "${relabelLabel}" { forward_to = [prometheus.remote_write.${writeLabel}.receiver] rule { target_label = "job" replacement = "${escapeString(jobName)}" } }`); builder.addBlock(`prometheus.remote_write "${writeLabel}" { endpoint { url = "${escapeString(targets.prometheusRemoteWriteUrl)}" } }`); return builder.build(pipelineId, "kubernetes-services", "kubernetes-services"); }, sampleQueries(_params, jobName) { return { serviceCount: `count(up{job="${jobName}"})` }; }, componentIds(pipelineId) { return [ `discovery.kubernetes.${componentLabel(pipelineId, "k8s_svc")}`, `prometheus.scrape.${componentLabel(pipelineId, "scrape")}`, `prometheus.relabel.${componentLabel(pipelineId, "relabel")}`, `prometheus.remote_write.${componentLabel(pipelineId, "write")}`, ]; }, }; export default recipe;