diff --git a/3.4.2-SNAPSHOT/404.html b/3.4.2-SNAPSHOT/404.html index 2a39739d14e..02c5449e4b9 100644 --- a/3.4.2-SNAPSHOT/404.html +++ b/3.4.2-SNAPSHOT/404.html @@ -3,11 +3,11 @@ -Page Not Found | Spring Boot Admin - - +Page Not Found | Spring Boot Admin + + -
Skip to main content

Page Not Found

We could not find what you were looking for.

Please contact the owner of the site that linked you to the original URL and let them know their link is broken.

+
Skip to main content

Page Not Found

We could not find what you were looking for.

Please contact the owner of the site that linked you to the original URL and let them know their link is broken.

\ No newline at end of file diff --git a/3.4.2-SNAPSHOT/assets/js/05fedae6.f6bd213c.js b/3.4.2-SNAPSHOT/assets/js/05fedae6.f6bd213c.js new file mode 100644 index 00000000000..69db4ba2a8c --- /dev/null +++ b/3.4.2-SNAPSHOT/assets/js/05fedae6.f6bd213c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunksite=self.webpackChunksite||[]).push([[625],{2868:(t,e,r)=>{r.r(e),r.d(e,{assets:()=>i,contentTitle:()=>p,default:()=>u,frontMatter:()=>s,metadata:()=>n,toc:()=>c});const n=JSON.parse('{"id":"third-party/pyctuator","title":"Pyctuator","description":"You can easily integrate Spring Boot Admin with Flask or FastAPI Python applications using the Pyctuator project.","source":"@site/docs/third-party/pyctuator.md","sourceDirName":"third-party","slug":"/third-party/pyctuator","permalink":"/3.4.2-SNAPSHOT/docs/third-party/pyctuator","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"sidebar_custom_props":{"icon":"python"}},"sidebar":"tutorialSidebar","previous":{"title":"Third Party Integrations","permalink":"/3.4.2-SNAPSHOT/docs/third-party/"},"next":{"title":"Use SNAPSHOT-Versions","permalink":"/3.4.2-SNAPSHOT/docs/snapshots"}}');var a=r(4848),o=r(8453);const s={sidebar_custom_props:{icon:"python"}},p="Pyctuator",i={},c=[];function l(t){const e={a:"a",code:"code",h1:"h1",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",...(0,o.R)(),...t.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(e.header,{children:(0,a.jsx)(e.h1,{id:"pyctuator",children:"Pyctuator"})}),"\n",(0,a.jsxs)(e.p,{children:["You can easily integrate Spring Boot Admin with ",(0,a.jsx)(e.a,{href:"https://flask.palletsprojects.com",children:"Flask"})," or ",(0,a.jsx)(e.a,{href:"https://fastapi.tiangolo.com/",children:"FastAPI"})," Python applications using the ",(0,a.jsx)(e.a,{href:"https://github.com/SolarEdgeTech/pyctuator",children:"Pyctuator"})," project."]}),"\n",(0,a.jsx)(e.p,{children:"The following steps uses Flask, but other web frameworks are supported as well. See Pyctuator\u2019s documentation for an updated list of supported frameworks and features."}),"\n",(0,a.jsxs)(e.ol,{children:["\n",(0,a.jsx)(e.li,{children:"Install the pyctuator package:"}),"\n"]}),"\n",(0,a.jsx)(e.pre,{children:(0,a.jsx)(e.code,{className:"language-bash",children:"pip install pyctuator \n"})}),"\n",(0,a.jsxs)(e.ol,{start:"2",children:["\n",(0,a.jsx)(e.li,{children:"Enable pyctuator by pointing it to your Flask app and letting it know where Spring Boot Admin is running:"}),"\n"]}),"\n",(0,a.jsx)(e.pre,{children:(0,a.jsx)(e.code,{className:"language-python",metastring:'title="app.py"',children:'import os \nfrom flask import Flask \nfrom pyctuator.pyctuator import Pyctuator \napp_name = "Flask App with Pyctuator" \napp = Flask(app_name) \n@app.route("/") \ndef hello(): \n return "Hello World!" \nPyctuator( \n app, \n app_name, \n app_url="http://example-app.com", \n pyctuator_endpoint_url="http://example-app.com/pyctuator", \n registration_url=os.getenv("SPRING_BOOT_ADMIN_URL") \n) \napp.run() \n'})}),"\n",(0,a.jsxs)(e.p,{children:["For further details and examples, see Pyctuator\u2019s ",(0,a.jsx)(e.a,{href:"https://github.com/SolarEdgeTech/pyctuator/blob/master/README.md",children:"documentation"})," and ",(0,a.jsx)(e.a,{href:"https://github.com/SolarEdgeTech/pyctuator/tree/master/examples",children:"examples"}),"."]})]})}function u(t={}){const{wrapper:e}={...(0,o.R)(),...t.components};return e?(0,a.jsx)(e,{...t,children:(0,a.jsx)(l,{...t})}):l(t)}},8453:(t,e,r)=>{r.d(e,{R:()=>s,x:()=>p});var n=r(6540);const a={},o=n.createContext(a);function s(t){const e=n.useContext(o);return n.useMemo((function(){return"function"==typeof t?t(e):{...e,...t}}),[e,t])}function p(t){let e;return e=t.disableParentContext?"function"==typeof t.components?t.components(a):t.components||a:s(t.components),n.createElement(o.Provider,{value:e},t.children)}}}]); \ No newline at end of file diff --git a/3.4.2-SNAPSHOT/assets/js/11d280fc.6f741b99.js b/3.4.2-SNAPSHOT/assets/js/11d280fc.6f741b99.js new file mode 100644 index 00000000000..d6d196a72e7 --- /dev/null +++ b/3.4.2-SNAPSHOT/assets/js/11d280fc.6f741b99.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunksite=self.webpackChunksite||[]).push([[918],{2521:(e,i,t)=>{t.r(i),t.d(i,{assets:()=>a,contentTitle:()=>d,default:()=>h,frontMatter:()=>o,metadata:()=>n,toc:()=>c});const n=JSON.parse('{"id":"server/notifications/notifications","title":"Add Notifications","description":"You can add your own Notifiers by adding Spring Beans which implement the Notifier interface, at best by extendingAbstractEventNotifier or AbstractStatusChangeNotifier.","source":"@site/docs/server/notifications/notifications.md","sourceDirName":"server/notifications","slug":"/server/notifications/","permalink":"/3.4.2-SNAPSHOT/docs/server/notifications/","draft":false,"unlisted":false,"tags":[],"version":"current","sidebarPosition":1,"frontMatter":{"sidebar_position":1,"sidebar_custom_props":{"icon":"notifications"}},"sidebar":"tutorialSidebar","previous":{"title":"Set up the Server","permalink":"/3.4.2-SNAPSHOT/docs/server/server"},"next":{"title":"Foster Security","permalink":"/3.4.2-SNAPSHOT/docs/server/security"}}');var s=t(4848),r=t(8453);const o={sidebar_position:1,sidebar_custom_props:{icon:"notifications"}},d="Add Notifications",a={},c=[{value:"Notification",id:"notification",level:2},{value:"Hipchat Notifications",id:"hipchat-notifications",level:3},{value:"Slack Notifications",id:"slack-notifications",level:3},{value:"Let\u2019s Chat Notifications",id:"lets-chat-notifications",level:3},{value:"Microsoft Teams Notifications",id:"microsoft-teams-notifications",level:3},{value:"Telegram Notifications",id:"telegram-notifications",level:3},{value:"Webex Notifications",id:"webex-notifications",level:3},{value:"Discord Notifications",id:"discord-notifications",level:3},{value:"Notification Proxy Settings",id:"notification-proxy-settings",level:3},{value:"Notification Reminder",id:"notification-reminder",level:3},{value:"Filtering Notifications",id:"filtering-notifications",level:3},{value:"DingTalk Notifications",id:"dingtalk-notifications",level:3},{value:"RocketChat Notifications",id:"rocketchat-notifications",level:3}];function l(e){const i={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",img:"img",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,r.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(i.header,{children:(0,s.jsx)(i.h1,{id:"add-notifications",children:"Add Notifications"})}),"\n",(0,s.jsxs)(i.p,{children:["You can add your own Notifiers by adding Spring Beans which implement the ",(0,s.jsx)(i.code,{children:"Notifier"})," interface, at best by extending",(0,s.jsx)(i.code,{children:"AbstractEventNotifier"})," or ",(0,s.jsx)(i.code,{children:"AbstractStatusChangeNotifier"}),"."]}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-java",metastring:'title="CustomNotifier.java"',children:'public class CustomNotifier extends AbstractEventNotifier {\n\n private static final Logger LOGGER = LoggerFactory.getLogger(LoggingNotifier.class);\n\n public CustomNotifier(InstanceRepository repository) {\n super(repository);\n }\n\n @Override\n protected Mono doNotify(InstanceEvent event, Instance instance) {\n return Mono.fromRunnable(() -> {\n if (event instanceof InstanceStatusChangedEvent) {\n LOGGER.info("Instance {} ({}) is {}", instance.getRegistration().getName(), event.getInstance(),\n ((InstanceStatusChangedEvent) event).getStatusInfo().getStatus());\n }\n else {\n LOGGER.info("Instance {} ({}) {}", instance.getRegistration().getName(), event.getInstance(),\n event.getType());\n }\n });\n }\n}\n'})}),"\n",(0,s.jsx)(i.h2,{id:"notification",children:"Notification"}),"\n",(0,s.jsx)(i.h3,{id:"hipchat-notifications",children:"Hipchat Notifications"}),"\n",(0,s.jsxs)(i.p,{children:["To enable ",(0,s.jsx)(i.a,{href:"https://www.hipchat.com/",children:"Hipchat"})," notifications you need to create an API token on your Hipchat account and set the appropriate configuration properties."]}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.strong,{children:"Hipchat notifications configuration options"})}),"\n",(0,s.jsxs)(i.table,{children:[(0,s.jsx)(i.thead,{children:(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.th,{children:"Property name"}),(0,s.jsx)(i.th,{children:"Description"}),(0,s.jsx)(i.th,{children:"Default value"})]})}),(0,s.jsxs)(i.tbody,{children:[(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"spring.boot.admin.notify.hipchat.enabled"}),(0,s.jsx)(i.td,{children:"Enable Hipchat notifications"}),(0,s.jsx)(i.td,{children:"true"})]}),(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"spring.boot.admin.notify.hipchat.ignore-changes"}),(0,s.jsx)(i.td,{children:'Comma-delimited list of status changes to be ignored. Format: ":". Wildcards allowed.'}),(0,s.jsxs)(i.td,{children:['"UNKNOWN',":UP",'"']})]}),(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"spring.boot.admin.notify.hipchat.url"}),(0,s.jsx)(i.td,{children:"The HipChat REST API (V2) URL"}),(0,s.jsx)(i.td,{})]}),(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"spring.boot.admin.notify.hipchat.auth-token"}),(0,s.jsx)(i.td,{children:"The API token with access to the notification room"}),(0,s.jsx)(i.td,{})]}),(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"spring.boot.admin.notify.hipchat.room-id"}),(0,s.jsx)(i.td,{children:"The ID or url-encoded name of the room to send notifications to"}),(0,s.jsx)(i.td,{})]}),(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"spring.boot.admin.notify.hipchat.notify"}),(0,s.jsx)(i.td,{children:"Whether the message should trigger a user notification"}),(0,s.jsx)(i.td,{children:"false"})]}),(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"spring.boot.admin.notify.hipchat.description"}),(0,s.jsx)(i.td,{children:"Description to use in the event. SpEL-expressions are supported"}),(0,s.jsx)(i.td,{children:'"#{instance.registration.name}/#{instance.id} is #{event.statusInfo.status}"'})]})]})]}),"\n",(0,s.jsx)(i.h3,{id:"slack-notifications",children:"Slack Notifications"}),"\n",(0,s.jsxs)(i.p,{children:["To enable ",(0,s.jsx)(i.a,{href:"https://slack.com/",children:"Slack"})," notifications you need to add an incoming Webhook under custom integrations on your Slack account and configure it appropriately."]}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.strong,{children:"Slack notifications configuration options"})}),"\n",(0,s.jsxs)(i.table,{children:[(0,s.jsx)(i.thead,{children:(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.th,{children:"Property name"}),(0,s.jsx)(i.th,{children:"Description"}),(0,s.jsx)(i.th,{children:"Default value"})]})}),(0,s.jsxs)(i.tbody,{children:[(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"spring.boot.admin.notify.slack.enabled"}),(0,s.jsx)(i.td,{children:"Enable Slack notifications"}),(0,s.jsx)(i.td,{children:"true"})]}),(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"spring.boot.admin.notify.slack.ignore-changes"}),(0,s.jsx)(i.td,{children:'Comma-delimited list of status changes to be ignored. Format: ":". Wildcards allowed.'}),(0,s.jsxs)(i.td,{children:['"UNKNOWN',":UP",'"']})]}),(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"spring.boot.admin.notify.slack.webhook-url"}),(0,s.jsx)(i.td,{children:"The Slack Webhook URL to send notifications to."}),(0,s.jsx)(i.td,{})]}),(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"spring.boot.admin.notify.slack.channel"}),(0,s.jsx)(i.td,{children:"Optional channel name (without # at the beginning). If different from channel in Slack Webhooks settings"}),(0,s.jsx)(i.td,{})]}),(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"spring.boot.admin.notify.slack.icon"}),(0,s.jsx)(i.td,{children:"Optional icon name (without surrounding colons). If different from icon in Slack Webhooks settings"}),(0,s.jsx)(i.td,{})]}),(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"spring.boot.admin.notify.slack.username"}),(0,s.jsx)(i.td,{children:"Optional username to send notification if different from in Slack Webhooks settings"}),(0,s.jsx)(i.td,{children:"Spring Boot Admin"})]}),(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"spring.boot.admin.notify.slack.message"}),(0,s.jsx)(i.td,{children:"Message to use in the event. SpEL-expressions and Slack markups are supported"}),(0,s.jsxs)(i.td,{children:['"',(0,s.jsx)(i.em,{children:"#{instance.registration.name}"})," (#{instance.id}) is ",(0,s.jsx)(i.em,{children:"#{event.statusInfo.status}"}),'"']})]})]})]}),"\n",(0,s.jsx)(i.h3,{id:"lets-chat-notifications",children:"Let\u2019s Chat Notifications"}),"\n",(0,s.jsxs)(i.p,{children:["To enable ",(0,s.jsx)(i.a,{href:"https://sdelements.github.io/lets-chat/",children:"Let\u2019s Chat"})," notifications you need to add the host url and add the API token and username from Let\u2019s Chat"]}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.strong,{children:"Let\u2019s Chat notifications configuration options"})}),"\n",(0,s.jsxs)(i.table,{children:[(0,s.jsx)(i.thead,{children:(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.th,{children:"Property name"}),(0,s.jsx)(i.th,{children:"Description"}),(0,s.jsx)(i.th,{children:"Default value"})]})}),(0,s.jsxs)(i.tbody,{children:[(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"spring.boot.admin.notify.letschat.enabled"}),(0,s.jsx)(i.td,{children:"Enable let\xb4s Chat notifications"}),(0,s.jsx)(i.td,{children:"true"})]}),(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"spring.boot.admin.notify.letschat.ignore-changes"}),(0,s.jsx)(i.td,{children:'Comma-delimited list of status changes to be ignored. Format: ":". Wildcards allowed.'}),(0,s.jsxs)(i.td,{children:['"UNKNOWN',":UP",'"']})]}),(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"spring.boot.admin.notify.letschat.url"}),(0,s.jsx)(i.td,{children:"The let\xb4s Chat Host URL to send notifications"}),(0,s.jsx)(i.td,{})]}),(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"spring.boot.admin.notify.letschat.room"}),(0,s.jsx)(i.td,{children:"the room where to send the messages"}),(0,s.jsx)(i.td,{})]}),(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"spring.boot.admin.notify.letschat.token"}),(0,s.jsx)(i.td,{children:"the token to access the let\xb4s Chat API"}),(0,s.jsx)(i.td,{})]}),(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"spring.boot.admin.notify.letschat.username"}),(0,s.jsx)(i.td,{children:"The username for which the token was created"}),(0,s.jsx)(i.td,{children:"Spring Boot Admin"})]}),(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"spring.boot.admin.notify.letschat.message"}),(0,s.jsx)(i.td,{children:"Message to use in the event. SpEL-expressions are supported"}),(0,s.jsxs)(i.td,{children:['"',(0,s.jsx)(i.em,{children:"#{instance.registration.name}"})," (#{instance.id}) is ",(0,s.jsx)(i.em,{children:"#{event.statusInfo.status}"}),'"']})]})]})]}),"\n",(0,s.jsx)(i.h3,{id:"microsoft-teams-notifications",children:"Microsoft Teams Notifications"}),"\n",(0,s.jsx)(i.p,{children:"To enable Microsoft Teams notifications you need to set up a connector webhook url and set the appropriate configuration property."}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.strong,{children:"Microsoft Teams notifications configuration options"})}),"\n",(0,s.jsxs)(i.table,{children:[(0,s.jsx)(i.thead,{children:(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.th,{children:"Property name"}),(0,s.jsx)(i.th,{children:"Description"}),(0,s.jsx)(i.th,{children:"Default value"})]})}),(0,s.jsxs)(i.tbody,{children:[(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"spring.boot.admin.notify.ms-teams.enabled"}),(0,s.jsx)(i.td,{children:"Enable Microsoft Teams notifications"}),(0,s.jsx)(i.td,{children:"true"})]}),(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"spring.boot.admin.notify.ms-teams.webhook-url"}),(0,s.jsx)(i.td,{children:"The Microsoft Teams webhook url to send the notifications to."}),(0,s.jsx)(i.td,{})]}),(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"spring.boot.admin.notify.ms-teams.deRegisteredTitle"}),(0,s.jsx)(i.td,{children:"Title of the Teams message when an app de-registers."}),(0,s.jsx)(i.td,{children:"De-Registered"})]}),(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"spring.boot.admin.notify.ms-teams.registeredTitle"}),(0,s.jsx)(i.td,{children:"Title of the Teams message when an app dregisters."}),(0,s.jsx)(i.td,{children:"Registered"})]}),(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"spring.boot.admin.notify.ms-teams.statusChangedTitle"}),(0,s.jsx)(i.td,{children:"Title of the Teams message when an app changes status."}),(0,s.jsx)(i.td,{children:"Status Changed"})]}),(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"spring.boot.admin.notify.ms-teams.messageSummary"}),(0,s.jsx)(i.td,{children:"Summary section of every Teams message originating from Spring Boot Admin."}),(0,s.jsx)(i.td,{children:"Spring Boot Admin Notification"})]}),(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"spring.boot.admin.notify.ms-teams.theme_color"}),(0,s.jsx)(i.td,{children:"Set the theme color. SpEL-expressions are supported."}),(0,s.jsx)(i.td,{children:"#{event.type == 'STATUS_CHANGED' ? (event.statusInfo.status=='UP' ? '6db33f' : 'b32d36') : '439fe0'}"})]}),(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"spring.boot.admin.notify.ms-teams.deregister_activity_subtitle"}),(0,s.jsx)(i.td,{children:"Subtitle of the Activity section of the Teams message when an app de-registers. SpEL-expressions are supported."}),(0,s.jsx)(i.td,{children:"#{instance.registration.name} with id #{instance.id} has de-registered from Spring Boot Admin"})]}),(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"spring.boot.admin.notify.ms-teams.register_activity_subtitle"}),(0,s.jsx)(i.td,{children:"Subtitle of the Activity section of the Teams message when an app registers. SpEL-expressions are supported."}),(0,s.jsx)(i.td,{children:"#{instance.registration.name} with id #{instance.id} has registered with Spring Boot Admin"})]}),(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"spring.boot.admin.notify.ms-teams.status_activity_subtitle"}),(0,s.jsx)(i.td,{children:"Subtitle of the Activity section of the Teams message when an app changes status. SpEL-expressions are supported."}),(0,s.jsx)(i.td,{children:"#{instance.registration.name} with id #{instance.id} changed status from #{lastStatus} to #{event.statusInfo.status}"})]})]})]}),"\n",(0,s.jsx)(i.h3,{id:"telegram-notifications",children:"Telegram Notifications"}),"\n",(0,s.jsxs)(i.p,{children:["To enable ",(0,s.jsx)(i.a,{href:"https://telegram.org/",children:"Telegram"})," notifications you need to create and authorize a telegram bot and set the appropriate configuration properties for auth-token and chat-id."]}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.strong,{children:"Telegram notifications configuration options"})}),"\n",(0,s.jsxs)(i.table,{children:[(0,s.jsx)(i.thead,{children:(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.th,{children:"Property name"}),(0,s.jsx)(i.th,{children:"Description"}),(0,s.jsx)(i.th,{children:"Default value"})]})}),(0,s.jsxs)(i.tbody,{children:[(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"spring.boot.admin.notify.telegram.enabled"}),(0,s.jsx)(i.td,{children:"Enable Telegram notifications"}),(0,s.jsx)(i.td,{children:"true"})]}),(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"spring.boot.admin.notify.telegram.auth-token"}),(0,s.jsxs)(i.td,{children:["The token identifying und authorizing your Telegram bot (e.g. 123456",":ABC-DEF1234ghIkl-zyx57W2v1u123ew11",")."]}),(0,s.jsx)(i.td,{})]}),(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"spring.boot.admin.notify.telegram.chat-id"}),(0,s.jsx)(i.td,{children:"Unique identifier for the target chat or username of the target channel"}),(0,s.jsx)(i.td,{})]}),(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"spring.boot.admin.notify.telegram.disable-notify"}),(0,s.jsx)(i.td,{children:"If true users will receive a notification with no sound."}),(0,s.jsx)(i.td,{children:"false"})]}),(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"spring.boot.admin.notify.telegram.parse_mode"}),(0,s.jsx)(i.td,{children:"The parsing mode for the sent message. Currently, `HTML' and 'Markdown' are supported."}),(0,s.jsx)(i.td,{children:"'HTML'"})]}),(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"spring.boot.admin.notify.telegram.message"}),(0,s.jsx)(i.td,{children:"Text to send. SpEL-expressions are supported."}),(0,s.jsx)(i.td,{children:'"#{instance.registration.name}/#{instance.id} is #{event.statusInfo.status}"'})]})]})]}),"\n",(0,s.jsx)(i.h3,{id:"webex-notifications",children:"Webex Notifications"}),"\n",(0,s.jsxs)(i.p,{children:["To enable ",(0,s.jsx)(i.a,{href:"https://www.webex.com/",children:"Webex"})," notifications, you need to set the appropriate configuration properties for ",(0,s.jsx)(i.code,{children:"auth-token"})," and ",(0,s.jsx)(i.code,{children:"room-id"}),"."]}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.strong,{children:"Webex notifications configuration options"})}),"\n",(0,s.jsxs)(i.table,{children:[(0,s.jsx)(i.thead,{children:(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.th,{children:"Property name"}),(0,s.jsx)(i.th,{children:"Description"}),(0,s.jsx)(i.th,{children:"Default value"})]})}),(0,s.jsxs)(i.tbody,{children:[(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"spring.boot.admin.notify.webex.enabled"}),(0,s.jsx)(i.td,{children:"Enable Webex notifications"}),(0,s.jsx)(i.td,{children:"true"})]}),(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"spring.boot.admin.notify.webex.url"}),(0,s.jsx)(i.td,{children:"The Webex server url to send the notifications to."}),(0,s.jsxs)(i.td,{children:['"',(0,s.jsx)(i.a,{href:"https://webexapis.com/v1/messages",children:"https://webexapis.com/v1/messages"}),'"']})]}),(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"spring.boot.admin.notify.webex.auth-token"}),(0,s.jsx)(i.td,{children:"The authentication token for your Webex account (e.g. 123456-ascbhuwbtzzk-abtabhixta-788654)."}),(0,s.jsx)(i.td,{})]}),(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"spring.boot.admin.notify.webex.room-id"}),(0,s.jsx)(i.td,{children:"Unique identifier for the target room in Webex."}),(0,s.jsx)(i.td,{})]}),(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"spring.boot.admin.notify.webex.message"}),(0,s.jsx)(i.td,{children:"Text to send. SpEL-expressions are supported. By default, messages will be sent as Markdown, so you can include Markdown formatting."}),(0,s.jsxs)(i.td,{children:['"',(0,s.jsx)(i.em,{children:"#{instance.registration.name}"})," (#{instance.id}) is ",(0,s.jsx)(i.em,{children:"#{event.statusInfo.status}"}),'"']})]})]})]}),"\n",(0,s.jsx)(i.h3,{id:"discord-notifications",children:"Discord Notifications"}),"\n",(0,s.jsx)(i.p,{children:"To enable Discord notifications you need to create a webhook and set the appropriate configuration property."}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.strong,{children:"Discord notifications configuration options"})}),"\n",(0,s.jsxs)(i.table,{children:[(0,s.jsx)(i.thead,{children:(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.th,{children:"Property name"}),(0,s.jsx)(i.th,{children:"Description"}),(0,s.jsx)(i.th,{children:"Default value"})]})}),(0,s.jsxs)(i.tbody,{children:[(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"spring.boot.admin.notify.discord.enabled"}),(0,s.jsx)(i.td,{children:"Enable Discord notifications"}),(0,s.jsx)(i.td,{children:"true"})]}),(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"spring.boot.admin.notify.discord.webhook-url"}),(0,s.jsx)(i.td,{children:"The Discord webhook url to send the notifications to."}),(0,s.jsx)(i.td,{})]}),(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"spring.boot.admin.notify.discord.username"}),(0,s.jsx)(i.td,{children:"Optional username."}),(0,s.jsx)(i.td,{children:(0,s.jsx)(i.em,{children:"Default set in Discord"})})]}),(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"spring.boot.admin.notify.discord.avatar-url"}),(0,s.jsx)(i.td,{children:"Optional URL to avatar."}),(0,s.jsx)(i.td,{children:(0,s.jsx)(i.em,{children:"Default set in Discord"})})]}),(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"spring.boot.admin.notify.discord.tts"}),(0,s.jsx)(i.td,{children:"If the message is a text to speech message."}),(0,s.jsx)(i.td,{children:"false"})]}),(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"spring.boot.admin.notify.discord.message"}),(0,s.jsx)(i.td,{children:"Text to send. SpEL-expressions are supported."}),(0,s.jsxs)(i.td,{children:['"',(0,s.jsx)(i.em,{children:"#{instance.registration.name}"})," (#{instance.id}) is ",(0,s.jsx)(i.em,{children:"#{event.statusInfo.status}"}),'"']})]})]})]}),"\n",(0,s.jsx)(i.h3,{id:"notification-proxy-settings",children:"Notification Proxy Settings"}),"\n",(0,s.jsxs)(i.p,{children:["All Notifiers which are using a ",(0,s.jsx)(i.code,{children:"RestTemplate"})," can be configured to use a proxy."]}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.strong,{children:"Notification Proxy configuration options"})}),"\n",(0,s.jsxs)(i.table,{children:[(0,s.jsx)(i.thead,{children:(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.th,{children:"Property name"}),(0,s.jsx)(i.th,{children:"Description"}),(0,s.jsx)(i.th,{children:"Default value"})]})}),(0,s.jsxs)(i.tbody,{children:[(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"spring.boot.admin.notify.proxy.host"}),(0,s.jsx)(i.td,{children:"The proxy host"}),(0,s.jsx)(i.td,{})]}),(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"spring.boot.admin.notify.proxy.port"}),(0,s.jsx)(i.td,{children:"The proxy port"}),(0,s.jsx)(i.td,{})]}),(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"spring.boot.admin.notify.proxy.username"}),(0,s.jsx)(i.td,{children:"The proxy username (if proxy requires authentication)"}),(0,s.jsx)(i.td,{})]}),(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"spring.boot.admin.notify.proxy.password"}),(0,s.jsx)(i.td,{children:"The proxy password (if proxy requires authentication)"}),(0,s.jsx)(i.td,{})]})]})]}),"\n",(0,s.jsx)(i.h3,{id:"notification-reminder",children:"Notification Reminder"}),"\n",(0,s.jsxs)(i.p,{children:["The ",(0,s.jsx)(i.code,{children:"RemindingNotifier"})," sends reminders for down/offline applications, it delegates the sending of notifications to another notifier."]}),"\n",(0,s.jsxs)(i.p,{children:["By default, a reminder is triggered when a registered application changes to ",(0,s.jsx)(i.code,{children:"DOWN"})," or ",(0,s.jsx)(i.code,{children:"OFFLINE"}),". You can alter this behaviour via ",(0,s.jsx)(i.code,{children:"setReminderStatuses()"}),". The reminder ends when either the status changes to a non-triggering status or the regarding application gets deregistered."]}),"\n",(0,s.jsxs)(i.p,{children:["By default, the reminders are sent every 10 minutes, to change this use ",(0,s.jsx)(i.code,{children:"setReminderPeriod()"}),". The ",(0,s.jsx)(i.code,{children:"RemindingNotifier"})," itself doesn\u2019t start the background thread to send the reminders, you need to take care of this as shown in the given example below;"]}),"\n",(0,s.jsx)(i.p,{children:"How to configure reminders"}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-java",metastring:'title="NotifierConfiguration.java"',children:'@Configuration\npublic class NotifierConfiguration {\n @Autowired\n private Notifier notifier;\n\n @Primary\n @Bean(initMethod = "start", destroyMethod = "stop")\n public RemindingNotifier remindingNotifier() {\n RemindingNotifier notifier = new RemindingNotifier(notifier, repository);\n notifier.setReminderPeriod(Duration.ofMinutes(10)); // (1)\n notifier.setCheckReminderInverval(Duration.ofSeconds(10)); //(2)\n return notifier;\n }\n}\n'})}),"\n",(0,s.jsxs)(i.ol,{children:["\n",(0,s.jsx)(i.li,{children:"The reminders will be sent every 10 minutes."}),"\n",(0,s.jsx)(i.li,{children:"Schedules sending of due reminders every 10 seconds."}),"\n"]}),"\n",(0,s.jsx)(i.h3,{id:"filtering-notifications",children:"Filtering Notifications"}),"\n",(0,s.jsxs)(i.p,{children:["The ",(0,s.jsx)(i.code,{children:"FilteringNotifier"})," allows you to filter certain notification based on rules you can add/remove at runtime. It delegates the sending of notifications to another notifier."]}),"\n",(0,s.jsxs)(i.p,{children:["If you add a ",(0,s.jsx)(i.code,{children:"FilteringNotifier"})," to your ",(0,s.jsx)(i.code,{children:"ApplicationContext"})," a RESTful interface on ",(0,s.jsx)(i.code,{children:"notifications/filter"})," gets available. The restful interface provides the following methods for getting, adding, and deleting notification filters:"]}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"GET notifications/filter"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:["Returns a list of all registered notification filters. Each containing the attributes ",(0,s.jsx)(i.code,{children:"id"}),", ",(0,s.jsx)(i.code,{children:"applicationName"}),", ",(0,s.jsx)(i.code,{children:"expiry"}),", and ",(0,s.jsx)(i.code,{children:"expired"}),"."]}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"POST notifications/filters?instanceId=&applicationName=&ttl="}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:["Posts a new notification filter for the application/instance of the given ",(0,s.jsx)(i.code,{children:"instanceId"})," or ",(0,s.jsx)(i.code,{children:"applicationName"}),". Either ",(0,s.jsx)(i.code,{children:"instanceId"})," or ",(0,s.jsx)(i.code,{children:"applicationName"})," must be set. The parameter ",(0,s.jsx)(i.code,{children:"ttl"})," is optional and represents the expiration of the filter as an instant (the number of seconds from the epoch of ",(0,s.jsx)(i.code,{children:"1970-01-01T00:00:00Z"}),")."]}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"DELETE notifications/filters/{id}"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:"Deletes the notification filter with the requested id from the filters."}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(i.p,{children:"You may as well access all notification filter configurations via the main applications view inside SBA client, as seen in the screenshot below."}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.img,{alt:"Sample notification filters",src:t(4094).A+"",width:"3126",height:"802"})}),"\n",(0,s.jsxs)(i.p,{children:["A ",(0,s.jsx)(i.code,{children:"FilteringNotifier"})," might be useful, for instance, if you don\u2019t want to receive notifications when deploying your applications. Before stopping the application, you can add an (expiring) filter via a ",(0,s.jsx)(i.code,{children:"POST"})," request."]}),"\n",(0,s.jsx)(i.p,{children:"How to configure filtering"}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-java",metastring:'title="NotifierConfig.java"',children:'@Configuration(proxyBeanMethods = false)\npublic class NotifierConfig {\n\n private final InstanceRepository repository;\n\n private final ObjectProvider> otherNotifiers;\n\n public NotifierConfig(InstanceRepository repository, ObjectProvider> otherNotifiers) {\n this.repository = repository;\n this.otherNotifiers = otherNotifiers;\n }\n\n @Bean\n public FilteringNotifier filteringNotifier() { // (1)\n CompositeNotifier delegate = new CompositeNotifier(this.otherNotifiers.getIfAvailable(Collections::emptyList));\n return new FilteringNotifier(delegate, this.repository);\n }\n\n @Primary\n @Bean(initMethod = "start", destroyMethod = "stop")\n public RemindingNotifier remindingNotifier() { // (2)\n RemindingNotifier notifier = new RemindingNotifier(filteringNotifier(), this.repository);\n notifier.setReminderPeriod(Duration.ofMinutes(10));\n notifier.setCheckReminderInverval(Duration.ofSeconds(10));\n return notifier;\n }\n\n}\n'})}),"\n",(0,s.jsxs)(i.ol,{children:["\n",(0,s.jsxs)(i.li,{children:["Add the ",(0,s.jsx)(i.code,{children:"FilteringNotifier"})," bean using a delegate (e.g. ",(0,s.jsx)(i.code,{children:"MailNotifier"})," when configured)"]}),"\n",(0,s.jsxs)(i.li,{children:["Add the ",(0,s.jsx)(i.code,{children:"RemindingNotifier"})," as primary bean using the ",(0,s.jsx)(i.code,{children:"FilteringNotifier"})," as delegate."]}),"\n"]}),"\n",(0,s.jsx)(i.admonition,{type:"tip",children:(0,s.jsx)(i.p,{children:"This example combines the reminding and filtering notifiers. This allows you to get notifications after the deployed application hasn\u2019t restarted in a certain amount of time (until the filter expires)."})}),"\n",(0,s.jsx)(i.h3,{id:"dingtalk-notifications",children:"DingTalk Notifications"}),"\n",(0,s.jsxs)(i.p,{children:["To enable ",(0,s.jsx)(i.a,{href:"https://www.dingtalk.com/",children:"DingTalk"})," notifications you need to create and authorize a dingtalk bot and set the appropriate configuration properties for webhookUrl and secret."]}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.strong,{children:"DingTalk notifications configuration options"})}),"\n",(0,s.jsxs)(i.table,{children:[(0,s.jsx)(i.thead,{children:(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.th,{children:"Property name"}),(0,s.jsx)(i.th,{children:"Description"}),(0,s.jsx)(i.th,{children:"Default value"})]})}),(0,s.jsxs)(i.tbody,{children:[(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"spring.boot.admin.notify.dingtalk.enabled"}),(0,s.jsx)(i.td,{children:"Enable DingTalk notifications."}),(0,s.jsx)(i.td,{children:"true"})]}),(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"spring.boot.admin.notify.dingtalk.webhook-url"}),(0,s.jsx)(i.td,{children:"The DingTalk webhook url to send the notifications to."}),(0,s.jsx)(i.td,{})]}),(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"spring.boot.admin.notify.dingtalk.secret"}),(0,s.jsx)(i.td,{children:"The secret to get message sign."}),(0,s.jsx)(i.td,{})]}),(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"spring.boot.admin.notify.dingtalk.message"}),(0,s.jsx)(i.td,{children:"Text to send. SpEL-expressions are supported."}),(0,s.jsx)(i.td,{children:'"#{instance.registration.name} #{instance.id} is #{event.statusInfo.status} "'})]})]})]}),"\n",(0,s.jsx)(i.h3,{id:"rocketchat-notifications",children:"RocketChat Notifications"}),"\n",(0,s.jsxs)(i.p,{children:["To enable ",(0,s.jsx)(i.a,{href:"https://www.rocket.chat/",children:"Rocket.Chat"})," notifications you need a personal token access and create a room to send message with this token"]}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.strong,{children:"Table 10. RocketChat notifications configuration options"})}),"\n",(0,s.jsxs)(i.table,{children:[(0,s.jsx)(i.thead,{children:(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.th,{children:"Property name"}),(0,s.jsx)(i.th,{children:"Description"}),(0,s.jsx)(i.th,{children:"Default value"})]})}),(0,s.jsxs)(i.tbody,{children:[(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"spring.boot.admin.notify.rocketchat.enabled"}),(0,s.jsx)(i.td,{children:"Enable RocketChat notifications."}),(0,s.jsx)(i.td,{children:"true"})]}),(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"spring.boot.admin.notify.rocketchat.url"}),(0,s.jsx)(i.td,{children:"The RocketChat server url to send the notifications to."}),(0,s.jsx)(i.td,{})]}),(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"spring.boot.admin.notify.rocketchat.userId"}),(0,s.jsx)(i.td,{children:"User id user"}),(0,s.jsx)(i.td,{})]}),(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"spring.boot.admin.notify.rocketchat.token"}),(0,s.jsx)(i.td,{children:"Generated token user"}),(0,s.jsx)(i.td,{})]}),(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"spring.boot.admin.notify.rocketchat.roomId"}),(0,s.jsx)(i.td,{children:"The room id to send the message"}),(0,s.jsx)(i.td,{})]}),(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"spring.boot.admin.notify.rocketchat.message"}),(0,s.jsx)(i.td,{children:"Text to send. SpEL-expressions are supported."}),(0,s.jsxs)(i.td,{children:['"',(0,s.jsx)(i.em,{children:"#{instance.registration.name}"})," (#{instance.id}) is ",(0,s.jsx)(i.em,{children:"#{event.statusInfo.status}"}),'"']})]})]})]})]})}function h(e={}){const{wrapper:i}={...(0,r.R)(),...e.components};return i?(0,s.jsx)(i,{...e,children:(0,s.jsx)(l,{...e})}):l(e)}},4094:(e,i,t)=>{t.d(i,{A:()=>n});const n=t.p+"assets/images/notification-filter-afa48c90c2d49abec2c974d5d4387a9c.png"},8453:(e,i,t)=>{t.d(i,{R:()=>o,x:()=>d});var n=t(6540);const s={},r=n.createContext(s);function o(e){const i=n.useContext(r);return n.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function d(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:o(e.components),n.createElement(r.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/3.4.2-SNAPSHOT/assets/js/1fd605f7.7e7bfadd.js b/3.4.2-SNAPSHOT/assets/js/1fd605f7.7e7bfadd.js new file mode 100644 index 00000000000..a3ae2e606f9 --- /dev/null +++ b/3.4.2-SNAPSHOT/assets/js/1fd605f7.7e7bfadd.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunksite=self.webpackChunksite||[]).push([[84],{9684:(e,n,o)=>{o.r(n),o.d(n,{assets:()=>a,contentTitle:()=>c,default:()=>l,frontMatter:()=>s,metadata:()=>t,toc:()=>p});const t=JSON.parse('{"type":"mdx","permalink":"/3.4.2-SNAPSHOT/faq","source":"@site/src/pages/faq.md","title":"FAQ","description":"Can I include spring-boot-admin into my business application?","frontMatter":{},"unlisted":false}');var i=o(4848),r=o(8453);const s={},c="FAQ",a={},p=[{value:"Can I include spring-boot-admin into my business application?",id:"can-i-include-spring-boot-admin-into-my-business-application",level:2},{value:"Can I change or reload Spring Boot properties at runtime?",id:"can-i-change-or-reload-spring-boot-properties-at-runtime",level:2}];function d(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",header:"header",p:"p",strong:"strong",...(0,r.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.header,{children:(0,i.jsx)(n.h1,{id:"faq",children:"FAQ"})}),"\n",(0,i.jsx)(n.h2,{id:"can-i-include-spring-boot-admin-into-my-business-application",children:"Can I include spring-boot-admin into my business application?"}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"tl;dr"})," You can, but you shouldn't. +\nYou can set ",(0,i.jsx)(n.code,{children:"spring.boot.admin.context-path"})," to alter the path where the UI and REST-API is served, but depending on the complexity of your application you might get in trouble. On the other hand in my opinion it makes no sense for an application to monitor itself. In case your application goes down your monitoring tool also does."]}),"\n",(0,i.jsx)(n.h2,{id:"can-i-change-or-reload-spring-boot-properties-at-runtime",children:"Can I change or reload Spring Boot properties at runtime?"}),"\n",(0,i.jsxs)(n.p,{children:["Yes, you can refresh the entire environment or set/update individual properties for both single instances as well as for the entire application.\nNote, however, that the Spring Boot application needs to have ",(0,i.jsx)(n.a,{href:"https://docs.spring.io/spring-cloud-commons/docs/current/reference/html/#endpoints%5BSpring",children:"https://docs.spring.io/spring-cloud-commons/docs/current/reference/html/#endpoints[Spring"})," Cloud Commons] and ",(0,i.jsx)(n.code,{children:"management.endpoint.env.post.enabled=true"})," in place.\nAlso check the details of ",(0,i.jsx)(n.code,{children:"@RefreshScope"})," ",(0,i.jsx)(n.a,{href:"https://docs.spring.io/spring-cloud-commons/docs/current/reference/html/#refresh-scope",children:"https://docs.spring.io/spring-cloud-commons/docs/current/reference/html/#refresh-scope"}),"."]})]})}function l(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},8453:(e,n,o)=>{o.d(n,{R:()=>s,x:()=>c});var t=o(6540);const i={},r=t.createContext(i);function s(e){const n=t.useContext(r);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:s(e.components),t.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/3.4.2-SNAPSHOT/assets/js/21532248.58d1aec1.js b/3.4.2-SNAPSHOT/assets/js/21532248.58d1aec1.js new file mode 100644 index 00000000000..d08f11b0bdc --- /dev/null +++ b/3.4.2-SNAPSHOT/assets/js/21532248.58d1aec1.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunksite=self.webpackChunksite||[]).push([[208],{8565:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>a,contentTitle:()=>l,default:()=>u,frontMatter:()=>c,metadata:()=>i,toc:()=>d});const i=JSON.parse('{"id":"client/index","title":"Spring Boot Admin Client","description":"The Spring Boot Admin Client is a Spring Boot application that registers itself with the Spring Boot Admin Server to","source":"@site/docs/client/index.md","sourceDirName":"client","slug":"/client/","permalink":"/3.4.2-SNAPSHOT/docs/client/","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{},"sidebar":"tutorialSidebar","previous":{"title":"Properties","permalink":"/3.4.2-SNAPSHOT/docs/server/server-properties"},"next":{"title":"Client features","permalink":"/3.4.2-SNAPSHOT/docs/client/client-features"}}');var r=n(4848),o=n(8453),s=n(6151);const c={},l="Spring Boot Admin Client",a={},d=[];function h(e){const t={h1:"h1",header:"header",li:"li",p:"p",strong:"strong",ul:"ul",...(0,o.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.header,{children:(0,r.jsx)(t.h1,{id:"spring-boot-admin-client",children:"Spring Boot Admin Client"})}),"\n",(0,r.jsx)(t.p,{children:"The Spring Boot Admin Client is a Spring Boot application that registers itself with the Spring Boot Admin Server to\nenable monitoring and management. By including the Spring Boot Admin Client Starter dependency in your application, the\nSpring Boot Admin Server can automatically access health, metrics, and other management endpoints, depending on which\nActuator endpoints are accessible."}),"\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.strong,{children:"Key Features:"})}),"\n",(0,r.jsxs)(t.ul,{children:["\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.strong,{children:"Automatic Registration:"})," The client can self-register with the Admin Server by sending regular status updates."]}),"\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.strong,{children:"Health and Metrics Exposure:"})," The client leverages Spring Boot Actuator to expose endpoints for monitoring health\nstatus, system metrics, application logs, and other runtime data."]}),"\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.strong,{children:"Management Actions:"})," The Admin Server can interact with the client for actions such as restarting the application,\nclearing caches, or triggering log file downloads."]}),"\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.strong,{children:"Secure Communication:"})," The client supports configuring authentication and SSL to ensure secure communication\nbetween the client and the Admin Server."]}),"\n"]}),"\n",(0,r.jsx)(t.p,{children:"By adding the Spring Boot Admin Client to your applications, they become discoverable by the Admin Server, enabling\ncentralized monitoring, alerting, and management. This makes it easy to monitor the health of your entire system in\nreal-time."}),"\n",(0,r.jsx)(s.A,{})]})}function u(e={}){const{wrapper:t}={...(0,o.R)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(h,{...e})}):h(e)}},6151:(e,t,n)=>{n.d(t,{A:()=>T});var i=n(6540),r=n(4164),o=n(4718),s=n(8774),c=n(4586);const l=["zero","one","two","few","many","other"];function a(e){return l.filter((t=>e.includes(t)))}const d={locale:"en",pluralForms:a(["one","other"]),select:e=>1===e?"one":"other"};function h(){const{i18n:{currentLocale:e}}=(0,c.A)();return(0,i.useMemo)((()=>{try{return function(e){const t=new Intl.PluralRules(e);return{locale:e,pluralForms:a(t.resolvedOptions().pluralCategories),select:e=>t.select(e)}}(e)}catch(t){return console.error(`Failed to use Intl.PluralRules for locale "${e}".\nDocusaurus will fallback to the default (English) implementation.\nError: ${t.message}\n`),d}}),[e])}function u(){const e=h();return{selectMessage:(t,n)=>function(e,t,n){const i=e.split("|");if(1===i.length)return i[0];i.length>n.pluralForms.length&&console.error(`For locale=${n.locale}, a maximum of ${n.pluralForms.length} plural forms are expected (${n.pluralForms.join(",")}), but the message contains ${i.length}: ${e}`);const r=n.select(t),o=n.pluralForms.indexOf(r);return i[Math.min(o,i.length-1)]}(n,t,e)}}var m=n(6654),p=n(1312),g=n(1107);const f={cardContainer:"cardContainer_S8oU",cardTitle:"cardTitle_HoSo",cardDescription:"cardDescription_c27F"};var x=n(7399),j=n(4848);const S={ui:(0,j.jsx)(x.In,{icon:"gg:ui-kit",height:"24"}),http:(0,j.jsx)(x.In,{icon:"mdi:web",height:"24"}),properties:(0,j.jsx)(x.In,{icon:"ion:options-outline",height:"24"}),server:(0,j.jsx)(x.In,{icon:"mdi:server-outline",height:"24"}),notifications:(0,j.jsx)(x.In,{icon:"carbon:notification",height:"24"}),python:(0,j.jsx)(x.In,{icon:"ion:logo-python",height:"24"}),features:(0,j.jsx)(x.In,{icon:"ri:function-add-line",height:"24"})};function A(e){let{href:t,children:n}=e;return(0,j.jsx)(s.A,{href:t,className:(0,r.A)("card padding--lg",f.cardContainer),children:n})}function y(e){let{href:t,icon:n,title:i,description:o}=e;return(0,j.jsxs)(A,{href:t,children:[(0,j.jsxs)(g.A,{as:"h2",className:(0,r.A)("text--truncate",f.cardTitle),title:i,children:[n," ",i]}),o&&(0,j.jsx)("p",{className:(0,r.A)("text--truncate",f.cardDescription),title:o,children:o})]})}function b(e){let{item:t}=e;const n=(0,o.Nr)(t),i=function(){const{selectMessage:e}=u();return t=>e(t,(0,p.T)({message:"1 item|{count} items",id:"theme.docs.DocCard.categoryDescription.plurals",description:"The default description for a category card in the generated index about how many items this category includes"},{count:t}))}();return n?(0,j.jsx)(y,{href:n,icon:"\ud83d\uddc3\ufe0f",title:t.label,description:t.description??i(t.items.length)}):null}function v(e){let{item:t}=e;const n=(0,o.cC)(t.docId??void 0);return(0,j.jsx)(y,{href:t.href,icon:S[t?.customProps?.icon]??((0,m.A)(t.href)?"\ud83d\udcc4\ufe0f":"\ud83d\udd17"),title:t.label,description:t.description??n?.description})}function w(e){let{item:t}=e;switch(t.type){case"link":return(0,j.jsx)(v,{item:t});case"category":return(0,j.jsx)(b,{item:t});default:throw new Error(`unknown item type ${JSON.stringify(t)}`)}}function C(e){let{className:t}=e;const n=(0,o.$S)();return(0,j.jsx)(T,{items:n.items,className:t})}function T(e){const{items:t,className:n}=e;if(!t)return(0,j.jsx)(C,{...e});const i=(0,o.d1)(t);return(0,j.jsx)("section",{className:(0,r.A)("row",n),children:i.map(((e,t)=>(0,j.jsx)("article",{className:"col col--6 margin-bottom--lg",children:(0,j.jsx)(w,{item:e})},t)))})}}}]); \ No newline at end of file diff --git a/3.4.2-SNAPSHOT/assets/js/25b3ff48.55da3e7c.js b/3.4.2-SNAPSHOT/assets/js/25b3ff48.55da3e7c.js new file mode 100644 index 00000000000..a46e4cab554 --- /dev/null +++ b/3.4.2-SNAPSHOT/assets/js/25b3ff48.55da3e7c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunksite=self.webpackChunksite||[]).push([[721],{3101:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>o,default:()=>u,frontMatter:()=>a,metadata:()=>r,toc:()=>l});const r=JSON.parse('{"id":"server/security","title":"Foster Security","description":"Securing Spring Boot Admin Server","source":"@site/docs/server/02-security.md","sourceDirName":"server","slug":"/server/security","permalink":"/3.4.2-SNAPSHOT/docs/server/security","draft":false,"unlisted":false,"tags":[],"version":"current","sidebarPosition":2,"frontMatter":{},"sidebar":"tutorialSidebar","previous":{"title":"Add Notifications","permalink":"/3.4.2-SNAPSHOT/docs/server/notifications/"},"next":{"title":"Properties","permalink":"/3.4.2-SNAPSHOT/docs/server/server-properties"}}');var s=t(4848),i=t(8453);const a={},o="Foster Security",c={},l=[{value:"Securing Spring Boot Admin Server",id:"securing-spring-boot-admin-server",level:2},{value:"Securing Client Actuator Endpoints",id:"securing-client-actuator-endpoints",level:2},{value:"SBA Client",id:"sba-client",level:3},{value:"SBA Server",id:"sba-server",level:3},{value:"Eureka",id:"eureka",level:3},{value:"Consul",id:"consul",level:3},{value:"CSRF on Actuator Endpoints",id:"csrf-on-actuator-endpoints",level:2},{value:"Using Mutual TLS",id:"using-mutual-tls",level:2}];function d(e){const n={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",...(0,i.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.header,{children:(0,s.jsx)(n.h1,{id:"foster-security",children:"Foster Security"})}),"\n",(0,s.jsx)(n.h2,{id:"securing-spring-boot-admin-server",children:"Securing Spring Boot Admin Server"}),"\n",(0,s.jsxs)(n.p,{children:["Since there are several approaches on solving authentication and authorization in distributed web applications Spring Boot Admin doesn\u2019t ship a default one. By default ",(0,s.jsx)(n.code,{children:"spring-boot-admin-server-ui"})," provides a login page and a logout button."]}),"\n",(0,s.jsx)(n.p,{children:"A Spring Security configuration for your server could look like this:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-java",metastring:'title="SecuritySecureConfig.java"',children:'@Configuration(proxyBeanMethods = false)\npublic class SecuritySecureConfig {\n\n private final AdminServerProperties adminServer;\n\n private final SecurityProperties security;\n\n public SecuritySecureConfig(AdminServerProperties adminServer, SecurityProperties security) {\n this.adminServer = adminServer;\n this.security = security;\n }\n\n @Bean\n protected SecurityFilterChain filterChain(HttpSecurity http) throws Exception {\n SavedRequestAwareAuthenticationSuccessHandler successHandler = new SavedRequestAwareAuthenticationSuccessHandler();\n successHandler.setTargetUrlParameter("redirectTo");\n successHandler.setDefaultTargetUrl(this.adminServer.path("/"));\n\n http.authorizeHttpRequests((authorizeRequests) -> authorizeRequests //\n .requestMatchers(new AntPathRequestMatcher(this.adminServer.path("/assets/**")))\n .permitAll() // (1)\n .requestMatchers(new AntPathRequestMatcher(this.adminServer.path("/actuator/info")))\n .permitAll()\n .requestMatchers(new AntPathRequestMatcher(adminServer.path("/actuator/health")))\n .permitAll()\n .requestMatchers(new AntPathRequestMatcher(this.adminServer.path("/login")))\n .permitAll()\n .dispatcherTypeMatchers(DispatcherType.ASYNC)\n .permitAll() // https://github.com/spring-projects/spring-security/issues/11027\n .anyRequest()\n .authenticated()) // (2)\n .formLogin(\n (formLogin) -> formLogin.loginPage(this.adminServer.path("/login")).successHandler(successHandler)) // (3)\n .logout((logout) -> logout.logoutUrl(this.adminServer.path("/logout")))\n .httpBasic(Customizer.withDefaults()); // (4)\n\n http.addFilterAfter(new CustomCsrfFilter(), BasicAuthenticationFilter.class) // (5)\n .csrf((csrf) -> csrf.csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse())\n .csrfTokenRequestHandler(new CsrfTokenRequestAttributeHandler())\n .ignoringRequestMatchers(\n new AntPathRequestMatcher(this.adminServer.path("/instances"), POST.toString()), // (6)\n new AntPathRequestMatcher(this.adminServer.path("/instances/*"), DELETE.toString()), // (6)\n new AntPathRequestMatcher(this.adminServer.path("/actuator/**")) // (7)\n ));\n\n http.rememberMe((rememberMe) -> rememberMe.key(UUID.randomUUID().toString()).tokenValiditySeconds(1209600));\n\n return http.build();\n\n }\n\n // Required to provide UserDetailsService for "remember functionality"\n @Bean\n public InMemoryUserDetailsManager userDetailsService(PasswordEncoder passwordEncoder) {\n UserDetails user = User.withUsername("user").password(passwordEncoder.encode("password")).roles("USER").build();\n return new InMemoryUserDetailsManager(user);\n }\n\n @Bean\n public PasswordEncoder passwordEncoder() {\n return new BCryptPasswordEncoder();\n }\n\n}\n'})}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsx)(n.li,{children:"Grants public access to all static assets and the login page."}),"\n",(0,s.jsx)(n.li,{children:"Every other request must be authenticated."}),"\n",(0,s.jsx)(n.li,{children:"Configures login and logout."}),"\n",(0,s.jsx)(n.li,{children:"Enables HTTP-Basic support. This is needed for the Spring Boot Admin Client to register."}),"\n",(0,s.jsx)(n.li,{children:"Enables CSRF-Protection using Cookies"}),"\n",(0,s.jsx)(n.li,{children:"Disables CSRF-Protection for the endpoint the Spring Boot Admin Client uses to (de-)register."}),"\n",(0,s.jsx)(n.li,{children:"Disables CSRF-Protection for the actuator endpoints."}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"In case you use the Spring Boot Admin Client, it needs the credentials for accessing the server:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",metastring:'title="application.yml"',children:"spring.boot.admin.client:\n username: sba-client\n password: s3cret\n"})}),"\n",(0,s.jsxs)(n.p,{children:["For a complete sample look at ",(0,s.jsx)(n.a,{href:"https://github.com/codecentric/spring-boot-admin/tree/master/spring-boot-admin-samples/spring-boot-admin-sample-servlet/",children:"spring-boot-admin-sample-servlet"}),"."]}),"\n",(0,s.jsx)(n.admonition,{type:"note",children:(0,s.jsx)(n.p,{children:"If you protect the /instances endpoint don\u2019t forget to configure the username and password on your SBA-Client using spring.boot.admin.client.username and spring.boot.admin.client.password."})}),"\n",(0,s.jsx)(n.h2,{id:"securing-client-actuator-endpoints",children:"Securing Client Actuator Endpoints"}),"\n",(0,s.jsxs)(n.p,{children:["When the actuator endpoints are secured using HTTP Basic authentication the SBA Server needs credentials to access them. You can submit the credentials in the metadata when registering the application. The ",(0,s.jsx)(n.code,{children:"BasicAuthHttpHeaderProvider"})," then uses this metadata to add the ",(0,s.jsx)(n.code,{children:"Authorization"})," header to access your application\u2019s actuator endpoints. You can provide your own ",(0,s.jsx)(n.code,{children:"HttpHeadersProvider"})," to alter the behaviour (e.g. add some decryption) or add extra headers."]}),"\n",(0,s.jsx)(n.admonition,{type:"note",children:(0,s.jsx)(n.p,{children:"The SBA Server masks certain metadata in the HTTP interface to prevent leaking of sensitive information."})}),"\n",(0,s.jsx)(n.admonition,{type:"warning",children:(0,s.jsx)(n.p,{children:"You should configure HTTPS for your SBA Server or (service registry) when transferring credentials via the metadata."})}),"\n",(0,s.jsx)(n.admonition,{type:"warning",children:(0,s.jsx)(n.p,{children:"When using Spring Cloud Discovery, you must be aware that anybody who can query your service registry can obtain the credentials."})}),"\n",(0,s.jsx)(n.admonition,{type:"tip",children:(0,s.jsxs)(n.p,{children:["When using this approach the SBA Server decides whether or not the user can access the registered applications. There are more complex solutions possible (using OAuth2) to let the clients decide if the user can access the endpoints. For that please have a look at the samples in ",(0,s.jsx)(n.a,{href:"https://github.com/joshiste/spring-boot-admin-samples",children:"joshiste/spring-boot-admin-samples"}),"."]})}),"\n",(0,s.jsx)(n.h3,{id:"sba-client",children:"SBA Client"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",metastring:'title="application.yml"',children:"spring.boot.admin.client:\n url: http://localhost:8080\n instance:\n metadata:\n user.name: ${spring.security.user.name}\n user.password: ${spring.security.user.password}\n"})}),"\n",(0,s.jsx)(n.h3,{id:"sba-server",children:"SBA Server"}),"\n",(0,s.jsx)(n.p,{children:"You can specify credentials via configuration properties in your admin server."}),"\n",(0,s.jsx)(n.admonition,{type:"tip",children:(0,s.jsxs)(n.p,{children:["You can use this in conjuction with ",(0,s.jsx)(n.a,{href:"https://cloud.spring.io/spring-cloud-kubernetes/1.1.x/reference/html/#secrets-propertysource",children:"spring-cloud-kubernetes"})," to pull credentials from ",(0,s.jsx)(n.a,{href:"https://kubernetes.io/docs/concepts/configuration/secret/",children:"secrets"}),"."]})}),"\n",(0,s.jsxs)(n.p,{children:["To enable pulling credentials from properties the ",(0,s.jsx)(n.code,{children:"spring.boot.admin.instance-auth.enabled"})," property must be ",(0,s.jsx)(n.code,{children:"true"})," (default)."]}),"\n",(0,s.jsx)(n.admonition,{type:"note",children:(0,s.jsx)(n.p,{children:"If your clients provide credentials via metadata (i.e., via service annotations), that metadata will be used instead of the properites."})}),"\n",(0,s.jsxs)(n.p,{children:["You can provide a default username and password by setting ",(0,s.jsx)(n.code,{children:"spring.boot.admin.instance-auth.default-user-name"})," and ",(0,s.jsx)(n.code,{children:"spring.boot.admin.instance-auth.default-user-password"}),". Optionally you can provide credentials for specific services (by name) using the ",(0,s.jsx)(n.code,{children:"spring.boot.admin.instance-auth.service-map.*.user-name"})," pattern, replacing ",(0,s.jsx)(n.code,{children:"*"})," with the service name."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",metastring:'title="application.yml"',children:'spring.boot.admin:\n instance-auth:\n enabled: true\n default-user-name: "${some.user.name.from.secret}"\n default-password: "${some.user.password.from.secret}"\n service-map:\n my-first-service-to-monitor:\n user-name: "${some.user.name.from.secret}"\n user-password: "${some.user.password.from.secret}"\n my-second-service-to-monitor:\n user-name: "${some.user.name.from.secret}"\n user-password: "${some.user.password.from.secret}"\n'})}),"\n",(0,s.jsx)(n.h3,{id:"eureka",children:"Eureka"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",metastring:'title="application.yml"',children:"eureka:\n instance:\n metadata-map:\n user.name: ${spring.security.user.name}\n user.password: ${spring.security.user.password}\n"})}),"\n",(0,s.jsx)(n.h3,{id:"consul",children:"Consul"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",metastring:'title="application.yml"',children:"spring.cloud.consul:\n discovery:\n metadata:\n user-name: ${spring.security.user.name}\n user-password: ${spring.security.user.password}\n"})}),"\n",(0,s.jsx)(n.admonition,{type:"warning",children:(0,s.jsx)(n.p,{children:'Consul does not allow dots (".") in metadata keys, use dashes instead.'})}),"\n",(0,s.jsx)(n.h2,{id:"csrf-on-actuator-endpoints",children:"CSRF on Actuator Endpoints"}),"\n",(0,s.jsxs)(n.p,{children:["Some of the actuator endpoints (e.g. ",(0,s.jsx)(n.code,{children:"/loggers"}),") support POST requests. When using Spring Security you need to ignore the actuator endpoints for CSRF-Protection as the Spring Boot Admin Server currently lacks support."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-java",metastring:'title="SecuritySecureConfig.java"',children:'@Bean\nprotected SecurityFilterChain filterChain(HttpSecurity http) {\n return http.csrf(c -> c.ignoringRequestMatchers("/actuator/**")).build();\n}\n'})}),"\n",(0,s.jsx)(n.h2,{id:"using-mutual-tls",children:"Using Mutual TLS"}),"\n",(0,s.jsxs)(n.p,{children:["SBA Server can also use client certificates to authenticate when accessing the actuator endpoints. If a custom configured ",(0,s.jsx)(n.code,{children:"ClientHttpConnector"})," bean is present, Spring Boot will automatically configure a ",(0,s.jsx)(n.code,{children:"WebClient.Builder"})," using it, which will be used by Spring Boot Admin."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-java",metastring:'title="CustomHttpClientConfig.java"',children:"@Bean\npublic ClientHttpConnector customHttpClient() {\n SslContextBuilder sslContext = SslContextBuilder.forClient();\n //Your sslContext customizations go here\n HttpClient httpClient = HttpClient.create().secure(\n ssl -> ssl.sslContext(sslContext)\n );\n return new ReactorClientHttpConnector(httpClient);\n}\n"})})]})}function u(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(d,{...e})}):d(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>a,x:()=>o});var r=t(6540);const s={},i=r.createContext(s);function a(e){const n=r.useContext(i);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:a(e.components),r.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/3.4.2-SNAPSHOT/assets/js/393be207.3f2d12b6.js b/3.4.2-SNAPSHOT/assets/js/393be207.3f2d12b6.js new file mode 100644 index 00000000000..f066549d3b4 --- /dev/null +++ b/3.4.2-SNAPSHOT/assets/js/393be207.3f2d12b6.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunksite=self.webpackChunksite||[]).push([[134],{591:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>p,default:()=>l,frontMatter:()=>s,metadata:()=>a,toc:()=>d});const a=JSON.parse('{"type":"mdx","permalink":"/3.4.2-SNAPSHOT/markdown-page","source":"@site/src/pages/markdown-page.md","title":"Markdown page example","description":"You don\'t need React to write simple standalone pages.","frontMatter":{"title":"Markdown page example"},"unlisted":false}');var o=n(4848),r=n(8453);const s={title:"Markdown page example"},p="Markdown page example",c={},d=[];function i(e){const t={h1:"h1",header:"header",p:"p",...(0,r.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.header,{children:(0,o.jsx)(t.h1,{id:"markdown-page-example",children:"Markdown page example"})}),"\n",(0,o.jsx)(t.p,{children:"You don't need React to write simple standalone pages."})]})}function l(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(i,{...e})}):i(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>s,x:()=>p});var a=n(6540);const o={},r=a.createContext(o);function s(e){const t=a.useContext(r);return a.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function p(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:s(e.components),a.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/3.4.2-SNAPSHOT/assets/js/3969f627.11f4ca3e.js b/3.4.2-SNAPSHOT/assets/js/3969f627.11f4ca3e.js new file mode 100644 index 00000000000..fb6aec59ed3 --- /dev/null +++ b/3.4.2-SNAPSHOT/assets/js/3969f627.11f4ca3e.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunksite=self.webpackChunksite||[]).push([[841],{4118:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>l,contentTitle:()=>r,default:()=>h,frontMatter:()=>o,metadata:()=>t,toc:()=>c});const t=JSON.parse('{"id":"customize/extend_ui","title":"Extend the UI","description":"Linking / Embedding External Pages in Navbar","source":"@site/docs/customize/02-extend_ui.md","sourceDirName":"customize","slug":"/customize/extend_ui","permalink":"/3.4.2-SNAPSHOT/docs/customize/extend_ui","draft":false,"unlisted":false,"tags":[],"version":"current","sidebarPosition":2,"frontMatter":{"sidebar_custom_props":{"icon":"ui"}},"sidebar":"tutorialSidebar","previous":{"title":"Look and Feel","permalink":"/3.4.2-SNAPSHOT/docs/customize/customize_ui"},"next":{"title":"HTTP Headers","permalink":"/3.4.2-SNAPSHOT/docs/customize/customize_http-headers"}}');var s=i(4848),a=i(8453);const o={sidebar_custom_props:{icon:"ui"}},r="Extend the UI",l={},c=[{value:"Linking / Embedding External Pages in Navbar",id:"linking--embedding-external-pages-in-navbar",level:2},{value:"Simple link",id:"simple-link",level:3},{value:"Dropdown with links",id:"dropdown-with-links",level:3},{value:"Dropdown as link having links as children",id:"dropdown-as-link-having-links-as-children",level:3},{value:"Custom Views",id:"custom-views",level:2},{value:"Override/Set custom group icons",id:"overrideset-custom-group-icons",level:4},{value:"Adding a Top-Level View",id:"adding-a-top-level-view",level:4},{value:"Example",id:"example",level:5},{value:"Visualizing a Custom Endpoint",id:"visualizing-a-custom-endpoint",level:3}];function d(e){const n={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",h4:"h4",h5:"h5",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",...(0,a.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.header,{children:(0,s.jsx)(n.h1,{id:"extend-the-ui",children:"Extend the UI"})}),"\n",(0,s.jsx)(n.h2,{id:"linking--embedding-external-pages-in-navbar",children:"Linking / Embedding External Pages in Navbar"}),"\n",(0,s.jsxs)(n.p,{children:["Links will be opened in a new window/tab (i.e. ",(0,s.jsx)(n.code,{children:'target="_blank"'}),") having no access to opener and referrer (",(0,s.jsx)(n.code,{children:'rel="noopener noreferrer"'}),")."]}),"\n",(0,s.jsx)(n.h3,{id:"simple-link",children:"Simple link"}),"\n",(0,s.jsx)(n.p,{children:"To add a simple link to an external page, use the following snippet."}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",metastring:'title="application.yml"',children:'spring:\n boot:\n admin:\n ui:\n external-views:\n - label: "\ud83d\ude80" #(1)\n url: "https://codecentric.de" #(2)\n order: 2000 #(3)\n'})}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsx)(n.li,{children:"The label will be shown in the navbar"}),"\n",(0,s.jsx)(n.li,{children:"URL to the page you want to link to"}),"\n",(0,s.jsx)(n.li,{children:"Order that allows to specify position of item in navbar"}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"dropdown-with-links",children:"Dropdown with links"}),"\n",(0,s.jsx)(n.p,{children:"To aggregate links below a single element, dropdowns can be configured as follows."}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",metastring:'title="application.yml"',children:'spring:\n boot:\n admin:\n ui:\n external-views:\n - label: Link w/o children\n children:\n - label: "\ud83d\udcd6 Docs"\n url: https://codecentric.github.io/spring-boot-admin/current/\n - label: "\ud83d\udce6 Maven"\n url: https://search.maven.org/search?q=g:de.codecentric%20AND%20a:spring-boot-admin-starter-server\n - label: "\ud83d\udc19 GitHub"\n url: https://github.com/codecentric/spring-boot-admin\n'})}),"\n",(0,s.jsx)(n.h3,{id:"dropdown-as-link-having-links-as-children",children:"Dropdown as link having links as children"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",metastring:'title="application.yml"',children:'spring:\n boot:\n admin:\n ui:\n external-views:\n - label: Link w children\n url: https://codecentric.de #(1)\n children:\n - label: "\ud83d\udcd6 Docs"\n url: https://codecentric.github.io/spring-boot-admin/current/\n - label: "\ud83d\udce6 Maven"\n url: https://search.maven.org/search?q=g:de.codecentric%20AND%20a:spring-boot-admin-starter-server\n - label: "\ud83d\udc19 GitHub"\n url: https://github.com/codecentric/spring-boot-admin\n - label: "\ud83c\udf85 Is it christmas"\n url: https://isitchristmas.com\n iframe: true\n'})}),"\n",(0,s.jsx)(n.h2,{id:"custom-views",children:"Custom Views"}),"\n",(0,s.jsxs)(n.p,{children:["It is possible to add custom views to the ui. The views must be implemented as ",(0,s.jsx)(n.a,{href:"https://vuejs.org/",children:"Vue.js"})," components."]}),"\n",(0,s.jsxs)(n.p,{children:["The JavaScript-Bundle and CSS-Stylesheet must be placed on the classpath at ",(0,s.jsx)(n.code,{children:"/META-INF/spring-boot-admin-server-ui/extensions/{name}/"})," so the server can pick them up. The ",(0,s.jsx)(n.a,{href:"https://github.com/codecentric/spring-boot-admin/tree/master/spring-boot-admin-samples/spring-boot-admin-sample-custom-ui/",children:"spring-boot-admin-sample-custom-ui"})," module contains a sample which has the necessary maven setup to build such a module."]}),"\n",(0,s.jsx)(n.p,{children:"The custom extension registers itself by calling:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-javascript",metastring:'title="custom-ui.js"',children:'SBA.use({\n install({ viewRegistry, i18n }) {\n viewRegistry.addView({\n name: "custom", //(1)\n path: "/custom", //(2)\n component: custom, //(3)\n group: "custom", //(4)\n handle, //(5)\n order: 1000, //(6)\n });\n i18n.mergeLocaleMessage("en", {\n custom: {\n label: "My Extensions", //(7)\n },\n });\n i18n.mergeLocaleMessage("de", {\n custom: {\n label: "Meine Erweiterung",\n },\n });\n },\n});\n'})}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsx)(n.li,{children:"Name of the view and the route."}),"\n",(0,s.jsx)(n.li,{children:"Path in Vue router."}),"\n",(0,s.jsx)(n.li,{children:"The imported custom component, which will be rendered on the route."}),"\n",(0,s.jsx)(n.li,{children:'An optional group name that allows to bind views to a logical group (defaults to "none")'}),"\n",(0,s.jsx)(n.li,{children:"The handle for the custom view to be shown in the top navigation bar."}),"\n",(0,s.jsx)(n.li,{children:"Order for the view."}),"\n",(0,s.jsxs)(n.li,{children:["Using ",(0,s.jsx)(n.code,{children:"i18n.mergeLocaleMessage"})," allows to add custom translations."]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"Views in the top navigation bar are sorted by ascending order."}),"\n",(0,s.jsxs)(n.p,{children:["If new top level routes are added to the frontend, they also must be known to the backend. Add a ",(0,s.jsx)(n.code,{children:"/META-INF/spring-boot-admin-server-ui/extensions/{name}/routes.txt"})," with all your new toplevel routes (one route per line)."]}),"\n",(0,s.jsx)(n.p,{children:"Groups are used in instance sidebar to aggregate multiple views into a collapsible menu entry showing the group\u2019s name. When a group contains just a single element, the label of the view is shown instead of the group\u2019s name."}),"\n",(0,s.jsx)(n.h4,{id:"overrideset-custom-group-icons",children:"Override/Set custom group icons"}),"\n",(0,s.jsxs)(n.p,{children:["In order to override or set icons for (custom) groups you can use the ",(0,s.jsx)(n.code,{children:"SBA.viewRegistry.setGroupIcon"})," function as follows:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-javascript",metastring:'title="custom-ui.js"',children:"SBA.viewRegistry.setGroupIcon(\n \"custom\", //(1)\n `\n ` //(2)\n);\n"})}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsx)(n.li,{children:"Name of the group to set icon for"}),"\n",(0,s.jsx)(n.li,{children:"Arbitrary HTML code (e.g. SVG image) that is inserted and parsed as icon."}),"\n"]}),"\n",(0,s.jsx)(n.h4,{id:"adding-a-top-level-view",children:"Adding a Top-Level View"}),"\n",(0,s.jsx)(n.p,{children:"Here is a simple top level view just listing all registered applications:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-html",metastring:'title="custom-ui.vue"',children:'\n\n - +Client features | Spring Boot Admin + + -

Client features

+

Client features

Show Version in Application List

For Spring Boot applications the easiest way to show the version, is to use the build-info goal from the spring-boot-maven-plugin, which generates the META-INF/build-info.properties. See also the Spring Boot Reference Guide.

For non-Spring Boot applications you can either add a version or build.version to the registration metadata and the version will show up in the application list.

@@ -34,6 +34,6 @@

Show
application.properties
#using the metadata
spring.boot.admin.client.instance.metadata.tags.environment=test

#using the info endpoint
info.tags.environment=test

Spring Boot Admin Client

The Spring Boot Admin Client registers the application at the admin server. This is done by periodically doing a HTTP post request to the SBA Server providing information about the application.

-
tip

There are plenty of properties to influence the way how the SBA Client registers your application. In case that doesn’t fit your needs, you can provide your own ApplicationFactory implementation.

+
tip

There are plenty of properties to influence the way how the SBA Client registers your application. In case that doesn’t fit your needs, you can provide your own ApplicationFactory implementation.

\ No newline at end of file diff --git a/3.4.2-SNAPSHOT/docs/client/client-properties/index.html b/3.4.2-SNAPSHOT/docs/client/client-properties/index.html index 31e0dbae38a..73bdde25e9b 100644 --- a/3.4.2-SNAPSHOT/docs/client/client-properties/index.html +++ b/3.4.2-SNAPSHOT/docs/client/client-properties/index.html @@ -3,15 +3,15 @@ -Properties | Spring Boot Admin - - +Properties | Spring Boot Admin + + -

Properties

+

Properties

Spring Boot Admin Client configuration options

Property nameDescriptionDefault value
spring.boot.admin.client.enabledEnables the Spring Boot Admin Client.true
spring.boot.admin.client.urlComma separated ordered list of URLs of the Spring Boot Admin server to register at. This triggers the AutoConfiguration. Mandatory.
spring.boot.admin.client.api-pathHttp-path of registration endpoint at your admin server."instances"
spring.boot.admin.client.usernamespring.boot.admin.client.passwordUsername and password in case the SBA Server api is protected with HTTP Basic authentication.
spring.boot.admin.client.periodInterval for repeating the registration (in ms).10,000
spring.boot.admin.client.connect-timeoutConnect timeout for the registration (in ms).5,000
spring.boot.admin.client.read-timeoutRead timeout for the registration (in ms).5,000
spring.boot.admin.client.auto-registrationIf set to true the periodic task to register the application is automatically scheduled after the application is ready.true
spring.boot.admin.client.auto-deregistrationSwitch to enable auto-deregistration at Spring Boot Admin server when context is closed. If the value is unset the feature is active if a running CloudPlatform was detected.null
spring.boot.admin.client.register-onceIf set to true the client will only register against one admin server (in order defined by spring.boot.admin.instance.url); if that admin server goes down, will automatically register against the next admin server. If false, will register against all admin servers.true
spring.boot.admin.client.instance.health-urlHealth-url to register with. Can be overridden in case the reachable URL is different (e.g. Docker). Must be unique in registry.Guessed based on management-base-url and endpoints.health.id.
spring.boot.admin.client.instance.management-base-urlBase url for computing the management-url to register with. The path is inferred at runtime, and appended to the base url.Guessed based on management.server.port, service-url and server.servlet-path.
spring.boot.admin.client.instance.management-urlManagement-url to register with. Can be overridden in case the reachable url is different (e.g. Docker).Guessed based on management-base-url and management.server.base-path.
spring.boot.admin.client.instance.service-base-urlBase url for computing the service-url to register with. The path is inferred at runtime, and appended to the base url. In Cloudfoundry environments you can switching to https like this: spring.boot.admin.client.instance.service-base-url=https://${vcap.application.uris[0]}Guessed based on hostname, server.port.
spring.boot.admin.client.instance.service-urlService-url to register with. Can be overridden in case the reachable url is different (e.g. Docker).Guessed based on service-base-url and server.context-path.
spring.boot.admin.client.instance.service-pathService-path to register with. Can be overridden in case the reachable path is different (e.g. context-path set programmatically)./
spring.boot.admin.client.instance.nameName to register with.${spring.application.name} if set, "spring-boot-application" otherwise.
spring.boot.admin.client.instance.service-host-typeSelect which information should be considered when sending the host of a service:* IP: Uses the IP returned by InetAddress.getHostAddress()* HOST_NAME: Uses the host name of a single machine returned by InetAddress.getHostName()* CANONICAL_HOST_NAME: Uses the FQDN returned by InetAddress.geCanonicalHostName()If server.address or management.server.address is set in the service, the value will overrule this property.CANONICAL_HOST_NAME
spring.boot.admin.client.instance.metadata.*Metadata key-value-pairs to be associated with this instance.
spring.boot.admin.client.instance.metadata.tags.*Tags as key-value-pairs to be associated with this instance.

Instance metadata options

-
KeyValueDefault value
user.nameuser.passwordCredentials being used to access the endpoints.
+
KeyValueDefault value
user.nameuser.passwordCredentials being used to access the endpoints.
\ No newline at end of file diff --git a/3.4.2-SNAPSHOT/docs/client/index.html b/3.4.2-SNAPSHOT/docs/client/index.html index c9de18f9320..8406f3efce2 100644 --- a/3.4.2-SNAPSHOT/docs/client/index.html +++ b/3.4.2-SNAPSHOT/docs/client/index.html @@ -3,12 +3,12 @@ -Spring Boot Admin Client | Spring Boot Admin - - +Spring Boot Admin Client | Spring Boot Admin + + -

Spring Boot Admin Client

+

Spring Boot Admin Client

The Spring Boot Admin Client is a Spring Boot application that registers itself with the Spring Boot Admin Server to enable monitoring and management. By including the Spring Boot Admin Client Starter dependency in your application, the Spring Boot Admin Server can automatically access health, metrics, and other management endpoints, depending on which @@ -26,6 +26,6 @@

By adding the Spring Boot Admin Client to your applications, they become discoverable by the Admin Server, enabling centralized monitoring, alerting, and management. This makes it easy to monitor the health of your entire system in real-time.

-
+
\ No newline at end of file diff --git a/3.4.2-SNAPSHOT/docs/customize/customize_http-headers/index.html b/3.4.2-SNAPSHOT/docs/customize/customize_http-headers/index.html index 544ee840037..c0d98716925 100644 --- a/3.4.2-SNAPSHOT/docs/customize/customize_http-headers/index.html +++ b/3.4.2-SNAPSHOT/docs/customize/customize_http-headers/index.html @@ -3,13 +3,13 @@ -HTTP Headers | Spring Boot Admin - - +HTTP Headers | Spring Boot Admin + + -

HTTP Headers

+

HTTP Headers

In case you need to inject custom HTTP headers into the requests made to the monitored application’s actuator endpoints you can easily add a HttpHeadersProvider:

-
CustomHttpHeadersProvider.java
@Bean
public HttpHeadersProvider customHttpHeadersProvider() {
return (instance) -> {
HttpHeaders httpHeaders = new HttpHeaders();
httpHeaders.add("X-CUSTOM", "My Custom Value");
return httpHeaders;
};
}
+
CustomHttpHeadersProvider.java
@Bean
public HttpHeadersProvider customHttpHeadersProvider() {
return (instance) -> {
HttpHeaders httpHeaders = new HttpHeaders();
httpHeaders.add("X-CUSTOM", "My Custom Value");
return httpHeaders;
};
}
\ No newline at end of file diff --git a/3.4.2-SNAPSHOT/docs/customize/customize_interceptors/index.html b/3.4.2-SNAPSHOT/docs/customize/customize_interceptors/index.html index ee74da94850..b8dcd4344c9 100644 --- a/3.4.2-SNAPSHOT/docs/customize/customize_interceptors/index.html +++ b/3.4.2-SNAPSHOT/docs/customize/customize_interceptors/index.html @@ -3,13 +3,13 @@ -HTTP Interceptors | Spring Boot Admin - - +HTTP Interceptors | Spring Boot Admin + + -

HTTP Interceptors

+

HTTP Interceptors

You can intercept and modify requests and responses made to the monitored application’s actuator endpoints by implementing the InstanceExchangeFilterFunction interface. This can be useful for auditing or adding some extra security checks.

-
CustomHttpInterceptor.java
@Bean
public InstanceExchangeFilterFunction auditLog() {
return (instance, request, next) -> next.exchange(request).doOnSubscribe((s) -> {
if (HttpMethod.DELETE.equals(request.method()) || HttpMethod.POST.equals(request.method())) {
log.info("{} for {} on {}", request.method(), instance.getId(), request.url());
}
});
}
+
CustomHttpInterceptor.java
@Bean
public InstanceExchangeFilterFunction auditLog() {
return (instance, request, next) -> next.exchange(request).doOnSubscribe((s) -> {
if (HttpMethod.DELETE.equals(request.method()) || HttpMethod.POST.equals(request.method())) {
log.info("{} for {} on {}", request.method(), instance.getId(), request.url());
}
});
}
\ No newline at end of file diff --git a/3.4.2-SNAPSHOT/docs/customize/customize_ui/index.html b/3.4.2-SNAPSHOT/docs/customize/customize_ui/index.html index c6d88175ebf..36d7597c897 100644 --- a/3.4.2-SNAPSHOT/docs/customize/customize_ui/index.html +++ b/3.4.2-SNAPSHOT/docs/customize/customize_ui/index.html @@ -3,12 +3,12 @@ -Look and Feel | Spring Boot Admin - - +Look and Feel | Spring Boot Admin + + -

Look and Feel

+

Look and Feel

You can set custom information in the header (i.e. displaying staging information or company name) by using following configuration properties:

  • spring.boot.admin.ui.brand: This HTML snippet is rendered in navigation header and defaults to <img src="assets/img/icon-spring-boot-admin.svg"><span>Spring Boot Admin</span>. By default it shows the SBA logo followed by it’s name. If you want to show a custom logo you can set: spring.boot.admin.ui.brand=<img src="custom/custom-icon.png">. Either you just add the image to your jar-file in /META-INF/spring-boot-admin-server-ui/ (SBA registers a ResourceHandler for this location by default), or you must ensure yourself that the image gets served correctly (e.g. by registering your own ResourceHandler)
  • @@ -46,6 +46,6 @@

    Show or hide views

    You can very simply hide views in the navbar:

    -
    application.yml
    spring:
    boot:
    admin:
    ui:
    view-settings:
    - name: "journal"
    enabled: false
+
application.yml
spring:
boot:
admin:
ui:
view-settings:
- name: "journal"
enabled: false
\ No newline at end of file diff --git a/3.4.2-SNAPSHOT/docs/customize/extend_ui/index.html b/3.4.2-SNAPSHOT/docs/customize/extend_ui/index.html index 974ed66ebbe..843c0f3736d 100644 --- a/3.4.2-SNAPSHOT/docs/customize/extend_ui/index.html +++ b/3.4.2-SNAPSHOT/docs/customize/extend_ui/index.html @@ -3,12 +3,12 @@ -Extend the UI | Spring Boot Admin - - +Extend the UI | Spring Boot Admin + + -

Extend the UI

+

Extend the UI

Linking / Embedding External Pages in Navbar

Links will be opened in a new window/tab (i.e. target="_blank") having no access to opener and referrer (rel="noopener noreferrer").

@@ -79,6 +79,6 @@

note

You can override default views by putting the same group and name as the one you want to override.

+
note

You can override default views by putting the same group and name as the one you want to override.

\ No newline at end of file diff --git a/3.4.2-SNAPSHOT/docs/customize/index.html b/3.4.2-SNAPSHOT/docs/customize/index.html index 4d985a163ed..4f8c91a748f 100644 --- a/3.4.2-SNAPSHOT/docs/customize/index.html +++ b/3.4.2-SNAPSHOT/docs/customize/index.html @@ -3,12 +3,12 @@ -Customizing | Spring Boot Admin - - +Customizing | Spring Boot Admin + + -

Customizing

+

Customizing

Spring Boot Admin provides flexibility for customizing the appearance and branding of the Admin Server’s user interface. This allows you to tailor the UI to match your organization's branding, improve usability, or add custom functionality.

You can easily modify key elements like logos, themes, and even extend the UI with custom views or components. The customization options include:

    @@ -18,6 +18,6 @@
  • Localization: Support multiple languages by adding custom translations for the UI.

By leveraging these customization options, you can create a tailored experience that aligns with your project or organization's needs, while still retaining the powerful monitoring and management capabilities of Spring Boot Admin.

-
+
\ No newline at end of file diff --git a/3.4.2-SNAPSHOT/docs/index/index.html b/3.4.2-SNAPSHOT/docs/index/index.html index 10309360104..b5d7c26256b 100644 --- a/3.4.2-SNAPSHOT/docs/index/index.html +++ b/3.4.2-SNAPSHOT/docs/index/index.html @@ -3,12 +3,12 @@ -Overview | Spring Boot Admin - - +Overview | Spring Boot Admin + + - + \ No newline at end of file diff --git a/3.4.2-SNAPSHOT/docs/installation-and-setup/index.html b/3.4.2-SNAPSHOT/docs/installation-and-setup/index.html index 0be103a91fc..90da08217df 100644 --- a/3.4.2-SNAPSHOT/docs/installation-and-setup/index.html +++ b/3.4.2-SNAPSHOT/docs/installation-and-setup/index.html @@ -3,12 +3,12 @@ -Installation and Setup | Spring Boot Admin - - +Installation and Setup | Spring Boot Admin + + -

Installation and Setup

+

Installation and Setup

Overview

Spring Boot Admin works by registering Spring Boot applications that expose Actuator endpoints. Each application's health and metrics data is polled by Spring Boot Admin Server, which aggregates and displays this information in a web @@ -51,7 +51,7 @@

Registering Applications

To register your application at the server, you can either include the Spring Boot Admin Client or use Spring Cloud Discovery (e.g. Eureka, Consul, …​). There is also -an option to use static configuration on server side.

+an option to use static configuration on server side.

Using Spring Boot Admin Client

Each application that is not using Spring Cloud features but wants to register at the server has to include the Spring Boot Admin Client as dependency.

@@ -92,6 +92,6 @@

tip

You can include the Spring Boot Admin Server to your Eureka server as well. Setup everything as described above and set spring.boot.admin.context-path to something different from / so that the Spring Boot Admin Server UI won’t clash with -Eureka’s one.

+Eureka’s one.

\ No newline at end of file diff --git a/3.4.2-SNAPSHOT/docs/server/index.html b/3.4.2-SNAPSHOT/docs/server/index.html index b1f07816203..9b35873c752 100644 --- a/3.4.2-SNAPSHOT/docs/server/index.html +++ b/3.4.2-SNAPSHOT/docs/server/index.html @@ -3,12 +3,12 @@ -Spring Boot Admin Server | Spring Boot Admin - - +Spring Boot Admin Server | Spring Boot Admin + + -

Spring Boot Admin Server

+

Spring Boot Admin Server

The Spring Boot Admin Server acts as the core component for managing and monitoring multiple Spring Boot applications. It collects health, metrics, and runtime information from registered applications and displays them on a user-friendly web interface.

@@ -28,6 +28,6 @@

The Admin Server itself is stateless, meaning it relies on its registered applications to periodically poll their status. Once configured, the Admin Server dashboard provides a central view for managing all of your Spring Boot services.

-
+
\ No newline at end of file diff --git a/3.4.2-SNAPSHOT/docs/server/notifications/index.html b/3.4.2-SNAPSHOT/docs/server/notifications/index.html index 2fb2c9194e5..62cc6b97f8d 100644 --- a/3.4.2-SNAPSHOT/docs/server/notifications/index.html +++ b/3.4.2-SNAPSHOT/docs/server/notifications/index.html @@ -3,12 +3,12 @@ -Add Notifications | Spring Boot Admin - - +Add Notifications | Spring Boot Admin + + -

Add Notifications

+

Add Notifications

You can add your own Notifiers by adding Spring Beans which implement the Notifier interface, at best by extendingAbstractEventNotifier or AbstractStatusChangeNotifier.

CustomNotifier.java
public class CustomNotifier extends AbstractEventNotifier {

private static final Logger LOGGER = LoggerFactory.getLogger(LoggingNotifier.class);

public CustomNotifier(InstanceRepository repository) {
super(repository);
}

@Override
protected Mono<Void> doNotify(InstanceEvent event, Instance instance) {
return Mono.fromRunnable(() -> {
if (event instanceof InstanceStatusChangedEvent) {
LOGGER.info("Instance {} ({}) is {}", instance.getRegistration().getName(), event.getInstance(),
((InstanceStatusChangedEvent) event).getStatusInfo().getStatus());
}
else {
LOGGER.info("Instance {} ({}) {}", instance.getRegistration().getName(), event.getInstance(),
event.getType());
}
});
}
}

Notification

@@ -75,7 +75,7 @@

Filt

You may as well access all notification filter configurations via the main applications view inside SBA client, as seen in the screenshot below.

-

Sample notification filters

+

Sample notification filters

A FilteringNotifier might be useful, for instance, if you don’t want to receive notifications when deploying your applications. Before stopping the application, you can add an (expiring) filter via a POST request.

How to configure filtering

NotifierConfig.java
@Configuration(proxyBeanMethods = false)
public class NotifierConfig {

private final InstanceRepository repository;

private final ObjectProvider<List<Notifier>> otherNotifiers;

public NotifierConfig(InstanceRepository repository, ObjectProvider<List<Notifier>> otherNotifiers) {
this.repository = repository;
this.otherNotifiers = otherNotifiers;
}

@Bean
public FilteringNotifier filteringNotifier() { // (1)
CompositeNotifier delegate = new CompositeNotifier(this.otherNotifiers.getIfAvailable(Collections::emptyList));
return new FilteringNotifier(delegate, this.repository);
}

@Primary
@Bean(initMethod = "start", destroyMethod = "stop")
public RemindingNotifier remindingNotifier() { // (2)
RemindingNotifier notifier = new RemindingNotifier(filteringNotifier(), this.repository);
notifier.setReminderPeriod(Duration.ofMinutes(10));
notifier.setCheckReminderInverval(Duration.ofSeconds(10));
return notifier;
}

}
@@ -91,6 +91,6 @@

DingT

RocketChat Notifications

To enable Rocket.Chat notifications you need a personal token access and create a room to send message with this token

Table 10. RocketChat notifications configuration options

-
Property nameDescriptionDefault value
spring.boot.admin.notify.rocketchat.enabledEnable RocketChat notifications.true
spring.boot.admin.notify.rocketchat.urlThe RocketChat server url to send the notifications to.
spring.boot.admin.notify.rocketchat.userIdUser id user
spring.boot.admin.notify.rocketchat.tokenGenerated token user
spring.boot.admin.notify.rocketchat.roomIdThe room id to send the message
spring.boot.admin.notify.rocketchat.messageText to send. SpEL-expressions are supported."#{instance.registration.name} (#{instance.id}) is #{event.statusInfo.status}"
+
Property nameDescriptionDefault value
spring.boot.admin.notify.rocketchat.enabledEnable RocketChat notifications.true
spring.boot.admin.notify.rocketchat.urlThe RocketChat server url to send the notifications to.
spring.boot.admin.notify.rocketchat.userIdUser id user
spring.boot.admin.notify.rocketchat.tokenGenerated token user
spring.boot.admin.notify.rocketchat.roomIdThe room id to send the message
spring.boot.admin.notify.rocketchat.messageText to send. SpEL-expressions are supported."#{instance.registration.name} (#{instance.id}) is #{event.statusInfo.status}"
\ No newline at end of file diff --git a/3.4.2-SNAPSHOT/docs/server/security/index.html b/3.4.2-SNAPSHOT/docs/server/security/index.html index 9910cc9b52f..e76532d0f8b 100644 --- a/3.4.2-SNAPSHOT/docs/server/security/index.html +++ b/3.4.2-SNAPSHOT/docs/server/security/index.html @@ -3,12 +3,12 @@ -Foster Security | Spring Boot Admin - - +Foster Security | Spring Boot Admin + + -

Foster Security

+

Foster Security

Securing Spring Boot Admin Server

Since there are several approaches on solving authentication and authorization in distributed web applications Spring Boot Admin doesn’t ship a default one. By default spring-boot-admin-server-ui provides a login page and a logout button.

A Spring Security configuration for your server could look like this:

@@ -51,6 +51,6 @@

C
SecuritySecureConfig.java
@Bean
protected SecurityFilterChain filterChain(HttpSecurity http) {
return http.csrf(c -> c.ignoringRequestMatchers("/actuator/**")).build();
}

Using Mutual TLS

SBA Server can also use client certificates to authenticate when accessing the actuator endpoints. If a custom configured ClientHttpConnector bean is present, Spring Boot will automatically configure a WebClient.Builder using it, which will be used by Spring Boot Admin.

-
CustomHttpClientConfig.java
@Bean
public ClientHttpConnector customHttpClient() {
SslContextBuilder sslContext = SslContextBuilder.forClient();
//Your sslContext customizations go here
HttpClient httpClient = HttpClient.create().secure(
ssl -> ssl.sslContext(sslContext)
);
return new ReactorClientHttpConnector(httpClient);
}
+
CustomHttpClientConfig.java
@Bean
public ClientHttpConnector customHttpClient() {
SslContextBuilder sslContext = SslContextBuilder.forClient();
//Your sslContext customizations go here
HttpClient httpClient = HttpClient.create().secure(
ssl -> ssl.sslContext(sslContext)
);
return new ReactorClientHttpConnector(httpClient);
}
\ No newline at end of file diff --git a/3.4.2-SNAPSHOT/docs/server/server-properties/index.html b/3.4.2-SNAPSHOT/docs/server/server-properties/index.html index 4bfc74f6b2e..5448e05861b 100644 --- a/3.4.2-SNAPSHOT/docs/server/server-properties/index.html +++ b/3.4.2-SNAPSHOT/docs/server/server-properties/index.html @@ -3,12 +3,12 @@ -Properties | Spring Boot Admin - - +Properties | Spring Boot Admin + + -

Properties

-
Property nameDescriptionDefault value
spring.boot.admin.server.enabledEnables the Spring Boot Admin Server.true
spring.boot.admin.context-pathThe context-path prefixes the path where the Admin Server’s statics assets and API should be served. Relative to the Dispatcher-Servlet.
spring.boot.admin.monitor.status-intervalTime interval to check the status of instances.10,000ms
spring.boot.admin.monitor.status-max-backoffThe maximal backoff for status check retries (retry after error has exponential backoff, minimum backoff is 1 second).60,000ms
spring.boot.admin.monitor.status-lifetimeLifetime of status. The status won’t be updated as long the last status isn’t expired.10,000ms
spring.boot.admin.monitor.info-intervalTime interval to check the info of instances.1m
spring.boot.admin.monitor.info-max-backoffThe maximal backoff for info check retries (retry after error has exponential backoff, minimum backoff is 1 second).10m
spring.boot.admin.monitor.info-lifetimeLifetime of info. The info won’t be updated as long the last info isn’t expired.1m
spring.boot.admin.monitor.default-timeoutDefault timeout when making requests. Individual values for specific endpoints can be overridden using spring.boot.admin.monitor.timeout.*. However, for interval based tasks like statusUpdate (i.e. HealthCheck) there are some limitations: the default-timeout cannot be longer than the interval. If so, the specified value of the interval is used as timeout.10,000
spring.boot.admin.monitor.timeout.*Key-Value-Pairs with the timeout per endpointId. Defaults to default-timeout.
spring.boot.admin.monitor.default-retriesDefault number of retries for failed requests. Modifying requests (PUT, POST, PATCH, DELETE) are never retried. Individual values for specific endpoints can be overridden using spring.boot.admin.monitor.retries.*.0
spring.boot.admin.monitor.retries.*Key-Value-Pairs with the number of retries per endpointId. Defaults to default-retries. Modifying requests (PUT, POST, PATCH, DELETE) are never retried.
spring.boot.admin.metadata-keys-to-sanitizeMetadata values for the keys matching these regex patterns will be sanitized in all json output. Starting from Spring Boot 3, all actuator values are masked by default. Take a look at the Spring Boot documentation in order to configure unsanitizing of values (Sanitize Sensitive Values).".password$", ".*secret$", ".*key$", ".*token$", ".*credentials.", ".*vcap_services$"
spring.boot.admin.probed-endpointsFor Spring Boot 1.x client applications SBA probes for the specified endpoints using an OPTIONS request. If the path differs from the id you can specify this as id:path (e.g. health:ping).."health", "env", "metrics", "httptrace:trace", "threaddump:dump", "jolokia", "info", "logfile", "refresh", "flyway", "liquibase", "heapdump", "loggers", "auditevents"
spring.boot.admin.instance-auth.enabledEnable pulling credentials from spring configuration propertiestrue
spring.boot.admin.instance-auth.default-user-nameA default user name used to authenticate to registered services. The spring.boot.admin.instance-auth.enabled property must be true.null
spring.boot.admin.instance-auth.default-passwordA default user password used to authenticate to registered services. The spring.boot.admin.instance-auth.enabled property must be true.null
spring.boot.admin.instance-auth.service-map.*.user-nameA user name used to authenticate to the registered service with the specified name. The spring.boot.admin.instance-auth.enabled property must be true.
spring.boot.admin.instance-auth.service-map.*.user-passwordA user password used to authenticate to the registered service with the specified name. The spring.boot.admin.instance-auth.enabled property must be true.
spring.boot.admin.instance-proxy.ignored-headersHeaders not to be forwarded when making requests to clients."Cookie", "Set-Cookie", "Authorization"
spring.boot.admin.ui.public-urlBase url to use to build the base href in the ui.If running behind a reverse proxy (using path rewriting) this can be used to make correct self references. If the host/port is omitted it will be inferred from the request.
spring.boot.admin.ui.brandBrand to be shown in the navbar."<img src="assets/img/icon-spring-boot-admin.svg"><span>Spring Boot Admin</span>"
spring.boot.admin.ui.titlePage-Title to be shown."Spring Boot Admin"
spring.boot.admin.ui.login-iconIcon used as image on login page."assets/img/icon-spring-boot-admin.svg"
spring.boot.admin.ui.faviconIcon used as default favicon and icon for desktop notifications."assets/img/favicon.png"
spring.boot.admin.ui.favicon-dangerIcon used as favicon when one or more service is down and for desktop notifications."assets/img/favicon-danger.png"
spring.boot.admin.ui.remember-me-enabledSwitch to show/hide the remember-me checkbox on the login page.true
spring.boot.admin.ui.poll-timer.cachePolling duration in ms to fetch new cache data.2500
spring.boot.admin.ui.poll-timer.datasourcePolling duration in ms to fetch new datasource data.2500
spring.boot.admin.ui.poll-timer.gcPolling duration in ms to fetch new gc data.2500
spring.boot.admin.ui.poll-timer.processPolling duration in ms to fetch new process data.2500
spring.boot.admin.ui.poll-timer.memoryPolling duration in ms to fetch new memory data.2500
spring.boot.admin.ui.poll-timer.threadsPolling duration in ms to fetch new threads data.2500
spring.boot.admin.ui.poll-timer.logfilePolling duration in ms to fetch new logfile data.1000
`Allows to enable toast notifications.false
+

Properties

+
Property nameDescriptionDefault value
spring.boot.admin.server.enabledEnables the Spring Boot Admin Server.true
spring.boot.admin.context-pathThe context-path prefixes the path where the Admin Server’s statics assets and API should be served. Relative to the Dispatcher-Servlet.
spring.boot.admin.monitor.status-intervalTime interval to check the status of instances.10,000ms
spring.boot.admin.monitor.status-max-backoffThe maximal backoff for status check retries (retry after error has exponential backoff, minimum backoff is 1 second).60,000ms
spring.boot.admin.monitor.status-lifetimeLifetime of status. The status won’t be updated as long the last status isn’t expired.10,000ms
spring.boot.admin.monitor.info-intervalTime interval to check the info of instances.1m
spring.boot.admin.monitor.info-max-backoffThe maximal backoff for info check retries (retry after error has exponential backoff, minimum backoff is 1 second).10m
spring.boot.admin.monitor.info-lifetimeLifetime of info. The info won’t be updated as long the last info isn’t expired.1m
spring.boot.admin.monitor.default-timeoutDefault timeout when making requests. Individual values for specific endpoints can be overridden using spring.boot.admin.monitor.timeout.*. However, for interval based tasks like statusUpdate (i.e. HealthCheck) there are some limitations: the default-timeout cannot be longer than the interval. If so, the specified value of the interval is used as timeout.10,000
spring.boot.admin.monitor.timeout.*Key-Value-Pairs with the timeout per endpointId. Defaults to default-timeout.
spring.boot.admin.monitor.default-retriesDefault number of retries for failed requests. Modifying requests (PUT, POST, PATCH, DELETE) are never retried. Individual values for specific endpoints can be overridden using spring.boot.admin.monitor.retries.*.0
spring.boot.admin.monitor.retries.*Key-Value-Pairs with the number of retries per endpointId. Defaults to default-retries. Modifying requests (PUT, POST, PATCH, DELETE) are never retried.
spring.boot.admin.metadata-keys-to-sanitizeMetadata values for the keys matching these regex patterns will be sanitized in all json output. Starting from Spring Boot 3, all actuator values are masked by default. Take a look at the Spring Boot documentation in order to configure unsanitizing of values (Sanitize Sensitive Values).".password$", ".*secret$", ".*key$", ".*token$", ".*credentials.", ".*vcap_services$"
spring.boot.admin.probed-endpointsFor Spring Boot 1.x client applications SBA probes for the specified endpoints using an OPTIONS request. If the path differs from the id you can specify this as id:path (e.g. health:ping).."health", "env", "metrics", "httptrace:trace", "threaddump:dump", "jolokia", "info", "logfile", "refresh", "flyway", "liquibase", "heapdump", "loggers", "auditevents"
spring.boot.admin.instance-auth.enabledEnable pulling credentials from spring configuration propertiestrue
spring.boot.admin.instance-auth.default-user-nameA default user name used to authenticate to registered services. The spring.boot.admin.instance-auth.enabled property must be true.null
spring.boot.admin.instance-auth.default-passwordA default user password used to authenticate to registered services. The spring.boot.admin.instance-auth.enabled property must be true.null
spring.boot.admin.instance-auth.service-map.*.user-nameA user name used to authenticate to the registered service with the specified name. The spring.boot.admin.instance-auth.enabled property must be true.
spring.boot.admin.instance-auth.service-map.*.user-passwordA user password used to authenticate to the registered service with the specified name. The spring.boot.admin.instance-auth.enabled property must be true.
spring.boot.admin.instance-proxy.ignored-headersHeaders not to be forwarded when making requests to clients."Cookie", "Set-Cookie", "Authorization"
spring.boot.admin.ui.public-urlBase url to use to build the base href in the ui.If running behind a reverse proxy (using path rewriting) this can be used to make correct self references. If the host/port is omitted it will be inferred from the request.
spring.boot.admin.ui.brandBrand to be shown in the navbar."<img src="assets/img/icon-spring-boot-admin.svg"><span>Spring Boot Admin</span>"
spring.boot.admin.ui.titlePage-Title to be shown."Spring Boot Admin"
spring.boot.admin.ui.login-iconIcon used as image on login page."assets/img/icon-spring-boot-admin.svg"
spring.boot.admin.ui.faviconIcon used as default favicon and icon for desktop notifications."assets/img/favicon.png"
spring.boot.admin.ui.favicon-dangerIcon used as favicon when one or more service is down and for desktop notifications."assets/img/favicon-danger.png"
spring.boot.admin.ui.remember-me-enabledSwitch to show/hide the remember-me checkbox on the login page.true
spring.boot.admin.ui.poll-timer.cachePolling duration in ms to fetch new cache data.2500
spring.boot.admin.ui.poll-timer.datasourcePolling duration in ms to fetch new datasource data.2500
spring.boot.admin.ui.poll-timer.gcPolling duration in ms to fetch new gc data.2500
spring.boot.admin.ui.poll-timer.processPolling duration in ms to fetch new process data.2500
spring.boot.admin.ui.poll-timer.memoryPolling duration in ms to fetch new memory data.2500
spring.boot.admin.ui.poll-timer.threadsPolling duration in ms to fetch new threads data.2500
spring.boot.admin.ui.poll-timer.logfilePolling duration in ms to fetch new logfile data.1000
`Allows to enable toast notifications.false
\ No newline at end of file diff --git a/3.4.2-SNAPSHOT/docs/server/server/index.html b/3.4.2-SNAPSHOT/docs/server/server/index.html index 5cbfc72b799..19acd856942 100644 --- a/3.4.2-SNAPSHOT/docs/server/server/index.html +++ b/3.4.2-SNAPSHOT/docs/server/server/index.html @@ -3,12 +3,12 @@ -Set up the Server | Spring Boot Admin - - +Set up the Server | Spring Boot Admin + + -

Set up the Server

+

Set up the Server

Running Behind a Front-end Proxy Server

In case the Spring Boot Admin server is running behind a reverse proxy, it may be requried to configure the public url where the server is reachable via (spring.boot.admin.ui.public-url). In addition when the reverse proxy terminates the https connection, it may be necessary to configure server.forward-headers-strategy=native (also see Spring Boot Reference Guide).

Spring Cloud Discovery

@@ -18,7 +18,7 @@

pom.xml
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter</artifactId>
</dependency>

application.yml
spring:
cloud:
discovery:
client:
simple:
instances:
test:
- uri: http://instance1.intern:8080
metadata:
management.context-path: /actuator
- uri: http://instance2.intern:8080
metadata:
management.context-path: /actuator

Other DiscoveryClients

-

Spring Boot Admin supports all other implementations of Spring Cloud’s DiscoveryClient (Eureka, Zookeeper, Consul, Kubernetes, …​). You need to add it to the Spring Boot Admin Server and configure it properly. An example setup using Eureka is shown above.

+

Spring Boot Admin supports all other implementations of Spring Cloud’s DiscoveryClient (Eureka, Zookeeper, Consul, Kubernetes, …​). You need to add it to the Spring Boot Admin Server and configure it properly. An example setup using Eureka is shown above.

Converting ServiceInstances

The information from the service registry are converted by the ServiceInstanceConverter. Spring Boot Admin ships with a default and Eureka converter implementation. The correct one is selected by AutoConfiguration.

tip

You can modify how the information from the registry is used to register the application by using SBA Server configuration options and instance metadata. The values from the metadata takes precedence over the server config. If the plenty of options don’t fit your needs you can provide your own ServiceInstanceConverter.

@@ -41,6 +41,6 @@

Clustering
HazelcastConfig.java
@Bean  
public Config hazelcastConfig() {
// This map is used to store the events.
// It should be configured to reliably hold all the data,
// Spring Boot Admin will compact the events, if there are too many
MapConfig eventStoreMap = new MapConfig(DEFAULT_NAME_EVENT_STORE_MAP).setInMemoryFormat(InMemoryFormat.OBJECT)
.setBackupCount(1)
.setMergePolicyConfig(new MergePolicyConfig(PutIfAbsentMergePolicy.class.getName(), 100));
// This map is used to deduplicate the notifications.
// If data in this map gets lost it should not be a big issue as it will atmost
// lead to
// the same notification to be sent by multiple instances
MapConfig sentNotificationsMap = new MapConfig(DEFAULT_NAME_SENT_NOTIFICATIONS_MAP)
.setInMemoryFormat(InMemoryFormat.OBJECT)
.setBackupCount(1)
.setEvictionConfig(
new EvictionConfig().setEvictionPolicy(EvictionPolicy.LRU).setMaxSizePolicy(MaxSizePolicy.PER_NODE))
.setMergePolicyConfig(new MergePolicyConfig(PutIfAbsentMergePolicy.class.getName(), 100));
Config config = new Config();
config.addMapConfig(eventStoreMap);
config.addMapConfig(sentNotificationsMap);
config.setProperty("hazelcast.jmx", "true");
// WARNING: This setups a local cluster, you change it to fit your needs.
config.getNetworkConfig().getJoin().getMulticastConfig().setEnabled(false);
TcpIpConfig tcpIpConfig = config.getNetworkConfig().getJoin().getTcpIpConfig();
tcpIpConfig.setEnabled(true);
tcpIpConfig.setMembers(singletonList("127.0.0.1"));
return config;
}

Hazelcast configuration options

-
Property nameDescriptionDefault value
spring.boot.admin.hazelcast.enabledEnables the Hazelcast supporttrue
spring.boot.admin.hazelcast.event-storeName of the Hazelcast-map to store the events"spring-boot-admin-event-store"
spring.boot.admin.hazelcast.sent-notificationsName of the Hazelcast-map used to deduplicate the notifications."spring-boot-admin-sent-notifications"

+
Property nameDescriptionDefault value
spring.boot.admin.hazelcast.enabledEnables the Hazelcast supporttrue
spring.boot.admin.hazelcast.event-storeName of the Hazelcast-map to store the events"spring-boot-admin-event-store"
spring.boot.admin.hazelcast.sent-notificationsName of the Hazelcast-map used to deduplicate the notifications."spring-boot-admin-sent-notifications"
\ No newline at end of file diff --git a/3.4.2-SNAPSHOT/docs/snapshots/index.html b/3.4.2-SNAPSHOT/docs/snapshots/index.html index 5efe4f98cf7..e61502cabd9 100644 --- a/3.4.2-SNAPSHOT/docs/snapshots/index.html +++ b/3.4.2-SNAPSHOT/docs/snapshots/index.html @@ -3,13 +3,13 @@ -Use SNAPSHOT-Versions | Spring Boot Admin - - +Use SNAPSHOT-Versions | Spring Boot Admin + + -

Use SNAPSHOT-Versions

+

Use SNAPSHOT-Versions

If you want to use a snapshot version of Spring Boot Admin Server you most likely need to include the spring and sonatype snapshot repositories:

-
pom.xml
<repositories>
<repository>
<id>spring-milestone</id>
<snapshots>
<enabled>false</enabled>
</snapshots>
<url>http://repo.spring.io/milestone</url>
</repository>
<repository>
<id>spring-snapshot</id>
<snapshots>
<enabled>true</enabled>
</snapshots>
<url>http://repo.spring.io/snapshot</url>
</repository>
<repository>
<id>sonatype-nexus-snapshots</id>
<name>Sonatype Nexus Snapshots</name>
<url>https://oss.sonatype.org/content/repositories/snapshots/</url>
<snapshots>
<enabled>true</enabled>
</snapshots>
<releases>
<enabled>false</enabled>
</releases>
</repository>
</repositories>
+
pom.xml
<repositories>
<repository>
<id>spring-milestone</id>
<snapshots>
<enabled>false</enabled>
</snapshots>
<url>http://repo.spring.io/milestone</url>
</repository>
<repository>
<id>spring-snapshot</id>
<snapshots>
<enabled>true</enabled>
</snapshots>
<url>http://repo.spring.io/snapshot</url>
</repository>
<repository>
<id>sonatype-nexus-snapshots</id>
<name>Sonatype Nexus Snapshots</name>
<url>https://oss.sonatype.org/content/repositories/snapshots/</url>
<snapshots>
<enabled>true</enabled>
</snapshots>
<releases>
<enabled>false</enabled>
</releases>
</repository>
</repositories>
\ No newline at end of file diff --git a/3.4.2-SNAPSHOT/docs/third-party/index.html b/3.4.2-SNAPSHOT/docs/third-party/index.html index 7b6dba9880f..28df09249ef 100644 --- a/3.4.2-SNAPSHOT/docs/third-party/index.html +++ b/3.4.2-SNAPSHOT/docs/third-party/index.html @@ -3,12 +3,12 @@ -Third Party Integrations | Spring Boot Admin - - +Third Party Integrations | Spring Boot Admin + + - + \ No newline at end of file diff --git a/3.4.2-SNAPSHOT/docs/third-party/pyctuator/index.html b/3.4.2-SNAPSHOT/docs/third-party/pyctuator/index.html index 33e1591a384..e6298cc96f8 100644 --- a/3.4.2-SNAPSHOT/docs/third-party/pyctuator/index.html +++ b/3.4.2-SNAPSHOT/docs/third-party/pyctuator/index.html @@ -3,12 +3,12 @@ -Pyctuator | Spring Boot Admin - - +Pyctuator | Spring Boot Admin + + -

Pyctuator

+

Pyctuator

You can easily integrate Spring Boot Admin with Flask or FastAPI Python applications using the Pyctuator project.

The following steps uses Flask, but other web frameworks are supported as well. See Pyctuator’s documentation for an updated list of supported frameworks and features.

    @@ -19,6 +19,6 @@
  1. Enable pyctuator by pointing it to your Flask app and letting it know where Spring Boot Admin is running:
app.py
import os  
from flask import Flask
from pyctuator.pyctuator import Pyctuator
app_name = "Flask App with Pyctuator"
app = Flask(app_name)
@app.route("/")
def hello():
return "Hello World!"
Pyctuator(
app,
app_name,
app_url="http://example-app.com",
pyctuator_endpoint_url="http://example-app.com/pyctuator",
registration_url=os.getenv("SPRING_BOOT_ADMIN_URL")
)
app.run()
-

For further details and examples, see Pyctuator’s documentation and examples.

+

For further details and examples, see Pyctuator’s documentation and examples.

\ No newline at end of file diff --git a/3.4.2-SNAPSHOT/faq/index.html b/3.4.2-SNAPSHOT/faq/index.html index d8ff455bcc5..5e9f4068ef9 100644 --- a/3.4.2-SNAPSHOT/faq/index.html +++ b/3.4.2-SNAPSHOT/faq/index.html @@ -3,18 +3,18 @@ -FAQ | Spring Boot Admin - - +FAQ | Spring Boot Admin + + -

FAQ

+

FAQ

Can I include spring-boot-admin into my business application?

tl;dr You can, but you shouldn't. + You can set spring.boot.admin.context-path to alter the path where the UI and REST-API is served, but depending on the complexity of your application you might get in trouble. On the other hand in my opinion it makes no sense for an application to monitor itself. In case your application goes down your monitoring tool also does.

Can I change or reload Spring Boot properties at runtime?

Yes, you can refresh the entire environment or set/update individual properties for both single instances as well as for the entire application. Note, however, that the Spring Boot application needs to have https://docs.spring.io/spring-cloud-commons/docs/current/reference/html/#endpoints[Spring Cloud Commons] and management.endpoint.env.post.enabled=true in place. -Also check the details of @RefreshScope https://docs.spring.io/spring-cloud-commons/docs/current/reference/html/#refresh-scope.

+Also check the details of @RefreshScope https://docs.spring.io/spring-cloud-commons/docs/current/reference/html/#refresh-scope.

\ No newline at end of file diff --git a/3.4.2-SNAPSHOT/impressum/index.html b/3.4.2-SNAPSHOT/impressum/index.html index 807936a40fd..2c5f675dcc7 100644 --- a/3.4.2-SNAPSHOT/impressum/index.html +++ b/3.4.2-SNAPSHOT/impressum/index.html @@ -3,12 +3,12 @@ -Impressum | Spring Boot Admin - - +Impressum | Spring Boot Admin + + -

Impressum

+

Impressum

Hauptsitz der Gesellschaft

codecentric AG
Hochstraße 11
@@ -26,6 +26,6 @@

Handelsregis

Umsatzsteueridentifikationsnummer

DE 119437798

Inhaltlich Verantwortlicher

-

Inhaltlich Verantwortlicher gemäß § 18 Abs. 2 MStV: Rainer Vehns

+

Inhaltlich Verantwortlicher gemäß § 18 Abs. 2 MStV: Rainer Vehns

\ No newline at end of file diff --git a/3.4.2-SNAPSHOT/index.html b/3.4.2-SNAPSHOT/index.html index 041a7c06b72..804a2a7eff6 100644 --- a/3.4.2-SNAPSHOT/index.html +++ b/3.4.2-SNAPSHOT/index.html @@ -3,9 +3,9 @@ -Spring Boot Admin - - +Spring Boot Admin + +
diff --git a/3.4.2-SNAPSHOT/markdown-page/index.html b/3.4.2-SNAPSHOT/markdown-page/index.html index ebdea9a60f9..159607a9403 100644 --- a/3.4.2-SNAPSHOT/markdown-page/index.html +++ b/3.4.2-SNAPSHOT/markdown-page/index.html @@ -3,12 +3,12 @@ -Markdown page example | Spring Boot Admin - - +Markdown page example | Spring Boot Admin + + -

Markdown page example

-

You don't need React to write simple standalone pages.

+

Markdown page example

+

You don't need React to write simple standalone pages.

\ No newline at end of file diff --git a/3.4.2-SNAPSHOT/privacy/index.html b/3.4.2-SNAPSHOT/privacy/index.html index 48d1105ecd2..766c5d4c50e 100644 --- a/3.4.2-SNAPSHOT/privacy/index.html +++ b/3.4.2-SNAPSHOT/privacy/index.html @@ -3,12 +3,12 @@ -Datenschutzerklärung nach der DSGVO | Spring Boot Admin - - +Datenschutzerklärung nach der DSGVO | Spring Boot Admin + + -

Datenschutzerklärung nach der DSGVO

+

Datenschutzerklärung nach der DSGVO

Name und Anschrift der Verantwortlichen

Die Verantwortliche im Sinne der Datenschutz-Grundverordnung und anderer nationaler Datenschutzgesetze der Mitgliedsstaaten sowie sonstiger datenschutzrechtlicher Bestimmungen ist die:

codecentric AG
@@ -128,6 +128,6 @@

Recht auf Beschwerde bei einer Aufsichtsbehörde

Unbeschadet eines anderweitigen verwaltungsrechtlichen oder gerichtlichen Rechtsbehelfs steht Ihnen das Recht auf Beschwerde bei einer Aufsichtsbehörde, insbesondere in dem Mitgliedstaat ihres Aufenthaltsorts, ihres Arbeitsplatzes oder des Orts des mutmaßlichen Verstoßes, zu, wenn Sie der Ansicht sind, dass die Verarbeitung der Sie betreffenden personenbezogenen Daten gegen die DSGVO verstößt.

-

Die Aufsichtsbehörde, bei der die Beschwerde eingereicht wurde, unterrichtet den Beschwerdeführer über den Stand und die Ergebnisse der Beschwerde einschließlich der Möglichkeit eines gerichtlichen Rechtsbehelfs nach Art. 78 DSGVO.

+

Die Aufsichtsbehörde, bei der die Beschwerde eingereicht wurde, unterrichtet den Beschwerdeführer über den Stand und die Ergebnisse der Beschwerde einschließlich der Möglichkeit eines gerichtlichen Rechtsbehelfs nach Art. 78 DSGVO.

\ No newline at end of file diff --git a/3.4.2-SNAPSHOT/sitemap.xml b/3.4.2-SNAPSHOT/sitemap.xml index 732a0439827..4e66d93d870 100644 --- a/3.4.2-SNAPSHOT/sitemap.xml +++ b/3.4.2-SNAPSHOT/sitemap.xml @@ -1 +1 @@ -https://docs.spring-boot-admin.com/faqweekly0.5https://docs.spring-boot-admin.com/impressumweekly0.5https://docs.spring-boot-admin.com/markdown-pageweekly0.5https://docs.spring-boot-admin.com/privacyweekly0.5https://docs.spring-boot-admin.com/docs/client/weekly0.5https://docs.spring-boot-admin.com/docs/client/client-featuresweekly0.5https://docs.spring-boot-admin.com/docs/client/client-propertiesweekly0.5https://docs.spring-boot-admin.com/docs/customize/weekly0.5https://docs.spring-boot-admin.com/docs/customize/customize_http-headersweekly0.5https://docs.spring-boot-admin.com/docs/customize/customize_interceptorsweekly0.5https://docs.spring-boot-admin.com/docs/customize/customize_uiweekly0.5https://docs.spring-boot-admin.com/docs/customize/extend_uiweekly0.5https://docs.spring-boot-admin.com/docs/indexweekly0.5https://docs.spring-boot-admin.com/docs/installation-and-setup/weekly0.5https://docs.spring-boot-admin.com/docs/server/weekly0.5https://docs.spring-boot-admin.com/docs/server/notifications/weekly0.5https://docs.spring-boot-admin.com/docs/server/securityweekly0.5https://docs.spring-boot-admin.com/docs/server/serverweekly0.5https://docs.spring-boot-admin.com/docs/server/server-propertiesweekly0.5https://docs.spring-boot-admin.com/docs/snapshotsweekly0.5https://docs.spring-boot-admin.com/docs/third-party/weekly0.5https://docs.spring-boot-admin.com/docs/third-party/pyctuatorweekly0.5https://docs.spring-boot-admin.com/weekly0.5 \ No newline at end of file +https://docs.spring-boot-admin.com/3.4.2-SNAPSHOT/faqweekly0.5https://docs.spring-boot-admin.com/3.4.2-SNAPSHOT/impressumweekly0.5https://docs.spring-boot-admin.com/3.4.2-SNAPSHOT/markdown-pageweekly0.5https://docs.spring-boot-admin.com/3.4.2-SNAPSHOT/privacyweekly0.5https://docs.spring-boot-admin.com/3.4.2-SNAPSHOT/docs/client/weekly0.5https://docs.spring-boot-admin.com/3.4.2-SNAPSHOT/docs/client/client-featuresweekly0.5https://docs.spring-boot-admin.com/3.4.2-SNAPSHOT/docs/client/client-propertiesweekly0.5https://docs.spring-boot-admin.com/3.4.2-SNAPSHOT/docs/customize/weekly0.5https://docs.spring-boot-admin.com/3.4.2-SNAPSHOT/docs/customize/customize_http-headersweekly0.5https://docs.spring-boot-admin.com/3.4.2-SNAPSHOT/docs/customize/customize_interceptorsweekly0.5https://docs.spring-boot-admin.com/3.4.2-SNAPSHOT/docs/customize/customize_uiweekly0.5https://docs.spring-boot-admin.com/3.4.2-SNAPSHOT/docs/customize/extend_uiweekly0.5https://docs.spring-boot-admin.com/3.4.2-SNAPSHOT/docs/indexweekly0.5https://docs.spring-boot-admin.com/3.4.2-SNAPSHOT/docs/installation-and-setup/weekly0.5https://docs.spring-boot-admin.com/3.4.2-SNAPSHOT/docs/server/weekly0.5https://docs.spring-boot-admin.com/3.4.2-SNAPSHOT/docs/server/notifications/weekly0.5https://docs.spring-boot-admin.com/3.4.2-SNAPSHOT/docs/server/securityweekly0.5https://docs.spring-boot-admin.com/3.4.2-SNAPSHOT/docs/server/serverweekly0.5https://docs.spring-boot-admin.com/3.4.2-SNAPSHOT/docs/server/server-propertiesweekly0.5https://docs.spring-boot-admin.com/3.4.2-SNAPSHOT/docs/snapshotsweekly0.5https://docs.spring-boot-admin.com/3.4.2-SNAPSHOT/docs/third-party/weekly0.5https://docs.spring-boot-admin.com/3.4.2-SNAPSHOT/docs/third-party/pyctuatorweekly0.5https://docs.spring-boot-admin.com/3.4.2-SNAPSHOT/weekly0.5 \ No newline at end of file