From d96b3063e0f3449406f80959a848908d69d70751 Mon Sep 17 00:00:00 2001 From: bin liu Date: Mon, 6 Jul 2020 10:59:13 +0800 Subject: [PATCH] docs: add metrics design documents for Kata 2.0 Add basic design for how metrics service works in Kata 2.0. Signed-off-by: bin liu --- docs/design/README.md | 1 + docs/design/arch-images/kata-2-metrics.drawio | 1 + docs/design/arch-images/kata-2-metrics.png | Bin 0 -> 95006 bytes .../kata-metrics-sequence-diagram.drawio | 1 + .../kata-metrics-sequence-diagram.png | Bin 0 -> 81507 bytes docs/design/data/metrics.yaml | 1916 ++++++++++ docs/design/kata-2-0-metrics.md | 324 ++ docs/how-to/README.md | 1 + docs/how-to/data/dashboard.json | 3361 +++++++++++++++++ docs/how-to/data/grafana.yml | 43 + docs/how-to/data/kata-monitor-daemonset.yml | 55 + docs/how-to/data/prometheus.yml | 132 + docs/how-to/how-to-set-prometheus-in-k8s.md | 108 + 13 files changed, 5943 insertions(+) create mode 100644 docs/design/arch-images/kata-2-metrics.drawio create mode 100644 docs/design/arch-images/kata-2-metrics.png create mode 100644 docs/design/arch-images/kata-metrics-sequence-diagram.drawio create mode 100644 docs/design/arch-images/kata-metrics-sequence-diagram.png create mode 100644 docs/design/data/metrics.yaml create mode 100644 docs/design/kata-2-0-metrics.md create mode 100644 docs/how-to/data/dashboard.json create mode 100644 docs/how-to/data/grafana.yml create mode 100644 docs/how-to/data/kata-monitor-daemonset.yml create mode 100644 docs/how-to/data/prometheus.yml create mode 100644 docs/how-to/how-to-set-prometheus-in-k8s.md diff --git a/docs/design/README.md b/docs/design/README.md index da0faf7035..b305ce342e 100644 --- a/docs/design/README.md +++ b/docs/design/README.md @@ -8,3 +8,4 @@ Kata Containers design documents: - [VSocks](VSocks.md) - [VCPU handling](vcpu-handling.md) - [Host cgroups](host-cgroups.md) +- [Metrics(Kata 2.0)](kata-2-0-metrics.md) diff --git a/docs/design/arch-images/kata-2-metrics.drawio b/docs/design/arch-images/kata-2-metrics.drawio new file mode 100644 index 0000000000..7cff9fe67a --- /dev/null +++ b/docs/design/arch-images/kata-2-metrics.drawio @@ -0,0 +1 @@ +7VvZcuI4FP0aHqFky+sjkNCTqfR0qtLV6fTLlMDy0hiLscWWrx8Zy3iRQkhjQxbygnVlhK1zz9HRkg4cztZfYjT3vxIHhx0VOOsOvOqoKrRthX2kkU0WMTWYBbw4cLIQKAL3wRPOgkoeXQQOTngsC1FCQhrMq8EJiSI8oZUYimOyqt7mktCpBObIw0LgfoJCMfoQONTPoiqEdlHxFw48n/80hIA/+Qzld/NA4iOHrEoheN2Bw5gQml3N1kMcpr1X7ZjRM7W7J4txRA/5wrd/v5rDewTubvrjyZDYg1l/01W0rJklChf8lfnT0k3eBzFZRA5OW1E6cLDyA4rv52iS1q4Y6izm01nIq10SUQ4jwxAOvBg5AXvCIQlJvG0PmhgZOK1zgzAsxR2ELXfC4gmNyRSXaoyJhccuqxHfmXfDEscUr0sh3gdfMJlhGm/YLby2q+i6nn2J56QOzKy8KhDWctT8Eri7rEQ8q7xd60W/swve9a+BQW8PBlWTw+C6jm0YIgyu66oTKQyOMTZ0oykYNLsGQ/7OJRgYnUQYFENvCYYWUXgvZFDss5PBuHBBVc7OBQUKvY4dNjbyIompTzwSofC6iA4KXNKULu65JWTO0fiNKd1wONCCkipWeB3Qn6Xrx7Spns5LV2ve8raw4YUyy7R9iCRkEU/4u3i3328se/zw+97wp99Wf4fTh2I0pCj2MN3TOZwjaYfsBTjGIaLBsmomGodKhQJjKI3nEymAt2jMPFql01EYeBG7nrAOwyy/B2nqBswE9XnFLHCcDF+cBE9ovG0v7fo5CSK6fR190NGvDgJjb7YJpNlZO/6rFfMkJRPoKbahVUUtKx2MBm/8Ln27Ustqmonldrt2tQ3iugnLmzqeu4c8COK9mVkRRSNkXTpwgmUFZeO/RWopt0h0ky0UfXaDos3XWzzyenblpZ+sfykKIhw73cQPZt0poqi73DXPHnf7C9nNzY2Hmqi2yhgpWJWpLQDGdX/EW6jqM/trSoUts6bCUBwLFdPMk6Csw0YDg6EcePMV3H6D4szwiDc/y4XSt9Ji8bVtSSbq5nGibouivpdjL6o6TxjQA5ZuVjMGHKc0jQqJfKwQzdQHzpwj7YAkc+Sj17nswN7HLklGofHNCbglCrjhWKahyQQc9nUN5i20JeBMnMHLAi6bzLQm35r+megGjqKbeqhQw0OF+jR8U0W+3cVp2z5eJOmL45gl8ccmnm1XiGdIltQUS2uHePJx7py8K7j2WKbaC7wrqPaYt3eSYQ5KZr1yMTsb76QQi1Min9K5FPe3OelVnyHaq+e8oMfYVWXgkVPefIKrKL3aAlN71lRcxXgWz5PxWP2YRIYHEnmXXxBa1fSyj8uvRrMJ/XBvb7q/6A348c9DF/34nvjgzANA61lzgizJMX4jNguKer9dqpqRKKCkXX917pUpW1drS48yh6Xqp1yZ0kS9Tshk2hwOsl0xCwATynDo6wBooG0cLFibYFoiCjIQYGs2VxH6+43OL/9omNu32vLyqozxpuyqKurXe9uleZYyf+BYoa6rx3mInJWGUuFkVwOn86yKgOllW6Zp0TVr2zKaRHRPvS2jiWT+8IOfqcBeDQodqucd/8TdMeSl7/iRzaCm1bYpVREEWwZCW0dFLAGEnXilCtcsGJLTO7bpANOUEEbHliNdFbXUMczO+1SBGo0AGI2aAgqqdaC0XKTK0qWdkjB79oZYWJw0f1qsDMkgc1Kk8vN15fWwzRzHyyCRzHbZi9IqGNWOjEiEa73OQ4f7Shn61blE/aidT+LgKc2vsPPCssWrzizWBVB2ZlF2ZLE1qEQb6C1wkprUKY6j9Ez8u4CrmeEJVNGBsk1Y46TwiCdKP59L0HOhOpdLkJxkutgE2dCjw/PbBGW/p7v4hB1Y5tl9gmjpLj5B6hNka+Yn9QmqaOkuPmGHjtaeT2DF4h/tsrW/4v8V4fX/ \ No newline at end of file diff --git a/docs/design/arch-images/kata-2-metrics.png b/docs/design/arch-images/kata-2-metrics.png new file mode 100644 index 0000000000000000000000000000000000000000..ae63398a8c424b264997452a0030766439f2e0c0 GIT binary patch literal 95006 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%0Awc>$KLY;4XoK| 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 \ No newline at end of file diff --git a/docs/design/arch-images/kata-metrics-sequence-diagram.png b/docs/design/arch-images/kata-metrics-sequence-diagram.png new file mode 100644 index 0000000000000000000000000000000000000000..55d0365be1229147e8ed8cd11b76227230fe7c10 GIT binary patch literal 81507 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/io` + manually_edit: false + fixed: true + values: + - value: cancelled_write_byte + desc: "" + - value: rchar + desc: "" + - value: read_bytes + desc: "" + - value: syscr + desc: "" + - value: syscw + desc: "" + - value: wchar + desc: "" + - value: write_bytes + desc: "" + - name: sandbox_id + desc: "" + manually_edit: false + fixed: false + values: [] + since: 2.0.0 + - name: kata_agent_proc_stat + type: GAUGE + unit: "" + help: Agent process stat. + labels: + - name: item + desc: see `/proc//stat` + manually_edit: false + fixed: true + values: + - value: cstime + desc: "" + - value: cutime + desc: "" + - value: stime + desc: "" + - value: utime + desc: "" + - name: sandbox_id + desc: "" + manually_edit: false + fixed: false + values: [] + since: 2.0.0 + - name: kata_agent_proc_status + type: GAUGE + unit: "" + help: Agent process status. + labels: + - name: item + desc: see `/proc//status` + manually_edit: false + fixed: true + values: + - value: hugetlbpages + desc: "" + - value: nonvoluntary_ctxt_switches + desc: "" + - value: rssanon + desc: "" + - value: rssfile + desc: "" + - value: rssshmem + desc: "" + - value: vmdata + desc: "" + - value: vmexe + desc: "" + - value: vmhwm + desc: "" + - value: vmlck + desc: "" + - value: vmlib + desc: "" + - value: vmpeak + desc: "" + - value: vmpin + desc: "" + - value: vmpte + desc: "" + - value: vmrss + desc: "" + - value: vmsize + desc: "" + - value: vmstk + desc: "" + - value: vmswap + desc: "" + - value: voluntary_ctxt_switches + desc: "" + - name: sandbox_id + desc: "" + manually_edit: false + fixed: false + values: [] + since: 2.0.0 + - name: kata_agent_process_cpu_seconds_total + type: COUNTER + unit: seconds + help: Total user and system CPU time spent in seconds. + labels: + - name: sandbox_id + desc: "" + manually_edit: false + fixed: false + values: [] + since: 2.0.0 + - name: kata_agent_process_max_fds + type: GAUGE + unit: "" + help: Maximum number of open file descriptors. + labels: + - name: sandbox_id + desc: "" + manually_edit: false + fixed: false + values: [] + since: 2.0.0 + - name: kata_agent_process_open_fds + type: GAUGE + unit: "" + help: Number of open file descriptors. + labels: + - name: sandbox_id + desc: "" + manually_edit: false + fixed: false + values: [] + since: 2.0.0 + - name: kata_agent_process_resident_memory_bytes + type: GAUGE + unit: bytes + help: Resident memory size in bytes. + labels: + - name: sandbox_id + desc: "" + manually_edit: false + fixed: false + values: [] + since: 2.0.0 + - name: kata_agent_process_start_time_seconds + type: GAUGE + unit: seconds + help: Start time of the process since unix epoch in seconds. + labels: + - name: sandbox_id + desc: "" + manually_edit: false + fixed: false + values: [] + since: 2.0.0 + - name: kata_agent_process_virtual_memory_bytes + type: GAUGE + unit: bytes + help: Virtual memory size in bytes. + labels: + - name: sandbox_id + desc: "" + manually_edit: false + fixed: false + values: [] + since: 2.0.0 + - name: kata_agent_scrape_count + type: COUNTER + unit: "" + help: Metrics scrape count + labels: + - name: sandbox_id + desc: "" + manually_edit: false + fixed: false + values: [] + since: 2.0.0 + - name: kata_agent_total_rss + type: GAUGE + unit: "" + help: Agent process total rss size + labels: + - name: sandbox_id + desc: "" + manually_edit: false + fixed: false + values: [] + since: 2.0.0 + - name: kata_agent_total_time + type: GAUGE + unit: "" + help: Agent process total time + labels: + - name: sandbox_id + desc: "" + manually_edit: false + fixed: false + values: [] + since: 2.0.0 + - name: kata_agent_total_vm + type: GAUGE + unit: "" + help: Agent process total vm size + labels: + - name: sandbox_id + desc: "" + manually_edit: false + fixed: false + values: [] + since: 2.0.0 + - prefix: kata_guest + title: Kata guest OS metrics + desc: Guest OS's metrics in hypervisor. + metrics: + - name: kata_guest_cpu_time + type: GAUGE + unit: "" + help: Guest CPU stat. + labels: + - name: cpu + desc: CPU no. and total for all CPUs + manually_edit: true + fixed: true + values: + - value: "0" + desc: CPU 0 + - value: "1" + desc: CPU 1 + - value: total + desc: for all CPUs + - name: item + desc: Kernel/system statistics, from `/proc/stat` + manually_edit: false + fixed: true + values: + - value: guest + desc: "" + - value: guest_nice + desc: "" + - value: idle + desc: "" + - value: iowait + desc: "" + - value: irq + desc: "" + - value: nice + desc: "" + - value: softirq + desc: "" + - value: steal + desc: "" + - value: system + desc: "" + - value: user + desc: "" + - name: sandbox_id + desc: "" + manually_edit: false + fixed: false + values: [] + since: 2.0.0 + - name: kata_guest_diskstat + type: GAUGE + unit: "" + help: Disks stat in system. + labels: + - name: disk + desc: disk name + manually_edit: false + fixed: false + values: [] + - name: item + desc: see `/proc/diskstats` + manually_edit: false + fixed: true + values: + - value: discards + desc: "" + - value: discards_merged + desc: "" + - value: flushes + desc: "" + - value: in_progress + desc: "" + - value: merged + desc: "" + - value: reads + desc: "" + - value: sectors_discarded + desc: "" + - value: sectors_read + desc: "" + - value: sectors_written + desc: "" + - value: time_discarding + desc: "" + - value: time_flushing + desc: "" + - value: time_in_progress + desc: "" + - value: time_reading + desc: "" + - value: time_writing + desc: "" + - value: weighted_time_in_progress + desc: "" + - value: writes + desc: "" + - value: writes_merged + desc: "" + - name: sandbox_id + desc: "" + manually_edit: false + fixed: false + values: [] + since: 2.0.0 + - name: kata_guest_load + type: GAUGE + unit: "" + help: Guest system load. + labels: + - name: item + desc: "" + manually_edit: false + fixed: true + values: + - value: load1 + desc: "" + - value: load15 + desc: "" + - value: load5 + desc: "" + - name: sandbox_id + desc: "" + manually_edit: false + fixed: false + values: [] + since: 2.0.0 + - name: kata_guest_meminfo + type: GAUGE + unit: "" + help: Statistics about memory usage on the system. + labels: + - name: item + desc: see `/proc/meminfo` + manually_edit: false + fixed: true + values: + - value: active + desc: "" + - value: active_anon + desc: "" + - value: active_file + desc: "" + - value: anon_hugepages + desc: "" + - value: anon_pages + desc: "" + - value: bounce + desc: "" + - value: buffers + desc: "" + - value: cached + desc: "" + - value: cma_free + desc: "" + - value: cma_total + desc: "" + - value: commit_limit + desc: "" + - value: committed_as + desc: "" + - value: direct_map_1G + desc: "" + - value: direct_map_2M + desc: "" + - value: direct_map_4M + desc: "" + - value: direct_map_4k + desc: "" + - value: dirty + desc: "" + - value: hardware_corrupted + desc: "" + - value: high_free + desc: "" + - value: high_total + desc: "" + - value: hugepages_free + desc: "" + - value: hugepages_rsvd + desc: "" + - value: hugepages_surp + desc: "" + - value: hugepages_total + desc: "" + - value: hugepagesize + desc: "" + - value: hugetlb + desc: "" + - value: inactive + desc: "" + - value: inactive_anon + desc: "" + - value: inactive_file + desc: "" + - value: k_reclaimable + desc: "" + - value: kernel_stack + desc: "" + - value: low_free + desc: "" + - value: low_total + desc: "" + - value: mapped + desc: "" + - value: mem_available + desc: "" + - value: mem_free + desc: "" + - value: mem_total + desc: "" + - value: mlocked + desc: "" + - value: mmap_copy + desc: "" + - value: nfs_unstable + desc: "" + - value: page_tables + desc: "" + - value: per_cpu + desc: "" + - value: quicklists + desc: "" + - value: s_reclaimable + desc: "" + - value: s_unreclaim + desc: "" + - value: shmem + desc: "" + - value: shmem_hugepages + desc: "" + - value: shmem_pmd_mapped + desc: "" + - value: slab + desc: "" + - value: swap_cached + desc: "" + - value: swap_free + desc: "" + - value: swap_total + desc: "" + - value: unevictable + desc: "" + - value: vmalloc_chunk + desc: "" + - value: vmalloc_total + desc: "" + - value: vmalloc_used + desc: "" + - value: writeback + desc: "" + - value: writeback_tmp + desc: "" + - name: sandbox_id + desc: "" + manually_edit: false + fixed: false + values: [] + since: 2.0.0 + - name: kata_guest_netdev_stat + type: GAUGE + unit: "" + help: Guest net devices stats. + labels: + - name: interface + desc: network device name + manually_edit: false + fixed: false + values: [] + - name: item + desc: see `/proc/net/dev` + manually_edit: false + fixed: true + values: + - value: recv_bytes + desc: "" + - value: recv_compressed + desc: "" + - value: recv_drop + desc: "" + - value: recv_errs + desc: "" + - value: recv_fifo + desc: "" + - value: recv_frame + desc: "" + - value: recv_multicast + desc: "" + - value: recv_packets + desc: "" + - value: sent_bytes + desc: "" + - value: sent_carrier + desc: "" + - value: sent_colls + desc: "" + - value: sent_compressed + desc: "" + - value: sent_drop + desc: "" + - value: sent_errs + desc: "" + - value: sent_fifo + desc: "" + - value: sent_packets + desc: "" + - name: sandbox_id + desc: "" + manually_edit: false + fixed: false + values: [] + since: 2.0.0 + - name: kata_guest_tasks + type: GAUGE + unit: "" + help: Guest system load. + labels: + - name: item + desc: "" + manually_edit: false + fixed: true + values: + - value: cur + desc: "" + - value: max + desc: "" + - name: sandbox_id + desc: "" + manually_edit: false + fixed: false + values: [] + since: 2.0.0 + - name: kata_guest_vm_stat + type: GAUGE + unit: "" + help: Guest virtual memory stat. + labels: + - name: item + desc: see `/proc/vmstat` + manually_edit: false + fixed: true + values: + - value: allocstall_dma + desc: "" + - value: allocstall_dma32 + desc: "" + - value: allocstall_movable + desc: "" + - value: allocstall_normal + desc: "" + - value: balloon_deflate + desc: "" + - value: balloon_inflate + desc: "" + - value: compact_daemon_free_scanned + desc: "" + - value: compact_daemon_migrate_scanned + desc: "" + - value: compact_daemon_wake + desc: "" + - value: compact_fail + desc: "" + - value: compact_free_scanned + desc: "" + - value: compact_isolated + desc: "" + - value: compact_migrate_scanned + desc: "" + - value: compact_stall + desc: "" + - value: compact_success + desc: "" + - value: drop_pagecache + desc: "" + - value: drop_slab + desc: "" + - value: htlb_buddy_alloc_fail + desc: "" + - value: htlb_buddy_alloc_success + desc: "" + - value: kswapd_high_wmark_hit_quickly + desc: "" + - value: kswapd_inodesteal + desc: "" + - value: kswapd_low_wmark_hit_quickly + desc: "" + - value: nr_active_anon + desc: "" + - value: nr_active_file + desc: "" + - value: nr_anon_pages + desc: "" + - value: nr_anon_transparent_hugepages + desc: "" + - value: nr_bounce + desc: "" + - value: nr_dirtied + desc: "" + - value: nr_dirty + desc: "" + - value: nr_dirty_background_threshold + desc: "" + - value: nr_dirty_threshold + desc: "" + - value: nr_file_pages + desc: "" + - value: nr_free_cma + desc: "" + - value: nr_free_pages + desc: "" + - value: nr_inactive_anon + desc: "" + - value: nr_inactive_file + desc: "" + - value: nr_isolated_anon + desc: "" + - value: nr_isolated_file + desc: "" + - value: nr_kernel_stack + desc: "" + - value: nr_mapped + desc: "" + - value: nr_mlock + desc: "" + - value: nr_page_table_pages + desc: "" + - value: nr_shmem + desc: "" + - value: nr_shmem_hugepages + desc: "" + - value: nr_shmem_pmdmapped + desc: "" + - value: nr_slab_reclaimable + desc: "" + - value: nr_slab_unreclaimable + desc: "" + - value: nr_unevictable + desc: "" + - value: nr_unstable + desc: "" + - value: nr_vmscan_immediate_reclaim + desc: "" + - value: nr_vmscan_write + desc: "" + - value: nr_writeback + desc: "" + - value: nr_writeback_temp + desc: "" + - value: nr_written + desc: "" + - value: nr_zone_active_anon + desc: "" + - value: nr_zone_active_file + desc: "" + - value: nr_zone_inactive_anon + desc: "" + - value: nr_zone_inactive_file + desc: "" + - value: nr_zone_unevictable + desc: "" + - value: nr_zone_write_pending + desc: "" + - value: oom_kill + desc: "" + - value: pageoutrun + desc: "" + - value: pgactivate + desc: "" + - value: pgalloc_dma + desc: "" + - value: pgalloc_dma32 + desc: "" + - value: pgalloc_movable + desc: "" + - value: pgalloc_normal + desc: "" + - value: pgdeactivate + desc: "" + - value: pgfault + desc: "" + - value: pgfree + desc: "" + - value: pginodesteal + desc: "" + - value: pglazyfree + desc: "" + - value: pglazyfreed + desc: "" + - value: pgmajfault + desc: "" + - value: pgmigrate_fail + desc: "" + - value: pgmigrate_success + desc: "" + - value: pgpgin + desc: "" + - value: pgpgout + desc: "" + - value: pgrefill + desc: "" + - value: pgrotated + desc: "" + - value: pgscan_direct + desc: "" + - value: pgscan_direct_throttle + desc: "" + - value: pgscan_kswapd + desc: "" + - value: pgskip_dma + desc: "" + - value: pgskip_dma32 + desc: "" + - value: pgskip_movable + desc: "" + - value: pgskip_normal + desc: "" + - value: pgsteal_direct + desc: "" + - value: pgsteal_kswapd + desc: "" + - value: pswpin + desc: "" + - value: pswpout + desc: "" + - value: slabs_scanned + desc: "" + - value: swap_ra + desc: "" + - value: swap_ra_hit + desc: "" + - value: unevictable_pgs_cleared + desc: "" + - value: unevictable_pgs_culled + desc: "" + - value: unevictable_pgs_mlocked + desc: "" + - value: unevictable_pgs_munlocked + desc: "" + - value: unevictable_pgs_rescued + desc: "" + - value: unevictable_pgs_scanned + desc: "" + - value: unevictable_pgs_stranded + desc: "" + - value: workingset_activate + desc: "" + - value: workingset_nodereclaim + desc: "" + - value: workingset_refault + desc: "" + - name: sandbox_id + desc: "" + manually_edit: false + fixed: false + values: [] + since: 2.0.0 + - prefix: kata_hypervisor + title: Hypervisor metrics + desc: Hypervisors metrics, collected mainly from `proc` filesystem of hypervisor process. + metrics: + - name: kata_hypervisor_fds + type: GAUGE + unit: "" + help: Open FDs for hypervisor. + labels: + - name: sandbox_id + desc: "" + manually_edit: false + fixed: false + values: [] + since: 2.0.0 + - name: kata_hypervisor_io_stat + type: GAUGE + unit: "" + help: Process IO statistics. + labels: + - name: item + desc: see `/proc//io` + manually_edit: false + fixed: true + values: + - value: cancelledwritebytes + desc: "" + - value: rchar + desc: "" + - value: readbytes + desc: "" + - value: syscr + desc: "" + - value: syscw + desc: "" + - value: wchar + desc: "" + - value: writebytes + desc: "" + - name: sandbox_id + desc: "" + manually_edit: false + fixed: false + values: [] + since: 2.0.0 + - name: kata_hypervisor_netdev + type: GAUGE + unit: "" + help: Net devices statistics. + labels: + - name: interface + desc: network device name + manually_edit: false + fixed: false + values: [] + - name: item + desc: see `/proc/net/dev` + manually_edit: false + fixed: true + values: + - value: recv_bytes + desc: "" + - value: recv_compressed + desc: "" + - value: recv_drop + desc: "" + - value: recv_errs + desc: "" + - value: recv_fifo + desc: "" + - value: recv_frame + desc: "" + - value: recv_multicast + desc: "" + - value: recv_packets + desc: "" + - value: sent_bytes + desc: "" + - value: sent_carrier + desc: "" + - value: sent_colls + desc: "" + - value: sent_compressed + desc: "" + - value: sent_drop + desc: "" + - value: sent_errs + desc: "" + - value: sent_fifo + desc: "" + - value: sent_packets + desc: "" + - name: sandbox_id + desc: "" + manually_edit: false + fixed: false + values: [] + since: 2.0.0 + - name: kata_hypervisor_proc_stat + type: GAUGE + unit: "" + help: Hypervisor process statistics. + labels: + - name: item + desc: see `/proc//stat` + manually_edit: false + fixed: true + values: + - value: cstime + desc: "" + - value: cutime + desc: "" + - value: stime + desc: "" + - value: utime + desc: "" + - name: sandbox_id + desc: "" + manually_edit: false + fixed: false + values: [] + since: 2.0.0 + - name: kata_hypervisor_proc_status + type: GAUGE + unit: "" + help: Hypervisor process status. + labels: + - name: item + desc: see `/proc//status` + manually_edit: false + fixed: true + values: + - value: hugetlbpages + desc: "" + - value: nonvoluntary_ctxt_switches + desc: "" + - value: rssanon + desc: "" + - value: rssfile + desc: "" + - value: rssshmem + desc: "" + - value: vmdata + desc: "" + - value: vmexe + desc: "" + - value: vmhwm + desc: "" + - value: vmlck + desc: "" + - value: vmlib + desc: "" + - value: vmpeak + desc: "" + - value: vmpin + desc: "" + - value: vmpmd + desc: "" + - value: vmpte + desc: "" + - value: vmrss + desc: "" + - value: vmsize + desc: "" + - value: vmstk + desc: "" + - value: vmswap + desc: "" + - value: voluntary_ctxt_switches + desc: "" + - name: sandbox_id + desc: "" + manually_edit: false + fixed: false + values: [] + since: 2.0.0 + - name: kata_hypervisor_threads + type: GAUGE + unit: "" + help: Hypervisor process threads. + labels: + - name: sandbox_id + desc: "" + manually_edit: false + fixed: false + values: [] + since: 2.0.0 + - prefix: kata_monitor + title: Kata monitor metrics + desc: Metrics about `kata-monitor` itself. + metrics: + - name: kata_monitor_go_gc_duration_seconds + type: SUMMARY + unit: seconds + help: A summary of the pause duration of garbage collection cycles. + labels: [] + since: 2.0.0 + - name: kata_monitor_go_goroutines + type: GAUGE + unit: "" + help: Number of goroutines that currently exist. + labels: [] + since: 2.0.0 + - name: kata_monitor_go_info + type: GAUGE + unit: "" + help: Information about the Go environment. + labels: + - name: version + desc: golang version + manually_edit: true + fixed: true + values: + - value: go1.13.9 + desc: environment dependent variable + since: 2.0.0 + - name: kata_monitor_go_memstats_alloc_bytes + type: GAUGE + unit: bytes + help: Number of bytes allocated and still in use. + labels: [] + since: 2.0.0 + - name: kata_monitor_go_memstats_alloc_bytes_total + type: COUNTER + unit: bytes + help: Total number of bytes allocated, even if freed. + labels: [] + since: 2.0.0 + - name: kata_monitor_go_memstats_buck_hash_sys_bytes + type: GAUGE + unit: bytes + help: Number of bytes used by the profiling bucket hash table. + labels: [] + since: 2.0.0 + - name: kata_monitor_go_memstats_frees_total + type: COUNTER + unit: "" + help: Total number of frees. + labels: [] + since: 2.0.0 + - name: kata_monitor_go_memstats_gc_cpu_fraction + type: GAUGE + unit: "" + help: The fraction of this program's available CPU time used by the GC since the program started. + labels: [] + since: 2.0.0 + - name: kata_monitor_go_memstats_gc_sys_bytes + type: GAUGE + unit: bytes + help: Number of bytes used for garbage collection system metadata. + labels: [] + since: 2.0.0 + - name: kata_monitor_go_memstats_heap_alloc_bytes + type: GAUGE + unit: bytes + help: Number of heap bytes allocated and still in use. + labels: [] + since: 2.0.0 + - name: kata_monitor_go_memstats_heap_idle_bytes + type: GAUGE + unit: bytes + help: Number of heap bytes waiting to be used. + labels: [] + since: 2.0.0 + - name: kata_monitor_go_memstats_heap_inuse_bytes + type: GAUGE + unit: bytes + help: Number of heap bytes that are in use. + labels: [] + since: 2.0.0 + - name: kata_monitor_go_memstats_heap_objects + type: GAUGE + unit: "" + help: Number of allocated objects. + labels: [] + since: 2.0.0 + - name: kata_monitor_go_memstats_heap_released_bytes + type: GAUGE + unit: bytes + help: Number of heap bytes released to OS. + labels: [] + since: 2.0.0 + - name: kata_monitor_go_memstats_heap_sys_bytes + type: GAUGE + unit: bytes + help: Number of heap bytes obtained from system. + labels: [] + since: 2.0.0 + - name: kata_monitor_go_memstats_last_gc_time_seconds + type: GAUGE + unit: seconds + help: Number of seconds since 1970 of last garbage collection. + labels: [] + since: 2.0.0 + - name: kata_monitor_go_memstats_lookups_total + type: COUNTER + unit: "" + help: Total number of pointer lookups. + labels: [] + since: 2.0.0 + - name: kata_monitor_go_memstats_mallocs_total + type: COUNTER + unit: "" + help: Total number of mallocs. + labels: [] + since: 2.0.0 + - name: kata_monitor_go_memstats_mcache_inuse_bytes + type: GAUGE + unit: bytes + help: Number of bytes in use by mcache structures. + labels: [] + since: 2.0.0 + - name: kata_monitor_go_memstats_mcache_sys_bytes + type: GAUGE + unit: bytes + help: Number of bytes used for mcache structures obtained from system. + labels: [] + since: 2.0.0 + - name: kata_monitor_go_memstats_mspan_inuse_bytes + type: GAUGE + unit: bytes + help: Number of bytes in use by mspan structures. + labels: [] + since: 2.0.0 + - name: kata_monitor_go_memstats_mspan_sys_bytes + type: GAUGE + unit: bytes + help: Number of bytes used for mspan structures obtained from system. + labels: [] + since: 2.0.0 + - name: kata_monitor_go_memstats_next_gc_bytes + type: GAUGE + unit: bytes + help: Number of heap bytes when next garbage collection will take place. + labels: [] + since: 2.0.0 + - name: kata_monitor_go_memstats_other_sys_bytes + type: GAUGE + unit: bytes + help: Number of bytes used for other system allocations. + labels: [] + since: 2.0.0 + - name: kata_monitor_go_memstats_stack_inuse_bytes + type: GAUGE + unit: bytes + help: Number of bytes in use by the stack allocator. + labels: [] + since: 2.0.0 + - name: kata_monitor_go_memstats_stack_sys_bytes + type: GAUGE + unit: bytes + help: Number of bytes obtained from system for stack allocator. + labels: [] + since: 2.0.0 + - name: kata_monitor_go_memstats_sys_bytes + type: GAUGE + unit: bytes + help: Number of bytes obtained from system. + labels: [] + since: 2.0.0 + - name: kata_monitor_go_threads + type: GAUGE + unit: "" + help: Number of OS threads created. + labels: [] + since: 2.0.0 + - name: kata_monitor_process_cpu_seconds_total + type: COUNTER + unit: seconds + help: Total user and system CPU time spent in seconds. + labels: [] + since: 2.0.0 + - name: kata_monitor_process_max_fds + type: GAUGE + unit: "" + help: Maximum number of open file descriptors. + labels: [] + since: 2.0.0 + - name: kata_monitor_process_open_fds + type: GAUGE + unit: "" + help: Number of open file descriptors. + labels: [] + since: 2.0.0 + - name: kata_monitor_process_resident_memory_bytes + type: GAUGE + unit: bytes + help: Resident memory size in bytes. + labels: [] + since: 2.0.0 + - name: kata_monitor_process_start_time_seconds + type: GAUGE + unit: seconds + help: Start time of the process since unix epoch in seconds. + labels: [] + since: 2.0.0 + - name: kata_monitor_process_virtual_memory_bytes + type: GAUGE + unit: bytes + help: Virtual memory size in bytes. + labels: [] + since: 2.0.0 + - name: kata_monitor_process_virtual_memory_max_bytes + type: GAUGE + unit: bytes + help: Maximum amount of virtual memory available in bytes. + labels: [] + since: 2.0.0 + - name: kata_monitor_running_shim_count + type: GAUGE + unit: "" + help: Running shim count(running sandboxes). + labels: [] + since: 2.0.0 + - name: kata_monitor_scrape_count + type: COUNTER + unit: "" + help: Scape count. + labels: [] + since: 2.0.0 + - name: kata_monitor_scrape_durations_histogram_milliseconds + type: HISTOGRAM + unit: milliseconds + help: Time used to scrape from shims + labels: [] + since: 2.0.0 + - name: kata_monitor_scrape_failed_count + type: COUNTER + unit: "" + help: Failed scape count. + labels: [] + since: 2.0.0 + - prefix: kata_shim + title: Kata containerd shim v2 metrics + desc: Metrics about Kata containerd shim v2 process. + metrics: + - name: kata_shim_agent_rpc_durations_histogram_milliseconds + type: HISTOGRAM + unit: milliseconds + help: RPC latency distributions. + labels: + - name: action + desc: RPC actions of Kata agent + manually_edit: true + fixed: true + values: + - value: grpc.CheckRequest + desc: "" + - value: grpc.CloseStdinRequest + desc: "" + - value: grpc.CopyFileRequest + desc: "" + - value: grpc.CreateContainerRequest + desc: "" + - value: grpc.CreateSandboxRequest + desc: "" + - value: grpc.DestroySandboxRequest + desc: "" + - value: grpc.ExecProcessRequest + desc: "" + - value: grpc.GetMetricsRequest + desc: "" + - value: grpc.GuestDetailsRequest + desc: "" + - value: grpc.ListInterfacesRequest + desc: "" + - value: grpc.ListProcessesRequest + desc: "" + - value: grpc.ListRoutesRequest + desc: "" + - value: grpc.MemHotplugByProbeRequest + desc: "" + - value: grpc.OnlineCPUMemRequest + desc: "" + - value: grpc.PauseContainerRequest + desc: "" + - value: grpc.RemoveContainerRequest + desc: "" + - value: grpc.ReseedRandomDevRequest + desc: "" + - value: grpc.ResumeContainerRequest + desc: "" + - value: grpc.SetGuestDateTimeRequest + desc: "" + - value: grpc.SignalProcessRequest + desc: "" + - value: grpc.StartContainerRequest + desc: "" + - value: grpc.StartTracingRequest + desc: "" + - value: grpc.StatsContainerRequest + desc: "" + - value: grpc.StopTracingRequest + desc: "" + - value: grpc.TtyWinResizeRequest + desc: "" + - value: grpc.UpdateContainerRequest + desc: "" + - value: grpc.UpdateInterfaceRequest + desc: "" + - value: grpc.UpdateRoutesRequest + desc: "" + - value: grpc.WaitProcessRequest + desc: "" + - value: grpc.WriteStreamRequest + desc: "" + - name: sandbox_id + desc: "" + manually_edit: false + fixed: false + values: [] + since: 2.0.0 + - name: kata_shim_fds + type: GAUGE + unit: "" + help: Kata containerd shim v2 open FDs. + labels: + - name: sandbox_id + desc: "" + manually_edit: false + fixed: false + values: [] + since: 2.0.0 + - name: kata_shim_go_gc_duration_seconds + type: SUMMARY + unit: seconds + help: A summary of the pause duration of garbage collection cycles. + labels: + - name: sandbox_id + desc: "" + manually_edit: false + fixed: false + values: [] + since: 2.0.0 + - name: kata_shim_go_goroutines + type: GAUGE + unit: "" + help: Number of goroutines that currently exist. + labels: + - name: sandbox_id + desc: "" + manually_edit: false + fixed: false + values: [] + since: 2.0.0 + - name: kata_shim_go_info + type: GAUGE + unit: "" + help: Information about the Go environment. + labels: + - name: sandbox_id + desc: "" + manually_edit: false + fixed: false + values: [] + - name: version + desc: golang version + manually_edit: true + fixed: true + values: + - value: go1.13.9 + desc: environment dependent variable + since: 2.0.0 + - name: kata_shim_go_memstats_alloc_bytes + type: GAUGE + unit: bytes + help: Number of bytes allocated and still in use. + labels: + - name: sandbox_id + desc: "" + manually_edit: false + fixed: false + values: [] + since: 2.0.0 + - name: kata_shim_go_memstats_alloc_bytes_total + type: COUNTER + unit: bytes + help: Total number of bytes allocated, even if freed. + labels: + - name: sandbox_id + desc: "" + manually_edit: false + fixed: false + values: [] + since: 2.0.0 + - name: kata_shim_go_memstats_buck_hash_sys_bytes + type: GAUGE + unit: bytes + help: Number of bytes used by the profiling bucket hash table. + labels: + - name: sandbox_id + desc: "" + manually_edit: false + fixed: false + values: [] + since: 2.0.0 + - name: kata_shim_go_memstats_frees_total + type: COUNTER + unit: "" + help: Total number of frees. + labels: + - name: sandbox_id + desc: "" + manually_edit: false + fixed: false + values: [] + since: 2.0.0 + - name: kata_shim_go_memstats_gc_cpu_fraction + type: GAUGE + unit: "" + help: The fraction of this program's available CPU time used by the GC since the program started. + labels: + - name: sandbox_id + desc: "" + manually_edit: false + fixed: false + values: [] + since: 2.0.0 + - name: kata_shim_go_memstats_gc_sys_bytes + type: GAUGE + unit: bytes + help: Number of bytes used for garbage collection system metadata. + labels: + - name: sandbox_id + desc: "" + manually_edit: false + fixed: false + values: [] + since: 2.0.0 + - name: kata_shim_go_memstats_heap_alloc_bytes + type: GAUGE + unit: bytes + help: Number of heap bytes allocated and still in use. + labels: + - name: sandbox_id + desc: "" + manually_edit: false + fixed: false + values: [] + since: 2.0.0 + - name: kata_shim_go_memstats_heap_idle_bytes + type: GAUGE + unit: bytes + help: Number of heap bytes waiting to be used. + labels: + - name: sandbox_id + desc: "" + manually_edit: false + fixed: false + values: [] + since: 2.0.0 + - name: kata_shim_go_memstats_heap_inuse_bytes + type: GAUGE + unit: bytes + help: Number of heap bytes that are in use. + labels: + - name: sandbox_id + desc: "" + manually_edit: false + fixed: false + values: [] + since: 2.0.0 + - name: kata_shim_go_memstats_heap_objects + type: GAUGE + unit: "" + help: Number of allocated objects. + labels: + - name: sandbox_id + desc: "" + manually_edit: false + fixed: false + values: [] + since: 2.0.0 + - name: kata_shim_go_memstats_heap_released_bytes + type: GAUGE + unit: bytes + help: Number of heap bytes released to OS. + labels: + - name: sandbox_id + desc: "" + manually_edit: false + fixed: false + values: [] + since: 2.0.0 + - name: kata_shim_go_memstats_heap_sys_bytes + type: GAUGE + unit: bytes + help: Number of heap bytes obtained from system. + labels: + - name: sandbox_id + desc: "" + manually_edit: false + fixed: false + values: [] + since: 2.0.0 + - name: kata_shim_go_memstats_last_gc_time_seconds + type: GAUGE + unit: seconds + help: Number of seconds since 1970 of last garbage collection. + labels: + - name: sandbox_id + desc: "" + manually_edit: false + fixed: false + values: [] + since: 2.0.0 + - name: kata_shim_go_memstats_lookups_total + type: COUNTER + unit: "" + help: Total number of pointer lookups. + labels: + - name: sandbox_id + desc: "" + manually_edit: false + fixed: false + values: [] + since: 2.0.0 + - name: kata_shim_go_memstats_mallocs_total + type: COUNTER + unit: "" + help: Total number of mallocs. + labels: + - name: sandbox_id + desc: "" + manually_edit: false + fixed: false + values: [] + since: 2.0.0 + - name: kata_shim_go_memstats_mcache_inuse_bytes + type: GAUGE + unit: bytes + help: Number of bytes in use by mcache structures. + labels: + - name: sandbox_id + desc: "" + manually_edit: false + fixed: false + values: [] + since: 2.0.0 + - name: kata_shim_go_memstats_mcache_sys_bytes + type: GAUGE + unit: bytes + help: Number of bytes used for mcache structures obtained from system. + labels: + - name: sandbox_id + desc: "" + manually_edit: false + fixed: false + values: [] + since: 2.0.0 + - name: kata_shim_go_memstats_mspan_inuse_bytes + type: GAUGE + unit: bytes + help: Number of bytes in use by mspan structures. + labels: + - name: sandbox_id + desc: "" + manually_edit: false + fixed: false + values: [] + since: 2.0.0 + - name: kata_shim_go_memstats_mspan_sys_bytes + type: GAUGE + unit: bytes + help: Number of bytes used for mspan structures obtained from system. + labels: + - name: sandbox_id + desc: "" + manually_edit: false + fixed: false + values: [] + since: 2.0.0 + - name: kata_shim_go_memstats_next_gc_bytes + type: GAUGE + unit: bytes + help: Number of heap bytes when next garbage collection will take place. + labels: + - name: sandbox_id + desc: "" + manually_edit: false + fixed: false + values: [] + since: 2.0.0 + - name: kata_shim_go_memstats_other_sys_bytes + type: GAUGE + unit: bytes + help: Number of bytes used for other system allocations. + labels: + - name: sandbox_id + desc: "" + manually_edit: false + fixed: false + values: [] + since: 2.0.0 + - name: kata_shim_go_memstats_stack_inuse_bytes + type: GAUGE + unit: bytes + help: Number of bytes in use by the stack allocator. + labels: + - name: sandbox_id + desc: "" + manually_edit: false + fixed: false + values: [] + since: 2.0.0 + - name: kata_shim_go_memstats_stack_sys_bytes + type: GAUGE + unit: bytes + help: Number of bytes obtained from system for stack allocator. + labels: + - name: sandbox_id + desc: "" + manually_edit: false + fixed: false + values: [] + since: 2.0.0 + - name: kata_shim_go_memstats_sys_bytes + type: GAUGE + unit: bytes + help: Number of bytes obtained from system. + labels: + - name: sandbox_id + desc: "" + manually_edit: false + fixed: false + values: [] + since: 2.0.0 + - name: kata_shim_go_threads + type: GAUGE + unit: "" + help: Number of OS threads created. + labels: + - name: sandbox_id + desc: "" + manually_edit: false + fixed: false + values: [] + since: 2.0.0 + - name: kata_shim_io_stat + type: GAUGE + unit: "" + help: Kata containerd shim v2 process IO statistics. + labels: + - name: item + desc: see `/proc//io` + manually_edit: false + fixed: true + values: + - value: cancelledwritebytes + desc: "" + - value: rchar + desc: "" + - value: readbytes + desc: "" + - value: syscr + desc: "" + - value: syscw + desc: "" + - value: wchar + desc: "" + - value: writebytes + desc: "" + - name: sandbox_id + desc: "" + manually_edit: false + fixed: false + values: [] + since: 2.0.0 + - name: kata_shim_netdev + type: GAUGE + unit: "" + help: Kata containerd shim v2 network devices statistics. + labels: + - name: interface + desc: network device name + manually_edit: false + fixed: false + values: [] + - name: item + desc: see `/proc/net/dev` + manually_edit: false + fixed: true + values: + - value: recv_bytes + desc: "" + - value: recv_compressed + desc: "" + - value: recv_drop + desc: "" + - value: recv_errs + desc: "" + - value: recv_fifo + desc: "" + - value: recv_frame + desc: "" + - value: recv_multicast + desc: "" + - value: recv_packets + desc: "" + - value: sent_bytes + desc: "" + - value: sent_carrier + desc: "" + - value: sent_colls + desc: "" + - value: sent_compressed + desc: "" + - value: sent_drop + desc: "" + - value: sent_errs + desc: "" + - value: sent_fifo + desc: "" + - value: sent_packets + desc: "" + - name: sandbox_id + desc: "" + manually_edit: false + fixed: false + values: [] + since: 2.0.0 + - name: kata_shim_proc_stat + type: GAUGE + unit: "" + help: Kata containerd shim v2 process statistics. + labels: + - name: item + desc: see `/proc//stat` + manually_edit: false + fixed: true + values: + - value: cstime + desc: "" + - value: cutime + desc: "" + - value: stime + desc: "" + - value: utime + desc: "" + - name: sandbox_id + desc: "" + manually_edit: false + fixed: false + values: [] + since: 2.0.0 + - name: kata_shim_proc_status + type: GAUGE + unit: "" + help: Kata containerd shim v2 process status. + labels: + - name: item + desc: see `/proc//status` + manually_edit: false + fixed: true + values: + - value: hugetlbpages + desc: "" + - value: nonvoluntary_ctxt_switches + desc: "" + - value: rssanon + desc: "" + - value: rssfile + desc: "" + - value: rssshmem + desc: "" + - value: vmdata + desc: "" + - value: vmexe + desc: "" + - value: vmhwm + desc: "" + - value: vmlck + desc: "" + - value: vmlib + desc: "" + - value: vmpeak + desc: "" + - value: vmpin + desc: "" + - value: vmpmd + desc: "" + - value: vmpte + desc: "" + - value: vmrss + desc: "" + - value: vmsize + desc: "" + - value: vmstk + desc: "" + - value: vmswap + desc: "" + - value: voluntary_ctxt_switches + desc: "" + - name: sandbox_id + desc: "" + manually_edit: false + fixed: false + values: [] + since: 2.0.0 + - name: kata_shim_process_cpu_seconds_total + type: COUNTER + unit: seconds + help: Total user and system CPU time spent in seconds. + labels: + - name: sandbox_id + desc: "" + manually_edit: false + fixed: false + values: [] + since: 2.0.0 + - name: kata_shim_process_max_fds + type: GAUGE + unit: "" + help: Maximum number of open file descriptors. + labels: + - name: sandbox_id + desc: "" + manually_edit: false + fixed: false + values: [] + since: 2.0.0 + - name: kata_shim_process_open_fds + type: GAUGE + unit: "" + help: Number of open file descriptors. + labels: + - name: sandbox_id + desc: "" + manually_edit: false + fixed: false + values: [] + since: 2.0.0 + - name: kata_shim_process_resident_memory_bytes + type: GAUGE + unit: bytes + help: Resident memory size in bytes. + labels: + - name: sandbox_id + desc: "" + manually_edit: false + fixed: false + values: [] + since: 2.0.0 + - name: kata_shim_process_start_time_seconds + type: GAUGE + unit: seconds + help: Start time of the process since unix epoch in seconds. + labels: + - name: sandbox_id + desc: "" + manually_edit: false + fixed: false + values: [] + since: 2.0.0 + - name: kata_shim_process_virtual_memory_bytes + type: GAUGE + unit: bytes + help: Virtual memory size in bytes. + labels: + - name: sandbox_id + desc: "" + manually_edit: false + fixed: false + values: [] + since: 2.0.0 + - name: kata_shim_process_virtual_memory_max_bytes + type: GAUGE + unit: bytes + help: Maximum amount of virtual memory available in bytes. + labels: + - name: sandbox_id + desc: "" + manually_edit: false + fixed: false + values: [] + since: 2.0.0 + - name: kata_shim_rpc_durations_histogram_milliseconds + type: HISTOGRAM + unit: milliseconds + help: RPC latency distributions. + labels: + - name: action + desc: Kata shim v2 actions + manually_edit: true + fixed: true + values: + - value: checkpoint + desc: "" + - value: close_io + desc: "" + - value: connect + desc: "" + - value: create + desc: "" + - value: delete + desc: "" + - value: exec + desc: "" + - value: kill + desc: "" + - value: pause + desc: "" + - value: pids + desc: "" + - value: resize_pty + desc: "" + - value: resume + desc: "" + - value: shutdown + desc: "" + - value: start + desc: "" + - value: state + desc: "" + - value: stats + desc: "" + - value: update + desc: "" + - value: wait + desc: "" + - name: sandbox_id + desc: "" + manually_edit: false + fixed: false + values: [] + since: 2.0.0 + - name: kata_shim_threads + type: GAUGE + unit: "" + help: Kata containerd shim v2 process threads. + labels: + - name: sandbox_id + desc: "" + manually_edit: false + fixed: false + values: [] + since: 2.0.0 diff --git a/docs/design/kata-2-0-metrics.md b/docs/design/kata-2-0-metrics.md new file mode 100644 index 0000000000..72321d81bc --- /dev/null +++ b/docs/design/kata-2-0-metrics.md @@ -0,0 +1,324 @@ +# Kata 2.0 Metrics Design + +* [Limitations of Kata 1.x and the target of Kata 2.0](#limitations-of-kata-1x-and-the-target-of-kata-20) +* [Metrics architecture](#metrics-architecture) + * [Kata monitor](#kata-monitor) + * [Kata runtime](#kata-runtime) + * [Kata agent](#kata-agent) + * [Performance and overhead](#performance-and-overhead) +* [Metrics list](#metrics-list) + * [Metric types](#metric-types) + * [Kata agent metrics](#kata-agent-metrics) + * [Kata guest OS metrics](#kata-guest-os-metrics) + * [Hypervisor metrics](#hypervisor-metrics) + * [Kata monitor metrics](#kata-monitor-metrics) + * [Kata containerd shim v2 metrics](#kata-containerd-shim-v2-metrics) + +Kata implement CRI's API and support [`ContainerStats`](https://github.com/kubernetes/kubernetes/blob/release-1.18/staging/src/k8s.io/cri-api/pkg/apis/runtime/v1alpha2/api.proto#L101) and [`ListContainerStats`](https://github.com/kubernetes/kubernetes/blob/release-1.18/staging/src/k8s.io/cri-api/pkg/apis/runtime/v1alpha2/api.proto#L103) interfaces to expose containers metrics. User can use these interface to get basic metrics about container. + +But unlike `runc`, Kata is a VM-based runtime and has a different architecture. + +## Limitations of Kata 1.x and the target of Kata 2.0 + +Kata 1.x has a number of limitations related to observability that may be obstacles to running Kata Containers at scale. + +In Kata 2.0, the following components will be able to provide more details about the system. + +- containerd shim v2 (effectively `kata-runtime`) +- Hypervisor statistics +- Agent process +- Guest OS statistics + +> **Note**: In Kata 1.x, the main user-facing component was the runtime (`kata-runtime`). From 1.5, Kata then introduced the Kata containerd shim v2 (`containerd-shim-kata-v2`) which is essentially a modified runtime that is loaded by containerd to simplify and improve the way VM-based containers are created and managed. +> +> For Kata 2.0, the main component is the Kata containerd shim v2, although the deprecated `kata-runtime` binary will be maintained for a period of time. +> +> Any mention of the "Kata runtime" in this document should be taken to refer to the Kata containerd shim v2 unless explicitly noted otherwise (for example by referring to it explicitly as the `kata-runtime` binary). + +## Metrics architecture + +Kata 2.0 metrics strongly depend on [Prometheus](https://prometheus.io/), a graduated project from CNCF. + +Kata Containers 2.0 introduces a new Kata component called `kata-monitor` which is used to monitor the other Kata components on the host. It's the monitor interface with Kata runtime, and we can do something like these: + +- Get metrics +- Get events + +In this document we will cover metrics only. And until now it only supports metrics function. + +This is the architecture overview metrics in Kata Containers 2.0. + +![Kata Containers 2.0 metrics](arch-images/kata-2-metrics.png) + + +And the sequence diagram is shown below: + +![Kata Containers 2.0 metrics ](arch-images/kata-metrics-sequence-diagram.png) + +For a quick evaluation, you can check out [this how to](../how-to/how-to-set-prometheus-in-k8s.md). + +### Kata monitor + +`kata-monitor` is a management agent on one node, where many Kata containers are running. `kata-monitor`'s work include: + +> **Note**: node is a single host system or a node in K8s clusters. + +- Aggregate sandbox metrics running on this node, and add `sandbox_id` label +- As a Prometheus target, all metrics from Kata shim on this node will be collected by Prometheus indirectly. This can easy the targets count in Prometheus, and also need not to expose shim's metrics by `ip:port` + +Only one `kata-monitor` process are running on one node. + +`kata-monitor` is using a different communication channel other than that `conatinerd` communicating with Kata shim, and Kata shim listen on a new socket address for communicating with `kata-monitor`. + +The way `kata-monitor` get shim's metrics socket file(`monitor_address`) like that `containerd` get shim address. The socket is an abstract socket and saved as file `abstract` with the same directory of `address` for `containerd`. + +> **Note**: If there is no Prometheus server is configured, i.e., there is no scrape operations, `kata-monitor` will do nothing initiative. + +### Kata runtime + +Runtime is responsible for: + +- Gather metrics about shim process +- Gather metrics about hypervisor process +- Gather metrics about running sandbox +- Get metrics from Kata agent(through `ttrpc`) + +### Kata agent + +Agent is responsible for: + +- Gather agent process metrics +- Gather guest OS metrics + +And in Kata 2.0, agent will add a new interface: + +```protobuf +rpc GetMetrics(GetMetricsRequest) returns (Metrics); + +message GetMetricsRequest {} + +message Metrics { + string metrics = 1; +} + +``` + +The `metrics` field is Prometheus encoded content. This can avoid defining a fixed structure in protocol buffers. + +### Performance and overhead + +Metrics should not become the bottleneck of system, downgrade the performance, and run with minimal overhead. + +Requirements: + +* Metrics **MUST** be quick to collect +* Metrics **MUST** be small. +* Metrics **MUST** be generated only if there are subscribers to the Kata metrics service +* Metrics **MUST** be stateless + +In Kata 2.0, metrics are collected mainly from `/proc` filesystem, and consumed by Prometheus, based on a pull mode, that is mean if there is no Prometheus collector is running, so there will be zero overhead if nobody cares the metrics. + +Metrics service also doesn't hold any metrics in memory. + +|\*|No Sandbox | 1 Sandbox | 2 Sandboxes | +|---|---|---|---| +|Metrics count| 39 | 106 | 173 | +|Metrics size(bytes)| 9K | 144K | 283K | +|Metrics size(`gzipped`, bytes)| 2K | 10K | 17K | + +*Metrics size*: Response size of one Prometheus scrape request. + +It's easy to estimated that if there are 10 sandboxes running in the host, the size of one metrics fetch request issued by Prometheus will be about to 9 + (144 - 9) * 10 = 1.35M (not `gzipped`) or 2 + (10 - 2) * 10 = 82K (`gzipped`). Of course Prometheus support `gzip` compression, that can reduce the response size of every request. + +And here is some test data: + +- End-to-end (from Prometheus server to `kata-monitor` and `kata-monitor` write response back): 20ms(avg) +- Agent(RPC all from shim to agent): 3ms(avg) + +Test infrastructure: + +- OS: Ubuntu 20.04 +- Hardware: Intel(R) Core(TM) i5-8500 CPU @ 3.00GHz, 6 Cores, and 16GB memory. + +**Scrape interval** + +Prometheus default `scrape_interval` is 1 minute, and usually it is set to 15s. Small `scrape_interval` will cause more overhead, so user should set it on monitor demand. + +## Metrics list + +Here listed is all supported metrics by Kata 2.0. Some metrics is dependent on guest kernels in the VM, so there may be some different by your environment. + +Metrics is categorized by component where metrics are collected from and for. + +* [Metric types](#metric-types) +* [Kata agent metrics](#kata-agent-metrics) +* [Kata guest OS metrics](#kata-guest-os-metrics) +* [Hypervisor metrics](#hypervisor-metrics) +* [Kata monitor metrics](#kata-monitor-metrics) +* [Kata containerd shim v2 metrics](#kata-containerd-shim-v2-metrics) + +> **Note**: +> * Labels here are not include `instance` and `job` labels that added by Prometheus. +> * Notes about metrics unit +> * `Kibibytes`, abbreviated `KiB`. 1 `KiB` equals 1024 B. +> * For some metrics (like network devices statistics from file `/proc/net/dev`), unit is depend on label( for example `recv_bytes` and `recv_packets` are having different units). +> * Most of these metrics is collected from `/proc` filesystem, so the unit of metrics are keeping the same unit as `/proc`. See the `proc(5)` manual page for further details. + +### Metric types + +Prometheus offer four core metric types. + +- Counter: A counter is a cumulative metric that represents a single monotonically increasing counter whose value can only increase. + +- Gauge: A gauge metric represents a single numerical value that can go up and down, typically used for measured values like current memory usage. + +- Histogram: A histogram samples observations (usually things like request durations or response sizes) and counts them in configurable buckets. + +- Summary: A summary samples observations like histogram, it can calculate configurable quantiles over a sliding time window. + +See [Prometheus metric types](https://prometheus.io/docs/concepts/metric_types/) for detailed explanations about these metric types. + +### Kata agent metrics + +Agent's metrics contains metrics about agent process. + +| Metric name | Type | Units | Labels | Introduced in Kata version | +|---|---|---|---|---| +| `kata_agent_io_stat`:
Agent process IO stat. | `GAUGE` | |
  • `item` (see `/proc//io`)
    • `cancelled_write_byte`
    • `rchar`
    • `read_bytes`
    • `syscr`
    • `syscw`
    • `wchar`
    • `write_bytes`
  • `sandbox_id`
