Deploy the OpenTelemetry observability stack (Prometheus, Grafana, OTEL Collector) to a Kind cluster for testing toolhive telemetry. Use when you need to set up monitoring, metrics collection, or observability infrastructure.
69
85%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
View guide
Low
Low-risk findings worth noting
Deploy a complete OpenTelemetry observability stack to a Kind cluster for testing ToolHives telemetry capabilities.
Check that required tools are installed:
echo "Checking prerequisites..."
command -v kind >/dev/null 2>&1 || { echo "ERROR: kind is not installed"; exit 1; }
command -v helm >/dev/null 2>&1 || { echo "ERROR: helm is not installed"; exit 1; }
command -v kubectl >/dev/null 2>&1 || { echo "ERROR: kubectl is not installed"; exit 1; }
echo "All prerequisites met."Create the Kind cluster if it doesn't exist:
CLUSTER_NAME="toolhive"
if kind get clusters 2>/dev/null | grep -q "^${CLUSTER_NAME}$"; then
echo "Kind cluster '${CLUSTER_NAME}' already exists"
else
echo "Creating Kind cluster '${CLUSTER_NAME}'..."
kind create cluster --name ${CLUSTER_NAME}
fi
# Export kubeconfig
kind get kubeconfig --name ${CLUSTER_NAME} > kconfig.yaml
echo "Kubeconfig written to kconfig.yaml"echo "Adding Helm repositories..."
helm repo add open-telemetry https://open-telemetry.github.io/opentelemetry-helm-charts
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo add grafana https://grafana.github.io/helm-charts
helm repo update
echo "Helm repositories updated."echo "Installing kube-prometheus-stack..."
helm upgrade -i kube-prometheus-stack prometheus-community/kube-prometheus-stack \
-f examples/otel/prometheus-stack-values.yaml \
-n monitoring --create-namespace \
--kubeconfig kconfig.yaml \
--wait --timeout 5m
echo "Prometheus/Grafana stack installed."echo "Installing Grafana Tempo..."
helm upgrade -i tempo grafana/tempo \
-f examples/otel/tempo-values.yaml \
-n monitoring \
--kubeconfig kconfig.yaml \
--wait --timeout 3m
echo "Grafana Tempo installed."echo "Installing OpenTelemetry Collector..."
helm upgrade -i otel-collector open-telemetry/opentelemetry-collector \
-f examples/otel/otel-values.yaml \
-n monitoring \
--kubeconfig kconfig.yaml \
--wait --timeout 3m
echo "OpenTelemetry Collector installed."echo "Verifying deployment..."
kubectl get pods -n monitoring --kubeconfig kconfig.yamlcat <<'EOF'
=== OTEL Stack Deployment Complete ===
To access the UIs, run these port-forward commands:
# Grafana (admin / admin)
kubectl port-forward -n monitoring svc/kube-prometheus-stack-grafana 3000:3000 --kubeconfig kconfig.yaml
# Prometheus
kubectl port-forward -n monitoring svc/kube-prometheus-stack-prometheus 9090:9090 --kubeconfig kconfig.yaml
EOFIf Helm installations fail due to incompatible values, it may be because the Helm charts have been updated and our values.yaml files are no longer compatible.
Chart Documentation:
If you encounter issues:
values.yaml for schema changes in the versions of the Charts we are usingexamples/otel/| Component | Description |
|---|---|
| Prometheus | Metrics storage, scrapes OTEL collector on port 8889 |
| Grafana | Visualization dashboards (admin/admin) |
| Tempo | Distributed tracing backend, receives traces from OTEL Collector |
| OTEL Collector | Receives OTLP metrics/traces, exports to Prometheus and Tempo |
To remove everything:
task kind-destroyOr manually:
kind delete cluster --name toolhive
rm -f kconfig.yamlcd373ec
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.