diff --git a/onRenderBody.js b/onRenderBody.js index 139a6b6feffd1..d34c0417123c7 100644 --- a/onRenderBody.js +++ b/onRenderBody.js @@ -7,7 +7,7 @@ const themes = { light: lighttheme, dark: darktheme }; const MagicScriptTag = (props) => { // FIX: Stringify the theme object outside the template literal to prevent syntax errors caused by unescaped quotes inside theme values. const themeJSON = JSON.stringify(props.theme); - + // Injects CSS variables and theme state strictly before the first paint to prevent FOUC. const codeToRunOnClient = ` (function() { @@ -75,6 +75,6 @@ const MagicScriptTag = (props) => { // FIX: Using setHeadComponents instead of setPreBodyComponents ensures the script runs // strictly in the , blocking the first paint until the theme is applied and completely eliminating FOUC. -export const onRenderBody = ( { setHeadComponents }) => { +export const onRenderBody = ({ setHeadComponents }) => { setHeadComponents([]); -}; \ No newline at end of file +}; diff --git a/src/components/MeetInfo-Table/index.js b/src/components/MeetInfo-Table/index.js index d640e958e0f8f..1607ad05f95d3 100644 --- a/src/components/MeetInfo-Table/index.js +++ b/src/components/MeetInfo-Table/index.js @@ -3,29 +3,24 @@ import { useTable } from "react-table"; import { TableWrapper } from "./MeetInfoTable.style"; const Table = ({ columns, data, showHeader = true }) => { - const { - getTableProps, - getTableBodyProps, - headerGroups, - rows, - prepareRow, - } = useTable({ - columns, - data, - }); + const { getTableProps, getTableBodyProps, headerGroups, rows, prepareRow } = + useTable({ + columns, + data, + }); return ( {showHeader && ( - <> -

- Layer5 Meetings -

-

- Everyone is welcome to join. Engage! -

- -)} + <> +

+ Layer5 Meetings +

+

+ Everyone is welcome to join. Engage! +