| 2.0.0 | +| `kata_agent_proc_stat`:
Agent process stat. | `GAUGE` | |
  • `item` (see `/proc//stat`)
    • `cstime`
    • `cutime`
    • `stime`
    • `utime`
  • `sandbox_id`
| 2.0.0 | +| `kata_agent_proc_status`:
Agent process status. | `GAUGE` | |
  • `item` (see `/proc//status`)
    • `hugetlbpages`
    • `nonvoluntary_ctxt_switches`
    • `rssanon`
    • `rssfile`
    • `rssshmem`
    • `vmdata`
    • `vmexe`
    • `vmhwm`
    • `vmlck`
    • `vmlib`
    • `vmpeak`
    • `vmpin`
    • `vmpte`
    • `vmrss`
    • `vmsize`
    • `vmstk`
    • `vmswap`
    • `voluntary_ctxt_switches`
  • `sandbox_id`
| 2.0.0 | +| `kata_agent_process_cpu_seconds_total`:
Total user and system CPU time spent in seconds. | `COUNTER` | `seconds` |
  • `sandbox_id`
| 2.0.0 | +| `kata_agent_process_max_fds`:
Maximum number of open file descriptors. | `GAUGE` | |
  • `sandbox_id`
| 2.0.0 | +| `kata_agent_process_open_fds`:
Number of open file descriptors. | `GAUGE` | |
  • `sandbox_id`
