Commit graph

444 commits

Author SHA1 Message Date
FluxCD
8324d019ca chore: update prop image to git.mcintire.me/graham/prop:main-1776970997-e7fb34e [skip ci] 2026-04-23 19:07:05 +00:00
FluxCD
ed21758557 chore: update prop image to git.mcintire.me/graham/prop:main-1776968936-764643b [skip ci] 2026-04-23 18:31:46 +00:00
FluxCD
8c0865482c chore: update prop image to git.mcintire.me/graham/prop:main-1776967519-cfb0c51 [skip ci] 2026-04-23 18:07:33 +00:00
FluxCD
a9d13d8eb9 chore: update prop image to git.mcintire.me/graham/prop:main-1776967071-063e9e3 [skip ci] 2026-04-23 18:00:31 +00:00
FluxCD
e88375e50b chore: update prop image to git.mcintire.me/graham/prop:main-1776965182-47ba8d3 [skip ci] 2026-04-23 17:28:47 +00:00
47ba8d3b6d
fix(enrichment): stub IEMRE on permanent failure + bump hot CPU
IemreFetchWorker now writes an empty stub observation when IEM returns
a permanent-failure status (404, 422), mirroring the existing {:ok, []}
path. The backfill cron's next tick sees the stub via
has_iemre_observation?/3, generates no job, and mark_status!/3 flips
the contact's iemre_status from :queued to :complete — draining the
51 contacts that have been stuck behind cancelled out-of-grid IEMRE
jobs.

Raise hot pod CPU limit 2 → 3 so BEAM gets 3 schedulers online.
Observed run queues of [2, 10, 0, 0, 0, 0] on the 2-scheduler
configuration during the :05 propagation chain, starving /live and
/health probe handlers and tripping intermittent liveness timeouts.
2026-04-23 12:26:09 -05:00
FluxCD
da66a613ef chore: update prop image to git.mcintire.me/graham/prop:main-1776960355-b2ff279 [skip ci] 2026-04-23 16:10:27 +00:00
FluxCD
f0f4ce6b33 chore: update prop image to git.mcintire.me/graham/prop:main-1776959622-66fef4f [skip ci] 2026-04-23 15:56:21 +00:00
FluxCD
e4ed923986 chore: update prop image to git.mcintire.me/graham/prop:main-1776898028-004f302 [skip ci] 2026-04-22 22:54:04 +00:00
FluxCD
b8e284bde1 chore: update prop image to git.mcintire.me/graham/prop-grid-rs:main-1776894678-93b526c [skip ci] 2026-04-22 22:06:44 +00:00
FluxCD
a5b080f0af chore: update prop image to git.mcintire.me/graham/prop:main-1776894891-47a3e1d [skip ci] 2026-04-22 21:58:48 +00:00
47a3e1dbde
chore(k8s): drop backfill nodeSelector/toleration, free talos4
podAntiAffinity on app=prop already keeps the backfill pod on its own
physical host, so the dedicated nodeSelector + taint were redundant.
Removing them lets talos4 be used as a normal worker for anything else
the cluster wants to place there. The live taint and label on talos4
were cleared alongside this commit.
2026-04-22 16:54:31 -05:00
024db2a5b4
perf(fleet): reduce IEM 429 storm and raise probe timeouts
Per-pod IEM rate limiter was 700ms (~1.4 req/sec); four pods put the
fleet at ~5.7 req/sec, above the observed 429 threshold. Retry storm
(Req exponential backoff up to 32s) piled concurrent sleeps on top of
live workers and tripped Bandit's acceptor + Oban's leader heartbeat.

- Raise default interval to 1500ms (~2.7 req/sec fleet).
- Hot pod /live timeout 3s → 5s (acceptor stalls under retry sleeps).
- prop-backfill exec probe period 30s → 120s, timeout 15s → 30s; the
  release CLI round-trips through distributed Erlang and 15s wasn't
  enough under load, restart-looping every ~10 min.
