<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: tom</title>
    <description>The latest articles on DEV Community by tom (@tomsun28).</description>
    <link>https://dev.to/tomsun28</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F583763%2F790f872f-6389-4208-ae1e-133e4dd5a7f4.jpeg</url>
      <title>DEV Community: tom</title>
      <link>https://dev.to/tomsun28</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/tomsun28"/>
    <language>en</language>
    <item>
      <title>Why Does Every AI Agent Still Look Like `while (true) { ... }`?</title>
      <dc:creator>tom</dc:creator>
      <pubDate>Tue, 18 Aug 2026 16:08:34 +0000</pubDate>
      <link>https://dev.to/tomsun28/why-does-every-ai-agent-still-look-like-while-true--258a</link>
      <guid>https://dev.to/tomsun28/why-does-every-ai-agent-still-look-like-while-true--258a</guid>
      <description>&lt;p&gt;Open any agent codebase today — Claude Code, Codex, Pi, most of the open-source ones — and you'll find the same skeleton. Something like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;state&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{};&lt;/span&gt;
&lt;span class="k"&gt;while &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;plan&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;llm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;plan&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;results&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;runTools&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;plan&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nx"&gt;state&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;updateState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;results&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;isDone&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It's the natural first design. The model is the brain, the loop is the heart, and &lt;code&gt;state&lt;/code&gt; is whatever bag of objects you've accumulated. It works great for demos.&lt;/p&gt;

&lt;p&gt;But after you start living with one of these agents for a while, the same cracks show up everywhere.&lt;/p&gt;




&lt;h2&gt;
  
  
  The cracks in the loop
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Interruption is a hack.&lt;/strong&gt; If the user kills the process mid-turn, or a tool hangs, or the model asks for clarification, you've got this awkward half-finished iteration sitting in &lt;code&gt;state&lt;/code&gt;. You either throw it away or patch it in place. Either way the state is lying to you about what actually happened.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Retries are special cases.&lt;/strong&gt; A tool fails? Write a &lt;code&gt;try/catch&lt;/code&gt; around it, maybe retry, maybe pass the error to the model, remember to add it to &lt;code&gt;state&lt;/code&gt;. After a few months you've got a dozen ad-hoc branches for "what if this turn didn't finish cleanly."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Parallel tool calls are awkward.&lt;/strong&gt; The model wants to call &lt;code&gt;read&lt;/code&gt; and &lt;code&gt;grep&lt;/code&gt; at the same time. Now your loop has to either sequence them or spawn promises and reassemble the result before the next &lt;code&gt;llm.plan()&lt;/code&gt;. Again, more state to manage.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You can't rewind.&lt;/strong&gt; &lt;code&gt;state&lt;/code&gt; is a pile of mutable objects. You can't branch from an earlier point in the conversation without reconstructing it by hand. You can't replay what the model actually saw. Good luck debugging a long session.&lt;/p&gt;

&lt;p&gt;These aren't implementation details. They're the direct result of the &lt;code&gt;while(true)&lt;/code&gt; shape: one mutable state object that tries to stand in for the entire history of the conversation.&lt;/p&gt;




&lt;h2&gt;
  
  
  What if the log is the state?
&lt;/h2&gt;

&lt;p&gt;A few months ago I started building a personal agent, &lt;strong&gt;Pizza&lt;/strong&gt;, with a different premise: &lt;strong&gt;the log is the source of truth, and the state is just a projection of that log.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Every message, tool call, result, and file edit becomes one row in an &lt;code&gt;EventStore&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="n"&gt;events&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="n"&gt;sequence&lt;/span&gt; &lt;span class="nb"&gt;INTEGER&lt;/span&gt; &lt;span class="k"&gt;PRIMARY&lt;/span&gt; &lt;span class="k"&gt;KEY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;event_id&lt;/span&gt; &lt;span class="nb"&gt;TEXT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="nb"&gt;TEXT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;payload_json&lt;/span&gt; &lt;span class="nb"&gt;TEXT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;caused_by&lt;/span&gt; &lt;span class="nb"&gt;TEXT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;thread_id&lt;/span&gt; &lt;span class="nb"&gt;TEXT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;...&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The runtime doesn't hold &lt;code&gt;state&lt;/code&gt; in memory. It reads the tail of this log, dispatches the next event to a handler, and appends the result back. A "turn" is a state transition, not another loop iteration.&lt;/p&gt;

&lt;p&gt;The UI, the LLM context, and the session tree are all just queries over the same log. If you want to see what happened, you read the events. If you want to branch the conversation, you start a new &lt;code&gt;thread_id&lt;/code&gt; from an earlier &lt;code&gt;sequence&lt;/code&gt;. If you want to replay, you re-apply the events.&lt;/p&gt;




&lt;h2&gt;
  
  
  Other things that fall out of the log
&lt;/h2&gt;

&lt;p&gt;Once you commit to the event log being the source of truth, a bunch of otherwise hard features stop being special cases.&lt;/p&gt;

&lt;h3&gt;
  
  
  No "new chat" button
&lt;/h3&gt;

&lt;p&gt;There's no hard boundary between tasks. You can keep talking to the same workspace for days, weeks, or years — every previous message, edit, and tool call is still there as an event you can query. The agent manages its own context by projecting the tail of the log, not by asking you to start over with a blank chat. Think of it like a long-running thread with a friend who remembers everything.&lt;/p&gt;

&lt;h3&gt;
  
  
  One CLI tool, not a JSON menu
&lt;/h3&gt;