| 2.0.0 | +| `kata_agent_process_resident_memory_bytes`:
Resident memory size in bytes. | `GAUGE` | `bytes` |
  • `sandbox_id`
| 2.0.0 | +| `kata_agent_process_start_time_seconds`:
Start time of the process since `unix` epoch in seconds. | `GAUGE` | `seconds` |
  • `sandbox_id`
| 2.0.0 | +| `kata_agent_process_virtual_memory_bytes`:
Virtual memory size in bytes. | `GAUGE` | `bytes` |
  • `sandbox_id`
| 2.0.0 | +| `kata_agent_scrape_count`:
Metrics scrape count | `COUNTER` | |
  • `sandbox_id`
| 2.0.0 | +| `kata_agent_total_rss`:
Agent process total `rss` size | `GAUGE` | |
  • `sandbox_id`
| 2.0.0 | +| `kata_agent_total_time`:
Agent process total time | `GAUGE` | |
  • `sandbox_id`
| 2.0.0 | +| `kata_agent_total_vm`:
Agent process total `vm` size | `GAUGE` | |
  • `sandbox_id`
| 2.0.0 | + +### Kata guest OS metrics + +Guest OS's metrics in hypervisor. + +| Metric name | Type | Units | Labels | Introduced in Kata version | +|---|---|---|---|---| +| `kata_guest_cpu_time`:
Guest CPU stat. | `GAUGE` | |
  • `cpu` (CPU no. and total for all CPUs)
    • `0` (CPU 0)
    • `1` (CPU 1)
    • `total` (for all CPUs)
  • `item` (Kernel/system statistics, from `/proc/stat`)
    • `guest`
    • `guest_nice`
    • `idle`
    • `iowait`
    • `irq`
    • `nice`
    • `softirq`
    • `steal`
    • `system`
    • `user`
  • `sandbox_id`
