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.34 kB
JavaScript
import { AlloyConfigBuilder, componentLabel, escapeString, renderValue } from "../../config-builder.js";
const recipe = {
name: "faro-frontend",
category: "logs",
signal: "logs",
summary: "Receive frontend telemetry from the Grafana Faro Web SDK — browser errors, performance metrics, web vitals, and user sessions",
dashboardTemplate: null,
credentialParams: [],
requiredParams: [],
optionalParams: [
{ name: "listenPort", type: "number", description: "HTTP listen port for Faro receiver", default: 12347 },
{ name: "listenAddress", type: "string", description: "Listen address", default: "0.0.0.0" },
{
name: "corsAllowedOrigins",
type: "object",
description: 'CORS allowed origins (string array). Default: ["*"] (all origins)',
default: ["*"],
},
],
generateConfig(pipelineId, params, targets, _pipelineName) {
const listenPort = params.listenPort ?? 12347;
const listenAddress = params.listenAddress || "0.0.0.0";
const corsOrigins = params.corsAllowedOrigins ?? ["*"];
const recvLabel = componentLabel(pipelineId, "faro");
const writeLabel = componentLabel(pipelineId, "write");
return new AlloyConfigBuilder()
.addBlock(`faro.receiver "${recvLabel}" {
server {
listen_address = "${escapeString(listenAddress)}"
listen_port = ${listenPort}
cors_allowed_origins = ${renderValue(corsOrigins)}
}
output {
logs = [loki.write.${writeLabel}.receiver]
}
}`)
.addBlock(`loki.write "${writeLabel}" {
endpoint {
url = "${escapeString(targets.lokiWriteUrl)}"
}
}`)
.build(pipelineId, "faro-frontend", "faro-frontend");
},
sampleQueries() {
return {
allFaroLogs: `{service_name="faro-web-sdk"}`,
browserErrors: `{service_name="faro-web-sdk"} |= "error"`,
webVitals: `{service_name="faro-web-sdk"} | json | kind="measurement"`,
};
},
componentIds(pipelineId) {
return [
`faro.receiver.${componentLabel(pipelineId, "faro")}`,
`loki.write.${componentLabel(pipelineId, "write")}`,
];
},
boundPorts(params) {
return [params.listenPort ?? 12347];
},
};
export default recipe;