Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
46 changes: 46 additions & 0 deletions contrib/openobserve/compose.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
# Optional reference telemetry backend. Preloop never starts this — it is
# opt-in, loopback-bound, and pinned by digest. Credentials come from the
# environment (systemd LoadCredential / .env outside version control),
# never from this file.
#
# Upstream: https://github.com/openobserve/openobserve (AGPL-3.0).
# Run the stock image as a separate process; do not vendor or modify it.
services:
openobserve:
# Digest-pinned: a floating tag is not an immutable input.
image: public.ecr.aws/zinclabs/openobserve@sha256:88fb692ac791d3eaff69653a4a4686f1c7eceb9e105491d58d29ac2739560b3b
container_name: preloop-openobserve
restart: unless-stopped
# Loopback only. The OSS build has no SSO/RBAC — never put the UI on the
# public webhook origin. Front it with operator auth if shared.
ports:
- "127.0.0.1:5080:5080"
environment:
ZO_ROOT_USER_EMAIL: ${ZO_ROOT_USER_EMAIL:-admin@preloop.local}
# No default password: a known admin credential on a loopback port is
# one forwarded-port or one other-local-user away from being public.
# Startup fails loudly until the operator supplies one.
ZO_ROOT_USER_PASSWORD: ${ZO_ROOT_USER_PASSWORD:?Set ZO_ROOT_USER_PASSWORD}
ZO_DATA_DIR: /data
# Short retention: this is operational telemetry (hours/days), not a
# data lake. Losing SQLite metadata makes the install inoperable, so
# back up the volume if you rely on it.
ZO_COMPACT_DATA_RETENTION_DAYS: "7"
ZO_TELEMETRY: "false"
volumes:
- openobserve-data:/data
# Measured caps: do not starve the VM pool. Re-measure on your host.
deploy:
resources:
limits:
cpus: "1.0"
memory: 2G
healthcheck:
test: ["CMD", "sh", "-c", "wget -qO- http://127.0.0.1:5080/healthz || exit 1"]

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 Medium openobserve/compose.yml:39

The openobserve container is permanently marked unhealthy because its distroless image contains neither sh nor wget, so the healthcheck fails before requesting /healthz. Replace this with an external probe-capable image or an executable present in the pinned image so depends_on: condition: service_healthy can work.

🚀 Reply "fix it for me" or copy this AI Prompt for your agent:
In file @contrib/openobserve/compose.yml around line 39:

The `openobserve` container is permanently marked unhealthy because its distroless image contains neither `sh` nor `wget`, so the healthcheck fails before requesting `/healthz`. Replace this with an external probe-capable image or an executable present in the pinned image so `depends_on: condition: service_healthy` can work.

interval: 10s
timeout: 3s
retries: 10
start_period: 20s

volumes:
openobserve-data:
3 changes: 2 additions & 1 deletion crates/preloop-cli/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -749,7 +749,8 @@ async fn main() -> anyhow::Result<()> {
// `RUST_LOG` defaults to `info` (the old `fmt::init()` default of ERROR hid
// pool provisioning faults). The runtime is held for the life of `main`
// and flushed with a bounded 2s shutdown on exit.
let obs_config = preloop_observability::ObservabilityConfig::from_env();
let obs_config = preloop_observability::ObservabilityConfig::from_env()
.with_service_version(env!("CARGO_PKG_VERSION"));
let (observability, observability_runtime) =
preloop_observability::Observability::from_config(obs_config);
preloop_observability::ObservabilityRuntime::install_fmt_subscriber(observability.config());
Expand Down
Loading
Loading