| 2.0.0 | +| `kata_guest_diskstat`:
Disks stat in system. | `GAUGE` | |
  • `disk` (disk name)
  • `item` (see `/proc/diskstats`)
    • `discards`
    • `discards_merged`
    • `flushes`
    • `in_progress`
    • `merged`
    • `reads`
    • `sectors_discarded`
    • `sectors_read`
    • `sectors_written`
    • `time_discarding`
    • `time_flushing`
    • `time_in_progress`
    • `time_reading`
    • `time_writing`
    • `weighted_time_in_progress`
    • `writes`
    • `writes_merged`
  • `sandbox_id`
| 2.0.0 | +| `kata_guest_load`:
Guest system load. | `GAUGE` | |
  • `item`
    • `load1`
    • `load15`
    • `load5`
  • `sandbox_id`
| 2.0.0 | +| `kata_guest_meminfo`:
Statistics about memory usage on the system. | `GAUGE` | |
  • `item` (see `/proc/meminfo`)
    • `active`
    • `active_anon`
    • `active_file`
    • `anon_hugepages`
    • `anon_pages`
    • `bounce`
    • `buffers`
    • `cached`
    • `cma_free`
    • `cma_total`
    • `commit_limit`
    • `committed_as`
    • `direct_map_1G`
    • `direct_map_2M`
    • `direct_map_4M`
    • `direct_map_4k`
    • `dirty`
    • `hardware_corrupted`
    • `high_free`
    • `high_total`
    • `hugepages_free`
    • `hugepages_rsvd`
    • `hugepages_surp`
    • `hugepages_total`
    • `hugepagesize`
    • `hugetlb`
    • `inactive`
    • `inactive_anon`
    • `inactive_file`
    • `k_reclaimable`
    • `kernel_stack`
    • `low_free`
    • `low_total`
    • `mapped`
    • `mem_available`
    • `mem_free`
    • `mem_total`
    • `mlocked`
    • `mmap_copy`
    • `nfs_unstable`
    • `page_tables`
    • `per_cpu`
    • `quicklists`
    • `s_reclaimable`
    • `s_unreclaim`
    • `shmem`
    • `shmem_hugepages`
    • `shmem_pmd_mapped`
    • `slab`
    • `swap_cached`
    • `swap_free`
    • `swap_total`
    • `unevictable`
    • `vmalloc_chunk`
    • `vmalloc_total`
    • `vmalloc_used`
    • `writeback`
    • `writeback_tmp`
  • `sandbox_id`
