Local OTEL smoke stack: kind + VictoriaMetrics + VMUI, driven by Makefile targets#23
Merged
Merged
Conversation
The backend half of the local OTEL smoke stack: a single-node kind cluster mapping host port 8428 to NodePort 30428, and a pinned VictoriaMetrics single-node that ingests the tester's OTLP/HTTP push natively at /opentelemetry/v1/metrics — no OTel Collector. -opentelemetry.usePrometheusNaming stores the OTLP series under the Prometheus canonical names the README documents, and -opentelemetry.promoteAllResourceAttributes attaches the tester's cloud and scenario resource attributes to every series. Assisted-by: Claude:claude-opus-4-8 Signed-off-by: Christian Berendt <berendt@b42labs.com>
One-command lifecycle for the local OTEL smoke stack: - otel-up boots the kind cluster (idempotent), applies the manifests, waits for the rollout, and polls /health. - otel-down deletes the cluster and its state. - otel-verify checks the five documented metric families are stored and prints the cloud/scenario label values. - otel-ui opens VMUI with two pre-filled queries. - testbed-monitor reuses the testbed guards and run-record sweep, then runs neutron monitor --otel with the signal-specific OTEL_EXPORTER_OTLP_METRICS_ENDPOINT pointed at VictoriaMetrics and a 15s export interval for fast local feedback. Widens the help column so the longer target names stay aligned. Assisted-by: Claude:claude-opus-4-8 Signed-off-by: Christian Berendt <berendt@b42labs.com>
New README §9 subsection: prerequisites, the three-command flow (otel-up -> testbed-monitor -> otel-ui), how the collector-less VictoriaMetrics ingestion and Prometheus naming work, the query cookbook, and teardown. Cross-references the collector example and the existing cookbook, and warns about the signal-specific OTLP endpoint variable. Assisted-by: Claude:claude-opus-4-8 Signed-off-by: Christian Berendt <berendt@b42labs.com>
berendt
marked this pull request as ready for review
July 2, 2026 14:46
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Closes #22
Summary
A one-command local OTEL smoke stack — analogous to
make testbed— for exercising theneutron monitor --otelseam (#19) end to end against the OSISM testbed. A kind cluster runs single-node VictoriaMetrics, which ingests the tester's OTLP/HTTP push directly (no OTel Collector) and serves VMUI (no Grafana). The whole thing is Makefile + manifests + docs; the tester binary is untouched, exactly as the issue's non-goals require.Change set (in commit order)
59989a1— Add kind and VictoriaMetrics manifests for local OTEL stackThe backend half.
contrib/otel/kind.yaml: single-node clusterostester-otel,extraPortMappinghost8428→ node NodePort30428, so the host binary and browser reach VM at plainhttp://localhost:8428.contrib/otel/victoria-metrics.yaml: plain manifests (no Helm) — Namespace + single-replica Deployment + NodePort Service (30428). Image pinned tovictoriametrics/victoria-metrics:v1.146.0by digest. Flags:-retentionPeriod=30d,-opentelemetry.usePrometheusNaming=true(stores series under the Prometheus canonical names the README schema documents), and-opentelemetry.promoteAllResourceAttributes=true(attaches thecloud/scenarioresource attributes as labels).emptyDirstorage — survives monitor restarts, notmake otel-down.bcb1a87— Add otel-up/down/verify/ui and testbed-monitor Make targetsThe lifecycle.
otel-up: preflight-checksdocker/kind/kubectl/curl, creates the cluster idempotently, applies the manifests, waits for the rollout, polls/health.otel-down: deletes the cluster and its state.otel-verify: asserts the five documented metric families are stored (non-zero exit if any missing) and prints thecloud/scenariolabel values.otel-ui: opens VMUI with two pre-filled queries.testbed-monitor: reuses thetestbedfile guards, then runsneutron monitor --otelwith the signal-specificOTEL_EXPORTER_OTLP_METRICS_ENDPOINTpointed at VM and a 15 s export interval. AddsMONITOR_INTERVAL ?= 5m/MONITOR_ITERATIONS ?= 0. Warns (does not fail) when:8428/healthis unreachable, since--otelexport failures already degrade to warnings. Widens thehelpcolumn so the longer target names stay aligned.7e8be57— Document the local OTEL smoke stack in the READMENew README §9 subsection: prerequisites, the three-command flow, how the collector-less ingestion and Prometheus naming work, the query cookbook (works against this stack unchanged), and teardown. Cross-references the existing collector example, and warns about using the signal-specific
OTEL_EXPORTER_OTLP_METRICS_ENDPOINT(the genericOTEL_EXPORTER_OTLP_ENDPOINTwould miss VM's ingestion path and silently drop metrics).Divergences from the issue
-opentelemetry.promoteAllResourceAttributes=trueadded beyond the issue's manifest sketch (which listed onlyusePrometheusNaming). Without it thecloud/scenarioattributes would not appear as labels, so the acceptance criterion ("…withcloudandscenarioresource attributes attached") would fail. The flag exists from VM v1.145.0, which is why the image is pinned to v1.146.0 and must not be downgraded past it.otel-verifyis stronger than the sketchedcurl … | grep openstack_tester: it checks each of the five documented metric families individually (failing on any miss) and echoes thecloud/scenariolabel values — matching the acceptance criteria directly rather than a coarse grep.listenAddress: "127.0.0.1"), not in the issue — a security hardening so the unauthenticated VM store is not published on every host interface. The manifest comment documents the residual NodePort exposure on the docker network as accepted for a throwaway stack.testbed-monitortarget deliberately runs no post-runrun-*.jsonsweep; its Makefile comment explains why (monitorcleans up each iteration itself, and a shared-directory sweep would tear down a concurrentmake testbedrun's resources). However, thebcb1a87commit message ("reuses the testbed guards and run-record sweep") and a README sentence ("any leftoverrun-*.jsonis swept, exactly asmake testbeddoes") still describe the earlier, swept behavior. The code is the intended final state; the prose is stale. Flagging rather than fixing, since the diff is final for this PR.Verification
Per the issue's acceptance criteria, this is validated by running
make otel-up→make testbed-monitor→make otel-verify/make otel-uiagainst the testbed; no automated tests are added (the change is manifests + Makefile + docs).Implemented by planwerk-agent 6b3f3ea with Claude:claude-opus-4-8