Back to home page

EIC code displayed by LXR

 
 

    


Warning, /swf-monitor/docs/PROD_DASHBOARD.md is written in an unsupported language. File is not indexed.

0001 # Production dashboard
0002 
0003 The production home has three tabs, **Nav**, **Dash** and **Ops**. Nav is
0004 the default. Dash shows production at a glance and links to the live
0005 records behind each quantity:
0006 
0007 - Home tab: https://epic-devcloud.org/prod/?tab=dash
0008 - Full-page dashboard: https://epic-devcloud.org/prod/panda/dashboard/
0009 
0010 The square-and-arrow icon beside PROD opens the full-page dashboard in
0011 a new window. The home tab and standalone page use the same document,
0012 styles and JavaScript. The home embeds that document through `srcdoc`,
0013 which isolates the dashboard styles from the application navigation;
0014 the standalone route renders it without application headers. Both paths
0015 pass through the existing swf-remote proxy.
0016 
0017 ## Display
0018 
0019 The layout carries production supply, processing and science data across
0020 the top, with the primary campaign summary and daily assessment. Paused
0021 tasks appear below Tasks in flight. The campaign summary reads the same
0022 cached completion product as Nav: first delivery date, delivered events
0023 and bytes, and the number of physics configurations for the current
0024 campaign. OSG and GREX have
0025 running, queued, pilot and hourly outcome figures, cylinders and
0026 12-hour history. OSG execution sites have their own compact strip.
0027 Perlmutter, Google, Compute Canada and JLab follow in two columns.
0028 Tasks in flight, epicprod-live, Production now and Science data occupy
0029 the remaining columns. Site panes open by default; Open and Close act
0030 on every site pane.
0031 
0032 Site labels, reasons and phase colours come from the feed's `status_label`,
0033 `status_reason` and `status_level`. A site's bullet is the feed's
0034 `site.level`, the worst of its health, status and Production now lines. Inactive Perlmutter reads **No allocation**,
0035 Canada **Authentication block**, and JLab **Cybersecurity block**; all three
0036 status labels use grey.
0037 Google uses GREX's ordinary
0038 production panel content: shared pillars, running and queued cores, outcomes,
0039 and trend history. Google's pilot-count figure and waiting-pilot cylinder are
0040 hidden; its worker cap remains in the title row. Both displays select queues
0041 through the feed's `production_display` flag, preserving inactive JLab commissioning.
0042 Google's standard queue remains off. ES runtime and controller diagnostics
0043 remain in operator views. Google's status bullet is green when its production
0044 queue is live and the controller reports healthy workers. Missing or stale
0045 worker readings are amber; reported worker failures are red.
0046 Canada, Perlmutter and JLab use the same standard
0047 panel content in their existing dashboard positions, with inactive status
0048 labels retained. `site.production_panel` controls the presentation independently
0049 of queue activity. Reported counts remain visible while inactive; missing
0050 trend samples remain unknown. The room places JLab's chart above its Rucio board.
0051 
0052 Display names match the authored site discs: Canada and Perlmutter. The
0053 shared short-name vocabulary also applies to cached site/trend names and
0054 report prose; internal site and queue identifiers retain their canonical keys.
0055 
0056 The Computing now, Work available and Campaign blocks consume
0057 `report.header`: display-ready values, labels, colours, details and links.
0058 The room places the same three blocks beneath the Production now title.
0059 
0060 The right column is bounded by the visible viewport using the existing
0061 screen-height measurement. Production now wraps its notices without growing
0062 to fill unused space. When the notices would push Storage off screen, their
0063 body scrolls within the available height. Storage follows directly below.
0064 Notices use 10-pixel text, and every notice is accessible. A notice has
0065 no hover text, which would repeat the line (Torre Wenaus, 2026-10-28:
0066 "they are noise"). There is no separate inactive-site footer.
0067 
0068 Cylinder height uses a common 2,500-core running scale for OSG and GREX,
0069 preserving the approximately 80% height of 2,000 single-threaded jobs.
0070 Google uses a 100-core scale, and Perlmutter a 1,000-core scale (128 work
0071 lanes a node; its five-node production of 640 at about two-thirds height).
0072 Each of these four pillar sections shows its scale in small text at the upper
0073 left. Google's and Perlmutter's title rows show their production at the upper
0074 right, **5 nodes ×14** and **N nodes ×128**; Perlmutter's N is
0075 the nodes running now, from PanDA's worker table (the queue's `workers_now`),
0076 so the row corrects itself (Torre Wenaus, 2026-10-28: "title should be auto
0077 correct"). An Event Service site, one whose production queues
0078 are all in the ES close-out's list, shows **Mevt/1h** (millions of events, one
0079 decimal) in place of finish/1h: the events of the closes that stood in the last hour, from its
0080 jobs' shipped harness records (`processing_activity`), since its jobs finish
0081 once in hours. Other site cylinders use
0082 the default scale without a scale label. A compact
0083 execution-site cylinder retains its fixed height and shows the shared
0084 slash break when the value exceeds its display range. The green and red
0085 proportions represent finished and failed core counts in the preceding hour.
0086 The slash treatment is shared by both cylinder types. Plots convert
0087 quarter-hour completion bins to hourly rates. Task finish and fail
0088 columns retain JEDI input-file accounting; fail counts final failures
0089 after retries. Task rows extend downward without an internal scrollbar.
0090 
0091 Running numbers and pillars are labelled **cores** and count cores carrying
0092 production payload work. Native
0093 jobs use the payload's chosen `payloadThreads` report; one-core native jobs
0094 use one thread, while an unreported multicore thread width remains unknown.
0095 Event Service jobs count work lanes with assigned units in the shipped
0096 harness record. Each lane runs one single-threaded payload; empty lanes and
0097 ended harnesses contribute zero. Records older than ten minutes are unknown.
0098 A count is never blanked. While any job of a queue or execution site is
0099 unmeasured, as an Event Service job is before its first shipped record, the
0100 last complete count stands until a complete one replaces it (`threads_at`
0101 carries its measurement time), never below the part now measured; with none
0102 yet, the measured part shows.
0103 The latest measured counts also stand when the minute cache is late.
0104 Assigned-unit occupancy includes unit startup and finalization; it measures
0105 payload parallelism, rather than instantaneous CPU utilization. Pilot supply
0106 retains worker counts. The shared `processing_activity:v1` minute cache supplies
0107 current per-queue and OSG execution-site counts.
0108 
0109 Site completion and failure figures count cores, summing the reported payload
0110 thread width or actual core count of each ended job. Five completed 14-core
0111 jobs therefore contribute 70 core completions, separately from their core-hours.
0112 The completion, failure and queued figures and their curves come from the
0113 `site_core_metrics:v1` minute cache, which rebuilds behind a read; its last
0114 complete accounting stands until the next replaces it, so the first read
0115 after the dashboard sat unattended never blanks them.
0116 Job counts remain in the hover and drilldown. Queued values show core demand
0117 for the single-core native queues. Google shows the core capacity its waiting
0118 jobs can fill at the current node cap: ten jobs can feed all five 14-core
0119 workers, so the display reads 70 queued cores; hover retains ten jobs and
0120 identifies the capacity limit. Perlmutter counts a waiting whole-node job
0121 at its node's 128 work lanes, the unit its running figure counts, not the
0122 256 cores the job declares (Torre Wenaus, 2026-10-29). The minute cache `site_core_metrics:v1` reads
0123 deduplicated production-job outcomes and queued demand from PanDA.
0124 
0125 Site plots label the white curve **cores** and read Snapper's recorded
0126 running-core series, including Google's multicore jobs. The right end is
0127 live (Torre Wenaus, 2026-10-28): after the last whole quarter-hour, the
0128 cores and queued curves end at the panel's own figures now (COMP_SNAPSHOT.md,
0129 Trends, `live`), placed by time, so the number and the curve's end agree;
0130 the finish and fail rates end at the last whole quarter-hour. The time of
0131 that last whole quarter-hour, the history's last update, stands at the
0132 plot's upper right at the scale number's level and font; the axis's right
0133 end gives the live time. The shared trend model is unchanged (the room pins
0134 its hash): the dashboard places the live point by time when it draws. Green and red curves
0135 show core completions/hour and failed cores/hour, from reported job core counts
0136 in fifteen-minute bins; brown shows queued cores. Native single-core queue
0137 counts retain the same numerical values. The plots use the peak of cores,
0138 core completions/hour and failed cores/hour,
0139 rounded upward to two significant digits, as their common ceiling.
0140 The scale number sits directly below the running legend, in a reserved
0141 band above every curve and overflow dash. Legend markers and curves use
0142 the same shared palette. Queued values retain their
0143 true scale: solid
0144 within the range, dashed along the ceiling above it, with interpolated
0145 crossings. Gaps break both kinds of line. A wholly zero window uses a
0146 ceiling of one.
0147 
0148 Google's history uses core units throughout. Its minimum ceiling is 15;
0149 the running-core and core-outcome peaks raise that ceiling as needed. This
0150 history scale is separate from the 100-core running pillar.
0151 
0152 Weekly average running cores appear on the active OSG and GREX title
0153 rows. They are time-weighted from Snapper's recorded running-core curves,
0154 excluding collection gaps and stale intervals. OSG includes its retired
0155 production queue over the historical window. The initial record is a
0156 small static seed; a lazy request uses the existing Snapper series
0157 product when the cached average is more than an hour old. The browser
0158 reuses the result for an hour and refreshes it while attended.
0159 
0160 Every exceptional condition of a site is a numbered Production now line
0161 (Torre Wenaus, 2026-10-28): its feed off or exempt, a paused task, an
0162 operator core limit, OSG's fair-share limit, a health part not green,
0163 each with who, when and why (COMP_SNAPSHOT.md, Report). Production now
0164 shows each line as its number, in the line's colour, followed by its
0165 text, wrapping to the left edge with no indent (Torre Wenaus, 2026-10-28:
0166 "we need the space"). A
0167 line's number does not change while it stands (COMP_SNAPSHOT.md, Report). The
0168 site panel's title row cites its lines' numbers at the upper right, each
0169 in its colour, with the line's text on hover and its link: a grid of small
0170 numbers that wraps into columns and shrinks its type until every number
0171 fits, followed by the weekly average cores in grey. The core limit, the
0172 fair-share notice and the feed switch no longer write words there.
0173 
0174 While a pool's negotiator holds our OSG submitter at its fair-share
0175 limit, OSG has a grey, informational line naming the pool and the time of
0176 the negotiation cycle: it is OSG's normal mode of operation, so it never
0177 turns OSG's bullet amber (Torre Wenaus, 2026-10-28).
0178 The notice means our submitter reached its fair-share limit during the
0179 last reported negotiation cycle. Existing pilots keep their slots;
0180 later cycles may grant more. The reading is the OSG submit host reporter's
0181 negotiator query ([OSG_SUBMIT_REPORTER.md](OSG_SUBMIT_REPORTER.md)),
0182 carried as `fair_share` on the snapshot's OSG site.
0183 
0184 The feed owns the fair-share notice in `site.fair_share.notice`: its
0185 text, severity, hover detail and live queue link. The dashboard and room
0186 display those fields without local wording. A cleared or unavailable
0187 fair-share state has no notice. The adapter is applied when the cached
0188 record is read, so wording changes do not wait for a census rebuild.
0189 
0190 Waiting-pilot figures use the feed's `pilots.waiting_current`, resolved
0191 from the submitter's idle queue where reported and otherwise Harvester.
0192 Both displays use that field; the raw readings remain available for diagnosis.
0193 
0194 All displayed times use a 24-hour clock in Eastern Time. Hover details
0195 appear after a 150 ms pause. Daily assessment text is the record's
0196 narration, limited to two lines with the full text on hover; its title
0197 row carries verdict, finished-job count and creation time.
0198 
0199 Main-site cut cylinders preserve the complete red segment's height.
0200 The compressed execution-site cylinders have a single grey slant line:
0201 their visible red and green segments show the hourly fail/finish proportions.
0202 Their curved color boundary stays inside the measured red height,
0203 leaving a small green remainder visible.
0204 
0205 ## Task resources
0206 
0207 The task resource panel occupies the left column below the site panels.
0208 It selects EIC production jobs (PanDA source label managed), excluding
0209 test and canary jobs. It plots reported peak memory, scratch disk and
0210 scratch file counts over the preceding twelve hours, with one colour per task across all three
0211 plots. Hovering a curve gives the task name and window peak; hovering a
0212 point gives its time bin, peak and reporting coverage. Each curve links
0213 to the task. Memory and disk use GiB; file counts are integers.
0214 
0215 Each fifteen-minute bin contains the maximum reported job peak. Completed
0216 jobs are placed at their end time; active jobs use their latest update.
0217 These are observations of per-job peaks, rather than samples of aggregate
0218 concurrent usage. Memory reads PanDA maxrss in KiB, scratch disk reads
0219 scratchPeakMB in MiB, and files read scratchPeakFiles. Missing telemetry
0220 is a gap; a plot with no measurements says “No reported peaks”. Coverage
0221 counts and build time remain visible.
0222 
0223 Each resource scale follows the usual individual production-job peaks.
0224 Values above the upper quartile plus three interquartile ranges are excluded from scale
0225 selection; for a constant central population the limit is three times
0226 that value. The largest remaining peak sets the rounded ceiling. Extreme
0227 values retain their true measurements, with marked points at the ceiling
0228 and a top-of-plot annotation giving the largest value and point count.
0229 Its hover lists every affected task, value and time. Sparse records with
0230 fewer than four observations use the full observed range.
0231 
0232 The read-only panda/dashboard/resources.json endpoint serves the shared
0233 task_resource_peaks:v2 cached product with a sixty-second lifetime. The
0234 first fill runs in the background; the panel displays its building state.
0235 The query reads EIC jobs from the active and recent archive tables and
0236 deduplicates PanDA job IDs. The dashboard refreshes it with the existing
0237 minute update. Both the home tab and standalone dashboard use the same
0238 renderer and shared trend geometry.
0239 
0240 ## Live record and links
0241 
0242 Production compute sits directly below Storage in the right column. Its
0243 three plots show efficiency, total average cores (labelled cores/day) and
0244 productive average cores, with OSG, Perlmutter and GREX curves in each. Each plot has an
0245 overall last-24-hour figure and one overall monthly average since May.
0246 The current month is marked with an asterisk. All three use ended-job
0247 walltime times cores, without processor-performance weighting. Efficiency
0248 is the successful fraction; an Event Service job's successful part is its
0249 saved-processing share, not its PanDA status (COMPUTE_EFFICIENCY.md, Event
0250 Service jobs). Cores/day divides all ended core-hours by elapsed
0251 hours and includes failed work. Productive average cores is successful
0252 core-hours divided by elapsed hours, so it equals cores/day times efficiency.
0253 Running jobs and idle pilots are excluded. Monthly rates use calendar time,
0254 including days with no completions, through the observation timestamp.
0255 Hover gives the site, sample hours and job counts. Missing or low-volume
0256 efficiency readings remain unknown. Current readings use the shared minute
0257 cache; monthly history uses its existing hourly cache. The panel follows
0258 Storage without changing existing panel positions or available heights.
0259 
0260 The dashboard reads the shared comp snapshot, `comp_snapshot:v1`,
0261 through `panda/comp/snapshot.json` ([COMP_SNAPSHOT.md](COMP_SNAPSHOT.md)).
0262 The production document includes the current cached record; the shared
0263 dev URL fetches the same record before showing its figures. It updates
0264 once a minute while visible, including on an unfocused operations display,
0265 and catches up when the tab returns. Each fetch reads the shared cache;
0266 a stale record starts one background rebuild. A page reload also uses
0267 that cache, rather than rebuilding every source. The header stays pinned
0268 through the Open / Close controls.
0269 A failed update is reported on the build-time line; an unavailable
0270 initial record does not expose the design's captured figures.
0271 
0272 Links open queue-specific Snapper history, filtered job lists, task
0273 pages, the production front, storage history, live logs and individual
0274 assessment or alarm records. The epicprod-live title opens the live
0275 stream's last day, curated (ACTION_STREAM.md, Curated view). Its panel
0276 shows the stream's warnings and errors from the last 12 hours, and task
0277 Moves at INFO, in grey, for three hours, with route, who and why on hover
0278 (COMP_SNAPSHOT.md, Live), newest first, one per subject, every line the
0279 rules keep, in normal weight, the panel growing downward (Torre Wenaus,
0280 2026-10-29); a failure that has recovered, a node guard
0281 re-trip, a record a later one on its subject supersedes and a record an
0282 operator has answered leave it (COMP_SNAPSHOT.md, Live). OSG's
0283 fair-share hold is recorded at info level, so it never reaches the panel.
0284 The panel's first line reads INFO (j) WARNING (n) ERROR (m), the
0285 window's live records by level, zero included, grey, yellow and red in
0286 Production now's body text (10 px, normal weight; Torre Wenaus,
0287 2026-10-28: "it is loud enough without bold"), each opening exactly those
0288 records on the logs page (the snapshot's `live.counts`). Hourly completion links compute their
0289 ending interval when opened. Failure counts open the error summary for
0290 the selected queue and hour; task failure counts select that task. Error
0291 summaries apply execution-queue filters in SQL, including their status
0292 totals. Site plot legends follow the metric order: running, finish, fail,
0293 queued. Queued links use the queue's not-started
0294 status set. In-flight task IDs open all of that task's job history,
0295 with server-side task filtering and pagination. An in-flight row has one
0296 hover, its task's detail, which names the queue in its short form; the
0297 row's links carry no hover of their own (Torre Wenaus, 2026-10-29). The jobs title and
0298 completion chart follow task and execute-site filters; a whole-queue
0299 pie is omitted for a narrower selection. Task file totals open the task accounting rather than a
0300 job count. Storage capacity links select BNL-XRD and the capacity view.
0301 The science storage figure (terabytes used) is yellow when a major store,
0302 one holding at least a tenth of the science data, is 88% full or more,
0303 and red at 94% (Torre Wenaus, 2026-10-29); its tooltip names the fullest
0304 major store.
0305 The Pressure front's ready figure is yellow when fewer than five
0306 production tasks are ready, none included (Torre Wenaus, 2026-10-29).
0307 A queue without Snapper history opens its queue details. Incomplete
0308 registrations are amber when nonzero and open the jobs with pending or
0309 unfinished payload registration in the same completion hour.
0310 
0311 Each site panel's name has **TASKS** centred beneath it, in 8-pixel text, a
0312 step below the pillar scale's: what has been sent to that allocation, the PCS page Prod tasks in
0313 flight for it (`pcs/in-flight/?site=<name>`), the production tasks sent to its
0314 queues that have not ended, paused ones included.
0315 
0316 Drilldown queue filters come from each snapshot site's queues. The site's
0317 primary queue page is also selected in the feed. The dashboard's panel-name
0318 mapping controls presentation only; it carries no queue catalogue.
0319 
0320 ## Implementation
0321 
0322 - `monitor_app/viewdir/prod_dashboard.py` renders the shared document and
0323   the home tab.
0324 - `monitor_app/templates/monitor_app/prod_dashboard.html` contains the
0325   tuned layout; `prod_hub_dashboard.html` embeds it.
0326 - `monitor_app/static/monitor_app/prod_dashboard/` contains the panel
0327   controls, live binding, drilldown helpers and weekly core averages.
0328 - `epic-trend-model.js` there supplies the ceiling, normalized solid and
0329   overflow paths, and palette through `createEpicTrendModel()`. Its
0330   `hourly(values, binMinutes)` converts counts using the feed's bin duration,
0331   shared by site and storage plots in both displays.
0332   `site(trend, times, binMinutes)` uses that conversion for outcomes;
0333   `series(columns, {count})` accepts displayed values, with
0334   `overflow: true` on columns excluded from the ceiling. The dashboard and room
0335   consume this same pure module; neither computes separate clipping.
0336 - `epic-pillar-model.js` there owns cylinder sizing, outcome fractions and
0337   curved red/green joins, with no DOM or startup side effects. Dashboard
0338   SVG and CSS adapters in `epic-pillars.js` use it. The
0339   computing-room publisher bundles this deployed module into its drawing
0340   content, checking its pinned hash; the room supplies its existing Three.js presentation and scale.
0341 - `monitor_app/_prod_home_tabs.html` supplies the shared tab row.
0342 
0343 The development URL `static/epic-dashboard-design.html` loads the same
0344 standalone document. It has no copied markup, styles or drawing scripts.
0345 The duplicate project-level dashboard scripts are removed. The pre-commit
0346 architectural check rejects a second document or pillar implementation.
0347 After changing the shared model, update its pinned hash in the room source,
0348 deploy dashboard static assets and run Etaverse's `publish_comp_room.sh` so
0349 both views receive the same revision. Publication refuses a missing module
0350 or a hash mismatch.
0351 
0352 The standalone route is a read-only `panda/` page, covered by
0353 swf-remote's existing catch-all. Deployment uses
0354 `deploy-lightweight-ui-mcp.sh --ui --static`
0355 ([PRODUCTION_DEPLOYMENT.md](PRODUCTION_DEPLOYMENT.md)).
0356 
0357 Plot colors are fixed by metric: running white, queued brown, finished
0358 green, failed red. Gaps split a curve into segments without changing
0359 its color. The hourly outcome curves are rates from fifteen-minute
0360 bins. Site histories use the live 90-second series cache. Missing data
0361 is shown as unavailable rather than retaining captured design values.
0362 
0363 The slots/hour figure counts Harvester worker starts, including declined
0364 starts. It does not yet count Google's GKE worker starts. Its number and
0365 cylinder open the worker-admission summary for that
0366 queue and hour: start-cohort outcomes, current workers and payload jobs,
0367 pre-job refusal evidence, repeated slot matches and measured time costs.
0368 Individual expected declines stay below the dashboard's error threshold;
0369 aggregate admission churn remains visible on the summary page.
0370 
0371 Completed tasks for the last 24 hours appear below Paused tasks, from
0372 the snapshot's `completed` record. Each task ID opens its task page;
0373 the title-row count opens the day's production task list. Hover text
0374 carries the task's completion status, queue, end time and file outcomes.
0375 Done tasks are green; finished tasks with lost input files are amber.
0376 
0377 Data arrivals, the science reaching JLab over the last 24 hours (the
0378 Completed tasks window), appear
0379 below Completed tasks,
0380 one row per physics configuration, newest arrival first, from the
0381 snapshot's `arrivals` record (Torre Wenaus, 2026-10-24). A row reads the
0382 physics in short (`label`), the RECO files registered in the window and
0383 the time of the last arrival, over a thin bar of the plan's delivered
0384 against target events: bright green when the configuration is finished,
0385 every task delivering to it in the window having ended or its target met
0386 (past the target counts as met; the hover gives the numbers), blue while
0387 it is incomplete. Each row opens the PC's
0388 page; its hover text carries the full physics line, files and events,
0389 times, tasks, sites and the plan's delivered against target. The title-row
0390 count opens the campaign view. The panel grows downward with the number
0391 of configurations receiving data.