| 2.0.0 | +| `kata_guest_netdev_stat`:
Guest net devices stats. | `GAUGE` | |
  • `interface` (network device name)
  • `item` (see `/proc/net/dev`)
    • `recv_bytes`
    • `recv_compressed`
    • `recv_drop`
    • `recv_errs`
    • `recv_fifo`
    • `recv_frame`
    • `recv_multicast`
    • `recv_packets`
    • `sent_bytes`
    • `sent_carrier`
    • `sent_colls`
    • `sent_compressed`
    • `sent_drop`
    • `sent_errs`
    • `sent_fifo`
    • `sent_packets`
  • `sandbox_id`
| 2.0.0 | +| `kata_guest_tasks`:
Guest system load. | `GAUGE` | |
  • `item`
    • `cur`
    • `max`
  • `sandbox_id`
| 2.0.0 | +| `kata_guest_vm_stat`:
Guest virtual memory stat. | `GAUGE` | |
  • `item` (see `/proc/vmstat`)
    • `allocstall_dma`
    • `allocstall_dma32`
    • `allocstall_movable`
    • `allocstall_normal`
    • `balloon_deflate`
    • `balloon_inflate`
    • `compact_daemon_free_scanned`
    • `compact_daemon_migrate_scanned`
    • `compact_daemon_wake`
    • `compact_fail`
    • `compact_free_scanned`
    • `compact_isolated`
    • `compact_migrate_scanned`
    • `compact_stall`
    • `compact_success`
    • `drop_pagecache`
    • `drop_slab`
    • `htlb_buddy_alloc_fail`
    • `htlb_buddy_alloc_success`
    • `kswapd_high_wmark_hit_quickly`
    • `kswapd_inodesteal`
    • `kswapd_low_wmark_hit_quickly`
    • `nr_active_anon`
    • `nr_active_file`
    • `nr_anon_pages`
    • `nr_anon_transparent_hugepages`
    • `nr_bounce`
    • `nr_dirtied`
    • `nr_dirty`
    • `nr_dirty_background_threshold`
    • `nr_dirty_threshold`
    • `nr_file_pages`
    • `nr_free_cma`
    • `nr_free_pages`
    • `nr_inactive_anon`
    • `nr_inactive_file`
    • `nr_isolated_anon`
    • `nr_isolated_file`
    • `nr_kernel_stack`
    • `nr_mapped`
    • `nr_mlock`
    • `nr_page_table_pages`
    • `nr_shmem`
    • `nr_shmem_hugepages`
    • `nr_shmem_pmdmapped`
    • `nr_slab_reclaimable`
    • `nr_slab_unreclaimable`
    • `nr_unevictable`
    • `nr_unstable`
    • `nr_vmscan_immediate_reclaim`
    • `nr_vmscan_write`
    • `nr_writeback`
    • `nr_writeback_temp`
    • `nr_written`
    • `nr_zone_active_anon`
    • `nr_zone_active_file`
    • `nr_zone_inactive_anon`
    • `nr_zone_inactive_file`
    • `nr_zone_unevictable`
    • `nr_zone_write_pending`
    • `oom_kill`
    • `pageoutrun`
    • `pgactivate`
    • `pgalloc_dma`
    • `pgalloc_dma32`
    • `pgalloc_movable`
    • `pgalloc_normal`
    • `pgdeactivate`
    • `pgfault`
    • `pgfree`
    • `pginodesteal`
    • `pglazyfree`
    • `pglazyfreed`
    • `pgmajfault`
    • `pgmigrate_fail`
    • `pgmigrate_success`
    • `pgpgin`
    • `pgpgout`
    • `pgrefill`
    • `pgrotated`
    • `pgscan_direct`
    • `pgscan_direct_throttle`
    • `pgscan_kswapd`
    • `pgskip_dma`
    • `pgskip_dma32`
    • `pgskip_movable`
    • `pgskip_normal`
    • `pgsteal_direct`
    • `pgsteal_kswapd`
    • `pswpin`
    • `pswpout`
    • `slabs_scanned`
    • `swap_ra`
    • `swap_ra_hit`
    • `unevictable_pgs_cleared`
    • `unevictable_pgs_culled`
    • `unevictable_pgs_mlocked`
    • `unevictable_pgs_munlocked`
    • `unevictable_pgs_rescued`
    • `unevictable_pgs_scanned`
    • `unevictable_pgs_stranded`
    • `workingset_activate`
    • `workingset_nodereclaim`
    • `workingset_refault`
  • `sandbox_id`
| 2.0.0 | + +### Hypervisor metrics + +Hypervisors metrics, collected mainly from `proc` filesystem of hypervisor process. + +| Metric name | Type | Units | Labels | Introduced in Kata version | +|---|---|---|---|---| +| `kata_hypervisor_fds`:
Open FDs for hypervisor. | `GAUGE` | |
  • `sandbox_id`
| 2.0.0 | +| `kata_hypervisor_io_stat`:
Process IO statistics. | `GAUGE` | |
  • `item` (see `/proc//io`)
    • `cancelledwritebytes`
    • `rchar`
    • `readbytes`
    • `syscr`
    • `syscw`
    • `wchar`
    • `writebytes`
  • `sandbox_id`
| 2.0.0 | +| `kata_hypervisor_netdev`:
Net devices statistics. | `GAUGE` | |
  • `interface` (network device name)
  • `item` (see `/proc/net/dev`)
    • `recv_bytes`
    • `recv_compressed`
    • `recv_drop`
    • `recv_errs`
    • `recv_fifo`
    • `recv_frame`
    • `recv_multicast`
    • `recv_packets`
    • `sent_bytes`
    • `sent_carrier`
    • `sent_colls`
    • `sent_compressed`
    • `sent_drop`
    • `sent_errs`
    • `sent_fifo`
    • `sent_packets`
  • `sandbox_id`
| 2.0.0 | +| `kata_hypervisor_proc_stat`:
Hypervisor process statistics. | `GAUGE` | |
  • `item` (see `/proc//stat`)
    • `cstime`
    • `cutime`
    • `stime`
    • `utime`
  • `sandbox_id`
| 2.0.0 | +| `kata_hypervisor_proc_status`:
Hypervisor process status. | `GAUGE` | |
  • `item` (see `/proc//status`)
    • `hugetlbpages`
    • `nonvoluntary_ctxt_switches`
    • `rssanon`
    • `rssfile`
    • `rssshmem`
    • `vmdata`
    • `vmexe`
    • `vmhwm`
    • `vmlck`
    • `vmlib`
    • `vmpeak`
    • `vmpin`
    • `vmpmd`
    • `vmpte`
    • `vmrss`
    • `vmsize`
    • `vmstk`
    • `vmswap`
    • `voluntary_ctxt_switches`
  • `sandbox_id`
| 2.0.0 | +| `kata_hypervisor_threads`:
Hypervisor process threads. | `GAUGE` | |
  • `sandbox_id`
| 2.0.0 | + +### Kata monitor metrics + +Metrics about monitor itself. + +| Metric name | Type | Units | Labels | Introduced in Kata version | +|---|---|---|---|---| +| `kata_monitor_go_gc_duration_seconds`:
A summary of the pause duration of garbage collection cycles. | `SUMMARY` | `seconds` | | 2.0.0 | +| `kata_monitor_go_goroutines`:
Number of goroutines that currently exist. | `GAUGE` | | | 2.0.0 | +| `kata_monitor_go_info`:
Information about the Go environment. | `GAUGE` | |
  • `version` (golang version)
    • `go1.13.9` (environment dependent variable)