&lt;p&gt;Instead of a long list of &lt;code&gt;read_file&lt;/code&gt; / &lt;code&gt;write_file&lt;/code&gt; / &lt;code&gt;grep&lt;/code&gt; / &lt;code&gt;git&lt;/code&gt; tools, the model gets one &lt;code&gt;cli&lt;/code&gt; tool. Built-in commands like &lt;code&gt;read&lt;/code&gt;, &lt;code&gt;write&lt;/code&gt;, and &lt;code&gt;edit&lt;/code&gt; are handled by structured internal handlers, but everything else — &lt;code&gt;grep&lt;/code&gt;, &lt;code&gt;sed&lt;/code&gt;, &lt;code&gt;git&lt;/code&gt;, &lt;code&gt;npm&lt;/code&gt;, &lt;code&gt;python&lt;/code&gt;, &lt;code&gt;ls&lt;/code&gt; — gets passed straight to the user's shell. The model has to learn shell, but it also gets to compose real pipelines. And because every &lt;code&gt;cli&lt;/code&gt; invocation is one event, the log stays consistent: one row for &lt;code&gt;read&lt;/code&gt;, one row for &lt;code&gt;git diff&lt;/code&gt;, one row for &lt;code&gt;npm test&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Git-like session tree
&lt;/h3&gt;

&lt;p&gt;Because every message is an event with a &lt;code&gt;caused_by&lt;/code&gt; pointer, the conversation is already a tree. You can fork from any earlier message, rewind, branch, and continue. It's not a bolt-on undo stack; it's just how the data is shaped.&lt;/p&gt;

&lt;h3&gt;
  
  
  Same runtime for every interface
&lt;/h3&gt;

&lt;p&gt;The TUI, the desktop app, the JSON-RPC server, and the one-shot CLI all consume the same &lt;code&gt;SessionFacade&lt;/code&gt; event stream. They're different projections of the same log. If you start a session in the terminal and later open the desktop app, it's the same event stream.&lt;/p&gt;

&lt;h3&gt;
  
  
  Agents can &lt;code&gt;tell&lt;/code&gt; each other
&lt;/h3&gt;

&lt;p&gt;One Pizza agent in workspace A can send a &lt;code&gt;tell&lt;/code&gt; event to an agent in workspace B. Workspace B's agent handles the task in its own event log and writes a result back. The actual project files and context from B never leak into A's log — only the &lt;code&gt;tell&lt;/code&gt; request and its response are events.&lt;/p&gt;

&lt;h3&gt;
  
  
  It can even fix itself (if you enable it)
&lt;/h3&gt;

&lt;p&gt;There's an opt-in skill called &lt;code&gt;pizza-self-optimization&lt;/code&gt; that reads the local event log as evidence, forks the Pizza repo, reproduces a bug from the log, writes a test, and opens a PR. It only works because the event log is a reproducible record of what the agent actually did.&lt;/p&gt;




&lt;h2&gt;
  
  
  The trade-offs nobody wants to admit
&lt;/h2&gt;

&lt;p&gt;Event sourcing isn't free. You now have a real database in the hot path. You have to think about replay cost, log size, and snapshotting. If a session has a few thousand events, rebuilding the context from the log on every fork gets slow; you'll want periodic materialized snapshots. I don't have that yet, but it's clearly the next piece.&lt;/p&gt;

&lt;p&gt;You also lose the simplicity of "just keep a big state object in memory." If your runtime needs to know something, it has to be in an event. Anything outside the log is an invisible side effect and a bug waiting to happen.&lt;/p&gt;




&lt;h2&gt;
  
  
  Not a panacea, but not the only shape either
&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;while(true)&lt;/code&gt; pattern is still the right default for a lot of agents. It's simple, it runs, and it fits in a tutorial. But if you want long-running sessions, branching conversations, multi-agent collaboration, and the ability to audit or replay what the agent actually did, it starts to feel like the wrong abstraction.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;EventStore&lt;/code&gt; approach has its own costs, but it makes the hard things — forks, replays, multi-agent collaboration, debugging — into ordinary database operations. That was the bet I made with Pizza, and so far it's the part of the design that's held up best.&lt;/p&gt;

&lt;p&gt;If you're curious, the code is open source at &lt;a href="https://github.com/tomsun28/pizza" rel="noopener noreferrer"&gt;github.com/tomsun28/pizza&lt;/a&gt;. Feedback and arguments welcome.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>typescript</category>
      <category>architecture</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Monitoring SpringBoot2 Metrics with HertzBeat in 5 minutes</title>
      <dc:creator>tom</dc:creator>
      <pubDate>Tue, 28 Mar 2023 16:01:42 +0000</pubDate>
      <link>https://dev.to/tomsun28/monitoring-springboot2-metrics-with-hertzbeat-in-5-minutes-9oc</link>
      <guid>https://dev.to/tomsun28/monitoring-springboot2-metrics-with-hertzbeat-in-5-minutes-9oc</guid>
      <description>&lt;h2&gt;
  
  
  Use the open source real-time monitoring tool HertzBeat to monitor and alarm the SpringBoot2 application, and it will be done in 5 minutes!
&lt;/h2&gt;

&lt;h3&gt;
  
  
  HertzBeat Intro
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;HertzBeat is an open source, real-time monitoring tool with custom-monitor and agentLess. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Monitor+Alerter+Notify&lt;/strong&gt; all in one. Support monitoring web service, database, os, middleware, cloud-native, network and more.&lt;br&gt;&lt;br&gt;
More flexible threshold rule(calculation expression), timely notification delivery by &lt;code&gt;Discord&lt;/code&gt; &lt;code&gt;Slack&lt;/code&gt; &lt;code&gt;Telegram&lt;/code&gt; &lt;code&gt;Email&lt;/code&gt; &lt;code&gt;DingDing&lt;/code&gt; &lt;code&gt;WeChat&lt;/code&gt; &lt;code&gt;FeiShu&lt;/code&gt; &lt;code&gt;Webhook&lt;/code&gt; &lt;code&gt;SMS&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;We make protocols such as &lt;code&gt;Http, Jmx, Ssh, Snmp, Jdbc&lt;/code&gt; configurable, and you only need to configure &lt;code&gt;YML&lt;/code&gt; online to collect any metrics you want.&lt;br&gt;&lt;br&gt;
Do you believe that you can immediately adapt a new monitoring type such as K8s or Docker just by configuring online?&lt;/p&gt;

