diff --git a/redirects.mjs b/redirects.mjs index f4cb0f5e..6edf0151 100644 --- a/redirects.mjs +++ b/redirects.mjs @@ -23,7 +23,24 @@ export const redirects = { '/azure-monitoring': '/azure-integration/', '/configuration': '/kloudmate-agent/management/', '/database-integrations': '/database-monitoring/', - '/direct-database-monitoring': '/database-monitoring/direct-database-monitoring/', + '/database-monitoring/database-activity-monitoring-dam': '/kloudmate-agent/ebpf-observability/', + '/database-monitoring/database-activity-monitoring-dam/ml-classifier-deployment-guide': + '/database-monitoring/sensitive-data/', + '/database-monitoring/database-integrations/mongodb-monitoring': + '/kloudmate-agent/database-monitoring/engines-and-coverages/', + '/database-monitoring/database-integrations/mssql-monitoring': + '/kloudmate-agent/database-monitoring/engines-and-coverages/', + '/database-monitoring/database-integrations/mysql-monitoring': + '/kloudmate-agent/database-monitoring/engines-and-coverages/', + '/database-monitoring/database-integrations/oracledb-monitoring': + '/kloudmate-agent/database-monitoring/engines-and-coverages/', + '/database-monitoring/database-integrations/postgresql-monitoring': + '/kloudmate-agent/database-monitoring/engines-and-coverages/', + '/database-monitoring/database-integrations/redis-monitoring': + '/kloudmate-agent/database-monitoring/engines-and-coverages/', + '/database-monitoring/direct-database-monitoring': '/kloudmate-agent/database-monitoring/overview/', + '/database-monitoring/opentelemetry-database-monitoring': '/apm-and-tracing/auto-instrumentation/', + '/direct-database-monitoring': '/kloudmate-agent/database-monitoring/overview/', '/enable-service-principal-azure': '/azure-integration/enable-service-principal-azure/', '/get-help': '/getting-started/get-help/', '/go-instrumentation-running-on-kubernetes': '/kloudmate-agent/auto-instrumentation/go/', @@ -35,8 +52,7 @@ export const redirects = { '/managing-kloudmate-agents': '/kloudmate-agent/management/', '/managing-panels': '/visualize-data/dashboards/managing-panels/', '/mcp-integrations': '/kloudmate-assistant/mcp-server/', - '/ml-classifier-deployment-guide': - '/database-monitoring/database-activity-monitoring-dam/ml-classifier-deployment-guide/', + '/ml-classifier-deployment-guide': '/database-monitoring/sensitive-data/', '/net-instrumentation-running-on-kubernetes': '/kloudmate-agent/auto-instrumentation/dotnet/', '/setting-up-kloudmate': '/getting-started/setting-up-kloudmate/', '/sns': '/incident-management/integrations/integrating-with-aws-cloudwatch/', diff --git a/src/content/docs/docs/alerts/alert-groups.mdx b/src/content/docs/docs/alerts/alert-groups.mdx index 3785d7e8..621b929a 100644 --- a/src/content/docs/docs/alerts/alert-groups.mdx +++ b/src/content/docs/docs/alerts/alert-groups.mdx @@ -7,8 +7,6 @@ sidebar: When related alerts fire close together, KloudMate groups them into a single **Alert Group**. Instead of notifying on every individual alert, you get one notification for the group, and new alerts append to it rather than fan out into separate notifications. -A group survives restarts and deduplicates against the same incident over time, so a recurring issue keeps showing up on the same group rather than spawning a fresh one each time. - ## How groups form An Alert Group forms by static grouping or by the AI correlation engine. Both produce the same kind of group: @@ -20,28 +18,32 @@ You choose the mode per routing rule; see [Routing Rules](../routing-rules/#aler ## Where to find groups -Open **Alerts → Alert groups** in the left navigation. This is the workspace-wide view of every group, open or resolved. +Open **Alerts**, which starts on the **Groups** tab: the workspace-wide view of every group, firing or resolved. + +![The Groups tab: the All, Firing, and Resolved filter, the Routing rule filter, the search box, and the group list](./images/alert-groups-list.png) -![Alert Groups list](./images/alert-groups-list.png) +Above the list, a summary shows how many groups are firing and how many are resolved, such as **6 Firing, 130 Resolved**. -Columns: **Group** (title), **State** (Open / Resolved), **Instances** (the firing-instance count), **Opened**, **Last update**, and an RCA indicator when an investigation is attached (a manual **Run RCA** or [Auto-RCA](../auto-rca/)). +Columns: **Group** (title), **State** (**Firing** or **Resolved**), **Severity**, **Instances** (the number of unique instances in the group), **Opened**, **Last update**, and **RCA** when an investigation is attached (a manual **Run RCA** or [Auto-RCA](../auto-rca/)). -Expand any row to preview that group's alerts inline: alert name, state, severity, received time, and labels, without leaving the list. The group title links straight to the full detail page. +Expand any row to preview that group's alerts inline, with each alert's state, instance counts, and when it was last seen. The group title links straight to the full detail page. Filter the list by: -- **State:** All / Open / Resolved toggle. Defaults to **Open**. -- **Routing rule:** dropdown filtered to rules in the workspace. -- **Label matchers:** filter by `key=value`. +- **State:** **All**, **Firing**, or **Resolved**. Defaults to **Firing**. +- **Routing rule:** a single rule, or **All routing rules**. + +To find a group by title or by a label such as `service=api`, use the search box. On the **Resolved** and **All** filters, the search matches titles only. -Severity isn't a filter on the list. It lives on the per-instance alerts inside a group, not on the group itself. +Severity isn't a filter on the list. ## Anatomy of a group A group carries: -- **Title:** set by the first alert that opened the group, and **immutable** afterward, even if a higher-severity alert joins later. -- **State:** `Open` while at least one underlying instance is firing; `Resolved` once everything quiets. A firing group whose instances are **all silenced** stays `Open` but carries a **Muted** badge. Muting gates notifications; it doesn't resolve the group. +- **Title:** for a **Static** group, the rendered **Title** annotation when every instance that opened the group renders the same text, and otherwise the name of the alert that opened it. The correlation engine names an **Auto (AI)** group. See [Set a custom notification title](../annotations-and-severity/#set-a-custom-notification-title). +- **Severity:** the most severe **Severity** annotation among the instances that opened the group. +- **State:** **Firing** while at least one underlying instance is firing, and **Resolved** as soon as none is. A firing group whose firing instances are **all silenced** stays **Firing** and is marked **Muted**. Muting gates notifications; it doesn't resolve the group. - **Labels:** the labels that define the group, read from the alerts that joined it (the group-by keys, in Static mode). - **Alerts and instances:** how many distinct alerts and firing instances the group holds so far. - **Routing rule:** the rule that opened the group. @@ -49,34 +51,32 @@ A group carries: - **Correlation reason:** for an Auto-correlated group, why these alerts were grouped. See [Why these were grouped](#why-these-were-grouped). - **Investigation:** a root-cause investigation, when one is attached. Start it manually with **Run RCA**, or automatically with [Auto-RCA](../auto-rca/); see [Run RCA and View RCA](#run-rca-and-view-rca). -Severity isn't a single group-level field. Each underlying instance carries its own severity. - ## Group detail -Click any row to open the group detail page. +Click a group's title to open its detail page. -![Alert Group detail](./images/alert-group-detail.png) +![Alert group detail page: the Run RCA, Ask Assistant, and Silence this group buttons above the Instances panel](./images/alert-group-detail.png) ### Header -- **Title:** set by the first alert and can't be changed. +- **Title:** named from the alerts that opened the group. See [Anatomy of a group](#anatomy-of-a-group). - **Run RCA / View RCA:** starts or opens a root-cause investigation for the group. See [Run RCA and View RCA](#run-rca-and-view-rca). -- **Ask KloudMate Assistant:** opens the assistant chat panel with the group's labels, state, alert and instance counts, and routing rule pre-loaded into the prompt, so you can start investigating without retyping context. +- **Ask Assistant:** opens the assistant chat panel with the group's labels, state, alert and instance counts, and routing rule pre-loaded into the prompt, so you can start investigating without retyping context. - **Silence this group:** opens the silence creator with matchers derived from the group, bound to the group so the silence lifts when the group resolves. The binding sets when the silence ends, not what it mutes: the silence covers any alert in the workspace whose labels match its matchers, group member or not. See [From an Alert Group](../silences/#from-an-alert-group). -### Firing instances +### Instances -The **Firing instances** panel is a table of the unique alert instances that joined this group, deduplicated by the per-instance labels the grouping engine uses. +The **Instances** panel lists the unique alert instances in this group. Filter it by **All**, **Firing**, or **Resolved**; it shows **Firing** instances by default. - **Common labels:** labels shared by every instance, so the per-row labels column only shows what varies. - **Columns:** - - **State:** the instance's current state: **Firing**, **No Data**, **Error**, or **Resolved**. Silenced instances are flagged as muted, so you can see at a glance which ones are firing but suppressed. + - **State:** **Firing** or **Resolved**. Instances muted by a silence or maintenance window are also marked **Muted**, so you can see at a glance which ones are firing but suppressed. + - **Value:** the last evaluated value behind the instance's state. - **Alert:** the alert rule name. Links to the rule when the alert is KloudMate-native (carries an `alarm_id` label). - **Instance labels:** the labels that distinguish this instance from its siblings (common labels are stripped out). - - **Severity:** the per-instance severity, if the alert carries one. - **Since:** how long this instance has been in its current state. -Use this panel to see what's firing inside the group at a glance. For example, service A's `prod` and `staging` are firing while `dev` has already recovered. +Use this panel to see what's firing inside the group at a glance. Switch to **All** to see, for example, that service A's `prod` and `staging` are firing while `dev` has already recovered. ### Run RCA and View RCA @@ -91,10 +91,12 @@ This is the manual trigger. To investigate every group a rule opens automaticall ### Tabs -- **Alerts:** every underlying alert as a row. Columns: Alert (linked to the rule when available), State, Severity, Received at, Labels. Use this when you need the raw event-by-event stream rather than the instance-level rollup. +- **Alerts:** one row per alert rule in the group, with its state, how many of its instances are firing, and when it was last seen. The alert name links to its rule when the alert is KloudMate-native. - **Blast radius:** what the group's firing resources connect to. See [Blast radius](#blast-radius). -- **Audit:** a timeline of everything that happened to the group: opened, alerts appended, silence applied, notification dispatched, resolved. For Auto-correlated groups, it also logs when the engine opened the group and when it correlated each alert. -- **Notifications:** per-channel dispatch outcomes (ok / failed / suppressed-by-silence), with deep links to where the notification landed: Slack thread URL, Jira ticket, KloudMate Incidents incident, and so on. +- **Audit:** a timeline of the group's history, from when it opened to when it resolved. It records each notification and reminder sent, notifications suppressed by a silence or skipped, and investigations. For Auto-correlated groups, it also logs when the engine opened the group and when it correlated each alert. +- **Notifications:** every notification sent for the group, reminders included, with each channel's result and a link to where it landed: the Slack thread, the Jira ticket, the KloudMate Incidents incident, and so on. + +![Reminder on an alert group Audit tab](./images/alert-group-audit-reminder.png) ### Blast radius @@ -110,7 +112,7 @@ The same graph appears on a single alert's **Blast radius** tab and on a resourc **Why these were grouped** gives the reason in plain English, the shared labels, and supporting detail. -This reason appears only when the engine correlated more than one alert. A lone alert the engine left on its own has none, which is expected (see [Cold start](#cold-start)). +This reason appears only when the engine grouped more than one alert instance, either several alerts or the same alert firing on multiple targets. A lone instance the engine left on its own has none, which is expected (see [Cold start](#cold-start)). ### Cold start @@ -124,7 +126,7 @@ Choosing **Wrong** lets you point at the specific alert that doesn't belong, or ## When a group resolves -KloudMate marks a group `Resolved` once every underlying instance has resolved and a short grace period for flapping has elapsed (a few minutes, long enough to absorb instances that flap rapidly without closing the group prematurely). Resolved groups stay in the list under the **Resolved** filter and remain searchable indefinitely. +KloudMate marks a group **Resolved** as soon as none of its instances is firing. If a matching alert fires again after that, it opens a new group. Resolved groups stay in the list under the **Resolved** filter. ## Related diff --git a/src/content/docs/docs/alerts/alert-lifecycle.mdx b/src/content/docs/docs/alerts/alert-lifecycle.mdx index 4ca5baea..282a37b5 100644 --- a/src/content/docs/docs/alerts/alert-lifecycle.mdx +++ b/src/content/docs/docs/alerts/alert-lifecycle.mdx @@ -8,7 +8,7 @@ sidebar: import { LinkCard, CardGrid } from '@astrojs/starlight/components'; -Once you've [created an alert](../create-alerts/), KloudMate evaluates it on a schedule and moves it through a series of states. The control knobs in **Configure evaluation settings** (**Evaluate every**, **Pending duration**, **Recovery period**, **Alert state if No data**, and **Alert state if Error**) each shape *when* and *how* those transitions happen. +After you've [created an alert](../create-alerts/), KloudMate evaluates it on a schedule and moves it through a series of states. The control knobs in the rule's evaluation settings (**Evaluate every**, **Pending duration**, **Recovery period**, **Alert state if No data**, and **Alert state if Error**) each shape *when* and *how* those transitions happen. This page explains the full lifecycle: why an alert can fire instantly, and why No Data and Error don't wait out the pending duration. @@ -76,7 +76,7 @@ A **re-breach during Recovering** snaps the instance back to **Firing** without ## The control knobs at a glance -| Knob (form label) | What it controls | Default | Inherits from [folder](../folders/)? | +| Knob (form label) | What it controls | When blank | Inherits from [folder](../folders/)? | |---|---|---|---| | **Evaluate every** | How often the rule runs. | `60s` | Yes | | **Pending duration** | How long a breach must hold before **Firing**. | Fire immediately | No (per rule) | @@ -84,13 +84,15 @@ A **re-breach during Recovering** snaps the instance back to **Firing** without | **Alert state if No data** | Which state a no-data result becomes. | No Data | Yes | | **Alert state if Error** | Which state an error result becomes. | Error | Yes | +The **When blank** values apply when neither the rule nor its folder sets a value. New rules are pre-filled with **Evaluate every** set to `1m`, **Alert state if No data** set to **No Data**, and **Alert state if Error** set to **Firing**. + ## How No Data and Error fit in No Data and Error behave differently from a threshold breach. A common question: > *I configured the same query, pending duration, and recovery period. Only the **Firing** state goes through the pending and recovery windows; **No Data** and **Error** don't. Is that expected?* -**Yes, that's expected.** The **Pending duration** and **Recovery period** are properties of the *firing episode*. They gate the ramp **into** and **out of** Firing. **No Data** and **Error** are separate evaluation outcomes. By default they aren't part of a firing episode, so there is nothing for those windows to debounce. An instance switches into (and out of) No Data or Error **immediately**. +**Yes, that's expected.** The **Pending duration** and **Recovery period** are properties of the *firing episode*. They gate the ramp **into** and **out of** Firing. **No Data** and **Error** are separate evaluation outcomes. Unless you map them to **Firing**, they aren't part of a firing episode, so there is nothing for those windows to debounce. An instance switches into (and out of) No Data or Error **immediately**. What each setting does on a no-data or error result: @@ -105,14 +107,16 @@ What each setting does on a no-data or error result: **Alert state if Error** +New rules start with this set to **Firing**. **Error** applies when the field is blank and the folder doesn't set it. + | Target | Behavior when the evaluation errors | |---|---| -| **Error** (default) | Instance switches to **Error** immediately. No pending wait, no recovery wait. | +| **Error** | Instance switches to **Error** immediately. No pending wait, no recovery wait. | | **Normal** | Instance switches to **Normal** immediately, treated as a clear (so a firing instance enters the Recovery period). | | **Firing** | Treated exactly like a threshold breach: it ramps through the **Pending duration**, and honors the **Recovery period** when the query recovers. | :::note[The takeaway] -If you want a no-data or error condition to be **debounced by the same Pending duration and Recovery period as a threshold breach**, set **Alert state if No data** / **Alert state if Error** to **Firing**. Left on their default (**No Data** / **Error**), they're immediate and deliberate: a gap or a broken query shows up right away rather than waiting out a timer. +To debounce a no-data or error condition with the same **Pending duration** and **Recovery period** as a threshold breach, set **Alert state if No data** or **Alert state if Error** to **Firing**. Set to **No Data** or **Error**, they switch immediately, so a gap or a broken query shows up right away instead of waiting out a timer. ::: :::tip @@ -121,7 +125,7 @@ Infrastructure failures (a query timeout, an unreachable source, or any error th ## Other behaviors you might notice -- **Transient blips on a firing alert.** A firing instance only *rides through* a momentary No Data or Error gap when that state is mapped to **Firing**. If No Data / Error are left on their defaults, a firing instance switches to **No Data** / **Error** on the next bad evaluation; it does not stay "Firing" through the gap. +- **Transient blips on a firing alert.** A firing instance only *rides through* a momentary No Data or Error gap when that state is mapped to **Firing**. If No Data or Error is mapped to its own state, a firing instance switches to **No Data** or **Error** on the next bad evaluation; it does not stay "Firing" through the gap. - **A series that disappears entirely.** When a whole series stops appearing in the query results (a host is decommissioned, a metric is dropped), KloudMate waits a short grace window (about **two evaluation intervals**) and then treats the vanished instance as resolved and closes it. This is distinct from **No Data**, which is the query *running* and returning nothing. To alert on the disappearance instead of closing it quietly, turn on [Instance Absence Detection](../instance-absence-detection/). - **Multi-instance rules.** A rule's overall state reflects its instances: if any instance is firing (or recovering), the rule reads as **Firing**; otherwise it surfaces the most significant instance state. Each instance still runs its own lifecycle independently. - **Silences and maintenance windows don't change state.** They gate the outbound *notification*, not the lifecycle. A silenced instance keeps evaluating and transitioning, and its state changes still land in history; only the notification is withheld. See [Silences](../silences/) and [Maintenance Windows](../maintenance-windows/). diff --git a/src/content/docs/docs/alerts/annotations-and-severity.mdx b/src/content/docs/docs/alerts/annotations-and-severity.mdx index 08ee3614..4360bd62 100644 --- a/src/content/docs/docs/alerts/annotations-and-severity.mdx +++ b/src/content/docs/docs/alerts/annotations-and-severity.mdx @@ -17,21 +17,22 @@ Annotation values support **Liquid templating**, so you can pull live data from Annotations live in the **Responder context** section of the alert rule editor. The pre-defined annotation keys are: - **Severity:** free-form severity string, for example `sev1`, `critical`, or `p1`. Plain text or a Liquid template. -- **Summary:** the alert headline in notifications. Supports templates. - **Dashboard:** pick a workspace dashboard to link from the notification. - **Panel:** when a dashboard is picked, narrows the link to a specific panel. +- **Title:** the notification headline, in place of the automatic title. Plain text or a Liquid template. See [Set a custom notification title](#set-a-custom-notification-title). +- **Summary:** body text included in notifications. Supports templates. - **Playbook URL:** link to the runbook responders should follow. Supports templates. -Any other key is a **custom annotation**. Click **Add Annotation** to add one. +Any other key is a **custom annotation**. Custom annotations are available only in Advanced mode, where you add them with **Add annotation**. ## Add a custom annotation -1. **Open the rule editor.** Scroll to **Responder context** and expand **Custom annotations**. +1. **Open the rule in Advanced mode.** Editing an existing rule opens it in Advanced mode. For a new rule, click **Advanced mode** first. In **Add alert details**, expand **Custom annotations**. -2. **Click Add Annotation.** +2. **Click Add annotation.** -3. **Provide a key.** Use any string, for example `service_owner`, `region`, or `runbook_section`. +3. **Provide a key.** Use any key except the pre-defined ones, for example `service_owner`, `region`, or `runbook_section`. 4. **Provide a value.** This can be static text (`payments-team`) or a Liquid template (`{{ labels.service }} is degraded`). @@ -47,7 +48,7 @@ You can interpolate live alert data into any annotation value with the `{{ }}` s "labels": { "service": "checkout-api", "env": "prod" - // ...plus any user-defined label keys from query dimensions or folders + // ...the rule's labels plus the series labels from the query }, "state": { "current_state": "Alerting", @@ -64,6 +65,8 @@ You can interpolate live alert data into any annotation value with the `{{ }}` s } ``` +`labels` holds the rule's own labels merged with the labels on the series. If both use the same key, the series value wins. + ### Common references - `{{ labels.service }}`: the value of the `service` label on the firing instance. @@ -84,22 +87,49 @@ When the alert fires for `web-server-01` at 95%, the notification reads: *Host w ## Testing a template -Click **Test template** on any templated value field to preview how it renders: +To preview how a template renders, click the edit icon in any templated field. The template editor opens with your current template loaded. + +1. Edit the sample labels, state, and rule JSON the template renders against. +2. Click **Test** to preview the rendered output. Any parse errors are shown so you can fix them before saving. +3. Click **Save** to put the template back in the field, then save the rule. -- It opens with your current template loaded. -- Edit the sample labels, state, and rule JSON the template renders against. -- Click **Test** to preview the rendered output. Any parse errors are shown so you can fix them before saving. +![Template editor with a test result](./images/annotation-template-editor.png) -Testing is optional; KloudMate doesn't validate templates on save. If a template can't render at notification time, KloudMate falls back to the raw template string rather than dropping the notification. +Testing is optional; KloudMate doesn't validate templates on save. If a template can't render at notification time, KloudMate uses the raw template string instead, so the notification still goes out. **Title** is the exception, as described below. ### Failure mode - A broken template stays in the value field as-is when you save. - At render time, a parse failure makes that single annotation surface the raw template text instead of an evaluated value. - Other annotations on the same alert keep rendering normally. +- **Title** doesn't fall back to raw text. If it renders empty, or still contains `{{` or `{%`, the notification uses the automatic title. This fail-soft behavior is intentional: a typo shouldn't silence a real incident. +## Set a custom notification title + +A custom title gives the alert a readable headline in every channel. **Title** is an optional field in **Responder context**, in both Simple and Advanced mode, and it takes plain text or a Liquid template. + +![Title field with a template](./images/custom-notification-title.png) + +The title replaces the automatic title in the email subject, the Slack and Microsoft Teams message, the Jira summary and heading, the SNS subject, the KloudMate Incidents incident title, and the webhook payload's `group.title`. It also names the group on **Alerts → Groups**, set when the group opens. The instance count is added to the end, for example `- 3 instances`. + +The title is used only when it renders the same for every instance in the group, and every rule in the group has the same title. Build it from labels that are the same across the group, such as a service or a namespace. A value that differs between instances, such as a pod name, a host name, or `state.value`, gives each instance a different title. Notifications then use the automatic title, and the group on **Alerts → Groups** keeps the alert's name. + +For example, with a [routing rule](../routing-rules/) that groups by `k8s_namespace_name`, set **Title** to: + +```liquid +Memory pressure in {{ labels.k8s_namespace_name }} +``` + +When three instances in the `payments` namespace are firing, the title reads `Memory pressure in payments - 3 instances`. + +![Notification using a custom title](./images/custom-title-notification.png) + +The template can use `labels.*` (the rule's labels plus the series labels), `state.value`, `state.values.*`, `rule.name`, and `rule.description`. If it renders empty, or still contains `{{` or `{%` because the template didn't render, the automatic title is used. + +The automatic title for a single rule is the alert name with its shared label values. For several rules grouped by labels, it's the group-by values with alert and instance counts. For an auto-correlated group, it's the correlation title with the instance count. + ## Dynamic severity Severity flows out of the reserved `severity` annotation. It's a string that downstream notification channels and incident-management tools use to prioritize the alert. Combine Liquid with `if` / `elsif` to compute severity from the firing value. @@ -124,7 +154,7 @@ At notification time, KloudMate evaluates the template against the firing alert' Earlier versions of KloudMate routed by **notification tags** on the rule. Tags are gone now, replaced by: -- **Labels:** auto-derived from query dimensions and folders. These are what [Routing Rules](../routing-rules/) match against. +- **Labels:** the labels you add to the rule with **Add label**, plus labels from query dimensions and folders. These are what [Routing Rules](../routing-rules/) match against. - **Annotations:** human-readable context that flows into the notification. - **Severity:** the reserved annotation key, free-form, optionally Liquid-templated. diff --git a/src/content/docs/docs/alerts/auto-rca.mdx b/src/content/docs/docs/alerts/auto-rca.mdx index 552abb9e..c9d6c8fb 100644 --- a/src/content/docs/docs/alerts/auto-rca.mdx +++ b/src/content/docs/docs/alerts/auto-rca.mdx @@ -26,11 +26,11 @@ Auto-RCA runs only once per alert group, when the group is first opened. Alerts ## Enable Auto-RCA on a routing rule -1. Open **Alerts → Routing Rules** and edit the rule you want to enrich. +1. Open **Alerts → Routing rules** and edit the rule you want to enrich. 2. Scroll to the **Auto-RCA** section. -3. Toggle **Auto-RCA** on. +3. Turn on **Enable Auto-RCA**. 4. Set the **Delay** if the default 5 minutes isn't right. A shorter delay surfaces answers faster; a longer one captures more alerts before the investigation runs. -5. Save. +5. Click **Save rule**. Every group this rule opens from now on triggers an investigation after the configured delay. diff --git a/src/content/docs/docs/alerts/create-alerts.mdx b/src/content/docs/docs/alerts/create-alerts.mdx index 144fcce0..c4cd2f6a 100644 --- a/src/content/docs/docs/alerts/create-alerts.mdx +++ b/src/content/docs/docs/alerts/create-alerts.mdx @@ -9,23 +9,23 @@ An alert watches a query, evaluates a condition, and when the condition holds lo ## Getting started -Open the **Alerts** section from the left navigation. +Open **Alerts → Rules**. -![Alerts list](./images/setting-up-kloudmate-alarms-1.png) +![The Rules tab listing alert rules with their state, name, and description](./images/setting-up-kloudmate-alarms-1.png) -The **Alerts** screen lists your alert rules with their current state, name, and description. You can group rules into [Folders](../folders/). +The **Rules** tab lists your alert rules with their current state, name, and description. You can group rules into [Folders](../folders/). Select a rule's name to open it. From the **more options (⋯)** icon on any rule, you can: - **Edit** the rule configuration - **Duplicate** the rule -- **Move to folder** to move the rule into a different [folder](../folders/) +- **Move to folder…** to move the rule into a different [folder](../folders/) - **Export as JSON** to copy the rule into another workspace. See [Export and Import Alerts](../export-and-import/) -- **View state history** for the rule +- **State history** to see the rule's past state changes - **Pause Evaluation** or **Pause Notifications** - **Delete** the rule -![Alert row actions](./images/setting-up-kloudmate-alarms-1.jpeg) +![A rule's more options menu with Edit, Duplicate, Move to folder, Export as JSON, State history, Resume Evaluation, Pause Notifications, and Delete](./images/setting-up-kloudmate-alarms-1.jpeg) **Pause Notifications** creates a temporary [silence](../silences/) scoped to this alert: the rule keeps evaluating, but KloudMate suppresses its notifications until the silence expires. While it's paused, the rule is marked **Silenced**; view or end the pause from **Alerts → Silences**. Add matchers to limit it to specific instances. @@ -33,7 +33,7 @@ For the key concepts, see the [Alerts Overview](../). ## Creating a new alert -Click **Create Alert**. A dialog appears with three ways to create an alert: +Click **Create alert**, then choose how to start: ![Create Alert dialog](./images/create-alarm-dialog.png) @@ -46,51 +46,96 @@ Click **Create Alert**. A dialog appears with three ways to create an alert: Instead of building an alert from scratch, start from a pre-configured template that covers a common monitoring scenario. 1. In the **Create Alert** dialog, select **From Template**. -2. Click the **Select a template** dropdown and choose a template that matches your monitoring needs. +2. Open the **Template** dropdown and choose a template that matches your monitoring needs. ![Template selection dropdown](./images/from-template-dropdown.png) -3. Click **Create Alert**. The alert appears in the **Alerts** list. -4. To open and configure it, click the menu next to the alert and select **Edit**. +3. Click **Create Alert**. The rule is saved right away and appears on the **Rules** tab. +4. To configure it, click the menu next to the rule and select **Edit**. 5. The alert opens pre-configured with the query, aggregation, and threshold from the template. Review it and adjust any filters to match your environment. 6. Click **Save** or **Save & Close** when you're done. ### Using AI -The KloudMate assistant generates the queries and thresholds from a plain-English prompt. +**KloudMate Builder** drafts an alert from a plain-English description and fills in the alert editor for you. Nothing is saved until you click **Save**. 1. In the **Create Alert** dialog, select **Using AI**. -2. A text box appears. Describe the alert you want to create. +2. Describe the alert you want to create. ![Using AI prompt](./images/using-ai-prompt.png) -3. Click **Create Alert**. KloudMate generates the alert configuration from your description. -4. To review or adjust the settings, click the menu next to the alert and select **Edit**. +3. Click **Create Alert**. KloudMate Builder opens with your description as a draft message. + +![Builder with a drafted alert description](./images/using-ai-builder-draft.png) + +4. Send the message. The Builder may ask follow-up questions before it fills in the rule in the alert editor. A draft that Simple mode can't represent, such as one with several queries or expressions, opens in Advanced mode. +5. Review the query, condition, and evaluation settings, and change anything that doesn't match your environment. +6. Click **Save**. ### From Scratch -To build a fully custom alert, select **From Scratch** in the **Create Alert** dialog and click **Create Alert**. +Select **From Scratch** in the **Create Alert** dialog and click **Create Alert**. The alert editor opens in Simple mode. -This opens the alert creation form, where you choose a data source, configure the metric or query to monitor, and define the alert condition on a single page. +- **Simple mode** builds the rule from one query and one condition, on a single page. It's the only mode with the **Detection method** toggle for Anomaly and Forecast alerts. See [Build an alert in Simple mode](#build-an-alert-in-simple-mode). +- **Advanced mode** lets you add more queries and combine them with math, reduce, and condition expressions. It's also the only mode with custom annotations. See [Build an alert in Advanced mode](#build-an-alert-in-advanced-mode). -Create more queries and expressions with the **Add Query** and **Add Expression** buttons. KloudMate assigns each one a letter, such as **A**, **B**, or **C**, and you can duplicate any block with its copy icon. +To switch, click **Advanced mode**. You can't switch back to Simple mode afterward. Editing or duplicating an existing rule always opens it in Advanced mode. + +## Build an alert in Simple mode + +Simple mode puts the whole rule on one page. + +![Simple mode alert editor](./images/simple-mode-editor.png) + +1. In **What to monitor**, choose a data source and set up the query. The query fields are the same as in [Advanced mode](#1-setup-query-conditions-and-expressions). Click **Run query** to chart the result. +2. In **Alert when**, set the condition. For a **Threshold**, pick a reduction, a comparison, and a threshold value. To alert on unusual values or a trend instead, [choose a detection method](#choose-a-detection-method). Click **Preview alerts** to check the result. +3. In **Evaluation settings**, pick a folder and set how the rule is evaluated. The fields are described in [Configure evaluation settings](#2-configure-evaluation-settings). +4. In **Alert details**, enter an **Alert name** and a description. Expand **Responder context** to add annotations such as a severity, a title, or a summary. See [Add alert details](#3-add-alert-details). +5. Expand **Labels** and add the labels you want routing rules to match on. See [Notifications](#4-notifications). +6. Click **Save**, or **Save & Close** to save and return to the **Rules** tab. + +### Choose a detection method + +The **Alert when** section sets the firing condition with a **Detection method** toggle: + +- **Threshold:** the classic fixed rule. Pick a reduction (such as `mean` or `max`), a comparison, and a value; the alert fires when the reduced value crosses it. +- **Anomaly:** KloudMate learns the metric's normal range for each entity and alerts when a value moves well outside it, with no threshold to set. Choose a **Sensitivity** (High, Medium, or Low) and a **Direction** (Above, Below, or Both). +- **Forecast:** KloudMate follows the recent trend and alerts before the value reaches a **Limit**, within an **Alert horizon** of 1, 4, or 7 days. Set the **Direction** toward the max or the min. Good for disks, memory, and quotas. + +![The Detection method toggle set to Anomaly, with sensitivity, direction, and a preview of the learned range](./images/detection-method-anomaly.png) + +Add a **Group by** key (such as host or service) so each entity is scored or forecast on its own baseline. The preview shows the learned range or the projected trend; click **Preview live data** to pull this workspace's own data. + +![The Detection method toggle set to Forecast, with a limit, a horizon, and a projection toward the limit](./images/detection-method-forecast.png) + +Anomaly and Forecast are the same detection [Smart Alerts](../smart-alerts/) provisions and maintains automatically for common infrastructure. Both need a plan with anomaly detection; Threshold works on any plan. + +Anomaly and Forecast rules evaluate every 5 minutes, so **Evaluate every** is fixed for them. If you leave **Pending duration** empty, it's saved as `30m`. Set **Sensitivity**, **Direction**, **Limit**, and **Alert horizon** before you save. Editing the rule opens it in Advanced mode, which doesn't have these controls. + +:::note +The **Detection method** toggle appears only in Simple mode, and only for KloudMate metric queries. Anomaly and Forecast rely on the learned baselines KloudMate builds from your metrics, which aren't available for AWS (CloudWatch) or log and trace queries. Those sources use a **Threshold** condition. +::: -To reach advanced options such as **Math expressions**, **Reduce**, and **Condition expressions**, click **Advanced mode**. +## Build an alert in Advanced mode -![Advanced mode options](./images/advanced-mode-options.png) +Advanced mode is for rules that need more than one query, or expressions that transform query results. The editor is split into steps: **Setup query conditions and expressions**, **Configure evaluation settings**, **Add alert details**, and **Notifications**, followed by a save. -The rule editor walks you through **Setup query conditions and expressions**, **Configure evaluation settings**, **Add alarm details**, and **Notifications**, then a final save. +![Advanced mode with query and expression blocks, and the Math expression, Reduce, and Condition expression options](./images/advanced-mode-options.png) ### 1. Setup query conditions and expressions +Create more queries and expressions with the **Add Query** and **Add Expression** buttons. KloudMate assigns each one a letter, such as **A**, **B**, or **C**, and you can duplicate any block with its copy icon. + #### Setting up query conditions for OpenTelemetry / KloudMate ![OpenTelemetry / KloudMate query setup](./images/setting-up-kloudmate-alarms-2.png) - **Data Set:** select the dataset you want to retrieve from your data source. - **Metric to Aggregate:** select the metric you want to monitor from that dataset. +- **Aggregation:** choose the function applied to the metric, such as `Avg` or `Rate`. Click **Customize aggregation** for temporal and spatial aggregation controls. See [Metrics Aggregations](../../visualize-data/explore/metrics-aggregations/). - **Group By:** enter the attributes used to group the data points. - **Filters:** add filters to narrow the retrieved data points. +- **Ranking:** control how the series are ordered. OpenTelemetry users can also use **Prometheus query language** to retrieve data and configure alerts. @@ -115,35 +160,15 @@ Query time ranges support the following: - **Supported values:** the same units and keywords used in dashboards - **Examples:** `now`, `now-5m` -#### Choose a detection method - -In Simple mode, the **Alert when** section sets the firing condition with a **Detection method** toggle: - -- **Threshold:** the classic fixed rule. Pick a reduction (such as `mean` or `max`), a comparison, and a value; the alert fires when the reduced value crosses it. -- **Anomaly:** KloudMate learns the metric's normal range for each entity and alerts when a value moves well outside it, with no threshold to set. Choose a **Sensitivity** (High, Medium, or Low) and a **Direction** (Above, Below, or Both). -- **Forecast:** KloudMate follows the recent trend and alerts before the value reaches a **Limit**, within an **Alert horizon** of 1, 4, or 7 days. Set the **Direction** toward the max or the min. Good for disks, memory, and quotas. - -![The Detection method toggle set to Anomaly, with sensitivity, direction, and a preview of the learned range](./images/detection-method-anomaly.png) - -Add a **Group by** key (such as host or service) so each entity is scored or forecast on its own baseline. The preview shows the learned range or the projected trend; click **Preview live data** to pull this workspace's own data. - -![The Detection method toggle set to Forecast, with a limit, a horizon, and a projection toward the limit](./images/detection-method-forecast.png) - -Anomaly and Forecast are the same detection [Smart Alerts](../smart-alerts/) provisions and maintains automatically for common infrastructure. Both need a plan with anomaly detection; Threshold works on any plan. - -:::note -The **Detection method** toggle appears only for KloudMate metric queries. Anomaly and Forecast rely on the learned baselines KloudMate builds from your metrics, which aren't available for AWS (CloudWatch) or log and trace queries. Those sources use a **Threshold** condition. -::: - #### Setting up evaluation expressions Expressions let you apply logic to query results. Reference any query or expression by its letter, such as **A**, **B**, or **C**. An expression can be passed as a parameter only when multiple expressions are configured. Choose from these expression types: -- **Math Expression:** enter a mathematical expression to apply to a query or expression, such as `$A+1`, `$A<$B`, or `$A && $C`. See [Alert Expressions](../expressions/). +- **Math expression:** enter a mathematical expression to apply to a query or expression, such as `$A+1`, `$A<$B`, or `$A && $C`. See [Alert Expressions](../expressions/). - **Reduce:** aggregate a query or expression into a single number with a function, then pick the target from the **Input** dropdown. Available functions include `mean()`, `max()`, `min()`, `sum()`, `last()`, and `count()`. -- **Condition Expression:** pick a function and a query or expression, then choose a condition and a threshold to evaluate against. You can add multiple conditions and combine them with **AND** or **OR**. +- **Condition expression:** pick a function and a query or expression, then choose a condition and a threshold to evaluate against. You can add multiple conditions and combine them with **AND** or **OR**. Click **Run Queries** to execute everything you've configured. @@ -153,9 +178,11 @@ To avoid the **NoData** issue when a single alert uses multiple queries, use the ### 2. Configure evaluation settings -Pick a **Folder** to organize the rule and inherit shared defaults: select an existing folder, or type a new name to create one inline. The folder's **Evaluate every**, **No data state**, and **Eval error state** flow into the rule as defaults you can override per field. See [Folders](../folders/). +In Simple mode, these fields are in **Evaluation settings**, without **Alert condition**. + +Pick a **Folder** to organize the rule: select an existing folder, or type a new name to create one inline. A folder can set defaults for **Evaluate every**, **Alert state if No data**, **Alert state if Error**, **Alert when an instance stops reporting**, and **Auto-close after**. See [Folders](../folders/). -![Evaluation settings](./images/setting-up-kloudmate-alarms-4.png) +![Evaluation settings with the folder picker, timing fields, no-data and error states, and the instance absence toggle](./images/setting-up-kloudmate-alarms-4.png) - **Alert condition:** the query or expression that triggers the alert, such as **A**, **B**, or **C**. - **Evaluate every:** how often the alert condition is evaluated (for example, `60s` or `1m`). @@ -163,7 +190,7 @@ Pick a **Folder** to organize the rule and inherit shared defaults: select an ex - **Recovery period:** how long the condition must stay within threshold before the rule resolves (for example, `5m`). This stops a flapping metric from resolving and immediately re-firing. While the rule waits out this window, the instance shows as **Recovering**: still firing, not yet back to Normal. Leave empty to resolve as soon as the condition clears. - **Alert state if No data:** which state the alert enters when the query returns no data points. Options: **Firing**, **No Data**, **Normal**, or **Error**. - **Alert state if Error:** which state the alert enters when a query returns an error. Options: **Firing**, **Error**, or **Normal**. -- **Alert when an instance stops reporting:** track each instance the query returns, and alert when one goes silent while the others keep reporting. Turning this on also sets **Alert state if No data** to **Firing**. An **Auto-close after** field appears alongside it, controlling how long a silent instance stays tracked. See [Instance Absence Detection](../instance-absence-detection/). +- **Alert when an instance stops reporting:** track each instance the query returns, and alert when one goes silent while the others keep reporting. Turning this on also sets **Alert state if No data** to **Firing**. Set **Auto-close after** to control how long a silent instance stays tracked. See [Instance Absence Detection](../instance-absence-detection/). :::note[How “Firing” interacts with the pending duration] When **Alert state if No data** or **Alert state if Error** is set to **Firing**, the alert doesn't fire the instant data goes missing or a query errors. It fires only after the condition has held for the **Pending duration** above, so a brief gap or a transient error won't notify anyone, and a series that's already firing rides through the blip without resetting. Set the **Pending duration** to `0` to fire immediately instead. @@ -175,15 +202,15 @@ For the full lifecycle, and how **Pending duration**, **Recovery period**, and t Click **Preview alerts** to run the query immediately and check the result. -:::tip -If the rule belongs to a folder with shared defaults, **Evaluate every**, **Alert state if No data**, and **Alert state if Error** show placeholder values inherited from the folder. Leave them blank to keep inheriting, or type a value to override. **Reset to folder default** returns an overridden field to inheriting. +:::tip[Folder defaults on a new rule] +A new rule starts with **Evaluate every** set to `1m`, **Alert state if No data** set to **No Data**, and **Alert state if Error** set to **Firing**. These values override the folder's defaults until you click **Reset to folder default** on each field. On an existing or duplicated rule, a blank field inherits from the folder. **Alert when an instance stops reporting** and **Auto-close after** inherit from the folder on every rule until you change them. ::: -### 3. Add alarm details +### 3. Add alert details -![Alert details](./images/setting-up-kloudmate-alarms-5.png) +![Alert details with the name, description, and Responder context fields, including Title](./images/setting-up-kloudmate-alarms-5.png) -Set the alert's name and description, then fill in the responder context: +Set the alert's name and description, then fill in the responder context. In Simple mode, these fields are in the **Alert details** section. - **Alert name:** a name for the alert. - **Description:** a short description of the alert's purpose. @@ -191,34 +218,42 @@ Set the alert's name and description, then fill in the responder context: **Responder context** holds the annotations responders see when the notification lands. - **Severity:** free-form severity (for example, `sev1`, `critical`, or `p1`). Supports Liquid templates, so severity can depend on the firing value. +- **Dashboard:** optional dashboard link included with the notification. +- **Panel:** after you pick a dashboard, narrows the link to a specific panel. +- **Title:** replaces the automatic notification title. Supports templates. See [Set a custom notification title](../annotations-and-severity/#set-a-custom-notification-title). - **Summary:** multiline message included in notifications. Supports templates. -- **Dashboard:** optional dashboard link surfaced with the notification. -- **Panel:** when you pick a dashboard, narrows the link to a specific panel. -- **Playbook URL:** optional runbook URL. +- **Playbook URL:** optional runbook URL. Supports templates. -Open **Custom annotations** to add your own key-value pairs (for example, `service_owner` or `region`). Values support Liquid templates. See [Annotations & Severity](../annotations-and-severity/). +In Advanced mode, open **Custom annotations** and click **Add annotation** to add your own key-value pairs (for example, `service_owner` or `region`). Values support Liquid templates. Simple mode doesn't have custom annotations. See [Annotations & Severity](../annotations-and-severity/). ### 4. Notifications -The Notifications step controls how this alert flows into the grouping engine. Routing rules match on **labels**, not free-form tags: +The Notifications step controls how this alert flows into the grouping engine. In Simple mode, add labels in the **Labels** section. Routing rules match on **labels**, not free-form tags: - **Labels:** key/value pairs attached to each alert this rule fires. Add them with **Add label**, or leave the list empty. Routing rules match on these labels, plus the reserved `alarm_id`, `alarm_rule_folder_id`, and per-instance query labels, to decide which channels notify and how alerts group. - **Routing:** [Routing Rules](../routing-rules/) in **Alerts → Routing rules** match alerts by label and send them to one or more notification channels. - **Severity:** flows through the reserved `severity` annotation from the previous step; downstream tools use it to prioritize. +![Notifications step with a service label set to payment-gateway](./images/setting-up-kloudmate-alarms-6.png) + If you're migrating a rule that used notification tags, it keeps working; routing now matches on labels instead. ### 5. Save the alert -Click **Save** to save the alert, or **Save & Close** to save and return to the **Alerts** screen. A confirmation appears once the alert is created. +Click **Save** to save the alert, or **Save & Close** to save it and return to the **Rules** tab. ## Viewing an alert -To open an alert, click the menu next to it and select **View**. The detail page has these tabs: +To open an alert, select its name on the **Rules** tab. The detail page has these tabs: -![Alert detail overview](./images/alarm-detail-overview.png) +![Alert detail page with the Overview, Instances, Blast radius, History, and Rule tabs](./images/alarm-detail-overview.png) - **Overview:** instance states, breaching instances with their labels, reason, and duration, plus recent state transitions. - **Instances:** the full list of alert instances and their current states. +- **Blast radius:** the resources the alert's instances map to, and what those resources depend on. - **History:** the state-change history over time. - **Rule:** the alert configuration and query definition. + +![Blast radius tab on an alert rule](./images/alarm-detail-blast-radius.png) + +The instance tables on **Overview** and **Instances** also show each instance's last evaluated value and when it was **Last seen**. diff --git a/src/content/docs/docs/alerts/export-and-import.mdx b/src/content/docs/docs/alerts/export-and-import.mdx index 3b92f4ee..247f7e94 100644 --- a/src/content/docs/docs/alerts/export-and-import.mdx +++ b/src/content/docs/docs/alerts/export-and-import.mdx @@ -11,9 +11,9 @@ Importing creates new rules, so it requires the same permission as creating an a ## Export a rule or a folder -To export a single rule, open the **more options (⋯)** menu on its row and select **Export as JSON**. +To export a single rule, go to **Alerts → Rules**, open the **more options (⋯)** menu on the rule's row, and select **Export as JSON**. -To export an entire folder, switch the Alerts list to **Folder view**, open the folder header's kebab menu, and select **Export alerts as JSON**. The export includes every rule in the folder, including any that the search box or state filter is hiding. +To export an entire folder, switch the **Rules** tab to **Folder view**, open the folder header's kebab menu, and select **Export alerts as JSON**. The export includes every rule in the folder, including any that the search box or state filter is hiding. ## What is not copied diff --git a/src/content/docs/docs/alerts/folders.mdx b/src/content/docs/docs/alerts/folders.mdx index 522286f2..c9a026f7 100644 --- a/src/content/docs/docs/alerts/folders.mdx +++ b/src/content/docs/docs/alerts/folders.mdx @@ -7,21 +7,22 @@ sidebar: Folders organize related alert rules and let member rules inherit shared evaluation defaults, the same grouping pattern dashboards use. -On the **Alerts** list, switch between a flat **List view** and a grouped **Folder view**. In Folder view, rules are grouped under their folder; rules without one appear under **Ungrouped**. +On **Alerts → Rules**, switch between a flat **List view** and a grouped **Folder view**. In Folder view, rules are grouped under their folder, and rules without one appear under **Ungrouped**. Rules that [Smart Alerts](../smart-alerts/) manages appear under **Smart Alerts** until you move them into a folder. -![Alerts list in folder view](./images/alerts-folder-view.png) +![The Rules tab in Folder view, with rules grouped under their folders](./images/alerts-folder-view.png) -There's no separate Folders page or sidebar entry; everything happens from the Alerts list. +There's no separate Folders page. You manage folders from the **Rules** tab and the rule editor. ## Create a folder You create folders inline from the alert rule editor's **Folder** picker; there's no separate "New folder" button. 1. Open an alert rule (create a new one or edit an existing one). -2. In the **Configure evaluation settings** section, click the **Folder** dropdown. +2. In **Configure evaluation settings** (**Evaluation settings** in Simple mode), click the **Folder** dropdown. 3. Type a new folder name, then select the `+ Create ""` option that appears. 4. KloudMate creates the folder and assigns the current rule to it. -5. To set folder-level defaults (interval, no-data state, eval-error state), switch to **Folder view** on the Alerts list, open the folder's kebab menu, and select **Edit folder**. +5. Save the rule. A folder appears in Folder view only after it contains at least one saved rule. +6. To set folder defaults, switch to **Folder view** on the **Rules** tab, open the folder's kebab menu, and select **Edit folder**. ## Edit folder defaults @@ -29,22 +30,28 @@ In Folder view, each folder header row has a kebab menu with **Edit folder**, ** **Edit folder** opens a dialog with the folder's settings: +![Folder defaults dialog](./images/folder-edit-dialog.png) + | Field | What it controls | |---|---| | **Name** | Required, unique within the workspace. | | **Description** | Optional. | | **Evaluate every** | Default evaluation interval (for example `60s`, `1m`, or `2h`). Members inherit when blank. | -| **No data state** | Default state when queries return no data. Options: `Normal`, `Alerting`, `NoData`. | -| **Eval error state** | Default state when evaluation errors out. Options: `Normal`, `Alerting`, `Error`. | +| **No data state** | Default state when queries return no data. Options: **Alerting**, **Normal**, **No Data**, or **Error**. | +| **Eval error state** | Default state when evaluation errors out. Options: **Alerting**, **Normal**, **No Data**, or **Error**. | +| **Instance stops reporting** | Whether members alert when an instance stops reporting. Options: **Alert** or **Don't alert**. **Alert** also needs **No data state** set to **Alerting**, on the folder or on each member rule. See [Instance Absence Detection](../instance-absence-detection/). | +| **Auto-close after** | How long a silent instance stays tracked before it closes on its own, from `5m` to `72h` (for example `30m` or `24h`). | Member alerts inherit these defaults unless they set their own value. Leave a folder's fields blank to make it organizational-only. ## Move rules into a folder -Move rules from the rule editor, or in bulk from the list: +You move rules one at a time, from the **Rules** tab or from the rule editor: + +- **From the Rules tab:** open the rule's more options (⋯) menu and select **Move to folder…**. Choose a folder or **Ungrouped**, then click **Move**. +- **From the rule editor:** open the rule, pick the folder from the **Folder** dropdown in the **Configure evaluation settings** section, and save the rule. -- **From the rule editor:** open the rule and pick the folder from the **Folder** dropdown in the **Configure evaluation settings** section. -- **Bulk-move from the list:** select rules with the checkboxes (a toolbar appears with the selection count). Click **Move to folder…**, select a destination from the radio list (existing folders or **Ungrouped**), and confirm. +![Move to folder dialog](./images/move-to-folder-dialog.png) Moving a rule does **not** rewrite its own **Evaluate every**, **No data state**, or **Eval error state** values. Whatever the rule had before the move stays. The folder defaults only apply where the rule's field is blank. @@ -61,8 +68,10 @@ A rule's evaluation fields resolve like this: **Reset to folder default** clears an overridden field so it inherits again. A blank field keeps inheriting, so when the folder default later changes, the rule picks up the new value automatically. +New rules start with **Evaluate every** set to `1m`, **Alert state if No data** set to **No Data**, and **Alert state if Error** set to **Firing**, and those values override the folder's defaults. To inherit the folder's value instead, click **Reset to folder default** on the field. Existing and duplicated rules keep inheriting wherever a field is blank. **Alert when an instance stops reporting** and **Auto-close after** inherit from the folder on every rule, new ones included, until you set them. + :::tip -To detach a rule from its folder entirely, set its **Folder** to the ungrouped option. The rule keeps its stored evaluation values and stops inheriting. +To detach a rule from its folder entirely, set its **Folder** to **None (ungrouped)**. The rule keeps its stored evaluation values and stops inheriting. ::: ## Delete a folder diff --git a/src/content/docs/docs/alerts/images/absence-detection-settings.png b/src/content/docs/docs/alerts/images/absence-detection-settings.png new file mode 100644 index 00000000..b8e3afe7 Binary files /dev/null and b/src/content/docs/docs/alerts/images/absence-detection-settings.png differ diff --git a/src/content/docs/docs/alerts/images/advanced-mode-options.png b/src/content/docs/docs/alerts/images/advanced-mode-options.png index c21c6d55..52d66d78 100644 Binary files a/src/content/docs/docs/alerts/images/advanced-mode-options.png and b/src/content/docs/docs/alerts/images/advanced-mode-options.png differ diff --git a/src/content/docs/docs/alerts/images/alarm-detail-blast-radius.png b/src/content/docs/docs/alerts/images/alarm-detail-blast-radius.png new file mode 100644 index 00000000..91f16985 Binary files /dev/null and b/src/content/docs/docs/alerts/images/alarm-detail-blast-radius.png differ diff --git a/src/content/docs/docs/alerts/images/alarm-detail-overview.png b/src/content/docs/docs/alerts/images/alarm-detail-overview.png index 0c0e89d3..c368c4cb 100644 Binary files a/src/content/docs/docs/alerts/images/alarm-detail-overview.png and b/src/content/docs/docs/alerts/images/alarm-detail-overview.png differ diff --git a/src/content/docs/docs/alerts/images/alert-group-audit-reminder.png b/src/content/docs/docs/alerts/images/alert-group-audit-reminder.png new file mode 100644 index 00000000..c87f21f5 Binary files /dev/null and b/src/content/docs/docs/alerts/images/alert-group-audit-reminder.png differ diff --git a/src/content/docs/docs/alerts/images/alert-group-detail.png b/src/content/docs/docs/alerts/images/alert-group-detail.png index 2870afac..50f2ce68 100644 Binary files a/src/content/docs/docs/alerts/images/alert-group-detail.png and b/src/content/docs/docs/alerts/images/alert-group-detail.png differ diff --git a/src/content/docs/docs/alerts/images/alert-groups-list.png b/src/content/docs/docs/alerts/images/alert-groups-list.png index 11c53983..554a20d6 100644 Binary files a/src/content/docs/docs/alerts/images/alert-groups-list.png and b/src/content/docs/docs/alerts/images/alert-groups-list.png differ diff --git a/src/content/docs/docs/alerts/images/alerts-folder-view.png b/src/content/docs/docs/alerts/images/alerts-folder-view.png index 06f85d3b..5a7ff6bd 100644 Binary files a/src/content/docs/docs/alerts/images/alerts-folder-view.png and b/src/content/docs/docs/alerts/images/alerts-folder-view.png differ diff --git a/src/content/docs/docs/alerts/images/alerts-history-tab.png b/src/content/docs/docs/alerts/images/alerts-history-tab.png new file mode 100644 index 00000000..860e7623 Binary files /dev/null and b/src/content/docs/docs/alerts/images/alerts-history-tab.png differ diff --git a/src/content/docs/docs/alerts/images/annotation-template-editor.png b/src/content/docs/docs/alerts/images/annotation-template-editor.png new file mode 100644 index 00000000..56509ed1 Binary files /dev/null and b/src/content/docs/docs/alerts/images/annotation-template-editor.png differ diff --git a/src/content/docs/docs/alerts/images/create-alarm-dialog.png b/src/content/docs/docs/alerts/images/create-alarm-dialog.png index 781082a2..ffdcc192 100644 Binary files a/src/content/docs/docs/alerts/images/create-alarm-dialog.png and b/src/content/docs/docs/alerts/images/create-alarm-dialog.png differ diff --git a/src/content/docs/docs/alerts/images/custom-notification-title.png b/src/content/docs/docs/alerts/images/custom-notification-title.png new file mode 100644 index 00000000..163dd70a Binary files /dev/null and b/src/content/docs/docs/alerts/images/custom-notification-title.png differ diff --git a/src/content/docs/docs/alerts/images/custom-title-notification.png b/src/content/docs/docs/alerts/images/custom-title-notification.png new file mode 100644 index 00000000..b550de9d Binary files /dev/null and b/src/content/docs/docs/alerts/images/custom-title-notification.png differ diff --git a/src/content/docs/docs/alerts/images/folder-edit-dialog.png b/src/content/docs/docs/alerts/images/folder-edit-dialog.png new file mode 100644 index 00000000..889baa7c Binary files /dev/null and b/src/content/docs/docs/alerts/images/folder-edit-dialog.png differ diff --git a/src/content/docs/docs/alerts/images/from-template-dropdown.png b/src/content/docs/docs/alerts/images/from-template-dropdown.png index e7a0fe1b..662c6c48 100644 Binary files a/src/content/docs/docs/alerts/images/from-template-dropdown.png and b/src/content/docs/docs/alerts/images/from-template-dropdown.png differ diff --git a/src/content/docs/docs/alerts/images/instances-tab-dismiss.png b/src/content/docs/docs/alerts/images/instances-tab-dismiss.png new file mode 100644 index 00000000..4333b203 Binary files /dev/null and b/src/content/docs/docs/alerts/images/instances-tab-dismiss.png differ diff --git a/src/content/docs/docs/alerts/images/maintenance-window-1.png b/src/content/docs/docs/alerts/images/maintenance-window-1.png index 997fd5c0..0005bc68 100644 Binary files a/src/content/docs/docs/alerts/images/maintenance-window-1.png and b/src/content/docs/docs/alerts/images/maintenance-window-1.png differ diff --git a/src/content/docs/docs/alerts/images/maintenance-window-2.png b/src/content/docs/docs/alerts/images/maintenance-window-2.png index b33aa5f7..0e765daf 100644 Binary files a/src/content/docs/docs/alerts/images/maintenance-window-2.png and b/src/content/docs/docs/alerts/images/maintenance-window-2.png differ diff --git a/src/content/docs/docs/alerts/images/maintenance-window-3.png b/src/content/docs/docs/alerts/images/maintenance-window-3.png index 34d73982..d98c1239 100644 Binary files a/src/content/docs/docs/alerts/images/maintenance-window-3.png and b/src/content/docs/docs/alerts/images/maintenance-window-3.png differ diff --git a/src/content/docs/docs/alerts/images/move-to-folder-dialog.png b/src/content/docs/docs/alerts/images/move-to-folder-dialog.png new file mode 100644 index 00000000..5133508d Binary files /dev/null and b/src/content/docs/docs/alerts/images/move-to-folder-dialog.png differ diff --git a/src/content/docs/docs/alerts/images/routing-rules-alert-grouping.png b/src/content/docs/docs/alerts/images/routing-rules-alert-grouping.png index c1cab2db..3ad18e0e 100644 Binary files a/src/content/docs/docs/alerts/images/routing-rules-alert-grouping.png and b/src/content/docs/docs/alerts/images/routing-rules-alert-grouping.png differ diff --git a/src/content/docs/docs/alerts/images/routing-rules-list.png b/src/content/docs/docs/alerts/images/routing-rules-list.png index 5acb219d..63012571 100644 Binary files a/src/content/docs/docs/alerts/images/routing-rules-list.png and b/src/content/docs/docs/alerts/images/routing-rules-list.png differ diff --git a/src/content/docs/docs/alerts/images/routing-rules-suggest.png b/src/content/docs/docs/alerts/images/routing-rules-suggest.png index 0df4448a..55310dd3 100644 Binary files a/src/content/docs/docs/alerts/images/routing-rules-suggest.png and b/src/content/docs/docs/alerts/images/routing-rules-suggest.png differ diff --git a/src/content/docs/docs/alerts/images/setting-up-kloudmate-alarms-1.jpeg b/src/content/docs/docs/alerts/images/setting-up-kloudmate-alarms-1.jpeg index e3b77572..98e7fc68 100644 Binary files a/src/content/docs/docs/alerts/images/setting-up-kloudmate-alarms-1.jpeg and b/src/content/docs/docs/alerts/images/setting-up-kloudmate-alarms-1.jpeg differ diff --git a/src/content/docs/docs/alerts/images/setting-up-kloudmate-alarms-1.png b/src/content/docs/docs/alerts/images/setting-up-kloudmate-alarms-1.png index f7d3b5b2..2d5eb6e1 100644 Binary files a/src/content/docs/docs/alerts/images/setting-up-kloudmate-alarms-1.png and b/src/content/docs/docs/alerts/images/setting-up-kloudmate-alarms-1.png differ diff --git a/src/content/docs/docs/alerts/images/setting-up-kloudmate-alarms-2.png b/src/content/docs/docs/alerts/images/setting-up-kloudmate-alarms-2.png index 7fcb331c..ced7a9be 100644 Binary files a/src/content/docs/docs/alerts/images/setting-up-kloudmate-alarms-2.png and b/src/content/docs/docs/alerts/images/setting-up-kloudmate-alarms-2.png differ diff --git a/src/content/docs/docs/alerts/images/setting-up-kloudmate-alarms-4.png b/src/content/docs/docs/alerts/images/setting-up-kloudmate-alarms-4.png index 6cb0f520..34d29a22 100644 Binary files a/src/content/docs/docs/alerts/images/setting-up-kloudmate-alarms-4.png and b/src/content/docs/docs/alerts/images/setting-up-kloudmate-alarms-4.png differ diff --git a/src/content/docs/docs/alerts/images/setting-up-kloudmate-alarms-5.png b/src/content/docs/docs/alerts/images/setting-up-kloudmate-alarms-5.png index 14350afa..cf6b452a 100644 Binary files a/src/content/docs/docs/alerts/images/setting-up-kloudmate-alarms-5.png and b/src/content/docs/docs/alerts/images/setting-up-kloudmate-alarms-5.png differ diff --git a/src/content/docs/docs/alerts/images/setting-up-kloudmate-alarms-6.png b/src/content/docs/docs/alerts/images/setting-up-kloudmate-alarms-6.png new file mode 100644 index 00000000..61d09568 Binary files /dev/null and b/src/content/docs/docs/alerts/images/setting-up-kloudmate-alarms-6.png differ diff --git a/src/content/docs/docs/alerts/images/silence-from-group.png b/src/content/docs/docs/alerts/images/silence-from-group.png new file mode 100644 index 00000000..fc8f1d17 Binary files /dev/null and b/src/content/docs/docs/alerts/images/silence-from-group.png differ diff --git a/src/content/docs/docs/alerts/images/silenced-by-rule.png b/src/content/docs/docs/alerts/images/silenced-by-rule.png new file mode 100644 index 00000000..6407ce56 Binary files /dev/null and b/src/content/docs/docs/alerts/images/silenced-by-rule.png differ diff --git a/src/content/docs/docs/alerts/images/silences-list.png b/src/content/docs/docs/alerts/images/silences-list.png index de1b533c..4e13dfae 100644 Binary files a/src/content/docs/docs/alerts/images/silences-list.png and b/src/content/docs/docs/alerts/images/silences-list.png differ diff --git a/src/content/docs/docs/alerts/images/simple-mode-editor.png b/src/content/docs/docs/alerts/images/simple-mode-editor.png new file mode 100644 index 00000000..91f442f2 Binary files /dev/null and b/src/content/docs/docs/alerts/images/simple-mode-editor.png differ diff --git a/src/content/docs/docs/alerts/images/smart-alerts-detectors.png b/src/content/docs/docs/alerts/images/smart-alerts-detectors.png index bdff3f82..5adb7d1b 100644 Binary files a/src/content/docs/docs/alerts/images/smart-alerts-detectors.png and b/src/content/docs/docs/alerts/images/smart-alerts-detectors.png differ diff --git a/src/content/docs/docs/alerts/images/smart-alerts-settings.png b/src/content/docs/docs/alerts/images/smart-alerts-settings.png index 467ebe7f..5a667c0b 100644 Binary files a/src/content/docs/docs/alerts/images/smart-alerts-settings.png and b/src/content/docs/docs/alerts/images/smart-alerts-settings.png differ diff --git a/src/content/docs/docs/alerts/images/using-ai-builder-draft.png b/src/content/docs/docs/alerts/images/using-ai-builder-draft.png new file mode 100644 index 00000000..5f89a62a Binary files /dev/null and b/src/content/docs/docs/alerts/images/using-ai-builder-draft.png differ diff --git a/src/content/docs/docs/alerts/images/using-ai-prompt.png b/src/content/docs/docs/alerts/images/using-ai-prompt.png index 63b58162..4b217dd4 100644 Binary files a/src/content/docs/docs/alerts/images/using-ai-prompt.png and b/src/content/docs/docs/alerts/images/using-ai-prompt.png differ diff --git a/src/content/docs/docs/alerts/index.mdx b/src/content/docs/docs/alerts/index.mdx index 510f495e..d0c9bfab 100644 --- a/src/content/docs/docs/alerts/index.mdx +++ b/src/content/docs/docs/alerts/index.mdx @@ -12,6 +12,10 @@ Alerts tell you when something needs attention: an error-rate spike, a service g This page covers the concepts behind the Alerts module. The rest of this section covers each feature in detail. +## Navigate the Alerts module + +**Alerts** opens on the **Groups** tab, where related alerts are collected into [alert groups](./alert-groups/). The **Rules** tab lists your alert rules and their [folders](./folders/), and **History** records every alert state change in the workspace. The other tabs control how alerting behaves: [Routing rules](./routing-rules/) decide where notifications go, [Silences](./silences/) and [Maintenance](./maintenance-windows/) windows suppress notifications for a set period, and [Smart Alerts](./smart-alerts/) creates and maintains rules for common infrastructure. + ## Key concepts ### Alert rule @@ -28,15 +32,15 @@ Expressions transform query output with math, reductions, or conditions. They re ### Alert labels -Labels are key-value pairs attached to each firing alert. They come from query dimensions and any folder the rule lives in, and they're what [Routing Rules](./routing-rules/) match against to decide where notifications go. KloudMate generates labels automatically. You don't enter them by hand. +Labels are key-value pairs attached to each firing alert. They come from query dimensions, the labels you add to the rule with **Add label**, and any folder the rule lives in. [Routing Rules](./routing-rules/) match against them to decide where notifications go. ### Annotations and severity -Annotations carry human-readable context (summary, runbook URL, dashboard link) into each notification. Values support Liquid templates, so you can interpolate live label and state data into the message. The reserved `severity` annotation key drives downstream routing and incident severity. See [Annotations & Severity](./annotations-and-severity/). +Annotations carry human-readable context (title, summary, runbook URL, dashboard link) into each notification. Values support Liquid templates, so you can interpolate live label and state data into the message. The reserved `severity` annotation key drives downstream routing and incident severity. See [Annotations & Severity](./annotations-and-severity/). ### Folders -Folders group related alert rules and let member rules inherit shared defaults: evaluation interval, no-data state, and eval-error state. See [Folders](./folders/). +Folders group related alert rules and let member rules inherit shared defaults: evaluation interval, no-data state, eval-error state, whether to alert when an instance stops reporting, and how long a silent instance stays tracked. See [Folders](./folders/). ### Alert groups @@ -65,7 +69,7 @@ Instead of hand-authoring thresholds, turn on curated detectors and let KloudMat 3. The condition is evaluated; if it holds for the pending duration, the rule fires. 4. The firing alert is tagged with labels and annotations and sent into the grouping engine. 5. The grouping engine matches the alert against [Routing Rules](./routing-rules/), opens or appends to an [Alert Group](./alert-groups/), and dispatches notifications to the rule's destination channels. -6. Active [Silences](./silences/) and [Maintenance Windows](./maintenance-windows/) can suppress the outbound notification at this step. The rule keeps evaluating in the background and the state change still lands in history. +6. Active [Silences](./silences/) and [Maintenance Windows](./maintenance-windows/) can suppress the outbound notification at this step. The rule keeps evaluating in the background, and the state change is still recorded on the **History** tab. ## Alert states @@ -78,6 +82,12 @@ Instead of hand-authoring thresholds, turn on curated detectors and let KloudMat For how these states transition, and how the pending duration, recovery period, and no-data or error settings shape them, see [Alert Lifecycle & States](./alert-lifecycle/). +## Review alert history + +The **History** tab lists every alert state change in the workspace, newest first, with the reason for each change and the query and expression **Values** at that moment. The total number of transitions is shown above the list. Filter by state or search by alert name to narrow the list. For example, select **Firing** and search for `checkout` to see each time a checkout alert moved to **Firing**. Select an alert's name to open its rule. + +![Alert history tab](./images/alerts-history-tab.png) + ## Next steps diff --git a/src/content/docs/docs/alerts/instance-absence-detection.mdx b/src/content/docs/docs/alerts/instance-absence-detection.mdx index d458d68e..9d679558 100644 --- a/src/content/docs/docs/alerts/instance-absence-detection.mdx +++ b/src/content/docs/docs/alerts/instance-absence-detection.mdx @@ -12,11 +12,11 @@ A threshold alert only evaluates the datapoints that arrive. When the datapoints An **instance** is a unique series identified by its distinct labels. A heartbeat metric grouped by `host_name` produces one instance per host; group by `serviceName` and `pod_name` and you get one per pod. Absence detection tracks each instance individually: it has its own state, its own history, and its own dismissal. -The setting is off by default and opt-in per rule, so existing rules don't change until you enable it. It works with any datasource, whether the data comes from the KloudMate agent or not. +The setting is off by default and opt-in, per rule or per folder, so existing rules don't change until you enable it. It works with any datasource, whether the data comes from the KloudMate agent or not. ## How it works -On every evaluation, KloudMate compares the query results against the set of instances the rule has seen. An instance missing from the results is evaluated as if the query had returned no data for it, and it moves through the normal [lifecycle](../alert-lifecycle/): **Pending** for the pending duration, then **Firing**, with the reason `instance stopped reporting; last seen `. The moment the instance reports again, it recovers through the usual path, including any recovery period. +On every evaluation, KloudMate compares the query results against the set of instances the rule has seen. An instance missing from the results is evaluated as if the query had returned no data for it, and it moves through the normal [lifecycle](../alert-lifecycle/): **Pending** for the pending duration, then **Firing**. From **Pending** onward, its reason is `instance stopped reporting; last seen `. The moment the instance reports again, it recovers through the usual path, including any recovery period. Absence detection changes what fires, not how notifications are threaded. Threading comes from the [routing rule](../routing-rules/) that matches, through its **Group-by** keys, exactly as it does for threshold alerts: @@ -27,14 +27,16 @@ Routing itself works as usual, since each instance carries its own labels. ## Turn it on -1. Create or edit an alert rule and go to **Configure evaluation settings**. +1. Create or edit an alert rule and go to **Configure evaluation settings** (**Evaluation settings** in Simple mode). 2. Turn on **Alert when an instance stops reporting**. 3. Optionally set **Auto-close after**: how long a silent instance stays tracked, and firing, before it closes on its own, which happens only while other instances are still reporting. Leave it blank to inherit the folder default, or the system default of 24 hours. It accepts durations from `5m` to `72h`, for example `30m` or `48h`. 4. Save the rule. -Turning the toggle on also sets **Alert state if No data** to **Firing**, since absence detection needs both. Turning the toggle off leaves the No-data state alone, in case you still want the rule to fire when the whole query returns nothing. +![Absence detection settings on an alert rule](./images/absence-detection-settings.png) -Both settings inherit from [folders](../folders/) exactly like the other evaluation defaults: the rule's own value wins, a blank field falls back to the folder default, and the system default applies last. Folders expose the same two settings, **Instance stops reporting** (**Alert** / **Don't alert**) and **Auto-close after**. +Absence detection runs only while **Alert state if No data** is **Firing**, so turning the toggle on sets that field to **Firing** as well. If you later change **Alert state if No data** to another state, absence detection stops. Turning the toggle off leaves the No-data state alone, in case you still want the rule to fire when the whole query returns nothing. + +Both settings inherit from [folders](../folders/): the rule's own value wins, a blank field falls back to the folder default, and the system default applies last. Folders expose the same two settings, **Instance stops reporting** (**Alert** / **Don't alert**) and **Auto-close after**. A folder set to **Alert** also needs **No data state** set to **Alerting**, either on the folder or on each rule. A new rule starts with **Alert state if No data** set to **No Data**, which overrides the folder, so click **Reset to folder default** on that field to use the folder's setting. ## Make the query window longer than the reporting interval @@ -58,8 +60,8 @@ Say every host emits a heartbeat metric once a minute, and you want to know when Here's what happens when `web-7` drops off the network at 10:03, right after its last heartbeat: - Until about 10:08, the 5-minute window still contains datapoints from `web-7`, so it counts as reporting. -- At 10:09 the window is empty for `web-7`, and the instance enters **Pending**. -- At 10:11, after the 2-minute pending duration, `web-7` starts **Firing** with the reason `instance stopped reporting; last seen 2026-08-03T10:08:12Z`. With a routing rule that doesn't group, the rule's notification thread lists `host_name=web-7`. +- At 10:09 the window is empty for `web-7`, and the instance enters **Pending** with the reason `instance stopped reporting; last seen 2026-08-03T10:08:12Z`. +- At 10:11, after the 2-minute pending duration, `web-7` starts **Firing**. With a routing rule that doesn't group, the rule's notification thread lists `host_name=web-7`. - If `web-9` goes quiet at 10:20, it fires the same way. It joins the same thread under that ungrouped rule, or opens its own under a rule grouped by `host_name`. - When `web-7` comes back, its instance resolves automatically. Nothing to clean up. @@ -67,13 +69,15 @@ That's about eight minutes after the last datapoint: the 5-minute window plus th ## The Instances tab -The **Instances** tab lists every tracked instance and when each was **Last seen**. Last seen records when the instance last appeared in query results, so with a lookback window it can read up to one window later than the instance's final datapoint. While an instance is firing for absence, its reason is `instance stopped reporting; last seen `. +The **Instances** tab lists every tracked instance and when each was **Last seen**. Last seen records when the instance last appeared in query results, so with a lookback window it can read up to one window later than the instance's final datapoint. While an instance is pending or firing for absence, its reason is `instance stopped reporting; last seen `. + +![An instance that stopped reporting, with Dismiss](./images/instances-tab-dismiss.png) ### Dismiss an instance that was terminated on purpose -Autoscalers scale in and hosts get decommissioned. When an instance went away on purpose, close its alert instead of waiting out the auto-close window. Admins can **Dismiss** any instance that stopped reporting. +Autoscalers scale in and hosts get decommissioned. When an instance went away on purpose, close its alert instead of waiting out the auto-close window. With the **Developer** role, you can **Dismiss** any instance that stopped reporting, including one that's still **Pending**. -Dismissal forgets the instance; it isn't a mute. If the instance ever reports again, tracking resumes automatically, so a dismissal can't permanently hide a live host. The instance's alert closes right away, and the alert group and any linked ticket close within one evaluation interval. Dismissing an instance that's already been dismissed changes nothing. +Dismissal forgets the instance; it isn't a mute. If the instance ever reports again, tracking resumes automatically, so a dismissal can't permanently hide an instance that comes back. Dismiss removes the instance right away, and the instance leaves its alert group within one evaluation interval. The group and any linked ticket resolve only if nothing else in the group is still firing. Dismissing an instance that's already been dismissed changes nothing. If the instance is coming back later, after planned maintenance or a reboot, use a [silence](../silences/) or [maintenance window](../maintenance-windows/) instead. Both apply to absence alerts like any other: the instance keeps its state, notifications are withheld, and it recovers on its own when it reports again. @@ -89,9 +93,9 @@ Every transition lands in the alert's **History** tab with a reason: | Reason | What happened | |---|---| -| `instance stopped reporting; last seen ` | The instance went silent and started firing. | +| `instance stopped reporting; last seen ` | The instance went silent and moved to **Pending** or **Firing**. | | `auto-closed: instance silent past absence retention` | The instance stayed silent past the **Auto-close after** window while other instances kept reporting, and closed on its own. | -| `dismissed: instance deregistered by user` | An admin dismissed the instance. | +| `dismissed: instance deregistered by user` | Someone dismissed the instance. | ## Other behaviors you might notice diff --git a/src/content/docs/docs/alerts/maintenance-windows.mdx b/src/content/docs/docs/alerts/maintenance-windows.mdx index 2ddd30af..a0967dba 100644 --- a/src/content/docs/docs/alerts/maintenance-windows.mdx +++ b/src/content/docs/docs/alerts/maintenance-windows.mdx @@ -24,33 +24,34 @@ Each maintenance window shows: - **Alert rule targeted:** the alert rule the maintenance window applies to. - **Matching labels:** labels assigned to the maintenance window. - **Schedule:** start and end time for the maintenance window. -- **Status:** whether the maintenance window is active or paused. +- **Status:** **Active** when the window is enabled, or **Disabled**. -![Maintenance window overview](./images/maintenance-window-1.png) +![Maintenance windows list with the Type, Schedule, and Status columns](./images/maintenance-window-1.png) + +With the **Developer** role, you can **Disable** or **Enable**, **Edit**, or **Delete** a window from its row menu. ## Creating a maintenance window -1. Open the **Maintenance Windows** page in the Alerts module. -2. Click **Create Maintenance Window**. +1. Open **Alerts → Maintenance**. +2. Click **Create window**. You need the **Developer** role to create maintenance windows. 3. Configure these details: - **Name:** a name for the maintenance window. - **Description:** a short description of the maintenance window. - **Timezone:** the timezone for the scheduled window. -- **One time:** schedules the maintenance period once, for a specific date and time. +- **One Time:** schedules the maintenance period once, for a specific date and time. - **Recurring:** repeats automatically on a regular cycle, so you don't reconfigure it each time. -![Maintenance window Name, Description, Timezone, and One time/Recurring fields](./images/maintenance-window-2.png) +![Maintenance window Name, Description, Timezone, and One Time/Recurring fields](./images/maintenance-window-2.png) Additional settings: -- **Start time:** date and time when the maintenance window begins. -- **End time:** date and time when the maintenance window ends. -- **Frequency:** available only for recurring windows; select a daily, weekly, or monthly schedule. -- **Label Matchers:** target the window to specific alerts by their labels (for example, service name, host, or region). Each matcher is a label key, an operator, and a value, combined with AND. The operators are the same four used across the alert module (**Equals**, **Not equals**, **Matches regex**, **Doesn't match regex**), matched against alert rule labels and alert instance labels. +- For a **One Time** window, pick the **From** and **To** date and time, or type a **Duration** such as `2h` and press Enter to start the window now and run it for that long. +- For a **Recurring** window, set a **Start Date**, an optional **End Date**, a **Start Time**, an **End Time**, and a **Frequency** of **Daily**, **Weekly**, or **Monthly**. **Weekly** adds **Days of Week**, and **Monthly** lets you choose by **Day of Month** or **Day of Week**. The **End Time** must be later than the **Start Time**, so a recurring window can't run past midnight. +- **Label Matchers:** target the window to specific alerts by their labels (for example, service name, host, or region). Each matcher is a label key, an operator, and a value, combined with AND. The operators are the same four used across the alert module (**Equals**, **Not equals**, **Matches regex**, **Doesn't match regex**), matched against alert rule labels and alert instance labels. A window needs at least one matcher unless it targets specific alert rules. As you add matchers, an **Affected Alert Instances** preview lists the alert rules and instances the window currently matches, so you can confirm its scope before saving. 4. Click **Save** to create the new maintenance window. -![Maintenance window additional settings, Affected Alert Instances preview, and Save button](./images/maintenance-window-3.png) +![Maintenance window schedule, Label Matchers, Affected Alert Instances preview, and Save button](./images/maintenance-window-3.png) diff --git a/src/content/docs/docs/alerts/routing-rules.mdx b/src/content/docs/docs/alerts/routing-rules.mdx index da4a2d79..21d0bd55 100644 --- a/src/content/docs/docs/alerts/routing-rules.mdx +++ b/src/content/docs/docs/alerts/routing-rules.mdx @@ -29,12 +29,12 @@ A routing rule has these fields: | Field | What it does | |---|---| -| **Name** | How the rule appears in the list and audit log. | +| **Rule name** | How the rule appears in the list and audit log. | | **Priority** | Lower numbers win. When an alert matches multiple rules, the highest-priority (lowest-numbered) rule routes it. | | **Matchers** | Label conditions that pick which alerts this rule applies to. | -| **Group-by** | In **Static** grouping, whether and how matched alerts correlate. Leave it empty (or set only `alarm_id`) for **one notification per alert rule**, with no grouping. Add a real label key (for example `service`) to **correlate** matching alerts that share that value into one [Alert Group](../alert-groups/). `severity` can't be used here. This field is ignored when the rule uses **Auto (AI)** grouping. | +| **Group by** | In **Static** grouping, whether and how matched alerts correlate. Leave it empty (or set only `alarm_id`) for **one notification per alert rule**, with no grouping. Add a real label key (for example `service`) to **correlate** matching alerts that share that value into one [Alert Group](../alert-groups/). `severity` can't be used here. This field is ignored when the rule uses **Auto (AI)** grouping. | | **Notification timing** | When the first notification goes out (**Group wait**), the minimum gap between notifications when the group changes (**Group interval**), and how often to re-send while the group stays open and unchanged (**Repeat interval**). | -| **Destination channels** | One or more notification channels that receive the dispatched payload. | +| **Destinations** | One or more notification channels that receive the dispatched payload. | Optional: @@ -55,27 +55,29 @@ The available operators: A matcher value is always a single string. To match any of several values, use a regex alternation. For example, `service` **Matches regex** `api|web` matches either service. (There's no `in`/`not_in` operator; the regex form replaces it.) -As you add or edit matchers, the editor shows a live **Affected Alert Instances** preview: the alert instances this rule currently matches, with a running count, so you can confirm the rule's scope before saving. +In **Static** mode, the editor shows a live **Alerts this rule matches** preview as you add or edit matchers: the alert instances this rule currently matches, with a running count, so you can confirm the rule's scope before saving. A higher-priority rule may handle some of those alerts first. + +Above the preview, **What this rule does** describes the rule in plain language: which alerts it handles, how it groups them, when it notifies and reminds, and when Auto-RCA starts. Read it before saving to check that the rule does what you intended. ### Alert grouping: Static or Auto (AI) -Each rule has an **Alert grouping** control, and it defaults to **Static**. +Each rule has an **Alert grouping** control. New rules start in **Auto (AI)**, and a saved rule keeps the mode it was saved with. - **Static** groups matching alerts by the label keys you choose, the deterministic behavior described under [Group-by keys](#group-by-keys) below. Alerts that share those key values fold into one group. - **Auto (AI)** hands grouping to the correlation engine. It correlates related alerts from this rule into a single incident on its own, and learns which alerts tend to fire together over time. In this mode you don't choose grouping keys at all. -Leave a rule on **Static** when you want predictable grouping along keys you control. Switch it to **Auto (AI)** when related alerts don't share a clean label to group on, or when you'd rather let the engine find the connections. Either mode produces the same [Alert Group](../alert-groups/). +Switch a rule to **Static** when you want predictable grouping along keys you control. Keep it on **Auto (AI)** when related alerts don't share a clean label to group on, or when you'd rather let the engine find the connections. Either mode produces the same [Alert Group](../alert-groups/). For how each mode decides what belongs together, including why one rule firing on many hosts stays a single Auto group, see [How Alert Grouping Works](../how-alert-grouping-works/). -![Routing rule editor with Alert grouping set to Auto (AI) and no Group-by keys picker shown](./images/routing-rules-alert-grouping.png) +![Routing rule editor with Alert grouping set to Static, a Group by key, and Notification timing with Repeat interval set to 1h](./images/routing-rules-alert-grouping.png) ### Group-by keys Group-by keys apply in **Static** mode. They decide **whether** matched alerts correlate and, if so, along **which** dimension: - **Leave it empty, or set only `alarm_id`,** and the rule doesn't correlate anything: each alert rule notifies on its own, one notification per rule. These notifications surface through the normal alerts UI, not the [Alert Groups](../alert-groups/) page. -- **Add a real label key** and matching alerts that share that key's value fold into a single alert group. The editor suggests common keys (`service`, `env`, `host`, `region`, `team`, `issue_id`, `check_id`, `alarm_rule_folder_id`), and you can type any other label key. +- **Add a real label key** and matching alerts that share that key's value fold into a single alert group. The picker offers the label keys seen on your recent alerts, plus **Alert folder**, which groups alerts from rules in the same folder. You can also type any other label key. The editor enforces these constraints: @@ -102,6 +104,8 @@ Set a **Repeat interval** and the rule re-sends the notification at that cadence Reminders stop on their own when the group resolves. A [silenced](../silences/) group doesn't get them, and it doesn't build up a backlog to deliver once the silence ends. A group that opened while it was already silenced was never announced, so it gets no reminders at all. +Reminders count only firing instances that aren't muted, so a [maintenance window](../maintenance-windows/) that mutes all of a group's firing instances stops them too. Turning off the rule's **Enabled** toggle stops them as well. There's no acknowledge step for a group, so to stop reminders on a group that's still firing, silence it. Any other notification the group sends, such as one for a newly firing instance, restarts the reminder clock. + Slack, email, Microsoft Teams, [webhook](../../platform/settings/notification-channels/#webhooks), and [SNS](../../platform/settings/notification-channels/#sns) deliver reminders. [Jira](../../platform/settings/notification-channels/#jira) and [KloudMate Incidents](../../platform/settings/notification-channels/#kloudmate-incidents) don't. The ticket or the incident is already a standing record that the alert is open, so a comment on it every few hours would only add noise. A rule that routes only to those two sends nothing extra when a reminder is due. In Slack, the reminder posts as a reply in the alert's existing thread and is broadcast to the channel, so you see it in the channel instead of buried under an hours-old parent message. @@ -112,7 +116,7 @@ A reminder is delivered with `"event": "repeat"` in the payload. Everything else ## The default passthrough rule -Every workspace has a default passthrough rule. It matches everything that didn't match a higher-priority rule. You can edit its destination channels and notification timing, but you can't delete it or change its matchers. +Every workspace has a default passthrough rule. It matches everything that didn't match a higher-priority rule. Its matchers and priority are locked, and it can't be deleted. You can edit everything else, including its grouping, notification timing, and destinations. For a clean "everything else goes to Slack" path, point the default passthrough at your fallback Slack channel. @@ -125,15 +129,15 @@ For a clean "everything else goes to Slack" path, point the default passthrough 3. **Add matchers.** Pick a label key, an operator, and a value. Add as many rows as needed; all matchers combine with AND. -4. **Choose how alerts group.** Leave **Alert grouping** on **Static** and set group-by keys: empty to notify once per alert rule, or a real label key (start with `service`) to correlate matching alerts into one group (`severity` isn't allowed here). Or switch to **Auto (AI)** to let the correlation engine group related alerts for you, with no keys to set. +4. **Choose how alerts group.** New rules start in **Auto (AI)**, which lets the correlation engine group related alerts for you, with no keys to set. To group by label keys instead, switch **Alert grouping** to **Static**, then set the **Group by** keys: leave them empty to notify once per alert rule, or add a real label key (start with `service`) to correlate matching alerts into one group (`severity` isn't allowed here). To get keys based on your alert history, click **Suggest keys**. See [Get suggested group-by keys](#get-suggested-group-by-keys). 5. **Set the notification timing.** Leave the defaults (`30s` group wait, `5m` group interval) for most cases. Tighten them for time-sensitive notifications, or loosen them for digest-style summaries. Set a **Repeat interval** such as `1h` to be reminded while the alert stays open, or leave it at `0` for no reminders. -6. **Pick destination channels.** Add one or more channels. If you don't have a [KloudMate Incidents](../../platform/settings/notification-channels/#kloudmate-incidents) channel yet, use the inline **+ Add KloudMate Incidents channel** link in the picker. +6. **Pick destination channels.** Add one or more channels under **Destinations**. If the workspace doesn't have a [KloudMate Incidents](../../platform/settings/notification-channels/#kloudmate-incidents) channel yet, click **Add a KloudMate Incidents channel** to create one. That link leaves the rule editor, and anything you haven't saved is lost. -7. **Optionally enable Auto-RCA.** Toggle Auto-RCA on and set the delay (default 5 minutes after group open). See [Auto-RCA](../auto-rca/). +7. **Optionally enable Auto-RCA.** Turn on **Enable Auto-RCA** and set the **Delay** (default 5 minutes after the group opens). See [Auto-RCA](../auto-rca/). -8. **Save.** +8. **Save the rule.** Click **Create rule**, or **Save rule** when you're editing an existing rule. ## Row actions @@ -146,22 +150,22 @@ The kebab menu on each row offers: The **Enabled** toggle disables a rule without deleting it. Use it to stage a rule before it goes live. -## Suggest rules +## Get suggested group-by keys -Admins can open **Suggest rules** to get up to five AI-suggested rules based on your workspace's recent alert traffic. +In **Static** mode, click **Suggest keys** in the rule editor's **Group by** section. KloudMate looks at which alerts fired together in your workspace over the **Lookback** window and proposes up to five groupings. The lookback is 7, 14, or 30 days, and it starts at 14. -![Suggest rules drawer](./images/routing-rules-suggest.png) +![Suggested routing rules drawer with the Lookback selector and suggestion cards](./images/routing-rules-suggest.png) Each suggestion shows: -- A title describing the proposed grouping (for example, "Group by service + env"). -- A short rationale: how much notification noise the rule would have collapsed over the lookback window. -- A **preview matches** count for that window. -- **Accept** opens the create-rule form pre-filled with the suggestion's matchers, group-by keys, and notification timing, under a name derived from what the rule targets. **Dismiss** drops the card. +- A title naming the proposed keys (for example, "Group by service + env"). +- A short rationale: how many alert instances it would have collapsed into how few groups. +- The proposed **Group by** keys. +- How many instances it would have matched over the lookback window. -Some suggestions are grouping-only: they propose group-by keys with no matchers. Accepting one starts the rule as a catch-all that groups everything by those keys. Add matchers before saving to scope it to a subset of alerts. +**Accept** fills in the rule you're editing with the suggested group-by keys and notification timing. It replaces your matchers only when the suggestion has matchers of its own, and it names the rule only if the name is still blank. **Dismiss** hides the suggestion. -Suggestions don't persist; closing the drawer discards them. Re-run the suggester whenever you want fresh proposals. +Suggestions aren't saved. Closing the drawer discards them, and reopening it runs the analysis again. ## Related @@ -169,3 +173,4 @@ Suggestions don't persist; closing the drawer discards them. Re-run the suggeste - [Silences](../silences/): temporarily suppress matching alerts. - [Notification Channels](../../platform/settings/notification-channels/): set up Slack, KloudMate Incidents, email, and more. - [Auto-RCA](../auto-rca/): automatic investigations on group open. +- [Workflows](../../workflows/): run an automated response when an alert fires. Add a webhook channel that points at the workflow's URL to the rule. See [Start a workflow from an alert](../../workflows/triggers/#start-a-workflow-from-an-alert). diff --git a/src/content/docs/docs/alerts/silences.mdx b/src/content/docs/docs/alerts/silences.mdx index 7af12fa3..a745f0ba 100644 --- a/src/content/docs/docs/alerts/silences.mdx +++ b/src/content/docs/docs/alerts/silences.mdx @@ -15,7 +15,7 @@ Open **Alerts → Silences**. Silences are ad-hoc; for recurring quiet windows, ![Silences list](./images/silences-list.png) -Silences are grouped into **Active**, **Expired**, and **All** tabs. +Silences are grouped into **Active**, **Expired**, and **All** tabs. The **Created by** column shows who created each silence. ## Anatomy of a silence @@ -36,12 +36,14 @@ Create a silence from the Silences page, an alert group, or an alert's Pause Not 2. Add one or more matcher rows. For each, pick a label key, an operator, and a value. 3. Pick an **Expires at** date and time, up to 30 days out. 4. Add a **Reason** describing why this silence exists. -5. Click **Save**. +5. Click **Create silence**. ### From an Alert Group On any [Alert Group](../alert-groups/) detail page, click **Silence this group**. The silence creator opens with matchers derived from the group and a binding to it. +![Silence created from an alert group](./images/silence-from-group.png) + :::caution[A group binding sets when the silence ends, not what it mutes] The binding does one thing: when the bound group resolves, the silence's expiry moves to that moment and it lifts early. Matching never looks at it, so the silence mutes every alert in the workspace whose labels match its matchers, group member or not. ::: @@ -67,14 +69,18 @@ On an alert rule's **more options (⋯) → Pause Notifications**, KloudMate cre The Silences list carries an **Alerts muted** column: how many alert rules each active silence is muting. Expand a row to list those rules, each marked with a chip such as `3 firing` when its instances are firing. The silence detail page shows the same list, along with a link to the group the silence is bound to. -In the other direction, the **Silenced** badge links to the silence or maintenance window muting that alert. When more than one is muting it, the badge opens a menu listing all of them. +To find what's muting a particular alert, check the alert's row on the **Rules** tab, its expanded instance rows, or its detail page. Each links to the silence or maintenance window that's muting the alert. When more than one applies, you can pick which one to open. A group's **Instances** panel marks muted instances but doesn't name the silence. + +![Alert rule muted by a silence](./images/silenced-by-rule.png) + +A new silence shows up in the **Alerts muted** count and on the alerts it mutes after those alerts are next evaluated. An expired silence clears from them the same way. ## Silence vs. maintenance window -Both features are a **notification gate, not a state change**: the alert still evaluates on its schedule and its state transitions are still recorded in history; only the notification is withheld. Silencing every firing instance of an alert group keeps the group **Open** (shown as **Muted**); it does **not** resolve the group, and muting never emits a *resolved* notification. The differences between the two are operational, not behavioral: +Both features are a **notification gate, not a state change**: the alert still evaluates on its schedule and its state transitions are still recorded in history; only the notification is withheld. Silencing every firing instance of an alert group keeps the group **Firing** (marked **Muted**); it does **not** resolve the group, and muting never emits a *resolved* notification. The differences between the two are operational, not behavioral: - **Silences** are ad-hoc, label-matcher driven, capped at 30 days, and can be auto-bound to a specific alert group so they expire when the group resolves. -- **Maintenance Windows** are scheduled: one-time (RFC3339 start/end) or recurring (`DAILY` / `WEEKLY` / `MONTHLY` with a timezone-aware time-of-day). +- **Maintenance Windows** are scheduled: **One Time**, with a start and end, or **Recurring**, repeating **Daily**, **Weekly**, or **Monthly** at a set time of day in the window's timezone. Both use the same label-matcher operators (**Equals**, **Not equals**, **Matches regex**, **Doesn't match regex**), matched against alert rule labels and alert instance labels. @@ -86,6 +92,8 @@ Pick a silence for a reactive, one-off suppression you'll re-evaluate within 30 From a row's kebab menu, select **End silence** (or **View**). Ending an active silence removes suppression for matching alerts immediately; new firings notify as normal. +Silences can't be edited. To change the matchers or extend the expiry, end the silence and create a new one. + ## Related - [Alert Groups](../alert-groups/): the Silence-this-group action. diff --git a/src/content/docs/docs/alerts/smart-alerts.mdx b/src/content/docs/docs/alerts/smart-alerts.mdx index a28b5ee1..797aa96b 100644 --- a/src/content/docs/docs/alerts/smart-alerts.mdx +++ b/src/content/docs/docs/alerts/smart-alerts.mdx @@ -53,10 +53,11 @@ A threshold detector is a plain ceiling for a state that's wrong at any scale. I Detectors are grouped by pack: -- **Hosts & VMs:** CPU, memory, and network anomalies; a disk-fill forecast; disk-full and load-saturation thresholds. +- **Hosts & VMs:** CPU, memory, and network anomalies; a disk-fill forecast; CPU-critically-high, memory-critically-high, disk-full, and load-saturation thresholds. - **Kubernetes & Containers:** pod CPU and memory anomalies; container memory-and-CPU-limit detectors; node, deployment, statefulset, and pod-health thresholds. - **Services (RED):** request latency and throughput anomalies. - **Kafka & Queues:** a consumer-lag anomaly; under-replicated, under-min-ISR, and offline-partition thresholds. +- **Browser & Mobile (RUM):** detectors for real user monitoring data from browser and mobile apps. ![The Smart Alerts settings page: the Automatic monitoring toggle and the detector packs](./images/smart-alerts-settings.png) @@ -76,7 +77,7 @@ Only detectors with matching data run. Enable a detector and KloudMate creates a Set a workspace-wide **default sensitivity** and **default forecast horizon** under **Defaults for new managed alerts**. New detectors inherit these unless you override them per detector. :::note -Only workspace admins can change Smart Alerts settings. +You need the **Developer** role to change Smart Alerts settings. ::: ## What a responder sees @@ -103,7 +104,7 @@ Changing how often the rule runs keeps it managed too. Edit **Evaluate every**, Editing the rule's **query**, **threshold**, or **condition** takes it over. The rule detaches from Smart Alerts, is labeled **Customized**, and leaves the **Smart Alerts** folder. From then on it behaves like any alert you wrote by hand: KloudMate stops sending it template updates and no longer manages its lifecycle. Its anomaly or forecast detection keeps running; taking a rule over doesn't turn detection off. -To quiet a managed rule without taking it over, pause it from its row menu with **Pause Evaluation**. The pause holds: saving another Smart Alert won't resume it. To remove a managed rule for good, turn its detector off on the Smart Alerts page. You can't delete a managed rule directly, since Smart Alerts would recreate it. KloudMate disables it instead and points you to the detector toggle. +To quiet a managed rule without taking it over, pause it from its row menu with **Pause Evaluation**. The pause holds: saving another Smart Alert won't resume it. To remove a managed rule for good, turn its detector off on the Smart Alerts page. Deleting a managed rule that's still evaluating disables it instead, the same as **Pause Evaluation**, and a disabled managed rule can then be deleted. ## Plan availability diff --git a/src/content/docs/docs/apm-and-tracing/apm-views/api-monitoring.mdx b/src/content/docs/docs/apm-and-tracing/apm-views/api-monitoring.mdx index c5346d43..29549d7e 100644 --- a/src/content/docs/docs/apm-and-tracing/apm-views/api-monitoring.mdx +++ b/src/content/docs/docs/apm-and-tracing/apm-views/api-monitoring.mdx @@ -11,11 +11,11 @@ Where the [Service Map](../service-map/) shows caller-to-callee dependencies and ## Overview -In the left navigation, open **APM & Tracing → API Monitoring**. +Open **API Monitoring**. ![API Monitoring page, showing the filter bar and the endpoints table with protocol badges, the Status column, and throughput trend sparklines.](./images/api-monitoring-1.png) -Use the **time range** picker in the top-right to set the observation window. The view defaults to the last **24 hours** so the per-endpoint trend sparklines have enough history to draw. +Use the **time range** picker to set the observation window. The view defaults to the last **24 hours** so the per-endpoint trend sparklines have enough history to draw. Endpoints are derived from your services' server spans. If the table is empty, confirm your services are instrumented and sending traces, or widen the time range — see [Getting Accurate Data](#getting-accurate-data). diff --git a/src/content/docs/docs/apm-and-tracing/apm-views/apm-and-services.mdx b/src/content/docs/docs/apm-and-tracing/apm-views/apm-and-services.mdx index 07ed8942..61f76675 100644 --- a/src/content/docs/docs/apm-and-tracing/apm-views/apm-and-services.mdx +++ b/src/content/docs/docs/apm-and-tracing/apm-views/apm-and-services.mdx @@ -5,13 +5,13 @@ sidebar: label: "Services" order: 2 --- -The **Services** view in APM is where you compare application and service performance at a glance. +Open **APM & Services** to compare application and service performance at a glance. It opens in the **List** view. Select the **Service map** view to see how your services connect, as described in [Service Map](../service-map/). ## Services Overview -The Services Overview page lists all instrumented applications and services in a tabular view, making it easy to compare their health across the selected time range. +The **List** view shows all instrumented applications and services in a table, so you can compare their health across the selected time range. -![image](./images/apm-and-services-1.png) +![The List view of APM & Services, with a table of services showing requests, throughput, error rate, dependency failures, and P50, P95, and P99 latency](./images/apm-and-services-1.png) Each row represents one service and includes: @@ -20,18 +20,18 @@ Each row represents one service and includes: - **Throughput:** request rate, such as requests per minute - **P99, P95, and P50 latency:** percentile-based latency views for worst-case, upper-percentile, and median performance - **Error rate:** percentage of failed requests -- **Version:** reported deployment version for release correlation +- **Dep. failures:** outbound calls this service made that failed, with their share of all its outbound calls. These failures don't count toward **Error rate**. ## Service APM Dashboard -Clicking any service in the Services Overview opens its APM dashboard, which is a preconfigured view focused on that specific service. +Clicking any service in the **List** view opens its APM dashboard, which is a preconfigured view focused on that specific service. -![image](./images/apm-and-services-2.png) +![A service's APM dashboard, with the request and latency charts, the Service dependencies panel, and the Issues, Alerts, and Dashboards panels](./images/apm-and-services-2.png) The dashboard includes: - **Requests, errors, and latency over time:** timeline charts that help identify traffic spikes, error bursts, and latency regressions -- **Destinations table:** a breakdown of downstream dependencies, including request rate, error percentage, and dependency latency +- **Service dependencies:** tables of downstream dependencies, outbound calls, and upstream callers, including request rate, error percentage, and latency - **Related issues, alerts, and dashboards:** links to broader operational context for that service ## Traces and Logs diff --git a/src/content/docs/docs/apm-and-tracing/apm-views/images/apm-and-services-1.png b/src/content/docs/docs/apm-and-tracing/apm-views/images/apm-and-services-1.png index d0265cd9..33ced11d 100644 Binary files a/src/content/docs/docs/apm-and-tracing/apm-views/images/apm-and-services-1.png and b/src/content/docs/docs/apm-and-tracing/apm-views/images/apm-and-services-1.png differ diff --git a/src/content/docs/docs/apm-and-tracing/apm-views/images/apm-and-services-2.png b/src/content/docs/docs/apm-and-tracing/apm-views/images/apm-and-services-2.png index 0049e6f5..0a104f03 100644 Binary files a/src/content/docs/docs/apm-and-tracing/apm-views/images/apm-and-services-2.png and b/src/content/docs/docs/apm-and-tracing/apm-views/images/apm-and-services-2.png differ diff --git a/src/content/docs/docs/apm-and-tracing/apm-views/images/service-map-1.jpeg b/src/content/docs/docs/apm-and-tracing/apm-views/images/service-map-1.jpeg index 156d4b82..ee81856e 100644 Binary files a/src/content/docs/docs/apm-and-tracing/apm-views/images/service-map-1.jpeg and b/src/content/docs/docs/apm-and-tracing/apm-views/images/service-map-1.jpeg differ diff --git a/src/content/docs/docs/apm-and-tracing/apm-views/images/service-map-1.png b/src/content/docs/docs/apm-and-tracing/apm-views/images/service-map-1.png index 47a9656f..d5df8e37 100644 Binary files a/src/content/docs/docs/apm-and-tracing/apm-views/images/service-map-1.png and b/src/content/docs/docs/apm-and-tracing/apm-views/images/service-map-1.png differ diff --git a/src/content/docs/docs/apm-and-tracing/apm-views/images/service-map-2.jpeg b/src/content/docs/docs/apm-and-tracing/apm-views/images/service-map-2.jpeg index 367e2503..856da23f 100644 Binary files a/src/content/docs/docs/apm-and-tracing/apm-views/images/service-map-2.jpeg and b/src/content/docs/docs/apm-and-tracing/apm-views/images/service-map-2.jpeg differ diff --git a/src/content/docs/docs/apm-and-tracing/apm-views/images/service-map-2.png b/src/content/docs/docs/apm-and-tracing/apm-views/images/service-map-2.png index 285c428c..31287b36 100644 Binary files a/src/content/docs/docs/apm-and-tracing/apm-views/images/service-map-2.png and b/src/content/docs/docs/apm-and-tracing/apm-views/images/service-map-2.png differ diff --git a/src/content/docs/docs/apm-and-tracing/apm-views/images/service-map-3.png b/src/content/docs/docs/apm-and-tracing/apm-views/images/service-map-3.png index cc3ab7c1..4eaa8de6 100644 Binary files a/src/content/docs/docs/apm-and-tracing/apm-views/images/service-map-3.png and b/src/content/docs/docs/apm-and-tracing/apm-views/images/service-map-3.png differ diff --git a/src/content/docs/docs/apm-and-tracing/apm-views/service-map.mdx b/src/content/docs/docs/apm-and-tracing/apm-views/service-map.mdx index a66e350b..f50055fa 100644 --- a/src/content/docs/docs/apm-and-tracing/apm-views/service-map.mdx +++ b/src/content/docs/docs/apm-and-tracing/apm-views/service-map.mdx @@ -19,13 +19,13 @@ Each service becomes a node under its `service.name`, and an edge is drawn where ## Overview -Click **Service Map** in the left navigation to open the map. +Open **APM & Services** and select the **Service map** view. You can also open the map from a service's page: click **View in service map** in the **Service dependencies** panel. -![image](./images/service-map-1.png) +![The Service map view of APM & Services, with the Refresh button, the Show external dependencies switch, the summary chips, and the Service Dependency Graph](./images/service-map-1.png) -At the top of the page, a summary bar shows the total number of services, dependencies, services with errors, and erroring edges in the selected time range. +Summary chips count the services, external dependencies, dependencies, services with errors, and erroring edges in the selected time range. A service or dependency counts as erroring when its error rate is 0.05% or higher. -Use the **time range** selector to adjust the observation window, and click **Refresh** to reload the map with the latest data. +The **Service map** view uses the same time range as the **List** view. Click **Refresh** to reload the map with the latest data, and turn on **Show external dependencies** to add the uninstrumented dependencies your services call, such as databases, queues, and third-party hosts. The main area displays the **Service Dependency Graph**. Each service is represented as a node showing its name, protocol, request rate, and average latency. The directed edges between nodes represent the call flow and dependencies between services. diff --git a/src/content/docs/docs/apm-and-tracing/index.mdx b/src/content/docs/docs/apm-and-tracing/index.mdx index 7b336332..9b68ff0a 100644 --- a/src/content/docs/docs/apm-and-tracing/index.mdx +++ b/src/content/docs/docs/apm-and-tracing/index.mdx @@ -8,7 +8,7 @@ sidebar: ![image](./images/traces-1.png) -The `APM & Tracing` section in KloudMate gives you end-to-end visibility into how requests travel across your services, along with service-level health and dependency analysis. +The **APM & Services**, **API Monitoring**, and **Traces** pages in KloudMate give you end-to-end visibility into how requests travel across your services, along with service-level health and dependency analysis. ## Core Concepts diff --git a/src/content/docs/docs/aws-integration/images/lambda-functions-2.png b/src/content/docs/docs/aws-integration/images/lambda-functions-2.png index 3b0170fc..62bf530f 100644 Binary files a/src/content/docs/docs/aws-integration/images/lambda-functions-2.png and b/src/content/docs/docs/aws-integration/images/lambda-functions-2.png differ diff --git a/src/content/docs/docs/aws-integration/images/lambda-functions-3.png b/src/content/docs/docs/aws-integration/images/lambda-functions-3.png index 83ea7955..25d6db99 100644 Binary files a/src/content/docs/docs/aws-integration/images/lambda-functions-3.png and b/src/content/docs/docs/aws-integration/images/lambda-functions-3.png differ diff --git a/src/content/docs/docs/aws-integration/images/lambda-functions-4.png b/src/content/docs/docs/aws-integration/images/lambda-functions-4.png index c5cc5098..8f7f4c1c 100644 Binary files a/src/content/docs/docs/aws-integration/images/lambda-functions-4.png and b/src/content/docs/docs/aws-integration/images/lambda-functions-4.png differ diff --git a/src/content/docs/docs/aws-integration/images/step-functions-overview.png b/src/content/docs/docs/aws-integration/images/step-functions-overview.png index 89d6a903..ad91503d 100644 Binary files a/src/content/docs/docs/aws-integration/images/step-functions-overview.png and b/src/content/docs/docs/aws-integration/images/step-functions-overview.png differ diff --git a/src/content/docs/docs/aws-integration/images/step-functions-state-machines.png b/src/content/docs/docs/aws-integration/images/step-functions-state-machines.png index 32220e50..bf1ba7ef 100644 Binary files a/src/content/docs/docs/aws-integration/images/step-functions-state-machines.png and b/src/content/docs/docs/aws-integration/images/step-functions-state-machines.png differ diff --git a/src/content/docs/docs/aws-integration/index.mdx b/src/content/docs/docs/aws-integration/index.mdx index dd89e278..82683ec0 100644 --- a/src/content/docs/docs/aws-integration/index.mdx +++ b/src/content/docs/docs/aws-integration/index.mdx @@ -30,3 +30,7 @@ Explore the following guides to set up and configure your AWS integrations: - **[AWS Lambda Monitoring](./lambda-monitoring/)**: Explore how KloudMate aggregates Lambda metrics, invocations, and issues in a unified console. - **[Lambda Telemetry Extension](./lambda-telemetry-extension/)**: Send Lambda logs, metrics, and traces to KloudMate with a layer, skipping the cross-account CloudFormation setup. - **[AWS Step Functions Monitoring](./step-functions-monitoring/)**: Watch state-machine executions, spot failures, and replay the workflow graph to see which state failed. + +## Acting on AWS, not just reading it + +Everything above is read-only telemetry. To let a [workflow](../workflows/) call AWS APIs, for example to reboot an EC2 instance or redrive a Step Functions execution, connect AWS separately under [Settings → Connections](/platform/settings/connections/). That connection has its own IAM role, so a policy you write decides what automation can do, not the read-only role used for monitoring. diff --git a/src/content/docs/docs/aws-integration/lambda-monitoring.mdx b/src/content/docs/docs/aws-integration/lambda-monitoring.mdx index 1869355e..b9365d05 100644 --- a/src/content/docs/docs/aws-integration/lambda-monitoring.mdx +++ b/src/content/docs/docs/aws-integration/lambda-monitoring.mdx @@ -5,7 +5,7 @@ sidebar: label: "Lambda Monitoring" order: 4 --- -Open the Lambda section from the left navigation menu to monitor Lambda functions connected through your AWS integration. +Open **Serverless → Lambda** to monitor Lambda functions connected through your AWS integration. KloudMate collects and aggregates Lambda metrics such as: @@ -17,9 +17,9 @@ KloudMate collects and aggregates Lambda metrics such as: ## Lambda Console Walkthrough -The Lambda console provides a list of all the [Lambda Functions](https://app.kloudmate.com/lambda) in the associated AWS account. You can use the search bar located at the top right corner of the list to find a specific function. +The **Lambda** tab lists the Lambda functions in the selected AWS account. Search by name to find a specific function. -![Lambda Console Walkthrough](./images/lambda-functions-1.png) +![The Serverless Lambda tab: a searchable list of Lambda functions with name, region, executions, error rate, response time, memory usage, and log ingestion columns](./images/lambda-functions-1.png) Each row in the list shows basic information such as the function name, region, executions, error rate, response time, memory usage, and log ingestion. diff --git a/src/content/docs/docs/aws-integration/lambda-telemetry-extension/images/telemetry-log-explorer.png b/src/content/docs/docs/aws-integration/lambda-telemetry-extension/images/telemetry-log-explorer.png index 7c1fed92..d973baef 100644 Binary files a/src/content/docs/docs/aws-integration/lambda-telemetry-extension/images/telemetry-log-explorer.png and b/src/content/docs/docs/aws-integration/lambda-telemetry-extension/images/telemetry-log-explorer.png differ diff --git a/src/content/docs/docs/aws-integration/lambda-telemetry-extension/images/telemetry-metrics-dashboard.png b/src/content/docs/docs/aws-integration/lambda-telemetry-extension/images/telemetry-metrics-dashboard.png index b9296917..17d609bc 100644 Binary files a/src/content/docs/docs/aws-integration/lambda-telemetry-extension/images/telemetry-metrics-dashboard.png and b/src/content/docs/docs/aws-integration/lambda-telemetry-extension/images/telemetry-metrics-dashboard.png differ diff --git a/src/content/docs/docs/aws-integration/lambda-telemetry-extension/images/telemetry-traces-detail.png b/src/content/docs/docs/aws-integration/lambda-telemetry-extension/images/telemetry-traces-detail.png index e4299e32..0711ac35 100644 Binary files a/src/content/docs/docs/aws-integration/lambda-telemetry-extension/images/telemetry-traces-detail.png and b/src/content/docs/docs/aws-integration/lambda-telemetry-extension/images/telemetry-traces-detail.png differ diff --git a/src/content/docs/docs/aws-integration/lambda-telemetry-extension/images/telemetry-traces-list.png b/src/content/docs/docs/aws-integration/lambda-telemetry-extension/images/telemetry-traces-list.png index 0019da00..054a49fb 100644 Binary files a/src/content/docs/docs/aws-integration/lambda-telemetry-extension/images/telemetry-traces-list.png and b/src/content/docs/docs/aws-integration/lambda-telemetry-extension/images/telemetry-traces-list.png differ diff --git a/src/content/docs/docs/aws-integration/step-functions-monitoring.mdx b/src/content/docs/docs/aws-integration/step-functions-monitoring.mdx index 17d28c97..c7ca1ebf 100644 --- a/src/content/docs/docs/aws-integration/step-functions-monitoring.mdx +++ b/src/content/docs/docs/aws-integration/step-functions-monitoring.mdx @@ -8,7 +8,7 @@ sidebar: Step Functions monitoring shows your state-machine executions, which ones failed, and where they failed. Open a failed run to read the error and follow the path it took through the workflow. -Open **Step Functions** from the sidebar, under **Serverless**. +Open **Serverless → Step Functions**. Some of this works the moment you connect an AWS account. The rest needs execution logging turned on: @@ -29,13 +29,13 @@ Some of this works the moment you connect an AWS account. The rest needs executi ## The Overview dashboard -Start on the **Overview** tab to see whether your executions are healthy. It summarizes the last 24 hours across the workspace. +The **Step Functions** tab opens on the **Overview** view, which summarizes the last 24 hours across the workspace. Start here to see whether your executions are healthy. Use the **Overview** / **State machines** toggle to switch views. -![The Step Functions Overview tab: an Account and Region picker, six outcome tiles for Started, Succeeded, Failed, Aborted, Timed out, and Throttled, and an Executions chart](./images/step-functions-overview.png) +![The Step Functions Overview view: an Account and Region picker, six outcome tiles for Started, Succeeded, Failed, Aborted, Timed out, and Throttled, and an Executions chart](./images/step-functions-overview.png) -A workspace can span several AWS accounts, so set the scope with the **Account** and **Region** menus at the top left. KloudMate reads CloudWatch for that account and region, and the page remembers your choice next time. Use **Refresh** to update the numbers. +A workspace can span several AWS accounts, so set the scope with the **Account** and **Region** menus. KloudMate reads CloudWatch for that account and region, and the page remembers your choice next time. Use **Refresh** to update the numbers. -The tab shows: +The view shows: - **Outcome tiles**: **Started**, **Succeeded**, **Failed**, **Aborted**, **Timed out**, and **Throttled** counts for the selected scope. - **Executions chart**: Started, Succeeded, and Failed plotted across the day. @@ -45,9 +45,9 @@ The tab shows: ## The State machines table -Use the **State machines** tab to find a specific machine or spot the ones that are failing. It lists every state machine KloudMate has discovered in the workspace. Search by name from the box at the top right. +Select **State machines** to find a specific machine or spot the ones that are failing. The view lists every state machine KloudMate has discovered in the workspace. Search by name to narrow the list. -![The State machines tab: a searchable table with Name, Region, Executions, Errors, and Error Rate columns](./images/step-functions-state-machines.png) +![The State machines view: a searchable table with Name, Region, Executions, Errors, and Error Rate columns](./images/step-functions-state-machines.png) Each row shows the machine's **Name** and **Region**, with its **Executions**, **Errors**, and **Error Rate** over the last 24 hours. Sort by **Error Rate** to bring the machines with the most errors to the top, then open one to see which runs failed. diff --git a/src/content/docs/docs/azure-integration/auto-integration-with-azure-monitor.mdx b/src/content/docs/docs/azure-integration/auto-integration-with-azure-monitor.mdx index e7b6f902..ae805e70 100644 --- a/src/content/docs/docs/azure-integration/auto-integration-with-azure-monitor.mdx +++ b/src/content/docs/docs/azure-integration/auto-integration-with-azure-monitor.mdx @@ -201,7 +201,7 @@ az vm create --resource-group "$RESOURCE_GROUP" --name "$VM_NAME" --image "$IMAG After completing the setup, follow these steps to confirm that KloudMate is receiving Azure metrics: 1. Log into your **KloudMate account.** -2. Navigate to **Explorer** or **Dashboards.** +2. Navigate to **Explore** or **Dashboards.** 3. Filter for Azure-specific metrics. - If data is flowing correctly, you should see the metrics appearing in real-time. 4. Troubleshoot if no data appears: diff --git a/src/content/docs/docs/azure-integration/images/mongodb-monitoring-1.png b/src/content/docs/docs/azure-integration/images/mongodb-monitoring-1.png index 8c1a4a4d..1efe3cdd 100644 Binary files a/src/content/docs/docs/azure-integration/images/mongodb-monitoring-1.png and b/src/content/docs/docs/azure-integration/images/mongodb-monitoring-1.png differ diff --git a/src/content/docs/docs/azure-integration/images/save-collector-config.png b/src/content/docs/docs/azure-integration/images/save-collector-config.png new file mode 100644 index 00000000..bb96d7f3 Binary files /dev/null and b/src/content/docs/docs/azure-integration/images/save-collector-config.png differ diff --git a/src/content/docs/docs/azure-integration/index.mdx b/src/content/docs/docs/azure-integration/index.mdx index cf9e6bd7..11b29769 100644 --- a/src/content/docs/docs/azure-integration/index.mdx +++ b/src/content/docs/docs/azure-integration/index.mdx @@ -27,3 +27,7 @@ Explore the following guides to set up and configure your Azure integrations: - **[Manual Integration of Azure Monitor](./manual-integration-of-azure-monitor/)**: Instructions for manually configuring a KloudMate Agent to scrape Azure Monitor when you need full control. - **[Enable Service Principal Azure](./enable-service-principal-azure/)**: A prerequisite guide on how to create the Service Principal needed for authenticated Azure Monitor collection. - **[Azure Application Gateway Log Monitoring](./azure-application-gateway-log-monitoring/)**: A guide for streaming Azure logs into KloudMate through Azure Event Hubs. + +## Acting on Azure, not just reading it + +Everything above is read-only telemetry. To let a [workflow](../workflows/) act on an Azure resource or run a script on a VM, connect Azure separately under [Settings → Connections](/platform/settings/connections/). That connection uses its own service principal, so you can grant it the RBAC roles automation needs without giving more access to the read-only service principal used for monitoring. diff --git a/src/content/docs/docs/azure-integration/manual-integration-of-azure-monitor.mdx b/src/content/docs/docs/azure-integration/manual-integration-of-azure-monitor.mdx index dd760952..22000056 100644 --- a/src/content/docs/docs/azure-integration/manual-integration-of-azure-monitor.mdx +++ b/src/content/docs/docs/azure-integration/manual-integration-of-azure-monitor.mdx @@ -101,7 +101,7 @@ service: After updating the configuration, click "**Save Configuration** " in the UI -![image](https://app.archbee.com/api/optimize/dfeZmyJsGjUXyEH2hgHVe/v50H011QomNhH7lXX1BRP-20251126-110236.png) +![image](./images/save-collector-config.png) or, from your server’s console, run: diff --git a/src/content/docs/docs/database-monitoring/agent-jobs-and-awr.mdx b/src/content/docs/docs/database-monitoring/agent-jobs-and-awr.mdx new file mode 100644 index 00000000..fe4db218 --- /dev/null +++ b/src/content/docs/docs/database-monitoring/agent-jobs-and-awr.mdx @@ -0,0 +1,48 @@ +--- +title: "SQL Server Agent jobs and Oracle AWR" +description: "Check SQL Server Agent job runs and failures, and read Oracle's Automatic Workload Repository report in KloudMate." +sidebar: + order: 11 +--- + +SQL Server and Oracle instances each have one extra tab: **Agent jobs** for SQL Server and **AWR** for Oracle. + +## SQL Server Agent jobs + +The **Agent jobs** tab lists the SQL Server Agent job runs in the time range, so you can catch a failed backup or maintenance job without logging in to the server. The tiles at the top count the runs, and how many succeeded, failed, and are still running. + +![The Agent jobs tab of a SQL Server instance, with tiles counting 81 runs in the last 24 hours, 66 succeeded, and 15 failed, above a list of job runs with their status, run time, duration, and message.](./images/agent-jobs.png) + +Each run shows the job name, its status, when it ran, how long it took, and the message it logged. Expand a run to read the full message. + +To collect job runs, turn on the **Agent jobs** coverage for the instance in the agent's database monitoring settings. The monitoring login needs the `SQLAgentReaderRole` role in the `msdb` database: + +```sql +USE msdb; +CREATE USER [kloudmate] FOR LOGIN [kloudmate]; +ALTER ROLE SQLAgentReaderRole ADD MEMBER [kloudmate]; +``` + +Replace `kloudmate` with your monitoring login. Skip the `CREATE USER` line if the login already has a user in `msdb`. + +:::note +Older agents send run times without a time zone. For those, times are shown in the instance's own time zone, and runs can reach back up to 48 hours. +::: + +## Oracle AWR + +The **AWR** tab shows the sections of Oracle's Automatic Workload Repository report as panels: + +- **Report Summary**, with the load profile and instance efficiency percentages +- **Time Model and Wait Class Statistics** +- **Foreground Wait Events, Enqueues, and Services** +- **Load Profile Trends** +- **SQL Statistics**, such as SQL ordered by elapsed time +- **I/O Stats and Segment Statistics** +- **Active Session History** + +:::caution +AWR is part of the Oracle Diagnostics Pack, a separately licensed Enterprise Edition option. Only turn on the AWR coverages if your Oracle license includes it. +::: + +Each row needs its AWR coverage turned on for the instance in the agent's database monitoring settings. The values change once per AWR snapshot, which Oracle takes every hour by default. diff --git a/src/content/docs/docs/database-monitoring/calling-services.mdx b/src/content/docs/docs/database-monitoring/calling-services.mdx new file mode 100644 index 00000000..a6bba503 --- /dev/null +++ b/src/content/docs/docs/database-monitoring/calling-services.mdx @@ -0,0 +1,33 @@ +--- +title: "Calling services" +description: "See which services call a database or run a specific query, and jump to their traces." +sidebar: + order: 7 +--- + +The **Calling services** tab lists the services that called the database in the selected time range, with their call and error counts. Use it to find which application is behind a load spike, then open that service in APM or its traces. + +![The Calling services tab of a PostgreSQL instance, with query duration percentiles above a table of the calling services, their language, calls, and errors.](./images/calling-services.png) + +## How services are matched + +Calling services are found from traces, not from the database. A service appears when its database calls are recorded as client spans with the database's address and port, either by [eBPF monitoring](../../kloudmate-agent/ebpf-observability/) or by OpenTelemetry instrumentation in the service. See [APM and tracing](../../apm-and-tracing/) to instrument your services. + +If the instance has no endpoint recorded, there's nothing to match spans against, and the tab has no data. + +## Read the tab + +**Query Duration Percentiles** charts the P50, P90, P95, and maximum duration of the database calls over the time range. + +The table lists each calling service with its language, the number of calls, and the number of calls that ended in an error. Click a service to open it in APM, or **View traces** to open the Traces explorer filtered to that service's calls to this database. + +## Match a query to its traces + +The **Calling services** tab in a query's [details](../query-performance/#query-details) narrows the list to the services that ran that one query. Queries are matched to spans in one of two ways, and the tab shows which one it used: + +- **Exact match** uses a query ID that the query and its spans both carry. +- **Approximate match** uses a distinctive part of the query text when spans carry no query ID. It can miss some traces, or include a different query with the same text. + +Most instrumentation doesn't record a query ID, so the match is usually approximate. On MySQL, which stores queries in a rewritten form, the match uses a run of words from the query rather than an exact fragment. + +If the traces in your workspace carry neither a query ID nor query text, queries can't be matched to traces. diff --git a/src/content/docs/docs/database-monitoring/database-activity-monitoring-dam/_meta.json b/src/content/docs/docs/database-monitoring/database-activity-monitoring-dam/_meta.json deleted file mode 100644 index 505f5742..00000000 --- a/src/content/docs/docs/database-monitoring/database-activity-monitoring-dam/_meta.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "label": "Database Activity Monitoring (DAM)", - "order": 2 -} diff --git a/src/content/docs/docs/database-monitoring/database-activity-monitoring-dam/index.mdx b/src/content/docs/docs/database-monitoring/database-activity-monitoring-dam/index.mdx deleted file mode 100644 index d1e0409c..00000000 --- a/src/content/docs/docs/database-monitoring/database-activity-monitoring-dam/index.mdx +++ /dev/null @@ -1,63 +0,0 @@ ---- -title: "Database Activity Monitoring (DAM)" -description: "Use eBPF-powered monitoring to inspect database traffic without adding database-side agents." -sidebar: - label: "Overview" - order: 1 ---- - -The eBPF Receiver includes built-in **Database Activity Monitoring** that automatically profiles database traffic at the kernel level. No database-side agents or plugins needed. - -### Supported Databases - -| **Database** | **Captured Metrics** | -| ---------------- | ---------------------------------------------------------------------------- | -| **MySQL** | Query operations, latency (avg + P99), prepared statements, read/write ratio | -| **PostgreSQL** | Query operations, latency (avg + P99), prepared statements, read/write ratio | -| **Redis** | Query operations, latency (avg + P99), prepared statements, read/write ratio | - -### Supported Messaging Systems - -| **System** | **Captured Metrics** | -| ----------------- | --------------------------------------- | -| **Kafka** | Producer/Consumer metrics, throughput | -| **Elasticsearch** | Request operations, latency, throughput | - -### Key DAM Capabilities - -- **Table-level hotspot detection** — identify your most queried and slowest tables -- **Read vs. Write ratio analysis** — understand workload characteristics per table -- **P99 latency tracking** — surface tail latency issues before they impact users -- **Zero configuration** — automatically detected via eBPF kernel hooks; no database credentials required - -### When to Use - -- When you need instant database visibility with **zero setup** -- When you cannot or prefer not to create a monitoring user on the database -- When running on Linux with kernel ≥ 5.8 -- When you want to monitor traffic across **all** supported databases and messaging systems from a single agent - -## Related DAM Workflows - -- [ML Classifier Deployment Guide](ml-classifier-deployment-guide/) - -:::note - For deeper query analytics, including execution plans and schema discovery, see [Direct Database Monitoring](../direct-database-monitoring/). For distributed trace context from your application SDKs, see [OpenTelemetry Database Monitoring](../opentelemetry-database-monitoring/). -::: - -### Configuration - -Enable heuristic SQL detection and tune caches for high-load environments: - -```yaml -ebpf: - heuristic_sql_detect: true - mysql_prepared_statements_cache_size: 1024 - postgres_prepared_statements_cache_size: 1024 -``` - -### Prerequisites - -- Linux kernel ≥ 5.8 (recommended; some features work on 4.18+) -- Root privileges or `CAP_SYS_ADMIN` + `CAP_BPF` capabilities -- The eBPF Receiver must be enabled in the agent configuration (see [Configuration](../../kloudmate-agent/management/)). diff --git a/src/content/docs/docs/database-monitoring/database-activity-monitoring-dam/ml-classifier-deployment-guide.mdx b/src/content/docs/docs/database-monitoring/database-activity-monitoring-dam/ml-classifier-deployment-guide.mdx deleted file mode 100644 index 990cf219..00000000 --- a/src/content/docs/docs/database-monitoring/database-activity-monitoring-dam/ml-classifier-deployment-guide.mdx +++ /dev/null @@ -1,298 +0,0 @@ ---- -title: "ML Classifier Deployment Guide" -description: "Deploy the KloudMate ML classifier for sensitive data detection in standalone and Kubernetes environments." -sidebar: - order: 2 ---- - -The **KloudMate ML Classifier** inspects database queries in your telemetry pipeline to detect sensitive data, such as Personally Identifiable Information (PII) and Protected Health Information (PHI). It combines a machine learning model with pattern-matching rules, and tags your traces with risk fingerprints before the telemetry leaves your infrastructure. - -This guide covers two strategies for deploying the **KloudMate ML Classifier**: - -1. Standalone deployment via **Docker Compose** on a simple machine. -2. Enterprise deployment via **Kubernetes (K8s)**. - -## Strategy 1: Standalone Machine via Docker Compose - -:::note - **When to use this strategy?** - - Use this strategy if you are running the classifier on a single VM or physical host where the KloudMate Agent is already running. -::: - -### Prerequisites - -- Docker Engine and Docker Compose are installed. -- The `KloudMate Agent` is running on the host machine, listening to OTLP HTTP traffic on port `4318`. - - -### Prepare the Compose File - - -Create a `docker-compose.yaml` file on your machine. It is configured to run the classifier with optimized CPU/Memory limits to handle the ML NLP models. - -If you need the ML Classifier to reach out to the KloudMate Agent running directly on the host machine, Docker uses the special DNS `host.docker.internal` to route traffic to the host. - -`docker-compose.yaml` - -```yaml -version: '3.8' - -services: - ml-classifier: - image: ghcr.io/kloudmate/dam-classifier:latest - build: - context: . - dockerfile: Dockerfile - container_name: km-ml-classifier - ports: - - "8080:8080" - environment: - - HTTP_WORKERS=2 - - LOG_LEVEL=INFO - volumes: - - ./config.yaml:/app/config.yaml:ro - deploy: - resources: - limits: - cpus: '2.0' - memory: 4G - reservations: - memory: 512M - restart: unless-stopped - healthcheck: - test: ["CMD", "curl", "-f", "http://localhost:8080/health"] - interval: 30s - timeout: 10s - retries: 3 - networks: - - km-network - -networks: - km-network: - driver: bridge -``` - - -### Start the Classifier - - -Navigate to the directory containing `docker-compose.yaml` and run: - -```bash -# Start the classifier in detached mode -docker compose up -d - -# Check the logs to ensure models are loaded -docker compose logs -f -``` - - -### Configure KloudMate Agent - - -Update your host Agent's configuration to route traces to the classifier container. Since the classifier exposes port `8080` to the host: - -```yaml -processors: - # ... - km_classifier: - endpoint: "http://localhost:8080" # The classifier is bound to localhost:8080 - timeout: 500ms - batch_timeout: 2s - max_batch_size: 100 -``` - -## **Strategy 2: Enterprise Cluster via Kubernetes** - -:::note - **When to use this strategy?** - - Use this strategy if you are deploying the classifier to a Kubernetes cluster alongside the KloudMate agent ecosystem. -::: - -### Prerequisites - -- Active Kubernetes cluster with `kubectl` access. -- Helm or standard K8s networking setup. - - -### Deploy the Configuration - - -The classifier relies on a ConfigMap (`configmap.yaml`) to define the Presidio patterns and GLiNER labels. - -```bash -kubectl apply -f k8s/configmap.yaml -``` - - -### Deploy the Service & Application - - -Apply the Kubernetes service and deployment manifests. The deployment automatically allocates `4Gi` of memory and spins up `2` HTTP workers for concurrent classification. - -`service.yaml` - -```yaml -apiVersion: v1 -kind: Service -metadata: - name: ml-classifier - namespace: km-agent - labels: - app: ml-classifier - component: dam-classifier -spec: - type: ClusterIP - selector: - app: ml-classifier - ports: - - name: http - port: 8080 - targetPort: 8080 - protocol: TCP -``` - -`deployment.yaml` - -```yaml -apiVersion: apps/v1 -kind: Deployment -metadata: - name: ml-classifier - namespace: km-agent - labels: - app: ml-classifier - component: dam-classifier -spec: - replicas: 1 - selector: - matchLabels: - app: ml-classifier - template: - metadata: - labels: - app: ml-classifier - component: dam-classifier - spec: - containers: - - name: classifier - image: ghcr.io/kloudmate/dam-classifier:latest - imagePullPolicy: Always - ports: - - name: http - containerPort: 8080 - protocol: TCP - resources: - # GLiNER small model (~400MB) - requests: - memory: "512Mi" - cpu: "250m" - limits: - memory: "4Gi" - cpu: "2" - env: - - name: KM_AGENT_ENDPOINT - value: "km-agent-svc.km-agent.svc.cluster.local:4318" - - name: LOG_LEVEL - value: "INFO" - - name: HTTP_WORKERS - value: "2" - volumeMounts: - - name: config - mountPath: /app/config.yaml - subPath: config.yaml - readOnly: true - volumes: - - name: config - configMap: - name: ml-classifier-config - # Ensure pods are spread across nodes - topologySpreadConstraints: - - maxSkew: 1 - topologyKey: kubernetes.io/hostname - whenUnsatisfiable: ScheduleAnyway - labelSelector: - matchLabels: - app: ml-classifier -``` - -```bash -kubectl apply -f service.yaml -kubectl apply -f deployment.yaml -``` - - -### Verify Deployment - - -Verify that the pod has started properly and the GLiNER models have been downloaded into memory. - -```bash -# Check if the pod is Running -kubectl get pods -n km-agent -l app=ml-classifier - -# Verify model loading logs -kubectl logs -n km-agent -l app=ml-classifier -f -``` - - -### Configure KloudMate Agent in K8s - - -In your KloudMate Agent's config (if deployed as a separate pod in the same namespace), configure the processor to hit the fully qualified internal DNS of the service we just created. - -`otel-collector-config.yaml` - -```yaml -# Agent configuration with DAM processor -receivers: - otlp: - protocols: - grpc: - endpoint: 0.0.0.0:4317 - http: - endpoint: 0.0.0.0:4318 - -processors: - batch: - timeout: 1s - send_batch_size: 1024 - - memory_limiter: - check_interval: 1s - limit_mib: 512 - spike_limit_mib: 128 - - # DAM Classifier processor (using the correct type name from factory.go) - km_classifier: - endpoint: "http://ml-classifier.km-agent.svc.cluster.local:8080" # Fully qualified K8s Service URL - timeout: 500ms - batch_timeout: 2s - max_batch_size: 100 - enable_batching: true - skip_if_no_query: true - max_idle_conns: 100 - max_conns_per_host: 100 - -exporters: - otlp: - endpoint: "https://otel.kloudmate.com:4318" - tls: - insecure: true - - debug: - verbosity: detailed - -service: - pipelines: - traces: - receivers: [otlp] - processors: [memory_limiter, km_classifier, batch] - exporters: [otlp] -``` - -## Verifying Classification is Working - -Regardless of the deployment strategy, you can verify the setup by observing the KloudMate Agent logs (ensure `level: debug` is enabled temporarily). The traced applications will start showing `dam.lineage.fingerprint`, `dam.lineage.risk`, and extracted `PII/PHI` properties dynamically added to the payload before arriving at your backend. diff --git a/src/content/docs/docs/database-monitoring/database-integrations/_meta.json b/src/content/docs/docs/database-monitoring/database-integrations/_meta.json deleted file mode 100644 index 3a3e605e..00000000 --- a/src/content/docs/docs/database-monitoring/database-integrations/_meta.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "label": "Database Integrations", - "order": 5 -} \ No newline at end of file diff --git a/src/content/docs/docs/database-monitoring/database-integrations/images/mongodb-monitoring-1.png b/src/content/docs/docs/database-monitoring/database-integrations/images/mongodb-monitoring-1.png deleted file mode 100644 index 8c1a4a4d..00000000 Binary files a/src/content/docs/docs/database-monitoring/database-integrations/images/mongodb-monitoring-1.png and /dev/null differ diff --git a/src/content/docs/docs/database-monitoring/database-integrations/images/mongodb-monitoring-2.png b/src/content/docs/docs/database-monitoring/database-integrations/images/mongodb-monitoring-2.png deleted file mode 100644 index 5a4bb701..00000000 Binary files a/src/content/docs/docs/database-monitoring/database-integrations/images/mongodb-monitoring-2.png and /dev/null differ diff --git a/src/content/docs/docs/database-monitoring/database-integrations/images/mysql-monitoring-1.png b/src/content/docs/docs/database-monitoring/database-integrations/images/mysql-monitoring-1.png deleted file mode 100644 index 44d90853..00000000 Binary files a/src/content/docs/docs/database-monitoring/database-integrations/images/mysql-monitoring-1.png and /dev/null differ diff --git a/src/content/docs/docs/database-monitoring/database-integrations/images/mysql-monitoring-2.png b/src/content/docs/docs/database-monitoring/database-integrations/images/mysql-monitoring-2.png deleted file mode 100644 index c83f10c2..00000000 Binary files a/src/content/docs/docs/database-monitoring/database-integrations/images/mysql-monitoring-2.png and /dev/null differ diff --git a/src/content/docs/docs/database-monitoring/database-integrations/images/postgresql-monitoring-1.png b/src/content/docs/docs/database-monitoring/database-integrations/images/postgresql-monitoring-1.png deleted file mode 100644 index 24cc14e1..00000000 Binary files a/src/content/docs/docs/database-monitoring/database-integrations/images/postgresql-monitoring-1.png and /dev/null differ diff --git a/src/content/docs/docs/database-monitoring/database-integrations/mongodb-monitoring.mdx b/src/content/docs/docs/database-monitoring/database-integrations/mongodb-monitoring.mdx deleted file mode 100644 index 8995e223..00000000 --- a/src/content/docs/docs/database-monitoring/database-integrations/mongodb-monitoring.mdx +++ /dev/null @@ -1,296 +0,0 @@ ---- -title: "MongoDB" -description: "Monitor MongoDB health, performance, and logs with the KloudMate Agent and OpenTelemetry." ---- -This guide sets up MongoDB monitoring with the **KloudMate Agent** and OpenTelemetry. It collects metrics and logs so you can watch the health, performance, and behavior of MongoDB instances running on AWS EC2, Azure Virtual Machines, or on-premise servers. - -### **What This Integration Provides** - -With MongoDB Monitoring enabled, KloudMate collects telemetry at multiple levels, including: - -- Server-level performance metrics -- Database and collection-level metrics -- Connection, operation, and lock behavior -- Network and storage usage -- MongoDB server logs - -This visibility helps identify performance bottlenecks, abnormal query behavior, resource saturation, and availability issues. - -### **Pre-requisites** - -Before configuring MongoDB Monitoring, ensure the following: - -1. MongoDB server is running -2. Supported MongoDB versions: 4.0+, 5.0, 6.0, 7.0 -3. KloudMate Agent installed on the MongoDB host - - Refer to Agent installation for [Linux](../../../kloudmate-agent/installation/linux-agent/) or [Windows](../../../kloudmate-agent/installation/windows-agent/) -4. MongoDB user configured with least-privilege access. - -MongoDB recommends creating a user with the [clusterMonitor role](https://www.mongodb.com/docs/v5.0/reference/built-in-roles/#mongodb-authrole-clusterMonitor) to collect metrics. Refer to [lpu.sh](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/receiver/mongodbreceiver/testdata/integration/scripts/lpu.sh) for an example of how to configure these permissions. - -Example: - -```text -mongosh -use admin -db.createUser({ - user: "USER", - pwd: "PASSWORD", - roles: [{ role: "clusterMonitor", db: "admin" }] -}) -exit -``` - -### **Step 1: Access Agents and OpenTelemetry Collector Configuration** - -1. Log in to the KloudMate platform -2. Navigate to **Settings → Agents** -3. Select the agent running on the MongoDB host -4. Open **Collector Configuration** from the agent actions -5. The configuration editor opens, allowing you to modify the YAML directly - -![image](./images/mongodb-monitoring-1.png) - -### **Step 2: Add Required Extensions and Receivers** - -**Extensions** - -Add the following extensions to support health checks, debugging, and local storage: - - -```yaml - extensions: - file_storage: - create_directory: true - ``` - - ```none - ``` - - -**Receivers** - -Two receivers can be used with MongoDB: - -- **MongoDB Receiver –** Collects MongoDB metrics -- **File Log Receiver –** Collects MongoDB logs - -If you only need metrics, configure only the MongoDB receiver. - -```yaml -receivers: - mongodb: - hosts: - - endpoint: localhost:27017 - username: otel #Change the correct username - password: PASSWD #change the correct password - collection_interval: 60s - initial_delay: 1s - tls: - insecure: true - insecure_skip_verify: true - filelog: - include: [/var/log/mongodb/*.log] - storage: file_storage - retry_on_failure: - enabled: true -``` - -### **Step 3: Configure Processors** - -Set up the processor component to identify resource information from the host and either append or replace the resource values in the telemetry data with this information. - -Choose **one configuration** based on where MongoDB is running. - -- **Server (On-premise / Non-cloud / Cloud)** - -```yaml -processors: - batch: - send_batch_size: 5000 - timeout: 10s - - resourcedetection: - detectors: [system] - system: - resource_attributes: - host.name: - enabled: true - host.id: - enabled: true - os.type: - enabled: false - resource: - attributes: - - key: service.name - action: insert - from_attribute: host.name -``` - -- **AWS EC2:** - -(Optional) To collect EC2 tags, attach an IAM role with `EC2:DescribeTags` permission. - -```yaml -processors: - batch: - send_batch_size: 5000 - timeout: 10s - - resourcedetection/ec2: - detectors: ["ec2"] - ec2: - tags: - - ^tag1$ - - ^tag2$ - - ^label.*$ - - ^Name$ - - resource: - attributes: - - key: service.name - action: insert - from_attribute: ec2.tag.Name - - key: service.instance.id - action: insert - from_attribute: host.id -``` - -- **Azure Virtual Machines:** - -```yaml -processors: - batch: - send_batch_size: 5000 - timeout: 10s - - resourcedetection/azure: - detectors: ["azure"] - azure: - tags: - - ^tag1$ - - ^tag2$ - - ^label.*$ - - ^Name$ - - resource: - attributes: - - key: service.name - action: insert - from_attribute: azure.vm.name - - key: service.instance.id - action: insert - from_attribute: host.id -``` - -### **Step 4: Configure Exporter and Pipelines** - -Configure the KloudMate backend exporter and define pipelines for metrics and logs. - -```yaml -exporters: - debug: - verbosity: detailed - otlphttp: - endpoint: 'https://otel.kloudmate.com:4318' - headers: - Authorization: xxxxxxxx # Use the auth key - -service: - pipelines: - - metrics: - receivers: [mongodb] - processors: [batch, resourcedetection, resource] # Apply the correct resourcedetection - exporters: [otlphttp] - - logs: - receivers: [filelog] - processors: [batch, resourcedetection, resource] # Apply the correct resourcedetection - exporters: [otlphttp] - - extensions: [health_check, pprof, zpages, file_storage] -``` - -### **Step 5: Save Configuration and Restart Agent** - -After updating the configuration, click **Save Configuration** in the KloudMate UI. - -![image](https://app.archbee.com/api/optimize/dfeZmyJsGjUXyEH2hgHVe/v50H011QomNhH7lXX1BRP-20251126-110236.png) - -You can also restart the agent from your server’s console. - -**For Linux:** - -1. Execute the following commands: - -```none -systemctl restart kmagent -systemctl status kmagent -``` - -These commands restart the KloudMate Agent and display its current status. - -**For Windows** - -1. Open the **Services** window - - Press `Win + R`, type `services.msc`, and press `OK` - - Or search for **Services** from the Start menu -2. Locate the **KloudMate Agent** service. -3. Right-click the service and select **Restart**. - -After restarting the agent, verify that MongoDB metrics and logs are visible in the KloudMate dashboard. - -## Post‑Integration Data Validation - -Verify that metrics are flowing into KloudMate using the **Explore** view. - -After the agent restarts: - -1. Log in to KloudMate -2. Navigate to **Explore** -3. Select **OpenTelemetry → Metrics** -4. Choose a MongoDB metric and run the query - -Seeing time-series data confirms that MongoDB telemetry is flowing successfully. - -![image](./images/mongodb-monitoring-2.png) - -## Standard MongoDB Dashboards - -KloudMate provides prebuilt MongoDB dashboards through [dashboard templates](https://templates.kloudmate.com/mongo-db/index.html). These dashboards visualize MongoDB server performance, operations, storage, and resource usage. - -To import and start using these templates, follow the steps described in [Importing a Dashboard](../../../visualize-data/dashboards/#importing-a-dashboard). Alternatively, use [From Template](../../../visualize-data/dashboards/create-a-dashboard/#from-template) when creating a new dashboard to pick from KloudMate's built-in templates. - -## **Default MongoDB Metrics** - -MongoDB Monitoring automatically collects commonly used MongoDB metrics when enabled. - -Example Metrics - -| **Metric Name** | **Description** | -| --------------------------------- | ------------------------------------------------------------------------ | -| mongodb\_connection\_count | The number of connections. | -| mongodb\_operation\_count | The number of operations executed. | -| mongodb\_operation\_latency\_time | The latency of operations. | -| mongodb\_data\_size | The size of the collection. Data compression does not affect this value. | -| mongodb\_storage\_size | The total amount of storage allocated to this collection. | -| mongodb\_network\_io\_receive | The number of bytes received. | -| mongodb\_network\_io\_transmit | The number of bytes transmitted. | -| mongodb\_lock\_acquire\_count | Number of times the lock was acquired in the specified mode. | -| mongodb\_lock\_acquire\_time | Cumulative wait time for the lock acquisitions. | -| mongodb\_health | The health status of the server. | -| mongodb\_uptime | The amount of time that the server has been running. | - -For the complete metrics list, refer to the [metrics reference](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/receiver/mongodbreceiver/documentation.md). - -## Optional Deployment Methods - -### VM/EC2 with Fluent Bit -[Streaming MongoDB Metrics & Logs to KloudMate Using Fluent Bit](https://blog.kloudmate.com/streaming-mongodb-metrics-logs-to-kloudmate-using-fluent-bit-32b54e91fe93?postPublishedType=initial) - -### Docker Compose -[Monitoring MongoDB with KloudMate Using Docker Compose](https://blog.kloudmate.com/monitoring-mongodb-with-kloudmate-using-docker-compose-49a5dc59c660?postPublishedType=initial) - -## - diff --git a/src/content/docs/docs/database-monitoring/database-integrations/mssql-monitoring.mdx b/src/content/docs/docs/database-monitoring/database-integrations/mssql-monitoring.mdx deleted file mode 100644 index 866bac15..00000000 --- a/src/content/docs/docs/database-monitoring/database-integrations/mssql-monitoring.mdx +++ /dev/null @@ -1,488 +0,0 @@ ---- -title: "MSSQL" -description: "Monitor Microsoft SQL Server health, performance, queries, and logs with the KloudMate Agent and OpenTelemetry." ---- - -This guide sets up Microsoft SQL Server (MSSQL) monitoring with the KloudMate Agent and OpenTelemetry. It collects metrics and logs so you can watch the health, performance, and query behavior of MSSQL instances running on Windows hosts, AWS EC2, Azure Virtual Machines, or on-premise servers. - -# MSSQL Integration using KloudMate Agents - -### What This Integration Provides - -With MSSQL Monitoring enabled, KloudMate collects telemetry that provides visibility into: - -- Database health and performance metrics -- Lock waits, blocking processes, and transaction behavior -- Buffer pool efficiency and I/O performance -- Transaction log usage and growth patterns -- Resource pool throttling and disk I/O latency -- Server-level resource utilization - -This visibility helps identify performance bottlenecks, blocking issues, transaction log problems, buffer pool inefficiencies, and availability concerns. - -### Prerequisites - -- MSSQL Server must be installed and running -- KloudMate Agent installed on the MSSQL host (see Agent Installation for Linux and Windows) -- Run agents as Administrator to collect all Windows Performance Counters - -### Required Permissions - -1. **Windows Performance Counters** - Run the KloudMate Agent as Administrator to collect all performance counter-based metrics. -2. **Direct Database Connection** - When configured for direct SQL Server connection, the monitoring user must have: - -- **Database Permissions** (at least one of): - • `CREATE DATABASE` - • `ALTER ANY DATABASE` - • `VIEW ANY DATABASE` -- **Server State Permissions:** - • SQL Server pre-2022: `VIEW SERVER STATE` - • SQL Server 2022+: `VIEW SERVER PERFORMANCE STATE` - -## Configuration Overview - -### Step 1: Configure the KloudMate Agent with -• `hostmetrics` receiver (system metrics) -• `sqlserver` receiver (MSSQL performance metrics) -• `sqlquery` receiver (custom SQL metrics) -• `filelog` receiver (MSSQL logs) - -### **Step 2: Access Agents and OpenTelemetry Collector Configuration** - -- Log in to the KloudMate platform -- Go to **Settings → Agents** -- Select the agent running on the MSSQL host -- Click **Actions → Collector Configuration** -- YAML editor opens for configuration - -![image](./images/mongodb-monitoring-1.png) - -### **Step 3: Add Required Extensions and Receivers** - -```yaml -extensions: - health_check: - pprof: - endpoint: 0.0.0.0:1777 - zpages: - endpoint: 0.0.0.0:55679 - file_storage: - create_directory: true - -receivers: - otlp: - protocols: - grpc: - endpoint: 0.0.0.0:4317 - http: - endpoint: 0.0.0.0:4318 - - hostmetrics: - collection_interval: 30s - scrapers: - cpu: - metrics: - system.cpu.utilization: - enabled: true - load: - cpu_average: true - memory: - metrics: - system.memory.utilization: - enabled: true - filesystem: - metrics: - system.filesystem.usage: - enabled: true - system.filesystem.utilization: - enabled: true - disk: {} - network: {} - processes: {} - - sqlserver: - collection_interval: 30s - username: #use the username - password: #use the secure password - server: 0.0.0.0 - port: 1433 - metrics: - sqlserver.database.count: - enabled: true - sqlserver.database.io: - enabled: true - sqlserver.database.latency: - enabled: true - sqlserver.database.operations: - enabled: true - sqlserver.processes.blocked: - enabled: true - sqlserver.resource_pool.disk.throttled.read.rate: - enabled: true - sqlserver.resource_pool.disk.throttled.write.rate: - enabled: true - - sqlquery/upmetrics: - driver: mssql - datasource: "sqlserver://:@localhost:1433?database=Kloudmate-test&encrypt=disable" #modify the username and password - queries: - # Query: Collect SQL Server Uptime as a Metric - - sql: | - SELECT - sqlserver_start_time, - DATEDIFF(MINUTE, sqlserver_start_time, GETDATE()) AS Minutes_Uptime - FROM - sys.dm_os_sys_info; - metrics: - - metric_name: sqlserver.uptime.minutes - value_column: Minutes_Uptime - attribute_columns: ["sqlserver_start_time"] - static_attributes: - dbinstance: mydbinstance - filelog: - include: - # Ensure the path is appropriate for your server's operating system. Uncomment the line below if the server is running Windows. - - /var/opt/mssql/log/errorlog*#- 'C:\Program Files\Microsoft SQL Server\MSSQL\LOG\ERRORLOG*' - storage: file_storage - multiline: - line_start_pattern: ^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}\.\d{2} - retry_on_failure: - enabled: true -# query to show client connections and IP - sqlquery/connection: - driver: mssql - datasource: "sqlserver://:@localhost:1433?database=Kloudmate-test&encrypt=disable" - storage: file_storage - queries: - - sql: | - SELECT - c.session_id, - c.client_net_address AS client_ip_address, - s.host_name, - s.login_name, - s.program_name, - s.login_time, - s.last_request_start_time, - s.last_request_end_time, - 'mssql_client_log' AS log_source - FROM - sys.dm_exec_connections AS c - JOIN - sys.dm_exec_sessions AS s - ON - c.session_id = s.session_id - WHERE - s.last_request_start_time > $$1 - ORDER BY - s.last_request_start_time ASC; - tracking_column: last_request_start_time - tracking_start_value: "" # add today date - logs: - - body_column: client_ip_address - attribute_columns: ["session_id", "host_name", "login_name", "program_name", "login_time", "last_request_start_time", "last_request_end_time", "log_source"] -# To show slow query - sqlquery/slowquery: - driver: mssql - datasource: "sqlserver://:@localhost:1433?database=Kloudmate-test&encrypt=disable" - storage: file_storage - queries: - - sql: | - SELECT - *, - SUBSTRING( - st.text, - (qs.statement_start_offset / 2) + 1, - ( - ( - CASE qs.statement_end_offset WHEN -1 THEN DATALENGTH(st.text) ELSE qs.statement_end_offset END - qs.statement_start_offset - ) / 2 - ) + 1 - ) AS statement_text, - 'mssql_slow_query_log' AS log_source - FROM - sys.dm_exec_query_stats AS qs - CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS st - WHERE qs.last_execution_time > $$1 - ORDER BY qs.last_execution_time; - tracking_column: last_execution_time - tracking_start_value: " " #add today's date - logs: - - body_column: statement_text - attribute_columns: ["sql_handle", "execution_count", "total_worker_time", "last_execution_time", "creation_time", "total_elapsed_time", "statement_start_offset", "statement_end_offset", "log_source"] -# To get audit log - sqlquery/audit: - driver: mssql - datasource: "sqlserver://:@localhost:1433?database=Kloudmate-test&encrypt=disable" - storage: file_storage - collection_interval: 30s - queries: - - sql: "SELECT event_time, action_id, succeeded, session_server_principal_name AS user_name, server_principal_name AS login_name, database_name, schema_name, object_name, statement, additional_information FROM sys.fn_get_audit_file('/var/opt/mssql/log/Audit-*.sqlaudit', DEFAULT, DEFAULT) WHERE event_time > $$1 ORDER BY event_time ASC" - tracking_column: event_time - tracking_start_value: " " # modify today date - logs: - - body_column: statement - attribute_columns: ["event_time", "action_id", "succeeded", "user_name", "login_name", "database_name", "schema_name", "object_name", "additional_information", "log_source"] - -# Active query that is running - sqlquery/activequery: - driver: mssql - datasource: "sqlserver://:@localhost:1433?database=Kloudmate-test&encrypt=disable" - queries: - - sql: | - SELECT - r.session_id, - r.status, - r.command, - r.cpu_time, - r.start_time, - s.login_name, - s.host_name, - s.program_name, - st.text AS query_text, - 'mssql_active_query' as log_source - FROM - sys.dm_exec_requests r - INNER JOIN - sys.dm_exec_sessions s - ON - r.session_id = s.session_id - CROSS APPLY - sys.dm_exec_sql_text(r.sql_handle) st - WHERE - s.is_user_process = 1 - logs: - - body_column: query_text - attribute_columns: ["session_id", "status", "command", "cpu_time", "start_time", "login_name", "host_name", "program_name", "log_source"] -# user session - sqlquery/usersession: - driver: mssql - datasource: "sqlserver://:@localhost:1433?database=Kloudmate-test&encrypt=disable" - queries: - - sql: | - SELECT - session_id, - login_name, - host_name, - program_name, - login_time, - status, - client_interface_name, - cpu_time, - memory_usage, - reads, - writes, - 'mssql_user_sessions' as log_source - FROM - sys.dm_exec_sessions - WHERE - is_user_process = 1; - logs: - - body_column: login_name - attribute_columns: ["session_id", "host_name", "program_name", "login_time", "status", "client_interface_name", "cpu_time", "memory_usage", "reads", "writes", "log_source"] -``` - -### **Step 4: Configure Processors** - -Set up the processor component to identify resource information from the host and either append or replace the resource values in the telemetry data with this information. - -Choose **one configuration** based on where MSSQL is running. - -- **Server (On-premise / Non-cloud / Cloud)** - -```yaml -processors: - batch: - send_batch_size: 10000 - timeout: 30s - resourcedetection: - detectors: [system] - system: - resource_attributes: - host.name: - enabled: true - host.id: - enabled: true - os.type: - enabled: false - resource: - attributes: - - key: service.name - action: insert - from_attribute: host.name -``` - -- **AWS EC2:** - -Optional: To retrieve AWS EC2 instance tags along with logs and metrics, you need to associate an IAM role with the EC2 instance that includes the EC2\:DescribeTags policy. The processor below needs to be added: - -```yaml -processors: - batch: - send_batch_size: 5000 - timeout: 10s - - resourcedetection/ec2: - detectors: ["ec2"] - ec2: - tags: - - ^tag1$ - - ^tag2$ - - ^label.*$ - - ^Name$ - - resource: - attributes: - - key: service.name - action: insert - from_attribute: ec2.tag.Name - - key: service.instance.id - action: insert - from_attribute: host.id -``` - -- **Azure Virtual Machines:** - -```yaml -processors: - batch: - send_batch_size: 5000 - timeout: 10s - - resourcedetection/azure: - detectors: ["azure"] - azure: - tags: - - ^tag1$ - - ^tag2$ - - ^label.*$ - - ^Name$ - - resource: - attributes: - - key: service.name - action: insert - from_attribute: azure.vm.name - - key: service.instance.id - action: insert - from_attribute: host.id -``` - -### **Step 5: Configure Exporter and Pipelines** - -Configure the KloudMate backend exporter and define pipelines for metrics and logs. - -:::note - *Change the pipeline as per your correct configuration.* -::: - -```yaml -exporters: - debug: - verbosity: detailed - otlphttp: - endpoint: 'https://otel.kloudmate.com:4318' - headers: - Authorization: xxxxxxxx # Use the auth key - -service: - pipelines: - metrics: - receivers: [sqlserver, hostmetrics, sqlquery/upmetrics] - processors: [batch, resourcedetection, resource] - exporters: [debug, otlphttp] - - log: - receivers: [filelog, sqlquery/activequery, sqlquery/connection, sqlquery/audit, sqlquery/usersession, sqlquery/slowquery] - processors: [batch, resourcedetection, resource] - exporters: [debug, otlphttp] - extensions: [health_check, pprof, zpages, file_storage] -``` - -### **Step 6: Save Configuration and Restart Agent** - -After updating the configuration, click **Save Configuration** in the KloudMate UI. - -![image](https://app.archbee.com/api/optimize/dfeZmyJsGjUXyEH2hgHVe/v50H011QomNhH7lXX1BRP-20251126-110236.png) - -You can also restart the agent from your server’s console. - -**For Linux:** - -1. Execute the following commands: - -```none -systemctl restart kmagent -systemctl status kmagent -``` - -These commands restart the KloudMate Agent and display its current status. - -**For Windows** - -1. Open the **Services** window - - Press `Win + R`, type `services.msc`, and press `OK` - - Or search for **Services** from the Start menu -2. Locate the **KloudMate Agent** service. -3. Right-click the service and select **Restart**. - -After restarting the agent, verify that MSSQL metrics and logs are visible in the KloudMate dashboard. - -## Post‑Integration Data Validation - -Verify that metrics are flowing into KloudMate using the **Explore** view. - -After the agent restarts: - -1. Log in to KloudMate -2. Navigate to **Explore** -3. Select **OpenTelemetry → Metrics** -4. Choose a MSSQL metric and run the query - -Seeing time-series data confirms that MSSQL telemetry is flowing successfully. - -![image](./images/mongodb-monitoring-2.png) - -## **Standard MSSQL Dashboards** - -KloudMate provides prebuilt MSSQL dashboards through [dashboard templates](https://templates.kloudmate.com/mssql/index.html). These dashboards visualize MSSQL database performance, query operations, connections, and resource usage. - -To import and start using these templates, follow the steps described in [Importing a Dashboard](../../../visualize-data/dashboards/#importing-a-dashboard). Alternatively, use [From Template](../../../visualize-data/dashboards/create-a-dashboard/#from-template) when creating a new dashboard to pick from KloudMate's built-in templates. - -## Default Metrics - -| **Metrics** | **Description** | **Type** | **Unit** | -| ------------------------------------------------------- | -------------------------------------------------------------------------------------- | -------------------- | ------------ | -| sqlserver\_user\_connection\_count | Number of users connected to the SQL Server. | Gauge | number | -| sqlserver\_lock\_wait\_time\_avg | Average wait time for all lock requests that had to wait. | Gauge | milliseconds | -| sqlserver\_lock\_wait\_rate | Number of lock requests resulting in a wait. | Gauge | number | -| sqlserver\_batch\_request\_rate | Number of batch requests received by SQL Server. | Gauge | number | -| sqlserver\_batch\_sql\_compilation\_rate | Number of SQL compilations needed. | Gauge | number | -| sqlserver\_batch\_sql\_recompilation\_rate | Number of SQL recompilations needed. | Gauge | number | -| sqlserver\_page\_buffer\_cache\_hit\_ratio | Pages found in the buffer pool without having to read from disk. | Gauge | number | -| sqlserver\_page\_life\_expectancy | Time a page will stay in the buffer pool. | Gauge | seconds | -| sqlserver\_page\_split\_rate | Number of pages split as a result of overflowing index pages. | Gauge | number | -| sqlserver\_page\_lazy\_write\_rate | Number of lazy writes moving dirty pages to disk. | Gauge | number | -| sqlserver\_page\_checkpoint\_flush\_rate | Number of pages flushed by operations requiring dirty pages to be flushed. | Gauge | number | -| sqlserver\_page\_operation\_rate | Number of physical database page operations issued. | Gauge | number | -| sqlserver\_transaction\_log\_growth\_count | Total number of transaction log expansions for a database. | Sum | number | -| sqlserver\_transaction\_log\_shrink\_count | Total number of transaction logs shrinks for a database. | Sum | number | -| sqlserver\_transaction\_log\_usage | Percent of transaction log space used. | Gauge | number | -| sqlserver\_transaction\_log\_flush\_wait\_rate | Number of commits waiting for a transaction log flush. | Gauge | number | -| sqlserver\_transaction\_log\_flush\_rate | Number of log flushes. | Gauge | number | -| sqlserver\_transaction\_log\_flush\_data\_rate | Total number of log bytes flushed. | Gauge | bytes | -| sqlserver\_transaction\_rate | Number of transactions started for the database (not including XTP-only transactions). | Gauge | number | -| sqlserver\_transaction\_write\_rate | Number of transactions that were written to the database and committed. | Gauge | number | -| sqlserver\_database\_latency | Total time that the users waited for I/O issued on this file. | Sum | seconds | -| sqlserver\_database\_operations | The number of operations issued on the file. | Sum | number | -| sqlserver\_database\_io | The number of bytes of I/O on this file. | Sum | bytes | -| sqlserver\_resource\_pool\_disk\_throttled\_read\_rate | The number of read operations that were throttled in the last second | Gauge | number | -| sqlserver\_resource\_pool\_disk\_throttled\_write\_rate | The number of write operations that were throttled in the last second | Gauge | number | -| sqlserver\_processes\_blocked | The number of processes that are currently blocked. | Gauge | number | -| sqlserver\_database\_count | The number of databases. | Gauge | number | - -For the complete metrics list, refer to the [metrics reference](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/receiver/sqlserverreceiver/documentation.md). - -### - diff --git a/src/content/docs/docs/database-monitoring/database-integrations/mysql-monitoring.mdx b/src/content/docs/docs/database-monitoring/database-integrations/mysql-monitoring.mdx deleted file mode 100644 index de9606c0..00000000 --- a/src/content/docs/docs/database-monitoring/database-integrations/mysql-monitoring.mdx +++ /dev/null @@ -1,329 +0,0 @@ ---- -title: "MySQL" -description: "Monitor MySQL health, performance, and logs with the KloudMate Agent and OpenTelemetry." ---- -![image](./images/mysql-monitoring-1.png) - -This guide sets up MySQL monitoring with the **KloudMate Agent** and OpenTelemetry. It collects metrics and logs so you can watch the health, performance, and query behavior of MySQL instances running on AWS EC2, Azure Virtual Machines, or on-premise servers. A built-in dashboard visualizes the metrics, and you can set alerts on key MySQL conditions. - -# MySQL Integration using KloudMate Agents - -### What This Integration Provides - -With MySQL Monitoring enabled, KloudMate collects telemetry that provides visibility into: -• Buffer pool usage and operations -• Connection handling and thread states -• InnoDB row locks, double writes, and log operations -• Index I/O waits and table operations -• Query execution, sorts, and temporary resources -• MySQL server uptime and opened resources -• Slow query logs and error logs - -This visibility helps identify buffer pool inefficiencies, connection bottlenecks, InnoDB performance issues, and slow query problems. - -### Pre-requisites - -Before configuring MySQL Monitoring, ensure the following: - -1. MySQL version 8.0 or MariaDB 10.11 is installed and running. -2. Refer to the MySQL documentation for supported versions and configuration requirements. -3. The monitoring user must have permission to execute `SHOW GLOBAL STATUS`. -4. To collect query samples, `performance_schema` must be enabled and the monitoring user must be granted access: - `` `GRANT SELECT ON performance_schema.* TO @'%';` `` -5. KloudMate Agent installed on the MySQL host - - Refer to Agent installation for [Linux](../../../kloudmate-agent/installation/linux-agent/) or [Windows](../../../kloudmate-agent/installation/windows-agent/). -6. MySQL username and password for authentication. -7. MySQL logs must be enabled from configurations. - -### Step 1: Access Agents and OpenTelemetry Collector Configuration - -- Log in to the KloudMate platform -- Go to **Settings → Agents** -- Select the agent running on the MySQL host -- Click **Actions → Collector Configuration** -- YAML editor opens for configuration - -![image](./images/mongodb-monitoring-1.png) - -### Step 2: Add Required Extensions and Receivers - -**Extensions** - -```yaml -extensions: - file_storage: - create_directory: true -``` - -**Receivers** - -Two receivers are used: - -- **MySQL Receiver –** collects metrics -- **File Log Receiver –** collects logs (general, error, slow queries) - -If you only need metrics, configure only the MySQL receiver. - -```yaml -receivers: - mysql: - endpoint: localhost:3306 - username: root #Change the username - password: 'YourStr0ngPassword!' #Change the password - collection_interval: 60s - initial_delay: 1s - statement_events: - digest_text_limit: 120 - time_limit: 24h - limit: 250 - - filelog/mysqlerror: - include: [/var/log/mysql/error.log] - exclude: [/var/log/mysql/*.gz] - storage: file_storage - retry_on_failure: - enabled: true - operators: - - type: regex_parser - parse_to: body - regex: '(?P