From 99bbc2dfb0ce4e21246362489eeabb4829b6203b Mon Sep 17 00:00:00 2001 From: Puneet Bharti Date: Fri, 10 Jul 2026 12:20:12 +0000 Subject: [PATCH 01/15] Implement SV UI layout shell per Figma (#2594) Replace the shared Header with SvNavigationShell under apps/sv only: network banner, Termina brand wordmark, top nav pills with badge/alert support, and logout. Align spacing and typography with Figma Dev Mode (brand-to-nav gap, nav pill spacing, line-heights, content offset) and add layout tokens plus Termina font assets for the wordmark and logout. Signed-off-by: Puneet Bharti --- apps/sv/frontend/src/App.tsx | 6 +- apps/sv/frontend/src/__tests__/sv.test.tsx | 15 ++- .../fonts/termina/TerminaTest-Black.otf | Bin 0 -> 11480 bytes .../assets/fonts/termina/TerminaTest-Bold.otf | Bin 0 -> 11612 bytes .../assets/fonts/termina/TerminaTest-Demi.otf | Bin 0 -> 11600 bytes .../fonts/termina/TerminaTest-ExtraLight.otf | Bin 0 -> 11760 bytes .../fonts/termina/TerminaTest-Heavy.otf | Bin 0 -> 11668 bytes .../fonts/termina/TerminaTest-Light.otf | Bin 0 -> 11688 bytes .../fonts/termina/TerminaTest-Medium.otf | Bin 0 -> 11776 bytes .../fonts/termina/TerminaTest-Regular.otf | Bin 0 -> 11456 bytes .../assets/fonts/termina/TerminaTest-Thin.otf | Bin 0 -> 11288 bytes apps/sv/frontend/src/components/Layout.tsx | 125 ++++++++++-------- .../src/components/layout/LogoutButton.tsx | 68 ++++++++++ .../src/components/layout/LogoutIcon.tsx | 33 +++++ .../components/layout/NavAttentionIcon.tsx | 31 +++++ .../src/components/layout/NavCountBadge.tsx | 46 +++++++ .../src/components/layout/NetworkBanner.tsx | 49 +++++++ .../src/components/layout/SvNavLink.tsx | 73 ++++++++++ .../components/layout/SvNavigationShell.tsx | 51 +++++++ .../src/components/layout/SvTopNav.tsx | 83 ++++++++++++ .../frontend/src/routes/delegateElection.tsx | 14 ++ apps/sv/frontend/src/theme/fonts.css | 32 +++++ apps/sv/frontend/src/theme/tokens.ts | 69 ++++++++++ 23 files changed, 628 insertions(+), 67 deletions(-) create mode 100644 apps/sv/frontend/src/assets/fonts/termina/TerminaTest-Black.otf create mode 100644 apps/sv/frontend/src/assets/fonts/termina/TerminaTest-Bold.otf create mode 100644 apps/sv/frontend/src/assets/fonts/termina/TerminaTest-Demi.otf create mode 100644 apps/sv/frontend/src/assets/fonts/termina/TerminaTest-ExtraLight.otf create mode 100644 apps/sv/frontend/src/assets/fonts/termina/TerminaTest-Heavy.otf create mode 100644 apps/sv/frontend/src/assets/fonts/termina/TerminaTest-Light.otf create mode 100644 apps/sv/frontend/src/assets/fonts/termina/TerminaTest-Medium.otf create mode 100644 apps/sv/frontend/src/assets/fonts/termina/TerminaTest-Regular.otf create mode 100644 apps/sv/frontend/src/assets/fonts/termina/TerminaTest-Thin.otf create mode 100644 apps/sv/frontend/src/components/layout/LogoutButton.tsx create mode 100644 apps/sv/frontend/src/components/layout/LogoutIcon.tsx create mode 100644 apps/sv/frontend/src/components/layout/NavAttentionIcon.tsx create mode 100644 apps/sv/frontend/src/components/layout/NavCountBadge.tsx create mode 100644 apps/sv/frontend/src/components/layout/NetworkBanner.tsx create mode 100644 apps/sv/frontend/src/components/layout/SvNavLink.tsx create mode 100644 apps/sv/frontend/src/components/layout/SvNavigationShell.tsx create mode 100644 apps/sv/frontend/src/components/layout/SvTopNav.tsx create mode 100644 apps/sv/frontend/src/routes/delegateElection.tsx create mode 100644 apps/sv/frontend/src/theme/fonts.css create mode 100644 apps/sv/frontend/src/theme/tokens.ts diff --git a/apps/sv/frontend/src/App.tsx b/apps/sv/frontend/src/App.tsx index 2ec65affcb..812a5385cf 100644 --- a/apps/sv/frontend/src/App.tsx +++ b/apps/sv/frontend/src/App.tsx @@ -39,6 +39,7 @@ import { useConfigPollInterval, useSvConfig } from './utils'; import { Governance } from './routes/governance'; import { VoteRequestDetails } from './routes/voteRequestDetails'; import { CreateProposal } from './routes/createProposal'; +import DelegateElection from './routes/delegateElection'; const Providers: React.FC = ({ children }) => { const config = useSvConfig(); @@ -95,6 +96,7 @@ const App: React.FC = () => { } /> } /> } /> + } /> } /> } /> @@ -111,8 +113,8 @@ const App: React.FC = () => { - Super Validator Operations - + Supervalidator Operations + diff --git a/apps/sv/frontend/src/__tests__/sv.test.tsx b/apps/sv/frontend/src/__tests__/sv.test.tsx index dc1f618048..fd46e233a0 100644 --- a/apps/sv/frontend/src/__tests__/sv.test.tsx +++ b/apps/sv/frontend/src/__tests__/sv.test.tsx @@ -45,15 +45,16 @@ describe('SV user can', () => { userEvent.setup(); render(); - await screen.findByText('You are on ScratchNet'); + const dsoPartyId = dsoInfo.dso_party_id.replace(/^DSO::/, ''); + await screen.findByText(`ScratchNet · ID: ${dsoPartyId}`); }); test('browse to the validator onboarding tab', async () => { const user = userEvent.setup(); render(); - expect(await screen.findByText('Validator Onboarding')).toBeDefined(); - await user.click(screen.getByText('Validator Onboarding')); + expect(await screen.findByText('Validators')).toBeDefined(); + await user.click(screen.getByText('Validators')); expect(await screen.findByText('Validator Onboarding Secrets')).toBeDefined(); }); @@ -62,8 +63,8 @@ describe('SV user can', () => { const user = userEvent.setup(); render(); - expect(await screen.findByText('Validator Onboarding')).toBeDefined(); - await user.click(screen.getByText('Validator Onboarding')); + expect(await screen.findByText('Validators')).toBeDefined(); + await user.click(screen.getByText('Validators')); const partyHintInput = screen.getByTestId('create-party-hint'); await user.type(partyHintInput, 'wrong-input'); @@ -306,8 +307,8 @@ describe('An AddFutureAmuletConfigSchedule request', () => { const user = userEvent.setup(); render(); - expect(await screen.findByText('Validator Onboarding')).toBeDefined(); - await user.click(screen.getByText('Validator Onboarding')); + expect(await screen.findByText('Validators')).toBeDefined(); + await user.click(screen.getByText('Validators')); expect(await screen.findByText('Validator Licenses')).toBeDefined(); diff --git a/apps/sv/frontend/src/assets/fonts/termina/TerminaTest-Black.otf b/apps/sv/frontend/src/assets/fonts/termina/TerminaTest-Black.otf new file mode 100644 index 0000000000000000000000000000000000000000..a2cef4eee7dde63e508b1af2a38f99e07e311102 GIT binary patch literal 11480 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 tJDM@C+=B(=bkOuBi%^qglX_1NmY%{txHOv$g;L literal 0 HcmV?d00001 diff --git a/apps/sv/frontend/src/assets/fonts/termina/TerminaTest-Bold.otf b/apps/sv/frontend/src/assets/fonts/termina/TerminaTest-Bold.otf new file mode 100644 index 0000000000000000000000000000000000000000..2f61c06e6aea73d881be3a646b09fbd95ef00c15 GIT binary patch literal 11612 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 U$}vJO7AN#zZ5;Wmr+`!Nzr+hnX8-^I literal 0 HcmV?d00001 diff --git a/apps/sv/frontend/src/assets/fonts/termina/TerminaTest-Demi.otf b/apps/sv/frontend/src/assets/fonts/termina/TerminaTest-Demi.otf new file mode 100644 index 0000000000000000000000000000000000000000..92f72c6e50580771bbae01a996aa482cc4c81021 GIT binary patch literal 11600 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 literal 0 HcmV?d00001 diff --git a/apps/sv/frontend/src/assets/fonts/termina/TerminaTest-ExtraLight.otf b/apps/sv/frontend/src/assets/fonts/termina/TerminaTest-ExtraLight.otf new file mode 100644 index 0000000000000000000000000000000000000000..5a7528534365e5947b567f9335358a364786cf02 GIT binary patch literal 11760 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 literal 0 HcmV?d00001 diff --git a/apps/sv/frontend/src/assets/fonts/termina/TerminaTest-Light.otf b/apps/sv/frontend/src/assets/fonts/termina/TerminaTest-Light.otf new file mode 100644 index 0000000000000000000000000000000000000000..85528c7dcd30ca1cba09f27cc639bebf42665c7e GIT binary patch literal 11688 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 literal 0 HcmV?d00001 diff --git a/apps/sv/frontend/src/assets/fonts/termina/TerminaTest-Medium.otf b/apps/sv/frontend/src/assets/fonts/termina/TerminaTest-Medium.otf new file mode 100644 index 0000000000000000000000000000000000000000..151423013ebd3659e6193a8cc51c982e6b9bd81a GIT binary patch literal 11776 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 literal 0 HcmV?d00001 diff --git a/apps/sv/frontend/src/assets/fonts/termina/TerminaTest-Regular.otf b/apps/sv/frontend/src/assets/fonts/termina/TerminaTest-Regular.otf new file mode 100644 index 0000000000000000000000000000000000000000..9414706313c00aec23a14a57a489cfd025f11be4 GIT binary patch literal 11456 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 K86^}E^8Wyni@2cx literal 0 HcmV?d00001 diff --git a/apps/sv/frontend/src/components/Layout.tsx b/apps/sv/frontend/src/components/Layout.tsx index 80c3facaea..9ab0475983 100644 --- a/apps/sv/frontend/src/components/Layout.tsx +++ b/apps/sv/frontend/src/components/Layout.tsx @@ -1,40 +1,60 @@ // Copyright (c) 2024 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved. // SPDX-License-Identifier: Apache-2.0 import * as React from 'react'; -import { - Header, - Loading, - useUserState, - useVotesHooks, -} from '@canton-network/splice-common-frontend'; +import { Loading, useUserState, useVotesHooks } from '@canton-network/splice-common-frontend'; -import { Logout } from '@mui/icons-material'; -import { Box, Button, Divider, GlobalStyles, Stack, Typography } from '@mui/material'; -import Container from '@mui/material/Container'; -import Link from '@mui/material/Link'; +import { Box, Container, GlobalStyles } from '@mui/material'; +import { useLocation } from 'react-router'; import { partyIdScrollGlobalStyles } from './beta/identifierStyles'; import PartyIdScrollTracks from './PartyIdScrollTracks'; - +import SvNavigationShell from './layout/SvNavigationShell'; +import { SvNavLinkItem } from './layout/SvNavLink'; import { useFeatureSupport } from '../contexts/SvContext'; import { useNetworkInstanceName } from '../hooks/index'; +import { CONTENT_MAX_WIDTH, layoutTokens, PAGE_PX } from '../theme/tokens'; import { useSvConfig } from '../utils'; interface LayoutProps { children: React.ReactNode; } -const Layout: React.FC = (props: LayoutProps) => { +const pathnameToPageName = (pathname: string, amuletName: string): string => { + if (pathname.startsWith('/governance')) { + return 'Governance'; + } + if (pathname.startsWith('/validator-onboarding')) { + return 'Validators'; + } + if (pathname.startsWith('/amulet-price')) { + return `${amuletName} Price`; + } + if (pathname.startsWith('/delegate-election')) { + return 'Delegate Election'; + } + return 'Global Synchronizer Information'; +}; + +/** Figma content-width 1583px centered — nav uses full width inside Navigation shell */ +const contentShellSx = { + maxWidth: CONTENT_MAX_WIDTH, + mx: 'auto', + px: PAGE_PX, + width: '100%', +}; + +const Layout: React.FC = ({ children }) => { const config = useSvConfig(); const { logout } = useUserState(); + const location = useLocation(); const networkInstanceName = useNetworkInstanceName(); - const networkInstanceNameColor = `colors.${networkInstanceName?.toLowerCase()}`; const featureSupport = useFeatureSupport(); const votesHooks = useVotesHooks(); const dsoInfosQuery = votesHooks.useDsoInfos(); const listVoteRequestsQuery = votesHooks.useListDsoRulesVoteRequests(); const svPartyId = dsoInfosQuery.data?.svPartyId; + const dsoPartyId = dsoInfosQuery.data?.dsoPartyId; const actionsPending = listVoteRequestsQuery.data?.filter( vr => vr.payload.votes.entriesArray().find(e => e[1].sv === svPartyId) === undefined ); @@ -43,57 +63,46 @@ const Layout: React.FC = (props: LayoutProps) => { return ; } - const navLinks = [ - { name: 'Information', path: 'dso' }, - { name: 'Validator Onboarding', path: 'validator-onboarding' }, - { name: `${config.spliceInstanceNames.amuletName} Price`, path: 'amulet-price' }, - { name: 'Governance', path: 'governance', badgeCount: actionsPending?.length }, + const navLinks: SvNavLinkItem[] = [ + { name: 'Global Synchronizer Information', path: '/dso' }, + { + name: 'Governance', + path: '/governance', + end: false, + badgeCount: actionsPending?.length, + }, + { name: `${config.spliceInstanceNames.amuletName} Price`, path: '/amulet-price' }, + { name: 'Validators', path: '/validator-onboarding' }, + /** + * Figma shows this alert icon on every page mockup (verified across all Delegate + * Election, Governance, and Validators frames) — it isn't conditional on any known + * backend signal today, so default it on. Wire to a real "pending ranking" signal + * once the Delegate Election API exposes one. + */ + { name: 'Delegate Election', path: '/delegate-election', hasAlert: true }, ]; + const pageName = pathnameToPageName(location.pathname, config.spliceInstanceNames.amuletName); + const networkName = networkInstanceName ?? config.spliceInstanceNames.networkName; + return ( - + - {networkInstanceName === undefined ? ( - <> - ) : ( - - - You are on {networkInstanceName} - - - )} - -
- - - - -
-
+ {dsoPartyId !== undefined ? ( + + ) : null} - - {props.children} + + + {children} + ); diff --git a/apps/sv/frontend/src/components/layout/LogoutButton.tsx b/apps/sv/frontend/src/components/layout/LogoutButton.tsx new file mode 100644 index 0000000000..fe4912914a --- /dev/null +++ b/apps/sv/frontend/src/components/layout/LogoutButton.tsx @@ -0,0 +1,68 @@ +// Copyright (c) 2024 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved. +// SPDX-License-Identifier: Apache-2.0 +import * as React from 'react'; + +import { Box, Typography } from '@mui/material'; + +import { layoutTokens, navItemTypography, NAV_PILL_PX } from '../../theme/tokens'; +import LogoutIcon from './LogoutIcon'; + +interface LogoutButtonProps { + onLogout: () => void; +} + +/** + * Figma Dev Mode — content box 66x17, 10px padding on each side, gap-2.5 (10px) + * between icon and label. Plain `Box component="button"` (matching `SvNavLink`'s + * pattern) instead of MUI `Button` — MUI's own min-height/padding/ripple defaults + * previously inflated this to ~89.78x38 despite the padding value being correct. + */ +const LogoutButton: React.FC = ({ onLogout }) => ( + + + + Logout + + +); + +export default LogoutButton; diff --git a/apps/sv/frontend/src/components/layout/LogoutIcon.tsx b/apps/sv/frontend/src/components/layout/LogoutIcon.tsx new file mode 100644 index 0000000000..d979051d7c --- /dev/null +++ b/apps/sv/frontend/src/components/layout/LogoutIcon.tsx @@ -0,0 +1,33 @@ +// Copyright (c) 2024 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved. +// SPDX-License-Identifier: Apache-2.0 +import * as React from 'react'; + +import { Box } from '@mui/material'; + +/** + * Figma logout glyph — door bracket (open right) with an arrow exiting through it. + * Path data reconstructed from the true Figma vector export (CF-design-system/svgs), + * not the lossy Tailwind HTML export — the div-based export flattens this icon into + * two filled bars that don't resemble a logout glyph at all. + */ +const LogoutIcon: React.FC = () => ( + + + + + + + +); + +export default LogoutIcon; diff --git a/apps/sv/frontend/src/components/layout/NavAttentionIcon.tsx b/apps/sv/frontend/src/components/layout/NavAttentionIcon.tsx new file mode 100644 index 0000000000..960fce26b7 --- /dev/null +++ b/apps/sv/frontend/src/components/layout/NavAttentionIcon.tsx @@ -0,0 +1,31 @@ +// Copyright (c) 2024 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved. +// SPDX-License-Identifier: Apache-2.0 +import * as React from 'react'; + +import { Box } from '@mui/material'; + +/** Figma nav warning icon for Delegate Election (yellow triangle + exclamation cutout). */ +const NavAttentionIcon: React.FC = () => ( + + + + + +); + +export default NavAttentionIcon; diff --git a/apps/sv/frontend/src/components/layout/NavCountBadge.tsx b/apps/sv/frontend/src/components/layout/NavCountBadge.tsx new file mode 100644 index 0000000000..9581cb8fb6 --- /dev/null +++ b/apps/sv/frontend/src/components/layout/NavCountBadge.tsx @@ -0,0 +1,46 @@ +// Copyright (c) 2024 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved. +// SPDX-License-Identifier: Apache-2.0 +import * as React from 'react'; + +import { Box } from '@mui/material'; + +import { layoutTokens } from '../../theme/tokens'; + +interface NavCountBadgeProps { + count: number; + id?: string; +} + +/** Figma nav notification badge — size-5 bg-red-400 rounded-3xl, text-xs Inter. */ +const NavCountBadge: React.FC = ({ count, id }) => { + if (count <= 0) { + return null; + } + + return ( + 9 ? 0.5 : 0, + borderRadius: '24px', + bgcolor: layoutTokens.notificationBadge, + color: 'common.white', + fontFamily: '"Inter", sans-serif', + fontSize: '0.75rem', + fontWeight: 400, + lineHeight: 1, + }} + > + {count} + + ); +}; + +export default NavCountBadge; diff --git a/apps/sv/frontend/src/components/layout/NetworkBanner.tsx b/apps/sv/frontend/src/components/layout/NetworkBanner.tsx new file mode 100644 index 0000000000..2d0e660f4d --- /dev/null +++ b/apps/sv/frontend/src/components/layout/NetworkBanner.tsx @@ -0,0 +1,49 @@ +// Copyright (c) 2024 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved. +// SPDX-License-Identifier: Apache-2.0 +import * as React from 'react'; + +import { Stack, Typography } from '@mui/material'; + +import { BANNER_MIN_HEIGHT, layoutTokens } from '../../theme/tokens'; + +interface NetworkBannerProps { + networkName: string; + dsoPartyId: string; +} + +const stripDsoPrefix = (partyId: string): string => partyId.replace(/^DSO::/, ''); + +const NetworkBanner: React.FC = ({ networkName, dsoPartyId }) => ( + + + {networkName} · ID: {stripDsoPrefix(dsoPartyId)} + + +); + +export default NetworkBanner; diff --git a/apps/sv/frontend/src/components/layout/SvNavLink.tsx b/apps/sv/frontend/src/components/layout/SvNavLink.tsx new file mode 100644 index 0000000000..6bb2538f29 --- /dev/null +++ b/apps/sv/frontend/src/components/layout/SvNavLink.tsx @@ -0,0 +1,73 @@ +// Copyright (c) 2024 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved. +// SPDX-License-Identifier: Apache-2.0 +import * as React from 'react'; +import { NavLink } from 'react-router'; + +import { Box } from '@mui/material'; + +import { layoutTokens, navItemTypography, NAV_PILL_PX } from '../../theme/tokens'; +import NavAttentionIcon from './NavAttentionIcon'; +import NavCountBadge from './NavCountBadge'; + +export interface SvNavLinkItem { + name: string; + path: string; + badgeCount?: number; + hasAlert?: boolean; + /** When false, nav stays active on nested paths (e.g. /governance/proposals). */ + end?: boolean; +} + +interface SvNavLinkProps { + link: SvNavLinkItem; +} + +/** Figma: badge accessory uses gap-1.5 (6px), alert-icon accessory uses gap-2.5 (10px). */ +const navLinkSx = (isActive: boolean, accessoryGap: string) => ({ + display: 'inline-flex', + alignItems: 'center', + gap: accessoryGap, + p: NAV_PILL_PX, + borderRadius: '20px', + textDecoration: 'none', + whiteSpace: 'nowrap', + color: layoutTokens.lightText, + fontFamily: layoutTokens.fontUi, + fontSize: '0.875rem', + fontWeight: 700, + ...navItemTypography, + border: '2px solid transparent', + boxSizing: 'border-box', + ...(isActive && { borderColor: layoutTokens.navActiveOutline }), + '&:focus': { outline: 'none' }, + '&:focus-visible': { + outline: '2px solid', + outlineColor: layoutTokens.navActiveOutline, + outlineOffset: '2px', + }, +}); + +const SvNavLink: React.FC = ({ link }) => ( + + {({ isActive }) => ( + + {link.name} + {link.badgeCount !== undefined && link.badgeCount > 0 ? ( + + ) : null} + {link.hasAlert ? : null} + + )} + +); + +export default SvNavLink; diff --git a/apps/sv/frontend/src/components/layout/SvNavigationShell.tsx b/apps/sv/frontend/src/components/layout/SvNavigationShell.tsx new file mode 100644 index 0000000000..21dc0b8128 --- /dev/null +++ b/apps/sv/frontend/src/components/layout/SvNavigationShell.tsx @@ -0,0 +1,51 @@ +// Copyright (c) 2024 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved. +// SPDX-License-Identifier: Apache-2.0 +import * as React from 'react'; + +import { Box } from '@mui/material'; + +import { BANNER_HEADER_GAP, HEADER_PB, layoutTokens, PAGE_PX } from '../../theme/tokens'; +import NetworkBanner from './NetworkBanner'; +import SvTopNav from './SvTopNav'; +import { SvNavLinkItem } from './SvNavLink'; + +interface SvNavigationShellProps { + networkName: string; + dsoPartyId: string; + navLinks: SvNavLinkItem[]; + onLogout: () => void; + pageName: string; +} + +/** + * Figma "Navigation" component — banner + nav row. + * Dev Mode: vertical flow, gap 30px, padding-bottom 64px, background #272727. + */ +const SvNavigationShell: React.FC = ({ + networkName, + dsoPartyId, + navLinks, + onLogout, + pageName, +}) => ( + + + + + + +); + +export default SvNavigationShell; diff --git a/apps/sv/frontend/src/components/layout/SvTopNav.tsx b/apps/sv/frontend/src/components/layout/SvTopNav.tsx new file mode 100644 index 0000000000..d9ec57f9ac --- /dev/null +++ b/apps/sv/frontend/src/components/layout/SvTopNav.tsx @@ -0,0 +1,83 @@ +// Copyright (c) 2024 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved. +// SPDX-License-Identifier: Apache-2.0 +import * as React from 'react'; + +import { Box, Stack, Typography } from '@mui/material'; + +import { + BRAND_TITLE, + layoutTokens, + NAV_BRAND_GAP, + NAV_GAP, + NAV_PILL_PX, + NAV_ROW_MIN_HEIGHT, +} from '../../theme/tokens'; +import LogoutButton from './LogoutButton'; +import SvNavLink, { SvNavLinkItem } from './SvNavLink'; + +interface SvTopNavProps { + navLinks: SvNavLinkItem[]; + onLogout: () => void; +} + +/** + * Figma nav row (Frame11): brand pinned left, a fixed 145px gap (`NAV_BRAND_GAP`) + * to the nav cluster, then a flexible spacer that pushes logout to the pinned + * right edge. The fixed left gap matches the Dev Mode measurement exactly; the + * flexible right gap lets logout track the row's right edge at any viewport width. + */ +const SvTopNav: React.FC = ({ navLinks, onLogout }) => ( + + + + {BRAND_TITLE} + + + + + + + {navLinks.map(link => ( + + ))} + + + + + + +); + +export default SvTopNav; diff --git a/apps/sv/frontend/src/routes/delegateElection.tsx b/apps/sv/frontend/src/routes/delegateElection.tsx new file mode 100644 index 0000000000..5b1e584b2a --- /dev/null +++ b/apps/sv/frontend/src/routes/delegateElection.tsx @@ -0,0 +1,14 @@ +// Copyright (c) 2024 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved. +// SPDX-License-Identifier: Apache-2.0 +import * as React from 'react'; + +import { Typography } from '@mui/material'; + +/** Placeholder for #2594 layout nav — page content is a separate issue. */ +const DelegateElection: React.FC = () => ( + + Delegate Election + +); + +export default DelegateElection; diff --git a/apps/sv/frontend/src/theme/fonts.css b/apps/sv/frontend/src/theme/fonts.css new file mode 100644 index 0000000000..8c8ecb631a --- /dev/null +++ b/apps/sv/frontend/src/theme/fonts.css @@ -0,0 +1,32 @@ +/* Copyright (c) 2024 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved. */ +/* SPDX-License-Identifier: Apache-2.0 */ + +/** + * SV-local Termina font-faces. + * + * @canton-network/splice-common-typeface-termina only bundles Termina Bold at + * `font-weight: 700` (with an invalid `font-style: bold`, silently ignored by + * browsers). The SV brand wordmark needs `font-weight: 500` (Figma Dev Mode), + * and until now no true Medium-weight Termina artwork existed anywhere in this + * design system, so 500 rendered as bold via a weight-range hack. + * + * These are the real Termina Medium/Bold weights (licensed test files from + * Fort Foundry, see assets/fonts/termina/ — the full 9-weight family is kept + * there for future use, but only the two weights this app actually renders + * are registered below), scoped to apps/sv (no apps/common changes). This is + * the first time an actual Medium glyph set has been wired up — 500 now + * renders visibly lighter than 700. + */ +@font-face { + font-family: 'Termina'; + src: url('../assets/fonts/termina/TerminaTest-Medium.otf') format('opentype'); + font-weight: 500; + font-style: normal; +} + +@font-face { + font-family: 'Termina'; + src: url('../assets/fonts/termina/TerminaTest-Bold.otf') format('opentype'); + font-weight: 700; + font-style: normal; +} diff --git a/apps/sv/frontend/src/theme/tokens.ts b/apps/sv/frontend/src/theme/tokens.ts new file mode 100644 index 0000000000..445fd20709 --- /dev/null +++ b/apps/sv/frontend/src/theme/tokens.ts @@ -0,0 +1,69 @@ +// Copyright (c) 2024 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved. +// SPDX-License-Identifier: Apache-2.0 + +// SV-local Termina @font-face (Medium 500 + Bold 700) — see fonts.css for why this +// exists alongside @canton-network/splice-common-typeface-termina. +import './fonts.css'; + +/** Figma tokens from CF-design-system (tokens.md + delegate-election-2 Dev Mode). */ +export const layoutTokens = { + /** Figma surface-page — bg-neutral-800 */ + page: '#262626', + /** Figma Dev Mode Background-lighter on Navigation component */ + navBackground: '#272727', + /** Figma Dev Mode --Light-text — brand wordmark and nav labels */ + lightText: '#E2E2E2', + /** Figma banner-testnet — bg-cyan-100 (styled export uses #C8F1FE) */ + bannerTestnet: '#cffafe', + bannerText: '#18181b', + /** Figma red00 — Governance count badge */ + notificationBadge: '#FD8575', + /** Figma Purple (Navigation) — active nav pill border */ + navActiveOutline: '#875CFF', + navAttention: '#F3FF97', + fontBrand: '"Termina", sans-serif', + fontUi: '"Inter", sans-serif', +} as const; + +/** Figma Dev Mode — nav row horizontal padding 50px */ +export const PAGE_PX = '50px'; + +/** Figma p-2.5 — 10px padding on brand box and nav pills */ +export const NAV_PILL_PX = '10px'; + +/** Figma content max width (nav row is full width; content uses this) */ +export const CONTENT_MAX_WIDTH = 1583; + +/** Figma Dev Mode — 64px space below nav row, present on every page */ +export const HEADER_PB = 8; + +/** Figma Dev Mode — 30px gap between banner and nav row (Navigation component) */ +export const BANNER_HEADER_GAP = 3.75; + +/** Figma Dev Mode — fixed 145px gap between brand wordmark and nav cluster. */ +export const NAV_BRAND_GAP = '145px'; + +/** Figma Dev Mode — fixed 60px between nav pills (not responsive). */ +export const NAV_GAP = '60px'; + +/** Figma Dev Mode — nav row height 44px */ +export const NAV_ROW_MIN_HEIGHT = 44; + +/** Figma Dev Mode — banner height 50px */ +export const BANNER_MIN_HEIGHT = 50; + +/** + * Figma Dev Mode — Inter nav/logout typography (letter spacing: 0px, 140% line-height). + * Without an explicit `letterSpacing` reset, these Box/Typography elements inherit + * MUI's default body1 letter-spacing (0.00938em) from an ancestor, rendering as a + * ~0.13-0.15px leak that's invisible in a screenshot but measurable via computed + * styles and doesn't match Figma's 0px spec. `lineHeight: 'normal'` also falls back + * to Inter's own metrics rather than the explicit 140% Figma spec, so it's pinned here. + */ +export const navItemTypography = { + fontFeatureSettings: "'liga' off, 'clig' off", + lineHeight: 1.4, + letterSpacing: 0, +} as const; + +export const BRAND_TITLE = 'Supervalidator Operations'; From 7d7a2eb64e436db5903c878b3332e567ae417a20 Mon Sep 17 00:00:00 2001 From: Puneet Bharti Date: Mon, 20 Jul 2026 09:12:17 +0000 Subject: [PATCH 02/15] Replace TerminaTest brand font with Inter (#2594) Drop the Fort Foundry TerminaTest assets and SV-local @font-face wiring; use Inter for the layout brand wordmark until a production-licensed Termina is available. Signed-off-by: Puneet Bharti --- .../fonts/termina/TerminaTest-Black.otf | Bin 11480 -> 0 bytes .../assets/fonts/termina/TerminaTest-Bold.otf | Bin 11612 -> 0 bytes .../assets/fonts/termina/TerminaTest-Demi.otf | Bin 11600 -> 0 bytes .../fonts/termina/TerminaTest-ExtraLight.otf | Bin 11760 -> 0 bytes .../fonts/termina/TerminaTest-Heavy.otf | Bin 11668 -> 0 bytes .../fonts/termina/TerminaTest-Light.otf | Bin 11688 -> 0 bytes .../fonts/termina/TerminaTest-Medium.otf | Bin 11776 -> 0 bytes .../fonts/termina/TerminaTest-Regular.otf | Bin 11456 -> 0 bytes .../assets/fonts/termina/TerminaTest-Thin.otf | Bin 11288 -> 0 bytes apps/sv/frontend/src/theme/fonts.css | 32 ------------------ apps/sv/frontend/src/theme/tokens.ts | 7 ++-- 11 files changed, 2 insertions(+), 37 deletions(-) delete mode 100644 apps/sv/frontend/src/assets/fonts/termina/TerminaTest-Black.otf delete mode 100644 apps/sv/frontend/src/assets/fonts/termina/TerminaTest-Bold.otf delete mode 100644 apps/sv/frontend/src/assets/fonts/termina/TerminaTest-Demi.otf delete mode 100644 apps/sv/frontend/src/assets/fonts/termina/TerminaTest-ExtraLight.otf delete mode 100644 apps/sv/frontend/src/assets/fonts/termina/TerminaTest-Heavy.otf delete mode 100644 apps/sv/frontend/src/assets/fonts/termina/TerminaTest-Light.otf delete mode 100644 apps/sv/frontend/src/assets/fonts/termina/TerminaTest-Medium.otf delete mode 100644 apps/sv/frontend/src/assets/fonts/termina/TerminaTest-Regular.otf delete mode 100644 apps/sv/frontend/src/assets/fonts/termina/TerminaTest-Thin.otf delete mode 100644 apps/sv/frontend/src/theme/fonts.css diff --git a/apps/sv/frontend/src/assets/fonts/termina/TerminaTest-Black.otf b/apps/sv/frontend/src/assets/fonts/termina/TerminaTest-Black.otf deleted file mode 100644 index a2cef4eee7dde63e508b1af2a38f99e07e311102..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11480 zcmbVS2YeLO*1xl}GaF{Y0$Daf*4Yh_CTOH2v|xbHf*1%8dguu?Ad--TV#E5x=kp=Y z_S9fd1f(g5G?At>DN>^p>7syCJ+s{9&G)~v2?^qR-}}BhznR<4J@?#m&OPVcndzR9 z(Va!Irlt%yVJzC$xkJZJtQt#XEan75L+AAFz1ALD8IQWjSk?KR zd-YCPb#v7X#v0B+e}nG59%?dn>tCN@OlpMs&=KQ@O_UZ(yMQkh^#P-^hh=&9-BTCk zZ*eypjfRNFoqYlCM7{Rt@p**@s<;5(5dBi*_+f<;S^IQ!N%iqiCkz{(o%~Mr0n}e( z%&}_XW4U?OD%J$}KSX~llLRPZpLP6r%8)9pe`B(I9xZHNN^uR5|G1;^cIz!GPKlP= zqbf6pXhp&pd4pAzF{L{CFDubDrf^^Q33$+9kCGpdpJNJ(aJ=m3ht96yTpG-pNP<+R zg-3{|pyzh#-L-Ew)|SPxsj>ret(P~jE3u5dE&v>j9P5z9f+of)vts0uvl7Y^aEHqh ztBqQ?>|ky-tF$b$7Hm#w*$J4E(z3z|S*WzEvN$QPv>d@|NN<#uE3p`9NoiSU4@lce z%aIkzRRMpaw7nYB9FgF{V{9Uu!X~jXY!n;K@<8_j+)Y>`))?9n%Z8&jmZh;_=*t6i zA!@wbOXy&cLq$jh??`&W?fld){Q0o0gu2cusq1hvHZK4D#G-!smTR3kAa@pJLXEq z8e{EwD^f5Tka?g|z~|o{5f7=g09E6$f^onpU`B%O9AF*}PR4_e@vIq3V9jwQ{uk7D z0**;GUqop#X3Ii-%72i8kX#-l*@``cYh>wok(ZB-w<#b0hxyB;P|iIlv8}6&RTtWV za&_iposdVe2=qCz_ITEk4Pa9(3$3y20r09F8-`jO>Wa0&T4RqZ-#~59-xhshS0GuR zi@kn#l9%T z^~kDFl&CyVjX5N#b(i*!O`I}m%&5_Mv6=NpWZoa!q*3F<*x^%R(}v~cJysaoYxLxt z>`C#l?Q(KrZLr+fN!hvClk&5(;!7uw4Nu-56tPU~?qgDIsgIN+&5%Bqc1kCuGmb%y zU5*QmpsdQ(<$QU*yj|WWe=nbs$yv!+%~{jg)Y;qF-#OGd(mCDvtn)?ZtIoHaMb5d- z<<3>kb{6u;6;8LT{`yr|4pmMI&R9m)aaqH;~)ilr)QlzNXEtJYKF z)h22S^$|5w9jcB}bJXeTGwKWK>+0KTk@}&!KwYe^R@bXr)NSf6Z}Q)AUVS&_-DR(B z{ITT8@n8FYr+bwzT5wk}_xSi=UMq>ac@1irK}j!#M`j0fFHNKS$wfV=2S?7Q;kuu@cn{u#kkhmP^>e25 zS-xk_hUEtiel?C!8@dk@{9Uq_0+a&VFyan~{M~@cL}g?NdGoIOs0-zNM{@(A+Q+>qSt~Ye{%rYyb*m;1SsLi>8Zv6|s8X#hQVgdE!gTtMixwRPlBXrIbo zpk(iH>UNxWQ{3J$;|9(c?He)l&BcpXzPWtK+8JX$3AnvHGSrOMG@B{>WtG=NIZ~7t zsx<3XxR4Ywgm-?=ADK z{&>QO06$2@gw{C2y(*Vd=w507*`!E|f~VwQ7qYy>-dVrzU<}3bZrk`sT;00y*mmnX z5S#9gEoj~6!5AJ(9g=7!t`0{i_UG0cVvGFz21R?9Zkn@o>!$osqcZZlch8u!)DPia z@OJ4^w07;TqFuXo6$~8MrJzf|{Z%fdQ5?12LupawHCjB@Fh4cNc{??GYGi8Q{D(ix z{mJ*k@rgsX2FOQo%I@a8=4zfI_}YQj;!p4=2szECBJzXu2Go^jujNJ{o$v6r>-xco zyg>2VZ{FPKJG?f(fBymbZ3AxF9U80fskDfux@fnF^4BV_&u2sXW-IPgO?oSsDVqV) z9c$=VT-;z%Pwbn!;&VN@fCBgD(1JJ-YCG|(DIfznxps@qhq9+2L^YjEqki=X?p7e>Crf8H)nNWGF@bTE5=f2P#eq8=EFGY+$oo+a z_0u!w^w7F!o>g=>+EW75s|FjMl7lIlOAmeF8Zv(B*lGEHo0aDu!y7Awo4%Q`)<=og zf2G8L`M%3di&Q=HA1|Oi+64e=-qmO z&KKQE*XIn<^kxQc$0PJ$ zdaB{l&A(C~U0OiP=o-Bt>r|Wf+{AnGX1s2XhOPaSz}?E0oxA59_HEoYW8|2OXZiw86Ow07?{9u-`xFBi+6?>L}5v?`P-X8@E zyu6AT$6r-LuZKD*yn*=?j{w0DRK*qAMcus6hK34nC~%2+8y=&2J*b6`3Mlm;)&9Bl zy4a$C*nWo&#^@_oKQU;jzGNoYzK#0v1WM3bhT^?L2fe*|RN%5}_0rXEuk;;WF{DeE z;X~R$#oJ*T**2-jc{_bYF7+@gQ8(RuI@Jgcpe&cpH=BvHoR%v5gbL-KtI*t3gBI!1 zcA6*aEsZE}i7(TWwC#FVE!*(xymLOK!jL_jZ^rAqYAZu;rIi%T{@dUGu1}-c{Hc7M z*W}Oh=k+<`G(Dkn&ZGTw8l0&Gzc*j-(%@VFyp;~@v{NN+E?21WtylRlv!ly>exRne z-+KA-{;j%)d9LU*?00(fQ|c+r3GR@ozD~(S1%fDy?PkUmNaoB=#?9(FEefW)+-4KH z2uoL;y!wS)$^=EHbv{b%(u2$WA9ylCr}0^azVD~^Kii~_)&e^9oC#bkt|m*V$*NUC zM9r!&#LObRXfGVIlht5T*~PwVZXGuRGsxe&D>QG*%Ln=E@_=2<0W^ zAIeVUm~vTdruI^osfX25>M!a=^_FV6T&_y4x~^nbJN_^CwK@6Zpk%W}fi(T*bUD~L zx{h&rCMBb>!DUJYJLb#5k@PR`?|<@i%E8X0$QfE?2NWI?h8}58P z5UNhCy);@~Jb&7lF%zbZ3GmS>J>W$zJO=Z0)>AA?J72_ zs5F%?SKdZO%au?SnlF^(Q7xDdOn*>wx6y=Bo7HI=Eq429z;CGdBTa z=sBULXv|TCp+An!4m@z2j|$}RU%b3GKzplSeU{(5cUFF1EUgYKB2UdX-=nc*xS_?X zZjPmEUV5HqP)&|q#4`{AWFQ1sR=ur z7=t1ya)0-FW1pQcJvY$k0*`38H${2*nP+A`?Q^GVQ#AQza&$wjpHaUc>Ydzyh$coH`#N#Vy;+Q2XH z9XzOr9bFF^SC4mA=(x&v(k;dPMv_KfVQMkkgGO&7YDsXPXK(OqFujH5SvJvVWaMd{ zLbHnb!vpXh4;lWKT%N+FC|(VXkaxt_*9dr)^f87SBVc-ixpaTJ;W<$kHO@EkoXTqqrI zeYx8Lhcf8^5rJ0}7Q126?Cp|aG*VM=d+mnr`)g2A! z+4GQ)XH|U^WIrxbX-A5{duzkEL?Nj&ymEH+$QD~m(o@_{ez4@&i zJYa6Ar^VYNV0PXXBNnR-c(n#pP2pdv^bG%)|Al|5&=U0q#a!nx3Vo^aztHE3yFPqo z@Rb70RV+G}g%-X>ga@x59Wkws)^rFReRw1l)Wh^x<#;)hduE4?B_JGkIL_bTzq@v)fIOax=G8!6R z<@V8nqZ=E|w9wy%8&L~sy=N$;PMZt`nDe;ynCABk&4q0FOd3v^(k643Y;LFFUdjy3 z;+Zb@t;+7)x#pI+OXqH$`_H*5&qMC=&uMN&R+<^9Q>G>YiOgprBWckyk(Glds|U%u z-opk6@1MqAWNX-IMv`CZBIV;~{(2Q0`UgC=C%+wDg*z)Ysm9_5F`ys6TIfi4Vl-`9Ayf+>7dPgb;D zuYGqODGsz(Tup{{h>ab(?~I?W@I@ij#UG+%Sm&eI7wO~G4;=6p?KTBGnnwJ~4QT$E<1)Ki#(zp1~{ zx4-glMTvTvTNL;7S=0XUv>!*24hDk!2)+)sW1Rv!LhptapkAQR2dXIr5wvvFzJ1iV zRfMw$?@5m&^9+SAF<Xe_)S-nvE3SU9rV%0Ouzf|w$%p?bX(oDX}3WsDcc5}7E^h6 zE2TY26rDwFeYE{5lqH59=85}xT%*KEBYFnjy{4GGsOPQPYInp~eL5-gzTQ83qwo8* z(?^UL_|(HZlCxz?dIj9|wTCsojw2q<3pj&unfK5`FZ1sC7xT%;Uzm^0y&1-$13l+$ zo&r;GzBx{hCwu%*&+ksir49!uayPZbv2YphXU3|bCj6qp6N39-l~P=KvWDoOSZ}|r zm)^yYbb8Wtr0Brs-!osWMQUa~Ofh}r7M?(*rJIEYi*$xCp6SUB? zv3kKwpIO@VuAv&AOB-0v4UxwZkLr+L80C!IiW<)EX~b(xN`0#e8w_ zlIOhHMfYYKfsHQ8L}--i3T=T8))TZsAZ)4Wz`2Z;$T;=qn6DL}D(m^d^a6cOez0)3 z7ClDOCmBbnE_txBFH9D-f)q?%?E<+!k(8i}3n+KcXRzfmOuACV-yr4}Qrv%z?~o{uBuCbpLyVn^9IsW!VJ`Pog$DQQww zxS!fmyd>zU4m>K0#<4UO-*6g&t|oZv-yGivTH^hD5^K#KX34A#zE(I{wDmo!fxD4) zl{LXFu@viPyk&1<5lghrvS!v5*4(@-WKD)N28|(o+;J^;I9o%NtpL1P+7w|h1PQ@MPt4um{*i809vt2 zKd{#Jm}tx*#$2+o`D|=0t!;MOFE->E;5uVtzt66p1TDa;<_qqruc%v?m(_zTg4S;9 zg!P8C-&$q8WL>o`S!b*Z)=BH4MQFQy8O#TX$LqW=(~vL5o=>PbXm!|W?i@Ny|QAmE(3bE^%b7iLG#f&`mR^3 ziL%A58y5d#>wi)ZVZT-q~*R?Vz<4xPOCw-_}yppDcs4jzbRk@_u)!s8K@ZB3WNpU*Z`Q zT34RHC9+I=wqw?J*6%{vLKe4oND#e0l*5aX^&9SMWe^qn?2+8&-BDO40sDJdzbM(- zZnu}UqD^r6Xc@&7_pCJ?`}_88uznIe0_3OGS3-9x>QWe+Eln}!8@NBi{WfkAYZFPx zs6722^lg856f9bW1Y2~}I#$*IO~QV#e!#Wg)`v3ta?z$T()tB93A&Gb6`mM}@0bj7 z{S7M=w%|$YYpZk~)INkQJ8!*XEwWxm`Kq-CYZp8Bq`hxzSo^FWA-D6G>m{_#!#%T9 z+s}k|m5@-y1PdZ$`v0;aVLY~!j#;}ZVlD0Y?T@pSwx75g7Bu|DIvCar(Q9qCHbVEm z#y(wVZATqE{&Om=x5C)04*+qlT$a|>a_z)!-3{xu693gQ14i8o~47z>RT5`K~2HJZNHp{kH==oFc3>#Epy^eW8VlHU> zDa>;ek`#97!J2|AP+QH4SJ# zXcYmApg)8ef5LiB-34|>1MJ&=n+LEW;O}W%>%g~*u-!MI*|35l2@cu$?OhF;3GKHn zF3M|d2v}U~3lqC77`9>pJKBV2T#Y$ zn|8gl_L|7==0Ujke|wg$r^4>Ec9)I8>QBIOiuGQGeBUdR1Xh6kSf(ds(BWJ}Mgku9 zaluWD5q8aITdDx8i3|&p06QeXrqr~pp0H3=VL^mt#J@AP?Gx5d0vCk!6Sgl3mdRsV zrLf%-r>$rkzAUd%S_{`jpTI6`t;0TTR0cL-SDm;O;JY)asKSQ9ehDgc%w839yYB=l zt>LXFET9*757}c*u!~qhEv)qt^yE*i&Y$A>lScUWMS|lt=RSq*UBR^hygvy^{Kts8 z44L&geDw!m%I)~%h|o{5JFFuD2HJQ5cu(JH&&oz4m#~&LtS$bEl8}r47sDr732h4c z1s6pM=YnV9BkUd z|H40t6qZ6XqEuI{*v+2)(=*-m^9&1Gg@fMQNoiClOEAEVHn%M?Z`Bx-20| ziedrlBVambTdGU&@fFSuf5eYJ$Sz^0hdncph{xHpb;*O>qf$u}|u<`mEx6iW>Hu;yp!$Bn8=E zd53jXUdxi@mziJQhI|U{0k}7#evu_hvr&$)ew9B!?qSK!LgZ+dZ=nCZ(tHi_S6CIf z19Qt8SQGhG>ni??{g?crbw!>4{4cQkFzKd~6(F>)k}aU`>9b~%A1N`HyA_n-nH;BBto$wW tJDM@C+=B(=bkOuBi%^qglX_1NmY%{txHOv$g;L diff --git a/apps/sv/frontend/src/assets/fonts/termina/TerminaTest-Bold.otf b/apps/sv/frontend/src/assets/fonts/termina/TerminaTest-Bold.otf deleted file mode 100644 index 2f61c06e6aea73d881be3a646b09fbd95ef00c15..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11612 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 U$}vJO7AN#zZ5;Wmr+`!Nzr+hnX8-^I diff --git a/apps/sv/frontend/src/assets/fonts/termina/TerminaTest-Demi.otf b/apps/sv/frontend/src/assets/fonts/termina/TerminaTest-Demi.otf deleted file mode 100644 index 92f72c6e50580771bbae01a996aa482cc4c81021..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11600 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 diff --git a/apps/sv/frontend/src/assets/fonts/termina/TerminaTest-ExtraLight.otf b/apps/sv/frontend/src/assets/fonts/termina/TerminaTest-ExtraLight.otf deleted file mode 100644 index 5a7528534365e5947b567f9335358a364786cf02..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11760 zcmbVS34Bb~_rGu6yf^V4gG?qQVoO9ny zpRBAtq&j($h@@lZj12$m-tJz6*h7T4FLdkDHG|Y9tq6%eO9+YVmf5HOX8KtqAs#eq zZ|c^6K>DVen@S03ya^qR`t)zsVq)`WlL!%#(H=E6XY^EIweSt_J&E>^iQ`9)bB~Pt z8g-sqPeg~K%-#g>cC_nH%*iX*^@wXV@SQ|o^_r-(%x#B0}9~{7@*|wtaTa#;$w^0iAYUr7QTwWJQ zGFs(z8*!31E9xRiC#x#zcG8qws;En(K&V$ymq}w`aYa3h)D^Z@)T@zb;g^cK3Ye0L zdi5&xTBNScThU*eMA}+|3%O(}nN6mXN#tQNk>r8yAaV;(*c{s8Cu1<`Cl8X*7|R26 z0b2b5Ig@0Q@tD^X?M|p?qr8J_$@@E!-qEUT4+wWa`{-)hgW*6a$rd6>_8 zd)=m`AK)LhRvL}5=D?6_J?+Q<(vu7#y-B-!aPk#6#wO$r#yj}_Z2dom9%xZJ1JvY# zUjJR|XMzWQi*QNx{>Ow+6nt((_s`@hJG%Qz1*zn?V2GofNWFYnB5YV9HC9!l=W>ke_kSR6^piHZZ|hu^Q<$D z9zxPE-VtTRQ8YJl8}Xk>Aa)xO1i_UxetOQNDWjWoEy$Zby4R$KC+6|)B)ullJ%V1( zrfc@TY^nzPFw)bUxibtijk}4gD>Wo44|h zneBgYbY5O=fxrL6nc3r~H}!YQ&h}eiGyK!X&lo>_*7$KvD@gELB={{Fs!)>wIJ>hiCx5Oahf<^d`WyqTrGYkej$D> z?h}6zOGQI0v)k;^cCWpmJ=xyH-qYU4KG;6do@;-`zQDfN{+2yxUt`~3-(&yDe!%{_ z-LT)1oKjs$lVYW2QcEdSN|(Ax{iLC@v$TKCUH;l_d4`_Y&Gj?_Kl{#;hw!@4rtS=!#WSpUiqkQXjoxG0*Y zJ;TK7Y@jFCPFr40Wr<6Dp8i&ro#nIoY@X^x->Z?JJ>MlWR2)! zcxuo_beLC{9Zomv5PyZXq^+)A0q$BCv*JGUvC)pWtcF>vmdCklhO}|dp}<8CO*z(< zHTLy%{5rwEmDTXDn%N4iNo(BrRNw&zPDulft(%v-d>Y8L1mf6bb}r*(^uFAsVt6u@1~`CYX|im>%nZy-ns|#`P2{c z1G>ME{xcx#Uu7h(7WKJ$S2t_N64GM&`koFxx9Y=aI+eyjZj))P^W*RT*8A=X=}5Qw zn^=s8Eo5;lkVD5MeKSI-Zs6+fhm@PS1iTV&7 z5DzS8&5Eu?$0;3g%%gvW~1H6hoo?sq4zlGuwS?epf{u!KMaiT301MUu81r>7uf<+ea#m z*1Xui{!SmxrItg>)CB_+)o3xfEK@%dbg1)|2L86rvv1p$V?HCyp@#1))|VH9xkt+C z(jx#Wre}=0>`bwd>2T6E!9kkJ;#s#@#_W8RMl4vTk6SBjycs5{`5hIbZn3C_mlo+S z6sZ}?95sk8H-vT2$aGsus0O8d!3_G(Lfsz_zFuu41Gb5}Ue-Gp zZKQY0(sPU`hcgIuRQ2}yZZ~r!^lvuMM}N(RaO{qrlSXDfqOuxYHFcJeiH)b`2aSw; zL0<_fGFNgIH_b29-zrq|!>LrH3N)-(T{%l%9H1%rTi#doxAY7tl;Lm+BsPkqN0Hjq zNDV@2!pB(QX=m;L?C5%&JVREJ56E`%BRNH`k(+`lL<$cIgN1Rz>$d8)dbUQkCbl-V z5w;1oWwy6%AKG@>4%^O&n%F?>C5{&7iOa=QxF1 zl>B1xrbsV6pfNc{aneYDohhP6`f0`%BeS>GN#jT&jZCPV!#PshNyS!LaJWM26pO~W z$dIO|Wh%~AprS>7H>Ho}q;IdBWyEY2zy{+z;LhMm<_S#H7FcgW%!ddXFtW+S9wq|u+#e58w=JL zN%_Ki#%A$7>{yR1%am5jI#?`CltW@!Qpj#3NzNY1%`--3lG1m$5-=u-#xsB&Ewdlk zA@(CZB#n~kIab1urHwNEfgYkivP05GGCN1FNzN>#(8z46Jgf*G8>2*Hu94YBYpFe` zxwg_WeRrJZdaQ}!+S)*CtR(E#|!9o504g0g29%rgDRM8^=8l#2k zj?==ax7hUy?Vy|P{kztEx&7nEA71Bm>C4`dT)%YG9L@}Fu;L=FLq-REt$Q+ykX;w* zE2H?j0&D~fm#C)z*+|7lk7a{OU2rtgyw1@6l@k;iwkQ1Zmm`WW|H=c3>+JHR?n-F? zBZ~28e)-U_VhnAfb&T5XH(q;f+48xs%`V7L9$hl`O`mJSqe;WGyjTA5gx8h##5BpZ zp_k@lZ8+9kYiZFCBG=386MA%zA~{1pK)DMrP_0NDra1L_D|;*Y=pubovFp&yn%ovT zV)`)KNZ+NruHUn050e{ZHXG>!+v{Y9))whDhwISwt-pOvtK}#~bf@FZ`ER`NhL?(4 zPJcxmIZ83QXzT-s7Sp`WOpg17B5Bcmh|`0(T%It~f&x2znL- z1Za(@r|oF0IMbB=nro9$TVETmxC+uV)_B1O`l5WH*szO6eJIUDnFT_NSWsWYBa^KN z!&b@8zS>R9NYdCiNL2Vh-y`bh06SJ@&#*=8X}U-nBh%N}+b|ICNb6<#3|&N@W{ac^ zGJBoABRMlQETD=;n7+1|HXf%*|5VhE>TBC5zr#q4g^`*Fj=V@?X#&loc?>0ck-fxX zDnd(?^d(==&ZaVdMLf#OsWg}RSxuIMhnKlNXQ(waD{;dD_{1f};K-6l7>hB=PwW4^ zE6n-Gf`GmxpSBAKMz>YsVSR)9y~m`>JFb06>wB=Wrw0=gm}4YM?(1X2)0mbpjmcrN zjPyWRwBy|?H0Bgd`zj2XR^LG#(bUb7erBx^W~=G-AM!e%%^#)E4)-ZApzidE%F8fi z0|R=-zd(ylacYfCbVh%itMS_3@`JiJK%W8~`K!g#v`30^KkEabi~Ft)_Boqq@z_L* zpipR}i*#Y+V6BnzLH_rVil$lk%;9U;I{`@6XFt;U^ilYOgwyM4EPuXXo3Y(Hsdk}7#|^J{3`{rXEo zqylNNv|M^uS|#m~zLtKF4ob(R3kVo)AY^dLk#d6ENNy>o%AMryazA;9JW3ufPn92) z=ehlwDl^vr=Ig;)d)VVFi8|>NJiL6AHoP&U`8U4z-;~aFXO3O0orf)BjVrVXC0$Mj z)7aCr=2nD_xV6B!(V2hdslUK%l<3fcQo-(OMp=L{xq zVvRkxSf+NzZ83s&nn*Kd`{=k?G(0;lI+58^5kMz1&!$TqyfbD>i3e%?All9YKUwPx zRn(RU{Y$u+XzgH02`Q{YlTPn%e!x3tx-|H^-br(J#Q%Zc%tJ0v)mV?g2{ zrg~U%=MyyEN4I6O?U;HHCafzBzr5@GCtmeKIpl|vd>BPpX1a!Rlq=~k%b_QOZu&Pp zg+3KZk(_NcTvZYFccsF~3F#mEnrgJp*)0b?@u|4+D!7R&xQUNcTWE$S=x}bx575#= z`dJ`+|EgzJ=@c(liT=4>!|l3o?PY4;aV?sPtl4+07wgHIbz@>2wGX)VjMr6C|0(7l z%%Y-Mb(+{3(#xfZ$7ppL#r&VtU+i^VK+u-rK2KwI&=fqe1Cp4?V#lx)JTV)n2n=+0 zDBxy8S=5guFxOGL=ukS0M)hNAEQ{*GhVfhMb7k>tu@TR&n6IMxEUFV>uMjY-l3jc0 zVk40*E=xp%z7EDX-P6X5EEwkL)^Gh!K0S)A2(T42d@>6!zrSdXru&Egx?}rWg&Vx; zn3pHNk?mbA&n}*~YGX9bazLAIg$7CN@5S`*4g?8h0eI&dWQ7weYo_a#(hqr30yZ z0M2}cTf1|)>!+R>l(3UU;N!qP8Fs%F)#xNTiJ@dK`sSClaI-bI&b>25&yzz>g&vn? z=${5cFFN$6^vAh;9+mvtXw6jGi_;l%0r7t`R{sY!HsQXxL*jg&((RJIJP`Vq+=pF# z_ixhX(zDAhdq7M?4^|h~@d&l>wORB;A#EQ}=|u;vwgulT;KqXv$XM;uaHLPIaO_qL zpj5;FxS{%cK<(3&M~C`Pt3)-RuL!75%$=ilR7BOygB;me8EGwFK6lCNf+wDsGlz#- zD*b)Izw{7yaT{(PbFEQnJVJ3w4CTFNgHsDVnNF z^gU^)9J&=6D(OS5yYDy$eFq;|s)rg&>Lu%bsrD`RJ-Ujp^*IE~W!X9ON?D6yqXoSJ z9bv8XX;bCUFQGhXn*IYDSPZ_la+Hk;xYa4c5lvyqApLicZVRdxnSBjw^}0%fbb>TO z4n4$9OZsXacG6S_9Yo_*MDKfXr3Mc^F2>G{NN|F4WY20*r41qx7nc<{)O1BqJLB#j zuCnmNeo2FIr!Ec99f5EolN*||ht*Kj$|;I#uR2|Rpl|!Zt>=d2I9z*=zNQ9;DC&*; zAl(zB7lJCwnjg>$0^t4Hd^N|q@Tn}5WyF2+`*5H0%s^hB@&FwW&WhsMM zEQ_HjgYosM!5590$HzXy^yR^)#%QYbg}8dfH(>5B1$;Z_Uz>SW@I^U;*t%r&$|BC} z(RouyG%njn_{Pk~@6-iin>>E{6yhv@V~qcXgkB=o3R!iTgbTgH_Bfq2SJqmDk;c~S z+N2+T|CmdjC+qOr*FkcOToURDk)%|x31PUv*Atoowl>E@YLQ4%7hijmKvfHT+fTvQ z?{*}Wv?m?#TaQE{%}b=Nd7dPj25A8bQ_+@)*E~v+klUD-NeXf&^ANB_n%79QS;}{4 z-msusVXO^iwKcyY_nWs!JG4`=c6-#*&BItf**r^Hq1D#BfYDplXu5e7U(+M;MZPX_ zx_JUKBF*Ex4|wZhM!I>@>NBmrlcY7MN;S`+FU7oR%@r_L0M^efxLe>$`A#^!HvoIa znt2%5u7ZY>#3rxgyp#VWUm|XTUjWVD%!}spcpoy~HK|#Gd=mM*c?0!>=6drd^K0`m zMvvo-1j+o@1pX0|aw+pSPv)=XrB$!!tJ-5;1-JfdGCu~EtLFE219581(-=9y`}w+7 z`I~vb{MkHf9)*PdAYo@WE4#77>&ORyy9Cc6b01%)eAKGnsKi>)ccyaYof6!-QrR*M zaP27GN6b>>W9GrzBWIyG#QenE2`;~i8h$$gU-yF2EhNmm1&yeZ%mWy`0NLG@%$s
wbBkGMj)Nv%!@gew4QG%ynopY3%zfrp;PEMQ0koIg zgAdZLOn0OJsNKld%>9*P<)x)B=P+XNwNkQJ=Ljgjf)#Jv4S%P_SH)gRD)3a{vsqTr zSFVFN9p*>oKcQm}aEZcl{72#^$UKI86+7j16Ov< zH&>!37kQnz+FWYBRu$X-y$(wRu9>I)Y$n(A$}#Kop9US=3RJNy(7eOwxdoYC1m)a% zY~gdTo03Wn-Nv!M{5)CX8!>02xyIapGyF5Of>Uyf2++U7(2|qpCi63JVHtYoA)f{0 z_tv?_`7M9YYf)aVU6^4ae`20689!HC?$$c6F*q|k|G!S< zrxWy7*u#5gfQ~!%>L=j+308=gzhO=l9`bqE-9C7L6{syL#{*thoPtWc;LN4lb=W)j zjNP!PCQj5PZmp^&?BP$(SOuI7{z@PYv=sbS?ZC(SXw-Nt5JkeRQiT7KENB_yVOFgg zV5$)nGiu=5z6-M=;PGn%UVwLx0t}Bhcq%XJl{YHdypOMI#~cZN!;y(b>Yz^reibY5 z|BS?1zl#$@5PtOeG2(~kvdmf^)FqXYbWctb9+h&g4eS$LY1aR|zBtj{u*28hEaP|5dEw zoyoAIr8u)Up@|0c?mFNPa80OO5$$Ujg~s2VV1rMat2ln-8<6QWbC+cUZdyGIJ-2O4 z)tRsaC3kylL^f8sW9_QKSJusSSm$?cqwn>9l@NRczVia&k*j}f!|p)-b~v36#U;sb0^wd4%eV9mvC-5mn=%nGRTx$6)QHl3-5dAE#Y?N&nyB) zZkoUGIaN9S|CZmoz;l>eiAqaRVGB#JKOSGfT3FmV1HMDwD|N*3Er>-i3NBjIfD>pP z24B~sv?3o^)8E0F6VTz66+3?wILbA-B8sf^bQTip1!;U!>8UN8+-vhwUClhgSFnI8 zURLa|t-Jx7zXP;d{>FT>qHig<|9#aNmG!^SYwkObRNY?%zT@VP_`jW%AmLNoX93dS z{NTwt4`(e8_vb$GG;o}^JbR^m<@U@2J4RrQVo{IB&CCJoR}a>ZTT}i&o?5U-4!#Dg z9=E03n)3S+x2D{dhQqqKVBKn>m)p@AfUIl5SC-temM7lNb2K2UW4;Y|M9g)gPsTbj z)^L@B-hRud!6w3PIzTJ8wBcC0*6s1Cm711KuLHcL)|^{{0{jW!&!^Ca|M2Qnr~dEj z@a=1Gs*an*(6dwU_2N zhEIj2LXY>DJ9r=JXQ3Imui$yldS628jwKeb(=^f%|GyGY@_$&C-?atwa30<*lXBn4 z(N@ZY%RLJ7?BKBtT#m(<21#k)sfPnvDIT6H4t;SLiL<B>RcaUAR9M47x#;P zNHP+7RUc11U|eKLWF^@QIpS2|T;Fq_gQYx*Z2fPvd@=C&B&^_3aJAyTg?<5Zms=bP znBSp(`R-fMA7Z{2504%0zTFFGD;A%)o?{JAE8@+$$n~9nfjNL@Y0VJn&NTbe~rzt!hLwERm|q!Py~EM;Vbh0r}F=vMuICT&?x>Tfq#oI@m1hF zYJLl<0cP<3_wl&ZN}S86@H5{A|1}iw=Jas;!1u^Csw3)rcU-G@+?9au0#(1;)U`0* zjuguA3I-V=P9@Re>tvpoPkM^)qkIs#G4gt}zasO5crwqnl4#-tlqF=IeIUlrFMfyd z*%jpyl*36o(MddFG078$kZAjxq#@dxm_+J{;I!>5NfA9{n(aH%6=hf34boNEMIw1! ztU;y;G8rex<{sO7s8=I1?R&{I-Y-_S;HPmoVJGH)Kw1l5U|tO}$+m|0#V<%BTLFo) zeMJ1W=Sfqskn|MZC-Gt;*6U1Ki@iyGu> zj~7G)L=?qW(V&0?K@V8LuI6IpWSu3aMwqG#qZX5YzJSbn#(E?rq2)`l@p0z*T$%#40ppZK^h>Y0qy zQM&cZN-e!vdY!Rm!_eO(qhHIo2XmjA#+c9w^%0{cU=U9rYpO@^VMJKf9+k z%3tGcI}Qy&IcA?=N4@^IN%=(wb8GYmy(iHYJSn$mD(j4)n9vv>d2;TgyrhaTC=1Uq zW-FaKWk$YH%HlwOHTol&V1lCO&1IhquhsDe6U7T?Vc({%3N`c7dt$#bmK)LbKgC#7 zMP@Twk$@v^H^7%9p#PfvPm5BZFYxWm82G>!G^4~wCb1yfLfatJdj@hLhs6nfOyC;k zCy-2jZl|oC1N*RK7RhFbHjK4R+|I5mS%#x(Wn>yAFE)lTs~H^J!^?)OeMaV-@$HSaX#rUG2_K~^a&7qw{AC1bnsiG`=27D%1YpNyipE0By$ z=3f7M5}4h_1VM22&znAJ{N&u`>3O*Y#b!%Wy%y6wf?m(2Yxc%`x&~A6r*D^pT=v!4 zhOAb22)>S5b(km!9lJl!dCJt{>Ep+a%a0t^c+{}_BI8=cwuu~B9N9ZJKYvP5WWRAU zC+1CW5t%Y^Vx$E&BXWA)jJ)Xud81oYjvi@^o;5LldT#2JiKAH`@P@S>$=(q}p@Gmv z7%GexW(rRTYi;-1+S-zALv3Shd&C&At(Y!mh||Ou#ka)|#ZSf0#NFav@vwMOyli*d zqwP)Xz3c<*L+vB%lkEBSx%S8G%k69J>+Kuuo9$)xUG|gq3-;ga*CkoHSBjJxNUfv< zDN#z3(xu+gKq*g}B+ZbDrH7^Y(n4vev|M^adRO{b+Tx}S)Q7@p9?j#(`3C+D@6%tS zK0KV>@lro~mO_rx`^iJ~en{sI?np@I^}NoG8fEYXB=bT%4YJb>#E&ztks)Ncq)DDqO++z(2|hmRXFs}a|@`r+;l z5xgdkl-iO+aYLzxhnA7&7ivoFdHYiS@CvV*;@CeRacyf4@63Z@cvs$)f?}w1`N=oG z-tHacNEtAIhqk%@jWxp~9^j3nyu%bad*R5t`?f@=n|VX&?StRE z_=SgTyT)|$j&ppJo3gHz2jXa$%_CL!h;e=AW_yP9eQ9&)u9rU9yld`=cfHR0wfYK$ z@Tkvt`iow5)(gc;=0wmVaEVmo`)npU#8dnt9dXl zmT0c52m2OC&K>#Go|38Ad1@cxQ)t03O<%8%btg0}9@fQ6!7D1>CA;VJ4^xJI<)vEW zk`A`x?oyuU;j4Kk9>r(#ho}>erq#5RB1ojh)Rhn2&ZE8k`Ehq#>YEp*dEfc`+kbuS zIlDW*PoIpbt-MY;;vXyVIrJpWanKPR<&`o|eH3p4&8xcowH^GHUR&Zz zZ)H-69xv-n{P7Y!=*yJVLW~(!pf{mTs@rviFU1r^-WaPkbO1&FaB2A`2fe&zVeEKr z_awx>`Dt%2uf<(bm+#4)Lx~E=x$r6#8+rVn-S0BIVf9;KLH+HR@8+ftRFF5T;Mv6m z5fAccsd(#-M@v0)-=&|ZiC5p?aIT@+(#pY!OZt0wRCIUleZ-3`anTTkILqHS@eu`iD9h2J!-FZ=SS=pMqojmGzYn3N9(tDQ;mP*uVf;zI=(ulm z56;qtttrcia2D~YbpH`*M-Njw^-G#dg_s&`qYV=OROUPR7Kyf)EI>P&Imk^;8qU{B zDzA}Gsq_MMR#z|TqpALJLlkwILR-UpMZDxzkweYX=rMXo)t8vazV4LaP*)Dtz}M4$ zk)E!kxJ(!MGJ4XN>2MYf*L0Dd6xAV$pi)l%(daEYO=GAFhciwLeeI zus_;|yh{uC0^dp31--M%j{(F&O)Wt zvM%YLOB8i$9`B`(bU>SG$M2&cwLmW`#0Mi47KWs1>Ux?1LCjEH%ymWOF~260rsir9 zs&EKonhsY4eVEBG&me`{DfRr(^?N>3>6m`R-A+;I2rZVJ)b<>usUfSWNWJww?@jAe z(r6;20-zQt$R1@2*^7wIzCc`fmi^4Qz=U|Av(Q&qW)o~KTQgg% zt%GfZZHjH3?IYWlw%^3MVm-09I7EC{d|uoj?hwz2hCRqW-M-Mi#I8$&rODD9=~Z}+ zLsGdME;o~t@1}Mv@KRw+`^L6rN_SCv+eKk4|)?Rat(5N9jldSFStzrGen+ak38$G_W z=1f^MKylK0W^;-DD$N&tTYQ;rK9}#}57RD*udvKzOPQYM`=n(uEv9{vza`B#wH^cZ zQheQfnJqLYHR-3A8(h>E=0|FKz{x<0rw-J4xJEzHB2nKBvi=flD-NVZGG$Zv50pfS zJp2cq?JeX#yLlnt3*|kf1-*Oc%u(YpWOfPgG*L? z8R06r!KFXW$Dfm2r9bTb!vEM9sO%%lq=S)K}sk$+U}K=KHuV(Ha?UWf(luFo`zFd_Vam=d#`!l;cTjv}W1^O2|fE znd^Y>s4ugl;@UVxX{DrVuGzYxA8W3;wzO0t7C2n98*8R}``c)LLI1GtRlN+JLv~$`(K1a2g;Y%(r+w|9p-{)34!D%L zO_d0ze|`^bA3gY>M&0z^-0=!2*$J9|e!k*+tq|=nI3=#4%08}SyIrMiv^G678eS-T z*-g>chV@kRMtrV0X$o?jKO;H)kF6~56?M~`dWdDKoA4%-1o4cf67zL!x!DyKkITuK zNn^b~Oz6Cw%bwUS&f6`g z9Tc5-jo%;P%w0JI`V5cbI^I;VY-xn6^wdD5iy{owM7>ddlvc#M6;L{y#bQb>s9LR4 z`qDx-rI3Qyvyazx*;*}$r^I%e*lSRP>(pUPYyl>=*3oO*v5DtBuFGBYB=`9(LlQd< z85)~4VEMLDUd(#i2iupIdEh>)4S_W{MaK%=mM8G?wN&C;z)Kvi%c+h%1C!UsdJt79 zT;dq^6asJ*DK)}%`2grwsz6Ys3d9Zh)Y1&Ev!6CebG?LV(lZX%mz}VSE(}!qD*7Ak?J&B%{5t25gn!Kq*ugH8MeIPj-K|;O-g&6N?QC|*P+8`xl zgD)DpEgVPmDR9>m zbYvfeP@N;)!Anp|cV5TqgRerTL2;udk_i z@3*&tsL4kpd<(-!t$6RfJUPNu&O7o3J>nC+&XSo!6?!68>$G84hS#|bCb7;Wg*K-v z&*Tq7M{A|2)&(5CM7@O9eDg#K3md34Q+DJ(p!vqO(mE*qr8!E-`?TCOf|6#tPn2!_ z+Ur_5S&49s=utNKy9g(rPZOw{uv?!e>YvdBH+A#R6;enyX4;HVuQ`-A(K7DHnCGeJt0fT z7M>Gc5ndM#2$yYhY@2NRY$t3NY}agDbc#9RD4ba5i7Ui6#dpMWBDdS^s@-F6U~gf+ z-=1JkwfD3?WG}J5X@AGQ$-c*a#D2nl#(qnZq-d$7)LKfCx=8&iPp8wQC#4nAD(Nk0 zgY*GTrrV_b(znua>7wM5YsfA{8Xzz$0-y%iw)+a**f=s&jqKw1l7SO4^r&u9fd=_^uo2eqytGjNElYVM(;KQ54{4$>&-^ggP6df$ZfkGzy~ zUAoqXH$26Ad$2=$VH5SjCR$DdsL{zAd%QgRhLo0_J}KU#CMmuplxBv)_5A($eR_Y1 zPm%e3DAzN~unI4jT+frKzMe%f{w%Bf0%qidW*+$0i_bpyoT}H=?TrxPH|9s9>8QkW z&UWO3)gk$IXrEhHY?A|c0zn33`*)MlcOx*80 zR^6J9DDr-U%=IW1`{H?CKnv)7#Qg>IJS^Q=UwfUoU6-%DylX!~N{y#~#Ygi|JiRy9 zI_^rpHYdV$wSIA%0r!RT2ukiik3%<-Pf|pL>+COWw%1<{+v~SexO?;d*N-0CKQlWg zJ-<_O`l?c(QM8}A+je^6^Usg1DnD~9zuyC$^4q|`45nh~`nv~@kRu!?wZAK-h6h)C&hzS zduhOT5;RcZ^`*pXbkA_=WFCb}|3JuH7reDT!ke^gJ7Z)|?@9`h^la*MD^$+#tCZYZ zTDSMelHH!4cNYvCm@%srPQE;ZvycCsg^LWOg`%b*{-7D6Z#>oSq^RGOZTkA_tWAlD zS-CxWl;wWsRR>O3_pukTUJj11IfRIVyUl|w&vvMmhqLoO>TfF(aV%WSSpj(p-YUTA zz3$qG=yZZRIcrc)uj@c#C1Tc~(Rl;Lf1G|V)!Dy;f=-3IHXa{%5Wd}g>owj*PnP`; z_?;4O;47mp{*ew9XH#55QKs5ixwR0dVmHq^A!SV+jF_p7GFVY(z5UqRAB0mL*vKSY zR8gTCf{Cbz%G1nK+v9WzK1LmqPo3#`99`Z1W;lH`lX3r$ilgl`n$A-xl&|&{`j@)l z4^L5j88LR>sHlX#JRH&VToGf2>P`7%*}vT1N8)w$MZ69?ZygGC_)k(tH@tF{Yu zk%he#H3VmPFg;g=XXGXHJr0yb5`R(V5Avy!I$Z%zC3O8_IBZ*VNI7A?{g()xq5p$5nw!U9KLh*z8qT zP6ux(bT5wFGNpv9@U7)bXo>3zCF0zQ(_Q;7;ZIllHuI?aiImk;(IF7`-aVPORq@>OnKjqQM9yP=akJXX5tD=s2(?UUi zxtnrRQuk(U>zD|gQ}qXQC+tlSq87FAK}{|2WfrOeu2ob%o#MDwpwieLntGu8wT;_V zKG$Dnp8Sui<~bWT+ks?yOaXWGW}EpcxY_w$waTYh>*q=!vs1Ls<@P?F-mDIMp9!Cs;ZAmFa>_ zNDyiZ5kh^T2}(&qFW~`Tgo2LD!q~km62A>K1z&OaH6b4N(d}^W-+^^xi7bhAVyU1U zW}IU88YfvR<0^|Yt^qsMxQL5|R>q&G>#U7Y!P*+vS-kNpOF(}+;|tc_xWqc3y(0@@ zi6|!lH`OS|nD;UlFwa<6@sLOWswVF8!z_M60QWP-sLveuh8gF~9*lIaaTYxl;5!Us z#^L8QvveNq6&A#0P_|?ITUPBPIJ(I?T9m?!Uo1*jtugMgIA~|=w%RUP&;csuZ<*$} zbuG%};1Z+B1*UA}r{tZ?%^G2)xN*=pYb-Gi8=o0Z8P|;8jPu4X#%beMLpP2XSB)Qy zukl;qbv%2FQ$~exn$-YC1!(`rWcUKjpmL@P09;o~nD^h31?~82vpI_4GqH^yj2(aN zMe8-=hH>ofcH;`#4;r82`@8Y;9Ue?5tXZ{$H881PuHv{_*FPv4Qy?jf6-eO!9H><~=AhkdKDo;yp$Bn(9eGRLR)v8KH!R^vn==vX3wd(mDNdVuRE0Xb%u@kGQ8yf@l zz}L6{`P?+u1-t36Sw`um;jhv+=*Z2g)vLlY2r$>GAgWr;+|nICERsp>l+|*ZKa*2v z$Zvu6J6INUx$#4w#jyS(P+6XBT!MwGOyKSd@U_=iZ*0Pzzh!)nRleP80>LhUFT6|e zVwT3snC)fQ0xR8Z4NOk|Suzd>;Hu2?5ppvI^sW&28{X0{ovDF$5#8g*ZV$iw(Xh#L7i@ zCCS2<(H~@$Y5=ANQ-M(v7yd3_h2pNi4&dRj8Gg+Mejo*MGorXtH`@YKUGUNopc-k> ztqGbnL0PQ=MqVFJO}sVmIx$Xd=D|48;4OyLgBK5H4VjlUfTz6&Jh)jDo?z3j;y*oh zggH6(rD*p+e%oLbS3)NOPX)AV3$*!fI#F$G6rrKVj8~DH7QzQjtH9d9dqUy_EAdU$ z4*m<)QLNUxW}B%;z^TCAHL)z6!FpdX_}v&5EUc=r6j12HSZA?&%1rw3mgeX`R_*D# zF`=I~OpAFZnY-q{CB!wRMw$Bye3_|g_XcY46Xlqr$@2}omn&QUpEB&^W5y~_F=xTy zp?-o4&;3`)Z^BMr1`Lx^Q}XArTgp-X6?^X{bp3c0Gl5-v$F>2&c zmmsmvK-2W;FPc;^*K_#ihb05h{t+A=wdQU`C0IS!_CTs`F|7H(ssXQ3i|!t?66G%$ zbPn-a^~Qg)TP-^pu!oha8yGX-BTXv}OIHCI9mh;AVvYwbxj_bKGgr~#vx-yWfF+Hy zs9%Jhoq&kO)WH6%=DB$nG(H|EZXS%OA2P;mc_hFTZ~Vupg{F! z=+usYl#J)i_PtGE{E>w(ej{P4aJXlCK__+skFIYHN*`J_aA9MW`(yK66{Qob(hOLJ;dfSW% z5Q&%){S~(NXOw)ff)}7oKD6uqZ4~1}`1cjY%aDPUpxIx7%iU(hiaRc1g}*}iGPKjA z=?lR9s!0599$qXEvF2^L0QL-9uWIy}9rYhA zNd&B)N$>D&dZx76;9)qgCt2Ft2J2zQ01n`ol9Vj|O}U!8!h94wcFZ>vefL;%tP2SQ zRzZf;Qvhj$#+e%11pmh~F-$vf8gn^^81E8n(s@{)z+SNd$_Clop>4BhixzD=DA&a} zk$7r=RtssE<;;QmTsSp9PQ#S=wDiye}McE7Am%9wZyHgqxhKdhXg$o z^FezQ-XhijxOK%emS{W6ykZx;4(7GBU?FJpip^P~Fov}h#u&>*0p+nQ$$o?-n(ZQ@ z9TU%lvxNfx2Nq&W0v`UUDI(^zH(?IjFUBp~HN1yew784aw?(ph#O^Fg?8#i>Lgo~Q fVC-kWZyoTsfHg!pMi|T*3R$e7Z4B;FaMJl7n|pH> diff --git a/apps/sv/frontend/src/assets/fonts/termina/TerminaTest-Light.otf b/apps/sv/frontend/src/assets/fonts/termina/TerminaTest-Light.otf deleted file mode 100644 index 85528c7dcd30ca1cba09f27cc639bebf42665c7e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11688 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 diff --git a/apps/sv/frontend/src/assets/fonts/termina/TerminaTest-Medium.otf b/apps/sv/frontend/src/assets/fonts/termina/TerminaTest-Medium.otf deleted file mode 100644 index 151423013ebd3659e6193a8cc51c982e6b9bd81a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11776 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 diff --git a/apps/sv/frontend/src/assets/fonts/termina/TerminaTest-Regular.otf b/apps/sv/frontend/src/assets/fonts/termina/TerminaTest-Regular.otf deleted file mode 100644 index 9414706313c00aec23a14a57a489cfd025f11be4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11456 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 K86^}E^8Wyni@2cx diff --git a/apps/sv/frontend/src/theme/fonts.css b/apps/sv/frontend/src/theme/fonts.css deleted file mode 100644 index 8c8ecb631a..0000000000 --- a/apps/sv/frontend/src/theme/fonts.css +++ /dev/null @@ -1,32 +0,0 @@ -/* Copyright (c) 2024 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved. */ -/* SPDX-License-Identifier: Apache-2.0 */ - -/** - * SV-local Termina font-faces. - * - * @canton-network/splice-common-typeface-termina only bundles Termina Bold at - * `font-weight: 700` (with an invalid `font-style: bold`, silently ignored by - * browsers). The SV brand wordmark needs `font-weight: 500` (Figma Dev Mode), - * and until now no true Medium-weight Termina artwork existed anywhere in this - * design system, so 500 rendered as bold via a weight-range hack. - * - * These are the real Termina Medium/Bold weights (licensed test files from - * Fort Foundry, see assets/fonts/termina/ — the full 9-weight family is kept - * there for future use, but only the two weights this app actually renders - * are registered below), scoped to apps/sv (no apps/common changes). This is - * the first time an actual Medium glyph set has been wired up — 500 now - * renders visibly lighter than 700. - */ -@font-face { - font-family: 'Termina'; - src: url('../assets/fonts/termina/TerminaTest-Medium.otf') format('opentype'); - font-weight: 500; - font-style: normal; -} - -@font-face { - font-family: 'Termina'; - src: url('../assets/fonts/termina/TerminaTest-Bold.otf') format('opentype'); - font-weight: 700; - font-style: normal; -} diff --git a/apps/sv/frontend/src/theme/tokens.ts b/apps/sv/frontend/src/theme/tokens.ts index 445fd20709..acffa47a40 100644 --- a/apps/sv/frontend/src/theme/tokens.ts +++ b/apps/sv/frontend/src/theme/tokens.ts @@ -1,10 +1,6 @@ // Copyright (c) 2024 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved. // SPDX-License-Identifier: Apache-2.0 -// SV-local Termina @font-face (Medium 500 + Bold 700) — see fonts.css for why this -// exists alongside @canton-network/splice-common-typeface-termina. -import './fonts.css'; - /** Figma tokens from CF-design-system (tokens.md + delegate-election-2 Dev Mode). */ export const layoutTokens = { /** Figma surface-page — bg-neutral-800 */ @@ -21,7 +17,8 @@ export const layoutTokens = { /** Figma Purple (Navigation) — active nav pill border */ navActiveOutline: '#875CFF', navAttention: '#F3FF97', - fontBrand: '"Termina", sans-serif', + /** Brand wordmark — Inter until a production-licensed Termina is available */ + fontBrand: '"Inter", sans-serif', fontUi: '"Inter", sans-serif', } as const; From 36fea0c7fcd1b125277a6c870baa0d05d892a22b Mon Sep 17 00:00:00 2001 From: Puneet Bharti Date: Fri, 24 Jul 2026 12:11:54 +0000 Subject: [PATCH 03/15] fix find(id("app-title")).value.text should matchText("Supervalidator Operations") Signed-off-by: Puneet Bharti --- .../splice/integration/tests/SvFrontendIntegrationTest.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/app/src/test/scala/org/lfdecentralizedtrust/splice/integration/tests/SvFrontendIntegrationTest.scala b/apps/app/src/test/scala/org/lfdecentralizedtrust/splice/integration/tests/SvFrontendIntegrationTest.scala index 5591a73d02..f214b1954c 100644 --- a/apps/app/src/test/scala/org/lfdecentralizedtrust/splice/integration/tests/SvFrontendIntegrationTest.scala +++ b/apps/app/src/test/scala/org/lfdecentralizedtrust/splice/integration/tests/SvFrontendIntegrationTest.scala @@ -63,7 +63,7 @@ class SvFrontendIntegrationTest }, )( "logged in in the sv ui", - _ => find(id("app-title")).value.text should matchText("SUPER VALIDATOR OPERATIONS"), + _ => find(id("app-title")).value.text should matchText("Supervalidator Operations"), ) } } From 58ac7ab81a3aaba69716a55d6d3d7f78f2df3b9a Mon Sep 17 00:00:00 2001 From: Puneet Bharti Date: Wed, 29 Jul 2026 15:03:13 +0000 Subject: [PATCH 04/15] Omit Delegate Election nav and network banner from SV layout (#2594) Signed-off-by: Puneet Bharti --- apps/sv/frontend/src/__tests__/sv.test.tsx | 8 --- apps/sv/frontend/src/components/Layout.tsx | 24 +-------- .../src/components/layout/NetworkBanner.tsx | 49 ------------------- .../components/layout/SvNavigationShell.tsx | 22 +++------ apps/sv/frontend/src/theme/tokens.ts | 15 +++--- 5 files changed, 13 insertions(+), 105 deletions(-) delete mode 100644 apps/sv/frontend/src/components/layout/NetworkBanner.tsx diff --git a/apps/sv/frontend/src/__tests__/sv.test.tsx b/apps/sv/frontend/src/__tests__/sv.test.tsx index fd46e233a0..fa6a398bc1 100644 --- a/apps/sv/frontend/src/__tests__/sv.test.tsx +++ b/apps/sv/frontend/src/__tests__/sv.test.tsx @@ -41,14 +41,6 @@ describe('SV user can', () => { expect(await screen.findAllByDisplayValue(svPartyId)).toBeDefined(); }); - test('can see the network name banner', async () => { - userEvent.setup(); - render(); - - const dsoPartyId = dsoInfo.dso_party_id.replace(/^DSO::/, ''); - await screen.findByText(`ScratchNet · ID: ${dsoPartyId}`); - }); - test('browse to the validator onboarding tab', async () => { const user = userEvent.setup(); render(); diff --git a/apps/sv/frontend/src/components/Layout.tsx b/apps/sv/frontend/src/components/Layout.tsx index 9ab0475983..caee956cc7 100644 --- a/apps/sv/frontend/src/components/Layout.tsx +++ b/apps/sv/frontend/src/components/Layout.tsx @@ -11,7 +11,6 @@ import PartyIdScrollTracks from './PartyIdScrollTracks'; import SvNavigationShell from './layout/SvNavigationShell'; import { SvNavLinkItem } from './layout/SvNavLink'; import { useFeatureSupport } from '../contexts/SvContext'; -import { useNetworkInstanceName } from '../hooks/index'; import { CONTENT_MAX_WIDTH, layoutTokens, PAGE_PX } from '../theme/tokens'; import { useSvConfig } from '../utils'; @@ -29,9 +28,6 @@ const pathnameToPageName = (pathname: string, amuletName: string): string => { if (pathname.startsWith('/amulet-price')) { return `${amuletName} Price`; } - if (pathname.startsWith('/delegate-election')) { - return 'Delegate Election'; - } return 'Global Synchronizer Information'; }; @@ -47,14 +43,12 @@ const Layout: React.FC = ({ children }) => { const config = useSvConfig(); const { logout } = useUserState(); const location = useLocation(); - const networkInstanceName = useNetworkInstanceName(); const featureSupport = useFeatureSupport(); const votesHooks = useVotesHooks(); const dsoInfosQuery = votesHooks.useDsoInfos(); const listVoteRequestsQuery = votesHooks.useListDsoRulesVoteRequests(); const svPartyId = dsoInfosQuery.data?.svPartyId; - const dsoPartyId = dsoInfosQuery.data?.dsoPartyId; const actionsPending = listVoteRequestsQuery.data?.filter( vr => vr.payload.votes.entriesArray().find(e => e[1].sv === svPartyId) === undefined ); @@ -73,31 +67,15 @@ const Layout: React.FC = ({ children }) => { }, { name: `${config.spliceInstanceNames.amuletName} Price`, path: '/amulet-price' }, { name: 'Validators', path: '/validator-onboarding' }, - /** - * Figma shows this alert icon on every page mockup (verified across all Delegate - * Election, Governance, and Validators frames) — it isn't conditional on any known - * backend signal today, so default it on. Wire to a real "pending ranking" signal - * once the Delegate Election API exposes one. - */ - { name: 'Delegate Election', path: '/delegate-election', hasAlert: true }, ]; const pageName = pathnameToPageName(location.pathname, config.spliceInstanceNames.amuletName); - const networkName = networkInstanceName ?? config.spliceInstanceNames.networkName; return ( - {dsoPartyId !== undefined ? ( - - ) : null} + diff --git a/apps/sv/frontend/src/components/layout/NetworkBanner.tsx b/apps/sv/frontend/src/components/layout/NetworkBanner.tsx deleted file mode 100644 index 2d0e660f4d..0000000000 --- a/apps/sv/frontend/src/components/layout/NetworkBanner.tsx +++ /dev/null @@ -1,49 +0,0 @@ -// Copyright (c) 2024 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved. -// SPDX-License-Identifier: Apache-2.0 -import * as React from 'react'; - -import { Stack, Typography } from '@mui/material'; - -import { BANNER_MIN_HEIGHT, layoutTokens } from '../../theme/tokens'; - -interface NetworkBannerProps { - networkName: string; - dsoPartyId: string; -} - -const stripDsoPrefix = (partyId: string): string => partyId.replace(/^DSO::/, ''); - -const NetworkBanner: React.FC = ({ networkName, dsoPartyId }) => ( - - - {networkName} · ID: {stripDsoPrefix(dsoPartyId)} - - -); - -export default NetworkBanner; diff --git a/apps/sv/frontend/src/components/layout/SvNavigationShell.tsx b/apps/sv/frontend/src/components/layout/SvNavigationShell.tsx index 21dc0b8128..0d17b031ef 100644 --- a/apps/sv/frontend/src/components/layout/SvNavigationShell.tsx +++ b/apps/sv/frontend/src/components/layout/SvNavigationShell.tsx @@ -4,44 +4,34 @@ import * as React from 'react'; import { Box } from '@mui/material'; -import { BANNER_HEADER_GAP, HEADER_PB, layoutTokens, PAGE_PX } from '../../theme/tokens'; -import NetworkBanner from './NetworkBanner'; +import { HEADER_PB, HEADER_PT, layoutTokens, PAGE_PX } from '../../theme/tokens'; import SvTopNav from './SvTopNav'; import { SvNavLinkItem } from './SvNavLink'; interface SvNavigationShellProps { - networkName: string; - dsoPartyId: string; navLinks: SvNavLinkItem[]; onLogout: () => void; pageName: string; } /** - * Figma "Navigation" component — banner + nav row. - * Dev Mode: vertical flow, gap 30px, padding-bottom 64px, background #272727. + * Figma "Navigation" component — nav row (network banner to be restored later). + * Dev Mode: padding-bottom 64px, background #272727. + * `HEADER_PT` is temporary breathing room until the banner returns. */ -const SvNavigationShell: React.FC = ({ - networkName, - dsoPartyId, - navLinks, - onLogout, - pageName, -}) => ( +const SvNavigationShell: React.FC = ({ navLinks, onLogout, pageName }) => ( - diff --git a/apps/sv/frontend/src/theme/tokens.ts b/apps/sv/frontend/src/theme/tokens.ts index acffa47a40..7f3dcee073 100644 --- a/apps/sv/frontend/src/theme/tokens.ts +++ b/apps/sv/frontend/src/theme/tokens.ts @@ -9,9 +9,6 @@ export const layoutTokens = { navBackground: '#272727', /** Figma Dev Mode --Light-text — brand wordmark and nav labels */ lightText: '#E2E2E2', - /** Figma banner-testnet — bg-cyan-100 (styled export uses #C8F1FE) */ - bannerTestnet: '#cffafe', - bannerText: '#18181b', /** Figma red00 — Governance count badge */ notificationBadge: '#FD8575', /** Figma Purple (Navigation) — active nav pill border */ @@ -31,12 +28,15 @@ export const NAV_PILL_PX = '10px'; /** Figma content max width (nav row is full width; content uses this) */ export const CONTENT_MAX_WIDTH = 1583; +/** + * Temporary top padding while NetworkBanner is omitted (matches old 50px banner height). + * Remove when the banner is restored (e.g. with #6087). + */ +export const HEADER_PT = '50px'; + /** Figma Dev Mode — 64px space below nav row, present on every page */ export const HEADER_PB = 8; -/** Figma Dev Mode — 30px gap between banner and nav row (Navigation component) */ -export const BANNER_HEADER_GAP = 3.75; - /** Figma Dev Mode — fixed 145px gap between brand wordmark and nav cluster. */ export const NAV_BRAND_GAP = '145px'; @@ -46,9 +46,6 @@ export const NAV_GAP = '60px'; /** Figma Dev Mode — nav row height 44px */ export const NAV_ROW_MIN_HEIGHT = 44; -/** Figma Dev Mode — banner height 50px */ -export const BANNER_MIN_HEIGHT = 50; - /** * Figma Dev Mode — Inter nav/logout typography (letter spacing: 0px, 140% line-height). * Without an explicit `letterSpacing` reset, these Box/Typography elements inherit From 88c7ca6ba71e9af8c7c33712d28247e8302b28d2 Mon Sep 17 00:00:00 2001 From: Matt Dziuban Date: Tue, 28 Jul 2026 10:32:17 -0400 Subject: [PATCH 05/15] Support different sets of `additionalJvmOptions` for the sequencer and mediator (#6522) Signed-off-by: Matt Dziuban --- cluster/expected/sv-canton/expected.json | 36 ++++++++++++------- .../templates/mediator.yaml | 2 +- .../templates/sequencer.yaml | 2 +- .../tests/mediator_test.yaml | 15 ++++++++ .../tests/sequencer_test.yaml | 15 ++++++++ .../splice-global-domain/values-template.yaml | 2 ++ .../src/decentralizedSynchronizerNode.ts | 10 +++--- docs/src/release_notes_upcoming.rst | 4 +++ 8 files changed, 68 insertions(+), 18 deletions(-) diff --git a/cluster/expected/sv-canton/expected.json b/cluster/expected/sv-canton/expected.json index 90e0975394..e3f9c99b94 100644 --- a/cluster/expected/sv-canton/expected.json +++ b/cluster/expected/sv-canton/expected.json @@ -1910,7 +1910,6 @@ "namespace": "sv-1", "timeout": 600, "values": { - "additionalJvmOptions": "-Dcom.sun.management.jmxremote=true -Dcom.sun.management.jmxremote.port=9010 -Dcom.sun.management.jmxremote.rmi.port=9010 -Dcom.sun.management.jmxremote.local.only=false -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=127.0.0.1 -DcustomSequencerJvmFlag", "affinity": { "nodeAffinity": { "requiredDuringSchedulingIgnoredDuringExecution": { @@ -1954,6 +1953,7 @@ "value": "CUSTOM_MOCK_ENV_VAR_VALUE" } ], + "additionalJvmOptions": "-Dcom.sun.management.jmxremote=true -Dcom.sun.management.jmxremote.port=9010 -Dcom.sun.management.jmxremote.rmi.port=9010 -Dcom.sun.management.jmxremote.local.only=false -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=127.0.0.1 -DcustomMediatorJvmFlag", "persistence": { "databaseName": "global_domain_10_mediator", "port": 5432, @@ -1987,6 +1987,7 @@ "value": "CUSTOM_MOCK_ENV_VAR_VALUE" } ], + "additionalJvmOptions": "-Dcom.sun.management.jmxremote=true -Dcom.sun.management.jmxremote.port=9010 -Dcom.sun.management.jmxremote.rmi.port=9010 -Dcom.sun.management.jmxremote.local.only=false -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=127.0.0.1 -DcustomSequencerJvmFlag", "driver": { "externalAddress": "sequencer-p2p-10.sv-2.mock.global.canton.network.digitalasset.com", "externalPort": 443, @@ -2046,7 +2047,6 @@ "namespace": "sv-1", "timeout": 600, "values": { - "additionalJvmOptions": "-Dcom.sun.management.jmxremote=true -Dcom.sun.management.jmxremote.port=9010 -Dcom.sun.management.jmxremote.rmi.port=9010 -Dcom.sun.management.jmxremote.local.only=false -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=127.0.0.1 -DcustomSequencerJvmFlag", "affinity": { "nodeAffinity": { "requiredDuringSchedulingIgnoredDuringExecution": { @@ -2090,6 +2090,7 @@ "value": "CUSTOM_MOCK_ENV_VAR_VALUE" } ], + "additionalJvmOptions": "-Dcom.sun.management.jmxremote=true -Dcom.sun.management.jmxremote.port=9010 -Dcom.sun.management.jmxremote.rmi.port=9010 -Dcom.sun.management.jmxremote.local.only=false -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=127.0.0.1 -DcustomMediatorJvmFlag", "persistence": { "databaseName": "global_domain_7_mediator", "port": 5432, @@ -2123,6 +2124,7 @@ "value": "CUSTOM_MOCK_ENV_VAR_VALUE" } ], + "additionalJvmOptions": "-Dcom.sun.management.jmxremote=true -Dcom.sun.management.jmxremote.port=9010 -Dcom.sun.management.jmxremote.rmi.port=9010 -Dcom.sun.management.jmxremote.local.only=false -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=127.0.0.1 -DcustomSequencerJvmFlag", "driver": { "host": "global-domain-7-cometbft-cometbft-rpc.sv-1.svc.cluster.local", "port": 26657, @@ -2178,7 +2180,6 @@ "namespace": "sv-1", "timeout": 600, "values": { - "additionalJvmOptions": "-Dcom.sun.management.jmxremote=true -Dcom.sun.management.jmxremote.port=9010 -Dcom.sun.management.jmxremote.rmi.port=9010 -Dcom.sun.management.jmxremote.local.only=false -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=127.0.0.1 -DcustomSequencerJvmFlag", "affinity": { "nodeAffinity": { "requiredDuringSchedulingIgnoredDuringExecution": { @@ -2222,6 +2223,7 @@ "value": "CUSTOM_MOCK_ENV_VAR_VALUE" } ], + "additionalJvmOptions": "-Dcom.sun.management.jmxremote=true -Dcom.sun.management.jmxremote.port=9010 -Dcom.sun.management.jmxremote.rmi.port=9010 -Dcom.sun.management.jmxremote.local.only=false -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=127.0.0.1 -DcustomMediatorJvmFlag", "persistence": { "databaseName": "global_domain_8_mediator", "port": 5432, @@ -2255,6 +2257,7 @@ "value": "CUSTOM_MOCK_ENV_VAR_VALUE" } ], + "additionalJvmOptions": "-Dcom.sun.management.jmxremote=true -Dcom.sun.management.jmxremote.port=9010 -Dcom.sun.management.jmxremote.rmi.port=9010 -Dcom.sun.management.jmxremote.local.only=false -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=127.0.0.1 -DcustomSequencerJvmFlag", "driver": { "host": "global-domain-8-cometbft-cometbft-rpc.sv-1.svc.cluster.local", "port": 26657, @@ -2310,7 +2313,6 @@ "namespace": "sv-1", "timeout": 600, "values": { - "additionalJvmOptions": "-Dcom.sun.management.jmxremote=true -Dcom.sun.management.jmxremote.port=9010 -Dcom.sun.management.jmxremote.rmi.port=9010 -Dcom.sun.management.jmxremote.local.only=false -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=127.0.0.1 -DcustomSequencerJvmFlag", "affinity": { "nodeAffinity": { "requiredDuringSchedulingIgnoredDuringExecution": { @@ -2354,6 +2356,7 @@ "value": "CUSTOM_MOCK_ENV_VAR_VALUE" } ], + "additionalJvmOptions": "-Dcom.sun.management.jmxremote=true -Dcom.sun.management.jmxremote.port=9010 -Dcom.sun.management.jmxremote.rmi.port=9010 -Dcom.sun.management.jmxremote.local.only=false -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=127.0.0.1 -DcustomMediatorJvmFlag", "persistence": { "databaseName": "global_domain_9_mediator", "port": 5432, @@ -2387,6 +2390,7 @@ "value": "PS9_SEQUENCER_ENV_VAR_VALUE" } ], + "additionalJvmOptions": "-Dcom.sun.management.jmxremote=true -Dcom.sun.management.jmxremote.port=9010 -Dcom.sun.management.jmxremote.rmi.port=9010 -Dcom.sun.management.jmxremote.local.only=false -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=127.0.0.1 -DcustomSequencerJvmFlag", "driver": { "externalAddress": "sequencer-p2p-9.sv-2.mock.global.canton.network.digitalasset.com", "externalPort": 443, @@ -5488,7 +5492,6 @@ "namespace": "sv-da-1", "timeout": 600, "values": { - "additionalJvmOptions": "-Dcom.sun.management.jmxremote=true -Dcom.sun.management.jmxremote.port=9010 -Dcom.sun.management.jmxremote.rmi.port=9010 -Dcom.sun.management.jmxremote.local.only=false -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=127.0.0.1 -DcustomSequencerJvmFlag", "affinity": { "nodeAffinity": { "requiredDuringSchedulingIgnoredDuringExecution": { @@ -5532,6 +5535,7 @@ "value": "CUSTOM_MOCK_ENV_VAR_VALUE" } ], + "additionalJvmOptions": "-Dcom.sun.management.jmxremote=true -Dcom.sun.management.jmxremote.port=9010 -Dcom.sun.management.jmxremote.rmi.port=9010 -Dcom.sun.management.jmxremote.local.only=false -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=127.0.0.1 -DcustomMediatorJvmFlag", "persistence": { "databaseName": "global_domain_10_mediator", "port": 5432, @@ -5565,6 +5569,7 @@ "value": "CUSTOM_MOCK_ENV_VAR_VALUE" } ], + "additionalJvmOptions": "-Dcom.sun.management.jmxremote=true -Dcom.sun.management.jmxremote.port=9010 -Dcom.sun.management.jmxremote.rmi.port=9010 -Dcom.sun.management.jmxremote.local.only=false -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=127.0.0.1 -DcustomSequencerJvmFlag", "driver": { "externalAddress": "sequencer-p2p-10.sv-1.mock.global.canton.network.digitalasset.com", "externalPort": 443, @@ -5624,7 +5629,6 @@ "namespace": "sv-da-1", "timeout": 600, "values": { - "additionalJvmOptions": "-Dcom.sun.management.jmxremote=true -Dcom.sun.management.jmxremote.port=9010 -Dcom.sun.management.jmxremote.rmi.port=9010 -Dcom.sun.management.jmxremote.local.only=false -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=127.0.0.1 -DcustomSequencerJvmFlag", "affinity": { "nodeAffinity": { "requiredDuringSchedulingIgnoredDuringExecution": { @@ -5668,6 +5672,7 @@ "value": "CUSTOM_MOCK_ENV_VAR_VALUE" } ], + "additionalJvmOptions": "-Dcom.sun.management.jmxremote=true -Dcom.sun.management.jmxremote.port=9010 -Dcom.sun.management.jmxremote.rmi.port=9010 -Dcom.sun.management.jmxremote.local.only=false -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=127.0.0.1 -DcustomMediatorJvmFlag", "persistence": { "databaseName": "global_domain_7_mediator", "port": 5432, @@ -5701,6 +5706,7 @@ "value": "CUSTOM_MOCK_ENV_VAR_VALUE" } ], + "additionalJvmOptions": "-Dcom.sun.management.jmxremote=true -Dcom.sun.management.jmxremote.port=9010 -Dcom.sun.management.jmxremote.rmi.port=9010 -Dcom.sun.management.jmxremote.local.only=false -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=127.0.0.1 -DcustomSequencerJvmFlag", "driver": { "host": "global-domain-7-cometbft-cometbft-rpc.sv-da-1.svc.cluster.local", "port": 26657, @@ -5756,7 +5762,6 @@ "namespace": "sv-da-1", "timeout": 600, "values": { - "additionalJvmOptions": "-Dcom.sun.management.jmxremote=true -Dcom.sun.management.jmxremote.port=9010 -Dcom.sun.management.jmxremote.rmi.port=9010 -Dcom.sun.management.jmxremote.local.only=false -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=127.0.0.1 -DcustomSequencerJvmFlag", "affinity": { "nodeAffinity": { "requiredDuringSchedulingIgnoredDuringExecution": { @@ -5800,6 +5805,7 @@ "value": "CUSTOM_MOCK_ENV_VAR_VALUE" } ], + "additionalJvmOptions": "-Dcom.sun.management.jmxremote=true -Dcom.sun.management.jmxremote.port=9010 -Dcom.sun.management.jmxremote.rmi.port=9010 -Dcom.sun.management.jmxremote.local.only=false -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=127.0.0.1 -DcustomMediatorJvmFlag", "persistence": { "databaseName": "global_domain_8_mediator", "port": 5432, @@ -5833,6 +5839,7 @@ "value": "CUSTOM_MOCK_ENV_VAR_VALUE" } ], + "additionalJvmOptions": "-Dcom.sun.management.jmxremote=true -Dcom.sun.management.jmxremote.port=9010 -Dcom.sun.management.jmxremote.rmi.port=9010 -Dcom.sun.management.jmxremote.local.only=false -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=127.0.0.1 -DcustomSequencerJvmFlag", "driver": { "host": "global-domain-8-cometbft-cometbft-rpc.sv-da-1.svc.cluster.local", "port": 26657, @@ -5888,7 +5895,6 @@ "namespace": "sv-da-1", "timeout": 600, "values": { - "additionalJvmOptions": "-Dcom.sun.management.jmxremote=true -Dcom.sun.management.jmxremote.port=9010 -Dcom.sun.management.jmxremote.rmi.port=9010 -Dcom.sun.management.jmxremote.local.only=false -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=127.0.0.1 -DcustomSequencerJvmFlag", "affinity": { "nodeAffinity": { "requiredDuringSchedulingIgnoredDuringExecution": { @@ -5932,6 +5938,7 @@ "value": "CUSTOM_MOCK_ENV_VAR_VALUE" } ], + "additionalJvmOptions": "-Dcom.sun.management.jmxremote=true -Dcom.sun.management.jmxremote.port=9010 -Dcom.sun.management.jmxremote.rmi.port=9010 -Dcom.sun.management.jmxremote.local.only=false -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=127.0.0.1 -DcustomMediatorJvmFlag", "persistence": { "databaseName": "global_domain_9_mediator", "port": 5432, @@ -5965,6 +5972,7 @@ "value": "CUSTOM_MOCK_ENV_VAR_VALUE" } ], + "additionalJvmOptions": "-Dcom.sun.management.jmxremote=true -Dcom.sun.management.jmxremote.port=9010 -Dcom.sun.management.jmxremote.rmi.port=9010 -Dcom.sun.management.jmxremote.local.only=false -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=127.0.0.1 -DcustomSequencerJvmFlag", "driver": { "externalAddress": "sequencer-p2p-9.sv-1.mock.global.canton.network.digitalasset.com", "externalPort": 443, @@ -8352,7 +8360,6 @@ "namespace": "sv", "timeout": 600, "values": { - "additionalJvmOptions": "-Dcom.sun.management.jmxremote=true -Dcom.sun.management.jmxremote.port=9010 -Dcom.sun.management.jmxremote.rmi.port=9010 -Dcom.sun.management.jmxremote.local.only=false -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=127.0.0.1 -DcustomSequencerJvmFlag", "affinity": { "nodeAffinity": { "requiredDuringSchedulingIgnoredDuringExecution": { @@ -8396,6 +8403,7 @@ "value": "CUSTOM_MOCK_ENV_VAR_VALUE" } ], + "additionalJvmOptions": "-Dcom.sun.management.jmxremote=true -Dcom.sun.management.jmxremote.port=9010 -Dcom.sun.management.jmxremote.rmi.port=9010 -Dcom.sun.management.jmxremote.local.only=false -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=127.0.0.1 -DcustomMediatorJvmFlag", "persistence": { "databaseName": "mediator_10", "port": 5432, @@ -8429,6 +8437,7 @@ "value": "CUSTOM_MOCK_ENV_VAR_VALUE" } ], + "additionalJvmOptions": "-Dcom.sun.management.jmxremote=true -Dcom.sun.management.jmxremote.port=9010 -Dcom.sun.management.jmxremote.rmi.port=9010 -Dcom.sun.management.jmxremote.local.only=false -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=127.0.0.1 -DcustomSequencerJvmFlag", "driver": { "externalAddress": "sequencer-p2p-10.sv.mock.global.canton.network.digitalasset.com", "externalPort": 443, @@ -8488,7 +8497,6 @@ "namespace": "sv", "timeout": 600, "values": { - "additionalJvmOptions": "-Dcom.sun.management.jmxremote=true -Dcom.sun.management.jmxremote.port=9010 -Dcom.sun.management.jmxremote.rmi.port=9010 -Dcom.sun.management.jmxremote.local.only=false -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=127.0.0.1 -DcustomSequencerJvmFlag", "affinity": { "nodeAffinity": { "requiredDuringSchedulingIgnoredDuringExecution": { @@ -8532,6 +8540,7 @@ "value": "CUSTOM_MOCK_ENV_VAR_VALUE" } ], + "additionalJvmOptions": "-Dcom.sun.management.jmxremote=true -Dcom.sun.management.jmxremote.port=9010 -Dcom.sun.management.jmxremote.rmi.port=9010 -Dcom.sun.management.jmxremote.local.only=false -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=127.0.0.1 -DcustomMediatorJvmFlag", "persistence": { "databaseName": "mediator_7", "port": 5432, @@ -8565,6 +8574,7 @@ "value": "CUSTOM_MOCK_ENV_VAR_VALUE" } ], + "additionalJvmOptions": "-Dcom.sun.management.jmxremote=true -Dcom.sun.management.jmxremote.port=9010 -Dcom.sun.management.jmxremote.rmi.port=9010 -Dcom.sun.management.jmxremote.local.only=false -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=127.0.0.1 -DcustomSequencerJvmFlag", "driver": { "host": "global-domain-7-cometbft-cometbft-rpc.sv.svc.cluster.local", "port": 26657, @@ -8620,7 +8630,6 @@ "namespace": "sv", "timeout": 600, "values": { - "additionalJvmOptions": "-Dcom.sun.management.jmxremote=true -Dcom.sun.management.jmxremote.port=9010 -Dcom.sun.management.jmxremote.rmi.port=9010 -Dcom.sun.management.jmxremote.local.only=false -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=127.0.0.1 -DcustomSequencerJvmFlag", "affinity": { "nodeAffinity": { "requiredDuringSchedulingIgnoredDuringExecution": { @@ -8664,6 +8673,7 @@ "value": "CUSTOM_MOCK_ENV_VAR_VALUE" } ], + "additionalJvmOptions": "-Dcom.sun.management.jmxremote=true -Dcom.sun.management.jmxremote.port=9010 -Dcom.sun.management.jmxremote.rmi.port=9010 -Dcom.sun.management.jmxremote.local.only=false -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=127.0.0.1 -DcustomMediatorJvmFlag", "persistence": { "databaseName": "mediator_8", "port": 5432, @@ -8697,6 +8707,7 @@ "value": "CUSTOM_MOCK_ENV_VAR_VALUE" } ], + "additionalJvmOptions": "-Dcom.sun.management.jmxremote=true -Dcom.sun.management.jmxremote.port=9010 -Dcom.sun.management.jmxremote.rmi.port=9010 -Dcom.sun.management.jmxremote.local.only=false -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=127.0.0.1 -DcustomSequencerJvmFlag", "driver": { "host": "global-domain-8-cometbft-cometbft-rpc.sv.svc.cluster.local", "port": 26657, @@ -8752,7 +8763,6 @@ "namespace": "sv", "timeout": 600, "values": { - "additionalJvmOptions": "-Dcom.sun.management.jmxremote=true -Dcom.sun.management.jmxremote.port=9010 -Dcom.sun.management.jmxremote.rmi.port=9010 -Dcom.sun.management.jmxremote.local.only=false -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=127.0.0.1 -DcustomSequencerJvmFlag", "affinity": { "nodeAffinity": { "requiredDuringSchedulingIgnoredDuringExecution": { @@ -8796,6 +8806,7 @@ "value": "CUSTOM_MOCK_ENV_VAR_VALUE" } ], + "additionalJvmOptions": "-Dcom.sun.management.jmxremote=true -Dcom.sun.management.jmxremote.port=9010 -Dcom.sun.management.jmxremote.rmi.port=9010 -Dcom.sun.management.jmxremote.local.only=false -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=127.0.0.1 -DcustomMediatorJvmFlag", "persistence": { "databaseName": "mediator_9", "port": 5432, @@ -8829,6 +8840,7 @@ "value": "CUSTOM_MOCK_ENV_VAR_VALUE" } ], + "additionalJvmOptions": "-Dcom.sun.management.jmxremote=true -Dcom.sun.management.jmxremote.port=9010 -Dcom.sun.management.jmxremote.rmi.port=9010 -Dcom.sun.management.jmxremote.local.only=false -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=127.0.0.1 -DcustomSequencerJvmFlag", "driver": { "externalAddress": "sequencer-p2p-9.sv.mock.global.canton.network.digitalasset.com", "externalPort": 443, diff --git a/cluster/helm/splice-global-domain/templates/mediator.yaml b/cluster/helm/splice-global-domain/templates/mediator.yaml index 8a238386c6..952bcac9d6 100644 --- a/cluster/helm/splice-global-domain/templates/mediator.yaml +++ b/cluster/helm/splice-global-domain/templates/mediator.yaml @@ -57,7 +57,7 @@ spec: image: {{ .Values.imageRepo }}/{{ .Values.mediator.imageName}}:{{ .Chart.AppVersion }}{{ ((.Values.imageDigests).canton_mediator) }} env: - name: JAVA_TOOL_OPTIONS - value: "{{ .Values.defaultJvmOptions }} {{ .Values.additionalJvmOptions }} -Dlogback.configurationFile=/app/logback/logback.xml" + value: "{{ .Values.defaultJvmOptions }} {{ .Values.mediator.additionalJvmOptions }} -Dlogback.configurationFile=/app/logback/logback.xml" - name: CANTON_DOMAIN_POSTGRES_SERVER value: {{ .Values.mediator.persistence.host }} - name: CANTON_DOMAIN_POSTGRES_PORT diff --git a/cluster/helm/splice-global-domain/templates/sequencer.yaml b/cluster/helm/splice-global-domain/templates/sequencer.yaml index cbc185292b..41a147a590 100644 --- a/cluster/helm/splice-global-domain/templates/sequencer.yaml +++ b/cluster/helm/splice-global-domain/templates/sequencer.yaml @@ -53,7 +53,7 @@ spec: {{- end}} env: - name: JAVA_TOOL_OPTIONS - value: "{{ .Values.defaultJvmOptions }} {{ .Values.additionalJvmOptions }} -Dlogback.configurationFile=/app/logback/logback.xml" + value: "{{ .Values.defaultJvmOptions }} {{ .Values.sequencer.additionalJvmOptions }} -Dlogback.configurationFile=/app/logback/logback.xml" - name: CANTON_DOMAIN_POSTGRES_SERVER value: {{ .Values.sequencer.persistence.host }} - name: CANTON_DOMAIN_POSTGRES_PORT diff --git a/cluster/helm/splice-global-domain/tests/mediator_test.yaml b/cluster/helm/splice-global-domain/tests/mediator_test.yaml index e030323f0c..07691efb2d 100644 --- a/cluster/helm/splice-global-domain/tests/mediator_test.yaml +++ b/cluster/helm/splice-global-domain/tests/mediator_test.yaml @@ -196,6 +196,21 @@ tests: path: spec.template.spec.serviceAccountName value: "custom-domain-sa" + - it: "applies mediator-specific JVM options" + set: + mediator.additionalJvmOptions: "-Dmediator.option=true" + sequencer.additionalJvmOptions: "-Dsequencer.option=true" + documentSelector: + path: kind + value: Deployment + asserts: + - matchRegex: + path: spec.template.spec.containers[?(@.name=='mediator')].env[?(@.name=='JAVA_TOOL_OPTIONS')].value + pattern: '-Dmediator\.option=true' + - notMatchRegex: + path: spec.template.spec.containers[?(@.name=='mediator')].env[?(@.name=='JAVA_TOOL_OPTIONS')].value + pattern: '-Dsequencer\.option=true' + - it: "sets default security contexts for pods and containers" documentSelector: path: kind diff --git a/cluster/helm/splice-global-domain/tests/sequencer_test.yaml b/cluster/helm/splice-global-domain/tests/sequencer_test.yaml index 3f22ccd1d3..1d778015b3 100644 --- a/cluster/helm/splice-global-domain/tests/sequencer_test.yaml +++ b/cluster/helm/splice-global-domain/tests/sequencer_test.yaml @@ -406,6 +406,21 @@ tests: path: spec.template.spec.serviceAccountName value: "custom-domain-sa" + - it: "applies sequencer-specific JVM options" + set: + sequencer.additionalJvmOptions: "-Dsequencer.option=true" + mediator.additionalJvmOptions: "-Dmediator.option=true" + documentSelector: + path: kind + value: Deployment + asserts: + - matchRegex: + path: spec.template.spec.containers[?(@.name=='sequencer')].env[?(@.name=='JAVA_TOOL_OPTIONS')].value + pattern: '-Dsequencer\.option=true' + - notMatchRegex: + path: spec.template.spec.containers[?(@.name=='sequencer')].env[?(@.name=='JAVA_TOOL_OPTIONS')].value + pattern: '-Dmediator\.option=true' + - it: "sets default security contexts for pods and containers" set: sequencer: diff --git a/cluster/helm/splice-global-domain/values-template.yaml b/cluster/helm/splice-global-domain/values-template.yaml index 0d8a2f8eee..d4b033a316 100644 --- a/cluster/helm/splice-global-domain/values-template.yaml +++ b/cluster/helm/splice-global-domain/values-template.yaml @@ -20,6 +20,7 @@ resources: sequencer: imageName: "canton-sequencer" + additionalJvmOptions: "" cometbft: imageName: "canton-cometbft-sequencer" persistence: @@ -39,6 +40,7 @@ sequencer: mediator: imageName: "canton-mediator" + additionalJvmOptions: "" persistence: host: postgres.sv-1.svc.cluster.local secretName: "postgres-secrets" diff --git a/cluster/pulumi/sv-canton/src/decentralizedSynchronizerNode.ts b/cluster/pulumi/sv-canton/src/decentralizedSynchronizerNode.ts index 6f4106d769..39b3fbf348 100644 --- a/cluster/pulumi/sv-canton/src/decentralizedSynchronizerNode.ts +++ b/cluster/pulumi/sv-canton/src/decentralizedSynchronizerNode.ts @@ -150,6 +150,9 @@ abstract class InStackDecentralizedSynchronizerNode : [] ).concat(physicalSynchronizerConfig.sequencer.additionalEnvVars), resources: physicalSynchronizerConfig.sequencer.resources, + additionalJvmOptions: getAdditionalJvmOptions( + physicalSynchronizerConfig.sequencer.additionalJvmOptions + ), }, mediator: { ...decentralizedSynchronizerValues.mediator, @@ -162,6 +165,9 @@ abstract class InStackDecentralizedSynchronizerNode }, additionalEnvVars: physicalSynchronizerConfig.mediator.additionalEnvVars, resources: physicalSynchronizerConfig.mediator.resources, + additionalJvmOptions: getAdditionalJvmOptions( + physicalSynchronizerConfig.mediator.additionalJvmOptions + ), }, enablePostgresMetrics: true, metrics: { @@ -171,10 +177,6 @@ abstract class InStackDecentralizedSynchronizerNode }, }, livenessProbeInitialDelaySeconds: domainLivenessProbeInitialDelaySeconds, - // TODO(#5805): These are used both for sequencer and mediator while the mediator config is ignored. - additionalJvmOptions: getAdditionalJvmOptions( - physicalSynchronizerConfig.sequencer.additionalJvmOptions - ), pvc: persistentHeapDumpsPvc(), serviceAccountName: imagePullServiceAccountName, enableAntiAffinity: physicalSynchronizerConfig.sequencer.enableAntiAffinity, diff --git a/docs/src/release_notes_upcoming.rst b/docs/src/release_notes_upcoming.rst index 77ab2efaa2..89246e2218 100644 --- a/docs/src/release_notes_upcoming.rst +++ b/docs/src/release_notes_upcoming.rst @@ -28,3 +28,7 @@ functionality is expected to be fully removed in 0.8.0 so this only provides a bit more time to migrate but you must complete the migration. + + - Deployment + + - The sequencer and mediator can now be configured with independent ``additionalJvmOptions`` via the new ``sequencer.additionalJvmOptions`` and ``mediator.additionalJvmOptions`` values in the ``splice-global-domain`` helm chart. From 9b0c45ae4acac8c04551cf2d9765ce0e5acc56d7 Mon Sep 17 00:00:00 2001 From: Divam <681060+dfordivam@users.noreply.github.com> Date: Wed, 29 Jul 2026 12:12:29 +0900 Subject: [PATCH 06/15] TBAR: Guard meta row insertion on traffic summaries (#6579) Signed-off-by: Divam --- .../ScanVerdictIngestionService.scala | 44 +++++---- .../scan/rewards/AppActivityComputation.scala | 16 +++- .../store/db/DbAppActivityRecordStore.scala | 25 +++--- .../scan/store/db/DbScanVerdictStore.scala | 17 +++- .../store/DbAppActivityRecordStoreTest.scala | 89 ++++++++++++++++--- 5 files changed, 146 insertions(+), 45 deletions(-) diff --git a/apps/scan/src/main/scala/org/lfdecentralizedtrust/splice/scan/automation/ScanVerdictIngestionService.scala b/apps/scan/src/main/scala/org/lfdecentralizedtrust/splice/scan/automation/ScanVerdictIngestionService.scala index 302df6e015..ee476d12a8 100644 --- a/apps/scan/src/main/scala/org/lfdecentralizedtrust/splice/scan/automation/ScanVerdictIngestionService.scala +++ b/apps/scan/src/main/scala/org/lfdecentralizedtrust/splice/scan/automation/ScanVerdictIngestionService.scala @@ -243,30 +243,38 @@ class ScanVerdictIngestionService( // Compute app activity records (before DB transaction). // Records have verdictRowId = DUMMY_VERDICT_ROW_ID // the store resolves actual row_ids during insertion. - (appActivityRecords, lastArchivedRoundO) <- appActivityComputationO match { - case Some(appActivityComputation) => - for { - records <- appActivityComputation.computeActivities(summariesWithVerdicts).map { - _.flatMap { case (summary, _, recordO) => - recordO.map(summary.sequencingTime -> _) + (appActivityRecords, firstActiveRoundO, lastArchivedRoundO) <- + appActivityComputationO match { + case Some(appActivityComputation) => + val recordTimes = + verdicts.map(v => CantonTimestamp.tryFromProtoTimestamp(v.getRecordTime)) + for { + records <- appActivityComputation.computeActivities(summariesWithVerdicts).map { + _.flatMap { case (summary, _, recordO) => + recordO.map(summary.sequencingTime -> _) + } } - } - lastArchivedRoundO <- verdicts - .map(v => CantonTimestamp.tryFromProtoTimestamp(v.getRecordTime)) - .maxOption match { - case Some(maxRecordTime) => - appActivityComputation.lookupLatestArchivedOpenMiningRound(maxRecordTime) - case None => Future.successful(None) - } - } yield (records, lastArchivedRoundO) - case None => Future.successful((Seq.empty, None)) - } + firstActiveRoundO <- recordTimes.minOption match { + case Some(minRecordTime) => + appActivityComputation.lookupActiveOpenMiningRound(minRecordTime) + case None => Future.successful(None) + } + lastArchivedRoundO <- recordTimes.maxOption match { + case Some(maxRecordTime) => + appActivityComputation.lookupLatestArchivedOpenMiningRound(maxRecordTime) + case None => Future.successful(None) + } + } yield (records, firstActiveRoundO, lastArchivedRoundO) + case None => Future.successful((Seq.empty, None, None)) + } _ <- ensureVerdictsHaveTrafficSummaries(verdicts, summaryByTime) _ <- store.insertVerdictsWithAppActivityRecords( items, appActivityRecords, - lastArchivedRoundO, + hasTrafficSummaries = summaryByTime.nonEmpty, + firstActiveRoundO = firstActiveRoundO, + lastArchivedRoundO = lastArchivedRoundO, ) } yield { val lastRecordTime = verdicts.lastOption diff --git a/apps/scan/src/main/scala/org/lfdecentralizedtrust/splice/scan/rewards/AppActivityComputation.scala b/apps/scan/src/main/scala/org/lfdecentralizedtrust/splice/scan/rewards/AppActivityComputation.scala index 30b4b9ede5..be99679eee 100644 --- a/apps/scan/src/main/scala/org/lfdecentralizedtrust/splice/scan/rewards/AppActivityComputation.scala +++ b/apps/scan/src/main/scala/org/lfdecentralizedtrust/splice/scan/rewards/AppActivityComputation.scala @@ -49,6 +49,14 @@ class AppActivityComputation( )(implicit tc: TraceContext): Future[Option[Long]] = rewardsReferenceStore.lookupLatestArchivedOpenMiningRound(asOf) + /** The OpenMiningRound round number active at asOf, if the round data has been ingested. */ + def lookupActiveOpenMiningRound( + asOf: CantonTimestamp + )(implicit tc: TraceContext): Future[Option[Long]] = + rewardsReferenceStore + .lookupActiveOpenMiningRounds(Seq(asOf)) + .map(_.get(asOf).map { case (roundNumber, _) => roundNumber }) + /** Compute app activity records for a batch of verdicts. * * Records are returned with verdictRowId = DUMMY_VERDICT_ROW_ID as a placeholder. @@ -125,8 +133,12 @@ class AppActivityComputation( } case None => // Skip activity record computation as we don't have the necessary round data ingested. - // This can happen for freshly onboarded SVs, but is not - // expected to happen once the first activity record has been computed. + // This can happen for freshly onboarded SVs if the reward + // reference store does not have the data for any of the + // sequencingTime(s) in this batch. + // OTOH this cannot happen after ingestion starts because + // lookupActiveOpenMiningRounds blocks until the reference store + // has caught up to all the sequencingTime(s) in this batch. logger.debug( s"No round data found for sequencingTime=${summary.sequencingTime}, skipping activity record computation" ) diff --git a/apps/scan/src/main/scala/org/lfdecentralizedtrust/splice/scan/store/db/DbAppActivityRecordStore.scala b/apps/scan/src/main/scala/org/lfdecentralizedtrust/splice/scan/store/db/DbAppActivityRecordStore.scala index a60594dc25..3016348a34 100644 --- a/apps/scan/src/main/scala/org/lfdecentralizedtrust/splice/scan/store/db/DbAppActivityRecordStore.scala +++ b/apps/scan/src/main/scala/org/lfdecentralizedtrust/splice/scan/store/db/DbAppActivityRecordStore.scala @@ -300,13 +300,16 @@ class DbAppActivityRecordStore( /** Insert activity records and ensure the meta row exists. * Creates the meta row when enough information is available to * determine which rounds have complete activity, even when no - * activity records exist (e.g., no featured app providers). + * activity records exist (e.g., no featured app providers), + * but only if traffic-summaries could be obtained for this batch. * On a fresh firstSV with no archived rounds, bootstraps round 0 * as complete. */ def insertAppActivityRecordsDBIO( items: Seq[AppActivityRecordT], firstRecordTimeMicros: Long, + hasTrafficSummaries: Boolean, + firstActiveRoundO: Option[Long] = None, lastArchivedRoundO: Option[Long] = None, )(implicit tc: TraceContext): DBIO[Unit] = { val insertRecords = @@ -316,15 +319,9 @@ class DbAppActivityRecordStore( logger.info(s"Inserted ${items.size} app activity records.") } - // earliestRound: the lowest round covered by this ingestion batch. - // - From activity records when present - // - From lastArchivedRound when no featured apps produced records - // - From bootstrap (-1) on a fresh firstSV with no archived rounds - val earliestRound = items - .map(_.roundNumber) - .minOption - .orElse(lastArchivedRoundO) - .orElse(if (isFirstSv) Some(-1L) else None) + // earliestRound: the oldest round open at the earliest record_time of this batch. + // or (-1) on firstSV, as it is expected to have complete data for the first round. + val earliestRound = if (isFirstSv) Some(-1L) else firstActiveRoundO // lastArchived: the highest round archived as of this verdict batch. // - From the caller when available @@ -337,10 +334,12 @@ class DbAppActivityRecordStore( for { _ <- insertRecords ensureResult <- earliestRound match { - case Some(earliest) => + case Some(earliest) if hasTrafficSummaries => ensureMetaDBIO((firstRecordTimeMicros, earliest), lastArchived) - case None => - // No archived rounds and not firstSV — skip meta creation. + case _ => + // Either we have no rounds info and this is not firstSV, + // or we have not started obtaining the traffic summaries yet + // — skip meta creation. // A later verdict batch will create it. DBIO.successful(Resume: MetaCheckResult) } diff --git a/apps/scan/src/main/scala/org/lfdecentralizedtrust/splice/scan/store/db/DbScanVerdictStore.scala b/apps/scan/src/main/scala/org/lfdecentralizedtrust/splice/scan/store/db/DbScanVerdictStore.scala index 3e5cdf0646..38b7f2e6a1 100644 --- a/apps/scan/src/main/scala/org/lfdecentralizedtrust/splice/scan/store/db/DbScanVerdictStore.scala +++ b/apps/scan/src/main/scala/org/lfdecentralizedtrust/splice/scan/store/db/DbScanVerdictStore.scala @@ -479,12 +479,17 @@ class DbScanVerdictStore( * * @param items verdicts with transaction view constructors * @param appActivityRecords activity records with placeholder verdictRowIds + * @param hasTrafficSummaries whether traffic summaries were fetched for this batch + * @param firstActiveRoundO the OpenMiningRound round active at the earliest + * record time of the batch * @param lastArchivedRoundO the highest archived OpenMiningRound round as of the * max record time of the batch */ def insertVerdictsWithAppActivityRecords( items: NonEmptyList[(VerdictT, Long => Seq[TransactionViewT])], appActivityRecords: Seq[(CantonTimestamp, AppActivityRecordT)], + hasTrafficSummaries: Boolean, + firstActiveRoundO: Option[Long] = None, lastArchivedRoundO: Option[Long] = None, )(implicit tc: TraceContext): Future[Unit] = { import profile.api.jdbcActionExtensionMethods @@ -498,6 +503,8 @@ class DbScanVerdictStore( _ <- insertAppActivityRecordsDBIO( resolvedAppActivityRecords, items.head._1.recordTime.toMicros, + hasTrafficSummaries, + firstActiveRoundO, lastArchivedRoundO, ) } yield () @@ -545,12 +552,20 @@ class DbScanVerdictStore( private def insertAppActivityRecordsDBIO( items: Seq[AppActivityRecordT], firstRecordTimeMicros: Long, + hasTrafficSummaries: Boolean, + firstActiveRoundO: Option[Long], lastArchivedRoundO: Option[Long], )(implicit tc: TraceContext): DBIO[Unit] = appActivityRecordStoreO match { case None => DBIO.successful(()) case Some(s) => - s.insertAppActivityRecordsDBIO(items, firstRecordTimeMicros, lastArchivedRoundO) + s.insertAppActivityRecordsDBIO( + items, + firstRecordTimeMicros, + hasTrafficSummaries, + firstActiveRoundO, + lastArchivedRoundO, + ) } private def afterFilters( diff --git a/apps/scan/src/test/scala/org/lfdecentralizedtrust/splice/scan/store/DbAppActivityRecordStoreTest.scala b/apps/scan/src/test/scala/org/lfdecentralizedtrust/splice/scan/store/DbAppActivityRecordStoreTest.scala index b4b57c17c0..2ab1c4045c 100644 --- a/apps/scan/src/test/scala/org/lfdecentralizedtrust/splice/scan/store/DbAppActivityRecordStoreTest.scala +++ b/apps/scan/src/test/scala/org/lfdecentralizedtrust/splice/scan/store/DbAppActivityRecordStoreTest.scala @@ -169,6 +169,8 @@ class DbAppActivityRecordStoreTest _ <- verdictStore.insertVerdictsWithAppActivityRecords( NonEmptyList.of(verdict1 -> noViews, verdict2 -> noViews), appActivityRecords, + hasTrafficSummaries = true, + firstActiveRoundO = Some(10L), lastArchivedRoundO = Some(9L), ) @@ -209,6 +211,8 @@ class DbAppActivityRecordStoreTest _ <- verdictStore.insertVerdictsWithAppActivityRecords( NonEmptyList.of(mkVerdict(verdictStore, "update-mono-1", baseTs) -> noViews), Seq(baseTs -> mkRecord(0L, 10L, Seq("app1::provider"), Seq(100L))), + hasTrafficSummaries = true, + firstActiveRoundO = Some(10L), lastArchivedRoundO = Some(9L), ) // A later batch without activity records still advances the round @@ -217,10 +221,13 @@ class DbAppActivityRecordStoreTest mkVerdict(verdictStore, "update-mono-2", baseTs.plusSeconds(1L)) -> noViews ), Seq.empty, + hasTrafficSummaries = true, + firstActiveRoundO = Some(11L), lastArchivedRoundO = Some(10L), ) meta <- appStore.lookupActivityRecordMeta(1, 0) } yield { + meta.value.earliestIngestedRound shouldBe 10L meta.value.lastArchivedRound shouldBe Some(10L) } } @@ -233,40 +240,96 @@ class DbAppActivityRecordStoreTest _ <- verdictStore.insertVerdictsWithAppActivityRecords( NonEmptyList.of(mkVerdict(verdictStore, "update-no-meta", baseTs) -> noViews), Seq.empty, - lastArchivedRoundO = Some(7L), + hasTrafficSummaries = true, + firstActiveRoundO = Some(7L), + lastArchivedRoundO = None, ) meta <- appStore.lookupActivityRecordMeta(1, 0) } yield { - // Meta row is created with earliestRound = lastArchivedRound - // because verdict ingestion is active even without activity records + // Meta row is created using the firstActiveRoundO + // even though there are no activity records meta shouldBe defined meta.value.earliestIngestedRound shouldBe 7L - meta.value.lastArchivedRound shouldBe Some(7L) + meta.value.lastArchivedRound shouldBe None + } + } + + "Does not create meta row when traffic summaries are absent" in { + for { + (appStore, verdictStore) <- newStores() + baseTs = CantonTimestamp.now() + + _ <- verdictStore.insertVerdictsWithAppActivityRecords( + NonEmptyList.of(mkVerdict(verdictStore, "update-no-meta", baseTs) -> noViews), + Seq.empty, + hasTrafficSummaries = false, + lastArchivedRoundO = Some(7L), + ) + v <- verdictStore.getVerdictByUpdateId("update-no-meta") + countAfter <- countRecords() + meta <- appStore.lookupActivityRecordMeta(1, 0) + } yield { + v shouldBe defined + countAfter shouldBe 0L + meta shouldBe None } } - "insert verdicts without activity records when appActivityRecords is empty" in { + "on a fresh firstSV, does not create meta row when traffic summaries are absent" in { + for { + (appStore, verdictStore) <- newStores(isFirstSv = true) + baseTs = CantonTimestamp.now() + + _ <- verdictStore.insertVerdictsWithAppActivityRecords( + NonEmptyList.of(mkVerdict(verdictStore, "update-firstsv-2", baseTs) -> noViews), + Seq.empty, + hasTrafficSummaries = false, + ) + // Even on firstSV, missing traffic summaries defer meta creation + // to a later batch. + metaBefore <- appStore.lookupActivityRecordMeta(1, 0) + + // A later batch with traffic summaries creates the meta row. + _ <- verdictStore.insertVerdictsWithAppActivityRecords( + NonEmptyList.of( + mkVerdict(verdictStore, "update-firstsv-3", baseTs.plusSeconds(1L)) -> noViews + ), + Seq.empty, + hasTrafficSummaries = true, + ) + metaAfter <- appStore.lookupActivityRecordMeta(1, 0) + } yield { + metaBefore shouldBe None + + metaAfter shouldBe defined + metaAfter.value.earliestIngestedRound shouldBe -1L + metaAfter.value.lastArchivedRound shouldBe Some(0L) + } + } + + "insert verdicts without activity records, when reward reference store does not have data asOf" in { for { (appStore, verdictStore) <- newStores() baseTs = CantonTimestamp.now() verdict = mkVerdict(verdictStore, "update-no-activity", baseTs) + // firstActiveRoundO is None, as reward reference store began ingestion after baseTx _ <- verdictStore.insertVerdictsWithAppActivityRecords( NonEmptyList.of(verdict -> noViews), Seq.empty, + hasTrafficSummaries = true, + firstActiveRoundO = None, + lastArchivedRoundO = None, ) v <- verdictStore.getVerdictByUpdateId("update-no-activity") countAfter <- countRecords() - // No meta row should be created when there are no activity records meta <- appStore.lookupActivityRecordMeta(1, 0) } yield { v shouldBe defined countAfter shouldBe 0L - // Non-firstSV with no lastArchivedRound: meta row is not created - // because it would have last_archived_round = NULL, making no - // rounds complete. + // Non-firstSV with no firstActiveRoundO: meta row is not created meta shouldBe None } } @@ -289,6 +352,7 @@ class DbAppActivityRecordStoreTest _ <- verdictStore.insertVerdictsWithAppActivityRecords( NonEmptyList.of(verdict1 -> noViews, verdict2 -> noViews, verdict3 -> noViews), appActivityRecords, + hasTrafficSummaries = true, ) v1 <- verdictStore.getVerdictByUpdateId("update-with-1") @@ -335,6 +399,7 @@ class DbAppActivityRecordStoreTest _ <- verdictStore.insertVerdictsWithAppActivityRecords( NonEmptyList.of(verdict -> noViews), appActivityRecords, + hasTrafficSummaries = true, ) v <- verdictStore.getVerdictByUpdateId("update-mismatch") @@ -1051,7 +1116,9 @@ class DbAppActivityRecordStoreTest /** Creates both an app activity record store and a verdict store backed by * the same UpdateHistory, for testing insertVerdictsWithAppActivityRecords. */ - private def newStores(): Future[(DbAppActivityRecordStore, DbScanVerdictStore)] = { + private def newStores( + isFirstSv: Boolean = false + ): Future[(DbAppActivityRecordStore, DbScanVerdictStore)] = { val participantId = mkParticipantId("activity-test") val updateHistory = new UpdateHistory( storage.underlying, @@ -1070,7 +1137,7 @@ class DbAppActivityRecordStoreTest storage.underlying, updateHistory, DbAppActivityRecordStore.IngestionVersions(1, 0), - isFirstSv = false, + isFirstSv, loggerFactory, ) val verdictStore = new DbScanVerdictStore( From 5b010aa5668fbd4e3cd4028e240bda7e0175bd6b Mon Sep 17 00:00:00 2001 From: Stanislav German-Evtushenko Date: Wed, 29 Jul 2026 17:08:53 +0900 Subject: [PATCH 07/15] helm, info, status: Check CantonBFT reachability (#6589) * helm, info, status: Add separate function to fetch Scan URLs Signed-off-by: Stanislav German-Evtushenko --- .../helm/splice-info/scripts/get-status.sh | 144 ++++++++++++++---- 1 file changed, 112 insertions(+), 32 deletions(-) diff --git a/cluster/helm/splice-info/scripts/get-status.sh b/cluster/helm/splice-info/scripts/get-status.sh index 4712850ee3..873e931bbb 100755 --- a/cluster/helm/splice-info/scripts/get-status.sh +++ b/cluster/helm/splice-info/scripts/get-status.sh @@ -27,8 +27,11 @@ if [[ $TLS_SKIP_VERIFY == true ]]; then GRPC_HEALTH_CMD+=(--insecure) fi +GRPC_HEALTH_CONN_CMD=("${GRPC_HEALTH_CMD[@]}" --connect-only) + CURL_CMD_JSON=$(jq -nc --args '$ARGS.positional' -- "${CURL_CMD[@]}") GRPC_HEALTH_CMD_JSON=$(jq -nc --args '$ARGS.positional' -- "${GRPC_HEALTH_CMD[@]}") +GRPC_HEALTH_CONN_CMD_JSON=$(jq -nc --args '$ARGS.positional' -- "${GRPC_HEALTH_CONN_CMD[@]}") prom2json() { P2J_VERSION="1.5.0" @@ -286,35 +289,52 @@ run_parallel() { printf "%s" "$result" | jq -es 'add | values' || echo '{}' } +# Fetches the list of scans from the Scan API and returns a JSON object with +# svNames as keys and public URLs as values. +get_scan_urls() { + local scan_info; scan_info=$( + "${CURL_CMD[@]}" "$SCAN_URL/api/scan/v0/scans" || echo '{}' + ) + + local scan_urls; scan_urls=$( + local result; result=$( + echo "$scan_info" | + jq -e '.scans[]?.scans | map({ (.svName): .publicUrl }) | add | values' + ) && echo "$result" || echo '{}' + ) + + echo "$scan_urls" +} + # Tries to reach the scan and checks the age of the last open and issuing # rounds. Returns a JSON object with svNames as keys and 0 (reachable and # rounds within threshold), 1 (reachable but rounds not within threshold) or 2 # (not reachable) as values. scan_get_status_rounds() { - local scan_url=$SCAN_URL - local scans_info_url="$scan_url/api/scan/v0/scans" - - local scan_info; scan_info=$("${CURL_CMD[@]}" "$scans_info_url" || echo '{}') + local scan_urls; scan_urls=$(get_scan_urls) local scan_cmds_rounds; scan_cmds_rounds=$( local result; result=$( - echo "$scan_info" | - jq -e \ - --argjson cmd "$CURL_CMD_JSON" \ - ' - .scans[]?.scans - | map( - { - (.svName): - $cmd + - ["--compressed"] + - ["--json", ({"cached_open_mining_round_contract_ids": [], "cached_issuing_round_contract_ids": []} | tojson)] + - [.publicUrl + "/api/scan/v0/open-and-issuing-mining-rounds"] - } - ) - | add - | values - ' + jq -ne \ + --argjson cmd "$CURL_CMD_JSON" \ + --argjson scan_urls "$scan_urls" \ + ' + $scan_urls + | to_entries + | map( + .key as $svName | + .value as $scanUrl | + { + ($svName): + $cmd + + ["--compressed"] + + ["--json", ({"cached_open_mining_round_contract_ids": [], "cached_issuing_round_contract_ids": []} | tojson)] + + [$scanUrl + "/api/scan/v0/open-and-issuing-mining-rounds"] + } + ) + | add + | values + ' ) && echo "$result" || echo '{}' ) @@ -385,17 +405,7 @@ scan_try_fetch_event() { } scan_get_status_events() { - local scan_url=$SCAN_URL - local scans_info_url="$scan_url/api/scan/v0/scans" - - local scan_info; scan_info=$("${CURL_CMD[@]}" "$scans_info_url" || echo '{}') - - local scan_urls; scan_urls=$( - local result; result=$( - echo "$scan_info" | - jq -e '.scans[]?.scans | map({ (.svName): .publicUrl }) | add | values' - ) && echo "$result" || echo '{}' - ) + local scan_urls; scan_urls=$(get_scan_urls) local scan_cmds_events; scan_cmds_events=$( local result; result=$( @@ -451,6 +461,71 @@ sequencer_get_status_reachability() { echo "$sequencer_status" } +# Tries to reach the cantonbft. Returns a JSON object with svNames as keys and +# 0 (reachable) or 2 (otherwise) as values. +cantonbft_get_status_reachability() { + local scan_urls; scan_urls=$(get_scan_urls) + + local get_cantonbfts_info_cmds; get_cantonbfts_info_cmds=$( + local result; result=$( + jq -ne \ + --argjson cmd "$CURL_CMD_JSON" \ + --argjson scan_urls "$scan_urls" \ + ' + $scan_urls | to_entries + | map( + .key as $svName | + .value as $scanUrl | + { + ($svName): $cmd + [$scanUrl + "/api/scan/v0/sv-bft-sequencers"] + } + ) + | add + | values + ' + ) && echo "$result" || echo '{}' + ) + + local cantonbfts_info; cantonbfts_info=$( + { + run_parallel "$get_cantonbfts_info_cmds" | + json_object_values_fromjson || echo '{}' + } | + jq '{ bftSequencers: [.[] | .bftSequencers[]] }' + ) + + local cantonbfts_info_for_serial; cantonbfts_info_for_serial=$( + echo "$cantonbfts_info" | + jq --argjson serial "$SERIAL_ID" '[.bftSequencers[]? | select(.serialId == $serial)]' + ) + + local cantonbfts_cmds; cantonbfts_cmds=$( + local result; result=$( + echo "$cantonbfts_info_for_serial" | + jq -e \ + --argjson cmd "$GRPC_HEALTH_CONN_CMD_JSON" \ + ' + . + | map( + (.id | split("::")[1]) as $svName | + { + ($svName): $cmd + [.p2pUrl] + } + ) + | add + | values + ' + ) && echo "$result" || echo '{}' + ) + + local cantonbft_status; cantonbft_status=$( + run_parallel "$cantonbfts_cmds" | + json_object_values_fromjson || echo '{}' + ) + + echo "$cantonbft_status" +} + update_serial_id() { local fetched_serial_id; fetched_serial_id=$("${CURL_CMD[@]}" -m 1 "$SCAN_URL/api/scan/v0/active-synchronizer-serial" | jq -r '.serial') || true @@ -526,6 +601,9 @@ main() { local sequencer_status_reachability; sequencer_status_reachability=$(sequencer_get_status_reachability) local sequencer_status; sequencer_status=$(echo "$sequencer_status_lag" "$sequencer_status_reachability" | combine_status) + # Get CantonBFT status + local cantonbft_status; cantonbft_status=$(cantonbft_get_status_reachability) + jq -Sn \ --argjson sv "$sv_status" \ --argjson sv_threshold "$SV_THRESHOLD" \ @@ -536,6 +614,7 @@ main() { --argjson scan_threshold_events "$SCAN_THRESHOLD_EVENTS" \ --argjson sequencer "$sequencer_status" \ --argjson sequencer_threshold "$SEQUENCER_THRESHOLD" \ + --argjson cantonbft "$cantonbft_status" \ ' { status: { @@ -543,6 +622,7 @@ main() { mediator: {nodes: $mediator, description: "Last acknowledgment within \($mediator_threshold) seconds"}, scan: {nodes: $scan, description: "Reachable, last open and issuing rounds are within \($scan_threshold_rounds) seconds and recent events are within \($scan_threshold_events) seconds"}, sequencer: {nodes: $sequencer, description: "Reachable, last acknowledgment within \($sequencer_threshold) seconds"}, + cantonbft: {nodes: $cantonbft, description: "Reachable"}, }, generatedAt: (now | todate), } From 87d671a7864dcfefdd015af9a22bbaeea39e0210 Mon Sep 17 00:00:00 2001 From: Nicu Reut Date: Wed, 29 Jul 2026 10:13:37 +0200 Subject: [PATCH 08/15] Update canton bft dashboards with latest 3.5 (#6595) [static] Signed-off-by: Nicu Reut --- cluster/expected/observability/expected.json | 4 +- .../canton-bft/bft-ordering-performance.json | 109 ++++++++++++++++-- .../canton-bft/bft-ordering.json | 9 +- 3 files changed, 109 insertions(+), 13 deletions(-) diff --git a/cluster/expected/observability/expected.json b/cluster/expected/observability/expected.json index c6b72bb57d..7f4423f6ef 100644 --- a/cluster/expected/observability/expected.json +++ b/cluster/expected/observability/expected.json @@ -115,8 +115,8 @@ "inputs": { "apiVersion": "v1", "data": { - "bft-ordering-performance.json": "{\n \"annotations\": {\n \"list\": [\n {\n \"builtIn\": 1,\n \"datasource\": {\n \"type\": \"grafana\",\n \"uid\": \"-- Grafana --\"\n },\n \"enable\": true,\n \"hide\": true,\n \"iconColor\": \"rgba(0, 211, 255, 1)\",\n \"name\": \"Annotations & Alerts\",\n \"type\": \"dashboard\"\n }\n ]\n },\n \"editable\": true,\n \"fiscalYearStartMonth\": 0,\n \"graphTooltip\": 0,\n \"id\": 8,\n \"links\": [],\n \"liveNow\": false,\n \"panels\": [\n {\n \"collapsed\": false,\n \"gridPos\": {\n \"h\": 1,\n \"w\": 24,\n \"x\": 0,\n \"y\": 0\n },\n \"id\": 16,\n \"panels\": [],\n \"title\": \"Global\",\n \"type\": \"row\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 10,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": null\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n },\n \"unit\": \"s\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 12,\n \"w\": 12,\n \"x\": 0,\n \"y\": 1\n },\n \"id\": 14,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"histogram_quantile($percentile, sum by (namespace, job, node) (rate(daml_sequencer_bftordering_global_requests_ordering_latency_duration_seconds{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\"}[$__rate_interval])))\",\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Requests end-to-end ordering latency\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 10,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": null\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n },\n \"unit\": \"s\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 12,\n \"w\": 12,\n \"x\": 12,\n \"y\": 1\n },\n \"id\": 20,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"histogram_quantile($percentile, sum by (namespace, job, node, ordering_stage) (rate(daml_sequencer_bftordering_performance_ordering_stage_latency_duration_seconds{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\",ordering_stage=~\\\"batch-availability-total\\\"}[$__rate_interval])))\",\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Total batch dissemination and consensus time (permanence in availability module)\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"description\": \"Rate of blocks ordered and output to the read path.\",\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 0,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": null\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n },\n \"unit\": \"cps\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 17,\n \"w\": 8,\n \"x\": 0,\n \"y\": 13\n },\n \"id\": 107,\n \"options\": {\n \"legend\": {\n \"calcs\": [\n \"min\",\n \"max\",\n \"mean\"\n ],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"sum by (namespace, job, node, is_block_empty) (irate(daml_sequencer_bftordering_global_ordered_blocks_total{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\"}[$__rate_interval]))\",\n \"legendFormat\": \"{{namespace}}.{{node}} (empty: {{is_block_empty}})\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Throughput - blocks/s\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"description\": \"Rate of batches (proofs of availability) ordered and output to the read path.\",\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 0,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": null\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n },\n \"unit\": \"cps\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 17,\n \"w\": 8,\n \"x\": 8,\n \"y\": 13\n },\n \"id\": 108,\n \"options\": {\n \"legend\": {\n \"calcs\": [\n \"min\",\n \"max\",\n \"mean\"\n ],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"irate(daml_sequencer_bftordering_global_ordered_batches_total{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\"}[$__rate_interval])\",\n \"interval\": \"\",\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Throughput - batches/s\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 0,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": null\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n },\n \"unit\": \"cps\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 17,\n \"w\": 8,\n \"x\": 16,\n \"y\": 13\n },\n \"id\": 109,\n \"options\": {\n \"legend\": {\n \"calcs\": [\n \"min\",\n \"max\",\n \"mean\"\n ],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"exemplar\": false,\n \"expr\": \"sum by (namespace, job, node) (irate(daml_sequencer_bftordering_global_ordered_requests_total{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\"}[$__rate_interval]))\",\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Throughput - requests/s\",\n \"type\": \"timeseries\"\n },\n {\n \"collapsed\": true,\n \"gridPos\": {\n \"h\": 1,\n \"w\": 24,\n \"x\": 0,\n \"y\": 30\n },\n \"id\": 12,\n \"panels\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 10,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": null\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n },\n \"unit\": \"s\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 8,\n \"w\": 12,\n \"x\": 0,\n \"y\": 31\n },\n \"id\": 11,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"histogram_quantile($percentile, sum by(namespace, job, node) (rate(daml_sequencer_bftordering_performance_ordering_stage_latency_duration_seconds{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\",ordering_stage=~\\\"module-queue-PekkoP2PGrpcConnectionManagingActor\\\"}[$__rate_interval])))\",\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"PekkoP2PGrpcConnectionManagingActor queue latency\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 0,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": null\n }\n ]\n }\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 8,\n \"w\": 12,\n \"x\": 12,\n \"y\": 31\n },\n \"id\": 103,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"sum by (namespace, job, node) (daml_sequencer_bftordering_performance_moduleQueueSize_PekkoP2PGrpcConnectionManagingActor{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\"})\",\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"PekkoP2PGrpcConnectionManagingActor queue size\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"description\": \"Latency between sending a message and receiving it on the other side\",\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 10,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": null\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n },\n \"unit\": \"s\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 8,\n \"w\": 24,\n \"x\": 0,\n \"y\": 39\n },\n \"id\": 13,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"histogram_quantile($percentile, sum by (namespace, job, node, source_sequencer) (rate(daml_sequencer_bftordering_p2p_send_grpc_latency_duration_seconds{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\"}[$__rate_interval])))\",\n \"legendFormat\": \"(reporter: {{namespace}}.{{node}}) {{source_sequencer}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"P2P gRPC network latency\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 10,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": null\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n },\n \"unit\": \"s\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 8,\n \"w\": 12,\n \"x\": 0,\n \"y\": 47\n },\n \"id\": 17,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"single\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"histogram_quantile($percentile, sum by (namespace, job, node) (rate(daml_sequencer_bftordering_p2p_send_network_write_latency_duration_seconds{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\"}[$__rate_interval])))\",\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"P2P network client write latency\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 10,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": null\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n },\n \"unit\": \"s\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 8,\n \"w\": 12,\n \"x\": 12,\n \"y\": 47\n },\n \"id\": 15,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"single\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"histogram_quantile($percentile, sum by(namespace, job, node) (rate(daml_sequencer_bftordering_p2p_receive_processing_latency_duration_seconds{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\"}[$__rate_interval])))\",\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"P2P receive processing latency\",\n \"type\": \"timeseries\"\n }\n ],\n \"title\": \"Networking\",\n \"type\": \"row\"\n },\n {\n \"collapsed\": true,\n \"gridPos\": {\n \"h\": 1,\n \"w\": 24,\n \"x\": 0,\n \"y\": 31\n },\n \"id\": 7,\n \"panels\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 10,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": null\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n },\n \"unit\": \"s\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 6,\n \"w\": 12,\n \"x\": 0,\n \"y\": 32\n },\n \"id\": 18,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"histogram_quantile($percentile, sum by (namespace, job, node) (rate(daml_sequencer_bftordering_performance_ordering_stage_latency_duration_seconds{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\",ordering_stage=~\\\"module-queue-mempool\\\"}[$__rate_interval])))\",\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Mempool module queue latency\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 0,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": null\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n }\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 6,\n \"w\": 12,\n \"x\": 12,\n \"y\": 32\n },\n \"id\": 101,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"daml_sequencer_bftordering_performance_moduleQueueSize_mempool{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\"}\",\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Mempool module queue size\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 10,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": null\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n },\n \"unit\": \"s\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 6,\n \"w\": 12,\n \"x\": 0,\n \"y\": 38\n },\n \"id\": 10,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"histogram_quantile($percentile, sum by (namespace, job, node) (rate(daml_sequencer_bftordering_performance_ordering_stage_latency_duration_seconds{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\",ordering_stage=~\\\"module-queue-availability\\\"}[$__rate_interval])))\",\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Availability module queue latency\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 0,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": null\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n }\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 6,\n \"w\": 12,\n \"x\": 12,\n \"y\": 38\n },\n \"id\": 102,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"daml_sequencer_bftordering_performance_moduleQueueSize_availability{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\"}\",\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Availability module queue size\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"description\": \"Time waited for a batch while there are outstanding consensus proposal requests and no dissemination is in progress\",\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 10,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": null\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n },\n \"unit\": \"s\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 6,\n \"w\": 12,\n \"x\": 0,\n \"y\": 44\n },\n \"id\": 24,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"histogram_quantile($percentile, sum by (namespace, job, node) (rate(daml_sequencer_bftordering_performance_ordering_stage_latency_duration_seconds{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\",ordering_stage=~\\\"batch-wait\\\"}[$__rate_interval])))\",\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Time spent waiting for batches\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"description\": \"Cumulative latency of a batch dissemination until a PoA is formed and it can be present multiple times for a given batch if it regresses due to topology changes\",\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 10,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": null\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n },\n \"unit\": \"s\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 6,\n \"w\": 12,\n \"x\": 12,\n \"y\": 44\n },\n \"id\": 21,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"histogram_quantile($percentile, sum by (namespace, job, node) (rate(daml_sequencer_bftordering_performance_ordering_stage_latency_duration_seconds{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\",ordering_stage=~\\\"batch-dissemination-total\\\"}[$__rate_interval])))\",\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Total dissemination time\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"description\": \"Insertion in proposal queue until next event, like re-sign, re-dissemination, [re-]proposal or batch ordered (emitted 1 or more times per batch)\",\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 10,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": null\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n },\n \"unit\": \"s\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 6,\n \"w\": 12,\n \"x\": 0,\n \"y\": 50\n },\n \"id\": 23,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"histogram_quantile($percentile, sum by (namespace, job, node) (rate(daml_sequencer_bftordering_performance_ordering_stage_latency_duration_seconds{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\",ordering_stage=~\\\"batch-queued-for-block-inclusion\\\"}[$__rate_interval])))\",\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Time waited for batch inclusion in consensus proposal\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"description\": \"Rate of regressions of a single batch due to topology changes\",\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 10,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": null\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n },\n \"unit\": \"none\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 6,\n \"w\": 12,\n \"x\": 12,\n \"y\": 50\n },\n \"id\": 3,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"irate(daml_sequencer_bftordering_availability_batch_regressions{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\"}[$__rate_interval])\",\n \"legendFormat\": \"{{namespace}}.{{node}}, {{stage}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Batch dissemination regressions rate\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 10,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": null\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n },\n \"unit\": \"s\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 6,\n \"w\": 12,\n \"x\": 0,\n \"y\": 56\n },\n \"id\": 4,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"histogram_quantile($percentile, sum by (namespace, job, node) (rate(daml_sequencer_bftordering_performance_ordering_stage_latency_duration_seconds{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\",ordering_stage=~\\\"availability-hash-batchId\\\"}[$__rate_interval])))\",\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Batch ID hashing latency\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 10,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": null\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n },\n \"unit\": \"s\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 6,\n \"w\": 12,\n \"x\": 12,\n \"y\": 56\n },\n \"id\": 5,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"histogram_quantile($percentile, sum by (namespace, job, node) (rate(daml_sequencer_bftordering_performance_ordering_stage_latency_duration_seconds{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\",ordering_stage=~\\\"availability-sign-local-batchId\\\"}[$__rate_interval])))\",\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Local Batch ID signing latency\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"description\": \"Insertion in batch queue until extraction and batch send to availability\",\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 10,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": null\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n },\n \"unit\": \"s\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 6,\n \"w\": 12,\n \"x\": 0,\n \"y\": 62\n },\n \"id\": 9,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"histogram_quantile($percentile, sum by (namespace, job, node) (rate(daml_sequencer_bftordering_performance_ordering_stage_latency_duration_seconds{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\",ordering_stage=~\\\"request-queued-for-batch-inclusion\\\"}[$__rate_interval])))\",\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Request batch inclusion latency\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 10,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": null\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n },\n \"unit\": \"s\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 6,\n \"w\": 12,\n \"x\": 12,\n \"y\": 62\n },\n \"id\": 6,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"histogram_quantile($percentile, sum by (namespace, job, node) (rate(daml_sequencer_bftordering_performance_ordering_stage_latency_duration_seconds{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\",ordering_stage=~\\\"availability-sign-remote-batchId\\\"}[$__rate_interval])))\",\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Remote batch ID signing latency\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 10,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": null\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n },\n \"unit\": \"s\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 6,\n \"w\": 12,\n \"x\": 0,\n \"y\": 68\n },\n \"id\": 26,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"histogram_quantile($percentile, sum by (namespace, job, node) (rate(daml_sequencer_bftordering_performance_ordering_stage_latency_duration_seconds{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\",ordering_stage=~\\\"availability-sign-local-batches\\\"}[$__rate_interval])))\",\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Sign local batches\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 10,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": null\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n },\n \"unit\": \"s\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 6,\n \"w\": 12,\n \"x\": 12,\n \"y\": 68\n },\n \"id\": 8,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"histogram_quantile($percentile, sum by (namespace, job, node) (rate(daml_sequencer_bftordering_performance_ordering_stage_latency_duration_seconds{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\",ordering_stage=~\\\"availability-signature-verify-ack\\\"}[$__rate_interval])))\",\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Batch ID signature verification\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 10,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": null\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n },\n \"unit\": \"s\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 6,\n \"w\": 12,\n \"x\": 0,\n \"y\": 74\n },\n \"id\": 82,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"histogram_quantile($percentile, sum by (namespace, job, node) (rate(daml_sequencer_bftordering_performance_ordering_stage_latency_duration_seconds{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\",ordering_stage=~\\\"com.digitalasset.canton.synchronizer.sequencer.block.bftordering.core.modules.availability.data.db.DbAvailabilityStore.addBatch\\\"}[$__rate_interval])))\",\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Insert batch\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 10,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": null\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n },\n \"unit\": \"s\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 6,\n \"w\": 12,\n \"x\": 12,\n \"y\": 74\n },\n \"id\": 28,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"histogram_quantile($percentile, sum by (namespace, job, node) (rate(daml_sequencer_bftordering_performance_ordering_stage_latency_duration_seconds{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\",ordering_stage=~\\\"com.digitalasset.canton.synchronizer.sequencer.block.bftordering.core.modules.availability.data.db.DbAvailabilityStore.fetchBatches\\\"}[$__rate_interval])))\",\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Fetch local batches from DB\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 10,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": null\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n },\n \"unit\": \"s\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 6,\n \"w\": 12,\n \"x\": 0,\n \"y\": 80\n },\n \"id\": 22,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"histogram_quantile($percentile, sum by (namespace, job, node) (rate(daml_sequencer_bftordering_performance_ordering_stage_latency_duration_seconds{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\",ordering_stage=~\\\"batch-validation\\\"}[$__rate_interval])))\",\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Batch validation\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"description\": \"Summary of cache hits, misses, and evictions for the Availability store's batch data cache\",\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 10,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"decimals\": 0,\n \"links\": [],\n \"mappings\": [],\n \"min\": 0,\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": null\n }\n ]\n },\n \"unit\": \"none\"\n },\n \"overrides\": [\n {\n \"matcher\": {\n \"id\": \"byName\",\n \"options\": \"Height for last 3 hours\"\n },\n \"properties\": [\n {\n \"id\": \"color\",\n \"value\": {\n \"fixedColor\": \"#447ebc\",\n \"mode\": \"fixed\"\n }\n }\n ]\n },\n {\n \"matcher\": {\n \"id\": \"byName\",\n \"options\": \"Total Transactions for last 3 hours\"\n },\n \"properties\": [\n {\n \"id\": \"color\",\n \"value\": {\n \"fixedColor\": \"#ef843c\",\n \"mode\": \"fixed\"\n }\n }\n ]\n }\n ]\n },\n \"gridPos\": {\n \"h\": 6,\n \"w\": 12,\n \"x\": 12,\n \"y\": 80\n },\n \"hideTimeOverride\": false,\n \"id\": 110,\n \"options\": {\n \"legend\": {\n \"calcs\": [\n \"mean\",\n \"max\"\n ],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"pluginVersion\": \"10.1.5\",\n \"targets\": [\n {\n \"datasource\": {\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"sum by (namespace, job, node) (irate(daml_cache_hits{namespace=~\\\"$namespace\\\", job=~\\\"$job\\\", node=~\\\"$node\\\", cache=\\\"batch-cache\\\"}[$__rate_interval]))\",\n \"format\": \"time_series\",\n \"instant\": false,\n \"interval\": \"\",\n \"intervalFactor\": 1,\n \"legendFormat\": \"{{namespace}}.{{node}} Cache Hits\",\n \"refId\": \"A\"\n },\n {\n \"datasource\": {\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"sum by (namespace, job, node) (irate(daml_cache_misses{namespace=~\\\"$namespace\\\", job=~\\\"$job\\\", node=~\\\"$node\\\", cache=\\\"batch-cache\\\"}[$__rate_interval]))\",\n \"format\": \"time_series\",\n \"hide\": false,\n \"instant\": false,\n \"interval\": \"\",\n \"intervalFactor\": 1,\n \"legendFormat\": \"{{namespace}}.{{node}} Cache Misses\",\n \"refId\": \"B\"\n },\n {\n \"datasource\": {\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"sum by (namespace, job, node) (irate(daml_cache_evictions{namespace=~\\\"$namespace\\\", job=~\\\"$job\\\", node=~\\\"$node\\\", cache=\\\"batch-cache\\\"}[$__rate_interval]))\",\n \"format\": \"time_series\",\n \"hide\": false,\n \"instant\": false,\n \"interval\": \"\",\n \"intervalFactor\": 1,\n \"legendFormat\": \"{{namespace}}.{{node}} Cache Evictions\",\n \"refId\": \"C\"\n }\n ],\n \"title\": \"Availability Store Cache Statistics\",\n \"type\": \"timeseries\"\n }\n ],\n \"title\": \"Mempool+Availability\",\n \"type\": \"row\"\n },\n {\n \"collapsed\": true,\n \"gridPos\": {\n \"h\": 1,\n \"w\": 24,\n \"x\": 0,\n \"y\": 32\n },\n \"id\": 45,\n \"panels\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 10,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": null\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n },\n \"unit\": \"s\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 7,\n \"w\": 12,\n \"x\": 0,\n \"y\": 33\n },\n \"id\": 80,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"histogram_quantile($percentile, sum by (namespace, job, node) (rate(daml_sequencer_bftordering_performance_ordering_stage_latency_duration_seconds{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\",ordering_stage=~\\\"module-queue-consensus\\\"}[$__rate_interval])))\",\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Consensus module queue latency\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 0,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": null\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n }\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 7,\n \"w\": 12,\n \"x\": 12,\n \"y\": 33\n },\n \"id\": 104,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"daml_sequencer_bftordering_performance_moduleQueueSize_consensus{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\"}\",\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Consensus module queue size\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 10,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": null\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n },\n \"unit\": \"s\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 7,\n \"w\": 12,\n \"x\": 0,\n \"y\": 40\n },\n \"id\": 81,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"histogram_quantile($percentile, sum by (namespace, job, node) (rate(daml_sequencer_bftordering_performance_ordering_stage_latency_duration_seconds{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\",ordering_stage=~\\\"module-queue-segment-module\\\"}[$__rate_interval])))\",\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Segment module queue latency\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 0,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": null\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n }\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 7,\n \"w\": 12,\n \"x\": 12,\n \"y\": 40\n },\n \"id\": 105,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"daml_sequencer_bftordering_performance_moduleQueueSize_segment_module{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\"}\",\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Segment module queue size\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"description\": \"Block commit time at the consensus (PBFT) level.\",\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 10,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"decimals\": 2,\n \"mappings\": [\n {\n \"options\": {\n \"match\": \"null\",\n \"result\": {\n \"text\": \"N/A\"\n }\n },\n \"type\": \"special\"\n }\n ],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": null\n },\n {\n \"color\": \"red\",\n \"value\": 2\n }\n ]\n },\n \"unit\": \"s\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 7,\n \"w\": 12,\n \"x\": 0,\n \"y\": 47\n },\n \"hideTimeOverride\": true,\n \"id\": 39,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"pluginVersion\": \"10.4.0\",\n \"targets\": [\n {\n \"datasource\": {\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"exemplar\": false,\n \"expr\": \"histogram_quantile($percentile, sum by (namespace, job, node) (rate(daml_sequencer_bftordering_consensus_commit_latency_duration_seconds{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\"}[$__rate_interval])))\",\n \"format\": \"time_series\",\n \"instant\": false,\n \"interval\": \"30s\",\n \"intervalFactor\": 1,\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Consensus Block Latency\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"description\": \"Time elapsed between sending a PrePrepare and seeing that the block has been ordered\",\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 10,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": null\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n },\n \"unit\": \"s\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 7,\n \"w\": 12,\n \"x\": 12,\n \"y\": 47\n },\n \"id\": 46,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"histogram_quantile($percentile, sum by (namespace, job, node) (rate(daml_sequencer_bftordering_performance_ordering_stage_latency_duration_seconds{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\",ordering_stage=~\\\"consensus-segment-proposal-to-commit-latency\\\"}[$__rate_interval])))\",\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Consensus segment block proposal to commit latency\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"description\": \"Time elapsed between ordered blocks proposed by a segment\",\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 10,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\"\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n },\n \"unit\": \"s\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 6,\n \"w\": 12,\n \"x\": 0,\n \"y\": 54\n },\n \"id\": 88,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"histogram_quantile($percentile, sum by (namespace, job, node) (rate(daml_sequencer_bftordering_performance_ordering_stage_latency_duration_seconds{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\",ordering_stage=~\\\"consensus-segment-block-commit-latency\\\"}[$__rate_interval])))\",\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Consensus segment block ordering latency\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"description\": \"Time between a proposal request to the availability module needed to continue a segment and a PrePrepare being built\",\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 10,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\"\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n },\n \"unit\": \"s\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 6,\n \"w\": 12,\n \"x\": 12,\n \"y\": 54\n },\n \"id\": 87,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"histogram_quantile($percentile, sum by (namespace, job, node) (rate(daml_sequencer_bftordering_performance_ordering_stage_latency_duration_seconds{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\",ordering_stage=~\\\"consensus-block-proposal-wait\\\"}[$__rate_interval])))\",\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Wait for proposal\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"description\": \"Time between the epoch completion and the start of the next epoch\",\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 10,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\"\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n },\n \"unit\": \"s\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 7,\n \"w\": 12,\n \"x\": 0,\n \"y\": 60\n },\n \"id\": 86,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"histogram_quantile($percentile, sum by (namespace, job, node) (rate(daml_sequencer_bftordering_performance_ordering_stage_latency_duration_seconds{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\",ordering_stage=~\\\"consensus-epoch-start-wait\\\"}[$__rate_interval])))\",\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Wait for epoch start\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"description\": \"Time between the last led segment's completion and the epoch completion\",\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 10,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\"\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n },\n \"unit\": \"s\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 7,\n \"w\": 12,\n \"x\": 12,\n \"y\": 60\n },\n \"id\": 83,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"histogram_quantile($percentile, sum by (namespace, job, node) (rate(daml_sequencer_bftordering_performance_ordering_stage_latency_duration_seconds{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\",ordering_stage=~\\\"consensus-epoch-completion-wait\\\"}[$__rate_interval])))\",\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Wait for epoch completion\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 10,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\"\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n },\n \"unit\": \"s\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 6,\n \"w\": 12,\n \"x\": 0,\n \"y\": 67\n },\n \"id\": 63,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"histogram_quantile($percentile, sum by (namespace, job, node) (rate(daml_sequencer_bftordering_performance_ordering_stage_latency_duration_seconds{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\",ordering_stage=~\\\"com.digitalasset.canton.synchronizer.sequencer.block.bftordering.core.modules.consensus.iss.data.db.DbEpochStore.startEpoch\\\"}[$__rate_interval])))\",\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Start epoch (DB)\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 10,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\"\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n },\n \"unit\": \"s\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 6,\n \"w\": 12,\n \"x\": 12,\n \"y\": 67\n },\n \"id\": 47,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"histogram_quantile($percentile, sum by (namespace, job, node) (rate(daml_sequencer_bftordering_performance_ordering_stage_latency_duration_seconds{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\",ordering_stage=~\\\"com.digitalasset.canton.synchronizer.sequencer.block.bftordering.core.modules.consensus.iss.data.db.DbEpochStore.completeEpoch\\\"}[$__rate_interval])))\",\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Complete epoch (DB)\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 10,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\"\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n },\n \"unit\": \"s\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 7,\n \"w\": 12,\n \"x\": 0,\n \"y\": 73\n },\n \"id\": 64,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"histogram_quantile($percentile, sum by (namespace, job, node) (rate(daml_sequencer_bftordering_performance_ordering_stage_latency_duration_seconds{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\",ordering_stage=~\\\"com.digitalasset.canton.synchronizer.sequencer.block.bftordering.core.modules.consensus.iss.data.db.DbEpochStore.addPrePrepare\\\"}[$__rate_interval])))\",\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Insert pre-prepare\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 10,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\"\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n },\n \"unit\": \"s\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 7,\n \"w\": 12,\n \"x\": 12,\n \"y\": 73\n },\n \"id\": 50,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"histogram_quantile($percentile, sum by (namespace, job, node) (rate(daml_sequencer_bftordering_performance_ordering_stage_latency_duration_seconds{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\",ordering_stage=~\\\"com.digitalasset.canton.synchronizer.sequencer.block.bftordering.core.modules.consensus.iss.data.db.DbEpochStore.addPreparesAtomically\\\"}[$__rate_interval])))\",\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Insert prepares\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 10,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\"\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n },\n \"unit\": \"s\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 6,\n \"w\": 12,\n \"x\": 0,\n \"y\": 80\n },\n \"id\": 52,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"histogram_quantile($percentile, sum by (namespace, job, node) (rate(daml_sequencer_bftordering_performance_ordering_stage_latency_duration_seconds{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\",ordering_stage=~\\\"com.digitalasset.canton.synchronizer.sequencer.block.bftordering.core.modules.consensus.iss.data.db.DbEpochStore.addOrderedBlockAtomically\\\"}[$__rate_interval])))\",\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Insert ordered block\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 10,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\"\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n },\n \"unit\": \"s\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 6,\n \"w\": 12,\n \"x\": 12,\n \"y\": 80\n },\n \"id\": 66,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"histogram_quantile($percentile, sum by (namespace, job, node) (rate(daml_sequencer_bftordering_performance_ordering_stage_latency_duration_seconds{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\",ordering_stage=~\\\"consensus-signature-verify-poa-ack\\\"}[$__rate_interval])))\",\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Check PoA ack signature\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 10,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\"\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n },\n \"unit\": \"s\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 7,\n \"w\": 12,\n \"x\": 0,\n \"y\": 86\n },\n \"id\": 68,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"histogram_quantile($percentile, sum by (namespace, job, node) (rate(daml_sequencer_bftordering_performance_ordering_stage_latency_duration_seconds{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\",ordering_stage=~\\\"consensus-validate-signed-message\\\"}[$__rate_interval])))\",\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Validate message\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 10,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\"\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n },\n \"unit\": \"s\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 7,\n \"w\": 12,\n \"x\": 12,\n \"y\": 86\n },\n \"id\": 76,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"histogram_quantile($percentile, sum by (namespace, job, node) (rate(daml_sequencer_bftordering_performance_ordering_stage_latency_duration_seconds{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\",ordering_stage=~\\\"sign-BftSignedConsensusMessage\\\"}[$__rate_interval])))\",\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Sign message\",\n \"type\": \"timeseries\"\n }\n ],\n \"title\": \"Consensus - main protocol\",\n \"type\": \"row\"\n },\n {\n \"collapsed\": true,\n \"gridPos\": {\n \"h\": 1,\n \"w\": 24,\n \"x\": 0,\n \"y\": 33\n },\n \"id\": 89,\n \"panels\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 10,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": null\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n },\n \"unit\": \"none\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 7,\n \"w\": 24,\n \"x\": 0,\n \"y\": 34\n },\n \"id\": 51,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"irate(daml_sequencer_bftordering_consensus_epoch_view_changes{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\"}[$__rate_interval])\",\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"View changes occurred (rate)\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 10,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": null\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n },\n \"unit\": \"s\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 7,\n \"w\": 12,\n \"x\": 0,\n \"y\": 41\n },\n \"id\": 84,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"histogram_quantile($percentile, sum by (namespace, job, node) (rate(daml_sequencer_bftordering_performance_ordering_stage_latency_duration_seconds{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\",ordering_stage=~\\\"com.digitalasset.canton.synchronizer.sequencer.block.bftordering.core.modules.consensus.iss.data.db.DbEpochStore.addViewChangeMessage\\\"}[$__rate_interval])))\",\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Insert view change message\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 10,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": null\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n },\n \"unit\": \"s\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 7,\n \"w\": 12,\n \"x\": 12,\n \"y\": 41\n },\n \"id\": 77,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"histogram_quantile($percentile, sum by (namespace, job, node) (rate(daml_sequencer_bftordering_performance_ordering_stage_latency_duration_seconds{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\",ordering_stage=~\\\"consensus-postponed-view-messages-queue-latency\\\"}[$__rate_interval])))\",\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Postponed view messages queue latency\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 0,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\"\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n }\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 7,\n \"w\": 12,\n \"x\": 0,\n \"y\": 48\n },\n \"id\": 97,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"irate(daml_sequencer_bftordering_consensus_postponed_view_messages_queue_size{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\"}[$__rate_interval])\",\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Postponed view messages queue size\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 0,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\"\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n }\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 7,\n \"w\": 12,\n \"x\": 12,\n \"y\": 48\n },\n \"id\": 95,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"daml_sequencer_bftordering_consensus_postponed_view_messages_queue_max_size{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\"}\",\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Postponed view messages queue max size\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 0,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\"\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n }\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 7,\n \"w\": 12,\n \"x\": 0,\n \"y\": 55\n },\n \"id\": 94,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"irate(daml_sequencer_bftordering_consensus_postponed_view_messages_dropped_total{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\"}[$__rate_interval])\",\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Postponed view messages dropped (rate)\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 0,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\"\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n }\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 7,\n \"w\": 12,\n \"x\": 12,\n \"y\": 55\n },\n \"id\": 100,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"irate(daml_sequencer_bftordering_consensus_postponed_view_messages_duplicates_total{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\"}[$__rate_interval])\",\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Postponed view messages duplicated (rate)\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 0,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": null\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n },\n \"unit\": \"s\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 7,\n \"w\": 12,\n \"x\": 0,\n \"y\": 62\n },\n \"id\": 112,\n \"options\": {\n \"legend\": {\n \"calcs\": [\n \"min\",\n \"mean\",\n \"max\"\n ],\n \"displayMode\": \"table\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"histogram_quantile($percentile, daml_sequencer_bftordering_consensus_view_change_progress_latency_duration_seconds{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\"})\",\n \"interval\": \"\",\n \"legendFormat\": \"(reporter: {{namespace}}.{{node}}) {{Leader}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Time until progress in view\",\n \"type\": \"timeseries\"\n }\n ],\n \"title\": \"Consensus - view change\",\n \"type\": \"row\"\n },\n {\n \"collapsed\": true,\n \"gridPos\": {\n \"h\": 1,\n \"w\": 24,\n \"x\": 0,\n \"y\": 34\n },\n \"id\": 90,\n \"panels\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 10,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": null\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n },\n \"unit\": \"s\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 7,\n \"w\": 12,\n \"x\": 0,\n \"y\": 35\n },\n \"id\": 72,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"histogram_quantile($percentile, sum by (namespace, job, node) (rate(daml_sequencer_bftordering_performance_ordering_stage_latency_duration_seconds{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\",ordering_stage=~\\\"consensus-validate-consensus-certificate\\\"}[$__rate_interval])))\",\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Validate state transfer consensus certificate\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"description\": \"Time to transfer a given epoch from peer(s)\",\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 10,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": null\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n },\n \"unit\": \"s\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 7,\n \"w\": 12,\n \"x\": 12,\n \"y\": 80\n },\n \"id\": 111,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": false\n },\n \"tooltip\": {\n \"mode\": \"single\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"histogram_quantile($percentile, sum(rate(daml_sequencer_bftordering_performance_ordering_stage_latency_duration_seconds{reporting_sequencer=\\\"$reporting_sequencer\\\", ordering_stage=~\\\"state-transfer-total-epoch-transfer-latency\\\"}[$__rate_interval])))\",\n \"legendFormat\": \"Data transfer\",\n \"range\": true,\n \"refId\": \"A\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"histogram_quantile($percentile, sum(rate(daml_sequencer_bftordering_performance_ordering_stage_latency_duration_seconds{reporting_sequencer=\\\"$reporting_sequencer\\\", ordering_stage=~\\\"state-transfer-store-epochs\\\"}[$__rate_interval])))\",\n \"hide\": false,\n \"legendFormat\": \"Complete + start DB query\",\n \"range\": true,\n \"refId\": \"B\"\n }\n ],\n \"title\": \"Epoch Transfer Duration\",\n \"transformations\": [\n {\n \"id\": \"calculateField\",\n \"options\": {\n \"alias\": \"Total epoch transfer duration\",\n \"binary\": {\n \"left\": \"Data transfer\",\n \"reducer\": \"sum\",\n \"right\": \"Complete + start DB query\"\n },\n \"mode\": \"binary\",\n \"reduce\": {\n \"reducer\": \"sum\"\n }\n }\n }\n ],\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 10,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": null\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n },\n \"unit\": \"s\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 7,\n \"w\": 12,\n \"x\": 0,\n \"y\": 42\n },\n \"id\": 91,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"histogram_quantile($percentile, sum by (namespace, job, node) (rate(daml_sequencer_bftordering_performance_ordering_stage_latency_duration_seconds{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\",ordering_stage=~\\\"state-transfer-postponed-consensus-messages-queue-latency\\\"}[$__rate_interval])))\",\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Postponed consensus messages queue latency\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 0,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": null\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n }\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 7,\n \"w\": 12,\n \"x\": 12,\n \"y\": 42\n },\n \"id\": 96,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"daml_sequencer_bftordering_consensus_state_transfer_postponed_consensus_messages_queue_size{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\"}\",\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Postponed consensus messages queue size\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 0,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\"\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n }\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 7,\n \"w\": 12,\n \"x\": 0,\n \"y\": 49\n },\n \"id\": 98,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"daml_sequencer_bftordering_consensus_state_transfer_postponed_consensus_messages_queue_max_size{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\"}\",\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Postponed consensus messages queue max size\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 0,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\"\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n }\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 7,\n \"w\": 12,\n \"x\": 12,\n \"y\": 49\n },\n \"id\": 99,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"irate(daml_sequencer_bftordering_consensus_state_transfer_postponed_consensus_messages_dropped{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\"}[$__rate_interval])\",\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Postponed consensus messages dropped (rate)\",\n \"type\": \"timeseries\"\n }\n ],\n \"title\": \"Consensus - state transfer\",\n \"type\": \"row\"\n },\n {\n \"collapsed\": true,\n \"gridPos\": {\n \"h\": 1,\n \"w\": 24,\n \"x\": 0,\n \"y\": 35\n },\n \"id\": 38,\n \"panels\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 0,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": null\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n }\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 6,\n \"w\": 12,\n \"x\": 0,\n \"y\": 36\n },\n \"id\": 85,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"irate(daml_sequencer_bftordering_consensus_incoming_retransmission_requests_total{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\"}[$__rate_interval])\",\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Incoming retransmission requests rate\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 0,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": null\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n }\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 6,\n \"w\": 12,\n \"x\": 12,\n \"y\": 36\n },\n \"id\": 40,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"irate(daml_sequencer_bftordering_consensus_outgoing_retransmission_requests_total{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\"}[$__rate_interval])\",\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Outgoing retransmission requests rate\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 0,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": null\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n }\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 6,\n \"w\": 12,\n \"x\": 0,\n \"y\": 42\n },\n \"id\": 41,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"irate(daml_sequencer_bftordering_consensus_retransmitted_messages_total{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\"}[$__rate_interval])\",\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Retransmitted messages rate\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 0,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": null\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n }\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 6,\n \"w\": 12,\n \"x\": 12,\n \"y\": 42\n },\n \"id\": 42,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"irate(daml_sequencer_bftordering_consensus_retransmitted_commit_certificates_total{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\"}[$__rate_interval])\",\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Retransmitted commit certificates rate\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 10,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\"\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n },\n \"unit\": \"s\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 6,\n \"w\": 12,\n \"x\": 0,\n \"y\": 48\n },\n \"id\": 78,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"histogram_quantile($percentile, sum by (namespace, job, node) (rate(daml_sequencer_bftordering_performance_ordering_stage_latency_duration_seconds{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\",ordering_stage=~\\\"sign-BftSignedRetransmissionMessage\\\"}[$__rate_interval])))\",\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Sign retransmission message\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 10,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\"\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n },\n \"unit\": \"s\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 6,\n \"w\": 12,\n \"x\": 12,\n \"y\": 48\n },\n \"id\": 79,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"histogram_quantile($percentile, sum by (namespace, job, node) (rate(daml_sequencer_bftordering_performance_ordering_stage_latency_duration_seconds{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\",ordering_stage=~\\\"verify-signature-BftSignedRetransmissionMessage\\\"}[$__rate_interval])))\",\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Verify retransmission message signature\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 0,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\"\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n }\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 6,\n \"w\": 12,\n \"x\": 0,\n \"y\": 54\n },\n \"id\": 43,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"irate(daml_sequencer_bftordering_consensus_discarded_wrong_epoch_retransmission_responses_total{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\"}[$__rate_interval])\",\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Retransmission responses discarded due to wrong epoch - rate\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 0,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\"\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n }\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 6,\n \"w\": 12,\n \"x\": 12,\n \"y\": 54\n },\n \"id\": 44,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"irate(daml_sequencer_bftordering_consensus_discarded_rate_limited_retransmission_requests_total{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\"}[$__rate_interval])\",\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Retransmission requests discarded due to rate limiting - rate\",\n \"type\": \"timeseries\"\n }\n ],\n \"title\": \"Consensus - retransmissions\",\n \"type\": \"row\"\n },\n {\n \"collapsed\": true,\n \"gridPos\": {\n \"h\": 1,\n \"w\": 24,\n \"x\": 0,\n \"y\": 36\n },\n \"id\": 59,\n \"panels\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 10,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": null\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n },\n \"unit\": \"s\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 8,\n \"w\": 12,\n \"x\": 0,\n \"y\": 37\n },\n \"id\": 48,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"histogram_quantile($percentile, sum by (namespace, job, node) (rate(daml_sequencer_bftordering_performance_ordering_stage_latency_duration_seconds{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\",ordering_stage=~\\\"com.digitalasset.canton.synchronizer.sequencer.block.bftordering.core.modules.consensus.iss.data.db.DbEpochStore.latestEpoch\\\"}[$__rate_interval])))\",\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Load latest epoch\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 10,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": null\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n },\n \"unit\": \"s\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 8,\n \"w\": 12,\n \"x\": 12,\n \"y\": 37\n },\n \"id\": 53,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"histogram_quantile($percentile, sum by (namespace, job, node) (rate(daml_sequencer_bftordering_performance_ordering_stage_latency_duration_seconds{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\",ordering_stage=~\\\"com.digitalasset.canton.synchronizer.sequencer.block.bftordering.core.modules.consensus.iss.data.db.DbEpochStore.loadEpochProgress\\\"}[$__rate_interval])))\",\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Load epoch progress\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 10,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": null\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n },\n \"unit\": \"s\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 8,\n \"w\": 24,\n \"x\": 0,\n \"y\": 45\n },\n \"id\": 54,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"histogram_quantile($percentile, sum by (namespace, job, node) (rate(daml_sequencer_bftordering_performance_ordering_stage_latency_duration_seconds{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\",ordering_stage=~\\\"com.digitalasset.canton.synchronizer.sequencer.block.bftordering.core.modules.consensus.iss.data.db.DbEpochStore.loadCompleteBlocks\\\"}[$__rate_interval])))\",\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Load completed blocks\",\n \"type\": \"timeseries\"\n }\n ],\n \"title\": \"Consensus - CFT\",\n \"type\": \"row\"\n },\n {\n \"collapsed\": true,\n \"gridPos\": {\n \"h\": 1,\n \"w\": 24,\n \"x\": 0,\n \"y\": 37\n },\n \"id\": 29,\n \"panels\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 10,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": null\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n },\n \"unit\": \"s\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 7,\n \"w\": 12,\n \"x\": 0,\n \"y\": 38\n },\n \"id\": 55,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"histogram_quantile($percentile, sum by (namespace, job, node) (rate(daml_sequencer_bftordering_performance_ordering_stage_latency_duration_seconds{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\",ordering_stage=~\\\"module-queue-output\\\"}[$__rate_interval])))\",\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Output module queue latency\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 0,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": null\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n }\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 7,\n \"w\": 12,\n \"x\": 12,\n \"y\": 38\n },\n \"id\": 106,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"daml_sequencer_bftordering_performance_moduleQueueSize_output{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\"}\",\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Output module queue size\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"description\": \"Time needed to inspect requests within a block\",\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 10,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": null\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n },\n \"unit\": \"s\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 7,\n \"w\": 12,\n \"x\": 0,\n \"y\": 45\n },\n \"id\": 36,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"histogram_quantile($percentile, sum by (namespace, job, node) (rate(daml_sequencer_bftordering_performance_ordering_stage_latency_duration_seconds{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\",ordering_stage=~\\\"output-block-inspection\\\"}[$__rate_interval])))\",\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Block inspection\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 10,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": null\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n },\n \"unit\": \"s\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 7,\n \"w\": 12,\n \"x\": 12,\n \"y\": 45\n },\n \"id\": 30,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"histogram_quantile($percentile, sum by (namespace, job, node) (rate(daml_sequencer_bftordering_performance_ordering_stage_latency_duration_seconds{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\",ordering_stage=~\\\"output-block-fetch-batches\\\"}[$__rate_interval])))\",\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Total block batches fetch time\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 10,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\"\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n },\n \"unit\": \"s\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 7,\n \"w\": 12,\n \"x\": 0,\n \"y\": 52\n },\n \"id\": 37,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"histogram_quantile($percentile, sum by (namespace, job, node) (rate(daml_sequencer_bftordering_performance_ordering_stage_latency_duration_seconds{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\",ordering_stage=~\\\"com.digitalasset.canton.synchronizer.sequencer.block.bftordering.core.modules.output.data.db.DbOutputMetadataStore.insertBlockIfMissing\\\"}[$__rate_interval])))\",\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Insert block\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 10,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\"\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n },\n \"unit\": \"s\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 7,\n \"w\": 12,\n \"x\": 12,\n \"y\": 52\n },\n \"id\": 34,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": false\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"histogram_quantile($percentile, sum by (namespace, job, node) (rate(daml_sequencer_bftordering_topology_query_latency_duration_seconds{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\"}[$__rate_interval])))\",\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Query topology\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 10,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\"\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n },\n \"unit\": \"s\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 7,\n \"w\": 12,\n \"x\": 0,\n \"y\": 59\n },\n \"id\": 31,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"histogram_quantile($percentile, sum by (namespace, job, node) (rate(daml_sequencer_bftordering_performance_ordering_stage_latency_duration_seconds{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\",ordering_stage=~\\\"com.digitalasset.canton.synchronizer.sequencer.block.bftordering.core.modules.output.data.db.DbOutputMetadataStore.insertLeaderSelectionPolicyState\\\"}[$__rate_interval])))\",\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Save blacklist leader selection policy state\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 10,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\"\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n },\n \"unit\": \"s\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 7,\n \"w\": 12,\n \"x\": 12,\n \"y\": 59\n },\n \"id\": 32,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"histogram_quantile($percentile, sum by (namespace, job, node) (rate(daml_sequencer_bftordering_performance_ordering_stage_latency_duration_seconds{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\",ordering_stage=~\\\"com.digitalasset.canton.synchronizer.sequencer.block.bftordering.core.modules.output.data.db.DbOutputMetadataStore.insertEpochIfMissing\\\"}[$__rate_interval])))\",\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Insert epoch metadata\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 10,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": null\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n },\n \"unit\": \"s\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 7,\n \"w\": 12,\n \"x\": 0,\n \"y\": 66\n },\n \"id\": 113,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"histogram_quantile($percentile, sum by (namespace, job, node) (rate(daml_sequencer_bftordering_performance_ordering_stage_latency_duration_seconds{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\",ordering_stage=~\\\"output-backpressure\\\"}[$__rate_interval])))\",\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Sequencer core backpressure duration\",\n \"type\": \"timeseries\"\n }\n ],\n \"title\": \"Output\",\n \"type\": \"row\"\n },\n {\n \"collapsed\": true,\n \"gridPos\": {\n \"h\": 1,\n \"w\": 24,\n \"x\": 0,\n \"y\": 38\n },\n \"id\": 60,\n \"panels\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 10,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": null\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n },\n \"unit\": \"s\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 8,\n \"w\": 24,\n \"x\": 0,\n \"y\": 39\n },\n \"id\": 35,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"histogram_quantile($percentile, sum by (namespace, job, node) (rate(daml_sequencer_bftordering_performance_ordering_stage_latency_duration_seconds{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\",ordering_stage=~\\\"com.digitalasset.canton.synchronizer.sequencer.block.bftordering.core.modules.consensus.iss.data.db.DbEpochStore.loadEpochInfo\\\"}[$__rate_interval])))\",\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Load epoch info\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 10,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": null\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n },\n \"unit\": \"s\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 8,\n \"w\": 24,\n \"x\": 0,\n \"y\": 47\n },\n \"id\": 56,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"histogram_quantile($percentile, sum by (namespace, job, node) (rate(daml_sequencer_bftordering_performance_ordering_stage_latency_duration_seconds{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\",ordering_stage=~\\\"com.digitalasset.canton.synchronizer.sequencer.block.bftordering.core.modules.consensus.iss.data.db.DbEpochStore.loadOrderedBlocks\\\"}[$__rate_interval])))\",\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Load ordered blocks\",\n \"type\": \"timeseries\"\n }\n ],\n \"title\": \"Output - CFT\",\n \"type\": \"row\"\n },\n {\n \"collapsed\": true,\n \"gridPos\": {\n \"h\": 1,\n \"w\": 24,\n \"x\": 0,\n \"y\": 39\n },\n \"id\": 62,\n \"panels\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"description\": \"Time to compute the pruning point, based on retention factors and current time\",\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 10,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": null\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n },\n \"unit\": \"s\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 7,\n \"w\": 12,\n \"x\": 0,\n \"y\": 40\n },\n \"id\": 25,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"histogram_quantile($percentile, sum by (namespace, job, node) (rate(daml_sequencer_bftordering_performance_ordering_stage_latency_duration_seconds{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\",ordering_stage=~\\\"pruning-compute-pruning-point\\\"}[$__rate_interval])))\",\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Compute pruning point\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"description\": \"Time to evict unordered, but expired, batches in the availability DB\",\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 10,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": null\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n },\n \"unit\": \"s\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 7,\n \"w\": 12,\n \"x\": 12,\n \"y\": 40\n },\n \"id\": 27,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"histogram_quantile($percentile, sum by (namespace, job, node) (rate(daml_sequencer_bftordering_performance_ordering_stage_latency_duration_seconds{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\",ordering_stage=~\\\"com.digitalasset.canton.synchronizer.sequencer.block.bftordering.core.modules.availability.data.db.DbAvailabilityStore.gc\\\"}[$__rate_interval])))\",\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Availability DB - evict expired batches\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"description\": \"Time to create new table partitions, when necessary\",\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 10,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": null\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n },\n \"unit\": \"s\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 7,\n \"w\": 12,\n \"x\": 0,\n \"y\": 47\n },\n \"id\": 61,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"histogram_quantile($percentile, sum by (namespace, job, node) (rate(daml_sequencer_bftordering_performance_ordering_stage_latency_duration_seconds{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\",ordering_stage=~\\\"com.digitalasset.canton.synchronizer.sequencer.block.bftordering.core.modules.pruning.PartitionManager.PartitionCreatorImpl.createPartitionsIfNeeded\\\"}[$__rate_interval])))\",\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Create partitions\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"description\": \"Time to drop table partitions that can be pruned\",\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 10,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": null\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n },\n \"unit\": \"s\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 7,\n \"w\": 12,\n \"x\": 12,\n \"y\": 47\n },\n \"id\": 67,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"histogram_quantile($percentile, sum by (namespace, job, node) (rate(daml_sequencer_bftordering_performance_ordering_stage_latency_duration_seconds{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\",ordering_stage=~\\\"com.digitalasset.canton.synchronizer.sequencer.block.bftordering.core.modules.pruning.PartitionManager.PartitionPrunerImpl.prune\\\"}[$__rate_interval])))\",\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Prune (Delete partitions)\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"description\": \"Time to start the Partition Manager, which may include creating new partitions\",\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 10,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": null\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n },\n \"unit\": \"s\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 7,\n \"w\": 12,\n \"x\": 12,\n \"y\": 47\n },\n \"id\": 69,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"histogram_quantile($percentile, sum by (namespace, job, node) (rate(daml_sequencer_bftordering_performance_ordering_stage_latency_duration_seconds{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\",ordering_stage=~\\\"com.digitalasset.canton.synchronizer.sequencer.block.bftordering.core.modules.pruning.PartitionManager.create\\\"}[$__rate_interval])))\",\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Partition manager startup\",\n \"type\": \"timeseries\"\n }\n ],\n \"title\": \"Pruning\",\n \"type\": \"row\"\n }\n ],\n \"refresh\": \"5s\",\n \"schemaVersion\": 38,\n \"style\": \"dark\",\n \"tags\": [],\n \"templating\": {\n \"list\": [\n {\n \"allValue\": \".*\",\n \"current\": {\n \"selected\": false,\n \"text\": \"All\",\n \"value\": \"$__all\"\n },\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"definition\": \"label_values(daml_health_status,namespace}\",\n \"hide\": 0,\n \"includeAll\": true,\n \"multi\": true,\n \"name\": \"namespace\",\n \"label\": \"Namespace\",\n \"options\": [],\n \"query\": {\n \"qryType\": 1,\n \"query\": \"label_values(daml_health_status,namespace)\",\n \"refId\": \"PrometheusVariableQueryEditor-VariableQuery\"\n },\n \"refresh\": 2,\n \"regex\": \"\",\n \"skipUrlSync\": false,\n \"sort\": 7,\n \"type\": \"query\"\n },\n {\n \"allValue\": \".*\",\n \"current\": {\n \"selected\": true,\n \"text\": [\n \"All\"\n ],\n \"value\": [\n \"$__all\"\n ]\n },\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"definition\": \"label_values(daml_health_status{namespace=~\\\"$namespace\\\"},job)\",\n \"hide\": 0,\n \"includeAll\": true,\n \"multi\": true,\n \"name\": \"job\",\n \"label\": \"Job\",\n \"options\": [],\n \"query\": {\n \"qryType\": 1,\n \"query\": \"label_values(daml_health_status{namespace=~\\\"$namespace\\\"},job)\",\n \"refId\": \"PrometheusVariableQueryEditor-VariableQuery\"\n },\n \"refresh\": 2,\n \"regex\": \"\",\n \"skipUrlSync\": false,\n \"sort\": 7,\n \"type\": \"query\"\n },\n {\n \"allValue\": \".*\",\n \"current\": {\n \"selected\": true,\n \"text\": [\n \"All\"\n ],\n \"value\": [\n \"$__all\"\n ]\n },\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"definition\": \"label_values(daml_health_status{namespace=~\\\"$namespace\\\", job=~\\\"$job\\\"},node)\",\n \"hide\": 0,\n \"includeAll\": true,\n \"multi\": true,\n \"name\": \"node\",\n \"label\": \"Node\",\n \"options\": [],\n \"query\": {\n \"qryType\": 1,\n \"query\": \"label_values(daml_health_status{namespace=~\\\"$namespace\\\", job=~\\\"$job\\\"},node)\",\n \"refId\": \"PrometheusVariableQueryEditor-VariableQuery\"\n },\n \"refresh\": 2,\n \"regex\": \"\",\n \"skipUrlSync\": false,\n \"sort\": 7,\n \"type\": \"query\"\n },\n {\n \"current\": {\n \"selected\": true,\n \"text\": \".95\",\n \"value\": \".95\"\n },\n \"hide\": 0,\n \"includeAll\": false,\n \"label\": \"Percentile\",\n \"multi\": false,\n \"name\": \"percentile\",\n \"options\": [\n {\n \"selected\": false,\n \"text\": \".5\",\n \"value\": \".5\"\n },\n {\n \"selected\": false,\n \"text\": \".6\",\n \"value\": \".6\"\n },\n {\n \"selected\": false,\n \"text\": \".7\",\n \"value\": \".7\"\n },\n {\n \"selected\": false,\n \"text\": \".75\",\n \"value\": \".75\"\n },\n {\n \"selected\": false,\n \"text\": \".8\",\n \"value\": \".8\"\n },\n {\n \"selected\": false,\n \"text\": \".9\",\n \"value\": \".9\"\n },\n {\n \"selected\": true,\n \"text\": \".95\",\n \"value\": \".95\"\n },\n {\n \"selected\": false,\n \"text\": \".99\",\n \"value\": \".99\"\n },\n {\n \"selected\": false,\n \"text\": \".999\",\n \"value\": \".999\"\n }\n ],\n \"query\": \".5,.6,.7,.75,.8,.9,.95,.99,.999\",\n \"queryValue\": \"\",\n \"skipUrlSync\": false,\n \"type\": \"custom\"\n }\n ]\n },\n \"time\": {\n \"from\": \"now-5m\",\n \"to\": \"now\"\n },\n \"timepicker\": {},\n \"timezone\": \"\",\n \"title\": \"BFT ordering (performance)\",\n \"uid\": \"c2237cb1-9018-41ac-8eef-24a28ab28f20\",\n \"version\": 1,\n \"weekStart\": \"\"\n}\n", - "bft-ordering.json": "{\n \"annotations\": {\n \"list\": [\n {\n \"builtIn\": 1,\n \"datasource\": {\n \"type\": \"grafana\",\n \"uid\": \"-- Grafana --\"\n },\n \"enable\": true,\n \"hide\": true,\n \"iconColor\": \"rgba(0, 211, 255, 1)\",\n \"name\": \"Annotations & Alerts\",\n \"type\": \"dashboard\"\n }\n ]\n },\n \"description\": \"\",\n \"editable\": true,\n \"fiscalYearStartMonth\": 0,\n \"graphTooltip\": 0,\n \"id\": 8,\n \"links\": [],\n \"liveNow\": false,\n \"panels\": [\n {\n \"collapsed\": false,\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"gridPos\": {\n \"h\": 1,\n \"w\": 24,\n \"x\": 0,\n \"y\": 0\n },\n \"id\": 64,\n \"panels\": [],\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Global overview (instance view)\",\n \"type\": \"row\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"description\": \"ISS proceeds in epochs with stable leader assignments to \\\"segments\\\" and stable topology (i.e., sequencers can be added and remove only at epoch boundaries and leaders are reassigned to segments also at epoch boundaries). This is the current epoch.\",\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"thresholds\"\n },\n \"decimals\": 0,\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": null\n }\n ]\n },\n \"unit\": \"locale\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 11,\n \"w\": 5,\n \"x\": 0,\n \"y\": 1\n },\n \"hideTimeOverride\": false,\n \"id\": 72,\n \"maxDataPoints\": 100,\n \"options\": {\n \"colorMode\": \"value\",\n \"graphMode\": \"none\",\n \"justifyMode\": \"auto\",\n \"orientation\": \"horizontal\",\n \"reduceOptions\": {\n \"calcs\": [\n \"lastNotNull\"\n ],\n \"fields\": \"\",\n \"values\": false\n },\n \"showPercentChange\": false,\n \"textMode\": \"auto\",\n \"wideLayout\": true\n },\n \"pluginVersion\": \"9.5.12\",\n \"targets\": [\n {\n \"datasource\": {\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"daml_sequencer_bftordering_consensus_epoch{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\"}\",\n \"format\": \"time_series\",\n \"interval\": \"30s\",\n \"intervalFactor\": 1,\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Current Epoch\",\n \"type\": \"stat\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"description\": \"Size in blocks of the current epoch.\",\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"thresholds\"\n },\n \"decimals\": 0,\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": null\n }\n ]\n },\n \"unit\": \"locale\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 11,\n \"w\": 3,\n \"x\": 5,\n \"y\": 1\n },\n \"hideTimeOverride\": false,\n \"id\": 80,\n \"maxDataPoints\": 100,\n \"options\": {\n \"colorMode\": \"value\",\n \"graphMode\": \"none\",\n \"justifyMode\": \"auto\",\n \"orientation\": \"horizontal\",\n \"reduceOptions\": {\n \"calcs\": [\n \"lastNotNull\"\n ],\n \"fields\": \"\",\n \"values\": false\n },\n \"showPercentChange\": false,\n \"textMode\": \"auto\",\n \"wideLayout\": true\n },\n \"pluginVersion\": \"9.5.12\",\n \"targets\": [\n {\n \"datasource\": {\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"daml_sequencer_bftordering_consensus_epoch_length{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\"}\",\n \"format\": \"time_series\",\n \"interval\": \"30s\",\n \"intervalFactor\": 1,\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Epoch Length\",\n \"type\": \"stat\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"description\": \"Number of active validators\",\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"thresholds\"\n },\n \"decimals\": 0,\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": null\n }\n ]\n },\n \"unit\": \"locale\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 11,\n \"w\": 3,\n \"x\": 8,\n \"y\": 1\n },\n \"hideTimeOverride\": false,\n \"id\": 75,\n \"maxDataPoints\": 100,\n \"options\": {\n \"colorMode\": \"value\",\n \"graphMode\": \"none\",\n \"justifyMode\": \"auto\",\n \"orientation\": \"horizontal\",\n \"reduceOptions\": {\n \"calcs\": [\n \"lastNotNull\"\n ],\n \"fields\": \"\",\n \"values\": false\n },\n \"showPercentChange\": false,\n \"textMode\": \"auto\",\n \"wideLayout\": true\n },\n \"pluginVersion\": \"9.5.12\",\n \"targets\": [\n {\n \"datasource\": {\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"daml_sequencer_bftordering_topology_validators{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\"}\",\n \"format\": \"time_series\",\n \"interval\": \"30s\",\n \"intervalFactor\": 1,\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Validators\",\n \"type\": \"stat\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"description\": \"Number of connected and authenticated P2P peers for the selected sequencer. It should be > 2/3 at all times.\",\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"thresholds\"\n },\n \"decimals\": 0,\n \"mappings\": [],\n \"min\": 0,\n \"thresholds\": {\n \"mode\": \"percentage\",\n \"steps\": [\n {\n \"color\": \"dark-red\",\n \"value\": null\n },\n {\n \"color\": \"#EAB839\",\n \"value\": 67\n },\n {\n \"color\": \"dark-green\",\n \"value\": 100\n }\n ]\n },\n \"unit\": \"short\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 11,\n \"w\": 13,\n \"x\": 11,\n \"y\": 1\n },\n \"hideTimeOverride\": true,\n \"id\": 53,\n \"options\": {\n \"colorMode\": \"value\",\n \"graphMode\": \"area\",\n \"justifyMode\": \"center\",\n \"orientation\": \"auto\",\n \"reduceOptions\": {\n \"calcs\": [\n \"last\"\n ],\n \"fields\": \"\",\n \"values\": false\n },\n \"textMode\": \"auto\"\n },\n \"pluginVersion\": \"9.5.12\",\n \"targets\": [\n {\n \"datasource\": {\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"exemplar\": false,\n \"expr\": \"daml_sequencer_bftordering_p2p_connections_connected{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\"}\",\n \"format\": \"time_series\",\n \"instant\": true,\n \"interval\": \"30s\",\n \"intervalFactor\": 1,\n \"legendFormat\": \"Connected ({{namespace}}.{{node}})\",\n \"range\": false,\n \"refId\": \"A\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"exemplar\": false,\n \"expr\": \"daml_sequencer_bftordering_p2p_connections_authenticated{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\"}\",\n \"hide\": false,\n \"instant\": true,\n \"legendFormat\": \"Authenticated ({{namespace}}.{{node}})\",\n \"range\": false,\n \"refId\": \"B\"\n }\n ],\n \"title\": \"Peers count\",\n \"type\": \"stat\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"description\": \"\",\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"thresholds\"\n },\n \"decimals\": 0,\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": null\n }\n ]\n },\n \"unit\": \"locale\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 12,\n \"w\": 3,\n \"x\": 0,\n \"y\": 12\n },\n \"hideTimeOverride\": false,\n \"id\": 99,\n \"maxDataPoints\": 100,\n \"options\": {\n \"colorMode\": \"value\",\n \"graphMode\": \"none\",\n \"justifyMode\": \"auto\",\n \"orientation\": \"horizontal\",\n \"reduceOptions\": {\n \"calcs\": [\n \"lastNotNull\"\n ],\n \"fields\": \"\",\n \"values\": false\n },\n \"showPercentChange\": false,\n \"textMode\": \"auto\",\n \"wideLayout\": true\n },\n \"pluginVersion\": \"9.5.12\",\n \"targets\": [\n {\n \"datasource\": {\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"daml_sequencer_bftordering_topology_max_tolerated_faults{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\"}\",\n \"format\": \"time_series\",\n \"interval\": \"30s\",\n \"intervalFactor\": 1,\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Max tolerated faults\",\n \"type\": \"stat\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"description\": \"The size of a weak quorum or non-faulty nodes, needed e.g. to disseminate batches\",\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"thresholds\"\n },\n \"decimals\": 0,\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": null\n }\n ]\n },\n \"unit\": \"locale\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 12,\n \"w\": 3,\n \"x\": 3,\n \"y\": 12\n },\n \"hideTimeOverride\": false,\n \"id\": 100,\n \"maxDataPoints\": 100,\n \"options\": {\n \"colorMode\": \"value\",\n \"graphMode\": \"none\",\n \"justifyMode\": \"auto\",\n \"orientation\": \"horizontal\",\n \"reduceOptions\": {\n \"calcs\": [\n \"lastNotNull\"\n ],\n \"fields\": \"\",\n \"values\": false\n },\n \"showPercentChange\": false,\n \"textMode\": \"auto\",\n \"wideLayout\": true\n },\n \"pluginVersion\": \"9.5.12\",\n \"targets\": [\n {\n \"datasource\": {\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"daml_sequencer_bftordering_topology_weak_quorum{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\"}\",\n \"format\": \"time_series\",\n \"interval\": \"30s\",\n \"intervalFactor\": 1,\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Weak quorum\",\n \"type\": \"stat\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"description\": \"The size of a strong quorum, needed for ordering consensus\",\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"thresholds\"\n },\n \"decimals\": 0,\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": null\n }\n ]\n },\n \"unit\": \"locale\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 12,\n \"w\": 3,\n \"x\": 6,\n \"y\": 12\n },\n \"hideTimeOverride\": false,\n \"id\": 101,\n \"maxDataPoints\": 100,\n \"options\": {\n \"colorMode\": \"value\",\n \"graphMode\": \"none\",\n \"justifyMode\": \"auto\",\n \"orientation\": \"horizontal\",\n \"reduceOptions\": {\n \"calcs\": [\n \"lastNotNull\"\n ],\n \"fields\": \"\",\n \"values\": false\n },\n \"showPercentChange\": false,\n \"textMode\": \"auto\",\n \"wideLayout\": true\n },\n \"pluginVersion\": \"9.5.12\",\n \"targets\": [\n {\n \"datasource\": {\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"daml_sequencer_bftordering_topology_strong_quorum{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\"}\",\n \"format\": \"time_series\",\n \"interval\": \"30s\",\n \"intervalFactor\": 1,\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Strong quorum\",\n \"type\": \"stat\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"description\": \"Latest block number ordered and available for the read path. When there is no traffic, a block can be empty.\",\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"thresholds\"\n },\n \"decimals\": 0,\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": null\n }\n ]\n },\n \"unit\": \"locale\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 12,\n \"w\": 7,\n \"x\": 9,\n \"y\": 12\n },\n \"hideTimeOverride\": false,\n \"id\": 4,\n \"maxDataPoints\": 100,\n \"options\": {\n \"colorMode\": \"value\",\n \"graphMode\": \"none\",\n \"justifyMode\": \"auto\",\n \"orientation\": \"horizontal\",\n \"reduceOptions\": {\n \"calcs\": [\n \"lastNotNull\"\n ],\n \"fields\": \"\",\n \"values\": false\n },\n \"showPercentChange\": false,\n \"textMode\": \"auto\",\n \"wideLayout\": true\n },\n \"pluginVersion\": \"9.5.12\",\n \"targets\": [\n {\n \"datasource\": {\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"sum by(namespace, job, node) (daml_sequencer_bftordering_global_ordered_blocks_total{namespace=~\\\"$namespace\\\", job=~\\\"$job\\\", node=~\\\"$node\\\"})\",\n \"format\": \"time_series\",\n \"hide\": false,\n \"instant\": true,\n \"interval\": \"30s\",\n \"intervalFactor\": 1,\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Total Output Blocks\",\n \"type\": \"stat\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"description\": \"Total number of requests ordered and output to the read path.\",\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"thresholds\"\n },\n \"decimals\": 0,\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": null\n }\n ]\n },\n \"unit\": \"locale\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 12,\n \"w\": 8,\n \"x\": 16,\n \"y\": 12\n },\n \"hideTimeOverride\": false,\n \"id\": 40,\n \"maxDataPoints\": 100,\n \"options\": {\n \"colorMode\": \"value\",\n \"graphMode\": \"none\",\n \"justifyMode\": \"auto\",\n \"orientation\": \"horizontal\",\n \"reduceOptions\": {\n \"calcs\": [\n \"lastNotNull\"\n ],\n \"fields\": \"\",\n \"values\": false\n },\n \"showPercentChange\": false,\n \"textMode\": \"auto\",\n \"wideLayout\": true\n },\n \"pluginVersion\": \"9.5.12\",\n \"targets\": [\n {\n \"datasource\": {\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"sum by (namespace,job,node) (histogram_sum(daml_sequencer_bftordering_output_block_size_requests{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\"}))\",\n \"format\": \"time_series\",\n \"interval\": \"30s\",\n \"intervalFactor\": 1,\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Total Output Requests\",\n \"type\": \"stat\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"description\": \"Sequencers that are part of the BFT ordering topology\",\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisGridShow\": true,\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 0,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"normal\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": null\n }\n ]\n }\n },\n \"overrides\": [\n {\n \"matcher\": {\n \"id\": \"byName\",\n \"options\": \"Value\"\n },\n \"properties\": [\n {\n \"id\": \"custom.axisPlacement\",\n \"value\": \"hidden\"\n }\n ]\n }\n ]\n },\n \"gridPos\": {\n \"h\": 21,\n \"w\": 12,\n \"x\": 0,\n \"y\": 24\n },\n \"id\": 91,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"single\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"daml_sequencer_bftordering_topology_topology_member{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\"}\",\n \"interval\": \"\",\n \"legendFormat\": \" (reporter: {{namespace}}.{{node}}) {{sequencer_id}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"BFT ordering members\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"description\": \"Sequencers that are allowed to propose blocks for ordering\",\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 0,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"normal\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": null\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n }\n },\n \"overrides\": [\n {\n \"matcher\": {\n \"id\": \"byName\",\n \"options\": \"Value\"\n },\n \"properties\": [\n {\n \"id\": \"custom.axisPlacement\",\n \"value\": \"hidden\"\n }\n ]\n }\n ]\n },\n \"gridPos\": {\n \"h\": 21,\n \"w\": 12,\n \"x\": 12,\n \"y\": 24\n },\n \"id\": 95,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"single\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"daml_sequencer_bftordering_topology_topology_leader{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\"}\",\n \"legendFormat\": \" (reporter: {{namespace}}.{{node}}) {{sequencer_id}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"BFT ordering leaders\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"description\": \"\",\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 0,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"normal\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": null\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n }\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 21,\n \"w\": 8,\n \"x\": 0,\n \"y\": 45\n },\n \"id\": 96,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"single\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"exemplar\": false,\n \"expr\": \"daml_sequencer_bftordering_p2p_authenticated_endpoint{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\"}\",\n \"format\": \"time_series\",\n \"instant\": false,\n \"legendFormat\": \"(reporter: {{namespace}}.{{node}}) {{endpoint}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"P2P authenticated endpoints\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"description\": \"\",\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 0,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": null\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n }\n },\n \"overrides\": [\n {\n \"matcher\": {\n \"id\": \"byName\",\n \"options\": \"Value\"\n },\n \"properties\": [\n {\n \"id\": \"custom.axisPlacement\",\n \"value\": \"hidden\"\n }\n ]\n }\n ]\n },\n \"gridPos\": {\n \"h\": 21,\n \"w\": 8,\n \"x\": 8,\n \"y\": 45\n },\n \"id\": 97,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"single\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"daml_sequencer_bftordering_p2p_unauthenticated_endpoint{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\"}\",\n \"legendFormat\": \"(reporter: {{namespace}}.{{node}}) {{endpoint}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"P2P connected but unauthenticated endpoints\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"description\": \"\",\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"hidden\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 0,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": null\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n }\n },\n \"overrides\": [\n {\n \"matcher\": {\n \"id\": \"byName\",\n \"options\": \"Value\"\n },\n \"properties\": [\n {\n \"id\": \"custom.axisPlacement\",\n \"value\": \"hidden\"\n }\n ]\n }\n ]\n },\n \"gridPos\": {\n \"h\": 21,\n \"w\": 8,\n \"x\": 16,\n \"y\": 45\n },\n \"id\": 98,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"single\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"daml_sequencer_bftordering_p2p_disconnected_endpoint{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\"}\",\n \"legendFormat\": \"(reporter: {{namespace}}.{{node}}) {{endpoint}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"P2P disconnected endpoints\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 10,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": null\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n },\n \"unit\": \"s\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 7,\n \"w\": 12,\n \"x\": 0,\n \"y\": 66\n },\n \"id\": 87,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"histogram_quantile($percentile, sum by (namespace, job, node) (rate(daml_sequencer_bftordering_global_requests_ordering_latency_duration_seconds{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\"}[$__rate_interval])))\",\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Requests end-to-end ordering latency\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"description\": \"Rate of requests ordered and output to the read path.\",\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 10,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"decimals\": 2,\n \"links\": [],\n \"mappings\": [],\n \"min\": 0,\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": 0\n }\n ]\n },\n \"unit\": \"cps\"\n },\n \"overrides\": [\n {\n \"matcher\": {\n \"id\": \"byName\",\n \"options\": \"Height for last 3 hours\"\n },\n \"properties\": [\n {\n \"id\": \"color\",\n \"value\": {\n \"fixedColor\": \"#447ebc\",\n \"mode\": \"fixed\"\n }\n }\n ]\n },\n {\n \"matcher\": {\n \"id\": \"byName\",\n \"options\": \"Total Transactions for last 3 hours\"\n },\n \"properties\": [\n {\n \"id\": \"color\",\n \"value\": {\n \"fixedColor\": \"#ef843c\",\n \"mode\": \"fixed\"\n }\n }\n ]\n }\n ]\n },\n \"gridPos\": {\n \"h\": 7,\n \"w\": 12,\n \"x\": 12,\n \"y\": 66\n },\n \"hideTimeOverride\": true,\n \"id\": 88,\n \"options\": {\n \"legend\": {\n \"calcs\": [\n \"mean\",\n \"max\",\n \"sum\"\n ],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"hideZeros\": false,\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"pluginVersion\": \"10.4.0\",\n \"targets\": [\n {\n \"datasource\": {\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"sum by (namespace, job, node) (irate(daml_sequencer_bftordering_global_ordered_requests_total{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\"}[$__rate_interval]))\",\n \"format\": \"time_series\",\n \"instant\": false,\n \"interval\": \"\",\n \"intervalFactor\": 1,\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Throughput - requests/s\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"description\": \"Number of requests per consensus block.\",\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 10,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"decimals\": 2,\n \"links\": [],\n \"mappings\": [],\n \"min\": 0,\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": 0\n }\n ]\n },\n \"unit\": \"cps\"\n },\n \"overrides\": [\n {\n \"matcher\": {\n \"id\": \"byName\",\n \"options\": \"Height for last 3 hours\"\n },\n \"properties\": [\n {\n \"id\": \"color\",\n \"value\": {\n \"fixedColor\": \"#447ebc\",\n \"mode\": \"fixed\"\n }\n }\n ]\n },\n {\n \"matcher\": {\n \"id\": \"byName\",\n \"options\": \"Total Transactions for last 3 hours\"\n },\n \"properties\": [\n {\n \"id\": \"color\",\n \"value\": {\n \"fixedColor\": \"#ef843c\",\n \"mode\": \"fixed\"\n }\n }\n ]\n }\n ]\n },\n \"gridPos\": {\n \"h\": 7,\n \"w\": 12,\n \"x\": 0,\n \"y\": 73\n },\n \"hideTimeOverride\": true,\n \"id\": 49,\n \"options\": {\n \"legend\": {\n \"calcs\": [\n \"mean\",\n \"max\",\n \"sum\"\n ],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"hideZeros\": false,\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"pluginVersion\": \"10.4.0\",\n \"targets\": [\n {\n \"datasource\": {\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"histogram_sum(sum by(namespace, job, node, mode) (rate(daml_sequencer_bftordering_output_block_size_requests{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\"}[$__rate_interval]))) / histogram_count(sum by(namespace, job, node, mode) (rate(daml_sequencer_bftordering_output_block_size_requests{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\"}[$__rate_interval])))\",\n \"format\": \"time_series\",\n \"instant\": false,\n \"interval\": \"\",\n \"intervalFactor\": 1,\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Requests / Block\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"description\": \"Rate of blocks ordered and output to the read path.\",\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 10,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"decimals\": 2,\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": 0\n }\n ]\n },\n \"unit\": \"cps\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 7,\n \"w\": 12,\n \"x\": 12,\n \"y\": 73\n },\n \"hideTimeOverride\": true,\n \"id\": 68,\n \"options\": {\n \"legend\": {\n \"calcs\": [\n \"min\",\n \"max\",\n \"mean\"\n ],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"hideZeros\": false,\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"pluginVersion\": \"10.4.0\",\n \"targets\": [\n {\n \"datasource\": {\n \"uid\": \"prometheus\"\n },\n \"disableTextWrap\": false,\n \"editorMode\": \"code\",\n \"exemplar\": false,\n \"expr\": \"sum by (namespace, job, node, is_block_empty) (irate(daml_sequencer_bftordering_global_ordered_blocks_total{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\"}[$__rate_interval]))\",\n \"format\": \"time_series\",\n \"fullMetaSearch\": false,\n \"hide\": false,\n \"includeNullMetadata\": true,\n \"instant\": false,\n \"interval\": \"\",\n \"intervalFactor\": 1,\n \"legendFormat\": \"{{namespace}}.{{node}} (empty: {{is_block_empty}})\",\n \"range\": true,\n \"refId\": \"A\",\n \"useBackend\": false\n }\n ],\n \"title\": \"Throughput - blocks/s\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"description\": \"Number of batches (proofs of availability) per consensus block. Note that < 1 average batch per block likely means empty blocks are being created.\",\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 10,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"decimals\": 2,\n \"links\": [],\n \"mappings\": [],\n \"min\": 0,\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": 0\n }\n ]\n },\n \"unit\": \"cps\"\n },\n \"overrides\": [\n {\n \"matcher\": {\n \"id\": \"byName\",\n \"options\": \"Height for last 3 hours\"\n },\n \"properties\": [\n {\n \"id\": \"color\",\n \"value\": {\n \"fixedColor\": \"#447ebc\",\n \"mode\": \"fixed\"\n }\n }\n ]\n },\n {\n \"matcher\": {\n \"id\": \"byName\",\n \"options\": \"Total Transactions for last 3 hours\"\n },\n \"properties\": [\n {\n \"id\": \"color\",\n \"value\": {\n \"fixedColor\": \"#ef843c\",\n \"mode\": \"fixed\"\n }\n }\n ]\n }\n ]\n },\n \"gridPos\": {\n \"h\": 7,\n \"w\": 12,\n \"x\": 0,\n \"y\": 80\n },\n \"hideTimeOverride\": true,\n \"id\": 89,\n \"options\": {\n \"legend\": {\n \"calcs\": [\n \"mean\",\n \"max\",\n \"sum\"\n ],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"hideZeros\": false,\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"pluginVersion\": \"10.4.0\",\n \"targets\": [\n {\n \"datasource\": {\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"histogram_sum(sum by(namespace, job, node, mode) (rate(daml_sequencer_bftordering_output_block_size_batches{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\"}[$__rate_interval]))) / histogram_count(sum by(namespace, job, node, mode) (rate(daml_sequencer_bftordering_output_block_size_batches{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\"}[$__rate_interval])))\",\n \"format\": \"time_series\",\n \"instant\": false,\n \"interval\": \"\",\n \"intervalFactor\": 1,\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Batches (PoAs) / Block\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"description\": \"Rate of batches (proofs of availability) ordered and output to the read path.\",\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 10,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"decimals\": 2,\n \"links\": [],\n \"mappings\": [],\n \"min\": 0,\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": 0\n }\n ]\n },\n \"unit\": \"cps\"\n },\n \"overrides\": [\n {\n \"matcher\": {\n \"id\": \"byName\",\n \"options\": \"Height for last 3 hours\"\n },\n \"properties\": [\n {\n \"id\": \"color\",\n \"value\": {\n \"fixedColor\": \"#447ebc\",\n \"mode\": \"fixed\"\n }\n }\n ]\n },\n {\n \"matcher\": {\n \"id\": \"byName\",\n \"options\": \"Total Transactions for last 3 hours\"\n },\n \"properties\": [\n {\n \"id\": \"color\",\n \"value\": {\n \"fixedColor\": \"#ef843c\",\n \"mode\": \"fixed\"\n }\n }\n ]\n }\n ]\n },\n \"gridPos\": {\n \"h\": 7,\n \"w\": 12,\n \"x\": 12,\n \"y\": 80\n },\n \"hideTimeOverride\": true,\n \"id\": 90,\n \"options\": {\n \"legend\": {\n \"calcs\": [\n \"min\",\n \"max\",\n \"mean\"\n ],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"hideZeros\": false,\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"pluginVersion\": \"10.4.0\",\n \"targets\": [\n {\n \"datasource\": {\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"irate(daml_sequencer_bftordering_global_ordered_batches_total{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\"}[$__rate_interval])\",\n \"format\": \"time_series\",\n \"instant\": false,\n \"interval\": \"\",\n \"intervalFactor\": 1,\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Throughput - batches/s\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"description\": \"Delay introduced by the sequencer core being too slow consuming blocks from ordering, in milliseconds\",\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 10,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"decimals\": 0,\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": 0\n }\n ]\n },\n \"unit\": \"ms\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 7,\n \"w\": 12,\n \"x\": 0,\n \"y\": 87\n },\n \"hideTimeOverride\": true,\n \"id\": 102,\n \"options\": {\n \"legend\": {\n \"calcs\": [\n \"max\"\n ],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"hideZeros\": false,\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"pluginVersion\": \"10.4.0\",\n \"targets\": [\n {\n \"datasource\": {\n \"uid\": \"prometheus\"\n },\n \"disableTextWrap\": false,\n \"editorMode\": \"code\",\n \"exemplar\": false,\n \"expr\": \"daml_sequencer_bftordering_sequencer_core_backpressure_current_delay_millis{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\"}\",\n \"format\": \"time_series\",\n \"fullMetaSearch\": false,\n \"hide\": false,\n \"includeNullMetadata\": true,\n \"instant\": false,\n \"interval\": \"\",\n \"intervalFactor\": 1,\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\",\n \"useBackend\": false\n }\n ],\n \"title\": \"Sequencer core backpressure delay (ms)\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"description\": \"Size of the buffer in the subscription from the orderer to the sequencer core, in blocks\",\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 10,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"decimals\": 0,\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": 0\n }\n ]\n },\n \"unit\": \"none\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 7,\n \"w\": 12,\n \"x\": 12,\n \"y\": 87\n },\n \"hideTimeOverride\": true,\n \"id\": 103,\n \"options\": {\n \"legend\": {\n \"calcs\": [\n \"max\",\n \"min\",\n \"mean\"\n ],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"hideZeros\": false,\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"pluginVersion\": \"10.4.0\",\n \"targets\": [\n {\n \"datasource\": {\n \"uid\": \"prometheus\"\n },\n \"disableTextWrap\": false,\n \"editorMode\": \"code\",\n \"exemplar\": false,\n \"expr\": \"daml_sequencer_bftordering_sequencer_core_subscription_buffer_size{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\"}\\n\",\n \"format\": \"time_series\",\n \"fullMetaSearch\": false,\n \"hide\": false,\n \"includeNullMetadata\": true,\n \"instant\": false,\n \"interval\": \"\",\n \"intervalFactor\": 1,\n \"legendFormat\": \"{{namespace}}.{{node}}}\",\n \"range\": true,\n \"refId\": \"A\",\n \"useBackend\": false\n }\n ],\n \"title\": \"Sequencer core buffer size (blocks #)\",\n \"type\": \"timeseries\"\n },\n\n\n\n\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"description\": \"How many epochs a sequencer is blacklisted\",\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 0,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": null\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n }\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 7,\n \"w\": 12,\n \"x\": 0,\n \"y\": 94\n },\n \"id\": 86,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"builder\",\n \"expr\": \"daml_sequencer_bftordering_blacklist_sequencer{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\"}\",\n \"legendFormat\": \"(reporter: {{namespace}}.{{node}}) {{blacklist_sequencer}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Blacklisted Sequencers\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"description\": \"Size of the stream buffer at various stages\",\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 10,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"decimals\": 0,\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": 0\n }\n ]\n },\n \"unit\": \"none\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 7,\n \"w\": 12,\n \"x\": 12,\n \"y\": 94\n },\n \"id\": 104,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"hideZeros\": false,\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"pluginVersion\": \"10.4.0\",\n \"targets\": [\n {\n \"datasource\": {\n \"uid\": \"prometheus\"\n },\n \"disableTextWrap\": false,\n \"editorMode\": \"code\",\n \"exemplar\": false,\n \"expr\": \"daml_sequencer_block_stream_buffer_size{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\"}\",\n \"format\": \"time_series\",\n \"fullMetaSearch\": false,\n \"includeNullMetadata\": true,\n \"instant\": false,\n \"interval\": \"\",\n \"intervalFactor\": 1,\n \"legendFormat\": \"{{namespace}}.{{node}}.{{element}}\",\n \"range\": true,\n \"refId\": \"A\",\n \"useBackend\": false\n }\n ],\n \"title\": \"Stream Buffer Metrics\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"description\": \"Wall-clock time of the ordered block being provided to the sequencer minus BFT time of the block\",\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 10,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"decimals\": 2,\n \"mappings\": [\n {\n \"options\": {\n \"match\": \"null\",\n \"result\": {\n \"text\": \"N/A\"\n }\n },\n \"type\": \"special\"\n }\n ],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": null\n },\n {\n \"color\": \"red\",\n \"value\": 2\n }\n ]\n },\n \"unit\": \"s\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 7,\n \"w\": 6,\n \"x\": 12,\n \"y\": 94\n },\n \"hideTimeOverride\": true,\n \"id\": 85,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"pluginVersion\": \"10.4.0\",\n \"targets\": [\n {\n \"datasource\": {\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"exemplar\": false,\n \"expr\": \"histogram_quantile($percentile, sum by(namespace, job, node, mode) (rate(daml_sequencer_bftordering_output_block_delay_duration_seconds{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\"}[$__rate_interval])))\",\n \"format\": \"time_series\",\n \"instant\": false,\n \"interval\": \"30s\",\n \"intervalFactor\": 1,\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Block delay\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"description\": \"Size of the payloads of blocks ordered and output to the read path.\",\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 10,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"decimals\": 2,\n \"links\": [],\n \"mappings\": [],\n \"min\": 0,\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": null\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n },\n \"unit\": \"bytes\"\n },\n \"overrides\": [\n {\n \"matcher\": {\n \"id\": \"byName\",\n \"options\": \"Height for last 3 hours\"\n },\n \"properties\": [\n {\n \"id\": \"color\",\n \"value\": {\n \"fixedColor\": \"#447ebc\",\n \"mode\": \"fixed\"\n }\n }\n ]\n },\n {\n \"matcher\": {\n \"id\": \"byName\",\n \"options\": \"Total Transactions for last 3 hours\"\n },\n \"properties\": [\n {\n \"id\": \"color\",\n \"value\": {\n \"fixedColor\": \"#ef843c\",\n \"mode\": \"fixed\"\n }\n }\n ]\n }\n ]\n },\n \"gridPos\": {\n \"h\": 7,\n \"w\": 6,\n \"x\": 18,\n \"y\": 94\n },\n \"hideTimeOverride\": false,\n \"id\": 50,\n \"options\": {\n \"legend\": {\n \"calcs\": [\n \"mean\",\n \"max\"\n ],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"pluginVersion\": \"10.1.5\",\n \"targets\": [\n {\n \"datasource\": {\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"histogram_quantile($percentile, sum by(namespace, job, node, mode) (rate(daml_sequencer_bftordering_output_block_size_bytes{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\"}[$__rate_interval])))\",\n \"format\": \"time_series\",\n \"instant\": false,\n \"interval\": \"\",\n \"intervalFactor\": 1,\n \"legendFormat\": \"{{namespace}}.{{node}}.{{mode}}\",\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Output Block Payload Size\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"description\": \"Percentage of votes received by the currently selected sequencer at every major PBFT stage. Should be > 2/3 at all times, else a leader change (\\\"view change\\\" in PBFT parlance) occurs automatically.\",\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"thresholds\"\n },\n \"custom\": {\n \"fillOpacity\": 70,\n \"lineWidth\": 0,\n \"spanNulls\": false\n },\n \"decimals\": 0,\n \"links\": [],\n \"mappings\": [],\n \"max\": 1,\n \"min\": 0,\n \"thresholds\": {\n \"mode\": \"percentage\",\n \"steps\": [\n {\n \"color\": \"red\",\n \"value\": null\n },\n {\n \"color\": \"#EAB839\",\n \"value\": 67\n },\n {\n \"color\": \"#6ED0E0\",\n \"value\": 80\n },\n {\n \"color\": \"dark-green\",\n \"value\": 100\n }\n ]\n },\n \"unit\": \"short\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 28,\n \"w\": 24,\n \"x\": 0,\n \"y\": 101\n },\n \"hideTimeOverride\": false,\n \"id\": 73,\n \"options\": {\n \"alignValue\": \"left\",\n \"legend\": {\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"mergeValues\": true,\n \"rowHeight\": 0.9,\n \"showValue\": \"always\",\n \"tooltip\": {\n \"mode\": \"single\",\n \"sort\": \"none\"\n }\n },\n \"pluginVersion\": \"10.1.5\",\n \"targets\": [\n {\n \"datasource\": {\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"exemplar\": false,\n \"expr\": \"daml_sequencer_bftordering_consensus_prepare_votes_percent{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\"}\",\n \"format\": \"time_series\",\n \"instant\": false,\n \"interval\": \"\",\n \"intervalFactor\": 1,\n \"legendFormat\": \"(reporter: {{namespace}}.{{node}}) Prepare {{voting_sequencer}}\",\n \"range\": true,\n \"refId\": \"A\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"daml_sequencer_bftordering_consensus_commit_votes_percent{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\"}\",\n \"format\": \"time_series\",\n \"hide\": false,\n \"legendFormat\": \"(reporter: {{namespace}}.{{node}}) Commit {{voting_sequencer}}\",\n \"range\": true,\n \"refId\": \"B\"\n }\n ],\n \"title\": \"PBFT Voting Power %\",\n \"transformations\": [\n {\n \"id\": \"renameByRegex\",\n \"options\": {\n \"regex\": \"Prepare SEQ::(.*)::.*\",\n \"renamePattern\": \"Prepare $1\"\n }\n },\n {\n \"id\": \"renameByRegex\",\n \"options\": {\n \"regex\": \"Commit SEQ::(.*)::.*\",\n \"renamePattern\": \"Commit $1\"\n }\n }\n ],\n \"type\": \"state-timeline\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"description\": \"Count of non-compliant and possibly byzantine protocol behaviors detected by the currently selected sequencer.\",\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 10,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"decimals\": 0,\n \"links\": [],\n \"mappings\": [],\n \"min\": 0,\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": null\n }\n ]\n },\n \"unit\": \"none\"\n },\n \"overrides\": [\n {\n \"matcher\": {\n \"id\": \"byName\",\n \"options\": \"Height for last 3 hours\"\n },\n \"properties\": [\n {\n \"id\": \"color\",\n \"value\": {\n \"fixedColor\": \"#447ebc\",\n \"mode\": \"fixed\"\n }\n }\n ]\n },\n {\n \"matcher\": {\n \"id\": \"byName\",\n \"options\": \"Total Transactions for last 3 hours\"\n },\n \"properties\": [\n {\n \"id\": \"color\",\n \"value\": {\n \"fixedColor\": \"#ef843c\",\n \"mode\": \"fixed\"\n }\n }\n ]\n }\n ]\n },\n \"gridPos\": {\n \"h\": 7,\n \"w\": 12,\n \"x\": 0,\n \"y\": 129\n },\n \"hideTimeOverride\": false,\n \"id\": 74,\n \"options\": {\n \"legend\": {\n \"calcs\": [\n \"mean\",\n \"max\"\n ],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"pluginVersion\": \"10.1.5\",\n \"targets\": [\n {\n \"datasource\": {\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"sum by (namespace, job, node) (irate(daml_sequencer_bftordering_security_noncompliant_behavior_total{namespace=~\\\"$namespace\\\", job=~\\\"$job\\\", node=~\\\"$node\\\"}[$__rate_interval]))\",\n \"format\": \"time_series\",\n \"instant\": false,\n \"interval\": \"\",\n \"intervalFactor\": 1,\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Non-compliant behaviors\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"description\": \"Size of the incoming requests buffer (\\\"mempool\\\") for the selected sequencer. Its maximum size in bytes and requests count can be currently set via static configuration.\",\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 10,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"decimals\": 0,\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"#7eb26d\",\n \"value\": null\n },\n {\n \"color\": \"#ef843c\",\n \"value\": 10\n },\n {\n \"color\": \"#e24d42\",\n \"value\": 20\n }\n ]\n },\n \"unit\": \"short\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 7,\n \"w\": 12,\n \"x\": 12,\n \"y\": 129\n },\n \"hideTimeOverride\": true,\n \"id\": 78,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"pluginVersion\": \"9.5.12\",\n \"targets\": [\n {\n \"datasource\": {\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"exemplar\": false,\n \"expr\": \"daml_sequencer_bftordering_ingress_requests_queued{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\"}\",\n \"format\": \"time_series\",\n \"instant\": false,\n \"interval\": \"30s\",\n \"intervalFactor\": 1,\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Mempool Size (requests)\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"description\": \"Number of proposals requested by consensus.\",\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 10,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"decimals\": 0,\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"#7eb26d\",\n \"value\": null\n },\n {\n \"color\": \"#ef843c\",\n \"value\": 10\n },\n {\n \"color\": \"#e24d42\",\n \"value\": 20\n }\n ]\n },\n \"unit\": \"short\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 7,\n \"w\": 12,\n \"x\": 0,\n \"y\": 136\n },\n \"hideTimeOverride\": true,\n \"id\": 77,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"pluginVersion\": \"9.5.12\",\n \"targets\": [\n {\n \"datasource\": {\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"exemplar\": false,\n \"expr\": \"daml_sequencer_bftordering_availability_requested_proposals{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\"}\",\n \"format\": \"time_series\",\n \"instant\": false,\n \"interval\": \"30s\",\n \"intervalFactor\": 1,\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Block proposals requested by consensus\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"description\": \"Number of batches requested to be proposed in consensus.\",\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 10,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"decimals\": 0,\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"#7eb26d\",\n \"value\": null\n },\n {\n \"color\": \"#ef843c\",\n \"value\": 10\n },\n {\n \"color\": \"#e24d42\",\n \"value\": 20\n }\n ]\n },\n \"unit\": \"short\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 7,\n \"w\": 12,\n \"x\": 12,\n \"y\": 136\n },\n \"hideTimeOverride\": true,\n \"id\": 79,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"pluginVersion\": \"9.5.12\",\n \"targets\": [\n {\n \"datasource\": {\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"exemplar\": false,\n \"expr\": \"daml_sequencer_bftordering_availability_requested_batches{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\"}\",\n \"format\": \"time_series\",\n \"instant\": false,\n \"interval\": \"30s\",\n \"intervalFactor\": 1,\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Block proposals requested by consensus (batches)\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"description\": \"Number of batches that are being disseminated.\",\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 10,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"decimals\": 0,\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"#7eb26d\",\n \"value\": null\n },\n {\n \"color\": \"#ef843c\",\n \"value\": 10\n },\n {\n \"color\": \"#e24d42\",\n \"value\": 20\n }\n ]\n },\n \"unit\": \"short\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 7,\n \"w\": 12,\n \"x\": 0,\n \"y\": 143\n },\n \"hideTimeOverride\": true,\n \"id\": 82,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"pluginVersion\": \"9.5.12\",\n \"targets\": [\n {\n \"datasource\": {\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"exemplar\": false,\n \"expr\": \"daml_sequencer_bftordering_availability_disseminating_batches{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\",ready_for_consensus=~\\\"false|true\\\"}\",\n \"format\": \"time_series\",\n \"instant\": false,\n \"interval\": \"30s\",\n \"intervalFactor\": 1,\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Batches being disseminated\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"description\": \"Number of batches requested by the availability module and not yet provided.\",\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 10,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"decimals\": 0,\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"#7eb26d\",\n \"value\": null\n },\n {\n \"color\": \"#ef843c\",\n \"value\": 10\n },\n {\n \"color\": \"#e24d42\",\n \"value\": 20\n }\n ]\n },\n \"unit\": \"short\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 7,\n \"w\": 12,\n \"x\": 12,\n \"y\": 143\n },\n \"hideTimeOverride\": true,\n \"id\": 76,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"pluginVersion\": \"9.5.12\",\n \"targets\": [\n {\n \"datasource\": {\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"exemplar\": false,\n \"expr\": \"daml_sequencer_bftordering_mempool_requested_batches{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\"}\",\n \"format\": \"time_series\",\n \"instant\": false,\n \"interval\": \"30s\",\n \"intervalFactor\": 1,\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Outstanding batch requests\",\n \"type\": \"timeseries\"\n },\n {\n \"collapsed\": false,\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"gridPos\": {\n \"h\": 1,\n \"w\": 24,\n \"x\": 0,\n \"y\": 150\n },\n \"id\": 55,\n \"panels\": [],\n \"repeat\": \"instance\",\n \"repeatDirection\": \"h\",\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Sequencer overview: $reporting_sequencer\",\n \"type\": \"row\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"description\": \"Number of requests in batches that are being disseminated.\",\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 10,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"decimals\": 0,\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"#7eb26d\",\n \"value\": null\n },\n {\n \"color\": \"#ef843c\",\n \"value\": 10\n },\n {\n \"color\": \"#e24d42\",\n \"value\": 20\n }\n ]\n },\n \"unit\": \"short\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 7,\n \"w\": 12,\n \"x\": 0,\n \"y\": 151\n },\n \"hideTimeOverride\": true,\n \"id\": 83,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"pluginVersion\": \"9.5.12\",\n \"targets\": [\n {\n \"datasource\": {\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"exemplar\": false,\n \"expr\": \"daml_sequencer_bftordering_availability_disseminating_requests{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\",ready_for_consensus=~\\\"false|true\\\"}\",\n \"format\": \"time_series\",\n \"instant\": false,\n \"interval\": \"30s\",\n \"intervalFactor\": 1,\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Requests being disseminated\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"description\": \"Total network ingress for the currently selected sequencer split by sender.\",\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 100,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"never\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"normal\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"links\": [],\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": null\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n },\n \"unit\": \"bytes\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 14,\n \"w\": 6,\n \"x\": 12,\n \"y\": 151\n },\n \"id\": 59,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"single\",\n \"sort\": \"none\"\n }\n },\n \"pluginVersion\": \"10.1.5\",\n \"targets\": [\n {\n \"datasource\": {\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"sum by(namespace, job, node, source_sequencer) (daml_sequencer_bftordering_p2p_receive_received_bytes_total{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\"})\",\n \"format\": \"time_series\",\n \"intervalFactor\": 1,\n \"legendFormat\": \"(reporter: {{namespace}}.{{node}}) {{source_sequencer}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Total Network Input\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"description\": \"Total network egress for the currently selected sequencer split by destination.\",\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 100,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"never\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"normal\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"links\": [],\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": null\n }\n ]\n },\n \"unit\": \"bytes\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 14,\n \"w\": 6,\n \"x\": 18,\n \"y\": 151\n },\n \"id\": 58,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"single\",\n \"sort\": \"none\"\n }\n },\n \"pluginVersion\": \"10.1.5\",\n \"targets\": [\n {\n \"datasource\": {\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"sum by(namespace, job, node, target_sequencer) (daml_sequencer_bftordering_p2p_send_sent_bytes_total{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\"})\",\n \"format\": \"time_series\",\n \"intervalFactor\": 1,\n \"legendFormat\": \"(reporter: {{namespace}}.{{node}}) {{target_sequencer}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Total Network Output\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"description\": \"Number of payload bytes in requests within batches that are being disseminated.\",\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 10,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"decimals\": 0,\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"#7eb26d\",\n \"value\": null\n },\n {\n \"color\": \"#ef843c\",\n \"value\": 10\n },\n {\n \"color\": \"#e24d42\",\n \"value\": 20\n }\n ]\n },\n \"unit\": \"bytes\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 7,\n \"w\": 12,\n \"x\": 0,\n \"y\": 158\n },\n \"hideTimeOverride\": true,\n \"id\": 84,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"pluginVersion\": \"9.5.12\",\n \"targets\": [\n {\n \"datasource\": {\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"exemplar\": false,\n \"expr\": \"daml_sequencer_bftordering_availability_disseminating_bytes{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\",ready_for_consensus=~\\\"false|true\\\"}\",\n \"format\": \"time_series\",\n \"instant\": false,\n \"interval\": \"30s\",\n \"intervalFactor\": 1,\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Bytes being disseminated\",\n \"type\": \"timeseries\"\n }\n ],\n \"refresh\": \"5s\",\n \"schemaVersion\": 38,\n \"style\": \"dark\",\n \"tags\": [\n \"bft-sequencers\"\n ],\n \"templating\": {\n \"list\": [\n {\n \"allValue\": \".*\",\n \"current\": {\n \"selected\": true,\n \"text\": [\n \"All\"\n ],\n \"value\": [\n \"$__all\"\n ]\n },\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"definition\": \"label_values(daml_health_status,namespace}\",\n \"hide\": 0,\n \"includeAll\": true,\n \"label\": \"Namespace\",\n \"multi\": true,\n \"name\": \"namespace\",\n \"options\": [],\n \"query\": {\n \"qryType\": 1,\n \"query\": \"label_values(daml_health_status,namespace)\",\n \"refId\": \"PrometheusVariableQueryEditor-VariableQuery\"\n },\n \"refresh\": 2,\n \"regex\": \"\",\n \"skipUrlSync\": false,\n \"sort\": 7,\n \"type\": \"query\"\n },\n {\n \"allValue\": \".*\",\n \"current\": {\n \"selected\": true,\n \"text\": [\n \"All\"\n ],\n \"value\": [\n \"$__all\"\n ]\n },\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"definition\": \"label_values(daml_health_status{namespace=~\\\"$namespace\\\"},job)\",\n \"hide\": 0,\n \"includeAll\": true,\n \"label\": \"Job\",\n \"multi\": true,\n \"name\": \"job\",\n \"options\": [],\n \"query\": {\n \"qryType\": 1,\n \"query\": \"label_values(daml_health_status{namespace=~\\\"$namespace\\\"},job)\",\n \"refId\": \"PrometheusVariableQueryEditor-VariableQuery\"\n },\n \"refresh\": 2,\n \"regex\": \"\",\n \"skipUrlSync\": false,\n \"sort\": 7,\n \"type\": \"query\"\n },\n {\n \"allValue\": \".*\",\n \"current\": {\n \"selected\": true,\n \"text\": [\n \"All\"\n ],\n \"value\": [\n \"$__all\"\n ]\n },\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"definition\": \"label_values(daml_health_status{namespace=~\\\"$namespace\\\", job=~\\\"$job\\\"},node)\",\n \"hide\": 0,\n \"includeAll\": true,\n \"label\": \"Node\",\n \"multi\": true,\n \"name\": \"node\",\n \"options\": [],\n \"query\": {\n \"qryType\": 1,\n \"query\": \"label_values(daml_health_status{namespace=~\\\"$namespace\\\", job=~\\\"$job\\\"},node)\",\n \"refId\": \"PrometheusVariableQueryEditor-VariableQuery\"\n },\n \"refresh\": 2,\n \"regex\": \"\",\n \"skipUrlSync\": false,\n \"sort\": 7,\n \"type\": \"query\"\n },\n {\n \"current\": {\n \"selected\": true,\n \"text\": \".95\",\n \"value\": \".95\"\n },\n \"hide\": 0,\n \"includeAll\": false,\n \"label\": \"Percentile\",\n \"multi\": false,\n \"name\": \"percentile\",\n \"options\": [\n {\n \"selected\": false,\n \"text\": \".5\",\n \"value\": \".5\"\n },\n {\n \"selected\": false,\n \"text\": \".6\",\n \"value\": \".6\"\n },\n {\n \"selected\": false,\n \"text\": \".7\",\n \"value\": \".7\"\n },\n {\n \"selected\": false,\n \"text\": \".75\",\n \"value\": \".75\"\n },\n {\n \"selected\": false,\n \"text\": \".8\",\n \"value\": \".8\"\n },\n {\n \"selected\": false,\n \"text\": \".9\",\n \"value\": \".9\"\n },\n {\n \"selected\": true,\n \"text\": \".95\",\n \"value\": \".95\"\n },\n {\n \"selected\": false,\n \"text\": \".99\",\n \"value\": \".99\"\n },\n {\n \"selected\": false,\n \"text\": \".999\",\n \"value\": \".999\"\n }\n ],\n \"query\": \".5,.6,.7,.75,.8,.9,.95,.99,.999\",\n \"queryValue\": \"\",\n \"skipUrlSync\": false,\n \"type\": \"custom\"\n }\n ]\n },\n \"time\": {\n \"from\": \"now-15m\",\n \"to\": \"now\"\n },\n \"timepicker\": {\n \"refresh_intervals\": [\n \"5s\",\n \"10s\",\n \"30s\",\n \"1m\",\n \"5m\",\n \"15m\",\n \"30m\",\n \"1h\",\n \"2h\",\n \"1d\"\n ],\n \"time_options\": [\n \"5m\",\n \"15m\",\n \"1h\",\n \"6h\",\n \"12h\",\n \"24h\",\n \"2d\",\n \"7d\",\n \"30d\"\n ]\n },\n \"timezone\": \"\",\n \"title\": \"BFT ordering\",\n \"uid\": \"UJyurCTWz\",\n \"version\": 2,\n \"weekStart\": \"\"\n}\n" + "bft-ordering-performance.json": "{\n \"annotations\": {\n \"list\": [\n {\n \"builtIn\": 1,\n \"datasource\": {\n \"type\": \"grafana\",\n \"uid\": \"-- Grafana --\"\n },\n \"enable\": true,\n \"hide\": true,\n \"iconColor\": \"rgba(0, 211, 255, 1)\",\n \"name\": \"Annotations & Alerts\",\n \"type\": \"dashboard\"\n }\n ]\n },\n \"editable\": true,\n \"fiscalYearStartMonth\": 0,\n \"graphTooltip\": 1,\n \"id\": 8,\n \"links\": [],\n \"liveNow\": false,\n \"panels\": [\n {\n \"collapsed\": false,\n \"gridPos\": {\n \"h\": 1,\n \"w\": 24,\n \"x\": 0,\n \"y\": 0\n },\n \"id\": 16,\n \"panels\": [],\n \"title\": \"Global\",\n \"type\": \"row\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"description\": \"Wall-clock duration between the instant a request is received by the CantonBFT orderer and the instant the fully assembled ordered block metadata is stored, just before the request is pushed to the post-ordering stages. Its meaningfulness requires wall-clock synchronization, as not all ordered requests are received and timestamped on this node.\",\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 10,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": null\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n },\n \"unit\": \"s\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 12,\n \"w\": 12,\n \"x\": 0,\n \"y\": 1\n },\n \"id\": 14,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"histogram_quantile($percentile, sum by (namespace, job, node) (rate(daml_sequencer_bftordering_global_requests_ordering_latency_duration_seconds{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\"}[$__rate_interval])))\",\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Requests end-to-end ordering latency\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 10,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": null\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n },\n \"unit\": \"s\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 12,\n \"w\": 12,\n \"x\": 12,\n \"y\": 1\n },\n \"id\": 20,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"histogram_quantile($percentile, sum by (namespace, job, node, ordering_stage) (rate(daml_sequencer_bftordering_performance_ordering_stage_latency_duration_seconds{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\",ordering_stage=~\\\"batch-availability-total\\\"}[$__rate_interval])))\",\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Total batch dissemination and consensus time (permanence in availability module)\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"description\": \"Rate of blocks ordered and output to the read path.\",\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 0,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": null\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n },\n \"unit\": \"cps\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 17,\n \"w\": 8,\n \"x\": 0,\n \"y\": 13\n },\n \"id\": 107,\n \"options\": {\n \"legend\": {\n \"calcs\": [\n \"min\",\n \"max\",\n \"mean\"\n ],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"sum by (namespace, job, node, is_block_empty) (irate(daml_sequencer_bftordering_global_ordered_blocks_total{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\"}[$__rate_interval]))\",\n \"legendFormat\": \"{{namespace}}.{{node}} (empty: {{is_block_empty}})\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Throughput - blocks/s\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"description\": \"Rate of batches (proofs of availability) ordered and output to the read path.\",\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 0,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": null\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n },\n \"unit\": \"cps\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 17,\n \"w\": 8,\n \"x\": 8,\n \"y\": 13\n },\n \"id\": 108,\n \"options\": {\n \"legend\": {\n \"calcs\": [\n \"min\",\n \"max\",\n \"mean\"\n ],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"irate(daml_sequencer_bftordering_global_ordered_batches_total{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\"}[$__rate_interval])\",\n \"interval\": \"\",\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Throughput - batches/s\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 0,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": null\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n },\n \"unit\": \"cps\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 17,\n \"w\": 8,\n \"x\": 16,\n \"y\": 13\n },\n \"id\": 109,\n \"options\": {\n \"legend\": {\n \"calcs\": [\n \"min\",\n \"max\",\n \"mean\"\n ],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"exemplar\": false,\n \"expr\": \"sum by (namespace, job, node) (irate(daml_sequencer_bftordering_global_ordered_requests_total{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\"}[$__rate_interval]))\",\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Throughput - requests/s\",\n \"type\": \"timeseries\"\n },\n {\n \"collapsed\": true,\n \"gridPos\": {\n \"h\": 1,\n \"w\": 24,\n \"x\": 0,\n \"y\": 30\n },\n \"id\": 12,\n \"panels\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 10,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": null\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n },\n \"unit\": \"s\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 8,\n \"w\": 12,\n \"x\": 0,\n \"y\": 31\n },\n \"id\": 11,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"histogram_quantile($percentile, sum by(namespace, job, node) (rate(daml_sequencer_bftordering_performance_ordering_stage_latency_duration_seconds{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\",ordering_stage=~\\\"module-queue-PekkoP2PGrpcConnectionManagingActor\\\"}[$__rate_interval])))\",\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"PekkoP2PGrpcConnectionManagingActor queue latency\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 0,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": null\n }\n ]\n }\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 8,\n \"w\": 12,\n \"x\": 12,\n \"y\": 31\n },\n \"id\": 103,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"sum by (namespace, job, node) (daml_sequencer_bftordering_performance_moduleQueueSize_PekkoP2PGrpcConnectionManagingActor{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\"})\",\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"PekkoP2PGrpcConnectionManagingActor queue size\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"description\": \"Latency between sending a message and receiving it on the other side\",\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 10,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": null\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n },\n \"unit\": \"s\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 8,\n \"w\": 24,\n \"x\": 0,\n \"y\": 39\n },\n \"id\": 13,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"histogram_quantile($percentile, sum by (namespace, job, node, source_sequencer) (rate(daml_sequencer_bftordering_p2p_send_grpc_latency_duration_seconds{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\"}[$__rate_interval])))\",\n \"legendFormat\": \"(reporter: {{namespace}}.{{node}}) {{source_sequencer}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"P2P gRPC network latency\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"description\": \"The rate of gRPC message send retries\",\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 10,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": null\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n },\n \"unit\": \"none\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 8,\n \"w\": 24,\n \"x\": 0,\n \"y\": 47\n },\n \"id\": 15,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"single\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"sum by (namespace, job, node) (irate(daml_sequencer_bftordering_p2p_send_sends_retried{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\"}[$__rate_interval]))\",\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"gRPC send retry rate\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 10,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": null\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n },\n \"unit\": \"s\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 8,\n \"w\": 12,\n \"x\": 0,\n \"y\": 47\n },\n \"id\": 17,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"single\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"histogram_quantile($percentile, sum by (namespace, job, node) (rate(daml_sequencer_bftordering_p2p_send_network_write_latency_duration_seconds{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\"}[$__rate_interval])))\",\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"P2P network client write latency\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 10,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": null\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n },\n \"unit\": \"s\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 8,\n \"w\": 12,\n \"x\": 12,\n \"y\": 47\n },\n \"id\": 15,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"single\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"histogram_quantile($percentile, sum by(namespace, job, node) (rate(daml_sequencer_bftordering_p2p_receive_processing_latency_duration_seconds{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\"}[$__rate_interval])))\",\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"P2P receive processing latency\",\n \"type\": \"timeseries\"\n }\n ],\n \"title\": \"Networking\",\n \"type\": \"row\"\n },\n {\n \"collapsed\": true,\n \"gridPos\": {\n \"h\": 1,\n \"w\": 24,\n \"x\": 0,\n \"y\": 31\n },\n \"id\": 7,\n \"panels\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 10,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": null\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n },\n \"unit\": \"s\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 6,\n \"w\": 12,\n \"x\": 0,\n \"y\": 32\n },\n \"id\": 18,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"histogram_quantile($percentile, sum by (namespace, job, node) (rate(daml_sequencer_bftordering_performance_ordering_stage_latency_duration_seconds{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\",ordering_stage=~\\\"module-queue-mempool\\\"}[$__rate_interval])))\",\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Mempool module queue latency\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 0,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": null\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n }\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 6,\n \"w\": 12,\n \"x\": 12,\n \"y\": 32\n },\n \"id\": 101,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"daml_sequencer_bftordering_performance_moduleQueueSize_mempool{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\"}\",\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Mempool module queue size\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 10,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": null\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n },\n \"unit\": \"s\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 6,\n \"w\": 12,\n \"x\": 0,\n \"y\": 38\n },\n \"id\": 10,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"histogram_quantile($percentile, sum by (namespace, job, node) (rate(daml_sequencer_bftordering_performance_ordering_stage_latency_duration_seconds{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\",ordering_stage=~\\\"module-queue-availability\\\"}[$__rate_interval])))\",\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Availability module queue latency\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 0,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": null\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n }\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 6,\n \"w\": 12,\n \"x\": 12,\n \"y\": 38\n },\n \"id\": 102,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"daml_sequencer_bftordering_performance_moduleQueueSize_availability{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\"}\",\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Availability module queue size\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"description\": \"Time waited for a batch while there are outstanding consensus proposal requests and no dissemination is in progress\",\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 10,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": null\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n },\n \"unit\": \"s\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 6,\n \"w\": 12,\n \"x\": 0,\n \"y\": 44\n },\n \"id\": 24,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"histogram_quantile($percentile, sum by (namespace, job, node) (rate(daml_sequencer_bftordering_performance_ordering_stage_latency_duration_seconds{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\",ordering_stage=~\\\"batch-wait\\\"}[$__rate_interval])))\",\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Time spent waiting for batches\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"description\": \"Cumulative latency of a batch dissemination until a PoA is formed and it can be present multiple times for a given batch if it regresses due to topology changes\",\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 10,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": null\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n },\n \"unit\": \"s\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 6,\n \"w\": 12,\n \"x\": 12,\n \"y\": 44\n },\n \"id\": 21,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"histogram_quantile($percentile, sum by (namespace, job, node) (rate(daml_sequencer_bftordering_performance_ordering_stage_latency_duration_seconds{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\",ordering_stage=~\\\"batch-dissemination-total\\\"}[$__rate_interval])))\",\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Total dissemination time\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"description\": \"Insertion in proposal queue until next event, like re-sign, re-dissemination, [re-]proposal or batch ordered (emitted 1 or more times per batch)\",\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 10,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": null\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n },\n \"unit\": \"s\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 6,\n \"w\": 12,\n \"x\": 0,\n \"y\": 50\n },\n \"id\": 23,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"histogram_quantile($percentile, sum by (namespace, job, node) (rate(daml_sequencer_bftordering_performance_ordering_stage_latency_duration_seconds{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\",ordering_stage=~\\\"batch-queued-for-block-inclusion\\\"}[$__rate_interval])))\",\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Time waited for batch inclusion in consensus proposal\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"description\": \"Rate of regressions of a single batch due to topology changes\",\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 10,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": null\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n },\n \"unit\": \"none\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 6,\n \"w\": 12,\n \"x\": 12,\n \"y\": 50\n },\n \"id\": 3,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"irate(daml_sequencer_bftordering_availability_batch_regressions{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\"}[$__rate_interval])\",\n \"legendFormat\": \"{{namespace}}.{{node}}, {{stage}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Batch dissemination regressions rate\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 10,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": null\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n },\n \"unit\": \"s\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 6,\n \"w\": 12,\n \"x\": 0,\n \"y\": 56\n },\n \"id\": 4,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"histogram_quantile($percentile, sum by (namespace, job, node) (rate(daml_sequencer_bftordering_performance_ordering_stage_latency_duration_seconds{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\",ordering_stage=~\\\"availability-hash-batchId\\\"}[$__rate_interval])))\",\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Batch ID hashing latency\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 10,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": null\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n },\n \"unit\": \"s\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 6,\n \"w\": 12,\n \"x\": 12,\n \"y\": 56\n },\n \"id\": 5,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"histogram_quantile($percentile, sum by (namespace, job, node) (rate(daml_sequencer_bftordering_performance_ordering_stage_latency_duration_seconds{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\",ordering_stage=~\\\"availability-sign-local-batchId\\\"}[$__rate_interval])))\",\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Local Batch ID signing latency\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"description\": \"Insertion in batch queue until extraction and batch send to availability\",\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 10,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": null\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n },\n \"unit\": \"s\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 6,\n \"w\": 12,\n \"x\": 0,\n \"y\": 62\n },\n \"id\": 9,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"histogram_quantile($percentile, sum by (namespace, job, node) (rate(daml_sequencer_bftordering_performance_ordering_stage_latency_duration_seconds{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\",ordering_stage=~\\\"request-queued-for-batch-inclusion\\\"}[$__rate_interval])))\",\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Request batch inclusion latency\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 10,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": null\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n },\n \"unit\": \"s\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 6,\n \"w\": 12,\n \"x\": 12,\n \"y\": 62\n },\n \"id\": 6,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"histogram_quantile($percentile, sum by (namespace, job, node) (rate(daml_sequencer_bftordering_performance_ordering_stage_latency_duration_seconds{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\",ordering_stage=~\\\"availability-sign-remote-batchId\\\"}[$__rate_interval])))\",\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Remote batch ID signing latency\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 10,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": null\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n },\n \"unit\": \"s\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 6,\n \"w\": 12,\n \"x\": 0,\n \"y\": 68\n },\n \"id\": 26,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"histogram_quantile($percentile, sum by (namespace, job, node) (rate(daml_sequencer_bftordering_performance_ordering_stage_latency_duration_seconds{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\",ordering_stage=~\\\"availability-sign-local-batches\\\"}[$__rate_interval])))\",\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Sign local batches\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 10,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": null\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n },\n \"unit\": \"s\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 6,\n \"w\": 12,\n \"x\": 12,\n \"y\": 68\n },\n \"id\": 8,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"histogram_quantile($percentile, sum by (namespace, job, node) (rate(daml_sequencer_bftordering_performance_ordering_stage_latency_duration_seconds{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\",ordering_stage=~\\\"availability-signature-verify-ack\\\"}[$__rate_interval])))\",\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Batch ID signature verification\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 10,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": null\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n },\n \"unit\": \"s\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 6,\n \"w\": 12,\n \"x\": 0,\n \"y\": 74\n },\n \"id\": 82,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"histogram_quantile($percentile, sum by (namespace, job, node) (rate(daml_sequencer_bftordering_performance_ordering_stage_latency_duration_seconds{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\",ordering_stage=~\\\"com.digitalasset.canton.synchronizer.sequencer.block.bftordering.core.modules.availability.data.db.DbAvailabilityStore.addBatch\\\"}[$__rate_interval])))\",\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Insert batch\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 10,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": null\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n },\n \"unit\": \"s\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 6,\n \"w\": 12,\n \"x\": 12,\n \"y\": 74\n },\n \"id\": 28,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"histogram_quantile($percentile, sum by (namespace, job, node) (rate(daml_sequencer_bftordering_performance_ordering_stage_latency_duration_seconds{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\",ordering_stage=~\\\"com.digitalasset.canton.synchronizer.sequencer.block.bftordering.core.modules.availability.data.db.DbAvailabilityStore.fetchBatches\\\"}[$__rate_interval])))\",\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Fetch local batches from DB\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 10,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": null\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n },\n \"unit\": \"s\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 6,\n \"w\": 12,\n \"x\": 0,\n \"y\": 80\n },\n \"id\": 22,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"histogram_quantile($percentile, sum by (namespace, job, node) (rate(daml_sequencer_bftordering_performance_ordering_stage_latency_duration_seconds{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\",ordering_stage=~\\\"batch-validation\\\"}[$__rate_interval])))\",\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Batch validation\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"description\": \"Summary of cache hits, misses, and evictions for the Availability store's batch data cache\",\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 10,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"decimals\": 0,\n \"links\": [],\n \"mappings\": [],\n \"min\": 0,\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": null\n }\n ]\n },\n \"unit\": \"none\"\n },\n \"overrides\": [\n {\n \"matcher\": {\n \"id\": \"byName\",\n \"options\": \"Height for last 3 hours\"\n },\n \"properties\": [\n {\n \"id\": \"color\",\n \"value\": {\n \"fixedColor\": \"#447ebc\",\n \"mode\": \"fixed\"\n }\n }\n ]\n },\n {\n \"matcher\": {\n \"id\": \"byName\",\n \"options\": \"Total Transactions for last 3 hours\"\n },\n \"properties\": [\n {\n \"id\": \"color\",\n \"value\": {\n \"fixedColor\": \"#ef843c\",\n \"mode\": \"fixed\"\n }\n }\n ]\n }\n ]\n },\n \"gridPos\": {\n \"h\": 6,\n \"w\": 12,\n \"x\": 12,\n \"y\": 80\n },\n \"hideTimeOverride\": false,\n \"id\": 110,\n \"options\": {\n \"legend\": {\n \"calcs\": [\n \"mean\",\n \"max\"\n ],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"pluginVersion\": \"10.1.5\",\n \"targets\": [\n {\n \"datasource\": {\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"sum by (namespace, job, node) (irate(daml_cache_hits{namespace=~\\\"$namespace\\\", job=~\\\"$job\\\", node=~\\\"$node\\\", cache=\\\"batch-cache\\\"}[$__rate_interval]))\",\n \"format\": \"time_series\",\n \"instant\": false,\n \"interval\": \"\",\n \"intervalFactor\": 1,\n \"legendFormat\": \"{{namespace}}.{{node}} Cache Hits\",\n \"refId\": \"A\"\n },\n {\n \"datasource\": {\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"sum by (namespace, job, node) (irate(daml_cache_misses{namespace=~\\\"$namespace\\\", job=~\\\"$job\\\", node=~\\\"$node\\\", cache=\\\"batch-cache\\\"}[$__rate_interval]))\",\n \"format\": \"time_series\",\n \"hide\": false,\n \"instant\": false,\n \"interval\": \"\",\n \"intervalFactor\": 1,\n \"legendFormat\": \"{{namespace}}.{{node}} Cache Misses\",\n \"refId\": \"B\"\n },\n {\n \"datasource\": {\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"sum by (namespace, job, node) (irate(daml_cache_evictions{namespace=~\\\"$namespace\\\", job=~\\\"$job\\\", node=~\\\"$node\\\", cache=\\\"batch-cache\\\"}[$__rate_interval]))\",\n \"format\": \"time_series\",\n \"hide\": false,\n \"instant\": false,\n \"interval\": \"\",\n \"intervalFactor\": 1,\n \"legendFormat\": \"{{namespace}}.{{node}} Cache Evictions\",\n \"refId\": \"C\"\n }\n ],\n \"title\": \"Availability Store Cache Statistics\",\n \"type\": \"timeseries\"\n }\n ],\n \"title\": \"Mempool+Availability\",\n \"type\": \"row\"\n },\n {\n \"collapsed\": true,\n \"gridPos\": {\n \"h\": 1,\n \"w\": 24,\n \"x\": 0,\n \"y\": 32\n },\n \"id\": 45,\n \"panels\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 10,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": null\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n },\n \"unit\": \"s\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 7,\n \"w\": 12,\n \"x\": 0,\n \"y\": 33\n },\n \"id\": 80,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"histogram_quantile($percentile, sum by (namespace, job, node) (rate(daml_sequencer_bftordering_performance_ordering_stage_latency_duration_seconds{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\",ordering_stage=~\\\"module-queue-consensus\\\"}[$__rate_interval])))\",\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Consensus module queue latency\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 0,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": null\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n }\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 7,\n \"w\": 12,\n \"x\": 12,\n \"y\": 33\n },\n \"id\": 104,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"daml_sequencer_bftordering_performance_moduleQueueSize_consensus{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\"}\",\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Consensus module queue size\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 10,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": null\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n },\n \"unit\": \"s\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 7,\n \"w\": 12,\n \"x\": 0,\n \"y\": 40\n },\n \"id\": 81,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"histogram_quantile($percentile, sum by (namespace, job, node) (rate(daml_sequencer_bftordering_performance_ordering_stage_latency_duration_seconds{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\",ordering_stage=~\\\"module-queue-segment-module\\\"}[$__rate_interval])))\",\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Segment module queue latency\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 0,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": null\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n }\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 7,\n \"w\": 12,\n \"x\": 12,\n \"y\": 40\n },\n \"id\": 105,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"daml_sequencer_bftordering_performance_moduleQueueSize_segment_module{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\"}\",\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Segment module queue size\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"description\": \"Block commit time at the consensus (PBFT) level.\",\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 10,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"decimals\": 2,\n \"mappings\": [\n {\n \"options\": {\n \"match\": \"null\",\n \"result\": {\n \"text\": \"N/A\"\n }\n },\n \"type\": \"special\"\n }\n ],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": null\n },\n {\n \"color\": \"red\",\n \"value\": 2\n }\n ]\n },\n \"unit\": \"s\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 7,\n \"w\": 12,\n \"x\": 0,\n \"y\": 47\n },\n \"hideTimeOverride\": true,\n \"id\": 39,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"pluginVersion\": \"10.4.0\",\n \"targets\": [\n {\n \"datasource\": {\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"exemplar\": false,\n \"expr\": \"histogram_quantile($percentile, sum by (namespace, job, node) (rate(daml_sequencer_bftordering_consensus_commit_latency_duration_seconds{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\"}[$__rate_interval])))\",\n \"format\": \"time_series\",\n \"instant\": false,\n \"interval\": \"30s\",\n \"intervalFactor\": 1,\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Consensus Block Latency\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"description\": \"Time elapsed between sending a PrePrepare and seeing that the block has been ordered\",\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 10,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": null\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n },\n \"unit\": \"s\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 7,\n \"w\": 12,\n \"x\": 12,\n \"y\": 47\n },\n \"id\": 46,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"histogram_quantile($percentile, sum by (namespace, job, node) (rate(daml_sequencer_bftordering_performance_ordering_stage_latency_duration_seconds{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\",ordering_stage=~\\\"consensus-segment-proposal-to-commit-latency\\\"}[$__rate_interval])))\",\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Consensus segment block proposal to commit latency\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"description\": \"Time elapsed between ordered blocks proposed by a segment\",\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 10,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\"\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n },\n \"unit\": \"s\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 6,\n \"w\": 12,\n \"x\": 0,\n \"y\": 54\n },\n \"id\": 88,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"histogram_quantile($percentile, sum by (namespace, job, node) (rate(daml_sequencer_bftordering_performance_ordering_stage_latency_duration_seconds{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\",ordering_stage=~\\\"consensus-segment-block-commit-latency\\\"}[$__rate_interval])))\",\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Consensus segment block ordering latency\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"description\": \"Time between a proposal request to the availability module needed to continue a segment and a PrePrepare being built\",\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 10,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\"\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n },\n \"unit\": \"s\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 6,\n \"w\": 12,\n \"x\": 12,\n \"y\": 54\n },\n \"id\": 87,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"histogram_quantile($percentile, sum by (namespace, job, node) (rate(daml_sequencer_bftordering_performance_ordering_stage_latency_duration_seconds{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\",ordering_stage=~\\\"consensus-block-proposal-wait\\\"}[$__rate_interval])))\",\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Wait for proposal\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"description\": \"Time between the epoch completion and the start of the next epoch\",\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 10,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\"\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n },\n \"unit\": \"s\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 7,\n \"w\": 12,\n \"x\": 0,\n \"y\": 60\n },\n \"id\": 86,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"histogram_quantile($percentile, sum by (namespace, job, node) (rate(daml_sequencer_bftordering_performance_ordering_stage_latency_duration_seconds{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\",ordering_stage=~\\\"consensus-epoch-start-wait\\\"}[$__rate_interval])))\",\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Wait for epoch start\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"description\": \"Time between the last led segment's completion and the epoch completion\",\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 10,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\"\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n },\n \"unit\": \"s\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 7,\n \"w\": 12,\n \"x\": 12,\n \"y\": 60\n },\n \"id\": 83,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"histogram_quantile($percentile, sum by (namespace, job, node) (rate(daml_sequencer_bftordering_performance_ordering_stage_latency_duration_seconds{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\",ordering_stage=~\\\"consensus-epoch-completion-wait\\\"}[$__rate_interval])))\",\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Wait for epoch completion\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 10,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\"\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n },\n \"unit\": \"s\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 6,\n \"w\": 12,\n \"x\": 0,\n \"y\": 67\n },\n \"id\": 63,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"histogram_quantile($percentile, sum by (namespace, job, node) (rate(daml_sequencer_bftordering_performance_ordering_stage_latency_duration_seconds{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\",ordering_stage=~\\\"com.digitalasset.canton.synchronizer.sequencer.block.bftordering.core.modules.consensus.iss.data.db.DbEpochStore.startEpoch\\\"}[$__rate_interval])))\",\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Start epoch (DB)\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 10,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\"\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n },\n \"unit\": \"s\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 6,\n \"w\": 12,\n \"x\": 12,\n \"y\": 67\n },\n \"id\": 47,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"histogram_quantile($percentile, sum by (namespace, job, node) (rate(daml_sequencer_bftordering_performance_ordering_stage_latency_duration_seconds{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\",ordering_stage=~\\\"com.digitalasset.canton.synchronizer.sequencer.block.bftordering.core.modules.consensus.iss.data.db.DbEpochStore.completeEpoch\\\"}[$__rate_interval])))\",\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Complete epoch (DB)\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 10,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\"\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n },\n \"unit\": \"s\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 7,\n \"w\": 12,\n \"x\": 0,\n \"y\": 73\n },\n \"id\": 64,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"histogram_quantile($percentile, sum by (namespace, job, node) (rate(daml_sequencer_bftordering_performance_ordering_stage_latency_duration_seconds{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\",ordering_stage=~\\\"com.digitalasset.canton.synchronizer.sequencer.block.bftordering.core.modules.consensus.iss.data.db.DbEpochStore.addPrePrepare\\\"}[$__rate_interval])))\",\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Insert pre-prepare\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 10,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\"\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n },\n \"unit\": \"s\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 7,\n \"w\": 12,\n \"x\": 12,\n \"y\": 73\n },\n \"id\": 50,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"histogram_quantile($percentile, sum by (namespace, job, node) (rate(daml_sequencer_bftordering_performance_ordering_stage_latency_duration_seconds{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\",ordering_stage=~\\\"com.digitalasset.canton.synchronizer.sequencer.block.bftordering.core.modules.consensus.iss.data.db.DbEpochStore.addPreparesAtomically\\\"}[$__rate_interval])))\",\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Insert prepares\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 10,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\"\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n },\n \"unit\": \"s\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 6,\n \"w\": 12,\n \"x\": 0,\n \"y\": 80\n },\n \"id\": 52,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"histogram_quantile($percentile, sum by (namespace, job, node) (rate(daml_sequencer_bftordering_performance_ordering_stage_latency_duration_seconds{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\",ordering_stage=~\\\"com.digitalasset.canton.synchronizer.sequencer.block.bftordering.core.modules.consensus.iss.data.db.DbEpochStore.addOrderedBlockAtomically\\\"}[$__rate_interval])))\",\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Insert ordered block\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 10,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\"\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n },\n \"unit\": \"s\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 6,\n \"w\": 12,\n \"x\": 12,\n \"y\": 80\n },\n \"id\": 66,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"histogram_quantile($percentile, sum by (namespace, job, node) (rate(daml_sequencer_bftordering_performance_ordering_stage_latency_duration_seconds{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\",ordering_stage=~\\\"consensus-signature-verify-poa-ack\\\"}[$__rate_interval])))\",\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Check PoA ack signature\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 10,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\"\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n },\n \"unit\": \"s\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 7,\n \"w\": 12,\n \"x\": 0,\n \"y\": 86\n },\n \"id\": 68,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"histogram_quantile($percentile, sum by (namespace, job, node) (rate(daml_sequencer_bftordering_performance_ordering_stage_latency_duration_seconds{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\",ordering_stage=~\\\"consensus-validate-signed-message\\\"}[$__rate_interval])))\",\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Validate message\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 10,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\"\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n },\n \"unit\": \"s\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 7,\n \"w\": 12,\n \"x\": 12,\n \"y\": 86\n },\n \"id\": 76,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"histogram_quantile($percentile, sum by (namespace, job, node) (rate(daml_sequencer_bftordering_performance_ordering_stage_latency_duration_seconds{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\",ordering_stage=~\\\"sign-BftSignedConsensusMessage\\\"}[$__rate_interval])))\",\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Sign message\",\n \"type\": \"timeseries\"\n }\n ],\n \"title\": \"Consensus - main protocol\",\n \"type\": \"row\"\n },\n {\n \"collapsed\": true,\n \"gridPos\": {\n \"h\": 1,\n \"w\": 24,\n \"x\": 0,\n \"y\": 33\n },\n \"id\": 89,\n \"panels\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 10,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": null\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n },\n \"unit\": \"none\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 7,\n \"w\": 24,\n \"x\": 0,\n \"y\": 34\n },\n \"id\": 51,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"irate(daml_sequencer_bftordering_consensus_epoch_view_changes{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\"}[$__rate_interval])\",\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"View changes occurred (rate)\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 10,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": null\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n },\n \"unit\": \"s\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 7,\n \"w\": 12,\n \"x\": 0,\n \"y\": 41\n },\n \"id\": 84,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"histogram_quantile($percentile, sum by (namespace, job, node) (rate(daml_sequencer_bftordering_performance_ordering_stage_latency_duration_seconds{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\",ordering_stage=~\\\"com.digitalasset.canton.synchronizer.sequencer.block.bftordering.core.modules.consensus.iss.data.db.DbEpochStore.addViewChangeMessage\\\"}[$__rate_interval])))\",\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Insert view change message\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 10,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": null\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n },\n \"unit\": \"s\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 7,\n \"w\": 12,\n \"x\": 12,\n \"y\": 41\n },\n \"id\": 77,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"histogram_quantile($percentile, sum by (namespace, job, node) (rate(daml_sequencer_bftordering_performance_ordering_stage_latency_duration_seconds{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\",ordering_stage=~\\\"consensus-postponed-view-messages-queue-latency\\\"}[$__rate_interval])))\",\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Postponed view messages queue latency\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 0,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\"\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n }\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 7,\n \"w\": 12,\n \"x\": 0,\n \"y\": 48\n },\n \"id\": 97,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"irate(daml_sequencer_bftordering_consensus_postponed_view_messages_queue_size{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\"}[$__rate_interval])\",\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Postponed view messages queue size\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 0,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\"\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n }\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 7,\n \"w\": 12,\n \"x\": 12,\n \"y\": 48\n },\n \"id\": 95,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"daml_sequencer_bftordering_consensus_postponed_view_messages_queue_max_size{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\"}\",\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Postponed view messages queue max size\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 0,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\"\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n }\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 7,\n \"w\": 12,\n \"x\": 0,\n \"y\": 55\n },\n \"id\": 94,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"irate(daml_sequencer_bftordering_consensus_postponed_view_messages_dropped_total{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\"}[$__rate_interval])\",\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Postponed view messages dropped (rate)\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 0,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\"\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n }\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 7,\n \"w\": 12,\n \"x\": 12,\n \"y\": 55\n },\n \"id\": 100,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"irate(daml_sequencer_bftordering_consensus_postponed_view_messages_duplicates_total{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\"}[$__rate_interval])\",\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Postponed view messages duplicated (rate)\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 0,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": null\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n },\n \"unit\": \"s\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 7,\n \"w\": 12,\n \"x\": 0,\n \"y\": 62\n },\n \"id\": 112,\n \"options\": {\n \"legend\": {\n \"calcs\": [\n \"min\",\n \"mean\",\n \"max\"\n ],\n \"displayMode\": \"table\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"histogram_quantile($percentile, sum by(namespace, job, node, Leader) (rate(daml_sequencer_bftordering_consensus_view_change_progress_latency_duration_seconds{namespace=~\\\"$namespace\\\", job=~\\\"$job\\\", node=~\\\"$node\\\"}[$__rate_interval])))\",\n \"interval\": \"\",\n \"legendFormat\": \"(reporter: {{namespace}}.{{node}}) {{Leader}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Time until progress in view\",\n \"type\": \"timeseries\"\n }\n ],\n \"title\": \"Consensus - view change\",\n \"type\": \"row\"\n },\n {\n \"collapsed\": true,\n \"gridPos\": {\n \"h\": 1,\n \"w\": 24,\n \"x\": 0,\n \"y\": 34\n },\n \"id\": 90,\n \"panels\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 10,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": null\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n },\n \"unit\": \"s\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 7,\n \"w\": 12,\n \"x\": 0,\n \"y\": 35\n },\n \"id\": 72,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"histogram_quantile($percentile, sum by (namespace, job, node) (rate(daml_sequencer_bftordering_performance_ordering_stage_latency_duration_seconds{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\",ordering_stage=~\\\"consensus-validate-consensus-certificate\\\"}[$__rate_interval])))\",\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Validate state transfer consensus certificate\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"description\": \"Time to transfer a given epoch from peer(s)\",\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 10,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": null\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n },\n \"unit\": \"s\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 7,\n \"w\": 12,\n \"x\": 12,\n \"y\": 80\n },\n \"id\": 111,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"single\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"histogram_quantile($percentile, sum by (namespace, job, node) (rate(daml_sequencer_bftordering_performance_ordering_stage_latency_duration_seconds{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\", ordering_stage=~\\\"state-transfer-total-epoch-transfer-latency\\\"}[$__rate_interval])))\",\n \"legendFormat\": \"Data transfer\",\n \"range\": true,\n \"refId\": \"A\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"histogram_quantile($percentile, sum by (namespace, job, node) (rate(daml_sequencer_bftordering_performance_ordering_stage_latency_duration_seconds{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\", ordering_stage=~\\\"state-transfer-store-epochs\\\"}[$__rate_interval])))\",\n \"hide\": false,\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"B\"\n }\n ],\n \"title\": \"Epoch Transfer Duration\",\n \"transformations\": [\n {\n \"id\": \"calculateField\",\n \"options\": {\n \"alias\": \"Total epoch transfer duration\",\n \"binary\": {\n \"left\": \"Data transfer\",\n \"reducer\": \"sum\",\n \"right\": \"Complete + start DB query\"\n },\n \"mode\": \"binary\",\n \"reduce\": {\n \"reducer\": \"sum\"\n }\n }\n }\n ],\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 10,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": null\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n },\n \"unit\": \"s\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 7,\n \"w\": 12,\n \"x\": 0,\n \"y\": 42\n },\n \"id\": 91,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"histogram_quantile($percentile, sum by (namespace, job, node) (rate(daml_sequencer_bftordering_performance_ordering_stage_latency_duration_seconds{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\",ordering_stage=~\\\"state-transfer-postponed-consensus-messages-queue-latency\\\"}[$__rate_interval])))\",\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Postponed consensus messages queue latency\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 0,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": null\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n }\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 7,\n \"w\": 12,\n \"x\": 12,\n \"y\": 42\n },\n \"id\": 96,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"daml_sequencer_bftordering_consensus_state_transfer_postponed_consensus_messages_queue_size{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\"}\",\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Postponed consensus messages queue size\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 0,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\"\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n }\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 7,\n \"w\": 12,\n \"x\": 0,\n \"y\": 49\n },\n \"id\": 98,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"daml_sequencer_bftordering_consensus_state_transfer_postponed_consensus_messages_queue_max_size{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\"}\",\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Postponed consensus messages queue max size\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 0,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\"\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n }\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 7,\n \"w\": 12,\n \"x\": 12,\n \"y\": 49\n },\n \"id\": 99,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"irate(daml_sequencer_bftordering_consensus_state_transfer_postponed_consensus_messages_dropped{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\"}[$__rate_interval])\",\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Postponed consensus messages dropped (rate)\",\n \"type\": \"timeseries\"\n }\n ],\n \"title\": \"Consensus - state transfer\",\n \"type\": \"row\"\n },\n {\n \"collapsed\": true,\n \"gridPos\": {\n \"h\": 1,\n \"w\": 24,\n \"x\": 0,\n \"y\": 35\n },\n \"id\": 38,\n \"panels\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 0,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": null\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n }\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 6,\n \"w\": 12,\n \"x\": 0,\n \"y\": 36\n },\n \"id\": 85,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"irate(daml_sequencer_bftordering_consensus_incoming_retransmission_requests_total{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\"}[$__rate_interval])\",\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Incoming retransmission requests rate\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 0,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": null\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n }\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 6,\n \"w\": 12,\n \"x\": 12,\n \"y\": 36\n },\n \"id\": 40,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"irate(daml_sequencer_bftordering_consensus_outgoing_retransmission_requests_total{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\"}[$__rate_interval])\",\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Outgoing retransmission requests rate\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 0,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": null\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n }\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 6,\n \"w\": 12,\n \"x\": 0,\n \"y\": 42\n },\n \"id\": 41,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"irate(daml_sequencer_bftordering_consensus_retransmitted_messages_total{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\"}[$__rate_interval])\",\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Retransmitted messages rate\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 0,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": null\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n }\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 6,\n \"w\": 12,\n \"x\": 12,\n \"y\": 42\n },\n \"id\": 42,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"irate(daml_sequencer_bftordering_consensus_retransmitted_commit_certificates_total{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\"}[$__rate_interval])\",\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Retransmitted commit certificates rate\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 10,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\"\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n },\n \"unit\": \"s\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 6,\n \"w\": 12,\n \"x\": 0,\n \"y\": 48\n },\n \"id\": 78,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"histogram_quantile($percentile, sum by (namespace, job, node) (rate(daml_sequencer_bftordering_performance_ordering_stage_latency_duration_seconds{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\",ordering_stage=~\\\"sign-BftSignedRetransmissionMessage\\\"}[$__rate_interval])))\",\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Sign retransmission message\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 10,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\"\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n },\n \"unit\": \"s\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 6,\n \"w\": 12,\n \"x\": 12,\n \"y\": 48\n },\n \"id\": 79,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"histogram_quantile($percentile, sum by (namespace, job, node) (rate(daml_sequencer_bftordering_performance_ordering_stage_latency_duration_seconds{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\",ordering_stage=~\\\"verify-signature-BftSignedRetransmissionMessage\\\"}[$__rate_interval])))\",\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Verify retransmission message signature\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 0,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\"\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n }\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 6,\n \"w\": 12,\n \"x\": 0,\n \"y\": 54\n },\n \"id\": 43,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"irate(daml_sequencer_bftordering_consensus_discarded_wrong_epoch_retransmission_responses_total{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\"}[$__rate_interval])\",\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Retransmission responses discarded due to wrong epoch - rate\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 0,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\"\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n }\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 6,\n \"w\": 12,\n \"x\": 12,\n \"y\": 54\n },\n \"id\": 44,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"irate(daml_sequencer_bftordering_consensus_discarded_rate_limited_retransmission_requests_total{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\"}[$__rate_interval])\",\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Retransmission requests discarded due to rate limiting - rate\",\n \"type\": \"timeseries\"\n }\n ],\n \"title\": \"Consensus - retransmissions\",\n \"type\": \"row\"\n },\n {\n \"collapsed\": true,\n \"gridPos\": {\n \"h\": 1,\n \"w\": 24,\n \"x\": 0,\n \"y\": 36\n },\n \"id\": 59,\n \"panels\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 10,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": null\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n },\n \"unit\": \"s\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 8,\n \"w\": 12,\n \"x\": 0,\n \"y\": 37\n },\n \"id\": 48,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"histogram_quantile($percentile, sum by (namespace, job, node) (rate(daml_sequencer_bftordering_performance_ordering_stage_latency_duration_seconds{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\",ordering_stage=~\\\"com.digitalasset.canton.synchronizer.sequencer.block.bftordering.core.modules.consensus.iss.data.db.DbEpochStore.latestEpoch\\\"}[$__rate_interval])))\",\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Load latest epoch\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 10,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": null\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n },\n \"unit\": \"s\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 8,\n \"w\": 12,\n \"x\": 12,\n \"y\": 37\n },\n \"id\": 53,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"histogram_quantile($percentile, sum by (namespace, job, node) (rate(daml_sequencer_bftordering_performance_ordering_stage_latency_duration_seconds{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\",ordering_stage=~\\\"com.digitalasset.canton.synchronizer.sequencer.block.bftordering.core.modules.consensus.iss.data.db.DbEpochStore.loadEpochProgress\\\"}[$__rate_interval])))\",\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Load epoch progress\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 10,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": null\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n },\n \"unit\": \"s\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 8,\n \"w\": 24,\n \"x\": 0,\n \"y\": 45\n },\n \"id\": 54,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"histogram_quantile($percentile, sum by (namespace, job, node) (rate(daml_sequencer_bftordering_performance_ordering_stage_latency_duration_seconds{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\",ordering_stage=~\\\"com.digitalasset.canton.synchronizer.sequencer.block.bftordering.core.modules.consensus.iss.data.db.DbEpochStore.loadCompleteBlocks\\\"}[$__rate_interval])))\",\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Load completed blocks\",\n \"type\": \"timeseries\"\n }\n ],\n \"title\": \"Consensus - CFT\",\n \"type\": \"row\"\n },\n {\n \"collapsed\": true,\n \"gridPos\": {\n \"h\": 1,\n \"w\": 24,\n \"x\": 0,\n \"y\": 37\n },\n \"id\": 29,\n \"panels\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 10,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": null\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n },\n \"unit\": \"s\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 7,\n \"w\": 12,\n \"x\": 0,\n \"y\": 38\n },\n \"id\": 55,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"histogram_quantile($percentile, sum by (namespace, job, node) (rate(daml_sequencer_bftordering_performance_ordering_stage_latency_duration_seconds{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\",ordering_stage=~\\\"module-queue-output\\\"}[$__rate_interval])))\",\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Output module queue latency\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 0,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": null\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n }\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 7,\n \"w\": 12,\n \"x\": 12,\n \"y\": 38\n },\n \"id\": 106,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"daml_sequencer_bftordering_performance_moduleQueueSize_output{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\"}\",\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Output module queue size\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"description\": \"Time needed to inspect requests within a block\",\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 10,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": null\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n },\n \"unit\": \"s\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 7,\n \"w\": 12,\n \"x\": 0,\n \"y\": 45\n },\n \"id\": 36,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"histogram_quantile($percentile, sum by (namespace, job, node) (rate(daml_sequencer_bftordering_performance_ordering_stage_latency_duration_seconds{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\",ordering_stage=~\\\"output-block-inspection\\\"}[$__rate_interval])))\",\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Block inspection\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 10,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": null\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n },\n \"unit\": \"s\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 7,\n \"w\": 12,\n \"x\": 12,\n \"y\": 45\n },\n \"id\": 30,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"histogram_quantile($percentile, sum by (namespace, job, node) (rate(daml_sequencer_bftordering_performance_ordering_stage_latency_duration_seconds{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\",ordering_stage=~\\\"output-block-fetch-batches\\\"}[$__rate_interval])))\",\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Total block batches fetch time\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 10,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\"\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n },\n \"unit\": \"s\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 7,\n \"w\": 12,\n \"x\": 0,\n \"y\": 52\n },\n \"id\": 37,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"histogram_quantile($percentile, sum by (namespace, job, node) (rate(daml_sequencer_bftordering_performance_ordering_stage_latency_duration_seconds{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\",ordering_stage=~\\\"com.digitalasset.canton.synchronizer.sequencer.block.bftordering.core.modules.output.data.db.DbOutputMetadataStore.insertBlockIfMissing\\\"}[$__rate_interval])))\",\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Insert block\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 10,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\"\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n },\n \"unit\": \"s\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 7,\n \"w\": 12,\n \"x\": 12,\n \"y\": 52\n },\n \"id\": 34,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": false\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"histogram_quantile($percentile, sum by (namespace, job, node) (rate(daml_sequencer_bftordering_topology_query_latency_duration_seconds{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\"}[$__rate_interval])))\",\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Query topology\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 10,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\"\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n },\n \"unit\": \"s\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 7,\n \"w\": 12,\n \"x\": 0,\n \"y\": 59\n },\n \"id\": 31,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"histogram_quantile($percentile, sum by (namespace, job, node) (rate(daml_sequencer_bftordering_performance_ordering_stage_latency_duration_seconds{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\",ordering_stage=~\\\"com.digitalasset.canton.synchronizer.sequencer.block.bftordering.core.modules.output.data.db.DbOutputMetadataStore.insertLeaderSelectionPolicyState\\\"}[$__rate_interval])))\",\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Save blacklist leader selection policy state\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 10,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\"\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n },\n \"unit\": \"s\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 7,\n \"w\": 12,\n \"x\": 12,\n \"y\": 59\n },\n \"id\": 32,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"histogram_quantile($percentile, sum by (namespace, job, node) (rate(daml_sequencer_bftordering_performance_ordering_stage_latency_duration_seconds{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\",ordering_stage=~\\\"com.digitalasset.canton.synchronizer.sequencer.block.bftordering.core.modules.output.data.db.DbOutputMetadataStore.insertEpochIfMissing\\\"}[$__rate_interval])))\",\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Insert epoch metadata\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 10,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": null\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n },\n \"unit\": \"s\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 7,\n \"w\": 12,\n \"x\": 0,\n \"y\": 66\n },\n \"id\": 113,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"histogram_quantile($percentile, sum by (namespace, job, node) (rate(daml_sequencer_bftordering_performance_ordering_stage_latency_duration_seconds{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\",ordering_stage=~\\\"output-backpressure\\\"}[$__rate_interval])))\",\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Sequencer core backpressure duration\",\n \"type\": \"timeseries\"\n }\n ],\n \"title\": \"Output\",\n \"type\": \"row\"\n },\n {\n \"collapsed\": true,\n \"gridPos\": {\n \"h\": 1,\n \"w\": 24,\n \"x\": 0,\n \"y\": 38\n },\n \"id\": 60,\n \"panels\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 10,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": null\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n },\n \"unit\": \"s\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 8,\n \"w\": 24,\n \"x\": 0,\n \"y\": 39\n },\n \"id\": 35,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"histogram_quantile($percentile, sum by (namespace, job, node) (rate(daml_sequencer_bftordering_performance_ordering_stage_latency_duration_seconds{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\",ordering_stage=~\\\"com.digitalasset.canton.synchronizer.sequencer.block.bftordering.core.modules.consensus.iss.data.db.DbEpochStore.loadEpochInfo\\\"}[$__rate_interval])))\",\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Load epoch info\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 10,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": null\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n },\n \"unit\": \"s\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 8,\n \"w\": 24,\n \"x\": 0,\n \"y\": 47\n },\n \"id\": 56,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"histogram_quantile($percentile, sum by (namespace, job, node) (rate(daml_sequencer_bftordering_performance_ordering_stage_latency_duration_seconds{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\",ordering_stage=~\\\"com.digitalasset.canton.synchronizer.sequencer.block.bftordering.core.modules.consensus.iss.data.db.DbEpochStore.loadOrderedBlocks\\\"}[$__rate_interval])))\",\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Load ordered blocks\",\n \"type\": \"timeseries\"\n }\n ],\n \"title\": \"Output - CFT\",\n \"type\": \"row\"\n },\n {\n \"collapsed\": true,\n \"gridPos\": {\n \"h\": 1,\n \"w\": 24,\n \"x\": 0,\n \"y\": 39\n },\n \"id\": 62,\n \"panels\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"description\": \"Time to compute the pruning point, based on retention factors and current time\",\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 10,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": null\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n },\n \"unit\": \"s\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 7,\n \"w\": 12,\n \"x\": 0,\n \"y\": 40\n },\n \"id\": 25,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"histogram_quantile($percentile, sum by (namespace, job, node) (rate(daml_sequencer_bftordering_performance_ordering_stage_latency_duration_seconds{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\",ordering_stage=~\\\"pruning-compute-pruning-point\\\"}[$__rate_interval])))\",\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Compute pruning point\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"description\": \"Time to evict unordered, but expired, batches in the availability DB\",\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 10,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": null\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n },\n \"unit\": \"s\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 7,\n \"w\": 12,\n \"x\": 12,\n \"y\": 40\n },\n \"id\": 27,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"histogram_quantile($percentile, sum by (namespace, job, node) (rate(daml_sequencer_bftordering_performance_ordering_stage_latency_duration_seconds{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\",ordering_stage=~\\\"com.digitalasset.canton.synchronizer.sequencer.block.bftordering.core.modules.availability.data.db.DbAvailabilityStore.gc\\\"}[$__rate_interval])))\",\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Availability DB - evict expired batches\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"description\": \"Time to create new table partitions, when necessary\",\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 10,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": null\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n },\n \"unit\": \"s\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 7,\n \"w\": 12,\n \"x\": 0,\n \"y\": 47\n },\n \"id\": 61,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"histogram_quantile($percentile, sum by (namespace, job, node) (rate(daml_sequencer_bftordering_performance_ordering_stage_latency_duration_seconds{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\",ordering_stage=~\\\"com.digitalasset.canton.synchronizer.sequencer.block.bftordering.core.modules.pruning.PartitionManager.PartitionCreatorImpl.createPartitionsIfNeeded\\\"}[$__rate_interval])))\",\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Create partitions\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"description\": \"Time to drop table partitions that can be pruned\",\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 10,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": null\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n },\n \"unit\": \"s\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 7,\n \"w\": 12,\n \"x\": 12,\n \"y\": 47\n },\n \"id\": 67,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"histogram_quantile($percentile, sum by (namespace, job, node) (rate(daml_sequencer_bftordering_performance_ordering_stage_latency_duration_seconds{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\",ordering_stage=~\\\"com.digitalasset.canton.synchronizer.sequencer.block.bftordering.core.modules.pruning.PartitionManager.PartitionPrunerImpl.prune\\\"}[$__rate_interval])))\",\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Prune (Delete partitions)\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"description\": \"Time to start the Partition Manager, which may include creating new partitions\",\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 10,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": null\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n },\n \"unit\": \"s\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 7,\n \"w\": 12,\n \"x\": 12,\n \"y\": 47\n },\n \"id\": 69,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"histogram_quantile($percentile, sum by (namespace, job, node) (rate(daml_sequencer_bftordering_performance_ordering_stage_latency_duration_seconds{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\",ordering_stage=~\\\"com.digitalasset.canton.synchronizer.sequencer.block.bftordering.core.modules.pruning.PartitionManager.create\\\"}[$__rate_interval])))\",\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Partition manager startup\",\n \"type\": \"timeseries\"\n }\n ],\n \"title\": \"Pruning\",\n \"type\": \"row\"\n }\n ],\n \"refresh\": \"30s\",\n \"schemaVersion\": 38,\n \"style\": \"dark\",\n \"tags\": [],\n \"templating\": {\n \"list\": [\n {\n \"allValue\": \".*\",\n \"current\": {\n \"selected\": false,\n \"text\": \"All\",\n \"value\": \"$__all\"\n },\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"definition\": \"label_values(daml_health_status,namespace}\",\n \"hide\": 0,\n \"includeAll\": true,\n \"multi\": true,\n \"name\": \"namespace\",\n \"label\": \"Namespace\",\n \"options\": [],\n \"query\": {\n \"qryType\": 1,\n \"query\": \"label_values(daml_health_status,namespace)\",\n \"refId\": \"PrometheusVariableQueryEditor-VariableQuery\"\n },\n \"refresh\": 2,\n \"regex\": \"\",\n \"skipUrlSync\": false,\n \"sort\": 7,\n \"type\": \"query\"\n },\n {\n \"allValue\": \".*\",\n \"current\": {\n \"selected\": true,\n \"text\": [\n \"All\"\n ],\n \"value\": [\n \"$__all\"\n ]\n },\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"definition\": \"label_values(daml_health_status{namespace=~\\\"$namespace\\\"},job)\",\n \"hide\": 0,\n \"includeAll\": true,\n \"multi\": true,\n \"name\": \"job\",\n \"label\": \"Job\",\n \"options\": [],\n \"query\": {\n \"qryType\": 1,\n \"query\": \"label_values(daml_health_status{namespace=~\\\"$namespace\\\"},job)\",\n \"refId\": \"PrometheusVariableQueryEditor-VariableQuery\"\n },\n \"refresh\": 2,\n \"regex\": \"\",\n \"skipUrlSync\": false,\n \"sort\": 7,\n \"type\": \"query\"\n },\n {\n \"allValue\": \".*\",\n \"current\": {\n \"selected\": true,\n \"text\": [\n \"All\"\n ],\n \"value\": [\n \"$__all\"\n ]\n },\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"definition\": \"label_values(daml_health_status{namespace=~\\\"$namespace\\\", job=~\\\"$job\\\"},node)\",\n \"hide\": 0,\n \"includeAll\": true,\n \"multi\": true,\n \"name\": \"node\",\n \"label\": \"Node\",\n \"options\": [],\n \"query\": {\n \"qryType\": 1,\n \"query\": \"label_values(daml_health_status{namespace=~\\\"$namespace\\\", job=~\\\"$job\\\"},node)\",\n \"refId\": \"PrometheusVariableQueryEditor-VariableQuery\"\n },\n \"refresh\": 2,\n \"regex\": \"\",\n \"skipUrlSync\": false,\n \"sort\": 7,\n \"type\": \"query\"\n },\n {\n \"current\": {\n \"selected\": true,\n \"text\": \".95\",\n \"value\": \".95\"\n },\n \"hide\": 0,\n \"includeAll\": false,\n \"label\": \"Percentile\",\n \"multi\": false,\n \"name\": \"percentile\",\n \"options\": [\n {\n \"selected\": false,\n \"text\": \".5\",\n \"value\": \".5\"\n },\n {\n \"selected\": false,\n \"text\": \".6\",\n \"value\": \".6\"\n },\n {\n \"selected\": false,\n \"text\": \".7\",\n \"value\": \".7\"\n },\n {\n \"selected\": false,\n \"text\": \".75\",\n \"value\": \".75\"\n },\n {\n \"selected\": false,\n \"text\": \".8\",\n \"value\": \".8\"\n },\n {\n \"selected\": false,\n \"text\": \".9\",\n \"value\": \".9\"\n },\n {\n \"selected\": true,\n \"text\": \".95\",\n \"value\": \".95\"\n },\n {\n \"selected\": false,\n \"text\": \".99\",\n \"value\": \".99\"\n },\n {\n \"selected\": false,\n \"text\": \".999\",\n \"value\": \".999\"\n }\n ],\n \"query\": \".5,.6,.7,.75,.8,.9,.95,.99,.999\",\n \"queryValue\": \"\",\n \"skipUrlSync\": false,\n \"type\": \"custom\"\n }\n ]\n },\n \"time\": {\n \"from\": \"now-5m\",\n \"to\": \"now\"\n },\n \"timepicker\": {},\n \"timezone\": \"\",\n \"title\": \"BFT ordering (performance)\",\n \"uid\": \"c2237cb1-9018-41ac-8eef-24a28ab28f20\",\n \"version\": 1,\n \"weekStart\": \"\"\n}\n", + "bft-ordering.json": "{\n \"annotations\": {\n \"list\": [\n {\n \"builtIn\": 1,\n \"datasource\": {\n \"type\": \"grafana\",\n \"uid\": \"-- Grafana --\"\n },\n \"enable\": true,\n \"hide\": true,\n \"iconColor\": \"rgba(0, 211, 255, 1)\",\n \"name\": \"Annotations & Alerts\",\n \"type\": \"dashboard\"\n }\n ]\n },\n \"description\": \"\",\n \"editable\": true,\n \"fiscalYearStartMonth\": 0,\n \"graphTooltip\": 1,\n \"id\": 8,\n \"links\": [],\n \"liveNow\": false,\n \"panels\": [\n {\n \"collapsed\": false,\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"gridPos\": {\n \"h\": 1,\n \"w\": 24,\n \"x\": 0,\n \"y\": 0\n },\n \"id\": 64,\n \"panels\": [],\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Global overview (instance view)\",\n \"type\": \"row\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"description\": \"ISS proceeds in epochs with stable leader assignments to \\\"segments\\\" and stable topology (i.e., sequencers can be added and remove only at epoch boundaries and leaders are reassigned to segments also at epoch boundaries). This is the current epoch.\",\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"thresholds\"\n },\n \"decimals\": 0,\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": null\n }\n ]\n },\n \"unit\": \"locale\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 11,\n \"w\": 5,\n \"x\": 0,\n \"y\": 1\n },\n \"hideTimeOverride\": false,\n \"id\": 72,\n \"maxDataPoints\": 100,\n \"options\": {\n \"colorMode\": \"value\",\n \"graphMode\": \"none\",\n \"justifyMode\": \"auto\",\n \"orientation\": \"horizontal\",\n \"reduceOptions\": {\n \"calcs\": [\n \"lastNotNull\"\n ],\n \"fields\": \"\",\n \"values\": false\n },\n \"showPercentChange\": false,\n \"textMode\": \"auto\",\n \"wideLayout\": true\n },\n \"pluginVersion\": \"9.5.12\",\n \"targets\": [\n {\n \"datasource\": {\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"daml_sequencer_bftordering_consensus_epoch{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\"}\",\n \"format\": \"time_series\",\n \"interval\": \"30s\",\n \"intervalFactor\": 1,\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Current Epoch\",\n \"type\": \"stat\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"description\": \"Size in blocks of the current epoch.\",\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"thresholds\"\n },\n \"decimals\": 0,\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": null\n }\n ]\n },\n \"unit\": \"locale\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 11,\n \"w\": 3,\n \"x\": 5,\n \"y\": 1\n },\n \"hideTimeOverride\": false,\n \"id\": 80,\n \"maxDataPoints\": 100,\n \"options\": {\n \"colorMode\": \"value\",\n \"graphMode\": \"none\",\n \"justifyMode\": \"auto\",\n \"orientation\": \"horizontal\",\n \"reduceOptions\": {\n \"calcs\": [\n \"lastNotNull\"\n ],\n \"fields\": \"\",\n \"values\": false\n },\n \"showPercentChange\": false,\n \"textMode\": \"auto\",\n \"wideLayout\": true\n },\n \"pluginVersion\": \"9.5.12\",\n \"targets\": [\n {\n \"datasource\": {\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"daml_sequencer_bftordering_consensus_epoch_length{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\"}\",\n \"format\": \"time_series\",\n \"interval\": \"30s\",\n \"intervalFactor\": 1,\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Epoch Length\",\n \"type\": \"stat\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"description\": \"Number of active validators\",\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"thresholds\"\n },\n \"decimals\": 0,\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": null\n }\n ]\n },\n \"unit\": \"locale\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 11,\n \"w\": 3,\n \"x\": 8,\n \"y\": 1\n },\n \"hideTimeOverride\": false,\n \"id\": 75,\n \"maxDataPoints\": 100,\n \"options\": {\n \"colorMode\": \"value\",\n \"graphMode\": \"none\",\n \"justifyMode\": \"auto\",\n \"orientation\": \"horizontal\",\n \"reduceOptions\": {\n \"calcs\": [\n \"lastNotNull\"\n ],\n \"fields\": \"\",\n \"values\": false\n },\n \"showPercentChange\": false,\n \"textMode\": \"auto\",\n \"wideLayout\": true\n },\n \"pluginVersion\": \"9.5.12\",\n \"targets\": [\n {\n \"datasource\": {\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"daml_sequencer_bftordering_topology_validators{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\"}\",\n \"format\": \"time_series\",\n \"interval\": \"30s\",\n \"intervalFactor\": 1,\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Validators\",\n \"type\": \"stat\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"description\": \"Number of connected and authenticated P2P peers for the selected sequencer. It should be > 2/3 at all times.\",\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"thresholds\"\n },\n \"decimals\": 0,\n \"mappings\": [],\n \"min\": 0,\n \"thresholds\": {\n \"mode\": \"percentage\",\n \"steps\": [\n {\n \"color\": \"dark-red\",\n \"value\": null\n },\n {\n \"color\": \"#EAB839\",\n \"value\": 67\n },\n {\n \"color\": \"dark-green\",\n \"value\": 100\n }\n ]\n },\n \"unit\": \"short\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 11,\n \"w\": 13,\n \"x\": 11,\n \"y\": 1\n },\n \"hideTimeOverride\": true,\n \"id\": 53,\n \"options\": {\n \"colorMode\": \"value\",\n \"graphMode\": \"area\",\n \"justifyMode\": \"center\",\n \"orientation\": \"auto\",\n \"reduceOptions\": {\n \"calcs\": [\n \"last\"\n ],\n \"fields\": \"\",\n \"values\": false\n },\n \"textMode\": \"auto\"\n },\n \"pluginVersion\": \"9.5.12\",\n \"targets\": [\n {\n \"datasource\": {\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"exemplar\": false,\n \"expr\": \"daml_sequencer_bftordering_p2p_connections_connected{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\"}\",\n \"format\": \"time_series\",\n \"instant\": true,\n \"interval\": \"30s\",\n \"intervalFactor\": 1,\n \"legendFormat\": \"Connected ({{namespace}}.{{node}})\",\n \"range\": false,\n \"refId\": \"A\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"exemplar\": false,\n \"expr\": \"daml_sequencer_bftordering_p2p_connections_authenticated{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\"}\",\n \"hide\": false,\n \"instant\": true,\n \"legendFormat\": \"Authenticated ({{namespace}}.{{node}})\",\n \"range\": false,\n \"refId\": \"B\"\n }\n ],\n \"title\": \"Peers count\",\n \"type\": \"stat\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"description\": \"\",\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"thresholds\"\n },\n \"decimals\": 0,\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": null\n }\n ]\n },\n \"unit\": \"locale\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 12,\n \"w\": 3,\n \"x\": 0,\n \"y\": 12\n },\n \"hideTimeOverride\": false,\n \"id\": 99,\n \"maxDataPoints\": 100,\n \"options\": {\n \"colorMode\": \"value\",\n \"graphMode\": \"none\",\n \"justifyMode\": \"auto\",\n \"orientation\": \"horizontal\",\n \"reduceOptions\": {\n \"calcs\": [\n \"lastNotNull\"\n ],\n \"fields\": \"\",\n \"values\": false\n },\n \"showPercentChange\": false,\n \"textMode\": \"auto\",\n \"wideLayout\": true\n },\n \"pluginVersion\": \"9.5.12\",\n \"targets\": [\n {\n \"datasource\": {\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"daml_sequencer_bftordering_topology_max_tolerated_faults{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\"}\",\n \"format\": \"time_series\",\n \"interval\": \"30s\",\n \"intervalFactor\": 1,\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Max tolerated faults\",\n \"type\": \"stat\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"description\": \"The size of a weak quorum or non-faulty nodes, needed e.g. to disseminate batches\",\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"thresholds\"\n },\n \"decimals\": 0,\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": null\n }\n ]\n },\n \"unit\": \"locale\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 12,\n \"w\": 3,\n \"x\": 3,\n \"y\": 12\n },\n \"hideTimeOverride\": false,\n \"id\": 100,\n \"maxDataPoints\": 100,\n \"options\": {\n \"colorMode\": \"value\",\n \"graphMode\": \"none\",\n \"justifyMode\": \"auto\",\n \"orientation\": \"horizontal\",\n \"reduceOptions\": {\n \"calcs\": [\n \"lastNotNull\"\n ],\n \"fields\": \"\",\n \"values\": false\n },\n \"showPercentChange\": false,\n \"textMode\": \"auto\",\n \"wideLayout\": true\n },\n \"pluginVersion\": \"9.5.12\",\n \"targets\": [\n {\n \"datasource\": {\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"daml_sequencer_bftordering_topology_weak_quorum{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\"}\",\n \"format\": \"time_series\",\n \"interval\": \"30s\",\n \"intervalFactor\": 1,\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Weak quorum\",\n \"type\": \"stat\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"description\": \"The size of a strong quorum, needed for ordering consensus\",\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"thresholds\"\n },\n \"decimals\": 0,\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": null\n }\n ]\n },\n \"unit\": \"locale\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 12,\n \"w\": 3,\n \"x\": 6,\n \"y\": 12\n },\n \"hideTimeOverride\": false,\n \"id\": 101,\n \"maxDataPoints\": 100,\n \"options\": {\n \"colorMode\": \"value\",\n \"graphMode\": \"none\",\n \"justifyMode\": \"auto\",\n \"orientation\": \"horizontal\",\n \"reduceOptions\": {\n \"calcs\": [\n \"lastNotNull\"\n ],\n \"fields\": \"\",\n \"values\": false\n },\n \"showPercentChange\": false,\n \"textMode\": \"auto\",\n \"wideLayout\": true\n },\n \"pluginVersion\": \"9.5.12\",\n \"targets\": [\n {\n \"datasource\": {\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"daml_sequencer_bftordering_topology_strong_quorum{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\"}\",\n \"format\": \"time_series\",\n \"interval\": \"30s\",\n \"intervalFactor\": 1,\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Strong quorum\",\n \"type\": \"stat\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"description\": \"Latest block number ordered and available for the read path. When there is no traffic, a block can be empty.\",\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"thresholds\"\n },\n \"decimals\": 0,\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": null\n }\n ]\n },\n \"unit\": \"locale\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 12,\n \"w\": 7,\n \"x\": 9,\n \"y\": 12\n },\n \"hideTimeOverride\": false,\n \"id\": 4,\n \"maxDataPoints\": 100,\n \"options\": {\n \"colorMode\": \"value\",\n \"graphMode\": \"none\",\n \"justifyMode\": \"auto\",\n \"orientation\": \"horizontal\",\n \"reduceOptions\": {\n \"calcs\": [\n \"lastNotNull\"\n ],\n \"fields\": \"\",\n \"values\": false\n },\n \"showPercentChange\": false,\n \"textMode\": \"auto\",\n \"wideLayout\": true\n },\n \"pluginVersion\": \"9.5.12\",\n \"targets\": [\n {\n \"datasource\": {\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"sum by(namespace, job, node) (daml_sequencer_bftordering_global_ordered_blocks_total{namespace=~\\\"$namespace\\\", job=~\\\"$job\\\", node=~\\\"$node\\\"})\",\n \"format\": \"time_series\",\n \"hide\": false,\n \"instant\": true,\n \"interval\": \"30s\",\n \"intervalFactor\": 1,\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Total Output Blocks\",\n \"type\": \"stat\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"description\": \"Total number of requests ordered and output to the read path.\",\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"thresholds\"\n },\n \"decimals\": 0,\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": null\n }\n ]\n },\n \"unit\": \"locale\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 12,\n \"w\": 8,\n \"x\": 16,\n \"y\": 12\n },\n \"hideTimeOverride\": false,\n \"id\": 40,\n \"maxDataPoints\": 100,\n \"options\": {\n \"colorMode\": \"value\",\n \"graphMode\": \"none\",\n \"justifyMode\": \"auto\",\n \"orientation\": \"horizontal\",\n \"reduceOptions\": {\n \"calcs\": [\n \"lastNotNull\"\n ],\n \"fields\": \"\",\n \"values\": false\n },\n \"showPercentChange\": false,\n \"textMode\": \"auto\",\n \"wideLayout\": true\n },\n \"pluginVersion\": \"9.5.12\",\n \"targets\": [\n {\n \"datasource\": {\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"sum by (namespace,job,node) (histogram_sum(daml_sequencer_bftordering_output_block_size_requests{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\"}))\",\n \"format\": \"time_series\",\n \"interval\": \"30s\",\n \"intervalFactor\": 1,\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Total Output Requests\",\n \"type\": \"stat\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"description\": \"Sequencers that are part of the BFT ordering topology\",\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisGridShow\": true,\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 0,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"normal\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": null\n }\n ]\n }\n },\n \"overrides\": [\n {\n \"matcher\": {\n \"id\": \"byName\",\n \"options\": \"Value\"\n },\n \"properties\": [\n {\n \"id\": \"custom.axisPlacement\",\n \"value\": \"hidden\"\n }\n ]\n }\n ]\n },\n \"gridPos\": {\n \"h\": 21,\n \"w\": 12,\n \"x\": 0,\n \"y\": 24\n },\n \"id\": 91,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"single\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"daml_sequencer_bftordering_topology_topology_member{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\"}\",\n \"interval\": \"\",\n \"legendFormat\": \" (reporter: {{namespace}}.{{node}}) {{sequencer_id}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"BFT ordering members\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"description\": \"Sequencers that are allowed to propose blocks for ordering\",\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 0,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"normal\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": null\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n }\n },\n \"overrides\": [\n {\n \"matcher\": {\n \"id\": \"byName\",\n \"options\": \"Value\"\n },\n \"properties\": [\n {\n \"id\": \"custom.axisPlacement\",\n \"value\": \"hidden\"\n }\n ]\n }\n ]\n },\n \"gridPos\": {\n \"h\": 21,\n \"w\": 12,\n \"x\": 12,\n \"y\": 24\n },\n \"id\": 95,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"single\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"daml_sequencer_bftordering_topology_topology_leader{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\"}\",\n \"legendFormat\": \" (reporter: {{namespace}}.{{node}}) {{sequencer_id}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"BFT ordering leaders\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"description\": \"\",\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 0,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"normal\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": null\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n }\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 21,\n \"w\": 8,\n \"x\": 0,\n \"y\": 45\n },\n \"id\": 96,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"single\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"exemplar\": false,\n \"expr\": \"daml_sequencer_bftordering_p2p_authenticated_endpoint{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\"}\",\n \"format\": \"time_series\",\n \"instant\": false,\n \"legendFormat\": \"(reporter: {{namespace}}.{{node}}) {{endpoint}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"P2P authenticated endpoints\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"description\": \"\",\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 0,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": null\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n }\n },\n \"overrides\": [\n {\n \"matcher\": {\n \"id\": \"byName\",\n \"options\": \"Value\"\n },\n \"properties\": [\n {\n \"id\": \"custom.axisPlacement\",\n \"value\": \"hidden\"\n }\n ]\n }\n ]\n },\n \"gridPos\": {\n \"h\": 21,\n \"w\": 8,\n \"x\": 8,\n \"y\": 45\n },\n \"id\": 97,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"single\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"daml_sequencer_bftordering_p2p_unauthenticated_endpoint{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\"}\",\n \"legendFormat\": \"(reporter: {{namespace}}.{{node}}) {{endpoint}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"P2P connected but unauthenticated endpoints\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"description\": \"\",\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"hidden\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 0,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": null\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n }\n },\n \"overrides\": [\n {\n \"matcher\": {\n \"id\": \"byName\",\n \"options\": \"Value\"\n },\n \"properties\": [\n {\n \"id\": \"custom.axisPlacement\",\n \"value\": \"hidden\"\n }\n ]\n }\n ]\n },\n \"gridPos\": {\n \"h\": 21,\n \"w\": 8,\n \"x\": 16,\n \"y\": 45\n },\n \"id\": 98,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"single\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"daml_sequencer_bftordering_p2p_disconnected_endpoint{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\"}\",\n \"legendFormat\": \"(reporter: {{namespace}}.{{node}}) {{endpoint}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"P2P disconnected endpoints\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"description\": \"Wall-clock duration between the instant a request is received by the CantonBFT orderer and the instant the fully assembled ordered block metadata is stored, just before the request is pushed to the post-ordering stages. Its meaningfulness requires wall-clock synchronization, as not all ordered requests are received and timestamped on this node.\",\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 10,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": null\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n },\n \"unit\": \"s\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 7,\n \"w\": 12,\n \"x\": 0,\n \"y\": 66\n },\n \"id\": 87,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"histogram_quantile($percentile, sum by (namespace, job, node) (rate(daml_sequencer_bftordering_global_requests_ordering_latency_duration_seconds{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\"}[$__rate_interval])))\",\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Requests end-to-end ordering latency\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"description\": \"Rate of requests ordered and output to the read path.\",\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 10,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"decimals\": 2,\n \"links\": [],\n \"mappings\": [],\n \"min\": 0,\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": 0\n }\n ]\n },\n \"unit\": \"cps\"\n },\n \"overrides\": [\n {\n \"matcher\": {\n \"id\": \"byName\",\n \"options\": \"Height for last 3 hours\"\n },\n \"properties\": [\n {\n \"id\": \"color\",\n \"value\": {\n \"fixedColor\": \"#447ebc\",\n \"mode\": \"fixed\"\n }\n }\n ]\n },\n {\n \"matcher\": {\n \"id\": \"byName\",\n \"options\": \"Total Transactions for last 3 hours\"\n },\n \"properties\": [\n {\n \"id\": \"color\",\n \"value\": {\n \"fixedColor\": \"#ef843c\",\n \"mode\": \"fixed\"\n }\n }\n ]\n }\n ]\n },\n \"gridPos\": {\n \"h\": 7,\n \"w\": 12,\n \"x\": 12,\n \"y\": 66\n },\n \"hideTimeOverride\": true,\n \"id\": 88,\n \"options\": {\n \"legend\": {\n \"calcs\": [\n \"mean\",\n \"max\",\n \"sum\"\n ],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"hideZeros\": false,\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"pluginVersion\": \"10.4.0\",\n \"targets\": [\n {\n \"datasource\": {\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"sum by (namespace, job, node) (irate(daml_sequencer_bftordering_global_ordered_requests_total{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\"}[$__rate_interval]))\",\n \"format\": \"time_series\",\n \"instant\": false,\n \"interval\": \"\",\n \"intervalFactor\": 1,\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Throughput - requests/s\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"description\": \"Number of requests per consensus block.\",\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 10,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"decimals\": 2,\n \"links\": [],\n \"mappings\": [],\n \"min\": 0,\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": 0\n }\n ]\n },\n \"unit\": \"cps\"\n },\n \"overrides\": [\n {\n \"matcher\": {\n \"id\": \"byName\",\n \"options\": \"Height for last 3 hours\"\n },\n \"properties\": [\n {\n \"id\": \"color\",\n \"value\": {\n \"fixedColor\": \"#447ebc\",\n \"mode\": \"fixed\"\n }\n }\n ]\n },\n {\n \"matcher\": {\n \"id\": \"byName\",\n \"options\": \"Total Transactions for last 3 hours\"\n },\n \"properties\": [\n {\n \"id\": \"color\",\n \"value\": {\n \"fixedColor\": \"#ef843c\",\n \"mode\": \"fixed\"\n }\n }\n ]\n }\n ]\n },\n \"gridPos\": {\n \"h\": 7,\n \"w\": 12,\n \"x\": 0,\n \"y\": 73\n },\n \"hideTimeOverride\": true,\n \"id\": 49,\n \"options\": {\n \"legend\": {\n \"calcs\": [\n \"mean\",\n \"max\",\n \"sum\"\n ],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"hideZeros\": false,\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"pluginVersion\": \"10.4.0\",\n \"targets\": [\n {\n \"datasource\": {\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"histogram_sum(sum by(namespace, job, node, mode) (rate(daml_sequencer_bftordering_output_block_size_requests{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\"}[$__rate_interval]))) / histogram_count(sum by(namespace, job, node, mode) (rate(daml_sequencer_bftordering_output_block_size_requests{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\"}[$__rate_interval])))\",\n \"format\": \"time_series\",\n \"instant\": false,\n \"interval\": \"\",\n \"intervalFactor\": 1,\n \"legendFormat\": \"{{namespace}}.{{node}} ({{mode}})\",\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Requests / Block\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"description\": \"Rate of blocks ordered and output to the read path.\",\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 10,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"decimals\": 2,\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": 0\n }\n ]\n },\n \"unit\": \"cps\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 7,\n \"w\": 12,\n \"x\": 12,\n \"y\": 73\n },\n \"hideTimeOverride\": true,\n \"id\": 68,\n \"options\": {\n \"legend\": {\n \"calcs\": [\n \"min\",\n \"max\",\n \"mean\"\n ],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"hideZeros\": false,\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"pluginVersion\": \"10.4.0\",\n \"targets\": [\n {\n \"datasource\": {\n \"uid\": \"prometheus\"\n },\n \"disableTextWrap\": false,\n \"editorMode\": \"code\",\n \"exemplar\": false,\n \"expr\": \"sum by (namespace, job, node, is_block_empty) (irate(daml_sequencer_bftordering_global_ordered_blocks_total{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\"}[$__rate_interval]))\",\n \"format\": \"time_series\",\n \"fullMetaSearch\": false,\n \"hide\": false,\n \"includeNullMetadata\": true,\n \"instant\": false,\n \"interval\": \"\",\n \"intervalFactor\": 1,\n \"legendFormat\": \"{{namespace}}.{{node}} (empty: {{is_block_empty}})\",\n \"range\": true,\n \"refId\": \"A\",\n \"useBackend\": false\n }\n ],\n \"title\": \"Throughput - blocks/s\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"description\": \"Number of batches (proofs of availability) per consensus block. Note that < 1 average batch per block likely means empty blocks are being created.\",\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 10,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"decimals\": 2,\n \"links\": [],\n \"mappings\": [],\n \"min\": 0,\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": 0\n }\n ]\n },\n \"unit\": \"cps\"\n },\n \"overrides\": [\n {\n \"matcher\": {\n \"id\": \"byName\",\n \"options\": \"Height for last 3 hours\"\n },\n \"properties\": [\n {\n \"id\": \"color\",\n \"value\": {\n \"fixedColor\": \"#447ebc\",\n \"mode\": \"fixed\"\n }\n }\n ]\n },\n {\n \"matcher\": {\n \"id\": \"byName\",\n \"options\": \"Total Transactions for last 3 hours\"\n },\n \"properties\": [\n {\n \"id\": \"color\",\n \"value\": {\n \"fixedColor\": \"#ef843c\",\n \"mode\": \"fixed\"\n }\n }\n ]\n }\n ]\n },\n \"gridPos\": {\n \"h\": 7,\n \"w\": 12,\n \"x\": 0,\n \"y\": 80\n },\n \"hideTimeOverride\": true,\n \"id\": 89,\n \"options\": {\n \"legend\": {\n \"calcs\": [\n \"mean\",\n \"max\",\n \"sum\"\n ],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"hideZeros\": false,\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"pluginVersion\": \"10.4.0\",\n \"targets\": [\n {\n \"datasource\": {\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"histogram_sum(sum by(namespace, job, node, mode) (rate(daml_sequencer_bftordering_output_block_size_batches{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\"}[$__rate_interval]))) / histogram_count(sum by(namespace, job, node, mode) (rate(daml_sequencer_bftordering_output_block_size_batches{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\"}[$__rate_interval])))\",\n \"format\": \"time_series\",\n \"instant\": false,\n \"interval\": \"\",\n \"intervalFactor\": 1,\n \"legendFormat\": \"{{namespace}}.{{node}} ({{mode}})\",\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Batches (PoAs) / Block\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"description\": \"Rate of batches (proofs of availability) ordered and output to the read path.\",\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 10,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"decimals\": 2,\n \"links\": [],\n \"mappings\": [],\n \"min\": 0,\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": 0\n }\n ]\n },\n \"unit\": \"cps\"\n },\n \"overrides\": [\n {\n \"matcher\": {\n \"id\": \"byName\",\n \"options\": \"Height for last 3 hours\"\n },\n \"properties\": [\n {\n \"id\": \"color\",\n \"value\": {\n \"fixedColor\": \"#447ebc\",\n \"mode\": \"fixed\"\n }\n }\n ]\n },\n {\n \"matcher\": {\n \"id\": \"byName\",\n \"options\": \"Total Transactions for last 3 hours\"\n },\n \"properties\": [\n {\n \"id\": \"color\",\n \"value\": {\n \"fixedColor\": \"#ef843c\",\n \"mode\": \"fixed\"\n }\n }\n ]\n }\n ]\n },\n \"gridPos\": {\n \"h\": 7,\n \"w\": 12,\n \"x\": 12,\n \"y\": 80\n },\n \"hideTimeOverride\": true,\n \"id\": 90,\n \"options\": {\n \"legend\": {\n \"calcs\": [\n \"min\",\n \"max\",\n \"mean\"\n ],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"hideZeros\": false,\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"pluginVersion\": \"10.4.0\",\n \"targets\": [\n {\n \"datasource\": {\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"irate(daml_sequencer_bftordering_global_ordered_batches_total{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\"}[$__rate_interval])\",\n \"format\": \"time_series\",\n \"instant\": false,\n \"interval\": \"\",\n \"intervalFactor\": 1,\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Throughput - batches/s\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"description\": \"Delay introduced by the sequencer core being too slow consuming blocks from ordering, in milliseconds\",\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 10,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"decimals\": 0,\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": 0\n }\n ]\n },\n \"unit\": \"ms\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 7,\n \"w\": 12,\n \"x\": 0,\n \"y\": 87\n },\n \"hideTimeOverride\": true,\n \"id\": 102,\n \"options\": {\n \"legend\": {\n \"calcs\": [\n \"max\"\n ],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"hideZeros\": false,\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"pluginVersion\": \"10.4.0\",\n \"targets\": [\n {\n \"datasource\": {\n \"uid\": \"prometheus\"\n },\n \"disableTextWrap\": false,\n \"editorMode\": \"code\",\n \"exemplar\": false,\n \"expr\": \"daml_sequencer_bftordering_sequencer_core_backpressure_current_delay_millis{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\"}\",\n \"format\": \"time_series\",\n \"fullMetaSearch\": false,\n \"hide\": false,\n \"includeNullMetadata\": true,\n \"instant\": false,\n \"interval\": \"\",\n \"intervalFactor\": 1,\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\",\n \"useBackend\": false\n }\n ],\n \"title\": \"Sequencer core backpressure delay (ms)\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"description\": \"Size of the buffer in the subscription from the orderer to the sequencer core, in blocks\",\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 10,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"decimals\": 0,\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": 0\n }\n ]\n },\n \"unit\": \"none\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 7,\n \"w\": 12,\n \"x\": 12,\n \"y\": 87\n },\n \"hideTimeOverride\": true,\n \"id\": 103,\n \"options\": {\n \"legend\": {\n \"calcs\": [\n \"max\",\n \"min\",\n \"mean\"\n ],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"hideZeros\": false,\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"pluginVersion\": \"10.4.0\",\n \"targets\": [\n {\n \"datasource\": {\n \"uid\": \"prometheus\"\n },\n \"disableTextWrap\": false,\n \"editorMode\": \"code\",\n \"exemplar\": false,\n \"expr\": \"daml_sequencer_bftordering_sequencer_core_subscription_buffer_size{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\"}\\n\",\n \"format\": \"time_series\",\n \"fullMetaSearch\": false,\n \"hide\": false,\n \"includeNullMetadata\": true,\n \"instant\": false,\n \"interval\": \"\",\n \"intervalFactor\": 1,\n \"legendFormat\": \"{{namespace}}.{{node}}}\",\n \"range\": true,\n \"refId\": \"A\",\n \"useBackend\": false\n }\n ],\n \"title\": \"Sequencer core buffer size (blocks #)\",\n \"type\": \"timeseries\"\n },\n\n\n\n\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"description\": \"How many epochs a sequencer is blacklisted\",\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 0,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": null\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n }\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 7,\n \"w\": 12,\n \"x\": 0,\n \"y\": 94\n },\n \"id\": 86,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"builder\",\n \"expr\": \"daml_sequencer_bftordering_blacklist_sequencer{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\"}\",\n \"legendFormat\": \"(reporter: {{namespace}}.{{node}}) {{blacklist_sequencer}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Blacklisted Sequencers\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"description\": \"Size of the stream buffer at various stages\",\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 10,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"decimals\": 0,\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": 0\n }\n ]\n },\n \"unit\": \"none\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 7,\n \"w\": 12,\n \"x\": 12,\n \"y\": 94\n },\n \"id\": 104,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"hideZeros\": false,\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"pluginVersion\": \"10.4.0\",\n \"targets\": [\n {\n \"datasource\": {\n \"uid\": \"prometheus\"\n },\n \"disableTextWrap\": false,\n \"editorMode\": \"code\",\n \"exemplar\": false,\n \"expr\": \"daml_sequencer_block_stream_buffer_size{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\"}\",\n \"format\": \"time_series\",\n \"fullMetaSearch\": false,\n \"includeNullMetadata\": true,\n \"instant\": false,\n \"interval\": \"\",\n \"intervalFactor\": 1,\n \"legendFormat\": \"{{namespace}}.{{node}}.{{element}}\",\n \"range\": true,\n \"refId\": \"A\",\n \"useBackend\": false\n }\n ],\n \"title\": \"Stream Buffer Metrics\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"description\": \"Wall-clock time of the ordered block being provided to the sequencer minus BFT time of the block\",\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 10,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"decimals\": 2,\n \"mappings\": [\n {\n \"options\": {\n \"match\": \"null\",\n \"result\": {\n \"text\": \"N/A\"\n }\n },\n \"type\": \"special\"\n }\n ],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": null\n },\n {\n \"color\": \"red\",\n \"value\": 2\n }\n ]\n },\n \"unit\": \"s\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 7,\n \"w\": 6,\n \"x\": 12,\n \"y\": 94\n },\n \"hideTimeOverride\": true,\n \"id\": 85,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"pluginVersion\": \"10.4.0\",\n \"targets\": [\n {\n \"datasource\": {\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"exemplar\": false,\n \"expr\": \"histogram_quantile($percentile, sum by(namespace, job, node, mode) (rate(daml_sequencer_bftordering_output_block_delay_duration_seconds{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\"}[$__rate_interval])))\",\n \"format\": \"time_series\",\n \"instant\": false,\n \"interval\": \"30s\",\n \"intervalFactor\": 1,\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Block delay\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"description\": \"Size of the payloads of blocks ordered and output to the read path.\",\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 10,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"decimals\": 2,\n \"links\": [],\n \"mappings\": [],\n \"min\": 0,\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": null\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n },\n \"unit\": \"bytes\"\n },\n \"overrides\": [\n {\n \"matcher\": {\n \"id\": \"byName\",\n \"options\": \"Height for last 3 hours\"\n },\n \"properties\": [\n {\n \"id\": \"color\",\n \"value\": {\n \"fixedColor\": \"#447ebc\",\n \"mode\": \"fixed\"\n }\n }\n ]\n },\n {\n \"matcher\": {\n \"id\": \"byName\",\n \"options\": \"Total Transactions for last 3 hours\"\n },\n \"properties\": [\n {\n \"id\": \"color\",\n \"value\": {\n \"fixedColor\": \"#ef843c\",\n \"mode\": \"fixed\"\n }\n }\n ]\n }\n ]\n },\n \"gridPos\": {\n \"h\": 7,\n \"w\": 6,\n \"x\": 18,\n \"y\": 94\n },\n \"hideTimeOverride\": false,\n \"id\": 50,\n \"options\": {\n \"legend\": {\n \"calcs\": [\n \"mean\",\n \"max\"\n ],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"pluginVersion\": \"10.1.5\",\n \"targets\": [\n {\n \"datasource\": {\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"histogram_quantile($percentile, sum by(namespace, job, node, mode) (rate(daml_sequencer_bftordering_output_block_size_bytes{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\"}[$__rate_interval])))\",\n \"format\": \"time_series\",\n \"instant\": false,\n \"interval\": \"\",\n \"intervalFactor\": 1,\n \"legendFormat\": \"{{namespace}}.{{node}}.{{mode}}\",\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Output Block Payload Size\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"description\": \"Percentage of votes received by the currently selected sequencer at every major PBFT stage. Should be > 2/3 at all times, else a leader change (\\\"view change\\\" in PBFT parlance) occurs automatically.\",\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"thresholds\"\n },\n \"custom\": {\n \"fillOpacity\": 70,\n \"lineWidth\": 0,\n \"spanNulls\": false\n },\n \"decimals\": 0,\n \"links\": [],\n \"mappings\": [],\n \"max\": 1,\n \"min\": 0,\n \"thresholds\": {\n \"mode\": \"percentage\",\n \"steps\": [\n {\n \"color\": \"red\",\n \"value\": null\n },\n {\n \"color\": \"#EAB839\",\n \"value\": 67\n },\n {\n \"color\": \"#6ED0E0\",\n \"value\": 80\n },\n {\n \"color\": \"dark-green\",\n \"value\": 100\n }\n ]\n },\n \"unit\": \"short\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 28,\n \"w\": 24,\n \"x\": 0,\n \"y\": 101\n },\n \"hideTimeOverride\": false,\n \"id\": 73,\n \"options\": {\n \"alignValue\": \"left\",\n \"legend\": {\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"mergeValues\": true,\n \"rowHeight\": 0.9,\n \"showValue\": \"always\",\n \"tooltip\": {\n \"mode\": \"single\",\n \"sort\": \"none\"\n }\n },\n \"pluginVersion\": \"10.1.5\",\n \"targets\": [\n {\n \"datasource\": {\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"exemplar\": false,\n \"expr\": \"daml_sequencer_bftordering_consensus_prepare_votes_percent{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\"}\",\n \"format\": \"time_series\",\n \"instant\": false,\n \"interval\": \"\",\n \"intervalFactor\": 1,\n \"legendFormat\": \"(reporter: {{namespace}}.{{node}}) Prepare {{voting_sequencer}}\",\n \"range\": true,\n \"refId\": \"A\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"daml_sequencer_bftordering_consensus_commit_votes_percent{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\"}\",\n \"format\": \"time_series\",\n \"hide\": false,\n \"legendFormat\": \"(reporter: {{namespace}}.{{node}}) Commit {{voting_sequencer}}\",\n \"range\": true,\n \"refId\": \"B\"\n }\n ],\n \"title\": \"PBFT Voting Power %\",\n \"transformations\": [\n {\n \"id\": \"renameByRegex\",\n \"options\": {\n \"regex\": \"Prepare SEQ::(.*)::.*\",\n \"renamePattern\": \"Prepare $1\"\n }\n },\n {\n \"id\": \"renameByRegex\",\n \"options\": {\n \"regex\": \"Commit SEQ::(.*)::.*\",\n \"renamePattern\": \"Commit $1\"\n }\n }\n ],\n \"type\": \"state-timeline\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"description\": \"Count of non-compliant and possibly byzantine protocol behaviors detected by the currently selected sequencer.\",\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 10,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"decimals\": 0,\n \"links\": [],\n \"mappings\": [],\n \"min\": 0,\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": null\n }\n ]\n },\n \"unit\": \"none\"\n },\n \"overrides\": [\n {\n \"matcher\": {\n \"id\": \"byName\",\n \"options\": \"Height for last 3 hours\"\n },\n \"properties\": [\n {\n \"id\": \"color\",\n \"value\": {\n \"fixedColor\": \"#447ebc\",\n \"mode\": \"fixed\"\n }\n }\n ]\n },\n {\n \"matcher\": {\n \"id\": \"byName\",\n \"options\": \"Total Transactions for last 3 hours\"\n },\n \"properties\": [\n {\n \"id\": \"color\",\n \"value\": {\n \"fixedColor\": \"#ef843c\",\n \"mode\": \"fixed\"\n }\n }\n ]\n }\n ]\n },\n \"gridPos\": {\n \"h\": 7,\n \"w\": 12,\n \"x\": 0,\n \"y\": 129\n },\n \"hideTimeOverride\": false,\n \"id\": 74,\n \"options\": {\n \"legend\": {\n \"calcs\": [\n \"mean\",\n \"max\"\n ],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"pluginVersion\": \"10.1.5\",\n \"targets\": [\n {\n \"datasource\": {\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"sum by (namespace, job, node) (irate(daml_sequencer_bftordering_security_noncompliant_behavior_total{namespace=~\\\"$namespace\\\", job=~\\\"$job\\\", node=~\\\"$node\\\"}[$__rate_interval]))\",\n \"format\": \"time_series\",\n \"instant\": false,\n \"interval\": \"\",\n \"intervalFactor\": 1,\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Non-compliant behaviors\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"description\": \"Size of the incoming requests buffer (\\\"mempool\\\") for the selected sequencer. Its maximum size in bytes and requests count can be currently set via static configuration.\",\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 10,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"decimals\": 0,\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"#7eb26d\",\n \"value\": null\n },\n {\n \"color\": \"#ef843c\",\n \"value\": 10\n },\n {\n \"color\": \"#e24d42\",\n \"value\": 20\n }\n ]\n },\n \"unit\": \"short\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 7,\n \"w\": 12,\n \"x\": 12,\n \"y\": 129\n },\n \"hideTimeOverride\": true,\n \"id\": 78,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"pluginVersion\": \"9.5.12\",\n \"targets\": [\n {\n \"datasource\": {\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"exemplar\": false,\n \"expr\": \"daml_sequencer_bftordering_ingress_requests_queued{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\"}\",\n \"format\": \"time_series\",\n \"instant\": false,\n \"interval\": \"30s\",\n \"intervalFactor\": 1,\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Mempool Size (requests)\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"description\": \"Number of proposals requested by consensus.\",\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 10,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"decimals\": 0,\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"#7eb26d\",\n \"value\": null\n },\n {\n \"color\": \"#ef843c\",\n \"value\": 10\n },\n {\n \"color\": \"#e24d42\",\n \"value\": 20\n }\n ]\n },\n \"unit\": \"short\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 7,\n \"w\": 12,\n \"x\": 0,\n \"y\": 136\n },\n \"hideTimeOverride\": true,\n \"id\": 77,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"pluginVersion\": \"9.5.12\",\n \"targets\": [\n {\n \"datasource\": {\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"exemplar\": false,\n \"expr\": \"daml_sequencer_bftordering_availability_requested_proposals{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\"}\",\n \"format\": \"time_series\",\n \"instant\": false,\n \"interval\": \"30s\",\n \"intervalFactor\": 1,\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Block proposals requested by consensus\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"description\": \"Number of batches requested to be proposed in consensus.\",\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 10,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"decimals\": 0,\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"#7eb26d\",\n \"value\": null\n },\n {\n \"color\": \"#ef843c\",\n \"value\": 10\n },\n {\n \"color\": \"#e24d42\",\n \"value\": 20\n }\n ]\n },\n \"unit\": \"short\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 7,\n \"w\": 12,\n \"x\": 12,\n \"y\": 136\n },\n \"hideTimeOverride\": true,\n \"id\": 79,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"pluginVersion\": \"9.5.12\",\n \"targets\": [\n {\n \"datasource\": {\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"exemplar\": false,\n \"expr\": \"daml_sequencer_bftordering_availability_requested_batches{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\"}\",\n \"format\": \"time_series\",\n \"instant\": false,\n \"interval\": \"30s\",\n \"intervalFactor\": 1,\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Block proposals requested by consensus (batches)\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"description\": \"Number of batches that are being disseminated.\",\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 10,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"decimals\": 0,\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"#7eb26d\",\n \"value\": null\n },\n {\n \"color\": \"#ef843c\",\n \"value\": 10\n },\n {\n \"color\": \"#e24d42\",\n \"value\": 20\n }\n ]\n },\n \"unit\": \"short\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 7,\n \"w\": 12,\n \"x\": 0,\n \"y\": 143\n },\n \"hideTimeOverride\": true,\n \"id\": 82,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"pluginVersion\": \"9.5.12\",\n \"targets\": [\n {\n \"datasource\": {\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"exemplar\": false,\n \"expr\": \"daml_sequencer_bftordering_availability_disseminating_batches{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\",ready_for_consensus=~\\\"false|true\\\"}\",\n \"format\": \"time_series\",\n \"instant\": false,\n \"interval\": \"30s\",\n \"intervalFactor\": 1,\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Batches being disseminated\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"description\": \"Number of batches requested by the availability module and not yet provided.\",\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 10,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"decimals\": 0,\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"#7eb26d\",\n \"value\": null\n },\n {\n \"color\": \"#ef843c\",\n \"value\": 10\n },\n {\n \"color\": \"#e24d42\",\n \"value\": 20\n }\n ]\n },\n \"unit\": \"short\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 7,\n \"w\": 12,\n \"x\": 12,\n \"y\": 143\n },\n \"hideTimeOverride\": true,\n \"id\": 76,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"pluginVersion\": \"9.5.12\",\n \"targets\": [\n {\n \"datasource\": {\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"exemplar\": false,\n \"expr\": \"daml_sequencer_bftordering_mempool_requested_batches{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\"}\",\n \"format\": \"time_series\",\n \"instant\": false,\n \"interval\": \"30s\",\n \"intervalFactor\": 1,\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Outstanding batch requests\",\n \"type\": \"timeseries\"\n },\n {\n \"collapsed\": false,\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"gridPos\": {\n \"h\": 1,\n \"w\": 24,\n \"x\": 0,\n \"y\": 150\n },\n \"id\": 55,\n \"panels\": [],\n \"repeat\": \"instance\",\n \"repeatDirection\": \"h\",\n \"targets\": [\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Sequencer overview: $reporting_sequencer\",\n \"type\": \"row\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"description\": \"Number of requests in batches that are being disseminated.\",\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 10,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"decimals\": 0,\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"#7eb26d\",\n \"value\": null\n },\n {\n \"color\": \"#ef843c\",\n \"value\": 10\n },\n {\n \"color\": \"#e24d42\",\n \"value\": 20\n }\n ]\n },\n \"unit\": \"short\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 7,\n \"w\": 12,\n \"x\": 0,\n \"y\": 151\n },\n \"hideTimeOverride\": true,\n \"id\": 83,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"pluginVersion\": \"9.5.12\",\n \"targets\": [\n {\n \"datasource\": {\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"exemplar\": false,\n \"expr\": \"daml_sequencer_bftordering_availability_disseminating_requests{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\",ready_for_consensus=~\\\"false|true\\\"}\",\n \"format\": \"time_series\",\n \"instant\": false,\n \"interval\": \"30s\",\n \"intervalFactor\": 1,\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Requests being disseminated\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"description\": \"Total network ingress for the currently selected sequencer split by sender.\",\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 100,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"never\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"normal\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"links\": [],\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": null\n },\n {\n \"color\": \"red\",\n \"value\": 80\n }\n ]\n },\n \"unit\": \"bytes\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 14,\n \"w\": 6,\n \"x\": 12,\n \"y\": 151\n },\n \"id\": 59,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"single\",\n \"sort\": \"none\"\n }\n },\n \"pluginVersion\": \"10.1.5\",\n \"targets\": [\n {\n \"datasource\": {\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"sum by(namespace, job, node, source_sequencer) (daml_sequencer_bftordering_p2p_receive_received_bytes_total{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\"})\",\n \"format\": \"time_series\",\n \"intervalFactor\": 1,\n \"legendFormat\": \"(reporter: {{namespace}}.{{node}}) {{source_sequencer}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Total Network Input\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"description\": \"Total network egress for the currently selected sequencer split by destination.\",\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 100,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"never\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"normal\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"links\": [],\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"green\",\n \"value\": null\n }\n ]\n },\n \"unit\": \"bytes\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 14,\n \"w\": 6,\n \"x\": 18,\n \"y\": 151\n },\n \"id\": 58,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"single\",\n \"sort\": \"none\"\n }\n },\n \"pluginVersion\": \"10.1.5\",\n \"targets\": [\n {\n \"datasource\": {\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"expr\": \"sum by(namespace, job, node, target_sequencer) (daml_sequencer_bftordering_p2p_send_sent_bytes_total{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\"})\",\n \"format\": \"time_series\",\n \"intervalFactor\": 1,\n \"legendFormat\": \"(reporter: {{namespace}}.{{node}}) {{target_sequencer}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Total Network Output\",\n \"type\": \"timeseries\"\n },\n {\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"description\": \"Number of payload bytes in requests within batches that are being disseminated.\",\n \"fieldConfig\": {\n \"defaults\": {\n \"color\": {\n \"mode\": \"palette-classic\"\n },\n \"custom\": {\n \"axisCenteredZero\": false,\n \"axisColorMode\": \"text\",\n \"axisLabel\": \"\",\n \"axisPlacement\": \"auto\",\n \"barAlignment\": 0,\n \"drawStyle\": \"line\",\n \"fillOpacity\": 10,\n \"gradientMode\": \"none\",\n \"hideFrom\": {\n \"legend\": false,\n \"tooltip\": false,\n \"viz\": false\n },\n \"lineInterpolation\": \"linear\",\n \"lineWidth\": 1,\n \"pointSize\": 5,\n \"scaleDistribution\": {\n \"type\": \"linear\"\n },\n \"showPoints\": \"auto\",\n \"spanNulls\": false,\n \"stacking\": {\n \"group\": \"A\",\n \"mode\": \"none\"\n },\n \"thresholdsStyle\": {\n \"mode\": \"off\"\n }\n },\n \"decimals\": 0,\n \"mappings\": [],\n \"thresholds\": {\n \"mode\": \"absolute\",\n \"steps\": [\n {\n \"color\": \"#7eb26d\",\n \"value\": null\n },\n {\n \"color\": \"#ef843c\",\n \"value\": 10\n },\n {\n \"color\": \"#e24d42\",\n \"value\": 20\n }\n ]\n },\n \"unit\": \"bytes\"\n },\n \"overrides\": []\n },\n \"gridPos\": {\n \"h\": 7,\n \"w\": 12,\n \"x\": 0,\n \"y\": 158\n },\n \"hideTimeOverride\": true,\n \"id\": 84,\n \"options\": {\n \"legend\": {\n \"calcs\": [],\n \"displayMode\": \"list\",\n \"placement\": \"bottom\",\n \"showLegend\": true\n },\n \"tooltip\": {\n \"mode\": \"multi\",\n \"sort\": \"none\"\n }\n },\n \"pluginVersion\": \"9.5.12\",\n \"targets\": [\n {\n \"datasource\": {\n \"uid\": \"prometheus\"\n },\n \"editorMode\": \"code\",\n \"exemplar\": false,\n \"expr\": \"daml_sequencer_bftordering_availability_disseminating_bytes{namespace=~\\\"$namespace\\\",job=~\\\"$job\\\",node=~\\\"$node\\\",ready_for_consensus=~\\\"false|true\\\"}\",\n \"format\": \"time_series\",\n \"instant\": false,\n \"interval\": \"30s\",\n \"intervalFactor\": 1,\n \"legendFormat\": \"{{namespace}}.{{node}}\",\n \"range\": true,\n \"refId\": \"A\"\n }\n ],\n \"title\": \"Bytes being disseminated\",\n \"type\": \"timeseries\"\n }\n ],\n \"refresh\": \"30s\",\n \"schemaVersion\": 38,\n \"style\": \"dark\",\n \"tags\": [\n \"bft-sequencers\"\n ],\n \"templating\": {\n \"list\": [\n {\n \"allValue\": \".*\",\n \"current\": {\n \"selected\": true,\n \"text\": [\n \"All\"\n ],\n \"value\": [\n \"$__all\"\n ]\n },\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"definition\": \"label_values(daml_health_status,namespace}\",\n \"hide\": 0,\n \"includeAll\": true,\n \"label\": \"Namespace\",\n \"multi\": true,\n \"name\": \"namespace\",\n \"options\": [],\n \"query\": {\n \"qryType\": 1,\n \"query\": \"label_values(daml_health_status,namespace)\",\n \"refId\": \"PrometheusVariableQueryEditor-VariableQuery\"\n },\n \"refresh\": 2,\n \"regex\": \"\",\n \"skipUrlSync\": false,\n \"sort\": 7,\n \"type\": \"query\"\n },\n {\n \"allValue\": \".*\",\n \"current\": {\n \"selected\": true,\n \"text\": [\n \"All\"\n ],\n \"value\": [\n \"$__all\"\n ]\n },\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"definition\": \"label_values(daml_health_status{namespace=~\\\"$namespace\\\"},job)\",\n \"hide\": 0,\n \"includeAll\": true,\n \"label\": \"Job\",\n \"multi\": true,\n \"name\": \"job\",\n \"options\": [],\n \"query\": {\n \"qryType\": 1,\n \"query\": \"label_values(daml_health_status{namespace=~\\\"$namespace\\\"},job)\",\n \"refId\": \"PrometheusVariableQueryEditor-VariableQuery\"\n },\n \"refresh\": 2,\n \"regex\": \"\",\n \"skipUrlSync\": false,\n \"sort\": 7,\n \"type\": \"query\"\n },\n {\n \"allValue\": \".*\",\n \"current\": {\n \"selected\": true,\n \"text\": [\n \"All\"\n ],\n \"value\": [\n \"$__all\"\n ]\n },\n \"datasource\": {\n \"type\": \"prometheus\",\n \"uid\": \"prometheus\"\n },\n \"definition\": \"label_values(daml_health_status{namespace=~\\\"$namespace\\\", job=~\\\"$job\\\"},node)\",\n \"hide\": 0,\n \"includeAll\": true,\n \"label\": \"Node\",\n \"multi\": true,\n \"name\": \"node\",\n \"options\": [],\n \"query\": {\n \"qryType\": 1,\n \"query\": \"label_values(daml_health_status{namespace=~\\\"$namespace\\\", job=~\\\"$job\\\"},node)\",\n \"refId\": \"PrometheusVariableQueryEditor-VariableQuery\"\n },\n \"refresh\": 2,\n \"regex\": \"\",\n \"skipUrlSync\": false,\n \"sort\": 7,\n \"type\": \"query\"\n },\n {\n \"current\": {\n \"selected\": true,\n \"text\": \".95\",\n \"value\": \".95\"\n },\n \"hide\": 0,\n \"includeAll\": false,\n \"label\": \"Percentile\",\n \"multi\": false,\n \"name\": \"percentile\",\n \"options\": [\n {\n \"selected\": false,\n \"text\": \".5\",\n \"value\": \".5\"\n },\n {\n \"selected\": false,\n \"text\": \".6\",\n \"value\": \".6\"\n },\n {\n \"selected\": false,\n \"text\": \".7\",\n \"value\": \".7\"\n },\n {\n \"selected\": false,\n \"text\": \".75\",\n \"value\": \".75\"\n },\n {\n \"selected\": false,\n \"text\": \".8\",\n \"value\": \".8\"\n },\n {\n \"selected\": false,\n \"text\": \".9\",\n \"value\": \".9\"\n },\n {\n \"selected\": true,\n \"text\": \".95\",\n \"value\": \".95\"\n },\n {\n \"selected\": false,\n \"text\": \".99\",\n \"value\": \".99\"\n },\n {\n \"selected\": false,\n \"text\": \".999\",\n \"value\": \".999\"\n }\n ],\n \"query\": \".5,.6,.7,.75,.8,.9,.95,.99,.999\",\n \"queryValue\": \"\",\n \"skipUrlSync\": false,\n \"type\": \"custom\"\n }\n ]\n },\n \"time\": {\n \"from\": \"now-15m\",\n \"to\": \"now\"\n },\n \"timepicker\": {\n \"refresh_intervals\": [\n \"5s\",\n \"10s\",\n \"30s\",\n \"1m\",\n \"5m\",\n \"15m\",\n \"30m\",\n \"1h\",\n \"2h\",\n \"1d\"\n ],\n \"time_options\": [\n \"5m\",\n \"15m\",\n \"1h\",\n \"6h\",\n \"12h\",\n \"24h\",\n \"2d\",\n \"7d\",\n \"30d\"\n ]\n },\n \"timezone\": \"\",\n \"title\": \"BFT ordering\",\n \"uid\": \"UJyurCTWz\",\n \"version\": 2,\n \"weekStart\": \"\"\n}\n" }, "kind": "ConfigMap", "metadata": { diff --git a/cluster/pulumi/observability/grafana-dashboards/canton-bft/bft-ordering-performance.json b/cluster/pulumi/observability/grafana-dashboards/canton-bft/bft-ordering-performance.json index 576d0b3589..cf16254931 100644 --- a/cluster/pulumi/observability/grafana-dashboards/canton-bft/bft-ordering-performance.json +++ b/cluster/pulumi/observability/grafana-dashboards/canton-bft/bft-ordering-performance.json @@ -17,7 +17,7 @@ }, "editable": true, "fiscalYearStartMonth": 0, - "graphTooltip": 0, + "graphTooltip": 1, "id": 8, "links": [], "liveNow": false, @@ -40,6 +40,7 @@ "type": "prometheus", "uid": "prometheus" }, + "description": "Wall-clock duration between the instant a request is received by the CantonBFT orderer and the instant the fully assembled ordered block metadata is stored, just before the request is pushed to the post-ordering stages. Its meaningfulness requires wall-clock synchronization, as not all ordered requests are received and timestamped on this node.", "fieldConfig": { "defaults": { "color": { @@ -801,6 +802,100 @@ "title": "P2P gRPC network latency", "type": "timeseries" }, + { + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "description": "The rate of gRPC message send retries", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 10, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "none" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 24, + "x": 0, + "y": 47 + }, + "id": 15, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "editorMode": "code", + "expr": "sum by (namespace, job, node) (irate(daml_sequencer_bftordering_p2p_send_sends_retried{namespace=~\"$namespace\",job=~\"$job\",node=~\"$node\"}[$__rate_interval]))", + "legendFormat": "{{namespace}}.{{node}}", + "range": true, + "refId": "A" + } + ], + "title": "gRPC send retry rate", + "type": "timeseries" + }, { "datasource": { "type": "prometheus", @@ -5186,7 +5281,7 @@ "uid": "prometheus" }, "editorMode": "code", - "expr": "histogram_quantile($percentile, daml_sequencer_bftordering_consensus_view_change_progress_latency_duration_seconds{namespace=~\"$namespace\",job=~\"$job\",node=~\"$node\"})", + "expr": "histogram_quantile($percentile, sum by(namespace, job, node, Leader) (rate(daml_sequencer_bftordering_consensus_view_change_progress_latency_duration_seconds{namespace=~\"$namespace\", job=~\"$job\", node=~\"$node\"}[$__rate_interval])))", "interval": "", "legendFormat": "(reporter: {{namespace}}.{{node}}) {{Leader}}", "range": true, @@ -5374,7 +5469,7 @@ "calcs": [], "displayMode": "list", "placement": "bottom", - "showLegend": false + "showLegend": true }, "tooltip": { "mode": "single", @@ -5388,7 +5483,7 @@ "uid": "prometheus" }, "editorMode": "code", - "expr": "histogram_quantile($percentile, sum(rate(daml_sequencer_bftordering_performance_ordering_stage_latency_duration_seconds{reporting_sequencer=\"$reporting_sequencer\", ordering_stage=~\"state-transfer-total-epoch-transfer-latency\"}[$__rate_interval])))", + "expr": "histogram_quantile($percentile, sum by (namespace, job, node) (rate(daml_sequencer_bftordering_performance_ordering_stage_latency_duration_seconds{namespace=~\"$namespace\",job=~\"$job\",node=~\"$node\", ordering_stage=~\"state-transfer-total-epoch-transfer-latency\"}[$__rate_interval])))", "legendFormat": "Data transfer", "range": true, "refId": "A" @@ -5399,9 +5494,9 @@ "uid": "prometheus" }, "editorMode": "code", - "expr": "histogram_quantile($percentile, sum(rate(daml_sequencer_bftordering_performance_ordering_stage_latency_duration_seconds{reporting_sequencer=\"$reporting_sequencer\", ordering_stage=~\"state-transfer-store-epochs\"}[$__rate_interval])))", + "expr": "histogram_quantile($percentile, sum by (namespace, job, node) (rate(daml_sequencer_bftordering_performance_ordering_stage_latency_duration_seconds{namespace=~\"$namespace\",job=~\"$job\",node=~\"$node\", ordering_stage=~\"state-transfer-store-epochs\"}[$__rate_interval])))", "hide": false, - "legendFormat": "Complete + start DB query", + "legendFormat": "{{namespace}}.{{node}}", "range": true, "refId": "B" } @@ -8370,7 +8465,7 @@ "type": "row" } ], - "refresh": "5s", + "refresh": "30s", "schemaVersion": 38, "style": "dark", "tags": [], diff --git a/cluster/pulumi/observability/grafana-dashboards/canton-bft/bft-ordering.json b/cluster/pulumi/observability/grafana-dashboards/canton-bft/bft-ordering.json index 847a1c66cc..c3abbf29b7 100644 --- a/cluster/pulumi/observability/grafana-dashboards/canton-bft/bft-ordering.json +++ b/cluster/pulumi/observability/grafana-dashboards/canton-bft/bft-ordering.json @@ -18,7 +18,7 @@ "description": "", "editable": true, "fiscalYearStartMonth": 0, - "graphTooltip": 0, + "graphTooltip": 1, "id": 8, "links": [], "liveNow": false, @@ -1225,6 +1225,7 @@ "type": "prometheus", "uid": "prometheus" }, + "description": "Wall-clock duration between the instant a request is received by the CantonBFT orderer and the instant the fully assembled ordered block metadata is stored, just before the request is pushed to the post-ordering stages. Its meaningfulness requires wall-clock synchronization, as not all ordered requests are received and timestamped on this node.", "fieldConfig": { "defaults": { "color": { @@ -1572,7 +1573,7 @@ "instant": false, "interval": "", "intervalFactor": 1, - "legendFormat": "{{namespace}}.{{node}}", + "legendFormat": "{{namespace}}.{{node}} ({{mode}})", "refId": "A" } ], @@ -1812,7 +1813,7 @@ "instant": false, "interval": "", "intervalFactor": 1, - "legendFormat": "{{namespace}}.{{node}}", + "legendFormat": "{{namespace}}.{{node}} ({{mode}})", "refId": "A" } ], @@ -3812,7 +3813,7 @@ "type": "timeseries" } ], - "refresh": "5s", + "refresh": "30s", "schemaVersion": 38, "style": "dark", "tags": [ From ac7be5077c09ba5524251c1f57085c84d3629b2f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oriol=20Mu=C3=B1oz?= Date: Wed, 29 Jul 2026 10:55:30 +0200 Subject: [PATCH 09/15] PostgreSQL 18 release notes (#6588) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --------- Signed-off-by: Oriol Muñoz --- docs/src/release_notes_upcoming.rst | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/docs/src/release_notes_upcoming.rst b/docs/src/release_notes_upcoming.rst index 89246e2218..92aab83df1 100644 --- a/docs/src/release_notes_upcoming.rst +++ b/docs/src/release_notes_upcoming.rst @@ -7,6 +7,12 @@ .. release-notes:: Upcoming + - PostgreSQL 18 + + - Splice now officially supports PostgreSQL 18. + ⚠️ Note that that PostgreSQL 14, which was the default until now, will reach End of Life on November 12, 2026. + You should upgrade before that date. + - Scan app - Remove deprecated ``/transactions`` endpoint. From 42f75bddd6a89e5f5889a84db5a63dfae97bba5f Mon Sep 17 00:00:00 2001 From: Raymond Roestenburg <98821776+ray-roestenburg-da@users.noreply.github.com> Date: Wed, 29 Jul 2026 11:25:00 +0200 Subject: [PATCH 10/15] [ci] Ignore background warnings in actAs-dso log assertion (#6593) Signed-off-by: Raymond Roestenburg --- .../tests/SvOnboardingAddlIntegrationTest.scala | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/apps/app/src/test/scala/org/lfdecentralizedtrust/splice/integration/tests/SvOnboardingAddlIntegrationTest.scala b/apps/app/src/test/scala/org/lfdecentralizedtrust/splice/integration/tests/SvOnboardingAddlIntegrationTest.scala index 25be93015f..bff3b008fc 100644 --- a/apps/app/src/test/scala/org/lfdecentralizedtrust/splice/integration/tests/SvOnboardingAddlIntegrationTest.scala +++ b/apps/app/src/test/scala/org/lfdecentralizedtrust/splice/integration/tests/SvOnboardingAddlIntegrationTest.scala @@ -13,6 +13,7 @@ import org.lfdecentralizedtrust.splice.sv.util.{SvOnboardingToken, SvUtil} import scala.jdk.OptionConverters.* import org.lfdecentralizedtrust.splice.sv.admin.api.client.commands.HttpSvPublicAppClient.SvOnboardingStatus import org.lfdecentralizedtrust.splice.util.{SvTestUtil, WalletTestUtil} +import com.digitalasset.canton.console.CommandFailure import com.digitalasset.canton.logging.SuppressionRule import com.digitalasset.canton.topology.transaction.ParticipantPermission import org.slf4j.event.Level @@ -349,7 +350,11 @@ class SvOnboardingAddlIntegrationTest } clue("create a amulet again with actAs = DSO") { withCommandRetryPolicy(_ => _ => false) { - assertThrowsAndLogsCommandFailures( + // Suppress at ERROR level only: background WARNs (e.g. the SV app failing to read the + // bft sequencers list while sv2's scan is unavailable) must not fail the log assertion. + loggerFactory.assertThrowsAndLogsSuppressing[CommandFailure]( + SuppressionRule.LevelAndAbove(Level.ERROR) + )( createAmulet( sv1ValidatorBackend.participantClientWithAdminToken, sv1UserId, From a4fab15f9a09007ff26537de98c788e76e08568a Mon Sep 17 00:00:00 2001 From: Raymond Roestenburg <98821776+ray-roestenburg-da@users.noreply.github.com> Date: Wed, 29 Jul 2026 11:32:35 +0200 Subject: [PATCH 11/15] [ci] Bump timeout on concurrent taps in wallet batch test (#6592) Signed-off-by: Raymond Roestenburg --- .../integration/tests/WalletIntegrationTest.scala | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/apps/app/src/test/scala/org/lfdecentralizedtrust/splice/integration/tests/WalletIntegrationTest.scala b/apps/app/src/test/scala/org/lfdecentralizedtrust/splice/integration/tests/WalletIntegrationTest.scala index f37c9c21d5..45d888648a 100644 --- a/apps/app/src/test/scala/org/lfdecentralizedtrust/splice/integration/tests/WalletIntegrationTest.scala +++ b/apps/app/src/test/scala/org/lfdecentralizedtrust/splice/integration/tests/WalletIntegrationTest.scala @@ -34,6 +34,8 @@ import com.digitalasset.canton.discard.Implicits.DiscardOps import org.apache.pekko.http.scaladsl.Http import org.apache.pekko.http.scaladsl.model.{HttpRequest, HttpResponse, StatusCodes} import org.apache.pekko.http.scaladsl.model.headers.{Authorization, OAuth2BearerToken} +import org.scalatest.concurrent.PatienceConfiguration +import org.scalatest.time.{Seconds, Span} import org.slf4j.event.Level import java.time.Duration @@ -225,9 +227,12 @@ class WalletIntegrationTest val tapsAfter = Range(0, 3).map(_ => Future(Try(aliceWalletClient.tap(10)))) - // Wait for all futures to complete - val successfulTaps = (tapsBefore ++ tapsAfter).map(_.futureValue).count(_.isSuccess) - if (failedAcceptF.futureValue.isSuccess) + // Wait for all futures to complete. The stale accept forces the treasury to filter + // and retry batches, so under load this can exceed the default patience. + val patience = PatienceConfiguration.Timeout(Span(60, Seconds)) + val successfulTaps = + (tapsBefore ++ tapsAfter).map(_.futureValue(patience)).count(_.isSuccess) + if (failedAcceptF.futureValue(patience).isSuccess) fail("The AcceptTransferOffer action unexpectedly succeeded") successfulTaps should be( From 0e2ca0106e2dee2c9bae988bdfa5b7782098f0ca Mon Sep 17 00:00:00 2001 From: Jaeyoon Cho Date: Wed, 29 Jul 2026 18:33:05 +0900 Subject: [PATCH 12/15] SV UI: CIP-104 Support UpdateFeatureAppRight Vote (#6441) Signed-off-by: JYC11 Signed-off-by: Divam Co-authored-by: Divam --- .../tests/SvFrontendIntegrationTest.scala | 76 +++- .../forms/update-featured-app-form.test.tsx | 343 ++++++++++++++++++ .../proposal-details-content.test.tsx | 89 +++++ .../governance/proposal-summary.test.tsx | 58 +++ .../src/__tests__/mocks/handlers/sv-api.ts | 4 +- .../forms/GrantRevokeFeaturedAppForm.tsx | 59 +-- .../forms/UpdateFeaturedAppForm.tsx | 274 ++++++++++++++ .../src/components/forms/formValidators.ts | 24 ++ .../governance/ProposalDetailsContent.tsx | 90 +++++ .../components/governance/ProposalSummary.tsx | 40 ++ .../src/hooks/useFeaturedAppRightPicker.ts | 79 ++++ .../sv/frontend/src/routes/createProposal.tsx | 3 + apps/sv/frontend/src/utils/constants.ts | 1 + apps/sv/frontend/src/utils/governance.ts | 17 + apps/sv/frontend/src/utils/types.ts | 21 +- docs/src/release_notes_upcoming.rst | 4 + 16 files changed, 1116 insertions(+), 66 deletions(-) create mode 100644 apps/sv/frontend/src/__tests__/governance/forms/update-featured-app-form.test.tsx create mode 100644 apps/sv/frontend/src/components/forms/UpdateFeaturedAppForm.tsx create mode 100644 apps/sv/frontend/src/hooks/useFeaturedAppRightPicker.ts diff --git a/apps/app/src/test/scala/org/lfdecentralizedtrust/splice/integration/tests/SvFrontendIntegrationTest.scala b/apps/app/src/test/scala/org/lfdecentralizedtrust/splice/integration/tests/SvFrontendIntegrationTest.scala index f214b1954c..1e39e21e7b 100644 --- a/apps/app/src/test/scala/org/lfdecentralizedtrust/splice/integration/tests/SvFrontendIntegrationTest.scala +++ b/apps/app/src/test/scala/org/lfdecentralizedtrust/splice/integration/tests/SvFrontendIntegrationTest.scala @@ -1419,7 +1419,7 @@ class SvFrontendIntegrationTest } } - "NEW UI: Grant and Revoke Featured App Right" in { implicit env => + "NEW UI: Grant, Update and Revoke Featured App Right" in { implicit env => val providerParty = sv3Backend.getDsoInfo().svParty val providerPartyId = providerParty.toProtoPrimitive val activityWeight = BigDecimal("2.5") @@ -1435,23 +1435,8 @@ class SvFrontendIntegrationTest clue("vote the grant request to execution before creating revoke request") { val grantTrackingCid = eventually() { - val voteRequest: Contract[VoteRequest.ContractId, VoteRequest] = sv1Backend - .listVoteRequests() - .find { request => - val requestCid = request.contractId.contractId - val trackingCid = - if (request.payload.trackingCid.isPresent) { - Some(request.payload.trackingCid.get.contractId) - } else { - None - } - requestCid == grantProposalContractId || trackingCid.contains(grantProposalContractId) - } - .getOrElse( - fail( - s"Could not find vote request for grant proposal contract id: $grantProposalContractId" - ) - ) + val voteRequest: Contract[VoteRequest.ContractId, VoteRequest] = + getVoteRequestForProposal(grantProposalContractId) if (voteRequest.payload.trackingCid.isPresent) voteRequest.payload.trackingCid.get else voteRequest.contractId @@ -1474,6 +1459,38 @@ class SvFrontendIntegrationTest } } + val newActivityWeight = BigDecimal("3.0") + + val updateProposalContractId = assertCreateProposal( + "SRARC_UpdateFeaturedAppRight", + "update-featured-app", + ) { implicit webDriver => + fillOutTextField("update-featured-app-partyId", providerPartyId) + selectFirstMuiOption("update-featured-app-rightCid-dropdown") + fillOutTextField("update-featured-app-activityWeight", newActivityWeight.toString) + fillOutTextField("update-featured-app-reason", "increasing weight") + } + + clue("vote the update request to execution") { + val updateTrackingCid = eventually() { + val voteRequest = getVoteRequestForProposal(updateProposalContractId) + if (voteRequest.payload.trackingCid.isPresent) voteRequest.payload.trackingCid.get + else voteRequest.contractId + } + + eventuallySucceeds() { + sv3Backend.castVote(updateTrackingCid, isAccepted = true, "", "") + } + + eventually() { + val featuredAppRight = sv1ScanBackend.lookupFeaturedAppRight(providerParty) + featuredAppRight shouldBe a[Some[?]] + featuredAppRight.value.payload.activityWeight.toScala.map( + BigDecimal(_) + ) shouldBe Some(newActivityWeight) + } + } + // Now create a Revoke proposal by selecting a contract ID from the provider's dropdown. assertCreateProposal("SRARC_RevokeFeaturedAppRight", "revoke-featured-app") { implicit webDriver => @@ -1655,6 +1672,29 @@ class SvFrontendIntegrationTest } } + def getVoteRequestForProposal( + proposalContractId: String + )(implicit env: SpliceTestConsoleEnvironment) = { + val voteRequest: Contract[VoteRequest.ContractId, VoteRequest] = sv1Backend + .listVoteRequests() + .find { request => + val requestCid = request.contractId.contractId + val trackingCid = + if (request.payload.trackingCid.isPresent) { + Some(request.payload.trackingCid.get.contractId) + } else { + None + } + requestCid == proposalContractId || trackingCid.contains(proposalContractId) + } + .getOrElse( + fail( + s"Could not find vote request for proposal contract id: $proposalContractId" + ) + ) + voteRequest + } + def changeAction(actionName: String)(implicit webDriver: WebDriverType) = { eventually() { find( diff --git a/apps/sv/frontend/src/__tests__/governance/forms/update-featured-app-form.test.tsx b/apps/sv/frontend/src/__tests__/governance/forms/update-featured-app-form.test.tsx new file mode 100644 index 0000000000..8bf22d3cc8 --- /dev/null +++ b/apps/sv/frontend/src/__tests__/governance/forms/update-featured-app-form.test.tsx @@ -0,0 +1,343 @@ +// Copyright (c) 2024 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved. +// SPDX-License-Identifier: Apache-2.0 + +import { fireEvent, render, screen, waitFor } from '@testing-library/react'; +import { describe, expect, test } from 'vitest'; +import userEvent from '@testing-library/user-event'; +import { dateTimeFormatISO } from '@canton-network/splice-common-frontend-utils'; +import dayjs from 'dayjs'; +import { SvConfigProvider } from '../../../utils'; +import App from '../../../App'; +import { svPartyId } from '../../mocks/constants'; +import { Wrapper } from '../../helpers'; +import { UpdateFeaturedAppForm } from '../../../components/forms/UpdateFeaturedAppForm'; +import { server, svUrl } from '../../setup/setup'; +import { http, HttpResponse } from 'msw'; +import { PROPOSAL_SUMMARY_SUBTITLE, PROPOSAL_SUMMARY_TITLE } from '../../../utils/constants'; + +// Logs in once so the admin client has an access token for the rest of the file. +describe('SV user can', () => { + test('login and see the SV party ID', async () => { + const user = userEvent.setup(); + render( + + + + ); + + expect(await screen.findByText('Log In')).toBeInTheDocument(); + + const input = screen.getByRole('textbox'); + await user.type(input, 'sv1'); + + const button = screen.getByRole('button', { name: 'Log In' }); + await user.click(button); + + expect(await screen.findAllByDisplayValue(svPartyId)).not.toBe([]); + }); +}); + +describe('Update Featured App Form', () => { + const fillOutUpdateForm = async (user: ReturnType) => { + const summaryInput = screen.getByTestId('update-featured-app-summary'); + await user.type(summaryInput, 'Summary of the proposal'); + + const urlInput = screen.getByTestId('update-featured-app-url'); + await user.type(urlInput, 'https://example.com'); + + const partyIdInput = screen.getByTestId('update-featured-app-partyId'); + await user.type(partyIdInput, 'a-party-id::1014912492'); + fireEvent.blur(partyIdInput); + + await waitFor(() => { + expect(screen.queryByText('Loading featured app rights...')).not.toBeInTheDocument(); + }); + + const rightCidDropdown = screen.getByTestId('update-featured-app-rightCid-dropdown'); + await waitFor( + () => { + expect(rightCidDropdown).not.toBeDisabled(); + }, + { timeout: 3000 } + ); + fireEvent.change(rightCidDropdown, { target: { value: 'rightCid123' } }); + fireEvent.blur(rightCidDropdown); + await waitFor(() => { + expect(screen.getByTestId('update-featured-app-rightCid-error').textContent).toBeFalsy(); + }); + + const activityWeightInput = screen.getByTestId('update-featured-app-activityWeight'); + await user.type(activityWeightInput, '2.5'); + + const reasonInput = screen.getByTestId('update-featured-app-reason'); + await user.type(reasonInput, 'test'); + }; + + test('should render all Form components', () => { + render( + + + + ); + + expect(screen.getByTestId('update-featured-app-form')).toBeInTheDocument(); + expect(screen.getByText('Proposal type')).toBeInTheDocument(); + + const actionInput = screen.getByTestId('update-featured-app-action'); + expect(actionInput).toBeInTheDocument(); + expect(actionInput.textContent).toBe('Update Featured Application'); + + const summaryInput = screen.getByTestId('update-featured-app-summary'); + expect(summaryInput).toBeInTheDocument(); + expect(summaryInput.getAttribute('value')).toBeNull(); + + const summarySubtitle = screen.getByTestId('update-featured-app-summary-subtitle'); + expect(summarySubtitle).toBeInTheDocument(); + expect(summarySubtitle.textContent).toBe(PROPOSAL_SUMMARY_SUBTITLE); + + const urlInput = screen.getByTestId('update-featured-app-url'); + expect(urlInput).toBeInTheDocument(); + expect(urlInput.getAttribute('value')).toBe(''); + + const partyIdInput = screen.getByTestId('update-featured-app-partyId'); + expect(partyIdInput).toBeInTheDocument(); + expect(partyIdInput.getAttribute('value')).toBe(''); + + const partyIdTitle = screen.getByTestId('update-featured-app-partyId-title'); + expect(partyIdTitle).toBeInTheDocument(); + expect(partyIdTitle.textContent).toBe('Provider Party ID'); + + const rightCidDropdown = screen.getByTestId('update-featured-app-rightCid-dropdown'); + expect(rightCidDropdown).toBeInTheDocument(); + expect(rightCidDropdown).toBeDisabled(); + + expect(screen.getByTestId('update-featured-app-activityWeight')).toBeInTheDocument(); + expect(screen.getByTestId('update-featured-app-reason')).toBeInTheDocument(); + + expect(screen.getByText('Review Proposal')).toBeInTheDocument(); + }); + + test('activity weight is required', async () => { + const user = userEvent.setup(); + + render( + + + + ); + + const activityWeightInput = screen.getByTestId('update-featured-app-activityWeight'); + const actionInput = screen.getByTestId('update-featured-app-action'); + + await user.click(activityWeightInput); + await user.click(actionInput); // blur to trigger validation + + await waitFor(() => { + expect(screen.getByTestId('update-featured-app-activityWeight-error').textContent).toBe( + 'Weight is required' + ); + }); + }); + + test('should send new activity weight and reason to backend', async () => { + let requestBody = ''; + server.use( + http.post(`${svUrl}/v0/admin/sv/voterequest/create`, async ({ request }) => { + requestBody = await request.text(); + return HttpResponse.json({}); + }) + ); + + const user = userEvent.setup(); + + render( + + + + ); + + await fillOutUpdateForm(user); + + const actionInput = screen.getByTestId('update-featured-app-action'); + await user.click(actionInput); // blur to trigger validation + + const submitButton = screen.getByTestId('submit-button'); + await waitFor(() => { + expect(submitButton).not.toBeDisabled(); + }); + + await user.click(submitButton); // review proposal + await user.click(submitButton); // submit proposal + + await waitFor(() => { + expect(requestBody).toContain('"newActivityWeight":"2.5"'); + expect(requestBody).toContain('"reason":"test"'); + }); + }); + + test('activity weight rejects negative numbers and more than 10 decimal places', async () => { + const user = userEvent.setup(); + + render( + + + + ); + + const activityWeightInput = screen.getByTestId('update-featured-app-activityWeight'); + const activityWeightError = screen.getByTestId('update-featured-app-activityWeight-error'); + + await user.type(activityWeightInput, '-1'); + await waitFor(() => { + expect(activityWeightError.textContent).toBe('Weight must be a valid non-negative number'); + }); + + await user.clear(activityWeightInput); + await user.type(activityWeightInput, '1.1234567891'); + await waitFor(() => { + expect(activityWeightError.textContent).toBe(''); + }); + + await user.clear(activityWeightInput); + await user.type(activityWeightInput, '1.12345678912'); + await waitFor(() => { + expect(activityWeightError.textContent).toBe('Weight can have at most 10 decimal places'); + }); + }); + + test('reason is required', async () => { + const user = userEvent.setup(); + + render( + + + + ); + + const reasonInput = screen.getByTestId('update-featured-app-reason'); + const actionInput = screen.getByTestId('update-featured-app-action'); + + await user.click(reasonInput); + await user.click(actionInput); // blur to trigger validation + + await waitFor(() => { + expect(screen.getByTestId('update-featured-app-reason-error').textContent).toBe( + 'Reason is required' + ); + }); + }); + + test('communicates when the provider has no featured app rights to update', async () => { + const user = userEvent.setup(); + + render( + + + + ); + + const partyIdInput = screen.getByTestId('update-featured-app-partyId'); + await user.type(partyIdInput, 'no-rights-party::1014912492'); + fireEvent.blur(partyIdInput); + + await waitFor(() => { + expect(screen.getByTestId('update-featured-app-rightCid')).toHaveTextContent( + 'No featured application rights found for this provider' + ); + }); + + expect(screen.getByTestId('update-featured-app-rightCid-dropdown')).toBeDisabled(); + }); + + test('expiry date must be in the future', async () => { + render( + + + + ); + + const expiryDateInput = screen.getByTestId('update-featured-app-expiry-date-field'); + expect(expiryDateInput).toBeInTheDocument(); + + const thePast = dayjs().subtract(1, 'day').format(dateTimeFormatISO); + const theFuture = dayjs().add(1, 'day').format(dateTimeFormatISO); + + fireEvent.change(expiryDateInput, { target: { value: thePast } }); + + await waitFor(() => { + expect(screen.queryByText('Expiration must be in the future')).toBeInTheDocument(); + }); + + fireEvent.change(expiryDateInput, { target: { value: theFuture } }); + + await waitFor(() => { + expect(screen.queryByText('Expiration must be in the future')).not.toBeInTheDocument(); + }); + }); + + test('effective date must be after expiry date', async () => { + render( + + + + ); + + const expiryDateInput = screen.getByTestId('update-featured-app-expiry-date-field'); + const effectiveDateInput = screen.getByTestId('update-featured-app-effective-date-field'); + + const expiryDate = dayjs().add(1, 'week'); + const effectiveDate = expiryDate.subtract(1, 'day'); + + fireEvent.change(expiryDateInput, { target: { value: expiryDate.format(dateTimeFormatISO) } }); + fireEvent.change(effectiveDateInput, { + target: { value: effectiveDate.format(dateTimeFormatISO) }, + }); + + await waitFor(() => { + expect( + screen.queryByText('Effective Date must be after expiration date') + ).toBeInTheDocument(); + }); + + const validEffectiveDate = expiryDate.add(1, 'day').format(dateTimeFormatISO); + + fireEvent.change(effectiveDateInput, { target: { value: validEffectiveDate } }); + + await waitFor(() => { + expect( + screen.queryByText('Effective Date must be after expiration date') + ).not.toBeInTheDocument(); + }); + }); + + test('should show proposal review page after form completion', async () => { + const user = userEvent.setup(); + + render( + + + + ); + + await fillOutUpdateForm(user); + + const actionInput = screen.getByTestId('update-featured-app-action'); + await user.click(actionInput); // blur to trigger validation + + const submitButton = screen.getByTestId('submit-button'); + await waitFor(() => { + expect(submitButton).not.toBeDisabled(); + }); + + await user.click(submitButton); // review proposal + + expect(screen.getByText(PROPOSAL_SUMMARY_TITLE)).toBeInTheDocument(); + expect(screen.getByTestId('updateProviderPartyId-field').textContent).toBe( + 'a-party-id::1014912492' + ); + expect(screen.getByTestId('updateRight-field').textContent).toBe('rightCid123'); + expect(screen.getByTestId('config-change-current-value').textContent).toBe('1.0'); + expect(screen.getByTestId('config-change-new-value').textContent).toBe('2.5'); + expect(screen.getByTestId('updateReason-field').textContent).toBe('test'); + }); +}); diff --git a/apps/sv/frontend/src/__tests__/governance/proposal-details-content.test.tsx b/apps/sv/frontend/src/__tests__/governance/proposal-details-content.test.tsx index b79df961b7..5a3df3f1c0 100644 --- a/apps/sv/frontend/src/__tests__/governance/proposal-details-content.test.tsx +++ b/apps/sv/frontend/src/__tests__/governance/proposal-details-content.test.tsx @@ -13,6 +13,7 @@ import { ProposalVote, ProposalVotingInformation, UnclaimedActivityRecordProposal, + UpdateFeatureAppProposal, UpdateSvRewardWeightProposal, } from '../../utils/types'; import userEvent from '@testing-library/user-event'; @@ -285,6 +286,94 @@ describe('Proposal Details Content', () => { expect(rightContractIdValue.textContent).toMatch(/rightContractId/); }); + test('should render update featured app proposal details', async () => { + const updateFeaturedAppDetails = { + actionName: 'Update Featured Application', + action: 'SRARC_UpdateFeaturedAppRight', + proposal: { + rightContractId: 'rightCid123', + newActivityWeight: '2.5', + reason: 'boosting rewards', + } as UpdateFeatureAppProposal, + } as ProposalDetails; + + render( + + + + ); + + const action = screen.getByTestId('proposal-details-action-value'); + expect(action.textContent).toMatch('Update Featured Application'); + + const updateFeaturedAppSection = screen.getByTestId( + 'proposal-details-update-feature-app-section' + ); + expect(updateFeaturedAppSection).toBeInTheDocument(); + + const updateFeaturedAppLabel = screen.getByTestId('proposal-details-update-feature-app-label'); + expect(updateFeaturedAppLabel.textContent).toMatch('Featured Application Contract ID'); + + const updateFeaturedAppValue = screen.getByTestId('proposal-details-update-feature-app-value'); + expect(updateFeaturedAppValue.textContent).toMatch('rightCid123'); + + await waitFor(() => { + const currentFeaturedAppWeight = screen.getByTestId('config-change-current-value'); + expect(currentFeaturedAppWeight.textContent).toMatch('1.0'); + }); + + const newFeaturedAppWeight = screen.getByTestId('config-change-new-value'); + expect(newFeaturedAppWeight.textContent).toMatch('2.5'); + + const updateFeaturedReasonLabel = screen.getByTestId( + 'proposal-details-update-feature-reason-label' + ); + expect(updateFeaturedReasonLabel.textContent).toMatch('Reason'); + + const updateFeaturedReasonValue = screen.getByTestId( + 'proposal-details-update-feature-reason-value' + ); + expect(updateFeaturedReasonValue.textContent).toMatch('boosting rewards'); + }); + + test('should show only new weight when featured app right is not found', async () => { + const updateFeaturedAppDetails = { + actionName: 'Update Featured Application', + action: 'SRARC_UpdateFeaturedAppRight', + proposal: { + rightContractId: 'archivedRightCid', // <- not 'rightCid123', so the mock returns not-found + newActivityWeight: '2.5', + reason: 'boosting rewards', + } as UpdateFeatureAppProposal, + } as ProposalDetails; + + render( + + + + ); + + // new value still shows + await waitFor(() => { + const newFeaturedAppWeight = screen.getByTestId('config-change-new-value'); + expect(newFeaturedAppWeight.textContent).toMatch('2.5'); + }); + // ...but there's no current-value box (contract archived → currentWeight '') + expect(screen.queryByTestId('config-change-current-value')).toBeNull(); + }); + test('should render update sv reward weight proposal details', () => { const svToUpdate = 'sv2'; const updateSvRewardWeightDetails = { diff --git a/apps/sv/frontend/src/__tests__/governance/proposal-summary.test.tsx b/apps/sv/frontend/src/__tests__/governance/proposal-summary.test.tsx index cbbd9b3f9e..6d2c17a364 100644 --- a/apps/sv/frontend/src/__tests__/governance/proposal-summary.test.tsx +++ b/apps/sv/frontend/src/__tests__/governance/proposal-summary.test.tsx @@ -201,6 +201,64 @@ describe('Review Proposal Component', () => { expect(screen.getByTestId('revokeRight-field').textContent).toBe(contractId); }); + test('should render review proposal component for update feature application', () => { + const actionName = 'Update Featured Application'; + const providerPartyId = 'a-party-id::1014912492'; + const rightCid = 'bcde123456'; + const currentActivityWeight = '1.0'; + const newActivityWeight = '2.5'; + const reason = 'boosting rewards'; + + render( + {}} + onSubmit={() => {}} + /> + ); + + expect(screen.getByTestId('action-title').textContent).toBe('Action'); + expect(screen.getByTestId('action-field').textContent).toBe(actionName); + + expect(screen.getByTestId('url-title').textContent).toBe('URL'); + expect(screen.getByTestId('url-field').textContent).toBe(url); + + expect(screen.getByTestId('summary-title').textContent).toBe('Summary'); + expect(screen.getByTestId('summary-field').textContent).toBe(summary); + + expect(screen.getByTestId('expiryDate-title').textContent).toBe('Threshold Deadline'); + expect(screen.getByTestId('expiryDate-field').textContent).toBe(expiryDate); + + expect(screen.getByTestId('effectiveDate-title').textContent).toBe('Effective Date'); + expect(screen.getByTestId('effectiveDate-field').textContent).toBe(effectiveDate); + + expect(screen.getByTestId('updateProviderPartyId-title').textContent).toBe('Provider Party ID'); + expect(screen.getByTestId('updateProviderPartyId-field').textContent).toBe(providerPartyId); + + expect(screen.getByTestId('updateRight-title').textContent).toBe( + 'Featured Application Contract ID' + ); + expect(screen.getByTestId('updateRight-field').textContent).toBe(rightCid); + + expect(screen.getByTestId('config-change-current-value').textContent).toBe( + currentActivityWeight + ); + expect(screen.getByTestId('config-change-new-value').textContent).toBe(newActivityWeight); + + expect(screen.getByTestId('updateReason-title').textContent).toBe('Reason'); + expect(screen.getByTestId('updateReason-field').textContent).toBe(reason); + }); + test('should render review proposal component for dso rules config', () => { const actionName = 'Set DSO Rules Configuration'; const numThresholdTitle = 'Number of Unclaimed Rewards Threshold'; diff --git a/apps/sv/frontend/src/__tests__/mocks/handlers/sv-api.ts b/apps/sv/frontend/src/__tests__/mocks/handlers/sv-api.ts index d184170e42..e335af9bf9 100644 --- a/apps/sv/frontend/src/__tests__/mocks/handlers/sv-api.ts +++ b/apps/sv/frontend/src/__tests__/mocks/handlers/sv-api.ts @@ -273,7 +273,7 @@ export const buildSvMock = (svUrl: string): HttpHandler[] => [ { template_id: 'featured-app-right-template-id', contract_id: 'rightCid123', - payload: {}, + payload: { activityWeight: '1.0' }, created_event_blob: '', created_at: '2026-02-26T13:00:00.000000Z', }, @@ -293,7 +293,7 @@ export const buildSvMock = (svUrl: string): HttpHandler[] => [ ? { template_id: 'featured-app-right-template-id', contract_id: 'rightCid123', - payload: { provider: 'a-party-id::1014912492' }, + payload: { provider: 'a-party-id::1014912492', activityWeight: '1.0' }, created_event_blob: '', created_at: '2026-02-26T13:00:00.000000Z', } diff --git a/apps/sv/frontend/src/components/forms/GrantRevokeFeaturedAppForm.tsx b/apps/sv/frontend/src/components/forms/GrantRevokeFeaturedAppForm.tsx index 472174b800..61fa337a34 100644 --- a/apps/sv/frontend/src/components/forms/GrantRevokeFeaturedAppForm.tsx +++ b/apps/sv/frontend/src/components/forms/GrantRevokeFeaturedAppForm.tsx @@ -22,7 +22,6 @@ import { validateEffectiveDate, validateExpiration, validateExpiryEffectiveDate, - validateRevokeFeaturedAppRight, validatePartyId, validateSummary, validateUrl, @@ -34,7 +33,7 @@ import { ProposalSummary } from '../governance/ProposalSummary'; import { ProposalSubmissionError } from '../form-components/ProposalSubmissionError'; import { useProposalMutation } from '../../hooks/useProposalMutation'; import { useSvAdminClient } from '../../contexts/SvAdminServiceContext'; -import { Option } from '../form-components/SelectField'; +import { useFeaturedAppRightPicker } from '../../hooks/useFeaturedAppRightPicker'; type ProviderId = string; type FeaturedAppRightId = string; @@ -75,8 +74,7 @@ export const GrantRevokeFeaturedAppForm: React.FC([]); - const [providerSearched, setProviderSearched] = useState(false); + const picker = useFeaturedAppRightPicker(svAdminClient); const mutation = useProposalMutation(); // TODO(#1819): use either search params or props and not both. @@ -103,34 +101,6 @@ export const GrantRevokeFeaturedAppForm: React.FC { - if (validatePartyId(value)) return undefined; - - try { - const response = await svAdminClient.listFeaturedAppRightsByProvider(value); - const options = response.featured_app_rights.map((contract: { contract_id: string }) => ({ - key: contract.contract_id, - value: contract.contract_id, - })); - setRevokeRightOptions(options); - setProviderSearched(true); - return undefined; - } catch { - setRevokeRightOptions([]); - setProviderSearched(false); - return 'Could not load featured app rights for this provider'; - } - }; - - const validateRevokeRightSelection = (value: string): string | false => { - const requiredError = validateRevokeFeaturedAppRight(value); - if (requiredError) return requiredError; - - return revokeRightOptions.some(option => option.value === value) - ? false - : 'Select a valid contract id'; - }; - const defaultValues: GrantRevokeFeaturedAppFormData = { action: createProposalAction?.name || '', expiryDate: initialExpiration.format(dateTimeFormatISO), @@ -202,16 +172,16 @@ export const GrantRevokeFeaturedAppForm: React.FC option.value === currentRightCid); + const hasSelectedOption = picker.rightOptions.some(option => option.value === currentRightCid); if (hasSelectedOption) return; - const nextRightCid = revokeRightOptions.length === 1 ? revokeRightOptions[0].value : ''; + const nextRightCid = picker.rightOptions.length === 1 ? picker.rightOptions[0].value : ''; form.setFieldValue('rightCid', nextRightCid); - }, [form, formAction, revokeRightOptions]); + }, [form, formAction, picker.rightOptions]); const partyId = useStore(form.store, state => state.values.partyId); const providerHasNoRights = - providerSearched && revokeRightOptions.length === 0 && !validatePartyId(partyId); + picker.providerSearched && picker.rightOptions.length === 0 && !validatePartyId(partyId); return ( <> @@ -284,7 +254,7 @@ export const GrantRevokeFeaturedAppForm: React.FC validatePartyId(value), onChangeAsyncDebounceMs: 500, - onChangeAsync: ({ value }) => loadFeaturedAppRightsAndValidate(value), + onChangeAsync: ({ value }) => picker.loadFeaturedAppRightsAndValidate(value), }} > {field => ( @@ -292,10 +262,11 @@ export const GrantRevokeFeaturedAppForm: React.FC { - setRevokeRightOptions([]); - setProviderSearched(false); + picker.resetOptions(); }} /> )} @@ -304,17 +275,17 @@ export const GrantRevokeFeaturedAppForm: React.FC validateRevokeRightSelection(value), - onChange: ({ value }) => validateRevokeRightSelection(value), + onBlur: ({ value }) => picker.validateRightSelection(value), + onChange: ({ value }) => picker.validateRightSelection(value), }} > {field => ( { + const svAdminClient = useSvAdminClient(); + const dsoInfosQuery = useDsoInfos(); + const initialExpiration = getInitialExpiration(dsoInfosQuery.data); + const initialEffectiveDate = dayjs(initialExpiration).add(1, 'day'); + const picker = useFeaturedAppRightPicker(svAdminClient); + const [showConfirmation, setShowConfirmation] = useState(false); + const mutation = useProposalMutation(); + const idPrefix = 'update-featured-app'; + + const createProposalAction = createProposalActions.find( + a => a.value === 'SRARC_UpdateFeaturedAppRight' + ); + + const defaultValues: UpdateFeatureAppFormData = { + action: createProposalAction?.name || '', + expiryDate: initialExpiration.format(dateTimeFormatISO), + effectiveDate: { + type: 'custom', + effectiveDate: initialEffectiveDate.format(dateTimeFormatISO), + }, + url: '', + summary: '', + partyId: '', + rightCid: '', + newActivityWeight: '', + reason: '', + }; + + const form = useAppForm({ + defaultValues, + onSubmit: async ({ value }) => { + const action: ActionRequiringConfirmation = { + tag: 'ARC_DsoRules', + value: { + dsoAction: { + tag: 'SRARC_UpdateFeaturedAppRight', + value: { + rightCid: value.rightCid as ContractId, + update: { reason: value.reason, newActivityWeight: value.newActivityWeight }, + }, + }, + }, + }; + if (!showConfirmation) setShowConfirmation(true); + else + await mutation.mutateAsync({ formData: value, action }).catch(e => { + console.error('Failed to submit proposal', e); + }); + }, + validators: { + onChange: ({ value }) => + validateExpiryEffectiveDate({ + expiration: value.expiryDate, + effectiveDate: value.effectiveDate.effectiveDate, + }), + }, + }); + + useEffect(() => { + const currentRightCid = form.state.values.rightCid; + const hasSelectedOption = picker.rightOptions.some(o => o.value === currentRightCid); + if (hasSelectedOption) return; + + const nextRightCid = picker.rightOptions.length === 1 ? picker.rightOptions[0].value : ''; + form.setFieldValue('rightCid', nextRightCid); + }, [form, picker.rightOptions]); + + const partyId = useStore(form.store, state => state.values.partyId); + const rightCid = useStore(form.store, state => state.values.rightCid); + const currentWeight = picker.currentWeights[rightCid] ?? DEFAULT_APP_ACTIVITY_WEIGHT; + + const providerHasNoRights = + picker.providerSearched && picker.rightOptions.length === 0 && !validatePartyId(partyId); + + const requiredActivityWeightSubtitle = + "Required. Scales the app's share of traffic-based rewards"; + + return ( + <> + + {showConfirmation ? ( + setShowConfirmation(false)} + onSubmit={() => {}} + /> + ) : ( + <> + + {field => } + + + validatePartyId(value), + onChangeAsyncDebounceMs: 500, + onChangeAsync: ({ value }) => picker.loadFeaturedAppRightsAndValidate(value), + }} + > + {field => ( + { + picker.resetOptions(); + }} + /> + )} + + + picker.validateRightSelection(value), + onChange: ({ value }) => picker.validateRightSelection(value), + }} + > + {field => ( + + )} + + + validateRequiredActivityWeight(value), + onChange: ({ value }) => validateRequiredActivityWeight(value), + }} + > + {field => ( + + )} + + + validateReason(value), + onChange: ({ value }) => validateReason(value), + }} + > + {field => } + + + validateExpiration(value), + onBlur: ({ value }) => validateExpiration(value), + }} + > + {field => ( + + )} + + + validateEffectiveDate(value), + onBlur: ({ value }) => validateEffectiveDate(value), + }} + children={_ => ( + + )} + /> + + validateSummary(value), + onChange: ({ value }) => validateSummary(value), + }} + > + {field => } + + + validateUrl(value), + onChange: ({ value }) => validateUrl(value), + }} + > + {field => } + + + )} + + + + + setShowConfirmation(false)} + /> + + + + ); +}; diff --git a/apps/sv/frontend/src/components/forms/formValidators.ts b/apps/sv/frontend/src/components/forms/formValidators.ts index d2dc4877b9..ed7954ceba 100644 --- a/apps/sv/frontend/src/components/forms/formValidators.ts +++ b/apps/sv/frontend/src/components/forms/formValidators.ts @@ -12,6 +12,8 @@ export const urlSchema = z.string().refine(url => isValidUrl(url), { export const summarySchema = z.string().min(1, { message: 'Summary is required' }); +export const reasonSchema = z.string().min(1, { message: 'Reason is required' }); + export const svSelectionSchema = z.string().min(1, { message: 'SV is required' }); const getExpirationSchema = (errMessage: string) => { @@ -66,6 +68,18 @@ export const rewardAmountSchema = z { message: 'Amount can have at most 10 decimal places' } ); +export const requiredActivityWeightSchema = z + .string() + .min(1, { message: 'Weight is required' }) + .regex(/^\d+(\.\d+)?$/, { message: 'Weight must be a valid non-negative number' }) + .refine( + v => { + const i = v.indexOf('.'); + return i === -1 || v.length - i - 1 <= 10; + }, + { message: 'Weight can have at most 10 decimal places' } + ); + export const activityWeightSchema = z .string() .refine(v => v === '' || /^\d+(\.\d+)?$/.test(v), { @@ -94,6 +108,11 @@ export const validateActivityWeight = (value: string): string | false => { return result.success ? false : result.error.issues[0].message; }; +export const validateRequiredActivityWeight = (value: string): string | false => { + const result = requiredActivityWeightSchema.safeParse(value); + return result.success ? false : result.error.issues[0].message; +}; + export const validateSvSelection = (value: string): string | false => { const result = svSelectionSchema.safeParse(value); return result.success ? false : result.error.issues[0].message; @@ -166,6 +185,11 @@ export const validateSummary = (value: string): string | false => { return result.success ? false : result.error.issues[0].message; }; +export const validateReason = (value: string): string | false => { + const result = reasonSchema.safeParse(value); + return result.success ? false : result.error.issues[0].message; +}; + export const validateUrl = (value: string): string | false => { const result = urlSchema.safeParse(value); return result.success ? false : result.error.issues[0].message; diff --git a/apps/sv/frontend/src/components/governance/ProposalDetailsContent.tsx b/apps/sv/frontend/src/components/governance/ProposalDetailsContent.tsx index 06ca0387df..bb84be55b3 100644 --- a/apps/sv/frontend/src/components/governance/ProposalDetailsContent.tsx +++ b/apps/sv/frontend/src/components/governance/ProposalDetailsContent.tsx @@ -34,6 +34,7 @@ import { CreateUnallocatedUnclaimedActivityRecordSection } from './proposal-deta import { CopyableIdentifier, CopyableUrl, MemberIdentifier, VoteStats } from '../beta'; import { useQuery } from '@tanstack/react-query'; import { useSvAdminClient } from '../../contexts/SvAdminServiceContext'; +import { DEFAULT_APP_ACTIVITY_WEIGHT } from '../../utils/constants'; dayjs.extend(relativeTime); @@ -228,6 +229,14 @@ export const ProposalDetailsContent: React.FC = pro )} + {proposalDetails.action === 'SRARC_UpdateFeaturedAppRight' && ( + + )} + {proposalDetails.action === 'SRARC_UpdateSvRewardWeight' && ( { ); }; +interface UpdateFeatureAppSectionProps { + rightContractId: string; + newActivityWeight: string; + reason: string; +} + +const UpdateFeatureAppSection = ({ + rightContractId, + newActivityWeight, + reason, +}: UpdateFeatureAppSectionProps) => { + const svAdminClient = useSvAdminClient(); + const providerQuery = useQuery({ + queryKey: ['featuredAppRightProviderAndWeight', rightContractId], + queryFn: async () => { + const response = await svAdminClient.lookupFeaturedAppRightByContractId(rightContractId); + const contract = response.featured_app_right; + const payload = contract?.payload as + | { provider?: string; activityWeight?: string | null } + | undefined; + return { + provider: payload?.provider ?? null, + currentWeight: contract ? (payload?.activityWeight ?? DEFAULT_APP_ACTIVITY_WEIGHT) : '', + }; + }, + }); + return ( + + {providerQuery?.data?.provider && ( + + } + labelId="proposal-details-update-feature-label" + /> + )} + + } + labelId="proposal-details-update-feature-app-label" + /> + + } + /> + + + ); +}; + interface UpdateSvRewardWeightSectionProps { svToUpdate: string; currentWeight: string; diff --git a/apps/sv/frontend/src/components/governance/ProposalSummary.tsx b/apps/sv/frontend/src/components/governance/ProposalSummary.tsx index 3b2ab3882c..a831205927 100644 --- a/apps/sv/frontend/src/components/governance/ProposalSummary.tsx +++ b/apps/sv/frontend/src/components/governance/ProposalSummary.tsx @@ -49,6 +49,14 @@ type ProposalSummaryProps = BaseProposalSummaryProps & amount: string; expiresAt: string; } + | { + formType: 'update-right-weight'; + providerPartyId: string; + rightCid: string; + currentActivityWeight: string; + newActivityWeight: string; + reason: string; + } ); export const ProposalSummary: React.FC = props => { @@ -140,6 +148,38 @@ export const ProposalSummary: React.FC = props => { )} + {formType === 'update-right-weight' && ( + <> + + + + } + /> + + + )} + {formType === 'offboard' && ( ; + providerSearched: boolean; + loadFeaturedAppRightsAndValidate: (value: string) => Promise; + validateRightSelection: (value: string) => string | false; + resetOptions: () => void; +} + +export const useFeaturedAppRightPicker = ( + svAdminClient: ReturnType +): FeatureAppRightPicker => { + const [rightOptions, setRightOptions] = useState([]); + const [providerSearched, setProviderSearched] = useState(false); + const [currentWeights, setCurrentWeights] = useState>({}); + + const loadFeaturedAppRightsAndValidate = async (value: string) => { + if (validatePartyId(value)) return undefined; + + try { + const response = await svAdminClient.listFeaturedAppRightsByProvider(value); + const options = response.featured_app_rights.map((contract: { contract_id: string }) => ({ + key: contract.contract_id, + value: contract.contract_id, + })); + const weights = Object.fromEntries( + response.featured_app_rights.map(c => { + const aw = (c.payload as { activityWeight?: string | null }).activityWeight; + return [c.contract_id, aw ?? DEFAULT_APP_ACTIVITY_WEIGHT]; + }) + ); + setRightOptions(options); + setCurrentWeights(weights); + setProviderSearched(true); + return undefined; + } catch { + setRightOptions([]); + setCurrentWeights({}); + setProviderSearched(false); + return 'Could not load featured app rights for this provider'; + } + }; + + const validateRightSelection = (value: string): string | false => { + const requiredError = validateRevokeFeaturedAppRight(value); + if (requiredError) return requiredError; + + return rightOptions.some(option => option.value === value) + ? false + : 'Select a valid contract id'; + }; + + const resetOptions = () => { + setRightOptions([]); + setCurrentWeights({}); + setProviderSearched(false); + }; + + return { + rightOptions, + currentWeights, + providerSearched, + loadFeaturedAppRightsAndValidate, + validateRightSelection, + resetOptions, + }; +}; diff --git a/apps/sv/frontend/src/routes/createProposal.tsx b/apps/sv/frontend/src/routes/createProposal.tsx index 63ee6fb92c..897c85c5e7 100644 --- a/apps/sv/frontend/src/routes/createProposal.tsx +++ b/apps/sv/frontend/src/routes/createProposal.tsx @@ -14,6 +14,7 @@ import { useDsoInfos } from '../contexts/SvContext'; import { createProposalActions } from '../utils/governance'; import type { SupportedActionTag } from '../utils/types'; import { Box } from '@mui/material'; +import { UpdateFeaturedAppForm } from '../components/forms/UpdateFeaturedAppForm'; const ProposalForm: React.FC<{ action: SupportedActionTag }> = ({ action }) => { const dsoInfosQuery = useDsoInfos(); @@ -35,6 +36,8 @@ const ProposalForm: React.FC<{ action: SupportedActionTag }> = ({ action }) => { return ; case 'CRARC_SetConfig': return ; + case 'SRARC_UpdateFeaturedAppRight': + return ; } }; diff --git a/apps/sv/frontend/src/utils/constants.ts b/apps/sv/frontend/src/utils/constants.ts index c0b2907dca..c03ac64fcb 100644 --- a/apps/sv/frontend/src/utils/constants.ts +++ b/apps/sv/frontend/src/utils/constants.ts @@ -6,3 +6,4 @@ export const PROPOSAL_SUMMARY_SUBTITLE = 'For CIP votes, consider copying the CI export const DEFAULT_PROPOSAL_SUMMARY_MAX_LENGTH = 1024; export const THRESHOLD_DEADLINE_SUBTITLE = 'Proposal remains open only if ⅔ of nodes place a vote before this date-time'; +export const DEFAULT_APP_ACTIVITY_WEIGHT = '1.0'; diff --git a/apps/sv/frontend/src/utils/governance.ts b/apps/sv/frontend/src/utils/governance.ts index 9432ee4312..c00936a76a 100644 --- a/apps/sv/frontend/src/utils/governance.ts +++ b/apps/sv/frontend/src/utils/governance.ts @@ -28,6 +28,7 @@ import type { SupportedActionTag, UnclaimedActivityRecordProposal, UnfeatureAppProposal, + UpdateFeatureAppProposal, UpdateSvRewardWeightProposal, YourVoteStatus, } from '../utils/types'; @@ -46,6 +47,7 @@ export const actionTagToTitle = (amuletName: string): Record Date: Wed, 29 Jul 2026 11:52:38 +0200 Subject: [PATCH 13/15] [ci] Retry event history sanity check to avoid scan ingestion race (#6591) * [static] Retry event history sanity check to avoid scan ingestion race Signed-off-by: Raymond Roestenburg * [static] Explain the ingestion-cap race in the event history retry comment Signed-off-by: Raymond Roestenburg --------- Signed-off-by: Raymond Roestenburg --- .../plugins/EventHistorySanityCheckPlugin.scala | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/apps/app/src/test/scala/org/lfdecentralizedtrust/splice/integration/plugins/EventHistorySanityCheckPlugin.scala b/apps/app/src/test/scala/org/lfdecentralizedtrust/splice/integration/plugins/EventHistorySanityCheckPlugin.scala index 232d7113a8..c985cb6683 100644 --- a/apps/app/src/test/scala/org/lfdecentralizedtrust/splice/integration/plugins/EventHistorySanityCheckPlugin.scala +++ b/apps/app/src/test/scala/org/lfdecentralizedtrust/splice/integration/plugins/EventHistorySanityCheckPlugin.scala @@ -16,6 +16,7 @@ import org.lfdecentralizedtrust.splice.http.v0.definitions.UpdateHistoryReassign import org.lfdecentralizedtrust.splice.integration.tests.SpliceTests.SpliceTestConsoleEnvironment import org.scalatest.concurrent.Eventually import org.scalatest.matchers.should.Matchers +import org.scalatest.time.{Millis, Seconds, Span} import org.scalatest.{Inspectors, LoneElement} import scala.annotation.tailrec @@ -34,7 +35,16 @@ class EventHistorySanityCheckPlugin( ): Unit = { val initializedScans = environment.scans.local.filter(_.is_initialized) if (initializedScans.nonEmpty) { - compareEventHistories(initializedScans) + // getEventHistory only serves events up to min(update, verdict) ingestion cursor + // (ScanEventStore.getCurrentMigrationCap), and verdict ingestion from the mediator lags + // behind update ingestion. At teardown this can hide even long-ingested updates, such as + // the DsoRules_AddSv exercise that compareEventHistories requires to appear in the founder + // history, so retry: each attempt re-fetches the histories until the cursors catch up. + eventually(compareEventHistories(initializedScans))( + PatienceConfig(timeout = Span(20, Seconds), interval = Span(500, Millis)), + implicitly[org.scalatest.enablers.Retrying[Unit]], + implicitly[org.scalactic.source.Position], + ) } } From a707d395797c9b679fca7a73521aeaaceccccc0f Mon Sep 17 00:00:00 2001 From: aonif <104995055+aonif@users.noreply.github.com> Date: Wed, 29 Jul 2026 13:51:07 +0200 Subject: [PATCH 14/15] Implement governance form field styling (Fixes #2656, #2657, #2659) (#6407) Signed-off-by: Lyutskan Lyutskanov Signed-off-by: Tim Pelzer Co-authored-by: Tim Pelzer --- .../form-components/ConfigField.tsx | 11 +- .../components/form-components/DateField.tsx | 38 ++- .../form-components/EffectiveDateField.tsx | 39 +-- .../form-components/ProposalSummaryField.tsx | 32 +- .../form-components/SelectField.tsx | 25 +- .../components/form-components/TextField.tsx | 30 +- ...UnallocatedUnclaimedActivityRecordForm.tsx | 2 +- .../forms/GrantRevokeFeaturedAppForm.tsx | 2 +- .../src/components/forms/OffboardSvForm.tsx | 2 +- .../forms/SetAmuletConfigRulesForm.tsx | 2 +- .../forms/SetDsoConfigRulesForm.tsx | 2 +- .../forms/UpdateSvRewardWeightForm.tsx | 2 +- apps/sv/frontend/src/themes/fieldStyles.ts | 319 ++++++++++++++++++ 13 files changed, 428 insertions(+), 78 deletions(-) create mode 100644 apps/sv/frontend/src/themes/fieldStyles.ts diff --git a/apps/sv/frontend/src/components/form-components/ConfigField.tsx b/apps/sv/frontend/src/components/form-components/ConfigField.tsx index 61a0216eaa..689d88c619 100644 --- a/apps/sv/frontend/src/components/form-components/ConfigField.tsx +++ b/apps/sv/frontend/src/components/form-components/ConfigField.tsx @@ -8,6 +8,7 @@ import relativeTime from 'dayjs/plugin/relativeTime'; import { useFieldContext } from '../../hooks/formContext'; import type { ConfigChange, PendingConfigFieldInfo } from '../../utils/types'; import { nextScheduledSynchronizerUpgradeFormat } from '@canton-network/splice-common-frontend-utils'; +import { configFieldFieldSx, configFieldInputSx } from '../../themes/fieldStyles'; dayjs.extend(relativeTime); @@ -55,12 +56,16 @@ export const ConfigField: React.FC = props => { const textFieldProps = { variant: 'outlined' as const, - size: 'small' as const, color: field.state.meta.isDefaultValue ? ('primary' as const) : ('secondary' as const), focused: !field.state.meta.isDefaultValue, autoComplete: 'off' as const, + sx: configFieldFieldSx, + slotProps: { + input: { + sx: configFieldInputSx, + }, + }, inputProps: { - sx: { textAlign: 'right' }, 'data-testid': `config-field-${configChange.fieldName}`, }, disabled: isDisabled, @@ -89,7 +94,7 @@ export const ConfigField: React.FC = props => { - + = props => { const dateValue = useMemo(() => dayjs(field.state.value), [field.state.value]); return ( - - {title && ( - - {title} - - )} + + {title && {title}} - {description && ( - - {description} - - )} + {description && {description}} = props => { format={dateTimeFormatISO} minDateTime={minDate || dayjs()} ampm={false} + onClose={() => field.handleBlur()} onChange={newDate => field.handleChange(newDate?.format(dateTimeFormatISO)!)} enableAccessibleFieldDOMStructure={false} + slots={{ + openPickerIcon: KeyboardArrowDown, + }} slotProps={{ textField: { fullWidth: true, variant: 'outlined', id: `${id}-field`, + error: !field.state.meta.isValid, helperText: field.state.meta.errors?.[0], onBlur: field.handleBlur, + sx: datePickerFieldSx, inputProps: { 'data-testid': `${id}-field`, }, }, + openPickerButton: { + sx: { + color: 'text.light', + marginRight: 0, + padding: 0, + cursor: 'pointer', + '& .MuiSvgIcon-root': { + fontSize: 16, + }, + }, + }, }} /> diff --git a/apps/sv/frontend/src/components/form-components/EffectiveDateField.tsx b/apps/sv/frontend/src/components/form-components/EffectiveDateField.tsx index 26c6b0216c..fa09b9fc9b 100644 --- a/apps/sv/frontend/src/components/form-components/EffectiveDateField.tsx +++ b/apps/sv/frontend/src/components/form-components/EffectiveDateField.tsx @@ -10,6 +10,7 @@ import { AdapterDayjs } from '@mui/x-date-pickers/AdapterDayjs'; import { EffectivityType } from '../../utils/types'; import React, { useMemo } from 'react'; import { RadioSelector } from './RadioSelector'; +import { datePickerFieldSx } from '../../themes/fieldStyles'; const effectiveAtDisplayFormat = 'YYYY-MM-DD HH:mm'; @@ -106,46 +107,10 @@ export const EffectiveDateField: React.FC = props => { error: !field.state.meta.isValid, helperText: field.state.meta.errors?.[0], onBlur: field.handleBlur, + sx: datePickerFieldSx, inputProps: { 'data-testid': `${id}-field`, }, - sx: theme => ({ - width: '100%', - '& .MuiOutlinedInput-root': { - backgroundColor: '#363636', - borderRadius: '4px', - display: 'flex', - justifyContent: 'space-between', - alignItems: 'center', - alignSelf: 'stretch', - flexWrap: 'nowrap', - padding: '13px 16px', - overflow: 'hidden', - minHeight: 'unset', - '& fieldset': { - border: 'none', - borderRadius: '4px', - }, - }, - '& .MuiOutlinedInput-input': { - ...theme.typography.body2, - flex: 1, - minWidth: 0, - padding: 0, - lineHeight: '22px', - color: theme.palette.text.light, - backgroundColor: 'transparent', - borderRadius: 0, - WebkitBoxShadow: 'none', - }, - '& .MuiInputAdornment-root': { - flexShrink: 0, - marginLeft: theme.spacing(1.25), - }, - '& .MuiFormHelperText-root': { - mx: 0, - }, - }), }, }} /> diff --git a/apps/sv/frontend/src/components/form-components/ProposalSummaryField.tsx b/apps/sv/frontend/src/components/form-components/ProposalSummaryField.tsx index f6a7a83e53..0ff342eb9c 100644 --- a/apps/sv/frontend/src/components/form-components/ProposalSummaryField.tsx +++ b/apps/sv/frontend/src/components/form-components/ProposalSummaryField.tsx @@ -9,6 +9,12 @@ import { PROPOSAL_SUMMARY_SUBTITLE, PROPOSAL_SUMMARY_TITLE, } from '../../utils/constants'; +import { + fieldDescriptionSx, + fieldSectionSx, + fieldSectionTitleSx, + proposalSummaryFieldSx, +} from '../../themes/fieldStyles'; export interface ProposalSummaryFieldProps { id: string; @@ -27,11 +33,17 @@ export const ProposalSummaryField: React.FC = props = const currentLength = field.state.value.length; return ( - - + + {title || PROPOSAL_SUMMARY_TITLE} {optional && ( - + optional )} @@ -39,32 +51,32 @@ export const ProposalSummaryField: React.FC = props = field.handleChange(e.target.value)} error={!field.state.meta.isValid} helperText={field.state.meta.errors?.[0]} inputProps={{ 'data-testid': id, maxLength }} - id={id} /> - + {subtitle || PROPOSAL_SUMMARY_SUBTITLE} diff --git a/apps/sv/frontend/src/components/form-components/SelectField.tsx b/apps/sv/frontend/src/components/form-components/SelectField.tsx index 95bb6d8fb5..354e4350d9 100644 --- a/apps/sv/frontend/src/components/form-components/SelectField.tsx +++ b/apps/sv/frontend/src/components/form-components/SelectField.tsx @@ -1,6 +1,7 @@ // Copyright (c) 2024 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved. // SPDX-License-Identifier: Apache-2.0 +import { KeyboardArrowDown } from '@mui/icons-material'; import { Box, FormControl, @@ -13,6 +14,7 @@ import { import type { FormEvent } from 'react'; import { useFieldContext } from '../../hooks/formContext'; import { scrollableSelectFieldSx } from '../beta/identifierStyles'; +import { fieldSectionSx, fieldSectionTitleSx, selectFieldSx } from '../../themes/fieldStyles'; export type Option = { key: string; value: string }; export interface SelectFieldProps { @@ -38,16 +40,19 @@ export const SelectField: React.FC = props => { const isError = !field.state.meta.isValid && !showPlaceholder; return ( - - - {title} - + + {title} - +