| 2.0.0 | +| `kata_monitor_go_memstats_alloc_bytes`:
Number of bytes allocated and still in use. | `GAUGE` | `bytes` | | 2.0.0 | +| `kata_monitor_go_memstats_alloc_bytes_total`:
Total number of bytes allocated, even if freed. | `COUNTER` | `bytes` | | 2.0.0 | +| `kata_monitor_go_memstats_buck_hash_sys_bytes`:
Number of bytes used by the profiling bucket hash table. | `GAUGE` | `bytes` | | 2.0.0 | +| `kata_monitor_go_memstats_frees_total`:
Total number of frees. | `COUNTER` | | | 2.0.0 | +| `kata_monitor_go_memstats_gc_cpu_fraction`:
The fraction of this program's available CPU time used by the GC since the program started. | `GAUGE` | | | 2.0.0 | +| `kata_monitor_go_memstats_gc_sys_bytes`:
Number of bytes used for garbage collection system metadata. | `GAUGE` | `bytes` | | 2.0.0 | +| `kata_monitor_go_memstats_heap_alloc_bytes`:
Number of heap bytes allocated and still in use. | `GAUGE` | `bytes` | | 2.0.0 | +| `kata_monitor_go_memstats_heap_idle_bytes`:
Number of heap bytes waiting to be used. | `GAUGE` | `bytes` | | 2.0.0 | +| `kata_monitor_go_memstats_heap_inuse_bytes`:
Number of heap bytes that are in use. | `GAUGE` | `bytes` | | 2.0.0 | +| `kata_monitor_go_memstats_heap_objects`:
Number of allocated objects. | `GAUGE` | | | 2.0.0 | +| `kata_monitor_go_memstats_heap_released_bytes`:
Number of heap bytes released to OS. | `GAUGE` | `bytes` | | 2.0.0 | +| `kata_monitor_go_memstats_heap_sys_bytes`:
Number of heap bytes obtained from system. | `GAUGE` | `bytes` | | 2.0.0 | +| `kata_monitor_go_memstats_last_gc_time_seconds`:
Number of seconds since 1970 of last garbage collection. | `GAUGE` | `seconds` | | 2.0.0 | +| `kata_monitor_go_memstats_lookups_total`:
Total number of pointer lookups. | `COUNTER` | | | 2.0.0 | +| `kata_monitor_go_memstats_mallocs_total`:
Total number of `mallocs`. | `COUNTER` | | | 2.0.0 | +| `kata_monitor_go_memstats_mcache_inuse_bytes`:
Number of bytes in use by `mcache` structures. | `GAUGE` | `bytes` | | 2.0.0 | +| `kata_monitor_go_memstats_mcache_sys_bytes`:
Number of bytes used for `mcache` structures obtained from system. | `GAUGE` | `bytes` | | 2.0.0 | +| `kata_monitor_go_memstats_mspan_inuse_bytes`:
Number of bytes in use by `mspan` structures. | `GAUGE` | `bytes` | | 2.0.0 | +| `kata_monitor_go_memstats_mspan_sys_bytes`:
Number of bytes used for `mspan` structures obtained from system. | `GAUGE` | `bytes` | | 2.0.0 | +| `kata_monitor_go_memstats_next_gc_bytes`:
Number of heap bytes when next garbage collection will take place. | `GAUGE` | `bytes` | | 2.0.0 | +| `kata_monitor_go_memstats_other_sys_bytes`:
Number of bytes used for other system allocations. | `GAUGE` | `bytes` | | 2.0.0 | +| `kata_monitor_go_memstats_stack_inuse_bytes`:
Number of bytes in use by the stack allocator. | `GAUGE` | `bytes` | | 2.0.0 | +| `kata_monitor_go_memstats_stack_sys_bytes`:
Number of bytes obtained from system for stack allocator. | `GAUGE` | `bytes` | | 2.0.0 | +| `kata_monitor_go_memstats_sys_bytes`:
Number of bytes obtained from system. | `GAUGE` | `bytes` | | 2.0.0 | +| `kata_monitor_go_threads`:
Number of OS threads created. | `GAUGE` | | | 2.0.0 | +| `kata_monitor_process_cpu_seconds_total`:
Total user and system CPU time spent in seconds. | `COUNTER` | `seconds` | | 2.0.0 | +| `kata_monitor_process_max_fds`:
Maximum number of open file descriptors. | `GAUGE` | | | 2.0.0 | +| `kata_monitor_process_open_fds`:
Number of open file descriptors. | `GAUGE` | | | 2.0.0 | +| `kata_monitor_process_resident_memory_bytes`:
Resident memory size in bytes. | `GAUGE` | `bytes` | | 2.0.0 | +| `kata_monitor_process_start_time_seconds`:
Start time of the process since `unix` epoch in seconds. | `GAUGE` | `seconds` | | 2.0.0 | +| `kata_monitor_process_virtual_memory_bytes`:
Virtual memory size in bytes. | `GAUGE` | `bytes` | | 2.0.0 | +| `kata_monitor_process_virtual_memory_max_bytes`:
Maximum amount of virtual memory available in bytes. | `GAUGE` | `bytes` | | 2.0.0 | +| `kata_monitor_running_shim_count`:
Running shim count(running sandboxes). | `GAUGE` | | | 2.0.0 | +| `kata_monitor_scrape_count`:
Scape count. | `COUNTER` | | | 2.0.0 | +| `kata_monitor_scrape_durations_histogram_milliseconds`:
Time used to scrape from shims | `HISTOGRAM` | `milliseconds` | | 2.0.0 | +| `kata_monitor_scrape_failed_count`:
Failed scape count. | `COUNTER` | | | 2.0.0 | + +### Kata containerd shim v2 metrics + +Metrics about Kata containerd shim v2 process. + +| Metric name | Type | Units | Labels | Introduced in Kata version | +|---|---|---|---|---| +| `kata_shim_agent_rpc_durations_histogram_milliseconds`:
RPC latency distributions. | `HISTOGRAM` | `milliseconds` |
  • `action` (RPC actions of Kata agent)
    • `grpc.CheckRequest`
    • `grpc.CloseStdinRequest`
    • `grpc.CopyFileRequest`
    • `grpc.CreateContainerRequest`
    • `grpc.CreateSandboxRequest`
    • `grpc.DestroySandboxRequest`
    • `grpc.ExecProcessRequest`
    • `grpc.GetMetricsRequest`
    • `grpc.GuestDetailsRequest`
    • `grpc.ListInterfacesRequest`
    • `grpc.ListProcessesRequest`
    • `grpc.ListRoutesRequest`
    • `grpc.MemHotplugByProbeRequest`
    • `grpc.OnlineCPUMemRequest`
    • `grpc.PauseContainerRequest`
    • `grpc.RemoveContainerRequest`
    • `grpc.ReseedRandomDevRequest`
    • `grpc.ResumeContainerRequest`
    • `grpc.SetGuestDateTimeRequest`
    • `grpc.SignalProcessRequest`
    • `grpc.StartContainerRequest`
    • `grpc.StartTracingRequest`
    • `grpc.StatsContainerRequest`
    • `grpc.StopTracingRequest`
    • `grpc.TtyWinResizeRequest`
    • `grpc.UpdateContainerRequest`
    • `grpc.UpdateInterfaceRequest`
    • `grpc.UpdateRoutesRequest`
    • `grpc.WaitProcessRequest`
    • `grpc.WriteStreamRequest`
  • `sandbox_id`
| 2.0.0 | +| `kata_shim_fds`:
Kata containerd shim v2 open FDs. | `GAUGE` | |
  • `sandbox_id`
| 2.0.0 | +| `kata_shim_go_gc_duration_seconds`:
A summary of the pause duration of garbage collection cycles. | `SUMMARY` | `seconds` |
  • `sandbox_id`
| 2.0.0 | +| `kata_shim_go_goroutines`:
Number of goroutines that currently exist. | `GAUGE` | |
  • `sandbox_id`
| 2.0.0 | +| `kata_shim_go_info`:
Information about the Go environment. | `GAUGE` | |
  • `sandbox_id`
  • `version` (golang version)
    • `go1.13.9` (environment dependent variable)
| 2.0.0 | +| `kata_shim_go_memstats_alloc_bytes`:
Number of bytes allocated and still in use. | `GAUGE` | `bytes` |
  • `sandbox_id`
| 2.0.0 | +| `kata_shim_go_memstats_alloc_bytes_total`:
Total number of bytes allocated, even if freed. | `COUNTER` | `bytes` |
  • `sandbox_id`
| 2.0.0 | +| `kata_shim_go_memstats_buck_hash_sys_bytes`:
Number of bytes used by the profiling bucket hash table. | `GAUGE` | `bytes` |
  • `sandbox_id`
| 2.0.0 | +| `kata_shim_go_memstats_frees_total`:
Total number of frees. | `COUNTER` | |
  • `sandbox_id`
| 2.0.0 | +| `kata_shim_go_memstats_gc_cpu_fraction`:
The fraction of this program's available CPU time used by the GC since the program started. | `GAUGE` | |
  • `sandbox_id`
| 2.0.0 | +| `kata_shim_go_memstats_gc_sys_bytes`:
Number of bytes used for garbage collection system metadata. | `GAUGE` | `bytes` |
  • `sandbox_id`
| 2.0.0 | +| `kata_shim_go_memstats_heap_alloc_bytes`:
Number of heap bytes allocated and still in use. | `GAUGE` | `bytes` |
  • `sandbox_id`
| 2.0.0 | +| `kata_shim_go_memstats_heap_idle_bytes`:
Number of heap bytes waiting to be used. | `GAUGE` | `bytes` |
  • `sandbox_id`
| 2.0.0 | +| `kata_shim_go_memstats_heap_inuse_bytes`:
Number of heap bytes that are in use. | `GAUGE` | `bytes` |
  • `sandbox_id`
| 2.0.0 | +| `kata_shim_go_memstats_heap_objects`:
Number of allocated objects. | `GAUGE` | |
  • `sandbox_id`
| 2.0.0 | +| `kata_shim_go_memstats_heap_released_bytes`:
Number of heap bytes released to OS. | `GAUGE` | `bytes` |
  • `sandbox_id`
| 2.0.0 | +| `kata_shim_go_memstats_heap_sys_bytes`:
Number of heap bytes obtained from system. | `GAUGE` | `bytes` |
  • `sandbox_id`
| 2.0.0 | +| `kata_shim_go_memstats_last_gc_time_seconds`:
Number of seconds since 1970 of last garbage collection. | `GAUGE` | `seconds` |
  • `sandbox_id`
| 2.0.0 | +| `kata_shim_go_memstats_lookups_total`:
Total number of pointer lookups. | `COUNTER` | |
  • `sandbox_id`
| 2.0.0 | +| `kata_shim_go_memstats_mallocs_total`:
Total number of `mallocs`. | `COUNTER` | |
  • `sandbox_id`
| 2.0.0 | +| `kata_shim_go_memstats_mcache_inuse_bytes`:
Number of bytes in use by `mcache` structures. | `GAUGE` | `bytes` |
  • `sandbox_id`
| 2.0.0 | +| `kata_shim_go_memstats_mcache_sys_bytes`:
Number of bytes used for `mcache` structures obtained from system. | `GAUGE` | `bytes` |
  • `sandbox_id`
| 2.0.0 | +| `kata_shim_go_memstats_mspan_inuse_bytes`:
Number of bytes in use by `mspan` structures. | `GAUGE` | `bytes` |
  • `sandbox_id`
| 2.0.0 | +| `kata_shim_go_memstats_mspan_sys_bytes`:
Number of bytes used for `mspan` structures obtained from system. | `GAUGE` | `bytes` |
  • `sandbox_id`
| 2.0.0 | +| `kata_shim_go_memstats_next_gc_bytes`:
Number of heap bytes when next garbage collection will take place. | `GAUGE` | `bytes` |
  • `sandbox_id`
| 2.0.0 | +| `kata_shim_go_memstats_other_sys_bytes`:
Number of bytes used for other system allocations. | `GAUGE` | `bytes` |
  • `sandbox_id`
| 2.0.0 | +| `kata_shim_go_memstats_stack_inuse_bytes`:
Number of bytes in use by the stack allocator. | `GAUGE` | `bytes` |
  • `sandbox_id`
| 2.0.0 | +| `kata_shim_go_memstats_stack_sys_bytes`:
Number of bytes obtained from system for stack allocator. | `GAUGE` | `bytes` |
  • `sandbox_id`
| 2.0.0 | +| `kata_shim_go_memstats_sys_bytes`:
Number of bytes obtained from system. | `GAUGE` | `bytes` |
  • `sandbox_id`
| 2.0.0 | +| `kata_shim_go_threads`:
Number of OS threads created. | `GAUGE` | |
  • `sandbox_id`
| 2.0.0 | +| `kata_shim_io_stat`:
Kata containerd shim v2 process IO statistics. | `GAUGE` | |
  • `item` (see `/proc//io`)
    • `cancelledwritebytes`
    • `rchar`
    • `readbytes`
    • `syscr`
    • `syscw`
    • `wchar`
    • `writebytes`
  • `sandbox_id`
| 2.0.0 | +| `kata_shim_netdev`:
Kata containerd shim v2 network devices statistics. | `GAUGE` | |
  • `interface` (network device name)
  • `item` (see `/proc/net/dev`)
    • `recv_bytes`
    • `recv_compressed`
    • `recv_drop`
    • `recv_errs`
    • `recv_fifo`
    • `recv_frame`
    • `recv_multicast`
    • `recv_packets`
    • `sent_bytes`
    • `sent_carrier`
    • `sent_colls`
    • `sent_compressed`
    • `sent_drop`
    • `sent_errs`
    • `sent_fifo`
    • `sent_packets`
  • `sandbox_id`
| 2.0.0 | +| `kata_shim_proc_stat`:
Kata containerd shim v2 process statistics. | `GAUGE` | |
  • `item` (see `/proc//stat`)
    • `cstime`
    • `cutime`
    • `stime`
    • `utime`
  • `sandbox_id`
| 2.0.0 | +| `kata_shim_proc_status`:
Kata containerd shim v2 process status. | `GAUGE` | |
  • `item` (see `/proc//status`)
    • `hugetlbpages`
    • `nonvoluntary_ctxt_switches`
    • `rssanon`
    • `rssfile`
    • `rssshmem`
    • `vmdata`
    • `vmexe`
    • `vmhwm`
    • `vmlck`
    • `vmlib`
    • `vmpeak`
    • `vmpin`
    • `vmpmd`
    • `vmpte`
    • `vmrss`
    • `vmsize`
    • `vmstk`
    • `vmswap`
    • `voluntary_ctxt_switches`
  • `sandbox_id`
| 2.0.0 | +| `kata_shim_process_cpu_seconds_total`:
Total user and system CPU time spent in seconds. | `COUNTER` | `seconds` |
  • `sandbox_id`
| 2.0.0 | +| `kata_shim_process_max_fds`:
Maximum number of open file descriptors. | `GAUGE` | |
  • `sandbox_id`
| 2.0.0 | +| `kata_shim_process_open_fds`:
Number of open file descriptors. | `GAUGE` | |
  • `sandbox_id`
| 2.0.0 | +| `kata_shim_process_resident_memory_bytes`:
Resident memory size in bytes. | `GAUGE` | `bytes` |
  • `sandbox_id`
| 2.0.0 | +| `kata_shim_process_start_time_seconds`:
Start time of the process since `unix` epoch in seconds. | `GAUGE` | `seconds` |
  • `sandbox_id`
| 2.0.0 | +| `kata_shim_process_virtual_memory_bytes`:
Virtual memory size in bytes. | `GAUGE` | `bytes` |
  • `sandbox_id`
