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
JavaScript
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;