2026-04-22 16:50:58 -05:00
FluxCD
d6d50f7729 chore: update prop image to git.mcintire.me/graham/prop:main-1776884183-04146af [skip ci] 2026-04-22 18:58:47 +00:00
04146af1fa
fix(k8s): raise prop-backfill probe timeout to 15s
The exec probe runs `/app/bin/microwaveprop rpc ':ok'` which spawns a
release CLI and round-trips through distributed Erlang. Under an IEM
429 retry storm (WeatherFetchWorker sleeps 1-16 s between attempts),
the BEAM scheduler stays responsive but probe latency spikes past 5 s
and the kubelet SIGKILLs the pod every ~10 min. 15 s is still well
below the 30 s period so the probe still catches a genuinely wedged
VM inside one cycle.
2026-04-22 13:56:10 -05:00
FluxCD
5b41ad00e7 chore: update prop image to git.mcintire.me/graham/prop:main-1776869401-e8c2529 [skip ci] 2026-04-22 14:53:39 +00:00
FluxCD
b92c1ea68b chore: update prop image to git.mcintire.me/graham/prop:main-1776866277-3ec976c [skip ci] 2026-04-22 14:03:26 +00:00
FluxCD
3d228fa139 chore: update prop image to git.mcintire.me/graham/prop-grid-rs:main-1776866276-3ec976c [skip ci] 2026-04-22 14:03:22 +00:00
FluxCD
c4a6b8ed8b chore: update prop image to git.mcintire.me/graham/prop:main-1776864939-c192d6f [skip ci] 2026-04-22 13:43:20 +00:00
FluxCD
84f4f93b87 chore: update prop image to git.mcintire.me/graham/prop:main-1776812585-ee7809e [skip ci] 2026-04-21 23:07:11 +00:00
FluxCD
22111a6f5c chore: update prop image to git.mcintire.me/graham/prop-grid-rs:main-1776812583-ee7809e [skip ci] 2026-04-21 23:07:05 +00:00
FluxCD
39cc5292a9 chore: update prop image to git.mcintire.me/graham/prop:main-1776812100-c46e89a [skip ci] 2026-04-21 22:57:43 +00:00
c46e89a48f
fix(otel): switch Elixir exporter to OTLP/HTTP to avoid grpcbox shutdown noise
Every prop pod restart was dumping a pair of ArgumentError stack
traces from grpcbox_channel / grpcbox_subchannel terminate/3:

    :ets.select(:gproc, …)
    * 1st argument: the table identifier does not refer to an
      existing ETS table

This is a known grpcbox shutdown race: the OTLP/gRPC transport's
terminate callback tries to look itself up in gproc's ETS just
after gproc's supervisor has already torn the table down. Noisy,
not harmful — but one ArgumentError per restart × N pods adds up.

The OTLP/HTTP transport (port 4318 on the same otel-collector
Service) has no gproc/ETS channel machinery, so shutdown is
quiet. Spans are identical — our collector already accepts both.

- `config/runtime.exs`: default `otlp_protocol: :http_protobuf`,
  with an `OTEL_EXPORTER_OTLP_PROTOCOL=grpc` escape hatch.
- `k8s/deployment.yaml`: point `OTEL_EXPORTER_OTLP_ENDPOINT` at
  :4318 instead of :4317. The Rust workers stay on :4317 — their
  native opentelemetry-otlp transport doesn't share the grpcbox
  bug.
2026-04-21 17:54:44 -05:00
FluxCD
4d5b5f1aee chore: update prop image to git.mcintire.me/graham/prop:main-1776811628-04aa198 [skip ci] 2026-04-21 22:50:40 +00:00
FluxCD
a72a9671d1 chore: update prop image to git.mcintire.me/graham/prop-grid-rs:main-1776811522-e688d8c [skip ci] 2026-04-21 22:49:38 +00:00
FluxCD
a232670139 chore: update prop image to git.mcintire.me/graham/prop:main-1776810886-4d07f89 [skip ci] 2026-04-21 22:37:16 +00:00
FluxCD
9780d2b477 chore: update prop image to git.mcintire.me/graham/prop-grid-rs:main-1776809823-ff950f9 [skip ci] 2026-04-21 22:27:12 +00:00
FluxCD
3217b011a4 chore: update prop image to git.mcintire.me/graham/prop:main-1776810088-d3ca2e5 [skip ci] 2026-04-21 22:23:56 +00:00
FluxCD
1c1a253fbe chore: update prop image to git.mcintire.me/graham/prop:main-1776809787-ff950f9 [skip ci] 2026-04-21 22:18:53 +00:00
FluxCD
944c2dc1d4 chore: update prop image to git.mcintire.me/graham/prop:main-1776809397-49d0594 [skip ci] 2026-04-21 22:12:43 +00:00
FluxCD
d2ef81b3ec chore: update prop image to git.mcintire.me/graham/prop-grid-rs:main-1776809182-e9a3862 [skip ci] 2026-04-21 22:10:45 +00:00
FluxCD
7e53f6f890 chore: update prop image to git.mcintire.me/graham/prop:main-1776809188-e9a3862 [skip ci] 2026-04-21 22:10:41 +00:00
FluxCD
a0608dfa2f chore: update prop image to git.mcintire.me/graham/prop:main-1776807571-26ef50c [skip ci] 2026-04-21 21:42:32 +00:00
FluxCD
e73f097b75 chore: update prop image to git.mcintire.me/graham/prop:main-1776807271-8ec5d89 [skip ci] 2026-04-21 21:38:29 +00:00
FluxCD
29962d62a4 chore: update prop image to git.mcintire.me/graham/prop-grid-rs:main-1776806063-c56bb91 [skip ci] 2026-04-21 21:32:33 +00:00
FluxCD
6c57caa902 chore: update prop image to git.mcintire.me/graham/prop:main-1776806062-c56bb91 [skip ci] 2026-04-21 21:28:25 +00:00
a2701780ab
fix(probes): stop DB saturation from SIGKILLing every pod
Investigated why all three prop pods were restart-looping every few
minutes (RESTARTS counts 7–11 in 99m). The trail:

  20:53:33.058 [error] Postgrex.Protocol ("db_conn_10") disconnected:
    client (:"Elixir.Microwaveprop.PromEx.Poller.5000") timed out
    because it queued and checked out the connection for longer than
    15000ms

