diff --git a/src/content/docs/docs/ai-observability/ai-observability-interface.mdx b/src/content/docs/docs/ai-observability/ai-observability-interface.mdx index 2fc43ea9..bc89a1f9 100644 --- a/src/content/docs/docs/ai-observability/ai-observability-interface.mdx +++ b/src/content/docs/docs/ai-observability/ai-observability-interface.mdx @@ -104,7 +104,7 @@ The same tool name can appear on more than one row. For example, a `get_weather` ### Tool detail -![The tool detail drawer for fetch_page, with call and latency charts, the agents that used it, error types, and the latest failing calls with their arguments and results](./images/ai-observability-tool-detail.png) +![The tool detail drawer for create_ticket, with call and latency charts, the agents that used it, error types, and the latest failing calls with their arguments and results](./images/ai-observability-tool-detail.png) Select a tool to see its calls and errors over time, along with: diff --git a/src/content/docs/docs/ai-observability/images/ai-observability-breakdowns.png b/src/content/docs/docs/ai-observability/images/ai-observability-breakdowns.png index 4fb55efe..ef6ba1c5 100644 Binary files a/src/content/docs/docs/ai-observability/images/ai-observability-breakdowns.png and b/src/content/docs/docs/ai-observability/images/ai-observability-breakdowns.png differ diff --git a/src/content/docs/docs/ai-observability/images/ai-observability-overview.png b/src/content/docs/docs/ai-observability/images/ai-observability-overview.png index f01afd0c..097d320f 100644 Binary files a/src/content/docs/docs/ai-observability/images/ai-observability-overview.png and b/src/content/docs/docs/ai-observability/images/ai-observability-overview.png differ diff --git a/src/content/docs/docs/ai-observability/images/ai-observability-tool-detail.png b/src/content/docs/docs/ai-observability/images/ai-observability-tool-detail.png index 31801fe1..c81ec1c2 100644 Binary files a/src/content/docs/docs/ai-observability/images/ai-observability-tool-detail.png and b/src/content/docs/docs/ai-observability/images/ai-observability-tool-detail.png differ diff --git a/src/content/docs/docs/ai-observability/images/ai-observability-tools.png b/src/content/docs/docs/ai-observability/images/ai-observability-tools.png index 5b1b36dd..86058896 100644 Binary files a/src/content/docs/docs/ai-observability/images/ai-observability-tools.png and b/src/content/docs/docs/ai-observability/images/ai-observability-tools.png differ diff --git a/src/content/docs/docs/ai-observability/images/ai-observability-traces.png b/src/content/docs/docs/ai-observability/images/ai-observability-traces.png index c96f7d56..432c510f 100644 Binary files a/src/content/docs/docs/ai-observability/images/ai-observability-traces.png and b/src/content/docs/docs/ai-observability/images/ai-observability-traces.png differ diff --git a/src/content/docs/docs/alerts/images/setting-up-notifications-2.png b/src/content/docs/docs/alerts/images/setting-up-notifications-2.png index 9624389d..f94fe576 100644 Binary files a/src/content/docs/docs/alerts/images/setting-up-notifications-2.png and b/src/content/docs/docs/alerts/images/setting-up-notifications-2.png differ 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 d38b520e..39d96f76 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 @@ -13,7 +13,7 @@ Where the [Service Map](../service-map/) shows caller-to-callee dependencies and 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) +![API Monitoring page, showing the filter bar and the endpoints table with protocol badges, the Status column, and trend sparklines.](./images/api-monitoring-1.png) 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. @@ -25,11 +25,11 @@ Each row is one endpoint, identified by its service, protocol, and (for HTTP) me - **Endpoint:** a protocol badge (`HTTP`, `GRPC`, or `CONNECT_RPC`), a method chip for HTTP rows (`GET`, `POST`, …), and the endpoint label — a templated route such as `GET /users/{id}` for HTTP, or the full method name such as `pkg.Svc/Method` for RPC. - **Service:** the service that handles the endpoint. It links to that service's [APM dashboard](../apm-and-services/). -- **Throughput (req/min):** request rate over the selected window. +- **Req/min:** request rate over the selected window. - **Error rate:** the percentage of requests counted as errors (see [How Errors Are Counted](#how-errors-are-counted)). Shown in red when above zero. - **p50 / p95 / p99:** latency percentiles, in milliseconds. - **Status:** an error-focused summary of the HTTP status mix. It reads `healthy` when there are no `4xx` or `5xx` responses, and surfaces `4xx` and `5xx` counts when they occur. Hover it to see the full `2xx` / `3xx` / `4xx` / `5xx` breakdown, plus any uncategorized requests. -- **Throughput trend:** a sparkline of request volume across the window. +- **Trend:** a sparkline of request volume across the window. ### HTTP vs. RPC rows @@ -59,7 +59,7 @@ Use the filter bar above the table to narrow the list: - **Method:** one or more HTTP methods (`GET`, `POST`, `PUT`, `PATCH`, `DELETE`, `HEAD`, `OPTIONS`). - **Status:** restrict to endpoints that returned a given HTTP status class — `4xx` or `5xx`. -Click the **Throughput**, **Error rate**, or **p95** column header to sort by that metric. Sorting is always highest-first and is applied across all matching endpoints, so the table always shows the true top results rather than re-ordering only the current page. +Click the **Req/min**, **Error rate**, or **p95** column header to sort by that metric. Sorting is always highest-first and is applied across all matching endpoints, so the table always shows the true top results rather than re-ordering only the current page. :::tip To find failing endpoints quickly, sort by **Error rate**, or set the **Status** filter to `5xx`. 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 61f76675..85392f2e 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 @@ -24,24 +24,25 @@ Each row represents one service and includes: ## Service APM Dashboard -Clicking any service in the **List** view 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. The dashboard has tabs for **Overview**, [Runtime](../runtime/), [Infrastructure](../infrastructure/), **Traces**, and **Logs**. -![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 Overview tab of a service's APM dashboard, with the Throughput, Error rate, and latency cards, the Requests & Errors and Latency charts, and the Internal operations table](./images/apm-and-services-2.png) -The dashboard includes: +The **Overview** tab includes: - **Requests, errors, and latency over time:** timeline charts that help identify traffic spikes, error bursts, and latency regressions - **Service dependencies:** tables of downstream dependencies, outbound calls, and upstream callers, including request rate, error percentage, and latency +- **Internal operations:** work with no traced caller, such as jobs, scheduled tasks, and startup work, with its runs, errors, and latency - **Related issues, alerts, and dashboards:** links to broader operational context for that service ## Traces and Logs -From the APM dashboard, you can inspect related traces and logs for a selected service. +Use the **Traces** and **Logs** tabs to inspect the traces and logs for a selected service. -The **Traces** table shows recent traces with details such as start time, span name, kind, duration, and a link to the full trace for end-to-end request analysis. +The **Traces** tab shows recent traces with details such as start time, span name, kind, and duration. Click **View Trace** to open the full trace for end-to-end request analysis, or **Explore traces** to search across them. -![image](./images/apm-and-services-3.png) +![The Traces tab of a service's APM dashboard, with a table of start time, span name, kind, duration, and a View Trace action on each row](./images/apm-and-services-3.png) -The **Logs** table lists recent logs with time, severity, and message, along with actions to explore logs in detail and correlate them with traces and issues for faster root-cause investigation. +The **Logs** tab lists recent logs with time, severity, and message. Click **View Trace** on a log line to open the trace it belongs to, or **Explore logs** to investigate further. -![image](./images/apm-and-services-4.png) +![The Logs tab of a service's APM dashboard, with a table of time, severity, and message, and a View Trace action on log lines that carry a trace](./images/apm-and-services-4.png) diff --git a/src/content/docs/docs/apm-and-tracing/apm-views/images/api-monitoring-1.png b/src/content/docs/docs/apm-and-tracing/apm-views/images/api-monitoring-1.png index 2cc5ec23..a0a1a297 100644 Binary files a/src/content/docs/docs/apm-and-tracing/apm-views/images/api-monitoring-1.png and b/src/content/docs/docs/apm-and-tracing/apm-views/images/api-monitoring-1.png differ diff --git a/src/content/docs/docs/apm-and-tracing/apm-views/images/api-monitoring-2.png b/src/content/docs/docs/apm-and-tracing/apm-views/images/api-monitoring-2.png index ae57cc41..a7d74dc8 100644 Binary files a/src/content/docs/docs/apm-and-tracing/apm-views/images/api-monitoring-2.png and b/src/content/docs/docs/apm-and-tracing/apm-views/images/api-monitoring-2.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 0a104f03..845208da 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/apm-and-services-3.png b/src/content/docs/docs/apm-and-tracing/apm-views/images/apm-and-services-3.png index 293ad813..c7419971 100644 Binary files a/src/content/docs/docs/apm-and-tracing/apm-views/images/apm-and-services-3.png and b/src/content/docs/docs/apm-and-tracing/apm-views/images/apm-and-services-3.png differ diff --git a/src/content/docs/docs/apm-and-tracing/apm-views/images/apm-and-services-4.png b/src/content/docs/docs/apm-and-tracing/apm-views/images/apm-and-services-4.png index 787dc894..ece182dc 100644 Binary files a/src/content/docs/docs/apm-and-tracing/apm-views/images/apm-and-services-4.png and b/src/content/docs/docs/apm-and-tracing/apm-views/images/apm-and-services-4.png differ diff --git a/src/content/docs/docs/apm-and-tracing/apm-views/images/infrastructure-1.png b/src/content/docs/docs/apm-and-tracing/apm-views/images/infrastructure-1.png new file mode 100644 index 00000000..b10632e1 Binary files /dev/null and b/src/content/docs/docs/apm-and-tracing/apm-views/images/infrastructure-1.png differ diff --git a/src/content/docs/docs/apm-and-tracing/apm-views/images/infrastructure-2.png b/src/content/docs/docs/apm-and-tracing/apm-views/images/infrastructure-2.png new file mode 100644 index 00000000..7d9d4d95 Binary files /dev/null and b/src/content/docs/docs/apm-and-tracing/apm-views/images/infrastructure-2.png differ diff --git a/src/content/docs/docs/apm-and-tracing/apm-views/images/infrastructure-3.png b/src/content/docs/docs/apm-and-tracing/apm-views/images/infrastructure-3.png new file mode 100644 index 00000000..da66cd1f Binary files /dev/null and b/src/content/docs/docs/apm-and-tracing/apm-views/images/infrastructure-3.png differ diff --git a/src/content/docs/docs/apm-and-tracing/apm-views/images/runtime-1.png b/src/content/docs/docs/apm-and-tracing/apm-views/images/runtime-1.png new file mode 100644 index 00000000..ffe690d6 Binary files /dev/null and b/src/content/docs/docs/apm-and-tracing/apm-views/images/runtime-1.png differ diff --git a/src/content/docs/docs/apm-and-tracing/apm-views/images/runtime-2.png b/src/content/docs/docs/apm-and-tracing/apm-views/images/runtime-2.png new file mode 100644 index 00000000..1210028e Binary files /dev/null and b/src/content/docs/docs/apm-and-tracing/apm-views/images/runtime-2.png differ diff --git a/src/content/docs/docs/apm-and-tracing/apm-views/index.mdx b/src/content/docs/docs/apm-and-tracing/apm-views/index.mdx index 2933a24c..f89fb42c 100644 --- a/src/content/docs/docs/apm-and-tracing/apm-views/index.mdx +++ b/src/content/docs/docs/apm-and-tracing/apm-views/index.mdx @@ -21,6 +21,8 @@ It is built from tracing data and RED-style operational metrics. Use APM when yo - [Services](./apm-and-services/) for service-level request, latency, and error trends - [Service Map](./service-map/) for dependency topology and service-to-service flow analysis +- [Runtime](./runtime/) for a service's memory, GC, threads, leak signals, and release-to-release cost +- [Infrastructure](./infrastructure/) for the Kubernetes pods a service runs in, its resource findings, and capacity planning ## Setup Paths diff --git a/src/content/docs/docs/apm-and-tracing/apm-views/infrastructure.mdx b/src/content/docs/docs/apm-and-tracing/apm-views/infrastructure.mdx new file mode 100644 index 00000000..9440fe87 --- /dev/null +++ b/src/content/docs/docs/apm-and-tracing/apm-views/infrastructure.mdx @@ -0,0 +1,73 @@ +--- +title: "Infrastructure" +description: "Use a service's Infrastructure tab to see the Kubernetes pods and containers it runs in: CPU and memory against requests and limits, restarts, leak signals, and capacity planning." +sidebar: + order: 6 +--- +The **Infrastructure** tab on a service's APM page shows the Kubernetes pods and containers the service runs in. It answers questions the traces can't: is the pod near its memory limit, is it being throttled, are its requests sized right, and how many instances it needs at higher traffic. + +Open **APM & Services**, click a service, then select **Infrastructure**. The tab follows the page's time range. + +![The Infrastructure tab, with health cards for CPU and memory of limit, restarts, and pods, findings that the memory request is below real usage and the CPU request is oversized, and a stable container working set floor](./images/infrastructure-1.png) + +The tab needs the service to run on Kubernetes with the [KloudMate Agent for Kubernetes](../../../kloudmate-agent/installation/kubernetes-agent/) collecting container metrics. KloudMate matches the service to its pods through the traces, so the tab is empty for a range in which no pods ran the service. + +## Filters + +When the service runs in more than one pod, a **Pod** filter appears next to the tabs. When it reports `service.version`, a **Version** filter appears too. Both narrow every section of the tab. These filters are shared with the [Runtime](../runtime/) tab, so switching tabs keeps them. + +## Health + +The health cards show the pods' key values over the selected range: + +- **CPU of limit (peak):** the busiest pod against its CPU limit. At the limit, the kernel throttles the pod and latency rises. +- **Memory of limit (peak):** the busiest pod's working set against its memory limit. The working set is what the OOM killer measures, so at 100% the pod is killed. +- **Restarts:** container restarts in the range. +- **Pods:** pods that reported in the range. + +Green, amber, and red mark healthy, warning, and critical values. + +## Findings + +**Findings** checks the pods' limits and requests against what they actually used. Each finding names what to change: + +- **Containers were OOMKilled:** a container hit its memory limit and was killed. Raise the limit, or find what grows under **Memory leak signals**. +- **Container restarts:** each restart drops in-flight requests and resets runtime caches and JIT warm-up. +- **No memory limit:** one leaking pod can starve every other pod on the node. +- **Peak memory near the limit:** at 80% or more of the limit, a traffic spike or a slow leak will OOMKill the pod. +- **Memory request below real usage:** the scheduler overcommits the node. The finding suggests a request about 20% above the peak. +- **Memory or CPU request oversized:** the request is far above what the pods used. The finding suggests a smaller request that still covers the peak, which frees capacity on every node. +- **No CPU limit:** fine for latency-sensitive services, but **Capacity planning** then sizes from observed CPU. +- **CPU peaks near the limit:** at 90% or more of the limit, the kernel throttles the pod, which shows up as tail latency. + +## Memory leak signals + +The **Container working set floor** card tracks the lowest container memory in each 15 minutes, with a sparkline over the range. A steady climb is a leak. The card is marked **Growing** or **Stable**, shows the current value and how fast it's rising per hour, and estimates when it reaches the memory limit if it keeps growing. + +## Kubernetes resources + +These charts cover the containers of the pods the service ran on. + +- **CPU vs request and limit** +- **Memory vs request and limit**, using the working set +- **Memory by pod**, one line per pod, so an outlier stands out +- **Restarts and terminations**, per pod, with containers currently waiting or terminated and the reason +- **Major page faults**, pages read back from disk. Sustained faults mean memory pressure. + +![CPU vs request and limit, and Memory vs request and limit charts for the service's pods](./images/infrastructure-2.png) + +## Capacity planning + +**Capacity planning** estimates how many instances the service needs at higher traffic. It starts from what a request costs in CPU today, then sizes each traffic level so that every instance runs at 70% CPU. + +The summary line gives the CPU per request, the peak request rate, the instance count, and the cores per instance. Cores come from the CPU limit, or the CPU request when there's no limit. The table then shows the current peak and 1.5×, 2×, 3×, and 5× that peak, each with the requests per second, the CPU needed, the instances needed, and the memory those instances use. An instance count above today's is highlighted with how many more you need. + +![Capacity planning for a service: CPU per request, peak traffic, and the requests per second, CPU, instances, and memory needed at the current peak and at 1.5x, 2x, 3x, and 5x that peak](./images/infrastructure-3.png) + +The estimate assumes CPU grows in line with traffic. It needs request metrics and CPU usage for the service, and traffic in the selected range. + +## Related + +- [Runtime](../runtime/) for the language runtime inside these containers +- [Services](../apm-and-services/) for the service list and its APM dashboard +- [Kubernetes](../../../infrastructure/) for cluster-wide views diff --git a/src/content/docs/docs/apm-and-tracing/apm-views/runtime.mdx b/src/content/docs/docs/apm-and-tracing/apm-views/runtime.mdx new file mode 100644 index 00000000..3aff1df4 --- /dev/null +++ b/src/content/docs/docs/apm-and-tracing/apm-views/runtime.mdx @@ -0,0 +1,83 @@ +--- +title: "Runtime" +description: "Use a service's Runtime tab to read its language runtime health: memory, garbage collection, threads, leak signals, runtime settings, and how a release changed what an instance costs to run." +sidebar: + order: 5 +--- +The **Runtime** tab on a service's APM page shows how the service's language runtime behaves: memory, garbage collection (GC), threads, and the event loop or scheduler. Use it when a service is slow or restarting and the traces don't explain why, to tell whether the runtime is the cause and not the code or a dependency. + +Open **APM & Services**, click a service, then select **Runtime**. The tab follows the page's time range. + +![The Runtime tab of a Node.js service, with health cards for event loop delay, event loop utilization, heap of V8 limit, and time in GC, a finding that the V8 heap limit is above the container limit, and a stable old_space floor leak card](./images/runtime-1.png) + +## Supported runtimes + +The tab reads the runtime metrics that the OpenTelemetry SDK reports. + +| Runtime | How to get the metrics | +| --- | --- | +| Java (JVM) | The OpenTelemetry Java agent reports them by default. For heap buffers and CPU load, add `-Dotel.instrumentation.runtime-telemetry.emit-experimental-metrics=true`. | +| Go | Call `runtime.Start()` from `go.opentelemetry.io/contrib/instrumentation/runtime`. Scheduler latency also needs `runtime.NewProducer()` on the metric reader. | +| Node.js | `@opentelemetry/auto-instrumentations-node` includes them by default. With a manual setup, register `@opentelemetry/instrumentation-runtime-node`. | +| .NET | On .NET 9 and later, add the built-in meter with `AddMeter("System.Runtime")`. On .NET 6 to 8, add `OpenTelemetry.Instrumentation.Runtime` with `AddRuntimeInstrumentation()`. | +| Python | Install `opentelemetry-instrumentation-system-metrics`. The OpenTelemetry Operator's Python image and `opentelemetry-bootstrap` include it. | + +Services that the [KloudMate Agent instruments with the SDK](../../auto-instrumentation/) report these metrics with no extra setup. A service traced with eBPF only doesn't report runtime metrics. If it runs on Kubernetes, its container metrics are still on the [Infrastructure](../infrastructure/) tab. + +## Filters + +When the service reports `service.version`, a **Version** filter appears next to the tabs. When it runs in more than one pod, a **Pod** filter appears too. Both narrow every section of the tab. Picking a version limits the **Pod** list to the pods that ran that version. + +## Health + +The health cards show the runtime's key values over the selected range, as a peak or an average. Green, amber, and red mark healthy, warning, and critical values. + +| Runtime | Cards | +| --- | --- | +| Java | Heap after GC (of max), Time in GC, GC pause p99, Blocked threads (peak) | +| Go | Goroutines (peak / instance), Heap of GOMEMLIMIT, Allocation rate, Scheduler latency p99 | +| Node.js | Event loop delay p99 (peak), Event loop utilization, Heap of V8 limit, Time in GC | +| .NET | GC pause time, Gen2 collections, Thread pool queue (peak), Exceptions | +| Python | RSS (peak / instance), CPU, Gen2 collections, Uncollectable objects | + +## Findings + +**Findings** checks the runtime's memory and CPU settings against the container's limits, for services that run on Kubernetes. Each finding names the setting to change. For example: + +- **Java:** the max heap is above 80% of the container's memory limit. Metaspace, thread stacks, and direct buffers live outside the heap, so the pod is OOMKilled before the JVM throws `OutOfMemoryError`. Keep `-Xmx` or `MaxRAMPercentage` at 75% or less. +- **Go:** `GOMEMLIMIT` isn't set, so the GC doesn't know about the container's limit. Or `GOMAXPROCS` is above the CPU limit, so the pod gets throttled. +- **Node.js:** the V8 heap limit is above the container's limit, or so far below it that Node runs out of heap while the container still has room. Set `--max-old-space-size` to about 75% of the container's limit. + +## Memory leak signals + +Each card tracks the level memory returns to after each collection, such as the Java heap live set or the Node.js old space floor, with a sparkline over the range. A steady climb is a leak. The card is marked **Growing** or **Stable**, shows the current value and how fast it's rising per hour, and estimates when it reaches the limit if it keeps growing. + +## Runtime impact and efficiency + +These charts compare the runtime with the service's traffic. + +- **Request latency vs** the runtime's pause signal (GC pause p99 for Java, event loop delay p99 for Node.js, scheduler latency p99 for Go). Spikes that line up mean the runtime is slowing requests. +- **Throughput vs CPU.** CPU should track traffic. CPU rising while traffic is flat means each request costs more work. +- **CPU time per request.** The unit cost of a request. Compare it before and after a release to catch efficiency regressions. + +![The Runtime impact and efficiency charts: request latency against event loop delay p99, and throughput against CPU cores](./images/runtime-2.png) + +## Runtime charts + +The section named after the runtime, such as **JVM** or **Node.js runtime**, charts memory by pool or generation, GC rate and pauses, threads, CPU, and runtime-specific signals such as goroutines, the event loop, the .NET thread pool, or Python's uncollectable objects. Each chart's description says what to look for. + +## Version comparison + +**Version comparison** shows whether a release changed what an instance costs to run. Pick a **Baseline** and a **Compared** version to see memory, CPU, and GC per instance side by side, with the change between them. A rise is the regression, since every row is a cost. Both versions must have run in the selected range, so widen the range to compare a release with the one before it. + +**Deployments in range** lists each version with when it was first and last seen and its peak instance count. The service needs to report `service.version` for this section. + +## Instances + +The table lists each instance (pod, host, or service instance) with its memory, CPU, a key runtime value, and restarts. A cell well above the fleet median is highlighted, as is any restart. Use it to find the one pod that behaves differently from the rest. + +## Related + +- [Infrastructure](../infrastructure/) for the pods and containers the service runs in +- [Services](../apm-and-services/) for the service list and its APM dashboard +- [Auto-Instrumentation](../../auto-instrumentation/) to add the SDK with no code change diff --git a/src/content/docs/docs/apm-and-tracing/images/traces-1.png b/src/content/docs/docs/apm-and-tracing/images/traces-1.png index e42c73dc..52b81aa4 100644 Binary files a/src/content/docs/docs/apm-and-tracing/images/traces-1.png and b/src/content/docs/docs/apm-and-tracing/images/traces-1.png differ diff --git a/src/content/docs/docs/apm-and-tracing/index.mdx b/src/content/docs/docs/apm-and-tracing/index.mdx index 94f494b7..50973412 100644 --- a/src/content/docs/docs/apm-and-tracing/index.mdx +++ b/src/content/docs/docs/apm-and-tracing/index.mdx @@ -6,7 +6,7 @@ sidebar: order: 1 --- -![image](./images/traces-1.png) +![The Traces page in Trace summary view, with filters for duration, service, severity, HTTP method, and HTTP status beside a list of traces showing timestamp, entry, services, spans, and duration.](./images/traces-1.png) 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. diff --git a/src/content/docs/docs/aws-integration/account-setup.mdx b/src/content/docs/docs/aws-integration/account-setup.mdx index c6bf9ab3..69524ff1 100644 --- a/src/content/docs/docs/aws-integration/account-setup.mdx +++ b/src/content/docs/docs/aws-integration/account-setup.mdx @@ -1,39 +1,50 @@ --- title: "AWS Account Setup" -description: "Connect your AWS account to KloudMate using the built-in AWS integration flow." +description: "Connect your AWS account to KloudMate from Settings → Data Sources with a pre-configured CloudFormation stack, then edit or delete it later." sidebar: label: "AWS Account Setup" order: 2 --- -Use the AWS integration flow when you want to connect an AWS account to KloudMate without instrumenting each workload individually. +Connect an AWS account to KloudMate so it can read CloudWatch metrics and logs from that account, with no code changes. KloudMate gives you a pre-configured CloudFormation stack that creates a delegation role in your account, and you paste the role's ARN back into KloudMate. ## Connect Your AWS Account -1. Sign in to KloudMate and choose **AWS Integration** in the **Send Data to KloudMate** step. -2. Enter a name for the AWS account you want to connect. -3. Open the hyperlink shown in step 1 of the KloudMate onboarding flow. +1. Go to **Settings → Data Sources** and click **Connect AWS account**. The **Accounts** counter beside it shows how many accounts you've connected out of the number your plan allows. -![image](../images/setting-up-kloudmate-6.png) +![The Data Sources page with the Accounts counter and the Connect AWS account button.](../images/aws-account-setup-data-sources.png) -4. Sign in to AWS with an administrator account if required. -5. Review the generated CloudFormation stack and click **Create Stack**. +2. Enter an **Account name** and click **Continue**. The name identifies the account in KloudMate, so use one you'll recognize, such as `prod-aws`. -![image](../images/setting-up-kloudmate-7.png) +![The Name your AWS account step, with the Account name field and the Continue button.](../images/aws-account-setup-name.png) -6. Wait for the IAM role to be created. This usually takes up to two minutes. -7. Open the **Outputs** tab in CloudFormation and copy the generated **ARN Value**. +3. Click **Open AWS Console**. It opens CloudFormation with the stack template and external ID already filled in. Sign in to AWS with an administrator account if you're asked to. -![image](../images/setting-up-kloudmate-8.png) +![The Connect AWS account page, with the Open AWS Console button, the steps to follow in AWS, and the Role ARN field.](../images/aws-account-setup-connect.png) -8. Paste the ARN into the **Role ARN** field in KloudMate and click **Next**. +4. In AWS, check **I acknowledge that AWS CloudFormation might create IAM resources** at the bottom of the **Quick create stack** page, and click **Create stack**. +5. Wait for the stack to be created. This takes about a minute. +6. Open the stack's **Outputs** tab and copy the value of **KloudMateAppDelegationRoleArn**. +7. Back in KloudMate, paste the ARN into the **Role ARN** field and click **Connect**. -![image](../images/setting-up-kloudmate-9.png) +The account appears on the **Data Sources** page. To add another account, repeat these steps. -Your AWS account is now connected to KloudMate. +## Edit or Delete an Account + +Each account on the **Data Sources** page has an **Edit** button. An account you named but haven't finished connecting shows **Pending**, with no account ID. When you reach your plan's account limit, **Connect AWS account** is turned off. + +![A Pending AWS account card with no account ID and an Edit button, and the Accounts counter at its 1 of 1 limit with Connect AWS account turned off.](../images/aws-account-setup-edit.png) + +Click **Edit** to open **Edit Account Details**. It shows the account's AWS account ID and external ID. + +- To rename the account or finish connecting it, change the **AWS Account Name** or paste the **Role ARN**, then click **Update**. If you don't have a role yet, **Click here to add KloudMate CloudFormation stack to AWS** opens the stack in AWS. +- To remove the account, click **Delete account**. You need the **Owner** role, and the account's data is deleted permanently. See [Remove an AWS Account](../../platform/settings/deleting-your-aws-account-from-kloudmate/) to also remove the stack from AWS. + +![The Edit Account Details screen, with the AWS account ID, external ID, account name, Role ARN field, Update button, and Delete account section.](../images/aws-account-setup-edit-details.png) ## Related Resources - [AWS Integration](../) +- [Data Sources](../../platform/settings/data-sources/) - [CloudWatch Logs](../cloudwatch-logs/) - [AWS Lambda Monitoring](../lambda-monitoring/) - [Troubleshoot AWS sync](../../platform/settings/troubleshoot-aws-sync/) diff --git a/src/content/docs/docs/aws-integration/cloudwatch-logs/images/subscribing-to-aws-cloudwatch-logs-1.png b/src/content/docs/docs/aws-integration/cloudwatch-logs/images/subscribing-to-aws-cloudwatch-logs-1.png index fdf7a4ef..a25db4e4 100644 Binary files a/src/content/docs/docs/aws-integration/cloudwatch-logs/images/subscribing-to-aws-cloudwatch-logs-1.png and b/src/content/docs/docs/aws-integration/cloudwatch-logs/images/subscribing-to-aws-cloudwatch-logs-1.png differ diff --git a/src/content/docs/docs/aws-integration/cloudwatch-logs/images/subscribing-to-aws-cloudwatch-logs-2.png b/src/content/docs/docs/aws-integration/cloudwatch-logs/images/subscribing-to-aws-cloudwatch-logs-2.png index f62000c8..fb432dc5 100644 Binary files a/src/content/docs/docs/aws-integration/cloudwatch-logs/images/subscribing-to-aws-cloudwatch-logs-2.png and b/src/content/docs/docs/aws-integration/cloudwatch-logs/images/subscribing-to-aws-cloudwatch-logs-2.png differ diff --git a/src/content/docs/docs/aws-integration/cloudwatch-logs/images/subscribing-to-aws-cloudwatch-logs-3.png b/src/content/docs/docs/aws-integration/cloudwatch-logs/images/subscribing-to-aws-cloudwatch-logs-3.png deleted file mode 100644 index 89f9208f..00000000 Binary files a/src/content/docs/docs/aws-integration/cloudwatch-logs/images/subscribing-to-aws-cloudwatch-logs-3.png and /dev/null differ diff --git a/src/content/docs/docs/aws-integration/cloudwatch-logs/images/subscribing-to-aws-cloudwatch-logs-4.png b/src/content/docs/docs/aws-integration/cloudwatch-logs/images/subscribing-to-aws-cloudwatch-logs-4.png deleted file mode 100644 index b4c6c734..00000000 Binary files a/src/content/docs/docs/aws-integration/cloudwatch-logs/images/subscribing-to-aws-cloudwatch-logs-4.png and /dev/null differ diff --git a/src/content/docs/docs/aws-integration/cloudwatch-logs/index.mdx b/src/content/docs/docs/aws-integration/cloudwatch-logs/index.mdx index 79872744..704a86c7 100644 --- a/src/content/docs/docs/aws-integration/cloudwatch-logs/index.mdx +++ b/src/content/docs/docs/aws-integration/cloudwatch-logs/index.mdx @@ -18,18 +18,16 @@ Lambda logs from the connected AWS account are ingested automatically. ## Subscribe a CloudWatch Log Group -1. From the KloudMate home screen, open **Settings -> Data Sources**. -2. In the list of connected AWS accounts, click the more options (⋮) icon for the account you want to ingest CloudWatch logs from, then select **CloudWatch Logs**. +1. Go to **Settings → Data Sources**. +2. On the card of the AWS account you want to ingest logs from, open the menu (⋮) and select **CloudWatch Logs**. -![image](./images/subscribing-to-aws-cloudwatch-logs-1.png) +![A connected AWS account card on the Data Sources page, with its menu open and CloudWatch Logs highlighted.](./images/subscribing-to-aws-cloudwatch-logs-1.png) -3. Choose the AWS region or use search to find the log groups you want. - -![image](./images/subscribing-to-aws-cloudwatch-logs-2.png) +3. Pick the AWS region, or search for a log group by name. The list shows each log group's name, stored bytes, and creation time. 4. Click **Subscribe** for each log group that you want KloudMate to ingest. -![image](./images/subscribing-to-aws-cloudwatch-logs-3.png) +![The CloudWatch Logs page, with the region picker, log group search, and a list of log groups with the Subscribe button highlighted on the first row.](./images/subscribing-to-aws-cloudwatch-logs-2.png) ## CloudWatch Subscription Filter Limit @@ -39,14 +37,12 @@ AWS allows only two subscription filters per log group. If a log group already has two active subscription filters, KloudMate cannot add another one until an existing filter is removed. -![image](./images/subscribing-to-aws-cloudwatch-logs-4.png) - ## Remove an Existing Subscription Filter To free a subscription slot: 1. Open the AWS console. -2. Go to **CloudWatch -> Log groups**. +2. Go to **CloudWatch → Log groups**. 3. Select the relevant log group. 4. Open **Actions**. 5. Click **Remove Subscription Filter**. diff --git a/src/content/docs/docs/aws-integration/images/lambda-functions-1.png b/src/content/docs/docs/aws-integration/images/lambda-functions-1.png index 5141313e..a62ded37 100644 Binary files a/src/content/docs/docs/aws-integration/images/lambda-functions-1.png and b/src/content/docs/docs/aws-integration/images/lambda-functions-1.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 25d6db99..7f24afd4 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 8f7f4c1c..4abdaca6 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/lambda-monitoring.mdx b/src/content/docs/docs/aws-integration/lambda-monitoring.mdx index b9365d05..8c27019b 100644 --- a/src/content/docs/docs/aws-integration/lambda-monitoring.mdx +++ b/src/content/docs/docs/aws-integration/lambda-monitoring.mdx @@ -17,7 +17,7 @@ KloudMate collects and aggregates Lambda metrics such as: ## Lambda Console Walkthrough -The **Lambda** tab lists the Lambda functions in the selected AWS account. Search by name to find a specific function. +The **Lambda** tab under **Serverless** lists the Lambda functions in the selected AWS account. Pick the account from the menu beside the search box, and search by name to find a specific function. The metrics in the list cover the last 24 hours. ![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) 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 22000056..7e7e6436 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 @@ -21,7 +21,7 @@ This document provides a step-by-step manual approach to integrating Azure Monit **Step 1: Access Agents and OpenTelemetry Collector Configuration** - Navigate to the KloudMate platform and log in to your account. -- Go to **Settings** > **Agents** section. +- Go to **Settings** > **Agents & Pipelines** section. - Here you can: - View all installed agents. - Access configuration settings for each agent. diff --git a/src/content/docs/docs/images/aws-account-setup-connect.png b/src/content/docs/docs/images/aws-account-setup-connect.png new file mode 100644 index 00000000..38f67eea Binary files /dev/null and b/src/content/docs/docs/images/aws-account-setup-connect.png differ diff --git a/src/content/docs/docs/images/aws-account-setup-data-sources.png b/src/content/docs/docs/images/aws-account-setup-data-sources.png new file mode 100644 index 00000000..4e821006 Binary files /dev/null and b/src/content/docs/docs/images/aws-account-setup-data-sources.png differ diff --git a/src/content/docs/docs/images/aws-account-setup-edit-details.png b/src/content/docs/docs/images/aws-account-setup-edit-details.png new file mode 100644 index 00000000..3df41411 Binary files /dev/null and b/src/content/docs/docs/images/aws-account-setup-edit-details.png differ diff --git a/src/content/docs/docs/images/aws-account-setup-edit.png b/src/content/docs/docs/images/aws-account-setup-edit.png new file mode 100644 index 00000000..8496664b Binary files /dev/null and b/src/content/docs/docs/images/aws-account-setup-edit.png differ diff --git a/src/content/docs/docs/images/aws-account-setup-name.png b/src/content/docs/docs/images/aws-account-setup-name.png new file mode 100644 index 00000000..5b55bd30 Binary files /dev/null and b/src/content/docs/docs/images/aws-account-setup-name.png differ diff --git a/src/content/docs/docs/images/setting-up-kloudmate-6.png b/src/content/docs/docs/images/setting-up-kloudmate-6.png deleted file mode 100644 index d3dc8122..00000000 Binary files a/src/content/docs/docs/images/setting-up-kloudmate-6.png and /dev/null differ diff --git a/src/content/docs/docs/images/setting-up-kloudmate-7.png b/src/content/docs/docs/images/setting-up-kloudmate-7.png deleted file mode 100644 index 88fd032b..00000000 Binary files a/src/content/docs/docs/images/setting-up-kloudmate-7.png and /dev/null differ diff --git a/src/content/docs/docs/images/setting-up-kloudmate-8.png b/src/content/docs/docs/images/setting-up-kloudmate-8.png deleted file mode 100644 index fa391739..00000000 Binary files a/src/content/docs/docs/images/setting-up-kloudmate-8.png and /dev/null differ diff --git a/src/content/docs/docs/images/setting-up-kloudmate-9.png b/src/content/docs/docs/images/setting-up-kloudmate-9.png deleted file mode 100644 index 995d4f2f..00000000 Binary files a/src/content/docs/docs/images/setting-up-kloudmate-9.png and /dev/null differ diff --git a/src/content/docs/docs/incident-management/escalation-policy/images/escalation-policy-1.jpeg b/src/content/docs/docs/incident-management/escalation-policy/images/escalation-policy-1.jpeg index 7928658f..9a351120 100644 Binary files a/src/content/docs/docs/incident-management/escalation-policy/images/escalation-policy-1.jpeg and b/src/content/docs/docs/incident-management/escalation-policy/images/escalation-policy-1.jpeg differ diff --git a/src/content/docs/docs/incident-management/escalation-policy/images/escalation-policy-detail.png b/src/content/docs/docs/incident-management/escalation-policy/images/escalation-policy-detail.png index c282de40..02959ad7 100644 Binary files a/src/content/docs/docs/incident-management/escalation-policy/images/escalation-policy-detail.png and b/src/content/docs/docs/incident-management/escalation-policy/images/escalation-policy-detail.png differ diff --git a/src/content/docs/docs/incident-management/escalation-policy/images/escalation-step-recipients.png b/src/content/docs/docs/incident-management/escalation-policy/images/escalation-step-recipients.png index 41a39564..ecdc5e27 100644 Binary files a/src/content/docs/docs/incident-management/escalation-policy/images/escalation-step-recipients.png and b/src/content/docs/docs/incident-management/escalation-policy/images/escalation-step-recipients.png differ diff --git a/src/content/docs/docs/incident-management/images/msteams-team-page.png b/src/content/docs/docs/incident-management/images/msteams-team-page.png new file mode 100644 index 00000000..9ca3fafb Binary files /dev/null and b/src/content/docs/docs/incident-management/images/msteams-team-page.png differ diff --git a/src/content/docs/docs/incident-management/images/slack-integration-1.png b/src/content/docs/docs/incident-management/images/slack-integration-1.png index 8ea5e436..89d40c9f 100644 Binary files a/src/content/docs/docs/incident-management/images/slack-integration-1.png and b/src/content/docs/docs/incident-management/images/slack-integration-1.png differ diff --git a/src/content/docs/docs/incident-management/images/what-is-incident-management_-1.jpeg b/src/content/docs/docs/incident-management/images/what-is-incident-management_-1.jpeg index 3e318803..6373bc95 100644 Binary files a/src/content/docs/docs/incident-management/images/what-is-incident-management_-1.jpeg and b/src/content/docs/docs/incident-management/images/what-is-incident-management_-1.jpeg differ diff --git a/src/content/docs/docs/incident-management/incidents/images/creating-an-incident-1.png b/src/content/docs/docs/incident-management/incidents/images/creating-an-incident-1.png index af6eacfa..7919a2e9 100644 Binary files a/src/content/docs/docs/incident-management/incidents/images/creating-an-incident-1.png and b/src/content/docs/docs/incident-management/incidents/images/creating-an-incident-1.png differ diff --git a/src/content/docs/docs/incident-management/incidents/images/incident-details-1.png b/src/content/docs/docs/incident-management/incidents/images/incident-details-1.png index 662c18ea..acdb8a3a 100644 Binary files a/src/content/docs/docs/incident-management/incidents/images/incident-details-1.png and b/src/content/docs/docs/incident-management/incidents/images/incident-details-1.png differ diff --git a/src/content/docs/docs/incident-management/incidents/images/incident-publish-status-page.png b/src/content/docs/docs/incident-management/incidents/images/incident-publish-status-page.png index 2af6e072..063b6fa8 100644 Binary files a/src/content/docs/docs/incident-management/incidents/images/incident-publish-status-page.png and b/src/content/docs/docs/incident-management/incidents/images/incident-publish-status-page.png differ diff --git a/src/content/docs/docs/incident-management/incidents/images/incident-responders.png b/src/content/docs/docs/incident-management/incidents/images/incident-responders.png index 20bd9ac9..56009a83 100644 Binary files a/src/content/docs/docs/incident-management/incidents/images/incident-responders.png and b/src/content/docs/docs/incident-management/incidents/images/incident-responders.png differ diff --git a/src/content/docs/docs/incident-management/incidents/images/incident-war-room-panel.png b/src/content/docs/docs/incident-management/incidents/images/incident-war-room-panel.png new file mode 100644 index 00000000..c54ee1e1 Binary files /dev/null and b/src/content/docs/docs/incident-management/incidents/images/incident-war-room-panel.png differ diff --git a/src/content/docs/docs/incident-management/incidents/images/incidents-list-filters.png b/src/content/docs/docs/incident-management/incidents/images/incidents-list-filters.png index 9ae24224..5ebd05a2 100644 Binary files a/src/content/docs/docs/incident-management/incidents/images/incidents-list-filters.png and b/src/content/docs/docs/incident-management/incidents/images/incidents-list-filters.png differ diff --git a/src/content/docs/docs/incident-management/incidents/incident-details.mdx b/src/content/docs/docs/incident-management/incidents/incident-details.mdx index e6d0be45..6b1f647c 100644 --- a/src/content/docs/docs/incident-management/incidents/incident-details.mdx +++ b/src/content/docs/docs/incident-management/incidents/incident-details.mdx @@ -1,13 +1,13 @@ --- title: "Incident Details" -description: "Read the activity timeline, manage responders and severity, and publish an incident to a status page." +description: "Read the activity timeline, manage responders and severity, start a war room, and publish an incident to a status page." sidebar: label: "Incident Details" order: 3 --- Open any incident from the list to view its detail page. It's the single place to see what happened, who was paged, and how the response unfolded. -![Incident detail page with the header, metrics, and incident summary](./images/incident-details-1.png) +![Incident detail page with the header, Incident War Room panel, metrics, and incident summary](./images/incident-details-1.png) ## The header @@ -21,6 +21,16 @@ The header identifies the incident and its routing: Use **Acknowledge** or **Resolve** in the top-right to update the status; you can also unacknowledge or unresolve. +## Start a war room + +Use the **Incident War Room** panel to give this incident its own Slack or Microsoft Teams channel, with the responders and on-call engineers in it and a link to the call. + +Click **Start war room**. You can change the channel name, paste a call link, and invite extra people before the room opens. + +![The Incident War Room panel, marked Not Active, with the Start war room button highlighted](./images/incident-war-room-panel.png) + +Once the room is open, the panel shows it as **Active**. To connect Slack or Teams first, see [Set up war rooms](../../war-rooms/setup/). To learn what responders see in the channel, see [Incident War Rooms](../../war-rooms/). + ## Incident metrics Alongside the header, the page shows the numbers that matter during response: @@ -36,7 +46,7 @@ Alongside the header, the page shows the numbers that matter during response: - **Severity** — change the severity; the change is recorded on the timeline. - **Summary** — edit the incident description with the context of what happened and its impact. -![Responders, severity, and the incident summary, each with its edit control](./images/incident-responders.png) +![The incident detail page with arrows on the edit icons for severity and the incident summary](./images/incident-responders.png) ## Incident summary diff --git a/src/content/docs/docs/incident-management/integrations/images/adding-integrations-1.png b/src/content/docs/docs/incident-management/integrations/images/adding-integrations-1.png index 19149f70..d66a6cee 100644 Binary files a/src/content/docs/docs/incident-management/integrations/images/adding-integrations-1.png and b/src/content/docs/docs/incident-management/integrations/images/adding-integrations-1.png differ diff --git a/src/content/docs/docs/incident-management/integrations/images/alert-sources-list.png b/src/content/docs/docs/incident-management/integrations/images/alert-sources-list.png index afffa519..d94de364 100644 Binary files a/src/content/docs/docs/incident-management/integrations/images/alert-sources-list.png and b/src/content/docs/docs/incident-management/integrations/images/alert-sources-list.png differ diff --git a/src/content/docs/docs/incident-management/integrations/images/cloudwatch-alert-source-1.png b/src/content/docs/docs/incident-management/integrations/images/cloudwatch-alert-source-1.png index 09564387..4c38144b 100644 Binary files a/src/content/docs/docs/incident-management/integrations/images/cloudwatch-alert-source-1.png and b/src/content/docs/docs/incident-management/integrations/images/cloudwatch-alert-source-1.png differ diff --git a/src/content/docs/docs/incident-management/integrations/images/cloudwatch-alert-source-2.png b/src/content/docs/docs/incident-management/integrations/images/cloudwatch-alert-source-2.png index 626e5c90..3fd528a0 100644 Binary files a/src/content/docs/docs/incident-management/integrations/images/cloudwatch-alert-source-2.png and b/src/content/docs/docs/incident-management/integrations/images/cloudwatch-alert-source-2.png differ diff --git a/src/content/docs/docs/incident-management/integrations/images/webhook-liquid-reference.png b/src/content/docs/docs/incident-management/integrations/images/webhook-liquid-reference.png index 2a9cfc92..d7fa6953 100644 Binary files a/src/content/docs/docs/incident-management/integrations/images/webhook-liquid-reference.png and b/src/content/docs/docs/incident-management/integrations/images/webhook-liquid-reference.png differ diff --git a/src/content/docs/docs/incident-management/integrations/images/webhook-template-fields.png b/src/content/docs/docs/incident-management/integrations/images/webhook-template-fields.png index 56856f38..c3c20075 100644 Binary files a/src/content/docs/docs/incident-management/integrations/images/webhook-template-fields.png and b/src/content/docs/docs/incident-management/integrations/images/webhook-template-fields.png differ diff --git a/src/content/docs/docs/incident-management/integrations/images/webhook-template-tester.png b/src/content/docs/docs/incident-management/integrations/images/webhook-template-tester.png index 286a1bfe..f6782ef7 100644 Binary files a/src/content/docs/docs/incident-management/integrations/images/webhook-template-tester.png and b/src/content/docs/docs/incident-management/integrations/images/webhook-template-tester.png differ diff --git a/src/content/docs/docs/incident-management/integrations/index.mdx b/src/content/docs/docs/incident-management/integrations/index.mdx index de8b8df9..d3d98038 100644 --- a/src/content/docs/docs/incident-management/integrations/index.mdx +++ b/src/content/docs/docs/incident-management/integrations/index.mdx @@ -28,7 +28,7 @@ KloudMate Alert group and CloudWatch Alarm sources use built-in templates. To in Open **Incidents → Alert sources** to see every source with its name, description, type, service, and escalation policy. -![Alert sources list](./images/alert-sources-list.png) +![The Alert sources tab listing each source with its description, type, service, escalation policy, and an actions menu](./images/alert-sources-list.png) ## Alert source details diff --git a/src/content/docs/docs/incident-management/microsoft-teams-integration.mdx b/src/content/docs/docs/incident-management/microsoft-teams-integration.mdx new file mode 100644 index 00000000..a4523d09 --- /dev/null +++ b/src/content/docs/docs/incident-management/microsoft-teams-integration.mdx @@ -0,0 +1,120 @@ +--- +title: "Microsoft Teams Integration" +description: "Add the KloudMate app to a Microsoft Teams team so its channels get incident alerts that responders can act on." +sidebar: + label: "Microsoft Teams Integration" + order: 12 +--- + +Connect a Microsoft Teams team to your KloudMate workspace to send incident alerts to its channels. Responders acknowledge, resolve, add responders, and start a war room from the alert card in Teams. War rooms open as channels in the same team. + +You'll need a Teams admin to upload the app, a team owner to add it to a team, and a KloudMate workspace admin to confirm the connection. One person can do all three if they hold all three roles. + +## Before you start + +- Download the KloudMate app package, [`kloudmate-teams-app.zip`](https://api.kloudmate.com/integrations/msteams/app-package.zip). It's also in KloudMate: go to **Settings** > **Connections**, click **Connect**, and select **Microsoft Teams**. +- KloudMate sends alerts to **General** and standard channels. You can add the app to a private or shared channel, but KloudMate doesn't send alerts there, and adding or removing it there doesn't change the team's connection. + +## Upload the app to your organization + +A Teams admin does this once for the whole organization. + +1. In the [Teams admin center](https://admin.teams.microsoft.com/), go to **Teams apps** > **Manage apps**. +2. Select **Upload new app** (in some layouts, **Actions** > **Upload new app**) and upload `kloudmate-teams-app.zip`. +3. Check that the app's status is **Allowed**, and that your app permission policies let your team owners use it. + +The app can take a few hours to show up in Teams under **Built for your org**. When KloudMate ships a new version of the app, upload the new zip with **Upload file** on the app's page. + +## Allow the app's team permissions + +The app asks for permissions on each team it's added to, never on your whole organization. The team owner who adds the app grants them for that team. + +| Permission | What KloudMate uses it for | +| --- | --- | +| `TeamMember.Read.Group` | Checks that the person who clicks **Connect** or **Disconnect** in Teams owns the team. | +| `ChannelMessage.Read.Group` | Reads the messages in a war room channel to write the incident summary. Teams sends KloudMate every message in the team's standard channels; KloudMate drops the ones that don't mention it without storing them. | +| `Channel.Create.Group` | Creates a channel for each war room. | +| `ChannelSettings.ReadWrite.Group` | Renames a war room's channel when the room closes. | +| `Channel.Delete.Group` | Deletes a closed war room's channel 7 days after it closes. | + +Whether team owners can grant these depends on your tenant's team resource-specific consent (RSC) setting. The default, `ManagedByMicrosoft`, allows it, so most organizations have nothing to change. + +To check the setting, run this in [Microsoft Graph PowerShell](https://learn.microsoft.com/en-us/powershell/microsoftgraph/get-started). Connecting Graph PowerShell to your organization for the first time needs a Global Administrator. + +```powershell +Install-Module Microsoft.Graph.Beta.Teams +Connect-MgGraph -Scopes @('TeamworkAppSettings.ReadWrite.All', 'Policy.ReadWrite.Authorization', 'AppCatalog.Read.All', 'Policy.ReadWrite.PermissionGrant', 'InformationProtectionPolicy.Read', 'Application.ReadWrite.All') +Get-MgBetaTeamRscConfiguration +``` + +What to do depends on the **State** it returns: + +- `ManagedByMicrosoft` or `EnabledForAllApps`: nothing. +- `EnabledForPreApprovedAppsOnly`: preapprove KloudMate's permissions, as shown below. +- `DisabledForAllApps`: team owners can't add any app that needs team permissions, KloudMate included. Change the state, or preapproval won't help. + +To preapprove KloudMate, replace `YOUR_KLOUDMATE_APP_ID` with the **App ID** on the KloudMate app's page in the Teams admin center: + +```powershell +New-MgBetaTeamAppPreapproval -TeamsAppId YOUR_KLOUDMATE_APP_ID -ResourceSpecificApplicationPermissionsAllowedForTeams @('TeamMember.Read.Group', 'ChannelMessage.Read.Group', 'Channel.Create.Group', 'ChannelSettings.ReadWrite.Group', 'Channel.Delete.Group') -TeamLevelSensitivityLabelCondition AnySensitivityLabel +``` + +Microsoft's preapproval cmdlets are in preview. See [Preapproval of RSC permissions](https://learn.microsoft.com/en-us/microsoftteams/platform/graph-api/rsc/preapproval-instruction-docs) for the full options. + +## Add the app to a team and connect it + +A team owner starts the connection in Teams, and a KloudMate workspace admin finishes it. + +1. In Teams, open **Apps**, find **KloudMate** under **Built for your org**, and add it to the team that should get alerts. Pick the channel for KloudMate's first card, and approve the app's team permissions when Teams asks. +2. KloudMate posts a card with a **Connect** button in that channel, or in **General** if it can't post there. Click **Connect**. +3. KloudMate checks that you own the team, then gives you a link to KloudMate. Open it and sign in. The link works once, for 10 minutes. +4. If you're a workspace admin, pick the workspace and click **Connect team**. If you aren't, click **Copy link for a workspace admin** and send the link to one. They open it, pick the workspace, and click **Connect team**. + +A team connects to one KloudMate workspace at a time. To move it to another workspace, disconnect it first. + +The team then shows under **Settings** > **Connections**. Open it with **Manage** to see its status and the channels that get alerts. + +![The Microsoft Teams team page under Settings → Connections, with its status and the channels that get alerts](./images/msteams-team-page.png) + +## Choose the channels that get alerts + +Connecting a team doesn't send anything yet. A workspace admin picks the channels: + +1. Go to **Settings** > **Connections**, open the team's **Actions** menu, click **Manage**, and click **Add a channel**. Or go to **Settings** > **Notification Channels**, click **Create**, and select **MS Teams**. +2. Pick the **Team** and the **Channel**. You can also give the channel a different name in KloudMate. +3. Click **Add channel**. + +Use the channel like any other notification channel: in [routing rules](../routing-rules/), in [escalation policy](../escalation-policy/) steps, and as the channel for war rooms. If someone deletes the channel in Teams, it's marked **Error** in KloudMate. Pick another channel wherever you used it. + +## Link your Teams account + +Buttons on an alert card act as the KloudMate user who clicks them, so KloudMate needs to know who you are in Teams. You must be a member of the KloudMate workspace the team is connected to. + +- **If your Microsoft sign-in name is your KloudMate email address,** you don't need to do anything. KloudMate recognizes you the first time you click a button and remembers the link. +- **Otherwise,** for example if you sign in to Microsoft with a different address or you're a guest in the tenant, your first click shows you a **Link my account** button. Click it, open the link, and click **Link account** in KloudMate. Then go back to Teams and click the alert button again. + +A link covers one team. To see or remove your links, go to **Incidents** > **Settings** and find the **Microsoft Teams** section. + +## Disconnect a team + +A workspace admin can disconnect a team in KloudMate: go to **Settings** > **Connections**, open the team's **Actions** menu, and click **Disconnect**. A team owner can also use **Disconnect** on the card KloudMate posted in **General** when the team connected. You can't disconnect from KloudMate while a war room is open in the team. + +After a disconnect, the team's channels stop getting alerts and show an error until you delete them. To connect the team again, a team owner clicks **Connect** in Teams. + +If someone removes the app from the team instead, alerts stop and the team shows **App removed** in KloudMate. Add the app back to the team to resume. + +## Troubleshoot the connection + +- **No Connect card after you add the app:** check **General**. If it isn't there either, remove the app from the team, wait two minutes, and add it again from Teams. Adding the app to a team from the Teams admin center doesn't post the card. +- **Connect can't check the team's owners:** the team didn't grant the app its permissions. Check your tenant's RSC setting in [Allow the app's team permissions](#allow-the-apps-team-permissions). +- **Connect asks you to try again in a minute:** Microsoft takes a short while to give a newly added app access to a team. Wait a minute and click **Connect** again. +- **Only team owners can connect:** ask an owner of the team to click **Connect**. +- **A link from Teams no longer works:** links work once and expire after 10 minutes. Click **Connect**, or the alert button, in Teams again for a new one. +- **The team is already connected:** if it's connected to another workspace, disconnect it there first. If it's this workspace, there's nothing to do. + +If someone opens a one-on-one chat with KloudMate, the app replies that it works in team channels. + +## Related + +- [Slack Integration](../slack-integration/): the same alerts and actions in Slack. +- [Notification Channels](../../platform/settings/notification-channels/): every channel type KloudMate can send to. diff --git a/src/content/docs/docs/incident-management/oncall/images/oncall-schedules-tab.png b/src/content/docs/docs/incident-management/oncall/images/oncall-schedules-tab.png index 1fc0ed33..1ce04bdc 100644 Binary files a/src/content/docs/docs/incident-management/oncall/images/oncall-schedules-tab.png and b/src/content/docs/docs/incident-management/oncall/images/oncall-schedules-tab.png differ diff --git a/src/content/docs/docs/incident-management/oncall/images/override-dialog.png b/src/content/docs/docs/incident-management/oncall/images/override-dialog.png index fb35ef09..51c7e0d3 100644 Binary files a/src/content/docs/docs/incident-management/oncall/images/override-dialog.png and b/src/content/docs/docs/incident-management/oncall/images/override-dialog.png differ diff --git a/src/content/docs/docs/incident-management/oncall/images/rotation-coverage-settings.png b/src/content/docs/docs/incident-management/oncall/images/rotation-coverage-settings.png index 518f5699..6ea3fba5 100644 Binary files a/src/content/docs/docs/incident-management/oncall/images/rotation-coverage-settings.png and b/src/content/docs/docs/incident-management/oncall/images/rotation-coverage-settings.png differ diff --git a/src/content/docs/docs/incident-management/oncall/images/schedule-overrides-list.png b/src/content/docs/docs/incident-management/oncall/images/schedule-overrides-list.png index 679080d2..c6dae717 100644 Binary files a/src/content/docs/docs/incident-management/oncall/images/schedule-overrides-list.png and b/src/content/docs/docs/incident-management/oncall/images/schedule-overrides-list.png differ diff --git a/src/content/docs/docs/incident-management/oncall/images/schedule-rotation-drawer.png b/src/content/docs/docs/incident-management/oncall/images/schedule-rotation-drawer.png index 7a6b30d7..306453d2 100644 Binary files a/src/content/docs/docs/incident-management/oncall/images/schedule-rotation-drawer.png and b/src/content/docs/docs/incident-management/oncall/images/schedule-rotation-drawer.png differ diff --git a/src/content/docs/docs/incident-management/oncall/images/schedule-split-rotations.png b/src/content/docs/docs/incident-management/oncall/images/schedule-split-rotations.png index b7f2df78..c2c1dfbc 100644 Binary files a/src/content/docs/docs/incident-management/oncall/images/schedule-split-rotations.png and b/src/content/docs/docs/incident-management/oncall/images/schedule-split-rotations.png differ diff --git a/src/content/docs/docs/incident-management/services/images/service-detail.png b/src/content/docs/docs/incident-management/services/images/service-detail.png index 2abdc618..d41bb4ed 100644 Binary files a/src/content/docs/docs/incident-management/services/images/service-detail.png and b/src/content/docs/docs/incident-management/services/images/service-detail.png differ diff --git a/src/content/docs/docs/incident-management/services/images/services-1.jpeg b/src/content/docs/docs/incident-management/services/images/services-1.jpeg index 612841bc..6c0e3a4c 100644 Binary files a/src/content/docs/docs/incident-management/services/images/services-1.jpeg and b/src/content/docs/docs/incident-management/services/images/services-1.jpeg differ diff --git a/src/content/docs/docs/incident-management/slack-integration.mdx b/src/content/docs/docs/incident-management/slack-integration.mdx index 6ab793d5..caa89877 100644 --- a/src/content/docs/docs/incident-management/slack-integration.mdx +++ b/src/content/docs/docs/incident-management/slack-integration.mdx @@ -10,28 +10,30 @@ KloudMate uses a single unified Slack app for both notification delivery and IM - Threaded notifications on alert groups and incidents (replies stay attached to the parent message). - Per-user ChatOps actions: acknowledge, resolve, or comment on incidents without leaving Slack. -- Cross-surface visibility: the same install shows up under both **Settings → Notification Channels** and **Incidents → Chat Ops**. +- Cross-surface visibility: the same install shows up under both **Settings → Notification Channels** and **Incidents → Settings**. You can start the install from either place, and it shows up in both. ## Connect Slack from Incident Management -1. Open **Incidents → Chat Ops** and click **Connect** on the Slack card. You need the **Developer** role for this step. - -![Slack card on the Chat Ops tab in Incidents](./images/slack-integration-1.png) - +1. Open **Incidents → Settings** and click **Connect** on the **Slack** panel of the **ChatOps** card. You need the **Developer** role for this step. 2. Complete the Slack OAuth flow: pick the Slack workspace and channel KloudMate should post into. -3. KloudMate returns you to the Chat Ops tab and shows the linked workspace and channel. +3. KloudMate returns you to the Settings tab, and the Slack panel shows the linked workspace. -The new Slack row appears under both **Settings → Notification Channels** and **Incidents → Chat Ops**. You can use it as a notification destination on a [Routing Rule](../../alerts/routing-rules/) immediately. +If Slack is already installed for notifications, the button reads **Add ChatOps channel** instead. To stop incident actions from Slack, click **Remove ChatOps channel**. Slack stays connected for alert notifications. + +The new Slack row appears under both **Settings → Notification Channels** and **Incidents → Settings**. You can use it as a notification destination on a [Routing Rule](../../alerts/routing-rules/) immediately. ## Per-user account linking -After the org-level install is complete, each responder needs to link their own Slack account before they can acknowledge or resolve incidents from Slack. From the Chat Ops tab, scroll to **User Settings** and click **Connect account**. A one-time OAuth flow links your KloudMate account to your Slack account. +After the org-level install is complete, each responder needs to link their own Slack account before they can acknowledge or resolve incidents from Slack. You need the **Developer** role to see this step. On the Slack panel, under **Your account**, click **Connect account**. A one-time OAuth flow links your KloudMate account to your Slack account. -Once linked, the same tab shows your Slack username with a **Disconnect** action. +Once linked, the panel shows your Slack username with a **Disconnect** action. ## Related +- [Microsoft Teams Integration](../microsoft-teams-integration/): the Teams panel on the same card. +- [Incident War Rooms](../war-rooms/): open a Slack channel per incident from this install. + - [Connections](/platform/settings/connections/): the Slack install is a connection, so one credential serves notifications, ChatOps, and workflows. Manage or rotate it there. Before a workflow step or trigger can use it, add the **Workflows** capability to it. - [Workflows](../../workflows/): post to Slack from a [workflow step](../../workflows/actions/#slack), or start a workflow from a [Slack event](../../workflows/triggers/#app-event), using the same install. diff --git a/src/content/docs/docs/incident-management/status-pages/images/status-pages-list.png b/src/content/docs/docs/incident-management/status-pages/images/status-pages-list.png index 6c468780..b87ef0f5 100644 Binary files a/src/content/docs/docs/incident-management/status-pages/images/status-pages-list.png and b/src/content/docs/docs/incident-management/status-pages/images/status-pages-list.png differ diff --git a/src/content/docs/docs/incident-management/war-rooms/images/war-room-chatops-card.png b/src/content/docs/docs/incident-management/war-rooms/images/war-room-chatops-card.png new file mode 100644 index 00000000..86278a81 Binary files /dev/null and b/src/content/docs/docs/incident-management/war-rooms/images/war-room-chatops-card.png differ diff --git a/src/content/docs/docs/incident-management/war-rooms/images/war-room-conference-call.png b/src/content/docs/docs/incident-management/war-rooms/images/war-room-conference-call.png new file mode 100644 index 00000000..a961dc25 Binary files /dev/null and b/src/content/docs/docs/incident-management/war-rooms/images/war-room-conference-call.png differ diff --git a/src/content/docs/docs/incident-management/war-rooms/images/war-room-settings.png b/src/content/docs/docs/incident-management/war-rooms/images/war-room-settings.png new file mode 100644 index 00000000..3d8fce14 Binary files /dev/null and b/src/content/docs/docs/incident-management/war-rooms/images/war-room-settings.png differ diff --git a/src/content/docs/docs/incident-management/war-rooms/index.mdx b/src/content/docs/docs/incident-management/war-rooms/index.mdx index 4607a194..cf8ddd53 100644 --- a/src/content/docs/docs/incident-management/war-rooms/index.mdx +++ b/src/content/docs/docs/incident-management/war-rooms/index.mdx @@ -1,21 +1,21 @@ --- title: "Incident War Rooms" -description: "Open a dedicated Slack channel or Microsoft Teams chat for an incident, with the responders already in it and a call link attached." +description: "Open a dedicated Slack or Microsoft Teams channel for an incident, with the responders already in it and a call link attached." sidebar: label: "Overview" order: 1 --- -Some incidents need a room, not another notification. A war room is a Slack channel or a Microsoft Teams group chat that belongs to one incident. KloudMate creates it, invites the responders and the on-call engineers, posts an incident card at the top, and attaches a conference call link. +Some incidents need a room, not another notification. A war room is a Slack or Microsoft Teams channel that belongs to one incident. KloudMate creates it, brings in the responders and the on-call engineers, posts an incident card at the top, and attaches a conference call link. -The card tracks the incident. It shows the current severity and status, and in Slack you can acknowledge, resolve, add responders, and leave a note without opening KloudMate. +The card tracks the incident. It shows the current severity and status, and you can acknowledge, resolve, add responders, and leave a note from it without opening KloudMate. An incident gets one room. If a routing rule, a Slack button, and the incident page all ask for a room in the same minute, you still end up with one channel. ## Open a war room - **From the incident.** Click **Start war room** on the **Incident War Room** panel. You can change the channel name, paste a call link, and invite extra people before it opens. -- **From Slack.** Click **Start war room** on the incident alert in your shared channel. +- **From Slack or Teams.** Click **Start war room** on the incident alert in your shared channel. - **From a routing rule.** Turn on **Start War Room** in the rule's actions, and every incident it creates opens with a room. - **From an escalation step.** Check **Start War Room on this step**, and the room opens when the incident escalates that far. @@ -47,35 +47,43 @@ KloudMate also replies in that thread as the incident moves: acknowledged or una ## What responders see in Microsoft Teams -The room is a group chat owned by the Microsoft 365 account you connected. The card shows the same incident facts, the people who were invited, the ones who couldn't be added, and buttons for **Join Call** and **View Incident**. It's rewritten in place as the incident changes, the same as in Slack. +The room is a new standard channel in the team your war room channel belongs to, so everyone in that team can see it. The first post is the incident card, and KloudMate mentions the responders in the channel so Teams notifies them. + +The card shows the severity, status, service, and responders, with links to **View Incident** and, when the incident has a call link, **Join Call**. Its buttons are **Acknowledge** (or **Unack**), **Resolve** (or **Unresolve**), **Add Responders**, and **Note**. Only a Developer can use **Add Responders**. A note is posted as a reply under the card and saved on the incident's **Notes** tab. The card is rewritten in place as the incident changes, the same as in Slack. + +The card also names responders KloudMate couldn't bring in: + +- **Not in this team:** they aren't members of the team, so they can't see the channel. A team owner has to add them to the team. KloudMate never adds people to a team. +- **Not linked to Teams:** KloudMate couldn't match them to a Teams account yet. To link, they click a button on the card and choose **Link my account**. See [Link your Teams account](../microsoft-teams-integration/#link-your-teams-account). :::note -Teams rooms don't carry the action buttons, the thread replies, or RCA. Acknowledge, resolve, and add notes from the incident page instead. Teams group chats also have no public or private setting, so **Private room** has no effect on them. +Teams rooms don't have **Run RCA** or the timeline replies. **Private room** has no effect on them: a Teams room is always a standard channel. ::: ## The incident alert turns into a pointer -Once a Slack war room exists, the incident alert in your shared channel stops carrying its own buttons and becomes a signpost: **Open war room** and **Open in KloudMate**. It isn't rewritten again after that, so read the room's card for the current state. That keeps the conversation in one place instead of splitting it between the alert thread and the room. +Once a war room exists, the incident alert in the same app stops carrying its own buttons and becomes a signpost: **Open war room** and **Open in KloudMate**. A Slack room does this to the Slack alert, and a Teams room to the Teams alert. An alert in the other app keeps its buttons. The signpost isn't rewritten again after that, so read the room's card for the current state. That keeps the conversation in one place instead of splitting it between the alert thread and the room. ## Follow the room from the incident page -The **Incident War Room** panel on the incident shows the room as **Active** or **Archived**, links to the channel or chat, and lists the members. A member KloudMate couldn't match to a chat account is tagged **Unmapped**, and hovering it tells you why. +The **Incident War Room** panel on the incident shows the room as **Active**, or as **Archived** (Slack) or **Closed** (Teams), links to the channel, and lists the members. A member KloudMate couldn't match to a chat account is tagged **Unmapped**, and hovering it tells you why. -**Conference call** sits beside it. Use the edit icon to add or replace the **Meeting link** and the **Dial-in** at any point while the incident is open, and KloudMate updates the card and the topic. A Developer can also end the room early with **Archive war room**, which posts the closing summary and archives the channel straight away. +**Conference call** sits beside it. Use the edit icon to add or replace the **Meeting link** and the **Dial-in** at any point while the incident is open, and KloudMate updates the card, plus the channel topic in Slack. A Developer can also end the room early with **Archive war room** (**Close war room** for Teams), which posts the closing summary and closes the room straight away. ## When the incident resolves -KloudMate marks the card resolved, then starts the clock on the archive delay, which is one hour unless you've changed it. When the delay runs out, it posts a closing summary and archives the Slack channel. A Teams chat stays in place, because group chats can't be archived, so the closing summary is what tells responders the room is done. Either way the history stays in your chat workspace. +KloudMate marks the card resolved, then starts the clock on the archive delay, which is one hour unless you've changed it. When the delay runs out, it posts a closing summary and closes the room. -Set the delay to **Keep the room open** if you'd rather archive rooms yourself. +- **Slack:** the channel is archived, and its history stays in your Slack workspace. +- **Teams:** the channel is renamed `closed-` and deleted 7 days later. Before that, KloudMate posts a record of the room in the incident's alert thread in your shared Teams channel, with the AI resolution summary, so the summary outlives the channel. A team owner can restore a deleted channel in Teams for 30 days. -:::caution -Reopening an incident doesn't cancel an archive that's already scheduled. If you unresolve an incident inside the delay window, the Slack channel is still archived on time, and starting the war room again returns the archived room. Unarchive the channel in Slack to carry on in it. -::: +Set the delay to **Keep the room open** if you'd rather archive Slack rooms yourself. Teams rooms always need a delay, because every channel counts toward the team's limit of 1,000 channels. + +If you unresolve the incident inside the delay window, the room stays open while the incident is open, in Slack and in Teams. Resolving it again schedules another close. A close scheduled by the earlier resolve still runs at its original time, so the room can close sooner than the full delay after the second resolve. ## Related - [Set up war rooms](./setup/): what to connect, which permissions it needs, and the defaults for every room. - [Troubleshooting](./troubleshooting/): what to do when a room won't open or opens without a call. -- [Slack Integration](../slack-integration/): the install that war rooms use, and per-user account linking for ChatOps. +- [Slack Integration](../slack-integration/) and [Microsoft Teams Integration](../microsoft-teams-integration/): the installs that war rooms use, and how people link their chat accounts. - [Routing Rules](../routing-rules/) and [Escalation Policies](../escalation-policy/): the two places a room can open on its own. diff --git a/src/content/docs/docs/incident-management/war-rooms/setup.mdx b/src/content/docs/docs/incident-management/war-rooms/setup.mdx index 325ca9fc..05491613 100644 --- a/src/content/docs/docs/incident-management/war-rooms/setup.mdx +++ b/src/content/docs/docs/incident-management/war-rooms/setup.mdx @@ -10,13 +10,24 @@ import { Steps } from '@astrojs/starlight/components'; War rooms run on the chat connection you already use for incident notifications. Point them at a Slack or Microsoft Teams channel, decide who gets invited, and optionally let KloudMate create a conference call for each incident. -The settings live on **Incidents → Chat Ops**, under **Incident War Rooms**, below the chat connection they use. You need the **Developer** role to change them. Everyone else sees them read-only. +The settings live on **Incidents → Settings**, under **War rooms**, below the **ChatOps** card where Slack and Microsoft Teams are connected. You need the **Developer** role to change them. Everyone else sees them read-only. + +**Where rooms open** lists every connected Slack workspace and every Teams team channel, each named with its app, such as **Slack · Acme**. A room opens in the app of the one you pick. ## Before you start - Your plan includes Incident Management. -- Your workspace has a Slack or Microsoft Teams channel under **Incidents → Chat Ops**. See [Slack Integration](../../slack-integration/). -- For a conference call that's created per incident, you've connected Microsoft 365, Google Meet, or Zoom under **Settings → Connections**. +- Your workspace has a Slack channel, or a Microsoft Teams channel in a team connected through the KloudMate app. See [Slack Integration](../../slack-integration/) and [Microsoft Teams Integration](../../microsoft-teams-integration/). +- For a conference call that's created per incident, you've connected Google Meet or Zoom under **Settings → Connections**. + +## Connect ChatOps + +The **ChatOps** card on **Incidents → Settings** connects Slack and Microsoft Teams to Incident Management, so responders can act on incidents from chat. War rooms open in the workspaces and channels connected here, so set this up first. + +![The ChatOps card with the Slack panel, showing the Add ChatOps channel button, and the Microsoft Teams panel, showing the Manage teams button](./images/war-room-chatops-card.png) + +- **Slack:** Click **Connect** on the **Slack** panel. If Slack is already installed for notifications, click **Add ChatOps channel** instead. See [Slack Integration](../../slack-integration/). +- **Microsoft Teams:** Add the KloudMate app to a team in Teams, and have a team owner click **Connect** on the card it posts. Then add one of the team's channels under **Manage teams**. See [Microsoft Teams Integration](../../microsoft-teams-integration/). ## Set up Slack rooms @@ -29,7 +40,7 @@ Slack needs more permissions to open a war room than it does to post a notificat 3. Click **Reconnect** beside the connection and approve the Slack install again. Approving again only adds permissions, so you don't lose what Slack already had. -4. Open **Incidents → Chat Ops**, set **Chat provider** to **Slack**, and pick the channel under **Chat channel**. +4. Open **Incidents → Settings** and pick your Slack workspace under **Where rooms open**. KloudMate checks the channel's permissions as soon as you pick it. If anything is missing, a **Reconnect Slack to open war rooms** banner lists the exact scopes, and **Start war room** stays disabled until you fix it. These are the ones it checks: @@ -43,19 +54,19 @@ KloudMate checks the channel's permissions as soon as you pick it. If anything i ## Set up Microsoft Teams rooms -A Teams room is a group chat, created by the Microsoft 365 account you sign in with. That account owns every room, so use a service account rather than a person's. +A Teams room is a new standard channel in a team connected through the KloudMate app. The app creates, renames, and deletes these channels with the team permissions a team owner approved when they added it, so there's no separate account to sign in with. -1. Open **Settings → Connections** and connect **Microsoft 365 / Teams**. Sign in as the account that should own the rooms. - -2. Approve the permissions on the Microsoft consent screen. +1. Connect the team and add one of its channels in KloudMate. See [Microsoft Teams Integration](../../microsoft-teams-integration/). -3. Add a Microsoft Teams channel under **Incidents → Chat Ops**. +2. Open **Incidents → Settings** and pick that channel under **Where rooms open**. Rooms open as new channels in its team. -4. Set **Chat provider** to **Microsoft Teams** and pick that channel under **Chat channel**. +3. Set **After the incident resolves** to a delay. Teams rooms can't use **Keep the room open**. -A Microsoft 365 connection is granted for **Notifications** and **Meetings** when you make it, which is what a Teams war room needs. The room and the call come from the same grant, so one consent screen covers creating the chat, posting to it, looking a member up by email address, and creating the online meeting. +The channel you pick also keeps each room's record. When a room closes, KloudMate posts the closing note and the AI resolution summary in the incident's alert thread there, because the room's own channel is deleted 7 days after it closes. + +Every room takes one of the team's 1,000 channel slots, and Teams keeps counting a deleted channel for 30 days. KloudMate won't open a room when the team is within 100 channels of that limit, so point war rooms at a team that doesn't already hold hundreds of channels. ## Add a conference call @@ -67,21 +78,21 @@ A Microsoft 365 connection is granted for **Notifications** and **Meetings** whe | **The same link every time** | KloudMate uses your **Call link**, rendered per incident, plus an optional **Dial-in**. Use a standing bridge, or a link with the incident key in it, such as `https://meet.google.com/lookup/inc-{{ key }}`. | | **A new meeting per incident** | KloudMate creates a fresh meeting on the connection you pick. | -For a new meeting per incident, connect one of these under **Settings → Connections** and select it in the war room settings. The picker lists connections granted for **Meetings**, so a Slack or AWS connection never shows up there. +![The Conference call dropdown open, with No call, The same link every time, and A new meeting per incident](./images/war-room-conference-call.png) -### Microsoft Teams +For a new meeting per incident, connect one of these under **Settings → Connections** and select it in the war room settings. The picker lists connections granted for **Meetings**, so a Slack or AWS connection never shows up there. -The Microsoft 365 connection you set up above also creates the meetings. Nothing else to connect. A Teams meeting comes with a dial-in number when your tenant has audio conferencing. +Teams rooms use the same options. KloudMate doesn't create Teams meetings, so for a Teams call, put a standing Teams meeting link under **The same link every time**. ### Google Meet -Connect **Google Meet** and sign in as the Google Workspace account that should own the meeting spaces. The consent screen asks to create meeting spaces, plus your name and email address to label the connection. The meeting permission reaches only the spaces KloudMate creates itself, not the rest of your Workspace. Google Meet returns no dial-in number, so rooms show the **Join Call** button on its own. +Connect **Google Workspace** and sign in as the Google Workspace account that should own the meeting spaces. The consent screen asks to create meeting spaces, plus your name and email address to label the connection. The meeting permission reaches only the spaces KloudMate creates itself, not the rest of your Workspace. Google Meet returns no dial-in number, so rooms show the **Join Call** button on its own. ### Zoom Connect **Zoom** and install the KloudMate app. Every war room meeting is created as the account that installs it, so install it from a Licensed Zoom account: meetings hosted by a Basic account cut out after 40 minutes, which is not what you want halfway through an incident. Zoom rooms don't show a dial-in number. -Removing the KloudMate app from Zoom revokes the connection. KloudMate erases the stored credential, marks the connection **Revoked**, and switches it off, so rooms open without a call link until the app is installed again. **Reconnect** beside the connection re-runs the install with the same connection id, so the war room settings keep pointing at it. Then turn **Enabled** back on under **Edit**. See [Zoom](/platform/settings/connections/zoom/) for the full install and removal steps. +Removing the KloudMate app from Zoom revokes the connection. KloudMate erases the stored credential, marks the connection **Revoked**, and switches it off, so rooms open without a call link until the app is installed again. **Reconnect** beside the connection re-runs the install and switches the connection back on, with the same connection id, so the war room settings keep pointing at it. See [Zoom](/platform/settings/connections/zoom/) for the full install and removal steps. :::caution Account-level Zoom settings override what KloudMate asks for. If responders land in a waiting room or get turned away, check the account's join-before-host and authentication settings. @@ -89,18 +100,22 @@ Account-level Zoom settings override what KloudMate asks for. If responders land ## Set the defaults for every room +![The War rooms settings, with Where rooms open, Room name template, Private room, Who gets invited, Conference call, After the incident resolves, and the Save war room settings button](./images/war-room-settings.png) + | Setting | What it controls | |---|---| -| **Room name template** | The channel name or chat topic. Use `{{ number }}`, `{{ key }}`, `{{ title }}`, `{{ severity }}`, and `{{ service }}`. The default is `inc-{{ number }}-{{ title }}`. Slack names are lowercased and stripped to letters, numbers, hyphens, and underscores, up to 80 characters. A Teams topic can run to 50. | -| **Private room** | Opens Slack rooms as private channels, which people have to be invited to. Turn it off to open public channels anyone in the Slack workspace can join. | +| **Room name template** | The channel name. Use `{{ number }}`, `{{ key }}`, `{{ title }}`, `{{ severity }}`, and `{{ service }}`. The default is `inc-{{ number }}-{{ title }}`. Slack names are lowercased and stripped to letters, numbers, hyphens, and underscores, up to 80 characters. Teams names can run to 50 characters, without the characters Teams doesn't allow in a channel name, such as `#`, `/`, and `?`. | +| **Private room** | Opens Slack rooms as private channels, which people have to be invited to. Turn it off to open public channels anyone in the Slack workspace can join. Teams rooms are always standard channels, visible to everyone in the team. | | **Incident responders** | Invites whoever is assigned to the incident. | | **On-call engineers** | Invites whoever is on call. Leave the schedule picker empty to follow the incident's escalation policy, or name specific [schedules](../../oncall/) to use those instead. | | **Always invite** | People who join every room, on call or not. An incident commander, for example. | -| **After the incident resolves** | How long a resolved room stays open before KloudMate archives it. **Keep the room open** turns the automatic archive off. | +| **After the incident resolves** | How long a resolved room stays open before KloudMate closes it. **Keep the room open** turns the automatic archive off for Slack rooms. Teams rooms need a delay. | + +Click **Save war room settings** to apply your changes. If a name is already taken by another incident's channel, KloudMate adds a short suffix and uses that. A name you type yourself is never changed for you, so you're told it's taken instead. -Anyone who has no chat account for their KloudMate email address is listed on the card under **Could not add**, and tagged **Unmapped** on the incident panel. The room still opens, and everyone else is still invited. +Anyone KloudMate can't match to a chat account is listed on the card, under **Could not add** in Slack, or under **Not in this team** or **Not linked to Teams** in Teams. They're tagged **Unmapped** on the incident panel. The room still opens, and everyone else is still invited. ## Open a room automatically @@ -110,10 +125,10 @@ Opening a room by hand is fine for the first few. After that, let the rule that **From an escalation step.** Check **Start War Room on this step** in the step editor. The room opens when the incident reaches that step, and only on the policy's first pass, so a policy that repeats won't open a second room. See [Escalation Policies](../../escalation-policy/). -Both paths are worth scoping tightly. A rule that matches everything opens a channel for every incident, and archived channels still count towards your Slack workspace limits. +Both paths are worth scoping tightly. A rule that matches everything opens a channel for every incident. Archived channels still count towards your Slack workspace limits, and a Teams room holds a channel slot in its team until 30 days after it's deleted. ## Related - [War rooms overview](../): what responders see once a room is open. - [Troubleshooting](../troubleshooting/): scope banners, connection states, and missing call links. -- [Connections](/platform/settings/connections/): where the Slack, Microsoft 365, Google Meet, and Zoom credentials live. +- [Connections](/platform/settings/connections/): where the Slack, Google Meet, and Zoom credentials live, and your connected Teams teams. diff --git a/src/content/docs/docs/incident-management/war-rooms/troubleshooting.mdx b/src/content/docs/docs/incident-management/war-rooms/troubleshooting.mdx index f56536a9..f77a61c9 100644 --- a/src/content/docs/docs/incident-management/war-rooms/troubleshooting.mdx +++ b/src/content/docs/docs/incident-management/war-rooms/troubleshooting.mdx @@ -18,7 +18,7 @@ Add **Workflows** to the Slack connection under **Settings → Connections**, th The check in the settings always asks for the private-channel scope, `groups:write`. If you open public rooms, it can report `groups:write` as missing while your rooms open fine. Check **Private room** before acting on that one line. ::: -For Microsoft Teams, the missing scopes come from the Microsoft 365 connection. Reconnect it and approve `Chat.Create`, `ChatMessage.Send`, `User.ReadBasic.All`, and `OnlineMeetings.ReadWrite`. +Teams has no scope banner. A Teams room needs the KloudMate app in the team, with the team permissions it asked for when it was added. If someone removed the app, the war room settings say so, and the team shows **App removed** under **Settings → Connections**. A team owner adds the app back to the team, and rooms open again. See [Microsoft Teams Integration](../../microsoft-teams-integration/). ## The chat connection needs attention @@ -43,7 +43,7 @@ Also worth checking: the room only opens on an escalation step's first pass, and ## A connection isn't in the meeting picker -**A new meeting per incident** lists connections granted for **Meetings**. Microsoft 365, Google Meet, and Zoom carry that grant when you connect them, so a connection that's missing from the picker was either made before this existed or had the grant removed. Open it under **Settings → Connections**, click **Edit**, and add **Meetings** under **Can be used for**. If it's then marked **Needs reconnect**, reconnect it. +**A new meeting per incident** lists connections granted for **Meetings**. Google Meet and Zoom carry that grant when you connect them, so a connection that's missing from the picker was either made before this existed or had the grant removed. Open it under **Settings → Connections**, click **Edit**, and add **Meetings** under **Can be used for**. If it's then marked **Needs reconnect**, reconnect it. Saving a connection that can't create meetings is refused with `connection '' is not connected for meetings`. @@ -51,7 +51,7 @@ Saving a connection that can't create meetings is refused with `connection '` and deleted 7 days later. A team owner can restore a deleted channel in Teams for 30 days. If this keeps happening, raise the delay under **After the incident resolves**, or set it to **Keep the room open** and archive rooms yourself with **Archive war room** on the incident panel. +## A Teams room won't open + +- **The team is near its channel limit.** Teams allows 1,000 channels per team and counts deleted channels for 30 days. KloudMate stops opening rooms 100 channels short of that. Delete channels you don't need, or point war rooms at a channel in another team. +- **The settings keep rooms open.** Teams rooms need a delay under **After the incident resolves**. **Keep the room open** works only for Slack. +- **The war room channel isn't connected any more.** Someone removed it from KloudMate, deleted it in Teams, or disconnected the team. Pick another channel under **Where rooms open** and save. + ## A Teams room is missing things a Slack room has -Teams rooms have no action buttons, no thread replies, and no RCA. Acknowledge, resolve, and add notes from the incident page. Microsoft Graph also can't archive a group chat, so a closed Teams room gets a closing summary and nothing else: KloudMate stops posting to it, but the chat stays in your Teams workspace. **Private room** doesn't apply to group chats either. +Teams rooms have no **Run RCA** button and no timeline replies. Notes you add from the card are posted as replies under it. **Private room** doesn't apply: a Teams room is always a standard channel that everyone in the team can see. ## Related diff --git a/src/content/docs/docs/infrastructure/integrations/kafka-integration.mdx b/src/content/docs/docs/infrastructure/integrations/kafka-integration.mdx index 1a80b243..9433a77e 100644 --- a/src/content/docs/docs/infrastructure/integrations/kafka-integration.mdx +++ b/src/content/docs/docs/infrastructure/integrations/kafka-integration.mdx @@ -14,10 +14,10 @@ Use this integration when you want to monitor Kafka brokers, topics, and consume ## Step 1: Open the Collector Configuration -1. Go to **Settings → Agents**. +1. Go to **Settings → Agents & Pipelines**. 2. Find the agent you want to configure and select the three dots. 3. Choose **Configure**. -4. Go to **Collector config**. +4. Go to **Collector Config**. ## Step 2: Add the Kafka Metrics Configuration diff --git a/src/content/docs/docs/infrastructure/integrations/kafka-jmx-exporter-integration.mdx b/src/content/docs/docs/infrastructure/integrations/kafka-jmx-exporter-integration.mdx index db6ccf50..89b0d7f3 100644 --- a/src/content/docs/docs/infrastructure/integrations/kafka-jmx-exporter-integration.mdx +++ b/src/content/docs/docs/infrastructure/integrations/kafka-jmx-exporter-integration.mdx @@ -19,10 +19,10 @@ Install and run the [KloudMate Agent](../../../kloudmate-agent/) in your Kuberne ## Step 2: Open the Collector Configuration -1. Go to **Settings → Agents**. +1. Go to **Settings → Agents & Pipelines**. 2. Find the agent you want to configure and select the three dots. 3. Choose **Configure**. -4. Go to **Collector config**. +4. Go to **Collector Config**. ## Step 3: Add the Kafka JMX Configuration diff --git a/src/content/docs/docs/infrastructure/integrations/kafka-prometheus-servicemonitor-integration.mdx b/src/content/docs/docs/infrastructure/integrations/kafka-prometheus-servicemonitor-integration.mdx index 92162d27..3f53a503 100644 --- a/src/content/docs/docs/infrastructure/integrations/kafka-prometheus-servicemonitor-integration.mdx +++ b/src/content/docs/docs/infrastructure/integrations/kafka-prometheus-servicemonitor-integration.mdx @@ -28,10 +28,10 @@ From the output, note: ## Step 2: Open the Collector Configuration -1. Go to **Settings → Agents**. +1. Go to **Settings → Agents & Pipelines**. 2. Find the agent you want to configure and select the three dots. 3. Choose **Configure**. -4. Go to **Collector config**. +4. Go to **Collector Config**. ## Step 3: Add the Prometheus Receiver diff --git a/src/content/docs/docs/infrastructure/integrations/keycloak-integration.mdx b/src/content/docs/docs/infrastructure/integrations/keycloak-integration.mdx index 64878d91..12cd2f94 100644 --- a/src/content/docs/docs/infrastructure/integrations/keycloak-integration.mdx +++ b/src/content/docs/docs/infrastructure/integrations/keycloak-integration.mdx @@ -14,10 +14,10 @@ Use this integration when you want to scrape Keycloak metrics from its Prometheu ## Step 1: Open the Collector Configuration -1. Go to **Settings → Agents**. +1. Go to **Settings → Agents & Pipelines**. 2. Find the agent you want to configure and select the three dots. 3. Choose **Configure**. -4. Go to **Collector config**. +4. Go to **Collector Config**. ## Step 2: Add the Keycloak Configuration diff --git a/src/content/docs/docs/infrastructure/integrations/prometheus-integration.mdx b/src/content/docs/docs/infrastructure/integrations/prometheus-integration.mdx index 6c9fae7e..a5d4fbc7 100644 --- a/src/content/docs/docs/infrastructure/integrations/prometheus-integration.mdx +++ b/src/content/docs/docs/infrastructure/integrations/prometheus-integration.mdx @@ -15,10 +15,10 @@ KloudMate does not scrape Prometheus directly. Instead, you configure the KloudM ## Step 1: Open the Collector Configuration -1. Go to **Settings → Agents**. +1. Go to **Settings → Agents & Pipelines**. 2. Find the agent you want to configure and select the three dots. 3. Choose **Configure**. -4. Go to **Collector config**. +4. Go to **Collector Config**. ## Step 2: Add the Prometheus Configuration diff --git a/src/content/docs/docs/infrastructure/integrations/vcenter-integration.mdx b/src/content/docs/docs/infrastructure/integrations/vcenter-integration.mdx index a8532beb..094e6f03 100644 --- a/src/content/docs/docs/infrastructure/integrations/vcenter-integration.mdx +++ b/src/content/docs/docs/infrastructure/integrations/vcenter-integration.mdx @@ -15,10 +15,10 @@ Use this guide to collect VMware vCenter metrics in KloudMate with OpenTelemetry ## Step 1: Open the Collector Configuration -1. Go to **Settings → Agents**. +1. Go to **Settings → Agents & Pipelines**. 2. Find the agent you want to configure and select the three dots. 3. Choose **Configure**. -4. Go to **Collector config**. +4. Go to **Collector Config**. ## Step 2: Add the vCenter Configuration diff --git a/src/content/docs/docs/kloudmate-agent/auto-instrumentation/dotnet.mdx b/src/content/docs/docs/kloudmate-agent/auto-instrumentation/dotnet.mdx index 89a41c30..744c4cd1 100644 --- a/src/content/docs/docs/kloudmate-agent/auto-instrumentation/dotnet.mdx +++ b/src/content/docs/docs/kloudmate-agent/auto-instrumentation/dotnet.mdx @@ -73,9 +73,9 @@ On Amazon ECS, the agent injects the .NET instrumentation into the services you ## On Docker -When the agent monitors Docker containers, whether in Docker mode or as a Linux service on a Docker host, eBPF traces your .NET containers per service through the **Off / eBPF** toggle in the **Application instrumentation** card, with no code change and no restart. +When the agent monitors Docker containers, whether in Docker mode or as a Linux service on a Docker host, each .NET container offers **Off**, **eBPF**, and **SDK** in the **Application Performance Monitoring** card. eBPF needs no code change and no restart. -The agent can't inject the in-process SDK into a running container, so SDK mode isn't offered for containers. For full SDK depth, add OpenTelemetry to your image yourself and point it at the KloudMate agent's OTLP endpoint. See [Docker platform notes](../../platform-notes/docker/) for the endpoint addresses. On Windows, systemd, Kubernetes, or Amazon ECS, the agent injects the profiler for you instead. +**SDK** adds the OpenTelemetry .NET profiler by recreating the container with the same settings, which restarts it for a few seconds. If the new container doesn't come up healthy, the agent starts the original again. It needs a glibc-based image, such as `mcr.microsoft.com/dotnet/aspnet`. Alpine (musl) images use eBPF. Containers managed by Docker Compose or Swarm aren't recreated: their row shows the settings to add at the next deploy. See [Instrument Java, Node.js, Python, and .NET containers](../../platform-notes/docker/#instrument-java-nodejs-python-and-net-containers). ## Next steps diff --git a/src/content/docs/docs/kloudmate-agent/auto-instrumentation/gitops-clusters.mdx b/src/content/docs/docs/kloudmate-agent/auto-instrumentation/gitops-clusters.mdx index cefeaf51..c495eca9 100644 --- a/src/content/docs/docs/kloudmate-agent/auto-instrumentation/gitops-clusters.mdx +++ b/src/content/docs/docs/kloudmate-agent/auto-instrumentation/gitops-clusters.mdx @@ -34,11 +34,11 @@ Annotation tracking is the default from Argo CD 3.0. On an older version, set `a ## Check whether a workload is externally managed -Go to **Settings → Agents**, open the cluster agent's actions menu (⋮), and select **Configure**. On the **APM** tab, the **Application instrumentation** card shows **Managed by Argo CD** or **Managed by Flux** on a managed workload once you set it to **eBPF** or **SDK** and the agent checks in. A workload left at **Off** doesn't carry the label, but a banner at the top of the card tells you when Argo CD runs in the cluster. Other workloads work as usual, even on a cluster that runs Argo CD. +Go to **Settings → Agents & Pipelines**, open the cluster agent's actions menu (⋮), and select **Configure**. On the **APM** tab, the **Application Performance Monitoring** card shows **Managed by Argo CD** or **Managed by Flux** on a managed workload once you set it to **eBPF** or **SDK** and the agent checks in. A workload left at **Off** doesn't carry the label, but a banner at the top of the card tells you when Argo CD runs in the cluster. Other workloads work as usual, even on a cluster that runs Argo CD. ## Turn on eBPF mode -Set the workload to **eBPF** in **Application instrumentation** and click **Apply**. The change takes effect on the next agent check-in. The agent doesn't change your cluster objects or your manifests, and no pods restart, because eBPF attaches to processes that are already running. +Set the workload to **eBPF** in **Application Performance Monitoring** and click **Apply**. The change takes effect on the next agent check-in. The agent doesn't change your cluster objects or your manifests, and no pods restart, because eBPF attaches to processes that are already running. You get request rate, errors, duration, and trace spans. You don't get the in-process detail that an SDK adds, such as spans for database queries, framework internals, and outbound HTTP calls. For Go, Ruby, and PHP, eBPF is the only option on Kubernetes, whatever manages the workload, because KloudMate doesn't inject an SDK for those runtimes there. Those workloads aren't traced until you select eBPF for each one. @@ -71,7 +71,7 @@ Keep these limits in mind: - **Every pod in the namespace gets injected**, including short-lived jobs. - **One runtime per namespace.** The annotation sets a single language. If a namespace holds a Java service and a Python service, this covers only one of them. - **.NET runtime options come from the pod only.** If a .NET workload needs one, put it on that workload's pod template. -- **The workloads show Off in Application instrumentation.** The agent didn't add the annotation, so it doesn't track these workloads, but their traces still reach KloudMate. +- **The workloads show Off in Application Performance Monitoring.** The agent didn't add the annotation, so it doesn't track these workloads, but their traces still reach KloudMate. ## Commit the annotation @@ -87,7 +87,7 @@ spec: Your controller applies it on the next sync, and the pods restart once. Argo CD and Flux need no extra configuration, because the annotation is part of the desired state. -Also set that workload to **SDK** in **Application instrumentation**. The agent still doesn't change the workload. The setting keeps the workload tracked in KloudMate, and after your controller syncs the annotation, the workload shows as **Instrumented**. +Also set that workload to **SDK** in **Application Performance Monitoring**. The agent still doesn't change the workload. The setting keeps the workload tracked in KloudMate, and after your controller syncs the annotation, the workload shows as **Instrumented**. ## Allow the agent to patch these workloads @@ -143,7 +143,7 @@ spec: patchExternallyManagedWorkloads: true ``` -This value applies to the whole cluster. If an Application doesn't have the settings above, Argo CD reverts the annotation and the Application's pods keep restarting. With the value on, workloads that Argo CD manages no longer show **Managed by Argo CD** in **Application instrumentation**. They show their usual instrumentation status instead. +This value applies to the whole cluster. If an Application doesn't have the settings above, Argo CD reverts the annotation and the Application's pods keep restarting. With the value on, workloads that Argo CD manages no longer show **Managed by Argo CD** in **Application Performance Monitoring**. They show their usual instrumentation status instead. These steps are for Argo CD. On Flux, exclude the same annotations from drift correction before you turn on `patchExternallyManagedWorkloads`, or Flux reverts the agent's changes. @@ -173,7 +173,7 @@ spec: instrumentation.opentelemetry.io/inject-java: km-agent/km-agent-instrumentation-crd ``` -Argo CD and Flux compare Deployments, not the pods those Deployments create, so a policy that annotates pods never shows up as drift. The OpenTelemetry documentation suggests the same pattern. As with the namespace annotation, running pods get the annotation when they're recreated, and the workloads show **Off** in **Application instrumentation** while their traces still reach KloudMate. +Argo CD and Flux compare Deployments, not the pods those Deployments create, so a policy that annotates pods never shows up as drift. The OpenTelemetry documentation suggests the same pattern. As with the namespace annotation, running pods get the annotation when they're recreated, and the workloads show **Off** in **Application Performance Monitoring** while their traces still reach KloudMate. The OpenTelemetry Operator injects the SDK from its own admission webhook, which Kubernetes calls once per pod. That webhook has to run after Kyverno's, or it never sees the annotation. km-kube-agent charts released after 2.5.1 order the webhooks this way. On an older chart, set the order yourself: diff --git a/src/content/docs/docs/kloudmate-agent/auto-instrumentation/go.mdx b/src/content/docs/docs/kloudmate-agent/auto-instrumentation/go.mdx index 6707c272..9cbbbece 100644 --- a/src/content/docs/docs/kloudmate-agent/auto-instrumentation/go.mdx +++ b/src/content/docs/docs/kloudmate-agent/auto-instrumentation/go.mdx @@ -27,7 +27,7 @@ The result is close to what a language SDK would produce, without changing your eBPF monitoring and the language agents both propagate W3C trace context (`traceparent`). So when an instrumented service calls a Go service, the Go service's eBPF span joins the caller's trace. You see one connected trace with the correct parent-child links, not two separate views. :::note -In the **Application instrumentation** card, a Go service offers **Off** and **eBPF** but not **SDK**. eBPF is already tracing it at the kernel level, so there's no in-process agent to add. +In the **Application Performance Monitoring** card, a Go service offers **Off** and **eBPF** but not **SDK**. eBPF is already tracing it at the kernel level, so there's no in-process agent to add. ::: ## Next steps diff --git a/src/content/docs/docs/kloudmate-agent/auto-instrumentation/images/discovered-services-status-chips.png b/src/content/docs/docs/kloudmate-agent/auto-instrumentation/images/discovered-services-status-chips.png index b724941b..26871a65 100644 Binary files a/src/content/docs/docs/kloudmate-agent/auto-instrumentation/images/discovered-services-status-chips.png and b/src/content/docs/docs/kloudmate-agent/auto-instrumentation/images/discovered-services-status-chips.png differ diff --git a/src/content/docs/docs/kloudmate-agent/auto-instrumentation/images/kubernetes-apm-list.png b/src/content/docs/docs/kloudmate-agent/auto-instrumentation/images/kubernetes-apm-list.png index 8dd41ac4..e7d975aa 100644 Binary files a/src/content/docs/docs/kloudmate-agent/auto-instrumentation/images/kubernetes-apm-list.png and b/src/content/docs/docs/kloudmate-agent/auto-instrumentation/images/kubernetes-apm-list.png differ diff --git a/src/content/docs/docs/kloudmate-agent/auto-instrumentation/java.mdx b/src/content/docs/docs/kloudmate-agent/auto-instrumentation/java.mdx index ea54d647..4da6da0d 100644 --- a/src/content/docs/docs/kloudmate-agent/auto-instrumentation/java.mdx +++ b/src/content/docs/docs/kloudmate-agent/auto-instrumentation/java.mdx @@ -15,7 +15,7 @@ The Java agent ships inside the KloudMate agent package and upgrades with it, so ### systemd services -This is the main method on Linux. When you turn on SDK tracing for a systemd service, the agent writes a small startup config that loads the Java agent through `JAVA_TOOL_OPTIONS`, then restarts the service after you confirm. Because the service restarts, the agent sets everything up front: a fixed `service.name` (the name shown in the **Application instrumentation** card), the sampling rate, and where to send traces. +This is the main method on Linux. When you turn on SDK tracing for a systemd service, the agent writes a small startup config that loads the Java agent through `JAVA_TOOL_OPTIONS`, then restarts the service after you confirm. Because the service restarts, the agent sets everything up front: a fixed `service.name` (the name shown in the **Application Performance Monitoring** card), the sampling rate, and where to send traces. Turning tracing off removes the config and restarts the service, leaving it as it was. Running the same action twice changes nothing, so it's safe to repeat. @@ -52,9 +52,9 @@ On Amazon ECS, the agent injects the OpenTelemetry Java agent into the services ## On Docker -When the agent monitors Docker containers, whether in Docker mode or as a Linux service on a Docker host, eBPF traces your Java containers per service through the **Off / eBPF** toggle in the **Application instrumentation** card, with no code change and no restart. +When the agent monitors Docker containers, whether in Docker mode or as a Linux service on a Docker host, each Java container offers **Off**, **eBPF**, and **SDK** in the **Application Performance Monitoring** card. eBPF needs no code change and no restart. -The agent can't inject the in-process SDK into a running container, so SDK mode isn't offered for containers. For full SDK depth, add the OpenTelemetry Java agent to your image yourself and point it at the KloudMate agent's OTLP endpoint. See [Docker platform notes](../../platform-notes/docker/) for the endpoint addresses. On systemd, Kubernetes, or Amazon ECS, the agent injects the Java agent for you instead. +**SDK** adds the OpenTelemetry Java agent by recreating the container with the same settings, which restarts it for a few seconds. If the new container doesn't come up healthy, the agent starts the original again. If the container already sets `JAVA_TOOL_OPTIONS`, the agent adds `-javaagent` to the existing value, as long as the result stays within the 1024 characters the JVM reads. Containers managed by Docker Compose or Swarm aren't recreated: their row shows the settings to add at the next deploy. See [Instrument Java, Node.js, Python, and .NET containers](../../platform-notes/docker/#instrument-java-nodejs-python-and-net-containers). ## On Windows diff --git a/src/content/docs/docs/kloudmate-agent/auto-instrumentation/nodejs.mdx b/src/content/docs/docs/kloudmate-agent/auto-instrumentation/nodejs.mdx index e539adbc..2c110344 100644 --- a/src/content/docs/docs/kloudmate-agent/auto-instrumentation/nodejs.mdx +++ b/src/content/docs/docs/kloudmate-agent/auto-instrumentation/nodejs.mdx @@ -23,7 +23,7 @@ For a Node.js app under PM2, the agent restarts it with tracing switched on (`pm ### Standalone processes -The agent can instrument a Node.js process only when it runs under systemd or PM2. A process started on its own can't be instrumented automatically. Run it under systemd or PM2 first; the **Application instrumentation** card flags these and tells you so. +The agent can instrument a Node.js process only when it runs under systemd or PM2. A process started on its own can't be instrumented automatically. Run it under systemd or PM2 first; the **Application Performance Monitoring** card flags these and tells you so. ## On Kubernetes @@ -43,9 +43,9 @@ On Amazon ECS, the agent injects the Node.js instrumentation into the services y ## On Docker -When the agent monitors Docker containers, whether in Docker mode or as a Linux service on a Docker host, eBPF traces your Node.js containers per service through the **Off / eBPF** toggle in the **Application instrumentation** card, with no code change and no restart. +When the agent monitors Docker containers, whether in Docker mode or as a Linux service on a Docker host, each Node.js container offers **Off**, **eBPF**, and **SDK** in the **Application Performance Monitoring** card. eBPF needs no code change and no restart. -The agent can't inject the in-process SDK into a running container, so SDK mode isn't offered for containers. For full SDK depth, add OpenTelemetry to your image yourself and point it at the KloudMate agent's OTLP endpoint. See [Docker platform notes](../../platform-notes/docker/) for the endpoint addresses. On systemd, Kubernetes, or Amazon ECS, the agent injects the instrumentation for you instead. +**SDK** adds the OpenTelemetry Node.js instrumentation by recreating the container with the same settings, which restarts it for a few seconds. If the new container doesn't come up healthy, the agent starts the original again. It loads for both CommonJS and ES-module apps and needs Node.js 18.19 or later. If the app already sets `NODE_OPTIONS`, the agent adds its loader to the existing value. Containers managed by Docker Compose or Swarm aren't recreated: their row shows the settings to add at the next deploy. See [Instrument Java, Node.js, Python, and .NET containers](../../platform-notes/docker/#instrument-java-nodejs-python-and-net-containers). ## On Windows diff --git a/src/content/docs/docs/kloudmate-agent/auto-instrumentation/overview.mdx b/src/content/docs/docs/kloudmate-agent/auto-instrumentation/overview.mdx index 97a30c76..76ba3708 100644 --- a/src/content/docs/docs/kloudmate-agent/auto-instrumentation/overview.mdx +++ b/src/content/docs/docs/kloudmate-agent/auto-instrumentation/overview.mdx @@ -17,7 +17,7 @@ Application performance monitoring (APM) is opt-in and per service. For each ser The flow is the same across every deployment mode: -1. **Discover.** The agent finds your services and lists them in the **Application instrumentation** card on the agent's **APM** tab. To open it, go to **Settings → Agents**, open the agent's actions menu (⋮), and select **Configure**. See [Discovery](../../concepts/discovery/). +1. **Discover.** The agent finds your services and lists them in the **Application Performance Monitoring** card on the agent's **APM** tab. To open it, go to **Settings → Agents & Pipelines**, open the agent's actions menu (⋮), and select **Configure**. See [Discovery](../../concepts/discovery/). 2. **Choose a mode.** For each service, pick Off, eBPF, or SDK, then click **Apply**. eBPF takes effect on the next agent check-in with no restart. 3. **Confirm the restart (SDK only).** SDK instrumentation takes effect when the process restarts, so the agent asks before applying. After you confirm, the service shows **Pending** while the agent applies the change and restarts the app. 4. **Traces flow.** The service's chip flips to **Instrumented** and it sends application traces to the agent's local collector, correlated with its eBPF spans. @@ -30,10 +30,13 @@ Each service selected for SDK instrumentation shows a status chip so you always - **Instrumented:** the SDK is applied and the service is sending application traces. - **Failed:** the restart failed, so the agent rolled back the change (see rollback below) and the service reverts to its previous mode. - **Unsupported:** the runtime version has no bundled instrumentation, for example a Python minor release with no bundled cell. The service stays covered by eBPF; move to a supported version to add SDK traces. +- **Next deploy:** a container the agent won't recreate, such as one managed by Docker Compose or Swarm, gets the SDK the next time it's deployed or restarted. See [When the agent won't recreate a container](../../platform-notes/docker/#when-the-agent-wont-recreate-a-container). + +On a Docker host, the **Redeploy-safe SDK** card below the list keeps the SDK on containers when they're redeployed, so they start instrumented with no extra restart. It's off by default. See [Redeploy-safe SDK](../../platform-notes/redeploy-safe-sdk/). Services covered by eBPF (Go, Ruby, or anything without an SDK injector) don't restart and carry no chip. eBPF traces them as soon as you turn them on. A separate **Restart pending** marker on the *agents list* is unrelated: it means the agent's own collector configuration is queued for a restart, not a per-service instrumentation change. -![The Application instrumentation card on an agent's APM tab, with per-service Off / eBPF / SDK controls and status chips](./images/discovered-services-status-chips.png) +![The Application Performance Monitoring card on a Docker host's APM tab, with per-container Off / eBPF / SDK controls and Failed, Pending, and Next deploy status chips](./images/discovered-services-status-chips.png) ## Restart consent and health gating @@ -90,7 +93,7 @@ Shared setup that applies to every language on that platform: - + diff --git a/src/content/docs/docs/kloudmate-agent/auto-instrumentation/php.mdx b/src/content/docs/docs/kloudmate-agent/auto-instrumentation/php.mdx index 5073b17d..708c2133 100644 --- a/src/content/docs/docs/kloudmate-agent/auto-instrumentation/php.mdx +++ b/src/content/docs/docs/kloudmate-agent/auto-instrumentation/php.mdx @@ -19,7 +19,7 @@ When you instrument a PHP service, the agent adds a config file for the target's ## On Docker -A PHP container offers an **SDK** option in the **Application instrumentation** card. Turn it on and the agent injects the tracer, matches it to the container's PHP build, and reloads the web server (Apache graceful or php-fpm) with no redeploy and no container restart. The instrumented application sends traces to the agent through the container's host gateway. +A PHP container offers an **SDK** option in the **Application Performance Monitoring** card. Turn it on and the agent injects the tracer, matches it to the container's PHP build, and reloads the web server (Apache graceful or php-fpm) with no redeploy and no container restart. The instrumented application sends traces to the agent through the container's host gateway. This SDK option is on by default in Docker mode. On a Linux host agent it's opt-in: set `KM_CONTAINER_INSTRUMENT_ENABLED=true`. To instrument PHP containers automatically without picking each one, use `KM_CONTAINER_INSTRUMENT_ALL`, `KM_CONTAINER_INSTRUMENT_NAMES`, or `KM_CONTAINER_INSTRUMENT_IMAGES`. diff --git a/src/content/docs/docs/kloudmate-agent/auto-instrumentation/python.mdx b/src/content/docs/docs/kloudmate-agent/auto-instrumentation/python.mdx index a2b5a1b1..85635703 100644 --- a/src/content/docs/docs/kloudmate-agent/auto-instrumentation/python.mdx +++ b/src/content/docs/docs/kloudmate-agent/auto-instrumentation/python.mdx @@ -23,7 +23,7 @@ For a Python app under PM2, the agent restarts it with tracing switched on (`pm2 ### Standalone processes -The agent can instrument a Python process only when it runs under systemd or PM2. A process started on its own can't be instrumented automatically. Run it under systemd or PM2 first; the **Application instrumentation** card flags these and tells you so. +The agent can instrument a Python process only when it runs under systemd or PM2. A process started on its own can't be instrumented automatically. Run it under systemd or PM2 first; the **Application Performance Monitoring** card flags these and tells you so. ## On Kubernetes @@ -43,9 +43,9 @@ On Amazon ECS, the agent injects the Python instrumentation into the services yo ## On Docker -When the agent monitors Docker containers, whether in Docker mode or as a Linux service on a Docker host, eBPF traces your Python containers per service through the **Off / eBPF** toggle in the **Application instrumentation** card, with no code change and no restart. +When the agent monitors Docker containers, whether in Docker mode or as a Linux service on a Docker host, each Python container offers **Off**, **eBPF**, and **SDK** in the **Application Performance Monitoring** card. eBPF needs no code change and no restart. -The agent can't inject the in-process SDK into a running container, so SDK mode isn't offered for containers. For full SDK depth, add OpenTelemetry to your image yourself and point it at the KloudMate agent's OTLP endpoint. See [Docker platform notes](../../platform-notes/docker/) for the endpoint addresses. On systemd, Kubernetes, or Amazon ECS, the agent injects the instrumentation for you instead. +**SDK** adds the OpenTelemetry Python instrumentation by recreating the container with the same settings, which restarts it for a few seconds. If the new container doesn't come up healthy, the agent starts the original again. It needs a glibc-based image, such as `python:3.12-slim`, and a Python version the bundle includes. Alpine (musl) images use eBPF. Containers managed by Docker Compose or Swarm aren't recreated: their row shows the settings to add at the next deploy. See [Instrument Java, Node.js, Python, and .NET containers](../../platform-notes/docker/#instrument-java-nodejs-python-and-net-containers). ## On Windows diff --git a/src/content/docs/docs/kloudmate-agent/concepts/architecture.mdx b/src/content/docs/docs/kloudmate-agent/concepts/architecture.mdx index 50d213c0..ae175c4b 100644 --- a/src/content/docs/docs/kloudmate-agent/concepts/architecture.mdx +++ b/src/content/docs/docs/kloudmate-agent/concepts/architecture.mdx @@ -33,7 +33,7 @@ The two-sided model is the same in every mode. What changes is how the agent is | Linux / VM | A single agent as a systemd service. | Per service, using systemd. | | Windows | A single agent as a Windows service. | Per service or application pool, using the registry and Internet Information Services (IIS). | | Kubernetes | A fleet-manager pod plus collector pods. One agent represents one cluster. | Per workload, using the OpenTelemetry (OTel) Operator. | -| Docker | A containerized collector. | PHP containers without a redeploy; Java, Node.js, Python, and .NET through eBPF monitoring. | +| Docker | A containerized collector. | PHP containers without a redeploy; Java, Node.js, Python, and .NET by recreating the container with the SDK. | On Kubernetes, one cluster appears as one agent rather than one per node. See [Kubernetes platform notes](../../platform-notes/kubernetes/). diff --git a/src/content/docs/docs/kloudmate-agent/concepts/config-model.mdx b/src/content/docs/docs/kloudmate-agent/concepts/config-model.mdx index 8aa09917..6ba17e22 100644 --- a/src/content/docs/docs/kloudmate-agent/concepts/config-model.mdx +++ b/src/content/docs/docs/kloudmate-agent/concepts/config-model.mdx @@ -22,9 +22,9 @@ Every agent runs in one of two configuration modes. | Feature toggles | Available | Disabled | | Default for | New agents | Existing agents after upgrade | -- In **managed mode**, the configuration is generated from your enabled integrations every time. The YAML editor shows a read-only preview of what was generated. Toggling a feature regenerates the configuration. +- In **managed mode**, the configuration is generated from your enabled integrations every time. The YAML editor shows a read-only preview of what was generated. Toggling a feature regenerates the configuration. To add receivers, processors, or exporters on top, use the **Custom config override** editor below the preview. It's kept when the integrations change. See [Custom config override](../../custom-config-override/). -![Managed mode: the Config mode toggle set to Managed, with a read-only preview of the generated collector configuration.](./images/config-model-managed-mode.png) +![Managed mode: the Config mode toggle set to Managed, with a read-only preview of the generated base configuration and an editable custom config override below it.](./images/config-model-managed-mode.png) - In **manual mode**, you own the YAML blob. The integration toggles are disabled, and the YAML editor is writable. This is for advanced setups that need hand-tuned configuration. diff --git a/src/content/docs/docs/kloudmate-agent/concepts/discovery.mdx b/src/content/docs/docs/kloudmate-agent/concepts/discovery.mdx index f05ac51d..e7d262e5 100644 --- a/src/content/docs/docs/kloudmate-agent/concepts/discovery.mdx +++ b/src/content/docs/docs/kloudmate-agent/concepts/discovery.mdx @@ -20,7 +20,7 @@ For each service, discovery records how it is managed and which ports it listens ## Where discovered services appear -To see what discovery found, go to **Settings → Agents**, open the agent's actions menu (⋮), and select **Configure**. Application services are listed in the **Application instrumentation** card on the **APM** tab, and databases on the **Databases** tab. Discovery reports these details for each service: +To see what discovery found, go to **Settings → Agents & Pipelines**, open the agent's actions menu (⋮), and select **Configure**. Application services are listed in the **Application Performance Monitoring** card on the **APM** tab, and databases on the **Databases** tab. Discovery reports these details for each service: - **Name** and **runtime** (for example, `checkout` running Java). - **Runtime version**, where it affects a decision (for example, the PHP major and minor version, or whether a .NET app runs on .NET Framework or .NET Core). @@ -33,7 +33,7 @@ To see what discovery found, go to **Settings → Agents**, open the agent's act The `instrumentable` flag shows whether the agent can inject tracing into that runtime. Java, .NET, Node.js, and Python are instrumentable. PHP is instrumentable when a tracer is available for the detected version. Go isn't injected. eBPF monitoring covers it instead, so a Go service offers **Off** and **eBPF** but no **SDK** option. ::: -![The Application instrumentation panel on a host, showing the instrumentable difference: .NET, Java, Node.js, Python, and PHP services offer Off / eBPF / SDK, while Go services and other system services offer only Off / eBPF.](./images/discovery-services-list.png) +![The Application Performance Monitoring card on a Windows host's APM tab, listing discovered .NET services with Off and SDK options, and one service that can't be traced on this host and offers only Off.](./images/discovery-services-list.png) ## Stable service identity diff --git a/src/content/docs/docs/kloudmate-agent/concepts/images/config-model-managed-mode.png b/src/content/docs/docs/kloudmate-agent/concepts/images/config-model-managed-mode.png index 39dc428e..00f108bf 100644 Binary files a/src/content/docs/docs/kloudmate-agent/concepts/images/config-model-managed-mode.png and b/src/content/docs/docs/kloudmate-agent/concepts/images/config-model-managed-mode.png differ diff --git a/src/content/docs/docs/kloudmate-agent/concepts/images/config-model-manual-mode.png b/src/content/docs/docs/kloudmate-agent/concepts/images/config-model-manual-mode.png index 79987fe1..eb885668 100644 Binary files a/src/content/docs/docs/kloudmate-agent/concepts/images/config-model-manual-mode.png and b/src/content/docs/docs/kloudmate-agent/concepts/images/config-model-manual-mode.png differ diff --git a/src/content/docs/docs/kloudmate-agent/concepts/images/discovery-services-list.png b/src/content/docs/docs/kloudmate-agent/concepts/images/discovery-services-list.png index 9334e067..ec6a5b56 100644 Binary files a/src/content/docs/docs/kloudmate-agent/concepts/images/discovery-services-list.png and b/src/content/docs/docs/kloudmate-agent/concepts/images/discovery-services-list.png differ diff --git a/src/content/docs/docs/kloudmate-agent/database-monitoring/images/agent-databases-tab.png b/src/content/docs/docs/kloudmate-agent/database-monitoring/images/agent-databases-tab.png index ac3cf185..2b4196a9 100644 Binary files a/src/content/docs/docs/kloudmate-agent/database-monitoring/images/agent-databases-tab.png and b/src/content/docs/docs/kloudmate-agent/database-monitoring/images/agent-databases-tab.png differ diff --git a/src/content/docs/docs/kloudmate-agent/database-monitoring/images/wizard-add-database.png b/src/content/docs/docs/kloudmate-agent/database-monitoring/images/wizard-add-database.png index a981f8f1..c42bfb23 100644 Binary files a/src/content/docs/docs/kloudmate-agent/database-monitoring/images/wizard-add-database.png and b/src/content/docs/docs/kloudmate-agent/database-monitoring/images/wizard-add-database.png differ diff --git a/src/content/docs/docs/kloudmate-agent/database-monitoring/on-kubernetes.mdx b/src/content/docs/docs/kloudmate-agent/database-monitoring/on-kubernetes.mdx index 4c5e1dfa..fc4e924d 100644 --- a/src/content/docs/docs/kloudmate-agent/database-monitoring/on-kubernetes.mdx +++ b/src/content/docs/docs/kloudmate-agent/database-monitoring/on-kubernetes.mdx @@ -21,7 +21,7 @@ Each discovered database stays listed until a database with the same endpoint is ## Managed mode is required -In **Settings → Agents**, open the cluster's agent and go to its **Databases** tab. If the agent is in manual mode, click **Switch to managed**. In managed mode, KloudMate generates the agent's configuration from its integrations and replaces any manual configuration. See the [configuration model](../../concepts/config-model/). +In **Settings → Agents & Pipelines**, open the cluster's agent and go to its **Databases** tab. If the agent is in manual mode, click **Switch to managed**. In managed mode, KloudMate generates the agent's configuration from its integrations and replaces any manual configuration. See the [configuration model](../../concepts/config-model/). ## Available coverages diff --git a/src/content/docs/docs/kloudmate-agent/database-monitoring/on-vm.mdx b/src/content/docs/docs/kloudmate-agent/database-monitoring/on-vm.mdx index b118297d..9e8c9b22 100644 --- a/src/content/docs/docs/kloudmate-agent/database-monitoring/on-vm.mdx +++ b/src/content/docs/docs/kloudmate-agent/database-monitoring/on-vm.mdx @@ -23,7 +23,7 @@ A database on the host often listens on `localhost`, which isn't unique across y ## Set up monitoring -1. **Make sure the agent is in managed config mode.** In **Settings → Agents**, open the agent. If the **Databases** tab asks you to switch to managed, click **Switch to managed**. Manual edits to the collector configuration are replaced. +1. **Make sure the agent is in managed config mode.** In **Settings → Agents & Pipelines**, open the agent. If the **Databases** tab asks you to switch to managed, click **Switch to managed**. Manual edits to the collector configuration are replaced. 2. **Open the wizard.** On the **Databases** tab, click **Monitor** next to a discovered database, or **Add database** for one that wasn't discovered. You can also start from **Databases → Monitor a database**. diff --git a/src/content/docs/docs/kloudmate-agent/database-monitoring/overview.mdx b/src/content/docs/docs/kloudmate-agent/database-monitoring/overview.mdx index bd2177f1..8b6bad20 100644 --- a/src/content/docs/docs/kloudmate-agent/database-monitoring/overview.mdx +++ b/src/content/docs/docs/kloudmate-agent/database-monitoring/overview.mdx @@ -29,7 +29,7 @@ Both views share a database identity, so a slow query in a trace lines up with t You can open the wizard from two places: - **Databases → Monitor a database.** Choose the agent, then the engine. This is the quickest path when you're adding a database for the first time. -- **Settings → Agents.** Open the agent and go to its **Databases** tab. It lists the databases the agent discovered and not yet monitored, with a **Monitor** button on each, and the databases already monitored, with **Edit** and **Remove**. Use **Add database** for a database that wasn't discovered. +- **Settings → Agents & Pipelines.** Open the agent and go to its **Databases** tab. It lists the databases the agent discovered and not yet monitored, with a **Monitor** button on each, and the databases already monitored, with **Edit** and **Remove**. Use **Add database** for a database that wasn't discovered. Once you add one database of an engine on a host, the other discovered databases of that engine drop off the **Discovered on this host** list. Add further databases of the same engine with **Add database**. @@ -53,20 +53,20 @@ The wizard is one form, top to bottom: Click **Save and apply**. The change reaches the agent within a minute. -![The "Add database monitoring" wizard for MySQL, with Query performance turned on, the setup steps it needs, and the connection fields with the credential mode selector (environment variable or entered value).](./images/wizard-add-database.png) +![The "Add database monitoring" wizard for MySQL, top to bottom: the engine picker and coverages with Query performance turned on, the setup steps it needs, the connection fields with the credential mode selector (environment variable or entered value), and the collapsed Advanced section with Save and apply.](./images/wizard-add-database.png) ## What's checked when you save The wizard checks that required fields are filled in and that any **Advanced** override is a YAML mapping. It doesn't connect to the database, so it can't test your password or grants. - **A wrong password or a missing grant** shows up as errors in the agent log, and as empty tabs in the Databases module. If a tab stays empty, run the setup steps again and check the agent log. -- **A database the agent can't generate** is skipped on its own. The other databases and the rest of your telemetry keep working. Skipped integrations and the reason are listed on the agent's **Collector config** tab. +- **A database the agent can't generate** is skipped on its own. The other databases and the rest of your telemetry keep working. Skipped integrations and the reason are listed on the agent's **Collector Config** tab. ## Edit or remove a database -Monitored databases are edited from the agent that monitors them, not from the Databases module. Go to **Settings → Agents**, open the agent, and go to its **Databases** tab. +Monitored databases are edited from the agent that monitors them, not from the Databases module. Go to **Settings → Agents & Pipelines**, open the agent, and go to its **Databases** tab. -![An agent's Databases tab listing its monitored databases, each with a feature count, an Edit (pencil) button, and a Remove (trash) button.](./images/agent-databases-tab.png) +![An agent's Databases tab listing its monitored databases, each with a feature count, an Edit (pencil) button, and a Remove (trash) button, and one database expanded to show its enabled coverage and the ones to turn on with Edit to enable.](./images/agent-databases-tab.png) Click **Edit** on a monitored database to change its coverages, connection, or overrides. Stored passwords stay in place unless you replace them. To turn on a coverage you haven't enabled yet, expand the database's feature list and follow **Edit to enable**. diff --git a/src/content/docs/docs/kloudmate-agent/ebpf-observability.mdx b/src/content/docs/docs/kloudmate-agent/ebpf-observability.mdx index e8ea726b..e6aa4312 100644 --- a/src/content/docs/docs/kloudmate-agent/ebpf-observability.mdx +++ b/src/content/docs/docs/kloudmate-agent/ebpf-observability.mdx @@ -24,7 +24,7 @@ When eBPF monitoring is active, the agent collects: Because eBPF observes traffic in the kernel, it can trace a service with no code change and no restart — including Go and other services no language agent can inject. eBPF RED metrics and trace spans are a per-service choice you turn on (the **eBPF** APM mode); the network topology map and database activity monitoring run automatically. When a service also runs application APM, its eBPF spans and the application spans share the same trace, so hops you haven't put on the SDK still appear in end-to-end traces. See the [Application APM overview](../auto-instrumentation/overview/). -On a host running Docker, the agent reads each container's name and listen ports from the Docker socket, so a container can be traced with eBPF the same way a host process can, whether the agent runs as a Linux service or in Docker mode. In the **Application instrumentation** card on the agent's **APM** tab, a container offers **Off** or **eBPF**, because the agent can't attach an in-process SDK to a running container. PHP containers can also offer an **SDK** option that injects a tracer with no redeploy. See [Docker platform notes](../platform-notes/docker/). +On a host running Docker, the agent reads each container's name and listen ports from the Docker socket, so a container can be traced with eBPF the same way a host process can, whether the agent runs as a Linux service or in Docker mode. In the **Application Performance Monitoring** card on the agent's **APM** tab, a container offers **Off** or **eBPF**, because the agent can't attach an in-process SDK to a running container. PHP containers can also offer an **SDK** option that injects a tracer with no redeploy. See [Docker platform notes](../platform-notes/docker/). ## Deployment modes and requirements @@ -83,7 +83,7 @@ eBPF monitoring runs within a budget of roughly 50 to 100 MB of memory and 5 to On a manual-mode agent, eBPF is managed through the remote YAML editor, with no need to log in to the host or edit local files. 1. Log in to your KloudMate platform. -2. Go to the **Agents** landing page. +2. Go to **Settings → Agents & Pipelines**. 3. Locate the agent on your target Linux host or Kubernetes cluster. 4. Open the collector configuration editor. diff --git a/src/content/docs/docs/kloudmate-agent/images/agent-runbook-scripts-tab.png b/src/content/docs/docs/kloudmate-agent/images/agent-runbook-scripts-tab.png index 36db3007..97bb5c89 100644 Binary files a/src/content/docs/docs/kloudmate-agent/images/agent-runbook-scripts-tab.png and b/src/content/docs/docs/kloudmate-agent/images/agent-runbook-scripts-tab.png differ diff --git a/src/content/docs/docs/kloudmate-agent/images/log-monitoring-add-source.png b/src/content/docs/docs/kloudmate-agent/images/log-monitoring-add-source.png index 9016eaee..4c83b6f3 100644 Binary files a/src/content/docs/docs/kloudmate-agent/images/log-monitoring-add-source.png and b/src/content/docs/docs/kloudmate-agent/images/log-monitoring-add-source.png differ diff --git a/src/content/docs/docs/kloudmate-agent/images/log-monitoring-preview-results.png b/src/content/docs/docs/kloudmate-agent/images/log-monitoring-preview-results.png index 0a2fa7ca..5e2a8bae 100644 Binary files a/src/content/docs/docs/kloudmate-agent/images/log-monitoring-preview-results.png and b/src/content/docs/docs/kloudmate-agent/images/log-monitoring-preview-results.png differ diff --git a/src/content/docs/docs/kloudmate-agent/images/managing-kloudmate-agents-1.png b/src/content/docs/docs/kloudmate-agent/images/managing-kloudmate-agents-1.png index 6450cf73..868b432b 100644 Binary files a/src/content/docs/docs/kloudmate-agent/images/managing-kloudmate-agents-1.png and b/src/content/docs/docs/kloudmate-agent/images/managing-kloudmate-agents-1.png differ diff --git a/src/content/docs/docs/kloudmate-agent/images/managing-kloudmate-agents-2.png b/src/content/docs/docs/kloudmate-agent/images/managing-kloudmate-agents-2.png index 5c5ab743..9c068463 100644 Binary files a/src/content/docs/docs/kloudmate-agent/images/managing-kloudmate-agents-2.png and b/src/content/docs/docs/kloudmate-agent/images/managing-kloudmate-agents-2.png differ diff --git a/src/content/docs/docs/kloudmate-agent/images/managing-kloudmate-agents-3.png b/src/content/docs/docs/kloudmate-agent/images/managing-kloudmate-agents-3.png index b7eabb0a..d0a61f0e 100644 Binary files a/src/content/docs/docs/kloudmate-agent/images/managing-kloudmate-agents-3.png and b/src/content/docs/docs/kloudmate-agent/images/managing-kloudmate-agents-3.png differ diff --git a/src/content/docs/docs/kloudmate-agent/images/managing-kloudmate-agents-4.png b/src/content/docs/docs/kloudmate-agent/images/managing-kloudmate-agents-4.png index 84c03201..6a6cb5cf 100644 Binary files a/src/content/docs/docs/kloudmate-agent/images/managing-kloudmate-agents-4.png and b/src/content/docs/docs/kloudmate-agent/images/managing-kloudmate-agents-4.png differ diff --git a/src/content/docs/docs/kloudmate-agent/images/process-monitoring-1.png b/src/content/docs/docs/kloudmate-agent/images/process-monitoring-1.png index 31a8bc46..318ab5a6 100644 Binary files a/src/content/docs/docs/kloudmate-agent/images/process-monitoring-1.png and b/src/content/docs/docs/kloudmate-agent/images/process-monitoring-1.png differ diff --git a/src/content/docs/docs/kloudmate-agent/index.mdx b/src/content/docs/docs/kloudmate-agent/index.mdx index eb939d72..5d35e0f4 100644 --- a/src/content/docs/docs/kloudmate-agent/index.mdx +++ b/src/content/docs/docs/kloudmate-agent/index.mdx @@ -51,7 +51,7 @@ The agent runs across four deployment modes. Not every capability applies to eve | Agent health and self-logs | Yes | Yes | Yes | Yes | :::note -On Linux, eBPF monitoring needs kernel 4.14 or newer, and does more on 5.8 and above. On any host with a Docker socket, container metrics and logs are collected automatically, whether the agent runs as a Linux service or in Docker mode. Container tracing is opt-in per service: **Off** or **eBPF**, plus an **SDK** option for PHP containers that traces without a redeploy. See [Docker platform notes](platform-notes/docker/). +On Linux, eBPF monitoring needs kernel 4.14 or newer, and does more on 5.8 and above. On any host with a Docker socket, container metrics and logs are collected automatically, whether the agent runs as a Linux service or in Docker mode. Container tracing is opt-in per service: **Off**, **eBPF**, or **SDK**. See [Docker platform notes](platform-notes/docker/). ::: ## Install the agent diff --git a/src/content/docs/docs/kloudmate-agent/installation/docker-agent.mdx b/src/content/docs/docs/kloudmate-agent/installation/docker-agent.mdx index be7b7c21..b3f49479 100644 --- a/src/content/docs/docs/kloudmate-agent/installation/docker-agent.mdx +++ b/src/content/docs/docs/kloudmate-agent/installation/docker-agent.mdx @@ -61,7 +61,7 @@ View all collected data in these KloudMate sections: ## Install Agent -**Step 1:** Navigate to the **Settings → Agents** section in your KloudMate account. +**Step 1:** Navigate to the **Settings → Agents & Pipelines** section in your KloudMate account. **Step 2:** Click **Add Agent**, select **Docker**, and click **Continue**. On the **API key** step, click **Create backend key**, or select **Use existing key** and paste your backend ingest key. Then click **Continue**. @@ -83,7 +83,7 @@ For a hand-written `filelog` receiver in manual mode, see [Collect File Logs wit ## Coverage and configuration -In Docker mode, the agent collects host and container metrics and container and host logs, and, where the host kernel supports it, places your containers on the service map from [eBPF](../../ebpf-observability/) network flows, with no code changes. Application tracing is opt-in per service: set a container to **eBPF** for RED metrics and spans (no restart), or leave it **Off**. Java, Node.js, Python, .NET, and Go containers can't take the in-process SDK, so they use eBPF. PHP containers are the exception: they also offer an **SDK** option that injects the tracer and reloads the web server, with no redeploy. See [Docker platform notes](../../platform-notes/docker/) for the per-runtime detail. +In Docker mode, the agent collects host and container metrics and container and host logs, and, where the host kernel supports it, places your containers on the service map from [eBPF](../../ebpf-observability/) network flows, with no code changes. Application tracing is opt-in per service: set a container to **eBPF** for RED metrics and spans (no restart), to **SDK** for deep spans from the OpenTelemetry SDK, or leave it **Off**. For Java, Node.js, Python, and .NET, the agent adds the SDK by recreating the container with the same settings. PHP containers get the tracer without a redeploy. Go containers use eBPF. See [Docker platform notes](../../platform-notes/docker/) for the per-runtime detail. New agents start in managed mode, so KloudMate generates the collector configuration for you. See the [configuration model](../../concepts/config-model/). diff --git a/src/content/docs/docs/kloudmate-agent/installation/ecs-agent.mdx b/src/content/docs/docs/kloudmate-agent/installation/ecs-agent.mdx index b19fdda0..aff8ac6f 100644 --- a/src/content/docs/docs/kloudmate-agent/installation/ecs-agent.mdx +++ b/src/content/docs/docs/kloudmate-agent/installation/ecs-agent.mdx @@ -95,7 +95,7 @@ Instrumenting a service runs a task-definition injection step. This happens on e ## Install Agent -**Step 1:** Go to **Settings → Agents** in your KloudMate account. +**Step 1:** Go to **Settings → Agents & Pipelines** in your KloudMate account. **Step 2:** Click **Add Agent**, select **Amazon ECS**, and click **Continue**. On the **API key** step, click **Create backend key**, or select **Use existing key** and paste your backend ingest key. Then click **Continue**. @@ -229,7 +229,7 @@ kmagent ecs instrument \ The two launch types appear differently in KloudMate: -- **EC2 daemon:** each container instance appears in **Settings → Agents** as **Amazon ECS**, one row per instance. Its **APM** tab has no per-service toggle. Instead, it points you to the `kmagent ecs discover` and `instrument` commands and explains the language-aware split (SDK for Java/Node/Python/.NET, eBPF for the rest). +- **EC2 daemon:** each container instance appears in **Settings → Agents & Pipelines** as **Amazon ECS**, one row per instance. Its **APM** tab has no per-service toggle. Instead, it points you to the `kmagent ecs discover` and `instrument` commands and explains the language-aware split (SDK for Java/Node/Python/.NET, eBPF for the rest). - **Fargate tasks are autonomous:** each collector sidecar ships telemetry on its own and **does not appear as an agent row**. Find that data in **APM & Services** and **Logs**, keyed by service name. Fargate tasks don't appear in **Hosts**. The install flow's verify step accounts for this, so it won't wait for a Fargate check-in that never comes. ## Log Integration diff --git a/src/content/docs/docs/kloudmate-agent/installation/images/kubernetes-agent-1.png b/src/content/docs/docs/kloudmate-agent/installation/images/kubernetes-agent-1.png index ec533b08..e7d975aa 100644 Binary files a/src/content/docs/docs/kloudmate-agent/installation/images/kubernetes-agent-1.png and b/src/content/docs/docs/kloudmate-agent/installation/images/kubernetes-agent-1.png differ diff --git a/src/content/docs/docs/kloudmate-agent/installation/kubernetes-agent.mdx b/src/content/docs/docs/kloudmate-agent/installation/kubernetes-agent.mdx index f227f9fd..d5271206 100644 --- a/src/content/docs/docs/kloudmate-agent/installation/kubernetes-agent.mdx +++ b/src/content/docs/docs/kloudmate-agent/installation/kubernetes-agent.mdx @@ -182,11 +182,11 @@ There are two ways to enable **Application Performance Monitoring (APM)** in you ### 1. Enable APM via Dashboard -- After installing the agent, go to **Settings → Agents**, open the cluster's actions menu (⋮), and select **Configure** to open its **APM** tab. +- After installing the agent, go to **Settings → Agents & Pipelines**, open the cluster's actions menu (⋮), and select **Configure** to open its **APM** tab. - The agent lists the workloads it discovered, grouped by namespace, with each workload's detected language. Use the namespace filter or the search box to find one in a large cluster. - For each workload, choose **Off**, **eBPF**, or **SDK**, then apply. eBPF starts tracing on the next check-in with no restart; SDK rolls that workload's pods. Workloads with no SDK injector — Go, Ruby, or an unrecognized runtime — offer **Off** or **eBPF** only. -![The cluster's APM tab, with the Application instrumentation card listing workloads grouped by namespace, each with Off, eBPF, and SDK options, and the Apply button](./images/kubernetes-agent-1.png) +![The cluster's APM tab, with the Application Performance Monitoring card listing workloads grouped by namespace, each with Off, eBPF, and SDK options or Off and eBPF for Go workloads, an Instrumented badge on traced workloads, and the Apply button](./images/kubernetes-agent-1.png) - After you turn a workload on, wait a few minutes for its traces to start, then verify them on the dashboard. diff --git a/src/content/docs/docs/kloudmate-agent/installation/linux-agent.mdx b/src/content/docs/docs/kloudmate-agent/installation/linux-agent.mdx index 12f8f122..e262a9b4 100644 --- a/src/content/docs/docs/kloudmate-agent/installation/linux-agent.mdx +++ b/src/content/docs/docs/kloudmate-agent/installation/linux-agent.mdx @@ -58,7 +58,7 @@ View all data in these KloudMate sections: ## Install Agent -**Step 1:** Navigate to the **Settings → Agents** section in your KloudMate account. +**Step 1:** Navigate to the **Settings → Agents & Pipelines** section in your KloudMate account. **Step 2:** Click **Add Agent**, select **Linux**, and click **Continue**. On the **API key** step, click **Create backend key**, or select **Use existing key** and paste your backend ingest key. Then click **Continue**. @@ -88,9 +88,9 @@ For a hand-written `filelog` receiver in manual mode, see [Collect File Logs wit If the host runs Docker, the agent finds the Docker socket and starts collecting **container metrics and container logs** on its own, the same telemetry a Docker-mode agent collects. This happens as soon as the agent starts, before and independent of application tracing. To turn it off, set `KM_DOCKER_STATS=false` for metrics or `KM_DOCKER_LOGS=false` for logs. -Each container also shows up in the **Application instrumentation** card on the agent's **APM** tab, where you can turn on per-container tracing. Most containers offer **Off** or **eBPF**: eBPF captures RED metrics and trace spans in the kernel, with no code change and no restart. There's no in-process **SDK** option for them, because the agent can't change a running container's start-time environment. Host processes that aren't containerized still offer **Off**, **eBPF**, or **SDK**. +Each container also shows up in the **Application Performance Monitoring** card on the agent's **APM** tab, where you choose **Off**, **eBPF**, or **SDK** per container, the same as for host processes. eBPF captures RED metrics and trace spans in the kernel, with no code change and no restart. **SDK** adds the OpenTelemetry SDK to Java, Node.js, Python, and .NET containers by recreating them with the same settings. It's on by default. -PHP containers are the exception: they can take an **SDK** option that injects the tracer and reloads the web server (Apache or php-fpm), with no redeploy and no container restart. On a Linux host this is opt-in. Set `KM_CONTAINER_INSTRUMENT_ENABLED=true`, and PHP containers start offering **SDK** on the agent's **APM** tab. In Docker mode that option is on by default. +PHP containers get the **SDK** option without a redeploy: the agent injects the tracer and reloads the web server (Apache or php-fpm). On a Linux host this is opt-in, because the tracer reports to port `8126`, which a Datadog agent may already use. See [Container SDK on the Linux agent](../../platform-notes/docker/#container-sdk-on-the-linux-agent). In Docker mode it's on by default. For monitoring containers, a Linux service and a Docker-mode agent are equivalent. Choose between them by how you want to run the agent, not by what they can see. See [Docker mode vs the Linux agent](../../platform-notes/docker/#docker-mode-vs-the-linux-agent). @@ -104,7 +104,7 @@ After the agent is running, confirm what it collects and explore what it found: - Host metrics and logs start flowing automatically. See [Host metrics and logs](../../baseline/host-metrics-and-logs/). - On a supported Linux kernel (4.14 or newer), [eBPF monitoring](../../ebpf-observability/) turns on automatically and adds RED metrics and a service map. -- To see what the agent found and instrument a service, go to **Settings → Agents**, open the agent's actions menu (⋮), and select **Configure**. See [Discovery](../../concepts/discovery/). +- To see what the agent found and instrument a service, go to **Settings → Agents & Pipelines**, open the agent's actions menu (⋮), and select **Configure**. See [Discovery](../../concepts/discovery/). ## Next Steps diff --git a/src/content/docs/docs/kloudmate-agent/installation/windows-agent.mdx b/src/content/docs/docs/kloudmate-agent/installation/windows-agent.mdx index c6119a29..8cec0613 100644 --- a/src/content/docs/docs/kloudmate-agent/installation/windows-agent.mdx +++ b/src/content/docs/docs/kloudmate-agent/installation/windows-agent.mdx @@ -54,7 +54,7 @@ View all collected data in these KloudMate sections: ## Install Agent -**Step 1:** Navigate to the **Settings → Agents** section in your KloudMate account. +**Step 1:** Navigate to the **Settings → Agents & Pipelines** section in your KloudMate account. **Step 2:** Click **Add Agent**, select **Windows**, and click **Continue**. On the **API key** step, click **Create backend key**, or select **Use existing key** and paste your backend ingest key. Then click **Continue**. @@ -79,7 +79,7 @@ To install without prompts (for Intune, Group Policy, or a configuration-managem ``` - `/APIKEY=` sets your workspace API key. Required. -- `/ENDPOINT=` sets the collector endpoint. Optional; defaults to `https://otel.kloudmate.com:4318`. Use your workspace's endpoint from **Settings → Agents**. +- `/ENDPOINT=` sets the collector endpoint. Optional; defaults to `https://otel.kloudmate.com:4318`. Use your workspace's endpoint from **Settings → Agents & Pipelines**. - `/VERYSILENT /SUPPRESSMSGBOXES /NORESTART` suppress the wizard, dialog prompts, and reboot. The service installs and starts the same as the interactive install. Replace `kmagent-setup.exe` with the file you downloaded. diff --git a/src/content/docs/docs/kloudmate-agent/log-monitoring.mdx b/src/content/docs/docs/kloudmate-agent/log-monitoring.mdx index ecccef4c..5ecaf622 100644 --- a/src/content/docs/docs/kloudmate-agent/log-monitoring.mdx +++ b/src/content/docs/docs/kloudmate-agent/log-monitoring.mdx @@ -13,7 +13,7 @@ It applies to Linux and Windows virtual machine (VM) hosts and to Docker. It is ## How it fits -Log monitoring is a managed-mode feature. To configure sources, go to **Settings → Agents**, open the agent's actions menu (⋮), select **Configure**, and open the **Logs** tab. See the [configuration model](../concepts/config-model/) for how managed mode works. +Log monitoring is a managed-mode feature. To configure sources, go to **Settings → Agents & Pipelines**, open the agent's actions menu (⋮), select **Configure**, and open the **Logs** tab. See the [configuration model](../concepts/config-model/) for how managed mode works. - **Managed mode only.** The Logs tab is available when the agent is in managed mode. If the agent is in manual mode, the tab prompts you to switch. You can still add a `filelog` receiver by hand in manual mode: see [Manual configuration](#manual-configuration). - **Independent sources.** Each source is isolated, so one badly configured source cannot affect the others or your host system logs. @@ -25,7 +25,7 @@ You add each source through the wizard on the Logs tab. -1. **Open the Logs tab.** In **Settings → Agents**, open the agent's actions menu (⋮), select **Configure**, and then select **Logs**. The agent must be in managed mode. +1. **Open the Logs tab.** In **Settings → Agents & Pipelines**, open the agent's actions menu (⋮), select **Configure**, and then select **Logs**. The agent must be in managed mode. 2. **Name the source.** The name identifies the source and is stamped on every record it collects (as the `km.log.source` attribute), so give it something you will recognize in the Log Explorer. @@ -41,7 +41,7 @@ You add each source through the wizard on the Logs tab. -![The "Add log source" wizard, showing the folder and file-name pattern, the log format picker, and the attributes section.](./images/log-monitoring-add-source.png) +![The "Add log source" wizard, top to bottom: the source name, the folder and file-name pattern, the log format picker, the attributes section with discovered services, and the Preview results and Save and apply buttons.](./images/log-monitoring-add-source.png) ## Choose how to parse diff --git a/src/content/docs/docs/kloudmate-agent/management.mdx b/src/content/docs/docs/kloudmate-agent/management.mdx index 37d65746..fb638bbe 100644 --- a/src/content/docs/docs/kloudmate-agent/management.mdx +++ b/src/content/docs/docs/kloudmate-agent/management.mdx @@ -9,25 +9,25 @@ The KloudMate Agent is managed centrally from the web UI, so there is no need to ## Agents Overview -The KloudMate agent's landing page lets you view, add, and manage agents. After an agent is integrated, it appears in the table: +The **Agents & Pipelines** page lets you view, add, and manage agents. After an agent is integrated, it appears in the table: -![image](./images/managing-kloudmate-agents-3.png) +![The Agents & Pipelines page, listing each agent's host, status, mode, agent version with an arrow to the newer release where one is available, and when it was last seen.](./images/managing-kloudmate-agents-3.png) - **Host:** The agent's host machine name, with its platform and architecture underneath (for example, `Linux · amd64`). -- **Status:** The agent's current reachability, such as **Healthy** or **Unreachable**, plus a **Restart pending** tag while a restart is in progress. +- **Status:** **Healthy** when the agent is checking in and its collector is running, **Stopped** when the agent is checking in but its collector isn't running, or **Unreachable** when the agent has stopped checking in. A **Restart pending** tag appears while a restart is in progress. - **Mode:** Whether the agent is in **Managed** or **Manual** configuration mode. See [Managed and manual mode](#managed-and-manual-mode). -- **Agent Version:** Version of the KloudMate agent used during integration. +- **Agent Version:** The version the agent is running. When a newer release is out, an arrow and the new version number appear next to it. See [Upgrade the agent](#upgrade-the-agent). - **Last Seen:** How long ago the agent last checked in. ## Adding a New Agent 1. Click the **Add Agent** button located at the top-right corner of the page. -![image](./images/managing-kloudmate-agents-1.png) +![The Add Agent button at the top right of the Agents & Pipelines page.](./images/managing-kloudmate-agents-1.png) 2. Choose where you want to install the agent. -![image](./images/managing-kloudmate-agents-2.png) +![The Install KloudMate Agent page asking where the agent should be installed, with Linux, Docker, Windows, Kubernetes, and Amazon ECS options.](./images/managing-kloudmate-agents-2.png) :::note After choosing a platform, refer to the corresponding installation guide: @@ -46,11 +46,12 @@ The agent watches for remote configuration changes over a secure connection and Open the actions menu (⋮) for an agent to manage it: -![image](./images/managing-kloudmate-agents-4.png) +![An agent's actions menu with Configure, Restart agent, Uninstall, and Delete.](./images/managing-kloudmate-agents-4.png) -- **Configure:** Opens the agent's Configuration page, with tabs for **APM**, **Databases**, **Logs**, **Processes**, **Runbook scripts**, and **Collector config**. Updates apply automatically wherever the agent is installed. +- **Configure:** Opens the agent's Configuration page, with tabs for **APM**, **Databases**, **Logs**, **Processes**, **Runbook Scripts**, and **Collector Config**. Updates apply automatically wherever the agent is installed. - **Restart agent:** Restart the agent when needed. -- **Delete:** Remove the agent from the KloudMate Agent landing page and clear all of its configuration. +- **Uninstall:** Shows the command that removes the agent from its host. +- **Delete:** Remove the agent from the **Agents & Pipelines** page and clear all of its configuration. :::caution Deleting an agent decommissions it. Its instrumented applications restart so their instrumentation is removed, and its database and log monitoring stop. If the agent is still running on the host, it checks back in and reappears as a new, unconfigured agent. To remove it for good, also uninstall it from the host. See the [installation guides](../installation/linux-agent/) for the uninstall command. @@ -69,11 +70,11 @@ You can switch an agent between modes. Switching from manual to managed replaces To undo a managed change, turn the toggle back. There is no separate history or rollback button. Switching an agent from manual to managed mode saves your hand-edited YAML first, so you never lose it. See the [configuration model](../concepts/config-model/). -### Runbook scripts +### Runbook Scripts -The **Runbook scripts** tab decides whether a [workflow](../../workflows/) can run commands on this host with the [Run Command on Host](../../workflows/actions/#run-command-on-host) step. Scripts are off until someone with the **Developer** role turns on **Allow runbook scripts on this host**. The agent picks up the change within a minute. Only Linux host agents have this setting. +The **Runbook Scripts** tab decides whether a [workflow](../../workflows/) can run commands on this host with the [Run Command on Host](../../workflows/actions/#run-command-on-host) step. Scripts are off until someone with the **Developer** role turns on **Allow runbook scripts on this host**. The agent picks up the change within a minute. Only Linux host agents have this setting. -![Runbook scripts tab for a Linux host agent](./images/agent-runbook-scripts-tab.png) +![The Runbook Scripts tab with Allow runbook scripts on this host turned on](./images/agent-runbook-scripts-tab.png) Scripts run as root and can access anything the host can already access, such as a kubeconfig, a cloud instance profile, or an SSH key on disk. Allow them only on hosts where that's acceptable. @@ -136,7 +137,7 @@ ebpf: ## See the agent's own errors -When an agent shows as **Unreachable** or **Degraded** in **Settings → Agents**, you'll usually want its logs. Each agent sends its own **ERROR-level logs** to your workspace, so you can read them in **Log Explorer** without SSHing into the host or running `docker logs` or `kubectl logs`. +When an agent shows as **Unreachable** or **Degraded** in **Settings → Agents & Pipelines**, you'll usually want its logs. Each agent sends its own **ERROR-level logs** to your workspace, so you can read them in **Log Explorer** without SSHing into the host or running `docker logs` or `kubectl logs`. These logs are sent independently of the collector, so they still arrive even when the collector fails to start on an invalid config. Both the agent and its collector log this way, so a failure in either one appears in the same place. @@ -163,7 +164,7 @@ Error-log shipping is on by default. It reuses the same `KM_API_KEY` and `KM_COL ## Agent health and status -Beyond the status shown on the landing page, each agent reports on its own health so you can confirm it is running and see when something goes wrong: +Beyond the status shown on the **Agents & Pipelines** page, each agent reports on its own health so you can confirm it is running and see when something goes wrong: - **Health metrics** tell you whether the agent and its collector are up, and classify why the collector is down if it is. See [Agent health metrics](../self-observability/health-metrics/). - **Self-logs** bring the agent's own error messages into KloudMate, so you can diagnose a failure without logging in to the host. See [Agent self-logs](../self-observability/self-logs/). @@ -182,6 +183,6 @@ Upgrade an agent from its page in the dashboard with one click, or rerun its ins ## Best Practices -- Use filters and search on the Agents landing page to quickly locate agents by **host**, **platform**, or **status**. +- Use filters and search on the **Agents & Pipelines** page to quickly locate agents by **host**, **platform**, or **status**. - For clusters with multiple agents, consider **bulk restarting** or **updating collectors** where supported. - Always confirm that agent configurations have applied successfully by checking your dashboards. diff --git a/src/content/docs/docs/kloudmate-agent/platform-notes/docker.mdx b/src/content/docs/docs/kloudmate-agent/platform-notes/docker.mdx index ac87d4e1..b535805e 100644 --- a/src/content/docs/docs/kloudmate-agent/platform-notes/docker.mdx +++ b/src/content/docs/docs/kloudmate-agent/platform-notes/docker.mdx @@ -19,33 +19,103 @@ Container monitoring isn't unique to Docker mode. A [Linux agent](../../installa ## Docker mode vs the Linux agent -For monitoring containers, the two are equivalent. A Linux (systemd) agent on a Docker host and a containerized Docker-mode agent both collect container metrics and logs automatically, and both trace containers per service with eBPF (**Off** or **eBPF**). Pick between them by how you want to run the agent, not by what they can see: +For monitoring containers, the two are equivalent. A Linux (systemd) agent on a Docker host and a containerized Docker-mode agent both collect container metrics and logs automatically, and both trace containers per service with eBPF or the OpenTelemetry SDK. Pick between them by how you want to run the agent, not by what they can see: - **Host processes.** The Linux agent also instruments the host's own non-containerized processes with the OpenTelemetry SDK, through systemd. A Docker-mode agent is itself a container, so it can't do that, and the host's processes are traced with eBPF only. -- **PHP containers.** A PHP container can offer an **SDK** option that injects the tracer with no redeploy. That option is on by default in Docker mode. On the Linux agent it's opt-in: set `KM_CONTAINER_INSTRUMENT_ENABLED=true`. +- **SDK for containers.** The **SDK** option on containers is on by default in both. On the Linux agent, PHP containers are opt-in: see [Container SDK on the Linux agent](#container-sdk-on-the-linux-agent). - **How the agent runs.** Docker mode runs the agent as a container and needs the Docker socket mounted, plus a privileged container with host access for eBPF. The Linux agent runs as a systemd service on the host and already has that access. ## Application traces -Application tracing (Rate, Errors, and Duration metrics and trace spans) is **not** automatic. The agent lists every host process and container it finds in the **Application instrumentation** card on the agent's **APM** tab, and for each one you choose how it's traced: +Application tracing (Rate, Errors, and Duration metrics and trace spans) is **not** automatic. The agent lists every host process and container it finds in the **Application Performance Monitoring** card on the agent's **APM** tab, and for each one you choose how it's traced: - **Off:** not traced. This is the default, so nothing is traced (and nothing costs) until you turn it on, which matters on a host running many containers. - **eBPF:** RED metrics and trace spans, captured in the host kernel with no code change and no restart. -- **SDK:** offered for PHP containers. It injects the tracer and reloads the web server, so tracing starts with no redeploy and no container restart. See [Instrument PHP containers](#instrument-php-containers). +- **SDK:** deep spans from the OpenTelemetry SDK running inside the app, including database queries and internal calls. -The in-process OpenTelemetry SDK can't be injected into a running container, because it reads its configuration from the process's start-time environment, and that can't change without recreating the container. So Java, Node.js, Python, .NET, and Go containers offer **Off** or **eBPF** only. For full SDK depth on those runtimes, add OpenTelemetry to the app yourself (below), or run it on a [Linux host](../../installation/linux-agent/) or [Amazon ECS](../../installation/ecs-agent/), where the agent injects it for you. +![The APM tab on a Docker host, listing host processes and containers with Off and eBPF options, or Off, eBPF, and SDK for containers, above the Redeploy-safe SDK card](./images/docker-apm-tab.png) -| Runtime | On the APM tab | Full SDK depth | +| Runtime | On the APM tab | How the SDK is added | |---|---|---| -| Java, Node.js, Python, .NET | **Off / eBPF**: RED and spans, opt-in, no restart | Not injectable on Docker. [Add OpenTelemetry yourself](#send-full-opentelemetry-traces-from-your-containers), or run on Linux or ECS. | +| Java, Node.js, Python, .NET | **Off / eBPF / SDK** | The agent recreates the container with the SDK, which restarts it for a few seconds. See [Instrument Java, Node.js, Python, and .NET containers](#instrument-java-nodejs-python-and-net-containers). | +| PHP 7 and 8 | **Off / eBPF / SDK** | The agent injects the tracer and reloads the web server, with no restart. See [Instrument PHP containers](#instrument-php-containers). | | Go | **Off / eBPF** | eBPF only. Go is a static binary with no runtime to attach. | -| PHP 7 and 8 | **Off / eBPF / SDK**: SDK injects the tracer, no redeploy | Covered by the SDK option, no redeploy | + +## Instrument Java, Node.js, Python, and .NET containers + +These runtimes read their instrumentation settings when the process starts, so the agent adds the SDK by recreating the container. Set the container to **SDK** on the **APM** tab and click **Apply**. On its next check-in, within a minute, the agent: + +1. Recreates the container under the same name with the same settings, plus the OpenTelemetry SDK. Environment variables that the app already sets, such as `NODE_OPTIONS` or `JAVA_TOOL_OPTIONS`, keep their values, and the SDK's settings are added to them. +2. Waits for the new container to stay up for 30 seconds, and for its healthcheck to pass if the image has one. +3. Removes the original container. If the new one exits, restarts, or fails its healthcheck, the agent removes it and starts the original container again, and the row shows **Failed** with the reason. + +Volumes keep their data, including anonymous volumes. Networks, static IP and MAC addresses, published ports, the restart policy, the healthcheck, resource limits, the user, and security options carry over unchanged. The container keeps running the same image even if its tag has been pulled again since it started. + +Setting the container back to **Off** or **eBPF** recreates it once more without the SDK, with its original settings. + +One-click SDK for these runtimes needs agent version 2.6.0 or later, installed with the current Docker install command, which shares the SDK files and the agent's OpenTelemetry socket with your containers. Node.js containers send traces over that socket; the other runtimes send them to the agent on port `4318`. + +### When the agent won't recreate a container + +The agent leaves a container as it is and shows the reason on its row in these cases: + +| Reason | What to do | +|---|---| +| Managed by Docker Compose or Docker Swarm | Add the SDK settings to the Compose file or service definition and redeploy. Click **View SDK settings** on the row for the exact settings. | +| Started with `--rm` or `--volumes-from`, or another container shares its network | Apply the SDK settings at the container's next deploy. | +| Paused | Unpause the container, then set it to **SDK** again. | +| Another APM agent is already loaded, such as dd-trace or a `-javaagent` | Remove the other agent, or keep using it. | +| Unsupported runtime: Node.js older than 18.19, a Python version the bundle doesn't include, or Python and .NET on Alpine (musl) images | Use eBPF for the container, or a supported image. | +| `JAVA_TOOL_OPTIONS` would exceed 1024 characters | Shorten the existing options. The JVM ignores longer values. | +| The agent was installed without the shared folders | Reinstall the agent with the current Docker install command. | +| The container's network can't reach the agent, such as a macvlan or ipvlan network | Set `KM_CONTAINER_OTLP_URL` on the agent. See [How containers reach the agent](#how-containers-reach-the-agent). | + +If the container's entrypoint overwrites `NODE_OPTIONS` or another instrumentation variable, the app runs without the SDK and the row shows the reason. Set the variable in the image instead of in the entrypoint script. + +To keep the agent from recreating containers on a host, set `KM_CONTAINER_SDK_RECREATE=false` in the agent's environment. The **View SDK settings** option still works. + +### Container SDK on the Linux agent + +A Linux agent on a Docker host adds the SDK to Java, Node.js, Python, and .NET containers the same way a Docker-mode agent does, and it keeps instrumenting the host's own services too. This is on by default. Older agent versions need it turned on with the setting below. + +PHP containers are opt-in on the Linux agent. Their tracer reports to port `8126`, which a Datadog agent on the same host may already use. + +To turn on PHP containers, or container SDK on an older agent, set `KM_CONTAINER_INSTRUMENT_ENABLED=true` with a systemd override, then restart the agent. To turn container SDK off, set it to `false` instead. + +```bash +sudo mkdir -p /etc/systemd/system/kmagent.service.d +printf '[Service]\nEnvironment=KM_CONTAINER_INSTRUMENT_ENABLED=true\n' | sudo tee /etc/systemd/system/kmagent.service.d/override.conf +sudo systemctl daemon-reload +sudo systemctl restart kmagent +``` + +To check that the agent picked it up, run `systemctl show kmagent -p Environment`. It should list the variable you set. + +Don't run a Linux agent and a Docker-mode agent on the same host. Both listen on ports `4317` and `4318`, so the second agent's collector can't start. + +### How containers reach the agent + +Node.js containers send traces over the agent's OpenTelemetry socket. The other runtimes send them over OTLP/HTTP, to an address the agent picks for each container: + +- **Host network:** `http://127.0.0.1:4318`. +- **Bridge network:** the network's gateway, for example `http://172.17.0.1:4318`, which reaches the agent on the host. + +On a network with no route to the host, such as macvlan or ipvlan, the agent leaves the container as it is and its row says the container can't reach the agent. Set `KM_CONTAINER_OTLP_URL` to an address your containers can reach, and the agent uses it for every container: + +- **Docker-mode agent:** add `-e KM_CONTAINER_OTLP_URL=http://10.0.0.5:4318` to the agent container. +- **Linux agent:** add `Environment=KM_CONTAINER_OTLP_URL=http://10.0.0.5:4318` as a second line of the agent's `override.conf`, created as in [Container SDK on the Linux agent](#container-sdk-on-the-linux-agent), then restart the agent. + +The same address is used for containers that get the SDK through [redeploy-safe SDK](../redeploy-safe-sdk/). + +### Keep the SDK across redeploys + +A recreated container loses the SDK when it's redeployed, because the next deploy creates it from your original settings. Turn on [redeploy-safe SDK](../redeploy-safe-sdk/) to add the SDK as Docker creates each container instead. It also covers Compose and Swarm containers, with no change to their files. ## Instrument PHP containers A PHP container offers an **SDK** option on the agent's **APM** tab. Turn it on for a container and the agent injects the tracer, matches it to the container's PHP build, and reloads the web server (an Apache graceful reload or a php-fpm reload). Tracing starts with no redeploy and no container restart. -The SDK option appears whenever the PHP-container instrumentation path is enabled. It's on by default in Docker mode. On a [Linux host agent](../../installation/linux-agent/) it's opt-in: set `KM_CONTAINER_INSTRUMENT_ENABLED=true`. +The SDK option appears whenever the PHP-container instrumentation path is enabled. It's on by default in Docker mode. On a [Linux host agent](../../installation/linux-agent/) it's opt-in: see [Container SDK on the Linux agent](#container-sdk-on-the-linux-agent). For automated or immutable deployments, instrument PHP containers without picking each one: @@ -57,7 +127,7 @@ KM_CONTAINER_INSTRUMENT_ALL=true KM_CONTAINER_INSTRUMENT_NAMES=app1,app2 KM_CONTAINER_INSTRUMENT_IMAGES=wordpress,my-php-app -# Turn the PHP-container SDK path off entirely +# Turn container SDK off entirely, PHP included KM_CONTAINER_INSTRUMENT_ENABLED=false ``` @@ -70,11 +140,11 @@ The agent cannot instrument a container that serves requests from the **PHP buil ### How PHP-container tracing is selected -By default, a PHP container is traced when you set it to **SDK** on the **APM** tab, the same per-service choice as any other service. The environment variables above override that for automated rollouts: `KM_CONTAINER_INSTRUMENT_ALL`, `KM_CONTAINER_INSTRUMENT_NAMES`, or `KM_CONTAINER_INSTRUMENT_IMAGES` instrument a fixed set with no UI step, and [autonomous mode](../../advanced-configuration/) instruments every PHP container. Setting `KM_CONTAINER_INSTRUMENT_ENABLED=false` turns the SDK path off, so PHP containers fall back to **Off** or **eBPF**. +By default, a PHP container is traced when you set it to **SDK** on the **APM** tab, the same per-service choice as any other service. The environment variables above override that for automated rollouts: `KM_CONTAINER_INSTRUMENT_ALL`, `KM_CONTAINER_INSTRUMENT_NAMES`, or `KM_CONTAINER_INSTRUMENT_IMAGES` instrument a fixed set with no UI step, and [autonomous mode](../../advanced-configuration/) instruments every PHP container. Setting `KM_CONTAINER_INSTRUMENT_ENABLED=false` turns container SDK off, so containers fall back to **Off** or **eBPF**. ## Send full OpenTelemetry traces from your containers -For Java, Node.js, Python, and .NET, **eBPF** (the per-service toggle above) already gives you RED metrics and spans with no code change. For full SDK depth — client spans, database and library instrumentation, custom spans — run OpenTelemetry inside the application. Add it once, at build or deploy time, and point it at the agent. The agent already listens for OpenTelemetry (OTLP) data: +For a container the agent won't recreate, such as one managed by Docker Compose, add OpenTelemetry at build or deploy time and point it at the agent. Click **View SDK settings** on the container's row for the exact environment variables and volume, as a Compose override and as `docker run` flags. To set it up by hand instead, add OpenTelemetry to the application and point it at the agent. The agent already listens for OpenTelemetry (OTLP) data: - gRPC on port `4317` - HTTP on port `4318` @@ -98,14 +168,16 @@ To send over HTTP instead of gRPC, use port `4318` and add `OTEL_EXPORTER_OTLP_P **3. Restart the service** so the instrumentation loads. Its traces then appear in KloudMate, joined to the service's eBPF spans on one trace. -The agent produces this same result automatically on a [Linux host](../../installation/linux-agent/) or on [Amazon ECS](../../installation/ecs-agent/). In plain Docker you add the instrumentation yourself, because the agent cannot change a running container's startup environment without recreating it. +For containers it can recreate, the agent does all of this for you when you set them to **SDK**. ## Deployment posture -PHP container instrumentation reaches the containers through the Docker socket, so it works from a host-process agent or from the containerized collector, as long as the socket is mounted. +Container SDK instrumentation reaches the containers through the Docker socket, so it works from a host-process agent or from the containerized collector, as long as the socket is mounted. eBPF monitoring is different: it needs host kernel access, so a plain, non-privileged agent container cannot produce the eBPF signals. Run the agent on the host, or as a privileged container with host mounts. +With eBPF on, the agent uses about 300 MiB of memory, and briefly more while it applies a tracing change. Hosts with at least 2 GB of RAM are recommended. On a smaller host, such as a 1 GB AWS t3.micro, the agent holds itself to about a third of the host's memory, so your apps keep the rest. + ## PHP 7 in containers A tracer built on the host must match the container's exact PHP build, so PHP 7 in a container is the hardest case. The reliable path is to add the tracer at image build time. See [PHP instrumentation](../../auto-instrumentation/php/). diff --git a/src/content/docs/docs/kloudmate-agent/platform-notes/images/docker-apm-tab.png b/src/content/docs/docs/kloudmate-agent/platform-notes/images/docker-apm-tab.png new file mode 100644 index 00000000..f412dd9c Binary files /dev/null and b/src/content/docs/docs/kloudmate-agent/platform-notes/images/docker-apm-tab.png differ diff --git a/src/content/docs/docs/kloudmate-agent/platform-notes/redeploy-safe-sdk.mdx b/src/content/docs/docs/kloudmate-agent/platform-notes/redeploy-safe-sdk.mdx new file mode 100644 index 00000000..1097ba93 --- /dev/null +++ b/src/content/docs/docs/kloudmate-agent/platform-notes/redeploy-safe-sdk.mdx @@ -0,0 +1,103 @@ +--- +title: "Redeploy-safe SDK" +description: "Keep the OpenTelemetry SDK on Docker containers when they're redeployed, by adding it as Docker creates each container." +sidebar: + order: 4 +--- + +import { LinkCard, CardGrid } from '@astrojs/starlight/components'; + +Redeploy-safe SDK keeps the OpenTelemetry SDK on your containers when they're redeployed. Without it, the agent adds the SDK by [recreating a running container](../docker/#instrument-java-nodejs-python-and-net-containers), and the next `docker compose up`, `docker run` with a new tag, or CI deploy creates a fresh container from your original settings, without the SDK. With it on, the SDK is added while Docker creates the container, so a container you've set to **SDK** starts instrumented every time. + +It also covers containers that the agent won't recreate, such as those managed by Docker Compose or Docker Swarm. They get the SDK the next time they're deployed or restarted, with no change to your Compose file. + +Redeploy-safe SDK is set per host and is off by default. It works on Docker-mode agents and on [Linux agents](../docker/#container-sdk-on-the-linux-agent) running on a Docker host, for the runtimes that the agent adds the SDK to by recreating: Java, Node.js, Python, and .NET. + +## Turn it on + +1. Open the agent's **APM** tab. +2. In the **Redeploy-safe SDK** card, turn on **Add the SDK when containers are created**, and confirm. + +The agent applies the change on its next check-in, within a minute. Turning it on doesn't restart Docker or any container. Containers that already have the SDK keep it, and Compose and Swarm containers set to **SDK** get it at their next deploy. + +To turn it on at install time instead, set `KM_DOCKER_RUNTIME_SHIM=true` in the install command's environment, or pass `--runtime-shim` to the Docker install script. A choice you make later on the **APM** tab replaces it. + +## What changes on the host + +The agent registers a KloudMate runtime, `kmagent-runc`, as Docker's default runtime: + +- It adds a `kmagent` entry under `runtimes` in Docker's `daemon.json` (`/etc/docker/daemon.json` on most hosts) and sets `default-runtime` to `kmagent`. The original file is saved first as `daemon.json.kmagent-backup`, and every other setting in it stays as it was. +- Docker reloads its configuration, without a restart. + +From then on, Docker starts every new container through `kmagent-runc`: + +- A container that you've set to **SDK** gets the SDK files, the SDK's environment variables, and the agent's endpoint. Environment variables that the image or your deploy already sets, such as `NODE_OPTIONS` or `JAVA_TOOL_OPTIONS`, keep their values, and the SDK's settings are added to them. +- Every other container is passed unchanged to the runtime that Docker used before, usually `runc`. +- If `kmagent-runc` hits any error, or can't decide within 200 milliseconds, it starts the container unchanged. + +If a container with the SDK keeps failing to start, the agent stops adding the SDK to it. Set the container to **Off** and back to **SDK** to try again. + +The rules that tell `kmagent-runc` which containers get the SDK are valid for one hour, and the agent renews them every 15 minutes. If the agent is removed or stops running, the rules expire and every new container starts unchanged. + +A container that asks for a runtime explicitly, for example with `--runtime=nvidia`, doesn't go through Docker's default runtime. The agent adds the SDK to it by recreating it, the same way it does with this setting off. + +## Turn it off + +Turn off **Add the SDK when containers are created** on the **APM** tab. The agent sets `default-runtime` back to the runtime Docker used before and reloads Docker. + +- Running containers keep running, and any that have the SDK keep it until they're recreated. +- After a redeploy, the agent adds the SDK back to a container set to **SDK** by recreating it, which restarts the container for a few seconds. +- Compose and Swarm containers need the SDK settings in their Compose file or service definition again. Click **View SDK settings** on the container's row for the exact settings. + +The `kmagent` entry stays in `daemon.json`, now pointing at the original runtime. Docker records the default runtime on every container it creates, so containers created while the setting was on still name `kmagent`, and they need that entry to start. The `kmagent-runc` binary stays on the host until Docker next restarts, and the agent removes it after that. + +Uninstalling the agent turns the setting off the same way. + +## When it isn't available + +In these cases the agent leaves `daemon.json` as it was, and containers set to **SDK** are instrumented by recreating them. + +| Reason | What to do | +|---|---| +| Rootless Docker or Docker Desktop | Not supported. For Compose and Swarm containers, add the SDK settings to their files. | +| `dockerd` is started with `--default-runtime` | A configuration reload can't change a flag. Remove the flag from the Docker service, set `default-runtime` in `daemon.json` instead, and restart Docker once. | +| The default runtime can't be chained, for example gVisor or Kata | Not supported. Only `runc` and runc-compatible runtimes such as `nvidia-container-runtime` can be chained. | +| `daemon.json` isn't valid JSON | Fix the file, then turn the setting off and on again. | +| Docker rejected the reload | The agent restored `daemon.json` and reloaded Docker again. Check Docker's log (`journalctl -u docker`) for the error. A flag on the Docker service that conflicts with `daemon.json`, such as `--add-runtime`, causes this. | + +## Pause it on a host + +To stop `kmagent-runc` from changing new containers right away, without waiting for the agent, create a file named `disabled` in its runtime directory: + +| Agent | Runtime directory | +|---|---| +| Linux agent | `/var/lib/kmagent-runtime` | +| Docker-mode agent | `/var/lib/kmagent/docker/runtime` | +| Snap Docker | `/var/snap/docker/common/kmagent/runtime` | + +```bash +sudo touch /var/lib/kmagent-runtime/disabled +``` + +Delete the file to resume. The same directory holds `runc-shim.log`, which records why a container did or didn't get the SDK. + +## Remove it by hand + +If the agent is already gone and Docker still names `kmagent` as its default runtime, edit `daemon.json`: + +1. Set `default-runtime` back to the previous runtime, usually `"runc"`. +2. Keep the `kmagent` entry under `runtimes`, and set its `path` to the previous runtime's binary, for example `/usr/bin/runc`. Containers created while the setting was on need it to start. +3. Reload Docker: + + ```bash + sudo systemctl reload docker + ``` + +On a Linux host where the agent package is still installed, `sudo kmagent runtime-shim uninstall` does the same. + +## Next steps + + + + + diff --git a/src/content/docs/docs/kloudmate-agent/platform-notes/windows.mdx b/src/content/docs/docs/kloudmate-agent/platform-notes/windows.mdx index d8619a97..ec479d56 100644 --- a/src/content/docs/docs/kloudmate-agent/platform-notes/windows.mdx +++ b/src/content/docs/docs/kloudmate-agent/platform-notes/windows.mdx @@ -15,7 +15,7 @@ Windows has no `LD_PRELOAD` and no production eBPF, so the agent uses Windows-na ## Discovery -To find the services it lists in the **Application instrumentation** card, the agent looks at: +To find the services it lists in the **Application Performance Monitoring** card, the agent looks at: - **IIS** sites and application pools, including each pool's managed runtime version and state. These appear with a kind of `iis`. - **Windows services**, through the Service Control Manager. These appear with a kind of `windows_service`. diff --git a/src/content/docs/docs/kloudmate-agent/process-monitoring.mdx b/src/content/docs/docs/kloudmate-agent/process-monitoring.mdx index b89e8ade..83412ae0 100644 --- a/src/content/docs/docs/kloudmate-agent/process-monitoring.mdx +++ b/src/content/docs/docs/kloudmate-agent/process-monitoring.mdx @@ -13,12 +13,12 @@ Process monitoring tracks CPU and memory usage for well-known processes on a hos ## Turn it on -1. Open **Settings → Agents** and select a host. +1. Open **Settings → Agents & Pipelines** and select a host. 2. Go to the **Processes** tab. 3. Turn on **Enable process monitoring**. 4. Click **Apply**. -![image](./images/process-monitoring-1.png) +![The Processes tab on a Linux host's Configure page, with Enable process monitoring turned on and fields for Monitor top processes, Additional processes to track, and Ignored processes.](./images/process-monitoring-1.png) - **Monitor top processes:** The number of heaviest processes to track, on top of the well-known set. - **Additional processes to track:** Comma-separated process names to always track. `*` works as a wildcard, for example `backup-*, ffmpeg`. diff --git a/src/content/docs/docs/kloudmate-agent/reference/agent-config.mdx b/src/content/docs/docs/kloudmate-agent/reference/agent-config.mdx index a020299e..1da9efdc 100644 --- a/src/content/docs/docs/kloudmate-agent/reference/agent-config.mdx +++ b/src/content/docs/docs/kloudmate-agent/reference/agent-config.mdx @@ -70,7 +70,7 @@ On any host with a Docker socket, the agent collects per-container metrics and l | `KM_DOCKER_STATS` | `true` | Per-container CPU, memory, network, and block-I/O metrics, read from the Docker socket. Collected when a Docker socket is present. Set `false` to turn container metrics off. | | `KM_DOCKER_LOGS` | `true` | Per-container stdout and stderr, read from the container log files. Collected when a Docker socket is present. Set `false` to turn container logs off. | | `KM_DOCKER_LOGS_PATH` | `/var/lib/docker/containers/*/*-json.log` | The container-log glob. Set it when Docker uses a non-default data-root. | -| `KM_CONTAINER_INSTRUMENT_ENABLED` | On in Docker mode; off on a host agent | Enable the PHP-container SDK path, so PHP containers offer an **SDK** option that injects the tracer and reloads the web server, with no redeploy. On by default in Docker mode. On a host (systemd) agent, set `true` to turn it on. To instrument PHP containers without the per-service UI selection, use `KM_CONTAINER_INSTRUMENT_ALL`, `KM_CONTAINER_INSTRUMENT_NAMES`, or `KM_CONTAINER_INSTRUMENT_IMAGES`. See [Docker platform notes](../../platform-notes/docker/). | +| `KM_CONTAINER_INSTRUMENT_ENABLED` | On; PHP containers off on a host agent | Container SDK, so containers offer an **SDK** option on the **APM** tab. Unset, it's on wherever the agent can reach Docker, for Java, Node.js, Python, and .NET. PHP containers are on in Docker mode and opt-in on a host (systemd) agent: set `true` to turn them on. Set `false` to turn container SDK off. To instrument PHP containers without the per-service UI selection, use `KM_CONTAINER_INSTRUMENT_ALL`, `KM_CONTAINER_INSTRUMENT_NAMES`, or `KM_CONTAINER_INSTRUMENT_IMAGES`. See [Docker platform notes](../../platform-notes/docker/). | ## eBPF opt-out toggles @@ -124,11 +124,11 @@ For the file format and worked examples, see [Auto Scaling & Elastic Beanstalk]( ## Runbook scripts -Leave these unset on an ordinary install. The host's **Runbook scripts** setting under **Settings → Agents** decides whether it runs [workflow scripts](../../../workflows/actions/#run-command-on-host), and the agent checks every job against signing keys that KloudMate publishes to it. On a host that must never run scripts, set `job-types` to `none`, regardless of that setting. +Leave these unset on an ordinary install. The host's **Runbook Scripts** setting under **Settings → Agents & Pipelines** decides whether it runs [workflow scripts](../../../workflows/actions/#run-command-on-host), and the agent checks every job against signing keys that KloudMate publishes to it. On a host that must never run scripts, set `job-types` to `none`, regardless of that setting. | Setting | Environment variable | Default | Description | |---|---|---|---| -| `job-types` | `KM_JOB_TYPES` | Empty (the host's **Runbook scripts** setting decides) | Job types this host accepts, as a comma-separated list, or `none` to refuse every job. `run_script` runs a workflow's shell script as the agent's user, which is root on a standard install. Name each type exactly; there's no wildcard. | +| `job-types` | `KM_JOB_TYPES` | Empty (the host's **Runbook Scripts** setting decides) | Job types this host accepts, as a comma-separated list, or `none` to refuse every job. `run_script` runs a workflow's shell script as the agent's user, which is root on a standard install. Name each type exactly; there's no wildcard. | | `job-signing-keys` | `KM_JOB_SIGNING_KEYS` | Empty (the keys KloudMate publishes) | Ed25519 public keys a job must be signed with, as a comma-separated list, each in base64 or `:` form. When set, the agent accepts only these keys and ignores the published ones. | | `job-agent-id` | `KM_JOB_AGENT_ID` | Empty | This host's agent ID. When set, the agent refuses jobs addressed to a different agent. | diff --git a/src/content/docs/docs/kloudmate-agent/troubleshooting.mdx b/src/content/docs/docs/kloudmate-agent/troubleshooting.mdx index 1aca457e..1144a971 100644 --- a/src/content/docs/docs/kloudmate-agent/troubleshooting.mdx +++ b/src/content/docs/docs/kloudmate-agent/troubleshooting.mdx @@ -23,7 +23,7 @@ Start with two agent features. The [health metrics](../self-observability/health ## Traces are not flowing -- **The service was not discovered.** Only discovered services can be instrumented. Confirm the service appears in the **Application instrumentation** card on the agent's **APM** tab. See [Discovery](../concepts/discovery/). +- **The service was not discovered.** Only discovered services can be instrumented. Confirm the service appears in the **Application Performance Monitoring** card on the agent's **APM** tab. See [Discovery](../concepts/discovery/). - **The toggle has not applied.** Instrumentation takes effect on restart. Check the service's status chip: `pending restart` means the change is written but the service has not restarted. See [Application APM overview](../auto-instrumentation/overview/). - **Injection failed and rolled back.** If the status shows failed and rolled back, the service crash-looped after instrumentation and the agent reverted the change. Read the reason in the self-logs, then retry. eBPF monitoring continues to cover the service throughout. diff --git a/src/content/docs/docs/kloudmate-agent/upgrade.mdx b/src/content/docs/docs/kloudmate-agent/upgrade.mdx index d9973f89..9c99ad8f 100644 --- a/src/content/docs/docs/kloudmate-agent/upgrade.mdx +++ b/src/content/docs/docs/kloudmate-agent/upgrade.mdx @@ -11,7 +11,7 @@ The bundled instrumentation agents are versioned with the KloudMate agent, so th ## Upgrade from the dashboard -1. Open **Settings → Agents**. An agent with a newer release has an **Update available** tag in the **Agent Version** column. +1. Open **Settings → Agents & Pipelines**. When a newer release is out, the **Agent version** column shows the current version, an up arrow, and the newer version in blue, for example 2.4.0 ↑ 2.7.0. Hover over it to see how to upgrade that agent. 2. Click the agent to open its page. 3. In the **Agent version** card, click **Upgrade to vX.Y.Z** and confirm. @@ -64,7 +64,7 @@ On Kubernetes, install or upgrade the chart with `--set selfUpdate.enabled=false ## Upgrade manually -Run the install command again. The install script always fetches the latest release, so the command you used to install the agent also upgrades it. Copy the install command for your platform from **Settings → Agents → Add Agent**, using the same API key and collector endpoint as the existing agent. +Run the install command again. The install script always fetches the latest release, so the command you used to install the agent also upgrades it. Copy the install command for your platform from **Settings → Agents & Pipelines → Add Agent**, using the same API key and collector endpoint as the existing agent. ### Linux @@ -74,7 +74,7 @@ Your existing `/etc/kmagent/agent.yaml` is kept as it is, including any settings ### Windows -Download the latest installer from **Settings → Agents → Add Agent → Windows** and run it from an elevated (Administrator) PowerShell prompt: +Download the latest installer from **Settings → Agents & Pipelines → Add Agent → Windows** and run it from an elevated (Administrator) PowerShell prompt: ```powershell .\kmagent-setup.exe /VERYSILENT /SUPPRESSMSGBOXES /NORESTART @@ -103,4 +103,4 @@ Each chart version ships the matching agent image, so upgrading the chart rolls ## Confirm the upgrade -Open **Settings → Agents** and check the **Agent Version** of the upgraded agent. If it still shows the old version or the agent goes offline, see [Troubleshooting](../troubleshooting/). +Open **Settings → Agents & Pipelines** and check the **Agent version** of the upgraded agent. If it still shows the old version or the agent goes offline, see [Troubleshooting](../troubleshooting/). diff --git a/src/content/docs/docs/logs/collect-file-logs.mdx b/src/content/docs/docs/logs/collect-file-logs.mdx index 68430643..c012dfda 100644 --- a/src/content/docs/docs/logs/collect-file-logs.mdx +++ b/src/content/docs/docs/logs/collect-file-logs.mdx @@ -18,7 +18,7 @@ The KloudMate Agent runs on the target host, reads the configured file paths, an ## Step 1: Open the Agent Configuration 1. Sign in to KloudMate. -2. Go to **Settings -> Agents**. +2. Go to **Settings -> Agents & Pipelines**. 3. Select the agent running on the target server. 4. Click **Actions -> Collector Configuration**. 5. Open the YAML configuration editor. diff --git a/src/content/docs/docs/logs/log-explorer/images/log-explorer-1.jpeg b/src/content/docs/docs/logs/log-explorer/images/log-explorer-1.jpeg index 8a892d1f..9c4f0761 100644 Binary files a/src/content/docs/docs/logs/log-explorer/images/log-explorer-1.jpeg and b/src/content/docs/docs/logs/log-explorer/images/log-explorer-1.jpeg differ diff --git a/src/content/docs/docs/logs/log-explorer/images/log-explorer-2.jpeg b/src/content/docs/docs/logs/log-explorer/images/log-explorer-2.jpeg index 205ecc0e..b793d96e 100644 Binary files a/src/content/docs/docs/logs/log-explorer/images/log-explorer-2.jpeg and b/src/content/docs/docs/logs/log-explorer/images/log-explorer-2.jpeg differ diff --git a/src/content/docs/docs/logs/log-explorer/images/log-explorer-3.jpeg b/src/content/docs/docs/logs/log-explorer/images/log-explorer-3.jpeg index 77c24831..f54ff8c9 100644 Binary files a/src/content/docs/docs/logs/log-explorer/images/log-explorer-3.jpeg and b/src/content/docs/docs/logs/log-explorer/images/log-explorer-3.jpeg differ diff --git a/src/content/docs/docs/logs/log-explorer/images/log-explorer-4.jpeg b/src/content/docs/docs/logs/log-explorer/images/log-explorer-4.jpeg index e0653598..15efba33 100644 Binary files a/src/content/docs/docs/logs/log-explorer/images/log-explorer-4.jpeg and b/src/content/docs/docs/logs/log-explorer/images/log-explorer-4.jpeg differ diff --git a/src/content/docs/docs/logs/log-explorer/images/log-explorer-5.jpeg b/src/content/docs/docs/logs/log-explorer/images/log-explorer-5.jpeg index fe89d1f9..e485d106 100644 Binary files a/src/content/docs/docs/logs/log-explorer/images/log-explorer-5.jpeg and b/src/content/docs/docs/logs/log-explorer/images/log-explorer-5.jpeg differ diff --git a/src/content/docs/docs/logs/log-explorer/images/log-explorer-6.jpeg b/src/content/docs/docs/logs/log-explorer/images/log-explorer-6.jpeg index 0fc77307..25e14afc 100644 Binary files a/src/content/docs/docs/logs/log-explorer/images/log-explorer-6.jpeg and b/src/content/docs/docs/logs/log-explorer/images/log-explorer-6.jpeg differ diff --git a/src/content/docs/docs/logs/log-explorer/images/log-explorer-7.jpeg b/src/content/docs/docs/logs/log-explorer/images/log-explorer-7.jpeg index 0d5410e1..3daac951 100644 Binary files a/src/content/docs/docs/logs/log-explorer/images/log-explorer-7.jpeg and b/src/content/docs/docs/logs/log-explorer/images/log-explorer-7.jpeg differ diff --git a/src/content/docs/docs/logs/log-explorer/index.mdx b/src/content/docs/docs/logs/log-explorer/index.mdx index dcff128d..1da7faff 100644 --- a/src/content/docs/docs/logs/log-explorer/index.mdx +++ b/src/content/docs/docs/logs/log-explorer/index.mdx @@ -15,7 +15,7 @@ The main view combines a log volume graph with a result list. Each row in the li The graph shows log volume over time. The x-axis represents time and the y-axis represents the number of ingested log entries. -![image](./images/log-explorer-1.jpeg) +![The Log Explorer main view, with the log volume graph above the field filters and a list of log entries showing time, service, and message.](./images/log-explorer-1.jpeg) Select any log entry to inspect its full payload, labels, and metadata. @@ -25,7 +25,7 @@ Select any log entry to inspect its full payload, labels, and metadata. Use the search bar at the top of Log Explorer to find matching log entries across your environment. -![image](./images/log-explorer-2.jpeg) +![The Log Explorer search bar highlighted at the top of the page.](./images/log-explorer-2.jpeg) Refine results further by adjusting the selected time range from the time scale menu. @@ -33,13 +33,13 @@ Refine results further by adjusting the selected time range from the time scale Use the sidebar filters to narrow the result set by relevant dimensions. Combine multiple filters to isolate a specific set of logs. -![image](./images/log-explorer-3.jpeg) +![The field filters highlighted in the Log Explorer sidebar, grouped into categories such as Common, Kubernetes, Host, and Container.](./images/log-explorer-3.jpeg) ## Saved Queries To save a query, click the dropdown arrow next to **Saved Queries** in the top-right area of Log Explorer. Enter a query name, description, and folder, then click **Save**. -![image](./images/log-explorer-4.jpeg) +![The Saved queries dialog, with a folder on the left and a list of saved queries showing each name and description.](./images/log-explorer-4.jpeg) Saved queries remain available from the **Saved Queries** section for quick reuse. @@ -49,11 +49,11 @@ Use folders to keep saved queries organized by service, team, or use case. Select any log entry to view detailed information and analysis. -![image](./images/log-explorer-5.jpeg) +![The log detail panel, with the log message, Ask Assistant, Format JSON, Request log, and View Trace actions, and the entry's fields.](./images/log-explorer-5.jpeg) **Ask Assistant** opens KloudMate Assistant directly from the issue. It reviews the error log and its associated trace, generates a Log & Trace Summary, identifies the probable root cause, and suggests next steps for faster resolution. -![image](./images/log-explorer-6.jpeg) +![The log detail panel beside KloudMate Assistant, which shows the log it was asked about and a Log & Trace Summary.](./images/log-explorer-6.jpeg) Refer to the [KloudMate Assistant](../../kloudmate-assistant/) documentation for more details. @@ -61,7 +61,7 @@ Refer to the [KloudMate Assistant](../../kloudmate-assistant/) documentation for Use **Stream** to watch logs as they are ingested into KloudMate. -![image](./images/log-explorer-7.jpeg) +![The Streaming button highlighted in Log Explorer while new log entries appear in the list.](./images/log-explorer-7.jpeg) ## Search Archived Logs diff --git a/src/content/docs/docs/opentelemetry/masking-sensitive-data.mdx b/src/content/docs/docs/opentelemetry/masking-sensitive-data.mdx index 6f2f53f5..01efb41f 100644 --- a/src/content/docs/docs/opentelemetry/masking-sensitive-data.mdx +++ b/src/content/docs/docs/opentelemetry/masking-sensitive-data.mdx @@ -44,16 +44,14 @@ If you need to keep an attribute but redact portions of its value (e.g., masking ### Example: Mask Passwords in HTTP URLs -This configuration uses a regex pattern to find `password=...` in the `http.url` attribute and replaces the value with `password=***`. +This configuration uses a regex pattern to find `password=...` in the `url.full` attribute and replaces the value with `password=***`. ```yaml processors: transform/mask_passwords: error_mode: ignore trace_statements: - - context: span - statements: - - replace_pattern(attributes["http.url"], "password=[^&]*", "password=***") + - replace_pattern(span.attributes["url.full"], "password=[^&]*", "password=***") service: pipelines: @@ -75,12 +73,10 @@ This configuration evaluates incoming spans and logs. If a span targets the `/he processors: filter/drop_healthchecks: error_mode: ignore - traces: - span: - - 'attributes["http.target"] == "/health"' - logs: - log_record: - - 'body == "Healthcheck passed"' + trace_conditions: + - span.attributes["url.path"] == "/health" + log_conditions: + - log.body == "Healthcheck passed" service: pipelines: @@ -105,11 +101,11 @@ service: pipelines: traces: receivers: [otlp] - processors: - - filter/drop_healthchecks # 1. Drop noisy spans completely - - attributes/drop_pii # 2. Delete sensitive attributes - - transform/mask_passwords # 3. Regex replacement on remaining spans - - batch # 4. Batch for export + processors: + - filter/drop_healthchecks # 1. Drop noisy spans completely + - attributes/drop_pii # 2. Delete sensitive attributes + - transform/mask_passwords # 3. Regex replacement on remaining spans + - batch # 4. Batch for export exporters: [otlphttp] ``` diff --git a/src/content/docs/docs/platform/data-retention.mdx b/src/content/docs/docs/platform/data-retention.mdx new file mode 100644 index 00000000..bcc1a8d7 --- /dev/null +++ b/src/content/docs/docs/platform/data-retention.mdx @@ -0,0 +1,50 @@ +--- +title: "Data retention" +description: "How long KloudMate keeps each kind of data, from the logs and traces your plan sets to the windows you can't see in the product." +sidebar: + label: "Data retention" + order: 2.5 +--- + +How long KloudMate keeps your data depends on what it is. Logs and traces are kept for the window your plan sets, metrics for a year, and several other kinds of data have their own window. + +This page lists every retention window, including the ones you can't see in the product. + +## Plan retention + +Logs and traces are kept for the window your plan sets. This is the data you can query directly in the Log Explorer and the trace views. + +| Data | Retention | +| --- | --- | +| Logs and traces | Free 7 days, Pro 14 days | +| Metrics | 1 year | + +Metrics are billed by sample count rather than by how long they're kept, so they're kept for a year on every plan. + +Logs and traces retention is set by your plan. See [Subscription & Billing](../settings/subscription-billing/). + +## Metrics are tiered by resolution + +A metric isn't kept at full resolution for the whole year. Raw samples are kept for about 3 hours, then served from rollups at coarser resolution: a 15-day tier, a 63-day tier, and a long rollup kept for the full year. KloudMate picks the resolution for the range you query, so a chart over the last hour reads raw samples and a chart over the last quarter reads the long rollup. + +## Other retention windows + +These apply to everyone, regardless of plan. + +| Data | Kept for | Notes | +| --- | --- | --- | +| Session replay recordings | 7 days | The rrweb recordings behind a RUM session. Not archivable to Cold Storage. | +| Continuous profiling | 7 days | | +| Anomaly forecast bands | 7 days | The predicted band a forecast alert compares against. | +| Issue occurrences | 30 days | | +| Metric cardinality analytics | 45 days | | +| Endpoint (RED) history | 90 days | An hourly rollup, kept so request-rate, error, and duration history outlives raw trace retention. | +| RUM route metrics | 90 days | An hourly rollup of per-route performance. | +| RUM custom events | 400 days | An hourly rollup, so you can compare this quarter against last quarter. | +| RUM release health | 400 days | An hourly rollup, so you can compare a release against an earlier one after their raw sessions have aged out. | + +Raw RUM data follows your plan retention. That covers sessions, errors, journeys, raw events, route visits, and the raw custom events behind the 400-day rollup. + +## Keeping logs longer + +To keep logs beyond your plan retention, archive them to your own S3 bucket with [Cold Storage](../settings/cold-storage/). The archive lives in your AWS account at S3 storage prices, and you rehydrate a time range into the Log Explorer when you need to search it. Cold Storage archives logs only. Traces, metrics, and RUM aren't archived. diff --git a/src/content/docs/docs/platform/settings/cold-storage/images/create-role-step.png b/src/content/docs/docs/platform/settings/cold-storage/images/create-role-step.png index d8c287a5..d6addf8b 100644 Binary files a/src/content/docs/docs/platform/settings/cold-storage/images/create-role-step.png and b/src/content/docs/docs/platform/settings/cold-storage/images/create-role-step.png differ diff --git a/src/content/docs/docs/platform/settings/connections/connect-an-account.mdx b/src/content/docs/docs/platform/settings/connections/connect-an-account.mdx index 8de31614..58494970 100644 --- a/src/content/docs/docs/platform/settings/connections/connect-an-account.mdx +++ b/src/content/docs/docs/platform/settings/connections/connect-an-account.mdx @@ -10,18 +10,20 @@ You need the **Developer** role to connect an account. Open **Settings → Conne The picker lists only the providers your organization can connect. If a provider you expect is missing, see [Providers](../providers/#providers-in-your-plan). -![The Connect dialog listing providers such as Atlassian, AWS, Azure, Custom MCP Server, GitHub, Google Workspace, Jira, Microsoft 365 / Teams, and OAuth 2.0, each with chips for what it can be used for](./images/connect-provider-picker.png) +![The Connect dialog listing providers such as Atlassian, AWS, Azure, Custom MCP Server, GitHub, Google Workspace, Jira, Microsoft Teams, and OAuth 2.0, each with chips for what it can be used for](./images/connect-provider-picker.png) Pick a provider and fill in the **Connection name**. How you finish depends on the provider. -A connection made here starts with the provider's usual capability: **Notifications** for Slack and Jira Cloud; **Notifications** and **Meetings** for Microsoft 365 / Teams; **Meetings** for Google Workspace and Zoom; **Workflows** for AWS, Azure, a custom MCP server, and OAuth 2.0; and **AI** for the assistant tools. Change what it's used for, and who can use it, afterward under [Edit](../manage-connections/#edit). +A connection made here starts with the provider's usual capability: **Notifications** for Slack and Jira Cloud; **Meetings** for Google Workspace and Zoom; **Workflows** for AWS, Azure, a custom MCP server, and OAuth 2.0; and **AI** for the assistant tools. Change what it's used for, and who can use it, afterward under [Edit](../manage-connections/#edit). ## Connect through OAuth -Slack, Jira Cloud, Microsoft 365 / Teams, Google Workspace, Sentry, and the Google Cloud providers send you to the provider's own site. Click **Connect** and approve the access there. KloudMate adds the connection when you're done. +Slack, Jira Cloud, Google Workspace, Sentry, and the Google Cloud providers send you to the provider's own site. Click **Connect** and approve the access there. KloudMate adds the connection when you're done. Zoom works the same way, except that you install the KloudMate app in Zoom instead of approving a consent screen. Install it from a Licensed Zoom account, because every war room meeting is hosted by the account that installed the app. +Microsoft Teams is the exception: a team is connected from Teams. Choosing it opens the steps and a **Download app package** button. See [Microsoft Teams Integration](/incident-management/microsoft-teams-integration/). + The connection records the account you authorized, so you can tell two Slack installs or two Google accounts apart. ## Connect with a credential form diff --git a/src/content/docs/docs/platform/settings/connections/images/connect-provider-picker.png b/src/content/docs/docs/platform/settings/connections/images/connect-provider-picker.png index bab0ad2c..ad7a97ce 100644 Binary files a/src/content/docs/docs/platform/settings/connections/images/connect-provider-picker.png and b/src/content/docs/docs/platform/settings/connections/images/connect-provider-picker.png differ diff --git a/src/content/docs/docs/platform/settings/connections/providers.mdx b/src/content/docs/docs/platform/settings/connections/providers.mdx index ada13a65..33724429 100644 --- a/src/content/docs/docs/platform/settings/connections/providers.mdx +++ b/src/content/docs/docs/platform/settings/connections/providers.mdx @@ -29,6 +29,7 @@ This isn't the same as the AWS account you connect for inventory and metrics. Th |---|---|---| | **Slack** | OAuth install. | Notifications, Workflows | | **Jira Cloud** | OAuth through Atlassian. | Notifications, Workflows | +| **Microsoft Teams** | The KloudMate app, added to a team in Teams. One connection per team. See [Microsoft Teams Integration](/incident-management/microsoft-teams-integration/). | Notifications | One Slack install serves alert notifications, incident ChatOps, the [Slack workflow actions](/workflows/actions/#slack), and Slack event triggers. A Slack or Jira Cloud connection made in **Settings → Connections** starts out used for **Notifications**. Add **Workflows** under [Edit](../manage-connections/#edit) before a workflow step or trigger can use it, and reconnect it if it's then marked **Needs reconnect**. @@ -40,11 +41,10 @@ These create the conference call for an incident [war room](/incident-management | Provider | Credential | Can be used for | |---|---|---| -| **Microsoft 365 / Teams** | Microsoft sign-in, as the service account that should own the rooms and meetings. | Notifications, Meetings | | **Google Workspace** | Google sign-in, as the Workspace account that should own the meeting spaces. | Meetings | | **Zoom** | An install of the KloudMate app, from a Licensed Zoom account. See [Zoom](../zoom/). | Meetings | -One Microsoft 365 connection covers both the Teams war room chat and its meeting. Meetings hosted by a Basic Zoom account end after 40 minutes, so install the Zoom app from a Licensed account. See [Set up war rooms](/incident-management/war-rooms/setup/#add-a-conference-call) for what each provider adds to a room. +Meetings hosted by a Basic Zoom account end after 40 minutes, so install the Zoom app from a Licensed account. See [Set up war rooms](/incident-management/war-rooms/setup/#add-a-conference-call) for what each provider adds to a room. ## Tools and custom endpoints @@ -85,9 +85,9 @@ If the platform stops offering a provider, or one of its uses, only new connecti ## Link your Slack account for ChatOps -One Slack step is done per person, not per workspace. After someone with the **Developer** role connects Slack and adds a Chat Ops channel, each responder links their own Slack account before they can acknowledge or resolve incidents from Slack. +One Slack step is done per person, not per workspace. After someone with the **Developer** role connects Slack and adds a ChatOps channel, each responder links their own Slack account before they can acknowledge or resolve incidents from Slack. -Open **Incidents → Chat Ops**, scroll to **User Settings**, and click **Connect account**. It's a one-time step that links your KloudMate account to your Slack user. +Open **Incidents → Settings**, find the **Slack** panel of the **ChatOps** card, and under **Your account** click **Connect account**. This step needs the **Developer** role. It's a one-time step that links your KloudMate account to your Slack user. Everyone links their own account, because KloudMate has to match the Slack user who pressed a button to a workspace member before it acts. diff --git a/src/content/docs/docs/platform/settings/connections/zoom.mdx b/src/content/docs/docs/platform/settings/connections/zoom.mdx index 2505c940..0569f93e 100644 --- a/src/content/docs/docs/platform/settings/connections/zoom.mdx +++ b/src/content/docs/docs/platform/settings/connections/zoom.mdx @@ -44,17 +44,15 @@ Start the install from KloudMate, in the workspace that will use it. If you foun 5. Review the permissions and click **Allow**. -6. Back in **Settings → Connections**, open the row menu on the new Zoom connection and click **Re-check**. - -**Re-check** confirms the Zoom account is Licensed. If it isn't, the connection shows **Degraded**. See [The connection shows Degraded](#the-connection-shows-degraded). +KloudMate checks the Zoom account as soon as the install finishes. A Licensed account shows **Verified**. A Basic account shows **Degraded**, and you can fix it as described in [The connection shows Degraded](#the-connection-shows-degraded). ## Create a meeting for each war room -1. Go to **Incidents → Chat Ops** and find **Incident War Rooms**. +1. Go to **Incidents → Settings** and find **War rooms**. 2. Under **Conference call**, select **A new meeting per incident**. @@ -106,7 +104,7 @@ The host user has a Basic Zoom account. Follow the first row in [The connection ## Remove the app -To disconnect Zoom completely, remove the app in Zoom and delete the connection in KloudMate. Before you do, change **Conference call** under **Incidents → Chat Ops** to another option, so new war rooms don't open without a call link. +To disconnect Zoom completely, remove the app in Zoom and delete the connection in KloudMate. Before you do, change **Conference call** under **Incidents → Settings** to another option, so new war rooms don't open without a call link. ### Remove the app from Zoom @@ -140,7 +138,7 @@ Deleting the connection erases the stored Zoom access token and account details. - New war rooms open without a **Join Call** button until you select another meeting connection or another **Conference call** option. The rooms still open, and everyone is still invited. - Meetings KloudMate already created stay in the host user's Zoom account, and their links keep working. Delete them in Zoom if you don't want them. -- To use Zoom again after removing the app in Zoom, click **Reconnect** beside the revoked connection and install the app again. Then open **Edit** and turn **Enabled** back on. The connection keeps its ID, so the war room settings still point to it. +- To use Zoom again after removing the app in Zoom, click **Reconnect** beside the revoked connection and install the app again. The connection is switched back on and keeps its ID, so the war room settings still point to it. - To use Zoom again after deleting the connection, [add the app](#add-the-app) from the start and select the new connection in the war room settings. ## Related diff --git a/src/content/docs/docs/platform/settings/data-sources.mdx b/src/content/docs/docs/platform/settings/data-sources.mdx index cdbc4aaa..c9a30f42 100644 --- a/src/content/docs/docs/platform/settings/data-sources.mdx +++ b/src/content/docs/docs/platform/settings/data-sources.mdx @@ -18,9 +18,11 @@ To connect a new account, follow [AWS Account Setup](../../../aws-integration/ac Open **Settings → Data Sources** to view all connected AWS accounts. -Each connected account appears as a card showing the AWS logo, a connection-status indicator, and the account ID with a copy button. An **Edit** action opens the connection, and a menu gives you **Sync settings** and **CloudWatch Logs**. +Each connected account appears as a card with its name, a connection-status indicator, and the AWS account ID with a copy button. **Edit** opens the account's details, and the card's menu (⋮) has **Sync settings** and **CloudWatch Logs**. -The connection-status indicator also flags access problems. When the delegation role KloudMate uses is missing a required permission, the account shows a **Permission error** state with the reason. That means the whole account's access is failing, not a single region. Open the account's **Edit** screen to see the same error alongside the connection details. To fix it, update the delegation role's permissions, then let KloudMate re-check on the next sync. See [Troubleshoot AWS sync](../troubleshoot-aws-sync/). +![A connected AWS account card on the Data Sources page, with its menu open on Sync settings and CloudWatch Logs.](./images/data-sources-1.png) + +The connection-status indicator also flags access problems. When the delegation role KloudMate uses is missing a required permission, the account shows a **Permission error** state with the reason. That means the whole account's access is failing, not a single region. Open the account's **Edit Account Details** screen to see the same error alongside the connection details. To fix it, update the delegation role's permissions, then let KloudMate re-check on the next sync. See [Troubleshoot AWS sync](../troubleshoot-aws-sync/). From this page, you can: @@ -30,11 +32,19 @@ From this page, you can: - Access CloudWatch log subscription controls - [Remove an AWS account](../deleting-your-aws-account-from-kloudmate/) -![Connected AWS accounts on the Data Sources page](./images/data-sources-1.png) +To add an account, click **Connect AWS account**, name the account, and follow the steps in [AWS Account Setup](../../../aws-integration/account-setup/). The **Accounts** counter shows how many accounts you've connected out of the number your plan allows. When you reach the limit, **Connect AWS account** is turned off. + +![The Name your AWS account step, with the Account name field and the Continue button.](./images/data-sources-2.png) + +### Edit account details + +An account you named but haven't finished connecting shows **Pending**, with no account ID. Click **Edit** to open **Edit Account Details** and paste its Role ARN. + +![A Pending AWS account card with no account ID and an Edit button, and the Accounts counter at its 1 of 1 limit with Connect AWS account turned off.](./images/data-sources-pending-account.png) -Enter the AWS account name and follow the on-screen setup flow when adding a new account. +**Edit Account Details** shows the account's AWS account ID and external ID. Change the **AWS Account Name**, or paste a new **Role ARN**, then click **Update**. If you don't have a role yet, **Click here to add KloudMate CloudFormation stack to AWS** below the field opens the stack in AWS. To remove the account, click **Delete account**. Its data is deleted permanently. -![Adding an AWS account](./images/data-sources-2.png) +![The Edit Account Details screen, with the AWS account ID, external ID, account name, Role ARN field, Update button, and Delete account section.](./images/data-sources-4.png) ## Sync Settings diff --git a/src/content/docs/docs/platform/settings/deleting-your-aws-account-from-kloudmate.mdx b/src/content/docs/docs/platform/settings/deleting-your-aws-account-from-kloudmate.mdx index 9057a861..98bc92a7 100644 --- a/src/content/docs/docs/platform/settings/deleting-your-aws-account-from-kloudmate.mdx +++ b/src/content/docs/docs/platform/settings/deleting-your-aws-account-from-kloudmate.mdx @@ -15,9 +15,9 @@ Use this workflow when you want to disconnect an AWS account from KloudMate and 1. Open **Settings → Data Sources** and select the connected AWS account you want to remove. See [Manage connected accounts](../data-sources/#manage-connected-accounts) if you need help finding it. 2. Click **Edit** to open the account details screen. -3. Click **Delete Account**. +3. Click **Delete account**. -![image](./images/data-sources-4.png) +![The Edit Account Details screen, with the Delete account section below the account details.](./images/data-sources-4.png) :::note Remove the AWS account from KloudMate before deleting the corresponding CloudFormation stack in AWS. diff --git a/src/content/docs/docs/platform/settings/images/data-sources-1.png b/src/content/docs/docs/platform/settings/images/data-sources-1.png index 4a1a2baf..a25db4e4 100644 Binary files a/src/content/docs/docs/platform/settings/images/data-sources-1.png and b/src/content/docs/docs/platform/settings/images/data-sources-1.png differ diff --git a/src/content/docs/docs/platform/settings/images/data-sources-2.png b/src/content/docs/docs/platform/settings/images/data-sources-2.png index 27427e1e..5b55bd30 100644 Binary files a/src/content/docs/docs/platform/settings/images/data-sources-2.png and b/src/content/docs/docs/platform/settings/images/data-sources-2.png differ diff --git a/src/content/docs/docs/platform/settings/images/data-sources-4.png b/src/content/docs/docs/platform/settings/images/data-sources-4.png index d8bd71a6..3df41411 100644 Binary files a/src/content/docs/docs/platform/settings/images/data-sources-4.png and b/src/content/docs/docs/platform/settings/images/data-sources-4.png differ diff --git a/src/content/docs/docs/platform/settings/images/data-sources-pending-account.png b/src/content/docs/docs/platform/settings/images/data-sources-pending-account.png new file mode 100644 index 00000000..8496664b Binary files /dev/null and b/src/content/docs/docs/platform/settings/images/data-sources-pending-account.png differ diff --git a/src/content/docs/docs/platform/settings/images/ms-teams-1.png b/src/content/docs/docs/platform/settings/images/ms-teams-1.png index 3513650f..6f5cdd35 100644 Binary files a/src/content/docs/docs/platform/settings/images/ms-teams-1.png and b/src/content/docs/docs/platform/settings/images/ms-teams-1.png differ diff --git a/src/content/docs/docs/platform/settings/notification-channels.mdx b/src/content/docs/docs/platform/settings/notification-channels.mdx index 94789776..e93c46e1 100644 --- a/src/content/docs/docs/platform/settings/notification-channels.mdx +++ b/src/content/docs/docs/platform/settings/notification-channels.mdx @@ -58,20 +58,17 @@ KloudMate uses a single unified Slack app for both notifications and IM ChatOps. ![The Slack notification channel form: the Slack account picker with a Connect another Slack account link, then Channel name and a searchable Slack channel list](./images/slack-1.png) -The same Slack install appears under [Settings → Connections](../connections/) and under **Incidents → Chat Ops**. Connect it once and reuse it for every Slack channel you create here. +The same Slack install appears under [Settings → Connections](../connections/) and under **Incidents → Settings**. Connect it once and reuse it for every Slack channel you create here. ### MS Teams -1. Select **MS Teams** from the dropdown menu. -2. Create an incoming webhook URL from Microsoft Teams by going to **Channel** > **Connectors** > **Incoming Webhooks** in the Microsoft Teams Apps. -3. Enter the **Team Channel Name** and the **Webhook Address** in their respective fields. -4. Click **Submit**. +Teams channels come from a team connected through the KloudMate app. Connect the team first: see [Microsoft Teams Integration](../../../incident-management/microsoft-teams-integration/). -![image](./images/ms-teams-1.png) +1. Select **MS Teams** from the dropdown menu. +2. Pick the **Team** and the **Channel**. You can also give the channel a different name in KloudMate. +3. Click **Add channel**. -:::info -Optionally, you can download the KloudMate logo from the link provided on the screen to update the webhook’s image in MS Teams. -::: +![The MS Teams notification channel form, with the Team and Channel pickers and an optional Channel name](./images/ms-teams-1.png) ### SNS diff --git a/src/content/docs/docs/platform/settings/organization.mdx b/src/content/docs/docs/platform/settings/organization.mdx index 58c6f129..07991029 100644 --- a/src/content/docs/docs/platform/settings/organization.mdx +++ b/src/content/docs/docs/platform/settings/organization.mdx @@ -6,7 +6,7 @@ sidebar: order: 1.5 --- -Organization settings apply org-wide: the display name, default timezone, and overage policy. +Organization settings apply org-wide: the display name, default timezone, overage policy, and MFA requirement. Open **Settings → Organization** to view or edit these settings. @@ -29,6 +29,36 @@ Controls what happens when usage exceeds your plan's allowance: Toggle **Allow unlimited overage** to switch between the two. +## Require MFA for All Members + +Owners can require every member of the organization to use multi-factor authentication (MFA). This is available on all plans. + +1. Make sure you've set up MFA yourself in [Profile & Security](../profile-security/). You can't turn the requirement on without it. +2. Open **Settings → Organization → Profile**. +3. In the **Security** card, turn on **Require multi-factor authentication**. +4. Confirm. Members without MFA must set it up before they can sign in to this organization with a password, switch to it, or accept an invite to it. + +Turn the switch off to remove the requirement. Turning it off needs only that you're an owner. You don't need MFA on your own account, so an owner who signs in with SSO can still remove it. + +Only a signed-in owner can change the requirement. API keys can't turn it on or off. + +### What Members See + +The requirement applies when a member's session enters this organization: at sign-in, when switching to it, and when accepting an invite to it. Other organizations the member belongs to that don't require MFA still let them in with a password alone. + +- A member without MFA whose password sign-in opens this organization sets MFA up right after the password: scan a QR code, enter a 6-digit code, and copy the recovery code, which is shown only once. +- Opening this organization from another one is refused until the member sets up MFA. The organization switcher shows "*Organization* requires MFA. Set it up in Profile & Security." with a link to **Profile & Security**. A link or saved workspace in this organization opens a page with buttons to go back to the member's other organization, retry, or open **Profile & Security**. If there's no workspace to go back to, that page offers the MFA setup itself. +- Accepting an invite to this organization offers MFA setup on the invite page. After the member sets it up and copies the recovery code, the invite is accepted. +- Sessions already open in this organization keep working. +- Members who already use MFA notice no change. +- Members can't turn MFA off while this organization, or any other organization they belong to, requires it. + +The **MFA** column in the **Users** list shows whether MFA is on for each member. **Off** means the member hasn't set up an authenticator app. It doesn't mean they're out of compliance if they sign in with SSO, which doesn't ask for one. + +:::note +Sessions that signed in with SSO are exempt at sign-in, when switching organizations, and when accepting an invite, whichever identity provider was used, because the identity provider handles the second factor. +::: + ## Leave an Organization Instead of asking an owner to remove you, you can leave an organization yourself — useful cleanup if you've accumulated memberships in organizations or workspaces you no longer use. diff --git a/src/content/docs/docs/platform/settings/profile-security.mdx b/src/content/docs/docs/platform/settings/profile-security.mdx index 02b47b9c..6030e8b8 100644 --- a/src/content/docs/docs/platform/settings/profile-security.mdx +++ b/src/content/docs/docs/platform/settings/profile-security.mdx @@ -1,17 +1,19 @@ --- title: "Profile & Security" -description: "Manage your KloudMate profile, password, and multi-factor authentication settings." +description: "Manage your KloudMate profile, password, multi-factor authentication, and MFA recovery code." sidebar: label: "Profile & Security" order: 4 --- -Use **Profile & Security** to manage your account details and authentication settings. +Use **Profile & Security** to manage your account details and how you sign in. ## Available Actions - Change your display name - Update your password -- Enable or disable multi-factor authentication (MFA) +- Turn multi-factor authentication (MFA) on or off +- Create a new MFA recovery code +- Recover your account after losing your authenticator device ## Update Your Profile @@ -19,13 +21,68 @@ Use **Profile & Security** to manage your account details and authentication set 2. Update your name or password in the relevant fields. 3. Click **Save Changes**. -## Enable or Disable MFA +## Turn On MFA + +With MFA on, signing in asks for a 6-digit code from an authenticator app after your password. + +1. Open **Settings -> Profile & Security**. +2. In **Multi-factor Authentication**, turn on **Enable multi-factor authentication**. +3. Scan the QR code with an authenticator app, such as Google Authenticator, Microsoft Authenticator, or 1Password. +4. Enter the 6-digit code the app shows, then click **Verify**. +5. Copy the recovery code that appears and store it somewhere safe, such as your password manager. + +:::caution +The recovery code is shown only once. If you lose your authenticator device, it's how you sign in without contacting support. +::: + +### When Your Organization Requires MFA + +An organization can [require MFA](../organization/#require-mfa-for-all-members) for its members. If you don't have MFA yet, you set it up before you can enter that organization: + +- If your password sign-in opens that organization, the setup comes right after your password. Scan the QR code, enter the 6-digit code, and copy the recovery code, which is shown only once. You're then signed in. +- If you open that organization from another one, you see "*Organization* requires MFA. Set it up in Profile & Security." Turn on MFA as described above, then open the organization again. + +Sessions already open in that organization keep working. Organizations that don't require MFA still let you in with your password alone. + +If the setup has expired by the time you verify, which happens after 15 minutes, you go back to the sign-in page with a message. Sign in again to get a new setup. + +If the organization your sign-in opens requires MFA, signing in with your recovery code takes you straight to the same setup step so you can register a new device. + +## Create a New Recovery Code + +Create a new code if you've lost yours, or if the page shows **No recovery code is set**. + +1. Open **Settings -> Profile & Security**. +2. Click **New recovery code**. If you don't have one yet, the button reads **Create recovery code**. +3. Enter the current 6-digit code from your authenticator app, then click **Generate**. +4. Store the new code. Your previous recovery code stops working. + +## Recover Access After Losing Your Device + +You need your password and your recovery code. + +1. Sign in with your email and password. +2. When you're asked for the MFA code, click **Lost your device? Use a recovery code**. +3. Enter your recovery code and click **Sign in**. You can type it with or without its dashes. +4. Turn MFA on again from **Profile & Security** with your new device. You'll get a new recovery code. + +Signing in with the recovery code turns MFA off, so your account has only password protection until you turn it back on. + +### If You Don't Have a Recovery Code + +Email [support@kloudmate.com](mailto:support@kloudmate.com) from your account's email address and say you've lost both your authenticator device and your recovery code. After support checks it's you, they turn MFA off and you get an email confirming it. Sign in with your password, then turn MFA on again. + +:::caution +If you get that confirmation email without having asked for it, write to [support@kloudmate.com](mailto:support@kloudmate.com) right away. Someone may be trying to get into your account. +::: + +## Turn Off MFA 1. Open **Settings -> Profile & Security**. -2. Turn on MFA from the authentication section. -3. Register the account with your authenticator app. -4. Store the MFA recovery secret safely. +2. Click **Disable MFA**, then confirm. -On future sign-ins, you will be prompted for the MFA code generated by the authenticator app. +Turning MFA off also removes your recovery code. -To disable MFA, return to the same page and use the **Disable MFA** action. +:::note +You can't turn MFA off while any of your organizations requires it, including ones you're not signed in to. **Disable MFA** is then replaced by **Required by** and that organization's name. +::: diff --git a/src/content/docs/docs/reliability/images/incident-linked-slos.png b/src/content/docs/docs/reliability/images/incident-linked-slos.png index 38eff5e5..f1c0ccab 100644 Binary files a/src/content/docs/docs/reliability/images/incident-linked-slos.png and b/src/content/docs/docs/reliability/images/incident-linked-slos.png differ diff --git a/src/content/docs/docs/reliability/service-reliability-tab.mdx b/src/content/docs/docs/reliability/service-reliability-tab.mdx index 733f51eb..2c19f7c8 100644 --- a/src/content/docs/docs/reliability/service-reliability-tab.mdx +++ b/src/content/docs/docs/reliability/service-reliability-tab.mdx @@ -31,7 +31,7 @@ Clicking the chip jumps to the Reliability tab. The chip is **only rendered when On incident detail (`//im/incidents/`), a **Linked SLOs** panel appears below the **Service**, **Alert source**, and **Escalation policy** labels, but only when the affected service has at least one **Incident availability** SLO. -![Incident detail Linked SLOs panel](./images/incident-linked-slos.png) +![Incident detail page with the Linked SLOs panel below the Service, Alert source, and Escalation policy labels, showing a breached API service SLO card](./images/incident-linked-slos.png) Each linked SLO shows as a card: diff --git a/src/content/docs/docs/rum/images/rum-applications-index.png b/src/content/docs/docs/rum/images/rum-applications-index.png index 54c17440..e1dc993b 100644 Binary files a/src/content/docs/docs/rum/images/rum-applications-index.png and b/src/content/docs/docs/rum/images/rum-applications-index.png differ diff --git a/src/content/docs/docs/rum/images/rum-errors.png b/src/content/docs/docs/rum/images/rum-errors.png index a1bc6f14..a54e1c6c 100644 Binary files a/src/content/docs/docs/rum/images/rum-errors.png and b/src/content/docs/docs/rum/images/rum-errors.png differ diff --git a/src/content/docs/docs/rum/images/rum-overview-audience.png b/src/content/docs/docs/rum/images/rum-overview-audience.png deleted file mode 100644 index b92d772f..00000000 Binary files a/src/content/docs/docs/rum/images/rum-overview-audience.png and /dev/null differ diff --git a/src/content/docs/docs/rum/images/rum-overview.png b/src/content/docs/docs/rum/images/rum-overview.png index 3166ed6c..51d895ff 100644 Binary files a/src/content/docs/docs/rum/images/rum-overview.png and b/src/content/docs/docs/rum/images/rum-overview.png differ diff --git a/src/content/docs/docs/rum/images/rum-pages.png b/src/content/docs/docs/rum/images/rum-pages.png index 09446260..c30ee79e 100644 Binary files a/src/content/docs/docs/rum/images/rum-pages.png and b/src/content/docs/docs/rum/images/rum-pages.png differ diff --git a/src/content/docs/docs/rum/images/rum-performance.png b/src/content/docs/docs/rum/images/rum-performance.png index c7c84355..b9195b7d 100644 Binary files a/src/content/docs/docs/rum/images/rum-performance.png and b/src/content/docs/docs/rum/images/rum-performance.png differ diff --git a/src/content/docs/docs/rum/images/rum-releases-no-version.png b/src/content/docs/docs/rum/images/rum-releases-no-version.png new file mode 100644 index 00000000..91595fab Binary files /dev/null and b/src/content/docs/docs/rum/images/rum-releases-no-version.png differ diff --git a/src/content/docs/docs/rum/images/rum-releases.png b/src/content/docs/docs/rum/images/rum-releases.png index 1367ad33..bbab30f3 100644 Binary files a/src/content/docs/docs/rum/images/rum-releases.png and b/src/content/docs/docs/rum/images/rum-releases.png differ diff --git a/src/content/docs/docs/rum/images/rum-sessions-list.png b/src/content/docs/docs/rum/images/rum-sessions-list.png index 4f0aa850..bff2b617 100644 Binary files a/src/content/docs/docs/rum/images/rum-sessions-list.png and b/src/content/docs/docs/rum/images/rum-sessions-list.png differ diff --git a/src/content/docs/docs/rum/images/source-maps-error-stack.png b/src/content/docs/docs/rum/images/source-maps-error-stack.png new file mode 100644 index 00000000..15ba2a9b Binary files /dev/null and b/src/content/docs/docs/rum/images/source-maps-error-stack.png differ diff --git a/src/content/docs/docs/rum/images/what-is-real-user-monitoring-_rum__-1.png b/src/content/docs/docs/rum/images/what-is-real-user-monitoring-_rum__-1.png index 48dbef52..d0f1e45f 100644 Binary files a/src/content/docs/docs/rum/images/what-is-real-user-monitoring-_rum__-1.png and b/src/content/docs/docs/rum/images/what-is-real-user-monitoring-_rum__-1.png differ diff --git a/src/content/docs/docs/rum/rum-interface.mdx b/src/content/docs/docs/rum/rum-interface.mdx index 1120dc19..5ed8d504 100644 --- a/src/content/docs/docs/rum/rum-interface.mdx +++ b/src/content/docs/docs/rum/rum-interface.mdx @@ -35,17 +35,15 @@ Every platform gets the same tabs, but what's inside them depends on the applica Start on **Overview** to find out whether anything needs attention right now. -![The RUM Overview tab: a Needs attention list of findings above Core Web Vitals cards for LCP, INP, CLS, page views, and error rate](./images/rum-overview.png) +![The RUM Overview tab, top to bottom: a Needs attention list of findings, Core Web Vitals cards for LCP, INP, CLS, page views, and error rate, the Page Views & Errors and Network Requests & Errors charts, Worst pages by impact, Recent errors, and Audience breakdowns](./images/rum-overview.png) - **Needs attention** lists what changed, with the evidence behind each finding: `70 errors in this window, 3.7x the norm of 19 for the previous 7 days`. - **Core Web Vitals** reports LCP, INP, and CLS at p75 with the boundary each is judged against, plus page views and error rate. Web applications only. - **Release health** reports the crash-free rate, on applications that can crash. -- **Volume and failures** plots sessions, page views, and errors over the range. +- **Volume and failures** charts page views and errors, and network requests and errors, over the range. - **Worst pages by impact**, **Recent errors**, and **Delivery** each link through to the tab they come from. - **Audience** breaks sessions down by browser or device, version, **Screen resolution**, and country. Counts are distinct sessions, so a long session that fired a thousand spans still counts once. -![The Audience row with Browser, Browser version, Screen resolution, and Country breakdowns](./images/rum-overview-audience.png) - ### Core Web Vitals thresholds The vitals panels are colored to Google's own boundaries, so a red panel means the same thing here as it does in Lighthouse or Search Console. @@ -62,7 +60,7 @@ INP replaced First Input Delay as a Core Web Vital in March 2024, and the RUM vi **Sessions** lists individual visits, most recent first. -![The Sessions tab listing sessions with client, date, ANR signal badges, errors, screens, duration, and a Play button](./images/rum-sessions-list.png) +![The Sessions tab for a web application, listing anonymous sessions with client, date, frustration signal badges, errors, actions, pages, duration, and a Play button](./images/rum-sessions-list.png) **Signals** badges the crashes, ANRs, and frustration clicks in each session, worst first and with counts, so you can tell which sessions are worth opening without opening them. See [Frustration signals](../session-detail/#frustration-signals). @@ -112,9 +110,9 @@ On Android and iOS the tab has **App start**, **Screen loads**, **Who is slow**, **Errors** lists every error, crash, and app hang your SDKs reported, with a facet rail for narrowing the list and a volume chart above it. -![The RUM Errors tab with All errors, Crashes, and App Hangs toggles, a Narrow by facet rail, an error volume chart, and a grouped error list](./images/rum-errors.png) +![The RUM Errors tab for a web application in the Raw events view, with a Narrow by facet rail, an error volume chart, and a table of individual errors](./images/rum-errors.png) -**All errors**, **Crashes**, and **App Hangs** split the list by kind, with **ANRs** in place of App Hangs on Android. **Grouped by issue** collapses identical errors into a single row with its count and its first and last occurrence. Switch to **Raw events** when you're chasing one specific failure rather than a pattern. +On iOS, **All errors**, **Crashes**, and **App Hangs** split the list by kind, with **ANRs** in place of App Hangs on Android. **Grouped by issue** collapses identical errors into a single row with its count and its first and last occurrence. Switch to **Raw events** when you're chasing one specific failure rather than a pattern. Opening an error shows its stack trace, its attributes, and the sessions it happened in. @@ -135,7 +133,9 @@ Every number on the tab opens the rows behind it, scoped to that version. Releases needs the SDK to send a `version`. Without one there's nothing to compare. Set it in the init call for your platform, in the [Instrumentation Guide](../instrumentation-guide/). ::: -Release data is counted hourly and kept for 180 days. You can still compare 4.2 against 4.1 weeks later, after the raw sessions behind both have aged out. A release that hasn't collected enough sessions yet isn't compared at all. +![The Current release card with an example comparison of 2.4.1 against 2.4.0 and a How to set it button, shown when the SDK doesn't send a version](./images/rum-releases-no-version.png) + +Release data is counted hourly and kept for 400 days. You can still compare 4.2 against 4.1 weeks later, after the raw sessions behind both have aged out. A release that hasn't collected enough sessions yet isn't compared at all. The older `/rum/deployments` URL redirects here. diff --git a/src/content/docs/docs/rum/source-maps.mdx b/src/content/docs/docs/rum/source-maps.mdx index 19cc25f5..9d73ac01 100644 --- a/src/content/docs/docs/rum/source-maps.mdx +++ b/src/content/docs/docs/rum/source-maps.mdx @@ -7,7 +7,9 @@ sidebar: import { Steps, Tabs, TabItem } from '@astrojs/starlight/components'; -Production JavaScript is minified, so a browser error's stack points at a position such as `index-4f2a.js:1:84210`. Upload the source maps from each build, and the stack trace on the issue page and in the error drawer shows the original file, line, and column instead, along with the lines of source around it. +Production JavaScript is minified, so a browser error's stack points at a position such as `index-4f2a.js:1:84210`. Upload the source maps from each build, and the stack trace on the issue page and in the error drawer shows the original file, line, and column instead, along with the lines of source around it. Switch to **Raw** to see the stack as the browser reported it. + +![The error drawer for a TypeError, with the Stacktrace panel set to Original, showing app.js:308:25 with the source lines around it and an in app badge, followed by frames with a KloudMate SDK badge.](./images/source-maps-error-stack.png) You upload the maps from your build, usually in CI, with the `@kloudmate/sourcemaps` package. They're stored in your workspace and never served publicly. Stacks are mapped when you open an error, not when it's reported, so maps you upload after a deploy also apply to errors that build has already reported. diff --git a/src/content/docs/docs/synthetic/monitors/images/monitors-1.png b/src/content/docs/docs/synthetic/monitors/images/monitors-1.png index ce65236a..b34298a3 100644 Binary files a/src/content/docs/docs/synthetic/monitors/images/monitors-1.png and b/src/content/docs/docs/synthetic/monitors/images/monitors-1.png differ diff --git a/src/content/docs/docs/synthetic/monitors/images/monitors-2.png b/src/content/docs/docs/synthetic/monitors/images/monitors-2.png index 8a9a2add..da4c38e2 100644 Binary files a/src/content/docs/docs/synthetic/monitors/images/monitors-2.png and b/src/content/docs/docs/synthetic/monitors/images/monitors-2.png differ diff --git a/src/content/docs/docs/synthetic/monitors/images/monitors-3.png b/src/content/docs/docs/synthetic/monitors/images/monitors-3.png index 62ada0f9..d1684c99 100644 Binary files a/src/content/docs/docs/synthetic/monitors/images/monitors-3.png and b/src/content/docs/docs/synthetic/monitors/images/monitors-3.png differ diff --git a/src/content/docs/docs/synthetic/monitors/images/monitors-4.png b/src/content/docs/docs/synthetic/monitors/images/monitors-4.png index ed456cc1..20d29d18 100644 Binary files a/src/content/docs/docs/synthetic/monitors/images/monitors-4.png and b/src/content/docs/docs/synthetic/monitors/images/monitors-4.png differ diff --git a/src/content/docs/docs/synthetic/monitors/index.mdx b/src/content/docs/docs/synthetic/monitors/index.mdx index e87ebf29..3dc6d025 100644 --- a/src/content/docs/docs/synthetic/monitors/index.mdx +++ b/src/content/docs/docs/synthetic/monitors/index.mdx @@ -17,13 +17,13 @@ When creating or editing any monitor (except Push), click **Test** next to **Sav - **Success (7d)**: Shows the success percentage of the monitor over the past 7 days. - **Status**: Indicates whether the monitor is **Enabled** or **Paused**. The colored dot next to each row shows its current health (up or down), separate from this enabled/paused state. -![image](./images/monitors-1.png) +![The Monitors tab listing each monitor with its health dot, name, type, target, frequency, 7-day success rate, status, and actions menu](./images/monitors-1.png) ### Monitor Details Page Clicking any monitor in the list opens its details page, with full performance and history information. -![image](./images/monitors-2.png) +![The details page for a DNS monitor with current status, last checked time, the last 24 hours, success rates for 7 days, 30 days, and 1 year, and a DNS resolve time chart](./images/monitors-2.png) **Details Page Sections** - **Status** Current real-time status of the monitor with visual indicators. @@ -32,14 +32,14 @@ Clicking any monitor in the list opens its details page, with full performance a History of downtime incidents with timestamps and durations. -![image](./images/monitors-3.png) +![The Recent Incidents table with status, cause, start time, and duration](./images/monitors-3.png) - **Recent Checks** Log of the most recent check executions with results and timings. -![image](./images/monitors-4.png) +![The Recent Checks table with time, status, resolve time, and location](./images/monitors-4.png) ## Downtime Rules and Flapping Control diff --git a/src/content/docs/docs/visualize-data/dashboards/adding-a-panel/images/adding-a-panel-datasource.png b/src/content/docs/docs/visualize-data/dashboards/adding-a-panel/images/adding-a-panel-datasource.png index fc04a1c7..9f6509e3 100644 Binary files a/src/content/docs/docs/visualize-data/dashboards/adding-a-panel/images/adding-a-panel-datasource.png and b/src/content/docs/docs/visualize-data/dashboards/adding-a-panel/images/adding-a-panel-datasource.png differ diff --git a/src/content/docs/docs/visualize-data/dashboards/adding-a-panel/images/adding-a-panel-import-dashboards.png b/src/content/docs/docs/visualize-data/dashboards/adding-a-panel/images/adding-a-panel-import-dashboards.png index d513272b..94f62533 100644 Binary files a/src/content/docs/docs/visualize-data/dashboards/adding-a-panel/images/adding-a-panel-import-dashboards.png and b/src/content/docs/docs/visualize-data/dashboards/adding-a-panel/images/adding-a-panel-import-dashboards.png differ diff --git a/src/content/docs/docs/visualize-data/dashboards/adding-a-panel/images/adding-a-panel-import-templates.png b/src/content/docs/docs/visualize-data/dashboards/adding-a-panel/images/adding-a-panel-import-templates.png deleted file mode 100644 index 8e512793..00000000 Binary files a/src/content/docs/docs/visualize-data/dashboards/adding-a-panel/images/adding-a-panel-import-templates.png and /dev/null differ diff --git a/src/content/docs/docs/visualize-data/dashboards/adding-a-panel/images/alert-list-panel-1.jpeg b/src/content/docs/docs/visualize-data/dashboards/adding-a-panel/images/alert-list-panel-1.jpeg index d51beaf2..ee40a198 100644 Binary files a/src/content/docs/docs/visualize-data/dashboards/adding-a-panel/images/alert-list-panel-1.jpeg and b/src/content/docs/docs/visualize-data/dashboards/adding-a-panel/images/alert-list-panel-1.jpeg differ diff --git a/src/content/docs/docs/visualize-data/dashboards/adding-a-panel/images/spans-list-panel-1.jpeg b/src/content/docs/docs/visualize-data/dashboards/adding-a-panel/images/spans-list-panel-1.jpeg index d2aff859..fcbc2e11 100644 Binary files a/src/content/docs/docs/visualize-data/dashboards/adding-a-panel/images/spans-list-panel-1.jpeg and b/src/content/docs/docs/visualize-data/dashboards/adding-a-panel/images/spans-list-panel-1.jpeg differ diff --git a/src/content/docs/docs/visualize-data/dashboards/adding-a-panel/images/timeseries-panel-1.jpeg b/src/content/docs/docs/visualize-data/dashboards/adding-a-panel/images/timeseries-panel-1.jpeg index d398fafb..b2cb0d5b 100644 Binary files a/src/content/docs/docs/visualize-data/dashboards/adding-a-panel/images/timeseries-panel-1.jpeg and b/src/content/docs/docs/visualize-data/dashboards/adding-a-panel/images/timeseries-panel-1.jpeg differ diff --git a/src/content/docs/docs/visualize-data/dashboards/adding-a-panel/images/timeseries-panel-3.jpeg b/src/content/docs/docs/visualize-data/dashboards/adding-a-panel/images/timeseries-panel-3.jpeg index 7bdb0737..1665171a 100644 Binary files a/src/content/docs/docs/visualize-data/dashboards/adding-a-panel/images/timeseries-panel-3.jpeg and b/src/content/docs/docs/visualize-data/dashboards/adding-a-panel/images/timeseries-panel-3.jpeg differ diff --git a/src/content/docs/docs/visualize-data/dashboards/adding-a-panel/images/timeseries-panel-5.jpeg b/src/content/docs/docs/visualize-data/dashboards/adding-a-panel/images/timeseries-panel-5.jpeg index 7a59362e..c4635833 100644 Binary files a/src/content/docs/docs/visualize-data/dashboards/adding-a-panel/images/timeseries-panel-5.jpeg and b/src/content/docs/docs/visualize-data/dashboards/adding-a-panel/images/timeseries-panel-5.jpeg differ diff --git a/src/content/docs/docs/visualize-data/dashboards/adding-a-panel/images/timeseries-panel-6.jpeg b/src/content/docs/docs/visualize-data/dashboards/adding-a-panel/images/timeseries-panel-6.jpeg index 88966c94..90d7fb54 100644 Binary files a/src/content/docs/docs/visualize-data/dashboards/adding-a-panel/images/timeseries-panel-6.jpeg and b/src/content/docs/docs/visualize-data/dashboards/adding-a-panel/images/timeseries-panel-6.jpeg differ diff --git a/src/content/docs/docs/visualize-data/dashboards/adding-a-panel/images/timeseries-panel-7.jpeg b/src/content/docs/docs/visualize-data/dashboards/adding-a-panel/images/timeseries-panel-7.jpeg index 2e63a4af..6fc700de 100644 Binary files a/src/content/docs/docs/visualize-data/dashboards/adding-a-panel/images/timeseries-panel-7.jpeg and b/src/content/docs/docs/visualize-data/dashboards/adding-a-panel/images/timeseries-panel-7.jpeg differ diff --git a/src/content/docs/docs/visualize-data/dashboards/adding-a-panel/index.mdx b/src/content/docs/docs/visualize-data/dashboards/adding-a-panel/index.mdx index 52ec3c0d..c8a6a8ce 100644 --- a/src/content/docs/docs/visualize-data/dashboards/adding-a-panel/index.mdx +++ b/src/content/docs/docs/visualize-data/dashboards/adding-a-panel/index.mdx @@ -100,8 +100,6 @@ Select **Import** from the **Add** menu to add a pre-built panel to your dashboa **Import from Templates:** Select a template from the dropdown to import a panel from a pre-built KloudMate template. -![image](./images/adding-a-panel-import-templates.png) - **Import from My Dashboards:** Select an existing dashboard from the dropdown to reuse a panel you've already built. This saves time when the same metric needs to appear across multiple dashboards. ![image](./images/adding-a-panel-import-dashboards.png) diff --git a/src/content/docs/docs/visualize-data/dashboards/create-a-dashboard.mdx b/src/content/docs/docs/visualize-data/dashboards/create-a-dashboard.mdx index 683c537b..5ef955fa 100644 --- a/src/content/docs/docs/visualize-data/dashboards/create-a-dashboard.mdx +++ b/src/content/docs/docs/visualize-data/dashboards/create-a-dashboard.mdx @@ -17,13 +17,7 @@ Creating a dashboard lets you build a personalized view of the metrics that matt Use a pre-built dashboard for common use cases. This is the fastest way to get started if you're monitoring a known service, such as a web server, a database, or a Kubernetes cluster. -![image](./images/create-a-dashboard-1.png) - -Select a **Template** from the dropdown. - -![image](./images/create-a-dashboard-2.png) - -Then select a **Datasource** and click **Create Dashboard**. +Select a **Template** from the dropdown, then select a **Datasource** and click **Create Dashboard**. ### From Scratch diff --git a/src/content/docs/docs/visualize-data/dashboards/images/adding-links-to-dashboards-1.jpeg b/src/content/docs/docs/visualize-data/dashboards/images/adding-links-to-dashboards-1.jpeg index 19322ea4..6f92dd32 100644 Binary files a/src/content/docs/docs/visualize-data/dashboards/images/adding-links-to-dashboards-1.jpeg and b/src/content/docs/docs/visualize-data/dashboards/images/adding-links-to-dashboards-1.jpeg differ diff --git a/src/content/docs/docs/visualize-data/dashboards/images/adding-links-to-dashboards-1.png b/src/content/docs/docs/visualize-data/dashboards/images/adding-links-to-dashboards-1.png index 67f93b87..8cb9333e 100644 Binary files a/src/content/docs/docs/visualize-data/dashboards/images/adding-links-to-dashboards-1.png and b/src/content/docs/docs/visualize-data/dashboards/images/adding-links-to-dashboards-1.png differ diff --git a/src/content/docs/docs/visualize-data/dashboards/images/create-a-dashboard-1.png b/src/content/docs/docs/visualize-data/dashboards/images/create-a-dashboard-1.png deleted file mode 100644 index 8c21746e..00000000 Binary files a/src/content/docs/docs/visualize-data/dashboards/images/create-a-dashboard-1.png and /dev/null differ diff --git a/src/content/docs/docs/visualize-data/dashboards/images/create-a-dashboard-2.png b/src/content/docs/docs/visualize-data/dashboards/images/create-a-dashboard-2.png deleted file mode 100644 index cbea5501..00000000 Binary files a/src/content/docs/docs/visualize-data/dashboards/images/create-a-dashboard-2.png and /dev/null differ diff --git a/src/content/docs/docs/visualize-data/dashboards/images/create-a-dashboard-4.png b/src/content/docs/docs/visualize-data/dashboards/images/create-a-dashboard-4.png index 8cad39c9..81dd0781 100644 Binary files a/src/content/docs/docs/visualize-data/dashboards/images/create-a-dashboard-4.png and b/src/content/docs/docs/visualize-data/dashboards/images/create-a-dashboard-4.png differ diff --git a/src/content/docs/docs/visualize-data/dashboards/images/dashboard-details-1.jpeg b/src/content/docs/docs/visualize-data/dashboards/images/dashboard-details-1.jpeg index 46bc4839..89f3f872 100644 Binary files a/src/content/docs/docs/visualize-data/dashboards/images/dashboard-details-1.jpeg and b/src/content/docs/docs/visualize-data/dashboards/images/dashboard-details-1.jpeg differ diff --git a/src/content/docs/docs/visualize-data/dashboards/images/dashboard-details-2.jpeg b/src/content/docs/docs/visualize-data/dashboards/images/dashboard-details-2.jpeg index e1b8a32b..01b2dbde 100644 Binary files a/src/content/docs/docs/visualize-data/dashboards/images/dashboard-details-2.jpeg and b/src/content/docs/docs/visualize-data/dashboards/images/dashboard-details-2.jpeg differ diff --git a/src/content/docs/docs/visualize-data/dashboards/images/dashboard-details-2.png b/src/content/docs/docs/visualize-data/dashboards/images/dashboard-details-2.png index 0da34ec9..72decd4b 100644 Binary files a/src/content/docs/docs/visualize-data/dashboards/images/dashboard-details-2.png and b/src/content/docs/docs/visualize-data/dashboards/images/dashboard-details-2.png differ diff --git a/src/content/docs/docs/visualize-data/dashboards/images/dashboard-details-3.jpeg b/src/content/docs/docs/visualize-data/dashboards/images/dashboard-details-3.jpeg index e7d156b7..b437cc1a 100644 Binary files a/src/content/docs/docs/visualize-data/dashboards/images/dashboard-details-3.jpeg and b/src/content/docs/docs/visualize-data/dashboards/images/dashboard-details-3.jpeg differ diff --git a/src/content/docs/docs/visualize-data/dashboards/images/dashboard-details-4.jpeg b/src/content/docs/docs/visualize-data/dashboards/images/dashboard-details-4.jpeg index 3140670c..0d77887a 100644 Binary files a/src/content/docs/docs/visualize-data/dashboards/images/dashboard-details-4.jpeg and b/src/content/docs/docs/visualize-data/dashboards/images/dashboard-details-4.jpeg differ diff --git a/src/content/docs/docs/visualize-data/dashboards/images/dashboard-details-5.png b/src/content/docs/docs/visualize-data/dashboards/images/dashboard-details-5.png index 31cb35e7..3e244e15 100644 Binary files a/src/content/docs/docs/visualize-data/dashboards/images/dashboard-details-5.png and b/src/content/docs/docs/visualize-data/dashboards/images/dashboard-details-5.png differ diff --git a/src/content/docs/docs/visualize-data/dashboards/images/dashboards-overview-1.png b/src/content/docs/docs/visualize-data/dashboards/images/dashboards-overview-1.png index 9864bc15..5e3b8ac3 100644 Binary files a/src/content/docs/docs/visualize-data/dashboards/images/dashboards-overview-1.png and b/src/content/docs/docs/visualize-data/dashboards/images/dashboards-overview-1.png differ diff --git a/src/content/docs/docs/visualize-data/dashboards/images/dashboards-overview-2.jpeg b/src/content/docs/docs/visualize-data/dashboards/images/dashboards-overview-2.jpeg deleted file mode 100644 index 6a92d775..00000000 Binary files a/src/content/docs/docs/visualize-data/dashboards/images/dashboards-overview-2.jpeg and /dev/null differ diff --git a/src/content/docs/docs/visualize-data/dashboards/images/dashboards-overview-2.png b/src/content/docs/docs/visualize-data/dashboards/images/dashboards-overview-2.png index f8f9c53e..5a12168f 100644 Binary files a/src/content/docs/docs/visualize-data/dashboards/images/dashboards-overview-2.png and b/src/content/docs/docs/visualize-data/dashboards/images/dashboards-overview-2.png differ diff --git a/src/content/docs/docs/visualize-data/dashboards/images/dashboards-overview-3.png b/src/content/docs/docs/visualize-data/dashboards/images/dashboards-overview-3.png index 95bdc0eb..8f80fa07 100644 Binary files a/src/content/docs/docs/visualize-data/dashboards/images/dashboards-overview-3.png and b/src/content/docs/docs/visualize-data/dashboards/images/dashboards-overview-3.png differ diff --git a/src/content/docs/docs/visualize-data/dashboards/images/dashboards-overview-4.png b/src/content/docs/docs/visualize-data/dashboards/images/dashboards-overview-4.png index 63f6aa4f..d79f6ab3 100644 Binary files a/src/content/docs/docs/visualize-data/dashboards/images/dashboards-overview-4.png and b/src/content/docs/docs/visualize-data/dashboards/images/dashboards-overview-4.png differ diff --git a/src/content/docs/docs/visualize-data/dashboards/images/managing-dashboards-1.jpeg b/src/content/docs/docs/visualize-data/dashboards/images/managing-dashboards-1.jpeg index ba66ae02..4f0ce01f 100644 Binary files a/src/content/docs/docs/visualize-data/dashboards/images/managing-dashboards-1.jpeg and b/src/content/docs/docs/visualize-data/dashboards/images/managing-dashboards-1.jpeg differ diff --git a/src/content/docs/docs/visualize-data/dashboards/images/managing-dashboards-1.png b/src/content/docs/docs/visualize-data/dashboards/images/managing-dashboards-1.png index 559de70b..86746f21 100644 Binary files a/src/content/docs/docs/visualize-data/dashboards/images/managing-dashboards-1.png and b/src/content/docs/docs/visualize-data/dashboards/images/managing-dashboards-1.png differ diff --git a/src/content/docs/docs/visualize-data/dashboards/images/managing-dashboards-2.jpeg b/src/content/docs/docs/visualize-data/dashboards/images/managing-dashboards-2.jpeg index 6cc62b3b..4a3400ad 100644 Binary files a/src/content/docs/docs/visualize-data/dashboards/images/managing-dashboards-2.jpeg and b/src/content/docs/docs/visualize-data/dashboards/images/managing-dashboards-2.jpeg differ diff --git a/src/content/docs/docs/visualize-data/dashboards/images/managing-dashboards-2.png b/src/content/docs/docs/visualize-data/dashboards/images/managing-dashboards-2.png index b0569e7c..a219260c 100644 Binary files a/src/content/docs/docs/visualize-data/dashboards/images/managing-dashboards-2.png and b/src/content/docs/docs/visualize-data/dashboards/images/managing-dashboards-2.png differ diff --git a/src/content/docs/docs/visualize-data/dashboards/images/managing-dashboards-3.png b/src/content/docs/docs/visualize-data/dashboards/images/managing-dashboards-3.png index b4198858..b123437d 100644 Binary files a/src/content/docs/docs/visualize-data/dashboards/images/managing-dashboards-3.png and b/src/content/docs/docs/visualize-data/dashboards/images/managing-dashboards-3.png differ diff --git a/src/content/docs/docs/visualize-data/dashboards/images/managing-dashboards-4.png b/src/content/docs/docs/visualize-data/dashboards/images/managing-dashboards-4.png index ba0376db..ed976e86 100644 Binary files a/src/content/docs/docs/visualize-data/dashboards/images/managing-dashboards-4.png and b/src/content/docs/docs/visualize-data/dashboards/images/managing-dashboards-4.png differ diff --git a/src/content/docs/docs/visualize-data/dashboards/images/managing-panels-1.jpeg b/src/content/docs/docs/visualize-data/dashboards/images/managing-panels-1.jpeg index 03673325..4d03a5d7 100644 Binary files a/src/content/docs/docs/visualize-data/dashboards/images/managing-panels-1.jpeg and b/src/content/docs/docs/visualize-data/dashboards/images/managing-panels-1.jpeg differ diff --git a/src/content/docs/docs/visualize-data/dashboards/images/managing-panels-2.jpeg b/src/content/docs/docs/visualize-data/dashboards/images/managing-panels-2.jpeg index 5d5c8b31..2e2d2e19 100644 Binary files a/src/content/docs/docs/visualize-data/dashboards/images/managing-panels-2.jpeg and b/src/content/docs/docs/visualize-data/dashboards/images/managing-panels-2.jpeg differ diff --git a/src/content/docs/docs/visualize-data/dashboards/images/managing-panels-4.jpeg b/src/content/docs/docs/visualize-data/dashboards/images/managing-panels-4.jpeg index 1f23e3ad..65eb8031 100644 Binary files a/src/content/docs/docs/visualize-data/dashboards/images/managing-panels-4.jpeg and b/src/content/docs/docs/visualize-data/dashboards/images/managing-panels-4.jpeg differ diff --git a/src/content/docs/docs/visualize-data/dashboards/index.mdx b/src/content/docs/docs/visualize-data/dashboards/index.mdx index 63152b1e..f1516163 100644 --- a/src/content/docs/docs/visualize-data/dashboards/index.mdx +++ b/src/content/docs/docs/visualize-data/dashboards/index.mdx @@ -63,15 +63,11 @@ From this screen you can: ## Importing a Dashboard -KloudMate provides standard monitoring dashboards as reusable templates on the KloudMate Dashboard Templates site. Importing a template lets you instantly set up a fully configured dashboard for common infrastructure like Kubernetes, databases, or servers, without having to build it from scratch. +You can import a dashboard from its JSON definition, so you don't have to build it from scratch. For example, you can export a dashboard from one workspace and import it into another. To get the JSON of an existing dashboard, see [Sharing a Dashboard](./dashboard-details/#sharing-a-dashboard). -1. Open the [KloudMate Dashboard Templates](https://templates.kloudmate.com/) site and find the template you want to use (e.g., Kubernetes Cluster Dashboard). The page shows a dashboard preview followed by a Template JSON section. +1. Copy the dashboard's JSON definition. -![image](./images/dashboards-overview-2.jpeg) - -2. Click the **Copy** button next to the Template JSON block to copy the full JSON definition. - -3. In KloudMate, click the **Import** button at the top-right of the Dashboards screen, paste the copied JSON into the Import Dashboard dialog, and click **Submit**. +2. In KloudMate, click the **Import** button at the top-right of the Dashboards screen, paste the copied JSON into the Import Dashboard dialog, and click **Submit**. ![image](./images/dashboards-overview-4.png) diff --git a/src/content/docs/docs/visualize-data/explore/images/explore-panel-type.png b/src/content/docs/docs/visualize-data/explore/images/explore-panel-type.png index 1a7199d9..47681f76 100644 Binary files a/src/content/docs/docs/visualize-data/explore/images/explore-panel-type.png and b/src/content/docs/docs/visualize-data/explore/images/explore-panel-type.png differ diff --git a/src/content/docs/docs/visualize-data/explore/images/explore-run.png b/src/content/docs/docs/visualize-data/explore/images/explore-run.png index 6300c4aa..174d6073 100644 Binary files a/src/content/docs/docs/visualize-data/explore/images/explore-run.png and b/src/content/docs/docs/visualize-data/explore/images/explore-run.png differ diff --git a/src/content/docs/docs/visualize-data/explore/images/explore-save.png b/src/content/docs/docs/visualize-data/explore/images/explore-save.png index 85eb671a..a46a80f2 100644 Binary files a/src/content/docs/docs/visualize-data/explore/images/explore-save.png and b/src/content/docs/docs/visualize-data/explore/images/explore-save.png differ diff --git a/src/content/docs/docs/visualize-data/explore/index.mdx b/src/content/docs/docs/visualize-data/explore/index.mdx index d29af0f6..7b2ec074 100644 --- a/src/content/docs/docs/visualize-data/explore/index.mdx +++ b/src/content/docs/docs/visualize-data/explore/index.mdx @@ -23,7 +23,7 @@ This walkthrough focuses on metrics. 2. **Configure the Visualization** Use the **Panel Type** dropdown to choose how results are displayed: `TimeSeries`, `Stats`, `Table`, `Pie Chart`, `Bar Chart`, `Histogram`, `Logs List`, `Spans List`, `Alerts List`, `Issues List`, or `Text`. - Panel Type options + The Panel Type dropdown, listing TimeSeries, Stats, Table, Pie Chart, Bar Chart, Histogram, Logs List, Spans List, Alerts List, Issues List, and Text. Below it, the settings panel splits into tabs: @@ -47,7 +47,7 @@ This walkthrough focuses on metrics. ![Group By](./images/explore-groupby.png) - - Use **Add filters** to narrow the results by attributes. Each filter needs a field, an operator, and a value, for example `service_name = raspberry-pi`. + - Use **Add filters** to narrow the results by attributes. Each filter needs a field, an operator, and a value, for example `service_name = checkout-api`. ![Add Filters](./images/explore-filters.png) diff --git a/src/content/docs/docs/workflows/actions.mdx b/src/content/docs/docs/workflows/actions.mdx index e7cc3eca..7cabd536 100644 --- a/src/content/docs/docs/workflows/actions.mdx +++ b/src/content/docs/docs/workflows/actions.mdx @@ -236,13 +236,13 @@ When you test this step on its own, it shows the shape of its output without run Runbook scripts are off on every host until someone with the **Developer** role allows them, one host at a time: -1. Open **Settings → Agents**. -2. Open the host's actions menu (⋮), select **Configure**, and open the **Runbook scripts** tab. +1. Open **Settings → Agents & Pipelines**. +2. Open the host's actions menu (⋮), select **Configure**, and open the **Runbook Scripts** tab. 3. Turn on **Allow runbook scripts on this host** and confirm. The agent picks up the change within a minute. Only Linux host agents have this setting, so Docker, Amazon ECS, Kubernetes, and Windows agents can't run runbook scripts. -To keep scripts off a host regardless of its **Runbook scripts** setting, set `job-types` to `none` in the host's `agent.yaml` (or set `KM_JOB_TYPES=none`), then restart the agent. See [agent configuration](../../kloudmate-agent/reference/agent-config/#runbook-scripts). +To keep scripts off a host regardless of its **Runbook Scripts** setting, set `job-types` to `none` in the host's `agent.yaml` (or set `KM_JOB_TYPES=none`), then restart the agent. See [agent configuration](../../kloudmate-agent/reference/agent-config/#runbook-scripts). ## AI diff --git a/src/content/docs/docs/workflows/images/run-detail-flow.png b/src/content/docs/docs/workflows/images/run-detail-flow.png index 5429fcef..ff4ed180 100644 Binary files a/src/content/docs/docs/workflows/images/run-detail-flow.png and b/src/content/docs/docs/workflows/images/run-detail-flow.png differ diff --git a/src/content/docs/docs/workflows/images/run-timeline.png b/src/content/docs/docs/workflows/images/run-timeline.png index e9862922..84b5394c 100644 Binary files a/src/content/docs/docs/workflows/images/run-timeline.png and b/src/content/docs/docs/workflows/images/run-timeline.png differ diff --git a/src/content/docs/docs/workflows/images/runs-list.png b/src/content/docs/docs/workflows/images/runs-list.png index ab8fa1da..f257926e 100644 Binary files a/src/content/docs/docs/workflows/images/runs-list.png and b/src/content/docs/docs/workflows/images/runs-list.png differ diff --git a/src/content/docs/docs/workflows/images/storage-tab.png b/src/content/docs/docs/workflows/images/storage-tab.png index f165390d..b99a2436 100644 Binary files a/src/content/docs/docs/workflows/images/storage-tab.png and b/src/content/docs/docs/workflows/images/storage-tab.png differ diff --git a/src/content/docs/docs/workflows/images/trigger-test-panel.png b/src/content/docs/docs/workflows/images/trigger-test-panel.png index e3b1a2f5..0a1c418d 100644 Binary files a/src/content/docs/docs/workflows/images/trigger-test-panel.png and b/src/content/docs/docs/workflows/images/trigger-test-panel.png differ diff --git a/src/content/docs/docs/workflows/images/variables-tab.png b/src/content/docs/docs/workflows/images/variables-tab.png index 4f99e0a3..5965635c 100644 Binary files a/src/content/docs/docs/workflows/images/variables-tab.png and b/src/content/docs/docs/workflows/images/variables-tab.png differ diff --git a/src/content/docs/docs/workflows/images/workflows-list.png b/src/content/docs/docs/workflows/images/workflows-list.png index 4b60c92b..b9dcef92 100644 Binary files a/src/content/docs/docs/workflows/images/workflows-list.png and b/src/content/docs/docs/workflows/images/workflows-list.png differ diff --git a/src/content/docs/guides/workflows/patch-hosts-one-at-a-time.mdx b/src/content/docs/guides/workflows/patch-hosts-one-at-a-time.mdx index 7310b8d3..961807e7 100644 --- a/src/content/docs/guides/workflows/patch-hosts-one-at-a-time.mdx +++ b/src/content/docs/guides/workflows/patch-hosts-one-at-a-time.mdx @@ -237,7 +237,7 @@ Publish it when you're ready. Its trigger is **Manual / API**, so it only runs w ### Find the host's agent -A **Check a Host Agent** step looks up the agent by **Host name**, `{{ trigger.inputs.host }}`. The name must match the host name the agent registered with, as shown under **Settings → Agents**. +A **Check a Host Agent** step looks up the agent by **Host name**, `{{ trigger.inputs.host }}`. The name must match the host name the agent registered with, as shown under **Settings → Agents & Pipelines**. A **Branch** then checks that `steps.agent.output.status` **equals** `reachable`, which means the agent checked in within the last 5 minutes. For any other status, such as `unreachable` or `not_found`, the **Else** block runs a **Run Code** step that throws an error: