chore: import upstream snapshot with attribution
MCP Bash Server CI / Test MCP Bash Server (dev) (push) Has been cancelled
MCP Bash Server CI / Test MCP Bash Server (release) (push) Has been cancelled

This commit is contained in:
wehub-resource-sync
2026-07-13 13:11:39 +08:00
commit c8cebdfeee
4654 changed files with 626756 additions and 0 deletions
+504
View File
@@ -0,0 +1,504 @@
{
"theme.NotFound.title": {
"message": "Page Not Found",
"description": "The title of the 404 page"
},
"theme.NotFound.p1": {
"message": "We could not find what you were looking for.",
"description": "The first paragraph of the 404 page"
},
"theme.NotFound.p2": {
"message": "Please contact the owner of the site that linked you to the original URL and let them know their link is broken.",
"description": "The 2nd paragraph of the 404 page"
},
"theme.AnnouncementBar.closeButtonAriaLabel": {
"message": "Close",
"description": "The ARIA label for close button of announcement bar"
},
"theme.blog.paginator.navAriaLabel": {
"message": "Blog list page navigation",
"description": "The ARIA label for the blog pagination"
},
"theme.blog.paginator.newerEntries": {
"message": "Newer Entries",
"description": "The label used to navigate to the newer blog posts page (previous page)"
},
"theme.blog.paginator.olderEntries": {
"message": "Older Entries",
"description": "The label used to navigate to the older blog posts page (next page)"
},
"theme.blog.post.readingTime.plurals": {
"message": "One min read|{readingTime} min read",
"description": "Pluralized label for \"{readingTime} min read\". Use as much plural forms (separated by \"|\") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)"
},
"theme.tags.tagsListLabel": {
"message": "Tags:",
"description": "The label alongside a tag list"
},
"theme.blog.post.readMore": {
"message": "Read More",
"description": "The label used in blog post item excerpts to link to full blog posts"
},
"theme.blog.post.paginator.navAriaLabel": {
"message": "Blog post page navigation",
"description": "The ARIA label for the blog posts pagination"
},
"theme.blog.post.paginator.newerPost": {
"message": "Newer Post",
"description": "The blog post button label to navigate to the newer/previous post"
},
"theme.blog.post.paginator.olderPost": {
"message": "Older Post",
"description": "The blog post button label to navigate to the older/next post"
},
"theme.blog.post.plurals": {
"message": "One post|{count} posts",
"description": "Pluralized label for \"{count} posts\". Use as much plural forms (separated by \"|\") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)"
},
"theme.blog.tagTitle": {
"message": "{nPosts} tagged with \"{tagName}\"",
"description": "The title of the page for a blog tag"
},
"theme.tags.tagsPageLink": {
"message": "View All Tags",
"description": "The label of the link targeting the tag list page"
},
"theme.CodeBlock.copyButtonAriaLabel": {
"message": "Copy code to clipboard",
"description": "The ARIA label for copy code blocks button"
},
"theme.CodeBlock.copied": {
"message": "Copied",
"description": "The copied button label on code blocks"
},
"theme.CodeBlock.copy": {
"message": "Copy",
"description": "The copy button label on code blocks"
},
"theme.docs.sidebar.expandButtonTitle": {
"message": "Expand sidebar",
"description": "The ARIA label and title attribute for expand button of doc sidebar"
},
"theme.docs.sidebar.expandButtonAriaLabel": {
"message": "Expand sidebar",
"description": "The ARIA label and title attribute for expand button of doc sidebar"
},
"theme.docs.paginator.navAriaLabel": {
"message": "Docs pages navigation",
"description": "The ARIA label for the docs pagination"
},
"theme.docs.paginator.previous": {
"message": "Previous",
"description": "The label used to navigate to the previous doc"
},
"theme.docs.paginator.next": {
"message": "Next",
"description": "The label used to navigate to the next doc"
},
"theme.docs.sidebar.collapseButtonTitle": {
"message": "Collapse sidebar",
"description": "The title attribute for collapse button of doc sidebar"
},
"theme.docs.sidebar.collapseButtonAriaLabel": {
"message": "Collapse sidebar",
"description": "The title attribute for collapse button of doc sidebar"
},
"theme.docs.versions.unreleasedVersionLabel": {
"message": "This is unreleased documentation for {siteTitle} {versionLabel} version.",
"description": "The label used to tell the user that he's browsing an unreleased doc version"
},
"theme.docs.versions.unmaintainedVersionLabel": {
"message": "This is documentation for {siteTitle} {versionLabel}, which is no longer actively maintained.",
"description": "The label used to tell the user that he's browsing an unmaintained doc version"
},
"theme.docs.versions.latestVersionSuggestionLabel": {
"message": "For up-to-date documentation, see the {latestVersionLink} ({versionLabel}).",
"description": "The label used to tell the user to check the latest version"
},
"theme.docs.versions.latestVersionLinkLabel": {
"message": "latest version",
"description": "The label used for the latest version suggestion link label"
},
"theme.common.editThisPage": {
"message": "Edit this page",
"description": "The link label to edit the current page"
},
"theme.common.headingLinkTitle": {
"message": "Direct link to heading",
"description": "Title for link to heading"
},
"theme.lastUpdated.atDate": {
"message": " on {date}",
"description": "The words used to describe on which date a page has been last updated"
},
"theme.lastUpdated.byUser": {
"message": " by {user}",
"description": "The words used to describe by who the page has been last updated"
},
"theme.lastUpdated.lastUpdatedAtBy": {
"message": "Last updated{atDate}{byUser}",
"description": "The sentence used to display when a page has been last updated, and by who"
},
"theme.common.skipToMainContent": {
"message": "Skip to main content",
"description": "The skip to content label used for accessibility, allowing to rapidly navigate to main content with keyboard tab/enter navigation"
},
"theme.SearchPage.documentsFound.plurals": {
"message": "One document found|{count} documents found",
"description": "Pluralized label for \"{count} documents found\". Use as much plural forms (separated by \"|\") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)"
},
"theme.SearchPage.existingResultsTitle": {
"message": "Search results for \"{query}\"",
"description": "The search page title for non-empty query"
},
"theme.SearchPage.emptyResultsTitle": {
"message": "Search the documentation",
"description": "The search page title for empty query"
},
"theme.SearchPage.inputPlaceholder": {
"message": "Type your search here",
"description": "The placeholder for search page input"
},
"theme.SearchPage.inputLabel": {
"message": "Search",
"description": "The ARIA label for search page input"
},
"theme.SearchPage.algoliaLabel": {
"message": "Search by Algolia",
"description": "The ARIA label for Algolia mention"
},
"theme.SearchPage.noResultsText": {
"message": "No results were found",
"description": "The paragraph for empty search result"
},
"theme.SearchPage.fetchingNewResults": {
"message": "Fetching new results...",
"description": "The paragraph for fetching new search results"
},
"theme.SearchBar.label": {
"message": "Search",
"description": "The ARIA label and placeholder for search button"
},
"theme.PwaReloadPopup.info": {
"message": "New version available",
"description": "The text for PWA reload popup"
},
"theme.PwaReloadPopup.refreshButtonText": {
"message": "Refresh",
"description": "The text for PWA reload button"
},
"theme.PwaReloadPopup.closeButtonAriaLabel": {
"message": "Close",
"description": "The ARIA label for close button of PWA reload popup"
},
"theme.Playground.result": {
"message": "Result",
"description": "The result label of the live codeblocks"
},
"theme.Playground.liveEditor": {
"message": "Live Editor",
"description": "The live editor label of the live codeblocks"
},
"convenient": {
"message": "Easy to Use"
},
"custom-multi-support": {
"message": "High Performance & Extensible"
},
"opensource": {
"message": "Open Source & Community Driven"
},
"theme.ErrorPageContent.title": {
"message": "This page crashed.",
"description": "The title of the fallback page when the page crashed"
},
"theme.ErrorPageContent.tryAgain": {
"message": "Try again",
"description": "The label of the button to try again when the page crashed"
},
"theme.BackToTopButton.buttonAriaLabel": {
"message": "Scroll back to top",
"description": "The ARIA label for the back to top button"
},
"theme.blog.archive.title": {
"message": "Archive",
"description": "The page & hero title of the blog archive page"
},
"theme.blog.archive.description": {
"message": "Archive",
"description": "The page & hero description of the blog archive page"
},
"theme.blog.sidebar.navAriaLabel": {
"message": "Blog recent posts navigation",
"description": "The ARIA label for recent posts in the blog sidebar"
},
"theme.DocSidebarItem.toggleCollapsedCategoryAriaLabel": {
"message": "Toggle the collapsible sidebar category '{label}'",
"description": "The ARIA label to toggle the collapsible sidebar category"
},
"theme.docs.tagDocListPageTitle.nDocsTagged": {
"message": "One doc tagged|{count} docs tagged",
"description": "Pluralized label for \"{count} docs tagged\". Use as much plural forms (separated by \"|\") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)"
},
"theme.docs.tagDocListPageTitle": {
"message": "{nDocsTagged} with \"{tagName}\"",
"description": "The title of the page for a docs tag"
},
"theme.navbar.mobileSidebarSecondaryMenu.backButtonLabel": {
"message": "← Back to main menu",
"description": "The label of the back button to return to main menu, inside the mobile navbar sidebar secondary menu (notably used to display the docs sidebar)"
},
"theme.navbar.mobileVersionsDropdown.label": {
"message": "Versions",
"description": "The label for the navbar versions dropdown on mobile view"
},
"theme.TOCCollapsible.toggleButtonLabel": {
"message": "On this page",
"description": "The label used by the button on the collapsible TOC component"
},
"convenient-content": {
"message": "{docker} {br} All-in-one monitoring, alerting, and notification system. Supports web services, databases, caching, OS, middleware, big data, cloud-native, and network monitoring. {br} Agentless with full web-based operations, simply point-and-click to get started. {br} Enterprise-grade security with end-to-end encryption for all sensitive data."
},
"custom-multi-support-content": {
"message": "Configurable protocols including HTTP, JMX, SSH, SNMP, and JDBC. Define custom metrics with simple online YAML configuration. {br} High-performance architecture with horizontal scaling for collector clusters, multi-network isolation, and cloud-edge collaboration. {br} Flexible alerting rules with timely notifications via Discord, Slack, email, Webhook, and more."
},
"opensource-content": {
"message": "Apache HertzBeat™ is open source with an inclusive community. We welcome contributions of all sizes—code, documentation, or bug reports. {br} Respect every contributor and grow together. {br} Deployed on thousands of servers worldwide."
},
"slogan": {
"message": "AI-powered Open Source Observability System"
},
"Who uses HertzBeat?": {
"message": "Who uses Apache HertzBeat?"
},
"theme.admonition.note": {
"message": "note",
"description": "The default label used for the Note admonition (:::note)"
},
"theme.admonition.tip": {
"message": "tip",
"description": "The default label used for the Tip admonition (:::tip)"
},
"theme.admonition.danger": {
"message": "danger",
"description": "The default label used for the Danger admonition (:::danger)"
},
"theme.admonition.info": {
"message": "info",
"description": "The default label used for the Info admonition (:::info)"
},
"theme.admonition.caution": {
"message": "caution",
"description": "The default label used for the Caution admonition (:::caution)"
},
"theme.colorToggle.ariaLabel": {
"message": "Switch between dark and light mode (currently {mode})",
"description": "The ARIA label for the navbar color mode toggle"
},
"theme.colorToggle.ariaLabel.mode.dark": {
"message": "dark mode",
"description": "The name for the dark color mode"
},
"theme.colorToggle.ariaLabel.mode.light": {
"message": "light mode",
"description": "The name for the light color mode"
},
"theme.docs.breadcrumbs.home": {
"message": "Home page",
"description": "The ARIA label for the home page in the breadcrumbs"
},
"theme.docs.breadcrumbs.navAriaLabel": {
"message": "Breadcrumbs",
"description": "The ARIA label for the breadcrumbs"
},
"theme.docs.DocCard.categoryDescription": {
"message": "{count} items",
"description": "The default description for a category card in the generated index about how many items this category includes"
},
"theme.docs.versionBadge.label": {
"message": "Version: {versionLabel}"
},
"theme.CodeBlock.wordWrapToggle": {
"message": "Toggle word wrap",
"description": "The title attribute for toggle word wrapping button of code block lines"
},
"theme.navbar.mobileLanguageDropdown.label": {
"message": "Languages",
"description": "The label for the mobile language switcher dropdown"
},
"theme.blog.post.readMoreLabel": {
"message": "Read more about {title}",
"description": "The ARIA label for the link to full blog posts from excerpts"
},
"theme.SearchBar.seeAll": {
"message": "See all {count} results"
},
"theme.SearchModal.searchBox.resetButtonTitle": {
"message": "Clear the query",
"description": "The label and ARIA label for search box reset button"
},
"theme.SearchModal.searchBox.cancelButtonText": {
"message": "Cancel",
"description": "The label and ARIA label for search box cancel button"
},
"theme.SearchModal.startScreen.recentSearchesTitle": {
"message": "Recent",
"description": "The title for recent searches"
},
"theme.SearchModal.startScreen.noRecentSearchesText": {
"message": "No recent searches",
"description": "The text when no recent searches"
},
"theme.SearchModal.startScreen.saveRecentSearchButtonTitle": {
"message": "Save this search",
"description": "The label for save recent search button"
},
"theme.SearchModal.startScreen.removeRecentSearchButtonTitle": {
"message": "Remove this search from history",
"description": "The label for remove recent search button"
},
"theme.SearchModal.startScreen.favoriteSearchesTitle": {
"message": "Favorite",
"description": "The title for favorite searches"
},
"theme.SearchModal.startScreen.removeFavoriteSearchButtonTitle": {
"message": "Remove this search from favorites",
"description": "The label for remove favorite search button"
},
"theme.SearchModal.errorScreen.titleText": {
"message": "Unable to fetch results",
"description": "The title for error screen of search modal"
},
"theme.SearchModal.errorScreen.helpText": {
"message": "You might want to check your network connection.",
"description": "The help text for error screen of search modal"
},
"theme.SearchModal.footer.selectText": {
"message": "to select",
"description": "The explanatory text of the action for the enter key"
},
"theme.SearchModal.footer.selectKeyAriaLabel": {
"message": "Enter key",
"description": "The ARIA label for the Enter key button that makes the selection"
},
"theme.SearchModal.footer.navigateText": {
"message": "to navigate",
"description": "The explanatory text of the action for the Arrow up and Arrow down key"
},
"theme.SearchModal.footer.navigateUpKeyAriaLabel": {
"message": "Arrow up",
"description": "The ARIA label for the Arrow up key button that makes the navigation"
},
"theme.SearchModal.footer.navigateDownKeyAriaLabel": {
"message": "Arrow down",
"description": "The ARIA label for the Arrow down key button that makes the navigation"
},
"theme.SearchModal.footer.closeText": {
"message": "to close",
"description": "The explanatory text of the action for Escape key"
},
"theme.SearchModal.footer.closeKeyAriaLabel": {
"message": "Escape key",
"description": "The ARIA label for the Escape key button that close the modal"
},
"theme.SearchModal.footer.searchByText": {
"message": "Search by",
"description": "The text explain that the search is making by Algolia"
},
"theme.SearchModal.noResultsScreen.noResultsText": {
"message": "No results for",
"description": "The text explains that there are no results for the following search"
},
"theme.SearchModal.noResultsScreen.suggestedQueryText": {
"message": "Try searching for",
"description": "The text for the suggested query when no results are found for the following search"
},
"theme.SearchModal.noResultsScreen.reportMissingResultsText": {
"message": "Believe this query should return results?",
"description": "The text for the question where the user thinks there are missing results"
},
"theme.SearchModal.noResultsScreen.reportMissingResultsLinkText": {
"message": "Let us know.",
"description": "The text for the link to report missing results"
},
"theme.SearchModal.placeholder": {
"message": "Search docs",
"description": "The placeholder of the input of the DocSearch pop-up modal"
},
"theme.IdealImageMessage.loading": {
"message": "Loading...",
"description": "When the full-scale image is loading"
},
"theme.IdealImageMessage.load": {
"message": "Click to load{sizeMessage}",
"description": "To prompt users to load the full image. sizeMessage is a parenthesized size figure."
},
"theme.IdealImageMessage.offline": {
"message": "Your browser is offline. Image not loaded",
"description": "When the user is viewing an offline document"
},
"theme.IdealImageMessage.404error": {
"message": "404. Image not found",
"description": "When the image is not found"
},
"theme.IdealImageMessage.error": {
"message": "Error. Click to reload",
"description": "When the image fails to load for unknown error"
},
"support hertzbeat": {
"message": "Support HertzBeat"
},
"click": {
"message": "Click"
},
"go github": {
"message": "Go To Github"
},
"If you like HertzBeat, star us on GitHub": {
"message": "If you like HertzBeat, star us on GitHub."
},
"We will grow better with your support.": {
"message": "We will grow better with your support and is our greatest motivation."
},
"quickstart": {
"message": "Quickstart"
},
"Support HertzBeat": {
"message": "Support HertzBeat"
},
"Go to Github": {
"message": "Go to Github"
},
"theme.NavBar.navAriaLabel": {
"message": "Main",
"description": "The ARIA label for the main navigation"
},
"theme.docs.sidebar.navAriaLabel": {
"message": "Docs sidebar",
"description": "The ARIA label for the sidebar navigation"
},
"theme.docs.sidebar.closeSidebarButtonAriaLabel": {
"message": "Close navigation bar",
"description": "The ARIA label for close button of mobile sidebar"
},
"theme.docs.sidebar.toggleSidebarButtonAriaLabel": {
"message": "Toggle navigation bar",
"description": "The ARIA label for hamburger menu button of mobile navigation"
},
"theme.tags.tagsPageTitle": {
"message": "Tags",
"description": "The title of the tag list page"
},
"team.name": {
"message": "Apache HertzBeat™ Team"
},
"team.desc": {
"message": "The HertzBeat team is composed of contributors from various fields around the world. We embrace the community philosophy of openness and collaboration, welcoming👏 more people to join us and grow together with the community."
},
"team.tip": {
"message": "(In no particular order)"
},
"team.thanks": {
"message": "Thanks to these wonderful people, who already contributed to HertzBeat!"
}
}
@@ -0,0 +1,14 @@
{
"title": {
"message": "Blog",
"description": "The title for the blog used in SEO"
},
"description": {
"message": "Blog",
"description": "The description for the blog used in SEO"
},
"sidebar.title": {
"message": "Recent posts",
"description": "The label for the left sidebar"
}
}
@@ -0,0 +1,166 @@
{
"version.label": {
"message": "dev",
"description": "The label for version current"
},
"sidebar.docs.category.quickstart": {
"message": "QuickStart",
"description": "The label for category quickstart in sidebar docs"
},
"sidebar.docs.category.custom": {
"message": "Custom Monitoring",
"description": "The label for category custom in sidebar docs"
},
"sidebar.docs.category.http": {
"message": "HTTP Protocol",
"description": "The label for category http in sidebar docs"
},
"sidebar.docs.category.jdbc": {
"message": "JDBC Protocol",
"description": "The label for category jdbc in sidebar docs"
},
"sidebar.docs.category.ssh": {
"message": "SSH Protocol",
"description": "The label for category ssh in sidebar docs"
},
"sidebar.docs.category.telnet": {
"message": "TELNET Protocol",
"description": "The label for category telnet in sidebar docs"
},
"sidebar.docs.category.guides": {
"message": "Use Guides",
"description": "The label for category guides in sidebar docs"
},
"sidebar.docs.category.service": {
"message": "Service Monitor",
"description": "The label for category service in sidebar docs"
},
"sidebar.docs.category.database": {
"message": "Database Monitor",
"description": "The label for category database in sidebar docs"
},
"sidebar.docs.category.os": {
"message": "OS Monitor",
"description": "The label for category os in sidebar docs"
},
"sidebar.docs.category.server": {
"message": "Server Monitor",
"description": "The label for category server in sidebar docs"
},
"sidebar.docs.category.alert": {
"message": "Alerting",
"description": "The label for category alert in sidebar docs"
},
"sidebar.docs.category.notice": {
"message": "Notification",
"description": "The label for category notice in sidebar docs"
},
"sidebar.docs.category.service-discovery": {
"message": "Service Discovery",
"description": "The label for category service-discovery in sidebar docs"
},
"sidebar.docs.category.mid": {
"message": "Middleware Monitor",
"description": "The label for category mid in sidebar docs"
},
"sidebar.docs.category.Others": {
"message": "Others",
"description": "The label for category Others in sidebar docs"
},
"sidebar.docs.category.cloud-native": {
"message": "CloudNative Monitor",
"description": "The label for category cloud-native in sidebar docs"
},
"sidebar.docs.category.jmx": {
"message": "JMX Protocol",
"description": "The label for category jmx in sidebar docs"
},
"sidebar.docs.category.snmp": {
"message": "SNMP Protocol",
"description": "The label for category snmp in sidebar docs"
},
"sidebar.docs.link.Install via Helm": {
"message": "Install via Helm",
"description": "The label for link Install via Helm in sidebar docs, linking to https://artifacthub.io/packages/helm/hertzbeat/hertzbeat"
},
"sidebar.docs.category.push": {
"message": "Push",
"description": "The label for category push in sidebar docs"
},
"sidebar.docs.category.program": {
"message": "Program Monitor",
"description": "The label for category program in sidebar docs"
},
"sidebar.docs.category.cache": {
"message": "Cache Monitor",
"description": "The label for category cache in sidebar docs"
},
"sidebar.docs.category.bigdata": {
"message": "Bigdata Monitor",
"description": "The label for category bigdata in sidebar docs"
},
"sidebar.docs.category.webserver": {
"message": "WebServer Monitor",
"description": "The label for category webserver in sidebar docs"
},
"sidebar.docs.category.contribution": {
"message": "Contribution Guide",
"description": "The label for category contribution in sidebar docs"
},
"sidebar.docs.category.submit": {
"message": "Submit Guide",
"description": "The label for category submit in sidebar docs"
},
"sidebar.docs.category.release": {
"message": "Release Guide",
"description": "The label for category release in sidebar docs"
},
"sidebar.docs.category.Community": {
"message": "Community",
"description": "The label for category Community in sidebar docs"
},
"sidebar.docs.category.network": {
"message": "Network Monitor",
"description": "The label for category network in sidebar docs"
},
"sidebar.docs.category.NGQL": {
"message": "NGQL",
"description": "The label for category NGQL in sidebar docs"
},
"sidebar.docs.category.llm": {
"message": "AI LLM Monitor",
"description": "The label for category llm in sidebar docs"
},
"sidebar.docs.category.aiConfig": {
"message": "AI LLM Config",
"description": "The label for category aiConfig in sidebar docs"
},
"sidebar.docs.category.install": {
"message": "Install",
"description": "The label for category install in sidebar docs"
},
"sidebar.docs.category.upgrade": {
"message": "Upgrade",
"description": "The label for category upgrade in sidebar docs"
},
"sidebar.docs.category.setting": {
"message": "Setting",
"description": "The label for category setting in sidebar docs"
},
"sidebar.docs.category.change-db": {
"message": "Change DB",
"description": "The label for category change-db in sidebar docs"
},
"sidebar.docs.category.use-case": {
"message": "Use Case",
"description": "The label for category use-case in sidebar docs"
},
"sidebar.docs.category.extern-deploy": {
"message": "Extern Install",
"description": "The label for category extern-deploy in sidebar docs"
},
"sidebar.docs.category.log": {
"message": "Log",
"description": "The label for category log in sidebar docs"
}
}
@@ -0,0 +1,166 @@
{
"version.label": {
"message": "1.8.0",
"description": "The label for version current"
},
"sidebar.docs.category.quickstart": {
"message": "QuickStart",
"description": "The label for category quickstart in sidebar docs"
},
"sidebar.docs.category.custom": {
"message": "Custom Monitoring",
"description": "The label for category custom in sidebar docs"
},
"sidebar.docs.category.http": {
"message": "HTTP Protocol",
"description": "The label for category http in sidebar docs"
},
"sidebar.docs.category.jdbc": {
"message": "JDBC Protocol",
"description": "The label for category jdbc in sidebar docs"
},
"sidebar.docs.category.ssh": {
"message": "SSH Protocol",
"description": "The label for category ssh in sidebar docs"
},
"sidebar.docs.category.telnet": {
"message": "TELNET Protocol",
"description": "The label for category telnet in sidebar docs"
},
"sidebar.docs.category.guides": {
"message": "Use Guides",
"description": "The label for category guides in sidebar docs"
},
"sidebar.docs.category.service": {
"message": "Service Monitor",
"description": "The label for category service in sidebar docs"
},
"sidebar.docs.category.database": {
"message": "Database Monitor",
"description": "The label for category database in sidebar docs"
},
"sidebar.docs.category.os": {
"message": "OS Monitor",
"description": "The label for category os in sidebar docs"
},
"sidebar.docs.category.server": {
"message": "Server Monitor",
"description": "The label for category server in sidebar docs"
},
"sidebar.docs.category.alert": {
"message": "Alerting",
"description": "The label for category alert in sidebar docs"
},
"sidebar.docs.category.notice": {
"message": "Notification",
"description": "The label for category notice in sidebar docs"
},
"sidebar.docs.category.service-discovery": {
"message": "Service Discovery",
"description": "The label for category service-discovery in sidebar docs"
},
"sidebar.docs.category.mid": {
"message": "Middleware Monitor",
"description": "The label for category mid in sidebar docs"
},
"sidebar.docs.category.Others": {
"message": "Others",
"description": "The label for category Others in sidebar docs"
},
"sidebar.docs.category.cloud-native": {
"message": "CloudNative Monitor",
"description": "The label for category cloud-native in sidebar docs"
},
"sidebar.docs.category.jmx": {
"message": "JMX Protocol",
"description": "The label for category jmx in sidebar docs"
},
"sidebar.docs.category.snmp": {
"message": "SNMP Protocol",
"description": "The label for category snmp in sidebar docs"
},
"sidebar.docs.link.Install via Helm": {
"message": "Install via Helm",
"description": "The label for link Install via Helm in sidebar docs, linking to https://artifacthub.io/packages/helm/hertzbeat/hertzbeat"
},
"sidebar.docs.category.push": {
"message": "Push",
"description": "The label for category push in sidebar docs"
},
"sidebar.docs.category.program": {
"message": "Program Monitor",
"description": "The label for category program in sidebar docs"
},
"sidebar.docs.category.cache": {
"message": "Cache Monitor",
"description": "The label for category cache in sidebar docs"
},
"sidebar.docs.category.bigdata": {
"message": "Bigdata Monitor",
"description": "The label for category bigdata in sidebar docs"
},
"sidebar.docs.category.webserver": {
"message": "WebServer Monitor",
"description": "The label for category webserver in sidebar docs"
},
"sidebar.docs.category.contribution": {
"message": "Contribution Guide",
"description": "The label for category contribution in sidebar docs"
},
"sidebar.docs.category.submit": {
"message": "Submit Guide",
"description": "The label for category submit in sidebar docs"
},
"sidebar.docs.category.release": {
"message": "Release Guide",
"description": "The label for category release in sidebar docs"
},
"sidebar.docs.category.Community": {
"message": "Community",
"description": "The label for category Community in sidebar docs"
},
"sidebar.docs.category.network": {
"message": "Network Monitor",
"description": "The label for category network in sidebar docs"
},
"sidebar.docs.category.NGQL": {
"message": "NGQL",
"description": "The label for category NGQL in sidebar docs"
},
"sidebar.docs.category.llm": {
"message": "AI LLM Monitor",
"description": "The label for category llm in sidebar docs"
},
"sidebar.docs.category.aiConfig": {
"message": "AI LLM Config",
"description": "The label for category aiConfig in sidebar docs"
},
"sidebar.docs.category.install": {
"message": "Install",
"description": "The label for category install in sidebar docs"
},
"sidebar.docs.category.upgrade": {
"message": "Upgrade",
"description": "The label for category upgrade in sidebar docs"
},
"sidebar.docs.category.setting": {
"message": "Setting",
"description": "The label for category setting in sidebar docs"
},
"sidebar.docs.category.change-db": {
"message": "Change DB",
"description": "The label for category change-db in sidebar docs"
},
"sidebar.docs.category.use-case": {
"message": "Use Case",
"description": "The label for category use-case in sidebar docs"
},
"sidebar.docs.category.extern-deploy": {
"message": "Extern Install",
"description": "The label for category extern-deploy in sidebar docs"
},
"sidebar.docs.category.log": {
"message": "Log",
"description": "The label for category log in sidebar docs"
}
}
@@ -0,0 +1,50 @@
{
"link.title.intro": {
"message": "Introduction",
"description": "The title of the footer links column with title=intro in the footer"
},
"link.title.contact": {
"message": "Community",
"description": "The title of the footer links column with title=contact in the footer"
},
"link.item.label.use": {
"message": "Introduction",
"description": "The label of footer link with label=use linking to /docs/"
},
"link.item.label.quickstart": {
"message": "Quickstart",
"description": "The label of footer link with label=quickstart linking to /docs/start/quickstart"
},
"link.item.label.custom": {
"message": "Custom Monitor",
"description": "The label of footer link with label=custom linking to /docs/advanced/extend-point"
},
"link.item.label.help": {
"message": "Help Doc",
"description": "The label of footer link with label=help linking to /docs/help/guide"
},
"link.item.label.discuss": {
"message": "Contact",
"description": "The label of footer link with label=discuss linking to /docs/others/contact"
},
"link.item.label.github": {
"message": "Github",
"description": "The label of footer link with label=github linking to https://github.com/apache/hertzbeat"
},
"link.title.resource": {
"message": "Resource",
"description": "The title of the footer links column with title=resource in the footer"
},
"link.item.label.relate": {
"message": "Others",
"description": "The label of footer link with label=relate linking to /docs/others/resource"
},
"link.item.label.discussion": {
"message": "Discussion",
"description": "The label of footer link with label=discussion linking to https://github.com/apache/hertzbeat/discussions/"
},
"link.item.label.contact": {
"message": "Contact",
"description": "The label of footer link with label=contact linking to /docs/community/contact"
}
}
@@ -0,0 +1,162 @@
{
"title": {
"message": "HertzBeat",
"description": "The title in the navbar"
},
"item.label.main": {
"message": "Home",
"description": "Navbar item with label main"
},
"item.label.document": {
"message": "Document",
"description": "Navbar item with label document"
},
"item.label.blog": {
"message": "Blog",
"description": "Navbar item with label blog"
},
"item.label.discuss": {
"message": "Contact Discuss",
"description": "Navbar item with label discuss"
},
"item.label.kanban": {
"message": "Kanban",
"description": "Navbar item with label kanban"
},
"item.label.about": {
"message": "About",
"description": "Navbar item with label about"
},
"item.label.login": {
"message": "Login Now",
"description": "Navbar item with label login"
},
"item.label.design": {
"message": "Design",
"description": "Navbar item with label design"
},
"item.label.resource": {
"message": "Resource",
"description": "Navbar item with label resource"
},
"item.label.contributing": {
"message": "Contributor Guide",
"description": "Navbar item with label contributing"
},
"item.label.developer": {
"message": "Contributors",
"description": "Navbar item with label developer"
},
"item.label.enterprise": {
"message": "Enterprise",
"description": "Navbar item with label enterprise"
},
"item.label.Docs": {
"message": "Docs",
"description": "Navbar item with label Docs"
},
"item.label.Others": {
"message": "Others",
"description": "Navbar item with label Others"
},
"item.label.contributors": {
"message": "Contributors",
"description": "Navbar item with label contributors"
},
"item.label.ASF": {
"message": "ASF",
"description": "Navbar item with label ASF"
},
"item.label.Community": {
"message": "Community",
"description": "Navbar item with label Community"
},
"item.label.code_of_conduct": {
"message": "Code Of Conduct",
"description": "Navbar item with label code_of_conduct"
},
"item.label.join_the_mailing_lists": {
"message": "Join Mailing Lists",
"description": "Navbar item with label join_the_mailing_lists"
},
"item.label.become_committer": {
"message": "Become Committer",
"description": "Navbar item with label become_committer"
},
"item.label.become_pmc_member": {
"message": "Become Pmc Member",
"description": "Navbar item with label become_pmc_member"
},
"item.label.new_committer_process": {
"message": "New Committer Process",
"description": "Navbar item with label new_committer_process"
},
"item.label.new_pmc_member_process": {
"message": "New Pmc Member Process",
"description": "Navbar item with label new_pmc_member_process"
},
"item.label.documentation_notice": {
"message": "Documentation Notice",
"description": "Navbar item with label documentation_notice"
},
"item.label.submit_code": {
"message": "Submit Code",
"description": "Navbar item with label submit_code"
},
"item.label.code_style_and_quality_guide": {
"message": "Code Style And Quality Guide",
"description": "Navbar item with label code_style_and_quality_guide"
},
"item.label.how_to_release": {
"message": "How To Release",
"description": "Navbar item with label how_to_release"
},
"item.label.how_to_verify_release": {
"message": "How To Verify Release",
"description": "Navbar item with label how_to_verify_release"
},
"item.label.Foundation": {
"message": "Foundation",
"description": "Navbar item with label Foundation"
},
"item.label.License": {
"message": "License",
"description": "Navbar item with label License"
},
"item.label.Events": {
"message": "Events",
"description": "Navbar item with label Events"
},
"item.label.Security": {
"message": "Security",
"description": "Navbar item with label Security"
},
"item.label.Sponsorship": {
"message": "Sponsorship",
"description": "Navbar item with label Sponsorship"
},
"item.label.Privacy": {
"message": "Privacy",
"description": "Navbar item with label Privacy"
},
"item.label.team": {
"message": "Team",
"description": "Navbar item with label team"
},
"item.label.Thanks": {
"message": "Thanks",
"description": "Navbar item with label Thanks"
},
"item.label.download": {
"message": "Download",
"description": "Navbar item with label download"
},
"item.label.contribution": {
"message": "Contribution Guide",
"description": "Navbar item with label contribution"
},
"item.label.development": {
"message": "Development",
"description": "Navbar item with label development"
}
}
+507
View File
@@ -0,0 +1,507 @@
{
"convenient": {
"message": "简单易用"
},
"custom-multi-support": {
"message": "高性能可扩展"
},
"opensource": {
"message": "开源社区"
},
"theme.ErrorPageContent.title": {
"message": "页面已崩溃。",
"description": "The title of the fallback page when the page crashed"
},
"theme.ErrorPageContent.tryAgain": {
"message": "重试",
"description": "The label of the button to try again when the page crashed"
},
"theme.NotFound.title": {
"message": "找不到页面",
"description": "The title of the 404 page"
},
"theme.NotFound.p1": {
"message": "我们找不到您要找的页面。",
"description": "The first paragraph of the 404 page"
},
"theme.NotFound.p2": {
"message": "请联系原始链接来源网站的所有者,并告知他们链接已损坏。",
"description": "The 2nd paragraph of the 404 page"
},
"theme.admonition.note": {
"message": "备注",
"description": "The default label used for the Note admonition (:::note)"
},
"theme.admonition.tip": {
"message": "提示",
"description": "The default label used for the Tip admonition (:::tip)"
},
"theme.admonition.danger": {
"message": "危险",
"description": "The default label used for the Danger admonition (:::danger)"
},
"theme.admonition.info": {
"message": "信息",
"description": "The default label used for the Info admonition (:::info)"
},
"theme.admonition.caution": {
"message": "警告",
"description": "The default label used for the Caution admonition (:::caution)"
},
"theme.AnnouncementBar.closeButtonAriaLabel": {
"message": "关闭",
"description": "The ARIA label for close button of announcement bar"
},
"theme.BackToTopButton.buttonAriaLabel": {
"message": "回到顶部",
"description": "The ARIA label for the back to top button"
},
"theme.blog.archive.title": {
"message": "历史博文",
"description": "The page & hero title of the blog archive page"
},
"theme.blog.archive.description": {
"message": "历史博文",
"description": "The page & hero description of the blog archive page"
},
"theme.blog.paginator.navAriaLabel": {
"message": "博文列表分页导航",
"description": "The ARIA label for the blog pagination"
},
"theme.blog.paginator.newerEntries": {
"message": "较新的博文",
"description": "The label used to navigate to the newer blog posts page (previous page)"
},
"theme.blog.paginator.olderEntries": {
"message": "较旧的博文",
"description": "The label used to navigate to the older blog posts page (next page)"
},
"theme.blog.post.paginator.navAriaLabel": {
"message": "博文分页导航",
"description": "The ARIA label for the blog posts pagination"
},
"theme.blog.post.paginator.newerPost": {
"message": "较新一篇",
"description": "The blog post button label to navigate to the newer/previous post"
},
"theme.blog.post.paginator.olderPost": {
"message": "较旧一篇",
"description": "The blog post button label to navigate to the older/next post"
},
"theme.blog.post.plurals": {
"message": "{count} 篇博文",
"description": "Pluralized label for \"{count} posts\". Use as much plural forms (separated by \"|\") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)"
},
"theme.blog.tagTitle": {
"message": "{nPosts} 含有标签「{tagName}」",
"description": "The title of the page for a blog tag"
},
"theme.tags.tagsPageLink": {
"message": "查看所有标签",
"description": "The label of the link targeting the tag list page"
},
"theme.colorToggle.ariaLabel": {
"message": "切换浅色/暗黑模式(当前为{mode})",
"description": "The ARIA label for the navbar color mode toggle"
},
"theme.colorToggle.ariaLabel.mode.dark": {
"message": "暗黑模式",
"description": "The name for the dark color mode"
},
"theme.colorToggle.ariaLabel.mode.light": {
"message": "浅色模式",
"description": "The name for the light color mode"
},
"theme.docs.breadcrumbs.home": {
"message": "主页面",
"description": "The ARIA label for the home page in the breadcrumbs"
},
"theme.docs.breadcrumbs.navAriaLabel": {
"message": "页面路径",
"description": "The ARIA label for the breadcrumbs"
},
"theme.docs.DocCard.categoryDescription": {
"message": "{count} 个项目",
"description": "The default description for a category card in the generated index about how many items this category includes"
},
"theme.docs.paginator.navAriaLabel": {
"message": "文档分页导航",
"description": "The ARIA label for the docs pagination"
},
"theme.docs.paginator.previous": {
"message": "上一页",
"description": "The label used to navigate to the previous doc"
},
"theme.docs.paginator.next": {
"message": "下一页",
"description": "The label used to navigate to the next doc"
},
"theme.docs.tagDocListPageTitle.nDocsTagged": {
"message": "{count} 篇文档带有标签",
"description": "Pluralized label for \"{count} docs tagged\". Use as much plural forms (separated by \"|\") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)"
},
"theme.docs.tagDocListPageTitle": {
"message": "{nDocsTagged}「{tagName}」",
"description": "The title of the page for a docs tag"
},
"theme.docs.versionBadge.label": {
"message": "版本:{versionLabel}"
},
"theme.docs.versions.unreleasedVersionLabel": {
"message": "此为 {siteTitle} {versionLabel} 版尚未发行的文档。",
"description": "The label used to tell the user that he's browsing an unreleased doc version"
},
"theme.docs.versions.unmaintainedVersionLabel": {
"message": "此为 {siteTitle} {versionLabel} 版的文档,现已不再积极维护。",
"description": "The label used to tell the user that he's browsing an unmaintained doc version"
},
"theme.docs.versions.latestVersionSuggestionLabel": {
"message": "最新的文档请参阅 {latestVersionLink} ({versionLabel})。",
"description": "The label used to tell the user to check the latest version"
},
"theme.docs.versions.latestVersionLinkLabel": {
"message": "最新版本",
"description": "The label used for the latest version suggestion link label"
},
"theme.common.editThisPage": {
"message": "编辑此页",
"description": "The link label to edit the current page"
},
"theme.lastUpdated.atDate": {
"message": "于 {date} ",
"description": "The words used to describe on which date a page has been last updated"
},
"theme.lastUpdated.byUser": {
"message": "由 {user} ",
"description": "The words used to describe by who the page has been last updated"
},
"theme.lastUpdated.lastUpdatedAtBy": {
"message": "最后{byUser}{atDate}更新",
"description": "The sentence used to display when a page has been last updated, and by who"
},
"theme.common.headingLinkTitle": {
"message": "标题的直接链接",
"description": "Title for link to heading"
},
"theme.navbar.mobileVersionsDropdown.label": {
"message": "选择版本",
"description": "The label for the navbar versions dropdown on mobile view"
},
"theme.common.skipToMainContent": {
"message": "跳到主要内容",
"description": "The skip to content label used for accessibility, allowing to rapidly navigate to main content with keyboard tab/enter navigation"
},
"theme.tags.tagsListLabel": {
"message": "标签:",
"description": "The label alongside a tag list"
},
"theme.blog.sidebar.navAriaLabel": {
"message": "最近博文导航",
"description": "The ARIA label for recent posts in the blog sidebar"
},
"theme.CodeBlock.copied": {
"message": "复制成功",
"description": "The copied button label on code blocks"
},
"theme.CodeBlock.copyButtonAriaLabel": {
"message": "复制代码到剪贴板",
"description": "The ARIA label for copy code blocks button"
},
"theme.CodeBlock.copy": {
"message": "复制",
"description": "The copy button label on code blocks"
},
"theme.CodeBlock.wordWrapToggle": {
"message": "切换自动换行",
"description": "The title attribute for toggle word wrapping button of code block lines"
},
"theme.DocSidebarItem.toggleCollapsedCategoryAriaLabel": {
"message": "打开/收起侧边栏菜单「{label}」",
"description": "The ARIA label to toggle the collapsible sidebar category"
},
"theme.TOCCollapsible.toggleButtonLabel": {
"message": "本页总览",
"description": "The label used by the button on the collapsible TOC component"
},
"theme.navbar.mobileLanguageDropdown.label": {
"message": "选择语言",
"description": "The label for the mobile language switcher dropdown"
},
"theme.blog.post.readingTime.plurals": {
"message": "阅读需 {readingTime} 分钟",
"description": "Pluralized label for \"{readingTime} min read\". Use as much plural forms (separated by \"|\") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)"
},
"theme.docs.sidebar.collapseButtonTitle": {
"message": "收起侧边栏",
"description": "The title attribute for collapse button of doc sidebar"
},
"theme.docs.sidebar.collapseButtonAriaLabel": {
"message": "收起侧边栏",
"description": "The title attribute for collapse button of doc sidebar"
},
"theme.blog.post.readMore": {
"message": "阅读更多",
"description": "The label used in blog post item excerpts to link to full blog posts"
},
"theme.blog.post.readMoreLabel": {
"message": "阅读 {title} 的全文",
"description": "The ARIA label for the link to full blog posts from excerpts"
},
"theme.navbar.mobileSidebarSecondaryMenu.backButtonLabel": {
"message": "← 回到主菜单",
"description": "The label of the back button to return to main menu, inside the mobile navbar sidebar secondary menu (notably used to display the docs sidebar)"
},
"theme.docs.sidebar.expandButtonTitle": {
"message": "展开侧边栏",
"description": "The ARIA label and title attribute for expand button of doc sidebar"
},
"theme.docs.sidebar.expandButtonAriaLabel": {
"message": "展开侧边栏",
"description": "The ARIA label and title attribute for expand button of doc sidebar"
},
"theme.SearchBar.label": {
"message": "搜索",
"description": "The ARIA label and placeholder for search button"
},
"theme.SearchModal.searchBox.resetButtonTitle": {
"message": "清除查询",
"description": "The label and ARIA label for search box reset button"
},
"theme.SearchModal.searchBox.cancelButtonText": {
"message": "取消",
"description": "The label and ARIA label for search box cancel button"
},
"theme.SearchModal.startScreen.recentSearchesTitle": {
"message": "最近搜索",
"description": "The title for recent searches"
},
"theme.SearchModal.startScreen.noRecentSearchesText": {
"message": "没有最近搜索",
"description": "The text when no recent searches"
},
"theme.SearchModal.startScreen.saveRecentSearchButtonTitle": {
"message": "保存这个搜索",
"description": "The label for save recent search button"
},
"theme.SearchModal.startScreen.removeRecentSearchButtonTitle": {
"message": "从历史记录中删除这个搜索",
"description": "The label for remove recent search button"
},
"theme.SearchModal.startScreen.favoriteSearchesTitle": {
"message": "收藏",
"description": "The title for favorite searches"
},
"theme.SearchModal.startScreen.removeFavoriteSearchButtonTitle": {
"message": "从收藏列表中删除这个搜索",
"description": "The label for remove favorite search button"
},
"theme.SearchModal.errorScreen.titleText": {
"message": "无法获取结果",
"description": "The title for error screen of search modal"
},
"theme.SearchModal.errorScreen.helpText": {
"message": "你可能需要检查网络连接。",
"description": "The help text for error screen of search modal"
},
"theme.SearchModal.footer.selectText": {
"message": "选中",
"description": "The explanatory text of the action for the enter key"
},
"theme.SearchModal.footer.selectKeyAriaLabel": {
"message": "Enter 键",
"description": "The ARIA label for the Enter key button that makes the selection"
},
"theme.SearchModal.footer.navigateText": {
"message": "导航",
"description": "The explanatory text of the action for the Arrow up and Arrow down key"
},
"theme.SearchModal.footer.navigateUpKeyAriaLabel": {
"message": "向上键",
"description": "The ARIA label for the Arrow up key button that makes the navigation"
},
"theme.SearchModal.footer.navigateDownKeyAriaLabel": {
"message": "向下键",
"description": "The ARIA label for the Arrow down key button that makes the navigation"
},
"theme.SearchModal.footer.closeText": {
"message": "关闭",
"description": "The explanatory text of the action for Escape key"
},
"theme.SearchModal.footer.closeKeyAriaLabel": {
"message": "Esc 键",
"description": "The ARIA label for the Escape key button that close the modal"
},
"theme.SearchModal.footer.searchByText": {
"message": "搜索提供",
"description": "The text explain that the search is making by Algolia"
},
"theme.SearchModal.noResultsScreen.noResultsText": {
"message": "没有结果:",
"description": "The text explains that there are no results for the following search"
},
"theme.SearchModal.noResultsScreen.suggestedQueryText": {
"message": "试试搜索",
"description": "The text for the suggested query when no results are found for the following search"
},
"theme.SearchModal.noResultsScreen.reportMissingResultsText": {
"message": "认为这个查询应该有结果?",
"description": "The text for the question where the user thinks there are missing results"
},
"theme.SearchModal.noResultsScreen.reportMissingResultsLinkText": {
"message": "请告知我们。",
"description": "The text for the link to report missing results"
},
"theme.SearchModal.placeholder": {
"message": "搜索文档",
"description": "The placeholder of the input of the DocSearch pop-up modal"
},
"theme.SearchBar.seeAll": {
"message": "查看全部 {count} 个结果"
},
"theme.SearchPage.documentsFound.plurals": {
"message": "找到 {count} 份文件",
"description": "Pluralized label for \"{count} documents found\". Use as much plural forms (separated by \"|\") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)"
},
"theme.SearchPage.existingResultsTitle": {
"message": "「{query}」的搜索结果",
"description": "The search page title for non-empty query"
},
"theme.SearchPage.emptyResultsTitle": {
"message": "在文档中搜索",
"description": "The search page title for empty query"
},
"theme.SearchPage.inputPlaceholder": {
"message": "在此输入搜索字词",
"description": "The placeholder for search page input"
},
"theme.SearchPage.inputLabel": {
"message": "搜索",
"description": "The ARIA label for search page input"
},
"theme.SearchPage.algoliaLabel": {
"message": "通过 Algolia 搜索",
"description": "The ARIA label for Algolia mention"
},
"theme.SearchPage.noResultsText": {
"message": "未找到任何结果",
"description": "The paragraph for empty search result"
},
"theme.SearchPage.fetchingNewResults": {
"message": "正在获取新的搜索结果...",
"description": "The paragraph for fetching new search results"
},
"theme.IdealImageMessage.loading": {
"message": "加载中……",
"description": "When the full-scale image is loading"
},
"theme.IdealImageMessage.load": {
"message": "点击加载图片{sizeMessage}",
"description": "To prompt users to load the full image. sizeMessage is a parenthesized size figure."
},
"theme.IdealImageMessage.offline": {
"message": "你的浏览器处于离线状态。图片未加载",
"description": "When the user is viewing an offline document"
},
"theme.IdealImageMessage.404error": {
"message": "未找到图片",
"description": "When the image is not found"
},
"theme.IdealImageMessage.error": {
"message": "出现错误,点击重试",
"description": "When the image fails to load for unknown error"
},
"theme.PwaReloadPopup.info": {
"message": "有可用的新版本",
"description": "The text for PWA reload popup"
},
"theme.PwaReloadPopup.refreshButtonText": {
"message": "刷新",
"description": "The text for PWA reload button"
},
"theme.PwaReloadPopup.closeButtonAriaLabel": {
"message": "关闭",
"description": "The ARIA label for close button of PWA reload popup"
},
"theme.Playground.result": {
"message": "结果",
"description": "The result label of the live codeblocks"
},
"theme.Playground.liveEditor": {
"message": "实时编辑器",
"description": "The live editor label of the live codeblocks"
},
"convenient-content": {
"message": "{docker} {br}集监控、告警、通知于一体,支持 Web 服务、数据库、缓存、操作系统、中间件、大数据、云原生、网络等全方位监控。{br}无需 Agent,全 Web 可视化操作,点点鼠标即可上手。{br}企业级安全保障,敏感数据全链路加密。"
},
"custom-multi-support-content": {
"message": "支持 HTTP、JMX、SSH、SNMP、JDBC 等协议可配置化,在线配置 YAML 即可自定义监控指标。{br}高性能架构,支持多采集器集群横向扩展、多网络隔离监控、云边协同。{br}灵活的告警规则,支持邮箱、短信、钉钉、企业微信、飞书、Webhook 等多种通知方式。"
},
"opensource-content": {
"message": "Apache HertzBeat™ 是开源项目,拥有开放包容的社区。{br}欢迎任何形式的贡献,无论是代码、文档还是问题反馈,尊重每位贡献者,共同成长。{br}已部署至全球数千台服务器。"
},
"slogan": {
"message": "AI 驱动的下一代开源观测系统"
},
"Who Use HertzBeat?": {
"message": "Who Use HertzBeat?"
},
"support hertzbeat": {
"message": "支持 HertzBeat"
},
"click": {
"message": "点击"
},
"go github": {
"message": "前往 Github"
},
"If you like HertzBeat, star us on GitHub": {
"message": "如果您喜欢 HertzBeat,欢迎给 HertzBeat Star。"
},
"We will grow better with your support.": {
"message": "有您的支持 HertzBeat 社区会发展得更好,也是我们的最大动力。"
},
"quickstart": {
"message": "快速开始"
},
"Who uses HertzBeat?": {
"message": "谁在使用 Apache HertzBeat"
},
"Support HertzBeat": {
"message": "Support HertzBeat"
},
"Go to Github": {
"message": "Go to Github"
},
"theme.NavBar.navAriaLabel": {
"message": "主导航",
"description": "The ARIA label for the main navigation"
},
"theme.docs.sidebar.navAriaLabel": {
"message": "文档侧边栏",
"description": "The ARIA label for the sidebar navigation"
},
"theme.docs.sidebar.closeSidebarButtonAriaLabel": {
"message": "关闭导航栏",
"description": "The ARIA label for close button of mobile sidebar"
},
"theme.docs.sidebar.toggleSidebarButtonAriaLabel": {
"message": "切换导航栏",
"description": "The ARIA label for hamburger menu button of mobile navigation"
},
"theme.tags.tagsPageTitle": {
"message": "标签",
"description": "The title of the tag list page"
},
"team.name": {
"message": "Apache HertzBeat™ 团队"
},
"team.desc": {
"message": "HertzBeat 团队由来自全球各个领域的贡献者组成。践行 开放,协作 的社区理念,欢迎👏更多的人加入我们,和社区一同成长。"
},
"team.tip": {
"message": "(排名不分先后)"
},
"team.thanks": {
"message": "感谢这些已经为 HertzBeat 做出贡献的非常棒的人们!"
}
}
@@ -0,0 +1,71 @@
---
title: 云监控系统 HertzBeat v1.0 正式发布啦
author: tom
author_title: tom
author_url: https://github.com/tomsun28
tags: [opensource]
---
[HertzBeat 赫兹跳动](https://github.com/apache/hertzbeat) 是由 [Dromara](https://dromara.org) 孵化,[TanCloud](https://tancloud.cn) 开源的一个支持网站,API,PING,端口,数据库,全站,操作系统,中间件等监控类型,支持阈值告警,告警通知 (邮箱,webhook,钉钉,企业微信,飞书机器人),拥有易用友好的可视化操作界面的开源监控告警项目。
**官网: [hertzbeat.com](https://hertzbeat.apache.org) | [tancloud.cn](https://tancloud.cn)**
从v1.0-beta.1到v1.0-beat.8,经过多个版本的迭代完善,我们很高兴宣布hertzbeat v1.0正式发布。
感谢从beat.1版本以来 HertzBeat Contributors 的贡献,社区同学和用户们的支持。 此版本更新支持了Redis的监控( @gcdd1993 贡献),覆盖Redis的内存CPU等各个性能指标,全方面监控Redis。修复了多个bug进一步增强稳定性。
<table>
<tr>
<td align="center"><a href="https://github.com/tomsun28"><img src="https://avatars.githubusercontent.com/u/24788200?v=4?s=100" width="100px;" alt="" /><br /><sub><b>tomsun28</b></sub></a><br /><a href="https://github.com/tomsun28/hertzbeat/commits?author=tomsun28" title="Code">💻</a> <a href="https://github.com/tomsun28/hertzbeat/commits?author=tomsun28" title="Documentation">📖</a> <a href="#design-tomsun28" title="Design">🎨</a></td>
<td align="center"><a href="https://github.com/wang1027-wqh"><img src="https://avatars.githubusercontent.com/u/71161318?v=4?s=100" width="100px;" alt="" /><br /><sub><b>会编程的王学长</b></sub></a><br /><a href="https://github.com/tomsun28/hertzbeat/commits?author=wang1027-wqh" title="Code">💻</a> <a href="https://github.com/tomsun28/hertzbeat/commits?author=wang1027-wqh" title="Documentation">📖</a> <a href="#design-wang1027-wqh" title="Design">🎨</a></td>
<td align="center"><a href="https://www.maxkey.top/"><img src="https://avatars.githubusercontent.com/u/1563377?v=4?s=100" width="100px;" alt="" /><br /><sub><b>MaxKey</b></sub></a><br /><a href="https://github.com/tomsun28/hertzbeat/commits?author=shimingxy" title="Code">💻</a> <a href="#design-shimingxy" title="Design">🎨</a> <a href="#ideas-shimingxy" title="Ideas, Planning, & Feedback">🤔</a></td>
<td align="center"><a href="https://blog.gcdd.top/"><img src="https://avatars.githubusercontent.com/u/26523525?v=4?s=100" width="100px;" alt="" /><br /><sub><b>观沧海</b></sub></a><br /><a href="https://github.com/tomsun28/hertzbeat/commits?author=gcdd1993" title="Code">💻</a> <a href="#design-gcdd1993" title="Design">🎨</a> <a href="https://github.com/tomsun28/hertzbeat/issues?q=author%3Agcdd1993" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/a25017012"><img src="https://avatars.githubusercontent.com/u/32265356?v=4?s=100" width="100px;" alt="" /><br /><sub><b>yuye</b></sub></a><br /><a href="https://github.com/tomsun28/hertzbeat/commits?author=a25017012" title="Code">💻</a> <a href="https://github.com/tomsun28/hertzbeat/commits?author=a25017012" title="Documentation">📖</a></td>
<td align="center"><a href="https://github.com/jx10086"><img src="https://avatars.githubusercontent.com/u/5323228?v=4?s=100" width="100px;" alt="" /><br /><sub><b>jx10086</b></sub></a><br /><a href="https://github.com/tomsun28/hertzbeat/commits?author=jx10086" title="Code">💻</a> <a href="https://github.com/tomsun28/hertzbeat/issues?q=author%3Ajx10086" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/winnerTimer"><img src="https://avatars.githubusercontent.com/u/76024658?v=4?s=100" width="100px;" alt="" /><br /><sub><b>winnerTimer</b></sub></a><br /><a href="https://github.com/tomsun28/hertzbeat/commits?author=winnerTimer" title="Code">💻</a> <a href="https://github.com/tomsun28/hertzbeat/issues?q=author%3AwinnerTimer" title="Bug reports">🐛</a></td>
</tr>
<tr>
<td align="center"><a href="https://github.com/goo-kits"><img src="https://avatars.githubusercontent.com/u/13163673?v=4?s=100" width="100px;" alt="" /><br /><sub><b>goo-kits</b></sub></a><br /><a href="https://github.com/tomsun28/hertzbeat/commits?author=goo-kits" title="Code">💻</a> <a href="https://github.com/tomsun28/hertzbeat/issues?q=author%3Agoo-kits" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/brave4Time"><img src="https://avatars.githubusercontent.com/u/105094014?v=4?s=100" width="100px;" alt="" /><br /><sub><b>brave4Time</b></sub></a><br /><a href="https://github.com/tomsun28/hertzbeat/commits?author=brave4Time" title="Code">💻</a> <a href="https://github.com/tomsun28/hertzbeat/issues?q=author%3Abrave4Time" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/walkerlee-lab"><img src="https://avatars.githubusercontent.com/u/8426753?v=4?s=100" width="100px;" alt="" /><br /><sub><b>WalkerLee</b></sub></a><br /><a href="https://github.com/tomsun28/hertzbeat/commits?author=walkerlee-lab" title="Code">💻</a> <a href="https://github.com/tomsun28/hertzbeat/issues?q=author%3Awalkerlee-lab" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/fullofjoy"><img src="https://avatars.githubusercontent.com/u/30247571?v=4?s=100" width="100px;" alt="" /><br /><sub><b>jianghang</b></sub></a><br /><a href="https://github.com/tomsun28/hertzbeat/commits?author=fullofjoy" title="Code">💻</a> <a href="https://github.com/tomsun28/hertzbeat/issues?q=author%3Afullofjoy" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/ChineseTony"><img src="https://avatars.githubusercontent.com/u/24618786?v=4?s=100" width="100px;" alt="" /><br /><sub><b>ChineseTony</b></sub></a><br /><a href="https://github.com/tomsun28/hertzbeat/commits?author=ChineseTony" title="Code">💻</a></td>
</tr>
</table>
特性:
1. [monitor feature:支持redis监控协议 #142](https://github.com/apache/hertzbeat/pull/142) contribute by @gcdd1993
2. Copyright & NOTICE contribute by @shimingxy
3. [alerter bugfix: 支持系统告警设置触发次数 #144](https://github.com/apache/hertzbeat/pull/144).
4. [collector feature: redis复用单连接 #146](https://github.com/apache/hertzbeat/pull/146).
5. [collector 隐藏日志中IP、账号与密码等敏感信息 #159](https://github.com/apache/hertzbeat/pull/159) idea from @goo-kits
6. [支持 zookeeper 监控帮助文档 #137](https://github.com/apache/hertzbeat/pull/137) contributr by @wang1027-wqh
Bug修复.
1. [[monitor]bugfix: 修复resource bundle在en.HK加载资源错误问题 #131](https://github.com/apache/hertzbeat/pull/131).
2. [[web-app]bugfix:修复当主题为dark时部分菜单不可见 #132](https://github.com/apache/hertzbeat/pull/132).
3. [[monitor]bugfix: 修复通知策略过滤标签时只能选择一个 #140](https://github.com/apache/hertzbeat/pull/140). issue by @daqianxiaoyao
4. [[td-engine store]bugfix: 修复tdengine入库指标数据时无table报错日志#150](https://github.com/apache/hertzbeat/pull/150). contribute by @ChineseTony
5. [[collector]bugfix: 修复 warehouse data queue 未消费异常 #153](https://github.com/apache/hertzbeat/pull/153). issue by @daqianxiaoyao
6. [[web-app]bugfix: 修复黑暗主题时页面输入框校验出错时不可见 #157](https://github.com/apache/hertzbeat/pull/157). issue by @ConradWen
Online: [tancloud](https://console.tancloud.cn)
-----------------------
> [HertzBeat赫兹跳动](https://github.com/apache/hertzbeat) 是由 [Dromara](https://dromara.org) 孵化,[TanCloud](https://tancloud.cn)开源的一个支持网站,API,PING,端口,数据库,操作系统等监控类型,拥有易用友好的可视化操作界面的开源监控告警项目。
> 当然,我们也提供了对应的[SAAS云监控版本](https://console.tancloud.cn),中小团队和个人无需再为了监控自己的网站资源,而去部署一套繁琐的监控系统,[登录即可免费开始](https://console.tancloud.cn)监控之旅。
> HertzBeat 支持自定义监控,只用通过配置YML文件我们就可以自定义需要的监控类型和指标,来满足常见的个性化需求。
> HertzBeat 模块化,`manager, collector, scheduler, warehouse, alerter` 各个模块解耦合,方便理解与定制开发。
> HertzBeat 支持更自由化的告警配置(计算表达式),支持告警通知,告警模板,邮件钉钉微信飞书等及时通知送达
> 欢迎登录 HertzBeat 的 [云环境TanCloud](https://console.tancloud.cn) 试用发现更多。
> 我们正在快速迭代中,欢迎参与加入共建项目开源生态。
>
> `HertzBeat` 的多类型支持,易扩展,低耦合,希望能帮助开发者和中小团队快速搭建自有监控系统。
**仓库地址**
[Github](https://github.com/apache/hertzbeat) [https://github.com/apache/hertzbeat](https://github.com/apache/hertzbeat)
[Gitee](https://gitee.com/hertzbeat/hertzbeat) [https://gitee.com/hertzbeat/hertzbeat](https://gitee.com/hertzbeat/hertzbeat)
@@ -0,0 +1,72 @@
---
title: 云监控系统 HertzBeat v1.1.0 发布!一条命令即可开启监控之旅!
author: tom
author_title: tom
author_url: https://github.com/tomsun28
tags: [opensource]
---
[HertzBeat 赫兹跳动](https://github.com/apache/hertzbeat) 是由 [Dromara](https://dromara.org) 孵化,[TanCloud](https://tancloud.cn) 开源的一个支持网站,API,PING,端口,数据库,全站,操作系统,中间件等监控类型,支持阈值告警,告警通知 (邮箱,webhook,钉钉,企业微信,飞书机器人),拥有易用友好的可视化操作界面的开源监控告警项目。
**官网: [hertzbeat.com](https://hertzbeat.apache.org) | [tancloud.cn](https://tancloud.cn)**
大家好,HertzBeat v1.1.0 发布啦!这个版本我们支持了SNMP协议,并使用SNMP协议监控支持了windwos操作系统的应用监控。
另一个重大变更是我们默认使用了H2数据库来替换MYSQL数据库作为存储,来方便使用者们的安装部署,现在只需要一条docker命令即可安装体验hertzbeat `docker run -d -p 1157:1157 --name hertzbeat apache/hertzbeat`
Let's Try It!
感谢hertzbeat贡献者们的贡献!👍👍
Feature
1. [[monitor]feature: 支持SNMP协议和Windows操作系统监控 #192](https://github.com/apache/hertzbeat/pull/192). contribute by @ChineseTony
2. [[monitor]默认使用H2数据库替换MYSQL数据库 #191](https://github.com/apache/hertzbeat/pull/191)
3. [[manager]支持监控参数的英文国际化,国际化更近一步 #184](https://github.com/apache/hertzbeat/pull/184).
4. [[script]支持了amd64和arm64版本的docker 镜像 #189](https://github.com/apache/hertzbeat/pull/189).
5. [[monitor]feature: 支持采集oracle多表空间指标数据 #163](https://github.com/apache/hertzbeat/pull/163) contribute by @brave4Time
6. [[monitor]数据库表统一添加前缀 hzb_ #193](https://github.com/apache/hertzbeat/pull/193) issue from @shimingxy
Bugfix.
1. [[monitor]修改在tencent centos版本下无法采集CPU指标问题 #164](https://github.com/apache/hertzbeat/pull/164) contribute by @wyt199905 .
2. [[manager]修复oracle监控percentage指标采集问题 #168](https://github.com/apache/hertzbeat/pull/168)
3. [[monitor] bugfix: 修复elasticsearch监控在basic认证情况下采集失败 #174](https://github.com/apache/hertzbeat/pull/174) contribute by @weifuqing
4. [修改oracle监控参数[数据库名称]有歧义导致的监控失败 #182](https://github.com/apache/hertzbeat/pull/182) @zklmcookle
Online [https://console.tancloud.cn](https://console.tancloud.cn).
---
⚠️ ⚠️⚠️⚠️请注意其它版本升级到v1.1.0需要先执行下面的SQL脚本. 现在我们的表名称有个统一前缀 hzb_ prefix.
```properties
ALTER TABLE alert RENAME TO hzb_alert;
ALTER TABLE alert_define RENAME TO hzb_alert_define;
ALTER TABLE alert_define_monitor_bind RENAME TO hzb_alert_define_monitor_bind;
ALTER TABLE monitor RENAME TO hzb_monitor;
ALTER TABLE notice_receiver RENAME TO hzb_notice_receiver;
ALTER TABLE notice_rule RENAME TO hzb_notice_rule;
ALTER TABLE param RENAME TO hzb_param;
ALTER TABLE param_define RENAME TO hzb_param_define;
ALTER TABLE tag RENAME TO hzb_tag;
ALTER TABLE tag_monitor_bind RENAME TO hzb_tag_monitor_bind;
commit;
```
Have Fun!
---
> [HertzBeat赫兹跳动](https://github.com/apache/hertzbeat) 是由 [Dromara](https://dromara.org) 孵化,[TanCloud](https://tancloud.cn)开源的一个支持网站,API,PING,端口,数据库,操作系统等监控类型,拥有易用友好的可视化操作界面的开源监控告警项目。
> 当然,我们也提供了对应的[SAAS云监控版本](https://console.tancloud.cn),中小团队和个人无需再为了监控自己的网站资源,而去部署一套繁琐的监控系统,[登录即可免费开始](https://console.tancloud.cn)监控之旅。
> HertzBeat 支持自定义监控,只用通过配置YML文件我们就可以自定义需要的监控类型和指标,来满足常见的个性化需求。
> HertzBeat 模块化,`manager, collector, scheduler, warehouse, alerter` 各个模块解耦合,方便理解与定制开发。
> HertzBeat 支持更自由化的告警配置(计算表达式),支持告警通知,告警模板,邮件钉钉微信飞书等及时通知送达
> 欢迎登录 HertzBeat 的 [云环境TanCloud](https://console.tancloud.cn) 试用发现更多。
> 我们正在快速迭代中,欢迎参与加入共建项目开源生态。
>
> `HertzBeat` 的多类型支持,易扩展,低耦合,希望能帮助开发者和中小团队快速搭建自有监控系统。
**仓库地址**
[Github](https://github.com/apache/hertzbeat) [https://github.com/apache/hertzbeat](https://github.com/apache/hertzbeat)
[Gitee](https://gitee.com/hertzbeat/hertzbeat) [https://gitee.com/hertzbeat/hertzbeat](https://gitee.com/hertzbeat/hertzbeat)
@@ -0,0 +1,72 @@
---
title: 云监控系统 HertzBeat v1.1.0 发布!一条命令即可开启监控之旅!
author: tom
author_title: tom
author_url: https://github.com/tomsun28
tags: [opensource]
---
[HertzBeat 赫兹跳动](https://github.com/apache/hertzbeat) 是由 [Dromara](https://dromara.org) 孵化,[TanCloud](https://tancloud.cn) 开源的一个支持网站,API,PING,端口,数据库,全站,操作系统,中间件等监控类型,支持阈值告警,告警通知 (邮箱,webhook,钉钉,企业微信,飞书机器人),拥有易用友好的可视化操作界面的开源监控告警项目。
**官网: [hertzbeat.com](https://hertzbeat.apache.org) | [tancloud.cn](https://tancloud.cn)**
大家好,HertzBeat v1.1.0 发布啦!这个版本我们支持了SNMP协议,并使用SNMP协议监控支持了windwos操作系统的应用监控。
另一个重大变更是我们默认使用了H2数据库来替换MYSQL数据库作为存储,来方便使用者们的安装部署,现在只需要一条docker命令即可安装体验hertzbeat `docker run -d -p 1157:1157 --name hertzbeat apache/hertzbeat`
Let's Try It!
感谢hertzbeat贡献者们的贡献!👍👍
Feature
1. [[monitor]feature: 支持SNMP协议和Windows操作系统监控 #192](https://github.com/apache/hertzbeat/pull/192). contribute by @ChineseTony
2. [[monitor]默认使用H2数据库替换MYSQL数据库 #191](https://github.com/apache/hertzbeat/pull/191)
3. [[manager]支持监控参数的英文国际化,国际化更近一步 #184](https://github.com/apache/hertzbeat/pull/184).
4. [[script]支持了amd64和arm64版本的docker 镜像 #189](https://github.com/apache/hertzbeat/pull/189).
5. [[monitor]feature: 支持采集oracle多表空间指标数据 #163](https://github.com/apache/hertzbeat/pull/163) contribute by @brave4Time
6. [[monitor]数据库表统一添加前缀 hzb_ #193](https://github.com/apache/hertzbeat/pull/193) issue from @shimingxy
Bugfix.
1. [[monitor]修改在tencent centos版本下无法采集CPU指标问题 #164](https://github.com/apache/hertzbeat/pull/164) contribute by @wyt199905 .
2. [[manager]修复oracle监控percentage指标采集问题 #168](https://github.com/apache/hertzbeat/pull/168)
3. [[monitor] bugfix: 修复elasticsearch监控在basic认证情况下采集失败 #174](https://github.com/apache/hertzbeat/pull/174) contribute by @weifuqing
4. [修改oracle监控参数[数据库名称]有歧义导致的监控失败 #182](https://github.com/apache/hertzbeat/pull/182) @zklmcookle
Online [https://console.tancloud.cn](https://console.tancloud.cn).
---
⚠️ ⚠️⚠️⚠️请注意其它版本升级到v1.1.0需要先执行下面的SQL脚本. 现在我们的表名称有个统一前缀 hzb_ prefix.
```properties
ALTER TABLE alert RENAME TO hzb_alert;
ALTER TABLE alert_define RENAME TO hzb_alert_define;
ALTER TABLE alert_define_monitor_bind RENAME TO hzb_alert_define_monitor_bind;
ALTER TABLE monitor RENAME TO hzb_monitor;
ALTER TABLE notice_receiver RENAME TO hzb_notice_receiver;
ALTER TABLE notice_rule RENAME TO hzb_notice_rule;
ALTER TABLE param RENAME TO hzb_param;
ALTER TABLE param_define RENAME TO hzb_param_define;
ALTER TABLE tag RENAME TO hzb_tag;
ALTER TABLE tag_monitor_bind RENAME TO hzb_tag_monitor_bind;
commit;
```
Have Fun!
---
> [HertzBeat赫兹跳动](https://github.com/apache/hertzbeat) 是由 [Dromara](https://dromara.org) 孵化,[TanCloud](https://tancloud.cn)开源的一个支持网站,API,PING,端口,数据库,操作系统等监控类型,拥有易用友好的可视化操作界面的开源监控告警项目。
> 当然,我们也提供了对应的[SAAS云监控版本](https://console.tancloud.cn),中小团队和个人无需再为了监控自己的网站资源,而去部署一套繁琐的监控系统,[登录即可免费开始](https://console.tancloud.cn)监控之旅。
> HertzBeat 支持自定义监控,只用通过配置YML文件我们就可以自定义需要的监控类型和指标,来满足常见的个性化需求。
> HertzBeat 模块化,`manager, collector, scheduler, warehouse, alerter` 各个模块解耦合,方便理解与定制开发。
> HertzBeat 支持更自由化的告警配置(计算表达式),支持告警通知,告警模板,邮件钉钉微信飞书等及时通知送达
> 欢迎登录 HertzBeat 的 [云环境TanCloud](https://console.tancloud.cn) 试用发现更多。
> 我们正在快速迭代中,欢迎参与加入共建项目开源生态。
>
> `HertzBeat` 的多类型支持,易扩展,低耦合,希望能帮助开发者和中小团队快速搭建自有监控系统。
**仓库地址**
[Github](https://github.com/apache/hertzbeat) [https://github.com/apache/hertzbeat](https://github.com/apache/hertzbeat)
[Gitee](https://gitee.com/hertzbeat/hertzbeat) [https://gitee.com/hertzbeat/hertzbeat](https://gitee.com/hertzbeat/hertzbeat)
@@ -0,0 +1,61 @@
---
title: 云监控系统 HertzBeat v1.1.1 发布!
author: tom
author_title: tom
author_url: https://github.com/tomsun28
tags: [opensource]
---
[HertzBeat 赫兹跳动](https://github.com/apache/hertzbeat) 是由 [Dromara](https://dromara.org) 孵化,[TanCloud](https://tancloud.cn) 开源的一个支持网站,API,PING,端口,数据库,全站,操作系统,中间件等监控类型,支持阈值告警,告警通知 (邮箱,webhook,钉钉,企业微信,飞书机器人),拥有易用友好的可视化操作界面的开源监控告警项目。
**官网: [hertzbeat.com](https://hertzbeat.apache.org) | [tancloud.cn](https://tancloud.cn)**
大家好,HertzBeat v1.1.1 发布啦!这个版本带来了自定义监控增强,采集指标数据可以作为变量赋值给下一个采集。修复了若干bug,提升整体稳定性。
只需要一条docker命令即可安装体验hertzbeat
`docker run -d -p 1157:1157 --name hertzbeat apache/hertzbeat`
感谢hertzbeat贡献者们的贡献!👍👍
Feature
1. [[script] feature 升级docker的基础镜像为 openjdk:11.0.15-jre-slim #205](https://github.com/apache/hertzbeat/pull/205)
2. [[monitor] 支持前置采集指标数据作为变量赋值给下一采集流程 #206](https://github.com/apache/hertzbeat/pull/206).
3. [[collector] 使用基本的http headers头实现basic auth替换前置模式 #212](https://github.com/apache/hertzbeat/pull/212)
4. [[manager,alerter] 支持告警通知设置钉钉机器人微信飞书自定义 webhook url #213](https://github.com/apache/hertzbeat/pull/213)
5. [[monitor] feature 更新数值指标数据不带末尾为0的小数点 #217](https://github.com/apache/hertzbeat/pull/217)
6. [[web-app]feature:toggle [enable and cancel] button #218](https://github.com/apache/hertzbeat/pull/218)
7. [[manager] 更新监控define yml文件前缀名称 "app" or "param",便于自定义监控区别 #221](https://github.com/apache/hertzbeat/pull/221)
Bugfix.
1. [[update] docker-compose 添加jpa自动执行脚本,删除sql脚本 #198](https://github.com/apache/hertzbeat/pull/198) contribute by @DevilX5 .
2. [修复自定义监控描述文档 #199](https://github.com/apache/hertzbeat/pull/199) contribute by @DevilX5
3. [[manager] bugfix oracle performance 指标采集异常问题 #201](https://github.com/apache/hertzbeat/pull/201).
4. [[common] bugfix 告警状态无法页面手动更新问题 #203](https://github.com/apache/hertzbeat/pull/203)
5. [[manager] bugfix windows监控类型名称错误问题 #204](https://github.com/apache/hertzbeat/pull/204)
6. [fix time zone todo issue #210](https://github.com/apache/hertzbeat/pull/210) contribute by @djzeng
7. [[common] bugfix 雪花算法生成ID大小超出 0x1FFFFFFFFFFFFFF 导致前端不识别问题 #211](https://github.com/apache/hertzbeat/pull/211)
8. [[manager] 修改监控页面取消监控功能再启动监控导致多生成jobId,原有监控项目并没有真实取消 #215](https://github.com/apache/hertzbeat/pull/215) contribute by @yangshihui
9. [[warehouse] 修复tdengine对特殊字段建表失败导致数据无法入库问题 #220](https://github.com/apache/hertzbeat/pull/220)
Online [https://console.tancloud.cn](https://console.tancloud.cn).
Have Fun!
----
> [HertzBeat赫兹跳动](https://github.com/apache/hertzbeat) 是由 [Dromara](https://dromara.org) 孵化,[TanCloud](https://tancloud.cn)开源的一个支持网站,API,PING,端口,数据库,操作系统等监控类型,拥有易用友好的可视化操作界面的开源监控告警项目。
> 当然,我们也提供了对应的[SAAS云监控版本](https://console.tancloud.cn),中小团队和个人无需再为了监控自己的网站资源,而去部署一套繁琐的监控系统,[登录即可免费开始](https://console.tancloud.cn)监控之旅。
> HertzBeat 支持自定义监控,只用通过配置YML文件我们就可以自定义需要的监控类型和指标,来满足常见的个性化需求。
> HertzBeat 模块化,`manager, collector, scheduler, warehouse, alerter` 各个模块解耦合,方便理解与定制开发。
> HertzBeat 支持更自由化的告警配置(计算表达式),支持告警通知,告警模板,邮件钉钉微信飞书等及时通知送达
> 欢迎登录 HertzBeat 的 [云环境TanCloud](https://console.tancloud.cn) 试用发现更多。
> 我们正在快速迭代中,欢迎参与加入共建项目开源生态。
>
> `HertzBeat` 的多类型支持,易扩展,低耦合,希望能帮助开发者和中小团队快速搭建自有监控系统。
**仓库地址**
[Github](https://github.com/apache/hertzbeat) [https://github.com/apache/hertzbeat](https://github.com/apache/hertzbeat)
[Gitee](https://gitee.com/hertzbeat/hertzbeat) [https://gitee.com/hertzbeat/hertzbeat](https://gitee.com/hertzbeat/hertzbeat)
@@ -0,0 +1,36 @@
---
title: 云监控系统 HertzBeat v1.1.3 发布!
author: tom
author_title: tom
author_url: https://github.com/tomsun28
tags: [opensource]
---
Home: hertzbeat.com | tancloud.cn
Hi guys! HertzBeat v1.1.3 is coming. This version supports kafka monitor, ssl certificate expired monitor and more. Fixed several bugs and improved the overall stable usability.
Only one docker command is needed to install and experience hertzbeat
`docker run -d -p 1157:1157 --name hertzbeat apache/hertzbeat`
Thanks to the contributors! 👍👍
Feature
1. [[web-app]feature:update monitors layout, support host copy to clipboard #260](https://github.com/apache/hertzbeat/pull/260)
2. [[monitor] feature: support apache kafka monitor #263](https://github.com/apache/hertzbeat/pull/263) contribute by @wang1027-wqh
3. [[webapp] support history chart query 3 mouth time range #265](https://github.com/apache/hertzbeat/pull/265) issue by @ericfrol
4. [[monitor] support ssl certificate expired monitor #266](https://github.com/apache/hertzbeat/pull/266) suggest by @noear
5. [[web-app] update default interval 600s to 120s #268](https://github.com/apache/hertzbeat/pull/268)
6. [[web-app] update layout ui - help button, nav menu #272](https://github.com/apache/hertzbeat/pull/272)
7. [[alert,webapp] support delete all alerts at once. #273](https://github.com/apache/hertzbeat/pull/273) issue by @ericfrol
8. [[web-app] update home background image #276](https://github.com/apache/hertzbeat/pull/276)
Bugfix.
1. [[docs] fix extend-http-jsonpath.md parseScript error #262](https://github.com/apache/hertzbeat/pull/262) contribute by @woshiniusange .
2. [[monitor] update help docs, refactor redis metrics name #264](https://github.com/apache/hertzbeat/pull/264)
3. [[manager] bugfix alert tags is null when tags map key normal value null. #270](https://github.com/apache/hertzbeat/pull/270) issue by [https://gitee.com/hello_brother_niu](https://gitee.com/hello_brother_niu)
4. [[alert] bugfix: the alert global preset config do not take effect #275](https://github.com/apache/hertzbeat/pull/275) issue by [https://gitee.com/hello_brother_niu](https://gitee.com/hello_brother_niu)
Online [https://console.tancloud.cn](https://console.tancloud.cn).
@@ -0,0 +1,106 @@
---
title: SSL证书过期监控最佳实践
author: tom
author_title: tom
author_url: https://github.com/tomsun28
tags: [opensource, practice]
---
先祝看到的同学中秋快乐,身体健康,在身体健康的基础上尽量暴富。
进入正题,现在大部分网站都默认支持 HTTPS,我们申请的证书一般是3个月或者1年,很容易随着时间的流逝SSL证书过期了我们却没有第一时间发现,或者在过期之前没有及时更新证书。
今天这篇文章介绍如果使用 hertzbeat 监控系统来检测我们网站的SSL证书有效期,当证书过期时或证书快过期前几天,给我们发告警消息。
## HertzBeat是什么
HertzBeat 一个拥有强大自定义监控能力,无需Agent的实时监控工具。网站监测,PING连通性,端口可用性,数据库,操作系统,中间件,API监控,阈值告警,告警通知(邮件微信钉钉飞书)。
**官网: [https://hertzbeat.apache.org](https://hertzbeat.apache.org) | [https://tancloud.cn](https://tancloud.cn)**
github: [https://github.com/apache/hertzbeat](https://github.com/apache/hertzbeat)
gitee: [https://gitee.com/hertzbeat/hertzbeat](https://gitee.com/hertzbeat/hertzbeat)
### 安装 HertzBeat
1. 如果不想安装可以直接使用云服务 [TanCloud探云 console.tancloud.cn](https://console.tancloud.cn)
2. `docker` 环境仅需一条命令即可安装
`docker run -d -p 1157:1157 --name hertzbeat apache/hertzbeat`
3. 安装成功浏览器访问 `localhost:1157` 即可开始,默认账号密码 `admin/hertzbeat`
#### 监控SSL证书
1. 点击新增SSL证书监控
> 系统页面 -> 监控中心 -> SSL证书 -> 新增SSL证书
![HertzBeat](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/bd53f343a5b54feab62e71458d076441~tplv-k3u1fbpfcp-zoom-1.image)
2. 配置监控网站
> 我们这里举例监控百度网站, 配置监控host域名,名称,采集间隔等。
> 点击确定 注意⚠️新增前默认会先去测试网站连接性,连接成功才会新增,当然也可以把**是否测试**按钮置灰。
![HertzBeat](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/ad1154670648413bb82c8bdeb5b13609~tplv-k3u1fbpfcp-zoom-1.image)
3. 查看检测指标数据
> 在监控列表可以查看任务状态,进监控详情可以查看指标数据图表等。
![HertzBeat](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/f874b45e909c4bb0acdd28b3fb034a61~tplv-k3u1fbpfcp-zoom-1.image)
![HertzBeat](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/ef5d7443f8c04818ae5aa28d421203be~tplv-k3u1fbpfcp-zoom-1.image)
4. 设置阈值(证书过期时触发)
> 系统页面 -> 告警 -> 告警阈值 -> 新增阈值
![HertzBeat](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/8d6205172d43463aa34e534477f132f1~tplv-k3u1fbpfcp-zoom-1.image)
> 配置阈值,选择SSL证书指标对象,配置告警表达式-当指标`expired`为`true`触发,即`equals(expired,"true")` , 设置告警级别通知模板信息等。
![HertzBeat](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/83d17b381d994f26a6240e01915b2001~tplv-k3u1fbpfcp-zoom-1.image)
> 关联阈值与监控, 在阈值列表设置此阈值应用于哪些监控。
![HertzBeat](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/9b9063d7bcf9454387be0491fc382bd1~tplv-k3u1fbpfcp-zoom-1.image)
5. 设置阈值(证书过期前一周触发)
> 同理如上,新增配置阈值,配置告警表达式-当指标有效期时间戳 `end_timestamp``now()`函数为当前时间戳,若配置提前一周触发告警即:`end_timestamp <= (now() + 604800000)` , 其中 `604800000` 为7天总时间差毫秒值。
![HertzBeat](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/0d6f837f57c247e09f668f60eff4a0ff~tplv-k3u1fbpfcp-zoom-1.image)
> 最终可以在告警中心看到已触发的告警。
![HertzBeat](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/5a61b23127524976b2c209ce0ca6a339~tplv-k3u1fbpfcp-zoom-1.image)
6. 告警通知(通过钉钉微信飞书等及时通知)
> 监控系统 -> 告警通知 -> 新增接收人
![HertzBeat](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/7f36956060ef410a82bbecafcbb2957f~tplv-k3u1fbpfcp-zoom-1.image)
钉钉微信飞书等token配置可以参考帮助文档
[https://hertzbeat.apache.org/docs/help/alert_dingtalk](https://hertzbeat.apache.org/docs/help/alert_dingtalk)
[https://tancloud.cn/docs/help/alert_dingtalk](https://tancloud.cn/docs/help/alert_dingtalk)
> 告警通知 -> 新增告警通知策略 -> 将刚才配置的接收人启用通知
![HertzBeat](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/d976343e81f843138344a039f3aff8a3~tplv-k3u1fbpfcp-zoom-1.image)
7. OK 当阈值触发后我们就可以收到对应告警消息啦,如果没有配通知,也可以在告警中心查看告警信息。
----
#### 完
监控SSL证书的实践就到这里,当然对hertzbeat来说这个功能只是冰山一角,如果您觉得hertzbeat这个开源项目不错的话欢迎给我们在GitHub Gitee star哦,灰常感谢。感谢老铁们的支持。笔芯!
**github: [https://github.com/apache/hertzbeat](https://github.com/apache/hertzbeat)**
**gitee: [https://gitee.com/hertzbeat/hertzbeat](https://gitee.com/hertzbeat/hertzbeat)**
@@ -0,0 +1,81 @@
---
title: HertzBeat v1.2.0 发布!易用友好的开源实时监控工具
author: tom
author_title: tom
author_url: https://github.com/tomsun28
tags: [opensource]
---
## V1.2.0
官网: hertzbeat.com | tancloud.cn
大家好,HertzBeat v1.2.0 发布啦!这个版本支持了更强大的jsonpath去采集自定义监控指标,将springboot版本升级到2.7,支持指标单位的提取转换展示等。修复了若干bug,提升整体稳定性。
只需要一条docker命令即可安装体验heartbeat
`docker run -d -p 1157:1157 --name hertzbeat apache/hertzbeat`
感谢hertzbeat贡献者们的贡献!👍👍 @Ceilzcx @Privauto @VampireAchao @DreamGirl524 @CharlieXCL @emrys-he @SxLiuYu @tomsun28
我们急需对测试用例,新增应用监控,文档等各方面的贡献者,非常欢迎您的加入。快来吧,HertzBeat上手非常简单!
Feature
1. [[home,manager]add practice learn doc and hertzbeat monitor yml #284](https://github.com/apache/hertzbeat/pull/284)
2. [[webapp] auto redirect url when detect browser language #289](https://github.com/apache/hertzbeat/pull/289) contribute by @DreamGirl524
3. [[home] update logo icon cdn url with fault tolerance #293](https://github.com/apache/hertzbeat/pull/293) contribute by @VampireAchao
4. [[monitor] enable powerful jsonpath parser, add es metrics #295](https://github.com/apache/hertzbeat/pull/295) contribute by @Ceilzcx
5. [[webapp] update ui theme #296](https://github.com/apache/hertzbeat/pull/296)
6. [Feature change main pom artifactId #300](https://github.com/apache/hertzbeat/pull/300) contribute by @Privauto
7. [[home,webapp] add users logo and update hertzbeat brand #302](https://github.com/apache/hertzbeat/pull/302)
8. [[monitor] alerter notify test throw msg to front, optional spring.email config #305](https://github.com/apache/hertzbeat/pull/305) contribute by @Ceilzcx
9. [[home]doc:update docker-deploy.md and tdengine-init.md #306](https://github.com/apache/hertzbeat/pull/306) contribute by @Privauto
10. [[hertzbeat] refactor common collect metrics data and alert data queue #320](https://github.com/apache/hertzbeat/pull/320)
11. [[hertzbeat] upgrade springboot version 2.4.13 to 2.7.4 #316](https://github.com/apache/hertzbeat/pull/316) contribute by @Privauto
12. [[web-app] optimize the monitor detect feedback method #322](https://github.com/apache/hertzbeat/pull/322)
13. [[github,webapp] add webapp ci action, fix eslint warning and upgrade codeql #323](https://github.com/apache/hertzbeat/pull/323)
14. [[hertzbeat] add more unit test and test example #324](https://github.com/apache/hertzbeat/pull/324)
15. [support metrics unit extract, convert and display #326](https://github.com/apache/hertzbeat/pull/326) contribute by @Ceilzcx
16. [[common] optimize common aviator configuration #327](https://github.com/apache/hertzbeat/pull/327)
Bugfix.
1. [[webapp,home] fix middle category icon and update home doc #283](https://github.com/apache/hertzbeat/pull/283)
2. [[web-app] fix redirect when monitors app is null #286](https://github.com/apache/hertzbeat/pull/286)
3. [[alerter] bugfix aviator expression match npe #297](https://github.com/apache/hertzbeat/pull/297)
4. [[doc] fix project name error #294](https://github.com/apache/hertzbeat/pull/294) contribute by @CharlieXCL
5. [[common]feature:use "apache.http.conn.util" replace "sun.net.util" for upgrading java version #299](https://github.com/apache/hertzbeat/pull/299) contribute by @Privauto
6. [Update docker-deploy.md #304](https://github.com/apache/hertzbeat/pull/304) contribute by @emrys-he
7. [fix(sec): upgrade snakeyaml to 1.31 #313](https://github.com/apache/hertzbeat/pull/313) contribute by @SxLiuYu
8. [[script] add startup log and optimize port service judgment #321](https://github.com/apache/hertzbeat/pull/321)
9. [[web-app] fix echarts y-axis value tip overflow #325](https://github.com/apache/hertzbeat/pull/325)
10. [[webapp] fix interceptor http resp common error-msg when error #329](https://github.com/apache/hertzbeat/pull/329)
Online [https://console.tancloud.cn](https://console.tancloud.cn).
Have Fun!
### 升级注意⚠️
需要将配置文件内容 `application.yml`
```yaml
spring:
resources:
static-locations:
- classpath:/dist/
- classpath:../dist/
```
变更为
```yaml
spring:
web:
resources:
static-locations:
- classpath:/dist/
- classpath:../dist/
```
----
@@ -0,0 +1,52 @@
---
title: HertzBeat v1.2.2 发布!新增K8S监控等众多特性
author: tom
author_title: tom
author_url: https://github.com/tomsun28
tags: [opensource]
---
## V1.2.2
官网: hertzbeat.com | tancloud.cn
大家好,HertzBeat v1.2.2发布啦!这个版本带来个超多重大更新,我们支持了对云原生kubernets, docker的监控,支持了对springboot应用, nacos注册发现中心,达梦数据库,opengauss数据库等的指标监控。我们也引入了一个实验性特性,用户可以使用promethues promql 从promethues server拿取指标数据作为hertzbeat自定义监控指标数据。当然我们也新增了多个测试用户覆盖,修复了多个BUG。还有个很多用户想要的更新,我们新增了对linux监控的top10 cpu 内存利用率的进程监控指标。有个这个指标,我们就可以干很多事情。比如监控某个进程CPU异常,内存爆满啥的。快来试试吧!
只需要一条docker命令即可安装体验heartbeat
`docker run -d -p 1157:1157 --name hertzbeat apache/hertzbeat`
感谢hertzbeat贡献者们的贡献!👍👍
我们急需对测试用例,新增应用监控,文档等各方面的贡献者,非常欢迎您的加入。快来吧,HertzBeat上手非常简单!
Feature
1. [[manager,collector] support dm database monitor #410](https://github.com/apache/hertzbeat/pull/410) @TJxiaobao
2. [[home] add DM db document supplement #411](https://github.com/apache/hertzbeat/pull/411) @TJxiaobao
3. [[home] support algolia search #416](https://github.com/apache/hertzbeat/pull/416)
4. [[collector] support trigger and grading multiple subtasks through -_- placeholder expression #418](https://github.com/apache/hertzbeat/pull/418)
5. [WIP:feature support k8s monitor, http monitor nacos, service&http_micro monitor msa #421](https://github.com/apache/hertzbeat/pull/421) @cuipiheqiuqiu
6. [[manager] support opengauss database monitor #422](https://github.com/apache/hertzbeat/pull/422)
7. [[#406]\[warehose\] Add unit test MetricsDataControllerTest.java #426](https://github.com/apache/hertzbeat/pull/426) @haibo-duan
8. [[#358]\[manager\] Add unit test manager/service/NoticeConfigServiceTest.java #427](https://github.com/apache/hertzbeat/pull/427) @haibo-duan
9. [[#356]\[manager\] unit test case of manager/service/MailServiceTest.java #432](https://github.com/apache/hertzbeat/pull/432) @csyshu
10. [[manager,collector] support docker metrics monitor #438](https://github.com/apache/hertzbeat/pull/438) @TJxiaobao
11. [[alerter] implement AlertDefineControllerTest unit case #448](https://github.com/apache/hertzbeat/pull/448) @Ceilzcx
12. [[collector] support spi load AbstractCollect Impl instance #449](https://github.com/apache/hertzbeat/pull/449)
13. [[manager] support linux process top10 cpu_usage mem_usage #451](https://github.com/apache/hertzbeat/pull/451)
14. [[hertzbeat] support springboot2.0 metrics monitor #453](https://github.com/apache/hertzbeat/pull/453)
15. [[manager-monitors](增强)应用服务检测-网站检测-分页:添加默认name升序 enhancementmanager-… #455](https://github.com/apache/hertzbeat/pull/455) @luxx-lq
16. [[hertzbeat] update use PromQL to collect metrics from promethues server #456](https://github.com/apache/hertzbeat/pull/456)
17. [[manager] support custom monitor api response data code #460](https://github.com/apache/hertzbeat/pull/460)
Bugfix.
1. [【bugfix#408】if logs dir not exist, create logs dir #409](https://github.com/apache/hertzbeat/pull/409) @Ceilzcx
2. [[warehouse] bugfix RealTimeRedisDataStorage wrong extend from #413](https://github.com/apache/hertzbeat/pull/413)
3. [end The query closed the dataSet #414](https://github.com/apache/hertzbeat/pull/414) @Ceilzcx
4. [[alerter] bugfix monitor status not change when alert #415](https://github.com/apache/hertzbeat/pull/415)
5. [[OS Monitor]bugfix:Fix cpu cores and interrupt acquisition under Orac… #424](https://github.com/apache/hertzbeat/pull/424) @assassinfym
6. [[manager] bugfix the gmtUpdate not change when update monitor param #459](https://github.com/apache/hertzbeat/pull/459)
7. [[home] fix typo in springboot2.md #464](https://github.com/apache/hertzbeat/pull/464) @eltociear
----
@@ -0,0 +1,106 @@
---
title: 恭喜 HertzBeat 迎来了两位新晋社区Committer
author: tom
author_title: tom
author_url: https://github.com/tomsun28
tags: [opensource]
---
> 非常高兴 HertzBeat 迎来了两位新晋社区Committer, 两位都是来自互联网公司的开发工程师,让我们来了解下他们的开源经历吧!
## 第一位 花城
姓名:王庆华
现从事:阿里巴巴开发工程师
HertzBeat Committer
github[wang1027-wqh](https://github.com/wang1027-wqh)
### 初识hertzbeat
说起来挺偶然的,结识hertzbeat是因为我大学的毕业设计,当时在一家互联网公司实习,那个时候第一次看到了企业是怎么监控项目的,不管是系统监控、业务监控还是物联网iot监控,那个时候见世面不广,只知道Prometheus + Grafana,但是学起来、用起来成本比较高,那个时候就觉得应该有其他类型的监控,恰好,到了大学毕业设计选题,我就开始寻找这方面的开源项目,那个时候我们小组正在使用Shen Yu网关,我就看了下社区,发现了hertzbeat,自此我便于它结缘了。
### 开始提交PR
到了2022-02-18 我开始提交了我第一个pr,当时只是为了优化一些controller入参的格式,没有什么技术含量,但是这是我接触开源的第一步,让我在从理论学习跨出了实践的一步
### 持续的开源贡献与收获
到目前为止,参与hertzbeat开源项目已有半年多时间,贡献了许多,也成长收获了许多。具体如下:
1. 见证了hertzbeat的贡献值从0到1
2. 兼容了zookeeper、JVM、Kafka等监控功能
3. 实现了hertzbeat项目的国际化
4. 参与了开源之夏并顺利结项
5. 增加了监控系统的基础告警功能: 钉钉、飞书、企业微信、邮箱等
### 感谢社区小伙伴
感谢无偿帮助过我或给过我启发的小伙伴(排名不分先后):tomsun28MaxKeyTop,阿超
### 对新人的一点建议
1. 不要觉得自己一上手就能接触到核心,心急吃不了热豆腐
2. 不要只注重看代码,要上手搭建、使用
3. 有想法就大胆尝试,不管自己的方案是否完善
4. 多多关注开源,了解社区动态,多和开源开发者交流
---
---
## 第二位 星辰
姓名:郑晨鑫
现从事:某互联网公司Java开发工程师
email[1758619238@qq.com](mailto:1758619238@qq.com)
HertzBeat Committer
github[Ceilzcx (zcx) (github.com)](https://github.com/Ceilzcx)
### 初识HertzBeat
2022年8月开始接触HertzBeat,由于公司监控elasticsearch使用的cerebro,虽然有非常强大的数据监控,但缺少告警通知的功能;就去github上浏览监控类的项目,刚好看到HertzBeat,对此非常感兴趣,在了解完整个项目结构和实现后,刚好elasticsearch的监控部分做的不够完善,我就根据cerebro完善了这部分监控数据并提交了pull request。后面在tom老哥的帮助下也开始其他部分的实现。
### 开始提交PR
从2022年9月至今提交了好几个pr,主要包括:
+ Json解析功能的增量,elasticsearch的数据监控增强
+ 实现监控数据添加单位
+ spring.mail改为非必填,优化部分告警阈值的返回处理
+ 实现IoTDB的时序数据库
+ 一些bug的修复。。。
+ promethues exporter 协议解析
### 持续的开源贡献与收获
到目前为止,参与HertzBeat社区开源已有半年多时间,贡献了许多,也成长收获了许多。
在参与开源的时候会比平常自己做项目想的更多,包括使用第三方软件各个版本如何兼容;实现某个功能也要考虑是否方便以后扩展;要有完善的test模块,减少项目的bug。
同时在社区群里,看到别人提的问题和帮助别人可以学到很多新的知识,很多问题你目前不一定会遇到,其他人遇到的时候你可以思考并收获很多知识。
### 感谢社区小伙伴
感谢无偿帮助过我或给过我启发的小伙伴:[tomsun28](https://github.com/tomsun28)
### 对新人的一点建议
+ 使用者可以先看官网,官网基本能够解决你的问题。部分简单或者常见的问题其他可以自己解决,对自己也是一种锻炼
+ 可以尝试阅读源码,大部分源码都是包含注释的,并不难;不懂的地方也可以通过运行test,debug看一下整个流程
+ 有想法或者bug,可以前往gitee或者github提交issues,也可以在群里询问,不要怕,都是从菜逼过来的
### 如何参与HertzBeat
+ 官网有非常完善的贡献者指南:[贡献者指南 | HertzBeat](https://hertzbeat.apache.org/docs/community/contribution)
+ Github issues[Issues · apache/hertzbeat (github.com)](https://github.com/apache/hertzbeat/issues)
+ 如果是大的改动,建议提交前编写issues,在提交pr,同时请注意编码的规范,尽量减少bug和警告的产生
> 以上就是我们新晋Committer们的开源经历了,可以看出参与开源并不难,更重要的是迈出第一步,无论是代码还是文档修复或者提交issue,这些都是贡献者参与开源的姿势。快来加入我们吧!
@@ -0,0 +1,49 @@
---
title: HertzBeat v1.2.3 发布!支持Prometheus,ShenYu,IotDb
author: tom
author_title: tom
author_url: https://github.com/tomsun28
tags: [opensource]
---
## V1.2.3
官网: hertzbeat.com | tancloud.cn
大家好,HertzBeat v1.2.3发布啦!这个版本带来了重大更新,我们支持了对prometheus exporter协议监控,用户可以很方便的使用hertzbeat来适配监控prometheus exporter. 基于这个能力,这个版本我们也支持了对apache shenyu, apache iotdb的指标监控。我们更新了UI布局,修复了多个BUG,也支持了短信通知。快来体验下吧!
只需要一条docker命令即可安装体验heartbeat
`docker run -d -p 1157:1157 --name hertzbeat apache/hertzbeat`
感谢hertzbeat贡献者们的贡献!👍👍
我们急需对测试用例,新增应用监控,文档等各方面的贡献者,非常欢迎您的加入。快来吧,HertzBeat上手非常简单!
Feature
1. [[doc] note: startup via source code not required mysql and tdengine env #472](https://github.com/apache/hertzbeat/pull/472) @xingshuaiLi
2. [[doc] fix up:update the environment of hertzbeat to Java version 11 #473](https://github.com/apache/hertzbeat/pull/473) @BKing2020
3. [[docs] update kubernetes.md #478](https://github.com/apache/hertzbeat/pull/478) @wangke6666
4. [[web-app] enable alert define preset true by default #485](https://github.com/apache/hertzbeat/pull/485)
5. [[web-app] support friendly tip when add notice receiver #486](https://github.com/apache/hertzbeat/pull/486)
6. [[web-app] update dashboard category card ui #487](https://github.com/apache/hertzbeat/pull/487)
7. [[collector] limit trigger sub task max num #488](https://github.com/apache/hertzbeat/pull/488)
8. [[script] support service restart shell #489](https://github.com/apache/hertzbeat/pull/489) @zanglikun
9. [[docs] use rainbond deploy hertzbeat #495](https://github.com/apache/hertzbeat/pull/495) @zzzhangqi
10. [[webapp] upgrade web base angular version to 14 #501](https://github.com/apache/hertzbeat/pull/501)
11. [[hertzbeat] support sms alert notice #503](https://github.com/apache/hertzbeat/pull/503)
12. [add Prometheus exporter metrics parser and IoTDB monitor #505](https://github.com/apache/hertzbeat/pull/505) @Ceilzcx
13. [support apache shenyu metrics monitoring #507](https://github.com/apache/hertzbeat/pull/507)
Bugfix.
1. [[manager] fix cross domain problem in SecurityCorsConfiguration #469](https://github.com/apache/hertzbeat/pull/469) @zenan08
2. [[manager] bugfix linux cpu usage collect incorrect sometime #479](https://github.com/apache/hertzbeat/pull/479) @LWBobo
3. [[collector] fix protocol ssl_cert not support #491](https://github.com/apache/hertzbeat/pull/491)
4. [Update sqlserver.md #493](https://github.com/apache/hertzbeat/pull/493) @SuitSmile
5. [fix: Remove Alert Unused Monitoring IDs #502](https://github.com/apache/hertzbeat/pull/502) @wang1027-wqh
6. [[collector] bugfix npe when ssh collect error #508](https://github.com/apache/hertzbeat/pull/508)
7. [监控k8s问题issue描述与解决方案 #511](https://github.com/apache/hertzbeat/pull/511) @MrAndyMing
8. [[manager] springboot2 monitor support base path config #515](https://github.com/apache/hertzbeat/pull/515)
----
@@ -0,0 +1,134 @@
---
title: 使用 HertzBeat 对物联网数据库 IoTDB 进行监控实践
author: tom
author_title: tom
author_url: https://github.com/tomsun28
tags: [opensource, practice]
keywords: [开源监控系统, 开源数据库监控, IotDB数据库监控]
---
## 使用 HertzBeat 对物联网数据库 IoTDB 进行监控实践,5分钟搞定
### IoTDB 介绍
> Apache IoTDB (Internet of Things Database) 是一款时序数据库管理系统,可以为用户提供数据收集、存储和分析等服务。
> IoTDB由于其轻量级架构、高性能和高可用的特性,以及与 Hadoop 和 Spark 生态的无缝集成,满足了工业 IoT 领域中海量数据存储、高吞吐量数据写入和复杂数据查询分析的需求。
### HertzBeat 介绍
> HertzBeat 是一款开源,易用友好的实时监控工具,无需Agent,拥有强大自定义监控能力。
> 支持对应用服务,数据库,操作系统,中间件,云原生等监控,阈值告警,告警通知(邮件微信钉钉飞书)。
> HertzBeat 的强大自定义,多类型支持,易扩展,低耦合,希望能帮助开发者和中小团队快速搭建自有监控系统。
### 在 HertzBeat 5分钟搞定监控 IoTDB
#### 操作前提,您已拥有 IoTDB 环境和 HertzBeat 环境
- IoTDB [部署安装文档](https://iotdb.apache.org/UserGuide/V0.13.x/QuickStart/QuickStart.html)
- HertzBeat [部署安装文档](https://hertzbeat.apache.org/docs/start/docker-deploy)
#### 一. 在 IoTDB 端开启`metrics`功能,它将提供 prometheus metrics 形式的接口数据
1. metric 采集默认是关闭的,需要先到 `conf/iotdb-metric.yml` 中修改参数打开后重启 server
```yaml
# 是否启动监控模块,默认为false
enableMetric: true
# 数据提供方式,对外部通过jmx和prometheus协议提供metrics的数据, 可选参数:[JMX, PROMETHEUS, IOTDB],IOTDB是默认关闭的。
metricReporterList:
- JMX
- PROMETHEUS
```
2. 重启 IoTDB, 打开浏览器或者用curl 访问 [http://ip:9091/metrics](http://ip:9091/metrics), 就能看到metric数据了。
#### 二. 在 HertzBeat 监控页面添加 IoTDB 监控
1. 点击新增IoTDB监控
路径:菜单 -> 数据库监控 -> IoTDB监控 -> 新增IoTDB监控
![HertzBeat](/img/blog/monitor-iotdb-1.png)
2. 配置监控IoTDB所需参数
在监控页面填写 IoTDB **服务IP****监控端口**(默认9091),最后点击确定添加即可。
其他参数如**采集间隔**,**超时时间**等可以参考[帮助文档](https://hertzbeat.apache.org/docs/help/iotdb/) [https://hertzbeat.apache.org/docs/help/iotdb/](https://hertzbeat.apache.org/docs/help/iotdb/)
![HertzBeat](/img/blog/monitor-iotdb-2.png)
3. 完成✅,现在我们已经添加好对 IoTDB 的监控了,查看监控列表即可看到我们的添加项。
![HertzBeat](/img/blog/monitor-iotdb-3.png)
4. 点击监控列表项的**操作**->**监控详情图标** 即可浏览 IoTDB的实时监控指标数据。
![HertzBeat](/img/blog/monitor-iotdb-4.png)
5. 点击**监控历史详情TAB** 即可浏览 IoTDB的历史监控指标数据图表📈。
![HertzBeat](/img/blog/monitor-iotdb-5.png)
**完成DONE!通过上面几步,总结起来其实也就是两步**
- **一步开启 IoTDB 端`metrics`功能**
- **另一步在 HertzBeat 监控页面配置IP端口添加监控即可**
**这样我们就完成了对 IoTDB 的监控,我们可以随时查看监控详情指标信息来观测其服务状态,但人不可能是一直去看,总有要休息的时候,监控往往伴随着告警,当监控指标发生异常,监控系统需要能及时通知到负责人**
**接下来我们就来一步一步教您配置 HertzBeat 系统里的阈值告警通知**
#### 三. 在 HertzBeat 系统添加 IoTDB 指标阈值告警
1. 对某个重要指标配置阈值告警
路径:菜单 -> 告警阈值 -> 新增阈值
- 选择配置的指标对象,IotDB监控有非常多的指标,其中有个指标关系到节点的状态 `cluster_node_status` -> `status` (节点状态,1=online 2=offline)。
- 这里我们就配置当此指标 `status==2` 时发出告警,告警级别为**紧急告警**,一次即触发,具体如下图。
![HertzBeat](/img/blog/monitor-iotdb-6.png)
2. 新增消息通知接收人
路径:菜单 -> 告警通知 -> 告警接收人 -> 新增接收人
消息通知方式支持 **邮件,钉钉,企业微信,飞书,WebHook,短信**等,我们这里以常用的钉钉为例。
- 参照此[帮助文档](https://hertzbeat.apache.org/docs/help/alert_dingtalk) [https://hertzbeat.apache.org/docs/help/alert_dingtalk](https://hertzbeat.apache.org/docs/help/alert_dingtalk) 在钉钉端配置机器人,设置安全自定义关键词`HertzBeat`,获取对应`access_token`值。
- 在 HertzBeat 配置接收人参数如下。
【告警通知】->【新增接收人】 ->【选择钉钉机器人通知方式】->【设置钉钉机器人ACCESS_TOKEN】-> 【确定】
![HertzBeat](/img/blog/alert-notice-1.png)
3. 配置关联的告警通知策略⚠️ 【新增通知策略】-> 【将刚设置的接收人关联】-> 【确定】
![HertzBeat](/img/blog/alert-notice-2.png)
### 完毕,现在坐等告警消息过来了。叮叮叮叮
```text
[HertzBeat告警通知]
告警目标对象 : iotdb.cluster_node_status.status
所属监控任务ID : 205540620349696
所属任务名称 : IOTDB_localhost
告警级别 : 紧急告警
告警触发时间 : 2023-01-05 22:17:06
内容详情 : 监控到 IOTDB 节点 127.0.0.1 状态 OFFLINE, 请及时处理。
```
## 小结
这篇实践文章带我们体验了如何使用 HertzBeat 监控 IoTDB 数据库指标数据,可以发现将 监控-告警-通知 集一体的 HertzBeat 在操作与使用方面更加的便捷,在页面上简单点一点就能把 IoTDB 纳入监控,再也不需要部署多个组件,写多个有门槛的YML配置文件了。
IoTDB Github: [https://github.com/apache/iotdb](https://github.com/apache/iotdb)
HertzBeat Github: [https://github.com/apache/hertzbeat](https://github.com/apache/hertzbeat)
**欢迎了解使用Star支持哦!**
只需要一条docker命令即可安装体验heartbeat
`docker run -d -p 1157:1157 --name hertzbeat apache/hertzbeat`
注意⚠️HertzBeat v1.2.3 版本支持 IoTDB v0.12 v0.13, 由于其v1.0刚发布, 暂未对此版本全部指标兼容。
@@ -0,0 +1,165 @@
---
title: 使用 HertzBeat 对 API 网关 Apache ShenYu 的监控实践
author: tom
author_title: tom
author_url: https://github.com/tomsun28
tags: [opensource, practice]
---
## 使用 HertzBeat 对 API 网关 Apache ShenYu 进行监控实践,5分钟搞定
### Apache ShenYu 介绍
> Apache ShenYu 一个异步的,高性能的,跨语言的,响应式的 API 网关。
- 代理:支持Apache DubboSpring CloudgRPCMotanSOFATARSWebSocketMQTT
- 安全性:签名,OAuth 2.0JSON Web令牌,WAF插件
- API治理:请求、响应、参数映射、Hystrix、RateLimiter插件
- 可观测性:跟踪、指标、日志记录插件
- 仪表板:动态流量控制,用户菜单权限的可视化后端
- 扩展:插件热插拔,动态加载
- 集群:NGINX、Docker、Kubernetes
- 语言:提供.NETPythonGoJava客户端用于API注册
### HertzBeat 介绍
> HertzBeat 是一款开源,易用友好的实时监控工具,无需Agent,拥有强大自定义监控能力。
> 支持对应用服务,数据库,操作系统,中间件,云原生等监控,阈值告警,告警通知(邮件微信钉钉飞书)。
> HertzBeat 的强大自定义,多类型支持,易扩展,低耦合,希望能帮助开发者和中小团队快速搭建自有监控系统。
### 在 HertzBeat 5分钟搞定监控 Apache ShenYu
#### 操作前提,您已拥有 ShenYu 环境和 HertzBeat 环境
- ShenYu [部署安装文档](https://shenyu.apache.org/zh/docs/deployment/deployment-before)
- HertzBeat [部署安装文档](https://hertzbeat.apache.org/docs/start/docker-deploy)
#### 一. 在 ShenYu 端开启`metrics`插件,它将提供 metrics 接口数据
> 插件是 Apache ShenYu 网关的核心执行者,指标数据采集在 `ShenYu` 也是以插件的形式集成的 - `Metrics插件`。
> `Metrics插件`是网关用来监控自身运行状态(`JVM`相关),请求响应等相关指标进行监测。
1. 在网关的 `pom.xml` 文件中添加 `metrics插件` 的依赖。
```xml
`<dependency>`
`<groupId>`org.apache.shenyu`</groupId>`
`<artifactId>`shenyu-spring-boot-starter-plugin-metrics`</artifactId>`
`<version>`${project.version}`</version>`
`</dependency>`
```
2. `metric`插件 采集默认是关闭的, 在网关的配置`yaml`文件中编辑如下内容:
```yaml
shenyu:
metrics:
enabled: true #设置为 true 表示开启
name : prometheus
host: 127.0.0.1 #暴露的ip
port: 8090 #暴露的端口
jmxConfig: #jmx配置
props:
jvm_enabled: true #开启jvm的监控指标
```
3. 重启 ShenYu网关, 打开浏览器或者用curl 访问 `http://ip:8090`, 就能看到metric数据了。
#### 二. 在 HertzBeat 监控页面添加 ShenYu 监控
1. 点击新增 ShenYu 监控
路径:菜单 -> 中间件监控 -> ShenYu监控 -> 新增ShenYu监控
![HertzBeat](/img/blog/monitor-shenyu-1.png)
2. 配置监控 ShenYu 所需参数
在监控页面填写 ShenYu **服务IP****监控端口**(默认8090),最后点击确定添加即可。
其他参数如**采集间隔**,**超时时间**等可以参考[帮助文档](https://hertzbeat.apache.org/docs/help/shenyu/) [https://hertzbeat.apache.org/docs/help/shenyu/](https://hertzbeat.apache.org/docs/help/shenyu/)
![HertzBeat](/img/blog/monitor-shenyu-1.png)
3. 完成✅,现在我们已经添加好对 ShenYu 的监控了,查看监控列表即可看到我们的添加项。
![HertzBeat](/img/blog/monitor-shenyu-3.png)
4. 点击监控列表项的**操作**->**监控详情图标** 即可浏览 ShenYu 的实时监控指标数据。
![HertzBeat](/img/blog/monitor-shenyu-4.png)
5. 点击**监控历史详情TAB** 即可浏览 ShenYu 的历史监控指标数据图表📈。
![HertzBeat](/img/blog/monitor-shenyu-5.png)
![HertzBeat](/img/blog/monitor-shenyu-6.png)
**DONE!完成啦!通过上面几步,总结起来其实也就只用两步**
- **第一步开启 ShenYu 端`metrics`插件功能**
- **第二步在 HertzBeat 监控页面配置IP端口添加监控即可**
:::tip
通过上面的两步我们就完成了对 Apache ShenYu 的监控,我们可以在 HertzBeat 随时查看监控详情指标信息来观测其服务状态。
当然只是看肯定是不完美的,监控往往伴随着告警阈值,当 ShenYu 的某些指标超出我们的期望值或异常时,能及时的通知到我们对应的负责人,负责人收到通知处理问题,这样才是一个完整的监控告警流程。
:::
**接下来我们就来一步一步演示如何配置 HertzBeat 系统里的阈值告警通知,让 ShenYu 的指标异常时,及时通知给我们**
#### 三. 在 HertzBeat 系统添加 ShenYu 指标阈值告警
1. 对某个重要指标配置告警阈值
路径:菜单 -> 告警阈值 -> 新增阈值
- 选择配置的指标对象,ShenYu 监控有非常多的指标,我们举例对 `打开的文件描述符的数量` `process_open_fds` -> `value` 这个指标进行阈值设置, 当服务端打开文件描述符数量大于3000时发出告警。
- 这里我们就配置当此指标`process_open_fds` 的 `value>3000` 时发出告警,告警级别为**警告告警**,三次即触发,具体如下图。
![HertzBeat](/img/blog/monitor-shenyu-7.png)
2. 新增消息通知接收人
> 配置接收人,让告警消息知道要发给谁,用什么方式发。
路径:菜单 -> 告警通知 -> 告警接收人 -> 新增接收人
消息通知方式支持 **邮件,钉钉,企业微信,飞书,WebHook,短信**等,我们这里以常用的钉钉为例。
- 参照此[帮助文档](https://hertzbeat.apache.org/docs/help/alert_dingtalk) [https://hertzbeat.apache.org/docs/help/alert_dingtalk](https://hertzbeat.apache.org/docs/help/alert_dingtalk) 在钉钉端配置机器人,设置安全自定义关键词`HertzBeat`,获取对应`access_token`值。
- 在 HertzBeat 配置接收人参数如下。
【告警通知】->【新增接收人】 ->【选择钉钉机器人通知方式】->【设置钉钉机器人ACCESS_TOKEN】-> 【确定】
![HertzBeat](/img/blog/alert-notice-1.png)
3. 配置关联的告警通知策略⚠️ 【新增通知策略】-> 【将刚设置的接收人关联】-> 【确定】
> 配置告警通知策略,让告警消息与接收人绑定,这样就能决定哪些告警发给哪个人。
![HertzBeat](/img/blog/alert-notice-2.png)
### 完毕,现在坐等告警消息过来啦。叮叮叮叮
```text
[HertzBeat告警通知]
告警目标对象 : shenyu.process_open_fds.value
所属监控任务ID : 205540620349696
所属任务名称 : SHENYU_localhost
告警级别 : 警告告警
告警触发时间 : 2023-01-08 22:17:06
内容详情 : 请注意⚠️ ShenYu网关打开的文件描述符的数量为 3044 超过3000
```
## 小结
:::tip
这篇实践文章带我们体验了如何使用 HertzBeat 监控 Apache ShenYu 指标数据,可以发现将 `监控-告警-通知` 集一体的 HertzBeat 在操作与使用方面更加的便捷,在页面上简单点一点就能把 ShenYu 纳入监控,再也不需要部署多个组件,写多个有门槛的YML配置文件了。
:::
Apache ShenYu Github: [https://github.com/apache/shenyu](https://github.com/apache/shenyu)
HertzBeat Github: [https://github.com/apache/hertzbeat](https://github.com/apache/hertzbeat)
**欢迎了解使用Star支持哦!**
只需要一条docker命令即可安装体验heartbeat
`docker run -d -p 1157:1157 --name hertzbeat apache/hertzbeat`
@@ -0,0 +1,177 @@
---
title: 使用 HertzBeat 对 线程池框架 DynamicTp 的监控实践
author: tom
author_title: tom
author_url: https://github.com/tomsun28
tags: [opensource, practice]
---
## 使用 HertzBeat 对 线程池框架 DynamicTp 进行监控实践,5分钟搞定
### 线程池框架 DynamicTp 介绍
> DynamicTp 是Jvm语言的基于配置中心的轻量级动态线程池,内置监控告警功能,可通过SPI自定义扩展实现。
- 支持对运行中线程池参数的动态修改,实时生效。
- 实时监控线程池的运行状态,触发设置的报警策略时报警,报警信息推送办公平台。
- 定时采集线程池指标数据,配合像 grafana 这种可视化监控平台做大盘监控。
### HertzBeat 介绍
> HertzBeat 是一款开源,易用友好的实时监控工具,无需Agent,拥有强大自定义监控能力。
- 支持对应用服务,数据库,操作系统,中间件,云原生等监控,阈值告警,告警通知(邮件微信钉钉飞书短信 Slack Discord Telegram)。
- 其将Http, Jmx, Ssh, Snmp, Jdbc, Prometheus等协议规范可配置化,只需配置YML就能使用这些协议去自定义采集任何您想要采集的指标。您相信只需配置YML就能立刻适配一个K8s或Docker等新的监控类型吗?
- HertzBeat 的强大自定义,多类型支持,易扩展,低耦合,希望能帮助开发者和中小团队快速搭建自有监控系统。
### 在 HertzBeat 5分钟搞定监控 DynamicTp
#### 操作前提,您已拥有 DynamicTp 环境和 HertzBeat 环境
- DynamicTp [集成接入文档](https://dynamictp.cn/guide/use/quick-start.html)
- HertzBeat [部署安装文档](https://hertzbeat.apache.org/docs/start/docker-deploy)
#### 一. 在 DynamicTp 端暴露出`DynamicTp`指标接口 `/actuator/dynamic-tp`,它将提供 metrics 接口数据
1. 开启 SpringBoot Actuator Endpoint 暴露出`DynamicTp`指标接口
```yaml
management:
endpoints:
web:
exposure:
include: '*'
```
2. 重启后测试访问指标接口 `ip:port/actuator/dynamic-tp` 是否有响应json数据如下:
```json
[
{
"poolName": "commonExecutor",
"corePoolSize": 1,
"maximumPoolSize": 1,
"queueType": "LinkedBlockingQueue",
"queueCapacity": 2147483647,
"queueSize": 0,
"fair": false,
"queueRemainingCapacity": 2147483647,
"activeCount": 0,
"taskCount": 0,
"completedTaskCount": 0,
"largestPoolSize": 0,
"poolSize": 0,
"waitTaskCount": 0,
"rejectCount": 0,
"rejectHandlerName": null,
"dynamic": false,
"runTimeoutCount": 0,
"queueTimeoutCount": 0
},
{
"maxMemory": "4 GB",
"totalMemory": "444 MB",
"freeMemory": "250.34 MB",
"usableMemory": "3.81 GB"
}
]
```
#### 二. 在 HertzBeat 监控页面添加 DynamicTp 线程池监控
1. 点击新增 DynamicTp 监控
路径:菜单 -> 中间件监控 -> DynamicTp监控 -> 新增DynamicTp监控
![HertzBeat](/img/blog/monitor-dynamic-tp-1.png)
2. 配置监控 DynamicTp 所需参数
在监控页面填写 DynamicTp **服务IP****监控端口**(默认8080),最后点击确定添加即可。
其他参数如**采集间隔**,**超时时间**等可以参考[帮助文档](https://hertzbeat.apache.org/docs/help/dynamic_tp/) [https://hertzbeat.apache.org/docs/help/dynamic_tp/](https://hertzbeat.apache.org/docs/help/dynamic_tp/)
![HertzBeat](/img/blog/monitor-dynamic-tp-2.png)
3. 完成✅,现在我们已经添加好对 DynamicTp 的监控了,查看监控列表即可看到我们的添加项。
![HertzBeat](/img/blog/monitor-dynamic-tp-1.png)
4. 点击监控列表项的**操作**->**监控详情图标** 即可浏览 DynamicTp线程池 的实时监控指标数据。
![HertzBeat](/img/blog/monitor-dynamic-tp-3.png)
5. 点击**监控历史详情TAB** 即可浏览 DynamicTp线程池 的历史监控指标数据图表📈。
![HertzBeat](/img/blog/monitor-dynamic-tp-4.png)
![HertzBeat](/img/blog/monitor-dynamic-tp-5.png)
**DONE!完成啦!通过上面几步,总结起来其实也就只用两步**
- **第一步暴露 DynamicTp 端`metrics`端点`/actuator/dynamic-tp`**
- **第二步在 HertzBeat 监控页面配置IP端口添加监控即可**
:::tip
通过上面的两步我们就完成了对 DynamicTp 的监控,我们可以在 HertzBeat 随时查看监控详情指标信息来观测其服务状态。
当然只是看肯定是不完美的,监控往往伴随着告警阈值,当 DynamicTp 的线程池指标超出我们的期望值或异常时,能及时的通知到我们对应的负责人,负责人收到通知处理问题,这样才是一个完整的监控告警流程。
:::
**接下来我们就来一步一步演示如何配置 HertzBeat 系统里的阈值告警通知,让 DynamicTp线程池 的指标异常时,及时通知给我们**
#### 三. 在 HertzBeat 系统添加 DynamicTp线程池 指标阈值告警
1. 对某个重要指标配置告警阈值
路径:菜单 -> 告警阈值 -> 新增阈值
- 选择配置的指标对象,DynamicTp监控主要是一些线程池相关指标,我们举例对 `运行超时线程数量` `thread_pool_running` -> `run_timeout_count` 这个指标进行阈值设置, 当线程运行超时数量大于1时发出告警。
- 这里我们就配置当此指标`thread_pool_running` 的 `run_timeout_count>1` 时发出告警,告警级别为**严重告警**,三次即触发,具体如下图。
![HertzBeat](/img/blog/monitor-dynamic-tp-6.png)
2. 新增消息通知接收人
> 配置接收人,让告警消息知道要发给谁,用什么方式发。
路径:菜单 -> 告警通知 -> 告警接收人 -> 新增接收人
消息通知方式支持 **邮件,钉钉,企业微信,飞书,WebHook,短信**等,我们这里以常用的钉钉为例。
- 参照此[帮助文档](https://hertzbeat.apache.org/docs/help/alert_dingtalk) [https://hertzbeat.apache.org/docs/help/alert_dingtalk](https://hertzbeat.apache.org/docs/help/alert_dingtalk) 在钉钉端配置机器人,设置安全自定义关键词`HertzBeat`,获取对应`access_token`值。
- 在 HertzBeat 配置接收人参数如下。
【告警通知】->【新增接收人】 ->【选择钉钉机器人通知方式】->【设置钉钉机器人ACCESS_TOKEN】-> 【确定】
![HertzBeat](/img/blog/alert-notice-1.png)
3. 配置关联的告警通知策略⚠️ 【新增通知策略】-> 【将刚设置的接收人关联】-> 【确定】
> 配置告警通知策略,让告警消息与接收人绑定,这样就能决定哪些告警发给哪个人。
![HertzBeat](/img/blog/alert-notice-2.png)
### 完毕,现在坐等告警消息过来啦。叮叮叮叮
```text
[HertzBeat告警通知]
告警目标对象 : dynamic_tp.thread_pool_running.run_timeout_count
所属监控任务ID : 205540620349493
所属任务名称 : DynamicTp_localhost
告警级别 : 严重告警
告警触发时间 : 2023-02-02 22:17:06
内容详情 : DynamicTp has run timeout thread, count is 2
```
## 小结
:::tip
这篇实践文章带我们体验了如何使用 HertzBeat 监控 DynamicTp线程池 指标数据,可以发现集 `监控-告警-通知` 的 HertzBeat 在操作与使用方面更加的便捷,只需页面上简单点一点就能把 DynamicTp线程池 纳入监控并告警通知,再也不需要部署多个组件写YML配置文件那些繁琐操作了。
:::
DynamicTp Github: [https://github.com/dromara/dynamic-tp](https://github.com/dromara/dynamic-tp)
HertzBeat Github: [https://github.com/apache/hertzbeat](https://github.com/apache/hertzbeat)
**欢迎了解使用Star支持哦!**
只需要一条docker命令即可安装体验heartbeat
`docker run -d -p 1157:1157 --name hertzbeat apache/hertzbeat`
@@ -0,0 +1,120 @@
---
title: 恭喜 HertzBeat 又迎来了两位新晋社区 Committer
author: tom
author_title: tom
author_url: https://github.com/tomsun28
tags: [opensource]
---
![hertzBeat](/img/blog/new-committer.png)
## 欢迎 HertzBeat 新晋两位 Committer
> 非常高兴 HertzBeat 开源社区又迎来了两位新晋社区 Committer, 有来自一线的研发小组leader,也有来自大厂的实习生,让我们来了解下他们的开源经历吧!
## 第一位 进击的阿晨
姓名:高晨
现从事:帆软软件Java研发
HertzBeat Committer
githubgcdd1993 (进击的阿晨)
### 初识HertzBeat
2022年4月开始接触HertzBeat,当时公司出现了一次宕机事故,网站无法访问,直到用户反馈才得知,急需一款能监控网站在线率,并及时告警的监控平台。浏览了几款监控平台后,最后敲定了HertzBeat,因为它功能强大,满足需求的同时还有些惊喜,最重要的是代码规范,注释清晰,技术栈吻合,便于企业二次开发。结合强大的自定义通知,我们对数据库、中间件、网站进行了监控,对公司平台的稳定运行起到了至关重要的作用。
### 开始提交PR
2022年4月17日提交了第一个PR,主要是针对使用过程发现的TDEngine时区错误的问题,虽然是简单的配置修改,但是也让我更加地了解HertzBeat,并且随着对源码的深入了解,学到了很多东西。
### 持续的开源贡献与收获
到目前为止,参与hertzbeat开源项目已有半年多时间,贡献了许多,也成长收获了许多。具体如下:
* 基于策略模式重构了告警模块
* 实现了对`Redis`数据库的指标监控
* 优化`spring.factories` 配置项
* 实现支持了 `Telegram``Discord``Slack` 的消息通知渠道
* 使用 `Thymeleaf` 重构了告警文本,告警通知模板更规范化
### 感谢社区小伙伴
感谢无偿帮助过我或给过我启发的小伙伴:tomsun28,在贡献过程中遇到的每一个问题,都能耐心指导。
### 对新人的一点建议
* HertzBeat的源码对新人非常友好,代码规范,注释丰富,非常适合作为学习项目。
* 开源贡献绝不是一蹴而就的,每一个想法,每一次疑问/解答都是一次贡献,迈出第一步才是最重要的!
## 下一位 🌻 铁甲小宝
姓名:高兴存
现从事:河南师范大学大三学生, 阿里巴巴实习
HertzBeat Committer
githubTJxiaobao
### 🌻 初识hertzbeat
首先要在这里感谢🙏花城师兄,因为当时自己想学习一些优秀的 `Java` 项目。然后在吃饭的时候向师兄请教了一下有没有好的项目推荐,恰好这时师兄把我推荐给了tom哥。当我亲自使用了 `hertzbeat` 的时候真的是发现了新的大陆,相比较于自己之前接触简单的 `Java` 项目,不论是 `hertzbeat` 的架构设计,还是它的实用功能都深深折服了我。此时一颗 `想要贡献自己的一份力量` 的种子已经在我的心中种下。
### 🌻 开始提交PR
在 Oct 20, 2022 是我第一次提交 `PR` 的时间,虽然本次 `PR` 是简单的翻译注释,看着技术含量不是很高。但是他也能让我更快的熟悉项目的业务逻辑和架构设计,能为以后的贡献打下坚实的基础。而这次 `PR` 也是我迈向开源的第一步,也是让我爱上开源的起点!
### 🌻 持续的开源贡献和收获
从第一次 `PR` 到现在,参加 `hertzbeat` 开源项目已经有一段时间了,也贡献了一小部分,也成长收获了很多。具体如下。
**贡献:**
* 1、实现对 docker 容器的监控。
* 2、完成 国产数据库 DM 监控
* 3、编写相对应业务的单测。
* 4、部分注释的英文翻译。
**收获:**
* 1、技术能力得到进一步的提升。
* 2、开阔自己的眼界。
* 3、从大佬们身上学到了很多知识。
### 🌻 感谢社区小伙伴
感谢无偿帮助过我或给过我启发的小伙伴(排名不分先后):tomsun28(tom哥),花城(师兄)
### 🌻 对新人的一点建议
首先我也是一枚新手村的萌新啦,但是我可以把我的一些经验分享给大家,希望能给大家有所帮助。
* 1、不要过于心急,要沉静身心了解各个模块的大致实现逻辑。
* 2、通过使用不同的功能,并 debug 来看看各个功能的底层实现原理。
* 3、慢慢的尝试阅读源码,并理解。
* 4、如果遇见bug,可以直接反馈到 isses,也可以自己尝试解决嘿嘿。
## What is HertzBeat?
> [HertzBeat赫兹跳动](https://github.com/apache/hertzbeat) 是一个拥有强大自定义监控能力,无需Agent的实时监控告警工具。应用服务,数据库,操作系统,中间件,云原生等监控,阈值告警,告警通知(邮件微信钉钉飞书短信 Discord Slack Telegram)。
>
> 我们将`Http, Jmx, Ssh, Snmp, Jdbc, Prometheus`等协议规范可配置化,只需配置YML就能使用这些协议去自定义采集任何您想要采集的指标。
> 您相信只需配置YML就能立刻适配一个K8s或Docker等新的监控类型吗?
>
> `HertzBeat`的强大自定义,多类型支持,易扩展,低耦合,希望能帮助开发者和中小团队快速搭建自有监控系统。
**Github: [https://github.com/apache/hertzbeat](https://github.com/apache/hertzbeat)**
**Gitee: [https://gitee.com/hertzbeat/hertzbeat](https://gitee.com/hertzbeat/hertzbeat)**
## ⛄ Supported
* 网站监控, 端口可用性, Http Api, Ping连通性, Jvm, SiteMap全站, Ssl证书, SpringBoot, FTP服务器
* Mysql, PostgreSQL, MariaDB, Redis, ElasticSearch, SqlServer, Oracle, MongoDB, 达梦, OpenGauss, ClickHouse, IoTDB
* Linux, Ubuntu, CentOS, Windows
* Tomcat, Nacos, Zookeeper, RabbitMQ, Flink, Kafka, ShenYu, DynamicTp, Jetty, ActiveMQ
* Kubernetes, Docker
* 和更多您的自定义监控。
* 通知支持 `Discord` `Slack` `Telegram` `邮件` `钉钉` `微信` `飞书` `短信` `Webhook`
@@ -0,0 +1,128 @@
---
title: 使用开源实时监控工具 HertzBeat 对 Mysql 数据库监控告警实践
author: tom
author_title: tom
author_url: https://github.com/tomsun28
tags: [opensource, practice]
keywords: [开源监控系统, 开源数据库监控, Mysql数据库监控]
---
## 使用开源实时监控工具 HertzBeat 对 Mysql 数据库监控告警实践,5分钟搞定
### Mysql 数据库介绍
> MySQL是一个开源关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的开源关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件之一。
### HertzBeat 介绍
> HertzBeat 是一款开源,易用友好的实时监控工具,无需Agent,拥有强大自定义监控能力。
- 集**监控-告警-通知为一体**,支持对应用服务,数据库,操作系统,中间件,云原生等监控,阈值告警,告警通知(邮件微信钉钉飞书短信 Slack Discord Telegram)。
- 其将Http, Jmx, Ssh, Snmp, Jdbc, Prometheus等协议规范可配置化,只需配置YML就能使用这些协议去自定义采集任何您想要采集的指标。您相信只需配置YML就能立刻适配一个K8s或Docker等新的监控类型吗?
- HertzBeat 的强大自定义,多类型支持,易扩展,低耦合,希望能帮助开发者和中小团队快速搭建自有监控系统。
### 在 HertzBeat 5分钟搞定对 Mysql 数据库监控
#### 操作前提,您已拥有 Mysql 环境和 HertzBeat 环境
- Mysql [安装部署文档](https://www.runoob.com/mysql/mysql-install.html)
- HertzBeat [安装部署文档](https://hertzbeat.apache.org/docs/start/docker-deploy)
#### 在开源监控系统 HertzBeat 监控页面添加对 Mysql 数据库监控
1. 点击新增 Mysql 监控
路径:菜单 -> 数据库监控 -> Mysql数据库 -> 新增Mysql数据库监控
![HertzBeat](/img/blog/monitor-mysql-1.png)
2. 配置新增监控 Mysql 数据库所需参数
在监控页面填写 Mysql **服务IP****监控端口**(默认3306),**账户密码等**,最后点击确定添加即可。
其他参数如**采集间隔**,**超时时间**等可以参考[帮助文档](https://hertzbeat.apache.org/docs/help/mysql/) [https://hertzbeat.apache.org/docs/help/mysql/](https://hertzbeat.apache.org/docs/help/mysql/)
![HertzBeat](/img/blog/monitor-mysql-2.png)
3. 完成✅,现在我们已经添加好对 Mysql数据库 的监控了,查看监控列表即可看到我们的添加项。
![HertzBeat](/img/blog/monitor-mysql-1.png)
4. 点击监控列表项的**操作**->**监控详情图标** 即可浏览 Mysql数据库 的实时监控指标数据。
![HertzBeat](/img/blog/monitor-mysql-3.png)
5. 点击**监控历史详情TAB** 即可浏览 Mysql数据库 的历史监控指标数据图表📈。
![HertzBeat](/img/blog/monitor-mysql-4.png)
**DONE!完成啦!通过上面几步,总结起来其实也就只用一步即可**
- **在 HertzBeat 监控页面配置IP端口账户密码添加 Mysql 监控即可**
:::tip
通过上面的两步我们就完成了对 Mysql数据库 的监控,我们可以在 HertzBeat 随时查看监控详情指标信息来观测其服务状态。
当然只是看肯定是不完美的,监控往往伴随着告警阈值,当 Mysql 数据库的指标超出我们的期望值或异常时,能及时的通知到我们对应的负责人,负责人收到通知处理问题,这样才是一个完整的监控告警流程。
:::
**接下来我们就来一步一步演示如何配置 HertzBeat 系统里的阈值告警通知,让及时发现 Mysql 数据库的指标异常时,及时通知给我们**
#### 三. 在 HertzBeat 系统添加 Mysql 数据库指标阈值告警
1. 对某个重要指标配置告警阈值
路径:菜单 -> 阈值规则 -> 新增阈值
- 选择配置的指标对象,Mysql 数据库监控主要是数据库性能等相关指标,我们举例对 `查询缓存命中率` `cache` -> `query_cache_hit_rate` 这个指标进行阈值设置, 当Mysql的查询缓存命中率很低小于30%时发出告警。
- 这里我们就配置当此指标`cache``query_cache_hit_rate<30` 时发出告警,告警级别为**严重告警**,三次即触发,具体如下图。
![HertzBeat](/img/blog/monitor-mysql-5.png)
![HertzBeat](/img/blog/monitor-mysql-6.png)
2. 新增消息通知接收人
> 配置接收人,让告警消息知道要发给谁,用什么方式发。
路径:菜单 -> 告警通知 -> 告警接收人 -> 新增接收人
消息通知方式支持 **邮件,钉钉,企业微信,飞书,WebHook,短信**等,我们这里以常用的钉钉为例。
- 参照此[帮助文档](https://hertzbeat.apache.org/docs/help/alert_dingtalk) [https://hertzbeat.apache.org/docs/help/alert_dingtalk](https://hertzbeat.apache.org/docs/help/alert_dingtalk) 在钉钉端配置机器人,设置安全自定义关键词`HertzBeat`,获取对应`access_token`值。
- 在 HertzBeat 配置接收人参数如下。
【告警通知】->【新增接收人】 ->【选择钉钉机器人通知方式】->【设置钉钉机器人ACCESS_TOKEN】-> 【确定】
![HertzBeat](/img/blog/alert-notice-1.png)
3. 配置关联的告警通知策略⚠️ 【新增通知策略】-> 【将刚设置的接收人关联】-> 【确定】
> 配置告警通知策略,让告警消息与接收人绑定,这样就能决定哪些告警发给哪个人。
![HertzBeat](/img/blog/alert-notice-2.png)
### 完毕,现在坐等告警消息过来啦。叮叮叮叮
```text
[HertzBeat告警通知]
告警目标对象 : mysql.cahce.query_cache_hit_rate
所属监控任务ID : 205540620394932
所属任务名称 : Mysql_localhost
告警级别 : 严重告警
告警触发时间 : 2023-02-11 21:13:44
内容详情 : mysql db query_cache_hit_rate is too low, now is 20.
```
## 小结
:::tip
这篇实践文章带我们体验了如何使用开源实时监控工具 HertzBeat 来监控 Mysql 数据库指标数据,可以发现集 `监控-告警-通知` 的 HertzBeat 在操作与使用方面更加的便捷,只需页面上简单点一点就能把 Mysql 数据库纳入监控并告警通知,再也不需要部署多个组件编写配置文件那些繁琐操作了。
:::
Mysql Github: [https://github.com/mysql/mysql-server](https://github.com/mysql/mysql-server)
HertzBeat Github: [https://github.com/apache/hertzbeat](https://github.com/apache/hertzbeat)
**欢迎了解使用支持Star哦!**
> 只需要一条docker命令即可安装体验heartbeat:
`docker run -d -p 1157:1157 --name hertzbeat apache/hertzbeat`
@@ -0,0 +1,206 @@
---
title: 使用开源实时监控 HertzBeat 监控 Linux 操作系统
author: tom
author_title: tom
author_url: https://github.com/tomsun28
tags: [opensource, practice]
keywords: [开源监控系统, 操作系统监控, Linux监控]
---
## 使用开源实时监控工具 HertzBeat 对 Linux 操作系统的监控告警实践,5分钟搞定
### HertzBeat 介绍
> HertzBeat 是一款开源,易用友好的实时监控工具,无需Agent,拥有强大自定义监控能力。
- 集**监控-告警-通知为一体**,支持对应用服务,数据库,操作系统,中间件,云原生等监控,阈值告警,告警通知(邮件微信钉钉飞书短信 Slack Discord Telegram)。
- 其将Http, Jmx, Ssh, Snmp, Jdbc, Prometheus等协议规范可配置化,只需配置YML就能使用这些协议去自定义采集任何您想要采集的指标。您相信只需配置YML就能立刻适配一个K8s或Docker等新的监控类型吗?
- HertzBeat 的强大自定义,多类型支持,易扩展,低耦合,希望能帮助开发者和中小团队快速搭建自有监控系统。
Github: [https://github.com/apache/hertzbeat](https://github.com/apache/hertzbeat)
### 在 HertzBeat 5分钟搞定对 Linux 的监控
#### 操作前提,您已拥有 Linux 环境和 HertzBeat 环境
- HertzBeat [安装部署文档](https://hertzbeat.apache.org/docs/start/docker-deploy)
#### 在开源监控系统 HertzBeat 监控页面添加对 Linux 操作系统监控
1. 点击新增 Linux 监控
路径:菜单 -> 操作系统监控 -> Linux操作系统 -> 新增Linux操作系统监控
![HertzBeat](/img/blog/monitor-linux-1.png)
2. 配置新增监控 Linux 所需参数
在监控页面填写 Linux **对端IP****SSH端口**(默认22),**账户密码等**,最后点击确定添加即可。
其他参数如**采集间隔**,**超时时间**等可以参考帮助文档 [https://hertzbeat.apache.org/docs/help/mysql/](https://hertzbeat.apache.org/docs/help/mysql/)
![HertzBeat](/img/blog/monitor-linux-2.png)
3. 完成✅,现在我们已经添加好对 Linux 的监控了,查看监控列表即可看到我们的添加项。
![HertzBeat](/img/blog/monitor-linux-3.png)
4. 点击监控列表项的**操作**->**监控详情图标** 即可浏览 Linux 的实时监控指标数据。
![HertzBeat](/img/blog/monitor-linux-4.png)
![HertzBeat](/img/blog/monitor-linux-7.png)
5. 点击**监控历史详情TAB** 即可浏览 Linux 的历史监控指标数据图表📈。
![HertzBeat](/img/blog/monitor-linux-5.png)
![HertzBeat](/img/blog/monitor-linux-6.png)
**DONE!完成啦!不需要我们去部署agent或者各种繁琐操作,是不是很简单**
- **只需一步在 HertzBeat 监控页面配置IP端口账户密码添加 Linux 监控即可**
### Linux 采集指标
#### 指标集合:basic
| 指标名称 | 指标单位 | 指标帮助描述 |
|----------|------|--------|
| hostname | 无 | 主机名称 |
| version | 无 | 操作系统版本 |
| uptime | 无 | 系统运行时间 |
#### 指标集合:cpu
| 指标名称 | 指标单位 | 指标帮助描述 |
|----------------|------|--------------------|
| info | 无 | CPU型号 |
| cores | 核数 | CPU内核数量 |
| interrupt | 个数 | CPU中断数量 |
| load | 无 | CPU最近1/5/15分钟的平均负载 |
| context_switch | 个数 | 当前上下文切换数量 |
| usage | % | CPU使用率 |
#### 指标集合:memory
| 指标名称 | 指标单位 | 指标帮助描述 |
|------------|------|----------|
| total | Mb | 总内存容量 |
| used | Mb | 用户程序内存量 |
| free | Mb | 空闲内存容量 |
| buff_cache | Mb | 缓存占用内存 |
| available | Mb | 剩余可用内存容量 |
| usage | % | 内存使用率 |
#### 指标集合:disk
| 指标名称 | 指标单位 | 指标帮助描述 |
|---------------|------|-----------|
| disk_num | 块数 | 磁盘总数 |
| partition_num | 分区数 | 分区总数 |
| block_write | 块数 | 写入磁盘的总块数 |
| block_read | 块数 | 从磁盘读出的块数 |
| write_rate | iops | 每秒写磁盘块的速率 |
#### 指标集合:interface
| 指标名称 | 指标单位 | 指标帮助描述 |
|----------------|------|---------------|
| interface_name | 无 | 网卡名称 |
| receive_bytes | byte | 入站数据流量(bytes) |
| transmit_bytes | byte | 出站数据流量(bytes) |
#### 指标集合:disk_free
| 指标名称 | 指标单位 | 指标帮助描述 |
|------------|------|---------|
| filesystem | 无 | 文件系统的名称 |
| used | Mb | 已使用磁盘大小 |
| available | Mb | 可用磁盘大小 |
| usage | % | 使用率 |
| mounted | 无 | 挂载点目录 |
:::tip
通过上面我们就完成了对 Linux 的监控,我们可以在 HertzBeat 随时查看Linux的各种指标状态和可用性。
当然不可能人工一直实时查看指标,监控往往伴随着告警阈值,当 Linux 的性能指标超出我们的阈值或Linux本身异常时,能及时的通知到我们对应的负责人,负责人收到通知处理,这样才是一个完整的监控告警流程。
:::
**接下来我们就来一步一步演示如何配置 HertzBeat 系统里的阈值告警通知,当 Linux 的指标异常时,及时通知给我们**
#### 三. 在 HertzBeat 系统添加 Linux 指标阈值告警
1. 对某个重要指标配置告警阈值
路径:菜单 -> 阈值规则 -> 新增阈值
- 选择配置的指标对象,Linux 监控主要是cpu 内存 磁盘 网络性能等相关指标,我们举例对 `CPU利用率` `cpu` -> `usage` 这个指标进行阈值设置, 当Linux cpu利用率大于90%时发出告警。
- 这里我们就配置当此指标`cpu``usage>90` 时发出告警,告警级别为**警告告警**,三次即触发,具体如下图。
![HertzBeat](/img/blog/monitor-linux-8.png)
![HertzBeat](/img/blog/monitor-linux-9.png)
2. 新增消息通知接收人
> 配置接收人,让告警消息知道要发给谁,用什么方式发。
路径:菜单 -> 告警通知 -> 告警接收人 -> 新增接收人
消息通知方式支持 **邮件,钉钉,企业微信,飞书,WebHook,短信**等,我们这里以常用的钉钉为例。
- 参照此[帮助文档](https://hertzbeat.apache.org/docs/help/alert_dingtalk) [https://hertzbeat.apache.org/docs/help/alert_dingtalk](https://hertzbeat.apache.org/docs/help/alert_dingtalk) 在钉钉端配置机器人,设置安全自定义关键词`HertzBeat`,获取对应`access_token`值。
- 在 HertzBeat 配置接收人参数如下。
【告警通知】->【新增接收人】 ->【选择钉钉机器人通知方式】->【设置钉钉机器人ACCESS_TOKEN】-> 【确定】
![HertzBeat](/img/blog/alert-notice-1.png)
3. 配置关联的告警通知策略⚠️ 【新增通知策略】-> 【将刚设置的接收人关联】-> 【确定】
> 配置告警通知策略,让告警消息与接收人绑定,这样就能决定哪些告警发给哪个人。
![HertzBeat](/img/blog/alert-notice-2.png)
### 完毕,现在坐等告警消息过来啦。叮叮叮叮
```text
[HertzBeat告警通知]
告警目标对象 : linux.cpu.usage
所属监控任务ID : 483783444839382
所属任务名称 : Linux_182.33.34.2
告警级别 : 警告告警
告警触发时间 : 2023-02-15 21:13:44
内容详情 : The linux cpu usage is too high. now is 95.
```
## 小结
:::tip
这篇实践文章带我们体验了如何使用开源实时监控工具 HertzBeat 来监控 Linux 指标数据,可以发现集 `监控-告警-通知` 的 HertzBeat 在操作与使用方面更加的便捷,只需页面上简单点一点就能把 Linux 纳入监控并告警通知,再也不需要部署多个组件编写配置文件那些繁琐操作了。
:::
> 只需要一条docker命令即可安装体验heartbeat:
`docker run -d -p 1157:1157 --name hertzbeat apache/hertzbeat`
## What is HertzBeat?
> [HertzBeat赫兹跳动](https://github.com/apache/hertzbeat) 是一个拥有强大自定义监控能力,无需Agent的实时监控告警工具。应用服务,数据库,操作系统,中间件,云原生等监控,阈值告警,告警通知(邮件微信钉钉飞书短信 Discord Slack Telegram)。
>
> 我们将`Http, Jmx, Ssh, Snmp, Jdbc, Prometheus`等协议规范可配置化,只需配置YML就能使用这些协议去自定义采集任何您想要采集的指标。
> 您相信只需配置YML就能立刻适配一个K8s或Docker等新的监控类型吗?
>
> `HertzBeat`的强大自定义,多类型支持,易扩展,低耦合,希望能帮助开发者和中小团队快速搭建自有监控系统。
**Github: [https://github.com/apache/hertzbeat](https://github.com/apache/hertzbeat)**
**Gitee: [https://gitee.com/hertzbeat/hertzbeat](https://gitee.com/hertzbeat/hertzbeat)**
## ⛄ Supported
- 网站监控, 端口可用性, Http Api, Ping连通性, Jvm, SiteMap全站, Ssl证书, SpringBoot, FTP服务器
- Mysql, PostgreSQL, MariaDB, Redis, ElasticSearch, SqlServer, Oracle, MongoDB, 达梦, OpenGauss, ClickHouse, IoTDB
- Linux, Ubuntu, CentOS, Windows
- Tomcat, Nacos, Zookeeper, RabbitMQ, Flink, Kafka, ShenYu, DynamicTp, Jetty, ActiveMQ
- Kubernetes, Docker
- 和更多您的自定义监控。
- 通知支持 `Discord` `Slack` `Telegram` `邮件` `钉钉` `微信` `飞书` `短信` `Webhook`
@@ -0,0 +1,143 @@
---
title: 重磅更新 开源实时监控工具 HertzBeat v1.3.0 发布 在线自定义来了
author: tom
author_title: tom
author_url: https://github.com/tomsun28
tags: [opensource, practice]
keywords: [开源监控系统, 告警系统, Linux监控]
---
官网: hertzbeat.com | tancloud.cn
## What is HertzBeat?
>
> HertzBeat赫兹跳动 是一个拥有强大自定义监控能力,无需 Agent 的开源实时监控告警工具。
> 集 **监控+告警+通知** 为一体,支持对应用服务,应用程序,数据库,缓存,操作系统,大数据,中间件,Web服务器,云原生,网络,自定义等指标监控,阈值告警通知一步到位。
> 支持更自由化的阈值规则(计算表达式),`邮件` `Discord` `Slack` `Telegram` `钉钉` `微信` `飞书` `短信` `Webhook` 等方式及时送达。
>
> 我们将`Http, Jmx, Ssh, Snmp, Jdbc, Prometheus`等协议规范可配置化,您只需配置`YML`就能使用这些协议去自定义采集任何您想要的指标。
>
> 您相信只需定义YML就能立刻适配一款K8s或Docker等新的监控类型吗?
**Github: [https://github.com/apache/hertzbeat](https://github.com/apache/hertzbeat)**
**Gitee: [https://gitee.com/hertzbeat/hertzbeat](https://gitee.com/hertzbeat/hertzbeat)**
### v1.3.0 大版本来了
经过一个月的迭代更新,HertzBeat v1.3.0 在上周末正式发布啦, **推荐升级食用**
- **支持在浏览器页面自定义监控**。hertzbeat拥有强大自定义监控能力,我们所有的已支持监控类型都映射为一个YML,之前用户使用自定义监控功能适配指标需要在后台编写YML文件并重启,体验欠佳且没有直观的感受。这次我们带来了自定义监控页面化,欢迎大家使用和分享贡献自己的监控类型定义。
- **支持对网络交换机的监控**。hertzbeat很早之前就支持了snmp协议,windows监控就是通过snmp协议来监控的,这个版本我们不仅支持了更多windows性能指标,还支持了snmp walk,适配了几款常见网络交换机的监控,欢迎贡献更多类型与指标给社区。
- **支持redis集群和更多数据库指标的监控**。社区贡献者们贡献了对redis集群和多种数据库的扩展指标,丰富了性能指标数据。
- **支持iotdb1.0存储,无依赖模式**等更多的新功能欢迎来探索
- 修复若干BUG,更完善的文档,重构了代码。
---
只需要一条docker命令即可安装体验heartbeat
`docker run -d -p 1157:1157 --name hertzbeat apache/hertzbeat`
感谢hertzbeat贡献者们的贡献!👍👍
我们急需对测试用例,新增应用监控,文档等各方面的贡献者,非常欢迎加入。
Feature
1. [[webapp,doc] monitor detail support basic panel hide #619](https://github.com/apache/hertzbeat/pull/619) @tomsun28
2. [add alarm notification period #624](https://github.com/apache/hertzbeat/pull/624) @Ceilzcx
3. [[manager] support more mysql monitoring metrics #631](https://github.com/apache/hertzbeat/pull/631)
4. [[unit test] Add unit test cases for KeyPairUtil #635](https://github.com/apache/hertzbeat/pull/635) @Daydreamer-ia
5. [[test]feature:add AlertDefineService test #638](https://github.com/apache/hertzbeat/pull/638) @hudongdong129
6. [[unit test] Add unit test cases for AlertTemplateUtil #639](https://github.com/apache/hertzbeat/pull/639) @Daydreamer-ia
7. [[test] add junit WarehouseWorkerPoolTest #642](https://github.com/apache/hertzbeat/pull/642) @TherChenYang
8. [task #614 [Add monitoring parameters for Redis Cluster and Sentinel] #647](https://github.com/apache/hertzbeat/pull/647) @hudongdong129
9. [A minor refactoring of the class WarehouseWorkerPoolTest #648](https://github.com/apache/hertzbeat/pull/648) @HattoriHenzo
10. [[task]feature:Optimize Redis info [section] and Add Redis command statistics #665](https://github.com/apache/hertzbeat/pull/665) @hudongdong129
11. [[document]add redis help document #672](https://github.com/apache/hertzbeat/pull/672) @hudongdong129
12. [Jupiter dependency is explicitly declared in the main pom file #674](https://github.com/apache/hertzbeat/pull/674) @HattoriHenzo
13. [refactor monitor define yml, update doc #675](https://github.com/apache/hertzbeat/pull/675)
14. [[task]support more window metrics #676](https://github.com/apache/hertzbeat/pull/676) @hudongdong129
15. [support config monitoring define yml in web ui #678](https://github.com/apache/hertzbeat/pull/678)
16. [support delete monitoring define yml in web ui #679](https://github.com/apache/hertzbeat/pull/679)
17. [[manager] add mysql, oracle, pg db more metrics #683](https://github.com/apache/hertzbeat/pull/683)
18. [[warehouse] support jpa store metrics history data #684](https://github.com/apache/hertzbeat/pull/684)
19. [[collect]Add redis cluster auto-discovery display metrics information #685](https://github.com/apache/hertzbeat/pull/685) @hudongdong129
20. [Convert version into properties #686](https://github.com/apache/hertzbeat/pull/686) @HattoriHenzo
21. [[webapp] change default monitor intervals 120s to 60s #708](https://github.com/apache/hertzbeat/pull/708) @xiaohe428
22. [[warehouse] support jpa expired metrics data auto cleaner #691](https://github.com/apache/hertzbeat/pull/691)
23. [snmp collect protocol support walk operation #699](https://github.com/apache/hertzbeat/pull/699)
24. [support v1.0.+ iotdb #702](https://github.com/apache/hertzbeat/pull/702) @Ceilzcx
25. [feature support monitor switch network metrics #705](https://github.com/apache/hertzbeat/pull/705)
26. [[webapp] change alert define trigger times from max 10 to max 999 #706](https://github.com/apache/hertzbeat/pull/706) @Grass-Life
27. [[doc] change default locale i18n from zh-cn to en #725](https://github.com/apache/hertzbeat/pull/725)
Bugfix.
1. [[collector] bugfix oracle query error: ORA-01000 happen #618](https://github.com/apache/hertzbeat/pull/618)
2. [[manager]bugfix:update flink fields name, use _replace - avoid alert_threshold_expr problem. #622](https://github.com/apache/hertzbeat/pull/622) @cuipiheqiuqiu
3. [[webapp] fix rule days not change when edit old notice rule item #628](https://github.com/apache/hertzbeat/pull/628)
4. [[webapp] update alert notice modal item span #630](https://github.com/apache/hertzbeat/pull/630)
5. [Update issue.md #654](https://github.com/apache/hertzbeat/pull/654) @ycilry
6. [The version of Spring Boot should be put in properties #657](https://github.com/apache/hertzbeat/pull/657) @HattoriHenzo
7. [Bugfix: EdDSA provider not supported #659](https://github.com/apache/hertzbeat/pull/659) @caibenxiang
8. [[script] auto heap dump when oom error #662](https://github.com/apache/hertzbeat/pull/662)
9. [bugfix recurring tasks caused by priority processing exception #663](https://github.com/apache/hertzbeat/pull/663)
10. [bugfix repetitive collect tasks, reduce init mem size #664](https://github.com/apache/hertzbeat/pull/664)
11. [[manager] bugfix define yml file name and the app name are inconsistent #680](https://github.com/apache/hertzbeat/pull/680)
12. [[collector] bugfix metrics has a lot of repetition fields #682](https://github.com/apache/hertzbeat/pull/682)
13. [fix(sec): upgrade org.apache.kafka:kafka-clients to 3.4.0 #687](https://github.com/apache/hertzbeat/pull/687) @lifefloating
14. [optimized code and add iotdb compose config #690](https://github.com/apache/hertzbeat/pull/690) @Ceilzcx
15. [[script] modified the linux memory metrics specified script code #719](https://github.com/apache/hertzbeat/pull/719) @ByteIDance
16. [Update kubernetes.md #715](https://github.com/apache/hertzbeat/pull/715) @xiaohe428
17. [[home,i18n] Update kubernetes.md #716](https://github.com/apache/hertzbeat/pull/716) @baiban114
18. [[webapp] fix applist delete button display #693](https://github.com/apache/hertzbeat/pull/693)
19. [[warehouse] bugfix metrics data not consume oom #697](https://github.com/apache/hertzbeat/pull/697)
20. [[manager] bugfix npe when load old define yml in windows env #701](https://github.com/apache/hertzbeat/pull/701)
21. [bugfix job metrics set concurrent modification exception #723](https://github.com/apache/hertzbeat/pull/723)
22. [[script] modified the linux memory metrics specified script code #719](https://github.com/apache/hertzbeat/pull/719)
23. [[webapp] bugfix the cover of the big screen is too small #724](https://github.com/apache/hertzbeat/pull/724)
---
升级注意⚠️.
对于之前使用iotdb或者tdengine来存储指标数据的用户,需要修改 application.yml 来关闭JPA存储 `warehouse.store.jpa.enabled` 如下:
修改 `application.yml` 并设置 `warehouse.store.jpa.enabled` 参数为 false
```yaml
warehouse:
store:
jpa:
enabled: false
```
执行SQL脚本
```shell
ALTER table hzb_monitor modify job_id bigint default null;
COMMIT;
```
---
## ⛄ Supported
- 网站监控, 端口可用性, Http Api, Ping连通性, Jvm, SiteMap全站, Ssl证书, SpringBoot, FTP服务器
- Mysql, PostgreSQL, MariaDB, Redis, ElasticSearch, SqlServer, Oracle, MongoDB, 达梦, OpenGauss, ClickHouse, IoTDB, Redis集群
- Linux, Ubuntu, CentOS, Windows
- Tomcat, Nacos, Zookeeper, RabbitMQ, Flink, Kafka, ShenYu, DynamicTp, Jetty, ActiveMQ
- Kubernetes, Docker
- Huawei Switch, HPE Switch, TP-LINK Switch, Cisco Switch
- 和更多你的自定义监控。
- 通知支持 `Discord` `Slack` `Telegram` `邮件` `钉钉` `微信` `飞书` `短信` `Webhook`
---
**Github: [https://github.com/apache/hertzbeat](https://github.com/apache/hertzbeat)**
**Gitee: [https://gitee.com/hertzbeat/hertzbeat](https://gitee.com/hertzbeat/hertzbeat)**
@@ -0,0 +1,202 @@
---
title: 使用 HertzBeat 5分钟搞定 SpringBoot2 监控告警
author: tom
author_title: tom
author_url: https://github.com/tomsun28
tags: [opensource, practice]
keywords: [开源监控系统, SpringBoot监控, 监控告警]
---
## 使用开源实时监控工具 HertzBeat 对 SpringBoot2 应用的监控告警实践,5分钟搞定
### HertzBeat 介绍
> HertzBeat 是一款开源,易用友好的实时监控工具,无需Agent,拥有强大自定义监控能力。
- 集**监控-告警-通知为一体**,支持对应用服务,应用程序,数据库,缓存,操作系统,大数据,中间件,Web服务器,云原生,网络,自定义等监控,阈值告警,告警通知(邮件微信钉钉飞书短信 Slack Discord Telegram)。
- 其将Http, Jmx, Ssh, Snmp, Jdbc, Prometheus等协议规范可配置化,只需配置YML就能使用这些协议去自定义采集任何您想要采集的指标。您相信只需配置YML就能立刻适配一个K8s或Docker等新的监控类型吗?
- HertzBeat 的强大自定义,多类型支持,易扩展,低耦合,希望能帮助开发者和中小团队快速搭建自有监控系统。
Github: [https://github.com/apache/hertzbeat](https://github.com/apache/hertzbeat)
### 在 HertzBeat 5分钟搞定对 SpringBoot2 应用的监控
#### 操作前提,您已拥有 SpringBoot2 应用环境和 HertzBeat 环境
- HertzBeat [安装部署文档](https://hertzbeat.apache.org/docs/start/docker-deploy)
#### 一. 在 SpringBoot2 应用端暴露出`actuator`指标接口,它将提供 metrics 接口数据
1. 开启 SpringBoot Actuator Endpoint 暴露出`metrics health env`指标接口
```yaml
management:
endpoints:
web:
exposure:
include:
- 'metrics'
- 'health'
- 'env'
enabled-by-default: on
```
2. 重启后测试访问指标接口 `ip:port/actuator` 是否有响应json数据如下:
```json
{
"_links": {
"self": {
"href": "http://localhost:1157/actuator",
"templated": false
},
"health-path": {
"href": "http://localhost:1157/actuator/health/{*path}",
"templated": true
},
"health": {
"href": "http://localhost:1157/actuator/health",
"templated": false
},
"env": {
"href": "http://localhost:1157/actuator/env",
"templated": false
},
"env-toMatch": {
"href": "http://localhost:1157/actuator/env/{toMatch}",
"templated": true
},
"metrics-requiredMetricName": {
"href": "http://localhost:1157/actuator/metrics/{requiredMetricName}",
"templated": true
},
"metrics": {
"href": "http://localhost:1157/actuator/metrics",
"templated": false
}
}
}
```
#### 在开源监控系统 HertzBeat 监控页面添加对 SpringBoot2 应用监控
1. 点击新增 SpringBoot2 监控
路径:菜单 -> 应用服务监控 -> SpringBoot2 -> 新增SpringBoot2监控
![HertzBeat](/img/blog/monitor-springboot2-1.png)
2. 配置新增监控 SpringBoot2 所需参数
在监控页面填写 SpringBoot2应用 **对端IP****服务端口**(默认8080),**账户密码等**,最后点击确定添加即可。
其他参数如**采集间隔**,**超时时间**等可以参考帮助文档 [https://hertzbeat.apache.org/docs/help/](https://hertzbeat.apache.org/docs/help/)
![HertzBeat](/img/blog/monitor-springboot2-2.png)
3. 完成✅,现在我们已经添加好对 SpringBoot2应用 的监控了,查看监控列表即可看到我们的添加项。
![HertzBeat](/img/blog/monitor-springboot2-3.png)
4. 点击监控列表项的**操作**->**监控详情图标** 即可浏览 SpringBoot2应用 的实时监控指标数据。
![HertzBeat](/img/blog/monitor-springboot2-4.png)
5. 点击**监控历史详情TAB** 即可浏览 SpringBoot2应用 的历史监控指标数据图表📈。
![HertzBeat](/img/blog/monitor-springboot2-5.png)
**DONE!完成啦!不需要我们去部署agent或者各种繁琐操作,是不是很简单**
- **只需一步在 HertzBeat 监控页面配置IP端口添加 SpringBoot2应用 监控即可**
:::tip
通过上面我们就完成了对 SpringBoot2应用 的监控,我们可以在 HertzBeat 随时查看SpringBoot2应用的各种指标状态和可用性。
当然不可能人工一直实时查看指标,监控往往伴随着告警阈值,当 SpringBoot2应用 的性能指标超出我们的阈值或SpringBoot2应用本身异常时,能及时的通知到我们对应的负责人,负责人收到通知处理,这样才是一个完整的监控告警流程。
:::
**接下来我们就来一步一步演示如何配置 HertzBeat 系统里的阈值告警通知,当 SpringBoot2应用 的指标异常时,及时通知给我们**
#### 三. 在 HertzBeat 系统添加 SpringBoot2应用 指标阈值告警
1. 对某个重要指标配置告警阈值
路径:菜单 -> 阈值规则 -> 新增阈值
- 选择配置的指标对象,SpringBoot2应用 监控主要是 堆栈内存 线程等相关指标,我们举例对 `状态线程数` `threads` -> `threads` 这个指标进行阈值设置, 当`runnable`状态的线程数量大于300时发出告警。
- 这里我们就配置当此指标`size`,`state` 的 `equals(state,"runnable"") && size>300` 时发出告警,告警级别为**警告告警**,三次即触发,具体如下图。
![HertzBeat](/img/blog/monitor-springboot2-6.png)
![HertzBeat](/img/blog/monitor-springboot2-7.png)
2. 新增消息通知接收人
> 配置接收人,让告警消息知道要发给谁,用什么方式发。
路径:菜单 -> 告警通知 -> 告警接收人 -> 新增接收人
消息通知方式支持 **邮件,钉钉,企业微信,飞书,WebHook,短信**等,我们这里以常用的钉钉为例。
- 参照此[帮助文档](https://hertzbeat.apache.org/docs/help/alert_dingtalk) [https://hertzbeat.apache.org/docs/help/alert_dingtalk](https://hertzbeat.apache.org/docs/help/alert_dingtalk) 在钉钉端配置机器人,设置安全自定义关键词`HertzBeat`,获取对应`access_token`值。
- 在 HertzBeat 配置接收人参数如下。
【告警通知】->【新增接收人】 ->【选择钉钉机器人通知方式】->【设置钉钉机器人ACCESS_TOKEN】-> 【确定】
![HertzBeat](/img/blog/alert-notice-1.png)
3. 配置关联的告警通知策略⚠️ 【新增通知策略】-> 【将刚设置的接收人关联】-> 【确定】
> 配置告警通知策略,让告警消息与接收人绑定,这样就能决定哪些告警发给哪个人。
![HertzBeat](/img/blog/alert-notice-2.png)
### 完毕,现在坐等告警消息过来啦。叮叮叮叮
```text
[HertzBeat告警通知]
告警目标对象 : springboot2.threads.size
所属监控任务ID : 483783444839322
所属任务名称 : SPRINGBOOT2_localhost
告警级别 : 警告告警
告警触发时间 : 2023-03-22 21:13:44
内容详情 : The springboot2 service's runnable state threads num is over 300, now is 444.
```
## 小结
:::tip
这篇实践文章带我们体验了如何使用开源实时监控工具 HertzBeat 来监控 SpringBoot2应用 指标数据,可以发现集 `监控-告警-通知` 的 HertzBeat 在操作与使用方面更加的便捷,只需页面上简单点一点就能把 SpringBoot2应用 纳入监控并告警通知,再也不需要部署多个组件编写配置文件那些繁琐操作了。
:::
> 只需要一条docker命令即可安装体验heartbeat:
`docker run -d -p 1157:1157 --name hertzbeat apache/hertzbeat`
## 更强大
> 通过上面的简单步骤我们实现了对SpringBoot2的监控,但里面的内置指标固定不满足需要,是否能自定义监控更多SpringBoot2的指标呢?答案当然是可以的,通过在页面上的**监控定义**->**SpringBoot2**随时通过编辑如下的YML配置文件自定义添加修改想要监控的性能指标。
![HertzBeat](/img/blog/monitor-springboot2-8.png)
## What is HertzBeat?
> [HertzBeat赫兹跳动](https://github.com/apache/hertzbeat) 是一个拥有强大自定义监控能力,无需Agent的实时监控告警工具。应用服务,数据库,操作系统,中间件,云原生,网络等监控,阈值告警,告警通知(邮件微信钉钉飞书短信 Discord Slack Telegram)。
>
> 我们将`Http, Jmx, Ssh, Snmp, Jdbc, Prometheus`等协议规范可配置化,只需配置YML就能使用这些协议去自定义采集任何您想要采集的指标。
> 您相信只需配置YML就能立刻适配一个K8s或Docker等新的监控类型吗?
>
> `HertzBeat`的强大自定义,多类型支持,易扩展,低耦合,希望能帮助开发者和中小团队快速搭建自有监控系统。
**Github: [https://github.com/apache/hertzbeat](https://github.com/apache/hertzbeat)**
**Gitee: [https://gitee.com/hertzbeat/hertzbeat](https://gitee.com/hertzbeat/hertzbeat)**
## ⛄ Supported
- 网站监控, 端口可用性, Http Api, Ping连通性, Jvm, SiteMap全站, Ssl证书, SpringBoot, FTP服务器
- Mysql, PostgreSQL, MariaDB, Redis, ElasticSearch, SqlServer, Oracle, MongoDB, 达梦, OpenGauss, ClickHouse, IoTDB
- Linux, Ubuntu, CentOS, Windows
- Tomcat, Nacos, Zookeeper, RabbitMQ, Flink, Kafka, ShenYu, DynamicTp, Jetty, ActiveMQ
- Kubernetes, Docker
- CiscoSwitch, HpeSwitch, HuaweiSwitch, TpLinkSwitch
- 和更多的自定义监控。
- 通知支持 `Discord` `Slack` `Telegram` `邮件` `钉钉` `微信` `飞书` `短信` `Webhook`。
@@ -0,0 +1,66 @@
---
title: 50天36位贡献者,开源实时监控工具 HertzBeat v1.3.1 发布
author: tom
author_title: tom
author_url: https://github.com/tomsun28
tags: [opensource, practice]
keywords: [open source monitoring system, alerting system, Linux monitoring]
---
官网: hertzbeat.com | tancloud.cn
## What is HertzBeat?
>
> HertzBeat赫兹跳动 是一个拥有强大自定义监控能力,无需 Agent 的开源实时监控告警工具。
> 集 **监控+告警+通知** 为一体,支持对应用服务,应用程序,数据库,缓存,操作系统,大数据,中间件,Web服务器,云原生,网络,自定义等指标监控,阈值告警通知一步到位。
> 支持更自由化的阈值规则(计算表达式),`邮件` `Discord` `Slack` `Telegram` `钉钉` `微信` `飞书` `短信` `Webhook` 等方式及时送达。
>
> 我们将`Http, Jmx, Ssh, Snmp, Jdbc, Prometheus`等协议规范可配置化,您只需配置`YML`就能使用这些协议去自定义采集任何您想要的指标。
>
> 您相信只需定义YML就能立刻适配一款K8s或Docker等新的监控类型吗?
**Github: [https://github.com/apache/hertzbeat](https://github.com/apache/hertzbeat)**
**Gitee: [https://gitee.com/hertzbeat/hertzbeat](https://gitee.com/hertzbeat/hertzbeat)**
### v1.3.1 来了
嗨,伙计们,重磅更新,HertzBeat v1.3.1发布啦!很激动这个版本有超三十位小伙伴们一起贡献。
这个版本我们支持**greptimeDB, tedgine3.0和opengauss influxdb**来存储度量数据。
新功能**监控导出和导入支持excel json yaml** **告警静默功能****新的监控模板**和更多。
支持监控EulerOS指标和SpringBoot3指标。修复若干BUG,完善了文档,重构了代码,提高了整体的稳定可用性还有更多新功能欢迎探索!快来体验下吧!
只需要一条docker命令即可安装体验hertzbeat
`docker run -d -p 1157:1157 --name hertzbeat apache/hertzbeat`
## 升级注意⚠️
若之前使用的TDengine时序数据库,需升级至TDengine3.0+
需要执行SQL升级脚本
```shell
ALTER table hzb_alert_define modify field varchar(255) default null;
COMMIT;
```
---
## ⛄ 已支持
> 我们将监控采集类型(mysql,jvm,k8s)都定义为yml监控模板,用户可以导入这些模板来支持对应类型的监控!
> 欢迎大家一起贡献你使用过程中自定义的通用监控类型监控模板。
- Website, Port Telnet, Http Api, Ping Connect, Jvm, SiteMap, Ssl Certificate, SpringBoot2, FTP Server, SpringBoot3
- Mysql, PostgreSQL, MariaDB, Redis, ElasticSearch, SqlServer, Oracle, MongoDB, DM, OpenGauss, ClickHouse, IoTDB, Redis Cluster, Redis Sentinel
- Linux, Ubuntu, CentOS, Windows, EulerOS
- Tomcat, Nacos, Zookeeper, RabbitMQ, Flink, Kafka, ShenYu, DynamicTp, Jetty, ActiveMQ
- Kubernetes, Docker
- CiscoSwitch, HpeSwitch, HuaweiSwitch, TpLinkSwitch, H3cSwitch
- 和更多自定义监控模板。
- 通知支持 Discord Slack Telegram 邮件 钉钉 微信 飞书 短信 Webhook。
---
**Github: [https://github.com/apache/hertzbeat](https://github.com/apache/hertzbeat)**
**Gitee: [https://gitee.com/hertzbeat/hertzbeat](https://gitee.com/hertzbeat/hertzbeat)**
@@ -0,0 +1,131 @@
---
title: GreptimeDB & HertzBeat, 使用开源时序数据库 GreptimeDB 存储开源实时监控 HertzBeat 的度量数据
author: tom
author_title: tom
author_url: https://github.com/tomsun28
tags: [opensource, practice]
keywords: [开源监控系统, 开源时序数据库, HertzBeat, GreptimeDB]
---
## 使用开源时序数据库 GreptimeDB 存储开源实时监控 HertzBeat 的度量数据
### 什么是 GreptimeDB
> [GreptimeDB](https://github.com/GreptimeTeam/greptimedb) 是一款开源、分布式、云原生时序数据库,融合时序数据处理和分析。
- 完善的生态系统,支持大量开放协议,与 MySQL/PostreSQL/PromQL/OpenTSDB 等兼容,学习成本低,开箱即用。
- 时序、分析混合负载,支持高并发的读/写;原生支持 PromQL, 支持 SQL/Python 进行强大的库内分析。
- 高效存储与计算,通过对象存储和高数据压缩率实现超低的存储成本。内置数据分析解决方案,避免将数据复制到外部数据仓库。
- 分布式、高可靠与高可用,通过解耦的云原生架构,轻松独立地扩展每个模块。通过可配置的副本和自动的故障转移机制,确保数据的可靠性和可用性。
Cloud: **[GreptimePlay](https://greptime.com/product/cloud)**
### 什么是 HertzBeat
> [HertzBeat](https://github.com/apache/hertzbeat) 一个拥有强大自定义监控能力,无需 Agent 的开源实时监控告警工具。
-**监控+告警+通知** All in one,支持对应用服务,应用程序,数据库,缓存,操作系统,大数据,中间件,Web服务器,云原生,网络,自定义等监控,阈值告警通知一步到位。
- 更自由化的阈值规则(计算表达式)`邮件` `Discord` `Slack` `Telegram` `钉钉` `微信` `飞书` `短信` `Webhook` 等方式及时送达。
-`Http, Jmx, Ssh, Snmp, Jdbc, Prometheus`等协议规范可配置化,只需在浏览器配置`YML`监控模板就能使用这些协议去自定义采集想要的指标。
> `HertzBeat`的强大自定义,多类型支持,易扩展,低耦合,希望能帮助开发者和中小团队快速搭建自有监控系统。
Cloud: **[TanCloud](https://console.tancloud.cn/)**
### GreptimeDB & HertzBeat
> 下面内容我们会通过一步一步的形式演示 HertzBeat 如何结合 GreptimeDB 作为存储端来存储收集到的指标数据。
#### 安装部署 GreptimeDB
具体可以参考 [官方文档](https://docs.greptime.com/getting-started/overview#docker)
1. Docker 安装 GreptimeDB
```shell
$ docker run -p 4000-4004:4000-4004 \
-p 4242:4242 -v "$(pwd)/greptimedb:/tmp/greptimedb" \
--name greptime \
greptime/greptimedb:0.2.0 standalone start \
--http-addr 0.0.0.0:4000 \
--rpc-addr 0.0.0.0:4001
```
- `-v "$(pwd)/greptimedb:/tmp/greptimedb"` 为 greptimeDB 数据目录本地持久化挂载,建议将`$(pwd)/greptimedb`替换为您想指定存放的实际本地目录
2. 使用```$ docker ps | grep greptime```查看 GreptimeDB 是否启动成功
#### 安装部署 HertzBeat
具体可以参考 [官方文档](https://hertzbeat.apache.org/zh-cn/docs/start/docker-deploy)
1. Docker 安装 HertzBeat
```shell
$ docker run -d -p 1157:1157 \
-e LANG=zh_CN.UTF-8 \
-e TZ=Asia/Shanghai \
-v /opt/data:/opt/hertzbeat/data \
-v /opt/application.yml:/opt/hertzbeat/config/application.yml \
--restart=always \
--name hertzbeat apache/hertzbeat
```
- `-v /opt/data:/opt/hertzbeat/data` : (可选,数据持久化)重要⚠️ 挂载H2数据库文件到本地主机,保证数据不会因为容器的创建删除而丢失
- `-v /opt/application.yml:/opt/hertzbeat/config/application.yml` : 挂载自定义本地配置文件到容器中,即使用本地配置文件覆盖容器配置文件。
注意⚠️ 本地挂载配置文件 `application.yml` 需提前存在,文件完整内容见项目仓库[/script/application.yml](https://github.com/apache/hertzbeat/raw/master/script/application.yml)
2. 浏览器访问 [http://ip:1157/](http://ip:1157/) 默认账户密码 admin/hertzbeat,查看 HertzBeat 是否启动成功。
#### 配置使用 GreptimeDB 存储 HertzBeat 监控指标度量数据
1. 修改 HertzBeat 端配置文件
修改挂载到本地的 HertzBeat 配置文件 [application.yml](https://github.com/apache/hertzbeat/raw/master/script/application.yml), 安装包模式下修改 `hertzbeat/config/application.yml`
**修改里面的`warehouse.store.jpa.enabled`参数为`false` 配置里面的`warehouse.store.greptime`数据源参数,URL账户密码,并启用`enabled`为`true`**
```yaml
warehouse:
store:
# 关闭默认JPA
jpa:
enabled: false
greptime:
enabled: true
endpoint: localhost:4001
```
2. 重启 HertzBeat
```shell
docker restart hertzbeat
```
#### 观察验证效果
1. 浏览器访问 HertzBeat [http://ip:1157/](http://ip:1157/) 默认账户密码 admin/hertzbeat
2. 使用 HertzBeat 添加应用监控,比如网站监控,Linux监控,Mysql监控
3. 监控采集几个周期之后,查看 GreptimeDB 数据库是否存储指标度量数据,HertzBeat 指标数据图表数据是否展示正常。
直接上图哇:
![1](/img/blog/greptime-1.png)
![1](/img/blog/greptime-2.png)
![1](/img/blog/greptime-3.png)
## 小结
这篇文章带我们体验了如何使用开源时序数据库 GreptimeDB 存储开源实时监控 HertzBeat 的指标度量数据,总的来看两款开源产品上手是非常简单的,关键是如果嫌麻烦不想部署他俩都还有云服务😂让你折腾。
作为特性 [HertzBeat支持GreptimeDB](https://github.com/apache/hertzbeat/pull/834) 的开发者之一,在实际适配使用过程中,GreptimeDB的丝滑原生SDK和类似关系数据库的SQL,让我们从其它时序数据库 `TDengine, IotDB, InfluxDB` 切换过去还是非常容易,体验丝滑的。
GreptimeDB Github: [https://github.com/GreptimeTeam/greptimedb](https://github.com/GreptimeTeam/greptimedb)
HertzBeat Github: [https://github.com/apache/hertzbeat](https://github.com/apache/hertzbeat)
**最后就是欢迎大家一定要多多了解,多多使用,多多提意见,多多ISSUE,多多PR,多多Star支持这俩没出来多久希望得到呵护的开源牛牛不怕困难 一颗小星星哦!做开源,我们是蒸(真)的,爱心💗**
感谢此特性 [HertzBeat支持GreptimeDB](https://github.com/apache/hertzbeat/pull/834) 的贡献者们 @zqr10159, @fengjiachun, @killme2008, @tomsun28
@@ -0,0 +1,70 @@
---
title: 开源实时监控 HertzBeat v1.3.2 发布, 更稳定更易用
author: tom
author_title: tom
author_url: https://github.com/tomsun28
tags: [opensource, practice]
keywords: [open source monitoring system, alerting system, Linux monitoring]
---
官网: hertzbeat.com | tancloud.cn
![hertzBeat](/img/home/0.png)
## HertzBeat 介绍
>
> HertzBeat赫兹跳动 是一个拥有强大自定义监控能力,无需 Agent 的开源实时监控告警工具。
> 致力于**易用友好**,全 WEB 页面操作,鼠标点一点就能监控告警,无需学习成本。
> 集 **监控+告警+通知** 为一体,支持对应用服务,应用程序,数据库,缓存,操作系统,大数据,中间件,Web服务器,云原生,网络,自定义等指标监控,阈值告警通知一步到位。
> 支持更自由化的阈值规则(计算表达式),`邮件` `Discord` `Slack` `Telegram` `钉钉` `微信` `飞书` `短信` `Webhook` 等方式及时送达。
>
> 我们将`Http, Jmx, Ssh, Snmp, Jdbc, Prometheus`等协议规范可配置化,您只需配置`YML`就能使用这些协议去自定义采集任何您想要的指标。
**Github: [https://github.com/apache/hertzbeat](https://github.com/apache/hertzbeat)**
**Gitee: [https://gitee.com/hertzbeat/hertzbeat](https://gitee.com/hertzbeat/hertzbeat)**
### v1.3.2 来了
**这次累计 27 位小伙伴们的辛苦贡献才出来了这个令人欣喜的版本。 感谢他们!爱心💗**
这个版本我们支持对**freebsd, debian, opensuse, redhat, apache doris**等新的监控类型和指标。
- 支持WEB页面配置邮件服务器,取代之前的文件配置
- 支持告警收敛,是否遇到了重复告警频繁发送,有了告警收敛马上解决
- 公共消息队列支持Kafka,除了我们默认的内置内存消息队列,也支持了外置Kafka消息队列,提升系统性能。
- 新的监控中心页面,聚合所有监控类型,不用像之前那样切来切去了。
- 支持标签分组展示,把同一业务类别的监控们分组标记,统一管理。
- 阈值配置不仅仅有表达式,还支持更人性化的操作UI,之前的表达式对新人不太友好很容易出错,现在可以直接UI操作啦,它可以和表达式互相切换。
- 还有HTTP ipv6等更多功能。
修复了大量BUG,完善文档代码,提高了整体的稳定可用性。更多新功能欢迎探索!
只需要一条docker命令即可安装体验hertzbeat:
`docker run -d -p 1157:1157 --name hertzbeat apache/hertzbeat`
若dockerhub网络超时,可以使用下面命令:
`docker run -d -p 1157:1157 --name hertzbeat quay.io/tancloud/hertzbeat`
---
## ⛄ 已支持
> 我们将监控采集类型(mysql,jvm,k8s)都定义为yml监控模板,用户可以导入这些模板来支持对应类型的监控!
> 欢迎大家一起贡献你使用过程中自定义的通用监控类型监控模板。
- Website, Port Telnet, Http Api, Ping Connect, Jvm, SiteMap, Ssl Certificate, SpringBoot2, FTP Server, SpringBoot3
- Mysql, PostgreSQL, MariaDB, Redis, ElasticSearch, SqlServer, Oracle, MongoDB, DM, OpenGauss, ClickHouse, IoTDB, Redis Cluster, Redis Sentinel
- Linux, Ubuntu, CentOS, Windows, EulerOS, Fedora CoreOS, OpenSUSE, Rocky Linux, Red Hat, FreeBSD, AlmaLinux, Debian Linux
- Tomcat, Nacos, Zookeeper, RabbitMQ, Flink, Kafka, ShenYu, DynamicTp, Jetty, ActiveMQ
- Kubernetes, Docker
- CiscoSwitch, HpeSwitch, HuaweiSwitch, TpLinkSwitch, H3cSwitch
- 和更多自定义监控模板。
- 通知支持 Discord Slack Telegram 邮件 钉钉 微信 飞书 短信 Webhook。
---
**欢迎star三连来支持我们**
**Github: [https://github.com/apache/hertzbeat](https://github.com/apache/hertzbeat)**
**Gitee: [https://gitee.com/hertzbeat/hertzbeat](https://gitee.com/hertzbeat/hertzbeat)**
@@ -0,0 +1,176 @@
---
title: 重磅更新,HertzBeat 集群版发布,易用友好的开源实时监控系统!
author: tom
author_title: tom
author_url: https://github.com/tomsun28
tags: [opensource, practice]
keywords: [open source monitoring system, alerting system, Linux monitoring]
---
![hertzBeat](/img/home/0.png)
## 什么是 HertzBeat?
[HertzBeat 赫兹跳动](https://github.com/apache/hertzbeat) 是一个拥有强大自定义监控能力,高性能集群,无需 Agent 的开源实时监控告警系统。
### 特点
-**监控+告警+通知** 为一体,支持对应用服务,应用程序,数据库,缓存,操作系统,大数据,中间件,Web服务器,云原生,网络,自定义等监控阈值告警通知一步到位。
- 易用友好,无需 `Agent`,全 `WEB` 页面操作,鼠标点一点就能监控告警,无需学习成本。
-`Http, Jmx, Ssh, Snmp, Jdbc, Prometheus` 等协议规范可配置化,只需在浏览器配置监控模板 `YML` 就能使用这些协议去自定义采集想要的指标。您相信只需简单配置即可快速适配一款 `K8s``Docker` 等新的监控类型吗?
- 高性能,支持多采集器集群横向扩展,支持多隔离网络监控,云边协同。
- 灵活的告警阈值规则,`邮件` `Discord` `Slack` `Telegram` `钉钉` `微信` `飞书` `短信` `Webhook` 等方式消息及时送达。
> `HertzBeat`的强大自定义,多类型支持,高性能,易扩展,低耦合,希望能帮助开发者和团队快速搭建自有监控系统。
![hertzBeat](/img/docs/hertzbeat-arch.png)
**Github: [https://github.com/apache/hertzbeat](https://github.com/apache/hertzbeat)**
**Gitee: [https://gitee.com/hertzbeat/hertzbeat](https://gitee.com/hertzbeat/hertzbeat)**
### 集群版来啦
我们之前的hertzbeat一直是单机版本,组件代码模块化但不支持采集器独立部署,所支持的监控数量上限受到了单节点的天然限制,且无法应对多个隔离网络的资源的统一纳管。
经过一个多月的迭代,我们重写了采集任务调度,采集器独立部署,设计单机版和集群版用同一套代码方便后续的维护升级,单机集群两种模式可相互切换无感知。最终很高兴,集群版如期与大家见面了。
集群版不仅仅给我们带来了更强大的监控性能,更有云边协同等功能让人充满想象。
#### 高性能集群
- 支持部署采集器集群,多采集器集群横向扩展,指数级提高可监控数量与采集性能。
- 监控任务在采集器集群中自调度,单采集器挂掉无感知故障迁移采集任务,新加入采集器节点自动调度分担采集压力。
- 单机模式与集群模式相互切换部署非常方便,无需额外组件部署。
![HertzBeat](/img/docs/cluster-arch.png)
#### 云边协同
> 支持部署边缘采集器集群,与主 HertzBeat 服务云边协同提升采集能力。
在多个网络不相通的隔离网络中,在以往的方案中我们需要在每个网络都部署一套监控系统,这导致数据不互通,管理部署维护都不方便。
HertzBeat 提供云边协同能力,可以在多个隔离网络部署边缘采集器,添加监控时指定采集器,采集器在隔离网络内部进行监控任务采集,采集数据上报,由主 HertzBeat 服务统一调度管理展示。
这多用于多个隔离数据中心或不同厂商云资源和云下资源的统一监控场景。
![HertzBeat](/img/docs/cluster-arch.png)
### 为什么要开源集群版?
往往一些做需要商业化的开源产品的策略会是单机版作为玩具给小玩家们的入门使用,然后集群版作为闭源产品给有需求的氪金玩家付费使用。这样的模式是可以说非常不错的且值得肯定的,即保证开源也得到了收益,也适用于很多开源项目的发展策略,可能会在商业路径上走得更通顺点。
网络上有些人会对这样的分单机和集群版的开源项目嗤之以鼻,觉得它们是伪开源,开源是噱头,他们觉得开源应该什么都开源免费出来,开源团队什么都应该无私奉献出来。。。。很无语这类人,有投入才有回报,当你免费使用着开源软件并得到价值的时候,是否应该想一想你付出给开源软件了什么而不是一味的索取。
那回到正题,我们又为什么要开源集群版?仅因为热爱开源?如果说我们还在少年可能这话你信,但一个快奔30还有家庭责任的人说出这话你信吗,我自己都不信😂。
首先我们来看看开源能带来什么,或者为什么要做开源。最开始全职开源的想法很简单,做自己喜欢的开源产品(已实现),程序员的梦想能部署在成千上万的服务器上(看下载量已实现),然后基于此开源产品挣钱(暂未哭)。
- 用户流量。开源项目免费提供给用户和开发者,吸引用户使用,宣传等方面都有优势。
- 用户信任。开源的产品天生容易获取用户的信任和使用耐心,或者说降低用户的信任门槛。
- 社区协作。开源的产品可以吸引到顶级贡献者一起贡献,接收用户的反馈issue,pr贡献等,在社区的驱动下使开源项目越来越好,正向反馈后也会有更多人参与和使用。社区协作我觉得这是开源的意义,而且这样不仅仅只是程序员之间的贡献代码协作,用户都是协作对象(比如我们这个项目有大量的运维朋友贡献代码和文档),如果是仅仅代码开源而不社区协作,那还不如放个安装包给别人免费使用下载就好。
- 产品生态。这对一些需要生态的产品是需要的,比如hertzbeat,需要支持对接各种类型协议的监控类型,大量的监控模板。一个好的开源项目生态才能吸引到其它贡献者贡献和分享,在生态中互通有无,最终大家在生态中都受益。这在闭源程序中是很难做到的。
上面几点,重在社区协作和产品生态,这也是开源集群版的原因,只有卷开源产品卷自己到更强的产品力,比如集群这一技术特性天生会吸引到开发者(而且集群本身就是我们社区协作的产物),会吸引到更多的用户和贡献者使用反馈大家一起迭代,社区驱动进而正向促进开源项目和满足用户功能体验。
而对于开源商业化,开源商业化的前提是得有个真正好的,受欢迎,被广泛使用的开源产品,然后在此基础上做商业化挣钱。
对了这里再说下开源不等同于免费,基于HertzBeat二次开发需保留logo,名称,页面脚注,版权等。
免费使用不是白嫖,这种破坏开源协议的才是,目前发现大量白嫖怪,小心点哈你们。我每年正月初七都会祝你们用这些钱吃的安心,住的放心,玩的开心哈。(仅个人言论不代表社区)
### 尝试部署集群版
1. `docker` 环境仅需一条命令即可开始
```docker run -d -p 1157:1157 -p 1158:1158 --name hertzbeat apache/hertzbeat```
```或者使用 quay.io (若 dockerhub 网络链接超时)```
```docker run -d -p 1157:1157 -p 1158:1158 --name hertzbeat quay.io/tancloud/hertzbeat```
2. 浏览器访问 `http://localhost:1157` 即可开始,默认账号密码 `admin/hertzbeat`
3. 部署采集器集群
```shell
docker run -d -e IDENTITY=custom-collector-name -e MANAGER_HOST=127.0.0.1 -e MANAGER_IP=1158 --name hertzbeat-collector apache/hertzbeat-collector
```
- `-e IDENTITY=custom-collector-name` : 配置此采集器的唯一性标识符名称,多个采集器名称不能相同,建议自定义英文名称。
- `-e MANAGER_IP=127.0.0.1` : 配置连接主HertzBeat服务的对外IP。
- `-e MANAGER_PORT=1158` : 配置连接主HertzBeat服务的对外端口,默认1158。
更多配置详细步骤参考 [通过Docker方式安装HertzBeat](https://hertzbeat.apache.org/docs/start/docker-deploy)
---
### 更多的 v1.4.0 版本更新
> 更多版本新功能更新欢迎探索,感谢社区小伙伴们的辛苦贡献,爱心💗!
- [doc] add v1.3.2 publish doc by @tomsun28 in [https://github.com/apache/hertzbeat/pull/1075](https://github.com/apache/hertzbeat/pull/1075)
- remove elasticsearch unused param index by @Ceilzcx in [https://github.com/apache/hertzbeat/pull/1080](https://github.com/apache/hertzbeat/pull/1080)
- feature support monitoring apache airflow by @luoxuanzao in [https://github.com/apache/hertzbeat/pull/1081](https://github.com/apache/hertzbeat/pull/1081)
- add luoxuanzao as a contributor for code by @allcontributors in [https://github.com/apache/hertzbeat/pull/1083](https://github.com/apache/hertzbeat/pull/1083)
- [collector] bugfix sshd cannot use private key to connect by @gcdd1993 in [https://github.com/apache/hertzbeat/pull/1084](https://github.com/apache/hertzbeat/pull/1084)
- bugfix update dashboard alerts cards height not consist by @tomsun28 in [https://github.com/apache/hertzbeat/pull/1087](https://github.com/apache/hertzbeat/pull/1087)
- Feature#serverchan by @zqr10159 in [https://github.com/apache/hertzbeat/pull/1092](https://github.com/apache/hertzbeat/pull/1092)
- bugfix dm database monitoring connect error by @lisongning in [https://github.com/apache/hertzbeat/pull/1094](https://github.com/apache/hertzbeat/pull/1094)
- add lisongning as a contributor for code by @allcontributors in [https://github.com/apache/hertzbeat/pull/1096](https://github.com/apache/hertzbeat/pull/1096)
- update alert rule operator display display from "&lt;=" to ">=" by @Ceilzcx in [https://github.com/apache/hertzbeat/pull/1097](https://github.com/apache/hertzbeat/pull/1097)
- [doc] add custom monitoring relate document by @tomsun28 in [https://github.com/apache/hertzbeat/pull/1098](https://github.com/apache/hertzbeat/pull/1098)
- add YutingNie as a contributor for code by @allcontributors in [https://github.com/apache/hertzbeat/pull/1103](https://github.com/apache/hertzbeat/pull/1103)
- Remove unreachable status by @YutingNie in [https://github.com/apache/hertzbeat/pull/1102](https://github.com/apache/hertzbeat/pull/1102)
- 139 auto update alert status by @l646505418 in [https://github.com/apache/hertzbeat/pull/1104](https://github.com/apache/hertzbeat/pull/1104)
- feat: aviator fn for str contains, exists & matches by @mikezzb in [https://github.com/apache/hertzbeat/pull/1106](https://github.com/apache/hertzbeat/pull/1106)
- add mikezzb as a contributor for code by @allcontributors in [https://github.com/apache/hertzbeat/pull/1107](https://github.com/apache/hertzbeat/pull/1107)
- bugfix common alarm do not need monitorId tag existed by @tomsun28 in [https://github.com/apache/hertzbeat/pull/1108](https://github.com/apache/hertzbeat/pull/1108)
- bugfix extern alert do not have labels mapping inner monitor by @tomsun28 in [https://github.com/apache/hertzbeat/pull/1111](https://github.com/apache/hertzbeat/pull/1111)
- feature: support apache spark metrics monitoring by @a-little-fool in [https://github.com/apache/hertzbeat/pull/1114](https://github.com/apache/hertzbeat/pull/1114)
- add a-little-fool as a contributor for code by @allcontributors in [https://github.com/apache/hertzbeat/pull/1116](https://github.com/apache/hertzbeat/pull/1116)
- [Feature]Add third report of TenCloud by @zqr10159 in [https://github.com/apache/hertzbeat/pull/1113](https://github.com/apache/hertzbeat/pull/1113)
- [Feature]Add third report of TenCloud (#1113) by @zqr10159 in [https://github.com/apache/hertzbeat/pull/1119](https://github.com/apache/hertzbeat/pull/1119)
- [manager] fix: can query by tags when tagValue is null by @l646505418 in [https://github.com/apache/hertzbeat/pull/1118](https://github.com/apache/hertzbeat/pull/1118)
- bugfix the notification template environment variable display error by @tomsun28 in [https://github.com/apache/hertzbeat/pull/1120](https://github.com/apache/hertzbeat/pull/1120)
- add littlezhongzer as a contributor for code by @allcontributors in [https://github.com/apache/hertzbeat/pull/1127](https://github.com/apache/hertzbeat/pull/1127)
- feature:monitor brearer token api, ignore letter case to comparison by @littlezhongzer in [https://github.com/apache/hertzbeat/pull/1122](https://github.com/apache/hertzbeat/pull/1122)
- docs: enhance README by @mikezzb in [https://github.com/apache/hertzbeat/pull/1128](https://github.com/apache/hertzbeat/pull/1128)
- Update app-oracle.yml by @ChenXiangxxxxx in [https://github.com/apache/hertzbeat/pull/1129](https://github.com/apache/hertzbeat/pull/1129)
- add ChenXiangxxxxx as a contributor for code by @allcontributors in [https://github.com/apache/hertzbeat/pull/1130](https://github.com/apache/hertzbeat/pull/1130)
- fix alarm silence strategy setting failed by @Ceilzcx in [https://github.com/apache/hertzbeat/pull/1131](https://github.com/apache/hertzbeat/pull/1131)
- support run sql script file in jdbc protocol config by @tomsun28 in [https://github.com/apache/hertzbeat/pull/1117](https://github.com/apache/hertzbeat/pull/1117)
- bugfix return old cache json file when upgrade version by @tomsun28 in [https://github.com/apache/hertzbeat/pull/1137](https://github.com/apache/hertzbeat/pull/1137)
- support ssh protocol config choose if reuse connection by @tomsun28 in [https://github.com/apache/hertzbeat/pull/1136](https://github.com/apache/hertzbeat/pull/1136)
- feat(web): alert threshold UI support matches & contains by @mikezzb in [https://github.com/apache/hertzbeat/pull/1138](https://github.com/apache/hertzbeat/pull/1138)
- support hertzbeat metrics collector cluster by @tomsun28 in [https://github.com/apache/hertzbeat/pull/1101](https://github.com/apache/hertzbeat/pull/1101)
- add collector card in dashboard by @tomsun28 in [https://github.com/apache/hertzbeat/pull/1147](https://github.com/apache/hertzbeat/pull/1147)
- bugfix: linux collect warning: bad syntax, perhaps a bogus '-' by @Mr-zhou315 in [https://github.com/apache/hertzbeat/pull/1151](https://github.com/apache/hertzbeat/pull/1151)
- add Mr-zhou315 as a contributor for code by @allcontributors in [https://github.com/apache/hertzbeat/pull/1157](https://github.com/apache/hertzbeat/pull/1157)
- support config timezone locale language region on web ui by @tomsun28 in [https://github.com/apache/hertzbeat/pull/1154](https://github.com/apache/hertzbeat/pull/1154)
- bugfix monitoring template app name already exists by @tomsun28 in [https://github.com/apache/hertzbeat/pull/1152](https://github.com/apache/hertzbeat/pull/1152)
- bugfix can not startup when error monitoring template yml file by @tomsun28 in [https://github.com/apache/hertzbeat/pull/1153](https://github.com/apache/hertzbeat/pull/1153)
- tags also deleted when the monitor is deleted by @Ceilzcx in [https://github.com/apache/hertzbeat/pull/1159](https://github.com/apache/hertzbeat/pull/1159)
- monitoring param host with http head will not be error reported by @littlezhongzer in [https://github.com/apache/hertzbeat/pull/1155](https://github.com/apache/hertzbeat/pull/1155)
- [script] feature update build.sh and Dockerfile: detect app version a… by @XimfengYao in [https://github.com/apache/hertzbeat/pull/1162](https://github.com/apache/hertzbeat/pull/1162)
- add XimfengYao as a contributor for code by @allcontributors in [https://github.com/apache/hertzbeat/pull/1163](https://github.com/apache/hertzbeat/pull/1163)
- [doc] add collector clusters document by @tomsun28 in [https://github.com/apache/hertzbeat/pull/1161](https://github.com/apache/hertzbeat/pull/1161)
- [hertzbeat] release hertzbeat version v1.4.0 by @tomsun28 in [https://github.com/apache/hertzbeat/pull/1168](https://github.com/apache/hertzbeat/pull/1168)
---
## ⛄ 已支持
> 我们将监控采集类型(mysql,jvm,k8s)都定义为yml监控模板,用户可以导入这些模板来支持对应类型的监控!
> 欢迎大家一起贡献你使用过程中自定义的通用监控类型监控模板。
- Site Monitor, Port Availability, Http Api, Ping Connectivity, Jvm, SiteMap Full Site, Ssl Certificate, SpringBoot, FTP Server
- Mysql, PostgreSQL, MariaDB, Redis, ElasticSearch, SqlServer, Oracle, MongoDB, Damon, OpenGauss, ClickHouse, IoTDB, Redis Cluster
- Linux, Ubuntu, CentOS, Windows
- Tomcat, Nacos, Zookeeper, RabbitMQ, Flink, Kafka, ShenYu, DynamicTp, Jetty, ActiveMQ
- Kubernetes, Docker
- Huawei Switch, HPE Switch, TP-LINK Switch, Cisco Switch
- and more for your custom monitoring.
- Notifications support `Discord` `Slack` `Telegram` `Mail` `Pinning` `WeChat` `FlyBook` `SMS` `Webhook`.
- 和更多自定义监控模板。
- 通知支持 `Discord` `Slack` `Telegram` `邮件` `钉钉` `微信` `飞书` `短信` `Webhook`。
---
欢迎star一波来支持我们哦。
**Github: [https://github.com/apache/hertzbeat](https://github.com/apache/hertzbeat)**
**Gitee: [https://gitee.com/hertzbeat/hertzbeat](https://gitee.com/hertzbeat/hertzbeat)**
@@ -0,0 +1,87 @@
---
title: 热烈欢迎 HertzBeat 小伙伴新晋社区 Committer!
author: tom
author_title: tom
author_url: https://github.com/tomsun28
tags: [opensource, practice]
keywords: [open source monitoring system, alerting system]
---
![hertzBeat](/img/blog/new-committer.png)
很高兴迎来了新的社区`Committer`,和其它贡献者不一样的是`logicz`来自讯飞的运维实施岗位而不是开发岗位,但不管是代码还是文档等贡献质量都非常高👍。这也是我们`HertzBeat`与其它开源项目不一样的地方,因为用户群体更多面向运维开发,在我们139位贡献者中运维工程师的占比超30%,这打破了开源项目的协作贡献对象都是开发岗位的固有认知,这说明不管是运维工程师还是测试工程师对开源项目的贡献参与都是非常热情的,而不仅仅只是作为开源协作的旁观者。开源项目的参与并不是只专属于某一类人群,而是面向所有的想来参与的人,可能是一篇文档,一个脚本或者一段代码,想象一下你参与的开源项目被部署到成千上万的服务器上运行跑起来,帮助到他人被使用或者浏览Review讨论,git记录永留存,这也许就是参与开源项目的意义。
> 欢迎 HertzBeat 新晋社区 Committer logicz, 让我们来了解下他的开源经历吧!
## logicz
昵称:logicz
姓名:赵青然
现从事:科大讯飞技术支持&运维
HertzBeat Committer
githubzqr10159
## 初识HertzBeat
2023年3月开始接触HertzBeat,由于项目上需要一个完整的监控->告警平台,由于项目在内网部署,公司内部闭源的监控平台无法二次开发以满足跨网段告警的需求。后来在github寻找开源监控平台,发现了HertzBeat,易于部署且功能全面。最重要的是作者tom回复issue和更新的都很快,非常符合我对开源社区的想象,很高兴能够参与开源并且能够看到自己的成果为大家所用。
## 持续的开源贡献与收获
到目前为止,参与HertzBeat开源项目已有五个多月时间,从第一次提交issue到第一次提交pr,都是成长与进步的过程,满打满算还是有不少pr的,具体如下:
**贡献**
* 实现实时数据存入Redis自定义db
* 新增历史数据存入GreptimeDB
* 提供监控批量导入、导出为xlsx和yml文件功能
* 提供Web页面自定义邮件服务器设置功能
* 提供Apache doris FE,BE监控模板
* 实现ServerChan(Server酱)告警推送通知
* 接入第三方告警(腾讯云),实现第三方告警与HertzBeat告警统一推送
* 修复导入、导出监控时不含采集器信息等bug
* 若干文档的更新
**收获**
* HertzBeat真的是个很优秀的项目,在项目部署方面,脚本和配置都非常规范,我自己写的很多项目都有借鉴
* 最重要的还是收获到了开源精神,大家在一个社区里面共同交流、进步
## 感谢社区小伙伴
感谢作者tom的指导,他人的真的非常好,有耐心还很勤奋,经常半夜改bug,感谢他一步步带我走向开源之路(还送了我两件开源社区T恤^\_^)
## 对新人的一点建议
* 开源不易,要能够坚持下来,与大家分享自己的成果是很有成就感的一件事情
* 养成良好的代码习惯,代码可以写的不好,注释一定要写清楚,方便其他人阅读和修改你的代码
## 什么是 HertzBeat?
HertzBeat 赫兹跳动是一个拥有强大自定义监控能力,高性能集群,无需 Agent 的开源实时监控告警系统。
### 特点
***监控+告警+通知** 为一体,支持对应用服务,数据库,操作系统,中间件,云原生,网络等监控阈值告警通知一步到位。
* 易用友好,无需 `Agent`,全 `WEB` 页面操作,鼠标点一点就能监控告警,无需学习成本。
*`Http,Jmx,Ssh,Snmp,Jdbc` 等协议规范可配置化,只需在浏览器配置监控模板 `YML` 就能使用这些协议去自定义采集想要的指标。您相信只需简单配置即可快速适配一款 `K8s``Docker` 等新的监控类型吗?
* 高性能,支持多采集器集群横向扩展,支持多隔离网络监控,云边协同。
* 灵活的告警阈值规则,`邮件` `Discord` `Slack` `Telegram` `钉钉` `微信` `飞书` `短信` `Webhook` `Server酱` 等方式消息及时送达。
> `HertzBeat`的强大自定义,多类型支持,高性能,易扩展,低耦合,希望能帮助开发者和团队快速搭建自有监控系统。
Github: [https://github.com/apache/hertzbeat](https://github.com/apache/hertzbeat)
欢迎更多的用户参与到`HertzBeat`的开源协作中来,不管是一个错别字还是标点符号我们都非常欢迎。
@@ -0,0 +1,113 @@
---
title: 更好的用户体验, 开源实时监控 HertzBeat v1.4.1 发布
author: tom
author_title: tom
author_url: https://github.com/tomsun28
tags: [opensource, practice]
keywords: [open source monitoring system, alerting system, Linux monitoring]
---
哈喽大家好,时间很快两个月又过去了,HertzBeat 经过近两个月的迭代终于发布了 v1.4.1 版本。为什么是终于,因为有点难哈哈。我们参考 rocketmq 重构了 netty 的 server client 端模块,重构了采集器集群调度。比起上一版本有了更优雅的通讯代码,更完善全面的集群。
采集任务一致性hash调度,集群心跳保活,断开主动重连,主动上线下线,主动停机等等这些都有。设计了新的控制台登陆界面和欢迎页面,支持了采集器集群的UI管理,合并了开源之夏两位同学的帮助提示头特性和阈值表达式特性,很多用户需要的监控指标名称国际化等等,最重要的当然是修复若干BUG,体验下来确实增强了用户体验。
![hertzBeat](/img/home/0.png)
## 总结起来如下
- **重构netty client server, 采集器集群调度** @Ceilzcx @tomsun28
- **采集器集群的UI界面管理** @Ceilzcx @tomsun28
- **功能页面帮助信息模块和阈值表达式增强** 开源之夏和GLCC课题 @YutingNie @mikezzb
- **新的控制台登陆界面和欢迎页面**
- **监控指标名称国际化** 用户可以看指标的中英文名称啦,欢迎一起完善监控模板里面的i18n国际化资源
- **支持kubernetes helm charts一键部署** 见 [https://artifacthub.io/packages/search?repo=hertzbeat](https://artifacthub.io/packages/search?repo=hertzbeat)
**更多的特性和BUG修复,稳定性提示** 感谢 @zqr10159 @Carpe-Wang @luxx-lq @l646505418 @LINGLUOJUN @luelueking @qyaaaa @novohit @gcdd1993
### 上效果图
- 新的登陆页面UI
<img width="1952" alt="image" src="https://github.com/apache/hertzbeat/assets/24788200/5bc5015a-9343-472d-9754-6b06b9138893"/>
<img width="1950" alt="image" src="https://github.com/apache/hertzbeat/assets/24788200/71a29284-9cad-4ed2-983a-50430ddb1e2f"/>
- 支持采集器集群管理
<img width="1943" alt="image" src="https://github.com/apache/hertzbeat/assets/24788200/ba79f743-a450-4b01-adf0-5f15f3722c19"/>
<img width="1901" alt="image" src="https://github.com/apache/hertzbeat/assets/24788200/b090ec18-5aae-444e-9ef6-e62fd1d8d239"/>
- 友好的帮助文档头
<img width="1942" alt="image" src="https://github.com/apache/hertzbeat/assets/24788200/c635fab6-504b-47de-9b7e-0c2df86f7e6a"/>
- 监控指标名称国际化
<img width="1802" alt="image" src="https://github.com/apache/hertzbeat/assets/24788200/d5c74647-6c18-4b12-b858-f29cf1c61661"/>
### 什么是 HertzBeat?
[HertzBeat 赫兹跳动](https://github.com/apache/hertzbeat) 是一个拥有强大自定义监控能力,高性能集群,无需 Agent 的开源实时监控告警系统。
### 特点
-**监控+告警+通知** 为一体,支持对应用服务,应用程序,数据库,缓存,操作系统,大数据,中间件,Web服务器,云原生,网络,自定义等监控阈值告警通知一步到位。
- 易用友好,无需 `Agent`,全 `WEB` 页面操作,鼠标点一点就能监控告警,无需学习成本。
-`Http, Jmx, Ssh, Snmp, Jdbc, Prometheus` 等协议规范可配置化,只需在浏览器配置监控模板 `YML` 就能使用这些协议去自定义采集想要的指标。您相信只需简单配置即可快速适配一款 `K8s``Docker` 等新的监控类型吗?
- 高性能,支持多采集器集群横向扩展,支持多隔离网络监控,云边协同。
- 灵活的告警阈值规则,`邮件` `Discord` `Slack` `Telegram` `钉钉` `微信` `飞书` `短信` `Webhook` 等方式消息及时送达。
> `HertzBeat`的强大自定义,多类型支持,高性能,易扩展,低耦合,希望能帮助开发者和团队快速搭建自有监控系统。
![hertzBeat](/img/docs/hertzbeat-arch.png)
**Github: [https://github.com/apache/hertzbeat](https://github.com/apache/hertzbeat)**
**Gitee: [https://gitee.com/hertzbeat/hertzbeat](https://gitee.com/hertzbeat/hertzbeat)**
### 尝试部署
1. `docker` 环境仅需一条命令即可开始
```docker run -d -p 1157:1157 -p 1158:1158 --name hertzbeat apache/hertzbeat```
```或者使用 quay.io (若 dockerhub 网络链接超时)```
```docker run -d -p 1157:1157 -p 1158:1158 --name hertzbeat quay.io/tancloud/hertzbeat```
2. 浏览器访问 `http://localhost:1157` 即可开始,默认账号密码 `admin/hertzbeat`
3. 部署采集器集群
```shell
docker run -d -e IDENTITY=custom-collector-name -e MANAGER_HOST=127.0.0.1 -e MANAGER_PORT=1158 --name hertzbeat-collector apache/hertzbeat-collector
```
- `-e IDENTITY=custom-collector-name` : 配置此采集器的唯一性标识符名称,多个采集器名称不能相同,建议自定义英文名称。
- `-e MANAGER_HOST=127.0.0.1` : 配置连接主HertzBeat服务的对外IP。
- `-e MANAGER_PORT=1158` : 配置连接主HertzBeat服务的对外端口,默认1158。
更多配置详细步骤参考 [通过Docker方式安装HertzBeat](https://hertzbeat.apache.org/docs/start/docker-deploy)
---
## ⛄ 已支持
> 我们将监控采集类型(mysql,jvm,k8s)都定义为yml监控模板,用户可以导入这些模板来支持对应类型的监控!
> 欢迎大家一起贡献你使用过程中自定义的通用监控类型监控模板。
- Site Monitor, Port Availability, Http Api, Ping Connectivity, Jvm, SiteMap Full Site, Ssl Certificate, SpringBoot, FTP Server
- Mysql, PostgreSQL, MariaDB, Redis, ElasticSearch, SqlServer, Oracle, MongoDB, Damon, OpenGauss, ClickHouse, IoTDB, Redis Cluster
- Linux, Ubuntu, CentOS, Windows
- Tomcat, Nacos, Zookeeper, RabbitMQ, Flink, Kafka, ShenYu, DynamicTp, Jetty, ActiveMQ
- Kubernetes, Docker
- Huawei Switch, HPE Switch, TP-LINK Switch, Cisco Switch
- and more for your custom monitoring.
- Notifications support `Discord` `Slack` `Telegram` `Mail` `Pinning` `WeChat` `FlyBook` `SMS` `Webhook`.
- 和更多自定义监控模板。
- 通知支持 `Discord` `Slack` `Telegram` `邮件` `钉钉` `微信` `飞书` `短信` `Webhook` `Server酱`。
---
**Github: [https://github.com/apache/hertzbeat](https://github.com/apache/hertzbeat)**
**Gitee: [https://gitee.com/hertzbeat/hertzbeat](https://gitee.com/hertzbeat/hertzbeat)**
@@ -0,0 +1,90 @@
---
title: HertzBeat v1.4.2 版本发布,自定义消息通知模板
author: tom
author_title: tom
author_url: https://github.com/tomsun28
tags: [opensource, practice]
keywords: [open source monitoring system, alerting system, Linux monitoring]
---
哈喽大家好,开源实时监控 HertzBeat 新版本 v1.4.2 发布,欢迎了解使用。
![hertzBeat](/img/home/0.png)
## 总结起来如下
- **消息通知模板特性,开源之夏课题**
- **支持华为云OBS存储监控模板文件**
- **支持MQTT消息服务器 emqx 监控**
- **支持对 udp 端口可用性监控**
- **更多的特性功能支持和BUG修复**
- **安装包内置JDK一键启动**
**更多的特性和BUG修复欢迎使用探索,1.4.2 版本共有 13 位社区小伙伴们参与,感谢他们的贡献❤️**
### 什么是 HertzBeat?
[HertzBeat 赫兹跳动](https://github.com/apache/hertzbeat) 是一个拥有强大自定义监控能力,高性能集群,无需 Agent 的开源实时监控告警系统。
### 特点
-**监控+告警+通知** 为一体,支持对应用服务,应用程序,数据库,缓存,操作系统,大数据,中间件,Web服务器,云原生,网络,自定义等监控阈值告警通知一步到位。
- 易用友好,无需 `Agent`,全 `WEB` 页面操作,鼠标点一点就能监控告警,无需学习成本。
-`Http, Jmx, Ssh, Snmp, Jdbc, Prometheus` 等协议规范可配置化,只需在浏览器配置监控模板 `YML` 就能使用这些协议去自定义采集想要的指标。您相信只需简单配置即可快速适配一款 `K8s``Docker` 等新的监控类型吗?
- 高性能,支持多采集器集群横向扩展,支持多隔离网络监控,云边协同。
- 灵活的告警阈值规则,`邮件` `Discord` `Slack` `Telegram` `钉钉` `微信` `飞书` `短信` `Webhook` `Server酱` 等方式消息及时送达。
> `HertzBeat`的强大自定义,多类型支持,高性能,易扩展,低耦合,希望能帮助开发者和团队快速搭建自有监控系统。
![hertzBeat](/img/docs/hertzbeat-arch.png)
**Github: [https://github.com/apache/hertzbeat](https://github.com/apache/hertzbeat)**
**Gitee: [https://gitee.com/hertzbeat/hertzbeat](https://gitee.com/hertzbeat/hertzbeat)**
### 尝试部署
1. `docker` 环境仅需一条命令即可开始
```docker run -d -p 1157:1157 -p 1158:1158 --name hertzbeat apache/hertzbeat```
```或者使用 quay.io (若 dockerhub 网络链接超时)```
```docker run -d -p 1157:1157 -p 1158:1158 --name hertzbeat quay.io/tancloud/hertzbeat```
2. 浏览器访问 `http://localhost:1157` 即可开始,默认账号密码 `admin/hertzbeat`
3. 部署采集器集群
```shell
docker run -d -e IDENTITY=custom-collector-name -e MANAGER_HOST=127.0.0.1 -e MANAGER_PORT=1158 --name hertzbeat-collector apache/hertzbeat-collector
```
- `-e IDENTITY=custom-collector-name` : 配置此采集器的唯一性标识符名称,多个采集器名称不能相同,建议自定义英文名称。
- `-e MANAGER_HOST=127.0.0.1` : 配置连接主HertzBeat服务的对外IP。
- `-e MANAGER_PORT=1158` : 配置连接主HertzBeat服务的对外端口,默认1158。
更多配置详细步骤参考 [通过Docker方式安装HertzBeat](https://hertzbeat.apache.org/docs/start/docker-deploy)
---
## ⛄ 已支持
> 我们将监控采集类型(mysql,jvm,k8s)都定义为yml监控模板,用户可以导入这些模板来支持对应类型的监控!
> 欢迎大家一起贡献你使用过程中自定义的通用监控类型监控模板。
- Site Monitor, Port Availability, Http Api, Ping Connectivity, Jvm, SiteMap Full Site, Ssl Certificate, SpringBoot, FTP Server
- Mysql, PostgreSQL, MariaDB, Redis, ElasticSearch, SqlServer, Oracle, MongoDB, Damon, OpenGauss, ClickHouse, IoTDB, Redis Cluster
- Linux, Ubuntu, CentOS, Windows
- Tomcat, Nacos, Zookeeper, RabbitMQ, Flink, Kafka, ShenYu, DynamicTp, Jetty, ActiveMQ
- Kubernetes, Docker
- Huawei Switch, HPE Switch, TP-LINK Switch, Cisco Switch
- and more for your custom monitoring.
- Notifications support `Discord` `Slack` `Telegram` `Mail` `Pinning` `WeChat` `FlyBook` `SMS` `Webhook`.
- 和更多自定义监控模板。
- 通知支持 `Discord` `Slack` `Telegram` `邮件` `钉钉` `微信` `飞书` `短信` `Webhook` `Server酱`。
---
**Github: [https://github.com/apache/hertzbeat](https://github.com/apache/hertzbeat)**
**Gitee: [https://gitee.com/hertzbeat/hertzbeat](https://gitee.com/hertzbeat/hertzbeat)**
@@ -0,0 +1,167 @@
---
title: HertzBeat v1.4.3 发布,Prometheus兼容!
author: tom
author_title: tom
author_url: https://github.com/tomsun28
tags: [opensource, practice]
keywords: [open source monitoring system, alerting system]
---
## 什么是 HertzBeat?
[HertzBeat 赫兹跳动](https://github.com/apache/hertzbeat) 是一个拥有强大自定义监控能力,高性能集群,兼容 Prometheus,无需 Agent 的开源实时监控告警系统。
### 特点
-**监控+告警+通知** 为一体,支持对应用服务,应用程序,数据库,缓存,操作系统,大数据,中间件,Web服务器,云原生,网络,自定义等监控阈值告警通知一步到位。
- 易用友好,无需 `Agent`,全 `WEB` 页面操作,鼠标点一点就能监控告警,无需学习成本。
-`Http, Jmx, Ssh, Snmp, Jdbc, Prometheus` 等协议规范可配置化,只需在浏览器配置监控模板 `YML` 就能使用这些协议去自定义采集想要的指标。您相信只需简单配置即可快速适配一款 `K8s``Docker` 等新的监控类型吗?
- 兼容 `Prometheus` 的系统生态并且更多,只需页面操作就可以监控 `Prometheus` 所能监控的。
- 高性能,支持多采集器集群横向扩展,支持多隔离网络监控,云边协同。
- 灵活的告警阈值规则,`邮件` `Discord` `Slack` `Telegram` `钉钉` `微信` `飞书` `短信` `Webhook` `Server酱` 等方式消息及时送达。
**Github: [https://github.com/apache/hertzbeat](https://github.com/apache/hertzbeat)**
**Gitee: [https://gitee.com/hertzbeat/hertzbeat](https://gitee.com/hertzbeat/hertzbeat)**
### HertzBeat's 1.4.3 新版本发布啦
- 三方外部告警上报增强
- 支持 mysql api port website mongodb jvm redis 等监控指标的i18n国际化
- Prometheus生态兼容,支持添加Prometheus任务
- 支持使用 VictoriaMetrics 时序数据库作为系统指标数据存储
- 支持监控 Spring Gateway 指标
- 新增更多 Windows 监控指标
- 添加 e2e 测试模块,由 api-testing 支持
- 更多的特性,文档优化和BUG修复
兼容 `Prometheus` 的系统生态,现在我们只需页面操作就可以监控 `Prometheus` 所监控的。
### 尝试部署
1. `docker` 环境仅需一条命令即可开始
```docker run -d -p 1157:1157 -p 1158:1158 --name hertzbeat apache/hertzbeat```
```或者使用 quay.io (若 dockerhub 网络链接超时)```
```docker run -d -p 1157:1157 -p 1158:1158 --name hertzbeat quay.io/tancloud/hertzbeat```
2. 浏览器访问 `http://localhost:1157` 即可开始,默认账号密码 `admin/hertzbeat`
3. 部署采集器集群
```shell
docker run -d -e IDENTITY=custom-collector-name -e MANAGER_HOST=127.0.0.1 -e MANAGER_PORT=1158 --name hertzbeat-collector apache/hertzbeat-collector
```
- `-e IDENTITY=custom-collector-name` : 配置此采集器的唯一性标识符名称,多个采集器名称不能相同,建议自定义英文名称。
- `-e MANAGER_HOST=127.0.0.1` : 配置连接主HertzBeat服务的对外IP。
- `-e MANAGER_PORT=1158` : 配置连接主HertzBeat服务的对外端口,默认1158。
更多配置详细步骤参考 [通过Docker方式安装HertzBeat](https://hertzbeat.apache.org/docs/start/docker-deploy)
---
## ⛄ 已支持
> 我们将监控采集类型(mysql,jvm,k8s)都定义为yml监控模板,用户可以导入这些模板来支持对应类型的监控!
> 欢迎大家一起贡献你使用过程中自定义的通用监控类型监控模板。
- Site Monitor, Port Availability, Http Api, Ping Connectivity, Jvm, SiteMap Full Site, Ssl Certificate, SpringBoot, FTP Server
- Mysql, PostgreSQL, MariaDB, Redis, ElasticSearch, SqlServer, Oracle, MongoDB, Damon, OpenGauss, ClickHouse, IoTDB, Redis Cluster
- Linux, Ubuntu, CentOS, Windows
- Tomcat, Nacos, Zookeeper, RabbitMQ, Flink, Kafka, ShenYu, DynamicTp, Jetty, ActiveMQ
- Kubernetes, Docker
- Huawei Switch, HPE Switch, TP-LINK Switch, Cisco Switch
- and more for your custom monitoring.
- Notifications support `Discord` `Slack` `Telegram` `Mail` `Pinning` `WeChat` `FlyBook` `SMS` `Webhook`.
- 和更多自定义监控模板。
- 通知支持 `Discord` `Slack` `Telegram` `邮件` `钉钉` `微信` `飞书` `短信` `Webhook` `Server酱`。
---
**Github: [https://github.com/apache/hertzbeat](https://github.com/apache/hertzbeat)**
**Gitee: [https://gitee.com/hertzbeat/hertzbeat](https://gitee.com/hertzbeat/hertzbeat)**
---
### What's Changed
> Welcome to explore more new version updates, thanks to the hard work of the community partners, love 💗!
- update package deploy doc by @tomsun28 in [https://github.com/apache/hertzbeat/pull/1330](https://github.com/apache/hertzbeat/pull/1330)
- bugfix duplicate collect job when update monitor templates by @tomsun28 in [https://github.com/apache/hertzbeat/pull/1332](https://github.com/apache/hertzbeat/pull/1332)
- bugfix number variable in freemarker template display error by @tomsun28 in [https://github.com/apache/hertzbeat/pull/1334](https://github.com/apache/hertzbeat/pull/1334)
- [alerter] Enhanced reporting of external general alert API by @SurryChen in [https://github.com/apache/hertzbeat/pull/1326](https://github.com/apache/hertzbeat/pull/1326)
- [doc] update hertzbeat-mysql-tdengine readme by @jiashu1024 in [https://github.com/apache/hertzbeat/pull/1335](https://github.com/apache/hertzbeat/pull/1335)
- add jiashu1024 as a contributor for doc by @allcontributors in [https://github.com/apache/hertzbeat/pull/1336](https://github.com/apache/hertzbeat/pull/1336)
- app-mysql.yml: Adjust slow query translation by @1036664317 in [https://github.com/apache/hertzbeat/pull/1337](https://github.com/apache/hertzbeat/pull/1337)
- add 1036664317 as a contributor for doc by @allcontributors in [https://github.com/apache/hertzbeat/pull/1338](https://github.com/apache/hertzbeat/pull/1338)
- Bump com.google.guava:guava from 31.0.1-jre to 32.0.0-jre by @dependabot in [https://github.com/apache/hertzbeat/pull/1339](https://github.com/apache/hertzbeat/pull/1339)
- [feature] support auto collect metrics by prometheus task by @tomsun28 in [https://github.com/apache/hertzbeat/pull/1342](https://github.com/apache/hertzbeat/pull/1342)
- [doc] add vinci as new committer by @tomsun28 in [https://github.com/apache/hertzbeat/pull/1341](https://github.com/apache/hertzbeat/pull/1341)
- [feature] add tag word cloud in dashboard by @tomsun28 in [https://github.com/apache/hertzbeat/pull/1345](https://github.com/apache/hertzbeat/pull/1345)
- support custom prometheus endpoint path by @tomsun28 in [https://github.com/apache/hertzbeat/pull/1346](https://github.com/apache/hertzbeat/pull/1346)
- bugfix tdengine query interval history metrics data with instance error by @tomsun28 in [https://github.com/apache/hertzbeat/pull/1348](https://github.com/apache/hertzbeat/pull/1348)
- unlimit Alert.java content field length by @xiaoguolong in [https://github.com/apache/hertzbeat/pull/1351](https://github.com/apache/hertzbeat/pull/1351)
- add xiaoguolong as a contributor for code by @allcontributors in [https://github.com/apache/hertzbeat/pull/1353](https://github.com/apache/hertzbeat/pull/1353)
- update monitor detail table ui layout by @tomsun28 in [https://github.com/apache/hertzbeat/pull/1352](https://github.com/apache/hertzbeat/pull/1352)
- [doc]add star history by @zqr10159 in [https://github.com/apache/hertzbeat/pull/1356](https://github.com/apache/hertzbeat/pull/1356)
- feature: app-mongodb.yml by @a-little-fool in [https://github.com/apache/hertzbeat/pull/1359](https://github.com/apache/hertzbeat/pull/1359)
- alarm threshold support prometheus task metrics by @tomsun28 in [https://github.com/apache/hertzbeat/pull/1354](https://github.com/apache/hertzbeat/pull/1354)
- support victoriametrics as metrics data storage by @tomsun28 in [https://github.com/apache/hertzbeat/pull/1361](https://github.com/apache/hertzbeat/pull/1361)
- Add time type to support query_time of mysql and mariadb by @Clownsw in [https://github.com/apache/hertzbeat/pull/1364](https://github.com/apache/hertzbeat/pull/1364)
- add Clownsw as a contributor for code by @allcontributors in [https://github.com/apache/hertzbeat/pull/1365](https://github.com/apache/hertzbeat/pull/1365)
- Error occurred when I followed running steps to start Front-web by @Calvin979 in [https://github.com/apache/hertzbeat/pull/1366](https://github.com/apache/hertzbeat/pull/1366)
- add Calvin979 as a contributor for doc by @allcontributors in [https://github.com/apache/hertzbeat/pull/1367](https://github.com/apache/hertzbeat/pull/1367)
- enriches the cncf landscape by @tomsun28 in [https://github.com/apache/hertzbeat/pull/1368](https://github.com/apache/hertzbeat/pull/1368)
- Fix flaky test in CollectUtilTest by @bbelide2 in [https://github.com/apache/hertzbeat/pull/1371](https://github.com/apache/hertzbeat/pull/1371)
- add bbelide2 as a contributor for code by @allcontributors in [https://github.com/apache/hertzbeat/pull/1372](https://github.com/apache/hertzbeat/pull/1372)
- Fix flaky test replaceSmilingPlaceholder by @bbelide2 in [https://github.com/apache/hertzbeat/pull/1373](https://github.com/apache/hertzbeat/pull/1373)
- add docker-compose script hertzbeat+mysql+victoria-metrics all in one by @tomsun28 in [https://github.com/apache/hertzbeat/pull/1370](https://github.com/apache/hertzbeat/pull/1370)
- Feature: app-jvm.yml support for international name aliases by @Calvin979 in [https://github.com/apache/hertzbeat/pull/1376](https://github.com/apache/hertzbeat/pull/1376)
- add Calvin979 as a contributor for code by @allcontributors in [https://github.com/apache/hertzbeat/pull/1377](https://github.com/apache/hertzbeat/pull/1377)
- feature: support monitoring spring gateway metrics by @a-little-fool in [https://github.com/apache/hertzbeat/pull/1374](https://github.com/apache/hertzbeat/pull/1374)
- update code comment and doc, bugfix concurrent exception by @tomsun28 in [https://github.com/apache/hertzbeat/pull/1378](https://github.com/apache/hertzbeat/pull/1378)
- update windows define and accept snmp leaf by @jinyaoMa in [https://github.com/apache/hertzbeat/pull/1379](https://github.com/apache/hertzbeat/pull/1379)
- add jinyaoMa as a contributor for code by @allcontributors in [https://github.com/apache/hertzbeat/pull/1380](https://github.com/apache/hertzbeat/pull/1380)
- fix exception when sending email has special chars by @Carpe-Wang in [https://github.com/apache/hertzbeat/pull/1383](https://github.com/apache/hertzbeat/pull/1383)
- test: add e2e testing for some basic APIs by @LinuxSuRen in [https://github.com/apache/hertzbeat/pull/1387](https://github.com/apache/hertzbeat/pull/1387)
- add LinuxSuRen as a contributor for code, and test by @allcontributors in [https://github.com/apache/hertzbeat/pull/1389](https://github.com/apache/hertzbeat/pull/1389)
- bugfix auto generate monitor name error when add monitor by @tomsun28 in [https://github.com/apache/hertzbeat/pull/1384](https://github.com/apache/hertzbeat/pull/1384)
- bugfix CalculateAlarm execAlertExpression NPE by @tomsun28 in [https://github.com/apache/hertzbeat/pull/1388](https://github.com/apache/hertzbeat/pull/1388)
- Feature: app-redis.yml support for international name aliases by @Calvin979 in [https://github.com/apache/hertzbeat/pull/1390](https://github.com/apache/hertzbeat/pull/1390)
- test: add more monitor related e2e testing case by @LinuxSuRen in [https://github.com/apache/hertzbeat/pull/1391](https://github.com/apache/hertzbeat/pull/1391)
- chore: update the pr template about the e2e testing by @LinuxSuRen in [https://github.com/apache/hertzbeat/pull/1392](https://github.com/apache/hertzbeat/pull/1392)
- add help header ui when update or add monitors by @tomsun28 in [https://github.com/apache/hertzbeat/pull/1399](https://github.com/apache/hertzbeat/pull/1399)
- [hertzbeat] release hertzbeat version v1.4.3 by @tomsun28 in [https://github.com/apache/hertzbeat/pull/1400](https://github.com/apache/hertzbeat/pull/1400)
## New Contributors
- @1036664317 made their first contribution in [https://github.com/apache/hertzbeat/pull/1337](https://github.com/apache/hertzbeat/pull/1337)
- @dependabot made their first contribution in [https://github.com/apache/hertzbeat/pull/1339](https://github.com/apache/hertzbeat/pull/1339)
- @xiaoguolong made their first contribution in [https://github.com/apache/hertzbeat/pull/1351](https://github.com/apache/hertzbeat/pull/1351)
- @Clownsw made their first contribution in [https://github.com/apache/hertzbeat/pull/1364](https://github.com/apache/hertzbeat/pull/1364)
- @Calvin979 made their first contribution in [https://github.com/apache/hertzbeat/pull/1366](https://github.com/apache/hertzbeat/pull/1366)
- @bbelide2 made their first contribution in [https://github.com/apache/hertzbeat/pull/1371](https://github.com/apache/hertzbeat/pull/1371)
- @jinyaoMa made their first contribution in [https://github.com/apache/hertzbeat/pull/1379](https://github.com/apache/hertzbeat/pull/1379)
- @LinuxSuRen made their first contribution in [https://github.com/apache/hertzbeat/pull/1387](https://github.com/apache/hertzbeat/pull/1387)
---
## ⛄ Supported
- Site Monitor, Port Availability, Http Api, Ping Connectivity, Jvm, SiteMap Full Site, Ssl Certificate, SpringBoot, FTP Server
- Mysql, PostgreSQL, MariaDB, Redis, ElasticSearch, SqlServer, Oracle, MongoDB, Damon, OpenGauss, ClickHouse, IoTDB, Redis Cluster
- Linux, Ubuntu, CentOS, Windows
- Tomcat, Nacos, Zookeeper, RabbitMQ, Flink, Kafka, ShenYu, DynamicTp, Jetty, ActiveMQ
- Kubernetes, Docker
- Huawei Switch, HPE Switch, TP-LINK Switch, Cisco Switch
- and more for your custom monitoring.
- Notifications support `Discord` `Slack` `Telegram` `Mail` `Pinning` `WeChat` `FlyBook` `SMS` `Webhook` `ServerChan`.
---
**Github: [https://github.com/apache/hertzbeat](https://github.com/apache/hertzbeat)**
**Gitee: [https://gitee.com/hertzbeat/hertzbeat](https://gitee.com/hertzbeat/hertzbeat)**
@@ -0,0 +1,135 @@
---
title: 热烈欢迎 HertzBeat 三位小伙伴新晋社区 Committer!
author: tom
author_title: tom
author_url: https://github.com/tomsun28
tags: [opensource, practice]
keywords: [open source monitoring system, alerting system]
---
![hertzBeat](/img/blog/new-committer.png)
> 热烈欢迎 HertzBeat 有三位小伙伴新晋社区 Committer, 让我们来了解下他们的开源经历吧!
## New Committer - leo
**姓名:Leo**
**Github ID: leo-934**
### 初识HertzBeat
2023年3月,我关注到了HertzBeat的项目,于是直接给社区的Tom老哥发了邮件咨询是否可以加入,老哥很爽快的给了回复。刚好我当时正是大四时间比较充裕,就果断挑了一个issue解决,在hertzbeat有了第一个pull request。
### 开始提交PR
在之后一段时间里,我花了一段时间阅读HertzBeat的代码,又断断续续的交了几个pr。直到4月份,我了解到开源之夏相关活动,刚好HertzBeat也在参加,所以提交了报名信息后便顺利入选。我的任务主要是负责实现一个推送方式的采集器,在编写代码的过程中,我得到了许多社区的郑晨鑫导师和Tom老哥帮助,最终能够顺利完成代码,整个过程还是比较顺利的。
### 开源贡献
- 新增push module,暴露接口供用户推送数据。
- 在collector模块中实现对推送数据的采集。
- 在前端中实现展示用户自定义的数据。
### 收获
- 接触到了很优秀的开源社区,提升了相关领域的技术水平。
感谢Tom哥和我的ospp导师郑晨鑫,他们在我接触开源社区的过程中给出了许多帮助和建议。目前我仍然在社区中负责部分代码的开发,希望HertzBeat以后可以越来越好!
---
## New Committer - 淞筱
**姓名:周书胜**
**河南师范大学大三学生**
### 初识HertzBeat
今年三月份,在小宝学长的影响下,对开源项目有了些许概念,并为后来学习开源项目奠定了基础,但由于当时只学习了一些Java基础,所以并没有再深入了解。
### 开始提交PR
在今年七月份,基本完成Java框架开发的学习后,在小宝学长的鼓励下,我开始尝试拉取issue,并在7月20日提交了第一个PR。在此期间,也咨询了HertzBeat作者和东风学长一些相关问题,实在感谢。
### 开源贡献
- 支持Spring Gateway、Apache Spark、Apache Hive等服务指标采集
- 自定义nginx、pop3协议,对Nginx,POP3邮箱服务器进行指标采集,并添加相应帮助文档
### 收获
- 接触了更加优秀、结构更加复杂的大型项目,提高了编程和解决问题的能力
- 将理论知识付诸于实践,收获了JUC,微服务相关的开发经验,以及宝贵的项目经历
### 感谢社区小伙伴
感谢HertzBeat的作者、HertzBeat/Sms4j Committer铁甲小宝同学、Sms4j Committer东风同学,在我遇到自己不能解决的问题时,常常向三位哥哥请教,他们也总是不厌其烦,耐心的帮助我解决问题,实在是无以言表。
感谢社区的其它小伙伴,在与他们交流讨论的过程中收获满满,也感受到了社区活跃的开源氛围。
### 给新人的一些建议
- 初次参与开源项目时,可以从简单的任务开始。逐渐熟悉项目的代码和流程,并逐步承担更复杂的任务。
- 如果遇到自己无法解决的问题时,可以多多请教社区的小伙伴们。
---
## New Committer - 东风
**姓名:张洋**
**河南师范大学应届生**
### 初识hertzbeat
今年6月份开始对项目进行深入了解,我是经朋友推荐了解该项目的,一直对开源项目和社区有所探索,很喜欢这种大家互相分享、讨论并改进的氛围。同时之前在项目中也尝试实现一些监控,所以对于该项目比较感兴趣。
### 开始提交PR
在今年7月起,我发现hertzbeat的issue和pr很活跃,于是就通过他们的issue和pr来了解如何实现某个协议的监控。随后我发现有关于smtp协议监控的task,就在issue上与作者进行讨论,随后通过文档和代码完成了自己的pr。
### 开源贡献
- 实现smtp、ntp、websocket可用性的监控。
- 实现memcached 、NebulaGraph的监控指标。
- 为实现的监控添加相关文档。
### 收获
- 收获了监控相关的开发经验,新增了一个宝贵的项目经历。
- 对于网络协议有了更深刻的了解。
- 对于开源项目的贡献流程有了初步认识。
### 感谢社区小伙伴
感谢hertzbeat的作者提供的相关文档和帮助。感谢朋友的带领,为我提供了勇气,让我敢于尝试进入开源项目进行贡献。感谢社区中其他的小伙伴的issue和pr,加快了我对于该项目的了解。
### 对新人的一点建议
- issue和pr是你了解的项目的敲门砖,一点要敢于讨论并发表观点。
- 贡献不分大小,要敢于尝试,并不断提升自己。
---
## 什么是 HertzBeat?
[HertzBeat 赫兹跳动](https://github.com/apache/hertzbeat) 是一个拥有强大自定义监控能力,高性能集群,兼容 Prometheus,无需 Agent 的开源实时监控告警系统。
### 特点
-**监控+告警+通知** 为一体,支持对应用服务,应用程序,数据库,缓存,操作系统,大数据,中间件,Web服务器,云原生,网络,自定义等监控阈值告警通知一步到位。
- 易用友好,无需 `Agent`,全 `WEB` 页面操作,鼠标点一点就能监控告警,无需学习成本。
-`Http, Jmx, Ssh, Snmp, Jdbc, Prometheus` 等协议规范可配置化,只需在浏览器配置监控模板 `YML` 就能使用这些协议去自定义采集想要的指标。您相信只需简单配置即可快速适配一款 `K8s``Docker` 等新的监控类型吗?
- 兼容 `Prometheus` 的系统生态并且更多,只需页面操作就可以监控 `Prometheus` 所能监控的。
- 高性能,支持多采集器集群横向扩展,支持多隔离网络监控,云边协同。
- 灵活的告警阈值规则,`邮件` `Discord` `Slack` `Telegram` `钉钉` `微信` `飞书` `短信` `Webhook` `Server酱` 等方式消息及时送达。
> `HertzBeat`的强大自定义,多类型支持,高性能,易扩展,低耦合,希望能帮助开发者和团队快速搭建自有监控系统。
**Github: [https://github.com/apache/hertzbeat](https://github.com/apache/hertzbeat)**
**Gitee: [https://gitee.com/hertzbeat/hertzbeat](https://gitee.com/hertzbeat/hertzbeat)**
欢迎更多小伙伴参与到HertzBeat的开源协作中来,不管是一个错别字还是标点符号我们都非常欢迎,大家一起学习进步,目标做一个世界级开源软件。
@@ -0,0 +1,181 @@
---
title: HertzBeat v1.4.4 发布!
author: tom
author_title: tom
author_url: https://github.com/tomsun28
tags: [opensource, practice]
keywords: [open source monitoring system, alerting system]
---
## 什么是 HertzBeat?
[HertzBeat 赫兹跳动](https://github.com/apache/hertzbeat) 是一个拥有强大自定义监控能力,高性能集群,兼容 Prometheus,无需 Agent 的开源实时监控告警系统。
### 特点
-**监控+告警+通知** 为一体,支持对应用服务,应用程序,数据库,缓存,操作系统,大数据,中间件,Web服务器,云原生,网络,自定义等监控阈值告警通知一步到位。
- 易用友好,无需 `Agent`,全 `WEB` 页面操作,鼠标点一点就能监控告警,无需学习成本。
-`Http, Jmx, Ssh, Snmp, Jdbc, Prometheus` 等协议规范可配置化,只需在浏览器配置监控模板 `YML` 就能使用这些协议去自定义采集想要的指标。您相信只需简单配置即可快速适配一款 `K8s``Docker` 等新的监控类型吗?
- 兼容 `Prometheus` 的系统生态并且更多,只需页面操作就可以监控 `Prometheus` 所能监控的。
- 高性能,支持多采集器集群横向扩展,支持多隔离网络监控,云边协同。
- 灵活的告警阈值规则,`邮件` `Discord` `Slack` `Telegram` `钉钉` `微信` `飞书` `短信` `Webhook` `Server酱` 等方式消息及时送达。
**Github: [https://github.com/apache/hertzbeat](https://github.com/apache/hertzbeat)**
**Gitee: [https://gitee.com/hertzbeat/hertzbeat](https://gitee.com/hertzbeat/hertzbeat)**
### HertzBeat's 1.4.4 新版本发布啦
- support snmp v3 monitoring protocol @TJxiaobao
- support monitoring NebulaGraph metrics @ZY945
- support monitoring pop3 metrics @a-little-fool
- support monitoring memcached metrics @ZY945
- support monitoring nginx metrics @a-little-fool
- support monitoring hive metrics @a-little-fool
- feature: support for dns monitoring by @Calvin979
- monitoring the availability of websockets through handshake. by @ZY945
- add ntp protocol and support ntp monitoring by @ZY945
- add smtp protocol and support smtp monitoring by @ZY945
- more feature, document and bugfix
### 尝试部署
1. `docker` 环境仅需一条命令即可开始
```docker run -d -p 1157:1157 -p 1158:1158 --name hertzbeat apache/hertzbeat```
```或者使用 quay.io (若 dockerhub 网络链接超时)```
```docker run -d -p 1157:1157 -p 1158:1158 --name hertzbeat quay.io/tancloud/hertzbeat```
2. 浏览器访问 `http://localhost:1157` 即可开始,默认账号密码 `admin/hertzbeat`
3. 部署采集器集群
```shell
docker run -d -e IDENTITY=custom-collector-name -e MANAGER_HOST=127.0.0.1 -e MANAGER_PORT=1158 --name hertzbeat-collector apache/hertzbeat-collector
```
- `-e IDENTITY=custom-collector-name` : 配置此采集器的唯一性标识符名称,多个采集器名称不能相同,建议自定义英文名称。
- `-e MANAGER_HOST=127.0.0.1` : 配置连接主HertzBeat服务的对外IP。
- `-e MANAGER_PORT=1158` : 配置连接主HertzBeat服务的对外端口,默认1158。
更多配置详细步骤参考 [通过Docker方式安装HertzBeat](https://hertzbeat.apache.org/docs/start/docker-deploy)
---
## ⛄ 已支持
> 我们将监控采集类型(mysql,jvm,k8s)都定义为yml监控模板,用户可以导入这些模板来支持对应类型的监控!
> 欢迎大家一起贡献你使用过程中自定义的通用监控类型监控模板。
- Site Monitor, Port Availability, Http Api, Ping Connectivity, Jvm, SiteMap Full Site, Ssl Certificate, SpringBoot, FTP Server
- Mysql, PostgreSQL, MariaDB, Redis, ElasticSearch, SqlServer, Oracle, MongoDB, Damon, OpenGauss, ClickHouse, IoTDB, Redis Cluster
- Linux, Ubuntu, CentOS, Windows
- Tomcat, Nacos, Zookeeper, RabbitMQ, Flink, Kafka, ShenYu, DynamicTp, Jetty, ActiveMQ
- Kubernetes, Docker
- Huawei Switch, HPE Switch, TP-LINK Switch, Cisco Switch
- and more for your custom monitoring.
- Notifications support `Discord` `Slack` `Telegram` `Mail` `Pinning` `WeChat` `FlyBook` `SMS` `Webhook`.
- 和更多自定义监控模板。
- 通知支持 `Discord` `Slack` `Telegram` `邮件` `钉钉` `微信` `飞书` `短信` `Webhook` `Server酱`。
---
**Github: [https://github.com/apache/hertzbeat](https://github.com/apache/hertzbeat)**
**Gitee: [https://gitee.com/hertzbeat/hertzbeat](https://gitee.com/hertzbeat/hertzbeat)**
---
### What's Changed
> Welcome to explore more new version updates, thanks to the hard work of the community partners, love 💗!
- bugfix metrics tags value store jpa data-storage error by @tomsun28 in [https://github.com/apache/hertzbeat/pull/1403](https://github.com/apache/hertzbeat/pull/1403)
- add smtp protocol and support smtp monitoring by @ZY945 in [https://github.com/apache/hertzbeat/pull/1407](https://github.com/apache/hertzbeat/pull/1407)
- add ZY945 as a contributor for code by @allcontributors in [https://github.com/apache/hertzbeat/pull/1409](https://github.com/apache/hertzbeat/pull/1409)
- support new parse type 'log' in ssh collect protocol by @tomsun28 in [https://github.com/apache/hertzbeat/pull/1410](https://github.com/apache/hertzbeat/pull/1410)
- add ntp protocol and support ntp monitoring by @ZY945 in [https://github.com/apache/hertzbeat/pull/1411](https://github.com/apache/hertzbeat/pull/1411)
- monitoring the availability of websockets through handshake. by @ZY945 in [https://github.com/apache/hertzbeat/pull/1413](https://github.com/apache/hertzbeat/pull/1413)
- Task-1386 When adding tags in tag management, random colors are given by default. by @prolevel1 in [https://github.com/apache/hertzbeat/pull/1412](https://github.com/apache/hertzbeat/pull/1412)
- add prolevel1 as a contributor for code by @allcontributors in [https://github.com/apache/hertzbeat/pull/1415](https://github.com/apache/hertzbeat/pull/1415)
-
## 1397 feature: support for dns monitoring by @Calvin979 in [https://github.com/apache/hertzbeat/pull/1416](https://github.com/apache/hertzbeat/pull/1416)
- Support monitoring hive metrics by @a-little-fool in [https://github.com/apache/hertzbeat/pull/1417](https://github.com/apache/hertzbeat/pull/1417)
- support legend pageable in history data charts by @tomsun28 in [https://github.com/apache/hertzbeat/pull/1414](https://github.com/apache/hertzbeat/pull/1414)
- update component tip and help tip doc by @tomsun28 in [https://github.com/apache/hertzbeat/pull/1418](https://github.com/apache/hertzbeat/pull/1418)
- feature: support monitoring nginx metrics and add a help doc by @a-little-fool in [https://github.com/apache/hertzbeat/pull/1420](https://github.com/apache/hertzbeat/pull/1420)
- update parser to parse from prometheus txt metrics data by @tomsun28 in [https://github.com/apache/hertzbeat/pull/1421](https://github.com/apache/hertzbeat/pull/1421)
- support monitoring memcached metrics and add a help doc by @ZY945 in [https://github.com/apache/hertzbeat/pull/1423](https://github.com/apache/hertzbeat/pull/1423)
- support all ssh connect key exchange by @tomsun28 in [https://github.com/apache/hertzbeat/pull/1424](https://github.com/apache/hertzbeat/pull/1424)
- doc add code of conduct by @tomsun28 in [https://github.com/apache/hertzbeat/pull/1425](https://github.com/apache/hertzbeat/pull/1425)
- update label structure store in victoria metrics, make it prometheus like by @tomsun28 in [https://github.com/apache/hertzbeat/pull/1426](https://github.com/apache/hertzbeat/pull/1426)
- feature: support monitoring pop3 metrics and add help doc by @a-little-fool in [https://github.com/apache/hertzbeat/pull/1427](https://github.com/apache/hertzbeat/pull/1427)
- Update sidebars.json by @a-little-fool in [https://github.com/apache/hertzbeat/pull/1428](https://github.com/apache/hertzbeat/pull/1428)
- Add zh-cn help doc by @a-little-fool in [https://github.com/apache/hertzbeat/pull/1429](https://github.com/apache/hertzbeat/pull/1429)
- update monitoring state un-manage to unmonitored, update pic by @tomsun28 in [https://github.com/apache/hertzbeat/pull/1430](https://github.com/apache/hertzbeat/pull/1430)
- Add jpa to date type storage by @Clownsw in [https://github.com/apache/hertzbeat/pull/1431](https://github.com/apache/hertzbeat/pull/1431)
- bugfix ^o^ token error, protect metrics api auth by @tomsun28 in [https://github.com/apache/hertzbeat/pull/1434](https://github.com/apache/hertzbeat/pull/1434)
- Add relevant documents for SMTP and NTP by @ZY945 in [https://github.com/apache/hertzbeat/pull/1437](https://github.com/apache/hertzbeat/pull/1437)
- bugfix threshold init error in mysql env by @tomsun28 in [https://github.com/apache/hertzbeat/pull/1435](https://github.com/apache/hertzbeat/pull/1435)
- app-rabbitmq.yml support for international name aliases by @ZY945 in [https://github.com/apache/hertzbeat/pull/1439](https://github.com/apache/hertzbeat/pull/1439)
- fix: error create lru-cache-timeout-cleaner thread by @Clownsw in [https://github.com/apache/hertzbeat/pull/1438](https://github.com/apache/hertzbeat/pull/1438)
- app-rabbitmq.yml Modifying Error Fields. by @ZY945 in [https://github.com/apache/hertzbeat/pull/1440](https://github.com/apache/hertzbeat/pull/1440)
- support monitoring NebulaGraph metrics and add help doc by @ZY945 in [https://github.com/apache/hertzbeat/pull/1441](https://github.com/apache/hertzbeat/pull/1441)
- Fix Nginx Collect validateParams function NPE by @Clownsw in [https://github.com/apache/hertzbeat/pull/1442](https://github.com/apache/hertzbeat/pull/1442)
- feature: add metrics i18n for app-springboot3.yml by @liyin in [https://github.com/apache/hertzbeat/pull/1445](https://github.com/apache/hertzbeat/pull/1445)
- feat: add metrics i18n for app-docker.yml by @liyin in [https://github.com/apache/hertzbeat/pull/1446](https://github.com/apache/hertzbeat/pull/1446)
- update docker-compose script and fix version by @tomsun28 in [https://github.com/apache/hertzbeat/pull/1447](https://github.com/apache/hertzbeat/pull/1447)
- bugfix java.lang.IllegalArgumentException: Illegal character in query… by @tomsun28 in [https://github.com/apache/hertzbeat/pull/1443](https://github.com/apache/hertzbeat/pull/1443)
- bugfix delete monitor error after monitor canceled by @ZhangZixuan1994 in [https://github.com/apache/hertzbeat/pull/1451](https://github.com/apache/hertzbeat/pull/1451)
- add ZhangZixuan1994 as a contributor for code by @allcontributors in [https://github.com/apache/hertzbeat/pull/1454](https://github.com/apache/hertzbeat/pull/1454)
- remove sleep, probably busy-waiting by @tomsun28 in [https://github.com/apache/hertzbeat/pull/1456](https://github.com/apache/hertzbeat/pull/1456)
- doc add new committer ZY945 by @tomsun28 in [https://github.com/apache/hertzbeat/pull/1453](https://github.com/apache/hertzbeat/pull/1453)
- Update app-zookeeper.yml by @hurenjie1 in [https://github.com/apache/hertzbeat/pull/1458](https://github.com/apache/hertzbeat/pull/1458)
- add hurenjie1 as a contributor for code by @allcontributors in [https://github.com/apache/hertzbeat/pull/1459](https://github.com/apache/hertzbeat/pull/1459)
- update dashboard ui, remove ssh custom SignatureFactories, update app name by @tomsun28 in [https://github.com/apache/hertzbeat/pull/1460](https://github.com/apache/hertzbeat/pull/1460)
- Task Monitoring Template Yml Metrics I18n | 监控模板指标国际化任务认领 #1212 by @tslj1024 in [https://github.com/apache/hertzbeat/pull/1461](https://github.com/apache/hertzbeat/pull/1461)
- add tslj1024 as a contributor for code by @allcontributors in [https://github.com/apache/hertzbeat/pull/1462](https://github.com/apache/hertzbeat/pull/1462)
- Add alarm trigger time for alarm restore by @Calvin979 in [https://github.com/apache/hertzbeat/pull/1464](https://github.com/apache/hertzbeat/pull/1464)
- bugfix history range query not work when victoria-metrics store by @tomsun28 in [https://github.com/apache/hertzbeat/pull/1463](https://github.com/apache/hertzbeat/pull/1463)
- bugfix springboot3 translation by @liyin in [https://github.com/apache/hertzbeat/pull/1467](https://github.com/apache/hertzbeat/pull/1467)
- bugfix telegram-notice can not input bot-token by @tomsun28 in [https://github.com/apache/hertzbeat/pull/1465](https://github.com/apache/hertzbeat/pull/1465)
- feat: support hostname target by @ldysdu in [https://github.com/apache/hertzbeat/pull/1455](https://github.com/apache/hertzbeat/pull/1455)
- add ldysdu as a contributor for code by @allcontributors in [https://github.com/apache/hertzbeat/pull/1471](https://github.com/apache/hertzbeat/pull/1471)
- feature support snmp v3 monitoring protocol by @TJxiaobao in [https://github.com/apache/hertzbeat/pull/1469](https://github.com/apache/hertzbeat/pull/1469)
- bugfix alarm trigger-times not work when alarm and recovered trigger cyclically by @tomsun28 in [https://github.com/apache/hertzbeat/pull/1468](https://github.com/apache/hertzbeat/pull/1468)
- update switch monitoring metrics i18n by @tomsun28 in [https://github.com/apache/hertzbeat/pull/1472](https://github.com/apache/hertzbeat/pull/1472)
- fixed: snmpv3 contextName bug by @TJxiaobao in [https://github.com/apache/hertzbeat/pull/1473](https://github.com/apache/hertzbeat/pull/1473)
- Fix npt of webhook notify by @Calvin979 in [https://github.com/apache/hertzbeat/pull/1474](https://github.com/apache/hertzbeat/pull/1474)
- hertzbeat release hertzbeat version v1.4.4 by @tomsun28 in [https://github.com/apache/hertzbeat/pull/1475](https://github.com/apache/hertzbeat/pull/1475)
- bugfix nginx collect http deadlock error by @tomsun28 in [https://github.com/apache/hertzbeat/pull/1476](https://github.com/apache/hertzbeat/pull/1476)
- alarm calculate ignore metrics collect code - TIMEOUT by @tomsun28 in [https://github.com/apache/hertzbeat/pull/1478](https://github.com/apache/hertzbeat/pull/1478)
## New Contributors
- @ZY945 made their first contribution in [https://github.com/apache/hertzbeat/pull/1407](https://github.com/apache/hertzbeat/pull/1407)
- @prolevel1 made their first contribution in [https://github.com/apache/hertzbeat/pull/1412](https://github.com/apache/hertzbeat/pull/1412)
- @ZhangZixuan1994 made their first contribution in [https://github.com/apache/hertzbeat/pull/1451](https://github.com/apache/hertzbeat/pull/1451)
- @hurenjie1 made their first contribution in [https://github.com/apache/hertzbeat/pull/1458](https://github.com/apache/hertzbeat/pull/1458)
- @tslj1024 made their first contribution in [https://github.com/apache/hertzbeat/pull/1461](https://github.com/apache/hertzbeat/pull/1461)
- @ldysdu made their first contribution in [https://github.com/apache/hertzbeat/pull/1455](https://github.com/apache/hertzbeat/pull/1455)
---
## Supported
- Site Monitor, Port Availability, Http Api, Ping Connectivity, Jvm, SiteMap Full Site, Ssl Certificate, SpringBoot, FTP Server
- Mysql, PostgreSQL, MariaDB, Redis, ElasticSearch, SqlServer, Oracle, MongoDB, Damon, OpenGauss, ClickHouse, IoTDB, Redis Cluster
- Linux, Ubuntu, CentOS, Windows
- Tomcat, Nacos, Zookeeper, RabbitMQ, Flink, Kafka, ShenYu, DynamicTp, Jetty, ActiveMQ
- Kubernetes, Docker
- Huawei Switch, HPE Switch, TP-LINK Switch, Cisco Switch
- and more for your custom monitoring.
- Notifications support `Discord` `Slack` `Telegram` `Mail` `Pinning` `WeChat` `FlyBook` `SMS` `Webhook` `ServerChan`.
---
**Github: [https://github.com/apache/hertzbeat](https://github.com/apache/hertzbeat)**
**Gitee: [https://gitee.com/hertzbeat/hertzbeat](https://gitee.com/hertzbeat/hertzbeat)**
@@ -0,0 +1,319 @@
---
title: 开源实时监控 HertzBeat 捐赠进入 Apache 孵化器。
author: tom
author_title: tom
author_url: https://github.com/tomsun28
tags: [opensource, practice]
keywords: [open source monitoring system, alerting system]
---
北京时间 2024 年 4 月 5 日,开源实时监控系统 HertzBeat 正式通过 Apache 基金会的投票决议,根据 Apache 基金会邮件列表显示,HertzBeat 以 16 个约束性投票 (binging votes) 和 1 个 无约束性投票 (non-binding votes), 无弃权和反对票通过接收 HertzBeat 加入 Apache 孵化器决议。
HertzBeat 于 2022 年 1 月在 Dromara 开源社区正式开源,经过两年多的社区小伙伴们的不间断项目维护迭代,持续的社区成长,现在,HertzBeat 正式官宣加入 Apache 孵化器!
![HertzBeat](/img/blog/apache-incubator-1.png)
![HertzBeat](/img/blog/apache-incubator-2.png)
加入 Apache 孵化器不是终点,这是项目的全新起点。加入 Apache 孵化器后,在社区层面,HertzBeat 将积极践行『开放、协作』 的 Apache 之道,持续构建一个公平,多元,包容的开源社区。在开源产品层面,倾听用户声音,提升优化产品使用体验,打造对接开源生态。
非常欢迎各位加入到 HertzBeat 社区,社区接受任何形式的贡献,让我们一起共同推动开源的发展,希望有朝一日 HertzBeat 能像 Apache Kafka, Apache Tomcat 这些基金会顶级项目一样,成为一款世界级的开源产品,我们所贡献的代码被部署运行在全球的各个行业,各个角落。
## 什么是 HertzBeat
[Apache HertzBeat](https://github.com/apache/hertzbeat) 是一个易用友好的开源实时监控告警系统,无需 Agent,高性能集群,兼容 Prometheus,提供强大的自定义监控和状态页构建能力。
### 特点
-**监控+告警+通知** 为一体,支持对应用服务,应用程序,数据库,缓存,操作系统,大数据,中间件,Web服务器,云原生,网络,自定义等监控阈值告警通知一步到位。
- 易用友好,无需 `Agent`,全 `WEB` 页面操作,鼠标点一点就能监控告警,无需学习成本。
-`Http, Jmx, Ssh, Snmp, Jdbc, Prometheus` 等协议规范可配置化,只需在浏览器配置监控模板 `YML` 就能使用这些协议去自定义采集想要的指标。您相信只需简单配置即可快速适配一款 `K8s``Docker` 等新的监控类型吗?
- 兼容 `Prometheus` 的系统生态并且更多,只需页面操作就可以监控 `Prometheus` 所能监控的。
- 高性能,支持多采集器集群横向扩展,支持多隔离网络监控,云边协同。
- 灵活的告警阈值规则,`邮件` `Discord` `Slack` `Telegram` `钉钉` `微信` `飞书` `短信` `Webhook` `Server酱` 等方式消息及时送达。
- 提供强大的状态页构建能力,轻松向用户传达您产品服务的实时状态。
> `HertzBeat`的强大自定义,多类型支持,高性能,易扩展,低耦合,希望能帮助用户快速搭建自有监控系统。
## HertzBeat 发展现状
HertzBeat 开源以来主仓库在 GitHub 累计收获 **4.5K+** star, Gitee **2.4K+** star, 累计发布版本 **20** 次,统计的软件安装包 DockerHub 等下载安装量累计超 **100K+** ,社区参与代码贡献人数 **180** 人,项目和社区的不断完善进步, 由衷的感谢每位贡献者的努力和付出💗。
## 社区小伙伴们
> 谢谢这些可爱的贡献者们。
<table>
<tbody>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/tomsun28"><img src="https://avatars.githubusercontent.com/u/24788200?v=4?s=100" width="100px;" alt="tomsun28"/><br /><sub><b>tomsun28</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/commits?author=tomsun28" title="Code">💻</a> <a href="https://github.com/apache/hertzbeat/commits?author=tomsun28" title="Documentation">📖</a> <a href="#design-tomsun28" title="Design">🎨</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/wang1027-wqh"><img src="https://avatars.githubusercontent.com/u/71161318?v=4?s=100" width="100px;" alt="会编程的王学长"/><br /><sub><b>会编程的王学长</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/commits?author=wang1027-wqh" title="Code">💻</a> <a href="https://github.com/apache/hertzbeat/commits?author=wang1027-wqh" title="Documentation">📖</a> <a href="#design-wang1027-wqh" title="Design">🎨</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://www.maxkey.top/"><img src="https://avatars.githubusercontent.com/u/1563377?v=4?s=100" width="100px;" alt="MaxKey"/><br /><sub><b>MaxKey</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/commits?author=shimingxy" title="Code">💻</a> <a href="#design-shimingxy" title="Design">🎨</a> <a href="#ideas-shimingxy" title="Ideas, Planning, & Feedback">🤔</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://blog.gcdd.top/"><img src="https://avatars.githubusercontent.com/u/26523525?v=4?s=100" width="100px;" alt="观沧海"/><br /><sub><b>观沧海</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/commits?author=gcdd1993" title="Code">💻</a> <a href="#design-gcdd1993" title="Design">🎨</a> <a href="https://github.com/apache/hertzbeat/issues?q=author%3Agcdd1993" title="Bug reports">🐛</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/a25017012"><img src="https://avatars.githubusercontent.com/u/32265356?v=4?s=100" width="100px;" alt="yuye"/><br /><sub><b>yuye</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/commits?author=a25017012" title="Code">💻</a> <a href="https://github.com/apache/hertzbeat/commits?author=a25017012" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/jx10086"><img src="https://avatars.githubusercontent.com/u/5323228?v=4?s=100" width="100px;" alt="jx10086"/><br /><sub><b>jx10086</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/commits?author=jx10086" title="Code">💻</a> <a href="https://github.com/apache/hertzbeat/issues?q=author%3Ajx10086" title="Bug reports">🐛</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/winnerTimer"><img src="https://avatars.githubusercontent.com/u/76024658?v=4?s=100" width="100px;" alt="winnerTimer"/><br /><sub><b>winnerTimer</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/commits?author=winnerTimer" title="Code">💻</a> <a href="https://github.com/apache/hertzbeat/issues?q=author%3AwinnerTimer" title="Bug reports">🐛</a></td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/goo-kits"><img src="https://avatars.githubusercontent.com/u/13163673?v=4?s=100" width="100px;" alt="goo-kits"/><br /><sub><b>goo-kits</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/commits?author=goo-kits" title="Code">💻</a> <a href="https://github.com/apache/hertzbeat/issues?q=author%3Agoo-kits" title="Bug reports">🐛</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/brave4Time"><img src="https://avatars.githubusercontent.com/u/105094014?v=4?s=100" width="100px;" alt="brave4Time"/><br /><sub><b>brave4Time</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/commits?author=brave4Time" title="Code">💻</a> <a href="https://github.com/apache/hertzbeat/issues?q=author%3Abrave4Time" title="Bug reports">🐛</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/walkerlee-lab"><img src="https://avatars.githubusercontent.com/u/8426753?v=4?s=100" width="100px;" alt="WalkerLee"/><br /><sub><b>WalkerLee</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/commits?author=walkerlee-lab" title="Code">💻</a> <a href="https://github.com/apache/hertzbeat/issues?q=author%3Awalkerlee-lab" title="Bug reports">🐛</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/fullofjoy"><img src="https://avatars.githubusercontent.com/u/30247571?v=4?s=100" width="100px;" alt="jianghang"/><br /><sub><b>jianghang</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/commits?author=fullofjoy" title="Code">💻</a> <a href="https://github.com/apache/hertzbeat/issues?q=author%3Afullofjoy" title="Bug reports">🐛</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/ChineseTony"><img src="https://avatars.githubusercontent.com/u/24618786?v=4?s=100" width="100px;" alt="ChineseTony"/><br /><sub><b>ChineseTony</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/commits?author=ChineseTony" title="Code">💻</a> <a href="https://github.com/apache/hertzbeat/issues?q=author%3AChineseTony" title="Bug reports">🐛</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/wyt199905"><img src="https://avatars.githubusercontent.com/u/85098809?v=4?s=100" width="100px;" alt="wyt199905"/><br /><sub><b>wyt199905</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/commits?author=wyt199905" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/weifuqing"><img src="https://avatars.githubusercontent.com/u/13931013?v=4?s=100" width="100px;" alt="卫傅庆"/><br /><sub><b>卫傅庆</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/commits?author=weifuqing" title="Code">💻</a> <a href="https://github.com/apache/hertzbeat/issues?q=author%3Aweifuqing" title="Bug reports">🐛</a></td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/zklmcookle"><img src="https://avatars.githubusercontent.com/u/107192352?v=4?s=100" width="100px;" alt="zklmcookle"/><br /><sub><b>zklmcookle</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/commits?author=zklmcookle" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/DevilX5"><img src="https://avatars.githubusercontent.com/u/13269921?v=4?s=100" width="100px;" alt="DevilX5"/><br /><sub><b>DevilX5</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/commits?author=DevilX5" title="Documentation">📖</a> <a href="https://github.com/apache/hertzbeat/commits?author=DevilX5" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/djzeng"><img src="https://avatars.githubusercontent.com/u/14074864?v=4?s=100" width="100px;" alt="tea"/><br /><sub><b>tea</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/commits?author=djzeng" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/yangshihui"><img src="https://avatars.githubusercontent.com/u/28550208?v=4?s=100" width="100px;" alt="yangshihui"/><br /><sub><b>yangshihui</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/commits?author=yangshihui" title="Code">💻</a> <a href="https://github.com/apache/hertzbeat/issues?q=author%3Ayangshihui" title="Bug reports">🐛</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/DreamGirl524"><img src="https://avatars.githubusercontent.com/u/81132838?v=4?s=100" width="100px;" alt="DreamGirl524"/><br /><sub><b>DreamGirl524</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/commits?author=DreamGirl524" title="Code">💻</a> <a href="https://github.com/apache/hertzbeat/commits?author=DreamGirl524" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/gzwlly"><img src="https://avatars.githubusercontent.com/u/83171907?v=4?s=100" width="100px;" alt="gzwlly"/><br /><sub><b>gzwlly</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/commits?author=gzwlly" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/cuipiheqiuqiu"><img src="https://avatars.githubusercontent.com/u/76642201?v=4?s=100" width="100px;" alt="cuipiheqiuqiu"/><br /><sub><b>cuipiheqiuqiu</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/commits?author=cuipiheqiuqiu" title="Code">💻</a> <a href="https://github.com/apache/hertzbeat/commits?author=cuipiheqiuqiu" title="Tests">⚠️</a> <a href="#design-cuipiheqiuqiu" title="Design">🎨</a></td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/oyiyou"><img src="https://avatars.githubusercontent.com/u/39228891?v=4?s=100" width="100px;" alt="lambert"/><br /><sub><b>lambert</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/commits?author=oyiyou" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="http://mroldx.xyz/"><img src="https://avatars.githubusercontent.com/u/34847828?v=4?s=100" width="100px;" alt="mroldx"/><br /><sub><b>mroldx</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/commits?author=mroldx" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/woshiniusange"><img src="https://avatars.githubusercontent.com/u/91513022?v=4?s=100" width="100px;" alt="woshiniusange"/><br /><sub><b>woshiniusange</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/commits?author=woshiniusange" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://vampireachao.github.io/"><img src="https://avatars.githubusercontent.com/u/52746628?v=4?s=100" width="100px;" alt="VampireAchao"/><br /><sub><b>VampireAchao</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/commits?author=VampireAchao" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Ceilzcx"><img src="https://avatars.githubusercontent.com/u/48920254?v=4?s=100" width="100px;" alt="zcx"/><br /><sub><b>zcx</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/commits?author=Ceilzcx" title="Code">💻</a> <a href="https://github.com/apache/hertzbeat/issues?q=author%3ACeilzcx" title="Bug reports">🐛</a> <a href="#design-Ceilzcx" title="Design">🎨</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/CharlieXCL"><img src="https://avatars.githubusercontent.com/u/91540487?v=4?s=100" width="100px;" alt="CharlieXCL"/><br /><sub><b>CharlieXCL</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/commits?author=CharlieXCL" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Privauto"><img src="https://avatars.githubusercontent.com/u/36581456?v=4?s=100" width="100px;" alt="Privauto"/><br /><sub><b>Privauto</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/commits?author=Privauto" title="Code">💻</a> <a href="https://github.com/apache/hertzbeat/commits?author=Privauto" title="Documentation">📖</a></td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/emrys-he"><img src="https://avatars.githubusercontent.com/u/5848915?v=4?s=100" width="100px;" alt="emrys"/><br /><sub><b>emrys</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/commits?author=emrys-he" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/SxLiuYu"><img src="https://avatars.githubusercontent.com/u/95198625?v=4?s=100" width="100px;" alt="SxLiuYu"/><br /><sub><b>SxLiuYu</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/issues?q=author%3ASxLiuYu" title="Bug reports">🐛</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://allcontributors.org"><img src="https://avatars.githubusercontent.com/u/46410174?v=4?s=100" width="100px;" alt="All Contributors"/><br /><sub><b>All Contributors</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/commits?author=all-contributors" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/gxc-myh"><img src="https://avatars.githubusercontent.com/u/85919258?v=4?s=100" width="100px;" alt="铁甲小宝"/><br /><sub><b>铁甲小宝</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/commits?author=gxc-myh" title="Code">💻</a> <a href="https://github.com/apache/hertzbeat/commits?author=gxc-myh" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/click33"><img src="https://avatars.githubusercontent.com/u/36243476?v=4?s=100" width="100px;" alt="click33"/><br /><sub><b>click33</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/commits?author=click33" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://jpom.io/"><img src="https://avatars.githubusercontent.com/u/16408873?v=4?s=100" width="100px;" alt="蒋小小"/><br /><sub><b>蒋小小</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/commits?author=bwcx-jzy" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://www.zhihu.com/people/kevinbauer"><img src="https://avatars.githubusercontent.com/u/28581579?v=4?s=100" width="100px;" alt="Kevin Huang"/><br /><sub><b>Kevin Huang</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/commits?author=kevinhuangwl" title="Documentation">📖</a></td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/TJxiaobao"><img src="https://avatars.githubusercontent.com/u/85919258?v=4?s=100" width="100px;" alt="铁甲小宝"/><br /><sub><b>铁甲小宝</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/issues?q=author%3ATJxiaobao" title="Bug reports">🐛</a> <a href="https://github.com/apache/hertzbeat/commits?author=TJxiaobao" title="Code">💻</a> <a href="https://github.com/apache/hertzbeat/commits?author=TJxiaobao" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Jack-123-power"><img src="https://avatars.githubusercontent.com/u/84333501?v=4?s=100" width="100px;" alt="Captain Jack"/><br /><sub><b>Captain Jack</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/commits?author=Jack-123-power" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/haibo-duan"><img src="https://avatars.githubusercontent.com/u/7974845?v=4?s=100" width="100px;" alt="haibo.duan"/><br /><sub><b>haibo.duan</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/commits?author=haibo-duan" title="Tests">⚠️</a> <a href="https://github.com/apache/hertzbeat/commits?author=haibo-duan" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/assassinfym"><img src="https://avatars.githubusercontent.com/u/15188754?v=4?s=100" width="100px;" alt="assassin"/><br /><sub><b>assassin</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/issues?q=author%3Aassassinfym" title="Bug reports">🐛</a> <a href="https://github.com/apache/hertzbeat/commits?author=assassinfym" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/csyshu"><img src="https://avatars.githubusercontent.com/u/46591658?v=4?s=100" width="100px;" alt="Reverse wind"/><br /><sub><b>Reverse wind</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/commits?author=csyshu" title="Tests">⚠️</a> <a href="https://github.com/apache/hertzbeat/commits?author=csyshu" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/luxx-lq"><img src="https://avatars.githubusercontent.com/u/58515565?v=4?s=100" width="100px;" alt="luxx"/><br /><sub><b>luxx</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/commits?author=luxx-lq" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://bandism.net/"><img src="https://avatars.githubusercontent.com/u/22633385?v=4?s=100" width="100px;" alt="Ikko Ashimine"/><br /><sub><b>Ikko Ashimine</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/commits?author=eltociear" title="Documentation">📖</a></td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/zenan08"><img src="https://avatars.githubusercontent.com/u/80514991?v=4?s=100" width="100px;" alt="leizenan"/><br /><sub><b>leizenan</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/commits?author=zenan08" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/BKing2020"><img src="https://avatars.githubusercontent.com/u/28869121?v=4?s=100" width="100px;" alt="BKing"/><br /><sub><b>BKing</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/commits?author=BKing2020" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/xingshuaiLi"><img src="https://avatars.githubusercontent.com/u/119487588?v=4?s=100" width="100px;" alt="xingshuaiLi"/><br /><sub><b>xingshuaiLi</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/commits?author=xingshuaiLi" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/wangke6666"><img src="https://avatars.githubusercontent.com/u/113656595?v=4?s=100" width="100px;" alt="wangke6666"/><br /><sub><b>wangke6666</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/commits?author=wangke6666" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/LWBobo"><img src="https://avatars.githubusercontent.com/u/50368698?v=4?s=100" width="100px;" alt="刺猬"/><br /><sub><b>刺猬</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/issues?q=author%3ALWBobo" title="Bug reports">🐛</a> <a href="https://github.com/apache/hertzbeat/commits?author=LWBobo" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="http://www.zanglikun.com"><img src="https://avatars.githubusercontent.com/u/61591648?v=4?s=100" width="100px;" alt="Haste"/><br /><sub><b>Haste</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/commits?author=zanglikun" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/SuitSmile"><img src="https://avatars.githubusercontent.com/u/38679717?v=4?s=100" width="100px;" alt="zhongshi.yi"/><br /><sub><b>zhongshi.yi</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/commits?author=SuitSmile" title="Documentation">📖</a></td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://www.smallq.cn"><img src="https://avatars.githubusercontent.com/u/39754275?v=4?s=100" width="100px;" alt="Qi Zhang"/><br /><sub><b>Qi Zhang</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/commits?author=zzzhangqi" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/MrAndyMing"><img src="https://avatars.githubusercontent.com/u/49541483?v=4?s=100" width="100px;" alt="MrAndyMing"/><br /><sub><b>MrAndyMing</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/commits?author=MrAndyMing" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://idongliming.github.io/"><img src="https://avatars.githubusercontent.com/u/31564353?v=4?s=100" width="100px;" alt="idongliming"/><br /><sub><b>idongliming</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/commits?author=idongliming" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://earthjasonlin.github.io"><img src="https://avatars.githubusercontent.com/u/83632110?v=4?s=100" width="100px;" alt="Zichao Lin"/><br /><sub><b>Zichao Lin</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/commits?author=earthjasonlin" title="Code">💻</a> <a href="https://github.com/apache/hertzbeat/commits?author=earthjasonlin" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="http://blog.liudonghua.com"><img src="https://avatars.githubusercontent.com/u/2276718?v=4?s=100" width="100px;" alt="liudonghua"/><br /><sub><b>liudonghua</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/commits?author=liudonghua123" title="Code">💻</a> <a href="#ideas-liudonghua123" title="Ideas, Planning, & Feedback">🤔</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/orangeyts"><img src="https://avatars.githubusercontent.com/u/4250869?v=4?s=100" width="100px;" alt="Jerry"/><br /><sub><b>Jerry</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/commits?author=orangeyts" title="Code">💻</a> <a href="https://github.com/apache/hertzbeat/commits?author=orangeyts" title="Tests">⚠️</a> <a href="#ideas-orangeyts" title="Ideas, Planning, & Feedback">🤔</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://dynamictp.cn"><img src="https://avatars.githubusercontent.com/u/13051908?v=4?s=100" width="100px;" alt="yanhom"/><br /><sub><b>yanhom</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/commits?author=yanhom1314" title="Documentation">📖</a></td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://www.jianshu.com/u/a8f822c04f67"><img src="https://avatars.githubusercontent.com/u/18587688?v=4?s=100" width="100px;" alt="fsl"/><br /><sub><b>fsl</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/commits?author=fengshunli" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/xttttv"><img src="https://avatars.githubusercontent.com/u/116323904?v=4?s=100" width="100px;" alt="xttttv"/><br /><sub><b>xttttv</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/commits?author=xttttv" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/NavinKumarBarnwal"><img src="https://avatars.githubusercontent.com/u/44504274?v=4?s=100" width="100px;" alt="NavinKumarBarnwal"/><br /><sub><b>NavinKumarBarnwal</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/commits?author=NavinKumarBarnwal" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/z641205699"><img src="https://avatars.githubusercontent.com/u/45276423?v=4?s=100" width="100px;" alt="Zakkary"/><br /><sub><b>Zakkary</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/commits?author=z641205699" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/898349230"><img src="https://avatars.githubusercontent.com/u/21972532?v=4?s=100" width="100px;" alt="sunxinbo"/><br /><sub><b>sunxinbo</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/commits?author=898349230" title="Code">💻</a> <a href="https://github.com/apache/hertzbeat/commits?author=898349230" title="Tests">⚠️</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/ldzbook"><img src="https://avatars.githubusercontent.com/u/13903790?v=4?s=100" width="100px;" alt="ldzbook"/><br /><sub><b>ldzbook</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/commits?author=ldzbook" title="Documentation">📖</a> <a href="https://github.com/apache/hertzbeat/issues?q=author%3Aldzbook" title="Bug reports">🐛</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/SurryChen"><img src="https://avatars.githubusercontent.com/u/91116490?v=4?s=100" width="100px;" alt="余与雨"/><br /><sub><b>余与雨</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/commits?author=SurryChen" title="Code">💻</a> <a href="https://github.com/apache/hertzbeat/commits?author=SurryChen" title="Tests">⚠️</a></td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/MysticalDream"><img src="https://avatars.githubusercontent.com/u/78899028?v=4?s=100" width="100px;" alt="MysticalDream"/><br /><sub><b>MysticalDream</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/commits?author=MysticalDream" title="Code">💻</a> <a href="https://github.com/apache/hertzbeat/commits?author=MysticalDream" title="Tests">⚠️</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/zhouyoulin12"><img src="https://avatars.githubusercontent.com/u/17086633?v=4?s=100" width="100px;" alt="zhouyoulin12"/><br /><sub><b>zhouyoulin12</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/commits?author=zhouyoulin12" title="Code">💻</a> <a href="https://github.com/apache/hertzbeat/commits?author=zhouyoulin12" title="Tests">⚠️</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/jerjjj"><img src="https://avatars.githubusercontent.com/u/93431283?v=4?s=100" width="100px;" alt="jerjjj"/><br /><sub><b>jerjjj</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/commits?author=jerjjj" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://wjl110.xyz/"><img src="https://avatars.githubusercontent.com/u/53851034?v=4?s=100" width="100px;" alt="wjl110"/><br /><sub><b>wjl110</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/commits?author=wjl110" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/ngyhd"><img src="https://avatars.githubusercontent.com/u/29095207?v=4?s=100" width="100px;" alt="Sean"/><br /><sub><b>Sean</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/commits?author=ngyhd" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Daydreamer-ia"><img src="https://avatars.githubusercontent.com/u/83362909?v=4?s=100" width="100px;" alt="chenyiqin"/><br /><sub><b>chenyiqin</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/commits?author=Daydreamer-ia" title="Code">💻</a> <a href="https://github.com/apache/hertzbeat/commits?author=Daydreamer-ia" title="Tests">⚠️</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/hudongdong129"><img src="https://avatars.githubusercontent.com/u/34374227?v=4?s=100" width="100px;" alt="hudongdong129"/><br /><sub><b>hudongdong129</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/commits?author=hudongdong129" title="Code">💻</a> <a href="https://github.com/apache/hertzbeat/commits?author=hudongdong129" title="Tests">⚠️</a> <a href="https://github.com/apache/hertzbeat/commits?author=hudongdong129" title="Documentation">📖</a></td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/TherChenYang"><img src="https://avatars.githubusercontent.com/u/124348939?v=4?s=100" width="100px;" alt="TherChenYang"/><br /><sub><b>TherChenYang</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/commits?author=TherChenYang" title="Code">💻</a> <a href="https://github.com/apache/hertzbeat/commits?author=TherChenYang" title="Tests">⚠️</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/HattoriHenzo"><img src="https://avatars.githubusercontent.com/u/5141285?v=4?s=100" width="100px;" alt="HattoriHenzo"/><br /><sub><b>HattoriHenzo</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/commits?author=HattoriHenzo" title="Code">💻</a> <a href="https://github.com/apache/hertzbeat/commits?author=HattoriHenzo" title="Tests">⚠️</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/ycilry"><img src="https://avatars.githubusercontent.com/u/63967101?v=4?s=100" width="100px;" alt="ycilry"/><br /><sub><b>ycilry</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/commits?author=ycilry" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/aoshiguchen"><img src="https://avatars.githubusercontent.com/u/10580997?v=4?s=100" width="100px;" alt="aoshiguchen"/><br /><sub><b>aoshiguchen</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/commits?author=aoshiguchen" title="Documentation">📖</a> <a href="https://github.com/apache/hertzbeat/commits?author=aoshiguchen" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/caibenxiang"><img src="https://avatars.githubusercontent.com/u/4568241?v=4?s=100" width="100px;" alt="蔡本祥"/><br /><sub><b>蔡本祥</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/commits?author=caibenxiang" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="http://www.fckeverything.cn:4000/"><img src="https://avatars.githubusercontent.com/u/13827124?v=4?s=100" width="100px;" alt="浮游"/><br /><sub><b>浮游</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/commits?author=lifefloating" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Grass-Life"><img src="https://avatars.githubusercontent.com/u/114381513?v=4?s=100" width="100px;" alt="Grass-Life"/><br /><sub><b>Grass-Life</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/commits?author=Grass-Life" title="Code">💻</a></td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/xiaohe428"><img src="https://avatars.githubusercontent.com/u/99130317?v=4?s=100" width="100px;" alt="xiaohe428"/><br /><sub><b>xiaohe428</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/commits?author=xiaohe428" title="Code">💻</a> <a href="https://github.com/apache/hertzbeat/commits?author=xiaohe428" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/baiban114"><img src="https://avatars.githubusercontent.com/u/59152619?v=4?s=100" width="100px;" alt="TableRow"/><br /><sub><b>TableRow</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/commits?author=baiban114" title="Documentation">📖</a> <a href="https://github.com/apache/hertzbeat/commits?author=baiban114" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/ByteIDance"><img src="https://avatars.githubusercontent.com/u/100207562?v=4?s=100" width="100px;" alt="ByteIDance"/><br /><sub><b>ByteIDance</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/commits?author=ByteIDance" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/mangel2002"><img src="https://avatars.githubusercontent.com/u/9348020?v=4?s=100" width="100px;" alt="Jangfe"/><br /><sub><b>Jangfe</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/commits?author=mangel2002" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/zqr10159"><img src="https://avatars.githubusercontent.com/u/30048352?v=4?s=100" width="100px;" alt="zqr10159"/><br /><sub><b>zqr10159</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/commits?author=zqr10159" title="Documentation">📖</a> <a href="https://github.com/apache/hertzbeat/commits?author=zqr10159" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/vinci-897"><img src="https://avatars.githubusercontent.com/u/55838224?v=4?s=100" width="100px;" alt="vinci"/><br /><sub><b>vinci</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/commits?author=vinci-897" title="Code">💻</a> <a href="https://github.com/apache/hertzbeat/commits?author=vinci-897" title="Documentation">📖</a> <a href="#design-vinci-897" title="Design">🎨</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/js110"><img src="https://avatars.githubusercontent.com/u/51191863?v=4?s=100" width="100px;" alt="js110"/><br /><sub><b>js110</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/commits?author=js110" title="Code">💻</a></td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/JavaLionLi"><img src="https://avatars.githubusercontent.com/u/31852897?v=4?s=100" width="100px;" alt="CrazyLionLi"/><br /><sub><b>CrazyLionLi</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/commits?author=JavaLionLi" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="http://www.banmajio.com"><img src="https://avatars.githubusercontent.com/u/53471385?v=4?s=100" width="100px;" alt="banmajio"/><br /><sub><b>banmajio</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/commits?author=banmajio" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://suder.fun"><img src="https://avatars.githubusercontent.com/u/69955165?v=4?s=100" width="100px;" alt="topsuder"/><br /><sub><b>topsuder</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/commits?author=topsuder" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/richar2022"><img src="https://avatars.githubusercontent.com/u/129016397?v=4?s=100" width="100px;" alt="richar2022"/><br /><sub><b>richar2022</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/commits?author=richar2022" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/fcb-xiaobo"><img src="https://avatars.githubusercontent.com/u/60566194?v=4?s=100" width="100px;" alt="fcb-xiaobo"/><br /><sub><b>fcb-xiaobo</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/commits?author=fcb-xiaobo" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/wenkyzhang"><img src="https://avatars.githubusercontent.com/u/13983669?v=4?s=100" width="100px;" alt="wenkyzhang"/><br /><sub><b>wenkyzhang</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/commits?author=wenkyzhang" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/ZangJuxy"><img src="https://avatars.githubusercontent.com/u/71380295?v=4?s=100" width="100px;" alt="ZangJuxy"/><br /><sub><b>ZangJuxy</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/commits?author=ZangJuxy" title="Documentation">📖</a></td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/l646505418"><img src="https://avatars.githubusercontent.com/u/50475131?v=4?s=100" width="100px;" alt="l646505418"/><br /><sub><b>l646505418</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/commits?author=l646505418" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="http://www.carpewang.com"><img src="https://avatars.githubusercontent.com/u/78642589?v=4?s=100" width="100px;" alt="Carpe-Wang"/><br /><sub><b>Carpe-Wang</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/commits?author=Carpe-Wang" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/moshu023"><img src="https://avatars.githubusercontent.com/u/48593205?v=4?s=100" width="100px;" alt="莫枢"/><br /><sub><b>莫枢</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/commits?author=moshu023" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/huangcanda"><img src="https://avatars.githubusercontent.com/u/4470566?v=4?s=100" width="100px;" alt="huangcanda"/><br /><sub><b>huangcanda</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/commits?author=huangcanda" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://www.zrkizzy.com"><img src="https://avatars.githubusercontent.com/u/85340613?v=4?s=100" width="100px;" alt="世纪末的架构师"/><br /><sub><b>世纪末的架构师</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/commits?author=Architect-Java" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/ShuningWan"><img src="https://avatars.githubusercontent.com/u/31086770?v=4?s=100" width="100px;" alt="ShuningWan"/><br /><sub><b>ShuningWan</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/commits?author=ShuningWan" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/MrYZhou"><img src="https://avatars.githubusercontent.com/u/44339602?v=4?s=100" width="100px;" alt="MrYZhou"/><br /><sub><b>MrYZhou</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/commits?author=MrYZhou" title="Documentation">📖</a></td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/suncqujsj"><img src="https://avatars.githubusercontent.com/u/8012932?v=4?s=100" width="100px;" alt="suncqujsj"/><br /><sub><b>suncqujsj</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/commits?author=suncqujsj" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/sunqinbo"><img src="https://avatars.githubusercontent.com/u/1428540?v=4?s=100" width="100px;" alt="sunqinbo"/><br /><sub><b>sunqinbo</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/commits?author=sunqinbo" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/haoww"><img src="https://avatars.githubusercontent.com/u/32739294?v=4?s=100" width="100px;" alt="haoww"/><br /><sub><b>haoww</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/commits?author=haoww" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/i-mayuan"><img src="https://avatars.githubusercontent.com/u/101498477?v=4?s=100" width="100px;" alt="i-mayuan"/><br /><sub><b>i-mayuan</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/commits?author=i-mayuan" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/fengruge"><img src="https://avatars.githubusercontent.com/u/85803831?v=4?s=100" width="100px;" alt="fengruge"/><br /><sub><b>fengruge</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/commits?author=fengruge" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/aystzh"><img src="https://avatars.githubusercontent.com/u/38125392?v=4?s=100" width="100px;" alt="zhanghuan"/><br /><sub><b>zhanghuan</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/commits?author=aystzh" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/shenyumin"><img src="https://avatars.githubusercontent.com/u/8438506?v=4?s=100" width="100px;" alt="shenymin"/><br /><sub><b>shenymin</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/commits?author=shenyumin" title="Code">💻</a></td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/dhruva1995"><img src="https://avatars.githubusercontent.com/u/12976351?v=4?s=100" width="100px;" alt="Dhruva Chandra"/><br /><sub><b>Dhruva Chandra</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/commits?author=dhruva1995" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/weiwang988"><img src="https://avatars.githubusercontent.com/u/58241726?v=4?s=100" width="100px;" alt="miss_z"/><br /><sub><b>miss_z</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/commits?author=weiwang988" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/wyt990"><img src="https://avatars.githubusercontent.com/u/86013697?v=4?s=100" width="100px;" alt="wyt990"/><br /><sub><b>wyt990</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/commits?author=wyt990" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/licocon"><img src="https://avatars.githubusercontent.com/u/36863277?v=4?s=100" width="100px;" alt="licocon"/><br /><sub><b>licocon</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/commits?author=licocon" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/2406450951"><img src="https://avatars.githubusercontent.com/u/48074721?v=4?s=100" width="100px;" alt="Mi Na"/><br /><sub><b>Mi Na</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/commits?author=2406450951" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Kylin-Guo"><img src="https://avatars.githubusercontent.com/u/131239856?v=4?s=100" width="100px;" alt="Kylin-Guo"/><br /><sub><b>Kylin-Guo</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/commits?author=Kylin-Guo" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/1797899698"><img src="https://avatars.githubusercontent.com/u/40411650?v=4?s=100" width="100px;" alt="Mr灬Dong先生"/><br /><sub><b>Mr灬Dong先生</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/commits?author=1797899698" title="Code">💻</a></td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="http://neilblaze.live"><img src="https://avatars.githubusercontent.com/u/48355572?v=4?s=100" width="100px;" alt="Pratyay Banerjee"/><br /><sub><b>Pratyay Banerjee</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/commits?author=Neilblaze" title="Documentation">📖</a> <a href="https://github.com/apache/hertzbeat/commits?author=Neilblaze" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/yujianzhong520"><img src="https://avatars.githubusercontent.com/u/63705063?v=4?s=100" width="100px;" alt="yujianzhong520"/><br /><sub><b>yujianzhong520</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/commits?author=yujianzhong520" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://sppan24.github.io/"><img src="https://avatars.githubusercontent.com/u/15795173?v=4?s=100" width="100px;" alt="SPPan"/><br /><sub><b>SPPan</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/commits?author=sppan24" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/1130600015"><img src="https://avatars.githubusercontent.com/u/67859663?v=4?s=100" width="100px;" alt="ZhangJiashu"/><br /><sub><b>ZhangJiashu</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/commits?author=1130600015" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/QZmp236478"><img src="https://avatars.githubusercontent.com/u/56623162?v=4?s=100" width="100px;" alt="impress"/><br /><sub><b>impress</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/commits?author=QZmp236478" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/jx3775250"><img src="https://avatars.githubusercontent.com/u/40455946?v=4?s=100" width="100px;" alt="凌晨一点半"/><br /><sub><b>凌晨一点半</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/commits?author=jx3775250" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/eeshaanSA"><img src="https://avatars.githubusercontent.com/u/100678386?v=4?s=100" width="100px;" alt="Eeshaan Sawant"/><br /><sub><b>Eeshaan Sawant</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/commits?author=eeshaanSA" title="Code">💻</a></td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/nandofromthebando"><img src="https://avatars.githubusercontent.com/u/87321214?v=4?s=100" width="100px;" alt="nandofromthebando"/><br /><sub><b>nandofromthebando</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/commits?author=nandofromthebando" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/caiboking"><img src="https://avatars.githubusercontent.com/u/6509883?v=4?s=100" width="100px;" alt="caiboking"/><br /><sub><b>caiboking</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/commits?author=caiboking" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/baixing99"><img src="https://avatars.githubusercontent.com/u/73473087?v=4?s=100" width="100px;" alt="baixing99"/><br /><sub><b>baixing99</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/commits?author=baixing99" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/ifrenzyc"><img src="https://avatars.githubusercontent.com/u/543927?v=4?s=100" width="100px;" alt="Yang Chuang"/><br /><sub><b>Yang Chuang</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/commits?author=ifrenzyc" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/wlin20"><img src="https://avatars.githubusercontent.com/u/20657577?v=4?s=100" width="100px;" alt="wlin20"/><br /><sub><b>wlin20</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/commits?author=wlin20" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/guojing1983"><img src="https://avatars.githubusercontent.com/u/60596094?v=4?s=100" width="100px;" alt="guojing1983"/><br /><sub><b>guojing1983</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/commits?author=guojing1983" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/itxxq"><img src="https://avatars.githubusercontent.com/u/46962357?v=4?s=100" width="100px;" alt="moxi"/><br /><sub><b>moxi</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/commits?author=itxxq" title="Documentation">📖</a></td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/qq471754603"><img src="https://avatars.githubusercontent.com/u/23146592?v=4?s=100" width="100px;" alt="qq471754603"/><br /><sub><b>qq471754603</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/commits?author=qq471754603" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/san346596324"><img src="https://avatars.githubusercontent.com/u/30828520?v=4?s=100" width="100px;" alt="渭雨"/><br /><sub><b>渭雨</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/commits?author=san346596324" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/luoxuanzao"><img src="https://avatars.githubusercontent.com/u/44692579?v=4?s=100" width="100px;" alt="liuxuezhuo"/><br /><sub><b>liuxuezhuo</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/commits?author=luoxuanzao" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/lisongning"><img src="https://avatars.githubusercontent.com/u/93140178?v=4?s=100" width="100px;" alt="lisongning"/><br /><sub><b>lisongning</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/commits?author=lisongning" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/YutingNie"><img src="https://avatars.githubusercontent.com/u/104416402?v=4?s=100" width="100px;" alt="YutingNie"/><br /><sub><b>YutingNie</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/commits?author=YutingNie" title="Code">💻</a> <a href="https://github.com/apache/hertzbeat/commits?author=YutingNie" title="Documentation">📖</a> <a href="#design-YutingNie" title="Design">🎨</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/mikezzb"><img src="https://avatars.githubusercontent.com/u/23418428?v=4?s=100" width="100px;" alt="Mike Zhou"/><br /><sub><b>Mike Zhou</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/commits?author=mikezzb" title="Code">💻</a> <a href="https://github.com/apache/hertzbeat/commits?author=mikezzb" title="Documentation">📖</a> <a href="#design-mikezzb" title="Design">🎨</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/a-little-fool"><img src="https://avatars.githubusercontent.com/u/105542329?v=4?s=100" width="100px;" alt="小笨蛋"/><br /><sub><b>小笨蛋</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/commits?author=a-little-fool" title="Code">💻</a></td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/littlezhongzer"><img src="https://avatars.githubusercontent.com/u/33685289?v=4?s=100" width="100px;" alt="littlezhongzer"/><br /><sub><b>littlezhongzer</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/commits?author=littlezhongzer" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/ChenXiangxxxxx"><img src="https://avatars.githubusercontent.com/u/90089594?v=4?s=100" width="100px;" alt="ChenXiangxxxxx"/><br /><sub><b>ChenXiangxxxxx</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/commits?author=ChenXiangxxxxx" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Mr-zhou315"><img src="https://avatars.githubusercontent.com/u/10276100?v=4?s=100" width="100px;" alt="Mr.zhou"/><br /><sub><b>Mr.zhou</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/commits?author=Mr-zhou315" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/XimfengYao"><img src="https://avatars.githubusercontent.com/u/17541537?v=4?s=100" width="100px;" alt="姚贤丰"/><br /><sub><b>姚贤丰</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/commits?author=XimfengYao" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/LINGLUOJUN"><img src="https://avatars.githubusercontent.com/u/16778977?v=4?s=100" width="100px;" alt="lingluojun"/><br /><sub><b>lingluojun</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/commits?author=LINGLUOJUN" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="http://www.luelueking.com"><img src="https://avatars.githubusercontent.com/u/93204032?v=4?s=100" width="100px;" alt="1ue"/><br /><sub><b>1ue</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/commits?author=luelueking" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="http://www.jimmyqiao.top"><img src="https://avatars.githubusercontent.com/u/67301054?v=4?s=100" width="100px;" alt="qyaaaa"/><br /><sub><b>qyaaaa</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/commits?author=qyaaaa" title="Code">💻</a></td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://novohit.top"><img src="https://avatars.githubusercontent.com/u/101090395?v=4?s=100" width="100px;" alt="novohit"/><br /><sub><b>novohit</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/commits?author=novohit" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/rbsrcy"><img src="https://avatars.githubusercontent.com/u/4798540?v=4?s=100" width="100px;" alt="zhuoshangyi"/><br /><sub><b>zhuoshangyi</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/commits?author=rbsrcy" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/ruanliang-hualun"><img src="https://avatars.githubusercontent.com/u/65543716?v=4?s=100" width="100px;" alt="ruanliang"/><br /><sub><b>ruanliang</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/commits?author=ruanliang-hualun" title="Documentation">📖</a> <a href="https://github.com/apache/hertzbeat/commits?author=ruanliang-hualun" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Eden4701"><img src="https://avatars.githubusercontent.com/u/68422437?v=4?s=100" width="100px;" alt="Eden4701"/><br /><sub><b>Eden4701</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/commits?author=Eden4701" title="Code">💻</a> <a href="https://github.com/apache/hertzbeat/commits?author=Eden4701" title="Documentation">📖</a> <a href="#design-Eden4701" title="Design">🎨</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/XiaTian688"><img src="https://avatars.githubusercontent.com/u/111830921?v=4?s=100" width="100px;" alt="XiaTian688"/><br /><sub><b>XiaTian688</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/commits?author=XiaTian688" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/liyin"><img src="https://avatars.githubusercontent.com/u/863169?v=4?s=100" width="100px;" alt="liyinjiang"/><br /><sub><b>liyinjiang</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/commits?author=liyin" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/jiashu1024"><img src="https://avatars.githubusercontent.com/u/67859663?v=4?s=100" width="100px;" alt="ZhangJiashu"/><br /><sub><b>ZhangJiashu</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/commits?author=jiashu1024" title="Documentation">📖</a></td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/1036664317"><img src="https://avatars.githubusercontent.com/u/7696697?v=4?s=100" width="100px;" alt="moghn"/><br /><sub><b>moghn</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/commits?author=1036664317" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/xiaoguolong"><img src="https://avatars.githubusercontent.com/u/33684988?v=4?s=100" width="100px;" alt="xiaoguolong"/><br /><sub><b>xiaoguolong</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/commits?author=xiaoguolong" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Clownsw"><img src="https://avatars.githubusercontent.com/u/28394742?v=4?s=100" width="100px;" alt="Smliexx"/><br /><sub><b>Smliexx</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/commits?author=Clownsw" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Calvin979"><img src="https://avatars.githubusercontent.com/u/131688897?v=4?s=100" width="100px;" alt="Naruse"/><br /><sub><b>Naruse</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/commits?author=Calvin979" title="Documentation">📖</a> <a href="https://github.com/apache/hertzbeat/commits?author=Calvin979" title="Code">💻</a> <a href="#design-Calvin979" title="Design">🎨</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/bbelide2"><img src="https://avatars.githubusercontent.com/u/26840796?v=4?s=100" width="100px;" alt="Bala Sukesh"/><br /><sub><b>Bala Sukesh</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/commits?author=bbelide2" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/jinyaoMa"><img src="https://avatars.githubusercontent.com/u/25066570?v=4?s=100" width="100px;" alt="Jinyao Ma"/><br /><sub><b>Jinyao Ma</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/commits?author=jinyaoMa" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://linuxsuren.github.io/open-source-best-practice/"><img src="https://avatars.githubusercontent.com/u/1450685?v=4?s=100" width="100px;" alt="Rick"/><br /><sub><b>Rick</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/commits?author=LinuxSuRen" title="Code">💻</a> <a href="https://github.com/apache/hertzbeat/commits?author=LinuxSuRen" title="Tests">⚠️</a></td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/ZY945"><img src="https://avatars.githubusercontent.com/u/74083801?v=4?s=100" width="100px;" alt="东风"/><br /><sub><b>东风</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/commits?author=ZY945" title="Code">💻</a> <a href="#design-ZY945" title="Design">🎨</a> <a href="https://github.com/apache/hertzbeat/commits?author=ZY945" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/prolevel1"><img src="https://avatars.githubusercontent.com/u/51995525?v=4?s=100" width="100px;" alt="sonam singh"/><br /><sub><b>sonam singh</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/commits?author=prolevel1" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/ZhangZixuan1994"><img src="https://avatars.githubusercontent.com/u/20011653?v=4?s=100" width="100px;" alt="ZhangZixuan1994"/><br /><sub><b>ZhangZixuan1994</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/commits?author=ZhangZixuan1994" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/hurenjie1"><img src="https://avatars.githubusercontent.com/u/40120355?v=4?s=100" width="100px;" alt="SHIG"/><br /><sub><b>SHIG</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/commits?author=hurenjie1" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://tslj1024.github.io/"><img src="https://avatars.githubusercontent.com/u/155222677?v=4?s=100" width="100px;" alt="泰上老菌"/><br /><sub><b>泰上老菌</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/commits?author=tslj1024" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/ldysdu"><img src="https://avatars.githubusercontent.com/u/15815338?v=4?s=100" width="100px;" alt="ldysdu"/><br /><sub><b>ldysdu</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/commits?author=ldysdu" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/GEM0816g"><img src="https://avatars.githubusercontent.com/u/85116017?v=4?s=100" width="100px;" alt="梁同学"/><br /><sub><b>梁同学</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/commits?author=GEM0816g" title="Code">💻</a></td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/avvCode"><img src="https://avatars.githubusercontent.com/u/113538532?v=4?s=100" width="100px;" alt="avv"/><br /><sub><b>avv</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/commits?author=avvCode" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/yqxxgh"><img src="https://avatars.githubusercontent.com/u/42080876?v=4?s=100" width="100px;" alt="yqxxgh"/><br /><sub><b>yqxxgh</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/commits?author=yqxxgh" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/CharlieShi46"><img src="https://avatars.githubusercontent.com/u/149798885?v=4?s=100" width="100px;" alt="CharlieShi46"/><br /><sub><b>CharlieShi46</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/commits?author=CharlieShi46" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Nctllnty"><img src="https://avatars.githubusercontent.com/u/33241818?v=4?s=100" width="100px;" alt="Nctllnty"/><br /><sub><b>Nctllnty</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/commits?author=Nctllnty" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Wang-Yonghao"><img src="https://avatars.githubusercontent.com/u/48146606?v=4?s=100" width="100px;" alt="Wang-Yonghao"/><br /><sub><b>Wang-Yonghao</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/commits?author=Wang-Yonghao" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://www.yuque.com/dudiao/yy"><img src="https://avatars.githubusercontent.com/u/38355949?v=4?s=100" width="100px;" alt="读钓"/><br /><sub><b>读钓</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/commits?author=dudiao" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/starmilkxin"><img src="https://avatars.githubusercontent.com/u/55646681?v=4?s=100" width="100px;" alt="Xin"/><br /><sub><b>Xin</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/commits?author=starmilkxin" title="Code">💻</a></td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/handy-git"><img src="https://avatars.githubusercontent.com/u/32837980?v=4?s=100" width="100px;" alt="handy"/><br /><sub><b>handy</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/commits?author=handy-git" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/LiuTianyou"><img src="https://avatars.githubusercontent.com/u/30208283?v=4?s=100" width="100px;" alt="LiuTianyou"/><br /><sub><b>LiuTianyou</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/commits?author=LiuTianyou" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/WinterKi1ler"><img src="https://avatars.githubusercontent.com/u/160592092?v=4?s=100" width="100px;" alt="WinterKi1ler"/><br /><sub><b>WinterKi1ler</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/commits?author=WinterKi1ler" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="http://sharehoo.cn/"><img src="https://avatars.githubusercontent.com/u/45377370?v=4?s=100" width="100px;" alt="miki"/><br /><sub><b>miki</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/commits?author=miki-hmt" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://codeflex.substack.com/"><img src="https://avatars.githubusercontent.com/u/85513042?v=4?s=100" width="100px;" alt="Keshav Carpenter"/><br /><sub><b>Keshav Carpenter</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/commits?author=alpha951" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/makechoicenow"><img src="https://avatars.githubusercontent.com/u/9911918?v=4?s=100" width="100px;" alt="makechoicenow"/><br /><sub><b>makechoicenow</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/commits?author=makechoicenow" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/gjjjj0101"><img src="https://avatars.githubusercontent.com/u/71874373?v=4?s=100" width="100px;" alt="Gao Jian"/><br /><sub><b>Gao Jian</b></sub></a><br /><a href="https://github.com/apache/hertzbeat/commits?author=gjjjj0101" title="Code">💻</a></td>
</tr>
</tbody>
</table>
## 特别感谢
感谢所有参与到社区的贡献者。
特别感谢愿意给 HertzBeat 提供指导的 Champion 和 Mentors:
**Champion**
- Yonglun Zhang(zhangyonglun at apache dot org)
> 感谢 Champion @Yonglun 主导了项目从 Proposal 起草阶段到讨论再到发起投票整个过程, 给予了无私的帮助和指导。
**Mentors**
- Yu Xiao [xiaoyu at apache dot org]
- Yonglun Zhang [zhangyonglun at apache dot org]
- Justin Mclean [jmclean at apache dot org]
- Francis Chuang [francischuang at apache dot org]
> 感谢导师 @XiaoYu 、 @Yonglun 、 @Justin 、 @Francis 各位导师无私的帮助, 在合规和流程推进上的给予了专业指导。从 Dromara 开源社区到 Apache 孵化器,@XiaoYu 一直是 HertzBeat 的开源领路人。相信未来在各位导师的指导下社区一定社区更加健康的成长。
## 来自 Dromara 社区的寄语
> HertzBeat 从 Dromara 明星项目到成为 Apache 孵化器的一员,展现出了强劲的生命力和健康的成长态势。我们为 HertzBeat 的每一步前进感到自豪和振奋。在此,我们向 HertzBeat 团队致以最诚挚的祝贺,也向所有为该项目贡献力量的社区成员表示深深的感激。
>
> 愿 HertzBeat 在未来的旅程中持续发展,不断创新,成为开源社区中的亮眼之星。我们相信,凭借团队的出色才能和社区的广泛支持,HertzBeat 必将实现更加辉煌的成就,为全球的开发者和用户提供优质的服务和体验。Dromara 将继续全力支持和关注 HertzBeat 的发展,期待它创造出更加精彩的篇章!
---
**项目地址**
**[https://github.com/apache/hertzbeat](https://github.com/apache/hertzbeat)**
欢迎 star 我们🐶🐶🐶
**官方网址**
**[https://hertzbeat.apache.org/](https://hertzbeat.apache.org/)**
**邮件列表**
**[dev@hertzbeat.apache.org](mailto:dev@hertzbeat.apache.org)**
发送任意内容至 [dev-subcribe@hertzbeat.apache.org](mailto:dev-subcribe@hertzbeat.apache.org) 订阅
@@ -0,0 +1,110 @@
# 【开源之夏】HertzBeat 课题介绍
## 什么是 HertzBeat
`HertzBeat` 赫兹跳动 是一个拥有强大自定义监控能力,高性能集群,兼容 Prometheus,无需 Agent 的开源实时监控告警系统。
### **特点**
-**监控+告警+通知** 为一体,支持对应用服务,应用程序,数据库,缓存,操作系统,大数据,中间件,Web服务器,云原生,网络,自定义等监控阈值告警通知一步到位。
- 易用友好,无需 `Agent`,全 `WEB` 页面操作,鼠标点一点就能监控告警,无需学习成本。
-`Http, Jmx, Ssh, Snmp, Jdbc, Prometheus` 等协议规范可配置化,只需在浏览器配置监控模板 `YML` 就能使用这些协议去自定义采集想要的指标。您相信只需简单配置即可快速适配一款 `K8s``Docker` 等新的监控类型吗?
- 兼容 `Prometheus` 的系统生态并且更多,只需页面操作就可以监控 `Prometheus` 所能监控的。
- 高性能,支持多采集器集群横向扩展,支持多隔离网络监控,云边协同。
- 灵活的告警阈值规则,`邮件` `Discord` `Slack` `Telegram` `钉钉` `微信` `飞书` `短信` `Webhook` `Server酱` 等方式消息及时送达。
**Github: [https://github.com/apache/hertzbeat](https://github.com/apache/hertzbeat)**
**Gitee: [https://gitee.com/hertzbeat/hertzbeat](https://gitee.com/hertzbeat/hertzbeat)**
## 什么是开源之夏?
开源之夏是由中国科学院软件研究所“开源软件供应链点亮计划”发起并长期支持的一项暑期开源活动,旨在鼓励在
校学生积极参与开源软件的开发维护,培养和发掘更多优秀的开发者,促进优秀开源软件社区的蓬勃发展,助力开
源软件供应链建设。
开源之夏联合国内外开源社区,针对重要开源软件的开发与维护提供项目任务,面向全球高校学生开放报名
中选学生将在项目资深开发者(项目导师)的指导下,参与开源贡献,完成开发工作并贡献给开源社区
**活动规则**
开源之夏官网:
[*https://summer-ospp.ac.cn/*](https://summer-ospp.ac.cn/)
各位同学可以自由选择项目,与社区导师沟通实现方案并撰写项目计划书。被选中的学生将在社区导师指导下,按计划完成开发工作,并将成果贡献给社区。社区评估学生的完成度,主办方根据评估结果发放资助金额给学生。
## HertzBeat 课题
### 1、实现监控模板市场商店
**项目难度:进阶/Advanced**
**背景:** 因为 `HertzBeat` 是一款通过 yml 文件高度自定义的监控系统,我们可以通过配置相关的 yml 文件来进行
对我们想要监控的指标进行采集。一些不同用户对一些中间件的数据的指标需求可能不同,`HertzBeat` 官方自带
的 yml 配置可能并不能满足每一个用户,所以我们的目的就是去让用户贡献自己的 yml 模板去让更多的人受惠。
这样不仅能让 `HertzBeat` 的生态更加完善,也能让用户的体验变的更好!
**要求:**
1. 使用Java17, springboot3编写后端代码,Angular(建议)或Vue编写前端代码。
2. 实现yml模板文件的搜索、下载、分享功能(无需登录)。
3. 模板页面展示下载量、分类、模板描述信息、模板历史版本(可选)。
4. 实现用户个人页面注册、登录(后期),上传模板。
**产出:**
1. 特性代码能以PR的形式合入HertzBeat仓库。
2. 完成 HertzBeat官方模板市场
3. 更新相关帮助文档
**联系导师:** 赵青然 [zqr10159@dromara.org](mailto:zqr10159@dromara.org)
### 2、实现 Java 原生的 ipmi2 通信协议
**项目难度:进阶/Advanced**
**背景:** `HertzBeat` ⽀持多种监控协议,例如http、jmx、jdbc 和 snmp等。通过封装这些协议可以去实现对各种
中间件的监控且⽆需 Agent 。 为了使 HertzBeat 具有更⼴的监控领域,我们打算去基于 Java 语⾔,不依赖第三⽅
包,实现原⽣的 IPMI2 协议中的查询部分,并利⽤该协议获取服务器的主板信息、⽹卡信息、电源信息、⻛扇信息、
温度传感器信息和时钟信息。
**要求:**
1. 使⽤ Java 基于 UDP 协议实现原⽣的 IPMI2 协议(查询部分),不依赖任何第三⽅包。
2. 利⽤实现的 IPMI2 协议查询开启 IPMI 的服务器的各项指标信息,包括主板信息、⽹卡信息、电源信息、⻛扇信息、温度传感器信息和时钟信息。
3. 对查询到的指标信息进⾏抽象和规范化处理,实现配置化管理(可选)。
4. 输出详细的项⽬⽂档,包括设计思路、实现细节、使⽤说明等。
**产出:**
- 特性代码能以PR的形式合⼊HertzBeat仓库。
- 完成 Java 基于 UDP 协议实现原⽣的 IPMI2 协议的封装并能对相对应的服务器进⾏监控。
- 可以通过配置 YML ⽂件去⾼度⾃定义化监控指标(可选)。
- 完善帮助⽂档。
**联系导师:** 铁甲小宝 [tjxiaobao2024@qq.com](mailto:tjxiaobao2024@qq.com)
## 参与 HertzBeat 能收获什么?
有的同学可能会疑惑参与开源之夏能收获到什么呢?
1. **【你的代码被社会广泛复用】你的代码可能会运行在上万家企业核心业务逻辑中,帮助企业解决问题。**
2. **【赢得最高12000奖金】奖金总额根据项目难度分为进阶 12000 元、基础 8000 元(注:奖金数额为税前人民币金额)**
3. **【社区核心人员辅导快速成长】只要你报名被选中,每个题目的导师会精心手把手教你融入社区,帮助你完成题目的设计以及最终的落地。**
4. **【推荐入职/实习】在本次编程之夏项目中表现优秀同学,可推荐入职/实习 你心意的公司工作。**
5. **【额外获得社区惊喜】所有参与本次编程之夏项目的同学,均可有机会成为 Apache HertzBeat™ 的committer,并拥有属于自己的 apache邮箱。**
**百分百有奖品拿哦**,现在唯一的问题是时间不多了,赶紧上车报名!截止报名时间是6月4日,快点来报名参与 2023 编程之夏吧~
@@ -0,0 +1,274 @@
# HertzBeat 1.6.0 升级指南
## 注意:该指南适用于1.5.0向1.6.0版本升级
## 如果你使用更老的版本,建议使用导出功能重新安装,或先升级到1.5.0再按本指南升级到1.6.0
## 二进制安装包升级
1. 升级Java环境
由于1.6.0版本使用Java17,且安装包不再提供内置jdk的版本,参考以下情况使用新版HertzBeat。
- 当你的服务器中默认环境变量为Java17时,这一步你无需任何操作。
- 当你的服务器中默认环境变量不为Java17时,如Java8、Java11,若你服务器中**没有**其他应用需要低版本Java,根据你的系统,到 [https://www.oracle.com/java/technologies/javase/jdk17-archive-downloads.html](https://www.oracle.com/java/technologies/javase/jdk17-archive-downloads.html) 选择相应的发行版下载,并在搜索引擎搜索如何设置新的环境变量指向新的Java17。
- 当你的服务器中默认环境变量不为Java17时,如Java8、Java11,若你服务器中**有**其他应用需要低版本Java,根据你的系统,到 [https://www.oracle.com/java/technologies/javase/jdk17-archive-downloads.html](https://www.oracle.com/java/technologies/javase/jdk17-archive-downloads.html) 选择相应的发行版下载,并将解压后的文件夹重命名为java,复制到HertzBeat的解压目录下。
2. 升级数据库
打开[https://github.com/apache/hertzbeat/tree/master/hertzbeat-startup/src/main/resources/db/migration](https://github.com/apache/hertzbeat/tree/master/hertzbeat-startup/src/main/resources/db/migration)
选择你使用的数据库的目录下相应的 `V160__update_column.sql`文件执行升级sql。
3. 升级配置文件
由于 `application.yml``sureness.yml`更新变动较大,建议直接使用新的yml配置文件,然后在自己的需求基础上进行修改。
- `application.yml`一般需要修改以下部分
默认为:
```yaml
datasource:
driver-class-name: org.h2.Driver
username: sa
password: 123456
url: jdbc:h2:./data/hertzbeat;MODE=MYSQL
hikari:
max-lifetime: 120000
jpa:
show-sql: false
database-platform: org.eclipse.persistence.platform.database.MySQLPlatform
database: h2
properties:
eclipselink:
logging:
level: SEVERE
```
如若修改为mysql数据库,给出一个示例:
```yaml
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
username: root
password: root
url: jdbc:mysql://localhost:3306/hertzbeat?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai
hikari:
max-lifetime: 120000
jpa:
show-sql: false
database-platform: org.eclipse.persistence.platform.database.MySQLPlatform
database: mysql
properties:
eclipselink:
logging:
level: SEVERE
```
- `sureness.yml`修改是可选的,一般在你需要修改账号密码时
```yaml
# account info config
# eg: admin has role [admin,user], password is hertzbeat
# eg: tom has role [user], password is hertzbeat
# eg: lili has role [guest], plain password is lili, salt is 123, salted password is 1A676730B0C7F54654B0E09184448289
account:
- appId: admin
credential: hertzbeat
role: [admin]
- appId: tom
credential: hertzbeat
role: [user]
- appId: guest
credential: hertzbeat
role: [guest]
- appId: lili
# credential = MD5(password + salt)
# plain password: hertzbeat
# attention: digest authentication does not support salted encrypted password accounts
credential: 94C6B34E7A199A9F9D4E1F208093B489
salt: 123
role: [user]
```
4. 添加相应的数据库驱动
由于apache基金会对于license合规的要求,HertzBeat的安装包不能包含mysqloracle等gpl许可的依赖,需要用户自行添加,用户可通过以下链接自行下载驱动,复制到安装目录下`ext-lib`中。
mysql[https://dev.mysql.com/get/Downloads/Connector-J/mysql-connector-java-8.0.25.zip](https://dev.mysql.com/get/Downloads/Connector-J/mysql-connector-java-8.0.18.zip)
oracle(如果你要监控oracle,这两个驱动是必须的):
[https://repo1.maven.org/maven2/com/oracle/database/jdbc/ojdbc8/23.4.0.24.05/ojdbc8-23.4.0.24.05.jar](https://repo1.maven.org/maven2/com/oracle/database/jdbc/ojdbc8/23.4.0.24.05/ojdbc8-23.4.0.24.05.jar)
[https://repo.mavenlibs.com/maven/com/oracle/database/nls/orai18n/21.5.0.0/orai18n-21.5.0.0.jar](https://repo.mavenlibs.com/maven/com/oracle/database/nls/orai18n/21.5.0.0/orai18n-21.5.0.0.jar?utm_source=mavenlibs.com)
接下来,像之前那样运行启动脚本,即可体验最新的HertzBeat1.6.0
### Docker 方式升级 - Mysql数据库
1. 关闭 HertzBeat 容器
```shell
docker stop hertzbeat
```
2. 升级数据库脚本
打开[https://github.com/apache/hertzbeat/tree/master/hertzbeat-startup/src/main/resources/db/migration](https://github.com/apache/hertzbeat/tree/master/hertzbeat-startup/src/main/resources/db/migration)
选择你使用的数据库的目录下相应的 `V160__update_column.sql`文件在 Mysql 执行升级sql。
3. 升级配置文件
由于 `application.yml`和 `sureness.yml`更新变动较大,建议直接挂载使用新的yml配置文件,然后在自己的需求基础上进行修改。
- `application.yml`一般需要修改以下部分
默认为:
```yaml
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
username: root
password: root
url: jdbc:mysql://localhost:3306/hertzbeat?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai
hikari:
max-lifetime: 120000
jpa:
show-sql: false
database-platform: org.eclipse.persistence.platform.database.MySQLPlatform
database: mysql
properties:
eclipselink:
logging:
level: SEVERE
```
- `sureness.yml`修改是可选的,一般在你需要修改账号密码时
```yaml
# account info config
# eg: admin has role [admin,user], password is hertzbeat
# eg: tom has role [user], password is hertzbeat
# eg: lili has role [guest], plain password is lili, salt is 123, salted password is 1A676730B0C7F54654B0E09184448289
account:
- appId: admin
credential: hertzbeat
role: [admin]
- appId: tom
credential: hertzbeat
role: [user]
- appId: guest
credential: hertzbeat
role: [guest]
- appId: lili
# credential = MD5(password + salt)
# plain password: hertzbeat
# attention: digest authentication does not support salted encrypted password accounts
credential: 94C6B34E7A199A9F9D4E1F208093B489
salt: 123
role: [user]
```
4. 添加相应的数据库驱动
由于apache基金会对于license合规的要求,HertzBeat的安装包不能包含mysqloracle等gpl许可的依赖,需要用户自行添加,用户可通过以下链接自行下载驱动 jar 放到本地 `ext-lib`目录下,然后启动时将`ext-lib`挂载到容器的 `/opt/hertzbeat/ext-lib`目录。
mysql[https://dev.mysql.com/get/Downloads/Connector-J/mysql-connector-java-8.0.25.zip](https://dev.mysql.com/get/Downloads/Connector-J/mysql-connector-java-8.0.18.zip)
oracle(如果你要监控oracle,这两个驱动是必须的):
[https://repo1.maven.org/maven2/com/oracle/database/jdbc/ojdbc8/23.4.0.24.05/ojdbc8-23.4.0.24.05.jar](https://repo1.maven.org/maven2/com/oracle/database/jdbc/ojdbc8/23.4.0.24.05/ojdbc8-23.4.0.24.05.jar)
[https://repo.mavenlibs.com/maven/com/oracle/database/nls/orai18n/21.5.0.0/orai18n-21.5.0.0.jar](https://repo.mavenlibs.com/maven/com/oracle/database/nls/orai18n/21.5.0.0/orai18n-21.5.0.0.jar?utm_source=mavenlibs.com)
接下来,像之前那样 Docker 运行启动 HertzBeat,即可体验最新的HertzBeat1.6.0
### Docker安装升级 - H2内置数据库(生产环境不推荐使用H2)
1. 关闭 HertzBeat 容器
```shell
docker stop hertzbeat
```
2. 编辑H2数据库文件
前题你已经将 H2 数据库文件 data 目录挂载到本地,或者启动老容器手动将 /opt/hertzbeat/data 目录拷贝出来。
下载 h2 驱动 jar [https://mvnrepository.com/artifact/com.h2database/h2/2.2.220](https://mvnrepository.com/artifact/com.h2database/h2/2.2.220)
使用 h2 驱动 jar 本地启动数据库
```shell
java -jar h2-2.2.220.jar -url jdbc:h2:file:./hertzbeat -user sa -password 123456
```
打开[https://github.com/apache/hertzbeat/tree/master/hertzbeat-startup/src/main/resources/db/migration](https://github.com/apache/hertzbeat/tree/master/hertzbeat-startup/src/main/resources/db/migration)
选择你使用的数据库的目录下相应的 `V160__update_column.sql`文件在 H2 执行升级sql。
3. 升级配置文件
由于 `application.yml`和 `sureness.yml`更新变动较大,建议直接挂载使用新的yml配置文件,然后在自己的需求基础上进行修改。
- `application.yml`一般需要修改以下部分
默认为:
```yaml
datasource:
driver-class-name: org.h2.Driver
username: sa
password: 123456
url: jdbc:h2:./data/hertzbeat;MODE=MYSQL
hikari:
max-lifetime: 120000
jpa:
show-sql: false
database-platform: org.eclipse.persistence.platform.database.MySQLPlatform
database: h2
properties:
eclipselink:
logging:
level: SEVERE
```
- `sureness.yml`修改是可选的,一般在你需要修改账号密码时
```yaml
# account info config
# eg: admin has role [admin,user], password is hertzbeat
# eg: tom has role [user], password is hertzbeat
# eg: lili has role [guest], plain password is lili, salt is 123, salted password is 1A676730B0C7F54654B0E09184448289
account:
- appId: admin
credential: hertzbeat
role: [admin]
- appId: tom
credential: hertzbeat
role: [user]
- appId: guest
credential: hertzbeat
role: [guest]
- appId: lili
# credential = MD5(password + salt)
# plain password: hertzbeat
# attention: digest authentication does not support salted encrypted password accounts
credential: 94C6B34E7A199A9F9D4E1F208093B489
salt: 123
role: [user]
```
4. 添加相应的数据库驱动
由于apache基金会对于license合规的要求,HertzBeat的安装包不能包含mysqloracle等gpl许可的依赖,需要用户自行添加,用户可通过以下链接自行下载驱动 jar 放到本地 `ext-lib`目录下,然后启动时将`ext-lib`挂载到容器的 `/opt/hertzbeat/ext-lib`目录。
mysql[https://dev.mysql.com/get/Downloads/Connector-J/mysql-connector-java-8.0.25.zip](https://dev.mysql.com/get/Downloads/Connector-J/mysql-connector-java-8.0.18.zip)
oracle(如果你要监控oracle,这两个驱动是必须的):
[https://repo1.maven.org/maven2/com/oracle/database/jdbc/ojdbc8/23.4.0.24.05/ojdbc8-23.4.0.24.05.jar](https://repo1.maven.org/maven2/com/oracle/database/jdbc/ojdbc8/23.4.0.24.05/ojdbc8-23.4.0.24.05.jar)
[https://repo.mavenlibs.com/maven/com/oracle/database/nls/orai18n/21.5.0.0/orai18n-21.5.0.0.jar](https://repo.mavenlibs.com/maven/com/oracle/database/nls/orai18n/21.5.0.0/orai18n-21.5.0.0.jar?utm_source=mavenlibs.com)
接下来,像之前那样 Docker 运行启动,即可体验最新的HertzBeat1.6.0
### 通过导出导入升级
> 若不想如上繁琐的脚本升级方式,可以直接将老环境的监控任务和阈值信息导出导入
1. 部署一套最新版本的新环境
2. 在页面上将老环境的监控任务和阈值信息导出。
3. 在页面上将监控任务和阈值信息文件导入。
⚠️注意此方式只保留了老环境的监控任务信息和阈值信息,没有其它数据。
@@ -0,0 +1,391 @@
---
title: HertzBeat 的第一个 Apache 版本 v1.6.0 发布!
author: tom
author_title: tom
author_url: https://github.com/tomsun28
tags: [opensource, practice]
keywords: [open source, monitoring, alerting]
---
**Hi 朋友们,我们很高兴地宣布,Apache HertzBeat™ 的了第一个Apache版本 v1.6.0 发布啦!🎉.**
经过近五个月的社区开发迭代贡献和两个月的Apache Incubator孵化过程,Apache HertzBeat™ v1.6.0 终于出来了。
这个版本我们增加了对OpenAi监控,Redfish协议服务器,插件机制,支持了NebulaGraph, Apache Yarn, HDFS, Hbase, Storm等更多功能特性。
由于License兼容问题,我们在底层替换了ORM框架,计算框架等多个依赖,Hibernate -> EclipseLink, 这也算是JPA生态下为数不多的迁移踩坑实践。
同时修复了一些bug和优化了一些功能,更完善的文档。欢迎大家尝试使用,提出宝贵意见和建议,共同推动HertzBeat的发展。🎉
**当然,最重要的是给在社区的贡献者们致以最好的感谢!**
下载页面: [https://hertzbeat.apache.org/docs/download/](https://hertzbeat.apache.org/docs/download/)
升级指南: [https://hertzbeat.apache.org/blog/2024/06/11/hertzbeat-v1.6.0-update/](https://hertzbeat.apache.org/blog/2024/06/11/hertzbeat-v1.6.0-update/)
## 什么是 HertzBeat?
[Apache HertzBeat](https://github.com/apache/hertzbeat) incubating)是一个易用友好的开源实时监控告警系统,无需 Agent,高性能集群,兼容 Prometheus,提供强大的自定义监控和状态页构建能力。
### 特点
-**监控+告警+通知** 为一体,支持对应用服务,应用程序,数据库,缓存,操作系统,大数据,中间件,Web 服务器,云原生,网络,自定义等监控阈值告警通知一步到位。
- 易用友好,无需 `Agent`,全 `WEB` 页面操作,鼠标点一点就能监控告警,无需学习成本。
-`Http, Jmx, Ssh, Snmp, Jdbc, Prometheus` 等协议规范可配置化,只需在浏览器配置监控模板 `YML` 就能使用这些协议去自定义采集想要的指标。您相信只需简单配置即可快速适配一款 `K8s``Docker` 等新的监控类型吗?
- 兼容 `Prometheus` 的系统生态并且更多,只需页面操作就可以监控 `Prometheus` 所能监控的。
- 高性能,支持多采集器集群横向扩展,支持多隔离网络监控,云边协同。
- 灵活的告警阈值规则,`邮件` `Discord` `Slack` `Telegram` `钉钉` `微信` `飞书` `短信` `Webhook` `Server酱` 等方式消息及时送达。
- 提供强大的状态页构建能力,轻松向用户传达您产品服务的实时状态。
> `HertzBeat`的强大自定义,多类型支持,高性能,易扩展,低耦合,希望能帮助用户快速搭建自有监控系统。
![hertzBeat](/img/docs/hertzbeat-arch.png)
**Github: [https://github.com/apache/hertzbeat](https://github.com/apache/hertzbeat)**
## HertzBeat's 1.6.0 Version Release
## 亮点更新
- HertzBeat is donated to the Apache Incubator.
- migrate repo, clean up code, license, add more help doc and more
- add dependency license doc
- [feature]HertzBeat custom plugin. by @zqr10159 in #1973
- [feature] add apache hugegraph monitor by @zhangshenghang in #1972
- [improve]\[HIP\] HIP-01: Implement refactoring AbstractCollect by @crossoverJie in #1966
- [feature] Support monitoring of OpenAI accounts by @zuobiao-zhou in #1947
- [feature] add apache yarn monitor by @zhangshenghang in #1937
- [featrue]add apache hdfs monitor by @zhangshenghang in #1920
- [feature] support use ngql query metrics from nebulaGraph by @LiuTianyou in #1917
- [feature] support random jwt secret when not custom by @tomsun28 in #1897
- feat Support Time Type to Tengine Data Storage by @Clownsw in #1890
- [feature] support the VictoriaMetrics cluster by @xuziyang in #1880
- [feature] support flyway database migration by @tomsun28 in #1875
- [feature] Support Redfish protocol to monitoring server by @gjjjj0101 in #1867
- [feature] add influxdb metrics monitoring by @TJxiaobao in #1730
- [improve] use apache jexl replace of aviator by @tomsun28 in #1859
- [feature] Add Linux process monitoring by @zhangshenghang in #1857
- [feature] Add Apache Hbase RegionServer monitoring by @zhangshenghang in #1833
- [improve] use eclipselink orm replace of hibernate orm by @tomsun28 in #1801
- [feature]Add monitoring for Hbase Master by @zhangshenghang in #1820
- [feature] Improve the import checkstyle by @crossoverJie in #1802
- [Improve]When multiple lines are returned, each alarm is triggered instead of only the first alarm by @15613060203 in #1797
- [improve]Add external lib folder to store mysql and oracle driver. by @zqr10159 in #1783
- [feature:update-checkstyle] Limit the java file header by @YxYL6125 in #1799
- monitor center add search type modal by @tomsun28 in #1699
- mongodb monitoring support custom connection timeout param by @ZY945 in #1697
- System config theme by @TJxiaobao in #1636
- [feature] add storm monitor by @starmilkxin in #1673
- add a online prometheus parser and a prometheus-like push style. by @vinci-897 in #1644
- and more bugfix, doc, features power by our contributors, thanks to them.
## What's Changed
- bugfix collector can not startup alone by @tomsun28 in [https://github.com/apache/hertzbeat/pull/1633](https://github.com/apache/hertzbeat/pull/1633)
- translate some hertzbeat blog by @TJxiaobao in [https://github.com/apache/hertzbeat/pull/1635](https://github.com/apache/hertzbeat/pull/1635)
- Check class description by @ZY945 in [https://github.com/apache/hertzbeat/pull/1638](https://github.com/apache/hertzbeat/pull/1638)
- translate class description to english by @TJxiaobao in [https://github.com/apache/hertzbeat/pull/1641](https://github.com/apache/hertzbeat/pull/1641)
- support monitor metrics name i18n: ClickHouse by @ZY945 in [https://github.com/apache/hertzbeat/pull/1642](https://github.com/apache/hertzbeat/pull/1642)
- translate blog 20220601 to English by @vinci-897 in [https://github.com/apache/hertzbeat/pull/1646](https://github.com/apache/hertzbeat/pull/1646)
- add a online prometheus parser and a prometheus-like push style. by @vinci-897 in [https://github.com/apache/hertzbeat/pull/1644](https://github.com/apache/hertzbeat/pull/1644)
- translate blog 20220320 to English by @vinci-897 in [https://github.com/apache/hertzbeat/pull/1647](https://github.com/apache/hertzbeat/pull/1647)
- support monitor metrics name i18n: DynamicTp by @ZY945 in [https://github.com/apache/hertzbeat/pull/1649](https://github.com/apache/hertzbeat/pull/1649)
- translate blog 20220228 to English by @vinci-897 in [https://github.com/apache/hertzbeat/pull/1648](https://github.com/apache/hertzbeat/pull/1648)
- translate blog 20220310 to English by @vinci-897 in [https://github.com/apache/hertzbeat/pull/1651](https://github.com/apache/hertzbeat/pull/1651)
- translate blog 20220904 to English by @vinci-897 in [https://github.com/apache/hertzbeat/pull/1652](https://github.com/apache/hertzbeat/pull/1652)
- support monitor metrics name i18n: Airflow by @ZY945 in [https://github.com/apache/hertzbeat/pull/1654](https://github.com/apache/hertzbeat/pull/1654)
- support monitor metrics name i18n: IoTDB by @ZY945 in [https://github.com/apache/hertzbeat/pull/1659](https://github.com/apache/hertzbeat/pull/1659)
- Translate 2022-02-11-hertzbeat document by @wang1027-wqh in [https://github.com/apache/hertzbeat/pull/1660](https://github.com/apache/hertzbeat/pull/1660)
- bugfix The annotation @Transactional specifies rollbackFor. by @handy-git in [https://github.com/apache/hertzbeat/pull/1643](https://github.com/apache/hertzbeat/pull/1643)
- add handy-git as a contributor for code by @allcontributors in [https://github.com/apache/hertzbeat/pull/1661](https://github.com/apache/hertzbeat/pull/1661)
- feature:Translate 2022-02-17-hertzbeat Document by @wang1027-wqh in [https://github.com/apache/hertzbeat/pull/1662](https://github.com/apache/hertzbeat/pull/1662)
- support monitor metrics name i18n: rocketmq by @ZY945 in [https://github.com/apache/hertzbeat/pull/1663](https://github.com/apache/hertzbeat/pull/1663)
- [doc] update relate doc and readme by @tomsun28 in [https://github.com/apache/hertzbeat/pull/1667](https://github.com/apache/hertzbeat/pull/1667)
- bugfix monitoring mongodb not work in springboot3 by @ZY945 in [https://github.com/apache/hertzbeat/pull/1668](https://github.com/apache/hertzbeat/pull/1668)
- [feature] add storm monitor by @starmilkxin in [https://github.com/apache/hertzbeat/pull/1673](https://github.com/apache/hertzbeat/pull/1673)
- [bugfix] fixed the issue in http_sd where services were incorrectly reported as available when they were actually unavailable by @starmilkxin in [https://github.com/apache/hertzbeat/pull/1678](https://github.com/apache/hertzbeat/pull/1678)
- remove mysql-oracle dependency jar from release package lib by @tomsun28 in [https://github.com/apache/hertzbeat/pull/1680](https://github.com/apache/hertzbeat/pull/1680)
- System config theme by @TJxiaobao in [https://github.com/apache/hertzbeat/pull/1636](https://github.com/apache/hertzbeat/pull/1636)
- update webapp menu layout and doc by @tomsun28 in [https://github.com/apache/hertzbeat/pull/1682](https://github.com/apache/hertzbeat/pull/1682)
- bugfix can not find mysql dependency when startup by @tomsun28 in [https://github.com/apache/hertzbeat/pull/1686](https://github.com/apache/hertzbeat/pull/1686)
- support config common aes secret by @tomsun28 in [https://github.com/apache/hertzbeat/pull/1683](https://github.com/apache/hertzbeat/pull/1683)
- [bugfix]fix the issue of add redis cluster node test error report(#1601) by @LiuTianyou in [https://github.com/apache/hertzbeat/pull/1684](https://github.com/apache/hertzbeat/pull/1684)
- add LiuTianyou as a contributor for code by @allcontributors in [https://github.com/apache/hertzbeat/pull/1687](https://github.com/apache/hertzbeat/pull/1687)
- mongodb monitoring support custom connection timeout param by @ZY945 in [https://github.com/apache/hertzbeat/pull/1697](https://github.com/apache/hertzbeat/pull/1697)
- bugfix old data decode error when use new common-secret by @tomsun28 in [https://github.com/apache/hertzbeat/pull/1696](https://github.com/apache/hertzbeat/pull/1696)
- [bugfix] fix bug where reopening pop-up window still retained previously edited data after closing. by @starmilkxin in [https://github.com/apache/hertzbeat/pull/1698](https://github.com/apache/hertzbeat/pull/1698)
- monitor center add search type modal by @tomsun28 in [https://github.com/apache/hertzbeat/pull/1699](https://github.com/apache/hertzbeat/pull/1699)
- fix status page logo overflow by @tomsun28 in [https://github.com/apache/hertzbeat/pull/1700](https://github.com/apache/hertzbeat/pull/1700)
- bugfix npe monitor jobid may be null by @tomsun28 in [https://github.com/apache/hertzbeat/pull/1701](https://github.com/apache/hertzbeat/pull/1701)
- support custom main menus in monitor template by @tomsun28 in [https://github.com/apache/hertzbeat/pull/1703](https://github.com/apache/hertzbeat/pull/1703)
- update home website doc by @tomsun28 in [https://github.com/apache/hertzbeat/pull/1712](https://github.com/apache/hertzbeat/pull/1712)
- [Improve] change package group to org Apache HertzBeat™ by @vinci-897 in [https://github.com/apache/hertzbeat/pull/1724](https://github.com/apache/hertzbeat/pull/1724)
- [improve] initial license clean up by @tomsun28 in [https://github.com/apache/hertzbeat/pull/1725](https://github.com/apache/hertzbeat/pull/1725)
- update manager and collector logback config(#1704) by @handy-git in [https://github.com/apache/hertzbeat/pull/1723](https://github.com/apache/hertzbeat/pull/1723)
- fix(sec): upgrade com.h2database:h2 to by @WinterKi1ler in [https://github.com/apache/hertzbeat/pull/1718](https://github.com/apache/hertzbeat/pull/1718)
- add WinterKi1ler as a contributor for code by @allcontributors in [https://github.com/apache/hertzbeat/pull/1736](https://github.com/apache/hertzbeat/pull/1736)
- update asf branch protected check by @tomsun28 in [https://github.com/apache/hertzbeat/pull/1738](https://github.com/apache/hertzbeat/pull/1738)
- [doc]Update star chart by @zqr10159 in [https://github.com/apache/hertzbeat/pull/1737](https://github.com/apache/hertzbeat/pull/1737)
- [fixed] fixed click collector online offline button error by @miki-hmt in [https://github.com/apache/hertzbeat/pull/1734](https://github.com/apache/hertzbeat/pull/1734)
- [improve] initial doc clean up by @tomsun28 in [https://github.com/apache/hertzbeat/pull/1741](https://github.com/apache/hertzbeat/pull/1741)
- [Improvement]Support multiple receivers. by @zqr10159 in [https://github.com/apache/hertzbeat/pull/1731](https://github.com/apache/hertzbeat/pull/1731)
- [improvement]Add lisence. by @zqr10159 in [https://github.com/apache/hertzbeat/pull/1746](https://github.com/apache/hertzbeat/pull/1746)
- Backend LICENSE Initialize by @wang1027-wqh in [https://github.com/apache/hertzbeat/pull/1744](https://github.com/apache/hertzbeat/pull/1744)
- Back-end dependency upgrade by @TJxiaobao in [https://github.com/apache/hertzbeat/pull/1743](https://github.com/apache/hertzbeat/pull/1743)
- [Improve] run hertzbeat in docker compose support dependen service condition by @gjjjj0101 in [https://github.com/apache/hertzbeat/pull/1748](https://github.com/apache/hertzbeat/pull/1748)
- [bugfix] fix statuspage index exception by @makechoicenow in [https://github.com/apache/hertzbeat/pull/1747](https://github.com/apache/hertzbeat/pull/1747)
- remove unlicensed dependency 'wolfy87 eventemitter' by @alpha951 in [https://github.com/apache/hertzbeat/pull/1745](https://github.com/apache/hertzbeat/pull/1745)
- [improve] auto label when pr, update asf config by @tomsun28 in [https://github.com/apache/hertzbeat/pull/1749](https://github.com/apache/hertzbeat/pull/1749)
- [improve] update asf config set required status checks context by @tomsun28 in [https://github.com/apache/hertzbeat/pull/1751](https://github.com/apache/hertzbeat/pull/1751)
- [improve] home add apache info by @a-little-fool in [https://github.com/apache/hertzbeat/pull/1740](https://github.com/apache/hertzbeat/pull/1740)
- [doc] Change e2e path by @crossoverJie in [https://github.com/apache/hertzbeat/pull/1758](https://github.com/apache/hertzbeat/pull/1758)
- fix : ingress tls inoperative by @PeixyJ in [https://github.com/apache/hertzbeat/pull/1760](https://github.com/apache/hertzbeat/pull/1760)
- [refactor] method improvement rationale by @dukbong in [https://github.com/apache/hertzbeat/pull/1757](https://github.com/apache/hertzbeat/pull/1757)
- [improve] create disclaimer file, add incubating in describe by @tomsun28 in [https://github.com/apache/hertzbeat/pull/1764](https://github.com/apache/hertzbeat/pull/1764)
- [improve] update new hertzbeat brand logo, update doc by @tomsun28 in [https://github.com/apache/hertzbeat/pull/1761](https://github.com/apache/hertzbeat/pull/1761)
- Complete the code comment translation of the common module by @Hi-Mr-Wind in [https://github.com/apache/hertzbeat/pull/1766](https://github.com/apache/hertzbeat/pull/1766)
- Remove unnecessary if-else statement. by @dukbong in [https://github.com/apache/hertzbeat/pull/1770](https://github.com/apache/hertzbeat/pull/1770)
- [doc] remove and translate chinese to english in warehous by @xuziyang in [https://github.com/apache/hertzbeat/pull/1773](https://github.com/apache/hertzbeat/pull/1773)
- Replace deprecated methods with builder pattern for RedisURI construction by @dukbong in [https://github.com/apache/hertzbeat/pull/1772](https://github.com/apache/hertzbeat/pull/1772)
- remove and translate chinese to english in collector,script,push,remoting and manager module by @MananPoojara in [https://github.com/apache/hertzbeat/pull/1774](https://github.com/apache/hertzbeat/pull/1774)
- Added the function of sending SMS messages through Alibaba Cloud. by @lwqzz in [https://github.com/apache/hertzbeat/pull/1768](https://github.com/apache/hertzbeat/pull/1768)
- [improve]Add frontend license. by @zqr10159 in [https://github.com/apache/hertzbeat/pull/1776](https://github.com/apache/hertzbeat/pull/1776)
- [test] Add RedisSingleCollectImplTest by @crossoverJie in [https://github.com/apache/hertzbeat/pull/1784](https://github.com/apache/hertzbeat/pull/1784)
- [refactor] add override annotation by @handy-git in [https://github.com/apache/hertzbeat/pull/1782](https://github.com/apache/hertzbeat/pull/1782)
- '[docs]bugfix: display syntax error of ipmi protocol' by @tomorrowshipyltm in [https://github.com/apache/hertzbeat/pull/1793](https://github.com/apache/hertzbeat/pull/1793)
- [doc] translate alerter moudle code chinese to english by @tomsun28 in [https://github.com/apache/hertzbeat/pull/1765](https://github.com/apache/hertzbeat/pull/1765)
- [refactor] database-related properties class, type changed to record by @xuziyang in [https://github.com/apache/hertzbeat/pull/1786](https://github.com/apache/hertzbeat/pull/1786)
- Fix snmp template unit conversion problem by @TJxiaobao in [https://github.com/apache/hertzbeat/pull/1796](https://github.com/apache/hertzbeat/pull/1796)
- [doc] Add help documentation for clickhouse monitoring by @LiuTianyou in [https://github.com/apache/hertzbeat/pull/1798](https://github.com/apache/hertzbeat/pull/1798)
- [feature:update-checkstyle] Limit the java file header by @YxYL6125 in [https://github.com/apache/hertzbeat/pull/1799](https://github.com/apache/hertzbeat/pull/1799)
- [improve]Add external lib folder to store mysql and oracle driver. by @zqr10159 in [https://github.com/apache/hertzbeat/pull/1783](https://github.com/apache/hertzbeat/pull/1783)
- [Improve]When multiple lines are returned, each alarm is triggered instead of only the first alarm by @15613060203 in [https://github.com/apache/hertzbeat/pull/1797](https://github.com/apache/hertzbeat/pull/1797)
- [doc] add team page in website by @alpha951 in [https://github.com/apache/hertzbeat/pull/1800](https://github.com/apache/hertzbeat/pull/1800)
- [feature] Improve the import checkstyle by @crossoverJie in [https://github.com/apache/hertzbeat/pull/1802](https://github.com/apache/hertzbeat/pull/1802)
- [doc] Add help document for dns monitoring by @LiuTianyou in [https://github.com/apache/hertzbeat/pull/1804](https://github.com/apache/hertzbeat/pull/1804)
- [improve] preventing NPE by @dukbong in [https://github.com/apache/hertzbeat/pull/1808](https://github.com/apache/hertzbeat/pull/1808)
- [refactor] change the warehouse properties the type to record by @xuziyang in [https://github.com/apache/hertzbeat/pull/1806](https://github.com/apache/hertzbeat/pull/1806)
- Refactor: upgrade syntax to jdk17(instanceof & switch) by @Calvin979 in [https://github.com/apache/hertzbeat/pull/1807](https://github.com/apache/hertzbeat/pull/1807)
- [test] Add NginxCollect test by @crossoverJie in [https://github.com/apache/hertzbeat/pull/1809](https://github.com/apache/hertzbeat/pull/1809)
- [website] update team page by @tomsun28 in [https://github.com/apache/hertzbeat/pull/1803](https://github.com/apache/hertzbeat/pull/1803)
- [test] Add RedisClusterCollectImplTest by @crossoverJie in [https://github.com/apache/hertzbeat/pull/1789](https://github.com/apache/hertzbeat/pull/1789)
- [improve] Fix typo ReqStatusResponse by @crossoverJie in [https://github.com/apache/hertzbeat/pull/1811](https://github.com/apache/hertzbeat/pull/1811)
- Comparing N objects for null with Assert.noNullElements(). by @dukbong in [https://github.com/apache/hertzbeat/pull/1814](https://github.com/apache/hertzbeat/pull/1814)
- [doc] Add help document for elasticsearch monitoring and ftp monitoring by @LiuTianyou in [https://github.com/apache/hertzbeat/pull/1815](https://github.com/apache/hertzbeat/pull/1815)
- [doc] add help documentation for huawei switch monitoring by @Alanxtl in [https://github.com/apache/hertzbeat/pull/1813](https://github.com/apache/hertzbeat/pull/1813)
- chore: upgrade the api-testing (e2e) to v0.0.16 by @LinuxSuRen in [https://github.com/apache/hertzbeat/pull/1817](https://github.com/apache/hertzbeat/pull/1817)
- [Remove]\[Improve\]Mail config by @zqr10159 in [https://github.com/apache/hertzbeat/pull/1819](https://github.com/apache/hertzbeat/pull/1819)
- Remove and translate chinese to english in code by @dukbong in [https://github.com/apache/hertzbeat/pull/1816](https://github.com/apache/hertzbeat/pull/1816)
- [feature]Add monitoring for Hbase Master by @zhangshenghang in [https://github.com/apache/hertzbeat/pull/1820](https://github.com/apache/hertzbeat/pull/1820)
- [doc] resolve code conflicts and coverage caused by pr(#1813) merge by @LiuTianyou in [https://github.com/apache/hertzbeat/pull/1821](https://github.com/apache/hertzbeat/pull/1821)
- [doc] Add help document for tidb and nacos monitoring by @Alanxtl in [https://github.com/apache/hertzbeat/pull/1823](https://github.com/apache/hertzbeat/pull/1823)
- [improve] use eclipselink orm replace of hibernate orm by @tomsun28 in [https://github.com/apache/hertzbeat/pull/1801](https://github.com/apache/hertzbeat/pull/1801)
- [improve] Add whitespace checkstyle by @crossoverJie in [https://github.com/apache/hertzbeat/pull/1824](https://github.com/apache/hertzbeat/pull/1824)
- [bugfix] dns monitoring template add query class parameter by @LiuTianyou in [https://github.com/apache/hertzbeat/pull/1825](https://github.com/apache/hertzbeat/pull/1825)
- [Refactor] Preventing Unnecessary Object Creation and Using Utility Methods by @dukbong in [https://github.com/apache/hertzbeat/pull/1818](https://github.com/apache/hertzbeat/pull/1818)
- [doc]Add and modify Doris FE Chinese and English documentation by @zhangshenghang in [https://github.com/apache/hertzbeat/pull/1828](https://github.com/apache/hertzbeat/pull/1828)
- [docs] Optimize: add help docs for UDP port & Springboot3 help doc by @zuobiao-zhou in [https://github.com/apache/hertzbeat/pull/1832](https://github.com/apache/hertzbeat/pull/1832)
- Code Simplification, Structure Changes, and Translation Work, Along with a Question by @dukbong in [https://github.com/apache/hertzbeat/pull/1827](https://github.com/apache/hertzbeat/pull/1827)
- [doc] add help document for mongodb monitoring by @LiuTianyou in [https://github.com/apache/hertzbeat/pull/1834](https://github.com/apache/hertzbeat/pull/1834)
- [collector] fix: inverts the compareTo sort of MetricsCollect run queue by @Pzz-2021 in [https://github.com/apache/hertzbeat/pull/1837](https://github.com/apache/hertzbeat/pull/1837)
- [doc]Doc add debian system by @zhangshenghang in [https://github.com/apache/hertzbeat/pull/1842](https://github.com/apache/hertzbeat/pull/1842)
- [feature] Add Apache Hbase RegionServer monitoring by @zhangshenghang in [https://github.com/apache/hertzbeat/pull/1833](https://github.com/apache/hertzbeat/pull/1833)
- [improve] Optimize websocket monitor by @LiuTianyou in [https://github.com/apache/hertzbeat/pull/1838](https://github.com/apache/hertzbeat/pull/1838)
- [refactor] Split the WarehouseProperties class by @xuziyang in [https://github.com/apache/hertzbeat/pull/1830](https://github.com/apache/hertzbeat/pull/1830)
- [test] Add test for HttpsdImpl by @crossoverJie in [https://github.com/apache/hertzbeat/pull/1840](https://github.com/apache/hertzbeat/pull/1840)
- [fix] Fix the wrong comment by @xuziyang in [https://github.com/apache/hertzbeat/pull/1843](https://github.com/apache/hertzbeat/pull/1843)
- [refactor] trans and use assert by @dukbong in [https://github.com/apache/hertzbeat/pull/1841](https://github.com/apache/hertzbeat/pull/1841)
- [bugfix] modify the command in the mongodb monitoring template by @LiuTianyou in [https://github.com/apache/hertzbeat/pull/1844](https://github.com/apache/hertzbeat/pull/1844)
- [bigfix]Fix Debian system Top10 monitoring bug by @zhangshenghang in [https://github.com/apache/hertzbeat/pull/1846](https://github.com/apache/hertzbeat/pull/1846)
- [cleanup]Delete the corresponding Chinese comments by @hudongdong129 in [https://github.com/apache/hertzbeat/pull/1847](https://github.com/apache/hertzbeat/pull/1847)
- [doc] translates chinese comment to english. by @dukbong in [https://github.com/apache/hertzbeat/pull/1853](https://github.com/apache/hertzbeat/pull/1853)
- [doc] fix error and add help document for prometheus task by @LiuTianyou in [https://github.com/apache/hertzbeat/pull/1852](https://github.com/apache/hertzbeat/pull/1852)
- [feature] Add Linux process monitoring by @zhangshenghang in [https://github.com/apache/hertzbeat/pull/1857](https://github.com/apache/hertzbeat/pull/1857)
- [test] Add test for FtpCollectImpl by @crossoverJie in [https://github.com/apache/hertzbeat/pull/1856](https://github.com/apache/hertzbeat/pull/1856)
- [improve] use apache jexl replace of aviator by @tomsun28 in [https://github.com/apache/hertzbeat/pull/1859](https://github.com/apache/hertzbeat/pull/1859)
- [bugfix] jpa data save logic repair by @zhangshenghang in [https://github.com/apache/hertzbeat/pull/1863](https://github.com/apache/hertzbeat/pull/1863)
- [feature] add influxdb metrics monitoring by @TJxiaobao in [https://github.com/apache/hertzbeat/pull/1730](https://github.com/apache/hertzbeat/pull/1730)
- [doc] add help document for rocketmq by @LiuTianyou in [https://github.com/apache/hertzbeat/pull/1874](https://github.com/apache/hertzbeat/pull/1874)
- [improve] Imporve checkstyle of test code. by @crossoverJie in [https://github.com/apache/hertzbeat/pull/1864](https://github.com/apache/hertzbeat/pull/1864)
- [feature] Support Redfish protocol to monitoring server by @gjjjj0101 in [https://github.com/apache/hertzbeat/pull/1867](https://github.com/apache/hertzbeat/pull/1867)
- Fix debian monitoring template issue about process monitoring by @LLP2333 in [https://github.com/apache/hertzbeat/pull/1868](https://github.com/apache/hertzbeat/pull/1868)
- [bugfix] centos Top10 shows missing one by @zhangshenghang in [https://github.com/apache/hertzbeat/pull/1870](https://github.com/apache/hertzbeat/pull/1870)
- [improve] add website apache incubator footer by @tomsun28 in [https://github.com/apache/hertzbeat/pull/1860](https://github.com/apache/hertzbeat/pull/1860)
- [doc] update help document by @LiuTianyou in [https://github.com/apache/hertzbeat/pull/1861](https://github.com/apache/hertzbeat/pull/1861)
- [featurn] support flyway database migration by @tomsun28 in [https://github.com/apache/hertzbeat/pull/1875](https://github.com/apache/hertzbeat/pull/1875)
- [improve] Delete the timestamp field in the class MetricFamily.Metric by @xuziyang in [https://github.com/apache/hertzbeat/pull/1878](https://github.com/apache/hertzbeat/pull/1878)
- [improve] Use java.lang.AutoCloseable instead of CacheCloseable by @crossoverJie in [https://github.com/apache/hertzbeat/pull/1879](https://github.com/apache/hertzbeat/pull/1879)
- [bugfix]Fix top10 process command. by @zqr10159 in [https://github.com/apache/hertzbeat/pull/1876](https://github.com/apache/hertzbeat/pull/1876)
- [feature] support the VictoriaMetrics cluster by @xuziyang in [https://github.com/apache/hertzbeat/pull/1880](https://github.com/apache/hertzbeat/pull/1880)
- [improve] Refactor common cache code by @crossoverJie in [https://github.com/apache/hertzbeat/pull/1881](https://github.com/apache/hertzbeat/pull/1881)
- Eliminate Unnecessary Unboxing and Generics by @handy-git in [https://github.com/apache/hertzbeat/pull/1882](https://github.com/apache/hertzbeat/pull/1882)
- [bugfix]\[doc\]Add kafka sidebar. by @zqr10159 in [https://github.com/apache/hertzbeat/pull/1883](https://github.com/apache/hertzbeat/pull/1883)
- [doc] I18n for monitoring template yml metrics by @zuobiao-zhou in [https://github.com/apache/hertzbeat/pull/1888](https://github.com/apache/hertzbeat/pull/1888)
- [refactor] StoreProperties is no longer useful, delete it by @xuziyang in [https://github.com/apache/hertzbeat/pull/1887](https://github.com/apache/hertzbeat/pull/1887)
- bugfix statistical metrics data matching fails by @tomsun28 in [https://github.com/apache/hertzbeat/pull/1884](https://github.com/apache/hertzbeat/pull/1884)
- [doc] add help doc for flink monitoring by @HeartLinked in [https://github.com/apache/hertzbeat/pull/1893](https://github.com/apache/hertzbeat/pull/1893)
- [doc] add almalinux documentation by @zhangshenghang in [https://github.com/apache/hertzbeat/pull/1892](https://github.com/apache/hertzbeat/pull/1892)
- [improve] Missing a generic by @crossoverJie in [https://github.com/apache/hertzbeat/pull/1889](https://github.com/apache/hertzbeat/pull/1889)
- [bugfix] Fixed some metrics of Jexlespression not matching in Elasticsearch by @zhangshenghang in [https://github.com/apache/hertzbeat/pull/1894](https://github.com/apache/hertzbeat/pull/1894)
- feat(*): Support Time Type to Tengine Data Storage by @Clownsw in [https://github.com/apache/hertzbeat/pull/1890](https://github.com/apache/hertzbeat/pull/1890)
- [feature] support random jwt secret when not custom by @tomsun28 in [https://github.com/apache/hertzbeat/pull/1897](https://github.com/apache/hertzbeat/pull/1897)
- [doc] add opensuse doc by @zhangshenghang in [https://github.com/apache/hertzbeat/pull/1902](https://github.com/apache/hertzbeat/pull/1902)
- fix when manager restart, collect register error by @Ceilzcx in [https://github.com/apache/hertzbeat/pull/1896](https://github.com/apache/hertzbeat/pull/1896)
- [bugfix] fix can not use empty collection as query params in eclipselink by @tomsun28 in [https://github.com/apache/hertzbeat/pull/1900](https://github.com/apache/hertzbeat/pull/1900)
- [doc] update doc add download page and pic by @tomsun28 in [https://github.com/apache/hertzbeat/pull/1904](https://github.com/apache/hertzbeat/pull/1904)
- [test] Add test for UdpCollectImpl by @crossoverJie in [https://github.com/apache/hertzbeat/pull/1906](https://github.com/apache/hertzbeat/pull/1906)
- fix license by @yqxxgh in [https://github.com/apache/hertzbeat/pull/1907](https://github.com/apache/hertzbeat/pull/1907)
- [improve] refactor code by @Ceilzcx in [https://github.com/apache/hertzbeat/pull/1901](https://github.com/apache/hertzbeat/pull/1901)
- [type:bugfix] fix customized menu invalid bug #1898 by @Aias00 in [https://github.com/apache/hertzbeat/pull/1908](https://github.com/apache/hertzbeat/pull/1908)
- [type:bugfix] fix HTTP API bug #1895 by @Aias00 in [https://github.com/apache/hertzbeat/pull/1909](https://github.com/apache/hertzbeat/pull/1909)
- [test] Add test for WebsocketCollectImpl by @crossoverJie in [https://github.com/apache/hertzbeat/pull/1912](https://github.com/apache/hertzbeat/pull/1912)
- [doc] translates chinese comment to english. by @westboy in [https://github.com/apache/hertzbeat/pull/1914](https://github.com/apache/hertzbeat/pull/1914)
- [doc] Add HIP document and template by @crossoverJie in [https://github.com/apache/hertzbeat/pull/1913](https://github.com/apache/hertzbeat/pull/1913)
- [improve] clean up home webapp unused code by @tomsun28 in [https://github.com/apache/hertzbeat/pull/1915](https://github.com/apache/hertzbeat/pull/1915)
- [feature] support use ngql query metrics from nebulaGraph by @LiuTianyou in [https://github.com/apache/hertzbeat/pull/1917](https://github.com/apache/hertzbeat/pull/1917)
- [doc] Improve the Contribution Documentation. by @crossoverJie in [https://github.com/apache/hertzbeat/pull/1918](https://github.com/apache/hertzbeat/pull/1918)
- [featrue]add apache hdfs monitor by @zhangshenghang in [https://github.com/apache/hertzbeat/pull/1920](https://github.com/apache/hertzbeat/pull/1920)
- [doc] update hbase documentation description by @zhangshenghang in [https://github.com/apache/hertzbeat/pull/1921](https://github.com/apache/hertzbeat/pull/1921)
- [doc] Add documentation for nebulaGraph cluster monitoring and custom monitoring using NGQL, and clean up useless parameters by @LiuTianyou in [https://github.com/apache/hertzbeat/pull/1923](https://github.com/apache/hertzbeat/pull/1923)
- [test] Add test for TelnetCollectImplTest by @crossoverJie in [https://github.com/apache/hertzbeat/pull/1924](https://github.com/apache/hertzbeat/pull/1924)
- fix(*): fix TdEngine Init not found Database by @Clownsw in [https://github.com/apache/hertzbeat/pull/1891](https://github.com/apache/hertzbeat/pull/1891)
- [doc] update contribution and add run-build guide by @tomsun28 in [https://github.com/apache/hertzbeat/pull/1919](https://github.com/apache/hertzbeat/pull/1919)
- bugfix collector startup error can not find JdbcClient by @tomsun28 in [https://github.com/apache/hertzbeat/pull/1925](https://github.com/apache/hertzbeat/pull/1925)
- [doc] add help document for freebsd monitoring by @LiuTianyou in [https://github.com/apache/hertzbeat/pull/1928](https://github.com/apache/hertzbeat/pull/1928)
- [refactoring] Split AbstractHistoryDataStorage class by @xuziyang in [https://github.com/apache/hertzbeat/pull/1926](https://github.com/apache/hertzbeat/pull/1926)
- [fix] fixed name error in monitoring template and improve NGQL protocol by @LiuTianyou in [https://github.com/apache/hertzbeat/pull/1931](https://github.com/apache/hertzbeat/pull/1931)
- [refactoring] Split AbstractRealTimeDataStorage class by @xuziyang in [https://github.com/apache/hertzbeat/pull/1935](https://github.com/apache/hertzbeat/pull/1935)
- [bugfix] fix ssl-cert days_remaining and npe by @tomsun28 in [https://github.com/apache/hertzbeat/pull/1934](https://github.com/apache/hertzbeat/pull/1934)
- [feature] add apache yarn monitor by @zhangshenghang in [https://github.com/apache/hertzbeat/pull/1937](https://github.com/apache/hertzbeat/pull/1937)
- [doc] add help document for redhat monitoring and rocky linux monitoring by @LiuTianyou in [https://github.com/apache/hertzbeat/pull/1939](https://github.com/apache/hertzbeat/pull/1939)
- [test] Add test for NtpCollectImpl by @crossoverJie in [https://github.com/apache/hertzbeat/pull/1940](https://github.com/apache/hertzbeat/pull/1940)
- [bugfix] fix alarm center tags display error by @tomsun28 in [https://github.com/apache/hertzbeat/pull/1938](https://github.com/apache/hertzbeat/pull/1938)
- [improve] prepare for release hertzbeat v1.6.0 by @tomsun28 in [https://github.com/apache/hertzbeat/pull/1929](https://github.com/apache/hertzbeat/pull/1929)
- add:Updated the Open Source Summer Project blog. by @TJxiaobao in [https://github.com/apache/hertzbeat/pull/1943](https://github.com/apache/hertzbeat/pull/1943)
- [feature] Support monitoring of OpenAI accounts by @zuobiao-zhou in [https://github.com/apache/hertzbeat/pull/1947](https://github.com/apache/hertzbeat/pull/1947)
- [refactoring] Inject a single instance of the data store by @xuziyang in [https://github.com/apache/hertzbeat/pull/1944](https://github.com/apache/hertzbeat/pull/1944)
- [refactoring] AbstractHistoryDataStorage implement the DisposableBean by @xuziyang in [https://github.com/apache/hertzbeat/pull/1946](https://github.com/apache/hertzbeat/pull/1946)
- [doc] update iotdb init document by @zhangshenghang in [https://github.com/apache/hertzbeat/pull/1948](https://github.com/apache/hertzbeat/pull/1948)
- [improve] update build script by @tomsun28 in [https://github.com/apache/hertzbeat/pull/1949](https://github.com/apache/hertzbeat/pull/1949)
- [test] add test for NgqlCollectImpl by @LiuTianyou in [https://github.com/apache/hertzbeat/pull/1953](https://github.com/apache/hertzbeat/pull/1953)
- [bugfix]Replace monitors to alert. by @zqr10159 in [https://github.com/apache/hertzbeat/pull/1954](https://github.com/apache/hertzbeat/pull/1954)
- [improve] add llm, server menu and update doc by @tomsun28 in [https://github.com/apache/hertzbeat/pull/1955](https://github.com/apache/hertzbeat/pull/1955)
- [improve]\[HIP\] HIP-01: Refactoring AbstractCollect by @crossoverJie in [https://github.com/apache/hertzbeat/pull/1930](https://github.com/apache/hertzbeat/pull/1930)
- [bugfix] fix ConnectionCommonCache possible npe by @crossoverJie in [https://github.com/apache/hertzbeat/pull/1959](https://github.com/apache/hertzbeat/pull/1959)
- [doc] add help document for eulerOS monitoring by @LiuTianyou in [https://github.com/apache/hertzbeat/pull/1960](https://github.com/apache/hertzbeat/pull/1960)
- [fixbug] Fix the problem of no data for springboot3 monitoring by @zhangshenghang in [https://github.com/apache/hertzbeat/pull/1961](https://github.com/apache/hertzbeat/pull/1961)
- commitfix the front-end popup cannot exit by @Yanshuming1 in [https://github.com/apache/hertzbeat/pull/1957](https://github.com/apache/hertzbeat/pull/1957)
- [fixbug] expression rule adaptation by @zhangshenghang in [https://github.com/apache/hertzbeat/pull/1963](https://github.com/apache/hertzbeat/pull/1963)
- [doc] add help doc for influxdb-promql and kafka-promql monitoring by @LiuTianyou in [https://github.com/apache/hertzbeat/pull/1965](https://github.com/apache/hertzbeat/pull/1965)
- [doc]: update readme-cn docs by @yuluo-yx in [https://github.com/apache/hertzbeat/pull/1964](https://github.com/apache/hertzbeat/pull/1964)
- [improve]\[HIP\] HIP-01: Implement refactoring AbstractCollect by @crossoverJie in [https://github.com/apache/hertzbeat/pull/1966](https://github.com/apache/hertzbeat/pull/1966)
- [chore] update .gitignore to save .idea/icon.png by @yuluo-yx in [https://github.com/apache/hertzbeat/pull/1971](https://github.com/apache/hertzbeat/pull/1971)
- [improve]\[bugfix\]: fix AlertTemplateUtilTest test exception and update code style by @yuluo-yx in [https://github.com/apache/hertzbeat/pull/1969](https://github.com/apache/hertzbeat/pull/1969)
- [feature] add apache hugegraph monitor by @zhangshenghang in [https://github.com/apache/hertzbeat/pull/1972](https://github.com/apache/hertzbeat/pull/1972)
- [improve] Implement cascading parameter list for SNMP protocol by @zuobiao-zhou in [https://github.com/apache/hertzbeat/pull/1976](https://github.com/apache/hertzbeat/pull/1976)
- [improve] optimize DateUtil and add test case by @yuluo-yx in [https://github.com/apache/hertzbeat/pull/1974](https://github.com/apache/hertzbeat/pull/1974)
- [feature]HertzBeat custom plugin. by @zqr10159 in [https://github.com/apache/hertzbeat/pull/1973](https://github.com/apache/hertzbeat/pull/1973)
- update login page and status page color by @lwjxy in [https://github.com/apache/hertzbeat/pull/1977](https://github.com/apache/hertzbeat/pull/1977)
- [chore] update code style and add some comment by @yuluo-yx in [https://github.com/apache/hertzbeat/pull/1975](https://github.com/apache/hertzbeat/pull/1975)
- [doc]HertzBeat plugin doc. by @zqr10159 in [https://github.com/apache/hertzbeat/pull/1980](https://github.com/apache/hertzbeat/pull/1980)
- [doc] update contributors and update status page style by @tomsun28 in [https://github.com/apache/hertzbeat/pull/1981](https://github.com/apache/hertzbeat/pull/1981)
- [feature] Implement cascading parameter list by @zuobiao-zhou in [https://github.com/apache/hertzbeat/pull/1978](https://github.com/apache/hertzbeat/pull/1978)
- [doc]update threshold alarm doc by @zhangshenghang in [https://github.com/apache/hertzbeat/pull/1983](https://github.com/apache/hertzbeat/pull/1983)
- [chore] optimize code style by @yuluo-yx in [https://github.com/apache/hertzbeat/pull/1984](https://github.com/apache/hertzbeat/pull/1984)
- [fix] Compatible with MongoDB versions earlier than 3.6 by @gjjjj0101 in [https://github.com/apache/hertzbeat/pull/1988](https://github.com/apache/hertzbeat/pull/1988)
- [chore] optimize manager code style by @yuluo-yx in [https://github.com/apache/hertzbeat/pull/1993](https://github.com/apache/hertzbeat/pull/1993)
- [doc] Translate part of documentation development.md under `zh-cn` directory from `en` to `zh-cn` by @Thespica in [https://github.com/apache/hertzbeat/pull/1995](https://github.com/apache/hertzbeat/pull/1995)
- [improve] http protocol prometheus parsing optimization by @zhangshenghang in [https://github.com/apache/hertzbeat/pull/1996](https://github.com/apache/hertzbeat/pull/1996)
- [feature] add at function for wechat by @Yanshuming1 in [https://github.com/apache/hertzbeat/pull/1994](https://github.com/apache/hertzbeat/pull/1994)
- [improve] add common util test by @yuluo-yx in [https://github.com/apache/hertzbeat/pull/2001](https://github.com/apache/hertzbeat/pull/2001)
- [improve] update release license notice and package by @tomsun28 in [https://github.com/apache/hertzbeat/pull/2003](https://github.com/apache/hertzbeat/pull/2003)
- [bugfix] fix collector startup error classpath by @tomsun28 in [https://github.com/apache/hertzbeat/pull/2004](https://github.com/apache/hertzbeat/pull/2004)
- [chore] optimize code style by @yuluo-yx in [https://github.com/apache/hertzbeat/pull/2000](https://github.com/apache/hertzbeat/pull/2000)
- [improve] Bump up `eslint-plugin-jsdoc` to 48.2.5 to support node 20+ by @Thespica in [https://github.com/apache/hertzbeat/pull/2005](https://github.com/apache/hertzbeat/pull/2005)
- [doc] fix doc highlighting by @boatrainlsz in [https://github.com/apache/hertzbeat/pull/2006](https://github.com/apache/hertzbeat/pull/2006)
- [web-app]feature: case insensitive search by @JavaProgrammerLB in [https://github.com/apache/hertzbeat/pull/2007](https://github.com/apache/hertzbeat/pull/2007)
- [feature] Support time calculation expressions. by @LiuTianyou in [https://github.com/apache/hertzbeat/pull/2009](https://github.com/apache/hertzbeat/pull/2009)
- [doc] add document for time expression by @LiuTianyou in [https://github.com/apache/hertzbeat/pull/2012](https://github.com/apache/hertzbeat/pull/2012)
- [feature] Add Apache Pulsar monitor by @zhangshenghang in [https://github.com/apache/hertzbeat/pull/2013](https://github.com/apache/hertzbeat/pull/2013)
- [doc] home verify release doc update by @tomsun28 in [https://github.com/apache/hertzbeat/pull/2014](https://github.com/apache/hertzbeat/pull/2014)
- [Improve] Improve clickhouse monitor And Improve Pulsar monitor by @zhangshenghang in [https://github.com/apache/hertzbeat/pull/2015](https://github.com/apache/hertzbeat/pull/2015)
- [doc] translate help document for memcached monitoring by @LiuTianyou in [https://github.com/apache/hertzbeat/pull/2019](https://github.com/apache/hertzbeat/pull/2019)
- [improve] optimize collector httpsd discovery by @yuluo-yx in [https://github.com/apache/hertzbeat/pull/1991](https://github.com/apache/hertzbeat/pull/1991)
- [optimize] optimize code style and logic, add unit test by @yuluo-yx in [https://github.com/apache/hertzbeat/pull/2010](https://github.com/apache/hertzbeat/pull/2010)
- [fix] Fix possible potential thread safe bugs by @gjjjj0101 in [https://github.com/apache/hertzbeat/pull/2021](https://github.com/apache/hertzbeat/pull/2021)
- [improve] add ci for home by @LiuTianyou in [https://github.com/apache/hertzbeat/pull/2024](https://github.com/apache/hertzbeat/pull/2024)
- [bugfix]Tag with empty value Shouldn't transform to Tag: by @JavaProgrammerLB in [https://github.com/apache/hertzbeat/pull/2025](https://github.com/apache/hertzbeat/pull/2025)
- [bugfix] modify popup confirm to clear cache and cancel popup save by @Yanshuming1 in [https://github.com/apache/hertzbeat/pull/2026](https://github.com/apache/hertzbeat/pull/2026)
- [improve] update monitor state desc by @tomsun28 in [https://github.com/apache/hertzbeat/pull/2028](https://github.com/apache/hertzbeat/pull/2028)
- bugfix: fix overflow of integers by @Calvin979 in [https://github.com/apache/hertzbeat/pull/2029](https://github.com/apache/hertzbeat/pull/2029)
- [improve] tips need update initial default password by @tomsun28 in [https://github.com/apache/hertzbeat/pull/2030](https://github.com/apache/hertzbeat/pull/2030)
- [improve] deprecate support iotdb 0.* version by @Ceilzcx in [https://github.com/apache/hertzbeat/pull/2032](https://github.com/apache/hertzbeat/pull/2032)
- [fixbug] required field check by @zhangshenghang in [https://github.com/apache/hertzbeat/pull/2022](https://github.com/apache/hertzbeat/pull/2022)
- [improve] add IcmpCollectImplTest by @zuobiao-zhou in [https://github.com/apache/hertzbeat/pull/2033](https://github.com/apache/hertzbeat/pull/2033)
- [improve] fix code style by @zuobiao-zhou in [https://github.com/apache/hertzbeat/pull/2034](https://github.com/apache/hertzbeat/pull/2034)
- [improve] increase the length limit of the username field by @zuobiao-zhou in [https://github.com/apache/hertzbeat/pull/2035](https://github.com/apache/hertzbeat/pull/2035)
- [improve] Checkstyle include testSource by @crossoverJie in [https://github.com/apache/hertzbeat/pull/2036](https://github.com/apache/hertzbeat/pull/2036)
- [bugfix] fix collector and frontend dependent license error by @tomsun28 in [https://github.com/apache/hertzbeat/pull/2037](https://github.com/apache/hertzbeat/pull/2037)
- [improve] Add test for MemcachedCollectImpl by @zuobiao-zhou in [https://github.com/apache/hertzbeat/pull/2044](https://github.com/apache/hertzbeat/pull/2044)
- [imprve] Remove duplicate indices by @zuobiao-zhou in [https://github.com/apache/hertzbeat/pull/2045](https://github.com/apache/hertzbeat/pull/2045)
- [docs]: fix several typos in docs by @lw-yang in [https://github.com/apache/hertzbeat/pull/2047](https://github.com/apache/hertzbeat/pull/2047)
- Add the missing parts of docs, fix layout, sync the English version with the Chinese version by @xfl12345 in [https://github.com/apache/hertzbeat/pull/2048](https://github.com/apache/hertzbeat/pull/2048)
- [improve] add filename check in home ci by @LiuTianyou in [https://github.com/apache/hertzbeat/pull/2049](https://github.com/apache/hertzbeat/pull/2049)
- [improve] update dependency licenses and remove the aliyun sms depend by @tomsun28 in [https://github.com/apache/hertzbeat/pull/2058](https://github.com/apache/hertzbeat/pull/2058)
## New Contributors
- @handy-git made their first contribution in [https://github.com/apache/hertzbeat/pull/1643](https://github.com/apache/hertzbeat/pull/1643)
- @LiuTianyou made their first contribution in [https://github.com/apache/hertzbeat/pull/1684](https://github.com/apache/hertzbeat/pull/1684)
- @WinterKi1ler made their first contribution in [https://github.com/apache/hertzbeat/pull/1718](https://github.com/apache/hertzbeat/pull/1718)
- @miki-hmt made their first contribution in [https://github.com/apache/hertzbeat/pull/1734](https://github.com/apache/hertzbeat/pull/1734)
- @gjjjj0101 made their first contribution in [https://github.com/apache/hertzbeat/pull/1748](https://github.com/apache/hertzbeat/pull/1748)
- @makechoicenow made their first contribution in [https://github.com/apache/hertzbeat/pull/1747](https://github.com/apache/hertzbeat/pull/1747)
- @alpha951 made their first contribution in [https://github.com/apache/hertzbeat/pull/1745](https://github.com/apache/hertzbeat/pull/1745)
- @crossoverJie made their first contribution in [https://github.com/apache/hertzbeat/pull/1758](https://github.com/apache/hertzbeat/pull/1758)
- @PeixyJ made their first contribution in [https://github.com/apache/hertzbeat/pull/1760](https://github.com/apache/hertzbeat/pull/1760)
- @dukbong made their first contribution in [https://github.com/apache/hertzbeat/pull/1757](https://github.com/apache/hertzbeat/pull/1757)
- @xuziyang made their first contribution in [https://github.com/apache/hertzbeat/pull/1773](https://github.com/apache/hertzbeat/pull/1773)
- @MananPoojara made their first contribution in [https://github.com/apache/hertzbeat/pull/1774](https://github.com/apache/hertzbeat/pull/1774)
- @lwqzz made their first contribution in [https://github.com/apache/hertzbeat/pull/1768](https://github.com/apache/hertzbeat/pull/1768)
- @tomorrowshipyltm made their first contribution in [https://github.com/apache/hertzbeat/pull/1793](https://github.com/apache/hertzbeat/pull/1793)
- @YxYL6125 made their first contribution in [https://github.com/apache/hertzbeat/pull/1799](https://github.com/apache/hertzbeat/pull/1799)
- @15613060203 made their first contribution in [https://github.com/apache/hertzbeat/pull/1797](https://github.com/apache/hertzbeat/pull/1797)
- @Alanxtl made their first contribution in [https://github.com/apache/hertzbeat/pull/1813](https://github.com/apache/hertzbeat/pull/1813)
- @zhangshenghang made their first contribution in [https://github.com/apache/hertzbeat/pull/1820](https://github.com/apache/hertzbeat/pull/1820)
- @zuobiao-zhou made their first contribution in [https://github.com/apache/hertzbeat/pull/1832](https://github.com/apache/hertzbeat/pull/1832)
- @Pzz-2021 made their first contribution in [https://github.com/apache/hertzbeat/pull/1837](https://github.com/apache/hertzbeat/pull/1837)
- @LLP2333 made their first contribution in [https://github.com/apache/hertzbeat/pull/1868](https://github.com/apache/hertzbeat/pull/1868)
- @HeartLinked made their first contribution in [https://github.com/apache/hertzbeat/pull/1893](https://github.com/apache/hertzbeat/pull/1893)
- @Aias00 made their first contribution in [https://github.com/apache/hertzbeat/pull/1908](https://github.com/apache/hertzbeat/pull/1908)
- @westboy made their first contribution in [https://github.com/apache/hertzbeat/pull/1914](https://github.com/apache/hertzbeat/pull/1914)
- @Yanshuming1 made their first contribution in [https://github.com/apache/hertzbeat/pull/1957](https://github.com/apache/hertzbeat/pull/1957)
- @yuluo-yx made their first contribution in [https://github.com/apache/hertzbeat/pull/1964](https://github.com/apache/hertzbeat/pull/1964)
- @lwjxy made their first contribution in [https://github.com/apache/hertzbeat/pull/1977](https://github.com/apache/hertzbeat/pull/1977)
- @Thespica made their first contribution in [https://github.com/apache/hertzbeat/pull/1995](https://github.com/apache/hertzbeat/pull/1995)
- @boatrainlsz made their first contribution in [https://github.com/apache/hertzbeat/pull/2006](https://github.com/apache/hertzbeat/pull/2006)
- @JavaProgrammerLB made their first contribution in [https://github.com/apache/hertzbeat/pull/2007](https://github.com/apache/hertzbeat/pull/2007)
- @lw-yang made their first contribution in [https://github.com/apache/hertzbeat/pull/2047](https://github.com/apache/hertzbeat/pull/2047)
- @xfl12345 made their first contribution in [https://github.com/apache/hertzbeat/pull/2048](https://github.com/apache/hertzbeat/pull/2048)
## 一条命令即可开始
```docker run -d -p 1157:1157 -p 1158:1158 --name hertzbeat apache/hertzbeat```
```或者试用 quay.io (如果 DockerHub 网络超时)```
```docker run -d -p 1157:1157 -p 1158:1158 --name hertzbeat quay.io/tancloud/hertzbeat```
详细参考 HertzBeat 官网文档 [https://hertzbeat.apache.org/docs](https://hertzbeat.apache.org/docs)
---
**Github: [https://github.com/apache/hertzbeat](https://github.com/apache/hertzbeat)**
下载页面: [https://hertzbeat.apache.org/docs/download/](https://hertzbeat.apache.org/docs/download/)
升级指南: [https://hertzbeat.apache.org/blog/2024/06/11/hertzbeat-v1.6.0-update/](https://hertzbeat.apache.org/blog/2024/06/11/hertzbeat-v1.6.0-update/)
Have Fun!
---
HertzBeat, Make Monitoring Easier!
Apache HertzBeat™ Team
@@ -0,0 +1,42 @@
---
title: 热烈欢迎 HertzBeat 小伙伴新晋社区 Committer!
author: crossoverJie
author_title: crossoverJie
author_url: https://github.com/crossoverjie
tags: [opensource, practice]
keywords: [open source monitoring system, alerting system]
---
![hertzBeat](/img/blog/new-committer.png)
> 🎉非常高兴成为 Apache HertzBeat™ 项目的 Committer,受社区邀请来做一个自我介绍🥰。
15 年参与工作至今一直在从事后端研发工作,做过业务开发、基础架构和技术管理;现在在一家互联网公司从事基础架构工程师;
个人一直热衷于开源社区,同时也是 Apache Pulsar 的 CommitterOpenTelemetry 和 VictoriaMetrics 的 Contributor。
## 与 HertzBeat 结缘
今年 4 月份,也就是 HertzBeat 进入 Apache 孵化器的时候,我无意间在朋友圈里看到了一篇公众号的推荐。
当时第一反应是这个名字取得非常不错😄,然后仔细看了下它所提供的功能,解决了哪些问题,此时就发现功能非常强大💪。
因为我在公司内部也需要维护可观测系统,个人参与过一个叫做 cprobe 的开源项目(这个项目的部分目标和 HertzBeat 类似)。
所以对监控系统有一些经验同时也非常感兴趣,于是便阅读了文档很快就在本地启动起来了(这一点社区做的很好,许多开源项目第一步启动就要劝退不少潜在的开发者)。
## 开始贡献
我的第一个 PR 是修改了一个 PR 模板里的错误路径,社区处理的非常快,所以第一次贡献就好感倍增。
于是我便尝试开始阅读 HertzBeat 的一些核心采集代码,发现当时许多逻辑都没有提供单测,所以我就开始补全这些测试。
> 从单测入手确实是上手一个全新项目的好办法。
在补单测的过程中也发现了有些代码逻辑可以优化、代码格式不统一等问题;于是把这些问题都一一解决反馈给了社区。
同样的社区响应非常迅速🏎,也极大的鼓舞了我的积极性。
在这个过程中我也把在其他社区(Pulsar、OpenTelemetry)的优秀经验借鉴到 HertzBeat,大家取长补短,想必这也是开源的魅力所在吧。
最后要感谢社区的 logicz 邀请我成为 Committertom 对我 PR 的 review,预祝 HertzBeat 从孵化器毕业成为明星项目🎊。
@@ -0,0 +1,48 @@
---
title: 热烈欢迎 HertzBeat 小伙伴新晋社区 Committer!
author: zhangshenghang
author_title: zhangshenghang
author_url: https://github.com/zhangshenghang
tags: [opensource, practice]
keywords: [open source monitoring system, alerting system]
---
![hertzBeat](/img/blog/new-committer.png)
## 初识 Apache HertzBeat
我第一次接触 Apache HertzBeat™ 项目是因为一个偶然的机会。当时,我正在寻找一个开源项目来监控我们公司相关服务。Apache HertzBeat™ 作为一个通用监控的项目,自然进入了我的视野。我开始通过阅读官方文档和浏览项目的代码库,来了解它的架构和功能。
### 开始贡献
在对项目有了初步的了解之后,发现他对大数据领域监控范围还需要完成,我决定开始贡献一些代码。我首先从补充大数据监控入手。这不仅帮助我更深入地理解项目,也逐渐让社区的其他成员认识了我。记得我提交的第一个 Pull Request 是新增Hbase集群监控模板。虽然这看起来微不足道,但当它被合并时,我感到非常激动。这是我与开源社区的一次真正互动,也是我迈向更大贡献的第一步。
### 深入参与
随着对项目的理解加深,我开始挑战一些更复杂的问题。我阅读了大量的代码,参与了社区的日常讨论,月例会讨论,并在issue/pr中活跃发言。这些活动不仅帮助我提升了技术能力,还让我对项目的发展方向有了更好的把握。我开始提出自己的想法和建议,积极参与设计讨论,并提出了一些新的功能。
### 被提名为 Committer
在经过一段时间的积极贡献之后,我收到了来自社区(tom) 的Committer 的提名。成为 Committer 意味着我将拥有更大的责任和权限。提名过程是公开和透明的,社区的每一个成员都有机会表达他们的意见。
### 成为 Committer 后的体验
成为 Committer 后,我的角色发生了变化。我不仅继续进行代码贡献,还开始负责审查其他贡献者的代码,帮助他们解决问题,指导他们的贡献。这个过程让我学到了很多,也让我更加深刻地体会到社区协作的重要性。
作为 Committer,我需要在代码质量和项目发展之间找到平衡。我学会了如何有效地进行代码审查,如何提供建设性的反馈,如何处理冲突。这些经验不仅提升了我的技术能力,也让我在沟通和协作方面有了很大的进步。
### 心路历程
回顾整个过程,从最初的观望到积极参与,再到成为 Committer,我经历了很多挑战和成长。有时我会因为遇到技术难题而感到困惑,有时也会因为贡献没有被接受而感到失落。但正是这些挑战,让我不断反思和改进,不断提升自己的能力。
在这个过程中,我也得到了很多人的帮助和支持。社区中的前辈们给予了我很多指导和建议,他们的无私分享让我受益匪浅。我也认识了很多志同道合的朋友,我们一起参与开源,一起讨论问题,一起解决难题,一起庆祝成功。
### 个人感受
成为 Apache HertzBeat™ 的 Committer 是我职业生涯中的一个重要里程碑。这不仅是对我技术能力的认可,也是对我在开源社区中贡献的肯定。成为 Committer 不是一个结束,而是一个新的开始,我还有很多需要学习和提升的地方。
这个过程让我明白了合作的重要性,也让我感受到了开源精神的魅力。开源不仅是一种技术分享的方式,更是一种协作和共同进步的理念。我非常荣幸能够成为 Apache HertzBeat™ 社区的一员,并希望在未来继续为项目的发展做出贡献。
### 结语
成为 Apache HertzBeat™ 项目的 Committer 是一个充满挑战和收获的旅程。通过不断的学习和贡献,我不仅提升了自己的技术能力,也在社区中找到了归属感和成就感。我希望我的经历能够激励更多的人参与到开源社区中来,共同推动技术的进步和发展。借用tom老哥的话:参与开源不要影响大家的工作和生活,那就违背初衷啦,大家利用下班后空闲时间参与哦。
@@ -0,0 +1,32 @@
---
title: 热烈欢迎 HertzBeat 小伙伴新晋社区 Committer!
author: LiuTianyou
author_title: LiuTianyou
author_url: https://github.com/LiuTianyou
tags: [opensource, practice]
keywords: [open source monitoring system, alerting system]
---
![hertzBeat](/img/blog/new-committer.png)
大家好,非常荣幸可以收到社区邀请被提名为 Apache HertzBeat™ 的 Committer。我先做一个简单的自我介绍,从2019年工作开始,一直从事后端开发工作,主要使用Java语言,目前在一家网络安全公司从事网络安全相关产品后端开发工作。
## 遇见
我工作的项目里部署着数台物理服务器,其中运行着各种数据库,中间件,尽管部署了 Prometheus + grafana 的监控组合,但由于大多数的服务和服务器都需要额外安装 exporter,这套监控系统并没有覆盖到项目的全部,有时候服务宕机了,被用到了才发现。四月份的某一天我刷到了一篇公众号文章介绍了 HertzBeat,我马上被不需要 agent,全程可视化配置的特新吸引加上支持docker一键部署,我迅速的部署起来了 HertzBeat 并投入了使用。
### 熟悉
由于完全可视化操作,很快就将项目中用到的服务器,数据库,中间件纳入了 HertzBeat 的管理。之后,恰好社区为发布第一个Apache版本做准备,需要补充大量的文档。我尝试提交一些文档,来熟悉社区的提交代码和文档的流程,也顺便在补充的文档的过程的熟悉相关部分的代码。
### 尝试加一点东西
我做的第一个大的改动是让 HertzBeat 支持使用NGQL语句从NebulaGraph中查询指标,并且这个基于协议增加了NebulaGraph集群的监控模板。最开始有这个想法来源于自己的需求,当我把这个想法提交给社区时,很快就得到了社区的回应,并得到了肯定,这也让对持续参与这个项目信心倍增。
### 加入
由于我不停的写文档,贡献代码,我开始熟悉这个社区,熟悉这个项目,开始尝试提出一些自己的建议。很多建议都被社区采纳,并且在新版本中发布,在第一个Apache版本发布后,我收到了@tomsun28和@TJxiaobao的邀请被提名为Committer
### 结语
非常荣幸可以参与到这个项目中并被社区认可,感谢帮我review代码,给我指导和帮助的 @tomsun28@TJxiaobao@zqr10159@tuohai666@yuluo-yx@crossoverJie@zhangshenghang@pwallk。最后祝 Apache HertzBeat™ 茁壮成长,有越来越多的贡献者参与其中。
@@ -0,0 +1,38 @@
---
title: 热烈欢迎 HertzBeat 小伙伴新晋社区 Committer!
author: Calvin979
author_title: Calvin979
author_url: https://github.com/Calvin979
tags: [opensource, practice]
keywords: [open source monitoring system, alerting system]
---
![hertzBeat](/img/blog/new-committer.png)
> 非常荣幸能成为Apache HertzBeat的Committer
## 个人介绍
本人自21年参与工作至今,一直从事Java后端开发工作。目前在一家互联网公司中参与融合通信中台的开发。
## 初识 Apache HertzBeat
因工作的原因,在空闲时间里会研究学习开源框架的代码来提升自己。无意间萌生了为开源社区做贡献的想法,也正是这个时候在一篇文章中认识到了HertzBeat。HertzBeat与我在工作中接触到的Prometheus以及Skywalking不一样,其无需Agent以及可以通过yaml自定义监控的特性深深吸引了我。为方便进一步学习,我拉取了HertzBeat源码并运行调试。
## 第一个PR
说来也奇怪,在CONTRIBUTING文档的指引下,我尝试去启动HertzBeat但没有成功,启动报错显示Node.js版本至少需要18以上。也正是因为如此,我修改了CONTRIBUTING文档并提交,最终促成了我的第一个PR。
## 持续贡献
随着阅读文档和源码,我越来越熟悉HertzBeat,除了完善文档及修复bug以外,还接入了DNS和注册中心监控。在完成了注册中心监控后,便着手开始更有挑战性的http_sd新特性开发。
## 收获
回顾一路以来的贡献,即使一开始只是最简单的订正文档与文档翻译,社区也是十分欢迎,让我深刻感受到了这个社区的包容性。后来在开发http_sd新特性的时候,与作者tom的交流也让我更进一步了解HertzBeat整体的架构以及职责划分,最终也能完成这个新特性。
同时,在阅读HertzBeat源码期间,学习到了很多代码写法以及技术点的实际应用,对我个人的成长也是非常有帮助的。
## 结语
成为Apache HertzBeat的Committer于我而言是一次很有趣的经历,无时无刻都在激励着我。今后我也会持续对Apache HertzBeat社区贡献下去,也希望Apache HertzBeat能顺利从孵化器毕业。
@@ -0,0 +1,38 @@
---
title: 热烈欢迎 HertzBeat 小伙伴新晋社区 Committer!
author: linDong
author_title: linDong
author_url: https://github.com/Yanshuming1
tags: [opensource, practice]
keywords: [open source monitoring system, alerting system]
---
![hertzBeat](/img/blog/new-committer.png)
> 非常荣幸能成为Apache HertzBeat的Committer
>
## 个人介绍
本人是2023年毕业,目前在一家互联网公司担任java开发工程师。
## 初识 Apache HertzBeat
毕业之后,工作了半年,萌生出接触开源的想法。然而,在 GitHub 上搜索开源项目时,发现诸多社区活跃度欠佳,官方文档也不完善,致使项目上手难度颇大,因此开源之事暂且搁置。
某天,在某平台看到小宝大佬的一个帖子,我瞬间兴趣盎然,随即私聊小宝,咨询开源相关事宜。小宝大佬极其热情且细致地为我讲解了不少开源方面的情况,并向我推荐了 HertzBeat 这个项目。
## 第一个PR
我down了 HertzBeat 的源码,并按照文档进行编译和测试,然后在页面点击功能的时候发现了一个前端弹窗的bug,所以我提交了自己的第一个issue,并且我成功认领了此issue
于是开启了我的第一个PR。
## 持续贡献
在提交第一个 PR 之后,我持续关注 HertzBeat 社区的 issue ,且尝试去解决当中存在的问题。相继完成了微信指定艾特人、接入 AI 、添加 PrestoDB 监控器、Bug 修改以及官网文档贡献等工作。
## 收获
经过几个月对开源的贡献,我收获满满,学习到了代码中的业务逻辑、代码规范,一些此前未曾使用过的技术框架,还有一些算法,可谓是获益良多。
## 结语
成为Apache HertzBeat的Committer于我而言是很有意义对事情,今后我也会持续对Apache HertzBeat社区贡献下去,也希望Apache HertzBeat能顺利从孵化器毕业,希望社区越来越好。
@@ -0,0 +1,38 @@
---
title: 热烈欢迎 HertzBeat 小伙伴新晋社区 Committer!
author: kerwin612
author_title: Le Zhang
author_url: https://github.com/kerwin612
tags: [opensource, practice]
keywords: [open source monitoring system, alerting system]
---
![hertzBeat](/img/blog/new-committer.png)
> 非常荣幸能成为Apache HertzBeat的Committer
## 成为更强大团队的一份子:我的贡献与成长
在开源社区中,每一次的贡献不仅是对项目的推动,也是个人成长的见证。近期,在Apache HertzBeat项目中,我通过一系列的优化与功能增强,不仅为项目的发展贡献了力量,也实现了自我技能的提升。今天,我想借此机会分享我的贡献经历与成长感悟。
## 从细节入手,优化视觉与交互
我始终认为细节决定成败,在参与项目之初,我便从界面优化入手,致力于提升用户的视觉和交互体验。我优化了监控选择菜单的模态窗口布局,使其更加符合用户的操作习惯;调整了监控详情页面的头部样式和内容布局,使得信息展示更加清晰直观。同时,我还统一了组件的边框圆角值,解决了国际化翻译缺失等问题,确保了系统界面的一致性和完整性。
这些看似微小的改动,实则大大提升了系统的整体美观度和用户体验。通过这个过程,我深刻体会到界面设计对于用户体验的重要性,也锻炼了自己在细节处理上的能力。
## 深入功能模块,实现功能增强
除了界面优化外,我还积极参与了功能模块的扩展与增强工作。我重构了系统中的重复代码,抽象出了通用组件,提高了代码的复用性和可维护性。这些改进不仅简化了开发流程,还降低了后期维护的成本。同时,我还为多功能输入组件添加了密码类型支持和搜索类型支持,进一步丰富了组件的功能和用途。
在功能实现的过程中,我遇到了不少挑战。但正是这些挑战促使我不断学习和探索新的技术和方法。通过查阅官方文档等方式,我逐步攻克了难关,并成功完成了任务。这个过程不仅提升了我的技术能力,也让我更加深刻地理解了团队协作的重要性。
## 注重用户反馈,持续优化产品
我始终认为用户是产品的最终评判者。因此,我在公司内部以及社区持续收集和分析用户的反馈意见,并根据这些意见进行针对性的优化和改进。通过优化搜索与筛选功能、统一使用简洁的交互元素等方式,我不断提升了用户的使用体验。
这个过程中,我深刻体会到了用户导向的重要性。只有真正关注用户的需求和期望才能打造出符合市场需求的产品。
## 展望未来,持续贡献与成长
回顾过去一段时间的贡献经历我深感自豪和满足。但同时我也清楚地认识到自己还有很多不足之处需要不断学习和提升。未来我将继续秉持着严谨、创新、用户至上的精神不断探索和实践为Apache HertzBeat项目贡献更多的力量。同时我也期待与更多的团队成员一起共同成长和进步共同推动项目的繁荣发展。
@@ -0,0 +1,95 @@
---
title: 成为 Apache Committer, 对我参与开源的肯定
author: yuluo-yx
author_title: Shown Ji
author_url: https://github.com/yuluo-yx
tags: [opensource, practice]
keywords: [open source monitoring system, alerting system, Apache, Apache Committer, HertzBeat]
---
## 我的开源历程
说起开源,我在大三刚开始的时候就接触到了。当时的场景仍然历历在目。
回想起来,我第一个正式的 Github Pull Request 是给 Spring Cloud Alibaba 项目删除了一个多余的 Pom 依赖项。当时手忙脚乱,在捉摸了两个多小时后,才算是成功提交了第一个 Pull Request。非常感谢[铖朴](https://github.com/steverao),是他带着我认识了开源,踏出了参与开源至关重要的第一步。
从刚开始使用 Git 的手忙脚乱,到现在 `git c -m XXX`,以及 Github 上参与的各个 PR/Issue。回想起来,真是思绪万千。我觉得人生莫过于如此。学习摸索 -> 熟练使用 -> 做出成绩。
从大三至今,我仍然保持着对开源的热情,参与开源,直至今日,我已经是三个项目的 Committer 了。
## 参与 Apache Community
[Apache 软件基金会(Apache Software Foundation,简称为ASF](https://community.apache.org/),是一家美国的非营利组织,旨在支持各类开源软件项目。ASF最初由 Apache HTTP Server 的一群开发者组成,并在1999年3月25日正式成立。 截至2021年,其总成员数大约在1000名。命名是根据北美当地的一支印第安部落而来,这支部落以高超的军事素养和超人的忍耐力著称,19世纪后半期对侵占他们领土的入侵者进行了反抗。为了对这支印第安部落表示敬仰之意,取该部落名称(Apache)作为服务器名。但一提到这个命名,这里还有流传着一段有意思的故事。因为这个服务器是在 NCSA HTTPd 服务器的基础之上,通过众人努力,不断地修正、打补丁(Patchy)的产物,被戏称为“A Patchy Server”(一个补丁服务器)。在这里,因为“A Patchy”与“Apache”是谐音,故最后正式命名为“Apache Server”。
以上是来自于维基百科中对 Apache 软件基金会的介绍。
Apache 软件基金会起初是由开发 [Apache HTTPd](https://httpd.apache.org/) 的开发人员组成,他们以 Apache HTTPd 这一网络服务器项目为起点,创建了许多优秀的开源项目,吸引全球共同的开源爱好者参与项目的维护与迭代。不断有项目退休,不断有新项目被孵化,反反复复。才有了今天的 Apache 软件基金会。
![Apache HTTPd Server Logo](/img/blog/committer/yuluo-yx/4.jpg)
### 第一次贡献
在 Apache 社区中的第一次贡献应该是给 Dubbo 项目删除了一个 `{@link}` 代码链接。说来惭愧,[Dubbo](https://github.com/apache/dubbo) 是我参与 Apache 的第一个开源项目,到现在为止仅有 6 个提交。5 月份的时候通过 [Rick](https://github.com/LinuxSuRen) 接触到了 [Apache HertzBeat](https://github.com/apache/hertzbeat) 项目,从单元测试开始了我的 Apache 贡献之路。
### 获得提名,成为 Committer
此次提名是 Apache HertzBeat 的 PPMC Member [Logic](https://github.com/zqr10159) 举荐的,感谢 Apache HertzBeat™ Team。顺利提名成为了 HertzBeat Committer,有了自己的 Apache 邮箱。
![Apache ID Email](/img/blog/committer/yuluo-yx/3.jpg)
### Apache Committer 的意义
俗话说,能力越大,任务越大。成为了项目的 Committer 不仅仅是一个身份的转换,更是一个对自己自身能力的认同和肯定。在 Review PR 时,我的 `LGTM` 不再是一个灰色样式,而是变成了蓝色(因个人 Github 主题不同,展现的颜色也不同)。不用在等待其他的 Committer Approve CI。意味着对项目有了管理权利。
![PR Approve](/img/blog/committer/yuluo-yx/5.jpg)
## 参与开源的方法
任何人去做一件事情,都需要一个契机和引路人。在许许多多的 Apache 项目中,不乏关注项目 Issue List 的人。记忆犹新的一次是:某个晚上在写完工具类的单元测试,发现了一个小 Bug。当时心里想的是,这个上下文信息太多了,写在 PR 里面不太好,于是开了一个 Issue 记录上下文。这个 Bug 小到什么程度呢?小到我刚创建完 Issue,在将单元测试和修复 Bug 的代码一起提交之后,再次刷新 PR List,看到了一个修复 Bug 的 PR Title。
其实不缺乏关注项目的人,更多的是需要一个契机!参与项目的契机。
### The Apache Way
Apache Community 奉行的 [The Apache Way](https://www.apache.org/theapacheway/)。社区大于代码,好的社区往往比优秀的代码更重要,社区的组成成分包括开发者,用户等等。用户才是项目代码的第一使用者,健康的社区状态是用户在使用过程中:发现问题,而后报告问题,最后解决问题。更可能发生的一种情况是,用户报告问题,从用户身份转为开发者,解决问题。并在之后持续参与社区项目的维护。
### 参与开源的路径
开源往往很纯粹,Apache 基金会存在的意义也是为了保护项目和开发者。
#### Apache 社区身份定义
参与社区贡献之前,先要了解社区的身份定义是怎样的,项目的 Committer 到底位于哪一层级,怎么才能成为 Committer。Apache 社区对[贡献者身份](https://community.apache.org/contributor-ladder.html)有很明确的定义:
![Apache contributor label](/img/blog/committer/yuluo-yx/6.jpg)
#### 项目 Committer 提名条件
项目 PPMC Team 提名 Committer 的条件是不一样的。以 Apache HertzBeat™ 为例:
![Apache HertzBeat™ becoming committer](/img/blog/committer/yuluo-yx/7.jpg)
每个项目都有自己的标准,这些标准也不是一成不变,在项目的每个阶段会进行调整。
#### 如何参与开源
接下来是此章节的重头戏,如何参与开源并获得 Committer 提名?
##### 开源活动
学生因为身份特殊,没有大型项目的开发经验,也没有机会在生产环境中切身使用。因此参与开源往往很困难,缺少契机。
我觉得参与开源并获得提名的最好方式是**开源之夏(OSPP)或者谷歌开源之夏(GSOC)活动**。在完成相关课题之后,逐步熟悉项目功能、代码、持续参与就会获得提名。也不乏一些学生在完成题目之后被直接提名成为项目 Committer。
其次是**提高自己的 Coding 能力**,发现项目中缺少的单元测试和代码 Bug,然后提交 PR 修复。这对刚开始的同学往往是比较难得。Coding 能力往往是在优化项目代码,了解每一次 Change 之后慢慢积累的。
一个好的项目,**周边生态往往是至关重要的**。一份好的文档,可以让用户/开发者快速上手使用,参与贡献。多语言扩展,可以让项目使用在其他语言构建的项目中,扩大项目受众。一个好的 Example 仓库,可以让用户发现更多项目的使用姿势。因此参与 Example 仓库的建设和文档编写、翻译等工作,也是熟悉项目获得提名的方式之一。
最后,我要说的是:获得提名是`水到渠成`的事情,不能为了获得提名而去参与开源,任何时候都不要忘记自己的初心。
项目社区往往欢迎各种方式的贡献:不论是代码、文档还是布道。
## 随想
写下此文,是为了纪念成为 Apache HertzBeat™ Committer 这个特殊的事情, 同时也是对我之后参与开源的激励。
保持热情,保持 Coding。感谢在参与开源的时候给与我帮助的各位。也祝 HertzBeat 顺利孵化毕业,成为 Apache 顶级项目!🎉
@@ -0,0 +1,45 @@
---
title: 热烈欢迎 HertzBeat 小伙伴新晋社区 Committer!
author: aias00
author_title: Hongyu Liu
author_url: https://github.com/Aias00
tags: [opensource, practice]
keywords:
[
open source monitoring system,
alerting system,
Apache,
Apache Committer,
HertzBeat,
]
---
## 自我介绍
大家好,非常荣幸能够受邀成为 Apache HertzBeat™ 的 Committer。
本人从事软件研发行业多年,目前在公司主要担任后端开发工程师的职位,主要负责公司核心业务系统的开发和维护工作。在日常工作中,我不仅关注代码质量和系统性能,还积极参与技术方案的设计和优化。
除了工作之外,我也热衷于开源社区。参与开源项目不仅让我能够不断学习新的技术和最佳实践,还能结识志同道合的开发者,共同推动技术的发展。成为 Apache HertzBeat™ 的 Committer 是我开源之路上的一个重要里程碑,我会继续努力为项目和社区做出更多贡献。
## 参与 Apache 社区
我参与的第一个 Apache 项目是 Apache ShenYu([https://github.com/apache/shenyu](https://github.com/apache/shenyu)) 。作为一个 API 网关项目,ShenYu 为我提供了深入了解微服务架构和网关技术的机会。通过参与 ShenYu 的开发,我不仅提升了自己的技术能力,还学习到了 Apache 社区的协作方式和开源精神。
这次经历让我对 Apache 社区有了更深入的认识,也为我后来参与其他 Apache 项目,如 HertzBeat,奠定了基础。从 ShenYu 到 HertzBeat,我逐步加深了对 Apache 项目的理解和贡献,最终成为了 HertzBeat 的 Committer。
## 接触 HertzBeat 并开始贡献
在参与 Apache ShenYu 项目后,我对开源社区的运作有了更深入的了解。这时,我偶然接触到了 Apache HertzBeat™ 项目,它的目标是打造一款易用、高性能的开源实时监控告警系统。
HertzBeat 的理念和功能立即引起了我的兴趣。作为一名后端开发工程师,我深知监控系统在现代软件架构中的重要性。HertzBeat 不仅提供了丰富的监控功能,还注重用户体验和可扩展性,这与我的技术理念非常契合。
带着对项目的热情,我开始深入研究 HertzBeat 的代码库和文档。我发现项目有很多有趣的挑战和改进空间,这激发了我参与贡献的欲望。我在逐步熟悉项目的结构和贡献流程之后,将自己工作中积累的对不同的关系型数据库、NoSQL 等中间件的监控经验,贡献到工程中。
随着对项目的理解加深,我开始尝试解决一些更复杂的问题,如性能优化和新功能开发。每一次贡献不仅让我学到了新的知识,也让我感受到了开源社区的力量和温暖。项目维护者和其他贡献者的反馈和支持,让我更加确信参与 HertzBeat 是一个正确的选择。
通过持续的贡献和与社区成员的互动,我逐渐成为了 HertzBeat 社区的活跃成员。这段经历不仅提升了我的技术能力,也让我深刻理解了开源精神和协作的重要性。正是这些持续不断的贡献和参与,最终让我有幸被提名为 HertzBeat 的 Committer。
## 总结
成为 Apache HertzBeat™ 的 Committer 是我开源之路上的一个重要里程碑。我将继续努力为项目和社区做出更多贡献,同时也期待与更多的团队成员一起共同成长和进步,共同推动项目的繁荣发展。
@@ -0,0 +1,47 @@
---
title: 热烈欢迎 HertzBeat 小伙伴新晋社区 Committer!
author: zuobiao-zhou
author_title: Yuxuan Zhang
author_url: https://github.com/zuobiao-zhou
tags: [opensource, practice]
keywords:
[
open source monitoring system,
alerting system,
Apache,
Apache Committer,
HertzBeat,
]
---
## 自我介绍
大家好,我是张宇轩,是来自北京工业大学的一名研究生,非常荣幸能够成为 Apache HertzBeat™ 项目的 Committer。
## 我与 Apache HertzBeat
我是通过今年夏天的[开源之夏](https://summer-ospp.ac.cn/)活动了解到了 HertzBeat 这个项目,项目介绍中的“无需 Agent”、“全 web 页面操作”让我很惊喜,我心想这么轻轻松松就能实现监控了?当时我们实验室刚好新配了一台服务器,正好可以用这个项目进行监控。
项目还支持 Docker 一键部署,简直是无痛上手。清新的界面也是让我眼前一亮。在使用后,我深深的被项目简单易用、监控类型全面的特点吸引,并且项目中的 Issue 和 PR 都会被快速响应,这让我想要进一步参与到项目的开发。
贡献项目还是要一步步来,首先还是要深入的去了解项目,我习惯从项目文档开始,正好当时有个完善项目文档的 Issue,我就接了下来,通过参考使用界面、源码的实现并仿照已经存在的文档格式,我顺利的提交了在这个项目的的一个 PR。
随着了解更加深入,我添加了[通过 HTTP 协议监控 OpenAI 账号的监控模板](https://github.com/apache/hertzbeat/pull/1947),再之后,我实现了[对 IMAP 协议的支持](https://github.com/apache/hertzbeat/pull/2059)、[Windows 与 Linux 系统上直接通过脚本命令监控系统](https://github.com/apache/hertzbeat/pull/2313)的特性。
这期间,我也提了一些小的 Fix 和 Feature PR,比如[新建、修改、重启监控后监控状态的正确显示](https://github.com/apache/hertzbeat/pull/2065)、前端页面[实现级联参数列表](https://github.com/apache/hertzbeat/pull/1978)等等。
## 大学生参与开源经验分享
大学生参与开源不仅能够学习到项目中优秀的代码风格和设计模式,还能参与到真实项目的开发。
热爱是最好的动力,首先需要找一个你感兴趣的项目,无论是功能、界面或是其他方面。
一个良好的社区环境也是非常重要的,这通常体现在项目活跃贡献者多、README 和项目文档详细全面、Issue 和 PR 响应迅速等等。
在找到了满足以上两点的项目后,你可以将项目代码 Pull 到本地,按照文档部署并运行。首先作为一个用户去使用,这个过程中就可能会发现一些小问题或功能不全面的地方,那自然就可以提 Issue 并尝试解决,哪怕是一个错别字或错误拼写的改正,社区都是非常欢迎的。可以通过项目文档慢慢深入了解,从而对项目进行贡献。
## 结语
非常开心能够成为社区的 Committer,这对于我来说也是一个重要的里程碑,今后我也会持续对 Apache HertzBeat™ 社区贡献下去,也希望 Apache HertzBeat™ 能顺利从孵化器毕业,希望社区越来越好。
在此非常感谢[小宝](https://github.com/TJxiaobao)大佬对我上手项目的指导以及对我贡献项目一直以来的帮助。非常感谢 [Tom 哥](https://github.com/tomsun28)对我的 PR 的迅速、细致的 Review。
@@ -0,0 +1,90 @@
---
title: Apache HertzBeat™ 1.6.1 发布公告
author: zhangshenghang
author_title: zhangshenghang
author_url: https://github.com/zhangshenghang
tags: [opensource, practice]
keywords: [open source monitoring system, alerting system]
---
亲爱的社区小伙伴们,
我们很高兴地宣布,Apache HertzBeat™ 1.6.1 版本正式发布!此次发布合并了468个PR,带来了众多新功能和改进。本文将详细介绍1.6.1版本的关键更新,欢迎更多开发者和用户加入我们的开源社区!
## 下载与文档
- **Apache HertzBeat™ 1.6.1 下载地址**[https://hertzbeat.apache.org/zh-cn/docs/download](https://hertzbeat.apache.org/zh-cn/docs/download)
- **Apache HertzBeat™ 文档地址**[https://hertzbeat.apache.org/zh-cn/docs/](https://hertzbeat.apache.org/zh-cn/docs/)
## 主要更新
### 新功能与增强
- **新增监控功能**:支持Apache HBase、InfluxDB、VictoriaMetrics集群、HDFS、Yarn、Linux进程、HBase RegionServer、OpenAI账号、Redfish协议等监控。
- **Prometheus支持**:新增Prometheus解析器和Prometheus-like推送模式。
- **国际化支持**:为ClickHouse、DynamicTp、Airflow、IoTDB、RocketMQ等监控指标名称提供国际化支持。
- **自定义监控菜单**:监控模板现在支持自定义主菜单。
- **NebulaGraph支持**:新增对`ngql`查询NebulaGraph监控数据的支持。
- **短信功能**:支持通过阿里云发送短信。
- **Docker支持**:提供通过Docker Compose运行HertzBeat的支持。
### Bug 修复
- **启动问题**:修复了Collector无法单独启动和MySQL依赖问题,以及MongoDB监控在Spring Boot 3中不可用的问题。
- **数据问题**:修复了JPA数据保存逻辑错误、Redis集群节点测试错误、旧数据解码错误等问题。
- **空指针异常修复**:修复了多个与空指针异常(NPE)相关的问题。
- **其它Bug修复**:包括命令窗口数据丢失、MongoDB模板命令错误等问题。
### 代码重构与优化
- **代码简化**:优化代码结构,使用Assert类简化null判断,移除不必要的if-else语句,采用Java 17的新语法。
- **依赖管理优化**:删除不必要的依赖,并将一些包重构为独立模块。
- **性能提升**:通过优化WebSocket连接、Redis URI构建等方面提升性能。
- **日志与配置更新**:更新Collector和Manager的logback配置。
### 文档翻译与改进
- **翻译工作**:将多个类描述、博客文章和监控模板文档从中文翻译为英文。
- **帮助文档增加**:为ClickHouse、DNS、Flink等监控项目增加了帮助文档。
- **文档结构更新**:更新官网文档、贡献指南、首页介绍等。
### 安全更新
- **依赖升级**:升级H2数据库依赖库,修复相关安全漏洞。
- **其他安全改进**:修复SSL证书剩余天数和Jexlespression的安全匹配问题。
### 测试用例添加
- **测试覆盖率提升**:新增Redis、Nginx、Telnet等监控功能的测试用例,提升测试覆盖率。
## 致谢
感谢 **@zqr10159** 对本次发版工作的支持,同时感谢以下社区成员的共同努力,使得本次发布顺利完成:
> LinuxSuRen, transactional, JavaProgrammerLB, westboy, xuziyang, makechoicenow, crossoverJie, xfl12345, boatrainlsz, lw-yang, tomsun28, Alanxtl, Aias00, Clownsw, zhangshenghang, zqr10159, LiuTianyou, handy-git, hudongdong129, dukbong, 15613060203, yqxxgh, miki-hmt, PeixyJ, allcontributors, Ceilzcx, lwjxy, starmilkxin, leo-934, zuobiao-zhou, tomorrowshipyltm, LLP2333, lwqzz, wang1027-wqh, gjjjj0101, ZY945, yuluo-yx, HeartLinked, alpha951, Hi-Mr-Wind, TJxiaobao, YxYL6125, MananPoojara, a-little-fool, Pzz-2021, Yanshuming1, Thespica, Calvin979, WinterKi1ler
>
## Apache HertzBeat
**仓库地址:**
[https://github.com/apache/hertzbeat](https://github.com/apache/hertzbeat)
**网址:**
[https://hertzbeat.apache.org/](https://hertzbeat.apache.org/)
**Apache HertzBeat™ 下载地址:**
[https://hertzbeat.apache.org/zh-cn/docs/download](https://hertzbeat.apache.org/zh-cn/docs/download)
**Apache HertzBeat™ Docker 镜像版本:**
> Apache HertzBeat™ 为每个版本制作了 Docker 镜像. 你可以从 Docker Hub 拉取使用.
- HertzBeat [https://hub.docker.com/r/apache/hertzbeat](https://hub.docker.com/r/apache/hertzbeat)
- HertzBeat Collector [https://hub.docker.com/r/apache/hertzbeat-collector](https://hub.docker.com/r/apache/hertzbeat-collector)
**Apache HertzBeat™ 开源社区如何参与?**
[https://hertzbeat.apache.org/zh-cn/docs/community/contribution](https://hertzbeat.apache.org/zh-cn/docs/community/contribution)
@@ -0,0 +1,618 @@
---
title: 如何参与开发自定义Collector
author: zhangshenghang
author_title: zhangshenghang
author_url: https://github.com/zhangshenghang
tags: [opensource, practice]
keywords: [open source monitoring system, alerting system]
---
## Collector模块介绍
![model-desc](/img/blog/model-desc.png)
Collector模块整体结构可以分为四个主要部分,每个部分承担不同的职责:
- **Collector入口**:这是Collector模块的运行入口,启动后会通过这个入口来执行采集任务。
- **collector-basic**:该模块主要包含了基础的Collector实现,如HTTP、JDBC等通用协议的监控。这里的Collector通常不需要额外的专有依赖,能满足大多数基础监控需求。
- **collector-common**:这个模块存放了一些通用的工具类和方法,比如公共的连接池、缓存机制等,其他模块可以复用这里的代码。
- **collector-xxx**:这是为不同服务或协议的扩展Collector模块。例如,MongoDB、RocketMQ等特定服务的监控,往往需要引入它们的专有依赖,并在各自模块中进行开发。以下是MongoDB的依赖示例:
```xml
`<dependency>`
`<groupId>`org.mongodb`</groupId>`
`<artifactId>`mongodb-driver-sync`</artifactId>`
`</dependency>`
```
通过这种模块化设计,Collector可以轻松地扩展并适配多种监控场景。
## 新增Collector监控
接下来,我们将通过创建一个`kafka-collector`模块的实际案例来展示如何开发新的Collector。
### 1. 创建`kafka-collector`模块
首先,我们需要在项目中创建一个新的模块用于Kafka的监控,命名为`kafka-collector`。并在该模块中修改`pom.xml`文件。
![model-create](/img/blog/model-create.png)
**`pom.xml`配置**
```xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
`<modelVersion>`4.0.0`</modelVersion>`
`<parent>`
`<groupId>`org.apache.hertzbeat`</groupId>`
`<artifactId>`hertzbeat-collector`</artifactId>`
`<version>`2.0-SNAPSHOT`</version>`
`</parent>`
`<artifactId>`hertzbeat-collector-kafka`</artifactId>`
`<name>`${project.artifactId}`</name>`
`<properties>`
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
`</properties>`
`<dependencies>`
`<dependency>`
`<groupId>`org.apache.hertzbeat`</groupId>`
`<artifactId>`hertzbeat-collector-common`</artifactId>`
`<scope>`provided`</scope>`
`</dependency>`
<!-- kafka -->
`<dependency>`
`<groupId>`org.apache.kafka`</groupId>`
`<artifactId>`kafka-clients`</artifactId>`
`</dependency>`
`</dependencies>`
`</project>`
```
此处需要注意的内容:
- `artifactId`设为`hertzbeat-collector-kafka`,以保持命名一致性。
- `dependencies`中手动添加Kafka所需的依赖。
### 2. 新增Kafka协议类
为了让Collector模块能够处理Kafka的监控协议,我们需要创建一个`KafkaProtocol`类来定义Kafka的连接参数。该类位于`common/src/main/java/org/apache/hertzbeat/common/entity/job/protocol/KafkaProtocol.java`。
```java
package org.apache.hertzbeat.common.entity.job.protocol;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class KafkaProtocol {
/**
* IP地址或域名
*/
private String host;
/**
* 端口号
*/
private String port;
/**
* 超时时间
*/
private String timeout;
/**
* 指令
*/
private String command;
}
```
### 3. 在Metrics中添加Kafka支持
在`common/src/main/java/org/apache/hertzbeat/common/entity/job/Metrics.java`类中,加入Kafka协议的支持。
```java
private KafkaProtocol kclient;
```
### 4. 新增常量
在`DispatchConstants`类中定义Kafka协议的常量。
```java
String PROTOCOL_KAFKA = "kclient";
```
### 5. 新增Kafka连接类
`KafkaConnect`类用于管理Kafka Admin的连接逻辑。
```java
package org.apache.hertzbeat.collector.collect.kafka;
import org.apache.hertzbeat.collector.collect.common.cache.AbstractConnection;
import org.apache.kafka.clients.admin.AdminClient;
import org.apache.kafka.clients.admin.AdminClientConfig;
import org.apache.kafka.clients.admin.KafkaAdminClient;
import java.util.Properties;
public class KafkaConnect extends AbstractConnection`<AdminClient>` {
private static AdminClient adminClient;
public KafkaConnect(String brokerList) {
Properties properties = new Properties();
properties.put(AdminClientConfig.BOOTSTRAP_SERVERS_CONFIG, brokerList);
properties.put(AdminClientConfig.RETRIES_CONFIG, 3);
adminClient = KafkaAdminClient.create(properties);
}
@Override
public AdminClient getConnection() {
return adminClient;
}
@Override
public void closeConnection() throws Exception {
if (this.adminClient != null) {
this.adminClient.close();
}
}
public static synchronized AdminClient getAdminClient(String brokerList) {
if (adminClient == null) {
Properties properties = new Properties();
properties.put(AdminClientConfig.BOOTSTRAP_SERVERS_CONFIG, brokerList);
adminClient = KafkaAdminClient.create(properties);
}
return adminClient;
}
}
```
### 6. 实现Kafka采集类
继承`AbstractCollect`类,并在其中实现具体的数据采集逻辑。这里不对具体逻辑进行介绍了。
```java
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.hertzbeat.collector.collect.kafka;
import lombok.extern.slf4j.Slf4j;
import org.apache.hertzbeat.collector.collect.AbstractCollect;
import org.apache.hertzbeat.collector.dispatch.DispatchConstants;
import org.apache.hertzbeat.common.entity.job.Metrics;
import org.apache.hertzbeat.common.entity.job.protocol.KafkaProtocol;
import org.apache.hertzbeat.common.entity.message.CollectRep;
import org.apache.kafka.clients.admin.AdminClient;
import org.apache.kafka.clients.admin.DescribeTopicsResult;
import org.apache.kafka.clients.admin.ListTopicsOptions;
import org.apache.kafka.clients.admin.ListTopicsResult;
import org.apache.kafka.clients.admin.OffsetSpec;
import org.apache.kafka.clients.admin.TopicDescription;
import org.apache.kafka.common.TopicPartition;
import org.apache.kafka.common.TopicPartitionInfo;
import org.springframework.util.Assert;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
@Slf4j
public class KafkaCollectImpl extends AbstractCollect {
@Override
public void preCheck(Metrics metrics) throws IllegalArgumentException {
KafkaProtocol kafkaProtocol = metrics.getKclient();
// Ensure that metrics and kafkaProtocol are not null
Assert.isTrue(metrics != null && kafkaProtocol != null, "Kafka collect must have kafkaProtocol params");
// Ensure that host and port are not empty
Assert.hasText(kafkaProtocol.getHost(), "Kafka Protocol host is required.");
Assert.hasText(kafkaProtocol.getPort(), "Kafka Protocol port is required.");
}
@Override
public void collect(CollectRep.MetricsData.Builder builder, long monitorId, String app, Metrics metrics) {
try {
KafkaProtocol kafkaProtocol = metrics.getKclient();
String command = kafkaProtocol.getCommand();
boolean isKafkaCommand = SupportedCommand.isKafkaCommand(command);
if (!isKafkaCommand) {
log.error("Unsupported command: {}", command);
return;
}
// Create AdminClient with the provided host and port
AdminClient adminClient = KafkaConnect.getAdminClient(kafkaProtocol.getHost() + ":" + kafkaProtocol.getPort());
// Execute the appropriate collection method based on the command
switch (SupportedCommand.fromCommand(command)) {
case TOPIC_DESCRIBE:
collectTopicDescribe(builder, adminClient);
break;
case TOPIC_LIST:
collectTopicList(builder, adminClient);
break;
case TOPIC_OFFSET:
collectTopicOffset(builder, adminClient);
break;
default:
log.error("Unsupported command: {}", command);
break;
}
} catch (InterruptedException | ExecutionException e) {
log.error("Kafka collect error", e);
}
}
/**
* Collect the earliest and latest offsets for each topic
*
* @param builder The MetricsData builder
* @param adminClient The AdminClient
* @throws InterruptedException If the thread is interrupted
* @throws ExecutionException If an error occurs during execution
*/
private void collectTopicOffset(CollectRep.MetricsData.Builder builder, AdminClient adminClient) throws InterruptedException, ExecutionException {
ListTopicsResult listTopicsResult = adminClient.listTopics(new ListTopicsOptions().listInternal(true));
Set`<String>` names = listTopicsResult.names().get();
names.forEach(name -> {
try {
Map<String, TopicDescription> map = adminClient.describeTopics(Collections.singleton(name)).all().get(3L, TimeUnit.SECONDS);
map.forEach((key, value) -> value.partitions().forEach(info -> extractedOffset(builder, adminClient, name, value, info)));
} catch (TimeoutException | InterruptedException | ExecutionException e) {
log.warn("Topic {} get offset fail", name);
}
});
}
private void extractedOffset(CollectRep.MetricsData.Builder builder, AdminClient adminClient, String name, TopicDescription value, TopicPartitionInfo info) {
try {
TopicPartition topicPartition = new TopicPartition(value.name(), info.partition());
long earliestOffset = getEarliestOffset(adminClient, topicPartition);
long latestOffset = getLatestOffset(adminClient, topicPartition);
CollectRep.ValueRow.Builder valueRowBuilder = CollectRep.ValueRow.newBuilder();
valueRowBuilder.addColumns(value.name());
valueRowBuilder.addColumns(String.valueOf(info.partition()));
valueRowBuilder.addColumns(String.valueOf(earliestOffset));
valueRowBuilder.addColumns(String.valueOf(latestOffset));
builder.addValues(valueRowBuilder.build());
} catch (TimeoutException | InterruptedException | ExecutionException e) {
log.warn("Topic {} get offset fail", name);
}
}
/**
* Get the earliest offset for a given topic partition
*
* @param adminClient The AdminClient
* @param topicPartition The TopicPartition
* @return The earliest offset
*/
private long getEarliestOffset(AdminClient adminClient, TopicPartition topicPartition)
throws InterruptedException, ExecutionException, TimeoutException {
return adminClient
.listOffsets(Collections.singletonMap(topicPartition, OffsetSpec.earliest()))
.all()
.get(3L, TimeUnit.SECONDS)
.get(topicPartition)
.offset();
}
/**
* Get the latest offset for a given topic partition
*
* @param adminClient The AdminClient
* @param topicPartition The TopicPartition
* @return The latest offset
*/
private long getLatestOffset(AdminClient adminClient, TopicPartition topicPartition)
throws InterruptedException, ExecutionException, TimeoutException {
return adminClient
.listOffsets(Collections.singletonMap(topicPartition, OffsetSpec.latest()))
.all()
.get(3L, TimeUnit.SECONDS)
.get(topicPartition)
.offset();
}
/**
* Collect the list of topics
*
* @param builder The MetricsData builder
* @param adminClient The AdminClient
*/
private static void collectTopicList(CollectRep.MetricsData.Builder builder, AdminClient adminClient) throws InterruptedException, ExecutionException {
ListTopicsOptions options = new ListTopicsOptions().listInternal(true);
Set`<String>` names = adminClient.listTopics(options).names().get();
names.forEach(name -> {
CollectRep.ValueRow valueRow = CollectRep.ValueRow.newBuilder().addColumns(name).build();
builder.addValues(valueRow);
});
}
/**
* Collect the description of each topic
*
* @param builder The MetricsData builder
* @param adminClient The AdminClient
*/
private static void collectTopicDescribe(CollectRep.MetricsData.Builder builder, AdminClient adminClient) throws InterruptedException, ExecutionException {
ListTopicsOptions options = new ListTopicsOptions();
options.listInternal(true);
ListTopicsResult listTopicsResult = adminClient.listTopics(options);
Set`<String>` names = listTopicsResult.names().get();
DescribeTopicsResult describeTopicsResult = adminClient.describeTopics(names);
Map<String, TopicDescription> map = describeTopicsResult.all().get();
map.forEach((key, value) -> {
List`<TopicPartitionInfo>` listp = value.partitions();
listp.forEach(info -> {
CollectRep.ValueRow.Builder valueRowBuilder = CollectRep.ValueRow.newBuilder();
valueRowBuilder.addColumns(value.name());
valueRowBuilder.addColumns(String.valueOf(value.partitions().size()));
valueRowBuilder.addColumns(String.valueOf(info.partition()));
valueRowBuilder.addColumns(info.leader().host());
valueRowBuilder.addColumns(String.valueOf(info.leader().port()));
valueRowBuilder.addColumns(String.valueOf(info.replicas().size()));
valueRowBuilder.addColumns(String.valueOf(info.replicas()));
builder.addValues(valueRowBuilder.build());
});
});
}
@Override
public String supportProtocol() {
return DispatchConstants.PROTOCOL_KAFKA;
}
}
```
### 7. 配置SPI服务文件
在`collector/collector/src/main/resources/META-INF/services/org.apache.hertzbeat.collector.collect.AbstractCollect`文件中,添加`KafkaCollectImpl`类。
```text
...
org.apache.hertzbeat.collector.collect.kafka.KafkaCollectImpl
```
### 8. 在Collector模块添加Kafka依赖
最后一步是在`collector/collector/pom.xml`中添加`kafka-collector`模块的依赖:
```xml
`<dependency>`
`<groupId>`org.apache.hertzbeat`</groupId>`
`<artifactId>`hertzbeat-collector-kafka`</artifactId>`
`<version>`${hertzbeat.version}`</version>`
`</dependency>`
```
通过以上步骤,我们就完成了一个Kafka Collector的开发,从协议定义到最终的SPI配置和依赖管理,完整的扩展了一个Kafka监控模块。
## 添加配置解析文件
```yaml
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements. See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# The monitoring type categoryservice-application service monitoring db-database monitoring custom-custom monitoring os-operating system monitoring
category: mid
# The monitoring type eg: linux windows tomcat mysql aws...
app: kafka_client
# The monitoring i18n name
name:
zh-CN: Kafka消息系统(客户端)
en-US: Kafka MessageClient
# The description and help of this monitoring type
help:
zh-CN: HertzBeat 使用 <a href="https://hertzbeat.apache.org/docs/advanced/extend-jmx">Kafka Admin Client`</a>` 对 Kafka 的通用指标进行采集监控。`</span>`
en-US: HertzBeat uses <a href='https://hertzbeat.apache.org/docs/advanced/extend-jmx'>Kafka Admin Client`</a>` to monitoring kafka general metrics. `</span>`
zh-TW: HertzBeat 使用 <a href="https://hertzbeat.apache.org/docs/advanced/extend-jmx">Kafka Admin Client`</a>` 對 Kafka 的通用指標進行采集監控。`</span>`
helpLink:
zh-CN: https://hertzbeat.apache.org/zh-cn/docs/help/kafka_client
en-US: https://hertzbeat.apache.org/docs/help/kafka_client
# Input params define for monitoring(render web ui by the definition)
params:
# field-param field key
- field: host
# name-param field display i18n name
name:
zh-CN: 目标Host
en-US: Target Host
# type-param field type(most mapping the html input type)
type: host
# required-true or false
required: true
- field: port
name:
zh-CN: 端口
en-US: Port
type: number
# when type is number, range is required
range: '[0,65535]'
required: true
defaultValue: 9092
# collect metrics config list
metrics:
# metrics - server_info
- name: topic_list
i18n:
zh-CN: 主题列表
en-US: Topic List
# metrics scheduling priority(0->127)->(high->low), metrics with the same priority will be scheduled in parallel
# priority 0's metrics is availability metrics, it will be scheduled first, only availability metrics collect success will the scheduling continue
priority: 0
# collect metrics content
fields:
# field-metric name, type-metric type(0-number,1-string), unit-metric unit('%','ms','MB'), label-whether it is a metrics label field
- field: TopicName
type: 1
i18n:
zh-CN: 主题名称
en-US: Topic Name
# the protocol used for monitoring, eg: sql, ssh, http, telnet, wmi, snmp, sdk
protocol: kclient
# the config content when protocol is jmx
kclient:
host: ^_^host^_^
port: ^_^port^_^
command: topic-list
- name: topic_detail
i18n:
zh-CN: 主题详细信息
en-US: Topic Detail Info
# metrics scheduling priority(0->127)->(high->low), metrics with the same priority will be scheduled in parallel
# priority 0's metrics is availability metrics, it will be scheduled first, only availability metrics collect success will the scheduling continue
priority: 0
# collect metrics content
fields:
# field-metric name, type-metric type(0-number,1-string), unit-metric unit('%','ms','MB'), label-whether it is a metrics label field
- field: TopicName
type: 1
i18n:
zh-CN: 主题名称
en-US: Topic Name
- field: PartitionNum
type: 1
i18n:
zh-CN: 分区数量
en-US: Partition Num
- field: PartitionLeader
type: 1
i18n:
zh-CN: 分区领导者
en-US: Partition Leader
- field: BrokerHost
type: 1
i18n:
zh-CN: Broker主机
en-US: Broker Host
- field: BrokerPort
type: 1
i18n:
zh-CN: Broker端口
en-US: Broker Port
- field: ReplicationFactorSize
type: 1
i18n:
zh-CN: 复制因子大小
en-US: Replication Factor Size
- field: ReplicationFactor
type: 1
i18n:
zh-CN: 复制因子
en-US: Replication Factor
# the protocol used for monitoring, eg: sql, ssh, http, telnet, wmi, snmp, sdk
protocol: kclient
# the config content when protocol is jmx
kclient:
host: ^_^host^_^
port: ^_^port^_^
command: topic-describe
- name: topic_offset
i18n:
zh-CN: 主题偏移量
en-US: Topic Offset
# metrics scheduling priority(0->127)->(high->low), metrics with the same priority will be scheduled in parallel
# priority 0's metrics is availability metrics, it will be scheduled first, only availability metrics collect success will the scheduling continue
priority: 0
# collect metrics content
fields:
# field-metric name, type-metric type(0-number,1-string), unit-metric unit('%','ms','MB'), label-whether it is a metrics label field
- field: TopicName
type: 1
i18n:
zh-CN: 主题名称
en-US: Topic Name
- field: PartitionNum
type: 1
i18n:
zh-CN: 分区数量
en-US: Partition Num
- field: earliest
type: 0
i18n:
zh-CN: 最早偏移量
en-US: Earliest Offset
- field: latest
type: 0
i18n:
zh-CN: 最新偏移量
en-US: Latest Offset
# the protocol used for monitoring, eg: sql, ssh, http, telnet, wmi, snmp, sdk
protocol: kclient
# the config content when protocol is jmx
kclient:
host: ^_^host^_^
port: ^_^port^_^
command: topic-offset
```
到这里自定义开发`collector`就完成了,启动服务就可以按照正常逻辑开始监控指标。
## 开发调试
本地启动`manager`模块时,如果提示我们添加的监控找不到类,将依赖再添加到`manager`模块下。
**注意:打包提交代码时,不需要将`manager`模块下的依赖提交。**
```xml
<!-- collector-kafka -->
`<dependency>`
`<groupId>`org.apache.hertzbeat`</groupId>`
`<artifactId>`hertzbeat-collector-kafka`</artifactId>`
`<version>`${hertzbeat.version}`</version>`
`</dependency>`
```
@@ -0,0 +1,126 @@
---
title: GSOC谷歌编程之夏2025招募中|期待您的提案
author: zhangshenghang
author_title: zhangshenghang
author_url: https://github.com/zhangshenghang
tags: [opensource, practice]
keywords: [open source monitoring system, alerting system]
---
## GSOC的起源与目的
GSOC 即 Google Summer of Code(谷歌编程之夏),是谷歌公司发起的一项全球性活动,旨在鼓励学生参与开源软件项目的开发,以下是其详细介绍:
- GSOC 始于 2005 年,最初是谷歌为了促进开源社区的发展,鼓励更多学生投身于开源软件的开发和创新而设立的项目。通过该项目,谷歌希望能够为开源世界注入新鲜血液,让学生们在实践中提升技术能力,同时也为开源项目带来新的思路和贡献。
## 任务:基于MCP协议的用于监控信息交互的AI代理
**网站**: `https://hertzbeat.apache.org/`
**Github**: `http://github.com/apache/hertzbeat/`
### 背景
Apache HertzBeat是一款开源的实时监控工具,支持广泛的监控目标,包括Web服务、数据库、中间件等等。它具有高性能、可扩展性和安全性的特点。
随着人工智能(AI)技术的不断进步,将人工智能与监控系统集成可以显著提高其可用性和交互性。通过开发一个基于模型上下文协议(MCP)的AI代理,我们旨在实现对话式交互,以便查询监控信息、添加新的监控任务以及检索监控指标。这将提供更加用户友好和智能的监控管理体验。
## 功能需求
### 查询监控和报警信息
1. **监控项状态监控**
通过自然语言能够获取监控项的状态;
如:现在哪些监控项存在异常?应该告诉用户哪些监控项存在异常,并且异常发生时间。
2. **搜索指标数据**
通过自然语言能够获取指标的数据;
如:a. 现在哪些服务器 CPU 使用率超过 80%
b. 服务器 192.168.1.1 最近一天 CPU 使用情况,用图表方式显示出来
3. **报警数据**
通过自然语言获取报警数据;
如:最近哪些监控报警比较多?
### 添加新的监控任务
1. **添加新的监控目标**
通过自然语言能够添加新的监控目标;
如:a. 我要监控Web服务的响应时间
b. 请帮我添加数据库连接池的监控
2. **配置警报阈值**
通过自然语言能够配置警报阈值;
如:a. 当Web服务响应时间超过5秒时触发警报
b. 数据库连接池使用率超过90%时发送通知
### 设计时需要考虑的事项
1. 底层存储支持数据源比较多,如何监控? 比如:自然语言 -> SQL -> 查询数据源 -> 大模型
2. 大模型的兼容性,支持常用模型
3. 方案的易用性,让用户能够方便使用
### 需求分析
- **Apache HertzBeat**:作为监控系统的核心后端,它提供数据收集、存储和管理功能。
- **MCP协议**:一种开放协议,可实现大语言模型(LLM)应用程序与外部数据源和工具之间的无缝集成。
- **前端交互**:开发一个用户友好的界面,支持语音或文本输入,并显示监控信息和交互结果。
### 推荐技能
- **Java + TypeScript**Apache HertzBeat是基于此技术栈开发的。因此,掌握这些技术对于与HertzBeat集成至关重要。
- **SpringAi**:建议使用SpringAi来构建AI代理。
- **LLM + MCP**:你需要了解大语言模型(LLM)和MCP协议。SpringAi似乎支持MCP协议,或者可以考虑直接使用mcp-sdk。
### 规模
- **难度**:困难
- **项目规模**:约350小时
### 导师
如果您有意向可邮件发送给导师,带上您的方案和想法。
- **宫超**`gongchao@apache.org`
- **张圣航**`shenghang@apache.org`
## 我该怎么做才能提高被选为 GSoC 贡献者的几率?
1. 在组织名单公布后,请访问计划网站查看这些组织,并找到几个您感兴趣的组织。
2. 仔细阅读这些组织的“项目想法”列表。
3. 如果您看到了感兴趣的想法,请通过组织的首选沟通方式(列在 GSoC 网站上的组织页面上)与该组织联系。
4. 与导师和社区成员沟通,确定这个项目想法是否是你在该计划期间乐于着手实施的。如果您所做的不是自己感兴趣的事情,那么对您和您的导师来说,这将不会是一个愉快的暑假。
5. 在与导师和其他组织社区成员沟通期间,您获得了一些信息,请利用这些信息撰写提案。
6. 请尽早提交提案,以便导师有时间提供反馈。您需要有时间根据他们的反馈进行修改,并在截止日期之前重新提交。请勿等到最后一刻才提交提案!
## 2025年Google编程之夏时间轴
所有时间均为世界协调时间(UTC
1. **1月27日 - 18:00**:导师组织可以开始向Google提交申请。
2. **2月11日 - 18:00**:导师组织申请截止日期。
3. **2月11日至26日**:Google计划管理员审核组织申请。
4. **2月27日 - 18:00**:发布已获批准的导师组织列表。
5. **2月27日至3月24日**:潜在的GSoC贡献者与指导组织讨论提案想法。
6. **3月24日 - 18:00**:开始接受Google全球服务学习贡献者(即GSoC贡献者)申请。
7. **4月8日 - 18:00**GSoC贡献者申请截止日期。
8. **4月29日 - 18:00**:组织管理员需要确定GSoC贡献者提案排名。
9. **5月8日 - 18:00**:公布已接受的GSoC贡献者项目。
10. **5月8日至6月1日**:社区互动期。参与Google开放式项目贡献者(GSoC贡献者)结识导师、阅读文档,了解相关信息,为开始项目工作做准备。
11. **6月2日**:正式开始编码!
12. **7月14日 - 18:00**:导师和Google开放式项目贡献者可以开始提交中期评估(适用于标准12周编程项目)。
13. **7月18日 - 18:00**:中期评估截止日期(标准编码周期)。
14. **7月14日至8月25日**:工作阶段。在导师的指导下,GSoC贡献者开展项目。
15. **8月25日至9月1日 - 18:00**:最后一周。GSoC贡献者提交最终成果和最终导师评估(标准编码周期)。
16. **9月1日至8日 - 18:00**:导师提交最终的GSoC贡献者评估结果(标准编码周期)。
17. **9月1日至11月9日**:有延长时间表的GSoC贡献者可以继续编码。
18. **11月10日 - 18:00**:所有Google开放式课程贡献者提交最终成果和最终评估的截止日期。
19. **11月17日 - 18:00**:导师针对延长截止日期的GSoC贡献者项目提交评估的最终日期 。
## Google 编程之夏常见问题解答
[https://developers.google.com/open-source/gsoc/faq?hl=zh-cn](https://developers.google.com/open-source/gsoc/faq?hl=zh-cn)
@@ -0,0 +1,47 @@
---
title: 热烈欢迎 HertzBeat 小伙伴新晋社区 Committer!
author: yunfan24
author_title: Lixin Diao
author_url: https://github.com/yunfan24
tags: [opensource, practice]
keywords:
[
open source monitoring system,
alerting system,
Apache,
Apache Committer,
HertzBeat,
]
---
🎉 大家好,很高兴收到 Apache HertzBeat™ 社区的邀请,正式成为项目的 Committer!
## 我的开源之旅
本人是一名大四在校学生,从大二就萌生了参与开源的想法,然而,早期的尝试并不顺利——很多项目仅仅是运行起来都困难重重,这让我一度放弃了深入开源的念头。直到偶然间在技术社区发现了 HertzBeat。
HertzBeat 的贡献指南详细清晰,极大降低了上手难度。前人栽树,后人乘凉。通过简单几步,我就成功运行了项目。结合其图形界面,能够快速理解业务逻辑。之后,我又在 B 站看到了 Tom 哥的介绍视频,对项目有了更深的认识。
从最初的 bug 修复入手,我逐渐深入代码,通过断点调试和日志分析,逐渐熟悉了项目结构。在这个过程中,吸引我持续进行贡献的一大原因是,社区的活跃度很高,Issue和PR可以被快速响应,我记得在HertzBeat 提交的第一个pr当天就被合并,第二天我的Github ID就出现在了贡献者名单上,这给了我足够的正向反馈。
## 参与开源的切入点
对于想要加入开源的开发者,我有几点个人建议:
1. **以用户的视角出发**:先使用项目,找到可以优化的地方,例如 UI 体验改进(分页优化、模糊搜索等)。即使是修正错别字,社区也非常欢迎。
2. **技术债挖掘大法**:全局搜索 `TODO`/`FIXME` 注释,解锁前人留下的「隐藏任务」
3. **Watch Issue/Discussion**:及时获取项目信息,也可以在用户交流群中参与讨论,根据反馈选择感兴趣的问题进行贡献。
4. **贡献文档**:修正错别字、修复死链、补充缺失的翻译等,这些都是很好的切入点。
5. **补充测试用例**:增加单元测试、E2E 测试,提升测试覆盖率,提高项目稳定性。
6. **主动出击**:加入开发者交流群、订阅开发者邮件列表或参加项目例会,表达贡献意愿,了解项目的 Roadmap,并根据规划进行贡献。
## 个人收获
在贡献 HertzBeat 的过程中,我深刻体会到了社区的极客精神——每一行代码、每一个细节都经过仔细推敲,而不仅仅是“能用就行”,这让我在开发中收获颇丰。
另外,参与开源极大地拓宽了我的视野。以前 Apache 这个名字只出现于我的项目依赖里,通过社区,我了解了 Apache 基金会和其运作方式,而如今,我竟然也能成为 Apache 基金会下项目的一员,虽然我做的工作跟大佬们相差甚远。
更重要的是,我在社区结识了来自不同地区、不同行业的大佬。他们的经验和历程对我而言,都是一笔宝贵的财富。
## 写在最后
感谢社区的支持,感谢每一位 Review 代码的小伙伴!最后祝 Apache HertzBeat™ 顺利毕业,越来越好!🚀
@@ -0,0 +1,69 @@
---
title: 从 Committer 到 PMC:在 Apache HertzBeat™ 的持续成长与蜕变之旅
author: zhangshenghang
author_title: zhangshenghang
author_url: https://github.com/zhangshenghang
tags: [opensource, practice]
keywords: [open source monitoring system, alerting system]
---
## 从 Committer 到 PMC:角色的转变与成长
一年前,当我收到成为 Apache HertzBeat™ **Committer** 的通知时,那种喜悦和使命感至今记忆犹新。那时的我,更多是专注于具体的技术实现和功能开发。而如今,被邀请加入 **PMC**,意味着我需要以更全局的视角来看待项目的发展,这既对我参与开源的认可,更是对未来责任的召唤。
### 深入参与:Committer 时期的积累
成为 Committer 后,我的日常工作发生了显著变化:
- **代码审查成为常态**:从最初的简单 PR 审核,到后来能够系统性评估代码质量、架构合理性以及与项目整体方向的一致性。
- **社区协作更加紧密**:我开始定期参与社区例会,协助新贡献者解决问题,甚至主导某些功能的开发与落地。
- **技术决策的参与**:在监控协议支持、存储引擎优化等关键议题上,我开始提出自己的见解,并与核心团队共同制定实施方案。
这段时间让我深刻体会到,**开源项目的生命力不仅在于代码,更在于社区的协作与信任**。每一次代码合并、每一次问题讨论,都是对项目方向的微小调整,而 Committer 的角色让我有机会参与其中。
## 成为 PMC:责任与挑战的升级
PMC 的职责远超代码层面,它要求成员对项目的**技术方向、社区治理、长期发展**有更深入的思考。当我收到 PPMC 邀请时,既感到兴奋,也意识到需要迎接新的挑战:
### 1. **技术战略的参与**
作为 PMC,我需要与其他成员共同规划 HertzBeat 的长期路线图。例如:
- **性能优化**:面对大规模监控场景,如何优化存储和查询效率。
- **可扩展性增强**:如何设计更灵活的插件机制,方便社区贡献新的监控类型。
这些议题不再是单纯的代码实现,而是涉及技术选型、社区资源分配甚至项目定位的深层次讨论。
### 2. **社区治理与健康**
PMC 需要关注社区的长期健康发展,包括:
- **贡献者体验**:如何优化文档、降低新人的参与门槛。
- **社区文化**:确保讨论氛围友好,冲突能够得到妥善解决。
- **可持续发展**:激励长期贡献者,同时吸引新鲜血液。
## 个人成长:技能与心态的蜕变
这一年的经历让我在多个维度得到提升:
- **技术广度**:从专注具体功能到理解分布式监控系统的整体架构。
- **软技能**:学会如何有效沟通、协调不同意见,推动社区共识。
- **项目管理**:理解开源项目的运作模式,平衡理想与现实约束。
最深刻的感悟是:**在开源社区,技术能力只是基础,真正的价值在于能否通过协作创造大于个人的成果**。
## 未来展望:与 HertzBeat 共同前行
作为新晋 PMC,我对未来有几个重点方向:
1. **推动 HertzBeat 成为云原生监控领域的重要选择**,特别是在轻量级、易用性方面形成差异化优势。
2. **建设更活跃的贡献者社区**,通过导师计划、定期活动等方式培养核心贡献者。
3. **完善项目治理流程**,使决策更透明,参与更顺畅。
## 致谢与共勉
特别感谢 **Tom** 的指导,以及所有社区伙伴的支持。Apache 之道强调"社区重于代码",这一理念已深深影响我的工作方式。
最后,想对正在阅读的你分享:**开源是一场持久而温暖的旅程,不必追求速成,只需持续贡献,收获自会水到渠成**。期待在 HertzBeat 社区见到更多志同道合的朋友!
(正如我们常说的:**"参与开源是为了让技术更美好,而不是让生活更忙碌"** —— 共勉 😊)
@@ -0,0 +1,315 @@
---
title: Apache HertzBeat™ 1.7.0 发布公告
author: tomsun28
author_title: tomsun28
author_url: https://github.com/zhangshenghang
tags: [opensource, release]
keywords: [open source monitoring system, alerting system, HertzBeat, release]
---
亲爱的社区小伙伴们,
我们很高兴地宣布 Apache HertzBeat™ 1.7.0 版本正式发布!
## Downloads and Documentation
- **Apache HertzBeat™ 1.7.0 Download Link**: [https://hertzbeat.apache.org/zh-cn/docs/download](https://hertzbeat.apache.org/zh-cn/docs/download)
- **Apache HertzBeat™ Documentation**: [https://hertzbeat.apache.org/zh-cn/docs/](https://hertzbeat.apache.org/zh-cn/docs/)
## Major Updates
### New Features and Enhancements
- **自定义刷新间隔**:支持为每组指标设置自定义刷新间隔,满足不同场景下的监控需求。
- **任务自动发现**:通过 http_sd 支持自动发现任务,提升了任务的灵活性和可管理性。
- **新的告警模块**:支持实时阈值和计划阈值,分组收敛,告警抑制,告警静默等。
- **Kafka 监控增强**:优化了 Kafka 监控功能,包括改进 Kafka 图表显示、添加 Kafka 消费者组监控指标等。
- **支持多种协议和监控类型**:新增了对 Plc 协议监控的支持,进一步丰富了监控范围。
- **报警功能增强**:支持通过 HTTP API 替换腾讯云 SDK 发送短信通知,增强了报警通知的灵活性和扩展性。同时,还支持了多查询表达式阈值报警、周期性报警阈值等功能。
- **多语言支持**:新增了日语、繁体中文等多语言支持,提升了国际化体验。
- **监控功能增强**:支持 StarRocks FE 等多种类型的监控,为用户提供了更多的监控选项。
- **E2E 测试增强**:新增了多个 E2E 测试代码,包括 Kafka、SSH、API 等,提升了测试覆盖率和稳定性。
- **数据存储优化**:更新了 VictoriaMetrics 和 Greptime 存储,提升了数据存储的性能和稳定性。
- **更多的新功能特性**
### Bug Fixes
- **修复 Docker 构建错误**:修复了 collector Docker 构建错误,确保了 Docker 镜像的正常构建。
- **修复 Linux 进程监控问题**:修复了 Linux 进程监控进程异常退出且无警告的问题,提升了监控的稳定性。
- **修复 Windows 中文编码问题**:修复了 Windows 中文编码问题,确保了在 Windows 环境下的正常运行。
- **修复 Grafana 配置问题**:修复了 Grafana 配置相关的问题,提升了 Grafana 的集成体验。
- **修复 Windows 指标配置问题**:更新了 Windows 指标 yml 文件,解决了相关问题。
- **修复 flyway 位置检测问题**:修复了 flyway 位置无法自动检测供应商的问题,提升了数据库迁移的可靠性。
- **修复数据存储问题**:修复了数据存储相关的问题,包括修复了 Prometheus 数据存储问题、修复了数据存储更新逻辑问题等,确保了数据的准确性和完整性。
- **修复报警通知问题**:修复了报警通知相关的问题,包括修复了报警通知重复发送问题、修复了报警通知配置问题等,提升了报警通知的准确性和可靠性。
- **修复监控状态更新问题**:修复了监控状态未更新的问题,确保了监控状态的实时性和准确性。
- **和其它的BUG修复**
### Refactoring and Optimization
- **内存结构优化**:使用Apache Arrow作为数据内存数据结构,提升了内存使用效率和性能。
- **代码规范优化**:根据代码规范对代码进行了优化,提升了代码质量和可读性。
- **缓存优化**:新增了基于 Singleton 模式的 LRU 本地缓存,提升了缓存的效率和性能。
- **内存泄漏修复**:修复了潜在的内存泄漏问题,提升了系统的稳定性和可靠性。
- **和其它的优化**
### Documentation Enhancements
- **更新部署文档**:更新了部署文档,提供了更详细的部署指导。
- **更新安全模型文档**:更新了安全模型文档。
- **更新 Grafana 配置文档**:更新了 Grafana 配置方法和添加暴露 URL 的文档,提升了用户体验。
- **更新 Windows 监控文档**:更新了 Windows 系统监控文档,提供了更详细的监控指导。
- **更新监控指标文档**:更新了多个监控指标的文档,包括 Kafka、Linux 进程等,提升了文档的准确性和完整性。
- **更新开发者文档**:新增了自定义开发采集器的文档,方便开发者进行二次开发。
- **更多的文档更新**
## Acknowledgements
感谢以下社区成员的共同努力:
> @ghyghoo8 @kerwin612 @pjfanning @helei1030 @shinestare @simonsigre @myangle1120 @MasamiYui @Craaaaazy77 @tomsun28 @Aias00 @zhangshenghang @wanhao23 @zqr10159 @LiuTianyou
> @hasimmollah @lixiaobaivv @LL-LIN @JuJinPark @ponfee @starryCoder @NikhilMurugesan @leo-934 @Rancho-7 @MonsterChenzhuo @zuobiao-zhou @pwallk @bigcyy @ZY945 @sarthakeash
> @All-The-Best-for @TJxiaobao @yyahang @yunfan24 @a-little-fool @yasminvo @Yanshuming1 @ayu-v0 @jonasHanhan @Calvin979 @Suvrat1629 @Vedant7789 @notbugggg @lctking @po-168 @doveLin0818
## What's Changed
```markdown
* [doc](download): update for v1.6.1 release by @zqr10159 in https://github.com/apache/hertzbeat/pull/2794
* [Doc] improve website by @zhangshenghang in https://github.com/apache/hertzbeat/pull/2795
* [doc] update deploy doc by @tomsun28 in https://github.com/apache/hertzbeat/pull/2796
* [Task][OSPP] HertzBeat Official Template Marketplace by @All-The-Best-for in https://github.com/apache/hertzbeat/pull/2641
* [improve]:Improve the way Ai is entered and requested by @Yanshuming1 in https://github.com/apache/hertzbeat/pull/2762
* [bugfix] fix collector docker build error by @tomsun28 in https://github.com/apache/hertzbeat/pull/2799
* [fix]Remove the duplicate declaration of commons-net by @shinestare in https://github.com/apache/hertzbeat/pull/2801
* [doc] update new contributors by @tomsun28 in https://github.com/apache/hertzbeat/pull/2802
* [Improve] Improve module name by @zhangshenghang in https://github.com/apache/hertzbeat/pull/2805
* [improve] code according to code specifications by @po-168 in https://github.com/apache/hertzbeat/pull/2809
* [feature] Support custom refresh intervals for each group of metrics by @zuobiao-zhou in https://github.com/apache/hertzbeat/pull/2718
* [improve] Fix error links caused by module name changes. by @zuobiao-zhou in https://github.com/apache/hertzbeat/pull/2807
* [fix] fix the Linux process monitoring process exits abnormally without warning by @LiuTianyou in https://github.com/apache/hertzbeat/pull/2810
* [Doc] Add blog by @zhangshenghang in https://github.com/apache/hertzbeat/pull/2812
* [Improve] improve kafka monitor by @zhangshenghang in https://github.com/apache/hertzbeat/pull/2813
* [Feature] add e2e code by @zhangshenghang in https://github.com/apache/hertzbeat/pull/2811
* [improve] modify e2e test by @zhangshenghang in https://github.com/apache/hertzbeat/pull/2814
* [improve] update windows metrics yml by @tomsun28 in https://github.com/apache/hertzbeat/pull/2816
* [improve] update grafana auth method and add expose url by @tomsun28 in https://github.com/apache/hertzbeat/pull/2818
* Fixed the omissions in #2805 by @kerwin612 in https://github.com/apache/hertzbeat/pull/2826
* [refactor] change name from http_sd to registry by @Calvin979 in https://github.com/apache/hertzbeat/pull/2827
* [fix]fix windows chinese encoding by @starryCoder in https://github.com/apache/hertzbeat/pull/2831
* [doc] Added custom development collector documentation by @zhangshenghang in https://github.com/apache/hertzbeat/pull/2833
* [improve] update and fix template yml priority by @tomsun28 in https://github.com/apache/hertzbeat/pull/2829
* [chore] Delete redundant Spaces by @ayu-v0 in https://github.com/apache/hertzbeat/pull/2834
* [doc]: update sidebar category label and plugin documentation by @zqr10159 in https://github.com/apache/hertzbeat/pull/2837
* [fix] bugfix flyway location can not auto detect vendor when not h2 by @tomsun28 in https://github.com/apache/hertzbeat/pull/2835
* [improve] update victoriametrics and greptime store by @tomsun28 in https://github.com/apache/hertzbeat/pull/2836
* [feature] support managing tasks by using http_sd by @Calvin979 in https://github.com/apache/hertzbeat/pull/2830
* [fix] auto generated by protocol buffer by @tomsun28 in https://github.com/apache/hertzbeat/pull/2842
* [Feature] Add ssh e2e code by @zhangshenghang in https://github.com/apache/hertzbeat/pull/2843
* [bugfix]Fix wrong app name by @zqr10159 in https://github.com/apache/hertzbeat/pull/2845
* [doc] add security model doc and update contributors by @tomsun28 in https://github.com/apache/hertzbeat/pull/2846
* [improve] improve dependency by @zhangshenghang in https://github.com/apache/hertzbeat/pull/2855
* [doc] update security doc and some by @tomsun28 in https://github.com/apache/hertzbeat/pull/2856
* A bug fix by @TJxiaobao in https://github.com/apache/hertzbeat/pull/2853
* [doc] Add ',' separator between monitoring types by @Rancho-7 in https://github.com/apache/hertzbeat/pull/2865
* [doc]improve-windows-monitoring:Update Windows system monitoring docu… by @starryCoder in https://github.com/apache/hertzbeat/pull/2869
* [Optimize] Add a reminder about potential collection issues caused by the Docker deployment method of collector. by @zuobiao-zhou in https://github.com/apache/hertzbeat/pull/2844
* [improve]Add more helpful messages when adding a Kafka monitor by @Rancho-7 in https://github.com/apache/hertzbeat/pull/2876
* modified:add a small change. by @TJxiaobao in https://github.com/apache/hertzbeat/pull/2878
* [Fix] fix clickhouse monitor by @LiuTianyou in https://github.com/apache/hertzbeat/pull/2874
* [chore] Delete the redundant else by @ayu-v0 in https://github.com/apache/hertzbeat/pull/2881
* [improve]Remove stack property from line charts by @zqr10159 in https://github.com/apache/hertzbeat/pull/2888
* [improve]improve linux process by @LiuTianyou in https://github.com/apache/hertzbeat/pull/2889
* [Improve]Beautify Charts by @zqr10159 in https://github.com/apache/hertzbeat/pull/2891
* [doc] Add more hints when users are switching data source. by @Rancho-7 in https://github.com/apache/hertzbeat/pull/2880
* [collector]feature:Add monitoring metrics for consumer groups in Kafka client by @doveLin0818 in https://github.com/apache/hertzbeat/pull/2887
* [Improve] Improve Kafka chart display by @zhangshenghang in https://github.com/apache/hertzbeat/pull/2894
* [collector]bugfix:fix the issue of reusing the `adminClient` in the Kafka client. by @doveLin0818 in https://github.com/apache/hertzbeat/pull/2895
* [improve]add Plc protocol , Modbus monitor by @ZY945 in https://github.com/apache/hertzbeat/pull/2850
* [Improve] add notification when port number changes automatically due to HTTPS toggle.(#2779) by @yunfan24 in https://github.com/apache/hertzbeat/pull/2896
* [feature] integrate with Apache Arrow by @Calvin979 in https://github.com/apache/hertzbeat/pull/2864
* [Doc] update doc by @zhangshenghang in https://github.com/apache/hertzbeat/pull/2900
* [Imporve] Support Kafka internal topic configuration by @zhangshenghang in https://github.com/apache/hertzbeat/pull/2901
* [fix](flink): update calculate metrics definitions by @zqr10159 in https://github.com/apache/hertzbeat/pull/2905
* [feature] Add a new Singleton-pattern-based LRU local cache by @doveLin0818 in https://github.com/apache/hertzbeat/pull/2907
* add an online parser for prometheus. by @leo-934 in https://github.com/apache/hertzbeat/pull/2851
* [Improve] Improve OBS by @zhangshenghang in https://github.com/apache/hertzbeat/pull/2909
* [improve] fix import of CollectRep by @Calvin979 in https://github.com/apache/hertzbeat/pull/2910
* [feature](web-app): Add Alarm Voice Alerts by @zqr10159 in https://github.com/apache/hertzbeat/pull/2906
* [bugfix] Fix the bug where canceling an edit on a record still updates the page values. by @yunfan24 in https://github.com/apache/hertzbeat/pull/2911
* [bugfix] Fix docker container name unable to display problem by @zhangshenghang in https://github.com/apache/hertzbeat/pull/2914
* [improve] Optimize CacheService and add relevant unit test by @lctking in https://github.com/apache/hertzbeat/pull/2912
* [improve] Add required field indicators and form validation prompts for convergence strategies and silent strategies in the form. by @yunfan24 in https://github.com/apache/hertzbeat/pull/2913
* [Feture]Add docker e2e test by @zhangshenghang in https://github.com/apache/hertzbeat/pull/2916
* [bugfix]: fix setColumns method in CollectRep class by @zqr10159 in https://github.com/apache/hertzbeat/pull/2918
* [improve](warehouse): replace empty json object key with empty string by @zqr10159 in https://github.com/apache/hertzbeat/pull/2919
* [bugfix] Bug fix for alarm voice. by @yunfan24 in https://github.com/apache/hertzbeat/pull/2920
* Update app-windows_script.yml by @simonsigre in https://github.com/apache/hertzbeat/pull/2922
* [bugfix] Fixed the 'java.lang.UnsupportedOperationException' exception caused by getCurrentMetricsData by @lixiaobaivv in https://github.com/apache/hertzbeat/pull/2923
* [Improve] Optimize the e2e code structure by @zhangshenghang in https://github.com/apache/hertzbeat/pull/2926
* [improve] optimize website navbar css(#2928) by @ponfee in https://github.com/apache/hertzbeat/pull/2929
* [feature] Adding CPU Temperature Check Into Default Ubuntu Checks by @simonsigre in https://github.com/apache/hertzbeat/pull/2930
* [improve] Improve the synchronization of the mute status. by @yunfan24 in https://github.com/apache/hertzbeat/pull/2927
* [bugfix] Corrected case 'DashBoard' is a lower case 'B' by @simonsigre in https://github.com/apache/hertzbeat/pull/2935
* [bugfix] Modify the doris_be.md document into an English version by @Craaaaazy77 in https://github.com/apache/hertzbeat/pull/2936
* [improve] Refactor and Split the Message Notification Component. by @yunfan24 in https://github.com/apache/hertzbeat/pull/2924
* [home] updated navbar css #2928 by @Vedant7789 in https://github.com/apache/hertzbeat/pull/2934
* [Improve]Improve e2e code by @zhangshenghang in https://github.com/apache/hertzbeat/pull/2945
* [refactor] refactoring methods replaceCryPlaceholder and replaceSmilingPlace by @hasimmollah in https://github.com/apache/hertzbeat/pull/2832
* [alarm] refactor new alarm by @tomsun28 in https://github.com/apache/hertzbeat/pull/2902
* [bugfix](db): optimize column update. by @zqr10159 in https://github.com/apache/hertzbeat/pull/2947
* [doc] Add Supported MySQL Versions. by @yunfan24 in https://github.com/apache/hertzbeat/pull/2949
* [Feature] Support customized JMX monitoring through the Factory Pattern. by @doveLin0818 in https://github.com/apache/hertzbeat/pull/2932
* [Improve]Modify Chinese comments by @zhangshenghang in https://github.com/apache/hertzbeat/pull/2950
* [improve] fix some alarm relate bug, update alarm center ui by @tomsun28 in https://github.com/apache/hertzbeat/pull/2951
* 【Improve】adjust log level from INFO to WARN. by @Rancho-7 in https://github.com/apache/hertzbeat/pull/2952
* [Doc]:Add English version of documentation for Kafka Consumer Detail by @Rancho-7 in https://github.com/apache/hertzbeat/pull/2953
* [Imporve] Improve Huaweicloud by @zhangshenghang in https://github.com/apache/hertzbeat/pull/2954
* [improve] update alarm inhibit rule and alarm ui by @tomsun28 in https://github.com/apache/hertzbeat/pull/2957
* [bufix] fix collector job scheduler error by @tomsun28 in https://github.com/apache/hertzbeat/pull/2966
* [Improve]:Standardize Kafka metric naming by @Rancho-7 in https://github.com/apache/hertzbeat/pull/2961
* [BUG] "Advanced Settings" is all white in dark mode by @Suvrat1629 in https://github.com/apache/hertzbeat/pull/2965
* [Improve] add no popup option after next login by @LiuTianyou in https://github.com/apache/hertzbeat/pull/2969
* [feature] replace googletagmanager to matomo by @Aias00 in https://github.com/apache/hertzbeat/pull/2877
* Fix the search functionality issue. by @yunfan24 in https://github.com/apache/hertzbeat/pull/2970
* [bugfix](warehouse): add metrics data update logic in memory storage by @zqr10159 in https://github.com/apache/hertzbeat/pull/2973
* [Improve] Add more test cases for Kafka junit tests by @Rancho-7 in https://github.com/apache/hertzbeat/pull/2976
* [feature] alert integration extern source by @tomsun28 in https://github.com/apache/hertzbeat/pull/2978
* [bugfix] Fix NullPointerException by @ayu-v0 in https://github.com/apache/hertzbeat/pull/2849
* [webapp] key-value-input component hover effect fixed by @ghyghoo8 in https://github.com/apache/hertzbeat/pull/2972
* [bugfix] fix alert integration extern source bug by @tomsun28 in https://github.com/apache/hertzbeat/pull/2979
* [Feature] Support copy monitoring by @zhangshenghang in https://github.com/apache/hertzbeat/pull/2981
* [bugfix] fix hbase dashboard display anomalies and turn on HTTPS by @MonsterChenzhuo in https://github.com/apache/hertzbeat/pull/2980
* [improve] update i18n json stru and update search ui by @tomsun28 in https://github.com/apache/hertzbeat/pull/2986
* [MINOR UPDATE] improve xml parsing code by @pjfanning in https://github.com/apache/hertzbeat/pull/2988
* [docs]doc:Added spark Chinese documents and changed the original spar… by @helei1030 in https://github.com/apache/hertzbeat/pull/2987
* [type:improve] fix dependencies vulnerabilites by @Aias00 in https://github.com/apache/hertzbeat/pull/2989
* [feature] Add privateKey passphrase config for linux monitor by @MasamiYui in https://github.com/apache/hertzbeat/pull/2982
* [type:fix] remove matomo ip by @Aias00 in https://github.com/apache/hertzbeat/pull/2990
* [feature] Added multilingual defaults for forms by @wanhao23 in https://github.com/apache/hertzbeat/pull/2991
* [Improve]Add Copy token button by @zqr10159 in https://github.com/apache/hertzbeat/pull/2992
* [MINOR UPDATE] close HttpResponse in HttpCollectImpl by @pjfanning in https://github.com/apache/hertzbeat/pull/2993
* [MINOR UPDATE] close http response in PrometheusAutoCollectImpl by @pjfanning in https://github.com/apache/hertzbeat/pull/2994
* [MINOR UPDATE] fix more instances of unclosed Http Responses by @pjfanning in https://github.com/apache/hertzbeat/pull/2995
* [bugfix] fix wrong http user-agent content by @tomsun28 in https://github.com/apache/hertzbeat/pull/2996
* [feature] Support monitoring for StarRocks FE and StarRocks BE. by @yunfan24 in https://github.com/apache/hertzbeat/pull/2997
* [MINOR UPDATE] refactor base64 code to simplify the conversions by @pjfanning in https://github.com/apache/hertzbeat/pull/2999
* [webapp] bugfix edit monitor http query params error by @tomsun28 in https://github.com/apache/hertzbeat/pull/3001
* [feature] Complete multiple languages by @wanhao23 in https://github.com/apache/hertzbeat/pull/3002
* [feature] Add alerter_zh_TW.properties configuration to adapt to mult… by @jonasHanhan in https://github.com/apache/hertzbeat/pull/3004
* [bugfix] fix some unit tests that failed to run by @NikhilMurugesan in https://github.com/apache/hertzbeat/pull/3007
* [feature](alert): implement drag-and-drop functionality for alert templates by @zqr10159 in https://github.com/apache/hertzbeat/pull/3005
* [improve] Freeze the 'Operate' column on the right side of the list. by @yunfan24 in https://github.com/apache/hertzbeat/pull/3009
* [MINOR UPDATE] always specify the char encoding in getBytes by @pjfanning in https://github.com/apache/hertzbeat/pull/3011
* [bugfix]Fix page not found by @zqr10159 in https://github.com/apache/hertzbeat/pull/3014
* [bugfix] Modify mask issue by @myangle1120 in https://github.com/apache/hertzbeat/pull/3018
* [issue-2998] remove invalid check in isValidLabelValue by @pjfanning in https://github.com/apache/hertzbeat/pull/3015
* [MINOR UPDATE] Use Encode to string when possible (Base64) by @pjfanning in https://github.com/apache/hertzbeat/pull/3016
* [Improve] update english doc by @zhangshenghang in https://github.com/apache/hertzbeat/pull/3028
* [Feature] Add API e2e code by @zhangshenghang in https://github.com/apache/hertzbeat/pull/3029
* [doc] update new contributor wall by @tomsun28 in https://github.com/apache/hertzbeat/pull/3025
* OnlineParserTest doesn't test anything by @pjfanning in https://github.com/apache/hertzbeat/pull/3010
* [feature] periodic alert threshold by @tomsun28 in https://github.com/apache/hertzbeat/pull/3024
* [bugfix] fix and enable some unit tests. by @yunfan24 in https://github.com/apache/hertzbeat/pull/3031
* [feature] Add pagination and name-based search functionality in notification module by @yunfan24 in https://github.com/apache/hertzbeat/pull/2948
* [bugfix] Fixed the bug in the threshold rules search box. by @yunfan24 in https://github.com/apache/hertzbeat/pull/3034
* [improve] Replaced hardcoded text with internationalized string. by @yunfan24 in https://github.com/apache/hertzbeat/pull/3035
* [update] upgrade actions/upload-artifact to v4 by @yunfan24 in https://github.com/apache/hertzbeat/pull/3046
* [improve] Search ignores case sensitivity. by @yunfan24 in https://github.com/apache/hertzbeat/pull/3042
* Add sse support for alert center, no need to manually refresh the page, add slide-in animation by @zqr10159 in https://github.com/apache/hertzbeat/pull/3051
* [alert] support multi query expr threshold by @tomsun28 in https://github.com/apache/hertzbeat/pull/3054
* [improve](alert-center): enhance alert card animations and interactions by @zqr10159 in https://github.com/apache/hertzbeat/pull/3055
* [improve] update theme ui color by @tomsun28 in https://github.com/apache/hertzbeat/pull/3057
* [bugfix] Fix the issue where the monitoring status is not updated. by @yunfan24 in https://github.com/apache/hertzbeat/pull/3056
* [bugfix]style(alert-center): enhance 3D transformation and z-index layers by @zqr10159 in https://github.com/apache/hertzbeat/pull/3059
* [Feature]Add zookeeper e2e code by @zhangshenghang in https://github.com/apache/hertzbeat/pull/3030
* [feature] Add Sftp config for monitor by @MasamiYui in https://github.com/apache/hertzbeat/pull/3038
* [feature] Add Japanese by @wanhao23 in https://github.com/apache/hertzbeat/pull/3013
* [bugfix] fix singleton not support remove, search id error, audio fetch 401 by @tomsun28 in https://github.com/apache/hertzbeat/pull/3062
* [API DOC] Change Swagger description by @pwallk in https://github.com/apache/hertzbeat/pull/3061
* [webapp] update ui theme by @tomsun28 in https://github.com/apache/hertzbeat/pull/3064
* [feature] Support SSH Tunnel by @pwallk in https://github.com/apache/hertzbeat/pull/3060
* [improve] Complete the missing labels in the i18n file. by @yunfan24 in https://github.com/apache/hertzbeat/pull/3065
* [Feature]Add Chinese check by @zhangshenghang in https://github.com/apache/hertzbeat/pull/3066
* [improve] Refactor SMS sending and replace Tencent Cloud SDK with HTTP API. by @yunfan24 in https://github.com/apache/hertzbeat/pull/3063
* [Bugfix] fix when the monitor is modified, the status is erroneously changed by @pwallk in https://github.com/apache/hertzbeat/pull/3067
* [improve](web-app): update monitor chart configuration and springboot GreptimeDB version by @zqr10159 in https://github.com/apache/hertzbeat/pull/3071
* [doc] Update the SMS configuration document. by @yunfan24 in https://github.com/apache/hertzbeat/pull/3073
* [feature] SMS notification supports unisms. by @yunfan24 in https://github.com/apache/hertzbeat/pull/3077
* [webapp] update and fix alert ui when theme dark by @tomsun28 in https://github.com/apache/hertzbeat/pull/3082
* [improve] Improve and unify the search. by @yunfan24 in https://github.com/apache/hertzbeat/pull/3085
* [feature] supports alibaba SMS. by @yunfan24 in https://github.com/apache/hertzbeat/pull/3084
* [improve] optimize kafka collect test by @Rancho-7 in https://github.com/apache/hertzbeat/pull/3093
* correct home's new_committer_process by @a-little-fool in https://github.com/apache/hertzbeat/pull/3094
* [bugfix] kafka client detect error by @Rancho-7 in https://github.com/apache/hertzbeat/pull/3088
* [Doc]Improve openai doc by @zhangshenghang in https://github.com/apache/hertzbeat/pull/3097
* [Improve] Message notification prompt optimization by @zhangshenghang in https://github.com/apache/hertzbeat/pull/3095
* [webapp] fix web oom crash when backend api can not access by @tomsun28 in https://github.com/apache/hertzbeat/pull/3100
* [Feature] Add deepseek Api Monitor by @zhangshenghang in https://github.com/apache/hertzbeat/pull/3096
* feat/adding-ptBR-translation by @yasminvo in https://github.com/apache/hertzbeat/pull/3098
* [bugfix] fix alert sse illegal state exception by @tomsun28 in https://github.com/apache/hertzbeat/pull/3106
* [bugfix] Fix exception thrown when searching for CollectRep.Field in the list by @JuJinPark in https://github.com/apache/hertzbeat/pull/3109
* [type: fix] #3090 garbled characters by @notbugggg in https://github.com/apache/hertzbeat/pull/3113
* [doc]fix link by @zhangshenghang in https://github.com/apache/hertzbeat/pull/3123
* [doc] Add GSOC doc by @zhangshenghang in https://github.com/apache/hertzbeat/pull/3122
* [doc] Add alibaba SMS and unisms documentation. by @yunfan24 in https://github.com/apache/hertzbeat/pull/3114
* [improve] support reuse jdbc connection switch by @tomsun28 in https://github.com/apache/hertzbeat/pull/3101
* [webapp] fix monitor define param wrong placeholder tip by @tomsun28 in https://github.com/apache/hertzbeat/pull/3118
* [bugfix] Fix swagger opening exception that Failed to load API definition. (#3127) by @yyahang in https://github.com/apache/hertzbeat/pull/3129
* [doc] welcome new committer and contributor by @tomsun28 in https://github.com/apache/hertzbeat/pull/3132
* [feature] add smslocal sms notification by @a-little-fool in https://github.com/apache/hertzbeat/pull/3135
* [improve] Optimize the progress display of monitoring imports by @MasamiYui in https://github.com/apache/hertzbeat/pull/3120
* [improve] fix potential memory leakage and content length issues. by @tomsun28 in https://github.com/apache/hertzbeat/pull/3128
* [bugfix] fix overflow arrow buffer index by @tomsun28 in https://github.com/apache/hertzbeat/pull/3137
* [improve] improve plugin upload by @LiuTianyou in https://github.com/apache/hertzbeat/pull/3139
* [doc] Add new committer blog by @yunfan24 in https://github.com/apache/hertzbeat/pull/3140
* Configuring gitpod with java by @kerwin612 in https://github.com/apache/hertzbeat/pull/3141
* Fix the issue of the empty dropdown menu on the Kanban board page. by @kerwin612 in https://github.com/apache/hertzbeat/pull/3142
* [feature] Add AWS sms client by @JuJinPark in https://github.com/apache/hertzbeat/pull/3134
* [feature] Support skywalking alert source by @MasamiYui in https://github.com/apache/hertzbeat/pull/3144
* [feature] support SSH proxy jump connections by @LL-LIN in https://github.com/apache/hertzbeat/pull/3138
* [improve] support bind metrics label and others into alert by @tomsun28 in https://github.com/apache/hertzbeat/pull/3146
* [bugfix] Fixed #3112, disappear left menu tree item when restart service by @notbugggg in https://github.com/apache/hertzbeat/pull/3116
* [bugfix] fix collect dispatch error by @tomsun28 in https://github.com/apache/hertzbeat/pull/3150
* [improve] Merge SMS configuration class. by @yunfan24 in https://github.com/apache/hertzbeat/pull/3148
* [webapp] fix less style file over max build error by @tomsun28 in https://github.com/apache/hertzbeat/pull/3151
* [bugfix] fix nightly docker build github action by @tomsun28 in https://github.com/apache/hertzbeat/pull/3153
* [feature] Supports sending messages to a specific Telegram group topic.(#3079) by @bigcyy in https://github.com/apache/hertzbeat/pull/3143
* Abstract Redundant Input Components into ConfigurableFieldComponent for Unified Management by @kerwin612 in https://github.com/apache/hertzbeat/pull/3152
* [feature] Support TencentCloud alert source by @bigcyy in https://github.com/apache/hertzbeat/pull/3149
* [bugfix]: fix incomplete class documentation in AppServiceImpl by @bigcyy in https://github.com/apache/hertzbeat/pull/3162
* [bugfix] Fix http header being incorrectly encoded. by @yunfan24 in https://github.com/apache/hertzbeat/pull/3108
* [bugfix] retain sorting state after monitor list auto-refresh by @LL-LIN in https://github.com/apache/hertzbeat/pull/3156
* [feature] add twilio sms client support by @sarthakeash in https://github.com/apache/hertzbeat/pull/3159
* [doc] Add alert integration japanese i18 by @MasamiYui in https://github.com/apache/hertzbeat/pull/3164
* [release] update release version 1.7.0 version and docs by @tomsun28 in https://github.com/apache/hertzbeat/pull/3165
* [feature] implement labels-based monitors filtering in bulletin creation flow by @LL-LIN in https://github.com/apache/hertzbeat/pull/3161
* [bugfix] fix postgre mount error, use mariadb instead of mysql in compose by @tomsun28 in https://github.com/apache/hertzbeat/pull/3168
* [bugfix] fix bind Labels are not updated when the Alarm Severity switches by @bigcyy in https://github.com/apache/hertzbeat/pull/3170
* [improve] update git archive export ignore by @tomsun28 in https://github.com/apache/hertzbeat/pull/3172
* [improve] update notice copyright years by @tomsun28 in https://github.com/apache/hertzbeat/pull/3171
```
## Apache HertzBeat
**仓库地址:**
[https://github.com/apache/hertzbeat](https://github.com/apache/hertzbeat)
**网址:**
[https://hertzbeat.apache.org/](https://hertzbeat.apache.org/)
**Apache HertzBeat™ 下载地址:**
[https://hertzbeat.apache.org/zh-cn/docs/download](https://hertzbeat.apache.org/zh-cn/docs/download)
**Apache HertzBeat™ Docker 镜像版本:**
> Apache HertzBeat™ 为每个版本制作了 Docker 镜像. 你可以从 Docker Hub 拉取使用.
- HertzBeat [https://hub.docker.com/r/apache/hertzbeat](https://hub.docker.com/r/apache/hertzbeat)
- HertzBeat Collector [https://hub.docker.com/r/apache/hertzbeat-collector](https://hub.docker.com/r/apache/hertzbeat-collector)
**Apache HertzBeat™ 开源社区如何参与?**
[https://hertzbeat.apache.org/zh-cn/docs/community/contribution](https://hertzbeat.apache.org/zh-cn/docs/community/contribution)
@@ -0,0 +1,103 @@
# HertzBeat 升级指导-(Docker Mode)
## Docker 方式升级 - Mysql 数据库
1. 数据备份
- 备份数据库,将 mysql 数据手动做备份,按需备份
```bash
mysqldump -h<HOST-IP> -P`<PORT>` -uroot -p"PASSWORD" <库名> hertzbeat_backup-`date +%Y-%m-%d`.sql #单库备份
mysqldump -h<HOST-IP> -P`<PORT>` -uroot -p"PASSWORD" > hertzbeat_backup-`date +%Y-%m-%d`.sql # 整库备份
```
- 备份配置文件及数据目录
```bash
mv application.yml application-bak.yml && mv sureness-bak.yml
cp -R data data-`date +%Y-%m-%d`. bak
```
2. 关闭 并移除 HertzBeat 容器
```shell
docker stop hertzbeat && docker rm hertzbeat
```
3. 升级数据库脚本
打开[https://github.com/apache/hertzbeat/tree/master/hertzbeat-startup/src/main/resources/db/migration](https://github.com/apache/hertzbeat/tree/master/hertzbeat-startup/src/main/resources/db/migration) 选择你使用的数据库的目录下相应的 `V160__update_column.sql`文件在 Mysql 执行升级 sql。
4. 更换镜像重新启动 HertzBeat 容器
```bash
$ docker run -d -p 1157:1157 -p 1158:1158 \
-v $(pwd)/data:/opt/hertzbeat/data \
-v $(pwd)/logs:/opt/hertzbeat/logs \
-v $(pwd)/application.yml:/opt/hertzbeat/config/application.yml \
-v $(pwd)/sureness.yml:/opt/hertzbeat/config/sureness.yml \
--restart=always \
--name hertzbeat apache/hertzbeat:v1.7.0
```
5. 升级配置文件
参考备份配置根据自己的需求基础上进行修改。
- `application.yml`一般需要修改以下部分
默认为:
```yaml
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
username: root
password: root
url: jdbc:mysql://localhost:3306/hertzbeat?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai
hikari:
max-lifetime: 120000
jpa:
show-sql: false
database-platform: org.eclipse.persistence.platform.database.MySQLPlatform
database: mysql
properties:
eclipselink:
logging:
level: SEVERE
```
- `sureness.yml`修改是可选的,一般在你需要修改账号密码时
```yaml
# account info config
# eg: admin has role [admin,user], password is hertzbeat
# eg: tom has role [user], password is hertzbeat
# eg: lili has role [guest], plain password is lili, salt is 123, salted password is 1A676730B0C7F54654B0E09184448289
account:
- appId: admin
credential: hertzbeat
role: [admin]
- appId: tom
credential: hertzbeat
role: [user]
- appId: guest
credential: hertzbeat
role: [guest]
- appId: lili
# credential = MD5(password + salt)
# plain password: hertzbeat
# attention: digest authentication does not support salted encrypted password accounts
credential: 94C6B34E7A199A9F9D4E1F208093B489
salt: 123
role: [user]
```
6. 添加相应的数据库驱动
由于 apache 基金会对于 license 合规的要求,HertzBeat 的安装包不能包含 mysqloracle 等 gpl 许可的依赖,需要用户自行添加,用户可通过以下链接自行下载驱动 jar 放到本地 `ext-lib`目录下,然后启动时将`ext-lib`挂载到容器的 `/opt/hertzbeat/ext-lib`目录。
mysql[https://dev.mysql.com/get/Downloads/Connector-J/mysql-connector-java-8.0.25.zip](https://dev.mysql.com/get/Downloads/Connector-J/mysql-connector-java-8.0.18.zip)
oracle(如果你要监控 oracle,这两个驱动是必须的):
[https://download.oracle.com/otn-pub/otn_software/jdbc/234/ojdbc8.jar](https://download.oracle.com/otn-pub/otn_software/jdbc/234/ojdbc8.jar)
[https://repo.mavenlibs.com/maven/com/oracle/database/nls/orai18n/21.5.0.0/orai18n-21.5.0.0.jar](https://repo.mavenlibs.com/maven/com/oracle/database/nls/orai18n/21.5.0.0/orai18n-21.5.0.0.jar?utm_source=mavenlibs.com)
@@ -0,0 +1,103 @@
# HertzBeat 从 1.6.1 版本升级到 1.7.0 版本指引-(Helm Mode)
## 1. 前置准备
1. 确保已安装以下工具:
- Helm 3.x
- kubectl
- Git (可选)
2. 确认当前部署信息:
```bash
helm list -n <your-namespace>
# 如果你老版本的chart包不见了,可以使用以下命令导出values.yaml文件
helm get values hertzbeat -n <your-namespace> > hertzbeat-1.6.1-values.yaml
```
3. 数据备份
> 1. 若使用了自定义监控模板
>
> - 需要备份 `kubectl cp hertzbeat/hertzbeat-978477f84-fr894:/opt/hertzbeat/define ./define` 当前运行 pod里面的 `/opt/hertzbeat/define` 目录到当前主机下,如果做了持久化 请拷贝持久化目录
> - `kubectl cp hertzbeat/hertzbeat-978477f84-fr894:/opt/hertzbeat/define ./define`
>
> 2. 若使用外置关系型数据库 Mysql, PostgreSQL数据
>
> - 一般使用helm部署部署都做了持久化,可以选择拷贝持久化目录,也可以通过mysqldump、pgdump等工具完成备份
>
> ```bash
> kubectl get pvc -n hertzbeat
> NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
> hertzbeat-database Bound pvc-c63cf479-0033-423b-8466-eb00aa181657 4Gi RWO standard 68d
> hertzbeat-ext-lib Bound pvc-31fee163-1211-424f-8966-e3e805c23ff5 1Gi RWX standard 68d
> hertzbeat-tsdb Bound pvc-4f2ef614-0302-4a4c-8dd4-e68b34e9061c 4Gi RWO standard 68d
> ```
## 2. 升级步骤
### 1. 拉取最新Chart到本地
```bash
helm repo update
helm pull hertzbeat/hertzbeat --version 1.7.0 --untar
cd hertzbeat
```
或者从GitHub仓库获取(按需修改Chart):
```bash
git clone https://github.com/hertzbeat/helm-charts.git
cd helm-charts/charts/hertzbeat
```
### 2. 修改values.yaml
比较并合并您的自定义配置到新版本values.yaml:
```bash
# 使用diff工具比较新旧values文件
diff -u ../hertzbeat-1.6.1-values.yaml values.yaml
vimdiff 对着修改,改完继续diff,无输出则正常
```
常见需要关注的配置项:
- 镜像版本: `image.tag`
- 资源限制: `resources`
- 持久化配置: `persistence`
- 服务类型: `service.type`
- Ingress配置
- 数据库配置(如果使用外部数据库)
### 3. 测试升级(干运行)
```bash
helm upgrade hertzbeat . -n <your-namespace> \
--values values.yaml \
--dry-run \
--debug
```
### 4. 执行升级
```bash
helm upgrade hertzbeat . -n <your-namespace> \
--values values.yaml \
--atomic \ # 升级失败自动回滚
--timeout 10m # 设置超时时间
```
### 5. 验证升级
```bash
# 检查发布状态
helm status hertzbeat -n <your-namespace>
# 检查Pod状态
kubectl get pods -n <your-namespace> -l app.kubernetes.io/instance=hertzbeat
# 检查日志
kubectl logs -n <your-namespace> -l app.kubernetes.io/instance=hertzbeat --tail=100
```
@@ -0,0 +1,102 @@
# hertzbeat 升级指导-docker模式
## Docker 方式升级 - Mysql数据库
1. 数据备份
- 备份数据库,将mysql数据库手动做备份,按需备份
```bash
mysqldump -h<HOST-IP> -P`<PORT>` -uroot -p"PASSWORD" <库名> hertzbeat_backup-`date +%Y-%m-%d`.sql #单库备份
mysqldump -h<HOST-IP> -P`<PORT>` -uroot -p"PASSWORD" > hertzbeat_backup-`date +%Y-%m-%d`.sql # 整库备份
```
- 备份配置文件及数据目录
```bash
mv application.yml application-bak.yml && mv sureness-bak.yml
cp -R data data-`date +%Y-%m-%d`. bak
```
2. 关闭 并HertzBeat 容器
```shell
docker stop hertzbeat && docker rm hertzbeat
```
3. 升级数据库脚本
打开[https://github.com/apache/hertzbeat/tree/master/hertzbeat-startup/src/main/resources/db/migration](https://github.com/apache/hertzbeat/tree/master/hertzbeat-startup/src/main/resources/db/migration) 选择你使用的数据库的目录下相应的 `V160__update_column.sql`文件在 Mysql 执行升级sql。
4. 更换镜像重新启动HertzBeat 容器
```bash
$ docker run -d -p 1157:1157 -p 1158:1158 \
-v $(pwd)/data:/opt/hertzbeat/data \
-v $(pwd)/logs:/opt/hertzbeat/logs \
-v $(pwd)/application.yml:/opt/hertzbeat/config/application.yml \
-v $(pwd)/sureness.yml:/opt/hertzbeat/config/sureness.yml \
--restart=always \
--name hertzbeat apache/hertzbeat:v1.7.0
```
5. 升级配置文件
参考备份配置根据自己的需求基础上进行修改。
- `application.yml`一般需要修改以下部分
默认为:
```yaml
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
username: root
password: root
url: jdbc:mysql://localhost:3306/hertzbeat?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai
hikari:
max-lifetime: 120000
jpa:
show-sql: false
database-platform: org.eclipse.persistence.platform.database.MySQLPlatform
database: mysql
properties:
eclipselink:
logging:
level: SEVERE
```
- `sureness.yml`修改是可选的,一般在你需要修改账号密码时
```yaml
# account info config
# eg: admin has role [admin,user], password is hertzbeat
# eg: tom has role [user], password is hertzbeat
# eg: lili has role [guest], plain password is lili, salt is 123, salted password is 1A676730B0C7F54654B0E09184448289
account:
- appId: admin
credential: hertzbeat
role: [admin]
- appId: tom
credential: hertzbeat
role: [user]
- appId: guest
credential: hertzbeat
role: [guest]
- appId: lili
# credential = MD5(password + salt)
# plain password: hertzbeat
# attention: digest authentication does not support salted encrypted password accounts
credential: 94C6B34E7A199A9F9D4E1F208093B489
salt: 123
role: [user]
```
6. 添加相应的数据库驱动
由于apache基金会对于license合规的要求,HertzBeat的安装包不能包含mysqloracle等gpl许可的依赖,需要用户自行添加,用户可通过以下链接自行下载驱动 jar 放到本地 `ext-lib`目录下,然后启动时将`ext-lib`挂载到容器的 `/opt/hertzbeat/ext-lib`目录。
mysql[https://dev.mysql.com/get/Downloads/Connector-J/mysql-connector-java-8.0.25.zip](https://dev.mysql.com/get/Downloads/Connector-J/mysql-connector-java-8.0.18.zip)
oracle(如果你要监控oracle,这两个驱动是必须的):
[https://download.oracle.com/otn-pub/otn_software/jdbc/234/ojdbc8.jar](https://download.oracle.com/otn-pub/otn_software/jdbc/234/ojdbc8.jar)
[https://repo.mavenlibs.com/maven/com/oracle/database/nls/orai18n/21.5.0.0/orai18n-21.5.0.0.jar](https://repo.mavenlibs.com/maven/com/oracle/database/nls/orai18n/21.5.0.0/orai18n-21.5.0.0.jar?utm_source=mavenlibs.com)
@@ -0,0 +1,37 @@
---
title: 热烈欢迎 HertzBeat 小伙伴新晋社区 Committer!
author: pwallk
author_title: Kang Li
author_url: https://github.com/pwallk
tags: [opensource, practice]
keywords:
[
open source monitoring system,
alerting system,
Apache,
Apache Committer,
HertzBeat,
]
---
> 大家好,非常荣幸受到社区的邀请,成为 Apache HertzBeat™ 项目的 Committer。
## 自我介绍
本人从22年开始至今一直从事Java后端开发工作,目前在一家公司担任后端开发工程师并兼任运维工作。
## 初识 Apache HertzBeat
在去年的时候无意间接触到了 Apache HertzBeat™ 项目,在阅读了文档后发现这款监控使用简单、不需要 Agent、全 Web 页面操作,于是我在公司内部基于 Docker 快速搭建起并投入使用。
由于 Apache HertzBeat™ `All in one` 的设计架构,极大减轻了我的心智负担,很快地便将公司内部各种服务接入监控。
## 参与贡献
在使用的过程中,我发现了一个数据库查询 Bug,于是我 Fork 了代码本地调试了起来,发现修复并不复杂,正好也没有人解决,于是我提交了第一个 PR,没想到很快就被合并了,这对我产生了极大的鼓励。
后续我也是继续熟悉 Apache HertzBeat™ 代码,持续关注 ISSUE、PR,随着对系统理解的深入,除了修复 BUG、完善文档外,还开发一些新功能,如数据库存储模板、SSH隧道等。
## 结语
非常感谢 [@tomsun28](https://github.com/tomsun28) 邀请我成为该项目的 Committer,也感谢社区的其他成员帮助我 review 代码,给予了极大的帮助。 Apache HertzBeat™ 是一个非常活跃的社区,也希望能有更多的人加入到这个社区参与贡献,最后预祝 Apache HertzBeat™ 早日从孵化器顺利毕业!
@@ -0,0 +1,41 @@
---
title: 热烈欢迎 HertzBeat 小伙伴新晋社区 Committer!
author: MasamiYui
author_title: Yijun Yin
author_url: https://github.com/MasamiYui
tags: [opensource, practice]
keywords:
[
open source monitoring system,
alerting system,
Apache,
Apache Committer,
HertzBeat,
]
---
> 大家好,非常荣幸收到社区邀请,成为 Apache HertzBeat™ Committer。
## 自我介绍
自19年工作至今,从事过多个业务开发(区块链、网络安全、大数据、新能源、视频技术等),是一个啥都会一点的打杂工程师。
## 结缘 HertzBeat
起初因为自己搭建了几个服务,希望对指标进行可视化监控,但又不想引入过于复杂的监控体系,希望能找到一款开箱即用,功能全面且易于扩展的监控工具,于是发现了 HertzBeat。
随着深入使用,我开始研究其源码,并萌生了参与社区贡献的想法,至今仍清晰记得第一次提交 PR 时,反复调试验证,期待被接受合入主分支;随着参与的加深,现在关注社区动态逐渐成了我的日常习惯。
## 良好的社区氛围
社区非常活跃,即使深夜也经常能收到代码提交和评审。对于新人非常友好,无论是提交 ISSUE 反馈问题,还是发起 PR 参与协作,都会收获细致深入的讨论与建议。
目前 HertzBeat 正处于快速发展阶段,指标,日志,链路等能力还需要我们不断的补充和完善,如果你想参与开源,这里是个不错的选择。
## 关于开源
对我而言,开源是技术热情的载体;与社区共同成长更是一段非常有意义的旅程。
## 结语
非常感谢 [@tomsun28](https://github.com/tomsun28) 提名和指导,希望这份鼓励能驱使我为社区做出更有价值的贡献,最后祝 Apache HertzBeat™ 能早日从孵化器顺利毕业,社区越来越好!
@@ -0,0 +1,192 @@
---
title: Apache HertzBeat™ 1.7.2 发布公告
author: tomsun28
author_title: tomsun28
author_url: https://github.com/zhangshenghang
tags: [opensource, release]
keywords: [open source monitoring system, alerting system, HertzBeat, release]
---
亲爱的社区小伙伴们,
我们很高兴地宣布 Apache HertzBeat™ 1.7.2 版本正式发布!
## Downloads and Documentation
- **Apache HertzBeat™ 1.7.2 Download Link**: [https://hertzbeat.apache.org/zh-cn/docs/download](https://hertzbeat.apache.org/zh-cn/docs/download)
- **Apache HertzBeat™ Documentation**: [https://hertzbeat.apache.org/zh-cn/docs/](https://hertzbeat.apache.org/zh-cn/docs/)
## Major Updates
### New Features and Enhancements
- **云服务告警集成**:支持阿里云 SLS 日志服务告警源 (#3422)、华为云云监控告警源 (#3443)、火山引擎告警源 (#3451)。
- **服务发现增强**:新增 Zookeeper 服务发现支持 (#3377)、Nacos 自动服务发现 (#3324)、支持认证的 HTTP 服务发现采集器 (#3388)。
- **AI 与数据源扩展**:集成 Ollama AI 模型 (#3441)、支持 OpenRouter AI 提供商 (#3439)、提供 GreptimeDB 作为 Grafana 数据源 (#3403)。
- **表达式与数据处理**:支持 sql 和 promql 表达式语法 (#3410)、新增批量导入指标至 VictoriaMetrics 功能 (#3337)。
- **平台兼容性**:新增 Darwin (macOS) 平台兼容支持 (#3431)。
- **监控指标增强**:新增 statusCode 指标数据 (#3446)。
- **更多新功能**
### Bug Fixes
- **告警通知问题**:修复 Uptime Kuma/Zabbix/腾讯云 Webhook URL 错误 (#3351)、飞书通知格式错误 (#3508)。
- **阈值功能异常**:修复 Prometheus 实时阈值不生效问题 (#3434)。
- **监控状态异常**:修复服务发现子监控状态显示错误 (#3340)、监控列表分页显示异常 (#3467)。
- **系统稳定性**:修复自定义监控公告板空指针异常 (#3448)、Jacoco 测试报告生成失败 (#3455)。
- **数据解析问题**:修复 ANTLR4 解析逻辑错误(二元运算符/向量)(#3482, #3488)、告警表达式解析异常 (#3497, #3504)。
- **数据存储优化**:改进 GreptimeDB 存储与查询逻辑 (#3387)。
- **和其它的BUG修复**
### Refactoring and Optimization
- **安全验证增强**:强化 URL 验证(企业微信/Telegram/Slack/Server酱)(#3361-3364)、JNDI 安全验证 (#3358)、插件服务路径验证 (#3375)。
- **架构与存储优化**:更新安全模型 (#3450)、数据库列类型优化(commonAnnotations/alertFingerprints 改为 TEXT(#3463)、JDBC 逻辑调整 (#3500)。
- **开发工具链**:添加 Maven Wrapper (mvnw) (#3430)、依赖库更新 (#3359, #3498)、支持 mvnd 并优化后端构建 (#3491)。
- **可观测性**:默认禁用 OpenTelemetry exporters 防止连接错误 (#3437, #3461)。
- **社区协作**:更新 Issue 模板 (#3421)。
- **和其它的优化**
### Tests and Quality
- **单元测试覆盖**:为 HttpSdCollectImpl 添加单元测试 (#3386)
- **和其它的测试**
### Documentation Enhancements
- **国际化文档**:新增 30+ 组件日文文档(API/CentOS/Cisco 交换机/ClickHouse 等)(#3352, #3376, #3389 等)。
- **告警功能文档**:更新告警阈值配置 (#3399)、告警通知模板 (#3466)、火山引擎告警集成指南 (#3460)。
- **部署与配置**:新增 Grafana 匿名认证配置说明 (#3407)、Rainbond 云一键安装指南 (#3440)。
- **内容修正与优化**:修复时间模板语法错误 (#3378)、精炼中文术语 (#3380, #3383)、更新 Greptime-init 文档 (#3355)。
- **社区生态**:新增贡献者/Committer 简介 (#3357, #3391, #3395)、版本发布博客 (#3449)。
- **更多的文档更新**
## Acknowledgements
感谢以下社区成员的共同努力:
> @pruidong @MasamiYui @tomsun28 @Aias00 @zhangshenghang @zqr10159 @LiuTianyou @LL-LIN @lx1229 @xiaomizhou2 @pwallk
> @bigcyy @yuluo-yx @TJxiaobao @RainBondsongyg @Duansg @Calvin979 @Cyanty
## What's Changed
```markdown
* [bugfix] Fix incorrect webhook URLs for Uptime Kuma, Zabbix, and Tencent Cloud by @bigcyy in https://github.com/apache/hertzbeat/pull/3351
* [doc] japanese api by @Calvin979 in https://github.com/apache/hertzbeat/pull/3352
* [doc] update OS monitor by @MasamiYui in https://github.com/apache/hertzbeat/pull/3353
* [doc](start): update greptime-init documentation by @zqr10159 in https://github.com/apache/hertzbeat/pull/3355
* [doc] new ppmc liutianyou and update qq num by @tomsun28 in https://github.com/apache/hertzbeat/pull/3357
* [bugfix] Incorrect SD sub-monitor status by @MasamiYui in https://github.com/apache/hertzbeat/pull/3340
* [improve] improve url validation for WeComRobotAlertNotifyHandlerImpl by @Aias00 in https://github.com/apache/hertzbeat/pull/3361
* [improve] improve url validation for TelegramBotAlertNotifyHandlerImpl by @Aias00 in https://github.com/apache/hertzbeat/pull/3362
* [improve] improve url validation for SlackAlertNotifyHandlerImpl by @Aias00 in https://github.com/apache/hertzbeat/pull/3363
* [improve] improve url validation for serverChan by @Aias00 in https://github.com/apache/hertzbeat/pull/3364
* [improve] improve jndi validation by @Aias00 in https://github.com/apache/hertzbeat/pull/3358
* update maven dep by @Aias00 in https://github.com/apache/hertzbeat/pull/3359
* [doc] japanese centos by @Calvin979 in https://github.com/apache/hertzbeat/pull/3376
* [doc] fix incorrect time template syntax usercase in doc by @LL-LIN in https://github.com/apache/hertzbeat/pull/3378
* [doc] Add blog by @LiuTianyou in https://github.com/apache/hertzbeat/pull/3379
* [improve] add path validation for pluginservice by @Aias00 in https://github.com/apache/hertzbeat/pull/3375
* [feat] Support Zookeeper Service Discovery by @bigcyy in https://github.com/apache/hertzbeat/pull/3377
* [doc] modify chinese words by @Duansg in https://github.com/apache/hertzbeat/pull/3380
* [Task] Batch import metrics data in victoria-metrics by @MasamiYui in https://github.com/apache/hertzbeat/pull/3337
* [feature] support auto nacos service discovery by @xiaomizhou2 in https://github.com/apache/hertzbeat/pull/3324
* [doc] modify supplement related documentation by @Duansg in https://github.com/apache/hertzbeat/pull/3383
* [doc] japanese cisco switch by @Calvin979 in https://github.com/apache/hertzbeat/pull/3389
* [test] Add unit tests for HttpSdCollectImpl by @xiaomizhou2 in https://github.com/apache/hertzbeat/pull/3386
* [fix](warehouse): improve GreptimeDB data storage and querying by @zqr10159 in https://github.com/apache/hertzbeat/pull/3387
* [doc] japanese clickhouse by @Calvin979 in https://github.com/apache/hertzbeat/pull/3390
* [doc] new contributor and committer, update doc by @tomsun28 in https://github.com/apache/hertzbeat/pull/3391
* [doc] japanese consul sd by @Calvin979 in https://github.com/apache/hertzbeat/pull/3392
* [doc]add new committer blog by @pwallk in https://github.com/apache/hertzbeat/pull/3395
* [doc] japanese coreos by @Calvin979 in https://github.com/apache/hertzbeat/pull/3393
* [doc] japanese dahua by @Calvin979 in https://github.com/apache/hertzbeat/pull/3396
* [doc] japanese Debian by @Calvin979 in https://github.com/apache/hertzbeat/pull/3398
* [improve] http sd collector adds authentication by @Cyanty in https://github.com/apache/hertzbeat/pull/3388
* [doc] japanese deepseek & dm by @Calvin979 in https://github.com/apache/hertzbeat/pull/3400
* [docs] update alert threshold doc by @bigcyy in https://github.com/apache/hertzbeat/pull/3399
* [doc] japanese dns by @Calvin979 in https://github.com/apache/hertzbeat/pull/3404
* [doc] japanese dns sd by @Calvin979 in https://github.com/apache/hertzbeat/pull/3405
* [doc] japanese docker by @Calvin979 in https://github.com/apache/hertzbeat/pull/3408
* [doc] japanese doris_be by @Calvin979 in https://github.com/apache/hertzbeat/pull/3409
* [Doc] Update 1.7.1 by @zhangshenghang in https://github.com/apache/hertzbeat/pull/3411
* [doc] update home doc by @tomsun28 in https://github.com/apache/hertzbeat/pull/3418
* [doc] Update anonymous user auth configuration of the grafana dashboard document by @Cyanty in https://github.com/apache/hertzbeat/pull/3407
* [doc] japanese doris_fe by @Calvin979 in https://github.com/apache/hertzbeat/pull/3416
* [infra]: Update issue tmpl by @yuluo-yx in https://github.com/apache/hertzbeat/pull/3421
* [feature]Make GreptimeDB as a grafana data source by @zqr10159 in https://github.com/apache/hertzbeat/pull/3403
* [feat] support sql("...") and promql("...") expressions including SQL condition parsing by @bigcyy in https://github.com/apache/hertzbeat/pull/3410
* [doc] japanese dynamic_tp by @Calvin979 in https://github.com/apache/hertzbeat/pull/3419
* [doc] japanese elasticsearch by @Calvin979 in https://github.com/apache/hertzbeat/pull/3423
* [feature]Support Alibaba Cloud 'Simple Log Service(SLS)' alert source by @Duansg in https://github.com/apache/hertzbeat/pull/3422
* [Improve] add mvnw by @zhangshenghang in https://github.com/apache/hertzbeat/pull/3430
* [doc] japanese emqx by @Calvin979 in https://github.com/apache/hertzbeat/pull/3433
* [improvement] disable default OpenTelemetry exporters to prevent connection errors by @bigcyy in https://github.com/apache/hertzbeat/pull/3437
* [bugfix] Fix the issue where Prometheus RealTime Threshold is not eff… by @Duansg in https://github.com/apache/hertzbeat/pull/3434
* [feat] add support for ollama and update docs by @bigcyy in https://github.com/apache/hertzbeat/pull/3441
* [release] add support for darwin by @lx1229 in https://github.com/apache/hertzbeat/pull/3431
* [feature] Support Huawei Cloud `Cloud Eye` alert source by @Duansg in https://github.com/apache/hertzbeat/pull/3443
* [doc] japanese euleros by @Calvin979 in https://github.com/apache/hertzbeat/pull/3442
* docs: Add one-click installation for Rainbond Cloud by @RainBondsongyg in https://github.com/apache/hertzbeat/pull/3440
* [feat] add support for OpenRouter AI provider by @bigcyy in https://github.com/apache/hertzbeat/pull/3439
* [doc] japanese flink by @Calvin979 in https://github.com/apache/hertzbeat/pull/3447
* [security] update hertzbeat security model by @tomsun28 in https://github.com/apache/hertzbeat/pull/3450
* [feature] support volcengine alert source by @LiuTianyou in https://github.com/apache/hertzbeat/pull/3451
* [doc] add publish version 1.7.1 blog by @tomsun28 in https://github.com/apache/hertzbeat/pull/3449
* [doc] japanese flink on yarn by @Calvin979 in https://github.com/apache/hertzbeat/pull/3452
* [doc] japanese freebsd by @Calvin979 in https://github.com/apache/hertzbeat/pull/3456
* [improvement] disable default OpenTelemetry exporters to prevent connection errors by @bigcyy in https://github.com/apache/hertzbeat/pull/3461
* [doc] add doc for integrate volcengine alerts by @LiuTianyou in https://github.com/apache/hertzbeat/pull/3460
* [Fix] fix custom monitoring bulletin `NullPointerException` by @Duansg in https://github.com/apache/hertzbeat/pull/3448
* [fix] fix jacoco can not generate test reports. by @Duansg in https://github.com/apache/hertzbeat/pull/3455
* [doc] Alert notification template by @MasamiYui in https://github.com/apache/hertzbeat/pull/3466
* [doc] japanese greenplum by @Calvin979 in https://github.com/apache/hertzbeat/pull/3468
* [improvement] change column definitions for commonAnnotations and alertFingerprints to TEXT type by @bigcyy in https://github.com/apache/hertzbeat/pull/3463
* [fix] Fix `Monitors` paging display. by @Duansg in https://github.com/apache/hertzbeat/pull/3467
* [doc] japanese greptime by @Calvin979 in https://github.com/apache/hertzbeat/pull/3469
* [doc] japanese h3c switch by @Calvin979 in https://github.com/apache/hertzbeat/pull/3471
* [feature] Add statusCode metrics data. by @Duansg in https://github.com/apache/hertzbeat/pull/3446
* [doc] japanese hadoop by @Calvin979 in https://github.com/apache/hertzbeat/pull/3476
* [docs](webhook): update Chinese documentation for alert integration by @zqr10159 in https://github.com/apache/hertzbeat/pull/3478
* [doc] japanese hbase master by @Calvin979 in https://github.com/apache/hertzbeat/pull/3477
* [doc] japanese hbase region server by @Calvin979 in https://github.com/apache/hertzbeat/pull/3479
* [doc] japanese hdfs datanode by @Calvin979 in https://github.com/apache/hertzbeat/pull/3487
* [fix] antlr4 `vectors and` parse semantic fixes and optimizations by @Duansg in https://github.com/apache/hertzbeat/pull/3482
* [ci]: add mvnd support and update backend build by @zqr10159 in https://github.com/apache/hertzbeat/pull/3491
* [doc] japanese hdfs namenode by @Calvin979 in https://github.com/apache/hertzbeat/pull/3490
* [doc] japanese hertzbeat by @Calvin979 in https://github.com/apache/hertzbeat/pull/3492
* [fix] Fix antlr4 parsing of `or` and `unless` logical and set binary operators by @Duansg in https://github.com/apache/hertzbeat/pull/3488
* [doc] japanese hertzbeat token by @Calvin979 in https://github.com/apache/hertzbeat/pull/3493
* [feat] update_mvnd_version by @Aias00 in https://github.com/apache/hertzbeat/pull/3498
* add:a small jdbc modified. by @TJxiaobao in https://github.com/apache/hertzbeat/pull/3500
* fixed:a minor issue change by @TJxiaobao in https://github.com/apache/hertzbeat/pull/3428
* [bugfix] Fix incorrect expression parsing in alert setting component by @bigcyy in https://github.com/apache/hertzbeat/pull/3497
* [bugfix] Correctly parse binary comparison expressions by @bigcyy in https://github.com/apache/hertzbeat/pull/3504
* [bugfix]Fixed an error in the format of the flying book notification by @pruidong in https://github.com/apache/hertzbeat/pull/3508
* [release] release new version 1.7.2 by @tomsun28 in https://github.com/apache/hertzbeat/pull/3510
```
## Apache HertzBeat
**仓库地址:**
[https://github.com/apache/hertzbeat](https://github.com/apache/hertzbeat)
**网址:**
[https://hertzbeat.apache.org/](https://hertzbeat.apache.org/)
**Apache HertzBeat™ 下载地址:**
[https://hertzbeat.apache.org/zh-cn/docs/download](https://hertzbeat.apache.org/zh-cn/docs/download)
**Apache HertzBeat™ Docker 镜像版本:**
> Apache HertzBeat™ 为每个版本制作了 Docker 镜像. 你可以从 Docker Hub 拉取使用.
- HertzBeat [https://hub.docker.com/r/apache/hertzbeat](https://hub.docker.com/r/apache/hertzbeat)
- HertzBeat Collector [https://hub.docker.com/r/apache/hertzbeat-collector](https://hub.docker.com/r/apache/hertzbeat-collector)
**Apache HertzBeat™ 开源社区如何参与?**
[https://hertzbeat.apache.org/zh-cn/docs/community/contribution](https://hertzbeat.apache.org/zh-cn/docs/community/contribution)
@@ -0,0 +1,45 @@
---
title: 热烈欢迎 HertzBeat 小伙伴新晋社区 Committer!
author: bigcyy
author_title: Yang Chen
author_url: https://github.com/bigcyy
tags: [opensource, practice]
keywords:
[
open source monitoring system,
alerting system,
Apache,
Apache Committer,
HertzBeat,
]
---
大家好,我是陈阳,目前是重庆邮电大学的一名研究生。非常荣幸能得到 Apache HertzBeat™ 社区的认可与邀请,正式成为项目的 Committer,这标志着我真正意义上的开源之旅的开启!
## 我的开源初探
早在本科时期,我就接触过开源,那时曾基于开源的 [Mirai](https://github.com/mamoe/mirai) 框架开发了一个[疫情防控 QQ 机器人](https://github.com/bigcyy/GroupNotifier)。然而,那更多是停留在使用层面。
大三时,我尝试独立开源了名为 [customized_chat](https://github.com/bigcyy/customized-chat) 的 AI 项目,这算是我迈出的“开源”第一步。
但这些经历都是独自摸索,我深感这并非真正的开源,因为它未能建立起一个完整的社区生态。
## 结缘 HertzBeat:真正意义的开源实践
为了更深入地参与开源,我开始寻找合适的开源活动,并因此结识了 HertzBeat。这对我而言,是真正意义上的开源之旅。在这里,我不仅学到了扎实的技术开发,更领略了成熟的社区生态。我深刻理解了 “Apache Way” 的精髓——社区成就项目,而非项目成就社区。
我最初是通过 GSoCGoogle Summer of Code)了解到 HertzBeat 的,当时社区关于开发监控 MCP 的提案深深吸引了我。于是,我主动联系了 Tom ,并正式开始参与社区活动。Tom 非常热情,整个社区也异常活跃。我清晰地记得我的第一个 PR(Pull Request),当时甚至与一位用户在 Issue 中进行了在线测试,这对我来说是一次相当独特的经历。尽管最终未能入选 GSoC,但在此期间,我已深度参与到社区中,并充分感受到了它的卓越之处。
## 开源带来的成长与收获
参与开源,确实让我的能力得到了显著提升。通过阅读 HertzBeat 的架构设计并积极参与社区讨论,我积累了许多宝贵的经验,例如:
- 前沿技术: 我深入了解了监控系统的设计与实现,并在项目中实践了并发编程、分布式等核心技术。
- 实战能力: 通过解决实际问题和参与代码贡献,我成功地将理论知识转化为了实际操作能力。
- 社区文化体验: 我亲身感受了“Apache Way”的独特魅力,并与来自世界各地的开发者们进行了深入交流与学习。
我的经历让我深信,开源不仅仅是编写代码,更是一个学习、成长和贡献的绝佳平台。
如果你也对技术充满热情,渴望在实践中提升自我,并希望体验真正意义上的社区协作,那么 Apache HertzBeat™ 社区绝对是你的不二选择!
## 最后
我衷心感谢 [Tom](https://github.com/tomsun28)、[Shenghang](https://github.com/zhangshenghang)、[Logic](https://github.com/zqr10159) 等社区的小伙伴们,感谢你们对我的代码进行细致的 Review 与悉心指导。希望 Apache HertzBeat™ 能够越来越好!
@@ -0,0 +1,138 @@
---
title: Apache HertzBeat™ 毕业成为 Apache 顶级项目!
author: 铁甲小宝
author_url: https://github.com/TJxiaobao
tags: [opensource, apache]
---
> **我们的开源项目的里程碑时刻**
>
> 北京时间 2025 年 8 月 21 日,全球最大的开源软件基金会 Apache Software Foundation(以下简称 ASF)正式宣布 Apache HertzBeat™ 毕业成为 Apache 顶级项目 (TLP, Top Level Project)。
>
> Apache HertzBeat™ 于 2024 年 4 月申请加入 Apache 孵化器,在 2 个月后发布了其第一个 Apache 版本。2025 年 8 月 21 日,Apache 董事会通过 Apache HertzBeat™ 毕业决议,结束了为期 17 个月的孵化,正式确定 Apache HertzBeat™ 成为 Apache 顶级项目。
>
> 这一成就标志着 Apache HertzBeat™ 在监控领域的技术创新、社区治理和生态成熟度已全面达到Apache基金会的严格标准,成为全球开源监控基础设施的重要选择。
## 1、什么是Apache HertzBeat
[Apache HertzBeat](https://github.com/apache/hertzbeat) 是一个易用友好的开源实时监控告警系统,无需 Agent,高性能集群,兼容 Prometheus,提供强大的自定义监控和状态页构建能力。
![hertzBeat](/img/docs/hertzbeat-arch.png)
### 特点
-**监控+告警+通知** 为一体,支持对应用服务,应用程序,数据库,缓存,操作系统,大数据,中间件,Web服务器,云原生,网络,自定义等监控阈值告警通知一步到位。
- 易用友好,无需 `Agent`,全 `WEB` 页面操作,鼠标点一点就能监控告警,无需学习成本。
-`Http, Jmx, Ssh, Snmp, Jdbc, Prometheus` 等协议规范可配置化,只需在浏览器配置监控模板 `YML` 就能使用这些协议去自定义采集想要的指标。您相信只需简单配置即可快速适配一款 `K8s``Docker` 等新的监控类型吗?
- 兼容 `Prometheus` 的系统生态并且更多,只需页面操作就可以监控 `Prometheus` 所能监控的。
- 高性能,支持多采集器集群横向扩展,支持多隔离网络监控,云边协同。
- 灵活的告警阈值规则,`邮件` `Discord` `Slack` `Telegram` `钉钉` `微信` `飞书` `短信` `Webhook` `Server酱` 等方式消息及时送达。
- 提供强大的状态页构建能力,轻松向用户传达您产品服务的实时状态。
## 2、孵化历程与里程碑
### **一、孵化历程**
- **2024年4月**
HertzBeat 正式申请加入 Apache 孵化器,成为 Apache 孵化器项目。
- **2024年6月**
发布第一个 Apache 版本,标志着项目正式进入 Apache 生态。(期间大量改造替换了不合规三方依赖,比如数据库JPA规范实现由 Hibernate 替换为 EclipseLink)
- **2025年8月21日**
经过**17个月的高效孵化**Apache 董事会通过 HertzBeat 毕业决议,正式晋升为 Apache 顶级项目(TLP)。
并在 Apache 基金会孵化器的指导下完成了三大转型:
- **治理结构化:** 建立 PMC 主导的开放治理模型,社区决策通过邮件列表公开进行
- **流程标准化:** 采用 Apache 发布流程,所有版本经过 IPMC 投票批准
- **协作全球化:** 吸引来自全世界的开发者和用户,一起为 Apache HertzBeat™ 尽一分力
#### **二、技术里程碑**
在孵化期间,HertzBeat 始终保持着积极的研发与迭代节奏,多个版本相继发布,为用户带来了更丰富功能、更稳定性能和更优质体验。
- 发布 5 个 ASF 合规版本(1.6.0 - 1.7.2
- 特性增强简要:
- **多协议监控扩展** - 新增对Ipmi、PLC、NVIDIA、Redfish等关键组件或协议的支持
- **智能告警中心** - 实现多表达式告警、周期性阈值和告警抑制/静默/分发等
- **动态服务发现** - 通过http_sd和Zookeeper/Nacos实现自动任务发现
- **云服务集成** - 告警源集成,支持阿里云SLS、华为云、火山引擎告警源对接
- **AI能力增强** - 集成OpenAI等AI平台
- **存储优化** - 升级支持更强存储性能
- **国际化支持** - 新增日语/繁体中文等多语言界面
- **数据处理增强** - 支持SQL/PromQL表达式语法分析,使用Apache Arrow改造数据流动等
这些版本的持续迭代,充分彰显 HertzBeat 对技术的执着追求和对用户需求的高度重视。每一次版本发布,都是 HertzBeat 成长路上的坚实脚印,为用户带来更强大、更易用的监控体验。
#### **3. 社区发展**
在 Apache 孵化期间,HertzBeat 严格践行 Apache Way
- **平等贡献与权威积累**:所有开发者平等参与,凭借代码贡献、文档完善、问题解答等,逐步积累声誉,获取如代码仓库提交权限。
- **开放透明交流**:平等交流、共同决策,借助邮件列表公开探讨技术选型、版本规划等,交流记录存档可查。成员无论何时何地都能参与,新成员也能借此快速融入。
- **共识导向决策**:面对功能特性增减、技术路线选择等关键决策,社区充分讨论,从多方面权衡。若无法完全统一意见,则投票辅助,保障项目方向契合社区整体利益。
- **贡献者增长**
- 孵化期间新增 **13 位 Committer** 其中提名 **3 位 PPMC 成员** 且贡献者达到275人,同时核心团队覆盖中美欧多时区。
- GitHub **Star 数突破 6K+**,月均活跃开发者达 **30+**
- **用户生态**
- **使用领域**: 自孵化以来,Apache HertzBeat™ 因其轻量、无代理和高度可扩展的特性,已在多个行业场景中成功落地,成为企业监控基础设施的新选择。
- **开发者生态**:社区贡献了大量的监控模板,覆盖 Kubernetes、Docker、Redis、MySQL 等主流技术栈,极大降低了监控配置成本。
## 3、 未来展望和规划
成为Apache顶级项目是一个里程碑,更是一个新的起点。Apache HertzBeat社区将继续秉承Apache基金会的“社区重于代码”理念,围绕以下核心方向持续演进,致力于成为全球领先的开源可观测性平台:
1、AI与智能化能力
- 探索AI在监控数据分析、异常检测和智能告警中的应用
- 集成更多AI模型和服务,提升用户体验
2、提升产品性能与可扩展性
- 持续优化采集调度算法与集群架构,支持更大规模监控场景
- 增强系统稳定性,降低资源消耗,提升数据处理效率
3、完善功能与用户体验
- 简化监控配置流程,提供更直观易用的操作界面
- 完善状态页功能,支持更多自定义选项
4、加强社区建设与国际化
- 扩大社区规模,吸引更多贡献者参与项目开发
- 完善多语言支持,包括文档国际化和界面本地化
## 4、致谢
Apache HertzBeat™ 能够成功从孵化器毕业,离不开所有社区成员与支持者的共同努力。在此,我们谨致以最诚挚的感谢:
- **Apache 基金会 & 孵化器**
感谢 Apache 基金会提供的中立协作平台,完善的孵化流程,以及孵化器成员在项目治理、版本发布和社区建设方面的帮助。
- **衷心感谢 Apache 导师们的无私奉献与悉心指导**
感谢各位导师(致敬 **Yonglun Zhang** 、**Yu Xiao** 、**Justin Mclean** 和 **Francis Chuang** 等导师的指导)在孵化过程中为我们提供的宝贵建议、架构评审和社区治理指导。您们的专业经验和无私帮助,为项目指明了符合 Apache Way 的正确发展方向。
- **衷心感谢所有代码贡献者、文档维护者和社区参与者**
感谢全球数百位贡献者的智慧与付出。无论是代码提交、问题反馈、文档翻译还是社区讨论,你们的每一份努力都是项目前进的重要动力。
- **特别致敬核心贡献者与项目管理委员会成员**
感谢你们长期以来的坚持与奉献,在技术架构演进、社区规范建设和项目推广中发挥了关键作用。
- **感谢所有用户和使用组织的信任与支持**
感谢你们在生产环境的实践验证和持续反馈,这些宝贵经验极大推动了产品的成熟与完善。
最后,我们始终相信:**社区成就非凡**。致敬开源,致敬每一位参与者,让我们的代码跑在全球机器!
欢迎更多开发者加入我们,玩得开心!
—— Apache HertzBeat™ 社区 敬上
@@ -0,0 +1,253 @@
---
title: Apache HertzBeat™ 1.7.3 发布公告
author: LiuTianyou
author_title: LiuTianyou
author_url: https://github.com/LiuTianyou
tags: [opensource, release]
keywords: [open source monitoring system, alerting system, HertzBeat, release]
---
亲爱的社区小伙伴们,
我们很高兴地宣布 Apache HertzBeat™ 1.7.3 版本正式发布,这也是 Apache HertzBeat™ 毕业成为 Apache 顶级项目的第一个版本。
## Downloads and Documentation
- **Apache HertzBeat™ 1.7.3 Download Link**: [https://hertzbeat.apache.org/zh-cn/docs/download](https://hertzbeat.apache.org/zh-cn/docs/download)
- **Apache HertzBeat™ Documentation**: [https://hertzbeat.apache.org/zh-cn/docs/](https://hertzbeat.apache.org/zh-cn/docs/)
## Major Updates
### New Features and Enhancements
- **监控支持扩展**:新增对 Apache DolphinScheduler(#3656)、TDengine(#3678)、macOS 系统(#3715)、Synology NAS(#3721) 、HertzBeat(#3641)的监控支持,Oracle 监控增加用户密码相关监控指标(#3674)。
- **核心功能增强**:支持周期性阈值预览(#3505),支持导出所有监控(#3509),监控模板支持 JSON 嵌套解析(#3645)HTTP 采集支持使用 JsonPath 解析数字类型数据(#3612) VictoriaMetrics 指标支持添加自定义标签(#3622)。
- **国际化 (i18n)**:支持采集器上线通知的国际化(#3585)。
- **更多新功能**
### Bug Fixes
- **Grafana集成问题**:修复 Grafana 集成可视化展示问题。(#3666)。
- **系统稳定性**:修复 VictoriaMetrics 存储未配置时启动报错的问题(#3552),修复 Prometheus 解析中输入流过早关闭的问题(#3567),修复采集器下线时不发送下线通知的问题(#3601)。
- **数据解析问题**:修复 collector 的 AES 密钥解码错误的问题(#3652),修复 JDBC 配置参数失效问题(#3625),修复因 Jexl 关键字冲突导致多个监控模板解析失败的问题(#3629, #3632, #3685, #3686, #3687, #3693, #3705, #3707, #3708)。
- **和其它的BUG修复**
### Refactoring and Optimization
- **性能优化**:优化监控列表页加载性能(#3719),优化批量刷新任务的调度逻辑(#3660)VictoriaMetrics 写入请求启用 Gzip 压缩(#3595)。
- **逻辑重构与改进**:重构告警缓存管理器 (AlarmCacheManager) 的处理逻辑(#3525),重构 Prometheus 标签的解析逻辑和 PromQL 生成逻辑(#3662, #3725),优化告警判断逻辑的比较器(#3574)。
- **UI/UX 优化**:优化状态页面布局和 UI(#3680),优化状态页事件列表(#3727),优化首页导航栏布局(#3616),优化新建监控页面交互效果(#3726),更新 UI 主题。(#3682),优化监控数据图表组件。(#3668)
- **和其它的优化**
### Tests and Quality
- **单元测试覆盖**:为 VictoriaMetrics 数据存储添加单元测试(#3595)。
- **e2e测试**:提升 Kafka 端到端 (e2e) 测试质量(#3520)。
- **测试效率**:实现并行 CI 以加快构建过程(#3523)。
- **和其它的测试**
### Documentation Enhancements
- **国际化文档**:由 @Calvin979 主导,添加了大量监控模板的日语文档 (i18n),覆盖了 HPE Switch, Huawei Switch, Kafka, JVM, Linux, MySQL, Redis, SpringBoot 等数十个监控模板。
- **内容修正与优化**:修复文档中的错误、失效链接和语义问题(#3526, #3559, #3608, #3695)。
- **社区生态**:添加新 committer 和 PMC 成员介绍博客(#3522, #3561, #3563, #3569),更新项目毕业相关的文档和网站(#3584, #3692, #3701, #3729),更新贡献者文档。(#3667)
- **更多的文档更新**
## Acknowledgements
感谢以下社区成员的共同努力:
> @pjfanning @chingjustwe @delei @rowankid @MasamiYui @tomsun28 @Aias00 @zhangshenghang @zqr10159 @LiuTianyou @yy549159265 @lx1229 @VampireAchao
> @cto-huhang @pwallk @bigcyy @sarthakeash @Carpe-Wang @YxYL6125 @tuzuy @lynx009 @Duansg @carlpinto25 @Calvin979 @Cyanty @Saramanda9988
## What's Changed
```markdown
* [release] release new version 1.7.2 by @tomsun28 in #3510
* [doc] japanese hpe switch by @Calvin979 in #3511
* [doc] japanese huawei switch by @Calvin979 in #3515
* [doc] japanese hive by @Calvin979 in #3506
* [doc] japanese hugeGraph by @Calvin979 in #3518
* [feature] Support for Periodic Threshold preview. by @Duansg in #3505
* [Improve] Improve kafka e2e by @zhangshenghang in #3520
* [doc] japanese iceberg by @Calvin979 in #3519
* [fix] Update the correct replacement of outdated functions and placeholders by @Cyanty in #3516
* [doc] japanese influxdb by @Calvin979 in #3521
* [doc] japanese hikvision by @Calvin979 in #3499
* [doc] Add new commiter blog by @MasamiYui in #3522
* [fix] fix i18n error and append two metrics about disk infos by @lx1229 in #3514
* [feat]parallel ci by @Aias00 in #3523
* [doc] japanese influxdb promql by @Calvin979 in #3527
* fix: fix something by @Aias00 in #3524
* [doc] japanese iotdb by @Calvin979 in #3530
* download version deal by @lynx009 in #3531
* [doc] update outdated links by @lynx009 in #3535
* [doc]update download page text by @zqr10159 in #3532
* [doc] japanese ipmi by @Calvin979 in #3537
* [doc] japanese jetty by @Calvin979 in #3539
* enable GitHub Dependabot to create PRs for security alerts but not for every dependency update by @pjfanning in #3543
* [doc] Fix some issues in the documentation by @Duansg in #3526
* [doc] recommend newer mysql connector jar by @pjfanning in #3541
* [doc] add hertzbeat maturity and fix doc by @tomsun28 in #3544
* [doc] update download page by @lynx009 in #3549
* [doc] japanese kafka by @Calvin979 in #3548
* [doc] japanese jvm by @Calvin979 in #3545
* [doc] japanese kafka client by @Calvin979 in #3550
* [feature] Support export all allmonitors by @YxYL6125 in #3509
* feat: Add LogUtil wrapper and optimize logging comments by @Carpe-Wang in #3489
* [refactor] AlarmCacheManager refactoring processing logic by @Duansg in #3525
* [improve] make jackson serialize all field visibility by @tomsun28 in #3551
* [bugfix] fix npe due the victoria insert not config when startup by @tomsun28 in #3552
* [doc] V1.7.2 version blog by @lynx009 in #3558
* [doc] japanese kafka promql by @Calvin979 in #3553
* [doc] Fix documentation error and adjust Chinese semantics by @Duansg in #3559
* [doc] add new pmc and committer by @tomsun28 in #3561
* [doc] japanese kingbase by @Calvin979 in #3562
* [doc] add new committer by @MasamiYui in #3563
* [feat] Add QueryExecutor does not support internationalization. by @Duansg in #3565
* [doc] japanese kubernetes by @Calvin979 in #3568
* [mqtt] refact the MQTT based on the Paho SDK and support both unidirectional and bidirectional MQTT over TLS connections. by @yy549159265 in #3474
* [docs] Add new committer blog by @bigcyy in #3569
* [bugfix] Fix MySQL WrongArgumentException by @pwallk in #3564
* [doc] japanese kvrocks by @Calvin979 in #3570
* [doc] japanese linux by @Calvin979 in #3571
* [fix]: Fix a problem where the inputstream was closed prematurely when parsing Prometheus by @zqr10159 in #3567
* [doc]: add FAQs about task limits by @zqr10159 in #3581
* [infra] upgrade openjdk image to fix Debian source failed by @tomsun28 in #3587
* [feature] Support i18n of collector online notification by @Duansg in #3585
* [doc] add japanese i18n in app-linux_script.yml by @Calvin979 in #3575
* [doc] add japanese i18n in app-mariadb.yml by @Calvin979 in #3577
* [doc] add japanese i18n in app-memcached.yml by @Calvin979 in #3578
* [doc] add japanese i18n in app-modbus.yml by @Calvin979 in #3580
* [feature] System time zone optimization. by @Duansg in #3588
* [doc] add japanese i18n in app-mongodb.yml by @Calvin979 in #3590
* [refactor] Refactor the comparison logic by @Duansg in #3574
* [fix] Fix collector online metadata filling by @Duansg in #3579
* [doc] add japanese i18n in app-mongodb_atlas.yml by @Calvin979 in #3593
* [doc] add japanese i18n in app-mysql.yml by @cto-huhang in #3594
* [doc] add japanese i18n in app-zookeeper.yml and app-zookeeper_sd.yml by @Cyanty in #3596
* [doc] add japanese i18n in app-nginx.yml by @Duansg in #3600
* [doc] add japanese i18n in app-rocketmq.yml and app-rabbitmq.yml by @Saramanda9988 in #3598
* [improve] VM write request sets up gzip compression and adds saveData unit tests by @Cyanty in #3595
* [feat] Auto-generate AES key if not configured by @bigcyy in #3604
* [doc] update japanese i18n in app-mqtt.yml and app-mysql.yml by @Calvin979 in #3597
* [fix] Fix collector offline without sending offline notification by @Duansg in #3601
* [doc] fix image reference issues in documents by @delei in #3608
* [doc] add japanese i18n in app-nacos.yml by @cto-huhang in #3599
* [doc] add japanese i18n in app-nvidia.yml, app-ping.yml, app-pop3.yml, app-port.yml and app-push.yml by @Calvin979 in #3611
* [doc] update japanese i18n in app-nacos_sd.yml, app-nebula_graph.yml, app-zookeeper.yml by @Calvin979 in #3602
* [doc] add japanese i18n in app-nebula_graph_cluster.yml and update japanese of client by @Calvin979 in #3603
* [bugfix] the tagValue may be null in the determineNewLabels method by @delei in #3606
* [doc] add japanese i18n in app-netease_mailbox.yml and app-ntp.yml by @Calvin979 in #3607
* [doc] add japanese i18n in app-oceanbase.yml by @VampireAchao in #3614
* [feat] Http collect supports jsonpath parsing of numeric type by @Duansg in #3612
* [doc] Optimize the home website navbar layout UI for medium-sized screens by @VampireAchao in #3616
* [doc] add japanese i18n in app-opensuse.yml by @Calvin979 in #3619
* [doc] add japanese i18n in app-oracle.yml by @Calvin979 in #3621
* [doc] add japanese i18n in app-postgresql.yml by @Calvin979 in #3624
* [doc] add linux operating system practice usecase by @delei in #3628
* [fix] Fixed springboot3abnormal use of the keyword jexl by @Duansg in #3629
* [Feature] add customized labels to VM metrics by @chingjustwe in #3622
* [fix] Fixed issue where jdbc url was replaced by @Duansg in #3625
* [fix] remove optional metrics by @Duansg in #3636
* [doc] add japanese i18n in app-openai.yml and app-opengauss.yml by @Calvin979 in #3617
* [doc] add japanese i18n in app-smtp.yml, app-ssl_cert.yml, app-storm.yml, app-udp_port.yml, app-uniview.yml, app-website.yml, app-websocket.yml by @Calvin979 in #3643
* [bugfix] fix potential StringIndexOutOfBoundsException by @delei in #3642
* [feat] Monitoring templates support JSON nested parsing. by @Duansg in #3645
* [doc] add English version of linux operating system practice usecase by @delei in #3631
* [bugfix] fixed jexl keyword issue in springboot2 monitoring template by @delei in #3632
* [doc] add japanese i18n in app-qq_mailbox.yml and app-redfish.yml by @Calvin979 in #3635
* [doc] add japanese i18n in app-prometheus.yml, app-pulsar.yml and app-registry.yml by @Calvin979 in #3639
* [doc] add japanese i18n in app-s7.yml, app-tplink_switch.yml, app-shenyu.yml by @Calvin979 in #3648
* [feature] Support HertzBeat self monitor by @zqr10159 in #3641
* [fix] Fixed an issue where template configuration was overwritten by @Duansg in #3649
* [bugfix] fix the collector aes decode with secret error by @tomsun28 in #3652
* [doc] add japanese i18n in app-tidb.yml, app-windows_script.yml by @Calvin979 in #3650
* [doc] add japanese i18n in app-springboot3.yml by @Duansg in #3658
* [doc] improve documentation formatting and readability by @delei in #3659
* [doc] add japanese i18n in app-prestodb.yml, app-spark.yml by @Calvin979 in #3651
* [doc] add japanese i18n in app-process.yml by @Calvin979 in #3654
* [doc] add japanese i18n in app-spring_gateway.yml, app-sqlserver.yml by @Calvin979 in #3661
* [doc] add japanese i18n in app-redhat.yml by @Calvin979 in #3655
* [doc] add japanese i18n and remove chinese in script folder by @Calvin979 in #3665
* [doc] update contribution doc by @tomsun28 in #3667
* [GSOC] MCP server setup, authorization, and basic tool support by @sarthakeash in #3610
* [doc] add japanese i18n in app-redis.yml by @Calvin979 in #3669
* [Feature] add Apache DolphinScheduler monitoring support by @delei in #3656
* [improve] Optimize the scheduling logic for batch flush tasks by @Cyanty in #3660
* [fix] Fixed Grafana visualization integration display issue by @Duansg in #3666
* [feature] add user password monitoring metrics in oracle monitor by @delei in #3674
* [doc] add japanese i18n in app-redis_cluster.yml by @Calvin979 in #3672
* [doc] add japanese i18n in app-dolphinscheduler.yml by @Calvin979 in #3677
* [improve] optimize status page layout and UI by @delei in #3680
* [doc] add japanese i18n in app-redis_sentinel.yml by @Calvin979 in #3681
* [doc] remove all (incubating) by @VampireAchao in #3584
* [bugfix] fixed jexl keyword issue in postgresql monitoring template by @delei in #3685
* [bugfix] fixed jexl keyword issue in hertzbeat monitoring template by @delei in #3686
* [bugfix] fixed jexl keyword issue in windows monitoring template by @delei in #3687
* [bugfix] fixed jexl keyword issue in spring_gateway monitoring template by @delei in #3693
* [doc] update doc while graduate by @tomsun28 in #3692
* [doc] Fixed menu path errors and MD document format anomalies. by @Duansg in #3695
* chore: update ui theme by @tomsun28 in #3682
* [doc] add japanese i18n in app-rockylinux.yml by @Calvin979 in #3688
* [doc] add japanese i18n in app-seatunnel.yml by @Calvin979 in #3691
* [doc] add japanese i18n in app-tomcat.yml by @Calvin979 in #3700
* [refactor] modify message column to TEXT type by @delei in #3698
* [doc] update website, doc while graduate by @tomsun28 in #3701
* [bugfix] resolve translation value fetching for uppercase app names by @rowankid in #3690
* [doc] add japanese i18n in app-vastbase.yml by @Calvin979 in #3704
* [bugfix] fixed jexl keyword issue in kingbase monitoring template by @delei in #3705
* [feat] Support TDengine monitoring by @Duansg in #3678
* [bugfix] fixed jexl keyword issue in greenplum monitoring template by @delei in #3707
* [bugfix] fixed jexl keyword issue in vastbase monitoring template by @delei in #3708
* refactor: Optimize the monitoring data chart component by @tuzuy in #3668
* [improve] Improve the parsing logic of prometheus label by @Duansg in #3662
* [doc] modify github link. by @lynx009 in #3714
* [doc] add japanese i18n in app-ubuntu.yml, app-windows.yml and app-yarn.yml by @Calvin979 in #3703
* [doc] add japanese i18n in app-valkey.yml by @Calvin979 in #3706
* [improve] Improve performance issues when loading large numbers of metric cards in Monitors by @Duansg in #3719
* [doc] add japanese i18n in app-tdengine.yml by @Calvin979 in #3717
* [feature] add macOS monitoring support by @delei in #3715
* [feature] add Synology NAS monitoring support by @delei in #3721
* [improve] Improve Prometheus label PromQL parsing logic by @Duansg in #3725
* [release] release new version 1.7.3 by @LiuTianyou in #3724
* [Improve] changed scroll of intervals in New Monitor page by @carlpinto25 in #3726
* [improve] optimize the incident list on the status page to support paginated queries by @delei in #3727
* docs: update doc and add graduation blog by @tomsun28 in #3729
```
## New Contributors
- @yy549159265 made their first contribution in [https://github.com/apache/hertzbeat/pull/3474](https://github.com/apache/hertzbeat/pull/3474)
- @cto-huhang made their first contribution in [https://github.com/apache/hertzbeat/pull/3594](https://github.com/apache/hertzbeat/pull/3594)
- @Saramanda9988 made their first contribution in [https://github.com/apache/hertzbeat/pull/3598](https://github.com/apache/hertzbeat/pull/3598)
- @delei made their first contribution in [https://github.com/apache/hertzbeat/pull/3608](https://github.com/apache/hertzbeat/pull/3608)
- @chingjustwe made their first contribution in [https://github.com/apache/hertzbeat/pull/3622](https://github.com/apache/hertzbeat/pull/3622)
- @rowankid made their first contribution in [https://github.com/apache/hertzbeat/pull/3690](https://github.com/apache/hertzbeat/pull/3690)
- @tuzuy made their first contribution in [https://github.com/apache/hertzbeat/pull/3668](https://github.com/apache/hertzbeat/pull/3668)
- @carlpinto25 made their first contribution in [https://github.com/apache/hertzbeat/pull/3726](https://github.com/apache/hertzbeat/pull/3726)
## Apache HertzBeat
**仓库地址:**
[https://github.com/apache/hertzbeat](https://github.com/apache/hertzbeat)
**网址:**
[https://hertzbeat.apache.org/](https://hertzbeat.apache.org/)
**Apache HertzBeat™ 下载地址:**
[https://hertzbeat.apache.org/zh-cn/docs/download](https://hertzbeat.apache.org/zh-cn/docs/download)
**Apache HertzBeat™ Docker 镜像版本:**
> Apache HertzBeat™ 为每个版本制作了 Docker 镜像. 你可以从 Docker Hub 拉取使用.
- HertzBeat [https://hub.docker.com/r/apache/hertzbeat](https://hub.docker.com/r/apache/hertzbeat)
- HertzBeat Collector [https://hub.docker.com/r/apache/hertzbeat-collector](https://hub.docker.com/r/apache/hertzbeat-collector)
**Apache HertzBeat™ 开源社区如何参与?**
[https://hertzbeat.apache.org/zh-cn/docs/community/contribution](https://hertzbeat.apache.org/zh-cn/docs/community/contribution)
@@ -0,0 +1,26 @@
---
title: 从初识开源到成为 Apache HertzBeat™ 的 PMC 成员
author: Calvin
author_title: Calvin
author_url: https://github.com/Calvin979
tags: [opensource, practice]
keywords: [open source monitoring system, alerting system]
---
## 个人历程
2023年,一次偶然的机会了解到开源项目HertzBeat,那时候我还只是懵懵懂懂地跟着网上的教程和书籍学习了一些知名开源框架的源码。于是抱着学习的心态,我便尝试着把HertzBeat在本地运行起来,然而很快便遇到了项目无法启动的问题,也正因如此,我提交了第一个PR——修改启动文档。这个PR很快便被合并到master分支中,这也极大地鼓舞了我。自那以后,我便开始深入学习HertzBeat,一开始很难,不知道该如何下手,随着我对它的了解越来越深,便开始逐步拆解它的模块和代码结构。在这期间,我在社区的issue列表中领取了很多task和bug,并提交了对应的PR。从文档、单元测试、前端、后端以及新功能开发,不知不觉中我在这个项目中学习到了很多知识,这些知识不再像是在书本或者博客上介绍一样冷冰冰的,而是活灵活现地呈现在我面前。
一年后,我成为了Committer,这也是我对开源项目做贡献的新阶段。成为Committer后,不仅仅是要维护代码,更重要的是自发地维护好社区的氛围,同时也要帮助新的Contributor,让他们能够更多地参与进来HertzBeat。这也让我认识到,技术不仅仅是关于代码,更是关于协作、分享和共同进步。
如今,我有幸被邀请成为PMC,这不仅是对我过往贡献的肯定,也是让我能继续维护社区发展的动力!在此衷心祝愿Apache HertzBeat能够健康长远的发展下去。
### 给想要参与Apache HertzBeat的开发者
对于想要参与开源项目的同学,希望你们能够认认真真打好基础,培养兴趣。基础是为了让你能够更快地上手一个新项目,而兴趣是驱使你为开源做贡献的动力。
最后,也希望大家能够多多参与到Apache HertzBeat,为我们的社区做出一份贡献。
### 致谢
特别感谢[Tom](https://github.com/tomsun28)以及所有Apache HertzBeat™ 社区小伙伴的支持。
@@ -0,0 +1,96 @@
---
title: 热烈欢迎 HertzBeat 小伙伴新晋社区 Committer!
author: Duansg
author_title: SiGuo Duan
author_url: https://github.com/Duansg
tags: [opensource, practice]
keywords:
[
open source monitoring system,
alerting system,
Apache,
Apache Committer,
HertzBeat,
]
---
> 大家好,非常荣幸收到社区邀请,成为 Apache HertzBeat™ Committer。
## 个人介绍
- **姓名**: 段嗣国
- **Github**: [Duansg](https://github.com/Duansg)
- **邮箱**: [duansg@apache.org](mailto:duansg@apache.org)
- **职位**: 资深开发工程师
- **主要技术方向**: 目前从事于电商行业,主要聚焦在亿级商品中台业务的数据处理及管理的研发领域。
## 初识 Apache HertzBeat
在实际项目中,为了改善现有的监控体系,我们希望对已有指标进行可视化监控与告警。但同时,又不希望引入或兼容过于复杂的监控系统。因此,我开始寻找一款开箱即用、功能全面且易于扩展的监控解决方案,也正是在这个过程中,我逐渐接触并了解了 Apache HertzBeat。
随着不断的调研与调试,我开始深入其源码,并逐步参与到社区的贡献中。如今,关注社区动态、阅读 PR 和讨论问题,已经成为我日常的一部分。
## 开源贡献之路
在正式参与 Apache HertzBeat 项目的贡献过程中,起初最大的挑战是对项目架构的不熟悉,尤其是各模块之间的协作机制。 我通过阅读官方文档、源码以及社区的历史 PR,逐渐梳理清了脉络。与此同时,在 PR Review 的过程中,与社区成员的讨论也让我获得了许多宝贵的建议与新的思路——这些交流带来了巨大的成长。
通过系统地阅读源码与分析历史改动,我逐步深入理解了项目结构,并积极参与代码修复与功能完善。目前,我已在 Apache HertzBeat 项目中提交并合并了多项贡献,包括但不限于:
> [47 commits](https://github.com/apache/hertzbeat/commits?author=Duansg) 23,649 ++ 5,547 --
**Submitted PR (47 commits)**
- 修复:
Prometheus 实时阈值未生效的问题([#3434](https://github.com/apache/hertzbeat/pull/3434))、自定义看板的空指针异常([#3448](https://github.com/apache/hertzbeat/pull/3448))、Jacoco 无法生成测试报告的问题([#3455](https://github.com/apache/hertzbeat/pull/3455))、
页面数量计算错误([#3467](https://github.com/apache/hertzbeat/pull/3467))、ANTLR4 语义解析修复与优化([#3482](https://github.com/apache/hertzbeat/pull/3482)、[#3488](https://github.com/apache/hertzbeat/pull/3488))、收集器启动通知异常([#3579](https://github.com/apache/hertzbeat/pull/3579))、
收集器离线时未发送通知([#3601](https://github.com/apache/hertzbeat/pull/3601))、JEXL 关键字问题修复与补充([#3629](https://github.com/apache/hertzbeat/pull/3629))、JDBC URL 的安全相关处理问题([#3625](https://github.com/apache/hertzbeat/pull/3625))、
监控模板修复([#3636](https://github.com/apache/hertzbeat/pull/3636)、[#3649](https://github.com/apache/hertzbeat/pull/3649))、Server酱白名单优化([#3740](https://github.com/apache/hertzbeat/pull/3740))、Grafana 可视化集成显示问题([#3666](https://github.com/apache/hertzbeat/pull/3666))
- 改进:
Prometheus解析([#3761](https://github.com/apache/hertzbeat/pull/3761)、[#3752](https://github.com/apache/hertzbeat/pull/3752)、[#3745](https://github.com/apache/hertzbeat/pull/3745)、[#3725](https://github.com/apache/hertzbeat/pull/3725)、[#3662](https://github.com/apache/hertzbeat/pull/3662))、指标渲染性能改进[#3719](https://github.com/apache/hertzbeat/pull/3719)、样式改进([#3734](https://github.com/apache/hertzbeat/pull/3734))、SSE异常处理改进([#3775](https://github.com/apache/hertzbeat/pull/3775))、阈值规则操作改进([#3780](https://github.com/apache/hertzbeat/pull/3780))
- 重构:
告警缓存管理([#3525](https://github.com/apache/hertzbeat/pull/3525))、PromQL阈值比较逻辑([#3574](https://github.com/apache/hertzbeat/pull/3574))、Prometheus 标签值 UTF-8支持([#3810](https://github.com/apache/hertzbeat/pull/3810))
- 新功能:
PromQL阈值配置预览([#3505](https://github.com/apache/hertzbeat/pull/3505))、系统时区功能([#3588](https://github.com/apache/hertzbeat/pull/3588))、指标收藏功能([#3735](https://github.com/apache/hertzbeat/pull/3735))
jenkins监控([#3774](https://github.com/apache/hertzbeat/pull/3774))、apollo配置中心监控([#3768](https://github.com/apache/hertzbeat/pull/3768))、TDengine监控([#3678](https://github.com/apache/hertzbeat/pull/3678))
华为云告警集成([#3443](https://github.com/apache/hertzbeat/pull/3443))、阿里云SLS告警集成([#3422](https://github.com/apache/hertzbeat/pull/3422))、指标解析([#3645](https://github.com/apache/hertzbeat/pull/3645)、[#3612](https://github.com/apache/hertzbeat/pull/3612))
国际化相关([#3585](https://github.com/apache/hertzbeat/pull/3585)[#3565](https://github.com/apache/hertzbeat/pull/3565))
- 文档:
文档相关([#3383](https://github.com/apache/hertzbeat/pull/3383)、[#3380](https://github.com/apache/hertzbeat/pull/3380)、[#3526](https://github.com/apache/hertzbeat/pull/3526)、[#3559](https://github.com/apache/hertzbeat/pull/3559)、[#3600](https://github.com/apache/hertzbeat/pull/3600)、[#3658](https://github.com/apache/hertzbeat/pull/3658)、[#3695](https://github.com/apache/hertzbeat/pull/3695))
## 社区参与和成长
通过参与 Apache HertzBeat 的例会与日常贡献,不仅拓宽了个人的技术视野,也学习到如何更高效地在开源项目中协作。与社区成员的沟通与协作,让我更加深刻地体会到开源社区的开放、包容与互助精神。
成为 Committer 意味着肩负更多责任。除了继续完善代码之外,更重要的是在 Review 时保持严谨的态度,给予贡献者建设性的反馈与认可,帮助更多人参与并成长。
## 给开源开发者的建议
开源之路始于兴趣,成长于实践。开源不仅是技术热情的载体,更是一段与社区共同成长的旅程。
对于初次参与开源的开发者来说,勇于尝试是最重要的一步。即使是最小的贡献,也能积累宝贵的经验。
在日常中,多参与社区讨论与代码评审,在交流中不断学习;保持耐心与坚持,每一次遇到的难题与挑战,都是成长的契机。
在 Apache HertzBeat 社区中,实际参与项目的机会很多。多关注 Issue 列表,多沟通交流——总会有人积极回应你的想法,并从你的观点中获得启发,这正是社区的“双向奔赴”。
## 为 Apache HertzBeat 贡献力量
种一棵树最好的时间是十年前,其次是现在。 如果你也想为 Apache HertzBeat 贡献力量,可以从以下几个方向开始:
1. 文档与翻译:改进或翻译项目文档,既能快速熟悉项目,也能帮助更多用户了解项目。
2. 问题修复:浏览项目的 issue,尝试认领并修复一些简单的问题或优化点。
3. 功能扩展:根据兴趣与项目需求,参与新功能的讨论与开发,逐步深入理解项目架构并完善功能。
## 结语
期望 Apache HertzBeat 能够继续秉持开源精神,吸引更多优秀的开发者,共同打造一个技术领先且充满活力的社区。我也将持续为 Apache HertzBeat 贡献一份力量,期待更多开发者加入我们,一起推动项目的发展。
非常感谢社区的伙伴们,感谢你们对每一个 PR 的细致 Review 与耐心指导,希望项目未来影响力越来越大,社区越来越好!
@@ -0,0 +1,51 @@
---
title: 热烈欢迎 HertzBeat 小伙伴新晋社区 Committer!
author: Delei
author_title: ZiQiu Guo
author_url: https://github.com/delei
tags: [opensource, practice]
keywords:
[
open source monitoring system,
alerting system,
Apache,
Apache Committer,
HertzBeat,
]
---
> 大家好,非常荣幸收到社区邀请,成为 Apache HertzBeat™ Committer。
## 个人介绍
自从事工作以来,我一直主要从事后端研发工作,对开源项目有非常大的兴趣。目前主要在一家金融软件公司就职并兼职运维管理工作。
## 初识 Apache HertzBeat
在实际工作中,我们之前一直在使用 Prometheus + Grafana 这一套监控系统。随着所需监控的设备和服务越来越多,由于运维人员有限,对于日常配置和维护工作量的急剧增加,使得我们无法及时处理和响应用户的反馈。此时我们一直想寻找一款轻量级开源监控系统,Apache HertzBeat 开箱即用、功能全面,无需 Agent,兼容 Prometheus,且全面覆盖目前我们使用的各类协议。于是我们内部基于 Docker 快速搭建并投入使用。
我本身就是一名开源爱好者,在实际使用了一段时间后发现了一些小的问题,由于刚好是我擅长的开发语言,于是便开始深入源码,尝试完善代码并贡献给社区。
## 开源贡献之路
我最初开始使用的是标签功能,结果一开始就发现标签维护有 NPE 问题。于是便研究了下源码,初步了解了问题原因。于是我通过官网的指引,提交了 [issue#3605](https://github.com/apache/hertzbeat/issues/3605),并提交了第一个 PR 来修复。虽然是一个很小的改动,但很快就被合并了,这给予了我极大的鼓励。
在接下来更加深入的使用过程中,根据实际监控的设备和场景,我主要增加了一些新的监控服务,比如 [Apache DolphinScheduler](https://github.com/apache/hertzbeat/pull/3656)、[MacOS](https://github.com/apache/hertzbeat/pull/3715)、[Synology NAS](https://github.com/apache/hertzbeat/pull/3721) 等,并和其他社区贡献者一起完善和修复了 `jexl` 关键字问题,也对状态页功能做了进一步的增强等。
## 社区参与和成长
通过参与 Apache HertzBeat 的日常贡献,也学习到如何更高效地在开源项目中协作。与社区成员的沟通与协作,让我更加深刻地体会到 "Apache Way" 的独特魅力和开源精神。
成为 Committer 意味着肩负更多责任。除了继续参与贡献外,更重要的是保持严谨的态度,给予贡献者建设性的反馈与认可,帮助更多人参与社区并在社区中收获成长。
## 给开源开发者的建议
对于初次参与开源的开发者来说,首先请勇于尝试,放下包袱走出第一步。贡献的过程,需要时间,但只要有耐心,就会有成果。
在 Apache HertzBeat 社区中,多沟通交流,社区中很多热情和友善的开源贡献者可以一起开源协作。我们可以先逐步使用和体验功能,并开始尝试贡献。例如文档错别字,错误注释等小的贡献,然后逐步深入理解源码,并尝试修复问题。
## 结语
衷心感谢各位社区伙伴的耐心 Review 和悉心指导。非常有幸在这段时间内,见证了 Apache HertzBeat 成功毕业成为 TLP 项目。
成为 Committer 只是我一个小的里程碑,期望和 Apache HertzBeat 一起继续秉持开源精神,吸引更多优秀的开发者,共同打造一个技术领先且充满活力的社区。
@@ -0,0 +1,50 @@
---
title: 因热爱而贡献开源:如何从用户成长为 Apache HertzBeat™ 的 PPMC 成员
author: liutianyou
author_title: liutianyou
author_url: https://github.com/Liutianyou
tags: [opensource, practice]
keywords: [open source monitoring system, alerting system]
---
## 从 Contributor 到 PMC
一年多前,偶然了解到开源项目 Apache HertzBeat,不需要agent,纯界面操作,开箱即用的特性立刻吸引了我。我开始使用这个项目,并尝试向这个项目贡献代码,当第一个 PR 被社区接受并合入 master 分支,我对贡献开源的信心大增。从此,文档优化、功能测试、代码重构...我在社区 issue 列表中不断寻找能贡献力量的机会。
随着贡献的增多,我逐渐从“偶尔提交代码”变成了“深度参与项目”。修复 Bug、优化文档、设计新功能……在这个过程中,我不仅提升了技术能力,更重要的是学会了如何与社区协作。
成为 Committer 后,除了代码,还需要参与社区讨论、review其他贡献者的PR、帮助新成员融入。这段经历让我深刻体会到:**开源不仅仅是写代码,更是关于人与人的协作**。
今年,我有幸被提名为 PPMC 成员。和一年前收到成为 Committer 的邀请时一样,内心依旧无比激动。我深知这不仅是对我过往贡献的认可,更承载着社区的信任与期待。作为 PMC,我的职责是确保项目健康发展,包括制定战略规划、组织社区活动以及协调需求评审。这一身份让我得以更深度地参与项目的核心决策,从技术方向到生态建设,全方位推动 HertzBeat 的持续演进。
### 个人成长
深度参与开源的这一年多,我也收获了很多:
- **学习优秀开发实践**:接触到了规范的代码和优秀的设计以及开源社区对各种工具(Git,CI/CD,e2e)使用的优秀实践;
- **协作与沟通**:在分布式团队中学习如何撰写清晰的Issue描述、参与技术讨论、处理分歧;
- **产品思维训练**:理解开源项目的用户需求,培养从开发者视角到维护者视角的转变。
### 未来
对于未来,除了代码,需求之外,我还计划在下列方面投入更多时间:
- **用户支持**:协助用户解决在使用中的问题;
- **技术推广**:让更多的人了解并开始使用Apache HertzBeat,让 Apache HertzBeat™ 成为监控领域的重要选择之一;
- **贡献者生态**:帮助和发展更多的贡献者参与 Apache HertzBeat。
### 什么是Apache HertzBeat
Apache HertzBeat(简称 HertzBeat)是一个开源的实时监控系统,专注于易用性和轻量级设计,支持对服务器、数据库、中间件、应用服务等资源的监控和告警,旨在提供一种简单而强大的方式来监控 IT 基础设施。
### 如何参与HertzBeat
欢迎大家为Apache HertzBeat™ 贡献代码,文档,想法。参与开源的经历给我的感受是,参与开源最难的部分是开始和坚持。如果大家有兴趣可以访问 [https://hertzbeat.apache.org/zh-cn/docs/community/contribution](https://hertzbeat.apache.org/zh-cn/docs/community/contribution) 跟着文档开始开源的第一步,也欢迎大家发邮件给我 [liutianyou@apache.org](mailto:liutianyou@apache.org),我非常乐意在大家迈出开源第一步上提供更多的帮助。
- 官方网站: [https://hertzbeat.apache.org](https://hertzbeat.apache.org)
- GitHub: [https://github.com/apache/hertzbeat](https://github.com/apache/hertzbeat)
- 邮件列表: [dev@hertzbeat.apache.org](mailto:dev@hertzbeat.apache.org)
### 致谢
特别感谢**Tom**,**Qingran Zhao**,**TJxiaobao**,**Jast** 指导, 以及所有Apache HertzBeat™ 社区小伙伴的支持。
@@ -0,0 +1,207 @@
---
title: Apache HertzBeat™ 1.8.0 版本发布公告
author: Apache HertzBeat Community
author_title: Apache HertzBeat 社区
author_url: https://github.com/apache/hertzbeat
tags: [开源, 发布, v1.8.0]
keywords: [开源监控系统, 告警系统, HertzBeat, 发布, v1.8.0, Apache]
---
亲爱的社区成员们,
我们激动地宣布 Apache HertzBeat™ 1.8.0 正式发布!这个重要版本带来了重大增强,包括 AI 驱动功能、扩展的监控能力、性能改进和更强大的社区贡献。
## 下载和文档
- **Apache HertzBeat™ 1.8.0 下载链接**: [https://hertzbeat.apache.org/zh-cn/docs/download](https://hertzbeat.apache.org/zh-cn/docs/download)
- **Apache HertzBeat™ 文档**: [https://hertzbeat.apache.org/zh-cn/docs/](https://hertzbeat.apache.org/zh-cn/docs/)
- **发布说明**: [https://github.com/apache/hertzbeat/releases/tag/1.8.0](https://github.com/apache/hertzbeat/releases/tag/1.8.0)
## 🚀 主要更新
### 新功能和增强
#### AI 驱动监控和聊天界面
- **GSOC 聊天界面**: 实现了全面的聊天界面,支持对话管理和 OpenAI 聊天客户端 (#3679)
- **跨服务工具**: 为所有监控服务添加了必要的 AI 驱动工具 (#3722)
- **MCP 服务器**: 实现模型上下文协议服务器,安全运行脚本和命令 (#3547)
#### 扩展监控支持
- **QuestDB 集成**: 添加 QuestDB 作为时序数据库存储选项 (#3731)
- **Dell iDRAC 监控**: 为 Dell iDRAC 服务器监控添加配置文件 (#3763)
- **Apollo 配置中心**: 添加 Apollo 配置中心监控支持 (#3768)
- **Jenkins 监控**: 添加全面的 Jenkins 监控功能 (#3774)
- **DNS 记录类型**: 增强 DNS 监控,支持更多记录类型 (#3799)
#### 增强用户体验
- **仪表板优化**: 完全重新设计仪表板页面,适配新主题 (#3730)
- **指标收藏**: 添加监控中心指标收藏功能,快速访问 (#3735)
- **标签选择器组件**: 实现优化的标签选择器组件,改善标签管理 (#3762)
- **RISC-V 支持**: 添加 RISC-V 架构支持,修改 Dockerfile (#3713)
#### 日志监控能力
- **OSPP 日志监控**: 实现全面的日志监控功能,支持高级解析和告警 (#3673)
### 性能改进
#### Prometheus 集成
- **流式解析**: 增强 Prometheus 流式解析,支持 CRLF (#3745)
- **解析优化**: 多轮 Prometheus 流式解析优化 (#3752, #3761)
- **Gretimedb 优化**: 优化 Gretimedb 时序统计 (#3776)
#### 系统性能
- **SSE 异常处理**: 改进服务器发送事件异常处理 (#3775)
- **阈值规则**: 增强阈值规则操作和表达式日志输出 (#3780)
- **查询参数处理**: 修复搜索参数为浮点数时的 Long.parseLong() 错误 (#3483)
### 错误修复和稳定性
#### 核心系统修复
- **默认路径白名单**: 修复默认路径不匹配白名单的问题 (#3740)
- **Webhook URL 参数**: 修复缺失的 Webhook URL 查询参数 (#3779)
- **服务发现**: 修复服务发现主机字段 NullPointerException (#3767)
- **数据库迁移**: 移除 v174 并添加 v180 Flyway 脚本 (#3787)
#### 配置和部署
- **AI 配置同步**: 修复 Docker Compose 的 AI 相关配置同步 (#3751)
- **CNCF 链接更新**: 更新 CNCF 链接到当前位置 (#3746)
### 文档和国际化
#### 增强文档
- **RISC-V 文档**: 添加 RISC-V 相关帮助文档 (#3712)
- **日语国际化**: 为 iDRAC 监控添加日语国际化支持 (#3766)
- **发布文档**: 更新发布流程文档,添加 1.7.3 发布说明 (#3749)
- **贡献者更新**: 定期更新贡献者文档 (#3759, #3783)
#### UI/UX 改进
- **样式问题**: 解决应用程序中的各种样式问题 (#3734)
- **Apache 品牌标识**: 替换为新的 ASF 品牌标识 (#3770)
- **本地化**: 改进 en-US.json 的本地化 (#3800)
## 🌟 社区成长
### 新贡献者
我们激动地欢迎 16 位新贡献者加入 Apache HertzBeat 社区:
- @cxhello
- @yexuanyang
- @mengnankkkk
- @jl15988
- @dedyks
- @pentium100
- @AlbertYang0801
- @warrobe
- @Jetiaime
- @P-Peaceful
- @zhaoyangplus
- @KOYR
- @Lathika226
- @Sahil-Shadwal
- @Prakash1185
- @BhanuNidumolu
### 项目贡献
- **GSOC (谷歌编程之夏)**: 在聊天界面和 AI 功能方面做出重大贡献
- **OSPP (开源软件供应链点亮计划)**: 在 RISC-V 支持、MCP 服务器和日志监控方面做出重大贡献
## 📊 统计数据
本版本包括:
- **40+ 个拉取请求** 合并
- **16 位新贡献者** 加入社区
- **5 个主要功能** 添加
- **20+ 个错误修复** 解决
- **多个性能改进**
## 🔄 升级说明
### 从 v1.7.x 升级到 v1.8.0
#### Docker 部署
```bash
# 停止现有容器
docker stop hertzbeat
# 删除旧容器
docker rm hertzbeat
# 拉取新版本
docker pull apache/hertzbeat:1.8.0
# 运行新容器
docker run -d -p 1157:1157 -p 1158:1158 --name hertzbeat apache/hertzbeat:1.8.0
```
#### 包部署
1. 从 [下载页面](https://hertzbeat.apache.org/zh-cn/docs/download) 下载 v1.8.0 包
2. 备份现有配置
3. 解压新包并替换安装
4. 如需要,更新配置
5. 重启 HertzBeat 服务
#### Kubernetes/Helm 部署
更新 Helm 图表使用新版本:
```yaml
image:
tag: "1.8.0"
```
## 🚨 重要说明
- **数据库迁移**: 本版本包括数据库架构更改。升级前确保正确备份
- **配置更改**: 某些 AI 相关配置可能需要更新
- **破坏性更改**: 查看变更日志了解可能影响部署的破坏性更改
## 🔮 未来展望
Apache HertzBeat 社区已经在开发未来版本,包括:
- 增强的 AI 功能
- 更多监控集成
- 性能优化
- 改进用户体验
## 🙏 致谢
我们向所有使此版本成为可能的贡献者表示衷心感谢:
- 提交拉取请求的所有代码贡献者
- 报告问题和提供反馈的社区成员
- 文档编写者和翻译者
- 帮助确保质量的测试者
- Apache 软件基金会的持续支持
## 📞 参与方式
- **GitHub**: [https://github.com/apache/hertzbeat](https://github.com/apache/hertzbeat)
- **邮件列表**: [https://hertzbeat.apache.org/docs/community/mailing_lists](https://hertzbeat.apache.org/docs/community/mailing_lists)
- **Discord**: [https://discord.gg/Fb6M73htGr](https://discord.gg/Fb6M73htGr)
- **文档**: [https://hertzbeat.apache.org/docs/](https://hertzbeat.apache.org/docs/)
## 📋 完整变更日志
完整的变更列表请参考 [完整变更日志](https://github.com/apache/hertzbeat/compare/v1.7.3...1.8.0)。
---
**立即下载 Apache HertzBeat™ 1.8.0,体验 AI 驱动监控的力量!**
*Apache HertzBeat、Apache 羽毛徽标和 HertzBeat 名称是 The Apache Software Foundation 的商标。*
@@ -0,0 +1,14 @@
{
"title": {
"message": "博客",
"description": "The title for the blog used in SEO"
},
"description": {
"message": "博客文章",
"description": "The description for the blog used in SEO"
},
"sidebar.title": {
"message": "近期更新文章",
"description": "The label for the left sidebar"
}
}
@@ -0,0 +1,186 @@
{
"version.label": {
"message": "dev",
"description": "The label for version current"
},
"sidebar.docs.category.quickstart": {
"message": "快速开始",
"description": "The label for category quickstart in sidebar docs"
},
"sidebar.docs.category.custom": {
"message": "自定义监控",
"description": "The label for category custom in sidebar docs"
},
"sidebar.docs.category.http": {
"message": "HTTP协议",
"description": "The label for category http in sidebar docs"
},
"sidebar.docs.category.jdbc": {
"message": "JDBC协议",
"description": "The label for category jdbc in sidebar docs"
},
"sidebar.docs.category.ssh": {
"message": "SSH协议",
"description": "The label for category ssh in sidebar docs"
},
"sidebar.docs.category.telnet": {
"message": "TELNET协议",
"description": "The label for category telnet in sidebar docs"
},
"sidebar.docs.category.guides": {
"message": "使用指南",
"description": "The label for category guides in sidebar docs"
},
"sidebar.docs.category.service": {
"message": "应用服务监控",
"description": "The label for category service in sidebar docs"
},
"sidebar.docs.category.database": {
"message": "数据库监控",
"description": "The label for category database in sidebar docs"
},
"sidebar.docs.category.os": {
"message": "操作系统监控",
"description": "The label for category os in sidebar docs"
},
"sidebar.docs.category.server": {
"message": "服务器监控",
"description": "The label for category server in sidebar docs"
},
"sidebar.docs.category.mid": {
"message": "中间件监控",
"description": "The label for category mid in sidebar docs"
},
"sidebar.docs.category.alert": {
"message": "阈值告警",
"description": "The label for category alert in sidebar docs"
},
"sidebar.docs.category.notice": {
"message": "消息通知",
"description": "The label for category notice in sidebar docs"
},
"sidebar.docs.category.service-discovery": {
"message": "服务发现",
"description": "The label for category service-discovery in sidebar docs"
},
"sidebar.docs.category.Others": {
"message": "其它",
"description": "The label for category Others in sidebar docs"
},
"sidebar.docs.category.cloud-native": {
"message": "云原生监控",
"description": "The label for category cloud-native in sidebar docs"
},
"sidebar.docs.link.Install via HuaweiCloud": {
"message": "华为云方式部署",
"description": "The label for link Install via HuaweiCloud in sidebar docs, linking to https://marketplace.huaweicloud.com/contents/0477015c-ad63-4522-a308-816861769f0a#productid=OFFI863735781612109824"
},
"sidebar.docs.category.jmx": {
"message": "JMX协议",
"description": "The label for category jmx in sidebar docs"
},
"sidebar.docs.category.snmp": {
"message": "SNMP协议",
"description": "The label for category snmp in sidebar docs"
},
"sidebar.docs.link.Install via Helm": {
"message": "Helm方式安装",
"description": "The label for link Install via Helm in sidebar docs, linking to https://artifacthub.io/packages/helm/hertzbeat/hertzbeat"
},
"sidebar.docs.category.push": {
"message": "Push",
"description": "The label for category push in sidebar docs"
},
"sidebar.docs.category.program": {
"message": "应用程序监控",
"description": "The label for category program in sidebar docs"
},
"sidebar.docs.category.cache": {
"message": "缓存监控",
"description": "The label for category cache in sidebar docs"
},
"sidebar.docs.category.bigdata": {
"message": "大数据监控",
"description": "The label for category bigdata in sidebar docs"
},
"sidebar.docs.category.webserver": {
"message": "Web服务器监控",
"description": "The label for category webserver in sidebar docs"
},
"sidebar.docs.category.Community": {
"message": "社区",
"description": "The label for category Community in sidebar docs"
},
"sidebar.docs.category.contribution": {
"message": "贡献指南",
"description": "The label for category contribution in sidebar docs"
},
"sidebar.docs.category.submit": {
"message": "提交指南",
"description": "The label for category submit in sidebar docs"
},
"sidebar.docs.category.release": {
"message": "发布指南",
"description": "The label for category release in sidebar docs"
},
"sidebar.docs.category.network": {
"message": "网络监控",
"description": "The label for category network in sidebar docs"
},
"sidebar.docs.category.NGQL": {
"message": "NGQL",
"description": "The label for category NGQL in sidebar docs"
},
"sidebar.docs.category.llm": {
"message": "AI大模型监控",
"description": "The label for category llm in sidebar docs"
},
"sidebar.docs.category.aiConfig": {
"message": "AI大模型配置",
"description": "The label for category aiConfig in sidebar docs"
},
"sidebar.docs.category.install": {
"message": "安装",
"description": "The label for category install in sidebar docs"
},
"sidebar.docs.category.upgrade": {
"message": "升级",
"description": "The label for category upgrade in sidebar docs"
},
"sidebar.docs.category.setting": {
"message": "配置",
"description": "The label for category setting in sidebar docs"
},
"sidebar.docs.category.change-db": {
"message": "数据库切换",
"description": "The label for category change-db in sidebar docs"
},
"sidebar.docs.category.use-case": {
"message": "使用案例",
"description": "The label for category use-case in sidebar docs"
},
"sidebar.docs.category.extern-deploy": {
"message": "集成平台部署",
"description": "The label for category extern-deploy in sidebar docs"
},
"sidebar.docs.category.quickstart-use-case": {
"message": "使用案例",
"description": "The label for category quickstart-use-case in sidebar docs"
},
"sidebar.docs.category.guides-use-case": {
"message": "使用案例",
"description": "The label for category guides-use-case in sidebar docs"
},
"sidebar.docs.category.help-custom": {
"message": "自定义监控",
"description": "The label for category help-custom in sidebar docs"
},
"sidebar.docs.category.advanced-custom": {
"message": "自定义监控",
"description": "The label for category advanced-custom in sidebar docs"
},
"sidebar.docs.category.log": {
"message": "日志监控 (Beta)",
"description": "The label for category log in sidebar docs"
}
}
@@ -0,0 +1,285 @@
---
id: extend-http-default
title: HTTP协议系统默认解析方式
sidebar_label: 系统默认解析方式
---
> HTTP接口调用获取响应数据后,用 Apache HertzBeat™ 默认的解析方式去解析响应数据。
**此需接口响应数据结构符合HertzBeat指定的数据结构规则**
## HertzBeat数据格式规范
注意⚠️ 响应数据为JSON
单层格式:key-value
```json
{
"metricName1": "metricValue",
"metricName2": "metricValue",
"metricName3": "metricValue",
"metricName4": "metricValue"
}
```
多层格式:数组里面套key-value
```json
[
{
"metricName1": "metricValue",
"metricName2": "metricValue",
"metricName3": "metricValue",
"metricName4": "metricValue"
},
{
"metricName1": "metricValue",
"metricName2": "metricValue",
"metricName3": "metricValue",
"metricName4": "metricValue"
}
]
```
样例:
查询自定义系统的CPU信息,其暴露接口为 `/metrics/cpu`,我们需要其中的`hostname,core,usage`指标
若只有一台虚拟机,其单层格式为:
```json
{
"hostname": "linux-1",
"core": 1,
"usage": 78.0,
"allTime": 200,
"runningTime": 100
}
```
若有多台虚拟机,其多层格式为:
```json
[
{
"hostname": "linux-1",
"core": 1,
"usage": 78.0,
"allTime": 200,
"runningTime": 100
},
{
"hostname": "linux-2",
"core": 3,
"usage": 78.0,
"allTime": 566,
"runningTime": 34
},
{
"hostname": "linux-3",
"core": 4,
"usage": 38.0,
"allTime": 500,
"runningTime": 20
}
]
```
**对应的监控模板YML可以配置为如下**
```yaml
category: custom
# The monitoring type eg: linux windows tomcat mysql aws...
app: a_example
# The monitoring i18n name
name:
zh-CN: 模拟应用
en-US: EXAMPLE APP
# The description and help of this monitoring type
help:
zh-CN: HertzBeat 支持自定义监控,您只需配置监控模板 YML 就能适配一款自定义的监控类型。`<br>`定义流程如下:HertzBeat 页面 -> 监控模板菜单 -> 新增监控类型 -> 配置自定义监控模板YML -> 点击保存应用 -> 使用新监控类型添加监控。
en-US: "HertzBeat supports custom monitoring, and you only need to configure the monitoring template YML to adapt to a custom monitoring type. `<br>`Definition process as follow: HertzBeat Pages -> Main Menu -> Monitor Template -> edit and save -> apply this template."
zh-TW: HertzBeat支持自定義監控,您只需配寘監控模板YML就能適配一款自定義的監控類型。`<br>`定義流程如下:HertzBeat頁面->監控模板選單->新增監控類型->配寘自定義監控模板YML ->點擊保存應用->使用新監控類型添加監控。
helpLink:
zh-CN: https://hertzbeat.apache.org/zh-cn/docs/advanced/extend-point/
en-US: https://hertzbeat.apache.org/docs/advanced/extend-point/
# Input params define for monitoring(render web ui by the definition)
params:
# field-param field key
- field: host
# name-param field display i18n name
name:
zh-CN: 目标Host
en-US: Target Host
# type-param field type(most mapping the html input type)
type: host
# required-true or false
required: true
# field-param field key
- field: port
# name-param field display i18n name
name:
zh-CN: 端口
en-US: Port
# type-param field type(most mapping the html input type)
type: number
# when type is number, range is required
range: '[0,65535]'
# required-true or false
required: true
# default value
defaultValue: 80
# param field input placeholder
placeholder: 'Please Input Port'
# field-param field key
- field: username
# name-param field display i18n name
name:
zh-CN: 用户名
en-US: Username
# type-param field type(most mapping the html input type)
type: text
# when type is text, use limit to limit string length
limit: 50
# required-true or false
required: false
# hide param-true or false
hide: true
# field-param field key
- field: password
# name-param field display i18n name
name:
zh-CN: 用户密码
en-US: Password
# type-param field type(most mapping the html input tag)
type: password
# required-true or false
required: false
# hide param-true or false
hide: true
# field-param field key
- field: ssl
# name-param field display i18n name
name:
zh-CN: 启动SSL
en-US: SSL
# type-param field type(boolean mapping the html switch tag)
type: boolean
# required-true or false
required: false
# field-param field key
- field: method
# name-param field display i18n name
name:
zh-CN: 请求方式
en-US: Method
# type-param field type(radio mapping the html radio tag)
type: radio
# required-true or false
required: true
# when type is radio checkbox, use option to show optional values {name1:value1,name2:value2}
options:
- label: GET
value: GET
- label: POST
value: POST
- label: PUT
value: PUT
- label: DELETE
value: DELETE
# field-param field key
- field: headers
# name-param field display i18n name
name:
zh-CN: 请求Headers
en-US: Headers
# type-param field type(key-value mapping the html key-value input tags)
type: key-value
# required-true or false
required: false
# when type is key-value, use keyAlias to config key alias name
keyAlias: Header Name
# when type is key-value, use valueAlias to config value alias name
valueAlias: Header Value
# collect metrics config list
metrics:
# metrics - cpu
- name: cpu
# metrics name i18n label
i18n:
zh-CN: CPU 信息
en-US: CPU Info
# metrics scheduling priority(0->127)->(high->low), metrics with the same priority will be scheduled in parallel
# priority 0's metrics is availability metrics, it will be scheduled first, only availability metrics collect success will the scheduling continue
priority: 0
# collect metrics content
fields:
# field-metric name, i18n-metric name i18n label, type-metric type(0-number,1-string), unit-metric unit('%','ms','MB'), label-whether it is a metrics label field
- field: hostname
type: 1
label: true
i18n:
zh-CN: 主机名称
en-US: Host Name
- field: usage
type: 0
unit: '%'
i18n:
zh-CN: 使用率
en-US: Usage
- field: cores
type: 0
i18n:
zh-CN: 核数
en-US: Cores
- field: waitTime
type: 0
unit: s
i18n:
zh-CN: 主机名称
en-US: Host Name
# (optional)metrics field alias name, it is used as an alias field to map and convert the collected data and metrics field
aliasFields:
- hostname
- core1
- core2
- usage
- allTime
- runningTime
# mapping and conversion expressions, use these and aliasField above to calculate metrics value
# eg: cores=core1+core2, usage=usage, waitTime=allTime-runningTime
calculates:
- hostname=hostname
- cores=core1+core2
- usage=usage
- waitTime=allTime-runningTime
# the protocol used for monitoring, eg: sql, ssh, http, telnet, wmi, snmp, sdk
protocol: http
# the config content when protocol is http
http:
# http host: ipv4 ipv6 domain
host: ^_^host^_^
# http port
port: ^_^port^_^
# http url
url: /metrics/cpu
# http method: GET POST PUT DELETE PATCH
method: GET
# if enabled https
ssl: false
# http request header content
headers:
^_^headers^_^: ^_^headers^_^
# http request params
params:
param1: param1
param2: param2
# http auth
authorization:
# http auth type: Basic Auth, Digest Auth, Bearer Token
type: Basic Auth
basicAuthUsername: ^_^username^_^
basicAuthPassword: ^_^password^_^
# http response data parse type: default-hertzbeat rule, jsonpath-jsonpath script, website-for website monitoring, prometheus-prometheus exporter rule
parseType: jsonPath
parseScript: '$'
```
@@ -0,0 +1,217 @@
---
id: extend-http-example-hertzbeat
title: 教程一:适配一款基于HTTP协议的监控类型
sidebar_label: 教程一:适配一款HTTP协议监控
---
通过此教程我们一步一步描述如何在 Apache HertzBeat™ 监控系统下新增适配一款基于http协议的监控类型。
阅读此教程前我们希望您已经从[自定义监控](extend-point)和[http协议自定义](extend-http)了解熟悉了怎么自定义类型,指标,协议等。
## HTTP协议解析通用响应结构体,获取指标数据
>
> 很多场景我们需要对提供的 HTTP API 接口进行监控,获取接口返回的指标值。这篇文章我们通过http自定义协议来解析我们常见的http接口响应结构,获取返回体中的字段作为指标数据。
```json
{
"code": 200,
"msg": "success",
"data": {}
}
```
如上,通常我们的后台API接口会设计这这样一个通用返回。hertzbeat系统的后台也是如此,我们今天就用hertzbeat的 API 做样例,新增适配一款新的监控类型 **hertzbeat**,监控采集它的系统摘要统计API
`http://localhost:1157/api/summary`, 其响应数据为:
```json
{
"msg": null,
"code": 0,
"data": {
"apps": [
{
"category": "service",
"app": "jvm",
"status": 0,
"size": 2,
"availableSize": 0,
"unManageSize": 2,
"unAvailableSize": 0,
"unReachableSize": 0
},
{
"category": "service",
"app": "website",
"status": 0,
"size": 2,
"availableSize": 0,
"unManageSize": 2,
"unAvailableSize": 0,
"unReachableSize": 0
}
]
}
}
```
**我们这次获取其app下的 `category`,`app`,`status`,`size`,`availableSize`等指标数据。**
### 新增自定义监控模板YML
**HertzBeat页面** -> **监控模板菜单** -> **新增监控类型** -> **配置自定义监控模板YML** -> **点击保存应用** -> **使用新监控类型添加监控**
> 监控模板YML用于定义 *监控类型的名称(国际化), 请求参数结构定义(前端页面根据配置自动渲染UI), 采集指标信息, 采集协议配置* 等。
> 即我们通过自定义这个监控模板,配置定义什么监控类型,前端页面需要输入什么参数,采集哪些性能指标,通过什么协议去采集。
样例:自定义一个名称为`hertzbeat`的自定义监控类型,其使用HTTP协议采集指标数据。
```yaml
category: custom
# The monitoring type eg: linux windows tomcat mysql aws...
app: hertzbeat
name:
zh-CN: HertzBeat
en-US: HertzBeat
# The description and help of this monitoring type
help:
zh-CN: HertzBeat 对 HertzBeat 监控系统的通用指标进行测量监控。`<br>`您可以点击 “`<i>`新建 HertzBeat监控系统`</i>`” 并进行配置,或者选择“`<i>`更多操作`</i>`”,导入已有配置。
en-US: HertzBeat monitors HertzBeat Monitor through general performance metric. You could click the "`<i>`New HertzBeat Monitor`</i>`" button and proceed with the configuration or import an existing setup through the "`<i>`More Actions`</i>`" menu.
zh-TW: HertzBeat對HertzBeat監控系統的通用名額進行量測監控。`<br>`您可以點擊“`<i>`新建HertzBeat監控系統`</i>`”並進行配寘,或者選擇“`<i>`更多操作`</i>`”,導入已有配寘。
helpLink:
zh-CN: https://hertzbeat.apache.org/zh-cn/docs/help/hertzbeat
en-US: https://hertzbeat.apache.org/docs/help/hertzbeat
params:
- field: host
name:
zh-CN: 目标Host
en-US: Target Host
type: host
required: true
- field: port
name:
zh-CN: 端口
en-US: Port
type: number
range: '[0,65535]'
required: true
defaultValue: 1157
- field: ssl
name:
zh-CN: 启用HTTPS
en-US: HTTPS
type: boolean
required: true
- field: timeout
name:
zh-CN: 超时时间(ms)
en-US: Timeout(ms)
type: number
required: false
hide: true
- field: authType
name:
zh-CN: 认证方式
en-US: Auth Type
type: radio
required: false
hide: true
options:
- label: Basic Auth
value: Basic Auth
- label: Digest Auth
value: Digest Auth
- field: username
name:
zh-CN: 用户名
en-US: Username
type: text
limit: 50
required: false
hide: true
- field: password
name:
zh-CN: 密码
en-US: Password
type: password
required: false
hide: true
metrics:
# the first metrics summary
# attention: Built-in monitoring metrics contains (responseTime - Response time)
- name: summary
# metrics scheduling priority(0->127)->(high->low), metrics with the same priority will be scheduled in parallel
# priority 0's metrics is availability metrics, it will be scheduled first, only availability metrics collect success will the scheduling continue
priority: 0
# collect metrics content
fields:
# metrics content contains field-metric name, type-metric type:0-number,1-string, instance-if is metrics, unit-metric unit('%','ms','MB')
- field: app
type: 1
label: true
- field: category
type: 1
- field: status
type: 0
- field: size
type: 0
- field: availableSize
type: 0
# the protocol used for monitoring, eg: sql, ssh, http, telnet, wmi, snmp, sdk, we use HTTP protocol here
protocol: http
# the config content when protocol is http
http:
# host: ipv4 ipv6 domain
host: ^_^host^_^
# http port
port: ^_^port^_^
# http url, we don't need to enter a parameter here, just set the fixed value to /api/summary
url: /api/summary
timeout: ^_^timeout^_^
# http method: GET POST PUT DELETE PATCH, default fixed value is GET
method: GET
# if enabled https, default value is false
ssl: ^_^ssl^_^
# http auth
authorization:
# http auth type: Basic Auth, Digest Auth, Bearer Token
type: ^_^authType^_^
basicAuthUsername: ^_^username^_^
basicAuthPassword: ^_^password^_^
digestAuthUsername: ^_^username^_^
digestAuthPassword: ^_^password^_^
# http response data parse type: default-hertzbeat rule, jsonpath-jsonpath script, website-for website monitoring, we use jsonpath to parse response data here
parseType: jsonPath
parseScript: '$.data.apps.*'
```
**新增完毕,现在我们重启hertzbeat系统。我们可以看到系统页面已经多了一个`hertzbeat`监控类型了。**
![HertzBeat](/img/docs/advanced/extend-http-example-1.png)
### 系统页面添加对`hertzbeat`监控类型的监控
> 我们点击新增 `HertzBeat监控系统`,配置监控IP,端口,采集周期,高级设置里的账户密码等, 点击确定添加监控。
![HertzBeat](/img/docs/advanced/extend-http-example-2.png)
![HertzBeat](/img/docs/advanced/extend-http-example-3.png)
> 过一定时间(取决于采集周期)我们就可以在监控详情看到具体的指标数据和历史图表啦!
![HertzBeat](/img/docs/advanced/extend-http-example-4.png)
### 设置阈值告警通知
> 接下来我们就可以正常的设置阈值,告警触发后可以在告警中心查看,也可以新增接收人,设置告警通知等,Have Fun!!!
----
#### 完
HTTP协议的自定义监控的实践就到这里,HTTP协议还带其他参数headers,params等,我们可以像用postman一样去定义它,可玩性也非常高!
如果您觉得hertzbeat这个开源项目不错的话欢迎给我们在GitHub Gitee star哦,灰常感谢。感谢老铁们的支持。笔芯!
**github: [https://github.com/apache/hertzbeat](https://github.com/apache/hertzbeat)**
@@ -0,0 +1,400 @@
---
id: extend-http-example-token
title: 教程二:基于HTTP协议获取TOKEN指标值,给后续采集认证使用
sidebar_label: 教程二:获取TOKEN后续认证使用
---
通过此教程我们一步一步描述如何在教程一的基础上改造,新增一个监控指标,先调用认证接口获取TOKEN后,使用TOKEN作为参数供后面的监控指标采集认证使用。
阅读此教程前我们希望您已经从[自定义监控](extend-point)和[http协议自定义](extend-http)了解熟悉了怎么自定义类型,指标,协议等。
## 请求流程
【**认证信息监控指标(优先级最高)**】【**HTTP接口携带账户密码调用**】->【**响应数据解析**】->【**解析签发TOKEN-accessToken作为指标**】->【**将accessToken作为变量参数赋值给其他采集监控指标**】
> 这里我们依然用教程一的hertzbeat监控举例!hertzbeat后台接口不仅仅支持教程一使用的basic直接账户密码认证,也支持token认证。
**我们需要`POST`调用登录接口`/api/account/auth/form`获取`accessToken`,请求body(json格式)如下**:
```json
{
"credential": "hertzbeat",
"identifier": "admin"
}
```
**响应结构数据如下**:
```json
{
"data": {
"token": "xxxx",
"refreshToken": "xxxx"
},
"msg": null,
"code": 0
}
```
### 新增自定义监控类型`hertzbeat_token`
1. 自定义监控类型需新增配置监控模板YML,我们直接复用教程一的 `hertzbeat` 监控类型,在其基础上修改
监控配置定义文件是用来定义采集类型是啥,需要用哪种协议采集方式,采集的指标是啥,协议的配置参数等。
我们直接复用 app-hertzbeat.yml 里面的定义内容,修改为我们当前的监控类型`hertzbeat_auth`配置参数, 比如 `app, category等`
```yaml
category: custom
# The monitoring type eg: linux windows tomcat mysql aws...
app: hertzbeat_token
# The monitoring i18n name
name:
zh-CN: HertzBeat(Token)
en-US: HertzBeat(Token)
# The description and help of this monitoring type
help:
zh-CN: HertzBeat 对 HertzBeat监控(Token)进行测量监控。`<br>`您可以点击 “`<i>`新建 HertzBeat监控(Token)`</i>`” 并进行配置,或者选择“`<i>`更多操作`</i>`”,导入已有配置。
en-US: HertzBeat monitors HertzBeat Monitor(Token). You could click the "`<i>`New HertzBeat Monitor(Token)`</i>`" button and proceed with the configuration or import an existing setup through the "`<i>`More Actions`</i>`" menu.
zh-TW: HertzBeat對HertzBeat監控(Token)進行量測監控。`<br>`您可以點擊“`<i>`新建HertzBeat監控(Token`</i>`”並進行配寘,或者選擇“`<i>`更多操作`</i>`”,導入已有配寘。
helpLink:
zh-CN: https://hertzbeat.apache.org/zh-cn/docs/help/hertzbeat_token
en-US: https://hertzbeat.apache.org/docs/help/hertzbeat_token
# Input params define for monitoring(render web ui by the definition)
params:
# field-param field key
- field: host
# name-param field display i18n name
name:
zh-CN: 目标Host
en-US: Target Host
# type-param field type(most mapping the html input type)
type: host
# required-true or false
required: true
- field: port
name:
zh-CN: 端口
en-US: Port
# type-param field type(most mapping the html input type)
type: number
# when type is number, range is required
range: '[0,65535]'
required: true
defaultValue: 1157
placeholder: 'Please input port'
- field: ssl
name:
zh-CN: 启动SSL
en-US: SSL
# type-param field type(boolean mapping the html switch tag)
type: boolean
required: false
- field: contentType
name:
zh-CN: Content-Type
en-US: Content-Type
type: text
placeholder: 'Request Body Type'
required: false
- field: payload
name:
zh-CN: 请求BODY
en-US: BODY
type: textarea
placeholder: 'Available When POST PUT'
required: false
```
### 定义监控指标`auth`登录请求获取`token`
1.`app-hertzbeat_token.yml`新增一个监控指标定义 `auth`, 设置采集优先级为最高0,采集指标 `token`.
```yaml
category: custom
# The monitoring type eg: linux windows tomcat mysql aws...
app: hertzbeat_token
# The monitoring i18n name
name:
zh-CN: HertzBeat(Token)
en-US: HertzBeat(Token)
# The description and help of this monitoring type
help:
zh-CN: HertzBeat 对 HertzBeat监控(Token)进行测量监控。`<br>`您可以点击 “`<i>`新建 HertzBeat监控(Token)`</i>`” 并进行配置,或者选择“`<i>`更多操作`</i>`”,导入已有配置。
en-US: HertzBeat monitors HertzBeat Monitor(Token). You could click the "`<i>`New HertzBeat Monitor(Token)`</i>`" button and proceed with the configuration or import an existing setup through the "`<i>`More Actions`</i>`" menu.
zh-TW: HertzBeat對HertzBeat監控(Token)進行量測監控。`<br>`您可以點擊“`<i>`新建HertzBeat監控(Token`</i>`”並進行配寘,或者選擇“`<i>`更多操作`</i>`”,導入已有配寘。
helpLink:
zh-CN: https://hertzbeat.apache.org/zh-cn/docs/help/hertzbeat_token
en-US: https://hertzbeat.apache.org/docs/help/hertzbeat_token
# Input params define for monitoring(render web ui by the definition)
params:
# field-param field key
- field: host
# name-param field display i18n name
name:
zh-CN: 目标Host
en-US: Target Host
# type-param field type(most mapping the html input type)
type: host
# required-true or false
required: true
- field: port
name:
zh-CN: 端口
en-US: Port
# type-param field type(most mapping the html input type)
type: number
# when type is number, range is required
range: '[0,65535]'
required: true
defaultValue: 1157
placeholder: 'Please input port'
- field: ssl
name:
zh-CN: 启动SSL
en-US: SSL
# type-param field type(boolean mapping the html switch tag)
type: boolean
required: false
- field: contentType
name:
zh-CN: Content-Type
en-US: Content-Type
type: text
placeholder: 'Request Body Type'
required: false
- field: payload
name:
zh-CN: 请求BODY
en-US: BODY
type: textarea
placeholder: 'Available When POST PUT'
required: false
# collect metrics config list
metrics:
# metrics - auth
- name: auth
# metrics scheduling priority(0->127)->(high->low), metrics with the same priority will be scheduled in parallel
# priority 0's metrics is availability metrics, it will be scheduled first, only availability metrics collect success will the scheduling continue
priority: 0
# collect metrics content
fields:
# field-metric name, type-metric type(0-number,1-string), unit-metric unit('%','ms','MB'), label-whether it is a metrics label field
- field: token
type: 1
- field: refreshToken
type: 1
# the protocol used for monitoring, eg: sql, ssh, http, telnet, wmi, snmp, sdk
protocol: http
# the config content when protocol is http
http:
# http host: ipv4 ipv6 domain
host: ^_^host^_^
# http port
port: ^_^port^_^
# http url
url: /api/account/auth/form
# http method: GET POST PUT DELETE PATCH
method: POST
# if enabled https
ssl: ^_^ssl^_^
payload: ^_^payload^_^
# http request header content
headers:
content-type: ^_^contentType^_^
^_^headers^_^: ^_^headers^_^
# http request params
params:
^_^params^_^: ^_^params^_^
# http response data parse type: default-hertzbeat rule, jsonpath-jsonpath script, website-for website monitoring, prometheus-prometheus exporter rule
parseType: jsonPath
parseScript: '$.data'
```
**此时,重启hertzbeat系统,在系统页面上添加 `hertzbeat_token` 类型监控,配置输入参数,`content-type`填`application/json` , `请求Body`填账户密码json如下:**
```json
{
"credential": "hertzbeat",
"identifier": "admin"
}
```
![HertzBeat](/img/docs/advanced/extend-http-example-5.png)
**新增成功后我们就可以在详情页面看到我们采集的 `token`, `refreshToken`指标数据。**
![HertzBeat](/img/docs/advanced/extend-http-example-6.png)
![HertzBeat](/img/docs/advanced/extend-http-example-7.png)
### 将`token`作为变量参数给后面的监控指标采集使用
**在`app-hertzbeat_token.yml`新增一个监控指标定义 `summary` 同教程一中的`summary`相同, 设置采集优先级为1**
**设置此监控指标的HTTP协议配置中认证方式为 `Bearer Token` 将上一个监控指标`auth`采集的指标`token`作为参数给其赋值,使用`^o^`作为内部替换符标识,即`^o^token^o^`。如下:**
```yaml
- name: summary
# 当protocol为http协议时具体的采集配置
http:
# 认证
authorization:
# 认证方式: Basic Auth, Digest Auth, Bearer Token
type: Bearer Token
bearerTokenToken: ^o^token^o^
```
**最终`app-hertzbeat_token.yml`定义如下:**
```yaml
category: custom
# The monitoring type eg: linux windows tomcat mysql aws...
app: hertzbeat_token
# The monitoring i18n name
name:
zh-CN: HertzBeat(Token)
en-US: HertzBeat(Token)
# The description and help of this monitoring type
help:
zh-CN: HertzBeat 对 HertzBeat监控(Token)进行测量监控。`<br>`您可以点击 “`<i>`新建 HertzBeat监控(Token)`</i>`” 并进行配置,或者选择“`<i>`更多操作`</i>`”,导入已有配置。
en-US: HertzBeat monitors HertzBeat Monitor(Token). You could click the "`<i>`New HertzBeat Monitor(Token)`</i>`" button and proceed with the configuration or import an existing setup through the "`<i>`More Actions`</i>`" menu.
zh-TW: HertzBeat對HertzBeat監控(Token)進行量測監控。`<br>`您可以點擊“`<i>`新建HertzBeat監控(Token`</i>`”並進行配寘,或者選擇“`<i>`更多操作`</i>`”,導入已有配寘。
helpLink:
zh-CN: https://hertzbeat.apache.org/zh-cn/docs/help/hertzbeat_token
en-US: https://hertzbeat.apache.org/docs/help/hertzbeat_token
# Input params define for monitoring(render web ui by the definition)
params:
# field-param field key
- field: host
# name-param field display i18n name
name:
zh-CN: 目标Host
en-US: Target Host
# type-param field type(most mapping the html input type)
type: host
# required-true or false
required: true
- field: port
name:
zh-CN: 端口
en-US: Port
# type-param field type(most mapping the html input type)
type: number
# when type is number, range is required
range: '[0,65535]'
required: true
defaultValue: 1157
placeholder: 'Please input port'
- field: ssl
name:
zh-CN: 启动SSL
en-US: SSL
# type-param field type(boolean mapping the html switch tag)
type: boolean
required: false
- field: contentType
name:
zh-CN: Content-Type
en-US: Content-Type
type: text
placeholder: 'Request Body Type'
required: false
- field: payload
name:
zh-CN: 请求BODY
en-US: BODY
type: textarea
placeholder: 'Available When POST PUT'
required: false
# collect metrics config list
metrics:
# metrics - auth
- name: auth
# metrics scheduling priority(0->127)->(high->low), metrics with the same priority will be scheduled in parallel
# priority 0's metrics is availability metrics, it will be scheduled first, only availability metrics collect success will the scheduling continue
priority: 0
# collect metrics content
fields:
# field-metric name, type-metric type(0-number,1-string), unit-metric unit('%','ms','MB'), label-whether it is a metrics label field
- field: token
type: 1
- field: refreshToken
type: 1
# the protocol used for monitoring, eg: sql, ssh, http, telnet, wmi, snmp, sdk
protocol: http
# the config content when protocol is http
http:
# http host: ipv4 ipv6 domain
host: ^_^host^_^
# http port
port: ^_^port^_^
# http url
url: /api/account/auth/form
# http method: GET POST PUT DELETE PATCH
method: POST
# if enabled https
ssl: ^_^ssl^_^
payload: ^_^payload^_^
# http request header content
headers:
content-type: ^_^contentType^_^
^_^headers^_^: ^_^headers^_^
# http request params
params:
^_^params^_^: ^_^params^_^
# http response data parse type: default-hertzbeat rule, jsonpath-jsonpath script, website-for website monitoring, prometheus-prometheus exporter rule
parseType: jsonPath
parseScript: '$.data'
- name: summary
priority: 1
fields:
- field: app
type: 1
label: true
- field: category
type: 1
- field: status
type: 0
- field: size
type: 0
- field: availableSize
type: 0
protocol: http
http:
host: ^_^host^_^
port: ^_^port^_^
url: /api/summary
method: GET
ssl: ^_^ssl^_^
authorization:
type: Bearer Token
# ^o^xxx^o^ ^o^ substitution represents the value of the acquisition metric xxx of the previous priority
bearerTokenToken: ^o^token^o^
parseType: jsonPath
parseScript: '$.data.apps.*'
```
**配置完成后,再次重启 `hertzbeat` 系统,查看监控详情页面**
![HertzBeat](/img/docs/advanced/extend-http-example-8.png)
![HertzBeat](/img/docs/advanced/extend-http-example-9.png)
### 设置阈值告警通知
> 接下来我们就可以正常设置阈值,告警触发后可以在告警中心查看,也可以新增接收人,设置告警通知等,Have Fun!!!
----
#### 完
HTTP协议的自定义监控的实践就到这里,HTTP协议还带其他参数headers,params等,我们可以像用postman一样去定义它,可玩性也非常高!
如果您觉得hertzbeat这个开源项目不错的话欢迎给我们在GitHub Gitee star哦,灰常感谢。感谢老铁们的支持。笔芯!
**github: [https://github.com/apache/hertzbeat](https://github.com/apache/hertzbeat)**
@@ -0,0 +1,176 @@
---
id: extend-http-jsonpath
title: HTTP协议JsonPath解析方式
sidebar_label: JsonPath解析方式
---
> HTTP接口调用获取响应数据后,用JsonPath脚本解析的解析方式去解析响应数据。
注意⚠️ 响应数据为JSON格式
**使用JsonPath脚本将响应数据解析成符合 Apache HertzBeat™ 指定的数据结构规则的数据**
## JsonPath操作符
[JSONPath在线验证](https://www.jsonpath.cn)
| JSONPATH | 帮助描述 |
|------------------|-----------------------------------|
| $ | 根对象或元素 |
| @ | 当前对象或元素 |
| . or [] | 子元素操作符 |
| .. | 递归匹配所有子元素 |
| * | 通配符. 匹配所有对象或元素. |
| [] | 下标运算符,JsonPath索引从0开始 |
| [,] | 连接运算符,将多个结果拼成数组返回,JSONPath允许使用别名. |
| [start:end:step] | 数组切片运算符 |
| ?() | 过滤器(脚本)表达式. |
| () | 脚本表达式. |
### HertzBeat数据格式规范
单层格式:key-value
```json
{
"metricName1": "metricValue",
"metricName2": "metricValue",
"metricName3": "metricValue",
"metricName4": "metricValue"
}
```
多层格式:数组里面套key-value
```json
[
{
"metricName1": "metricValue",
"metricName2": "metricValue",
"metricName3": "metricValue",
"metricName4": "metricValue"
},
{
"metricName1": "metricValue",
"metricName2": "metricValue",
"metricName3": "metricValue",
"metricName4": "metricValue"
}
]
```
#### 样例
查询自定义系统的数值信息,其暴露接口为 `/metrics/person`,我们需要其中的`type,num`指标
接口返回的原始数据如下:
```json
{
"firstName": "John",
"lastName" : "doe",
"age" : 26,
"address" : {
"streetAddress": "naist street",
"city" : "Nara",
"postalCode" : "630-0192"
},
"number": [
{
"type": "core",
"num": 3343
},
{
"type": "home",
"num": 4543
}
]
}
```
我们使用JsonPath脚本解析,对应的脚本为: `$.number[*]` ,解析后的数据结构如下:
```json
[
{
"type": "core",
"num": 3343
},
{
"type": "home",
"num": 4543
}
]
```
此数据结构符合HertzBeat的数据格式规范,成功提取指标`type,num`值。
**对应的监控模板YML可以配置为如下**
```yaml
category: custom
# 监控应用类型 eg: linux windows tomcat mysql aws...
app: example
name:
zh-CN: 模拟应用类型
en-US: EXAMPLE APP
# 监控参数定义. field 这些为输入参数变量,即可以用^_^host^_^的形式写到后面的配置中,系统自动变量值替换
# 强制固定必须参数 - host
params:
# field-字段名称标识符
- field: host
# name-参数字段显示名称
name:
zh-CN: 主机Host
en-US: Host
# type-字段类型,样式(大部分映射input标签type属性)
type: host
# 是否是必输项 true-必填 false-可选
required: true
- field: port
name:
zh-CN: 端口
en-US: Port
type: number
# 当type为number时,用range表示范围
range: '[0,65535]'
required: true
# 端口默认值
defaultValue: 80
# 参数输入框提示信息
placeholder: '请输入端口'
# collect metrics config list
# 采集指标配置列表
metrics:
# metrics - cpu
# 监控指标 - cpu
- name: cpu
# 指标调度优先级(0-127)越小优先级越高,优先级低的指标会等优先级高的指标采集完成后才会被调度,相同优先级的指标会并行调度采集
# 优先级为0的指标为可用性指标,即它会被首先调度,采集成功才会继续调度其它指标,采集失败则中断调度
priority: 0
# 具体监控指标列表
fields:
# 指标信息 包括 field名称 type字段类型:0-number数字,1-string字符串 label是否为标签 unit:指标单位
- field: type
type: 1
label: true
- field: num
type: 0
# 监控采集使用协议 eg: sql, ssh, http, telnet, wmi, snmp, sdk
protocol: http
# 当protocol为http协议时具体的采集配置
http:
# 主机host: ipv4 ipv6 域名
host: ^_^host^_^
# 端口
port: ^_^port^_^
# url请求接口路径
url: /metrics/person
# 请求方式 GET POST PUT DELETE PATCH
method: GET
# 是否启用ssl/tls,即是http还是https,默认false
ssl: false
# 响应数据解析方式: default-系统规则,jsonPath-jsonPath脚本,website-网站可用性指标监控
# 这里使用jsonPath解析
parseType: jsonPath
parseScript: '$.number[*]'
```
@@ -0,0 +1,326 @@
---
id: extend-http-xmlpath
title: HTTP 协议 XmlPath 解析方法
sidebar_label: XmlPath 解析方法
---
> 调用 HTTP API 获取响应数据后,使用 XmlPath 脚本解析方法解析响应数据。
注意⚠️ 响应数据必须是 XML 格式。
**使用 XPath 脚本将响应数据解析为符合 HertzBeat 指定的数据结构规则的数据。**
## XmlPath 解析逻辑
HertzBeat 中的 XmlPath 解析方法使用两步 XPath 处理:
1. **主 XPath 表达式 (`parseScript`)**: 此 XPath 表达式在 `http` 配置部分的 `parseScript` 中定义。它用于从响应中选择一个或多个主要的 XML 节点。每个选中的节点将对应 HertzBeat 中的一行指标数据。
2. **相对字段 XPath 表达式 (`xpath`)**: 对于在 `fields` 列表中定义的每个指标字段,您可以指定一个相对的 `xpath`。此 XPath 表达式是*相对于*步骤 1 中 `parseScript` 选择的每个主节点进行评估的。它从当前主节点中提取该指标字段的具体值。
这使您可以轻松地解析包含多个记录或项目的结构化 XML 数据。
**特殊指标**:
* `responseTime`: 这个内置指标代表 HTTP 请求的响应时间,是自动收集的。它不需要 `xpath`
* `keyword`: 这个内置指标计算原始响应体中指定关键字(在 `http.keyword` 中配置)的出现次数。它不需要 `xpath`
### 示例
假设 HTTP API 返回以下 XML 数据:
```xml
<DeviceStatus xmlns="http://www.isapi.org/ver20/XMLSchema" version="2.0">
<CPUList>
<CPU>
<cpuUtilization>36.400002</cpuUtilization>
<CPU>
<CPUList>
<MemoryList>
<Memory>
<memoryUsage>399640</memoryUsage>
<memoryAvailable>98792</memoryAvailable>
<cacheSize>228492</cacheSize>
<Memory>
<MemoryList>
<NetPortStatusList>
<NetPortStatus>
<id>1</id>
<workSpeed>1000</workSpeed>
<NetPortStatus>
<NetPortStatus>
<id>2</id>
<workSpeed>0</workSpeed>
<NetPortStatus>
<NetPortStatusList>
<bootTime>2025-01-06 10:27:48</bootTime>
<deviceUpTime>87天0时55分59秒</deviceUpTime>
<lastCalibrationTime>2025-04-03 11:09:18</lastCalibrationTime>
<lastCalibrationTimeDiff>1</lastCalibrationTimeDiff>
<uploadTimeConsumingList>
<avgTime>16</avgTime>
<maxTime>23</maxTime>
<minTime>12</minTime>
</uploadTimeConsumingList>
<lastCalibrationTimeMode>NTP</lastCalibrationTimeMode>
<lastCalibrationTimeAddress>34.191.45.101</lastCalibrationTimeAddress>
<DeviceStatus>
```
我们想要监控设备状态并提取各种指标。
以下是您将如何配置监控模板 YML
```yaml
category: server
# The monitoring type eg: linux windows tomcat mysql aws...
app: hikvision_isapi
# The monitoring i18n name
name:
zh-CN: 海康威视 ISAPI
en-US: Hikvision ISAPI
# The description and help of this monitoring type
help:
zh-CN: 通过ISAPI接口监控海康威视设备状态,获取设备健康数据。
en-US: Monitor Hikvision devices through ISAPI interface to collect health data.
# Input params define for monitoring(render web ui by the definition)
params:
- field: host
name:
zh-CN: 主机Host
en-US: Host
type: host
required: true
- field: port
name:
zh-CN: 端口
en-US: Port
type: number
range: '[0,65535]'
required: true
defaultValue: 80
- field: timeout
name:
zh-CN: 超时时间(ms)
en-US: Timeout(ms)
type: number
range: '[1000,60000]'
required: true
defaultValue: 5000
- field: username
name:
zh-CN: 用户名
en-US: Username
type: text
required: true
- field: password
name:
zh-CN: 密码
en-US: Password
type: password
required: true
- field: ssl
name:
zh-CN: 启用HTTPS
en-US: SSL
type: boolean
required: false
defaultValue: false
# collect metrics config list
metrics:
- name: system_info
i18n:
zh-CN: 系统信息
en-US: System Info
priority: 0
protocol: http
http:
host: ^_^host^_^
port: ^_^port^_^
ssl: ^_^ssl^_^
url: /ISAPI/System/deviceInfo
method: GET
timeout: ^_^timeout^_^
authorization:
type: Digest Auth
digestAuthUsername: ^_^username^_^
digestAuthPassword: ^_^password^_^
parseType: xmlPath
parseScript: //DeviceInfo
fields:
- field: deviceName
type: 1
i18n:
zh-CN: 设备名称
en-US: Device Name
- field: deviceID
type: 1
i18n:
zh-CN: 设备ID
en-US: Device ID
- field: firmwareVersion
type: 1
i18n:
zh-CN: 固件版本
en-US: Firmware Version
- field: model
type: 1
i18n:
zh-CN: 设备型号
en-US: Device Model
- field: macAddress
type: 1
i18n:
zh-CN: mac地址
en-US: Mac Address
- name: status
i18n:
zh-CN: 设备状态
en-US: Status
priority: 0
protocol: http
http:
host: ^_^host^_^
port: ^_^port^_^
ssl: ^_^ssl^_^
url: /ISAPI/System/status
method: GET
timeout: ^_^timeout^_^
authorization:
type: Digest Auth
digestAuthUsername: ^_^username^_^
digestAuthPassword: ^_^password^_^
parseType: xmlPath
parseScript: //DeviceStatus
fields:
- field: CPU_utilization
i18n:
zh-CN: CPU 利用率
en-US: CPU Utilization
type: 0
unit: '%'
- field: memory_usage
i18n:
zh-CN: 内存使用量
en-US: Memory Usage
type: 0
unit: MB
- field: memory_available
i18n:
zh-CN: 可用内存
en-US: Memory Available
type: 0
unit: MB
- field: cache_size
i18n:
zh-CN: 缓存大小
en-US: Cache Size
type: 0
unit: MB
- field: net_port_1_speed
i18n:
zh-CN: 网口1速度
en-US: Net Port 1 Speed
type: 0
unit: Mbps
- field: net_port_2_speed
i18n:
zh-CN: 网口2速度
en-US: Net Port 2 Speed
type: 0
unit: Mbps
- field: boot_time
i18n:
zh-CN: 启动时间
en-US: Boot Time
type: 1
- field: device_uptime
i18n:
zh-CN: 运行时长
en-US: Device Uptime
type: 1
- field: last_calibration_time
i18n:
zh-CN: 上次校时时间
en-US: Last Calibration Time
type: 1
- field: last_calibration_time_diff
i18n:
zh-CN: 上次校时时间差
en-US: Last Calibration Time Diff
type: 0
unit: s
- field: avg_upload_time
i18n:
zh-CN: 平均上传耗时
en-US: Avg Upload Time
type: 0
unit: ms
- field: max_upload_time
i18n:
zh-CN: 最大上传耗时
en-US: Max Upload Time
type: 0
unit: ms
- field: min_upload_time
i18n:
zh-CN: 最小上传耗时
en-US: Min Upload Time
type: 0
unit: ms
- field: last_calibration_mode
i18n:
zh-CN: 上次校时模式
en-US: Last Calibration Mode
type: 1
- field: last_calibration_address
i18n:
zh-CN: 上次校时地址
en-US: Last Calibration Address
type: 1
- field: response_time
i18n:
zh-CN: 响应时间
en-US: Response Time
type: 0
unit: ms
aliasFields:
- CPUList/CPU/cpuUtilization
- MemoryList/Memory/memoryUsage
- MemoryList/Memory/memoryAvailable
- MemoryList/Memory/cacheSize
- NetPortStatusList/NetPortStatus[id='1']/workSpeed
- NetPortStatusList/NetPortStatus[id='2']/workSpeed
- bootTime
- deviceUpTime
- lastCalibrationTime
- lastCalibrationTimeDiff
- uploadTimeConsumingList/avgTime
- uploadTimeConsumingList/maxTime
- uploadTimeConsumingList/minTime
- lastCalibrationTimeMode
- lastCalibrationTimeAddress
- responseTime
calculates:
- CPU_utilization=CPUList/CPU/cpuUtilization
- memory_usage=MemoryList/Memory/memoryUsage
- memory_available=MemoryList/Memory/memoryAvailable
- cache_size=MemoryList/Memory/cacheSize
- net_port_1_speed=NetPortStatusList/NetPortStatus[id='1']/workSpeed
- net_port_2_speed=NetPortStatusList/NetPortStatus[id='2']/workSpeed
- boot_time=bootTime
- device_uptime=deviceUpTime
- last_calibration_time=lastCalibrationTime
- last_calibration_time_diff=lastCalibrationTimeDiff
- avg_upload_time=uploadTimeConsumingList/avgTime
- max_upload_time=uploadTimeConsumingList/maxTime
- min_upload_time=uploadTimeConsumingList/minTime
- last_calibration_mode=lastCalibrationTimeMode
- last_calibration_address=lastCalibrationTimeAddress
- response_time=responseTime
units:
- memory_usage=KB->MB
- memory_available=KB->MB
- cache_size=KB->MB
@@ -0,0 +1,279 @@
---
id: extend-http
title: HTTP协议自定义监控
sidebar_label: HTTP协议自定义监控
---
> 从[自定义监控](extend-point)了解熟悉了怎么自定义类型,指标,协议等,这里我们来详细介绍下用HTTP协议自定义指标监控。
## HTTP协议采集流程
【**HTTP接口调用**】->【**响应校验**】->【**响应数据解析**】->【**默认方式解析|JsonPath脚本解析 | XmlPath解析(todo) | Prometheus解析**】->【**指标数据提取**】
由流程可见,我们自定义一个HTTP协议的监控类型,需要配置HTTP请求参数,配置获取哪些指标,对响应数据配置解析方式和解析脚本。
HTTP协议支持我们自定义HTTP请求路径,请求header,请求参数,请求方式,请求体等。
**系统默认解析方式**http接口返回hertzbeat规定的json数据结构,即可用默认解析方式解析数据提取对应的指标数据,详细介绍见 [**系统默认解析**](extend-http-default)
**JsonPath脚本解析方式**:用JsonPath脚本对响应的json数据进行解析,返回系统指定的数据结构,然后提供对应的指标数据,详细介绍见 [**JsonPath脚本解析**](extend-http-jsonpath)
### 自定义步骤
**HertzBeat页面** -> **监控模板菜单** -> **新增监控类型** -> **配置自定义监控模板YML** -> **点击保存应用** -> **使用新监控类型添加监控**
![HertzBeat](/img/docs/advanced/extend-point-1.png)
-------
下面详细介绍下监控模板YML的配置用法,请注意看使用注释。
### 监控模板YML
> 监控模板YML用于定义 *监控类型的名称(国际化), 请求参数结构定义(前端页面根据配置自动渲染UI), 采集指标信息, 采集协议配置* 等。
> 即我们通过自定义这个监控模板,配置定义什么监控类型,前端页面需要输入什么参数,采集哪些性能指标,通过什么协议去采集。
样例:自定义一个名称为example_http的自定义监控类型,其使用HTTP协议采集指标数据。
```yaml
# The monitoring type categoryservice-application service monitoring db-database monitoring custom-custom monitoring os-operating system monitoring
category: custom
# The monitoring type eg: linux windows tomcat mysql aws...
app: a_example
# The monitoring i18n name
name:
zh-CN: 模拟应用
en-US: EXAMPLE APP
# The description and help of this monitoring type
help:
zh-CN: HertzBeat 支持自定义监控,您只需配置监控模板 YML 就能适配一款自定义的监控类型。`<br>`定义流程如下:HertzBeat 页面 -> 监控模板菜单 -> 新增监控类型 -> 配置自定义监控模板YML -> 点击保存应用 -> 使用新监控类型添加监控。
en-US: "HertzBeat supports custom monitoring, and you only need to configure the monitoring template YML to adapt to a custom monitoring type. `<br>`Definition process as follow: HertzBeat Pages -> Main Menu -> Monitor Template -> edit and save -> apply this template."
zh-TW: HertzBeat支持自定義監控,您只需配寘監控模板YML就能適配一款自定義的監控類型。`<br>`定義流程如下:HertzBeat頁面->監控模板選單->新增監控類型->配寘自定義監控模板YML ->點擊保存應用->使用新監控類型添加監控。
helpLink:
zh-CN: https://hertzbeat.apache.org/zh-cn/docs/advanced/extend-point/
en-US: https://hertzbeat.apache.org/docs/advanced/extend-point/
# Input params define for monitoring(render web ui by the definition)
params:
# field-param field key
- field: host
# name-param field display i18n name
name:
zh-CN: 目标Host
en-US: Target Host
# type-param field type(most mapping the html input type)
type: host
# required-true or false
required: true
# field-param field key
- field: port
# name-param field display i18n name
name:
zh-CN: 端口
en-US: Port
# type-param field type(most mapping the html input type)
type: number
# when type is number, range is required
range: '[0,65535]'
# required-true or false
required: true
# default value
defaultValue: 80
# param field input placeholder
placeholder: 'Please Input Port'
# field-param field key
- field: username
# name-param field display i18n name
name:
zh-CN: 用户名
en-US: Username
# type-param field type(most mapping the html input type)
type: text
# when type is text, use limit to limit string length
limit: 50
# required-true or false
required: false
# hide param-true or false
hide: true
# field-param field key
- field: password
# name-param field display i18n name
name:
zh-CN: 用户密码
en-US: Password
# type-param field type(most mapping the html input tag)
type: password
# required-true or false
required: false
# hide param-true or false
hide: true
# field-param field key
- field: ssl
# name-param field display i18n name
name:
zh-CN: 启动SSL
en-US: SSL
# type-param field type(boolean mapping the html switch tag)
type: boolean
# required-true or false
required: false
# field-param field key
- field: method
# name-param field display i18n name
name:
zh-CN: 请求方式
en-US: Method
# type-param field type(radio mapping the html radio tag)
type: radio
# required-true or false
required: true
# when type is radio checkbox, use option to show optional values {name1:value1,name2:value2}
options:
- label: GET
value: GET
- label: POST
value: POST
- label: PUT
value: PUT
- label: DELETE
value: DELETE
# field-param field key
- field: headers
# name-param field display i18n name
name:
zh-CN: 请求Headers
en-US: Headers
# type-param field type(key-value mapping the html key-value input tags)
type: key-value
# required-true or false
required: false
# when type is key-value, use keyAlias to config key alias name
keyAlias: Header Name
# when type is key-value, use valueAlias to config value alias name
valueAlias: Header Value
# collect metrics config list
metrics:
# metrics - cpu
- name: cpu
# metrics name i18n label
i18n:
zh-CN: CPU 信息
en-US: CPU Info
# metrics scheduling priority(0->127)->(high->low), metrics with the same priority will be scheduled in parallel
# priority 0's metrics is availability metrics, it will be scheduled first, only availability metrics collect success will the scheduling continue
priority: 0
# collect metrics content
fields:
# field-metric name, i18n-metric name i18n label, type-metric type(0-number,1-string), unit-metric unit('%','ms','MB'), label-whether it is a metrics label field
- field: hostname
type: 1
label: true
i18n:
zh-CN: 主机名称
en-US: Host Name
- field: usage
type: 0
unit: '%'
i18n:
zh-CN: 使用率
en-US: Usage
- field: cores
type: 0
i18n:
zh-CN: 核数
en-US: Cores
- field: waitTime
type: 0
unit: s
i18n:
zh-CN: 主机名称
en-US: Host Name
# (optional)metrics field alias name, it is used as an alias field to map and convert the collected data and metrics field
aliasFields:
- hostname
- core1
- core2
- usage
- allTime
- runningTime
# mapping and conversion expressions, use these and aliasField above to calculate metrics value
# eg: cores=core1+core2, usage=usage, waitTime=allTime-runningTime
calculates:
- hostname=hostname
- cores=core1+core2
- usage=usage
- waitTime=allTime-runningTime
# the protocol used for monitoring, eg: sql, ssh, http, telnet, wmi, snmp, sdk
protocol: http
# the config content when protocol is http
http:
# http host: ipv4 ipv6 domain
host: ^_^host^_^
# http port
port: ^_^port^_^
# http url
url: /metrics/cpu
# http method: GET POST PUT DELETE PATCH
method: GET
# if enabled https
ssl: false
# http request header content
headers:
^_^headers^_^: ^_^headers^_^
# http request params
params:
param1: param1
param2: param2
# http auth
authorization:
# http auth type: Basic Auth, Digest Auth, Bearer Token
type: Basic Auth
basicAuthUsername: ^_^username^_^
basicAuthPassword: ^_^password^_^
# http response data parse type: default-hertzbeat rule, jsonpath-jsonpath script, website-for website monitoring, prometheus-prometheus exporter rule
parseType: jsonPath
parseScript: '$'
- name: memory
i18n:
zh-CN: 内存信息
en-US: Memory Info
priority: 1
fields:
- field: hostname
type: 1
label: true
i18n:
zh-CN: 主机名称
en-US: Hostname
- field: total
type: 0
unit: kb
i18n:
zh-CN: 总量
en-US: Total
- field: usage
type: 0
unit: '%'
i18n:
zh-CN: 使用率
en-US: Usage
- field: speed
type: 0
i18n:
zh-CN: 速率
en-US: Speed
protocol: http
http:
host: ^_^host^_^
port: ^_^port^_^
url: /metrics/memory
method: GET
headers:
apiVersion: v1
params:
param1: param1
param2: param2
authorization:
type: Basic Auth
basicAuthUsername: ^_^username^_^
basicAuthPassword: ^_^password^_^
parseType: default
```
@@ -0,0 +1,245 @@
---
id: extend-jdbc
title: JDBC协议自定义监控
sidebar_label: JDBC协议自定义监控
---
> 从[自定义监控](extend-point)了解熟悉了怎么自定义类型,指标,协议等,这里我们来详细介绍下用JDBC(目前支持mysql,mariadb,postgresql,sqlserver)自定义指标监控。
> JDBC协议自定义监控可以让我们很方便的通过写SQL查询语句就能监控到我们想监控的指标
## JDBC协议采集流程
【**系统直连MYSQL**】->【**运行SQL查询语句**】->【**响应数据解析:oneRow, multiRow, columns**】->【**指标数据提取**】
由流程可见,我们自定义一个JDBC协议的监控类型,需要配置JDBC请求参数,配置获取哪些指标,配置查询SQL语句。
### 数据解析方式
SQL查询回来的数据字段和我们需要的指标映射,就能获取对应的指标数据,目前映射解析方式有三种:oneRow, multiRow, columns
#### **oneRow**
> 查询一行数据, 通过查询返回结果集的列名称,和查询的字段映射
例如:
查询的指标字段为:one tow three four
查询SQLselect one, tow, three, four from book limit 1;
这里指标字段就能和响应数据一一映射为一行采集数据。
#### **multiRow**
> 查询多行数据, 通过查询返回结果集的列名称,和查询的字段映射
例如:
查询的指标字段为:one tow three four
查询SQLselect one, tow, three, four from book;
这里指标字段就能和响应数据一一映射为多行采集数据。
#### **columns**
> 采集一行指标数据, 通过查询的两列数据(key-value),key和查询的字段匹配,value为查询字段的值
例如:
查询字段:one tow three four
查询SQLselect key, value from book;
SQL响应数据:
| key | value |
|-------|-------|
| one | 243 |
| two | 435 |
| three | 332 |
| four | 643 |
这里指标字段就能和响应数据的key映射,获取对应的value为其采集监控数据。
### 自定义步骤
**HertzBeat页面** -> **监控模板菜单** -> **新增监控类型** -> **配置自定义监控模板YML** -> **点击保存应用** -> **使用新监控类型添加监控**
![HertzBeat](/img/docs/advanced/extend-point-1.png)
-------
下面详细介绍下文件的配置用法,请注意看使用注释。
### 监控模板YML
> 监控配置定义文件用于定义 *监控类型的名称(国际化), 请求参数结构定义(前端页面根据配置自动渲染UI), 采集指标信息, 采集协议配置* 等。
> 即我们通过自定义这个YML,配置定义什么监控类型,前端页面需要输入什么参数,采集哪些性能指标,通过什么协议去采集。
样例:自定义一个名称为example_sql的自定义监控类型,其使用JDBC协议采集指标数据。
```yaml
# 监控类型所属类别:service-应用服务 program-应用程序 db-数据库 custom-自定义 os-操作系统 bigdata-大数据 mid-中间件 webserver-web服务器 cache-缓存 cn-云原生 network-网络监控等等
category: db
# 监控应用类型(与文件名保持一致) eg: linux windows tomcat mysql aws...
app: example_sql
name:
zh-CN: 模拟MYSQL应用类型
en-US: MYSQL EXAMPLE APP
# 监控参数定义. field 这些为输入参数变量,即可以用^_^host^_^的形式写到后面的配置中,系统自动变量值替换
# 强制固定必须参数 - host
params:
- field: host
name:
zh-CN: 主机Host
en-US: Host
type: host
required: true
- field: port
name:
zh-CN: 端口
en-US: Port
type: number
range: '[0,65535]'
required: true
defaultValue: 80
placeholder: '请输入端口'
- field: database
name:
zh-CN: 数据库名称
en-US: Database
type: text
required: false
- field: username
name:
zh-CN: 用户名
en-US: Username
type: text
limit: 50
required: false
- field: password
name:
zh-CN: 密码
en-US: Password
type: password
required: false
- field: url
name:
zh-CN: Url
en-US: Url
type: text
required: false
# 采集指标配置列表
metrics:
- name: basic
# 指标调度优先级(0-127)越小优先级越高,优先级低的指标会等优先级高的指标采集完成后才会被调度,相同优先级的指标会并行调度采集
# 优先级为0的指标为可用性指标,即它会被首先调度,采集成功才会继续调度其它指标,采集失败则中断调度
priority: 0
# 具体监控指标列表
fields:
# 指标信息 包括 field名称 type字段类型:0-number数字,1-string字符串 label是否为标签 unit:指标单位
- field: version
type: 1
label: true
- field: port
type: 1
- field: datadir
type: 1
- field: max_connections
type: 0
# (非必须)监控指标别名,与上面的指标名映射。用于采集接口数据字段不直接是最终指标名称,需要此别名做映射转换
aliasFields:
- version
- version_compile_os
- version_compile_machine
- port
- datadir
- max_connections
# (非必须)指标计算表达式,与上面的别名一起作用,计算出最终需要的指标值
# eg: cores=core1+core2, usage=usage, waitTime=allTime-runningTime
calculates:
- port=port
- datadir=datadir
- max_connections=max_connections
- version=version+"_"+version_compile_os+"_"+version_compile_machine
protocol: jdbc
jdbc:
# 主机host: ipv4 ipv6 域名
host: ^_^host^_^
# 端口
port: ^_^port^_^
platform: mysql
username: ^_^username^_^
password: ^_^password^_^
database: ^_^database^_^
# SQL查询方式: oneRow, multiRow, columns
queryType: columns
# sql
sql: show global variables where Variable_name like 'version%' or Variable_name = 'max_connections' or Variable_name = 'datadir' or Variable_name = 'port';
url: ^_^url^_^
- name: status
priority: 1
fields:
# 指标信息 包括 field名称 type字段类型:0-number数字,1-string字符串 label是否为标签 unit:指标单位
- field: threads_created
type: 0
- field: threads_connected
type: 0
- field: threads_cached
type: 0
- field: threads_running
type: 0
# (非必须)监控指标别名,与上面的指标名映射。用于采集接口数据字段不直接是最终指标名称,需要此别名做映射转换
aliasFields:
- threads_created
- threads_connected
- threads_cached
- threads_running
# (非必须)指标计算表达式,与上面的别名一起作用,计算出最终需要的指标值
# eg: cores=core1+core2, usage=usage, waitTime=allTime-runningTime
calculates:
- threads_created=threads_created
- threads_connected=threads_connected
- threads_cached=threads_cached
- threads_running=threads_running
protocol: jdbc
jdbc:
# 主机host: ipv4 ipv6 域名
host: ^_^host^_^
# 端口
port: ^_^port^_^
platform: mysql
username: ^_^username^_^
password: ^_^password^_^
database: ^_^database^_^
# SQL查询方式: oneRow, multiRow, columns
queryType: columns
# sql
sql: show global status where Variable_name like 'thread%' or Variable_name = 'com_commit' or Variable_name = 'com_rollback' or Variable_name = 'questions' or Variable_name = 'uptime';
url: ^_^url^_^
- name: innodb
priority: 2
fields:
# 指标信息 包括 field名称 type字段类型:0-number数字,1-string字符串 label是否为标签 unit:指标单位
- field: innodb_data_reads
type: 0
unit: 次数
- field: innodb_data_writes
type: 0
unit: 次数
- field: innodb_data_read
type: 0
unit: kb
- field: innodb_data_written
type: 0
unit: kb
protocol: jdbc
jdbc:
# 主机host: ipv4 ipv6 域名
host: ^_^host^_^
# 端口
port: ^_^port^_^
platform: mysql
username: ^_^username^_^
password: ^_^password^_^
database: ^_^database^_^
# SQL查询方式: oneRow, multiRow, columns
queryType: columns
# sql
sql: show global status where Variable_name like 'innodb%';
url: ^_^url^_^
```
@@ -0,0 +1,238 @@
---
id: extend-jmx
title: JMX协议自定义监控
sidebar_label: JMX协议自定义监控
---
> 从[自定义监控](extend-point)了解熟悉了怎么自定义类型,指标,协议等,这里我们来详细介绍下用JMX协议自定义指标监控。
> JMX协议自定义监控可以让我们很方便的通过配置 JMX Mbean Object 就能监控采集到我们想监控的 Mbean 指标
## JMX协议采集流程
【**对端JAVA应用暴露JMX服务**】->【**HertzBeat直连对端JMX服务**】->【**获取配置的 Mbean Object 数据**】->【**指标数据提取**】
由流程可见,我们自定义一个JMX协议的监控类型,需要配置JMX请求参数,配置获取哪些指标,配置查询Object信息。
### 数据解析方式
通过配置监控模板YML的指标`field`, `aliasFields`, `jmx` 协议的 `objectName` 来和对端系统暴露的 `Mbean`对象信息映射解析。
### 自定义步骤
**HertzBeat页面** -> **监控模板菜单** -> **新增监控类型** -> **配置自定义监控模板YML** -> **点击保存应用** -> **使用新监控类型添加监控**
![HertzBeat](/img/docs/advanced/extend-point-1.png)
-------
下面详细介绍下监控模板的配置用法,请注意看使用注释。
### 监控模板YML
> 监控配置定义文件用于定义 *监控类型的名称(国际化), 请求参数结构定义(前端页面根据配置自动渲染UI), 采集指标信息, 采集协议配置* 等。
> 即我们通过自定义这个YML,配置定义什么监控类型,前端页面需要输入什么参数,采集哪些性能指标,通过什么协议去采集。
样例:自定义一个名称为 `example_jvm` 的自定义监控类型,其使用JMX协议采集指标数据。
```yaml
# The monitoring type categoryservice-application service monitoring db-database monitoring custom-custom monitoring os-operating system monitoring
# 监控类型所属类别:service-应用服务 program-应用程序 db-数据库 custom-自定义 os-操作系统 bigdata-大数据 mid-中间件 webserver-web服务器 cache-缓存 cn-云原生 network-网络监控等等
category: service
# The monitoring type eg: linux windows tomcat mysql aws...
# 监控类型 eg: linux windows tomcat mysql aws...
app: example_jvm
# The monitoring i18n name
# 监控类型国际化名称
name:
zh-CN: 自定义JVM虚拟机
en-US: CUSTOM JVM
# Input params define for monitoring(render web ui by the definition)
# 监控所需输入参数定义(根据定义渲染页面UI)
params:
# field-param field key
# field-字段名称标识符
- field: host
# name-param field display i18n name
# name-参数字段显示名称
name:
zh-CN: 主机Host
en-US: Host
# type-param field type(most mapping the html input type)
# type-字段类型,样式(大部分映射input标签type属性)
type: host
# required-true or false
# 是否是必输项 true-必填 false-可选
required: true
# field-param field key
# field-变量字段标识符
- field: port
# name-param field display i18n name
# name-参数字段显示名称
name:
zh-CN: 端口
en-US: Port
# type-param field type(most mapping the html input type)
# type-字段类型,样式(大部分映射input标签type属性)
type: number
# when type is number, range is required
# 当type为number时,用range表示范围
range: '[0,65535]'
# required-true or false
# required-是否是必输项 true-必填 false-可选
required: true
# default value
# 端口默认值
defaultValue: 9999
# field-param field key
# field-变量字段标识符
- field: url
# name-param field display i18n name
# name-参数字段显示名称
name:
zh-CN: JMX URL
en-US: JMX URL
# type-param field type(most mapping the html input type)
# type-字段类型,样式(大部分映射input标签type属性)
type: text
# required-true or false
# required-是否是必输项 true-必填 false-可选
required: false
# hide param-true or false
# 是否隐藏字段 true or false
hide: true
# param field input placeholder
# 参数输入框提示信息
placeholder: 'service:jmx:rmi:///jndi/rmi://host:port/jmxrmi'
# field-param field key
# field-变量字段标识符
- field: username
# name-param field display i18n name
# name-参数字段显示名称
name:
zh-CN: 用户名
en-US: Username
# type-param field type(most mapping the html input type)
# type-字段类型,样式(大部分映射input标签type属性)
type: text
# when type is text, use limit to limit string length
# 当type为text时,用limit表示字符串限制大小
limit: 50
# required-true or false
# required-是否是必输项 true-必填 false-可选
required: false
# hide param-true or false
# 是否隐藏字段 true or false
hide: true
# field-param field key
# field-变量字段标识符
- field: password
# name-param field display i18n name
# name-参数字段显示名称
name:
zh-CN: 密码
en-US: Password
# type-param field type(most mapping the html input tag)
# type-字段类型,样式(大部分映射input标签type属性)
type: password
# required-true or false
# required-是否是必输项 true-必填 false-可选
required: false
# hide param-true or false
# 是否隐藏字段 true or false
hide: true
# collect metrics config list
# 采集指标配置列表
metrics:
# metrics - basic
# 监控指标 - basic
- name: basic
# metrics scheduling priority(0->127)->(high->low), metrics with the same priority will be scheduled in parallel
# priority 0's metrics is availability metrics, it will be scheduled first, only availability metrics collect success will the scheduling continue
# 指标采集调度优先级(0->127)->(优先级高->低) 优先级低的指标会等优先级高的指标采集完成后才会被调度, 相同优先级的指标会并行调度采集
# 优先级为0的指标为可用性指标,即它会被首先调度,采集成功才会继续调度其它指标,采集失败则中断调度
priority: 0
# collect metrics content
# 具体监控指标列表
fields:
# field-metric name, type-metric type(0-number,1-string), unit-metric unit('%','ms','MB'), label-if is metrics label
# field-指标名称, type-指标类型(0-number数字,1-string字符串), unit-指标单位('%','ms','MB'), label-是否是指标集合唯一标识符字段
- field: VmName
type: 1
- field: VmVendor
type: 1
- field: VmVersion
type: 1
- field: Uptime
type: 0
unit: ms
# the protocol used for monitoring, eg: sql, ssh, http, telnet, wmi, snmp, sdk
# 用于监控的协议,例: sql, ssh, http, telnet, wmi, snmp, sdk
protocol: jmx
# the config content when protocol is jmx
jmx:
# host: ipv4 ipv6 domain
# 主机host: ipv4 ipv6 域名
host: ^_^host^_^
# port
# 端口
port: ^_^port^_^
username: ^_^username^_^
password: ^_^password^_^
# jmx mbean object name
# jmx mbean 对象名称
objectName: java.lang:type=Runtime
url: ^_^url^_^
- name: memory_pool
priority: 1
fields:
- field: name
type: 1
label: true
- field: committed
type: 0
unit: MB
- field: init
type: 0
unit: MB
- field: max
type: 0
unit: MB
- field: used
type: 0
unit: MB
units:
- committed=B->MB
- init=B->MB
- max=B->MB
- used=B->MB
# (optional)metrics field alias name, it is used as an alias field to map and convert the collected data and metrics field
# (可选)监控指标别名, 做为中间字段与采集数据字段和指标字段映射转换
aliasFields:
- Name
- Usage->committed
- Usage->init
- Usage->max
- Usage->used
# mapping and conversion expressions, use these and aliasField above to calculate metrics value
# (可选)指标映射转换计算表达式,与上面的别名一起作用,计算出最终需要的指标值
# eg: cores=core1+core2, usage=usage, waitTime=allTime-runningTime
calculates:
- name=Name
- committed=Usage->committed
- init=Usage->init
- max=Usage->max
- used=Usage->used
protocol: jmx
jmx:
# host: ipv4 ipv6 domain
# 主机host: ipv4 ipv6 域名
host: ^_^host^_^
# port
# 端口
port: ^_^port^_^
username: ^_^username^_^
password: ^_^password^_^
objectName: java.lang:type=MemoryPool,name=*
url: ^_^url^_^
```
@@ -0,0 +1,174 @@
---
id: extend-ngql
title: NQGL自定义监控
sidebar_label: NGQL自定义监控
---
> 从[自定义监控](extend-point)了解熟悉了怎么自定义类型,指标,协议等,这里我们来详细介绍下用NGQL自定义指标监控。
> NGQL自定义监控可以让我们很方便的使用NGQL或者OpenCypher从NebulaGraph图数据库中查询指标数据,支持NebulaGraph 3.X版本。
## 数据解析方式
NGQL查询回来的数据字段和我们需要的指标映射,就能获取对应的指标数据,目前映射解析方式有四种: filterCount, oneRow, multiRow, columns
### **filterCount**
>
> 对查询返回的结果按照指定字段进行过滤后,统计数量,通常用于 `SHOW ...` 语句中,如果可以使用NGQL语句直接返回数量的,建议使用NGQL语句统计数量。
> commands字段语法格式: aliasField#NGQL#filterName#filterValue
> `aliasField`: 对应监控模板中的`aliasFields`中的值
> `NGQL`: 查询语句
> `filterName`: 过滤属性名称(可选)
> `filterValue`: 过滤属性值(可选)
例如:
- online_meta_count#SHOW HOSTS META#Status#ONLINE
`SHOW HOSTS META` 返回的结果中统计滤Status==ONLINE的数量
- online_meta_count#SHOW HOSTS META##
统计 `SHOW HOSTS META` 返回的行数
#### **oneRow**
> 查询一行数据, 通过查询返回结果集的列名称,和查询的字段映射
例如:
- 查询的指标字段为:a,b
- 查询NGQLmatch (v:metrics) return v.metrics.a as a,v.metrics.b as b;
这里指标字段就能和响应数据一一映射为一行采集数据。
注意事项:
- 使用 `oneRow` 方式时单条查询语句返回多行结果时只会使用第一行结果映射到指标字段;
-`commands` 字段包含两条及两条以上查询语句时,如果多条查询语句返回的字段相同时,后一条语句返回的字段会覆盖前一条;
- 定义 `commands` 时建议使用 limit 语句限制返回结果集的行数;
#### **multiRow**
> 查询多行数据, 通过查询返回结果集的列名称,和查询的字段映射
例如:
- 查询的指标字段为:a,b
- 查询NGQLmatch (v:metrics) return v.metrics.a as a,v.metrics.b as b;
这里指标字段就能和响应数据一一映射为多行采集数据。
注意事项:
- 使用 `multiRow` 方式时,`commands` 字段只能包含一条查询语句
#### **columns**
> 采集一行指标数据, 通过查询的两列数据(key-value),key和查询的字段匹配,value为查询字段的值
注意事项:
- 使用 `columns` 方式时,会默认使用结果集的前两列映射采集数据,第一列数据对应指标名称,第二列对应指标值;
-`commands` 字段包含两条及两条以上查询语句时,如果多条查询语句返回的第一列数据有重复,会使用保留最后一条的结果;
### 自定义步骤
**HertzBeat页面** -> **监控模板菜单** -> **新增监控类型** -> **配置自定义监控模板YML** -> **点击保存应用** -> **使用新监控类型添加监控**
![HertzBeat](/img/docs/advanced/extend-point-1.png)
-------
下面详细介绍下文件的配置用法,请注意看使用注释。
### 监控模板YML
> 监控配置定义文件用于定义 *监控类型的名称(国际化), 请求参数结构定义(前端页面根据配置自动渲染UI), 采集指标信息, 采集协议配置* 等。
> 即我们通过自定义这个YML,配置定义什么监控类型,前端页面需要输入什么参数,采集哪些性能指标,通过什么协议去采集。
样例:自定义一个名称为example_ngql的自定义监控类型,其使用NGQL采集指标数据。
```yaml
# 监控类型所属类别:service-应用服务 program-应用程序 db-数据库 custom-自定义 os-操作系统 bigdata-大数据 mid-中间件 webserver-web服务器 cache-缓存 cn-云原生 network-网络监控等等
category: db
# 监控应用类型(与文件名保持一致) eg: linux windows tomcat mysql aws...
app: example_ngql
name:
zh-CN: NGQL自定义监控应用
en-US: NGQL Custom APP
# 监控参数定义. field 这些为输入参数变量,即可以用^_^host^_^的形式写到后面的配置中,系统自动变量值替换
# 这个部分通常不用修改
params:
# field-param field key
- field: host
name:
zh-CN: 目标Host
en-US: Target Host
type: host
required: true
- field: graphPort
name:
zh-CN: graph端口
en-US: graphPort
type: number
range: '[0,65535]'
required: true
defaultValue: 9669
- field: username
name:
zh-CN: 用户名
en-US: Username
type: text
required: true
- field: password
name:
zh-CN: 密码
en-US: Password
type: password
required: true
- field: spaceName
name:
zh-CN: 图空间
en-US: Space Name
type: text
required: false
- field: timeout
name:
zh-CN: 连接超时时间(ms)
en-US: Connect Timeout(ms)
type: number
unit: ms
range: '[0,100000]'
required: true
defaultValue: 6000
# 采集指标配置列表
metrics:
- name: base_info
i18n:
zh-CN: 节点统计
en-US: Vertex statistics
priority: 0
fields:
- field: tag1
type: 1
i18n:
zh-CN: tag1
en-US: tag1
- field: tag1
type: 1
i18n:
zh-CN: tag2
en-US: tag2
aliasFields:
- tag1
- tag2
protocol: ngql
ngql:
host: ^_^host^_^
username: ^_^username^_^
password: ^_^password^_^
port: ^_^graphPort^_^
spaceName: ^_^spaceName^_^
parseType: columns
# 定义采集数据使用的查询语句
commands:
- match (v:tag1) return "tag1" as name ,count(v) as cnt
- match (v:tag2) return "tag2" as name ,count(v) as cnt
timeout: ^_^timeout^_^
```
@@ -0,0 +1,185 @@
---
id: extend-point
title: 自定义监控
sidebar_label: 自定义监控
---
> HertzBeat拥有自定义监控能力,您只需配置监控模板YML就能适配一款自定义的监控类型。
> 目前自定义监控支持[HTTP协议](extend-http)[JDBC协议](extend-jdbc)[SSH协议](extend-ssh)[JMX协议](extend-jmx)[SNMP协议](extend-snmp),后续会支持更多通用协议。
## 自定义流程
**HertzBeat页面** -> **监控模板菜单** -> **新增监控类型** -> **配置自定义监控模板YML** -> **点击保存应用** -> **使用新监控类型添加监控**
![HertzBeat](/img/docs/advanced/extend-point-1.png)
### 自定义监控指标刷新时间
现在,HertzBeat支持为每组监控指标设置不同的刷新时间。您可以在监控模板的 `metrics` 部分通过设置 `interval` 字段来实现,单位为秒。若不进行设置,则使用创建监控时设置的默认刷新时间。
-------
### 监控模板YML
**HertzBeat的设计是一个监控模板对应一个监控类型,所有监控类型都是由监控模板来定义的**
> 监控模板YML定义了 *监控类型的名称(国际化), 配置参数映射, 采集指标信息, 采集协议配置* 等。
下面使用样例详细介绍下这监控模板YML的配置用法。
样例:自定义一个 `app` 名称为 `example2` 的自定义监控类型,其使用HTTP协议采集指标数据。
[监控模板] -> [新增监控类型] -> [右边配置如下监控模板YML] -> [保存并应用]
```yaml
# The monitoring type categoryservice-application service monitoring db-database monitoring custom-custom monitoring os-operating system monitoring
# 监控类型所属类别:service-应用服务 program-应用程序 db-数据库 custom-自定义 os-操作系统 bigdata-大数据 mid-中间件 webserver-web服务器 cache-缓存 cn-云原生 network-网络监控等等
category: custom
# The monitoring type eg: linux windows tomcat mysql aws...
# 监控类型 eg: linux windows tomcat mysql aws...
app: example2
# The monitoring i18n name
# 监控类型国际化名称
name:
zh-CN: 模拟网站监测
en-US: EXAMPLE WEBSITE
# The description and help of this monitoring type
help:
zh-CN: HertzBeat 支持自定义监控,您只需配置监控模板 YML 就能适配一款自定义的监控类型。`<br>`定义流程如下:HertzBeat 页面 -> 监控模板菜单 -> 新增监控类型 -> 配置自定义监控模板YML -> 点击保存应用 -> 使用新监控类型添加监控。
en-US: "HertzBeat supports custom monitoring, and you only need to configure the monitoring template YML to adapt to a custom monitoring type. `<br>`Definition process as follow: HertzBeat Pages -> Main Menu -> Monitor Template -> edit and save -> apply this template."
zh-TW: HertzBeat支持自定義監控,您只需配寘監控模板YML就能適配一款自定義的監控類型。`<br>`定義流程如下:HertzBeat頁面->監控模板選單->新增監控類型->配寘自定義監控模板YML ->點擊保存應用->使用新監控類型添加監控。
helpLink:
zh-CN: https://hertzbeat.apache.org/zh-cn/docs/advanced/extend-point/
en-US: https://hertzbeat.apache.org/docs/advanced/extend-point/
# 监控所需输入参数定义(根据定义渲染页面UI)
# Input params define for monitoring(render web ui by the definition)
params:
# field-param field key
# field-变量字段标识符
- field: host
# name-param field display i18n name
# name-参数字段显示名称
name:
zh-CN: 主机Host
en-US: Host
# type-param field type(most mapping the html input type)
# type-字段类型,样式(大部分映射input标签type属性)
type: host
# required-true or false
# required-是否是必输项 true-必填 false-可选
required: true
# field-param field key
# field-变量字段标识符
- field: port
# name-param field display i18n name
# name-参数字段显示名称
name:
zh-CN: 端口
en-US: Port
# type-param field type(most mapping the html input type)
# type-字段类型,样式(大部分映射input标签type属性)
type: number
# when type is number, range is required
# 当type为number时,用range表示范围
range: '[0,65535]'
# required-true or false
# required-是否是必输项 true-必填 false-可选
required: true
# default value
# 默认值
defaultValue: 80
# field-param field key
# field-变量字段标识符
- field: uri
# name-param field display i18n name
# name-参数字段显示名称
name:
zh-CN: 相对路径
en-US: URI
# type-param field type(most mapping the html input tag)
# type-字段类型,样式(大部分映射input标签type属性)
type: text
# when type is text, use limit to limit string length
# 当type为text时,用limit表示字符串限制大小
limit: 200
# required-true or false
# required-是否是必输项 true-必填 false-可选
required: false
# 参数输入框提示信息
# param field input placeholder
placeholder: 'Website uri path(no ip port) EG:/console'
# field-param field key
# field-变量字段标识符
- field: ssl
# name-param field display i18n name
# name-参数字段显示名称
name:
zh-CN: 启用HTTPS
en-US: HTTPS
# type-param field type(most mapping the html input type)
# type-字段类型,样式(大部分映射input标签type属性)
type: boolean
# required-true or false
# required-是否是必输项 true-必填 false-可选
required: true
# field-param field key
# field-变量字段标识符
- field: timeout
# name-param field display i18n name
# name-参数字段显示名称
name:
zh-CN: 超时时间(ms)
en-US: Timeout(ms)
# type-param field type(most mapping the html input tag)
# type-字段类型,样式(大部分映射input标签type属性)
type: number
# required-true or false
# required-是否是必输项 true-必填 false-可选
required: false
# hide param-true or false
# 是否隐藏字段 true or false
hide: true
metrics:
# metrics - summary, inner monitoring metrics (responseTime - response time, keyword - number of keywords)
# 监控指标 - summary, 内置监控指标有 (responseTime - 响应时间, keyword - 关键字数量)
- name: summary
# 指标调度优先级(0-127)越小优先级越高,优先级低的指标会等优先级高的指标采集完成后才会被调度,相同优先级的指标会并行调度采集
# metrics scheduling priority(0->127)->(high->low), metrics with the same priority will be scheduled in parallel
# priority 0's metrics is availability metrics, it will be scheduled first, only availability metrics collect success will the scheduling continue
# 指标采集调度优先级(0->127)->(优先级高->低) 优先级低的指标会等优先级高的指标采集完成后才会被调度, 相同优先级的指标会并行调度采集
# 优先级为0的指标为可用性指标,即它会被首先调度,采集成功才会继续调度其它指标,采集失败则中断调度
priority: 0
# refresh interval for this metrics group
# 该指标组刷新时间
interval: 10
# collect metrics content
# 具体监控指标列表
fields:
# field-metric name, type-metric type(0-number,1-string), unit-metric unit('%','ms','MB'), label-if is metrics label
# field-指标名称, type-指标类型(0-number数字,1-string字符串), unit-指标单位('%','ms','MB'), label-是否是指标集合唯一标识符字段
- field: responseTime
type: 0
unit: ms
- field: keyword
type: 0
# the protocol used for monitoring, eg: sql, ssh, http, telnet, wmi, snmp, sdk
protocol: http
# the config content when protocol is http
http:
# http host: ipv4 ipv6 domain
host: ^_^host^_^
# http port
port: ^_^port^_^
# http url
url: ^_^uri^_^
timeout: ^_^timeout^_^
# http method: GET POST PUT DELETE PATCH
method: GET
# if enabled https
ssl: ^_^ssl^_^
# http response data parse type: default-hertzbeat rule, jsonpath-jsonpath script, website-for website monitoring, prometheus-prometheus exporter rule
# http 响应数据解析方式: default-系统规则, jsonPath-jsonPath脚本, website-网站可用性指标监控, prometheus-Prometheus数据规则
parseType: website
```
@@ -0,0 +1,26 @@
---
id: extend-push
title: Push Style Custom Monitoring
sidebar_label: Push Style Custom Monitoring
---
> 推送方式监控是一种特殊的监控,允许用户配置数据格式并编写代码将指标推送到 HertzBeat。
> 下面我们将介绍如何使用这一功能。
## 推送方式监控的采集流程
【用户开始推送数据】->【HertzBeat推送模块暂存数据】->【HertzBeat采集模块定期采集数据】
### 数据解析方式
HertzBeat会使用用户添加新监控时配置的格式来解析数据。
### 创建监控步骤
HertzBeat页面 -> 应用服务监控 -> 推送方式监控 -> 新建推送方式监视器 -> 设置推送模块主机(HertzBeat服务器ip,通常为127.0.0.1或localhost -> 设置推送模块端口(hertzbeat服务器端口,通常为1157) -> 配置数据字段(单位:字符串表示,类型:0表示数字/1表示字符串)-> 结束
---
### 监控配置示例
![HertzBeat](/img/docs/advanced/extend-push-example-1.png)
@@ -0,0 +1,209 @@
---
id: extend-snmp
title: SNMP协议自定义监控
sidebar_label: SNMP协议自定义监控
---
> 从[自定义监控](extend-point)了解熟悉了怎么自定义类型,指标,协议等,这里我们来详细介绍下用 SNMP 协议自定义指标监控。
> SNMP 协议自定义监控可以让我们很方便的通过配置 Mib OID信息 就能监控采集到我们想监控的OID指标
## SNMP协议采集流程
【**对端开启SNMP服务**】->【**HertzBeat直连对端SNMP服务**】->【**根据配置抓取对端OID指标信息**】->【**指标数据提取**】
由流程可见,我们自定义一个SNMP协议的监控类型,需要配置SNMP请求参数,配置获取哪些指标,配置查询OID信息。
### 数据解析方式
通过配置监控模板YML的指标`field`, `aliasFields`, `snmp` 协议下的 `oids`来抓取对端指定的数据并解析映射。
### 自定义步骤
**HertzBeat页面** -> **监控模板菜单** -> **新增监控类型** -> **配置自定义监控模板YML** -> **点击保存应用** -> **使用新监控类型添加监控**
![HertzBeat](/img/docs/advanced/extend-point-1.png)
-------
下面详细介绍下文件的配置用法,请注意看使用注释。
### 监控模板YML
> 监控配置定义文件用于定义 *监控类型的名称(国际化), 请求参数结构定义(前端页面根据配置自动渲染UI), 采集指标信息, 采集协议配置* 等。
> 即我们通过自定义这个YML,配置定义什么监控类型,前端页面需要输入什么参数,采集哪些性能指标,通过什么协议去采集。
样例:自定义一个名称为 example_windows 的自定义监控类型,其使用 SNMP 协议采集指标数据。
```yaml
# The monitoring type categoryservice-application service monitoring db-database monitoring mid-middleware custom-custom monitoring os-operating system monitoring
# 监控类型所属类别:service-应用服务 program-应用程序 db-数据库 custom-自定义 os-操作系统 bigdata-大数据 mid-中间件 webserver-web服务器 cache-缓存 cn-云原生 network-网络监控等等
category: os
# The monitoring type eg: linux windows tomcat mysql aws...
# 监控类型 eg: linux windows tomcat mysql aws...
app: windows
# The monitoring i18n name
# 监控类型国际化名称
name:
zh-CN: Windows操作系统
en-US: OS Windows
# 监控所需输入参数定义(根据定义渲染页面UI)
# Input params define for monitoring(render web ui by the definition)
params:
# field-param field key
# field-变量字段标识符
- field: host
# name-param field display i18n name
# name-参数字段显示名称
name:
zh-CN: 主机Host
en-US: Host
# type-param field type(most mapping the html input type)
# type-字段类型,样式(大部分映射input标签type属性)
type: host
# required-true or false
# required-是否是必输项 true-必填 false-可选
required: true
# field-param field key
# field-变量字段标识符
- field: port
# name-param field display i18n name
# name-参数字段显示名称
name:
zh-CN: 端口
en-US: Port
# type-param field type(most mapping the html input type)
# type-字段类型,样式(大部分映射input标签type属性)
type: number
# when type is number, range is required
# 当type为number时,用range表示范围
range: '[0,65535]'
# required-true or false
# required-是否是必输项 true-必填 false-可选
required: true
# default value
# 默认值
defaultValue: 161
# field-param field key
# field-变量字段标识符
- field: version
# name-param field display i18n name
# name-参数字段显示名称
name:
zh-CN: SNMP 版本
en-US: SNMP Version
# type-param field type(radio mapping the html radio tag)
# type-当type为radio时,前端用radio展示开关
type: radio
# required-true or false
# required-是否是必输项 true-必填 false-可选
required: true
# when type is radio checkbox, use option to show optional values {name1:value1,name2:value2}
# 当type为radio单选框, checkbox复选框时, option表示可选项值列表 {name1:value1,name2:value2}
options:
- label: SNMPv1
value: 0
- label: SNMPv2c
value: 1
# field-param field key
# field-变量字段标识符
- field: community
# name-param field display i18n name
# name-参数字段显示名称
name:
zh-CN: SNMP 团体字
en-US: SNMP Community
# type-param field type(most mapping the html input type)
# type-字段类型,样式(大部分映射input标签type属性)
type: text
# when type is text, use limit to limit string length
# 当type为text时,用limit表示字符串限制大小
limit: 100
# required-true or false
# required-是否是必输项 true-必填 false-可选
required: true
# 参数输入框提示信息
# param field input placeholder
placeholder: 'Snmp community for v1 v2c'
# field-param field key
# field-变量字段标识符
- field: timeout
# name-param field display i18n name
# name-参数字段显示名称
name:
zh-CN: 超时时间(ms)
en-US: Timeout(ms)
# type-param field type(most mapping the html input type)
# type-字段类型,样式(大部分映射input标签type属性)
type: number
# when type is number, range is required
# 当type为number时,用range表示范围
range: '[0,100000]'
# required-true or false
# required-是否是必输项 true-必填 false-可选
required: false
# hide-is hide this field and put it in advanced layout
# hide-是否隐藏此参数将其放入高级设置中
hide: true
# default value
# 默认值
defaultValue: 6000
# collect metrics config list
# 采集指标配置列表
metrics:
# metrics - system
# 监控指标 - system
- name: system
# metrics scheduling priority(0->127)->(high->low), metrics with the same priority will be scheduled in parallel
# priority 0's metrics is availability metrics, it will be scheduled first, only availability metrics collect success will the scheduling continue
# 指标采集调度优先级(0->127)->(优先级高->低) 优先级低的指标会等优先级高的指标采集完成后才会被调度, 相同优先级的指标会并行调度采集
# 优先级为0的指标为可用性指标,即它会被首先调度,采集成功才会继续调度其它指标,采集失败则中断调度
priority: 0
# collect metrics content
# 具体监控指标列表
fields:
# field-metric name, type-metric type(0-number,1-string), unit-metric unit('%','ms','MB'), label-if is metrics label
# field-指标名称, type-指标类型(0-number数字,1-string字符串), unit-指标单位('%','ms','MB'), label-是否是指标集合唯一标识符字段
- field: name
type: 1
- field: descr
type: 1
- field: uptime
type: 1
- field: numUsers
type: 0
- field: services
type: 0
- field: processes
type: 0
- field: responseTime
type: 0
unit: ms
- field: location
type: 1
# the protocol used for monitoring, eg: sql, ssh, http, telnet, wmi, snmp, sdk
protocol: snmp
# the config content when protocol is snmp
snmp:
# server host: ipv4 ipv6 domain
host: ^_^host^_^
# server port
port: ^_^port^_^
# snmp connect timeout
timeout: ^_^timeout^_^
# snmp community
# snmp 团体字
community: ^_^community^_^
# snmp version
version: ^_^version^_^
# snmp operation: get, walk
operation: get
# metrics oids: metric_name - oid_value
oids:
name: 1.3.6.1.2.1.1.5.0
descr: 1.3.6.1.2.1.1.1.0
uptime: 1.3.6.1.2.1.25.1.1.0
numUsers: 1.3.6.1.2.1.25.1.5.0
services: 1.3.6.1.2.1.1.7.0
processes: 1.3.6.1.2.1.25.1.6.0
location: 1.3.6.1.2.1.1.6.0
```
@@ -0,0 +1,218 @@
---
id: extend-ssh
title: SSH协议自定义监控
sidebar_label: SSH协议自定义监控
---
> 从[自定义监控](extend-point)了解熟悉了怎么自定义类型,指标,协议等,这里我们来详细介绍下用SSH协议自定义指标监控。
> SSH协议自定义监控可以让我们很方便的通过写sh命令脚本就能监控采集到我们想监控的Linux指标
## SSH协议采集流程
【**系统直连Linux**】->【**运行SHELL命令脚本语句**】->【**响应数据解析:oneRow, multiRow**】->【**指标数据提取**】
由流程可见,我们自定义一个SSH协议的监控类型,需要配置SSH请求参数,配置获取哪些指标,配置查询脚本语句。
### 数据解析方式
SHELL脚本查询回来的数据字段和我们需要的指标映射,就能获取对应的指标数据,目前映射解析方式有两种:oneRow, multiRow,能满足绝大部分指标需求。
#### **oneRow**
> 查询出一列数据, 通过查询返回结果集的字段值(一行一个值)与字段映射
例如:
需要查询Linux的指标 hostname-主机名称,uptime-启动时间
主机名称原始查询命令:`hostname`
启动时间原始查询命令:`uptime | awk -F "," '{print $1}'`
则在hertzbeat对应的这两个指标的查询脚本为(用`;`将其连接到一起)
`hostname; uptime | awk -F "," '{print $1}'`
终端响应的数据为:
```shell
tombook
14:00:15 up 72 days
```
则最后采集到的指标数据一一映射为:
hostname值为 `tombook`
uptime值为 `14:00:15 up 72 days`
这里指标字段就能和响应数据一一映射为一行采集数据。
#### **multiRow**
> 查询多行数据, 通过查询返回结果集的列名称,和查询的指标字段映射
例如:
查询的Linux内存相关指标字段:total-内存总量 used-已使用内存 free-空闲内存 buff-cache-缓存大小 available-可用内存
内存指标原始查询命令为:`free -m`, 控制台响应:
```shell
total used free shared buff/cache available
Mem: 7962 4065 333 1 3562 3593
Swap: 8191 33 8158
```
在hertzbeat中multiRow格式解析需要响应数据列名称和指标值一一映射,则对应的查询SHELL脚本为:
`free -m | grep Mem | awk 'BEGIN{print "total used free buff_cache available"} {print $2,$3,$4,$6,$7}'`
控制台响应为:
```shell
total used free buff_cache available
7962 4066 331 3564 3592
```
这里指标字段就能和响应数据一一映射为采集数据。
### 自定义步骤
**HertzBeat页面** -> **监控模板菜单** -> **新增监控类型** -> **配置自定义监控模板YML** -> **点击保存应用** -> **使用新监控类型添加监控**
![HertzBeat](/img/docs/advanced/extend-point-1.png)
-------
下面详细介绍下文件的配置用法,请注意看使用注释。
### 监控模板YML
> 监控配置定义文件用于定义 *监控类型的名称(国际化), 请求参数结构定义(前端页面根据配置自动渲染UI), 采集指标信息, 采集协议配置* 等。
> 即我们通过自定义这个YML,配置定义什么监控类型,前端页面需要输入什么参数,采集哪些性能指标,通过什么协议去采集。
样例:自定义一个名称为example_linux的自定义监控类型,其使用SSH协议采集指标数据。
```yaml
# 监控类型所属类别:service-应用服务 program-应用程序 db-数据库 custom-自定义 os-操作系统 bigdata-大数据 mid-中间件 webserver-web服务器 cache-缓存 cn-云原生 network-网络监控等等
category: os
# 监控应用类型(与文件名保持一致) eg: linux windows tomcat mysql aws...
app: example_linux
name:
zh-CN: 模拟LINUX应用类型
en-US: LINUX EXAMPLE APP
# 监控参数定义. field 这些为输入参数变量,即可以用^_^host^_^的形式写到后面的配置中,系统自动变量值替换
# 强制固定必须参数 - host
params:
- field: host
name:
zh-CN: 主机Host
en-US: Host
type: host
required: true
- field: port
name:
zh-CN: 端口
en-US: Port
type: number
range: '[0,65535]'
required: true
defaultValue: 22
placeholder: '请输入端口'
- field: username
name:
zh-CN: 用户名
en-US: Username
type: text
limit: 50
required: true
- field: password
name:
zh-CN: 密码
en-US: Password
type: password
required: true
# collect metrics config list
# 采集指标配置列表
metrics:
# 第一个监控指标 basic
# 注意:内置监控指标有 (responseTime - 响应时间)
- name: basic
# 指标调度优先级(0-127)越小优先级越高,优先级低的指标会等优先级高的指标采集完成后才会被调度,相同优先级的指标会并行调度采集
# 优先级为0的指标为可用性指标,即它会被首先调度,采集成功才会继续调度其它指标,采集失败则中断调度
priority: 0
# 具体监控指标列表
fields:
# 指标信息 包括 field名称 type字段类型:0-number数字,1-string字符串 label是否为标签 unit:指标单位
- field: hostname
type: 1
label: true
- field: version
type: 1
- field: uptime
type: 1
# 监控采集使用协议 eg: sql, ssh, http, telnet, wmi, snmp, sdk
protocol: ssh
# 当protocol为http协议时具体的采集配置
ssh:
# 主机host: ipv4 ipv6 域名
host: ^_^host^_^
# 端口
port: ^_^port^_^
username: ^_^username^_^
password: ^_^password^_^
script: (uname -r ; hostname ; uptime | awk -F "," '{print $1}' | sed "s/ //g") | sed ":a;N;s/\n/^/g;ta" | awk -F '^' 'BEGIN{print "version hostname uptime"} {print $1, $2, $3}'
# 响应数据解析方式:oneRow, multiRow
parseType: multiRow
- name: cpu
priority: 1
fields:
# 指标信息 包括 field名称 type字段类型:0-number数字,1-string字符串 label是否为标签 unit:指标单位
- field: info
type: 1
- field: cores
type: 0
unit: 核数
- field: interrupt
type: 0
unit: 个数
- field: load
type: 1
- field: context_switch
type: 0
unit: 个数
# 监控采集使用协议 eg: sql, ssh, http, telnet, wmi, snmp, sdk
protocol: ssh
# 当protocol为http协议时具体的采集配置
ssh:
# 主机host: ipv4 ipv6 域名
host: ^_^host^_^
# 端口
port: ^_^port^_^
username: ^_^username^_^
password: ^_^password^_^
script: "LANG=C lscpu | awk -F: '/Model name/ {print $2}';awk '/processor/{core++} END{print core}' /proc/cpuinfo;uptime | sed 's/,/ /g' | awk '{for(i=NF-2;i<=NF;i++)print $i }' | xargs;vmstat 1 1 | awk 'NR==3{print $11}';vmstat 1 1 | awk 'NR==3{print $12}'"
parseType: oneRow
- name: memory
priority: 2
fields:
# 指标信息 包括 field名称 type字段类型:0-number数字,1-string字符串 label是否为标签 unit:指标单位
- field: total
type: 0
unit: Mb
- field: used
type: 0
unit: Mb
- field: free
type: 0
unit: Mb
- field: buff_cache
type: 0
unit: Mb
- field: available
type: 0
unit: Mb
# 监控采集使用协议 eg: sql, ssh, http, telnet, wmi, snmp, sdk
protocol: ssh
# 当protocol为http协议时具体的采集配置
ssh:
# 主机host: ipv4 ipv6 域名
host: ^_^host^_^
# 端口
port: ^_^port^_^
username: ^_^username^_^
password: ^_^password^_^
script: free -m | grep Mem | awk 'BEGIN{print "total used free buff_cache available"} {print $2,$3,$4,$6,$7}'
parseType: multiRow
```
@@ -0,0 +1,299 @@
---
id: extend-telnet
title: Telnet协议自定义监控
sidebar_label: Telnet协议自定义监控
---
> 从[自定义监控](extend-point)了解熟悉了怎么自定义类型,指标,协议等,这里我们来详细介绍下用Telnet协议自定义指标监控。
> 使用 Telnet 协议自定义监控可以让我们通过编写 Telnet 命令脚本来监控和采集我们想要监控的 Linux 指标
## Telnet协议采集流程
【**系统直连Linux**】->【**运行TELNET命令脚本语句**】->【**响应数据解析**】->【**指标数据提取**】
由流程可见,我们自定义一个Telnet协议的监控类型,需要配置Telnet请求参数,配置获取哪些指标,配置查询脚本语句。
### 数据解析方式
通过配置监控模板YML的指标field, aliasFields, telnet 协议下的获取数据映射。
### 自定义步骤
**HertzBeat页面** -> **监控模板菜单** -> **新增监控类型** -> **配置自定义监控模板YML** -> **点击保存应用** -> **使用新监控类型添加监控**
![HertzBeat](/img/docs/advanced/extend-point-1.png)
-------
下面详细介绍下文件的配置用法,请注意看使用注释。
### 监控模板YML
> 监控配置定义文件用于定义 *监控类型的名称(国际化), 请求参数结构定义(前端页面根据配置自动渲染UI), 采集指标信息, 采集协议配置* 等。
> 即我们通过自定义这个YML,配置定义什么监控类型,前端页面需要输入什么参数,采集哪些性能指标,通过什么协议去采集。
样例:自定义一个名称为zookeeper的自定义监控类型,其使用telnet协议采集指标数据。
```yaml
# The monitoring type categoryservice-application service monitoring db-database monitoring custom-custom monitoring os-operating system monitoring
# 监控类型所属类别:service-应用服务 program-应用程序 db-数据库 custom-自定义 os-操作系统 bigdata-大数据 mid-中间件 webserver-web服务器 cache-缓存 cn-云原生 network-网络监控等等
category: mid
# Monitoring application type(consistent with the file name) eg: linux windows tomcat mysql aws...
# 监控应用类型(与文件名保持一致) eg: linux windows tomcat mysql aws...
app: zookeeper
# The monitoring i18n name
# 监控类型国际化名称
name:
zh-CN: Zookeeper服务
en-US: Zookeeper Server
# 监控参数定义. field 这些为输入参数变量,即可以用^_^host^_^的形式写到后面的配置中,系统自动变量值替换
# 强制固定必须参数 - host
params:
# field-param field key
# field-字段名称标识符
- field: host
# name-param field display i18n name
# name-参数字段显示名称
name:
zh-CN: 主机Host
en-US: Host
# type-param field type(most mapping the html input type)
# type-字段类型,样式(大部分映射input标签type属性)
type: host
# required-true or false
# 是否是必输项 true-必填 false-可选
required: true
# field-param field key
# field-字段名称标识符
- field: port
# name-param field display i18n name
# name-参数字段显示名称
name:
zh-CN: 端口
en-US: Port
# type-param field type(most mapping the html input type)
# type-字段类型,样式(大部分映射input标签type属性)
type: number
# when type is number, range is required
# 当type为number时,用range表示范围
range: '[0,65535]'
# required-true or false
# 是否是必输项 true-必填 false-可选
required: true
# default
# 默认值
defaultValue: 2181
# param field input placeholder
# 参数输入框提示信息
placeholder: '请输入端口'
# field-param field key
# field-字段名称标识符
- field: timeout
# name-param field display i18n name
# name-参数字段显示名称
name:
zh-CN: 查询超时时间(ms)
en-US: Query Timeout(ms)
# type-param field type(most mapping the html input type)
# type-字段类型,样式(大部分映射input标签type属性)
type: number
# required-true or false
# 是否是必输项 true-必填 false-可选
required: false
# hide-is hide this field and put it in advanced layout
# 隐藏是隐藏这个字段,并把它放在高级布局
hide: true
# default
# 默认值
defaultValue: 6000
# collect metrics config list
# 采集指标配置列表
metrics:
# metrics - conf
# 第一个监控指标 conf
# 注意:内置监控指标有 (responseTime - 响应时间)
- name: conf
# metrics scheduling priority(0->127)->(high->low), metrics with the same priority will be scheduled in parallel
# priority 0's metrics is availability metrics, it will be scheduled first, only availability metrics collect success will the scheduling continue
# 指标采集调度优先级(0->127)->(优先级高->低) 优先级低的指标会等优先级高的指标采集完成后才会被调度, 相同优先级的指标会并行调度采集
# 优先级为0的指标为可用性指标,即它会被首先调度,采集成功才会继续调度其它指标,采集失败则中断调度
priority: 0
# collect metrics content
# 具体监控指标列表
fields:
# field-metric name, type-metric type(0-number,1-string), unit-metric unit('%','ms','MB'), label-if is metrics label
# 指标信息 包括 field名称 type字段类型:0-number数字,1-string字符串 label是否为标签 unit:指标单位
- field: clientPort
type: 0
i18n:
zh-CN: 客户端端口
en-US: Client Port
- field: dataDir
type: 1
i18n:
zh-CN: 数据目录
en-US: Data Directory
- field: dataDirSize
type: 0
unit: kb
i18n:
zh-CN: 数据目录大小
en-US: Data Directory Size
- field: dataLogDir
type: 1
i18n:
zh-CN: 日志目录
en-US: Data Log Directory
- field: dataLogSize
type: 0
unit: kb
i18n:
zh-CN: 日志目录大小
en-US: Data Log Size
- field: tickTime
type: 0
unit: ms
i18n:
zh-CN: 心跳间隔时间
en-US: Tick Time
- field: maxClientCnxns
type: 1
i18n:
zh-CN: 最大客户端连接数
en-US: Max Client Connections
- field: minSessionTimeout
type: 0
unit: ms
i18n:
zh-CN: 最小会话超时
en-US: Min Session Timeout
- field: maxSessionTimeout
type: 0
unit: ms
i18n:
zh-CN: 最大会话超时
en-US: Max Session Timeout
- field: serverId
type: 0
i18n:
zh-CN: 服务器ID
en-US: Server ID
# the protocol used for monitoring, eg: sql, ssh, http, telnet, wmi, snmp, sdk
# 监控采集使用协议 eg: sql, ssh, http, telnet, wmi, snmp, sdk
protocol: telnet
# the config content when protocol is telnet
# 当protocol为telnet协议时具体的采集配置
telnet:
# host: ipv4 ipv6 domain
# 主机host: ipv4 ipv6 域名
host: ^_^host^_^
# port
# 端口
port: ^_^port^_^
# timeout
# 超时时间
timeout: ^_^timeout^_^
# telnet instruction
# telnet指令
cmd: conf
- name: stats
priority: 1
fields:
- field: zk_version
type: 1
i18n:
zh-CN: ZooKeeper版本
en-US: ZooKeeper Version
- field: zk_server_state
type: 1
i18n:
zh-CN: 服务器状态
en-US: Server State
- field: zk_num_alive_connections
type: 0
unit:
i18n:
zh-CN: 存活连接数
en-US: Number of Alive Connections
- field: zk_avg_latency
type: 0
unit: ms
i18n:
zh-CN: 平均延迟
en-US: Average Latency
- field: zk_outstanding_requests
type: 0
unit:
i18n:
zh-CN: 未完成请求数
en-US: Outstanding Requests
- field: zk_znode_count
type: 0
unit:
i18n:
zh-CN: ZNode数量
en-US: ZNode Count
- field: zk_packets_sent
type: 0
unit:
i18n:
zh-CN: 发送数据包数
en-US: Packets Sent
- field: zk_packets_received
type: 0
unit:
i18n:
zh-CN: 接收数据包数
en-US: Packets Received
- field: zk_watch_count
type: 0
unit:
i18n:
zh-CN: Watch数量
en-US: Watch Count
- field: zk_max_file_descriptor_count
type: 0
unit:
i18n:
zh-CN: 最大文件描述符数量
en-US: Max File Descriptor Count
- field: zk_approximate_data_size
type: 0
unit: kb
i18n:
zh-CN: 大致数据大小
en-US: Approximate Data Size
- field: zk_open_file_descriptor_count
type: 0
unit:
i18n:
zh-CN: 打开的文件描述符数量
en-US: Open File Descriptor Count
- field: zk_max_latency
type: 0
unit: ms
i18n:
zh-CN: 最大延迟
en-US: Max Latency
- field: zk_ephemerals_count
type: 0
unit:
i18n:
zh-CN: 临时节点数量
en-US: Ephemerals Count
- field: zk_min_latency
type: 0
unit: ms
i18n:
zh-CN: 最小延迟
en-US: Min Latency
protocol: telnet
telnet:
host: ^_^host^_^
port: ^_^port^_^
timeout: ^_^timeout^_^
cmd: mntr
```
@@ -0,0 +1,252 @@
---
id: extend-tutorial
title: 自定义适配一款基于HTTP协议的新监控类型
sidebar_label: 教程案例
---
通过此教程我们一步一步描述如何在 Apache HertzBeat™ 系统下自定义新增适配一款基于 http 协议的监控类型。
阅读此教程前我们希望您已经从[自定义监控](extend-point)和[http协议自定义](extend-http)了解熟悉了怎么自定义类型,指标,协议等。
## HTTP协议解析通用响应结构体,获取指标数据
>
> 很多场景我们需要对提供的 HTTP API 接口进行监控,获取接口返回的指标值。这篇文章我们通过http自定义协议来解析我们常见的http接口响应结构,获取返回体中的字段作为指标数据。
```json
{
"code": 200,
"msg": "success",
"data": {}
}
```
如上,通常我们的后台API接口会设计这这样一个通用返回。hertzbeat系统的后台也是如此,我们今天就用hertzbeat的 API 做样例,新增适配一款新的监控类型 **hertzbeat**,监控采集它的系统摘要统计API
`http://localhost:1157/api/summary`, 其响应数据为:
```json
{
"msg": null,
"code": 0,
"data": {
"apps": [
{
"category": "service",
"app": "jvm",
"status": 0,
"size": 2,
"availableSize": 0,
"unManageSize": 2,
"unAvailableSize": 0,
"unReachableSize": 0
},
{
"category": "service",
"app": "website",
"status": 0,
"size": 2,
"availableSize": 0,
"unManageSize": 2,
"unAvailableSize": 0,
"unReachableSize": 0
}
]
}
}
```
**我们这次获取其app下的 `category`,`app`,`status`,`size`,`availableSize`等指标数据。**
### 新增配置监控模板YML
**HertzBeat页面** -> **监控模板菜单** -> **新增监控类型** -> **配置自定义监控模板YML**
定义我们在页面上需要输入哪些参数,一般的HTTP协议参数主要有ip, port, headers, params, uri, 账户密码等,我们直接复用 `api`监控模板 里面的参数定义内容,删除其中的我们不需要输入的uri参数和keyword关键字等参数即可。
定义采集类型是啥,需要用哪种协议采集方式,采集的指标是啥,协议的配置参数等。我们直接复用 `api`监控模板 里面的定义内容,修改为我们当前的监控类型`hertzbeat`配置参数即可,如下:注意⚠️我们这次获取接口响应数据中的`category`,`app`,`status`,`size`,`availableSize`等字段作为指标数据。
```yaml
# The monitoring type categoryservice-application service monitoring db-database monitoring custom-custom monitoring os-operating system monitoring
# 监控类型所属类别:service-应用服务 program-应用程序 db-数据库 custom-自定义 os-操作系统 bigdata-大数据 mid-中间件 webserver-web服务器 cache-缓存 cn-云原生 network-网络监控等等
category: custom
# The monitoring type eg: linux windows tomcat mysql aws...
# 监控类型 eg: linux windows tomcat mysql aws...
app: hertzbeat
# The monitoring i18n name
# 监控类型国际化名称
name:
zh-CN: HertzBeat监控系统
en-US: HertzBeat Monitor
# The description and help of this monitoring type
help:
zh-CN: HertzBeat 对 HertzBeat 监控系统的通用指标进行测量监控。`<br>`您可以点击 “`<i>`新建 HertzBeat监控系统`</i>`” 并进行配置,或者选择“`<i>`更多操作`</i>`”,导入已有配置。
en-US: HertzBeat monitors HertzBeat Monitor through general performance metric. You could click the "`<i>`New HertzBeat Monitor`</i>`" button and proceed with the configuration or import an existing setup through the "`<i>`More Actions`</i>`" menu.
zh-TW: HertzBeat對HertzBeat監控系統的通用名額進行量測監控。`<br>`您可以點擊“`<i>`新建HertzBeat監控系統`</i>`”並進行配寘,或者選擇“`<i>`更多操作`</i>`”,導入已有配寘。
helpLink:
zh-CN: https://hertzbeat.apache.org/zh-cn/docs/help/hertzbeat
en-US: https://hertzbeat.apache.org/docs/help/hertzbeat
# Input params define for monitoring(render web ui by the definition)
# 监控所需输入参数定义(根据定义渲染页面UI)
params:
# field-param field key
# field-字段名称标识符
- field: host
# name-param field display i18n name
# name-参数字段显示名称
name:
zh-CN: 主机Host
en-US: Host
# type-param field type(most mapping the html input type)
# type-字段类型,样式(大部分映射input标签type属性)
type: host
# required-true or false
# 是否是必输项 true-必填 false-可选
required: true
# field-param field key
# field-变量字段标识符
- field: port
# name-param field display i18n name
# name-参数字段显示名称
name:
zh-CN: 端口
en-US: Port
# type-param field type(most mapping the html input type)
# type-字段类型,样式(大部分映射input标签type属性)
type: number
# when type is number, range is required
# 当type为number时,用range表示范围
range: '[0,65535]'
# required-true or false
# required-是否是必输项 true-必填 false-可选
required: true
# default value
# 端口默认值
defaultValue: 1157
- field: ssl
name:
zh-CN: 启用HTTPS
en-US: HTTPS
type: boolean
required: true
- field: timeout
name:
zh-CN: 超时时间(ms)
en-US: Timeout(ms)
type: number
required: false
hide: true
- field: authType
name:
zh-CN: 认证方式
en-US: Auth Type
type: radio
required: false
hide: true
options:
- label: Basic Auth
value: Basic Auth
- label: Digest Auth
value: Digest Auth
- field: username
name:
zh-CN: 用户名
en-US: Username
type: text
limit: 50
required: false
hide: true
- field: password
name:
zh-CN: 密码
en-US: Password
type: password
required: false
hide: true
metrics:
# the first metrics summary
# attention: Built-in monitoring metrics contains (responseTime - Response time)
- name: summary
# metrics scheduling priority(0->127)->(high->low), metrics with the same priority will be scheduled in parallel
# priority 0's metrics is availability metrics, it will be scheduled first, only availability metrics collect success will the scheduling continue
# 指标调度优先级(0-127)越小优先级越高,优先级低的指标会等优先级高的指标采集完成后才会被调度,相同优先级的指标会并行调度采集
# 优先级为0的指标为可用性指标,即它会被首先调度,采集成功才会继续调度其它指标,采集失败则中断调度
priority: 0
# collect metrics content
# 具体监控指标列表
fields:
# metrics content contains field-metric name, type-metric type:0-number,1-string, label-if is metrics label, unit-metric unit('%','ms','MB')
# 指标信息 包括 field名称 type字段类型:0-number数字,1-string字符串 label是否为标签 unit:指标单位
- field: app
type: 1
label: true
- field: category
type: 1
- field: status
type: 0
- field: size
type: 0
- field: availableSize
type: 0
# the protocol used for monitoring, eg: sql, ssh, http, telnet, wmi, snmp, sdk, we use HTTP protocol here
# 监控采集使用协议 eg: sql, ssh, http, telnet, wmi, snmp, sdk, 我们这里使用HTTP协议
protocol: http
# the config content when protocol is http
# 当protocol为http协议时具体的采集配置
http:
# http host: ipv4 ipv6 domain
# 主机host: ipv4 ipv6 域名
host: ^_^host^_^
# http port
# 端口
port: ^_^port^_^
# http url, we don't need to enter a parameter here, just set the fixed value to /api/summary
# url请求接口路径,我们这里不需要输入传参,写死为 /api/summary
url: /api/summary
timeout: ^_^timeout^_^
# http method: GET POST PUT DELETE PATCH, default fixed value is GET
# 请求方式 GET POST PUT DELETE PATCH,写死为 GET
method: GET
# if enabled https, default value is false
# 是否启用ssl/tls,即是http还是https,默认false
ssl: ^_^ssl^_^
# http auth
# 认证
authorization:
# http auth type: Basic Auth, Digest Auth, Bearer Token
# 认证方式: Basic Auth, Digest Auth, Bearer Token
type: ^_^authType^_^
basicAuthUsername: ^_^username^_^
basicAuthPassword: ^_^password^_^
digestAuthUsername: ^_^username^_^
digestAuthPassword: ^_^password^_^
# http response data parse type: default-hertzbeat rule, jsonpath-jsonpath script, website-for website monitoring, we use jsonpath to parse response data here
# 响应数据解析方式: default-系统规则,jsonPath-jsonPath脚本,website-网站可用性指标监控,我们这里使用jsonpath来解析响应数据
parseType: jsonPath
parseScript: '$.data.apps.*'
```
**点击保存并应用。我们可以看到系统页面的自定义监控菜单已经多了一个`hertzbeat`监控类型了。**
![HertzBeat](/img/docs/advanced/extend-http-example-1.png)
### 页面添加对`hertzbeat`监控类型的监控
> 我们点击新增 `HertzBeat监控系统`,配置监控IP,端口,采集周期,高级设置里的账户密码等, 点击确定添加监控。
![HertzBeat](/img/docs/advanced/extend-http-example-2.png)
![HertzBeat](/img/docs/advanced/extend-http-example-3.png)
> 过一定时间(取决于采集周期)我们就可以在监控详情看到具体的指标数据和历史图表啦!
![HertzBeat](/img/docs/advanced/extend-http-example-4.png)
### 设置阈值告警通知
> 接下来我们就可以正常设置阈值,告警触发后可以在告警中心查看,也可以新增接收人,设置告警通知等,Have Fun!!!
----
#### 完
HTTP协议的自定义监控的实践就到这里,HTTP协议还带其他参数 `headers,params` 等,我们可以像用postman一样去定义它,可玩性也非常高!
@@ -0,0 +1,58 @@
---
id: 'become_committer'
title: '成为Committer'
sidebar_position: 2
---
<!--
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
https://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
## 成为 Apache HertzBeat™ 的 Committer
任何支持社区并在 CoPDoC 领域中工作的人都可以成为 Apache HertzBeat™ 的 Committer。CoPDoC 是 ASF 的缩写,用来描述我们如何不仅仅通过代码来认识到您的贡献。
- **Community** - 你可以通过我们的邮件列表、问题追踪器、讨论页面与社区成员互动,并分享愿景和知识。
- **Project** - 需要明确的愿景和共识。
- **Documentation** - 没有它,内容只会停留在作者的头脑中。
- **Code** - 没有代码,讨论就毫无意义。
Apache HertzBeat™ 社区努力追求基于功绩的原则。因此,一旦有人在 CoPDoC 的任何领域有了足够的贡献,他们就可以成为 Committer 的候选人,最终被投票选为 HertzBeat 的 Committer。成为 Apache HertzBeat™ 的 Committer 并不一定意味着你必须使用你的提交权限向代码库提交代码;它意味着你致力于 HertzBeat 项目并为我们社区的成功做出了积极的贡献。
## Committer 的要求
没有成为 Committer 或 PMC 成员的严格规则。新的 Committer 的候选人通常是积极的贡献者和社区成员。但是,如果能稍微明确一些规则,就可以在一定程度上消除贡献者的疑虑,使社区更加透明、合理和公平。
### 持续的贡献
Committer 的候选人应该持续参与并为 HertzBeat 做出大量的贡献(例如修复漏洞、添加新功能、编写文档、维护问题板、代码审查或回答社区问题)。
- 3+ months 的活动和参与。
- 20+ pr 的代码,文档,测试等贡献。
### 贡献的质量
- 对项目有深入的理解。
- 经过充分测试、良好设计、遵循 Apache HertzBeat™ 的编码标准,及简单的修复补丁。
- 井井有条的面向用户的详细文档。
### 社区参与
- 在开发邮件列表上保持积极、礼貌与尊重,并帮助指导新的贡献者和用户。
- 在项目维护的问题跟踪器上积极、有礼貌与尊重。
- 对于拉取请求审查保持积极、有礼貌与尊重。
- 即使存在分歧,也要以专业和外交的态度参与技术路线图的讨论。
- 通过撰写文章或举办活动来推广项目。
@@ -0,0 +1,57 @@
---
id: 'become_pmc_member'
title: '成为PMC member'
sidebar_position: 3
---
<!--
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
https://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
## 成为 Apache HertzBeat™ 的 PMC 成员
任何支持社区并在 CoPDoC 领域中工作的人都可以成为 Apache HertzBeat™ 的PMC 成员。CoPDoC 是 ASF 的缩写,用来描述我们如何不仅仅通过代码来认识到您的贡献。
- **Community** - 您可以通过我们的邮件列表、问题追踪器、讨论页面与社区成员互动,并分享愿景和知识。
- **Project** - 需要明确的愿景和共识。
- **Documentation** - 没有它,内容只会停留在作者的头脑中。
- **Code** - 没有代码,讨论就毫无意义。
Apache HertzBeat™ 社区努力追求基于功绩的原则。因此,一旦有人在 CoPDoC 的任何领域有了足够的贡献,他们就可以成为 PMC 成员资格的候选人,最终被投票选为 HertzBeat 的 PMC 成员。成为 Apache HertzBeat™ 的 PMC 成员并不一定意味着您必须使用您的提交权限向代码库提交代码;它意味着您致力于 HertzBeat 项目并为我们社区的成功做出了积极的贡献。
## PMC 成员的要求
没有成为 Committer 或 PMC 成员的严格规则。新的 PMC 成员的候选人通常是积极的贡献者和社区成员。但是,如果能稍微明确一些规则,就可以在一定程度上消除贡献者的疑虑,使社区更加透明、合理和公平。
### 持续的贡献
PMC 成员的候选人应该持续参与并为 HertzBeat 做出大量的贡献(例如修复漏洞、添加新功能、编写文档、维护问题板、代码审查或回答社区问题)。
- 12+ months 的活动和参与。
### 贡献的质量
- 对项目有深入的理解。
- 经过充分测试、良好设计、遵循 Apache HertzBeat™ 的编码标准,及简单的修复补丁。
- 井井有条的面向用户的详细文档。
### 社区参与
- 在开发邮件列表上保持积极、礼貌与尊重,并帮助指导新的贡献者和用户。
- 在项目维护的问题跟踪器上积极、有礼貌与尊重。
- 对于拉取请求审查保持积极、有礼貌与尊重。
- 即使存在分歧,也要以专业和外交的态度参与技术路线图的讨论。
- 通过撰写文章或举办活动来推广项目。
@@ -0,0 +1,649 @@
---
id: 'code_style_and_quality_guide'
title: '代码风格和质量指南'
sidebar_position: 3
---
<!--
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
https://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
## 1 拉取请求与变更规则
1. `ISSUE`/`PR`(拉取请求) 的引导和命名
- 新建 `PR` 后需要在 `PR` 页面的 Github Development 按钮处关联已存在的对应 `ISSUE`(若无建议新建对应ISSUE)
- 标题命名格式(英文,小写)
`[feature/bugfix/doc/improve/refactor/bug/cleanup] title`
2. 添加描述信息
- 新建 `PR` 时请仔细描述此贡献,描述文档和代码同样重要。审阅者可以从描述中,而不仅仅是从代码中,了解问题和解决方案。
- 勾选是否完成了对应的 Checklist。
3. 建议一次 `PR` 只包含一个功能/一种修复/一类改进/一种重构/一次清理/一类文档等
4. 提交消息(英文,小写,无特殊字符)
消息的提交应遵循与 `PR` 类似的模式:`[feature/bugfix/doc/improve/refactor/bug/cleanup] title`
## 2 代码检查样式
### 2.1 配置 Checkstyle
1. 安装 Checkstyle-IDEA 插件.
2. 打开 Checkstyle 设置. 点击 **Settings****Tools****Checkstyle**
3. 设置 **Checkstyle version** 的版本为: **10.14.2**
4. 设置 **Scan scope****Only Java sources (including tests)**
5. 点击 **+** 按钮在 **Configuration** 部分打开一个对话框选择 checkstyle 配置文件。
1. 输入描述名称,比如:hertzbeat。
2. 选择 **Use a local checkstyle file**
3. 设置 **File** 路径为: **script/checkstyle/checkstyle.xml**
4. 选择 **Store relative to project location**
5. 点击 **Next****Next****Finish**
6. 激活刚才的 **Checkstyle** 配置。
7. 点击 **OK**
- 后端代码规范 Maven 插件:`checkstyle`
后端运行 `mvn checkstyle:checkstyle`
- 前端代码格式化插件 `eslint`
前端运行 `pnpm run lint:fix`
### 2.2 文档样式检查
1. 安装`markdownlint-cli2`,运行`npm install markdownlint-cli2 --global`
2. 在项目中运行`markdownlint-cli2 "home/**/*.md"`,会执行Markdown文件格式自动检测。
3. 在项目中运行`markdownlint-cli2 --fix "home/**/*.md"`,会执行Markdown文件格式自动格式化,以确保所有文档都符合规范。
> 提示: 修复只能修复部分问题,根据检查后的错误信息,手动调整。
错误码说明:
| 错误代码 |说明 |
|---------------------------------------| ------------------------|
| **MD001 heading-increment** | 标题级别应一次只递增一个级别 |
| **MD003 heading-style** | 标题样式 |
| **MD004 ul-style** | 无序列表样式 |
| **MD005 list-indent** | 同一层级的列表项缩进不一致 |
| **MD007 ul-indent** | 无序列表缩进 |
| **MD009 no-trailing-spaces** | 行尾空格 |
| **MD010 no-hard-tabs** | 硬制表符 |
| **MD011 no-reversed-links** | 链接语法反转 |
| **MD012 no-multiple-blanks** | 多个连续空行 |
| **MD013 line-length** | 行长度 |
| **MD014 commands-show-output** | 命令前使用 `$` 符号但未显示输出 |
| **MD018 no-missing-space-atx** | ATX 样式标题符号后缺少空格 |
| **MD019 no-multiple-space-atx** | ATX 样式标题符号后有多个空格 |
| **MD020 no-missing-space-closed-atx** | 闭合 ATX 样式标题符号内部缺少空格 |
| **MD021 no-multiple-space-closed-atx** | 闭合 ATX 样式标题符号内部有多个空格 |
| **MD022 blanks-around-headings** | 标题周围应有空行 |
| **MD023 heading-start-left** | 标题必须从行首开始 |
| **MD024 no-duplicate-heading** | 存在多个内容相同的标题 |
| **MD025 single-title/single-h1** | 同一文档中有多个一级标题 |
| **MD026 no-trailing-punctuation** | 标题中有尾随标点符号 |
| **MD027 no-multiple-space-blockquote** | 引用符号后有多个空格 |
| **MD028 no-blanks-blockquote** | 引用块内有空行 |
| **MD029 ol-prefix** | 有序列表项前缀 |
| **MD030 list-marker-space** | 列表标记后的空格 |
| **MD031 blanks-around-fences** | 围栏代码块应被空行包围 |
| **MD032 blanks-around-lists** | 列表应被空行包围 |
| **MD033 no-inline-html** | 内联 HTML |
| **MD034 no-bare-urls** | 使用了裸露的 URL |
| **MD035 hr-style** | 水平分割线样式 |
| **MD036 no-emphasis-as-heading** | 不应使用强调样式代替标题 |
| **MD037 no-space-in-emphasis** | 强调标记内有空格 |
| **MD038 no-space-in-code** | 代码片段元素内有空格 |
| **MD039 no-space-in-links** | 链接文本内有空格 |
| **MD040 fenced-code-language** | 围栏代码块应指定语言 |
| **MD041 first-line-heading/first-line-h1** | 文件的第一行应为一级标题 |
| **MD042 no-empty-links** | 链接不可为空 |
| **MD043 required-headings** | 必须的标题结构 |
| **MD044 proper-names** | 专有名词应正确大写 |
| **MD045 no-alt-text** | 图片应有替代文字(alt 文本) |
| **MD046 code-block-style** | 代码块样式 |
| **MD047 single-trailing-newline** | 文件应以单个换行符结尾 |
| **MD048 code-fence-style** | 代码围栏样式 |
| **MD049 emphasis-style** | 强调样式 |
| **MD050 strong-style** | 粗体样式 |
| **MD051 link-fragments** | 链接片段应有效 |
| **MD052 reference-links-images** | 引用链接和图片应使用已定义的标签 |
| **MD053 link-image-reference-definitions** | 链接和图片引用定义应是必要的 |
| **MD054 link-image-style** | 链接和图片样式 |
| **MD055 table-pipe-style** | 表格管道样式 |
| **MD056 table-column-count** | 表格列数 |
## 3 编程规范
### 3.1 命名风格
1. 优先为变量命名选择名词,这样更容易区分`变量``方法`
```java
Cache`<String>` publicKeyCache;
```
2. 变量的拼音缩写是禁止的(排除地名等名词),例如chengdu。
3. 推荐的变量名以 `类型` 结尾。
对于 `Collection/List` 类型的变量,取 `xxxx` (复数表示多个元素)或以 `xxxList` (特定类型)结束。
对于 `map` 类型的变量,清晰地描述 `key` 和 `value`
```java
Map<Long, User> idUserMap;
Map<Long, String> userIdNameMap;
```
4. 通过其名称直观地知道变量的类型和含义。
方法名称应首先以动词开始,如下所示:
```java
void computeVcores(Object parameter1);
```
> 注意:在 `Builder` 工具类中不必严格遵循这项规则。
### 3.2 常量变量定义
1. 多余的字符串应提取为常量
> 如果一个常量被硬编码两次或多次,请直接提取它为常量并更改相应的引用。
> 通常,`log` 中的常量可以忽略提取。
- 负面示例:
```java
public static RestResponse success(Object data) {
RestResponse resp = new RestResponse();
resp.put("status", "success");
resp.put("code", ResponseCode.CODE_SUCCESS);
resp.put("data", data);
return resp;
}
public static RestResponse error() {
RestResponse resp = new RestResponse();
resp.put("status", "error");
resp.put("code", ResponseCode.CODE_FAIL);
resp.put("data", null);
return resp;
}
```
- 正面示例:
> 字符串提取为常量引用。
```java
public static final String STATUS = "status";
public static final String CODE = "code";
public static final String DATA = "data";
public static RestResponse success(Object data) {
RestResponse resp = new RestResponse();
resp.put(STATUS, "success");
resp.put(CODE, ResponseCode.CODE_SUCCESS);
resp.put(DATA, data);
return resp;
}
public static RestResponse error() {
RestResponse resp = new RestResponse();
resp.put(STATUS, "error");
resp.put(CODE, ResponseCode.CODE_FAIL);
resp.put(DATA, null);
return resp;
}
```
2. 确保代码的可读性和直观性
- `annotation` 符号中的字符串不需要提取为常量。
- 被引用的 `package` 或 `resource` 名称不需要提取为常量。
3. 未被重新分配的变量也必须声明为 `<mark>` final `</mark>` 类型。
4. 关于 `constant/variable` 行的排序顺序
按以下顺序对类中的变量行进行排序:
1. `public static final V`, `static final V`,`protected static final V`, `private static final V`
2. `public static v`, `static v`,`protected static v`, `private static v`
3. `public v`, `v`, `protected v`, `private v`
### 3.3 方法规则
1. 按照 `public`、`protected`、`private` 的顺序对类中的方法进行排序。
类的静态方法可以放在非静态方法之后,并根据一致的方法可见性进行排序。
2. 当方法有限制时,方法的参数和返回值需要用 `@Nonnull` 或 `@Nullable` 注释和约束进行注释。
例如,如果参数不能为 null,最好添加一个 `@Nonnull` 注释。如果返回值可以为 null,则应首先添加 `@Nullable` 注释。
`<mark>` 注意:包名为 `<b>`javax.validation.requirements`</b>` `</mark>`
3. 如果方法中的代码行数太多,请尝试在适当的点上使用多个子方法来分段方法体。
一般来说,需要坚持以下原则:
- 便于测试
- 有好的语义
- 易于阅读
此外,还需要考虑在组件、逻辑、抽象和场景等方面的切割是否合理。
> 然而,目前还没有明确的演示定义。在演变过程中,我们将为开发者提供更多的示例,以便他们有更清晰的参考和理解。
### 3.4 集合规则
1. 对于返回的 `collection` 值,除非有特殊的 `concurrent` (如线程安全),总是返回 `interface`,例如:
- 如果使用 `ArrayList`,则返回 `<mark>` List `</mark>`
- 如果使用 `HashMap`,则返回 `<mark>` Map `</mark>`
- 如果使用 `HashSet`,则返回 `<mark>` Set `</mark>`
2. 如果存在多线程,可以使用以下声明或返回类型:
```java
private CurrentHashMap map;
public CurrentHashMap funName();
```
3. 使用 `isEmpty()` 而不是 `length() == 0` 或者 `size() == 0`
- 负面示例:
```java
if (pathPart.length() == 0) {
return;
}
```
- 正面示例:
```java
if (pathPart.isEmpty()) {
return;
}
```
### 3.5 并发处理
1. 需要管理 `线程池`,使用统一的入口点获取 `线程池`。
`<mark>` 注意:在演变过程中,我们将为开发者提供更多的示例,以便他们有更清晰的参考和理解。 `</mark>`
2. `线程池` 需要进行资源约束,以防止因处理不当导致的资源泄露。
### 3.6 控制/条件语句
1. 避免因不合理的 `条件/控制` 分支顺序导致:
- 多个代码行的 `深度` 为 `n+1`
- 多余的行
一般来说,如果一个方法的代码行深度由于连续嵌套的 `if... else..` 超过了 `2+ Tabs`,那么应该考虑试图
- `合并分支`
- `反转分支条件`
- `提取私有方法`
以减少代码行深度并提高可读性,例如:
- 联合或将逻辑合并到下一级调用中
- 负面示例:
```java
if (isInsert) {
save(platform);
} else {
updateById(platform);
}
```
- 正面示例:
```java
saveOrUpdate(platform);
```
- 合并条件
- 负面示例:
```java
if (expression1) {
if(expression2) {
// ......
}
}
```
- 正面示例:
```java
if (expression1 && expression2) {
// ......
}
```
- 反转条件
- 负面示例:
```java
public void doSomething() {
// 忽略更深的代码块行
// .....
if (condition1) {
// ...
} else {
// ...
}
}
```
- 正面示例:
```java
public void doSomething() {
// 忽略更深的代码块行
// .....
if (!condition1) {
// ...
return;
}
// ...
}
```
- 使用单一变量或方法减少复杂的条件表达式
- 负面示例:
```java
if (dbType.indexOf("sqlserver") >= 0 || dbType.indexOf("sql server") >= 0) {
// ...
}
```
- 正面示例:
```java
if (containsSqlServer(dbType)) {
// ....
}
//.....
// containsSqlServer的定义
```
> 在未来,使用 `sonarlint` 和 `better highlights` 检查代码深度看起来是个不错的选择。
### 3.7 代码注释规则
1. 方法缺少注释:
- `When`:该方法何时可以被调用
- `How`:如何使用此方法以及如何传递参数等
- `What`:此方法实现了哪些功能
- `Note`:在调用此方法时开发人员应注意什么
2. 缺少必要的类头部描述注释。
添加 `What``Note` 等,如上述 `1` 中提到的。
3. 在接口中的方法声明必须被注释。
- 如果实现的语义和接口声明的注释内容不一致,则具体的实现方法也需要用注释重写。
- 如果方法实现的语义与接口声明的注释内容一致,则建议不写注释以避免重复的注释。
4. 在注释行中的第一个词需要大写,如 `param` 行,`return` 行。
如果特殊引用作为主题不需要大写,需要注意特殊符号,例如引号。
### 3.8 Java Lambda 表达式
1. 更倾向于使用 `non-capturing` lambda(不包含对外部范围的引用的lambda)。
Capturing lambda 在每次调用时都需要创建一个新的对象实例。`Non-capturing` lambda 可以为每次调用使用相同的实例。
- 负面示例:
```java
map.computeIfAbsent(key, x -> key.toLowerCase())
```
- 正面示例:
```java
map.computeIfAbsent(key, k -> k.toLowerCase());
```
2. 考虑使用方法引用而不是内联lambda
- 负面示例:
```java
map.computeIfAbsent(key, k-> Loader.load(k));
```
- 正面示例:
```java
map.computeIfAbsent(key, Loader::load);
```
### 3.9 Java Streams
- 在任何对性能敏感的代码中避免使用 Java Streams。
- 使用 Java Streams 的主要动机是为了提高代码的可读性。因此,它们可以在代码的某些部分中很好地匹配,这些部分不是数据密集型的,而是处理协调。
- 即使在后一种情况下,也试图限制范围到一个方法,或者一个内部类中的几个私有方法。
### 3.10 前置条件检查
1. 使用统一的 `Utils.requireXXX` 来完成前提的验证,如果可能的话,用新的前置条件检查替换 `AlertXXException.throwIfXXX`。
### 3.11 StringUtils
1. 使用 `StringUtils.isBlank` 而不是 `StringUtils.isEmpty`
- 负面示例:
```java
if (StringUtils.isEmpty(name)) {
return;
}
```
- 正面示例:
```java
if (StringUtils.isBlank(name)) {
return;
}
```
2. 使用 `StringUtils.isNotBlank` 而不是 `StringUtils.isNotEmpty`
- 负面示例:
```java
if (StringUtils.isNotEmpty(name)) {
return;
}
```
- 正面示例:
```java
if (StringUtils.isNotBlank(name)) {
return;
}
```
3. 使用 `StringUtils.isAllBlank` 而不是 `StringUtils.isAllEmpty`
- 负面示例:
```java
if (StringUtils.isAllEmpty(name, age)) {
return;
}
```
- 正面示例:
```java
if (StringUtils.isAllBlank(name, age)) {
return;
}
```
### 3.12 `Enum` 类
1. 枚举值比较
- 负面示例:
```java
if (status.equals(JobStatus.RUNNING)) {
return;
}
```
- 正面示例:
```java
if (status == JobStatus.RUNNING) {
return;
}
```
2. 枚举类不需要实现 Serializable
- 负面示例:
```java
public enum JobStatus implements Serializable {
// ...
}
```
- 正面示例:
```java
public enum JobStatus {
// ...
}
```
3. 使用 `Enum.name()` 而不是 `Enum.toString()`
- 负面示例:
```java
System.out.println(JobStatus.RUNNING.toString());
```
- 正面示例:
```java
System.out.println(JobStatus.RUNNING.name());
```
4. 枚举类名称统一使用 Enum 后缀
- 负面示例:
```java
public enum JobStatus {
// ...
}
```
- 正面示例:
```java
public enum JobStatusEnum {
// ...
}
```
### 3.13 `Deprecated` 注解
- 负面示例:
```java
@deprecated
public void process(String input) {
// ...
}
```
- 正面示例:
```java
@Deprecated
public void process(String input) {
// ...
}
```
## 4 日志
1. 使用 `占位符` 进行日志输出:
- 负面示例
```java
log.info("Deploy cluster request " + deployRequest);
```
- 正面示例
```java
log.info("load plugin:{} to {}", file.getName(), appPlugins);
```
2. 打印日志时,注意选择 `日志级别`
当打印日志内容时,如果传递了日志占位符的实际参数,必须避免过早评估,以避免由日志级别导致的不必要评估。
- 负面示例:
假设当前日志级别为 `INFO`
```java
// 忽略声明行。
List`<User>` userList = getUsersByBatch(1000);
LOG.debug("All users: {}", getAllUserIds(userList));
```
- 正面示例:
在这种情况下,我们应该在进行实际的日志调用之前提前确定日志级别,如下所示:
```java
// 忽略声明行。
List`<User>` userList = getUsersByBatch(1000);
if (LOG.isDebugEnabled()) {
LOG.debug("All ids of users: {}", getAllIDsOfUsers(userList));
}
```
## 5 测试
1. 建议使用 `JUnit5` 进行测试用例的准备。
2. 实现的接口需在`e2e`模块下编写`e2e`测试用例脚本。
## 参考资料
- [https://site.mockito.org/](https://site.mockito.org/)
- [https://alibaba.github.io/p3c/](https://alibaba.github.io/p3c/)
- [https://junit.org/junit5/](https://junit.org/junit5/)
- [https://streampark.apache.org/](https://streampark.apache.org/)
@@ -0,0 +1,21 @@
---
id: contact
title: 交流联系
sidebar_label: 交流联系
---
> 如果您在使用过程中需要帮助或者想交流建议,可以通过 ISSUE 或 Github Discussion 讨论交流。
[订阅邮件列表](https://lists.apache.org/list.html?dev@hertzbeat.apache.org) : 发送邮件至 `dev-subscribe@hertzbeat.apache.org` 来订阅邮件列表.
[Chat On Discord](https://discord.gg/Fb6M73htGr)
微信交流群 : 加 `ahertzbeat` 好友邀请进群.
微信公众号 : 搜索 ID `usthecom`.
[Github Discussion](https://github.com/apache/hertzbeat/discussions)
[Follow Us Twitter](https://x.com/hertzbeat1024)
[Subscribe YouTube](https://www.youtube.com/channel/UCri75zfWX0GHqJFPENEbLow)
@@ -0,0 +1,178 @@
---
id: contribution
title: 贡献指南
sidebar_position: 0
---
<!--
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
https://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
> 非常欢迎参与项目贡献,我们致力于维护一个互相帮助的快乐社区。
## 贡献方式
>
> 在 Apache HertzBeat™ 社区,贡献方式有很多:
- 💻**代码**:可以帮助社区完成一些任务、编写新的 feature 或者是修复一些 bug
- ⚠️**测试**:可以来参与测试代码的编写,包括了单元测试、集成测试、e2e 测试;
- 📖**文档**:可以编写或完善文档,来帮助用户更好地了解和使用 HertzBeat;
- 📝**博客**:可以撰写 HertzBeat 的相关文章,来帮助社区更好地推广;
- 🤔**讨论**:可以参与 HertzBeat 新的 feature 的讨论,将您的想法跟 HertzBeat 融合;
- 💡**布道**:可以帮助宣传或推广 HertzBeat 社区,在 meetup 或 summit 中演讲;
- 💬**建议**:也可以对项目或者社区提出一些建议,促进社区的良性发展;
更多贡献方式参见 [Contribution Types](https://allcontributors.org/en/reference/emoji-key/)
即便是小到错别字的修正我们也都非常欢迎 :)
### 让 HertzBeat 运行起来
> 让 HertzBeat 的代码在您的开发工具上运行起来,并且能够断点调试。
> 此为前后端分离项目,本地代码启动需将后端 [manager](https://github.com/apache/hertzbeat/tree/master/hertzbeat-manager) 和前端 [web-app](https://github.com/apache/hertzbeat/tree/master/web-app) 分别启动生效。
#### 后端启动
1. 需要 `maven3+`, `java25``lombok` 环境
2. (可选)修改配置文件配置信息-`hertzbeat-startup/src/main/resources/application.yml`
3. 在项目根目录运行编译: `mvn clean install -DskipTests`
4.`jvm` 加入参数 `--add-opens=java.base/java.nio=org.apache.arrow.memory.core,ALL-UNNAMED`
5. 启动`springboot startup`服务 `hertzbeat-startup/src/main/java/org/apache/hertzbeat/startup/HertzBeatApplication.java`
#### 前端启动
1. 需要 `nodejs pnpm` 环境, 确保 `Node.js >= 18`
2. 进入 `web-app` 目录: `cd web-app`
3. 安装 pnpm: `npm install -g pnpm`
4. 在前端工程目录 `web-app` 下执行: `pnpm install` or `pnpm install --registry=https://registry.npmmirror.com` in `web-app`
5. 待本地后端启动后,在 web-app 目录下启动本地前端 `pnpm start`
6. 浏览器访问 localhost:4200 即可开始,默认账号密码 **admin/hertzbeat**
### 寻找任务
寻找您感兴趣的 Issue!在我们的 GitHub 仓库和邮件列表中,我们经常会发布一些带有 good first issue 或者 status: volunteer wanted 标签的 issue,这些issue都欢迎贡献者的帮助。
其中 good first issue 往往门槛较低、适合新手。
当然,如果您有好的想法,也可以直接在 GitHub Discussion 中提出或者联系社区。
### 提交 Pull Request
1. 首先您需要 Fork 目标仓库 [hertzbeat repository](https://github.com/apache/hertzbeat).
2. 然后 用 git 命令 将代码下载到本地:
```shell
git clone git@github.com:`YOUR_USERNAME`/hertzbeat.git #Recommended
```
3. 下载完成后,请参考目标仓库的入门指南或者 README 文件对项目进行初始化。
4. 接着,您可以参考如下命令进行代码的提交, 切换新的分支, 进行开发:
```shell
git checkout -b a-feature-branch #Recommended
```
5. 提交 commit, commit 描述信息需要符合约定格式: [module name or type name]feature or bugfix or doc: custom message.
```shell
git add <modified file/path>
git commit -m '[docs]feature: necessary instructions' #Recommended
```
6. 推送到远程仓库
```shell
git push origin a-feature-branch
```
7. 然后您就可以在 GitHub 上发起新的 PR (Pull Request)。
请注意 PR 的标题需要符合我们的规范,并且在 PR 中写上必要的说明,来方便 Committer 和其他贡献者进行代码审查。
### 等待PR代码被合并
在提交了 PR 后,Committer 或者社区的小伙伴们会对您提交的代码进行审查(Code Review),会提出一些修改建议,或者是进行一些讨论,请及时关注您的PR。
若后续需要改动,不需要发起一个新的 PR,在原有的分支上提交 commit 并推送到远程仓库后,PR会自动更新。
另外,我们的项目有比较规范和严格的 CI 检查流程,在提交 PR 之后会触发 CI,请注意是否通过 CI 检查。
最后,Committer 可以将 PR 合并入 master 主分支。
### 代码被合并后
在代码被合并后,您就可以在本地和远程仓库删除这个开发分支了:
```shell
git branch -d a-dev-branch
git push origin --delete a-dev-branch
```
在主分支上,您可以执行以下操作来同步上游仓库:
```shell
git remote add upstream https://github.com/apache/hertzbeat.git #Bind the remote warehouse, if it has been executed, it does not need to be executed again
git checkout master
git pull upstream master
```
### 领取贡献者证书
在您的 PR 被合并后,您可以发送如下内容邮件到 `dev@hertzbeat.apache.org` 来申请领取属于您的 Apache HertzBeat™ 贡献者电子证书。
```text
Title: [Contributor] Request for a Contributor Certificate: <Your Full Name>
Body:
Hello,
I would like to request a Contributor Certificate for my contributions to the Apache HertzBeat™ project.
- Full Name: <Your Full Name> # The Full Name will be printed on the certificate, any name you want.
- GitHub Username: <Your GitHub Username>
- Pull Request Links: <List the URLs of the pull requests you have submitted>
- Email Address: <Your Email Address>
Best regards,
<Your Name>
```
在几个工作日内,您会收到携带电子证书的回复,您的名字也会出现在贡献者列表中。
注意贡献者的证书是电子的,待您成为 `Committer` 或者 `PMC` 的证书是实体的。
证书样例:
![cert](/img/docs/hertzbeat-cert.png)
### 如何成为 Committer
通过上述步骤,您就是 HertzBeat 的贡献者了。重复前面的步骤,在社区中保持活跃,坚持下去,您就能成为 Committer!
### 加入讨论交流
[讨论交流](contact)
@@ -0,0 +1,75 @@
---
id: development
title: 如何将 HertzBeat 运行编译?
sidebar_label: 运行编译
---
## 让 HertzBeat 运行起来
> 让 HertzBeat 的代码在您的开发工具上运行起来,并且能够断点调试。
> 此为前后端分离项目,本地代码启动需将后端 [manager](https://github.com/apache/hertzbeat/tree/master/hertzbeat-manager) 和前端 [web-app](https://github.com/apache/hertzbeat/tree/master/web-app) 分别启动生效。
### 后端启动
1. 需要 `maven3+`, `java25``lombok` 环境
2. (可选)修改配置文件配置信息-`hertzbeat-startup/src/main/resources/application.yml`
3. 在项目根目录运行编译: `mvn clean install -DskipTests`
4.`jvm` 加入参数 `--add-opens=java.base/java.nio=org.apache.arrow.memory.core,ALL-UNNAMED`
5. 启动`springboot startup`服务 `hertzbeat-startup/src/main/java/org/apache/hertzbeat/startup/HertzBeatApplication.java`
### 前端启动
1. 需要 `nodejs pnpm` 环境, 版本要求 `Node.js >= 18`
2. 进入 `web-app` 目录: `cd web-app`
3. 安装pnpm: `npm install -g pnpm`
4. 在前端工程目录 `web-app` 下执行: `pnpm install` 或者 `pnpm install --registry=https://registry.npmmirror.com`
5. 待本地后端启动后,在web-app目录下启动本地前端 `pnpm start`
6. 浏览器访问 localhost:4200 即可开始,默认账号密码 admin/hertzbeat
## 生成二进制包
> 需要 `maven3+`, `java25`, `node` 和 `pnpm` 环境.
### 前端打包
1. 需要 `Node pnpm` 环境, 版本要求 `Node.js >= 18`
2. 切换到 `web-app` 目录: `cd web-app`
3. 安装 pnpm: `npm install -g pnpm`
4. 安装本项目依赖: `pnpm install``pnpm install --registry=https://registry.npmmirror.com`
5. 打包: `pnpm package`
### 后端打包
1. 需要 `maven3+`, `java25` 环境
2. 在项目根目录运行: `mvn clean package -Prelease`
HertzBeat 包将生成为 `dist/apache-hertzbeat-{version}-bin.tar.gz`
### 采样器打包
1. 需要 `maven3+`, `java25` 环境
2. 在项目根目录运行: `mvn clean install`
3. 切换到 `hertzbeat-collector` 目录: `cd hertzbeat-collector`
4.`hertzbeat-collector` 目录下打 JVM 采集器安装包: `mvn clean package -Pcluster`
5.`hertzbeat-collector` 目录下打 Native 采集器安装包: `mvn clean package -pl hertzbeat-collector-collector -am -Pnative`
> Native 采集器打包需要带有 `native-image` 命令的 GraalVM JDK 25 环境。
HertzBeat 采集器安装包将生成为 `dist/apache-hertzbeat-collector-{version}-bin.tar.gz`,以及类似 `dist/apache-hertzbeat-collector-native-{version}-linux-amd64-bin.tar.gz` 这样的 Native 平台安装包
@@ -0,0 +1,113 @@
---
id: 'document'
title: '文档说明'
sidebar_position: 1
---
<!--
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
https://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
对于任何类型的软件来说,良好的文档都是至关重要的。任何能够改进 HertzBeat 文档的贡献都是受欢迎的。
## 获取文档项目
HertzBeat 项目的文档在 [git 仓库 home 目录](https://github.com/apache/hertzbeat/tree/master/home) 中维护。
首先,您需要将文档项目 fork 到您自己的 github 仓库,然后将文`clone`到您的本地计算机。
```shell
git clone git@github.com:<your-github-user-name>/hertzbeat.git
```
## 预览和生成静态文件
此网站使用 node 进行编译,使用 Docusaurus 框架组件。
1. 下载并安装 nodejs (版本 18.8.0)
2. 将代码克隆到本地 `git clone git@github.com:apache/hertzbeat.git`
3.`home`目录下运行 `pnpm install` 来安装所需的依赖库。
4.`home`目录下运行 `pnpm start`,您可以访问 [http://localhost:3000](http://localhost:3000) 查看站点的英文模式预览
5.`home`目录下运行 `pnpm start-zh-cn`,您可以访问 [http://localhost:3000](http://localhost:3000) 查看站点的中文模式预览
6. 若要生成静态网站资源文件,请运行 `pnpm build`。构建的静态资源位于 build 目录中。
## 文档格式检验
在 Apache HertzBeat 中,所有的 MD 文章都要通过 MD 的 [CI](https://github.com/apache/hertzbeat/blob/master/.github/workflows/doc-build-test.yml) 检测才能够合并,目的是为了保持文档官网的美观和文章格式的一致性。
在您编写了相关 MD 文章之后,您可以在本地执行以下命令,预先检查 MD 的文章内容是否符合要求,减少 review 的工作量,节省您的时间:
```shell
cd home && pnpm install
pnpm md-lint
# 如果文档错误,您可以使用 pnpm md-lint-fix 修复
pnpm md-lint-fix
```
MD 文章的相关格式规则您可以参考:[Markdown-lint-rules](https://github.com/DavidAnson/markdownlint/blob/main/doc/Rules.md)
项目中的 MD 格式配置文件:[.markdownlint-cli2.jsonc](https://github.com/apache/hertzbeat/blob/master/.markdownlint-cli2.jsonc)
## 目录结构
```html
|-- docs
|-- blog
|-- i18n
| `-- zh-CN // 中文国际化
| |-- code.json
| |-- docusaurus-plugin-content-blog
| |-- docusaurus-plugin-content-docs
| `-- docusaurus-theme-classic
|-- resource // 静态资源文件
|-- src
| |-- theme
| |-- css
| |-- js
| |-- pages
| | |-- components
| | |-- index.js
| |-- constants.js
|-- static // 图片静态资源
| |-- img //
| | |-- blog // 博客图片
| | |-- docs // 文档图片
| | |-- home // 产品图片
| | |-- icons // 图标
|-- docusaurus.config.js
|-- sidebars.js // 文档侧边栏菜单配置
```
## 规范
### 文件的命名规范
全部由小写,数字,下划线和破折号组成。
正例:`render-dom.js / signup.css / index.html / company-logo.png / hertz_beat.md`
反例:`renderDom.js / UserManagement.html`
### 资源路径
图片资源统一放在 `static/img/{模块名称}`
css 和其他样式文件放在 `src/css` 目录中。
### 页面内容修改
> 所有页面文档都可以通过底部的'编辑此页面'按钮直接跳转到相应的 github 资源修改页面。
@@ -0,0 +1,537 @@
---
id: 'how_to_release'
title: 如何进行版本发布
sidebar_position: 4
---
本教程详细描述了如何发布Apache HertzBeat,并以 v1.7.3 版本的发布为例。
## 1. 环境要求
此发布过程在 UbuntuOS(可在 Windows Mac) 中进行操作,并需要以下环境:
- JDK 25
- Node18 pnpm
- Apache Maven 3.x
- GnuPG 2.x
- Git
- SVN (Apache使用svn来托管项目发布)
> 注意需要设置环境变量 `export GPG_TTY=$(tty)`
## 2. 准备发布
> 首先整理帐户信息以更好地了解操作过程,稍后会多次使用。
>
> - apache id: `muchunjin (APACHE LDAP 用户名)`
> - apache passphrase: `APACHE LDAP 密钥`
> - apache email: `muchunjin@apache.org`
> - gpg real name: `muchunjin (任何名称均可用, 在这里我将其设置为与apache id相同的名称)`
> - gpg key passphrase: `创建gpg密钥时设置的密码,你需要记住此密码`
### 2.1 生成密钥
```shell
$ gpg --full-gen-key
gpg (GnuPG) 2.2.27; Copyright (C) 2021 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Please select what kind of key you want:
(1) RSA and RSA (default)
(2) DSA and Elgamal
(3) DSA (sign only)
(4) RSA (sign only)
(14) Existing key from card
Your selection? 1 # Please enter 1
RSA keys may be between 1024 and 4096 bits long.
What keysize do you want? (3072) 4096 # Please enter 4096 here
Requested keysize is 4096 bits
Please specify how long the key should be valid.
0 = key does not expire
`<n>` = key expires in n days
`<n>`w = key expires in n weeks
`<n>`m = key expires in n months
`<n>`y = key expires in n years
Key is valid for? (0) 0 # Please enter 0
Key does not expire at all
Is this correct? (y/N) y # Please enter y here
GnuPG needs to construct a user ID to identify your key.
Real name: muchunjin # Please enter 'gpg real name'
Email address: muchunjin@apache.org # Please enter your apache email address here
Comment: apache key # Please enter some comments here
You selected this USER-ID:
"muchunjin (apache key) [muchunjin@apache.org](mailto:muchunjin@apache.org)"
Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? O # Please enter O here
We need to generate a lot of random bytes. It is a good idea to perform
some other action (type on the keyboard, move the mouse, utilize the
disks) during the prime generation; this gives the random number
generator a better chance to gain enough entropy.
# At this time, a dialog box will pop up, asking you to enter the key for this gpg.
# you need to remember that it will be used in subsequent steps.
┌─────────────────────────────────────────────────────┐
│ Please enter this passphrase to │
│ protect your new key │
│ │
│ Passphrase: _______________________________________ │
│ │
`<OK>` `<Cancel>`
└─────────────────────────────────────────────────────┘
# Here you need to re-enter the password in the previous step.
┌─────────────────────────────────────────────────────┐
│ Please re-enter this passphrase │
│ │
│ Passphrase: _______________________________________ │
│ │
`<OK>` `<Cancel>`
└─────────────────────────────────────────────────────┘
gpg: key ACFB69E705016886 marked as ultimately trusted
gpg: revocation certificate stored as '/root/.gnupg/openpgp-revocs.d/DC12398CCC33A5349EB9663DF9D970AB18C9EDF6.rev'
public and secret key created and signed.
pub rsa4096 2023-05-01 [SC]
85778A4CE4DD04B7E07813ABACFB69E705016886
uid muchunjin (apache key) [muchunjin@apache.org](mailto:muchunjin@apache.org)
sub rsa4096 2023-05-01 [E]
```
密钥可以通过`gpg --list-signatures`命令查看
### 2.2 将生成的密钥上传到公共服务器
```shell
$ gpg --keyid-format SHORT --list-keys
/root/.gnupg/pubring.kbx
------------------------
pub rsa4096/05016886 2023-05-01 [SC]
85778A4CE4DD04B7E07813ABACFB69E705016886
uid [ultimate] muchunjin (apache key) [muchunjin@apache.org](mailto:muchunjin@apache.org)
sub rsa4096/0C5A4E1C 2023-05-01 [E]
# Send public key to keyserver via key id
$ gpg --keyserver keyserver.ubuntu.com --send-key 05016886
# Among them, keyserver.ubuntu.com is the selected keyserver, it is recommended to use this, because the Apache Nexus verification uses this keyserver
```
#### 2.3 检查密钥是否创建成功
验证是否已经同步到公共网络,需要一分钟左右才能知道答案,如果不成功,您可以多次上传并重试。
```shell
$ gpg --keyserver keyserver.ubuntu.com --recv-keys 05016886 # If the following content appears, it means success
gpg: key ACFB69E705016886: "muchunjin (apache key) [muchunjin@apache.org](mailto:muchunjin@apache.org)" not changed
gpg: Total number processed: 1
gpg: unchanged: 1
```
或者进入 [https://keyserver.ubuntu.com/](https://keyserver.ubuntu.com/) 网址,输入密钥的名称,然后点击'Search key' 按钮,查看是否有对应名称的密钥。
#### 2.4 将 gpg 公钥添加到 Apache SVN 项目仓库的 KEYS 文件中
- Apache HertzBeat Dev 分支 [https://dist.apache.org/repos/dist/dev/hertzbeat](https://dist.apache.org/repos/dist/dev/hertzbeat)
- Apache HertzBeat Release 分支 [https://dist.apache.org/repos/dist/release/hertzbeat](https://dist.apache.org/repos/dist/release/hertzbeat)
##### 2.4.1 将公钥添加到dev分支的KEYS
```shell
$ mkdir -p svn/dev
$ cd svn/dev
$ svn co https://dist.apache.org/repos/dist/dev/hertzbeat
$ cd svn/dev/hertzbeat
# 将生成的KEY追加到KEYS文件中,检查是否添加正确
$ (gpg --list-sigs muchunjin@apache.org && gpg --export --armor muchunjin@apache.org) >> KEYS
$ svn ci -m "add gpg key for muchunjin"
```
##### 2.4.2 将公钥添加到release分支的KEYS
```shell
$ mkdir -p svn/release
$ cd svn/release
$ svn co https://dist.apache.org/repos/dist/release/hertzbeat
$ cd svn/release/hertzbeat
# 将生成的KEY追加到KEYS文件中,检查是否添加正确
$ (gpg --list-sigs muchunjin@apache.org && gpg --export --armor muchunjin@apache.org) >> KEYS
$ svn ci -m "add gpg key for muchunjin"
```
## 3. 准备物料 & 发布
### 准备发布物料
#### 3.1 基于 master 分支,创建一个名为 release-`release_version`-rcx 的分支,例如 release-1.7.3-rc1。并基于 release-1.7.3-rc1 分支创建一个名为 v1.7.3-rc1 的标签,并将此标签设置为预发布
```shell
git checkout master
git checkout -b release-1.7.3-rc1
```
#### 3.2 本地切换到待发布分支
```shell
git checkout release-1.7.3-rc1
```
#### 3.3 编译二进制包
> HertzBeat 编译打包,在项目`web-app`目录下执行以下命令,
```shell
pnpm install
pnpm package
```
> 在项目根目录下执行以下命令
```shell
mvn clean package -Prelease
```
然后
```shell
mvn clean install
```
> HertzBeat-Collector 编译打包,在项目`collector`目录下执行以下命令
```shell
mvn clean package -Pcluster
```
> 使用带 `native-image` 的 GraalVM JDK 25,为当前宿主机构建 Native 采集器安装包
```shell
mvn clean package -pl hertzbeat-collector-collector -am -Pnative
```
> 仓库中的 `.github/workflows/collector-native-build.yml` 是 release 辅助工作流,不参与日常 PR 或 push 的常规 CI。
>
> 之所以只保留手动触发,是因为跨平台 Native 构建耗时更长,也会占用相对稀缺的 Linux ARM、macOS 和 Windows Runner。准备发版时,请在 GitHub Actions 页面选择 `Collector Native Release`,基于 release 分支或 tag 手动触发,然后下载上传的产物用于签名和发布。
生成的二进制包在:
- `dist/apache-hertzbeat-{version}-bin.tar.gz`
- `dist/apache-hertzbeat-collector-{version}-bin.tar.gz`
- `dist/apache-hertzbeat-collector-native-{version}-linux-amd64-bin.tar.gz`
- `dist/apache-hertzbeat-collector-native-{version}-linux-arm64-bin.tar.gz`
- `dist/apache-hertzbeat-collector-native-{version}-macos-amd64-bin.tar.gz`
- `dist/apache-hertzbeat-collector-native-{version}-macos-arm64-bin.tar.gz`
- `dist/apache-hertzbeat-collector-native-{version}-windows-amd64-bin.zip`
- `dist/apache-hertzbeat-{version}-docker-compose.tar.gz`
#### 3.4 打包项目源代码
> 打包项目源码
```shell
git archive \
--format=tar.gz \
--output="dist/apache-hertzbeat-1.7.3-src.tar.gz" \
--prefix=apache-hertzbeat-1.7.3-src/ \
release-1.7.3-rc1
```
生成的代码归档文件在 `dist/apache-hertzbeat-1.7.3-src.tar.gz`
### 签名发布物料
#### 3.5 对二进制和源码包进行签名
将上步骤生成的三个文件包放到`dist`目录下(若无则新建目录),然后对文件包进行签名和SHA512校验和生成。
> 其中 `gpg -u 33545C76` 的 `33545C76` 是你的 GPG 密钥 ID,可以通过 `gpg --keyid-format SHORT --list-keys` 查看。
```shell
cd dist
# sign
for i in *.tar.gz; do echo $i; gpg -u 33545C76 --armor --output $i.asc --detach-sig $i ; done
# SHA512
for i in *.tar.gz; do echo $i; sha512sum $i > $i.sha512 ; done
# if macos sha512sum not found, you can install by brew install coreutils
```
> 最终文件列表如下
```text
apache-hertzbeat-1.7.3-src.tar.gz
apache-hertzbeat-1.7.3-src.tar.gz.asc
apache-hertzbeat-1.7.3-src.tar.gz.sha512
apache-hertzbeat-1.7.3-bin.tar.gz
apache-hertzbeat-1.7.3-bin.tar.gz.asc
apache-hertzbeat-1.7.3-bin.tar.gz.sha512
apache-hertzbeat-1.7.3-docker-compose.tar.gz
apache-hertzbeat-1.7.3-docker-compose.tar.gz.asc
apache-hertzbeat-1.7.3-docker-compose.tar.gz.sha512
apache-hertzbeat-collector-1.7.3-bin.tar.gz
apache-hertzbeat-collector-1.7.3-bin.tar.gz.asc
apache-hertzbeat-collector-1.7.3-bin.tar.gz.sha512
```
#### 3.6 验证签名
```shell
$ cd dist
# 验证签名
$ for i in *.tar.gz; do echo $i; gpg --verify $i.asc $i ; done
apache-hertzbeat-1.7.3-bin.tar.gz
gpg: Signature made Tue May 2 12:16:35 2023 CST
gpg: using RSA key 85778A4CE4DD04B7E07813ABACFB69E705016886
gpg: Good signature from "muchunjin (apache key) [muchunjin@apache.org](mailto:muchunjin@apache.org)" [ultimate]
apache-hertzbeat-1.7.3-docker-compose.tar.gz
gpg: Signature made Tue May 2 12:16:36 2023 CST
gpg: using RSA key 85778A4CE4DD04B7E07813ABACFB69E705016886
gpg: Good signature from "muchunjin (apache key) [muchunjin@apache.org](mailto:muchunjin@apache.org)" [ultimate]
apache-hertzbeat-1.7.3-src.tar.gz
gpg: Signature made Tue May 2 12:16:37 2023 CST
gpg: using RSA key 85778A4CE4DD04B7E07813ABACFB69E705016886
gpg: Good signature from "muchunjin (apache key) [muchunjin@apache.org](mailto:muchunjin@apache.org)" [ultimate]
apache-hertzbeat-collector-1.7.3-bin.tar.gz
gpg: Signature made Tue May 2 12:16:37 2023 CST
gpg: using RSA key 85778A4CE4DD04B7E07813ABACFB69E705016886
gpg: Good signature from "muchunjin (apache key) [muchunjin@apache.org](mailto:muchunjin@apache.org)" [ultimate]
# 验证 SHA512
$ for i in *.tar.gz; do echo $i; sha512sum --check $i.sha512; done
apache-hertzbeat-1.7.3-src.tar.gz
apache-hertzbeat-1.7.3-src.tar.gz: OK
apache-hertzbeat-1.7.3-bin.tar.gz
apache-hertzbeat-1.7.3-bin.tar.gz: OK
apache-hertzbeat-1.7.3-docker-compose.tar.gz
apache-hertzbeat-1.7.3-docker-compose.tar.gz: OK
apache-hertzbeat-collector-1.7.3-bin.tar.gz
apache-hertzbeat-collector-1.7.3-bin.tar.gz: OK
```
#### 3.7 发布 Apache SVN 仓库中 dev 目录的物料包
- 检出仓库
```shell
# 检出 Apache SVN 仓库中的 dev/incubator/hertzbeat 目录到 Apache HertzBeat™ 项目根目录下的 svn/dev 目录下
svn co https://dist.apache.org/repos/dist/dev/hertzbeat svn/dev
svn co --depth empty https://dist.apache.org/repos/dist/dev/hertzbeat
```
- 复制物料包到 SVN 仓库
创建一个版本号目录,并以`release_version`-`RC_version`的形式命名。RC_version从1开始,即候选版本从RC1开始。在发布过程中,如果出现导致投票失败的问题,需要进行修正,那么RC版本需要迭代,RC版本号需要+1。例如:为版本1.7.3-RC1投票。如果投票顺利通过,那么RC1版本的资料将作为最终版本的资料发布。如果出现问题并需要纠正,那么修正后重新启动投票,下一次的候选版本为1.7.3-RC2。
```shell
mkdir -p svn/dev/1.7.3-RC1
cp -f dist/* svn/dev/1.7.3-RC1
```
- 提交到SVN
```shell
cd svn/dev
# 1. 检查svn状态
svn status
# 2. 添加到svn
svn add 1.7.3-RC1
svn status
# 3. 提交到svn远端服务器
svn commit -m "release for HertzBeat 1.7.3-RC1"
```
- 检查 Apache SVN 提交结果
> 在浏览器中访问 [https://dist.apache.org/repos/dist/dev/hertzbeat/](https://dist.apache.org/repos/dist/dev/hertzbeat/) , 检查是否有新的版本内容
## 4. 进入社区投票阶段
### 4.1 发送社区投票邮件
发送社区投票邮件需要至少三个`+1`,且无`-1`
> `Send to`: [dev@hertzbeat.apache.org](mailto:dev@hertzbeat.apache.org) <br />
> `Title`: [VOTE] Release Apache HertzBeat 1.7.3 rc1 <br />
> `Body`:
```text
Hello HertzBeat Community:
This is a call for vote to release Apache HertzBeat version release-1.7.3-RC1.
Apache HertzBeat - a real-time observability system with agentless, performance cluster, prometheus-compatible, custom monitoring and status page building capabilities.
Release notes:
https://github.com/apache/hertzbeat/releases/tag/v1.7.3-rc1
The release candidates:
https://dist.apache.org/repos/dist/dev/hertzbeat/1.7.3-RC1/
Git tag for the release:
https://github.com/apache/hertzbeat/releases/tag/v1.7.3-rc1
The artifacts signed with PGP key [33545C76], corresponding to [muchunjin@apache.org], that can be found in keys file:
https://downloads.apache.org/hertzbeat/KEYS
The vote will be open for at least 72 hours or until the necessary number of votes are reached.
Please vote accordingly:
[ ] +1 approve
[ ] +0 no opinion
[ ] -1 disapprove with the reason
*Valid check is a requirement for a vote. *Checklist for reference:
[ ] Download HertzBeat are valid.
[ ] Checksums and PGP signatures are valid.
[ ] Source code distributions have correct names matching the current
release.
[ ] LICENSE and NOTICE files are correct for each HertzBeat repo.
[ ] All files have license headers if necessary.
[ ] No compiled archives bundled in source archive.
[ ] Can compile from source.
Steps to validate the releasePlease refer to:
https://hertzbeat.apache.org/docs/community/how_to_verify_release
How to Build:
https://hertzbeat.apache.org/docs/community/development/#build-hertzbeat-binary-package
Thanks!
```
在72小时后,将统计投票结果,并发送投票结果邮件,如下所示。
> `Send to`: [dev@hertzbeat.apache.org](mailto:dev@hertzbeat.apache.org) <br />
> `Title`: [RESULT]\[VOTE\] Release Apache HertzBeat 1.7.3-rc1 <br />
> `Body`:
```text
Dear HertzBeat community,
Thanks for your review and vote for "Release Apache HertzBeat 1.7.3-rc1"
I'm happy to announce the vote has passed:
---
4 binding +1, from:
- cc
1 non-binding +1, from:
- Roc Marshal
---
no 0 or -1 votes.
Vote thread:
https://lists.apache.org/thread/t01b2lbtqzyt7j4dsbdp5qjc3gngjsdq
---
Thank you to everyone who helped us to verify and vote for this release.
---
Best,
ChunJin Mu
```
邮件内容中的一项是`Vote thread`,在 [https://lists.apache.org/list.html?dev@hertzbeat.apache.org](https://lists.apache.org/list.html?dev@hertzbeat.apache.org) 查看获取
## 4. 完成最终发布步骤
### 4.1 迁移源代码和二进制包
```shell
svn mv https://dist.apache.org/repos/dist/dev/hertzbeat/1.7.3-RC1 https://dist.apache.org/repos/dist/release/hertzbeat/1.7.3 -m "transfer packages for 1.7.3-RC1"
```
### 4.2 添加新版本下载地址到官网
[https://github.com/apache/hertzbeat/blob/master/home/docs/download.md](https://github.com/apache/hertzbeat/blob/master/home/docs/download.md)
[https://github.com/apache/hertzbeat/blob/master/home/i18n/zh-cn/docusaurus-plugin-content-docs/current/download.md](https://github.com/apache/hertzbeat/blob/master/home/i18n/zh-cn/docusaurus-plugin-content-docs/current/download.md)
完成后打开官网地址 [https://hertzbeat.apache.org/docs/download/](https://hertzbeat.apache.org/docs/download/) 查看是否有新版本的下载
> 需要注意的是,下载链接可能需要一个小时后才会生效,请注意。
### 4.3 Github 生成 Release
基于 release-1.7.3-rc1 分支修改创建一个名为 v1.7.3 的标签,并将此标签设置为 latest release。
:::tip
在原有的 Release 上面修改,无需重新创建 Release。
:::
然后输入发版标题和描述
- 发版标题:
```text
v1.7.3
```
- 描述:
```text
xxx
release note: xxx
```
然后点击`Publish release`按钮。
然后将 release-1.7.3-rc1 分支重命名 为 release-1.7.3。
### 4.4 发送新版本公告邮件
> `Send to`: [announce@apache.org](mailto:announce@apache.org) <br />
> `cc`: [dev@hertzbeat.apache.org](mailto:dev@hertzbeat.apache.org) <br />
> `Title`: [ANNOUNCE] Apache HertzBeat 1.7.3 released <br />
> `Body`:
```text
Hi Community,
We are glad to announce the release of Apache HertzBeat 1.7.3.
Thanks again for your help.
Apache HertzBeat (https://hertzbeat.apache.org/) - a real-time observability system with agentless, performance cluster, prometheus-compatible, custom monitoring and status page building capabilities.
Download Link:
https://hertzbeat.apache.org/docs/download/
Release Note:
https://github.com/apache/hertzbeat/releases/tag/v1.7.3
Website:
https://hertzbeat.apache.org/
HertzBeat Resources:
- Issue: https://github.com/apache/hertzbeat/issues
- Mailing list: dev@hertzbeat.apache.org
---
Apache HertzBeat Team
Best,
ChunJin Mu
```
该版本的发布顺利结束。
---
This doc refer from [Apache StreamPark](https://streampark.apache.org/)
@@ -0,0 +1,183 @@
---
id: how_to_verify_release
title: 版本物料的验证
sidebar_position: 4
---
## 验证候选版本
详细检查列表请参考官方的[check list](https://cwiki.apache.org/confluence/display/INCUBATOR/Incubator+Release+Checklist)
在浏览器中可访问版本内容 [https://dist.apache.org/repos/dist/dev/hertzbeat/](https://dist.apache.org/repos/dist/dev/hertzbeat/)
### 1. 下载候选版本到本地
> 需要依赖gpg工具,如果没有,建议安装gpg2
```shell
#如果本地有svn,可以clone到本地
svn co https://dist.apache.org/repos/dist/dev/hertzbeat/`release_version`-`rc_version`/
#或者 直接下载物料文件
wget https://dist.apache.org/repos/dist/dev/hertzbeat/`release_version`-`rc_version`/xxx.xxx
```
### 2. 验证上传的版本是否合规
> 开始验证环节,验证包含但不局限于以下内容和形式
#### 2.1 查看发布包是否完整
> 上传到dist的包必须包含源码包,二进制包可选
1. 是否包含源码包
2. 是否包含源码包的签名
3. 是否包含源码包的sha512
4. 如果上传了二进制包,则同样检查(2)-(4)所列的内容
#### 2.2 检查gpg签名
首先导入发布人公钥。从svn仓库导入KEYS到本地环境。(发布版本的人不需要再导入,帮助做验证的人需要导入,用户名填发版人的即可)
##### 2.2.1 导入公钥
```shell
curl https://downloads.apache.org/hertzbeat/KEYS > KEYS # 下载KEYS
gpg --import KEYS # 导入KEYS到本地
```
##### 2.2.2 信任公钥
> 信任此次版本所使用的KEY
```shell
$ gpg --edit-key xxxxxxxxxx #此次版本所使用的KEY用户
gpg (GnuPG) 2.2.21; Copyright (C) 2020 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Secret key is available.
gpg> trust #信任
Please decide how far you trust this user to correctly verify other users' keys
(by looking at passports, checking fingerprints from different sources, etc.)
1 = I don't know or won't say
2 = I do NOT trust
3 = I trust marginally
4 = I trust fully
5 = I trust ultimately
m = back to the main menu
Your decision? 5 #选择5
Do you really want to set this key to ultimate trust? (y/N) y #选择y
gpg>
```
##### 2.2.3 检查签名
```shell
for i in *.tar.gz; do echo $i; gpg --verify $i.asc $i ; done
```
检查结果
> 出现类似以下内容则说明签名正确,关键字:**`Good signature`**
```shell
apache-hertzbeat-${release_version}-src.tar.gz
gpg: Signature made XXXX
gpg: using RSA key XXXXX
gpg: Good signature from "XXX <xxx@apache.org>"
```
#### 2.3 检查sha512哈希
> 本地计算sha512哈希后,验证是否与dist上的一致,如果上传二进制包,则同样需要检查二进制包的sha512哈希
```shell
for i in *.tar.gz; do echo $i; sha512sum --check $i.sha512; done
```
#### 2.4 检查二进制包
解压缩 `apache-hertzbeat-${release_version}-bin.tar.gz`
```shell
tar -xzvf apache-hertzbeat-${release_version}-bin.tar.gz
```
进行如下检查:
- [ ] 存在`LICENSE``NOTICE`文件
- [ ] `NOTICE`文件中的年份正确
- [ ] 所有文本文件开头都有ASF许可证
- [ ] 检查第三方依赖许可证:
- [ ] 第三方依赖的许可证兼容
- [ ] 所有第三方依赖的许可证都在`LICENSE`文件中声名
- [ ] 如果依赖的是Apache许可证并且存在`NOTICE`文件,那么这些`NOTICE`文件也需要加入到版本的`NOTICE`文件中
- [ ] .....
参考: [https://apache.org/legal/resolved.html](https://apache.org/legal/resolved.html)
#### 2.5. 源码编译验证
解压缩 `apache-hertzbeat-${release_version}-src.tar.gz`
```shell
cd apache-hertzbeat-${release_version}-src
```
编译源码: [https://hertzbeat.apache.org/docs/community/development/#build-hertzbeat-binary-package](https://hertzbeat.apache.org/docs/community/development/#build-hertzbeat-binary-package)
进行如下检查:
- [ ] 检查源码包是否包含由于包含不必要文件,致使tar包过于庞大
- [ ] 存在`LICENSE``NOTICE`文件
- [ ] `NOTICE`文件中的年份正确
- [ ] 只存在文本文件,不存在二进制文件
- [ ] 所有文件的开头都有ASF许可证
- [ ] 能够正确编译
- [ ] .....
参考: [https://apache.org/legal/resolved.html](https://apache.org/legal/resolved.html)
### 3. 邮件回复
如果发起了发布投票,验证后,可以参照此回复示例进行邮件回复
:::caution 注意
回复的邮件一定要带上自己检查了那些项信息,仅仅回复`+1 approve`,是无效的。
PMC 在 [dev@hertzbeat.apache.org](mailto:dev@hertzbeat.apache.org) HertzBeat 的社区投票时,请带上 binding 后缀,表示对 HertzBeat 社区中的投票具有约束性投票,方便统计投票结果。
:::
非PMC成员
```html
+1 (non-binding)
I checked:
1. All download links are valid
2. Checksum and signature are OK
3. LICENSE and NOTICE are exist
4. Build successfully on macOS(Big Sur)
5. ....
```
PMC成员
```html
+1 (binding)
I checked:
1. All download links are valid
2. Checksum and signature are OK
3. LICENSE and NOTICE are exist
4. Build successfully on macOS(Big Sur)
5. ....
```
---
This doc refer from [Apache StreamPark](https://streampark.apache.org/)
@@ -0,0 +1,61 @@
---
id: 'mailing_lists'
title: '邮件列表'
sidebar_position: 1
---
<!--
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
https://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
[开发者邮件列表](https://lists.apache.org/list.html?dev@hertzbeat.apache.org) 是社区推荐的沟通和获取最新信息的方式。
在您向邮件列表发送任何内容之前,请确保您已经**订阅**了它们。
## 用途
### 开发者列表
- 使用此列表提出您对 HertzBeat 的问题
- 由 HertzBeat 贡献者用来讨论 HertzBeat 的开发
| 列表名称 | 地址 | 订阅 | 退订 | 归档 |
|-----------|--------------------------|-------------------------------------------------|---------------------------------------------------|-------------------------------------------------------------------|
| **开发者列表** | [dev@hertzbeat.apache.org](mailto:dev@hertzbeat.apache.org) | [订阅](mailto:dev-subscribe@hertzbeat.apache.org) | [退订](mailto:dev-unsubscribe@hertzbeat.apache.org) | [归档](https://lists.apache.org/list.html?dev@hertzbeat.apache.org) |
### 通知列表
- 关于 HertzBeat 代码库的更改的通知,频繁通知
| 列表名称 | 地址 | 订阅 | 退订 | 归档 |
|----------|------------------------------------|-----------------------------------------------------------|-------------------------------------------------------------|-----------------------------------------------------------------------------|
| **通知列表** | [notifications@hertzbeat.apache.org](mailto:notifications@hertzbeat.apache.org) | [订阅](mailto:notifications-subscribe@hertzbeat.apache.org) | [退订](mailto:notifications-unsubscribe@hertzbeat.apache.org) | [归档](https://lists.apache.org/list.html?notifications@hertzbeat.apache.org) |
## 订阅步骤
发送订阅邮件即可订阅。步骤如下:
- 1、**订阅**:点击上表中的 **订阅** 按钮,它将重定向到您的邮件客户端。主题和内容是任意的。
之后,您会从 [dev-help@hertzbeat.apache.org](mailto:dev-help@hertzbeat.apache.org) 收到确认邮件(如果没有收到,请确认电子邮件是否被自动分类为垃圾邮件、推广邮件、订阅邮件等)。
- 2、**确认**:直接回复确认邮件,或点击邮件中的链接快速回复。主题和内容是任意的。
- 3、**欢迎**:在完成上述步骤后,您会收到一个主题为 WELCOME to [dev@hertzbeat.apache.org](mailto:dev@hertzbeat.apache.org) 的欢迎邮件,您已成功订阅 Apache HertzBeat 邮件列表。
## 发送纯文本邮件
在发送邮件列表时,请使用纯文本邮件。
**不要使用 HTML 邮件**
HTML 邮件更有可能被视为垃圾邮件并被拒绝。
通过不同的邮件客户端,它可能会出现格式错误,并且其他人不容易阅读。
@@ -0,0 +1,88 @@
---
id: maturity
title: Maturity
sidebar_position: 0
---
## Maturity Assessment for Apache HertzBeat™
The goals of this maturity model are to describe how Apache projects operate in a concise and high-level way, and to provide a basic framework that projects may choose to use to evaluate themselves.
More details can be found in the [Apache Project Maturity Model](https://community.apache.org/apache-way/apache-project-maturity-model.html).
## Status of this assessment
This assessment is evaluated during HertzBeat's Incubating.
## Maturity model assessment
The following table is filled according to the [Apache Maturity Model](https://community.apache.org/apache-way/apache-project-maturity-model.html). Mentors and community members are welcome to comment and modify it.
### CODE
| **ID** | **Description** | **Status** |
| -------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| **CD10** | The project produces Open Source software for distribution to the public, at no charge. | **YES** The project source code is licensed under the `Apache License 2.0`. |
| **CD20** | Anyone can easily discover and access the project's code.. | **YES** The [official website](https://hertzbeat.apache.org/) includes `GitHub` link which can access the project's repository on GitHub directly. |
| **CD30** | Anyone using standard, widely-available tools, can build the code in a reproducible way. | **YES** Apache HertzBeat provide `how-to-build` document for every component to tell user how to compile on bare metal, such as the [core's](https://hertzbeat.apache.org/docs/community/development). |
| **CD40** | The full history of the project's code is available via a source code control system, in a way that allows anyone to recreate any released version. | **YES** It depends on git, and anyone can view the full history of the project via commit logs. |
| **CD50** | The source code control system establishes the provenance of each line of code in a reliable way, based on strong authentication of the committer. When third parties contribute code, commit messages provide reliable information about the code provenance. | **YES** The project uses GitHub and managed by Apache Infra, it ensuring provenance of each line of code to a committer. And the third-party contributions are accepted in accordance with the contributing guides. |
### LICENSE
| **ID** | **Description** | **Status** |
| -------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| **LC10** | The Apache License, version 2.0, covers the released code. | **YES** The [LICENSE](https://github.com/apache/hertzbeat/blob/master/LICENSE) is in GitHub repository. And all source files are with APLv2 header, checked by Github Action. |
| **LC20** | Libraries that are mandatory dependencies of the project's code do not create more restrictions than the Apache License does. | **YES** All dependencies are listed. |
| **LC30** | The libraries mentioned in LC20 are available as Open Source software. | **YES** All dependencies are listed are available as Open Source software |
| **LC40** | Committers are bound by an Individual Contributor Agreement (the "Apache iCLA") that defines which code they may commit and how they need to identify code that is not their own. | **YES** All committers have iCLAs. |
| **LC50** | The project clearly defines and documents the copyright ownership of everything that the project produces. | **YES** And all source files are with APLv2 header, checked by GitHub Action. |
### Releases
| **ID** | **Description** | **Status** |
| -------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- |-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| **RE10** | Releases consist of source code, distributed using standard and open archive formats that are expected to stay readable in the long term. | **YES** Source release is distributed via [dist.apache.org](https://dist.apache.org/repos/dist/release/incubator/hertzbeat/) and linked from [download page](https://hertzbeat.apache.org/docs/download). |
| **RE20** | The project's PPMC (Project Management Committee, see CS10) approves each software release in order to make the release an act of the Foundation. | **YES** All releases have been voted at [dev@hertzbeat.apache.org](mailto:dev@hertzbeat.apache.org) and [general@incubator.apache.org](mailto:general@incubator.apache.org), and have at least 3 PPMC member's votes. |
| **RE30** | Releases are signed and/or distributed along with digests that anyone can reliably use to validate the downloaded archives. | **YES** All releases are signed, and the [KEYS](https://dist.apache.org/repos/dist/release/hertzbeat/KEYS) are available. |
| **RE40** | The project can distribute convenience binaries alongside source code, but they are not Apache Releases, they are provided with no guarantee. | **YES** User can easily build binaries from source code, and we do not provide binaries as Apache Releases. |
| **RE50** | The project documents a repeatable release process so that someone new to the project can independently generate the complete set of artifacts required for a release. | **YES** We can follow the [Release guide](https://hertzbeat.apache.org/docs/community/how_to_release) to make a new Apache HertzBeat release, and so far we had 4 different release managers. |
### Quality
| **ID** | **Description** | **Status** |
| -------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| **QU10** | The project is open and honest about the quality of its code. Various levels of quality and maturity for various modules are natural and acceptable as long as they are clearly communicated. | **YES** We encourage user to [report issues](https://github.com/apache/hertzbeat/issues). |
| **QU20** | The project puts a very high priority on producing secure software. | **YES** All security reports are actively handled. |
| **QU30** | The project provides a well-documented, secure and private channel to report security issues, along with a documented way of responding to them. | **Yes** The official Github Repo provides a [security doc](https://github.com/apache/hertzbeat/blob/master/SECURITY.md) |
| **QU40** | The project puts a high priority on backwards compatibility and aims to document any incompatible changes and provide tools and documentation to help users transition to new features. | **Yes** We follow semantic versions. As long as it's within one major version, it's backward compatible. And when any breaking changes added, we provide corresponding upgrade guides. |
| **QU50** | The project strives to respond to documented bug reports in a timely manner. | **YES** The project has resolved 743+ issues and 2348+ pull requests so far, with very prompt response. |
### Community
| **ID** | **Description** | **Status** |
| -------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- |---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| **CO10** | The project has a well-known homepage that points to all the information required to operate according to this maturity model. | **YES** The [official website](https://hertzbeat.apache.org/) includes all information user need to run Apache HertzBeat. |
| **CO20** | The community welcomes contributions from anyone who acts in good faith and in a respectful manner, and who adds value to the project. | **Yes** We provide contributing guides for every component. And we also have a [general contributing guide](https://hertzbeat.apache.org/docs/community/contribution) |
| **CO30** | Contributions include source code, documentation, constructive bug reports, constructive discussions, marketing and generally anything that adds value to the project. | **YES** All good contributions including code and non-code are welcomed. |
| **CO40** | The community strives to be meritocratic and gives more rights and responsibilities to contributors who, over time, add value to the project. | **YES** The community has elected 3 new PPMC members and 13 new committers so far. |
| **CO50** | The project documents how contributors can earn more rights such as commit access or decision power, and applies these principles consistently. | **YES** The community has clear docs on nominating committers and PPMC members |
| **CO60** | The community operates based on consensus of its members (see CS10) who have decision power. Dictators, benevolent or not, are not welcome in Apache projects. | **YES** All decisions are made after vote by community members. |
| **CO70** | The project strives to answer user questions in a timely manner. | **YES** We use [dev@hertzbeat.apache.org](mailto:dev@hertzbeat.apache.org), [GitHub issue](https://github.com/apache/hertzbeat/issues) and [GitHub discussion](https://github.com/apache/hertzbeat/discussions) to do this in a timely manner. |
### Consensus
| **ID** | **Description** | **Status** |
| -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |--------------------------------------------------------------------------------------------------------------|
| **CS10** | The project maintains a public list of its contributors who have decision power. The project's PPMC (Project Management Committee) consists of those contributors. | **Yes** See [members](https://hertzbeat.apache.org/team/) with all PPMC members and committers. |
| **CS20** | Decisions require a consensus among PPMC members and are documented on the project's main communications channel. The PPMC takes community opinions into account, but the PPMC has the final word. | **YES** All decisions are made by votes on [dev@hertzbeat.apache.org](mailto:dev@hertzbeat.apache.org), and with at least 3 +1 votes from PPMC. |
| **CS30** | The project uses documented voting rules to build consensus when discussion is not sufficient. | **YES** The project uses the standard ASF voting rules. |
| **CS40** | In Apache projects, vetoes are only valid for code commits. The person exercising the veto must justify it with a technical explanation, as per the Apache voting rules defined in CS30. | **YES** Apache HertzBeat community has not used the veto power yet except for code commits. |
| **CS50** | All "important" discussions happen asynchronously in written form on the project's main communications channel. Offline, face-to-face or private discussions that affect the project are also documented on that channel. | **YES** All important discussions and conclusions are recorded in written form. |
### Independence
| **ID** | **Description** | **Status** |
| -------- | ---------------------------------------------------------------------------------------- |---------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| **IN10** | The project is independent from any corporate or organizational influence. | **YES** The PPMC members and committer of Apache HertzBeat are from several different companies, and majority of them are NOT From the company that donated this project. |
| **IN20** | Contributors act as themselves, not as representatives of a corporation or organization. | **YES** The contributors act on their own initiative without representing a corporation or organization. |
@@ -0,0 +1,505 @@
---
id: 'new_committer_process'
title: '提名新Committer流程'
sidebar_position: 4
---
<!--
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
https://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
[官方指南](https://community.apache.org/newcommitter.html#new-committer-process)
## 提名新Committer的流程
- 在邮件`private@hertzbeat.apache.org`中发起投票
参见 **Committer投票模板**
- 关闭投票
参见 **关闭投票模板**
- 如果结果是赞成,邀请新的Committer
参见 **Committer邀请模板**
- 如果同意,那么:接受Committer
参见 **Committer接受模板**
- 新Committer签署CLA,等待CLA的接收记录
- 请求创建Committer账户
参见 **Committer账户创建模板**
- 等待root告诉我们已经完成
- [Roster](https://whimsy.apache.org/roster/ppmc/hertzbeat) 添加新的 committer
- Announce New Committer
参见 **Announce New Committer Template**
## 模板
请注意,模板中有三个占位符在使用之前应该替换:
- NEW_COMMITTER_NAME 这须是真实名字,而非 Github 名称或 Id
- NEW_COMMITTER_EMAIL
- NEW_COMMITTER_APACHE_NAME
### Committer投票模板
:::note
NEW_COMMITTER_NAME 这须是真实名字,而非 Github 名称或 Id
:::
```text
To: private@hertzbeat.apache.org
Subject: [VOTE] New committer: `NEW_COMMITTER_NAME`
```
```text
Hi HertzBeat PMC,
This is a formal vote about inviting `NEW_COMMITTER_NAME` as our community new committer.
Work list: https://github.com/apache/hertzbeat/commits?author=xxx
Here is the list of `NEW_COMMITTER_NAME`'s contributions in HertzBeat Community:
> [27 commits](https://github.com/apache/hertzbeat/commits?author=xxx)
>
> 7,495 ++ 627 --
Submitted PR (27 commits)
- [ISSUE #4534] [feature] add new feature in hertzbeat #3445
- xxx
Submitted Issues (18 commits)
- [bug] find some bugs in hertzbeat nodes #6565
- xxx
Please vote:
+1: I support this proposal and will welcome `NEW_COMMITTER_NAME` as a committer.
+0: I don't care.
-1: I object to this proposal and here are my reasons.
This vote will be open for at least 7 days.
Best Wishes,
ttt
```
注意,投票将在今天一周后结束,即
[midnight UTC on YYYY-MM-DD](https://www.timeanddate.com/counters/customcounter.html?year=YYYY&month=MM&day=DD)
[Apache投票指南](https://community.apache.org/newcommitter.html)
### 关闭投票模板
```text
To: private@hertzbeat.apache.org
Subject: [RESULT] [VOTE] New committer: `NEW_COMMITTER_NAME`
```
```text
Hi HertzBeat PMC,
The vote has now closed. The results are:
Binding Votes:
+1 [TOTAL BINDING +1 VOTES]
0 [TOTAL BINDING +0/-0 VOTES]
-1 [TOTAL BINDING -1 VOTES]
The vote is ***successful/not successful***
```
### Committer邀请模板
```text
To: NewCommiter@domain.com
Cc: private@hertzbeat.apache.org
Subject: Invitation to become HertzBeat committer: [Candidate Name]
```
```text
Hello [Candidate Name],
The HertzBeat Project Management Committee (PMC)
hereby offers you committer privileges to the project
These privileges are offered on the understanding that you'll use them
reasonably and with common sense. We like to work on trust
rather than unnecessary constraints.
Being a committer enables you to more easily make
changes without needing to go through the patch
submission process.
Being a committer does not require you to
participate any more than you already do. It does
tend to make one even more committed. You will
probably find that you spend more time here.
Of course, you can decline and instead remain as a
contributor, participating as you do now.
This personal invitation is a chance for you to accept or decline in private.
Please let us know in reply to this message whether you accept or decline.
Also, please refrain from sharing that you were invited before the official
announcement by the PMC.
If you accept, you will need an Apache account (id) with privileges.
Please follow these instructions.
A. If you already have an ICLA on file:
1. If you already have an Apache account, let us know your id and we
will grant you privileges on the project repositories.
2. If you have previously sent an ICLA, let us know the email address
and public name used on the ICLA and your preferred Apache id, and
we will request your account.
3. If the email address on the previously submitted ICLA is no longer
valid, let us know the email address and public name used on the new ICLA,
and your preferred Apache id. Continue to step B below and file your new ICLA.
Look to see if your preferred ID is already taken at
https://people.apache.org/committer-index.html
B. If there is not already an ICLA on file, you need to submit an ICLA:
1. Details of the ICLA and the forms are found
through this link: https://www.apache.org/licenses/#clas
2. Instructions for its completion and return to
the Secretary of the ASF are found at
https://www.apache.org/licenses/contributor-agreements.html#submitting
Do not copy the project or any other individual on your message
to Secretary, as the form contains Personally Identifiable Information
that should be kept private.
3. When you complete the ICLA form, be sure to include in the form
the Apache HertzBeat project and choose a
unique Apache ID. Look to see if your preferred
ID is already taken at
https://people.apache.org/committer-index.html
This will allow the Secretary to notify the PMC
when your ICLA has been recorded.
When recording of your ICLA is noted, you will
receive a follow-up message with the next steps for
establishing you as a committer.
```
### Committer接受模板
```text
To: `NEW_COMMITTER_EMAIL`
Cc: private@hertzbeat.apache.org
Subject: Re: invitation to become HertzBeat committer
```
```text
Welcome. Here are the next steps in becoming a project committer. After that
we will make an announcement to the dev@hertzbeat.apache.org list.
You need to send a Contributor License Agreement to the ASF.
Normally you would send an Individual CLA. If you also make
contributions done in work time or using work resources,
see the Corporate CLA. Ask us if you have any issues.
https://www.apache.org/licenses/#clas.
You need to choose a preferred ASF user name and alternatives.
In order to ensure it is available you can view a list of taken IDs at
https://people.apache.org/committer-index.html
Please notify us when you have submitted the CLA and by what means
you did so. This will enable us to monitor its progress.
We will arrange for your Apache user account when the CLA has
been recorded.
After that is done, please make followup replies to the dev@hertzbeat.apache.org list.
We generally discuss everything there and keep the
private@hertzbeat.apache.org list for occasional matters which must be private.
The developer section of the website describes roles within the ASF and provides other
resources:
https://www.apache.org/foundation/how-it-works.html
https://www.apache.org/dev/
The incubator also has some useful information for new committers
in incubating projects:
https://incubator.apache.org/guides/committer.html
https://incubator.apache.org/guides/ppmc.html
Just as before you became a committer, participation in any ASF community
requires adherence to the ASF Code of Conduct:
https://www.apache.org/foundation/policies/conduct.html
Yours,
The Apache HertzBeat PMC
```
### Announce New Committer Template
```text
To: dev@hertzbeat.apache.org, `NEW_COMMITTER_EMAIL`
Subject: [ANNOUNCE] New committer: `NEW_COMMITTER_NAME`
```
```text
Hello Community,
The Podling Project Management Committee (PMC) for Apache HertzBeat
has invited `NEW_COMMITTER_NAME` to become a committer and we are pleased to
announce that he has accepted.
`NEW_COMMITTER_NAME` is active in the Apache HertzBeat community, hope to see your
further interactions with the community!
Thanks for your contributions.
Best Wishes!
```
## 详细步骤
### 接受邀请
当通过PMC内部投票后,PMC会向您索要个人邮箱,之后您会收到一封邮件,邮件会指引您进行下一步操作,内容为:
```text
Hello xxxx,
The HertzBeat Project Management Committee (PMC)
hereby offers you committer privileges to the project.
These privileges are offered on the understanding that
you'll use them reasonably and with common sense.
We like to work on trust rather than unnecessary constraints.
Being a committer enables you to more easily make
changes without needing to go through the patch
submission process.
Being a committer does not require you to
participate any more than you already do. It does
tend to make one even more committed. You will
probably find that you spend more time here.
Of course, you can decline and instead remain as a
contributor, participating as you do now.
A. This personal invitation is a chance for you to
accept or decline in private. Either way, please
let us know in reply to the private@hertzbeat.apache.org
address only.
B. If you accept, the next step is to register an iCLA:
1. Details of the iCLA and the forms are found
through this link: https://www.apache.org/licenses/#clas
2. Instructions for its completion and return to
the Secretary of the ASF are found at
https://www.apache.org/licenses/#submitting
3. When you transmit the completed iCLA, request
to notify the Apache HertzBeat and choose a
unique Apache ID. Look to see if your preferred
ID is already taken at
https://people.apache.org/committer-index.html
This will allow the Secretary to notify the PMC
when your iCLA has been recorded.
When recording of your iCLA is noted, you will
receive a follow-up message with the next steps for
establishing you as a committer.
```
如果您接受邀请,请回复该邮件,记住要**回复全部**,回复内容为:
```text
hi, i accept. Thanks for invitaion.
```
随后您会收到一封邮件,里面描述这如何具体步骤,也可以根据我们的文档继续进行操作。
### ICLA签署流程
接受邀请后,会收到邮件,邮件会指引签署iCLA。
1. 下载iCLA申请表
打开访问:[https://www.apache.org/licenses/#clas](https://www.apache.org/licenses/#clas)
找到`CLAs`点击进入页面
![HertzBeat](/img/docs/community/clas-web.png)
找到`ICLA(个人贡献者许可协议)`,点击[Individual Contributor License Agreement](https://www.apache.org/licenses/icla.pdf)
![HertzBeat](/img/docs/community/icla-web.png)
跳转后,会显示需要签署的协议,这里可以在网页上直接填写,也可以下载后填写。
![HertzBeat](/img/docs/community/icla-pdf.png)
2. 填写iCLA
> tips: 签名时需要手写签名,其他的可以直接填写后打印。
需要填写的内容:
![HertzBeat](/img/docs/community/icla-content-1.png)
![HertzBeat](/img/docs/community/icla-content-2.png)
在PDF中需要填写的字段:
- `Full name`
- `Public name`
- `Postal Address`
- `Country`
- `E-Mail`
- `(optional) preferred Apache id(s)`
- `(optional) notify project`
- `Date`
> 填写样例
> ![HertzBeat](/img/docs/community/icla-content-3.png)
> ![HertzBeat](/img/docs/community/icla-content-4.png)
3. 打印并签署
![HertzBeat](/img/docs/community/icla-content-5.png)
`Please sign`字段需要将文件打印出来然后手写签名,内容为自己姓名的全拼。
4. 将签名后的文件拍照或扫描转为PDF,并重命名为`姓名拼音-icla.pdf`
5. 发送邮件到指定邮箱
邮件发送到`secretary@apache.org`,抄送到`private@hertzbeat.apache.org`
注意⚠️此邮件内容需要附加上之前的 committer 邀请邮件信息, 建议在之前的往来邮件点击回复然后修改标题和收件人等。
**发送模板**
主题:`Accept to become a HertzBeat committer`
正文:
```text
Hello Apache,
I am willing contribute to the ASF. The attachment is my ICLA information. My Github account is : https://github.com/xxxx.
Thanks !
```
大概1-5个工作日你就会收到一封来自`root@apache.org`的邮件。
当您收到邮件标题为:`Welcome to the Apache Software Foundation`的邮件,恭喜你,你已经获取到Apache ID了!
### 设置Apache密码
在网站 [https://id.apache.org/reset/enter](https://id.apache.org/reset/enter) 输入您的Apache ID
![HertzBeat](/img/docs/community/account-1.png)
点击`Send Email`后会提示发送成功。
在您提供给PMC的邮箱中会收到一封来自`root@apache.org`重置密码的邮件,标题为`Password reset request for xxx from Apache ID`,在邮件正文中会有重置密码的链接,我们点击链接设置密码。
### 将Apache账号和GitHub账号关联
访问: [https://whimsy.apache.org/roster/committer/`APACHE_ID`](https://whimsy.apache.org/roster/committer/`APACHE_ID`)
- ``APACHE_ID``替换成你的Apache ID
登录后可以看到这个内容`Link GitHub username to ASF id`,点击跳转
![HertzBeat](/img/docs/community/account-2.png)
输入您的Apache的账号和密码并登录
![HertzBeat](/img/docs/community/account-3.png)
点击 `Authenticate with GitHub`
![HertzBeat](/img/docs/community/account-4.png)
点击`Authorize apache`授权给Apache
![HertzBeat](/img/docs/community/account-5.png)
点击`Send GitHub Invitation!` 发送GitHub邀请邮件
![HertzBeat](/img/docs/community/account-6.png)
邮箱中会收到一封邮件,点击`Join @apache`
> 这里邮箱指的是您提供给PMC的那个邮箱地址
![HertzBeat](/img/docs/community/account-7.png)
点击`Join The Apache Software Foundation`,加入GitHub加入Apache组织,会自动跳转到GitHub页面
![HertzBeat](/img/docs/community/account-8.png)
![HertzBeat](/img/docs/community/account-9.png)
回到Apache页面,提示GitHub启用多重身份认证,在GitHub页面启用双重身份认证
> GitHub双重身份认证介绍,[点击跳转官方文档](https://docs.github.com/zh/authentication/securing-your-account-with-two-factor-authentication-2fa/about-two-factor-authentication)
![HertzBeat](/img/docs/community/account-10.png)
启动完成之后等几分钟,提示已经绑定完成
![HertzBeat](/img/docs/community/account-11.png)
至此您的GitHub账号与Apache账号就绑定完成了。
最后一步,联系PMC主席开启svn和其他访问权限。
## 邮箱绑定
### GMail邮箱绑定
邮箱地址:[https://mail.google.com/](https://mail.google.com/)
进入设置页面,并点击`添加其他电子邮件地址``
![HertzBeat](/img/docs/community/email-1.png)
填写您的apache邮箱,按照指引点击下一步
![HertzBeat](/img/docs/community/email-2.png)
![HertzBeat](/img/docs/community/email-3.png)
![HertzBeat](/img/docs/community/email-4.png)
设置为默认发送邮箱(可选)
![HertzBeat](/img/docs/community/email-5.png)
配置完成。
最后一步,别忘了订阅[开发者邮箱列表](./mailing_lists.md)。
@@ -0,0 +1,309 @@
---
id: 'new_pmc_ember_process'
title: '提名新PMC成员流程'
sidebar_position: 5
---
<!--
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
https://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
这个指南是基于 [apache newcommitter](https://community.apache.org/newcommitter.html#new-committer-process) 的。
## 新PMC成员的流程
- 在邮件`private@hertzbeat.apache.org`中进行投票
参见 **PMC成员投票模板**
- 关闭投票
参见 **关闭投票模板**
- 董事会批准新的PMC成员
参见 **董事会批准新PMC成员**
- 如果结果是赞成,邀请新的PMC成员
参见 **PMC成员邀请模板**
- 如果同意,那么:接受PMC成员
参见 **PMC成员接受模板**
- 通知PMC成员完成
参见 **PMC成员完成模板**
- 宣布新的PMC成员
参见 **PMC成员公告模板**
## 模板
注意,在使用模板之前,有三个占位符需要被替换
- NEW_PMC_NAME
- NEW_PMC_EMAIL
- NEW_PMC_APACHE_NAME
### PMC成员投票模板
```text
To: private@hertzbeat.apache.org
Subject: [VOTE] New PMC member candidate: `NEW_PMC_NAME`
```
```text
Hi HertzBeat PMC,
This is a formal vote about inviting `NEW_PMC_NAME` as our new PMC member.
${Work list}[1]
[1] https://github.com/apache/hertzbeat/commits?author=`NEW_PMC_NAME`
```
注意,投票将在今天一周后结束,即
[midnight UTC on YYYY-MM-DD](https://www.timeanddate.com/counters/customcounter.html?year=YYYY&month=MM&day=DD)
[Apache 参考投票指南](https://community.apache.org/newcommitter.html)
### Close Vote Template
```text
To: private@hertzbeat.apache.org
Subject: [RESULT] [VOTE] New PMC member: `NEW_PMC_NAME`
```
```text
Hi HertzBeat PMC,
The vote has now closed. The results are:
Binding Votes:
+1 [TOTAL BINDING +1 VOTES]
0 [TOTAL BINDING +0/-0 VOTES]
-1 [TOTAL BINDING -1 VOTES]
The vote is ***successful/not successful***
```
### Board Approval of new PMC member Template
```text
To: board@apache.org
Cc: private@`<project>`.apache.org
Subject: [NOTICE] `NEW_PMC_NAME` for HertzBeat PMC member
```
```text
HertzBeat proposes to invite `NEW_PMC_NAME` to join the PMC.
The vote result is available here: https://lists.apache.org/...
```
[Apache New Pmc Guide](https://www.apache.org/dev/pmc.html#newpmc)
### PMC成员邀请模板
```text
To: `NEW_PMC_EMAIL`
Cc: private@hertzbeat.apache.org
Subject: Invitation to become HertzBeat PMC member: `NEW_PMC_NAME`
```
```text
Hello [Candidate Name],
The HertzBeat Project Management Committee (PMC)
hereby offers you PMC members privileges to the project
These privileges are offered on the understanding that you'll use them
reasonably and with common sense. We like to work on trust
rather than unnecessary constraints.
Being a PMC member enables you
to guide the direction of the project.
Being a committer does not require you to
participate any more than you already do. It does
tend to make one even more committed. You will
probably find that you spend more time here.
Of course, you can decline and instead remain as a
contributor, participating as you do now.
This personal invitation is a chance for you to accept or decline in private.
Please let us know in reply to this message whether you accept or decline.
Also, please refrain from sharing that you were invited before the official
announcement by the PMC.
If you accept, you will need an Apache account (id) with privileges.
Please follow these instructions.
A. If you already have an ICLA on file:
1. If you already have an Apache account, let us know your id and we
will grant you privileges on the project repositories.
2. If you have previously sent an ICLA, let us know the email address
and public name used on the ICLA and your preferred Apache id, and
we will request your account.
3. If the email address on the previously submitted ICLA is no longer
valid, let us know the email address and public name used on the new ICLA,
and your preferred Apache id. Continue to step B below and file your new ICLA.
Look to see if your preferred ID is already taken at
https://people.apache.org/committer-index.html
B. If there is not already an ICLA on file, you need to submit an ICLA:
1. Details of the ICLA and the forms are found
through this link: https://www.apache.org/licenses/#clas
2. Instructions for its completion and return to
the Secretary of the ASF are found at
https://www.apache.org/licenses/contributor-agreements.html#submitting
Do not copy the project or any other individual on your message
to Secretary, as the form contains Personally Identifiable Information
that should be kept private.
3. When you complete the ICLA form, be sure to include in the form
the Apache HertzBeat project and choose a
unique Apache ID. Look to see if your preferred
ID is already taken at
https://people.apache.org/committer-index.html
This will allow the Secretary to notify the PMC
when your ICLA has been recorded.
When recording of your ICLA is noted, you will
receive a follow-up message with the next steps for
establishing you as a PMC.
```
### PMC成员接受模板
```text
To: `NEW_PMC_EMAIL`
Cc: private@hertzbeatv.apache.org
Subject: Re: invitation to become HertzBeat PMC member
```
```text
Welcome. Here are the next steps in becoming a project PMC. After that
we will make an announcement to the dev@hertzbeat.apache.org list.
You need to send a Contributor License Agreement to the ASF.
Normally you would send an Individual CLA. If you also make
contributions done in work time or using work resources,
see the Corporate CLA. Ask us if you have any issues.
https://www.apache.org/licenses/#clas.
You need to choose a preferred ASF user name and alternatives.
In order to ensure it is available you can view a list of taken IDs at
https://people.apache.org/committer-index.html
Please notify us when you have submitted the CLA and by what means
you did so. This will enable us to monitor its progress.
We will arrange for your Apache user account when the CLA has
been recorded.
After that is done, please make followup replies to the dev@hertzbeat.apache.org list.
We generally discuss everything there and keep the
private@hertzbeat.apache.org list for occasional matters which must be private.
The developer section of the website describes roles within the ASF and provides other
resources:
https://www.apache.org/foundation/how-it-works.html
https://www.apache.org/dev/
The incubator also has some useful information for new PMC
in incubating projects:
https://incubator.apache.org/guides/committer.html
https://incubator.apache.org/guides/ppmc.html
Just as before you became a PMC member, participation in any ASF community
requires adherence to the ASF Code of Conduct:
https://www.apache.org/foundation/policies/conduct.html
Yours,
The Apache HertzBeat PMC
```
### PMC成员完成模板
```text
To: private@hertzbeat.apache.org, `NEW_PMC_EMAIL`
Subject: account request: `NEW_PMC_NAME`
```
```text
`NEW_PMC_EMAIL`, as you know, the ASF Infrastructure has set up your
committer account with the username '`NEW_PMC_APACHE_NAME`'.
Please follow the instructions to set up your SSH,
svn password, svn configuration, email forwarding, etc.
https://www.apache.org/dev/#committers
You have commit access to specific sections of the
ASF repository, as follows:
The general "committers" at:
https://svn.apache.org/repos/private/committers
If you have any questions during this phase, then please
see the following resources:
Apache developer's pages: https://www.apache.org/dev/
Incubator committer guide: https://incubator.apache.org/guides/committer.html
Naturally, if you don't understand anything be sure to ask us on the dev@hertzbeat.apache.org mailing list.
Documentation is maintained by volunteers and hence can be out-of-date and incomplete - of course
you can now help fix that.
A PMC member will announce your election to the dev list soon.
```
### PMC成员通知模板
```text
To: dev@hertzbeat.apache.org
[ANNOUNCE] New PMC member: `NEW_PMC_NAME`
```
```text
Hi HertzBeat Community,
The Podling Project Management Committee (PMC) for Apache HertzBeat
has invited `NEW_PMC_NAME` to become our PMC member and
we are pleased to announce that he has accepted.
### add specific details here ###
Please join me in congratulating `NEW_PMC_NAME`!
Being a committer enables easier contribution to the
project since there is no need to go via the patch
submission process. This should enable better productivity.
A PMC member helps manage and guide the direction of the project.
Thanks,
On behalf of the Apache HertzBeat PMC
```
@@ -0,0 +1,72 @@
---
id: 'submit_code'
title: '提交代码'
sidebar_position: 2
---
<!--
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
https://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
* 首先从远程仓库 [https://github.com/apache/hertzbeat.git](https://github.com/apache/hertzbeat.git) 将代码的一份副本 fork 到您自己的仓库
* 远程仓库开发合并分支:`master`
* 将您fork仓库clone到您的本地设备
```shell
git clone git@github.com:<您的账户名>/hertzbeat.git
```
* 添加远程仓库地址,命名为 upstream
```shell
git remote add upstream git@github.com:apache/hertzbeat.git
```
* 查看仓库
```shell
git remote -v
```
> 此时会有两个仓库:origin(您自己的仓库)和 upstream(远程仓库)
* 获取/更新远程仓库代码
```shell
git fetch upstream
```
* 将远程仓库代码同步到本地仓库
```shell
git checkout origin/master
git merge --no-ff upstream/master
```
* **⚠️注意一定要新建分支开发特性 `git checkout -b feature-xxx`,不建议使用master分支直接开发**
* 在本地修改代码后,提交到自己的仓库:
**注意提交信息为英文,不包含特殊字符**
```shell
git commit -m '[docs]necessary instructions'
git push
```
* 将更改提交到远程仓库后,您可以在您的仓库页面上看到一个绿色的按钮“Compare & pull request”,点击它。
* 这会弹出新建 Pull Request 页面,您需要这里仔细填写信息(英文),描述和代码同样重要,然后点击“Create pull request”按钮。
* 然后社区的 Committers 将进行 CodeReview,并与您讨论一些细节(包括设计、实现、性能等),之后您可以根据建议直接在这个分支更新代码(无需新建PR)。当社区 Committer approve之后,提交将被合并到 master 分支。
* 最后,恭喜您,您已经成为 HertzBeat 的官方贡献者,您会被加在贡献者墙上,您可以联系社区获取贡献者证书!
@@ -0,0 +1,131 @@
---
id: download
title: 下载 Apache HertzBeat - 最新版本
sidebar_label: 下载
description: Apache HertzBeat 监控系统下载 - 服务器、采集器、源码和 Docker Compose 包,包含签名和校验和。
---
## 如何下载 HertzBeat
下载最新 Apache HertzBeat™ 发布版(v1.8.0)的服务器二进制、采集器二进制、源码或 Docker Compose 包。所有发布版都包含 GPG 签名和 SHA512 校验和用于验证。
**最新版本:** v1.8.0(发布日期:2026年2月5日)
**快速下载:**
- [服务器二进制](https://www.apache.org/dyn/closer.lua/hertzbeat/1.8.0/apache-hertzbeat-1.8.0-bin.tar.gz)
- [采集器二进制](https://www.apache.org/dyn/closer.lua/hertzbeat/1.8.0/apache-hertzbeat-collector-1.8.0-bin.tar.gz)
- [源码](https://www.apache.org/dyn/closer.lua/hertzbeat/1.8.0/apache-hertzbeat-1.8.0-src.tar.gz)
## 下载包类型
| 包类型 | 大小 | 用途 | 平台 |
|--------|------|------|------|
| **服务器二进制** | ~200MB | 主监控服务器 | Linux、macOS、Windows |
| **采集器二进制** | ~50MB | 分布式采集器 | Linux、macOS、Windows |
| **源码** | ~30MB | 从源码构建 | 任何支持 Java 25+ 的平台 |
| **Docker Compose** | ~5MB | 全栈部署 | Docker 环境 |
:::tip Native 采集器推荐
如果你不需要 `ext-lib` 外部 JDBC 驱动,可以优先选择 Native 采集器安装包,通常启动更快、内存更省。MySQL、MariaDB、OceanBase 在没有提供 `mysql-connector-j` 时也属于这条 Native 友好路径;TiDB 的 SQL 查询指标也遵循同样规则。
它的代价是安装包按平台区分,且不支持运行时 `ext-lib` JDBC 加载。详见 [Native 采集器指南](start/native-collector)。
:::
:::tip 安全验证
使用 GPG 签名和 SHA512 校验和验证下载。参见 [Apache 验证指南](https://www.apache.org/dyn/closer.cgi#verify) 和 [HertzBeat KEYS](https://downloads.apache.org/hertzbeat/KEYS)。
:::
## 最新版本(推荐)
:::tip 安全公告
以前版本可能包含安全漏洞。请始终使用最新版本。
:::
| 版本 | 日期 | 下载 | Release |
|--------|------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------|
| v1.8.0 | 2026.02.05 | [apache-hertzbeat-1.8.0-bin.tar.gz](https://www.apache.org/dyn/closer.lua/hertzbeat/1.8.0/apache-hertzbeat-1.8.0-bin.tar.gz) (Server) ( [signature](https://downloads.apache.org/hertzbeat/1.8.0/apache-hertzbeat-1.8.0-bin.tar.gz.asc) , [sha512](https://downloads.apache.org/hertzbeat/1.8.0/apache-hertzbeat-1.8.0-bin.tar.gz.sha512) ) <br/> [apache-hertzbeat-collector-1.8.0-bin.tar.gz](https://www.apache.org/dyn/closer.lua/hertzbeat/1.8.0/apache-hertzbeat-collector-1.8.0-bin.tar.gz) (Collector) ( [signature](https://downloads.apache.org/hertzbeat/1.8.0/apache-hertzbeat-collector-1.8.0-bin.tar.gz.asc) , [sha512](https://downloads.apache.org/hertzbeat/1.8.0/apache-hertzbeat-collector-1.8.0-bin.tar.gz.sha512) ) <br/> [apache-hertzbeat-1.8.0-src.tar.gz](https://www.apache.org/dyn/closer.lua/hertzbeat/1.8.0/apache-hertzbeat-1.8.0-src.tar.gz) (Source Code) ( [signature](https://downloads.apache.org/hertzbeat/1.8.0/apache-hertzbeat-1.8.0-src.tar.gz.asc) , [sha512](https://downloads.apache.org/hertzbeat/1.8.0/apache-hertzbeat-1.8.0-src.tar.gz.sha512) ) <br/> [apache-hertzbeat-1.8.0-docker-compose.tar.gz](https://github.com/apache/hertzbeat/releases/download/1.8.0/apache-hertzbeat-1.8.0-docker-compose.tar.gz) (Docker Compose) ( [signature](https://downloads.apache.org/hertzbeat/1.8.0/apache-hertzbeat-1.8.0-docker-compose.tar.gz.asc) , [sha512](https://downloads.apache.org/hertzbeat/1.8.0/apache-hertzbeat-1.8.0-docker-compose.tar.gz.sha512) ) | [note](https://github.com/apache/hertzbeat/releases/tag/1.8.0) |
## Docker 镜像版本
> Apache HertzBeat™ 为每个版本制作了 Docker 镜像. 你可以从 [Docker Hub](https://hub.docker.com/r/apache/hertzbeat) 拉取使用.
- HertzBeat [https://hub.docker.com/r/apache/hertzbeat](https://hub.docker.com/r/apache/hertzbeat)
- HertzBeat Collector [https://hub.docker.com/r/apache/hertzbeat-collector](https://hub.docker.com/r/apache/hertzbeat-collector)
## 归档版本
在这里查看所有历史已归档版本:[archive](https://archive.apache.org/dist/incubator/hertzbeat/).
## 下载常见问题
### 应该下载哪个包?
**服务器二进制** - 大多数用户使用。包含主 HertzBeat 监控服务器和 Web UI。
**采集器二进制** - 分布式部署使用。在远程网络部署采集器向主服务器上报。
Native 采集器下载包按目标平台区分,例如 `apache-hertzbeat-collector-native-{version}-linux-amd64-bin.tar.gz``apache-hertzbeat-collector-native-{version}-windows-amd64-bin.zip`
如果你正在 JVM 采集器和 Native 采集器之间做选择,建议先阅读 [Native 采集器指南](start/native-collector)。
**源码** - 开发者想要构建、修改或贡献 HertzBeat 时使用。
**Docker Compose** - 快速全栈部署,包含数据库和时间序列存储。
### 如何验证下载?
1. 下载 GPG 签名(.asc)和校验和(.sha512)文件
2. 验证签名:`gpg --verify apache-hertzbeat-*.tar.gz.asc apache-hertzbeat-*.tar.gz`
3. 验证校验和:`sha512sum -c apache-hertzbeat-*.tar.gz.sha512`
首先导入 Apache HertzBeat KEYS`wget https://downloads.apache.org/hertzbeat/KEYS && gpg --import KEYS`
### 系统要求是什么?
**服务器二进制要求:**
- Java 25 或更高版本
- 4GB RAM 最低(推荐 8GB
- 2 CPU 核心 最低
- 20GB 磁盘空间
**采集器二进制要求:**
- Java 25 或更高版本
- 2GB RAM 最低
- 1 CPU 核心 最低
- 5GB 磁盘空间
Native 采集器安装包会按目标平台分别发布,JVM 采集器安装包仍然保持跨平台。
### 可以用 Docker 代替二进制包吗?
可以。Docker 是推荐的安装方法:
```bash
docker run -d -p 1157:1157 -p 1158:1158 --name hertzbeat apache/hertzbeat
```
### 如何解压和运行二进制?
```bash
tar -xzf apache-hertzbeat-1.8.0-bin.tar.gz
cd apache-hertzbeat-1.8.0
./bin/startup.sh
```
访问 Web UI`http://localhost:1157`, 凭据:admin/hertzbeat
### 版本之间有什么区别?
每个版本包含错误修复、安全补丁和新功能。下载表中的发布说明链接详细说明了具体变更。
**始终使用最新版本**以确保安全性和稳定性。
### 在哪里可以找到旧版本?
以前版本归档在 [https://archive.apache.org/dist/incubator/hertzbeat/](https://archive.apache.org/dist/incubator/hertzbeat/)
### 新版本多久发布一次?
HertzBeat 遵循定期发布计划,新版本大约每 2-3 个月发布一次。安全补丁可能更频繁发布。

Some files were not shown because too many files have changed in this diff Show More