| 2.0.0 | +| `kata_shim_process_virtual_memory_max_bytes`:
Maximum amount of virtual memory available in bytes. | `GAUGE` | `bytes` |
  • `sandbox_id`
| 2.0.0 | +| `kata_shim_rpc_durations_histogram_milliseconds`:
RPC latency distributions. | `HISTOGRAM` | `milliseconds` |
  • `action` (Kata shim v2 actions)
    • `checkpoint`
    • `close_io`
    • `connect`
    • `create`
    • `delete`
    • `exec`
    • `kill`
    • `pause`
    • `pids`
    • `resize_pty`
    • `resume`
    • `shutdown`
    • `start`
    • `state`
    • `stats`
    • `update`
    • `wait`
  • `sandbox_id`
| 2.0.0 | +| `kata_shim_threads`:
Kata containerd shim v2 process threads. | `GAUGE` | |
  • `sandbox_id`
| 2.0.0 | + + diff --git a/docs/how-to/README.md b/docs/how-to/README.md index d8aa528321..2aaec04356 100644 --- a/docs/how-to/README.md +++ b/docs/how-to/README.md @@ -26,3 +26,4 @@ - [How to load kernel modules in Kata Containers](how-to-load-kernel-modules-with-kata.md) - [How to use Kata Containers with `virtio-mem`](how-to-use-virtio-mem-with-kata.md) - [How to set sandbox Kata Containers configurations with pod annotations](how-to-set-sandbox-config-kata.md) +- [How to monitor Kata Containers in K8s](how-to-set-prometheus-in-k8s.md) diff --git a/docs/how-to/data/dashboard.json b/docs/how-to/data/dashboard.json new file mode 100644 index 0000000000..a9d588d04f --- /dev/null +++ b/docs/how-to/data/dashboard.json @@ -0,0 +1,3361 @@ +{ + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": "-- Grafana --", + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "type": "dashboard" + } + ] + }, + "editable": true, + "gnetId": null, + "graphTooltip": 0, + "links": [], + "panels": [ + { + "content": "", + "datasource": null, + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 0 + }, + "id": 42, + "mode": "markdown", + "timeFrom": null, + "timeShift": null, + "title": "Kata monitor", + "type": "text" + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": null, + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 9, + "w": 6, + "x": 0, + "y": 1 + }, + "hiddenSeries": false, + "id": 58, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "null", + "options": { + "dataLinks": [] + }, + "percentage": false, + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "rate(kata_monitor_scrape_count[5m])*60", + "interval": "", + "legendFormat": "", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "scrape count/60s", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": null, + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 9, + "w": 6, + "x": 6, + "y": 1 + }, + "hiddenSeries": false, + "id": 61, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "null", + "options": { + "dataLinks": [] + }, + "percentage": false, + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "kata_monitor_scrape_failed_count", + "interval": "", + "legendFormat": "", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "failed scrape count", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": null, + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 9, + "w": 6, + "x": 12, + "y": 1 + }, + "hiddenSeries": false, + "id": 62, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "null", + "options": { + "dataLinks": [] + }, + "percentage": false, + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "kata_monitor_running_shim_count", + "interval": "", + "legendFormat": "", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Running shims", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": null, + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 9, + "w": 6, + "x": 18, + "y": 1 + }, + "hiddenSeries": false, + "id": 63, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "null", + "options": { + "dataLinks": [] + }, + "percentage": false, + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "histogram_quantile(0.99, sum(rate(kata_monitor_scrape_durations_histogram_milliseconds_bucket[5m])) by (action,le))", + "interval": "", + "legendFormat": "p99", + "refId": "A" + }, + { + "expr": "rate(kata_monitor_scrape_durations_histogram_milliseconds_sum[5m])/rate(kata_monitor_scrape_durations_histogram_milliseconds_count[5m])", + "interval": "", + "legendFormat": "avg", + "refId": "B" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "scrape p99/avg (ms)", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": null, + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 9, + "w": 6, + "x": 0, + "y": 10 + }, + "hiddenSeries": false, + "id": 64, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "null", + "options": { + "dataLinks": [] + }, + "percentage": false, + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "kata_monitor_go_goroutines", + "interval": "", + "legendFormat": "", + "refId": "A" + }, + { + "expr": "kata_monitor_go_threads", + "interval": "", + "legendFormat": "", + "refId": "B" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "go_goroutines", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": null, + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 9, + "w": 6, + "x": 6, + "y": 10 + }, + "hiddenSeries": false, + "id": 65, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "null", + "options": { + "dataLinks": [] + }, + "percentage": false, + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "kata_monitor_process_open_fds", + "interval": "", + "legendFormat": "", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "process_open_fds", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": null, + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 9, + "w": 6, + "x": 12, + "y": 10 + }, + "hiddenSeries": false, + "id": 66, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "null", + "options": { + "dataLinks": [] + }, + "percentage": false, + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "kata_monitor_process_resident_memory_bytes", + "interval": "", + "legendFormat": "", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "process_resident_memory_bytes", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": null, + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 9, + "w": 6, + "x": 18, + "y": 10 + }, + "hiddenSeries": false, + "id": 72, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "null", + "options": { + "dataLinks": [] + }, + "percentage": false, + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "rate(kata_monitor_go_gc_duration_seconds_sum[5m])/rate(kata_monitor_go_gc_duration_seconds_count[5m])", + "interval": "", + "legendFormat": "", + "refId": "B" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "gc duration", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "content": "", + "datasource": null, + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 19 + }, + "id": 73, + "mode": "markdown", + "timeFrom": null, + "timeShift": null, + "title": "Kata shim", + "type": "text" + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": null, + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 6, + "x": 0, + "y": 20 + }, + "hiddenSeries": false, + "id": 12, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "null", + "options": { + "dataLinks": [] + }, + "percentage": false, + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "histogram_quantile(0.99, sum(rate(kata_shim_rpc_durations_histogram_milliseconds_bucket[5m])) by (action,le))", + "hide": false, + "interval": "", + "legendFormat": "", + "refId": "B" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "CRI RPC p99/p95/p90", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": null, + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 6, + "x": 6, + "y": 20 + }, + "hiddenSeries": false, + "id": 75, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "null", + "options": { + "dataLinks": [] + }, + "percentage": false, + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "histogram_quantile(0.99, sum(rate(kata_shim_agent_rpc_durations_histogram_milliseconds_bucket [5m])) by (action,le))", + "interval": "", + "legendFormat": "p99/{{action}}", + "refId": "A" + }, + { + "expr": "histogram_quantile(0.95, sum(rate(kata_shim_agent_rpc_durations_histogram_milliseconds_bucket [5m])) by (action,le))", + "interval": "", + "legendFormat": "p95/{{action}}", + "refId": "B" + }, + { + "expr": "histogram_quantile(0.90, sum(rate(kata_shim_agent_rpc_durations_histogram_milliseconds_bucket [5m])) by (action,le))", + "interval": "", + "legendFormat": "p90/{{action}}", + "refId": "C" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Agent RPC p99/p95/p90", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": null, + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 6, + "x": 12, + "y": 20 + }, + "hiddenSeries": false, + "id": 76, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "null", + "options": { + "dataLinks": [] + }, + "percentage": false, + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "histogram_quantile(0.99, sum(rate(kata_shim_agent_rpc_durations_histogram_milliseconds_bucket{action=~\"grpc.GetMetricsRequest|grpc.CreateContainerRequest|grpc.CreateContainerRequest\"} [5m])) by (action,le))", + "interval": "", + "legendFormat": "p99/{{action}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Agent TOP RPC p99", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": null, + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 6, + "x": 18, + "y": 20 + }, + "hiddenSeries": false, + "id": 77, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "null", + "options": { + "dataLinks": [] + }, + "percentage": false, + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "histogram_quantile(0.99, sum(rate(kata_shim_agent_rpc_durations_histogram_milliseconds_bucket{action=\"grpc.GetMetricsRequest\"} [5m])) by (action,le))", + "interval": "", + "legendFormat": "p99/{{action}}", + "refId": "A" + }, + { + "expr": "histogram_quantile(0.95, sum(rate(kata_shim_agent_rpc_durations_histogram_milliseconds_bucket{action=\"grpc.GetMetricsRequest\"} [5m])) by (action,le))", + "interval": "", + "legendFormat": "p95/{{action}}", + "refId": "B" + }, + { + "expr": "histogram_quantile(0.90, sum(rate(kata_shim_agent_rpc_durations_histogram_milliseconds_bucket{action=\"grpc.GetMetricsRequest\"} [5m])) by (action,le))", + "interval": "", + "legendFormat": "p90/{{action}}", + "refId": "C" + }, + { + "expr": "rate(kata_shim_agent_rpc_durations_histogram_milliseconds_sum{action=\"grpc.GetMetricsRequest\"}[5m])/rate(kata_shim_agent_rpc_durations_histogram_milliseconds_count{action=\"grpc.GetMetricsRequest\"}[5m])", + "interval": "", + "legendFormat": "avg/{{action}}/{{sandbox_id}}", + "refId": "D" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Agent getMetrics RPC p99/p95/p90/avg", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": null, + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 6, + "x": 0, + "y": 28 + }, + "hiddenSeries": false, + "id": 20, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "null", + "options": { + "dataLinks": [] + }, + "percentage": false, + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "kata_shim_netdev", + "interval": "", + "legendFormat": "{{interface}}/{{item}}/{{sandbox_id}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "kata_shim netdev", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": null, + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 6, + "x": 6, + "y": 28 + }, + "hiddenSeries": false, + "id": 4, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "null", + "options": { + "dataLinks": [] + }, + "percentage": false, + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "kata_shim_go_goroutines", + "interval": "", + "legendFormat": "{{sandbox_id}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "goroutines", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": null, + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 6, + "x": 12, + "y": 28 + }, + "hiddenSeries": false, + "id": 22, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "null", + "options": { + "dataLinks": [] + }, + "percentage": false, + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "kata_shim_proc_status{item=\"vmrss\"}", + "interval": "", + "legendFormat": "VmRSS/{{sandbox_id}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "VmRSS", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": null, + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 6, + "x": 18, + "y": 28 + }, + "hiddenSeries": false, + "id": 28, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "null", + "options": { + "dataLinks": [] + }, + "percentage": false, + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "irate(kata_shim_io_stat{item=\"rchar\"}[5m])", + "interval": "", + "legendFormat": "Read/{{sandbox_id}}", + "refId": "A" + }, + { + "expr": "irate(kata_shim_io_stat{item=\"wchar\"}[5m])", + "interval": "", + "legendFormat": "Write/{{sandbox_id}}", + "refId": "B" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "IO stats bytes/s", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": null, + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 6, + "x": 6, + "y": 36 + }, + "hiddenSeries": false, + "id": 24, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "null", + "options": { + "dataLinks": [] + }, + "percentage": false, + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "kata_shim_fds", + "interval": "", + "legendFormat": "{{sandbox_id}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "shim open fds", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": null, + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 6, + "x": 12, + "y": 36 + }, + "hiddenSeries": false, + "id": 52, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "null", + "options": { + "dataLinks": [] + }, + "percentage": false, + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "kata_shim_proc_status", + "interval": "", + "legendFormat": "", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "kata shim proc status", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": null, + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 6, + "x": 18, + "y": 36 + }, + "hiddenSeries": false, + "id": 74, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "null", + "options": { + "dataLinks": [] + }, + "percentage": false, + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "rate(kata_shim_go_gc_duration_seconds_sum[5m])/rate(kata_shim_go_gc_duration_seconds_count[5m])", + "interval": "", + "legendFormat": "", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "gc duration", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "content": "", + "datasource": null, + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 44 + }, + "id": 46, + "mode": "markdown", + "timeFrom": null, + "timeShift": null, + "title": "Kata agent", + "type": "text" + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": null, + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 6, + "x": 0, + "y": 45 + }, + "hiddenSeries": false, + "id": 68, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "null", + "options": { + "dataLinks": [] + }, + "percentage": false, + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "kata_agent_process_open_fds", + "interval": "", + "legendFormat": "", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "kata_agent_process_open_fds", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": null, + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 6, + "x": 6, + "y": 45 + }, + "hiddenSeries": false, + "id": 53, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "null", + "options": { + "dataLinks": [] + }, + "percentage": false, + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "kata_agent_process_resident_memory_bytes", + "hide": false, + "interval": "", + "legendFormat": "{{sandbox_id}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "agent mem/RSS", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": null, + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 6, + "x": 12, + "y": 45 + }, + "hiddenSeries": false, + "id": 70, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "null", + "options": { + "dataLinks": [] + }, + "percentage": false, + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "kata_agent_proc_status", + "hide": false, + "interval": "", + "legendFormat": "", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "agent proc status", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": null, + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 6, + "x": 18, + "y": 45 + }, + "hiddenSeries": false, + "id": 71, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "null", + "options": { + "dataLinks": [] + }, + "percentage": false, + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "kata_agent_proc_stat", + "hide": false, + "interval": "", + "legendFormat": "", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "agent proc status", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "content": "", + "datasource": null, + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 53 + }, + "id": 45, + "mode": "markdown", + "timeFrom": null, + "timeShift": null, + "title": "Hypervisor", + "type": "text" + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": null, + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 6, + "x": 0, + "y": 54 + }, + "hiddenSeries": false, + "id": 14, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "null", + "options": { + "dataLinks": [] + }, + "percentage": false, + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "kata_hypervisor_fds", + "interval": "", + "legendFormat": "{{sandbox_id}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "hypervisor open fds", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": null, + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 6, + "x": 6, + "y": 54 + }, + "hiddenSeries": false, + "id": 18, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "null", + "options": { + "dataLinks": [] + }, + "percentage": false, + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "kata_hypervisor_proc_status{item=\"vmrss\"}", + "interval": "", + "legendFormat": "{{item}}/{{sandbox_id}}", + "refId": "B" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "VmRSS", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": null, + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 6, + "x": 12, + "y": 54 + }, + "hiddenSeries": false, + "id": 26, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "null", + "options": { + "dataLinks": [] + }, + "percentage": false, + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "kata_hypervisor_io_stat{item=\"wchar\"}", + "interval": "", + "legendFormat": "{{item}}/{{sandbox_id}}", + "refId": "B" + }, + { + "expr": "kata_hypervisor_io_stat{item=\"rchar\"}", + "interval": "", + "legendFormat": "{{item}}/{{sandbox_id}}", + "refId": "C" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "IO WChar/RChar", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": null, + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 6, + "x": 18, + "y": 54 + }, + "hiddenSeries": false, + "id": 16, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "null", + "options": { + "dataLinks": [] + }, + "percentage": false, + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "kata_hypervisor_netdev", + "interval": "", + "legendFormat": "{{interface}}/{{item}}/{{sandbox_id}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "hypeervisor net", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": null, + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 6, + "x": 0, + "y": 62 + }, + "hiddenSeries": false, + "id": 30, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "null", + "options": { + "dataLinks": [] + }, + "percentage": false, + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "kata_hypervisor_proc_stat", + "interval": "", + "legendFormat": "{{item}}/{{sandbox_id}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "proc stat", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "content": "", + "datasource": null, + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 70 + }, + "id": 47, + "mode": "markdown", + "timeFrom": null, + "timeShift": null, + "title": "Guest OS", + "type": "text" + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": null, + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 6, + "x": 0, + "y": 71 + }, + "hiddenSeries": false, + "id": 34, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "null", + "options": { + "dataLinks": [] + }, + "percentage": false, + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "kata_guest_load", + "interval": "", + "legendFormat": "{{item}}/{{sandbox_id}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "guest load", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": null, + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 6, + "x": 6, + "y": 71 + }, + "hiddenSeries": false, + "id": 54, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "null", + "options": { + "dataLinks": [] + }, + "percentage": false, + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "kata_guest_meminfo{item=\"mem_total\"}", + "interval": "", + "legendFormat": "{{item}}/{{sandbox_id}}", + "refId": "D" + }, + { + "expr": "kata_guest_meminfo{item=\"mem_free\"}", + "interval": "", + "legendFormat": "{{item}}/{{sandbox_id}}", + "refId": "A" + }, + { + "expr": "kata_guest_meminfo{item=\"mem_available\"}", + "interval": "", + "legendFormat": "{{item}}/{{sandbox_id}}", + "refId": "B" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "meminfo", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": null, + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 6, + "x": 12, + "y": 71 + }, + "hiddenSeries": false, + "id": 56, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "null", + "options": { + "dataLinks": [] + }, + "percentage": false, + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "kata_guest_netdev_stat{item=\"sent_bytes\"}", + "hide": false, + "interval": "", + "legendFormat": "{{item}}/{{interface}}/{{sandbox_id}}", + "refId": "A" + }, + { + "expr": "kata_guest_netdev_stat{item=\"recv_bytes\"}", + "hide": false, + "interval": "", + "legendFormat": "{{item}}/{{interface}}/{{sandbox_id}}", + "refId": "B" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "netdev sent/recv", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": null, + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 6, + "x": 18, + "y": 71 + }, + "hiddenSeries": false, + "id": 69, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "null", + "options": { + "dataLinks": [] + }, + "percentage": false, + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "kata_guest_netdev_stat{item=\"sent_errs\"}", + "hide": false, + "interval": "", + "legendFormat": "{{item}}/{{interface}}/{{sandbox_id}}", + "refId": "A" + }, + { + "expr": "kata_guest_netdev_stat{item=\"recv_errs\"}", + "hide": false, + "interval": "", + "legendFormat": "{{item}}/{{interface}}/{{sandbox_id}}", + "refId": "B" + }, + { + "expr": "kata_guest_netdev_stat{item=\"sent_drop\"}", + "hide": false, + "interval": "", + "legendFormat": "{{item}}/{{interface}}", + "refId": "C" + }, + { + "expr": "kata_guest_netdev_stat{item=\"recv_drop\"}", + "hide": false, + "interval": "", + "legendFormat": "{{item}}/{{interface}}/{{sandbox_id}}", + "refId": "D" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "netdev errors/drops", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": null, + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 6, + "x": 12, + "y": 79 + }, + "hiddenSeries": false, + "id": 55, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "null", + "options": { + "dataLinks": [] + }, + "percentage": false, + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "kata_guest_tasks", + "interval": "", + "legendFormat": "{{item}}/{{sandbox_id}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "tasks", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + } + ], + "refresh": "10s", + "schemaVersion": 25, + "style": "dark", + "tags": [], + "templating": { + "list": [] + }, + "time": { + "from": "now-30m", + "to": "now" + }, + "timepicker": { + "refresh_intervals": [ + "10s", + "30s", + "1m", + "5m", + "15m", + "30m", + "1h", + "2h", + "1d" + ] + }, + "timezone": "", + "title": "Kata containers", + "uid": "75pdqURGk", + "version": 1 +} \ No newline at end of file diff --git a/docs/how-to/data/grafana.yml b/docs/how-to/data/grafana.yml new file mode 100644 index 0000000000..412a0535e8 --- /dev/null +++ b/docs/how-to/data/grafana.yml @@ -0,0 +1,43 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: grafana + namespace: prometheus + labels: + app: grafana +spec: + replicas: 1 + selector: + matchLabels: + app: grafana + template: + metadata: + labels: + app: grafana + spec: + containers: + - image: grafana/grafana:7.0.5 + name: grafana + ports: + - containerPort: 3000 + name: http + +--- + +apiVersion: v1 +kind: Service +metadata: + namespace: prometheus + name: grafana + labels: + app: grafana +spec: + type: NodePort + selector: + app: grafana + ports: + - port: 3000 + targetPort: 3000 + name: http + nodePort: 30000 + protocol: TCP diff --git a/docs/how-to/data/kata-monitor-daemonset.yml b/docs/how-to/data/kata-monitor-daemonset.yml new file mode 100644 index 0000000000..fca793730e --- /dev/null +++ b/docs/how-to/data/kata-monitor-daemonset.yml @@ -0,0 +1,55 @@ +apiVersion: v1 +kind: Namespace +metadata: + name: kata-system + +--- + +apiVersion: apps/v1 +kind: DaemonSet +metadata: + labels: + app.kubernetes.io/name: kata-monitor + name: kata-monitor + namespace: kata-system +spec: + selector: + matchLabels: + app.kubernetes.io/name: kata-monitor + template: + metadata: + labels: + app.kubernetes.io/name: kata-monitor + annotations: + prometheus.io/scrape: "true" + spec: + hostNetwork: true + containers: + - name: kata-monitor + image: docker.io/katadocker/kata-monitor:2.0.0 + args: + - -log-level=debug + ports: + - containerPort: 8090 + resources: + limits: + cpu: 200m + memory: 300Mi + requests: + cpu: 200m + memory: 300Mi + volumeMounts: + - name: containerdtask + mountPath: /run/containerd/io.containerd.runtime.v2.task/ + readOnly: true + - name: containerdsocket + mountPath: /run/containerd/containerd.sock + readOnly: true + terminationGracePeriodSeconds: 30 + volumes: + - name: containerdtask + hostPath: + path: /run/containerd/io.containerd.runtime.v2.task/ + - name: containerdsocket + hostPath: + path: /run/containerd/containerd.sock diff --git a/docs/how-to/data/prometheus.yml b/docs/how-to/data/prometheus.yml new file mode 100644 index 0000000000..89cb354a62 --- /dev/null +++ b/docs/how-to/data/prometheus.yml @@ -0,0 +1,132 @@ +apiVersion: v1 +kind: Namespace +metadata: + name: prometheus + +--- + +apiVersion: rbac.authorization.k8s.io/v1beta1 +kind: ClusterRole +metadata: + name: prometheus +rules: +- apiGroups: [""] + resources: + - nodes + - nodes/proxy + - services + - endpoints + - pods + verbs: ["get", "list", "watch"] +- apiGroups: + - extensions + resources: + - ingresses + verbs: ["get", "list", "watch"] +- nonResourceURLs: ["/metrics"] + verbs: ["get"] + +--- + +apiVersion: v1 +kind: ServiceAccount +metadata: + name: prometheus + namespace: prometheus + +--- + +apiVersion: rbac.authorization.k8s.io/v1beta1 +kind: ClusterRoleBinding +metadata: + name: prometheus +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: prometheus +subjects: +- kind: ServiceAccount + name: prometheus + namespace: prometheus + +--- + +kind: Service +apiVersion: v1 +metadata: + name: prometheus + namespace: prometheus + labels: + app: prometheus +spec: + type: NodePort + selector: + app: prometheus + ports: + - port: 9090 + targetPort: 9090 + name: http + nodePort: 30909 + protocol: TCP + +--- + +kind: Deployment +apiVersion: apps/v1 +metadata: + name: prometheus + namespace: prometheus +spec: + replicas: 1 + selector: + matchLabels: + app: prometheus + template: + metadata: + labels: + app: prometheus + spec: + serviceAccountName: prometheus + containers: + - name: prometheus + image: prom/prometheus:v2.7.1 + ports: + - containerPort: 9090 + volumeMounts: + - name: prometheus-config-volume + mountPath: /etc/prometheus/prometheus.yml + subPath: prometheus.yml + volumes: + - name: prometheus-config-volume + configMap: + name: prometheus-config + restartPolicy: Always + +--- + +kind: ConfigMap +apiVersion: v1 +metadata: + name: prometheus-config + namespace: prometheus +data: + prometheus.yml: | + # my global config + global: + scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute. + evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute. + + scrape_configs: + - job_name: 'kubernetes-pods' + kubernetes_sd_configs: + - role: pod + namespaces: + names: + - kata-system + + relabel_configs: + # Example relabel to scrape only pods that have + # "prometheus.io/scrape: true" annotation. + - source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_scrape] + action: keep + regex: true diff --git a/docs/how-to/how-to-set-prometheus-in-k8s.md b/docs/how-to/how-to-set-prometheus-in-k8s.md new file mode 100644 index 0000000000..89a392a366 --- /dev/null +++ b/docs/how-to/how-to-set-prometheus-in-k8s.md @@ -0,0 +1,108 @@ +# How to monitor Kata Containers in Kubernetes clusters + +This document describes how to run `kata-monitor` in a Kubernetes cluster using Prometheus's service discovery to scrape metrics from `kata-agent`. + +- [Introduction](#introduction) +- [Pre-requisites](#pre-requisites) +- [Configure Prometheus](#configure-prometheus) +- [Configure `kata-monitor`](#configure-kata-monitor) +- [Setup Grafana](#setup-grafana) + * [Create `datasource`](#create-datasource) + * [Import dashboard](#import-dashboard) + +> **Warning**: This how-to is only for evaluation purpose, you **SHOULD NOT** running it in production using this configurations. + +## Introduction + +If you are running Kata containers in a Kubernetes cluster, the best way to run `kata-monitor` is using Kubernetes native `DaemonSet`, `kata-monitor` will run on desired Kubernetes nodes without other operations when new nodes joined the cluster. + +Prometheus also support a Kubernetes service discovery that can find scrape targets dynamically without explicitly setting `kata-monitor`'s metric endpoints. + +## Pre-requisites + +You must have a running Kubernetes cluster first. If not, [install a Kubernetes cluster](https://kubernetes.io/docs/setup/) first. + +Also you should ensure that `kubectl` working correctly. + +> **Note**: More information about Kubernetes integrations: +> - [Run Kata Containers with Kubernetes](run-kata-with-k8s.md) +> - [How to use Kata Containers and Containerd](containerd-kata.md) +> - [How to use Kata Containers and CRI (containerd plugin) with Kubernetes](how-to-use-k8s-with-cri-containerd-and-kata.md) + +## Configure Prometheus + +Start Prometheus by utilizing our sample manifest: + +``` +$ kubectl apply -f https://raw.githubusercontent.com/kata-containers/documentation/master/how-to/data/prometheus.yml +``` + +This will create a new namespace, `prometheus`, and create the following resources: + +* `ClusterRole`, `ServiceAccount`, `ClusterRoleBinding` to let Prometheus to access Kubernetes API server. +* `ConfigMap` that contains minimum configurations to let Prometheus run Kubernetes service discovery. +* `Deployment` that run Prometheus in `Pod`. +* `Service` with `type` of `NodePort`(`30909` in this how to), that we can access Prometheus through `:30909`. In production environment, this `type` may be `LoadBalancer` or `Ingress` resource. + +After the Prometheus server is running, run `curl -s http://hostIP:NodePort:30909/metrics`, if Prometheus is working correctly, you will get response like these: + +``` +# HELP go_gc_duration_seconds A summary of the GC invocation durations. +# TYPE go_gc_duration_seconds summary +go_gc_duration_seconds{quantile="0"} 3.9403e-05 +go_gc_duration_seconds{quantile="0.25"} 0.000169907 +go_gc_duration_seconds{quantile="0.5"} 0.000207421 +go_gc_duration_seconds{quantile="0.75"} 0.000229911 +``` + +## Configure `kata-monitor` + +`kata-monitor` can be started on the cluster as follows: + +``` +$ kubectl apply -f https://raw.githubusercontent.com/kata-containers/documentation/master/how-to/data/kata-monitor-daemontset.yml +``` + +This will create a new namespace `kata-system` and a `daemonset` in it. + +Once the `daemonset` is running, Prometheus should discover `kata-monitor` as a target. You can open `http://:30909/service-discovery` and find `kubernetes-pods` under the `Service Discovery` list + + +## Setup Grafana + +Run this command to run Grafana in Kubernetes: + +``` +$ kubectl apply -f https://raw.githubusercontent.com/kata-containers/documentation/master/how-to/data/grafana.yml +``` + +This will create deployment and service for Grafana under namespace `prometheus`. + +After the Grafana deployment is ready, you can open `http://hostIP:NodePort:30000/` to access Grafana server. For Grafana 7.0.5, the default user/password is `admin/admin`. You can modify the default account and adjust other security settings by editing the [Grafana configuration](https://grafana.com/docs/grafana/latest/installation/configuration/#security). + +To use Grafana show data from Prometheus, you must create a Prometheus `datasource` and dashboard. + +### Create `datasource` + +Open `http://hostIP:NodePort:30000/datasources/new` in your browser, select Prometheus from time series databases list. + +Normally you only need to set `URL` to `http://hostIP:NodePort:30909` to let it work, and leave the name as `Prometheus` as default. + +### Import dashboard + +A [sample dashboard](data/dashboard.json) for Kata Containers metrics is provided which can be imported to Grafana for evaluation. + +You can import this dashboard using Grafana UI, or using `curl` command in console. + + +``` +$ curl -XPOST -i localhost:3000/api/dashboards/import \ + -u admin:admin \ + -H "Content-Type: application/json" \ + -d "{\"dashboard\":$(curl -sL https://raw.githubusercontent.com/kata-containers/documentation/master/how-to/data/dashboard.json )}" +``` + +## References + +- [Prometheus `kubernetes_sd_config`](https://prometheus.io/docs/prometheus/latest/configuration/configuration/#kubernetes_sd_config) +