&lt;p&gt;&lt;code&gt;HertzBeat&lt;/code&gt;'s powerful custom-define, multi-type support, easy expansion, low coupling, hope to help developers and micro teams to quickly build their own monitoring system.     &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Github: &lt;a href="https://github.com/dromara/hertzbeat" rel="noopener noreferrer"&gt;https://github.com/dromara/hertzbeat&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Monitoring SpringBoot2 Metrics with HertzBeat in 5 minutes
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Prerequisite, you already have SpringBoot2 application environment and HertzBeat environment.
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;HertzBeat &lt;a href="https://hertzbeat.com/docs/start/docker-deploy" rel="noopener noreferrer"&gt;Installation and deployment documentation&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  1. The &lt;code&gt;actuator&lt;/code&gt; indicator endpoint is exposed on the SpringBoot2 application side, which will provide metrics endpoints data.
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;Open SpringBoot Actuator Endpoint to expose &lt;code&gt;metrics health env&lt;/code&gt; indicator interface
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;management&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
   &lt;span class="na"&gt;endpoints&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
     &lt;span class="na"&gt;web&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
       &lt;span class="na"&gt;exposure&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
         &lt;span class="na"&gt;include&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
           &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;metrics'&lt;/span&gt;
           &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;health'&lt;/span&gt;
           &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;env'&lt;/span&gt;
     &lt;span class="na"&gt;enabled-by-default&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;on&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;After restarting, test whether the access indicator interface &lt;code&gt;ip:port/actuator&lt;/code&gt; has response json data as follows:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
   &lt;/span&gt;&lt;span class="nl"&gt;"_links"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
     &lt;/span&gt;&lt;span class="nl"&gt;"self"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
       &lt;/span&gt;&lt;span class="nl"&gt;"href"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"http://localhost:1157/actuator"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
       &lt;/span&gt;&lt;span class="nl"&gt;"templated"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="w"&gt;
     &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
     &lt;/span&gt;&lt;span class="nl"&gt;"health-path"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
       &lt;/span&gt;&lt;span class="nl"&gt;"href"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"http://localhost:1157/actuator/health/{*path}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
       &lt;/span&gt;&lt;span class="nl"&gt;"templated"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
     &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
     &lt;/span&gt;&lt;span class="nl"&gt;"health"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
       &lt;/span&gt;&lt;span class="nl"&gt;"href"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"http://localhost:1157/actuator/health"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
       &lt;/span&gt;&lt;span class="nl"&gt;"templated"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="w"&gt;
     &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
     &lt;/span&gt;&lt;span class="nl"&gt;"env"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
       &lt;/span&gt;&lt;span class="nl"&gt;"href"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"http://localhost:1157/actuator/env"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
       &lt;/span&gt;&lt;span class="nl"&gt;"templated"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="w"&gt;
     &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
     &lt;/span&gt;&lt;span class="nl"&gt;"env-toMatch"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
       &lt;/span&gt;&lt;span class="nl"&gt;"href"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"http://localhost:1157/actuator/env/{toMatch}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
       &lt;/span&gt;&lt;span class="nl"&gt;"templated"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
     &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
     &lt;/span&gt;&lt;span class="nl"&gt;"metrics-requiredMetricName"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
       &lt;/span&gt;&lt;span class="nl"&gt;"href"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"http://localhost:1157/actuator/metrics/{requiredMetricName}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
       &lt;/span&gt;&lt;span class="nl"&gt;"templated"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
     &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
     &lt;/span&gt;&lt;span class="nl"&gt;"metrics"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
       &lt;/span&gt;&lt;span class="nl"&gt;"href"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"http://localhost:1157/actuator/metrics"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
       &lt;/span&gt;&lt;span class="nl"&gt;"templated"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="w"&gt;
     &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
   &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Add SpringBoot2 application monitoring in the HertzBeat monitoring ui
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;Click to add SpringBoot2 monitoring&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Path: Menu -&amp;gt; Application Service Monitoring -&amp;gt; SpringBoot2 -&amp;gt; Add SpringBoot2 Monitoring&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F69dzxbozd31m9zjdueez.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F69dzxbozd31m9zjdueez.png" alt=" " width="799" height="426"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Configure the parameters required for new monitoring SpringBoot2&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Fill in the SpringBoot2 application &lt;strong&gt;peer IP&lt;/strong&gt;, &lt;strong&gt;service port&lt;/strong&gt; (default 8080), &lt;strong&gt;account password, etc.&lt;/strong&gt; on the monitoring page, and finally click OK to add.&lt;br&gt;
For other parameters such as &lt;strong&gt;collection interval&lt;/strong&gt;, &lt;strong&gt;timeout period&lt;/strong&gt;, etc., please refer to the help document &lt;a href="https://hertzbeat.com/docs/help/" rel="noopener noreferrer"&gt;https://hertzbeat.com/docs/help/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0t3sqj2asw8yvvv7xxna.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0t3sqj2asw8yvvv7xxna.png" alt=" " width="799" height="426"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Complete ✅, now we have added the monitoring of the SpringBoot2 application, check the monitoring list to see our additions.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffhlgpt76mcf4wp3oswej.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffhlgpt76mcf4wp3oswej.png" alt=" " width="799" height="426"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Click &lt;strong&gt;Operation&lt;/strong&gt;-&amp;gt;&lt;strong&gt;Monitoring Details Icon&lt;/strong&gt; of the monitoring list item to browse the real-time monitoring indicator data of the SpringBoot2 application.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4z2m8tt690keeftqr9al.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4z2m8tt690keeftqr9al.png" alt=" " width="799" height="426"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Click &lt;strong&gt;Monitoring History Details TAB&lt;/strong&gt; to browse the historical monitoring indicator data chart of the SpringBoot2 application📈.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh2nt81ef33ve53s44j4o.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh2nt81ef33ve53s44j4o.png" alt=" " width="799" height="426"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;DONE! Done! It doesn't require us to deploy agents or various cumbersome operations, isn't it very simple&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Just one step to configure the IP port on the HertzBeat monitoring page and add SpringBoot2 application monitoring&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Through the above, we have completed the monitoring of the SpringBoot2 application. We can check the status and availability of various indicators of the SpringBoot2 application at any time in HertzBeat.&lt;br&gt;&lt;br&gt;
Of course, it is impossible to manually check the indicators in real time. Monitoring is often accompanied by alarm thresholds. When the performance indicators of the SpringBoot2 application exceed our threshold or the SpringBoot2 application itself is abnormal, we can promptly notify our corresponding person in charge. The person in charge receives the notification and handles it. , this is a complete monitoring and alarm process.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Next, we will demonstrate step by step how to configure the threshold alarm notification in the HertzBeat system. When the indicators of the SpringBoot2 application are abnormal, we will be notified in time&lt;/strong&gt;  &lt;/p&gt;