PromEx's Oban queue-depth poller was scanning the oban_jobs table
every 5s and holding an Ecto connection past its checkout timeout.
That starved the rest of the pool, so /health's `SELECT 1` couldn't
acquire a connection inside the 3s liveness probe timeout, the
kubelet's failureThreshold=3 tripped, and SIGKILL landed on the
BEAM. Every replica cycled on the same cadence.

Two fixes:

1. Split /live (no DB) from /health (DB ping). Kubernetes livenessProbe
   now points at /live so a saturated Ecto pool can never cascade into
   SIGKILL. Readiness still hits /health so a genuine DB outage drains
   the pod from Service endpoints gracefully.

2. Turn off the PromEx Oban plugin in prod via the same flag already
   used in test. The queue-depth query isn't worth pod instability;
   the oban_web dashboard surfaces the same information without
   scanning the job table on a timer.

Locked both down with HealthController tests that verify /live never
touches the Repo (no sandbox owner, controller.live/2 called directly,
200 ok) and /health does (sanity query round-trips).
2026-04-21 16:00:04 -05:00
989d310447
fix(grid-rs): fall back to NOAA S3 when the LAN HRRR proxy is down
Root cause of the blank /map analysis breakdown: the skippy.w5isp.com
caching proxy was unreachable from the cluster, so every f00 analysis
step failed at the idx fetch and Rust never wrote a ProfilesFile. The
/map point-detail panel silently degraded to empty factors because
no profile ever lands on `/data/scores/profiles/`.

HrrrClient now takes an optional fallback base. When the primary base
exhausts its retries (5× exponential backoff), fetches retry once
against the fallback — defaulted to the NOAA S3 public bucket. Forecast,
analysis, and native-duct paths all go through the same
fetch_blob_with_fallback helper so a proxy outage degrades to direct
S3 instead of stalling.

Moved the native-URL builder out of native_duct into fetcher so the
single helper can build both primary and fallback URLs for the native
hybrid-sigma product.
2026-04-21 15:54:02 -05:00
FluxCD
02bf34db9e chore: update prop image to git.mcintire.me/graham/prop:main-1776798788-48d30f1 [skip ci] 2026-04-21 19:16:25 +00:00
540750b3d3
fix(observability): re-enable OTLP export for Elixir
Set OTEL_EXPORTER_OTLP_ENDPOINT on the prop deployment to the cluster
Collector so Phoenix/Bandit/Oban spans export and link up with
downstream prop-grid-rs / prop-hrrr-point-rs traces in Tempo. Without
this the Elixir app fell back to traces_exporter :none and the Rust
worker spans had no parent, leaving the trace graph disconnected.

The stale comment referenced opentelemetry_ecto as the reason export
was off, but that package was never added to mix.exs (only
opentelemetry_phoenix / _bandit / _oban are listed), so the
span-flood concern no longer applies.
2026-04-21 13:26:27 -05:00
FluxCD
e9b804f628 chore: update prop image to git.mcintire.me/graham/prop:main-1776786279-38ef716 [skip ci] 2026-04-21 15:47:20 +00:00
FluxCD
6c977e250d chore: update prop image to git.mcintire.me/graham/prop:main-1776785420-d61fbd3 [skip ci] 2026-04-21 15:34:05 +00:00
FluxCD
2f5b37f7c5 chore: update prop image to git.mcintire.me/graham/prop:main-1776783205-7b78a25 [skip ci] 2026-04-21 14:55:46 +00:00
FluxCD
e5991d324a chore: update prop image to git.mcintire.me/graham/prop:main-1776782574-71c134d [skip ci] 2026-04-21 14:46:43 +00:00
FluxCD
61da51c03f chore: update prop image to git.mcintire.me/graham/prop:main-1776781734-f4f44b5 [skip ci] 2026-04-21 14:31:32 +00:00
FluxCD
360a0e32c1 chore: update prop image to git.mcintire.me/graham/prop:main-1776781470-33be6d0 [skip ci] 2026-04-21 14:27:27 +00:00
FluxCD
9ced0eab87 chore: update prop image to git.mcintire.me/graham/prop:main-1776780470-fbbb8b2 [skip ci] 2026-04-21 14:16:16 +00:00
FluxCD
cd2962687a chore: update prop image to git.mcintire.me/graham/prop:main-1776777603-cc9220b [skip ci] 2026-04-21 13:23:57 +00:00
FluxCD
cb9d9fb30b chore: update prop image to git.mcintire.me/graham/prop:main-1776752742-c96bdca [skip ci] 2026-04-21 06:35:16 +00:00
FluxCD
e3d7f5b2c2 chore: update prop image to git.mcintire.me/graham/prop:main-1776722189-30525a1 [skip ci] 2026-04-20 21:59:07 +00:00