+ + )} {headerGroups.map((headerGroup) => ( diff --git a/src/sections/Counters/index.js b/src/sections/Counters/index.js index 7f90f142f3e0d..2a389aa4cc837 100644 --- a/src/sections/Counters/index.js +++ b/src/sections/Counters/index.js @@ -12,8 +12,13 @@ const Counters = () => { useEffect(() => { fetch(URL) - .then(response => response.json()) - .then(result => setPerformanceCount(result.total_runs)); + .then((response) => response.json()) + .then((result) => + setPerformanceCount(result.totalRuns || result.total_runs), + ) + .catch((error) => { + console.error("Failed to fetch performance count:", error.message); + }); }, []); return ( diff --git a/src/sections/Meshery/Features-Col/data/index.js b/src/sections/Meshery/Features-Col/data/index.js index 4b7d57c63830d..193fee306dbfa 100644 --- a/src/sections/Meshery/Features-Col/data/index.js +++ b/src/sections/Meshery/Features-Col/data/index.js @@ -14,76 +14,164 @@ const LifecycleFeature = () => { } `); - const lifecycleFeatureData = { name: "Lifecycle", - description: "Manage and operate your cloud native infra from discovery to deployment.", + description: + "Manage and operate your cloud native infra from discovery to deployment.", link: "#", btnText: "Discover your clusters", services: [ - { content: "Multi-cluster operations from a central console", className: "--on" }, - { content: "Discover, deploy, and visualize Kubernetes clusters", className: "--on" }, - { content: "Dry-run capabilities and change previews in pull requests", className: "--on" }, - { content: "Meshery CLI (mesheryctl) for streamlined cluster ops", className: "--on" }, - { content: "Bulk import of infrastructure as code from GitHub", className: "--on" }, - { content: "Helm chart generation and environment configuration", className: "--on" }, - { content: "Workspaces for centralized team and project management", className: "--on" }, - { content: "Environments for grouped resource access and control", className: "--on" }, - { content: "GitOps snapshots and insights in pull requests", className: "--on" }, - { content: "Role-based access control and multi-tenant support", className: "--on" } + { + content: "Multi-cluster operations from a central console", + className: "--on", + }, + { + content: "Discover, deploy, and visualize Kubernetes clusters", + className: "--on", + }, + { + content: "Dry-run capabilities and change previews in pull requests", + className: "--on", + }, + { + content: "Meshery CLI (mesheryctl) for streamlined cluster ops", + className: "--on", + }, + { + content: "Bulk import of infrastructure as code from GitHub", + className: "--on", + }, + { + content: "Helm chart generation and environment configuration", + className: "--on", + }, + { + content: "Workspaces for centralized team and project management", + className: "--on", + }, + { + content: "Environments for grouped resource access and control", + className: "--on", + }, + { + content: "GitOps snapshots and insights in pull requests", + className: "--on", + }, + { + content: "Role-based access control and multi-tenant support", + className: "--on", + }, ], count: { value: 300, - description: "cloud native integrations" - } + description: "cloud native integrations", + }, }; - const configurationFeatureData = { name: "Configuration", - description: "Design, validate, and version your infra with visual tools and best practices.", + description: + "Design, validate, and version your infra with visual tools and best practices.", link: "#", btnText: "Get Started", services: [ - { content: "Drag-and-drop infrastructure designer (Kanvas)", className: "--on" }, - { content: "400+ reusable design templates and patterns", className: "--on" }, - { content: "Define semantic and non-semantic relationships visually", className: "--on" }, - { content: "Export designs: Kubernetes, Helm, Docker Compose, OCI", className: "--on" }, - { content: "Static validation and OPA-based policy enforcement", className: "--on" }, - { content: "Version control and inline design review tools", className: "--on" }, + { + content: "Drag-and-drop infrastructure designer (Kanvas)", + className: "--on", + }, + { + content: "400+ reusable design templates and patterns", + className: "--on", + }, + { + content: "Define semantic and non-semantic relationships visually", + className: "--on", + }, + { + content: "Export designs: Kubernetes, Helm, Docker Compose, OCI", + className: "--on", + }, + { + content: "Static validation and OPA-based policy enforcement", + className: "--on", + }, + { + content: "Version control and inline design review tools", + className: "--on", + }, { content: "Custom models with OCI registry support", className: "--on" }, - { content: "Web terminal for direct container/pod access", className: "--on" }, - { content: "Extension points: gRPC adapters, hot-loadable React and Golang plugins", className: "--on" }, - { content: "REST and GraphQL APIs for platform extensibility", className: "--on" } + { + content: "Web terminal for direct container/pod access", + className: "--on", + }, + { + content: + "Extension points: gRPC adapters, hot-loadable React and Golang plugins", + className: "--on", + }, + { + content: "REST and GraphQL APIs for platform extensibility", + className: "--on", + }, ], count: { value: 1500, - description: "standardized components" - } + description: "standardized components", + }, }; - const performanceFeatureData = { name: "Optimization", - description: "Assess, benchmark, and improve the performance of your infra.", + description: + "Assess, benchmark, and improve the performance of your infra.", link: "#", btnText: "Start Performance Testing", services: [ - { content: "Performance profiles for consistent benchmarking", className: "--on" }, - { content: "Built-in load generators: Fortio, Wrk2, Nighthawk", className: "--on" }, - { content: "Comparative testing with visual result analysis", className: "--on" }, - { content: "Statistical reporting: latency histograms, buckets", className: "--on" }, - { content: "Cloud Native Performance spec compliance", className: "--on" }, - { content: "Historical performance tracking across versions", className: "--on" }, - { content: "Prometheus and Grafana integration for metrics", className: "--on" }, - { content: "Support for soak, burst, and capacity tests", className: "--on" }, - { content: "HTTP, TCP, and gRPC load generation support", className: "--on" }, - { content: "Behavioral comparison of CNFs across deployments", className: "--on" } + { + content: "Performance profiles for consistent benchmarking", + className: "--on", + }, + { + content: "Built-in load generators: Fortio, Wrk2, Nighthawk", + className: "--on", + }, + { + content: "Comparative testing with visual result analysis", + className: "--on", + }, + { + content: "Statistical reporting: latency histograms, buckets", + className: "--on", + }, + { + content: "Cloud Native Performance spec compliance", + className: "--on", + }, + { + content: "Historical performance tracking across versions", + className: "--on", + }, + { + content: "Prometheus and Grafana integration for metrics", + className: "--on", + }, + { + content: "Support for soak, burst, and capacity tests", + className: "--on", + }, + { + content: "HTTP, TCP, and gRPC load generation support", + className: "--on", + }, + { + content: "Behavioral comparison of CNFs across deployments", + className: "--on", + }, ], count: { value: 0, - description: "performance tests run" - } + description: "performance tests run", + }, }; // const collaborationFeatureData = { @@ -127,7 +215,9 @@ const LifecycleFeature = () => { // Count the total number of integrations const totalIntegrations = - Math.ceil(integrations.allMdx.totalCount / 10) * 10; + integrations.allMdx.totalCount > 0 + ? Math.ceil(integrations.allMdx.totalCount / 10) * 10 + : lifecycleFeatureData.count.value; // Update the count value in lifecycleFeatureData const lifecycleFeatureDataUpdated = { diff --git a/src/sections/Meshery/Features-Col/index.js b/src/sections/Meshery/Features-Col/index.js index 9b33e6683ad9b..855e78f06841f 100644 --- a/src/sections/Meshery/Features-Col/index.js +++ b/src/sections/Meshery/Features-Col/index.js @@ -18,7 +18,22 @@ function getServiceFeature(service, index) { @@ -38,7 +53,7 @@ function getFeatureBlock(feature, index, performanceCount) { {feature.services.map((service, index) => - getServiceFeature(service, index) + getServiceFeature(service, index), )} @@ -49,7 +64,12 @@ function getFeatureBlock(feature, index, performanceCount) { end={ feature.count.value !== 0 ? feature.count.value : performanceCount } - suffix= {(feature.count.description == "components" || feature.count.description == "cloud native integrations") ? "+" : " "} + suffix={ + feature.count.description == "components" || + feature.count.description == "cloud native integrations" + ? "+" + : " " + } />

{feature.count.description}

@@ -60,7 +80,8 @@ function getFeatureBlock(feature, index, performanceCount) { const Features = () => { const [performanceCount, setPerformanceCount] = useState(0); - const performanceCountEndpoint = "https://cloud.layer5.io/api/performance/results/total"; + const performanceCountEndpoint = + "https://cloud.layer5.io/api/performance/results/total"; useEffect(() => { fetch(performanceCountEndpoint) @@ -72,13 +93,16 @@ const Features = () => { return response.json(); }) .then((resultcount) => { - if (resultcount && typeof resultcount.total_runs === "number") { - setPerformanceCount(resultcount.total_runs); + const count = resultcount + ? resultcount.totalRuns || resultcount.total_runs + : undefined; + if (typeof count === "number") { + setPerformanceCount(count); } }) .catch((error) => { - console.log("Failed to fetch performance count:", error.message); - // Keep default value of 0 if fetch fails + console.error("Failed to fetch performance count:", error.message); + // Keep default value of 0 if fetch fails }); }, []); @@ -94,12 +118,11 @@ const Features = () => { {data.map((feature, index) => - getFeatureBlock(feature, index, performanceCount) + getFeatureBlock(feature, index, performanceCount), )} ); }; - export default Features; diff --git a/src/sections/Meshery/How-meshery-works/specs/data-card.js b/src/sections/Meshery/How-meshery-works/specs/data-card.js index 1925ab2a72e0c..232b6eeeb3a5f 100644 --- a/src/sections/Meshery/How-meshery-works/specs/data-card.js +++ b/src/sections/Meshery/How-meshery-works/specs/data-card.js @@ -8,41 +8,39 @@ import Counter from "../../../../reusecore/Counter"; import { URL } from "../../../Counters/index"; const DataCardWrapper = styled.div` - background: ${props => props.theme.grey222222ToWhite}; + background: ${(props) => props.theme.grey222222ToWhite}; border-radius: 10px; - color: ${props => props.theme.text}; + color: ${(props) => props.theme.text}; padding: 2rem; transition: 0.8s cubic-bezier(0.2, 0.8, 0.2, 1); - - ul{ + + ul { list-style: none; padding: 0; } - .col-1 li{ - display: flex; - align-items: center; - vertical-align: center; - margin-bottom: 1.5rem; - img{ - margin-right: 1rem; - } - h5{ - font-weight: 600; - transition: 0.8s cubic-bezier(0.2, 0.8, 0.2, 1); - } - } - - .col-2 li { - h3{ - color: ${props => props.theme.secondaryColor}; - font-weight: 700; - } - p { - font-size: 16px; - } - } - - + .col-1 li { + display: flex; + align-items: center; + vertical-align: center; + margin-bottom: 1.5rem; + img { + margin-right: 1rem; + } + h5 { + font-weight: 600; + transition: 0.8s cubic-bezier(0.2, 0.8, 0.2, 1); + } + } + + .col-2 li { + h3 { + color: ${(props) => props.theme.secondaryColor}; + font-weight: 700; + } + p { + font-size: 16px; + } + } `; const DataCard = () => { @@ -51,7 +49,12 @@ const DataCard = () => { useEffect(() => { fetch(URL) .then((response) => response.json()) - .then((result) => setPerformanceCount(result.total_runs)); + .then((result) => + setPerformanceCount(result.totalRuns || result.total_runs), + ) + .catch((error) => { + console.error("Failed to fetch performance count:", error.message); + }); }, []); return ( @@ -77,22 +80,13 @@ const DataCard = () => {
  • - +

    Users

  • - +

    Performance tests run

  • diff --git a/src/sections/Projects/Nighthawk/index.js b/src/sections/Projects/Nighthawk/index.js index 89e71edf13df1..59022749d6ea2 100644 --- a/src/sections/Projects/Nighthawk/index.js +++ b/src/sections/Projects/Nighthawk/index.js @@ -12,7 +12,8 @@ import cncf from "./images/cncf-white.svg"; const explain1 = "./images/Rectangle 479.webp"; const explain2 = "./images/optimizing-your-average-response-time.webp"; -const explain3 = "./images/Comparison-of-different-modes-of-delivery-of-service-mesh-network-functions.webp"; +const explain3 = + "./images/Comparison-of-different-modes-of-delivery-of-service-mesh-network-functions.webp"; import { Gnhwrapper, CardsContainer } from "./gnh.style"; @@ -25,7 +26,12 @@ const Projects = () => { useEffect(() => { fetch(URL) .then((response) => response.json()) - .then((result) => setPerformanceCount(result.total_runs)); + .then((result) => + setPerformanceCount(result.totalRuns || result.total_runs), + ) + .catch((error) => { + console.error("Failed to fetch performance count:", error.message); + }); }, []); return ( @@ -34,13 +40,18 @@ const Projects = () => {
- +
{/* */} -

Unlock distributed systems behavioral performance analysis

-

Meshery is the easiest way to get started with Nighthawk on any cloud or platform.

+

+ Unlock distributed systems behavioral performance analysis +

+

+ Meshery is the easiest way to get started with Nighthawk on + any cloud or platform. +

@@ -49,19 +60,27 @@ const Projects = () => {
-

+

+ +

Histogram Statistics

-

+

+ +

Meshery Tests

-

+

+ +

Closed and Open-loop

-

+

+ +

Percentiles calculated

@@ -69,10 +88,17 @@ const Projects = () => {

What is Nighthawk?

-

Nighthawk is a versatile HTTP load testing tool built out of a need to drill HTTP services with a constant request rate or with an adaptive request rate. Layer5 offers a custom distribution of Nighthawk with intelligent adaptive load controllers to automatically identify optimal configurations for your service mesh deployment. - As a Layer 7 performance characterization tool supporting HTTP/HTTPS/HTTP2, Nighthawk is Meshery's (and Envoy's) load generator and is written in C++. +

+ Nighthawk is a versatile HTTP load testing tool built out of a need + to drill HTTP services with a constant request rate or with an + adaptive request rate. Layer5 offers a custom distribution of + Nighthawk with intelligent adaptive load controllers to + automatically identify optimal configurations for your service mesh + deployment. As a Layer 7 performance characterization tool + supporting HTTP/HTTPS/HTTP2, Nighthawk is Meshery's (and Envoy's) + load generator and is written in C++.

- +
@@ -80,7 +106,11 @@ const Projects = () => {

Nighthawk and Meshery

-

Meshery integrates Nighthawk as one of (currently) three choices of load generator for characterizing and managing the performance of service meshes and their workloads.

+

+ Meshery integrates Nighthawk as one of (currently) three + choices of load generator for characterizing and managing the + performance of service meshes and their workloads.{" "} +

@@ -97,8 +127,22 @@ const Projects = () => {

Easing Management of the Nighthawk Lifecycle

-

As with a lot of open source projects, there is a lack of consistent tooling. This makes it difficult to have easily repeatable tests in that the building, deploying, and maintaining of Nighthawk instances (potentially a fleet of Nighthawk instances) is a burden without additional tooling.

-
@@ -106,8 +150,19 @@ const Projects = () => {

Distributed Performance Management

-

Distributed load testing offers insight into system behaviors that arguably more accurately represent real world behaviors of services under load as that load comes from any number of sources.

-

Engineers need multi-variate load generation and analysis techniques offered through distributed performance analysis. Nighthawk is being improved so that it can be horizontally scalable - such that multiple instances will be cognizant of one another and able to coordinate amongst each other. Nighthawk is growing in popularity with Layer5, Google, Red Hat, and AWS investing into it.

+

+ Distributed load testing offers insight into system behaviors that + arguably more accurately represent real world behaviors of services + under load as that load comes from any number of sources. +

+

+ Engineers need multi-variate load generation and analysis techniques + offered through distributed performance analysis. Nighthawk is being + improved so that it can be horizontally scalable - such that + multiple instances will be cognizant of one another and able to + coordinate amongst each other. Nighthawk is growing in popularity + with Layer5, Google, Red Hat, and AWS investing into it. +

@@ -116,7 +171,15 @@ const Projects = () => {

SERVICE MESH PERFORMANCE COMPATIBILITY

-

Enabling Standards-based, Distributed Performance Management - Nighthawk integrates Meshery and Nighthawk. Through this integration Meshery facilitates Service Mesh Performance (SMP) compatibility for Nighthawk.

+

+ Enabling Standards-based, Distributed Performance Management + - Nighthawk integrates Meshery and Nighthawk. Through this + integration Meshery facilitates{" "} + + Service Mesh Performance (SMP) + {" "} + compatibility for Nighthawk. +

@@ -142,8 +205,16 @@ const Projects = () => { cpu image

SCHEDULING AND ANALYSIS

-

Nighthawk integrates with Meshery and provides you with the ability to schedule performance tests or insert them into your CI pipeline.

-

Adaptive analysis in which you may run multi-stage performance tests and persist their results in a historical archive is also enabled through integration with Meshery.

+

+ Nighthawk integrates with Meshery{" "} + and provides you with the ability to schedule performance + tests or insert them into your CI pipeline. +

+

+ Adaptive analysis in which you may run multi-stage + performance tests and persist their results in a historical + archive is also enabled through integration with Meshery. +

@@ -154,53 +225,134 @@ const Projects = () => {
- Cloud Native Distributed Performance Management + Cloud Native Distributed Performance Management

Standards-based, distributed performance management

-

Nighthawk will provide generally-available distributions of Nighthawk under different architectures and platforms and easy-to-use tooling for installation and operation. This will include creating distributions of Nighthawk as well as augmenting existing tooling, Meshery, to retrieve these arch-specific packages and update their deployments.

+

+ Nighthawk will provide generally-available distributions of + Nighthawk under different architectures and platforms and + easy-to-use tooling for installation and operation. This will + include creating distributions of Nighthawk as well as + augmenting existing tooling, Meshery, to retrieve these + arch-specific packages and update their deployments. +

-
- + + + + {service.content}
- + - + - + - + @@ -212,8 +364,11 @@ const Projects = () => {
cncf logo -

Participate in the state of the art.
- Join us in the Cloud Native Computing Foundation's Service Mesh Working Group. +

+ {" "} + Participate in the state of the art.
+ Join us in the Cloud Native Computing Foundation's Service Mesh + Working Group.

diff --git a/src/templates/sistent-component.js b/src/templates/sistent-component.js index a862992a3da2b..96db535746ef1 100644 --- a/src/templates/sistent-component.js +++ b/src/templates/sistent-component.js @@ -9,24 +9,22 @@ import TabButton from "../reusecore/Button"; import { Col, Row } from "../reusecore/Layout"; import CodeBlock from "../components/CodeBlock"; import { SistentThemeProvider, Button } from "@sistent/sistent"; -import { useStyledDarkMode } from "../theme/app/useStyledDarkMode"; import ThemeWrapper from "../sections/Projects/Sistent/theme-wrapper"; -const shortcodes = { +const shortcodes = { SistentThemeProvider, ThemeWrapper, - Button, - Col, - Row, + Button, + Col, + Row, CodeBlock, - FaArrowRight + FaArrowRight, }; const SistentComponentTemplate = ({ data, children, pageContext }) => { const { frontmatter } = data.mdx; const location = useLocation(); const { componentName, availablePages } = pageContext; - const { isDark } = useStyledDarkMode(); const baseUrl = `/projects/sistent/components/${componentName}`; @@ -40,11 +38,11 @@ const SistentComponentTemplate = ({ data, children, pageContext }) => {
-

{displayName}

- {frontmatter.description &&

{frontmatter.description}

} +

{displayName}

+ {frontmatter.description &&

{frontmatter.description}

}
-
+
{availablePages.includes("overview") && ( { )} {availablePages.includes("guidance") && ( navigate(`${baseUrl}/guidance`)} title="Guidance" /> )} {availablePages.includes("code") && ( navigate(`${baseUrl}/code`)} title="Code" /> )}
- -
- {children} -
+ +
{children}
@@ -78,7 +78,7 @@ const SistentComponentTemplate = ({ data, children, pageContext }) => { }; export const query = graphql` - query($slug: String!) { + query ($slug: String!) { mdx(fields: { slug: { eq: $slug } }) { body frontmatter { diff --git a/src/theme/app/ThemeManager.js b/src/theme/app/ThemeManager.js index 819c2881855d5..934d9586ee6cd 100644 --- a/src/theme/app/ThemeManager.js +++ b/src/theme/app/ThemeManager.js @@ -26,7 +26,9 @@ export const ThemeManagerContext = createContext(defaultState); const isBrowser = typeof window !== "undefined"; const systemDarkModeSetting = () => - isBrowser && window.matchMedia ? window.matchMedia("(prefers-color-scheme: dark)") : null; + isBrowser && window.matchMedia + ? window.matchMedia("(prefers-color-scheme: dark)") + : null; const isDarkModeActive = () => { return !!systemDarkModeSetting()?.matches; @@ -43,7 +45,7 @@ const applyThemeToDOM = (theme) => { export const ThemeManagerProvider = (props) => { const [themeSetting, setThemeSetting] = useState(ThemeSetting.SYSTEM); const [didLoad, setDidLoad] = useState(false); - + const [isDark, setIsDark] = useState(() => { if (isBrowser) { if (window.__theme === ThemeSetting.DARK) return true; @@ -56,9 +58,12 @@ export const ThemeManagerProvider = (props) => { if (!isBrowser) return; const root = window.document.documentElement; - const initialColorValue = (root.style.getPropertyValue("--initial-color-mode") || "").trim(); - const actualTheme = window.__theme || initialColorValue || ThemeSetting.DARK; - + const initialColorValue = ( + root.style.getPropertyValue("--initial-color-mode") || "" + ).trim(); + const actualTheme = + window.__theme || initialColorValue || ThemeSetting.DARK; + // Get stored theme from localStorage const storedTheme = localStorage.getItem(DarkThemeKey); @@ -81,7 +86,7 @@ export const ThemeManagerProvider = (props) => { setDidLoad(true); }, []); - // Listen to system color scheme changes only when on SYSTEM mode + // Listen to system color scheme changes only when on SYSTEM mode useEffect(() => { if (!isBrowser || themeSetting !== ThemeSetting.SYSTEM) return; @@ -103,11 +108,11 @@ export const ThemeManagerProvider = (props) => { const newIsDark = !isDark; const newTheme = newIsDark ? ThemeSetting.DARK : ThemeSetting.LIGHT; - // Update state + // Update state setIsDark(newIsDark); setThemeSetting(newTheme); - // Apply to DOM immediately + // Apply to DOM immediately applyThemeToDOM(newTheme); // Persist to localStorage @@ -139,17 +144,17 @@ export const ThemeManagerProvider = (props) => { return; } - // Update state + // Update state setIsDark(newIsDark); setThemeSetting(setting); // Apply to DOM immediately applyThemeToDOM(themeToApply); - // Persist to localStorage + // Persist to localStorage localStorage.setItem(DarkThemeKey, setting); }, - [isDark] + [isDark], ); return (
+ + + + +

- Further the state of distributed
- performance management. + Further the state of distributed
+ performance management.

- Enable standards-based, distributed performance management through compatibility with the Service Mesh Performance (SMP) specification. + Enable standards-based, distributed performance + management through compatibility with the Service Mesh + Performance (SMP) specification.
+ + + + + -

- Facilitate Nighthawk adoption. -

- Deliver trusted, certified builds, distributed via the most popular package managers: apt, yum, Homebrew, and platforms: Docker and Meshery. - Bridge Nighthawk’s C++ with the lingua franca of Cloud Native: Golang. +

Facilitate Nighthawk adoption.

+ Deliver trusted, certified builds, distributed via the + most popular package managers: apt, yum, Homebrew, and + platforms: Docker and Meshery. Bridge Nighthawk’s C++ + with the lingua franca of Cloud Native: Golang.
+ + + + +

- Deliver easy-to-use, repeatable
- tooling. + Deliver easy-to-use, repeatable
+ tooling.

- To leverage Nighthawk as the performance characterization tool as used in the 30 patterns in the Service Mesh Patterns book. + To leverage Nighthawk as the performance + characterization tool as used in the 30 patterns in the + Service Mesh Patterns book.
+ + + + + -

- Educate the ecosystem -

- Educate the ecosystem through the CNCF Service Mesh Working Group. +

Educate the ecosystem

+ Educate the ecosystem through the CNCF Service Mesh + Working Group.