&lt;h4&gt;
  
  
  3. Add SpringBoot2 application indicator threshold alarm in HertzBeat system
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;Configure an alarm threshold for an important indicator&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Path: Menu -&amp;gt; Threshold Rules -&amp;gt; Add Threshold&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Select the configured indicator object. SpringBoot2 application monitoring mainly focuses on stack memory threads and other related indicators. For example, we set the threshold for the indicator &lt;code&gt;threads&lt;/code&gt; -&amp;gt; &lt;code&gt;threads&lt;/code&gt;. When the number of threads in the &lt;code&gt;runnable&lt;/code&gt; state is greater than At 300 an alert is issued.&lt;/li&gt;
&lt;li&gt;Here we configure to send an alarm when &lt;code&gt;size&lt;/code&gt;, &lt;code&gt;state&lt;/code&gt; of &lt;code&gt;equals(state, "runnable"") &amp;amp;&amp;amp; size&amp;gt;300&lt;/code&gt; of this indicator, the alarm level is &lt;strong&gt;warning alarm&lt;/strong&gt;, which will be triggered three times, specifically As shown below.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4j20qsjik1q0qed75ea2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4j20qsjik1q0qed75ea2.png" alt=" " width="799" height="426"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp2vdao2hfujf5pxb319c.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp2vdao2hfujf5pxb319c.png" alt=" " width="799" height="426"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Add message notification recipients&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;Configure the receiver to let the alarm message know who to send and how to send it.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Path: Menu -&amp;gt; Alarm Notification -&amp;gt; Alarm Recipient -&amp;gt; Add New Recipient&lt;/p&gt;

&lt;p&gt;Message notification methods support &lt;strong&gt;email, DingTalk, WeChat Work, Feishu, WebHook, SMS&lt;/strong&gt;, etc. Here we take the commonly used DingTalk as an example.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Refer to this &lt;a href="https://hertzbeat.com/docs/help/alert_dingtalk" rel="noopener noreferrer"&gt;Help Documentation&lt;/a&gt; &lt;a href="https://hertzbeat.com/docs/help/alert_dingtalk" rel="noopener noreferrer"&gt;https://hertzbeat.com/docs/help/alert_dingtalk&lt;/a&gt; to configure the robot on DingTalk and set the security custom keyword &lt;code&gt;HertzBeat&lt;/code&gt;, get the corresponding &lt;code&gt;access_token&lt;/code&gt; value.&lt;/li&gt;
&lt;li&gt;Configure the receiver parameters in HertzBeat as follows.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;【Alarm Notification】-&amp;gt;【New Recipient】-&amp;gt;【Select DingTalk Robot Notification Method】-&amp;gt;【Set DingTalk Robot ACCESS_TOKEN】-&amp;gt;【OK】&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy588361pce5kuwkpsh5o.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy588361pce5kuwkpsh5o.png" alt=" " width="799" height="207"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Configure the associated alarm notification strategy ⚠️ [Add notification strategy] -&amp;gt; [Associate the recipient just set] -&amp;gt; [OK]&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;Configure the alarm notification policy to bind the alarm message with the receiver, so that you can decide which alarms to send to whom.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnh1w56hry5hzqnusbvf5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnh1w56hry5hzqnusbvf5.png" alt=" " width="799" height="253"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Finished, now wait for the warning message to come. ding ding ding ding
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[HertzBeat warning notification]
Alarm target object: springboot2.threads.size
Affiliated monitoring ID: 483783444839322
Belonging monitoring name: SPRINGBOOT2_localhost
Alarm level: warning alarm
Alarm trigger time: 2023-03-22 21:13:44
Content details: The springboot2 service's runnable state threads num is over 300, now is 444.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;This practical article took us to experience how to use the open source real-time monitoring tool HertzBeat to monitor SpringBoot2 application indicator data. We can find that HertzBeat, which integrates &lt;code&gt;monitoring-alarm-notification&lt;/code&gt;, is more convenient in operation and use, just click a little on the page The SpringBoot2 application can be included in the monitoring and alarm notification, and the tedious operations of deploying multiple components and writing configuration files are no longer needed.&lt;/p&gt;

&lt;p&gt;Only one docker command is needed to install and experience heartbeat:&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;code&gt;docker run -d -p 1157:1157 --name hertzbeat tancloud/hertzbeat&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  More powerful
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;Through the simple steps above, we have realized the monitoring of SpringBoot2, but the built-in indicators in it do not meet the needs. Can we customize and monitor more indicators of SpringBoot2? The answer is of course yes, through &lt;strong&gt;Monitoring Definition&lt;/strong&gt;-&amp;gt;&lt;strong&gt;SpringBoot2&lt;/strong&gt; on the page, you can customize and modify the performance indicators you want to monitor by editing the following YML configuration file at any time.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0axzrgbbee6kax39vyqu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0axzrgbbee6kax39vyqu.png" alt=" " width="799" height="426"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What is HertzBeat?
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://github.com/dromara/hertzbeat" rel="noopener noreferrer"&gt;HertzBeat&lt;/a&gt; is an open source, real-time monitoring tool with custom-monitor and agentless.&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Monitor+Alerter+Notify&lt;/strong&gt; all in one. Support monitoring web service, database, os, middleware, cloud-native, network and more.&lt;br&gt;&lt;br&gt;
More flexible threshold rule(calculation expression), timely notification delivery by &lt;code&gt;Discord&lt;/code&gt; &lt;code&gt;Slack&lt;/code&gt; &lt;code&gt;Telegram&lt;/code&gt; &lt;code&gt;Email&lt;/code&gt; &lt;code&gt;DingDing&lt;/code&gt; &lt;code&gt;WeChat&lt;/code&gt; &lt;code&gt;FeiShu&lt;/code&gt; &lt;code&gt;Webhook&lt;/code&gt; &lt;code&gt;SMS&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;We make protocols such as &lt;code&gt;Http, Jmx, Ssh, Snmp, Jdbc&lt;/code&gt; configurable, and you only need to configure &lt;code&gt;YML&lt;/code&gt; online to collect any metrics you want.&lt;br&gt;&lt;br&gt;
Do you believe that you can immediately adapt a new monitoring type such as K8s or Docker just by configuring online?&lt;/p&gt;

&lt;p&gt;&lt;code&gt;HertzBeat&lt;/code&gt;'s powerful custom-define, multi-type support, easy expansion, low coupling, hope to help developers and micro teams to quickly build their own monitoring system.     &lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  ⛄ Supported
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Site Monitor, Port Availability, Http Api, Ping Connectivity, Jvm, SiteMap Full Site, Ssl Certificate, SpringBoot, FTP Server&lt;/li&gt;
&lt;li&gt;Mysql, PostgreSQL, MariaDB, Redis, ElasticSearch, SqlServer, Oracle, MongoDB, Damon, OpenGauss, ClickHouse, IoTDB, Redis Cluster&lt;/li&gt;
&lt;li&gt;Linux, Ubuntu, CentOS, Windows&lt;/li&gt;
&lt;li&gt;Tomcat, Nacos, Zookeeper, RabbitMQ, Flink, Kafka, ShenYu, DynamicTp, Jetty, ActiveMQ&lt;/li&gt;
&lt;li&gt;Kubernetes, Docker&lt;/li&gt;
&lt;li&gt;Huawei Switch, HPE Switch, TP-LINK Switch, Cisco Switch&lt;/li&gt;
&lt;li&gt;and more for your custom monitoring.&lt;/li&gt;
&lt;li&gt;Notifications support &lt;code&gt;Discord&lt;/code&gt; &lt;code&gt;Slack&lt;/code&gt; &lt;code&gt;Telegram&lt;/code&gt; &lt;code&gt;Mail&lt;/code&gt; &lt;code&gt;Pinning&lt;/code&gt; &lt;code&gt;WeChat&lt;/code&gt; &lt;code&gt;FlyBook&lt;/code&gt; &lt;code&gt;SMS&lt;/code&gt; &lt;code&gt;Webhook&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;Github: &lt;a href="https://github.com/dromara/hertzbeat" rel="noopener noreferrer"&gt;https://github.com/dromara/hertzbeat&lt;/a&gt;&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Gitee: &lt;a href="https://gitee.com/dromara/hertzbeat" rel="noopener noreferrer"&gt;https://gitee.com/dromara/hertzbeat&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>spring</category>
      <category>java</category>
      <category>monitoring</category>
    </item>
    <item>
      <title>Monitoring Linux Using Open Source Real-Time Monitoring Tool HertzBeat</title>
      <dc:creator>tom</dc:creator>
      <pubDate>Wed, 22 Mar 2023 15:15:26 +0000</pubDate>
      <link>https://dev.to/tomsun28/monitoring-linux-using-open-source-real-time-monitoring-tool-hertzbeat-216i</link>
      <guid>https://dev.to/tomsun28/monitoring-linux-using-open-source-real-time-monitoring-tool-hertzbeat-216i</guid>
      <description>&lt;h2&gt;
  
  
  Use the open source real-time monitoring tool HertzBeat to monitoring and alarm Linux, and it will be done in 5 minutes!
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Introduction to HertzBeat
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;HertzBeat is an open source, easy-to-use and friendly real-time monitoring tool that does not require Agent and has powerful custom monitoring capabilities.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;Integrate &lt;strong&gt;monitoring-alarm-notification&lt;/strong&gt;, support monitoring of application services, databases, operating systems, middleware, cloud native, etc., threshold alarms, alarm notifications (email WeChat Dingding Feishu SMS Slack Discord Telegram).&lt;/li&gt;
&lt;li&gt;It configurable protocol specifications such as Http, Jmx, Ssh, Snmp, Jdbc, etc. You only need to configure YML to use these protocols to customize and collect any indicators you want to collect. Do you believe that you can immediately adapt to a new monitoring type such as K8s or Docker just by configuring YML?&lt;/li&gt;
&lt;li&gt;HertzBeat's powerful customization, multi-type support, easy expansion, and low coupling, hope to help developers and small and medium teams quickly build their own monitoring tools.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Github: &lt;a href="https://github.com/dromara/hertzbeat" rel="noopener noreferrer"&gt;https://github.com/dromara/hertzbeat&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Get Linux Monitoring Done in HertzBeat in 5 Minutes
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Prerequisites, you already have a Linux environment and a HertzBeat environment.
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;HertzBeat &lt;a href="https://hertzbeat.com/docs/start/docker-deploy" rel="noopener noreferrer"&gt;Installation and deployment documentation&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Add monitoring of the Linux operating system to the monitoring page of the open source monitoring tool HertzBeat
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;Click Add Linux Monitoring&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Path: Menu -&amp;gt; Operating System Monitoring -&amp;gt; Linux Operating System -&amp;gt; Add Linux Operating System Monitoring&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi62ixya4t5p5a376t47w.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi62ixya4t5p5a376t47w.png" alt=" " width="799" height="426"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Configure the parameters required for new monitoring Linux&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Fill in the Linux &lt;strong&gt;peer IP&lt;/strong&gt;, &lt;strong&gt;SSH port&lt;/strong&gt; (default 22), &lt;strong&gt;account password, etc.&lt;/strong&gt; on the monitoring page, and finally click OK to add.&lt;br&gt;
For other parameters such as &lt;strong&gt;collection interval&lt;/strong&gt;, &lt;strong&gt;timeout period&lt;/strong&gt;, etc., please refer to the help document &lt;a href="https://hertzbeat.com/docs/help/mysql/" rel="noopener noreferrer"&gt;https://hertzbeat.com/docs/help/mysql/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F386lr174ldqy1m27ejct.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F386lr174ldqy1m27ejct.png" alt=" " width="799" height="426"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Complete ✅, now we have added the monitoring of Linux, check the monitoring list to see our added items.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqpuwfsgght3noe0sghwn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqpuwfsgght3noe0sghwn.png" alt=" " width="799" height="426"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Click &lt;strong&gt;Operation&lt;/strong&gt;-&amp;gt;&lt;strong&gt;Monitoring Details Icon&lt;/strong&gt; of the monitoring list item to browse the real-time monitoring indicator data of Linux.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5a4pr1122ciufwf1opd3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5a4pr1122ciufwf1opd3.png" alt=" " width="799" height="426"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fapyoz7gqe9lq2ufjtbax.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fapyoz7gqe9lq2ufjtbax.png" alt=" " width="799" height="426"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Click &lt;strong&gt;Monitoring History Details TAB&lt;/strong&gt; to browse the historical monitoring indicator data chart of Linux📈.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0yd8a59u9iacarrdvpw1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0yd8a59u9iacarrdvpw1.png" alt=" " width="799" height="426"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7cq62zvpr2uh4nu130t7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7cq62zvpr2uh4nu130t7.png" alt=" " width="799" height="426"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;DONE! Done! To sum up, it only takes one step&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;On the HertzBeat monitoring page, configure the IP port account password and add Linux monitoring&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Through the above two steps, we have completed the monitoring of Linux. We can view the monitoring details and indicators in HertzBeat at any time to observe its service status. &lt;br&gt;
Of course, just looking at it is definitely not perfect. Monitoring is often accompanied by alarm thresholds. When Linux performance indicators exceed our expectations or are abnormal, we can promptly notify our corresponding person in charge. The person in charge receives the notification and handles the problem. It is a complete monitoring and alarm process. &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Next, we will demonstrate step by step how to configure threshold alarm notifications in the HertzBeat system, so that when Linux indicators are found to be abnormal, they will be notified to us in time&lt;/strong&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  3. Add Linux indicator threshold alarm in HertzBeat system
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;Configure an alarm threshold for an important indicator&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Path: Menu -&amp;gt; Threshold Rules -&amp;gt; Add Threshold&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Select the configured indicator object. Linux monitors mainly related indicators such as cpu, memory, disk, network performance, etc. For example, we set the threshold for the indicator &lt;code&gt;CPU utilization&lt;/code&gt; &lt;code&gt;cpu&lt;/code&gt; -&amp;gt; &lt;code&gt;usage&lt;/code&gt;. When the Linux cpu utilization is greater than 90% When a warning is issued.&lt;/li&gt;
&lt;li&gt;Here we configure to send an alarm when the &lt;code&gt;usage&amp;gt;90&lt;/code&gt; of this indicator &lt;code&gt;cpu&lt;/code&gt;, the alarm level is &lt;strong&gt;Warning Alarm&lt;/strong&gt;, which will be triggered after three times, as shown in the figure below.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbu08fsxlfhy1i9xzfea7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbu08fsxlfhy1i9xzfea7.png" alt=" " width="799" height="426"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1nn90pgqydpg2tz65yiw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1nn90pgqydpg2tz65yiw.png" alt=" " width="799" height="426"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Add message notification recipients&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;Configure the receiver to let the alarm message know who to send and how to send it.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Path: Menu -&amp;gt; Alarm Notification -&amp;gt; Alarm Recipient -&amp;gt; Add New Recipient&lt;/p&gt;

&lt;p&gt;Message notification methods support &lt;strong&gt;email, DingTalk, WeChat Work, Feishu, WebHook, SMS&lt;/strong&gt;, etc. Here we take the commonly used DingTalk as an example.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Refer to this &lt;a href="https://hertzbeat.com/docs/help/alert_dingtalk" rel="noopener noreferrer"&gt;Help Documentation&lt;/a&gt; &lt;a href="https://hertzbeat.com/docs/help/alert_dingtalk" rel="noopener noreferrer"&gt;https://hertzbeat.com/docs/help/alert_dingtalk&lt;/a&gt; to configure the robot on DingTalk and set the security custom keyword &lt;code&gt;HertzBeat&lt;/code&gt;, get the corresponding &lt;code&gt;access_token&lt;/code&gt; value.&lt;/li&gt;
&lt;li&gt;Configure the receiver parameters in HertzBeat as follows.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;【Alarm Notification】-&amp;gt;【New Recipient】-&amp;gt;【Select DingTalk Robot Notification Method】-&amp;gt;【Set DingTalk Robot ACCESS_TOKEN】-&amp;gt;【OK】&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F11dxgpdxj3eb1tb3nbar.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F11dxgpdxj3eb1tb3nbar.png" alt=" " width="799" height="207"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Configure the associated alarm notification strategy ⚠️ [Add notification strategy] -&amp;gt; [Associate the recipient just set] -&amp;gt; [OK]&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;Configure the alarm notification policy to bind the alarm message with the receiver, so that you can decide which alarms to send to whom.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faholtt3po7of9z8cdrl2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faholtt3po7of9z8cdrl2.png" alt=" " width="799" height="253"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Finished, now wait for the warning message to come. ding ding ding ding
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[HertzBeat warning notification]
Alarm target object: linux.cpu.usage
Affiliated monitoring ID: 483783444839382
Belonging monitoring name: Linux_182.33.34.2
Alarm level: warning alarm
Alarm trigger time: 2023-02-15 21:13:44
Content details: The linux cpu usage is too high. now is 95.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;This practical article took us to experience how to use the open source real-time monitoring tool HertzBeat to monitor Linux indicator data. We can find that HertzBeat, which integrates &lt;code&gt;monitoring-alarm-notification&lt;/code&gt;, is more convenient in operation and use. Linux can be included in the monitoring and alarm notification, and there is no need to deploy multiple components and write configuration files.&lt;/p&gt;

&lt;p&gt;Only one docker command is needed to install and experience heartbeat:&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;code&gt;docker run -d -p 1157:1157 --name hertzbeat tancloud/hertzbeat&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  More powerful
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;Through the simple steps above, we have realized the monitoring of linux, but the built-in indicators in it do not meet the needs. Can we customize and monitor more indicators of Linux? The answer is of course yes, through &lt;strong&gt;Monitoring Definition&lt;/strong&gt;-&amp;gt;&lt;strong&gt;Linux&lt;/strong&gt; on the page, you can customize and modify the performance indicators you want to monitor by editing the following YML configuration file at any time.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhlwphk48uoh8ypq6mcuy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhlwphk48uoh8ypq6mcuy.png" alt=" " width="799" height="426"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What is Hertz Beat?
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://github.com/dromara/hertzbeat" rel="noopener noreferrer"&gt;HertzBeat Hertz Beat&lt;/a&gt; is a real-time monitoring and alarm system with powerful custom monitoring capabilities and no Agent required. Monitoring of application services, databases, operating systems, middleware, cloud native, etc., threshold alarms, and alarm notifications (email, WeChat, Dingding, Feishu, SMS, Discord, Slack, Telegram).&lt;/p&gt;

&lt;p&gt;We make protocol specifications such as &lt;code&gt;Http, Jmx, Ssh, Snmp, Jdbc&lt;/code&gt; configurable, and you only need to configure YML to use these protocols to customize and collect any indicators you want to collect.&lt;br&gt;
Do you believe that you can immediately adapt to a new monitoring type such as K8s or Docker just by configuring YML?&lt;/p&gt;

&lt;p&gt;The powerful customization of &lt;code&gt;HertzBeat&lt;/code&gt;, multi-type support, easy expansion, and low coupling, hope to help developers and small and medium-sized teams quickly build their own monitoring tools.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Github: &lt;a href="https://github.com/dromara/hertzbeat" rel="noopener noreferrer"&gt;https://github.com/dromara/hertzbeat&lt;/a&gt;&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Gitee: &lt;a href="https://gitee.com/dromara/hertzbeat" rel="noopener noreferrer"&gt;https://gitee.com/dromara/hertzbeat&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  ⛄ Supported
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Website Monitoring, Port Availability, Http Api, Ping Connectivity, Jvm, SiteMap, Ssl Certificate, SpringBoot, FTP Server&lt;/li&gt;
&lt;li&gt;Mysql, PostgreSQL, MariaDB, Redis, ElasticSearch, SqlServer, Oracle, MongoDB, Dameng, OpenGauss, ClickHouse, IoTDB&lt;/li&gt;
&lt;li&gt;Linux, Ubuntu, CentOS, Windows&lt;/li&gt;
&lt;li&gt;Tomcat, Nacos, Zookeeper, RabbitMQ, Flink, Kafka, ShenYu, DynamicTp, Jetty, ActiveMQ
-Kubernetes, Docker&lt;/li&gt;
&lt;li&gt;and more for your custom monitoring.&lt;/li&gt;
&lt;li&gt;Notification support &lt;code&gt;Discord&lt;/code&gt; &lt;code&gt;Slack&lt;/code&gt; &lt;code&gt;Telegram&lt;/code&gt; &lt;code&gt;Mail&lt;/code&gt; &lt;code&gt;DingTalk&lt;/code&gt; &lt;code&gt;WeChat&lt;/code&gt; &lt;code&gt;Feishu&lt;/code&gt; &lt;code&gt;SMS&lt;/code&gt; &lt;code&gt;Webhook&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>github</category>
      <category>monitoring</category>
      <category>java</category>
      <category>docker</category>
    </item>
    <item>
      <title>HertzBeat - An open-source monitoring system with custom and agentless.</title>
      <dc:creator>tom</dc:creator>
      <pubDate>Mon, 22 Aug 2022 07:09:52 +0000</pubDate>
      <link>https://dev.to/tomsun28/hertzbeat-an-open-source-monitoring-system-with-custom-and-agentless-5d1f</link>
      <guid>https://dev.to/tomsun28/hertzbeat-an-open-source-monitoring-system-with-custom-and-agentless-5d1f</guid>
      <description>&lt;p&gt;Hi everyone!&lt;/p&gt;

&lt;p&gt;Very happy to be able to recommend an open source project here.&lt;/p&gt;

&lt;p&gt;Hertzbeat is an open-source, real-time monitoring system with custom-monitor and agentless. Support web service, database, os, middleware and more.&lt;/p&gt;

&lt;p&gt;github: &lt;a href="https://github.com/dromara/hertzbeat" rel="noopener noreferrer"&gt;https://github.com/dromara/hertzbeat&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;home: &lt;a href="https://hertzbeat.com/en/" rel="noopener noreferrer"&gt;https://hertzbeat.com/en/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Very welcome to use and give us a star! Thanks!!!!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcftt9gberff85kdobosg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcftt9gberff85kdobosg.png" alt=" " width="800" height="358"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fouaibbkjeufyczpbci12.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fouaibbkjeufyczpbci12.png" alt=" " width="800" height="336"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz421hqlfjssddjbav2q6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz421hqlfjssddjbav2q6.png" alt=" " width="799" height="312"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyyeiyhw7haxpxbh9q3xo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyyeiyhw7haxpxbh9q3xo.png" alt=" " width="800" height="337"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6f6b6z43rw5p2jm2gojk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6f6b6z43rw5p2jm2gojk.png" alt=" " width="800" height="335"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb5nxp3oitn0c8edaijaj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb5nxp3oitn0c8edaijaj.png" alt=" " width="800" height="337"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcxhqdaxrc158jdp6aazk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcxhqdaxrc158jdp6aazk.png" alt=" " width="800" height="434"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>product</category>
      <category>monitoring</category>
    </item>
    <item>
      <title>A security framework that focus on the protection of rest api</title>
      <dc:creator>tom</dc:creator>
      <pubDate>Mon, 08 Mar 2021 16:37:05 +0000</pubDate>
      <link>https://dev.to/tomsun28/a-security-framework-that-focus-on-the-protection-of-rest-api-4e78</link>
      <guid>https://dev.to/tomsun28/a-security-framework-that-focus-on-the-protection-of-rest-api-4e78</guid>
      <description>&lt;p&gt;Hi everyone! After 22 versions, I'm excited to announce that the JVM security framework for REST APIs, Sureness, is officially GA.    &lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/tomsun28/sureness" rel="noopener noreferrer"&gt;sureness&lt;/a&gt; - welcome to use and star. Thanks!    &lt;/p&gt;

&lt;h2&gt;
  
  
  📫 Background
&lt;/h2&gt;

&lt;p&gt;In the mainstream web architecture, how to protect the restful api provided by the back-end through effective and fast authentication has become particularly important.&lt;br&gt;&lt;br&gt;
For existing frameworks, whether it is apache shiro which does not natively support rest, or deeply bound spring, the slower performance and steep learning curve of spring security are not our ideal framework.&lt;br&gt;&lt;br&gt;
Ever since sureness was born, we hope to solve these, provide a &lt;strong&gt;restful api&lt;/strong&gt;, &lt;strong&gt;no framework dependency&lt;/strong&gt;, can &lt;strong&gt;dynamically modify permissions&lt;/strong&gt;, &lt;strong&gt;multiple authentication policies&lt;/strong&gt;, &lt;strong&gt;faster&lt;/strong&gt;, &lt;strong&gt;easy to use and extend&lt;/strong&gt; security framework.        &lt;/p&gt;

&lt;h2&gt;
  
  
  🎡 Introduction
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;Sureness is a new, permission project which we learn from apache shiro and add some ideas to create it.&lt;br&gt;&lt;br&gt;
Authentication for restful api, based on RBAC, mainly focused on the protection of restful api.&lt;br&gt;&lt;br&gt;
No specific framework dependency(support springboot, quarkus, javalin, ktor and more).&lt;br&gt;&lt;br&gt;
Support dynamic modification of permissions.&lt;br&gt;&lt;br&gt;
Support websocket, mainstream http container(servlet and jax-rs).&lt;br&gt;&lt;br&gt;
Supports JWT, Basic Auth, Digest Auth... Can extend custom supported authentication methods.&lt;br&gt;&lt;br&gt;
High performance due dictionary matching tree.&lt;br&gt;&lt;br&gt;
Good extension interface, demo and document.    &lt;/p&gt;

&lt;p&gt;The low configuration of sureness, easy to expand, and not coupled with other frameworks, enables developers to quickly and safely protect their projects in multiple scenarios.   &lt;/p&gt;
&lt;/blockquote&gt;

&lt;h5&gt;
  
  
  🔍 Compare
&lt;/h5&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;~&lt;/th&gt;
&lt;th&gt;sureness&lt;/th&gt;
&lt;th&gt;shiro&lt;/th&gt;
&lt;th&gt;spring security&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;multi framework support&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;support&lt;/td&gt;
&lt;td&gt;support need modify&lt;/td&gt;
&lt;td&gt;not support&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;restful api&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;support&lt;/td&gt;
&lt;td&gt;support need modify&lt;/td&gt;
&lt;td&gt;support&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;websocket&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;support&lt;/td&gt;
&lt;td&gt;not support&lt;/td&gt;
&lt;td&gt;not support&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;path match&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;dictionary matching tree&lt;/td&gt;
&lt;td&gt;ant match&lt;/td&gt;
&lt;td&gt;ant match&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;annotation support&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;support&lt;/td&gt;
&lt;td&gt;support&lt;/td&gt;
&lt;td&gt;support&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;servlet&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;support&lt;/td&gt;
&lt;td&gt;support&lt;/td&gt;
&lt;td&gt;support&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;jax-rs&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;support&lt;/td&gt;
&lt;td&gt;not support&lt;/td&gt;
&lt;td&gt;not support&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;dynamic modification of permissions&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;support&lt;/td&gt;
&lt;td&gt;support need modify&lt;/td&gt;
&lt;td&gt;support need modify&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;performance&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;fast&lt;/td&gt;
&lt;td&gt;slower&lt;/td&gt;
&lt;td&gt;slower&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;learning curve&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;simple&lt;/td&gt;
&lt;td&gt;simple&lt;/td&gt;
&lt;td&gt;steep&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h5&gt;
  
  
  📈 Benchmark
&lt;/h5&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvjrepvbqzzxiyu6dbhlo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvjrepvbqzzxiyu6dbhlo.png" alt="benchmark" width="671" height="461"&gt;&lt;/a&gt;    &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Benchmark test shows sureness to lose 0.026ms performance compared to frameless application, shiro lose 0.088ms, spring security lose 0.116ms.&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;In contrast, sureness basically does not consume performance, and the performance (TPS loss) is 3 times that of shiro and 4 times that of spring security.&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;The performance gap will be further widened as the api matching chain increases.&lt;/strong&gt;      &lt;/p&gt;

&lt;p&gt;Detail see &lt;a href="https://github.com/tomsun28/sureness-shiro-spring-security-benchmark" rel="noopener noreferrer"&gt;Benchmark Test&lt;/a&gt;       &lt;/p&gt;

&lt;h5&gt;
  
  
  ✌ Framework Sample Support
&lt;/h5&gt;

&lt;ul&gt;
&lt;li&gt;[x] sureness integration springboot sample(configuration file scheme) &lt;a href="https://dev.tosample-bootstrap"&gt;sample-bootstrap&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;[x] sureness integration springboot sample(database scheme) &lt;a href="https://dev.tosample-tom"&gt;sample-tom&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;[x] sureness integration quarkus sample &lt;a href="https://dev.tosamples/quarkus-sureness"&gt;sample-quarkus&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;[x] sureness integration javalin sample &lt;a href="https://dev.tosamples/javalin-sureness"&gt;sample-javalin&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;[x] sureness integration ktor sample &lt;a href="https://dev.tosamples/ktor-sureness"&gt;sample-ktor&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;[x] sureness integration spring webflux sample &lt;a href="https://dev.tosamples/spring-webflux-sureness"&gt;sample-spring-webflux&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;[x] more samples todo
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>java</category>
      <category>security</category>
    </item>
  </channel>
</rss>
