{"id":494956,"date":"2026-09-17T05:57:24","date_gmt":"2026-09-17T05:57:24","guid":{"rendered":"https:\/\/savepearlharbor.com\/?p=494956"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=494956","title":{"rendered":"\u0410\u043b\u0435\u0440\u0442\u044b \u043f\u043e \u043e\u0448\u0438\u0431\u043a\u0430\u043c \u0438 panic \u0438\u0437 \u043b\u043e\u0433\u043e\u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439: VictoriaLogs + vmalert + Alertmanager \u2192 Telegram"},"content":{"rendered":"<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<h3>\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435<\/h3>\n<p>\u041a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044f: Go-\u0441\u0435\u0440\u0432\u0438\u0441 \u043f\u0430\u0434\u0430\u0435\u0442 \u0441\u00a0<code>panic: runtime error: invalid memory address or nil pointer dereference<\/code>, Nuxt-\u0444\u0440\u043e\u043d\u0442\u0435\u043d\u0434 \u043b\u043e\u0433\u0438\u0440\u0443\u0435\u0442\u00a0<code>NUXT_UNHANDLED: unhandled rejection<\/code>. \u041a\u043b\u0438\u0435\u043d\u0442 \u0432\u0438\u0434\u0438\u0442 \u043b\u0438\u0448\u044c \u043e\u0431\u0449\u0435\u0435 \u00ab\u0447\u0442\u043e-\u0442\u043e \u0441\u043b\u043e\u043c\u0430\u043b\u043e\u0441\u044c\u00bb \u2014 \u0442\u043e\u0447\u043d\u044b\u0439 \u0442\u0435\u043a\u0441\u0442 \u043e\u0448\u0438\u0431\u043a\u0438 \u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u043b\u043e\u0433\u0430\u0445.<\/p>\n<p>\u0420\u0435\u0448\u0435\u043d\u0438\u0435 \u2014 \u0430\u043b\u0435\u0440\u0442\u0438\u043d\u0433 \u043f\u043e \u043b\u043e\u0433\u0430\u043c. \u0421\u0432\u044f\u0437\u043a\u0430\u00a0<strong>VictoriaLogs + Vector + vmalert + Alertmanager<\/strong>\u00a0\u0441\u043b\u0435\u0434\u0438\u0442 \u0437\u0430 \u043f\u043e\u0442\u043e\u043a\u043e\u043c, \u0438 \u043a\u0430\u043a \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043f\u0438\u0448\u0435\u0442\u00a0<code>panic<\/code>,\u00a0<code>log.Fatal<\/code>\u00a0\u0438\u043b\u0438\u00a0<code>NUXT_UNHANDLED<\/code>, \u0432 Telegram \u0443\u0445\u043e\u0434\u0438\u0442 \u0430\u043b\u0435\u0440\u0442. \u041d\u0438\u0436\u0435 \u2014 \u043a\u0430\u043a \u043f\u043e\u0434\u043d\u044f\u0442\u044c \u044d\u0442\u0443 \u0441\u0432\u044f\u0437\u043a\u0443 \u0432 Kubernetes \u0431\u0435\u0437 \u043b\u0438\u0448\u043d\u0435\u0439 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u043d\u0430 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435.<\/p>\n<h3>\u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430<\/h3>\n<p>\u041a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f:<\/p>\n<ul>\n<li>\n<p><strong>\u041b\u043e\u0433\u0438 \u2014 \u043d\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0440\u044f\u0434\u044b,<\/strong>\u00a0\u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0443 \u043d\u0438\u0445 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 (VictoriaLogs), \u0430 \u043d\u0435\u00a0<code>vmsingle<\/code>\u00a0(\u0428\u0430\u0433 2);<\/p>\n<\/li>\n<li>\n<p><strong>LogsQL- \u0438 PromQL-\u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0440\u0430\u0437\u043d\u044b\u0439\u00a0<\/strong><code><strong>vmalert<\/strong><\/code><strong>:<\/strong>\u00a0\u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 \u0438\u0437 vmks \u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u043d\u0430 PromQL, \u043b\u043e\u0433\u0438 \u0432\u0435\u0434\u0451\u0442\u00a0<code>vmalert-logs<\/code>\u00a0\u0441 VictoriaLogs \u043a\u0430\u043a datasource (\u0428\u0430\u0433\u0438 1 \u0438 3);<\/p>\n<\/li>\n<li>\n<p><strong>\u041f\u0440\u0430\u0432\u0438\u043b\u0430 \u0436\u0438\u0432\u0443\u0442 \u0432 \u043a\u043e\u0434\u0435, \u0430 \u043d\u0435 \u0432 Grafana UI<\/strong>\u00a0\u2014 \u043f\u043e\u0447\u0435\u043c\u0443, \u0440\u0430\u0437\u0431\u0435\u0440\u0451\u043c \u0432 \u0428\u0430\u0433\u0435 1;<\/p>\n<\/li>\n<li>\n<p><strong>Alertmanager \u0448\u043b\u0451\u0442 \u0430\u043b\u0435\u0440\u0442\u044b \u0432 Telegram<\/strong>\u00a0\u043d\u0430\u0442\u0438\u0432\u043d\u044b\u043c\u00a0<code>telegram_configs<\/code>\u00a0(\u0428\u0430\u0433 6).<\/p>\n<\/li>\n<\/ul>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/444\/b0a\/10d\/444b0a10dfad7734e4fcf9a4a97c9053.png\" alt=\"\u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430\" width=\"601\" height=\"1109\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/444\/b0a\/10d\/444b0a10dfad7734e4fcf9a4a97c9053.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/444\/b0a\/10d\/444b0a10dfad7734e4fcf9a4a97c9053.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430<\/figcaption><\/div>\n<\/figure>\n<p>\u041f\u043e\u0442\u043e\u043a \u0434\u0430\u043d\u043d\u044b\u0445:<\/p>\n<ol>\n<li>\n<p>\u041f\u043e\u0434\u043d\u0438\u043c\u0430\u0435\u043c\u00a0<code>victoria-metrics-k8s-stack<\/code>\u00a0(vmks):\u00a0<code>vmagent<\/code>,\u00a0<code>vmsingle<\/code>,\u00a0<code>Alertmanager<\/code>, Grafana \u0438 CRD \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u0430 (\u0441\u043e\u0441\u0442\u0430\u0432 \u2014 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u043d\u0438\u0436\u0435).<\/p>\n<\/li>\n<li>\n<p>\u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043f\u0438\u0448\u0443\u0442 \u043b\u043e\u0433\u0438 \u0432\u00a0<code>stdout<\/code>\/<code>stderr<\/code>.<\/p>\n<\/li>\n<li>\n<p>Vector (DaemonSet) \u0441 \u043a\u0430\u0436\u0434\u043e\u0439 \u043d\u043e\u0434\u044b \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442 \u043b\u043e\u0433\u0438 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432 \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u0438\u0445 \u0432 VictoriaLogs \u0447\u0435\u0440\u0435\u0437 Elasticsearch bulk API (<code>\/insert\/elasticsearch\/<\/code>).<\/p>\n<\/li>\n<li>\n<p><code>vmalert-logs<\/code>\u00a0\u0440\u0430\u0437 \u0432\u00a0<code>1m<\/code>\u00a0\u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u0442 LogsQL-\u0437\u0430\u043f\u0440\u043e\u0441\u044b \u0438\u0437\u00a0<code>VMRule<\/code>\u00a0\u043f\u0440\u043e\u0442\u0438\u0432 VictoriaLogs (<code>\/select\/logsql\/stats_query<\/code>).<\/p>\n<\/li>\n<li>\n<p>\u0421\u0440\u0430\u0431\u043e\u0442\u0430\u0432\u0448\u0435\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u043e \u0443\u0445\u043e\u0434\u0438\u0442 \u0432 Alertmanager.<\/p>\n<\/li>\n<li>\n<p>Alertmanager \u0447\u0435\u0440\u0435\u0437\u00a0<code>telegram_configs<\/code>\u00a0\u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0432 Telegram-\u0431\u043e\u0442\u0430.<\/p>\n<\/li>\n<\/ol>\n<h3>\u041f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f<\/h3>\n<p>\u041d\u0443\u0436\u043d\u044b:<\/p>\n<ul>\n<li>\n<p><strong>Kubernetes-\u043a\u043b\u0430\u0441\u0442\u0435\u0440<\/strong>;<\/p>\n<\/li>\n<li>\n<p><strong>Ingress-\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440<\/strong>, \u0447\u0442\u043e\u0431\u044b \u0437\u0430\u0439\u0442\u0438 \u0432 Grafana;<\/p>\n<\/li>\n<li>\n<p><code><strong>kubectl<\/strong><\/code><strong>\u00a0\u0438\u00a0<\/strong><code><strong>helm<\/strong><\/code>.<\/p>\n<\/li>\n<\/ul>\n<p>\u041a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b (\u0432\u0441\u0435 \u2014 \u0432 namespace\u00a0<code>vmks<\/code>, \u043a\u0440\u043e\u043c\u0435 Vector \u0432\u00a0<code>vector<\/code>\u00a0\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0432\u00a0<code>apps<\/code>):<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<th>\n<p align=\"left\">\u041a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442<\/p>\n<\/th>\n<th>\n<p align=\"left\">\u0427\u0430\u0440\u0442 \/ \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442<\/p>\n<\/th>\n<th>\n<p align=\"left\">\u0420\u043e\u043b\u044c<\/p>\n<\/th>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">victoria-metrics-k8s-stack (vmks)<\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>victoria-metrics-k8s-stack<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">vmagent, vmsingle, \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 vmalert, Alertmanager, Grafana<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">VictoriaLogs<\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>victoria-logs-single<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 \u043b\u043e\u0433\u043e\u0432 (single-node)<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">Vector<\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>vector<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0441\u0431\u043e\u0440 \u043b\u043e\u0433\u043e\u0432 \u043f\u043e\u0434\u043e\u0432 (DaemonSet, \u0440\u043e\u043b\u044c Agent, namespace\u00a0<code>vector<\/code>)<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">vmalert-logs<\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>manifests\/vmalert-logs.yaml<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u0442 LogsQL-\u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u0438\u0437\u00a0<code>VMRule<\/code><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">VMRule<\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>manifests\/vmalert-rules-golang.yaml<\/code>,\u00a0<code>manifests\/vmalert-rules-nuxt.yaml<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u0430\u043b\u0435\u0440\u0442\u043e\u0432 \u043d\u0430 LogsQL (\u043f\u043e \u0444\u0430\u0439\u043b\u0443 \u043d\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435)<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">golang-app \/ nuxt-app<\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>manifests\/golang-app.yaml<\/code>,\u00a0<code>manifests\/nuxt-app.yaml<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u0440\u043e\u043d\u044f\u044e\u0449\u0438\u0435 panic\/error (namespace\u00a0<code>apps<\/code>)<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<h3>\u0428\u0430\u0433 1. victoria-metrics-k8s-stack (vmks)<\/h3>\n<p>\u0421\u0442\u0430\u0432\u0438\u043c\u00a0<code>victoria-metrics-k8s-stack<\/code>\u00a0\u043f\u0435\u0440\u0432\u044b\u043c: \u043e\u043d \u0434\u0430\u0451\u0442 CRD \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u0430 \u0438\u00a0<code>vmagent<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0442\u043e\u043c \u0441\u043a\u0440\u0435\u0439\u043f\u0438\u0442 \u043c\u0435\u0442\u0440\u0438\u043a\u0438 VictoriaLogs (\u0428\u0430\u0433 2).<\/p>\n<pre><code>helm upgrade --install vmks oci:\/\/ghcr.io\/victoriametrics\/helm-charts\/victoria-metrics-k8s-stack \\  --namespace vmks --create-namespace \\  --version 0.91.2 \\  --wait --values values\/vmks-values.yaml<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:87px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0424\u0430\u0439\u043b\u00a0<code>values\/vmks-values.yaml<\/code>\u00a0(\u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442):<\/p>\n<pre><code># vmalert (\u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439) \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u0442 PromQL-\u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u043f\u0440\u043e\u0442\u0438\u0432 vmsingle# (datasource \u0447\u0430\u0440\u0442 \u043f\u043e\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u0430\u043c \u0438\u0437 vmsingle). \u041e\u043d \u0431\u0435\u0440\u0451\u0442 \u0432\u0441\u0435 VMRule \u0432# namespace vmalert'\u0430, \u043a\u0440\u043e\u043c\u0435 LogsQL-\u043f\u0440\u0430\u0432\u0438\u043b (label type: logs-to-metrics) \u2014# \u0438\u0445 \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 VMAlert (manifests\/vmalert-logs.yaml). \u0422\u0430\u043a \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u044b\u0439# PromQL-VMRule, \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0439 \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u0431\u0435\u0437 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0445 \u043b\u0435\u0439\u0431\u043b\u043e\u0432, \u043f\u043e\u0434\u0445\u0432\u0430\u0442\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0441\u0430\u043c.vmalert:  enabled: true  spec:    selectAllByDefault: false    ruleSelector:      matchExpressions:        - key: type          operator: NotIn          values:            - logs-to-metrics    # \u041a\u0430\u043a \u0447\u0430\u0441\u0442\u043e \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 vmalert \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0433\u0440\u0443\u043f\u043f\u044b PromQL-\u043f\u0440\u0430\u0432\u0438\u043b: \u0440\u0430\u0437 \u0432 \u043c\u0438\u043d\u0443\u0442\u0443.    evaluationInterval: 1malertmanager:  enabled: true  spec:    # Secret telegram-bot-token \u043c\u043e\u043d\u0442\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u043c \u0432    # \/etc\/vm\/secrets\/telegram-bot-token\/bot-token.    secrets:      - telegram-bot-token  ingress:    enabled: true    ingressClassName: traefik    hosts:      - ${alertmanager_fqdn}  config:    global:      resolve_timeout: 5m      http_config:        proxy_from_environment: true    route:      receiver: telegram      group_by: [\"alertname\", \"app\"]      group_wait: 30s      group_interval: 5m      repeat_interval: 4h      # Watchdog, InfoInhibitor \u0438 RecordingRulesNoData \u2014 \u0441\u043b\u0443\u0436\u0435\u0431\u043d\u044b\u0435 \u0430\u043b\u0435\u0440\u0442\u044b vmks:      # \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0442 \u0441\u0432\u043e\u044e \u0440\u0430\u0431\u043e\u0442\u0443, \u043d\u043e \u0432 Telegram \u043d\u0435 \u0448\u043b\u044e\u0442\u0441\u044f. RecordingRulesNoData      # \u0448\u0443\u043c\u0438\u0442, \u043a\u043e\u0433\u0434\u0430 recording-\u043f\u0440\u0430\u0432\u0438\u043b\u043e count:up0 \u043e\u0442\u0434\u0430\u0451\u0442 0 \u0441\u0435\u043c\u043f\u043b\u043e\u0432 \u2014 \u044d\u0442\u043e \u0437\u0434\u043e\u0440\u043e\u0432\u043e\u0435      # \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 (\u043d\u0435\u0442 \u0443\u043f\u0430\u0432\u0448\u0438\u0445 \u0442\u0430\u0440\u0433\u0435\u0442\u043e\u0432), \u0430 \u043d\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430.      routes:        - matchers:            - alertname=\"Watchdog\"          receiver: \"null\"        - matchers:            - alertname=\"InfoInhibitor\"          receiver: \"null\"    receivers:      - name: \"null\"      - name: telegram        telegram_configs:          - bot_token_file: \/etc\/vm\/secrets\/telegram-bot-token\/bot-token            chat_id: ${telegram_chat_id}            parse_mode: HTML            send_resolved: true            message: |-              {{- range .Alerts }}              &lt;b&gt;{{ .Status | toUpper }}&lt;\/b&gt; &lt;code&gt;{{ .Labels.alertname }}&lt;\/code&gt;              app: &lt;code&gt;{{ .Labels.app }}&lt;\/code&gt;              {{- if .Annotations.summary }}              {{ .Annotations.summary }}              {{- end }}              {{- if .Annotations.description }}              {{ .Annotations.description }}              {{- end }}              {{ end }}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p><code>ruleSelector<\/code>\u00a0\u0441\u00a0<code>NotIn<\/code>\u00a0\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0434\u0435\u0444\u043e\u043b\u0442\u043d\u044b\u0435 PromQL-\u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u0441\u0442\u0435\u043a\u0430 \u0438 \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u044b\u0435 PromQL-<code>VMRule<\/code>\u00a0\u0431\u0435\u0437 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0445 \u043b\u0435\u0439\u0431\u043b\u043e\u0432.\u00a0<code>vmsingle<\/code>\u00a0\u0438\u00a0<code>alertmanager<\/code>\u00a0\u0432\u043a\u043b\u044e\u0447\u0435\u043d\u044b \u043f\u043e \u0434\u0435\u0444\u043e\u043b\u0442\u0443 \u0447\u0430\u0440\u0442\u0430:\u00a0<code>vmalert-logs<\/code>\u00a0\u043f\u0438\u0448\u0435\u0442 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0430\u043b\u0435\u0440\u0442\u043e\u0432 \u0432\u00a0<code>vmsingle<\/code>, \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u044f \u0443\u0445\u043e\u0434\u044f\u0442 \u0447\u0435\u0440\u0435\u0437\u00a0<code>alertmanager<\/code>\u00a0(\u0428\u0430\u0433\u0438 3 \u0438 6). \u0411\u043b\u043e\u043a\u00a0<code>alertmanager<\/code>\u00a0\u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u043d \u0432 \u0428\u0430\u0433\u0435 6.<\/p>\n<h4>\u041f\u043e\u0447\u0435\u043c\u0443 \u0430\u043b\u0435\u0440\u0442\u044b \u043f\u043e \u043b\u043e\u0433\u0430\u043c \u043d\u0435 \u0434\u0435\u043b\u0430\u0435\u043c \u0447\u0435\u0440\u0435\u0437 Grafana UI<\/h4>\n<p>\u0414\u043b\u044f \u043c\u0435\u0442\u0440\u0438\u043a \u0430\u043b\u0435\u0440\u0442 \u0438\u0437 Explore \u043f\u043e\u0447\u0442\u0438 \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u0435\u043d: PromQL \u0441\u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f \u043f\u043e \u0443\u0436\u0435 \u0430\u0433\u0440\u0435\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c \u0440\u044f\u0434\u0430\u043c. \u0414\u043b\u044f \u043b\u043e\u0433\u043e\u0432 \u043a\u0430\u0436\u0434\u043e\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u043e \u2014 \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u044b\u0439 \u0437\u0430\u043f\u0440\u043e\u0441 \u043a VictoriaLogs \u0441\u043e\u00a0<code>stats<\/code>, \u0444\u0438\u043b\u044c\u0442\u0440\u0430\u043c\u0438 \u0438 \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043a\u0430\u043c\u0438, \u0438 \u043e\u043d \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043a\u0430\u0436\u0434\u0443\u044e \u043c\u0438\u043d\u0443\u0442\u0443 (<code>evaluationInterval: 1m<\/code>).<\/p>\n<p>\u041a\u043e\u0433\u0434\u0430 \u0430\u043b\u0435\u0440\u0442\u044b \u0432\u0435\u0448\u0430\u0435\u0442 \u0432\u0441\u044f \u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u0438\u0437 UI, \u0441\u0440\u0435\u0434\u0438 \u043d\u0438\u0445 \u043f\u043e\u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043d\u0435\u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0435: \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043a\u0430 \u043f\u043e \u0432\u0441\u0435\u043c\u0443 \u0442\u0435\u043a\u0441\u0442\u0443 \u0431\u0435\u0437 \u0444\u0438\u043b\u044c\u0442\u0440\u0430 \u043f\u043e \u043f\u043e\u0434\u0443, \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0448\u0438\u0440\u043e\u043a\u043e\u0435 \u043e\u043a\u043d\u043e, \u043f\u0440\u0430\u0432\u0438\u043b\u043e \u043d\u0430 \u043a\u0430\u0436\u0434\u044b\u0439 \u0447\u0438\u0445. VictoriaLogs \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u043d\u0430 \u0434\u0435\u0441\u044f\u0442\u043a\u0438 \u0442\u0430\u043a\u0438\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u043a\u0430\u0436\u0434\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b; \u043e\u0434\u0438\u043d \u043a\u0440\u0438\u0432\u043e\u0439 \u0430\u043b\u0435\u0440\u0442 \u0433\u0440\u0443\u0437\u0438\u0442 \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0441\u0438\u043b\u044c\u043d\u0435\u0435, \u0447\u0435\u043c \u0432\u0435\u0441\u044c \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d \u043f\u0440\u0438\u0451\u043c\u0430 \u043b\u043e\u0433\u043e\u0432.<\/p>\n<p><code>VMRule<\/code>\u00a0\u0434\u0435\u0440\u0436\u0438\u0442 \u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u0432 git: \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b, \u0437\u0430\u043f\u0440\u043e\u0441, \u043f\u043e\u0440\u043e\u0433, \u043e\u043a\u043d\u043e\u00a0<code>for<\/code>\u00a0\u0432\u0438\u0434\u043d\u044b \u0434\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432 \u043a\u043b\u0430\u0441\u0442\u0435\u0440. \u041d\u0430 \u0440\u0435\u0432\u044c\u044e \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u044e\u0442, \u0447\u0442\u043e \u0443 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u0443\u0437\u043a\u0438\u0439 \u0444\u0438\u043b\u044c\u0442\u0440 \u043f\u043e\u00a0<code>kubernetes.pod_<\/code><a href=\"http:\/\/labels.app\" rel=\"noopener nofollow\"><code>labels.app<\/code><\/a>, \u0430 \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043a\u0430 \u0431\u044c\u0451\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e \u043d\u0443\u0436\u043d\u043e\u043c\u0443 \u0442\u0435\u043a\u0441\u0442\u0443.<\/p>\n<h3>\u041e\u0442\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0430\u043b\u0435\u0440\u0442\u043e\u0432 \u0447\u0435\u0440\u0435\u0437 UI \u043d\u0435\u043b\u044c\u0437\u044f<\/h3>\n<p>\u041f\u043b\u0430\u0433\u0438\u043d\u00a0<code>victoriametrics-logs-datasource<\/code>\u00a0\u043e\u0431\u044a\u044f\u0432\u043b\u044f\u0435\u0442\u00a0<code>alerting: true<\/code>, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 Grafana \u0440\u0430\u0437\u0440\u0435\u0448\u0430\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0430\u043b\u0435\u0440\u0442\u044b \u043f\u043e \u043b\u043e\u0433\u0430\u043c \u0447\u0435\u0440\u0435\u0437 UI \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e \u043e\u0442 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a datasource.\u00a0<code>manageAlerts: false<\/code>\u00a0\u0432\u00a0<code>jsonData<\/code>\u00a0\u0432\u043b\u0438\u044f\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430\u00a0<strong>datasource-managed<\/strong>\u00a0\u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u2014 \u0434\u043b\u044f VictoriaLogs \u043e\u043d\u0438 \u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 (LogsQL \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u00a0<code>vmalert-logs<\/code>, \u0430 \u043d\u0435 Grafana ruler), \u0430\u00a0<strong>Grafana-managed<\/strong>\u00a0\u0430\u043b\u0435\u0440\u0442\u044b \u0444\u043b\u0430\u0433 \u043d\u0435 \u0437\u0430\u0442\u0440\u0430\u0433\u0438\u0432\u0430\u0435\u0442. \u0425\u0440\u0430\u043d\u0438\u0442\u044c \u0430\u043b\u0435\u0440\u0442\u044b \u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e \u043d\u0443\u0436\u043d\u043e \u0432 git.<\/p>\n<p>\u041f\u043e \u044d\u0442\u043e\u0439 \u0442\u0435\u043c\u0435 \u0437\u0430\u0432\u0435\u0434\u0435\u043d\u044b \u0434\u0432\u0430 issue:<\/p>\n<ul>\n<li>\n<p><a href=\"https:\/\/github.com\/VictoriaMetrics\/victorialogs-datasource\/issues\/727\" rel=\"noopener nofollow\">VictoriaMetrics\/victorialogs-datasource#727<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/github.com\/grafana\/grafana\/issues\/132468\" rel=\"noopener nofollow\">grafana\/grafana#132468<\/a><\/p>\n<\/li>\n<\/ul>\n<h3>\u0428\u0430\u0433 2. VictoriaLogs<\/h3>\n<p>\u0421\u0442\u0430\u0432\u0438\u043c single-node VictoriaLogs \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u043c \u0447\u0430\u0440\u0442\u043e\u043c \u0432 namespace\u00a0<code>vmks<\/code>. \u0412\u0430\u0436\u0435\u043d \u043f\u043e\u0440\u044f\u0434\u043e\u043a: vmks (\u0428\u0430\u0433 1) \u0443\u0436\u0435 \u043f\u043e\u0434\u043d\u044f\u0442 \u2014 \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u043e\u0433\u0434\u0430\u00a0<code>vmServiceScrape<\/code>\u00a0\u0438\u0437 values \u043d\u0438\u0436\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u0441\u0442 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 \u043c\u0435\u0442\u0440\u0438\u043a\u0438 VictoriaLogs \u0447\u0435\u0440\u0435\u0437\u00a0<code>vmagent<\/code>\u00a0\u0432\u00a0<code>vmsingle<\/code>.<\/p>\n<pre><code>helm repo add vm https:\/\/victoriametrics.github.io\/helm-charts\/helm repo updatehelm upgrade --install vls vm\/victoria-logs-single \\  --namespace vmks --create-namespace \\  --version 0.13.9 \\  --values values\/vls-values.yaml<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0424\u0430\u0439\u043b\u00a0<code>values\/vls-values.yaml<\/code>:<\/p>\n<pre><code># VictoriaLogs single-node.nameOverride: vlsserver:  # VictoriaLogs \u043e\u0442\u0434\u0430\u0451\u0442 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 \u043c\u0435\u0442\u0440\u0438\u043a\u0438 \u043d\u0430 \/metrics.  vmServiceScrape:    enabled: true<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0421\u0435\u0440\u0432\u0438\u0441 \u043f\u043e\u043b\u0443\u0447\u0438\u0442 \u0438\u043c\u044f\u00a0<code>vls-server.vmks.svc.cluster.local<\/code>\u00a0(\u043f\u043e\u0440\u0442 9428) \u2014 \u043d\u0430 \u043d\u0435\u0433\u043e \u0441\u043c\u043e\u0442\u0440\u044f\u0442 Vector,\u00a0<code>vmalert-logs<\/code>\u00a0\u0438 datasource Grafana.<\/p>\n<h3>\u0428\u0430\u0433 3. Vector<\/h3>\n<p>\u0421\u043e\u0431\u0438\u0440\u0430\u0435\u043c \u043b\u043e\u0433\u0438 \u0432\u0441\u0435\u0445 \u043f\u043e\u0434\u043e\u0432 \u0447\u0435\u0440\u0435\u0437 DaemonSet Vector (helm chart\u00a0<code>vector<\/code>, \u0440\u043e\u043b\u044c\u00a0<code>Agent<\/code>). \u0412\u043c\u0435\u0441\u0442\u043e\u00a0<code>vlagent<\/code>\u00a0\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c Vector \u0438\u0437-\u0437\u0430\u00a0<a href=\"https:\/\/github.com\/VictoriaMetrics\/VictoriaLogs\/issues\/1790\" rel=\"noopener nofollow\">VictoriaMetrics\/VictoriaLogs#1790<\/a>.<\/p>\n<pre><code>helm repo add vector https:\/\/helm.vector.devhelm repo updatehelm upgrade --install vector vector\/vector \\  --namespace vector --create-namespace \\  --version 0.58.0 \\  --values values\/vector-values.yaml<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0424\u0430\u0439\u043b\u00a0<code>values\/vector-values.yaml<\/code>:<\/p>\n<pre><code># Vector (DaemonSet, \u0440\u043e\u043b\u044c Agent) \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442 \u043b\u043e\u0433\u0438 \u0432\u0441\u0435\u0445 \u043f\u043e\u0434\u043e\u0432 \u0438 \u0448\u043b\u0451\u0442 \u0432 VictoriaLogs.role: AgentcustomConfig:  data_dir: \/vector-data-dir  api:    enabled: true    address: 0.0.0.0:8686  sources:    kubernetes_logs:      type: kubernetes_logs  sinks:    vlogs:      type: elasticsearch      inputs: [kubernetes_logs]      endpoints:        - http:\/\/vls-server.vmks.svc.cluster.local:9428\/insert\/elasticsearch\/      api_version: v8      mode: bulk      compression: gzip      healthcheck:        enabled: false      query:        _msg_field: message        _time_field: timestamp        _stream_fields: kubernetes.pod_namespace,kubernetes.container_name        ignore_fields: file,source_type,kubernetes.container_id,kubernetes.container_image_id,kubernetes.pod_ip,kubernetes.pod_ips,kubernetes.pod_uid,kubernetes.node_labels.*,kubernetes.pod_annotations.*,kubernetes.namespace_labels.*<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p><code>query._msg_field: message<\/code>\u00a0\u0438\u00a0<code>query._time_field: timestamp<\/code>\u00a0\u043c\u0430\u043f\u043f\u044f\u0442 \u043f\u043e\u043b\u044f Vector \u043d\u0430 \u0441\u043f\u0435\u0446\u043f\u043e\u043b\u044f VictoriaLogs: \u0442\u0435\u043a\u0441\u0442 \u0431\u0435\u0440\u0451\u0442\u0441\u044f \u0438\u0437\u00a0<code>message<\/code>, \u0432\u0440\u0435\u043c\u044f \u2014 \u0438\u0437\u00a0<code>timestamp<\/code>. \u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u0432 VictoriaLogs\u00a0<code><em>msg<\/em><\/code><em>\u00a0\u0438\u00a0<\/em><code>time<\/code>\u00a0\u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u044b \u0442\u0430\u043a \u0436\u0435, \u043a\u0430\u043a \u043f\u0440\u0438 vlagent, \u0430\u00a0<code>stream<\/code>,\u00a0<code>kubernetes.pod_labels.*<\/code>\u00a0\u0438\u00a0<code>kubernetes.pod_name<\/code>\u00a0Vector \u043e\u0442\u0434\u0430\u0451\u0442 \u043a\u0430\u043a \u0435\u0441\u0442\u044c \u2014 \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u0430\u0432\u0438\u043b\u0430\u00a0<code>VMRule<\/code>\u00a0\u0438\u0437 \u0428\u0430\u0433\u0430 5 \u043d\u0435 \u043c\u0435\u043d\u044f\u044e\u0442\u0441\u044f.<\/p>\n<p><code><em>stream<\/em>fields<\/code>\u00a0\u0437\u0430\u0434\u0430\u0451\u0442 \u043f\u043e\u0442\u043e\u043a VictoriaLogs (\u0431\u0435\u0437 \u043d\u0435\u0433\u043e \u0432\u0441\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \u043f\u043e\u043f\u0430\u0434\u0430\u044e\u0442 \u0432\u00a0<code><em>stream: {}<\/em><\/code><em>).\u00a0<\/em><code><em>ignore<\/em>fields<\/code>\u00a0\u043e\u0442\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u0442 \u0448\u0443\u043c Vector:\u00a0<code>file<\/code>,\u00a0<code>source_type<\/code>, id \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430\/\u043f\u043e\u0434\u0430,\u00a0<code>node_labels.*<\/code>,\u00a0<code>pod_annotations.*<\/code>.<\/p>\n<p>\u041b\u043e\u0433\u0438 \u0441\u0430\u043c\u043e\u0433\u043e \u043a\u043e\u043b\u043b\u0435\u043a\u0442\u043e\u0440\u0430 \u043d\u0435 \u0441\u043e\u0431\u0438\u0440\u0430\u044e\u0442\u0441\u044f: \u0447\u0430\u0440\u0442 \u0441\u0442\u0430\u0432\u0438\u0442 \u043f\u043e\u0434\u0443 \u043b\u0435\u0439\u0431\u043b\u00a0<code>vector.dev\/exclude: \"true\"<\/code>, \u0430 source\u00a0<code>kubernetes_logs<\/code>\u00a0\u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u043f\u043e\u0434\u044b \u0441 \u044d\u0442\u0438\u043c \u043b\u0435\u0439\u0431\u043b\u043e\u043c.<\/p>\n<h4>\u041a\u0430\u043a Vector \u0448\u043b\u0451\u0442 \u0432 VictoriaLogs: \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u044b<\/h4>\n<p>Vector \u043d\u0435 \u0443\u043c\u0435\u0435\u0442 \u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0439 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b vlagent (<code>\/insert\/native<\/code>). \u041e\u043d \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442 \u043b\u043e\u0433\u0438 \u0447\u0435\u0440\u0435\u0437 HTTP API VictoriaLogs. \u0415\u0441\u0442\u044c \u0434\u0432\u0430 \u0440\u0430\u0431\u043e\u0447\u0438\u0445 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430:<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<th>\n<p align=\"left\">\u041f\u0440\u043e\u0442\u043e\u043a\u043e\u043b<\/p>\n<\/th>\n<th>\n<p align=\"left\">Sink\u00a0<code>type<\/code><\/p>\n<\/th>\n<th>\n<p align=\"left\">\u041a\u0430\u043a \u0432 VictoriaLogs<\/p>\n<\/th>\n<th>\n<p align=\"left\">\u041e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438<\/p>\n<\/th>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><strong>Elasticsearch bulk<\/strong>\u00a0(\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c)<\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>elasticsearch<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>\/insert\/elasticsearch\/<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">bulk-\u0431\u0430\u0442\u0447\u0438\u043d\u0433, gzip,\u00a0<code>api_version: v8<\/code>\u00a0\u2014 \u0434\u0435\u0448\u0451\u0432\u0430\u044f \u0434\u043e\u0441\u0442\u0430\u0432\u043a\u0430 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043e\u0431\u044a\u0451\u043c\u043e\u0432. \u0420\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u043e\u0432\u0430\u043d \u0432\u00a0<a href=\"https:\/\/docs.victoriametrics.com\/victorialogs\/data-ingestion\/vector\/\" rel=\"noopener nofollow\">\u0434\u043e\u043a\u0435 VictoriaLogs<\/a><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">HTTP JSON stream (ndjson)<\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>http<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>\/insert\/jsonline<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">codec\u00a0<code>json<\/code>\u00a0+\u00a0<code>framing: newline_delimited<\/code>, \u043f\u0440\u043e\u0449\u0435 \u0432 \u043e\u0442\u043b\u0430\u0434\u043a\u0435, \u043d\u043e \u0431\u0435\u0437 bulk-\u0430\u043a\u043a\u0443\u043c\u0443\u043b\u044f\u0446\u0438\u0438 \u2014 \u043d\u0430 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043f\u043e\u0442\u043e\u043a\u0430\u0445 \u0434\u043e\u0440\u043e\u0436\u0435<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u041c\u044b \u0431\u0435\u0440\u0451\u043c\u00a0<strong>Elasticsearch bulk<\/strong>: \u043e\u043d \u0430\u0433\u0440\u0435\u0433\u0438\u0440\u0443\u0435\u0442 \u0441\u0442\u0440\u043e\u043a\u0438 \u0432 \u043f\u0430\u043a\u0435\u0442\u044b \u0438 \u0441\u0436\u0438\u043c\u0430\u0435\u0442 \u0438\u0445, \u0447\u0442\u043e \u0434\u043b\u044f \u043f\u043e\u0442\u043e\u043a\u0430 \u043b\u043e\u0433\u043e\u0432 Kubernetes \u0434\u0430\u0451\u0442 \u043c\u0435\u043d\u044c\u0448\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0438 \u043d\u0430\u043a\u043b\u0430\u0434\u043d\u044b\u0445 \u0440\u0430\u0441\u0445\u043e\u0434\u043e\u0432 \u043f\u043e CPU\/\u0441\u0435\u0442\u0438, \u0447\u0435\u043c \u043f\u043e\u0441\u0442\u0440\u043e\u0447\u043d\u0430\u044f ndjson-\u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0430.<\/p>\n<h4>vmalert-logs \u0438 \u043f\u0440\u0430\u0432\u0438\u043b\u0430 VMRule<\/h4>\n<p>\u041e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439\u00a0<code>VMAlert<\/code>\u00a0<code>vmalert-logs<\/code>\u00a0\u043f\u043e\u0434 LogsQL \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u043e\u043c\u00a0<a href=\"https:\/\/github.com\/patsevanton\/victorialogs-alerting-by-error-panic\/blob\/main\/manifests\/vmalert-logs.yaml\" rel=\"noopener nofollow\"><code>manifests\/vmalert-logs.yaml<\/code><\/a>:<\/p>\n<p>\u0424\u0430\u0439\u043b\u00a0<code>manifests\/vmalert-logs.yaml<\/code>:<\/p>\n<pre><code>apiVersion: operator.victoriametrics.com\/v1beta1kind: VMAlertmetadata:  name: vmalert-logs  namespace: vmksspec:  datasource:    url: http:\/\/vls-server.vmks.svc.cluster.local:9428  evaluationInterval: 1m  selectAllByDefault: false  ruleSelector:    matchLabels:      type: logs-to-metrics  remoteWrite:    url: http:\/\/vmsingle-vmks-victoria-metrics-k8s-stack.vmks.svc.cluster.local:8428  remoteRead:    url: http:\/\/vmsingle-vmks-victoria-metrics-k8s-stack.vmks.svc.cluster.local:8428  notifiers:    - url: http:\/\/vmalertmanager-vmks-victoria-metrics-k8s-stack.vmks.svc.cluster.local:9093<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p><code>datasource.url<\/code>\u00a0\u2014 VictoriaLogs.\u00a0<code>ruleSelector: type: logs-to-metrics<\/code>\u00a0\u2014 \u0442\u043e\u043b\u044c\u043a\u043e LogsQL-<code>VMRule<\/code>.\u00a0<code>remoteWrite<\/code>\/<code>remoteRead<\/code>\u00a0\u2014 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0430\u043b\u0435\u0440\u0442\u043e\u0432 \u043f\u0438\u0448\u0435\u0442\u0441\u044f \u0432\u00a0<code>vmsingle<\/code>\u00a0\u0438 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043e\u0442\u0442\u0443\u0434\u0430 \u043f\u0440\u0438 \u0440\u0435\u0441\u0442\u0430\u0440\u0442\u0435.<\/p>\n<p>\u041f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u043c\u00a0<code>vmalert-logs<\/code>\u00a0\u0438 \u043f\u0440\u0430\u0432\u0438\u043b\u0430\u00a0<code>VMRule<\/code>\u00a0(\u0441\u0430\u043c\u0438 \u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u044e\u0442\u0441\u044f \u0432 \u0428\u0430\u0433\u0435 5):<\/p>\n<pre><code>kubectl apply -f manifests\/vmalert-logs.yamlkubectl apply -f manifests\/vmalert-rules-golang.yamlkubectl apply -f manifests\/vmalert-rules-nuxt.yaml<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041f\u043e\u0440\u044f\u0434\u043e\u043a \u0441\u0442\u0440\u043e\u0433\u0438\u0439: vmks \u0441\u043e\u0437\u0434\u0430\u0451\u0442 CRD \u0438 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 (\u0428\u0430\u0433 1), VictoriaLogs \u2014 datasource (\u0428\u0430\u0433 2), \u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u044e\u0442\u0441\u044f\u00a0<code>vmalert-logs<\/code>\u00a0\u0438\u00a0<code>VMRule<\/code>. \u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f (\u0428\u0430\u0433 4) \u043f\u043e\u0434\u043d\u0438\u043c\u0430\u044e\u0442\u0441\u044f \u0443\u0436\u0435 \u043f\u0440\u0438 \u0433\u043e\u0442\u043e\u0432\u043e\u043c \u0430\u043b\u0435\u0440\u0442\u0438\u043d\u0433\u0435.<\/p>\n<h3>\u0428\u0430\u0433 4. \u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0430\u0434\u0430\u044e\u0442<\/h3>\n<h4>Go:\u00a0apps\/golang-app<\/h4>\n<p>\u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 (<a href=\"https:\/\/github.com\/patsevanton\/victorialogs-alerting-by-error-panic\/blob\/main\/apps\/golang-app\/main.go\" rel=\"noopener nofollow\"><code>main.go<\/code><\/a>) \u043f\u0438\u0448\u0435\u0442 \u043e\u0431\u044b\u0447\u043d\u044b\u0435 \u043b\u043e\u0433\u0438 \u0432\u00a0<code>stdout<\/code>\u00a0(<code>infoLog<\/code>), \u0430 \u043e\u0448\u0438\u0431\u043a\u0438\/panic\/fatal \u2014 \u0432\u00a0<code>stderr<\/code>\u00a0(<code>errLog<\/code>):<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<th>\n<p align=\"left\">\u042d\u043d\u0434\u043f\u043e\u0438\u043d\u0442<\/p>\n<\/th>\n<th>\n<p align=\"left\">\u0427\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432 \u043f\u0440\u043e\u0434\u0435<\/p>\n<\/th>\n<th>\n<p align=\"left\">\u0427\u0442\u043e \u043b\u043e\u0432\u0438\u0442\u0441\u044f<\/p>\n<\/th>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><code>\/panic<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>panic(\"boom: ...\")<\/code>\u00a0\u0441\u00a0<code>recover<\/code>\u00a0\u0432\u00a0<code>defer<\/code>, \u043b\u043e\u0433\u00a0<code>ERROR: recovered panic ...<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>GolangRecoveredPanic<\/code><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><code>\/nil<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">nil pointer dereference (runtime-\u043f\u0430\u043d\u0438\u043a\u0430, \u0431\u0435\u0437 recover)<\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>GolangPanicDetected<\/code><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><code>\/index<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">index out of range (runtime-\u043f\u0430\u043d\u0438\u043a\u0430)<\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>GolangPanicDetected<\/code><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><code>\/fatal<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>errLog.Fatalf(\"FATAL: ...\")<\/code>\u00a0\u2192\u00a0<code>os.Exit(1)<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>GolangFatalLog<\/code><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><code>\/error<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u043b\u043e\u0433\u00a0<code>ERROR: failed to connect ...<\/code>, \u043e\u0442\u0432\u0435\u0442 502<\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>GolangErrorLog<\/code><\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p><strong>Runtime-\u043f\u0430\u043d\u0438\u043a\u0438<\/strong>\u00a0(<code>nil pointer dereference<\/code>,\u00a0<code>index out of range<\/code>) Go \u043f\u0435\u0447\u0430\u0442\u0430\u0435\u0442 \u043a\u0430\u043a\u00a0<code>http: panic serving ...: runtime error: ...<\/code>\u00a0\u2014 \u0434\u0432\u043e\u0435\u0442\u043e\u0447\u0438\u044f \u043f\u043e\u0441\u043b\u0435\u00a0<code>panic<\/code>\u00a0\u0442\u0430\u043c \u043d\u0435\u0442, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u0430\u0432\u0438\u043b\u043e\u00a0<code>GolangPanicDetected<\/code>\u00a0\u043c\u0430\u0442\u0447\u0438\u0442\u00a0<code><em>msg:~\"runtime error\"<\/em><\/code><em>, \u0430 \u043d\u0435\u00a0<\/em><code><em>panic:<\/em><\/code><em>. \u042f\u0432\u043d\u044b\u0439\u00a0<\/em><code><em>panic(\"...\")<\/em><\/code><em>\u00a0\u0441\u00a0<\/em><code><em>recover<\/em><\/code><em>\u00a0\u0443\u0445\u043e\u0434\u0438\u0442 \u0432\u00a0<\/em><code><em>ERROR: recovered panic ...<\/em><\/code><em>: \u043d\u0430 \u043d\u0435\u0433\u043e \u0437\u0430\u0432\u0435\u0434\u0435\u043d\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u043e\u00a0<\/em><code><em>GolangRecoveredPanic<\/em><\/code><em>, \u0430 \u0438\u0437\u00a0<\/em><code><em>GolangErrorLog<\/em><\/code><em>\u00a0\u0442\u0430\u043a\u0438\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u044b (<\/em><code><em>NOT <\/em>msg:~\"recovered panic\"<\/code>) \u2014 \u043a\u0430\u0436\u0434\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0434\u0430\u0451\u0442 \u0440\u043e\u0432\u043d\u043e \u043e\u0434\u0438\u043d \u0430\u043b\u0435\u0440\u0442.\u00a0<code>log.Fatal<\/code>\u00a0\u043f\u0438\u0448\u0435\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0438 \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u0435\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441; pod \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f, \u043b\u043e\u0433 \u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u0432 VictoriaLogs, \u0435\u0433\u043e \u043b\u043e\u0432\u0438\u0442\u00a0<code>GolangFatalLog<\/code>.<\/p>\n<pre><code>\/\/ main.go \u2014 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442mux.HandleFunc(\"\/panic\", func(w http.ResponseWriter, r *http.Request) {    defer func() {        if rec := recover(); rec != nil {            errLog.Printf(\"ERROR: recovered panic on \/panic: %v\", rec)            http.Error(w, \"internal failure\", http.StatusInternalServerError)        }    }()    panic(\"boom: something went really wrong\")})mux.HandleFunc(\"\/nil\", func(w http.ResponseWriter, r *http.Request) {    var p *int    _ = *p \/\/ runtime panic: nil pointer dereference})mux.HandleFunc(\"\/fatal\", func(w http.ResponseWriter, r *http.Request) {    errLog.Fatalf(\"FATAL: unrecoverable configuration error on \/fatal\")})<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041c\u0430\u043d\u0438\u0444\u0435\u0441\u0442:\u00a0<a href=\"https:\/\/github.com\/patsevanton\/victorialogs-alerting-by-error-panic\/blob\/main\/manifests\/golang-app.yaml\" rel=\"noopener nofollow\"><code>manifests\/golang-app.yaml<\/code><\/a>\u00a0(Deployment + Service \u0432 namespace\u00a0<code>apps<\/code>).<\/p>\n<h4>Nuxt:\u00a0apps\/nuxt-app<\/h4>\n<p>Nitro\/Nuxt \u043b\u043e\u0433\u0438\u0440\u0443\u0435\u0442 \u043e\u0448\u0438\u0431\u043a\u0438 \u0441\u0435\u0440\u0432\u0435\u0440\u043d\u044b\u0445 \u0445\u0435\u043d\u0434\u043b\u0435\u0440\u043e\u0432 \u0447\u0435\u0440\u0435\u0437\u00a0<code>console.error<\/code>\u00a0(\u0432\u00a0<code>stderr<\/code>):<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<th>\n<p align=\"left\">\u042d\u043d\u0434\u043f\u043e\u0438\u043d\u0442<\/p>\n<\/th>\n<th>\n<p align=\"left\">\u0427\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432 \u043f\u0440\u043e\u0434\u0435<\/p>\n<\/th>\n<th>\n<p align=\"left\">\u0427\u0442\u043e \u043b\u043e\u0432\u0438\u0442\u0441\u044f<\/p>\n<\/th>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><code>\/api\/error<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>createError<\/code>\u00a0\u0441\u043e\u00a0<code>statusCode: 500<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>NUXT_ERROR<\/code><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><code>\/api\/throw<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u043d\u0435\u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u043e\u0435 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 (<code>throw new Error<\/code>)<\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>NUXT_UNHANDLED<\/code><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><code>\/api\/rejection<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u043d\u0435\u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u044b\u0439 promise rejection<\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>NUXT_REJECTION<\/code><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><code>\/api\/fatal<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>console.error('NUXT_FATAL: ...')<\/code>\u00a0+\u00a0<code>process.exit(1)<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>NUXT_FATAL<\/code><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><code>\/api\/error-502<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u043b\u043e\u0433\u00a0<code>NUXT_502: ...<\/code>, \u043e\u0442\u0432\u0435\u0442 502 (\u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0436\u0438\u0432\u0451\u0442)<\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>NUXT_502<\/code><\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u041f\u0440\u0430\u0432\u0438\u043b\u0430 \u0441\u0442\u0440\u043e\u044f\u0442\u0441\u044f \u043f\u043e \u044d\u0442\u0438\u043c \u043c\u0430\u0440\u043a\u0435\u0440\u0430\u043c. \u0412 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0434\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u0442\u044c\u0441\u044f \u043e \u0435\u0434\u0438\u043d\u043e\u043c \u0444\u043e\u0440\u043c\u0430\u0442\u0435 (<code>level<\/code>,\u00a0<code>message<\/code>,\u00a0<code>requestId<\/code>) \u0438 \u043f\u0438\u0441\u0430\u0442\u044c \u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u043f\u043e\u0434 \u043d\u0435\u0433\u043e.<\/p>\n<pre><code>\/\/ server\/api\/error.ts \u2014 500 \u0447\u0435\u0440\u0435\u0437 createErrorexport default defineEventHandler(() =&gt; {  console.error('NUXT_ERROR: upstream database unavailable on \/api\/error')  throw createError({ statusCode: 500, statusMessage: 'Upstream database unavailable' })})\/\/ server\/api\/throw.ts \u2014 \u043d\u0435\u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u043e\u0435 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435export default defineEventHandler(() =&gt; {  console.error('NUXT_UNHANDLED: unhandled rejection on \/api\/throw')  throw new Error('unhandled exception in \/api\/throw')})\/\/ server\/api\/rejection.ts \u2014 \u043d\u0435\u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u044b\u0439 promise rejectionexport default defineEventHandler(() =&gt; {  console.error('NUXT_REJECTION: unhandled promise rejection on \/api\/rejection')  void Promise.reject(new Error('unhandled rejection in \/api\/rejection'))  return { status: 'triggered' }})\/\/ server\/api\/fatal.ts \u2014 \u0444\u0430\u0442\u0430\u043b\u044c\u043d\u0430\u044f \u043e\u0448\u0438\u0431\u043a\u0430, process.exit(1)export default defineEventHandler(() =&gt; {  console.error('NUXT_FATAL: unrecoverable configuration error on \/api\/fatal')  process.exit(1)})\/\/ server\/api\/error-502.ts \u2014 \u043e\u0448\u0438\u0431\u043a\u0430 \u0431\u0435\u0437 \u043a\u0440\u0430\u0445\u0430, \u043e\u0442\u0432\u0435\u0442 502export default defineEventHandler((event) =&gt; {  console.error('NUXT_502: upstream timeout on \/api\/error-502')  setResponseStatus(event, 502)  return { error: 'Bad Gateway' }})<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041c\u0430\u043d\u0438\u0444\u0435\u0441\u0442:\u00a0<a href=\"https:\/\/github.com\/patsevanton\/victorialogs-alerting-by-error-panic\/blob\/main\/manifests\/nuxt-app.yaml\" rel=\"noopener nofollow\"><code>manifests\/nuxt-app.yaml<\/code><\/a>.<\/p>\n<pre><code>kubectl create namespace appskubectl apply -f manifests\/golang-app.yamlkubectl apply -f manifests\/nuxt-app.yaml<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<h4>\u041e\u0448\u0438\u0431\u043a\u0438 \u043f\u0438\u0448\u0443\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0432 stderr, \u0430 \u043d\u0435 \u0432 stdout<\/h4>\n<p>\u0412 \u043e\u0431\u043e\u0438\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u0445 \u043e\u0434\u043d\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u043e:\u00a0<strong>\u043e\u0431\u044b\u0447\u043d\u044b\u0435 \u043b\u043e\u0433\u0438 \u2014 \u0432 stdout, panic\/fatal\/error\/500\/502 \u0438 \u043d\u0435\u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u044b\u0435 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u2014 \u0442\u043e\u043b\u044c\u043a\u043e \u0432 stderr.<\/strong>\u00a0\u042d\u0442\u043e \u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442 \u0441 \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d\u043e\u043c \u0430\u043b\u0435\u0440\u0442\u0438\u043d\u0433\u0430.<\/p>\n<p>Kubernetes-\u0440\u0430\u043d\u0442\u0430\u0439\u043c \u043f\u0438\u0448\u0435\u0442 stdout \u0438 stderr \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u0432 \u0434\u0432\u0430 \u0444\u0430\u0439\u043b\u0430 (<code>*.log<\/code>), \u0430 Vector \u0440\u0430\u0437\u043c\u0435\u0447\u0430\u0435\u0442 \u043a\u0430\u0436\u0434\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443 \u043f\u043e\u043b\u0435\u043c\u00a0<code>stream=stdout<\/code>\u00a0\u0438\u043b\u0438\u00a0<code>stream=stderr<\/code>. VictoriaLogs \u0445\u0440\u0430\u043d\u0438\u0442\u00a0<code>stream<\/code>\u00a0\u043a\u0430\u043a \u043e\u0431\u044b\u0447\u043d\u043e\u0435 \u043f\u043e\u043b\u0435. \u0415\u0441\u043b\u0438 \u043e\u0448\u0438\u0431\u043a\u0438 \u043f\u0438\u0448\u0443\u0442\u0441\u044f \u0432 stdout, \u044d\u0442\u043e\u0433\u043e \u0441\u0438\u0433\u043d\u0430\u043b\u0430 \u043d\u0435\u0442: \u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u043b\u043e\u0432\u0438\u0442\u044c \u0438\u0445 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e \u0442\u0435\u043a\u0441\u0442\u0443.<\/p>\n<p>\u0412 LogsQL \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043a\u0430 \u043f\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044e (<code>_msg:~\"panic\"<\/code>) \u2014 \u0441\u0430\u043c\u0430\u044f \u0434\u043e\u0440\u043e\u0433\u0430\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f: \u043e\u043d\u0430 \u0447\u0438\u0442\u0430\u0435\u0442 \u0442\u0435\u043b\u043e \u043a\u0430\u0436\u0434\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438. \u0424\u0438\u043b\u044c\u0442\u0440 \u043f\u043e \u043f\u043e\u043b\u044e (<code>stream:=stderr<\/code>) \u0438 \u043f\u043e \u043b\u0435\u0439\u0431\u043b\u0443 (<code>kubernetes.pod_<\/code><a href=\"http:\/\/labels.app\" rel=\"noopener nofollow\"><code>labels.app<\/code><\/a><code>:=...<\/code>) \u2014 \u043e\u0442\u0431\u043e\u0440 \u043f\u043e \u0443\u0436\u0435 \u043f\u0440\u043e\u0438\u043d\u0434\u0435\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c, \u043e\u043d \u0434\u0451\u0448\u0435\u0432. \u041f\u043e\u0440\u044f\u0434\u043e\u043a: \u0441\u043d\u0430\u0447\u0430\u043b\u0430 app \u0438 stream, \u043f\u043e\u0442\u043e\u043c \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043a\u0430 \u043f\u043e \u043e\u0441\u0442\u0430\u0432\u0448\u0438\u043c\u0441\u044f \u0441\u0442\u0440\u043e\u043a\u0430\u043c. \u0411\u0435\u0437\u00a0<code>stream:=stderr<\/code>\u00a0\u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043a\u0430 \u0448\u043b\u0430 \u0431\u044b \u043f\u043e \u0432\u0441\u0435\u043c\u0443 stdout \u2014 info\/debug \u043d\u0430 \u043a\u0430\u0436\u0434\u044b\u0439 \u0437\u0430\u043f\u0443\u0441\u043a \u043f\u0440\u0430\u0432\u0438\u043b\u0430.<\/p>\n<h4>\u041f\u0440\u0438\u043c\u0435\u0440\u043d\u0430\u044f \u0440\u0430\u0437\u043d\u0438\u0446\u0430 \u0432 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0435 \u043d\u0430 VictoriaLogs<\/h4>\n<p>\u041f\u0443\u0441\u0442\u044c \u0443 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0437\u0430 \u043c\u0438\u043d\u0443\u0442\u0443:<\/p>\n<ul>\n<li>\n<p><strong>stdout<\/strong>\u00a0(info\/debug\/access): 10 000 \u0441\u0442\u0440\u043e\u043a;<\/p>\n<\/li>\n<li>\n<p><strong>stderr<\/strong>\u00a0(\u043e\u0448\u0438\u0431\u043a\u0438, panic, warnings): 100 \u0441\u0442\u0440\u043e\u043a.<\/p>\n<\/li>\n<\/ul>\n<p>\u0422\u043e\u0433\u0434\u0430 \u0434\u043b\u044f \u043e\u0434\u043d\u043e\u0433\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u0441\u00a0<code>_time: 2m<\/code>:<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<th>\n<p align=\"left\">\u041f\u043e\u0440\u044f\u0434\u043e\u043a \u0444\u0438\u043b\u044c\u0442\u0440\u043e\u0432 \u0432 \u043f\u0440\u0430\u0432\u0438\u043b\u0435<\/p>\n<\/th>\n<th>\n<p align=\"left\">\u0421\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u0442\u0440\u043e\u043a \u0447\u0438\u0442\u0430\u0435\u0442 VictoriaLogs \u043f\u043e\u0434 \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043a\u0443 \u0437\u0430 \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435<\/p>\n<\/th>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u0442\u043e\u043b\u044c\u043a\u043e\u00a0<code>_msg:~\"...\"<\/code>\u00a0(\u043f\u043e \u0432\u0441\u0435\u043c\u0443 \u043f\u043e\u0442\u043e\u043a\u0443)<\/p>\n<\/td>\n<td>\n<p align=\"left\">~20 200 (\u0432\u0435\u0441\u044c stdout + stderr \u0437\u0430 2m)<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><code>app:=...<\/code>\u00a0\u043f\u043e\u0442\u043e\u043c\u00a0<code>_msg:~\"...\"<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">~20 200 (app \u043d\u0435 \u0440\u0430\u0437\u0434\u0435\u043b\u044f\u0435\u0442 \u043f\u043e\u0442\u043e\u043a \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f)<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><code>app:=...<\/code>\u00a0\u2192\u00a0<code>stream:=stderr<\/code>\u00a0\u2192\u00a0<code>_msg:~\"...\"<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">200 (2 \u043c\u0438\u043d\u0443\u0442\u044b \u0442\u043e\u043b\u044c\u043a\u043e stderr)<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p><code>stream:=stderr<\/code>\u00a0\u0443\u0431\u0438\u0440\u0430\u0435\u0442 ~99% \u0441\u0442\u0440\u043e\u043a \u0434\u043e \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043a\u0438. \u041f\u0440\u0430\u0432\u0438\u043b\u043e \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043a\u0430\u0436\u0434\u044b\u0439\u00a0<code>interval<\/code>\u00a0(\u0443 \u043d\u0430\u0441 \u0440\u0430\u0437 \u0432 1m) \u0438 \u0441\u043a\u0430\u043d\u0438\u0440\u0443\u0435\u0442 \u043e\u043a\u043d\u043e\u00a0<code>_time<\/code>\u00a0\u0437\u0430\u043d\u043e\u0432\u043e: \u0431\u0435\u0437\u00a0<code>stream<\/code>\u00a0\u0437\u0430 \u0447\u0430\u0441 \u043f\u043e\u0434 \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043a\u0443 \u0443\u0448\u043b\u043e \u0431\u044b ~1,2 \u043c\u043b\u043d \u0441\u0442\u0440\u043e\u043a, \u0441 \u043d\u0438\u043c \u2014 ~12 \u0442\u044b\u0441\u044f\u0447.<\/p>\n<p>\u041e\u0442\u0431\u043e\u0440 \u043f\u043e \u043f\u043e\u043b\u044f\u043c \u0438 \u043f\u043e\u00a0<code><em>stream<\/em><\/code><em>\u00a0VictoriaLogs \u0434\u0435\u043b\u0430\u0435\u0442 \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0430\u043c\/\u0431\u043b\u043e\u043a\u0430\u043c \u0441\u0442\u0440\u0438\u043c\u043e\u0432 \u043f\u043e\u0447\u0442\u0438 \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u043e; \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043a\u0430 \u2014 CPU \u043d\u0430 \u0440\u0430\u0441\u043f\u0430\u043a\u043e\u0432\u043a\u0443 \u0438 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u0442\u0435\u043a\u0441\u0442\u0430. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432 \u0428\u0430\u0433\u0435 5\u00a0<\/em><code><em>stream:=stderr<\/em><\/code><em>\u00a0\u0441\u0442\u043e\u0438\u0442 \u043f\u0435\u0440\u0435\u0434\u00a0<\/em><code>msg:~\"...\"<\/code>\u00a0, \u0430\u00a0<code>stats<\/code>\u00a0\u2014 \u0432 \u043a\u043e\u043d\u0446\u0435, \u043a\u043e\u0433\u0434\u0430 \u0430\u0433\u0440\u0435\u0433\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0443\u0436\u0435 \u043f\u043e\u0447\u0442\u0438 \u043d\u0435\u0447\u0435\u0433\u043e.<\/p>\n<p>\u0427\u0442\u043e\u0431\u044b \u043f\u043e\u043d\u044f\u0442\u044c \u043d\u0430\u0433\u043b\u044f\u0434\u043a\u043e \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u043b\u043e\u0433\u043e\u0432 \u0432 stdout \u0438 \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u043b\u043e\u0433\u043e\u0432 \u0432 stderr \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u0443\u044e \u043a\u0430\u0440\u0442\u0438\u043d\u0443. \u0421\u043b\u0435\u0432\u0430 \u043f\u0443\u0441\u0442\u043e\u0435 \u043f\u0440\u043e\u0441\u0442\u0430\u043d\u0441\u0442\u0432\u043e \u044d\u0442\u043e \u043e\u0431\u044b\u0447\u043d\u044b\u0435 \u043b\u043e\u0433\u0438. \u0421\u043f\u0440\u0430\u0432\u0430 \u043f\u043e\u0442\u043e\u043a \u0442\u043e\u043b\u044c\u043a\u043e stderr.<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/a5b\/14b\/7ec\/a5b14b7eca7725619e854e6d1878ca93.png\" alt=\"\u041f\u043e\u0438\u0441\u043a \u043e\u0448\u0438\u0431\u043e\u043a \u043f\u043e stdout \u0438 stderr\" width=\"686\" height=\"831\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/a5b\/14b\/7ec\/a5b14b7eca7725619e854e6d1878ca93.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/a5b\/14b\/7ec\/a5b14b7eca7725619e854e6d1878ca93.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u041f\u043e\u0438\u0441\u043a \u043e\u0448\u0438\u0431\u043e\u043a \u043f\u043e stdout \u0438 stderr<\/figcaption><\/div>\n<\/figure>\n<h3>\u0428\u0430\u0433 5. \u041f\u0440\u0430\u0432\u0438\u043b\u0430 \u0430\u043b\u0435\u0440\u0442\u043e\u0432 \u0432 VMRule<\/h3>\n<p>\u041f\u0440\u0430\u0432\u0438\u043b\u0430 \u2014 \u0434\u0432\u0430 CRD\u00a0<code>VMRule<\/code>\u00a0\u043f\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u043c (<a href=\"https:\/\/github.com\/patsevanton\/victorialogs-alerting-by-error-panic\/blob\/main\/manifests\/vmalert-rules-golang.yaml\" rel=\"noopener nofollow\"><code>manifests\/vmalert-rules-golang.yaml<\/code><\/a>\u00a0\u0438\u00a0<a href=\"https:\/\/github.com\/patsevanton\/victorialogs-alerting-by-error-panic\/blob\/main\/manifests\/vmalert-rules-nuxt.yaml\" rel=\"noopener nofollow\"><code>manifests\/vmalert-rules-nuxt.yaml<\/code><\/a>). \u0418\u0445 \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u00a0<code>vmalert-logs<\/code>\u00a0(\u0428\u0430\u0433 3). \u0420\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u0435 \u043f\u043e \u0444\u0430\u0439\u043b\u0443 \u0443\u043f\u0440\u043e\u0449\u0430\u0435\u0442 \u0440\u0435\u0432\u044c\u044e \u0438 CODEOWNERS. \u041e\u0431\u0430\u00a0<code>VMRule<\/code>\u00a0\u0443\u0436\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u044b \u0432 \u043a\u043e\u043d\u0446\u0435 \u0428\u0430\u0433\u0430 3; \u043d\u0438\u0436\u0435 \u2014 \u0440\u0430\u0437\u0431\u043e\u0440 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e.<\/p>\n<p>\u0424\u0430\u0439\u043b\u00a0<code>manifests\/vmalert-rules-golang.yaml<\/code>:<\/p>\n<pre><code>apiVersion: operator.victoriametrics.com\/v1beta1kind: VMRulemetadata:  name: vmalert-rules-golang  namespace: vmks  labels:    type: logs-to-metricsspec:  groups:    - name: golang-app      type: vlogs      # \u041a\u0430\u043a \u0447\u0430\u0441\u0442\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f LogsQL-\u0437\u0430\u043f\u0440\u043e\u0441 \u044d\u0442\u043e\u0439 \u0433\u0440\u0443\u043f\u043f\u044b: \u0440\u0430\u0437 \u0432 \u043c\u0438\u043d\u0443\u0442\u0443.      # \u041f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 evaluationInterval \u0438\u0437 VMAlert.      interval: 1m      rules:        - alert: GolangPanicDetected          # Runtime-\u043f\u0430\u043d\u0438\u043a\u0438 (`nil pointer dereference`, `index out of range`)          # Go \u043f\u0438\u0448\u0435\u0442 \u043a\u0430\u043a `http: panic serving ...: runtime error: ...` \u2014 \u0431\u0435\u0437          # \u0434\u0432\u043e\u0435\u0442\u043e\u0447\u0438\u044f \u043f\u043e\u0441\u043b\u0435 panic, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043b\u043e\u0432\u0438\u043c \u043f\u043e `runtime error`.          expr: |            _time: 2m              | kubernetes.pod_labels.app:=golang-app              | stream:=stderr              | _msg:~\"runtime error\"              | stats by (kubernetes.pod_name) count() as panics              | filter panics:&gt;0          for: 1m          labels:            severity: critical            app: golang-app          annotations:            summary: \"runtime panic \u0432 golang-app\"            description: |              Runtime-\u043f\u0430\u043d\u0438\u043a \u0443 \u043f\u043e\u0434\u0430 {{ index $labels \"kubernetes.pod_name\" }} \u0437\u0430 2m: {{ $value }}.        - alert: GolangRecoveredPanic          # panic(\"...\"), \u043f\u0435\u0440\u0435\u0445\u0432\u0430\u0447\u0435\u043d\u043d\u044b\u0439 recover: \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0436\u0438\u0432\u0451\u0442, \u043d\u043e \u0432 stderr          # \u0443\u0445\u043e\u0434\u0438\u0442 `ERROR: recovered panic ...`. \u041e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0430\u043b\u0435\u0440\u0442, \u0447\u0442\u043e\u0431\u044b          # GolangErrorLog \u043d\u0435 \u0434\u0443\u0431\u043b\u0438\u0440\u043e\u0432\u0430\u043b \u0435\u0433\u043e.          expr: |            _time: 2m              | kubernetes.pod_labels.app:=golang-app              | stream:=stderr              | _msg:~\"recovered panic\"              | stats by (kubernetes.pod_name) count() as recovered              | filter recovered:&gt;0          for: 1m          labels:            severity: critical            app: golang-app          annotations:            summary: \"recovered panic \u0432 golang-app\"            description: |              \u041f\u0435\u0440\u0435\u0445\u0432\u0430\u0447\u0435\u043d\u043d\u044b\u0445 panic (recover) \u0443 \u043f\u043e\u0434\u0430 {{ index $labels \"kubernetes.pod_name\" }} \u0437\u0430 2m: {{ $value }}.        - alert: GolangFatalLog          expr: |            _time: 2m              | kubernetes.pod_labels.app:=golang-app              | stream:=stderr              | _msg:~\"FATAL\"              | stats count() as fatals              | filter fatals:&gt;0          for: 1m          labels:            severity: critical            app: golang-app          annotations:            summary: \"log.Fatal \u0432 golang-app\"            description: |              \u0412\u044b\u0437\u043e\u0432 log.Fatalf \u0432 golang-app. \u0424\u0430\u0442\u0430\u043b\u043e\u0432 \u0437\u0430 2m: {{ $value }}.        - alert: GolangErrorLog          # NOT _msg:~\"recovered panic\" \u0438\u0441\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \/panic: \u0435\u0433\u043e \u0432\u0435\u0434\u0451\u0442          # GolangRecoveredPanic, \u0438\u043d\u0430\u0447\u0435 \u043e\u0434\u043d\u043e \u0441\u043e\u0431\u044b\u0442\u0438\u0435 \u0434\u0430\u0432\u0430\u043b\u043e \u0431\u044b \u0434\u0432\u0430 \u0430\u043b\u0435\u0440\u0442\u0430.          expr: |            _time: 2m              | kubernetes.pod_labels.app:=golang-app              | stream:=stderr              | _msg:~\"ERROR\"              | NOT _msg:~\"recovered panic\"              | stats count() as errors              | filter errors:&gt;0          for: 2m          labels:            severity: warning            app: golang-app          annotations:            summary: \"\u043e\u0448\u0438\u0431\u043a\u0430 \u0432 golang-app\"            description: \"\u041e\u0448\u0438\u0431\u043e\u043a \u0432 \u043b\u043e\u0433\u0430\u0445 golang-app \u0437\u0430 2m: {{ $value }}.\"<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0423 nuxt-app \u0442\u0430 \u0436\u0435 \u0441\u0445\u0435\u043c\u0430 \u043f\u0430\u0439\u043f\u0430 (<code>_time<\/code>\u00a0\u2192 app \u2192\u00a0<code>stream:=stderr<\/code>\u00a0\u2192\u00a0<code>_msg<\/code>\u00a0\u2192\u00a0<code>stats<\/code>\u00a0\u2192\u00a0<code>filter<\/code>), \u0434\u0440\u0443\u0433\u0438\u0435 \u043c\u0430\u0440\u043a\u0435\u0440\u044b \u0438 \u043e\u043a\u043d\u0430\u00a0<code>for<\/code>:<\/p>\n<p>\u0424\u0430\u0439\u043b\u00a0<code>manifests\/vmalert-rules-nuxt.yaml<\/code>:<\/p>\n<pre><code>apiVersion: operator.victoriametrics.com\/v1beta1kind: VMRulemetadata:  name: vmalert-rules-nuxt  namespace: vmks  labels:    type: logs-to-metricsspec:  groups:    - name: nuxt-app      type: vlogs      # \u041a\u0430\u043a \u0447\u0430\u0441\u0442\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f LogsQL-\u0437\u0430\u043f\u0440\u043e\u0441 \u044d\u0442\u043e\u0439 \u0433\u0440\u0443\u043f\u043f\u044b: \u0440\u0430\u0437 \u0432 \u043c\u0438\u043d\u0443\u0442\u0443.      # \u041f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 evaluationInterval \u0438\u0437 VMAlert.      interval: 1m      rules:        - alert: NuxtServerError          expr: |            _time: 2m              | kubernetes.pod_labels.app:=nuxt-app              | stream:=stderr              | _msg:~\"NUXT_ERROR\"              | stats count() as errors              | filter errors:&gt;0          for: 2m          labels:            severity: warning            app: nuxt-app          annotations:            summary: \"500 \u0432 nuxt-app\"            description: \"\u0421\u0435\u0440\u0432\u0435\u0440\u043d\u044b\u0445 \u043e\u0448\u0438\u0431\u043e\u043a (500) \u0432 nuxt-app \u0437\u0430 2m: {{ $value }}.\"        - alert: NuxtUnhandledRejection          expr: |            _time: 2m              | kubernetes.pod_labels.app:=nuxt-app              | stream:=stderr              | _msg:~\"NUXT_UNHANDLED\"              | stats count() as unhandled              | filter unhandled:&gt;0          for: 1m          labels:            severity: critical            app: nuxt-app          annotations:            summary: \"\u043d\u0435\u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u043e\u0435 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0432 nuxt-app\"            description: |              \u041d\u0435\u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u044b\u0445 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0439 \u0432 nuxt-app \u0437\u0430 2m: {{ $value }}.        - alert: NuxtUnhandledPromiseRejection          expr: |            _time: 2m              | kubernetes.pod_labels.app:=nuxt-app              | stream:=stderr              | _msg:~\"NUXT_REJECTION\"              | stats count() as rejections              | filter rejections:&gt;0          for: 1m          labels:            severity: critical            app: nuxt-app          annotations:            summary: \"\u043d\u0435\u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u044b\u0439 promise rejection \u0432 nuxt-app\"            description: |              \u041d\u0435\u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u044b\u0445 promise rejection \u0432 nuxt-app \u0437\u0430 2m: {{ $value }}.        - alert: NuxtFatalLog          expr: |            _time: 2m              | kubernetes.pod_labels.app:=nuxt-app              | stream:=stderr              | _msg:~\"NUXT_FATAL\"              | stats count() as fatals              | filter fatals:&gt;0          for: 1m          labels:            severity: critical            app: nuxt-app          annotations:            summary: \"fatal \u0432 nuxt-app\"            description: |              \u0412\u044b\u0437\u043e\u0432 process.exit \u0432 nuxt-app. \u0424\u0430\u0442\u0430\u043b\u043e\u0432 \u0437\u0430 2m: {{ $value }}.        - alert: NuxtBadGateway          expr: |            _time: 2m              | kubernetes.pod_labels.app:=nuxt-app              | stream:=stderr              | _msg:~\"NUXT_502\"              | stats count() as badgateways              | filter badgateways:&gt;0          for: 2m          labels:            severity: warning            app: nuxt-app          annotations:            summary: \"502 \u0432 nuxt-app\"            description: \"\u041e\u0442\u0432\u0435\u0442\u043e\u0432 502 \u0432 nuxt-app \u0437\u0430 2m: {{ $value }}.\"<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0420\u0430\u0437\u0431\u043e\u0440 LogsQL-\u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f:<\/p>\n<ul>\n<li>\n<p><code>_time: 2m<\/code>\u00a0\u2014 \u043e\u043a\u043d\u043e \u0432\u044b\u0431\u043e\u0440\u043a\u0438: \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0437\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 2 \u043c\u0438\u043d\u0443\u0442\u044b;<\/p>\n<\/li>\n<li>\n<p><code>kubernetes.pod_<\/code><a href=\"http:\/\/labels.app\" rel=\"noopener nofollow\"><code>labels.app<\/code><\/a><code>:=golang-app<\/code>\u00a0\u2014 \u0444\u0438\u043b\u044c\u0442\u0440 \u043f\u043e \u043b\u0435\u0439\u0431\u043b\u0443 \u043f\u043e\u0434\u0430 (\u0434\u043e\u0431\u0430\u0432\u0438\u043b Vector);<\/p>\n<\/li>\n<li>\n<p><code>stream:=stderr<\/code>\u00a0\u2014 \u0442\u043e\u043b\u044c\u043a\u043e stderr, \u043a\u0443\u0434\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043f\u0438\u0448\u0435\u0442 \u043e\u0448\u0438\u0431\u043a\u0438;<\/p>\n<\/li>\n<li>\n<p><code>_msg:~\"panic\"<\/code>\u00a0\u2014 \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043a\u0430 \u043f\u043e \u0442\u0435\u043a\u0441\u0442\u0443;<\/p>\n<\/li>\n<li>\n<p><code>stats by (kubernetes.pod_name) count() as panics<\/code>\u00a0\u2014 \u0447\u0438\u0441\u043b\u043e \u0441\u043e\u0432\u043f\u0430\u0434\u0435\u043d\u0438\u0439 \u043f\u043e \u043f\u043e\u0434\u0443;<\/p>\n<\/li>\n<li>\n<p><code>filter panics:&gt;0<\/code>\u00a0\u2014 \u0442\u043e\u043b\u044c\u043a\u043e \u0433\u0440\u0443\u043f\u043f\u044b, \u0433\u0434\u0435 \u0441\u0440\u0430\u0431\u043e\u0442\u0430\u043b\u043e.<\/p>\n<\/li>\n<\/ul>\n<p>\u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e\u00a0<code>vmalert<\/code>\u00a0\u0441\u0447\u0438\u0442\u0430\u0435\u0442 \u043f\u0440\u0430\u0432\u0438\u043b\u0430\u00a0<code>prometheus<\/code>-\u0442\u0438\u043f\u0430 \u0438 \u0432\u0430\u043b\u0438\u0434\u0438\u0440\u0443\u0435\u0442 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043a\u0430\u043a PromQL.\u00a0<code>type: vlogs<\/code>\u00a0\u043d\u0430 \u0433\u0440\u0443\u043f\u043f\u0435 \u0433\u043e\u0432\u043e\u0440\u0438\u0442, \u0447\u0442\u043e \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u044b \u043d\u0430 LogsQL. Time-\u0444\u0438\u043b\u044c\u0442\u0440 \u0437\u0430\u0434\u0430\u043d \u044f\u0432\u043d\u043e (<code>_time: 2m<\/code>) \u2014 \u044d\u0442\u043e \u043e\u043a\u043d\u043e VictoriaLogs \u0441\u043a\u0430\u043d\u0438\u0440\u0443\u0435\u0442 \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0438.<\/p>\n<h3>interval\u00a0\u043f\u0440\u043e\u0442\u0438\u0432\u00a0_time<\/h3>\n<p>\u0423 \u0433\u0440\u0443\u043f\u043f\u044b\u00a0<code>interval: 1m<\/code>, \u0432 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0438 \u2014\u00a0<code>_time: 2m<\/code>. \u041e\u043d\u0438 \u043d\u0435 \u0434\u0443\u0431\u043b\u0438\u0440\u0443\u044e\u0442 \u0434\u0440\u0443\u0433 \u0434\u0440\u0443\u0433\u0430:<\/p>\n<ul>\n<li>\n<p><code>interval<\/code>\u00a0(\u0438\u043b\u0438\u00a0<code>evaluationInterval: 1m<\/code>\u00a0\u0443\u00a0<code>VMAlert<\/code>) \u2014 \u043a\u0430\u043a \u0447\u0430\u0441\u0442\u043e\u00a0<code>vmalert-logs<\/code>\u00a0\u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0433\u0440\u0443\u043f\u043f\u0443;<\/p>\n<\/li>\n<li>\n<p><code>_time<\/code>\u00a0\u2014 \u043a\u0430\u043a\u043e\u0435 \u043e\u043a\u043d\u043e \u0434\u0430\u043d\u043d\u044b\u0445 \u0441\u043a\u0430\u043d\u0438\u0440\u0443\u0435\u0442 \u043a\u0430\u0436\u0434\u044b\u0439 \u0437\u0430\u043f\u0440\u043e\u0441.<\/p>\n<\/li>\n<\/ul>\n<p>\u041e\u043a\u043d\u043e \u0448\u0438\u0440\u0435 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0430, \u0447\u0442\u043e\u0431\u044b \u0441\u0433\u043b\u0430\u0434\u0438\u0442\u044c \u043e\u0434\u0438\u043d\u043e\u0447\u043d\u044b\u0439 \u0432\u0441\u043f\u043b\u0435\u0441\u043a: \u043f\u0440\u0430\u0432\u0438\u043b\u043e \u0441\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u043e, \u0430 \u043d\u0435 \u0434\u0451\u0440\u0433\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0435. \u041d\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u043d\u0430 VictoriaLogs \u0440\u0430\u0441\u0442\u0451\u0442 \u0441 \u0448\u0438\u0440\u0438\u043d\u043e\u0439 \u043e\u043a\u043d\u0430, \u0430 \u043d\u0435 \u0441 \u0447\u0430\u0441\u0442\u043e\u0442\u043e\u0439.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0440\u0430\u0437\u044a\u0435\u0434\u0443\u0442\u0441\u044f:<\/p>\n<ul>\n<li>\n<p><code>interval<\/code>\u00a0\u0431\u043e\u043b\u044c\u0448\u0435\u00a0<code>_time<\/code>\u00a0(\u0440\u0430\u0437 \u0432 5m, \u043e\u043a\u043d\u043e 1m) \u2014 \u00ab\u0441\u043b\u0435\u043f\u044b\u0435\u00bb \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043a\u0438: \u0441\u043e\u0431\u044b\u0442\u0438\u0435 \u043c\u0435\u0436\u0434\u0443 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u043c\u0438 \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f, \u0430\u043b\u0435\u0440\u0442 \u043c\u043e\u0440\u0433\u0430\u0435\u0442.<\/p>\n<\/li>\n<li>\n<p><code>interval<\/code>\u00a0\u0441\u0438\u043b\u044c\u043d\u043e \u043c\u0435\u043d\u044c\u0448\u0435\u00a0<code>_time<\/code>\u00a0(\u0440\u0430\u0437 \u0432 10s, \u043e\u043a\u043d\u043e 5m) \u2014 \u043f\u043e\u0447\u0442\u0438 \u043a\u0430\u0436\u0434\u044b\u0439 \u0437\u0430\u043f\u0443\u0441\u043a \u043f\u0435\u0440\u0435\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442 \u043e\u0434\u043d\u0438 \u0438 \u0442\u0435 \u0436\u0435 5 \u043c\u0438\u043d\u0443\u0442. \u0418\u043d\u0442\u0435\u0440\u0432\u0430\u043b \u043c\u0435\u043d\u044c\u0448\u0435 1m \u0434\u043b\u044f \u043b\u043e\u0433\u043e\u0432 \u0431\u0440\u0430\u0442\u044c \u043d\u0435 \u0441\u0442\u043e\u0438\u0442.<\/p>\n<\/li>\n<\/ul>\n<p>\u0423 \u043d\u0430\u0441 \u043a\u0440\u0438\u0442\u0438\u0447\u043d\u044b\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u044e\u0442\u0441\u044f \u0440\u0430\u0437 \u0432 \u043c\u0438\u043d\u0443\u0442\u0443 \u0441 \u043e\u043a\u043d\u043e\u043c 2m \u0438\u00a0<code>for: 1m<\/code>: \u043e\u0442 \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u044f \u043e\u0448\u0438\u0431\u043a\u0438 \u0432 \u043b\u043e\u0433\u0435 \u0434\u043e FIRING \u2014 \u043d\u0435 \u0431\u043e\u043b\u044c\u0448\u0435 \u043f\u0430\u0440\u044b \u043c\u0438\u043d\u0443\u0442.<\/p>\n<h3>\u041f\u043e\u0447\u0435\u043c\u0443 \u043d\u0435 \u0441\u0442\u043e\u0438\u0442 \u0431\u0440\u0430\u0442\u044c \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0448\u0438\u0440\u043e\u043a\u043e\u0435\u00a0_time<\/h3>\n<p><code>_time: 1h<\/code>\u00a0\u2014 \u043d\u0435 \u00ab\u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043d\u0430\u0437\u0430\u0434 \u043d\u0430 \u0447\u0430\u0441\u00bb, \u0430 \u00ab\u043a\u0430\u0436\u0434\u043e\u0435 \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0437\u0430\u043d\u043e\u0432\u043e \u0441\u043a\u0430\u043d\u0438\u0440\u0443\u0435\u0442 \u0432\u0435\u0441\u044c \u0447\u0430\u0441\u00bb. \u041f\u0440\u0438\u00a0<code>interval: 1m<\/code>\u00a0\u0438\u0437 \u044d\u0442\u0438\u0445 60 \u043c\u0438\u043d\u0443\u0442 59 \u0443\u0436\u0435 \u043e\u0442\u0441\u043a\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u044b \u043c\u0438\u043d\u0443\u0442\u043e\u0439 \u0440\u0430\u043d\u0435\u0435.<\/p>\n<p>\u0421\u0445\u0435\u043c\u0430: \u043e\u0434\u043d\u0430 \u0441\u0442\u0440\u043e\u043a\u0430 \u2014 \u043e\u0434\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u0430, \u0434\u043b\u0438\u043d\u0430 \u0441\u0442\u0440\u043e\u043a\u0438 \u2014 \u043e\u0431\u044a\u0451\u043c \u0441\u043a\u0430\u043d\u0438\u0440\u0443\u0435\u043c\u044b\u0445 \u043b\u043e\u0433\u043e\u0432.<\/p>\n<p>_time: 1h \u043f\u0440\u0438 interval: 1m \u2014 \u0448\u0438\u0440\u043e\u043a\u043e\u0435 \u043e\u043a\u043d\u043e \u043f\u0435\u0440\u0435\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442 \u043f\u043e\u0447\u0442\u0438 \u0432\u0435\u0441\u044c \u0447\u0430\u0441 \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c \u0437\u0430\u043f\u0443\u0441\u043a\u0435:<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/f71\/8b9\/a57\/f718b9a57d4627ad1f475b1cce7737dd.png\" alt=\"\u0428\u0438\u0440\u043e\u043a\u043e\u0435 \u043e\u043a\u043d\u043e _time: 1h\" width=\"277\" height=\"164\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/f71\/8b9\/a57\/f718b9a57d4627ad1f475b1cce7737dd.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/f71\/8b9\/a57\/f718b9a57d4627ad1f475b1cce7737dd.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0428\u0438\u0440\u043e\u043a\u043e\u0435 \u043e\u043a\u043d\u043e _time: 1h<\/figcaption><\/div>\n<\/figure>\n<p>_time: 2m \u2014 \u043e\u043a\u043d\u043e \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e, \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e 1 \u043c\u0438\u043d\u0443\u0442\u0430 \u0438\u0437 2:<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/b5c\/72b\/294\/b5c72b294eec557aeb0f513ce7bf9a74.png\" alt=\"\u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e _time: 2m\" width=\"100\" height=\"162\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/b5c\/72b\/294\/b5c72b294eec557aeb0f513ce7bf9a74.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/b5c\/72b\/294\/b5c72b294eec557aeb0f513ce7bf9a74.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e _time: 2m<\/figcaption><\/div>\n<\/figure>\n<p>\u0421\u00a0<code><em>time: 1h<\/em><\/code><em>\u00a0\u0437\u0430 10 \u043c\u0438\u043d\u0443\u0442 \u043f\u0440\u0430\u0432\u0438\u043b\u043e \u043f\u0435\u0440\u0435\u0447\u0438\u0442\u0430\u0435\u0442 \u0447\u0430\u0441 \u043b\u043e\u0433\u043e\u0432 \u0434\u0435\u0441\u044f\u0442\u044c \u0440\u0430\u0437, \u0445\u043e\u0442\u044f \u043d\u043e\u0432\u043e\u0433\u043e \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0430 10 \u043c\u0438\u043d\u0443\u0442. \u0421\u00a0<\/em><code>time: 2m<\/code>\u00a0\u0441\u043a\u0430\u043d\u0438\u0440\u0443\u0435\u0442\u0441\u044f 2 \u043c\u0438\u043d\u0443\u0442\u044b \u0432\u043c\u0435\u0441\u0442\u043e 60 \u2014 \u0430\u043b\u0435\u0440\u0442 \u0441\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0438 \u0434\u0435\u0440\u0436\u0438\u0442\u0441\u044f\u00a0<code>for: 1m<\/code>\u00a0\u0442\u0430\u043a \u0436\u0435.\u00a0<code>_time<\/code>\u00a0\u0431\u0435\u0440\u0443\u0442 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u044b\u043c, \u0447\u0442\u043e\u0431\u044b \u043f\u0435\u0440\u0435\u043a\u0440\u044b\u0442\u044c\u00a0<code>interval<\/code>\u00a0\u0438\u00a0<code>for<\/code>\u00a0(\u0443 \u043d\u0430\u0441 \u2014 2m \u043f\u0440\u0438\u00a0<code>interval: 1m<\/code>).<\/p>\n<p><code>stats<\/code>-pipe \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u0435\u043d:\u00a0<code>vmalert-logs<\/code>\u00a0\u0437\u0430\u0431\u0438\u0440\u0430\u0435\u0442 \u043d\u0435 \u0441\u0430\u043c\u0438 \u0441\u0442\u0440\u043e\u043a\u0438, \u0430 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b\u00a0<code>\/select\/logsql\/stats_query<\/code>\u00a0(\u0441\u0447\u0451\u0442\u0447\u0438\u043a\u0438, \u0433\u0438\u0441\u0442\u043e\u0433\u0440\u0430\u043c\u043c\u044b) \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 Prometheus API \u2014 \u0438\u0445 \u043e\u043d \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0435\u0442 \u0441 \u043f\u043e\u0440\u043e\u0433\u043e\u043c.<\/p>\n<p>\u041f\u043e\u0447\u0435\u043c\u0443 \u0434\u043b\u044f Nuxt \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435 \u0430\u043b\u0435\u0440\u0442\u044b, \u0430 \u043d\u0435 \u043e\u0434\u0438\u043d \u0441 \u043e\u0431\u0449\u0435\u0439 \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043a\u043e\u0439:<\/p>\n<ul>\n<li>\n<p>\u0440\u0430\u0437\u043d\u044b\u0435 \u043e\u043a\u043d\u0430\u00a0<code>for<\/code>:\u00a0<code>2m<\/code>\u00a0\u0434\u043b\u044f \u00ab\u043c\u044f\u0433\u043a\u0438\u0445\u00bb (<code>NuxtServerError<\/code>,\u00a0<code>NuxtBadGateway<\/code>) \u0438\u00a0<code>1m<\/code>\u00a0\u0434\u043b\u044f \u043a\u0440\u0438\u0442\u0438\u0447\u043d\u044b\u0445 \u2014 \u0432 \u043e\u0434\u043d\u043e\u043c \u0430\u043b\u0435\u0440\u0442\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u043d\u043e \u043e\u043a\u043d\u043e;<\/p>\n<\/li>\n<li>\n<p>\u0440\u0430\u0437\u043d\u044b\u0435\u00a0<code>labels<\/code>\u00a0\u0438 \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u044b: \u043a\u0440\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0438 500\/502 \u043e\u0431\u044b\u0447\u043d\u043e \u0445\u043e\u0442\u044f\u0442 \u0440\u0430\u0437\u043d\u043e\u0433\u043e \u043f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442\u0430;<\/p>\n<\/li>\n<li>\n<p>\u0432 \u0430\u043b\u0435\u0440\u0442\u0435 \u0441\u0440\u0430\u0437\u0443 \u0432\u0438\u0434\u0435\u043d \u043a\u043b\u0430\u0441\u0441 \u0441\u0431\u043e\u044f.<\/p>\n<\/li>\n<\/ul>\n<p>\u041e\u0431\u044a\u0435\u0434\u0438\u043d\u044f\u0442\u044c \u0438\u043c\u0435\u0435\u0442 \u0441\u043c\u044b\u0441\u043b \u0442\u043e\u043b\u044c\u043a\u043e \u0435\u0441\u043b\u0438 responder, \u043f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442 \u0438\u00a0<code>for<\/code>\u00a0\u0441\u043e\u0432\u043f\u0430\u0434\u0430\u044e\u0442.<\/p>\n<h3>\u0428\u0430\u0433 6. Alertmanager \u2192 Telegram \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e<\/h3>\n<p>\u0422\u043e\u043a\u0435\u043d \u043a\u043b\u0430\u0434\u0451\u043c \u0432 Secret, \u0432 \u043a\u043e\u043d\u0444\u0438\u0433 \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u043c \u043f\u0443\u0442\u044c \u0447\u0435\u0440\u0435\u0437\u00a0<code>bot_token_file<\/code>\u00a0\u2014 \u0442\u043e\u043a\u0435\u043d \u043d\u0435 \u0441\u0432\u0435\u0442\u0438\u0442\u0441\u044f \u0432 \u043a\u043e\u043d\u0444\u0438\u0433\u0435.<\/p>\n<p>\u0424\u0430\u0439\u043b\u00a0<code>telegram-bot-token-secret.yaml<\/code>:<\/p>\n<pre><code>apiVersion: v1kind: Secretmetadata:  name: telegram-bot-token  namespace: vmkstype: Opaquedata:  bot-token: ${bot_token_b64}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0412 vmks-values (\u0441\u043c. \u0428\u0430\u0433 1) \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c Secret \u043a Alertmanager. \u0421\u043b\u0443\u0436\u0435\u0431\u043d\u044b\u0435 \u0430\u043b\u0435\u0440\u0442\u044b vmks (<code>Watchdog<\/code>,\u00a0<code>InfoInhibitor<\/code>,\u00a0<code>RecordingRulesNoData<\/code>) \u0443\u0445\u043e\u0434\u044f\u0442 \u0432\u00a0<code>null<\/code>-\u0440\u0435\u0441\u0438\u0432\u0435\u0440 \u0438 \u0432 Telegram \u043d\u0435 \u0448\u043b\u044e\u0442\u0441\u044f:<\/p>\n<p>\u0424\u0430\u0439\u043b\u00a0<code>values\/vmks-values.yaml<\/code>\u00a0(\u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442):<\/p>\n<pre><code>alertmanager:  enabled: true  spec:    # Secret \u043c\u043e\u043d\u0442\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u043c \u0432 \/etc\/vm\/secrets\/telegram-bot-token\/bot-token    secrets:      - telegram-bot-token  config:    global:      resolve_timeout: 5m    route:      receiver: telegram      group_by: [\"alertname\", \"app\"]      group_wait: 30s      group_interval: 5m      repeat_interval: 4h      routes:        - matchers:            - alertname=\"Watchdog\"          receiver: \"null\"        - matchers:            - alertname=\"InfoInhibitor\"          receiver: \"null\"        - matchers:            - alertname=\"RecordingRulesNoData\"          receiver: \"null\"    receivers:      - name: \"null\"      - name: telegram        telegram_configs:          - bot_token_file: \/etc\/vm\/secrets\/telegram-bot-token\/bot-token            chat_id: ${telegram_chat_id}            parse_mode: HTML            send_resolved: true            message: |-              {{- range .Alerts }}              &lt;b&gt;{{ .Status | toUpper }}&lt;\/b&gt; &lt;code&gt;{{ .Labels.alertname }}&lt;\/code&gt;              app: &lt;code&gt;{{ .Labels.app }}&lt;\/code&gt;              {{- if .Annotations.summary }}              {{ .Annotations.summary }}              {{- end }}              {{- if .Annotations.description }}              {{ .Annotations.description }}              {{- end }}              {{ end }}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041f\u043e\u043b\u044f\u00a0<code>telegram_configs<\/code>\u00a0(\u0438\u0437\u00a0<a href=\"https:\/\/prometheus.io\/docs\/alerting\/latest\/configuration\/#telegram_config\" rel=\"noopener nofollow\">Prometheus docs<\/a>):<\/p>\n<ul>\n<li>\n<p><code>bot_token_file<\/code>\u00a0\u2014 \u043f\u0443\u0442\u044c \u043a \u0444\u0430\u0439\u043b\u0443 \u0441 \u0442\u043e\u043a\u0435\u043d\u043e\u043c (\u043f\u0440\u0435\u0434\u043f\u043e\u0447\u0442\u0438\u0442\u0435\u043b\u044c\u043d\u0435\u0435, \u0447\u0435\u043c\u00a0<code>bot_token<\/code>\u00a0\u0432 \u043e\u0442\u043a\u0440\u044b\u0442\u043e\u043c \u0432\u0438\u0434\u0435);<\/p>\n<\/li>\n<li>\n<p><code>chat_id<\/code>\u00a0\u2014 ID \u0447\u0430\u0442\u0430\/\u0433\u0440\u0443\u043f\u043f\u044b (\u043e\u0442\u0440\u0438\u0446\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0434\u043b\u044f \u0433\u0440\u0443\u043f\u043f); \u043f\u043e\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f Terraform&#8217;\u043e\u043c \u0447\u0435\u0440\u0435\u0437\u00a0<code>${telegram_chat_id}<\/code>;<\/p>\n<\/li>\n<li>\n<p><code>parse_mode: HTML<\/code>\u00a0\u2014 \u0440\u0430\u0437\u043c\u0435\u0442\u043a\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f;<\/p>\n<\/li>\n<li>\n<p><code>send_resolved: true<\/code>\u00a0\u2014 \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u0435 \u0438 \u043f\u0440\u0438 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0438 \u0430\u043b\u0435\u0440\u0442\u0430.<\/p>\n<\/li>\n<\/ul>\n<p><code>secrets<\/code>\u00a0\u043c\u043e\u043d\u0442\u0438\u0440\u0443\u0435\u0442 Secret \u0432 \u043f\u043e\u0434 Alertmanager (\u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 \u043a\u043b\u0430\u0434\u0451\u0442 \u0444\u0430\u0439\u043b \u0432\u00a0<code>\/etc\/vm\/secrets\/telegram-bot-token\/bot-token<\/code>).<\/p>\n<p>\u0412 Telegram \u043f\u0440\u0438\u0445\u043e\u0434\u044f\u0442 \u0430\u043b\u0435\u0440\u0442\u044b:<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/03f\/91d\/d90\/03f91dd90403c1abc8b2e37df129e71b.png\" alt=\"\u0410\u043b\u0435\u0440\u0442\u044b \u0432 telegram\" width=\"571\" height=\"1010\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/03f\/91d\/d90\/03f91dd90403c1abc8b2e37df129e71b.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/03f\/91d\/d90\/03f91dd90403c1abc8b2e37df129e71b.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0410\u043b\u0435\u0440\u0442\u044b \u0432 telegram<\/figcaption><\/div>\n<\/figure>\n<h3>\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/h3>\n<p>\u0410\u043b\u0435\u0440\u0442\u0438\u043d\u0433 \u0441\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u043d\u0430 \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0435 \u0432 \u043b\u043e\u0433\u0430\u0445\u00a0<code>panic<\/code>,\u00a0<code>log.Fatal<\/code>, 500 \u0438\u043b\u0438 \u043d\u0435\u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u043e\u0433\u043e \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0438 \u0448\u043b\u0451\u0442 \u0435\u0433\u043e \u0432 Telegram. \u041f\u0440\u0430\u0432\u0438\u043b\u0430 \u2014 \u0434\u0432\u0430\u00a0<code>VMRule<\/code>\u00a0(golang \u0438 nuxt), datasource \u2014 VictoriaLogs, LogsQL \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439\u00a0<code>vmalert-logs<\/code>. Alertmanager \u043e\u0431\u0449\u0438\u0439 \u0441 \u043c\u0435\u0442\u0440\u0438\u043a\u0430\u043c\u0438: \u043e\u0431\u0430 \u043f\u043e\u0442\u043e\u043a\u0430 \u0441\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u0432 \u043e\u0434\u043d\u0438 \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u044f.<\/p>\n<p>\u041f\u043e\u043b\u0435\u0437\u043d\u044b\u0435 \u0441\u0441\u044b\u043b\u043a\u0438:<\/p>\n<ul>\n<li>\n<p><a href=\"https:\/\/docs.victoriametrics.com\/victorialogs\/vmalert\/\" rel=\"noopener nofollow\">Alerting with Logs<\/a>\u00a0\u2014 vmalert + VictoriaLogs<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/docs.victoriametrics.com\/helm\/victoria-logs-single\/\" rel=\"noopener nofollow\">VictoriaLogs Single Helm chart<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/docs.victoriametrics.com\/victorialogs\/data-ingestion\/vector\/\" rel=\"noopener nofollow\">VictoriaLogs: Vector data ingestion<\/a>\u00a0\u2014 \u043a\u0430\u043a Vector \u043f\u0438\u0448\u0435\u0442 \u043b\u043e\u0433\u0438 \u0432 VictoriaLogs<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/vector.dev\/docs\/setup\/installation\/package-managers\/helm\/\" rel=\"noopener nofollow\">Vector: install via Helm<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/github.com\/VictoriaMetrics\/VictoriaLogs\/issues\/1790\" rel=\"noopener nofollow\">VictoriaMetrics\/VictoriaLogs#1790<\/a>\u00a0\u2014 \u043f\u043e\u0447\u0435\u043c\u0443 \u0432\u043c\u0435\u0441\u0442\u043e vlagent \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f Vector<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/docs.victoriametrics.com\/victorialogs\/logsql\/\" rel=\"noopener nofollow\">LogsQL<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/prometheus.io\/docs\/alerting\/latest\/configuration\/#telegram_config\" rel=\"noopener nofollow\">Alertmanager: telegram_config<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/t.me\/notes_devops_engineer\" rel=\"noopener nofollow\">https:\/\/t.me\/notes_devops_engineer<\/a><\/p>\n<\/li>\n<li>\n<p>\u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434: <a href=\"https:\/\/github.com\/patsevanton\/victorialogs-alerting-by-error-panic\" rel=\"noopener nofollow\">https:\/\/github.com\/patsevanton\/victorialogs-alerting-by-error-panic<\/a><\/p>\n<\/li>\n<\/ul>\n<\/div>\n<p>\u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/1083198\/\">https:\/\/habr.com\/ru\/articles\/1083198\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435\u041a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044f: Go-\u0441\u0435\u0440\u0432\u0438\u0441 \u043f\u0430\u0434\u0430\u0435\u0442 \u0441\u00a0panic: runtime error: invalid memory address or nil pointer dereference, Nuxt-\u0444\u0440\u043e\u043d\u0442\u0435\u043d\u0434 \u043b\u043e\u0433\u0438\u0440\u0443\u0435\u0442\u00a0NUXT_UNHANDLED: unhandled rejection. \u041a\u043b\u0438\u0435\u043d\u0442 \u0432\u0438\u0434\u0438\u0442 \u043b\u0438\u0448\u044c \u043e\u0431\u0449\u0435\u0435 \u00ab\u0447\u0442\u043e-\u0442\u043e \u0441\u043b\u043e\u043c\u0430\u043b\u043e\u0441\u044c\u00bb \u2014 \u0442\u043e\u0447\u043d\u044b\u0439 \u0442\u0435\u043a\u0441\u0442 \u043e\u0448\u0438\u0431\u043a\u0438 \u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u043b\u043e\u0433\u0430\u0445.\u0420\u0435\u0448\u0435\u043d\u0438\u0435 \u2014 \u0430\u043b\u0435\u0440\u0442\u0438\u043d\u0433 \u043f\u043e \u043b\u043e\u0433\u0430\u043c. \u0421\u0432\u044f\u0437\u043a\u0430\u00a0VictoriaLogs + Vector + vmalert + Alertmanager\u00a0\u0441\u043b\u0435\u0434\u0438\u0442 \u0437\u0430 \u043f\u043e\u0442\u043e\u043a\u043e\u043c, \u0438 \u043a\u0430\u043a \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043f\u0438\u0448\u0435\u0442\u00a0panic,\u00a0log.Fatal\u00a0\u0438\u043b\u0438\u00a0NUXT_UNHANDLED, \u0432 Telegram \u0443\u0445\u043e\u0434\u0438\u0442 \u0430\u043b\u0435\u0440\u0442. \u041d\u0438\u0436\u0435 \u2014 \u043a\u0430\u043a \u043f\u043e\u0434\u043d\u044f\u0442\u044c \u044d\u0442\u0443 \u0441\u0432\u044f\u0437\u043a\u0443 \u0432 Kubernetes \u0431\u0435\u0437 \u043b\u0438\u0448\u043d\u0435\u0439 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u043d\u0430 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435.\u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430\u041a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f:\u041b\u043e\u0433\u0438 \u2014 \u043d\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0440\u044f\u0434\u044b,\u00a0\u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0443 \u043d\u0438\u0445 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 (VictoriaLogs), \u0430 \u043d\u0435\u00a0vmsingle\u00a0(\u0428\u0430\u0433 2);LogsQL- \u0438 PromQL-\u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0440\u0430\u0437\u043d\u044b\u0439\u00a0vmalert:\u00a0\u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 \u0438\u0437 vmks \u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u043d\u0430 PromQL, \u043b\u043e\u0433\u0438 \u0432\u0435\u0434\u0451\u0442\u00a0vmalert-logs\u00a0\u0441 VictoriaLogs \u043a\u0430\u043a datasource (\u0428\u0430\u0433\u0438 1 \u0438 3);\u041f\u0440\u0430\u0432\u0438\u043b\u0430 \u0436\u0438\u0432\u0443\u0442 \u0432 \u043a\u043e\u0434\u0435, \u0430 \u043d\u0435 \u0432 Grafana UI\u00a0\u2014 \u043f\u043e\u0447\u0435\u043c\u0443, \u0440\u0430\u0437\u0431\u0435\u0440\u0451\u043c \u0432 \u0428\u0430\u0433\u0435 1;Alertmanager \u0448\u043b\u0451\u0442 \u0430\u043b\u0435\u0440\u0442\u044b \u0432 Telegram\u00a0\u043d\u0430\u0442\u0438\u0432\u043d\u044b\u043c\u00a0telegram_configs\u00a0(\u0428\u0430\u0433 6).\u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430\u041f\u043e\u0442\u043e\u043a \u0434\u0430\u043d\u043d\u044b\u0445:\u041f\u043e\u0434\u043d\u0438\u043c\u0430\u0435\u043c\u00a0victoria-metrics-k8s-stack\u00a0(vmks):\u00a0vmagent,\u00a0vmsingle,\u00a0Alertmanager, Grafana \u0438 CRD \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u0430 (\u0441\u043e\u0441\u0442\u0430\u0432 \u2014 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u043d\u0438\u0436\u0435).\u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043f\u0438\u0448\u0443\u0442 \u043b\u043e\u0433\u0438 \u0432\u00a0stdout\/stderr.Vector (DaemonSet) \u0441 \u043a\u0430\u0436\u0434\u043e\u0439 \u043d\u043e\u0434\u044b \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442 \u043b\u043e\u0433\u0438 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432 \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u0438\u0445 \u0432 VictoriaLogs \u0447\u0435\u0440\u0435\u0437 Elasticsearch bulk API (\/insert\/elasticsearch\/).vmalert-logs\u00a0\u0440\u0430\u0437 \u0432\u00a01m\u00a0\u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u0442 LogsQL-\u0437\u0430\u043f\u0440\u043e\u0441\u044b \u0438\u0437\u00a0VMRule\u00a0\u043f\u0440\u043e\u0442\u0438\u0432 VictoriaLogs (\/select\/logsql\/stats_query).\u0421\u0440\u0430\u0431\u043e\u0442\u0430\u0432\u0448\u0435\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u043e \u0443\u0445\u043e\u0434\u0438\u0442 \u0432 Alertmanager.Alertmanager \u0447\u0435\u0440\u0435\u0437\u00a0telegram_configs\u00a0\u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0432 Telegram-\u0431\u043e\u0442\u0430.\u041f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f\u041d\u0443\u0436\u043d\u044b:Kubernetes-\u043a\u043b\u0430\u0441\u0442\u0435\u0440;Ingress-\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440, \u0447\u0442\u043e\u0431\u044b \u0437\u0430\u0439\u0442\u0438 \u0432 Grafana;kubectl\u00a0\u0438\u00a0helm.\u041a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b (\u0432\u0441\u0435 \u2014 \u0432 namespace\u00a0vmks, \u043a\u0440\u043e\u043c\u0435 Vector \u0432\u00a0vector\u00a0\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0432\u00a0apps):\u041a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0427\u0430\u0440\u0442 \/ \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u0420\u043e\u043b\u044cvictoria-metrics-k8s-stack (vmks)victoria-metrics-k8s-stackvmagent, vmsingle, \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 vmalert, Alertmanager, GrafanaVictoriaLogsvictoria-logs-single\u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 \u043b\u043e\u0433\u043e\u0432 (single-node)Vectorvector\u0441\u0431\u043e\u0440 \u043b\u043e\u0433\u043e\u0432 \u043f\u043e\u0434\u043e\u0432 (DaemonSet, \u0440\u043e\u043b\u044c Agent, namespace\u00a0vector)vmalert-logsmanifests\/vmalert-logs.yaml\u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u0442 LogsQL-\u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u0438\u0437\u00a0VMRuleVMRulemanifests\/vmalert-rules-golang.yaml,\u00a0manifests\/vmalert-rules-nuxt.yaml\u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u0430\u043b\u0435\u0440\u0442\u043e\u0432 \u043d\u0430 LogsQL (\u043f\u043e \u0444\u0430\u0439\u043b\u0443 \u043d\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435)golang-app \/ nuxt-appmanifests\/golang-app.yaml,\u00a0manifests\/nuxt-app.yaml\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u0440\u043e\u043d\u044f\u044e\u0449\u0438\u0435 panic\/error (namespace\u00a0apps)\u0428\u0430\u0433 1. victoria-metrics-k8s-stack (vmks)\u0421\u0442\u0430\u0432\u0438\u043c\u00a0victoria-metrics-k8s-stack\u00a0\u043f\u0435\u0440\u0432\u044b\u043c: \u043e\u043d \u0434\u0430\u0451\u0442 CRD \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u0430 \u0438\u00a0vmagent, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0442\u043e\u043c \u0441\u043a\u0440\u0435\u0439\u043f\u0438\u0442 \u043c\u0435\u0442\u0440\u0438\u043a\u0438 VictoriaLogs (\u0428\u0430\u0433 2).helm upgrade &#8212;install vmks oci:\/\/ghcr.io\/victoriametrics\/helm-charts\/victoria-metrics-k8s-stack \\  &#8212;namespace vmks &#8212;create-namespace \\  &#8212;version 0.91.2 \\  &#8212;wait &#8212;values values\/vmks-values.yaml\u0424\u0430\u0439\u043b\u00a0values\/vmks-values.yaml\u00a0(\u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442):# vmalert (\u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439) \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u0442 PromQL-\u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u043f\u0440\u043e\u0442\u0438\u0432 vmsingle# (datasource \u0447\u0430\u0440\u0442 \u043f\u043e\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u0430\u043c \u0438\u0437 vmsingle). \u041e\u043d \u0431\u0435\u0440\u0451\u0442 \u0432\u0441\u0435 VMRule \u0432# namespace vmalert&#8217;\u0430, \u043a\u0440\u043e\u043c\u0435 LogsQL-\u043f\u0440\u0430\u0432\u0438\u043b (label type: logs-to-metrics) \u2014# \u0438\u0445 \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 VMAlert (manifests\/vmalert-logs.yaml). \u0422\u0430\u043a \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u044b\u0439# PromQL-VMRule, \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0439 \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u0431\u0435\u0437 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0445 \u043b\u0435\u0439\u0431\u043b\u043e\u0432, \u043f\u043e\u0434\u0445\u0432\u0430\u0442\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0441\u0430\u043c.vmalert:  enabled: true  spec:    selectAllByDefault: false    ruleSelector:      matchExpressions:        &#8212; key: type          operator: NotIn          values:            &#8212; logs-to-metrics    # \u041a\u0430\u043a \u0447\u0430\u0441\u0442\u043e \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 vmalert \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0433\u0440\u0443\u043f\u043f\u044b PromQL-\u043f\u0440\u0430\u0432\u0438\u043b: \u0440\u0430\u0437 \u0432 \u043c\u0438\u043d\u0443\u0442\u0443.    evaluationInterval: 1malertmanager:  enabled: true  spec:    # Secret telegram-bot-token \u043c\u043e\u043d\u0442\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u043c \u0432    # \/etc\/vm\/secrets\/telegram-bot-token\/bot-token.    secrets:      &#8212; telegram-bot-token  ingress:    enabled: true    ingressClassName: traefik    hosts:      &#8212; ${alertmanager_fqdn}  config:    global:      resolve_timeout: 5m      http_config:        proxy_from_environment: true    route:      receiver: telegram      group_by: [&#171;alertname&#187;, &#171;app&#187;]      group_wait: 30s      group_interval: 5m      repeat_interval: 4h      # Watchdog, InfoInhibitor \u0438 RecordingRulesNoData \u2014 \u0441\u043b\u0443\u0436\u0435\u0431\u043d\u044b\u0435 \u0430\u043b\u0435\u0440\u0442\u044b vmks:      # \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0442 \u0441\u0432\u043e\u044e \u0440\u0430\u0431\u043e\u0442\u0443, \u043d\u043e \u0432 Telegram \u043d\u0435 \u0448\u043b\u044e\u0442\u0441\u044f. RecordingRulesNoData      # \u0448\u0443\u043c\u0438\u0442, \u043a\u043e\u0433\u0434\u0430 recording-\u043f\u0440\u0430\u0432\u0438\u043b\u043e count:up0 \u043e\u0442\u0434\u0430\u0451\u0442 0 \u0441\u0435\u043c\u043f\u043b\u043e\u0432 \u2014 \u044d\u0442\u043e \u0437\u0434\u043e\u0440\u043e\u0432\u043e\u0435      # \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 (\u043d\u0435\u0442 \u0443\u043f\u0430\u0432\u0448\u0438\u0445 \u0442\u0430\u0440\u0433\u0435\u0442\u043e\u0432), \u0430 \u043d\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430.      routes:        &#8212; matchers:            &#8212; alertname=&#187;Watchdog&#187;          receiver: &#171;null&#187;        &#8212; matchers:            &#8212; alertname=&#187;InfoInhibitor&#187;          receiver: &#171;null&#187;    receivers:      &#8212; name: &#171;null&#187;      &#8212; name: telegram        telegram_configs:          &#8212; bot_token_file: \/etc\/vm\/secrets\/telegram-bot-token\/bot-token            chat_id: ${telegram_chat_id}            parse_mode: HTML            send_resolved: true            message: |-              {{- range .Alerts }}              &lt;b&gt;{{ .Status | toUpper }}&lt;\/b&gt; &lt;code&gt;{{ .Labels.alertname }}&lt;\/code&gt;              app: &lt;code&gt;{{ .Labels.app }}&lt;\/code&gt;              {{- if .Annotations.summary }}              {{ .Annotations.summary }}              {{- end }}              {{- if .Annotations.description }}              {{ .Annotations.description }}              {{- end }}              {{ end }}ruleSelector\u00a0\u0441\u00a0NotIn\u00a0\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0434\u0435\u0444\u043e\u043b\u0442\u043d\u044b\u0435 PromQL-\u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u0441\u0442\u0435\u043a\u0430 \u0438 \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u044b\u0435 PromQL-VMRule\u00a0\u0431\u0435\u0437 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0445 \u043b\u0435\u0439\u0431\u043b\u043e\u0432.\u00a0vmsingle\u00a0\u0438\u00a0alertmanager\u00a0\u0432\u043a\u043b\u044e\u0447\u0435\u043d\u044b \u043f\u043e \u0434\u0435\u0444\u043e\u043b\u0442\u0443 \u0447\u0430\u0440\u0442\u0430:\u00a0vmalert-logs\u00a0\u043f\u0438\u0448\u0435\u0442 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0430\u043b\u0435\u0440\u0442\u043e\u0432 \u0432\u00a0vmsingle, \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u044f \u0443\u0445\u043e\u0434\u044f\u0442 \u0447\u0435\u0440\u0435\u0437\u00a0alertmanager\u00a0(\u0428\u0430\u0433\u0438 3 \u0438 6). \u0411\u043b\u043e\u043a\u00a0alertmanager\u00a0\u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u043d \u0432 \u0428\u0430\u0433\u0435 6.\u041f\u043e\u0447\u0435\u043c\u0443 \u0430\u043b\u0435\u0440\u0442\u044b \u043f\u043e \u043b\u043e\u0433\u0430\u043c \u043d\u0435 \u0434\u0435\u043b\u0430\u0435\u043c \u0447\u0435\u0440\u0435\u0437 Grafana UI\u0414\u043b\u044f \u043c\u0435\u0442\u0440\u0438\u043a \u0430\u043b\u0435\u0440\u0442 \u0438\u0437 Explore \u043f\u043e\u0447\u0442\u0438 \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u0435\u043d: PromQL \u0441\u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f \u043f\u043e \u0443\u0436\u0435 \u0430\u0433\u0440\u0435\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c \u0440\u044f\u0434\u0430\u043c. \u0414\u043b\u044f \u043b\u043e\u0433\u043e\u0432 \u043a\u0430\u0436\u0434\u043e\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u043e \u2014 \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u044b\u0439 \u0437\u0430\u043f\u0440\u043e\u0441 \u043a VictoriaLogs \u0441\u043e\u00a0stats, \u0444\u0438\u043b\u044c\u0442\u0440\u0430\u043c\u0438 \u0438 \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043a\u0430\u043c\u0438, \u0438 \u043e\u043d \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043a\u0430\u0436\u0434\u0443\u044e \u043c\u0438\u043d\u0443\u0442\u0443 (evaluationInterval: 1m).\u041a\u043e\u0433\u0434\u0430 \u0430\u043b\u0435\u0440\u0442\u044b \u0432\u0435\u0448\u0430\u0435\u0442 \u0432\u0441\u044f \u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u0438\u0437 UI, \u0441\u0440\u0435\u0434\u0438 \u043d\u0438\u0445 \u043f\u043e\u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043d\u0435\u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0435: \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043a\u0430 \u043f\u043e \u0432\u0441\u0435\u043c\u0443 \u0442\u0435\u043a\u0441\u0442\u0443 \u0431\u0435\u0437 \u0444\u0438\u043b\u044c\u0442\u0440\u0430 \u043f\u043e \u043f\u043e\u0434\u0443, \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0448\u0438\u0440\u043e\u043a\u043e\u0435 \u043e\u043a\u043d\u043e, \u043f\u0440\u0430\u0432\u0438\u043b\u043e \u043d\u0430 \u043a\u0430\u0436\u0434\u044b\u0439 \u0447\u0438\u0445. VictoriaLogs \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u043d\u0430 \u0434\u0435\u0441\u044f\u0442\u043a\u0438 \u0442\u0430\u043a\u0438\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u043a\u0430\u0436\u0434\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b; \u043e\u0434\u0438\u043d \u043a\u0440\u0438\u0432\u043e\u0439 \u0430\u043b\u0435\u0440\u0442 \u0433\u0440\u0443\u0437\u0438\u0442 \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0441\u0438\u043b\u044c\u043d\u0435\u0435, \u0447\u0435\u043c \u0432\u0435\u0441\u044c \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d \u043f\u0440\u0438\u0451\u043c\u0430 \u043b\u043e\u0433\u043e\u0432.VMRule\u00a0\u0434\u0435\u0440\u0436\u0438\u0442 \u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u0432 git: \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b, \u0437\u0430\u043f\u0440\u043e\u0441, \u043f\u043e\u0440\u043e\u0433, \u043e\u043a\u043d\u043e\u00a0for\u00a0\u0432\u0438\u0434\u043d\u044b \u0434\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432 \u043a\u043b\u0430\u0441\u0442\u0435\u0440. \u041d\u0430 \u0440\u0435\u0432\u044c\u044e \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u044e\u0442, \u0447\u0442\u043e \u0443 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u0443\u0437\u043a\u0438\u0439 \u0444\u0438\u043b\u044c\u0442\u0440 \u043f\u043e\u00a0kubernetes.pod_labels.app, \u0430 \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043a\u0430 \u0431\u044c\u0451\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e \u043d\u0443\u0436\u043d\u043e\u043c\u0443 \u0442\u0435\u043a\u0441\u0442\u0443.\u041e\u0442\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0430\u043b\u0435\u0440\u0442\u043e\u0432 \u0447\u0435\u0440\u0435\u0437 UI \u043d\u0435\u043b\u044c\u0437\u044f\u041f\u043b\u0430\u0433\u0438\u043d\u00a0victoriametrics-logs-datasource\u00a0\u043e\u0431\u044a\u044f\u0432\u043b\u044f\u0435\u0442\u00a0alerting: true, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 Grafana \u0440\u0430\u0437\u0440\u0435\u0448\u0430\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0430\u043b\u0435\u0440\u0442\u044b \u043f\u043e \u043b\u043e\u0433\u0430\u043c \u0447\u0435\u0440\u0435\u0437 UI \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e \u043e\u0442 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a datasource.\u00a0manageAlerts: false\u00a0\u0432\u00a0jsonData\u00a0\u0432\u043b\u0438\u044f\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430\u00a0datasource-managed\u00a0\u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u2014 \u0434\u043b\u044f VictoriaLogs \u043e\u043d\u0438 \u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 (LogsQL \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u00a0vmalert-logs, \u0430 \u043d\u0435 Grafana ruler), \u0430\u00a0Grafana-managed\u00a0\u0430\u043b\u0435\u0440\u0442\u044b \u0444\u043b\u0430\u0433 \u043d\u0435 \u0437\u0430\u0442\u0440\u0430\u0433\u0438\u0432\u0430\u0435\u0442. \u0425\u0440\u0430\u043d\u0438\u0442\u044c \u0430\u043b\u0435\u0440\u0442\u044b \u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e \u043d\u0443\u0436\u043d\u043e \u0432 git.\u041f\u043e \u044d\u0442\u043e\u0439 \u0442\u0435\u043c\u0435 \u0437\u0430\u0432\u0435\u0434\u0435\u043d\u044b \u0434\u0432\u0430 issue:VictoriaMetrics\/victorialogs-datasource#727grafana\/grafana#132468\u0428\u0430\u0433 2. VictoriaLogs\u0421\u0442\u0430\u0432\u0438\u043c single-node VictoriaLogs \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u043c \u0447\u0430\u0440\u0442\u043e\u043c \u0432 namespace\u00a0vmks. \u0412\u0430\u0436\u0435\u043d \u043f\u043e\u0440\u044f\u0434\u043e\u043a: vmks (\u0428\u0430\u0433 1) \u0443\u0436\u0435 \u043f\u043e\u0434\u043d\u044f\u0442 \u2014 \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u043e\u0433\u0434\u0430\u00a0vmServiceScrape\u00a0\u0438\u0437 values \u043d\u0438\u0436\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u0441\u0442 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 \u043c\u0435\u0442\u0440\u0438\u043a\u0438 VictoriaLogs \u0447\u0435\u0440\u0435\u0437\u00a0vmagent\u00a0\u0432\u00a0vmsingle.helm repo add vm https:\/\/victoriametrics.github.io\/helm-charts\/helm repo updatehelm upgrade &#8212;install vls vm\/victoria-logs-single \\  &#8212;namespace vmks &#8212;create-namespace \\  &#8212;version 0.13.9 \\  &#8212;values values\/vls-values.yaml\u0424\u0430\u0439\u043b\u00a0values\/vls-values.yaml:# VictoriaLogs single-node.nameOverride: vlsserver:  # VictoriaLogs \u043e\u0442\u0434\u0430\u0451\u0442 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 \u043c\u0435\u0442\u0440\u0438\u043a\u0438 \u043d\u0430 \/metrics.  vmServiceScrape:    enabled: true\u0421\u0435\u0440\u0432\u0438\u0441 \u043f\u043e\u043b\u0443\u0447\u0438\u0442 \u0438\u043c\u044f\u00a0vls-server.vmks.svc.cluster.local\u00a0(\u043f\u043e\u0440\u0442 9428) \u2014 \u043d\u0430 \u043d\u0435\u0433\u043e \u0441\u043c\u043e\u0442\u0440\u044f\u0442 Vector,\u00a0vmalert-logs\u00a0\u0438 datasource Grafana.\u0428\u0430\u0433 3. Vector\u0421\u043e\u0431\u0438\u0440\u0430\u0435\u043c \u043b\u043e\u0433\u0438 \u0432\u0441\u0435\u0445 \u043f\u043e\u0434\u043e\u0432 \u0447\u0435\u0440\u0435\u0437 DaemonSet Vector (helm chart\u00a0vector, \u0440\u043e\u043b\u044c\u00a0Agent). \u0412\u043c\u0435\u0441\u0442\u043e\u00a0vlagent\u00a0\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c Vector \u0438\u0437-\u0437\u0430\u00a0VictoriaMetrics\/VictoriaLogs#1790.helm repo add vector https:\/\/helm.vector.devhelm repo updatehelm upgrade &#8212;install vector vector\/vector \\  &#8212;namespace vector &#8212;create-namespace \\  &#8212;version 0.58.0 \\  &#8212;values values\/vector-values.yaml\u0424\u0430\u0439\u043b\u00a0values\/vector-values.yaml:# Vector (DaemonSet, \u0440\u043e\u043b\u044c Agent) \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442 \u043b\u043e\u0433\u0438 \u0432\u0441\u0435\u0445 \u043f\u043e\u0434\u043e\u0432 \u0438 \u0448\u043b\u0451\u0442 \u0432 VictoriaLogs.role: AgentcustomConfig:  data_dir: \/vector-data-dir  api:    enabled: true    address: 0.0.0.0:8686  sources:    kubernetes_logs:      type: kubernetes_logs  sinks:    vlogs:      type: elasticsearch      inputs: [kubernetes_logs]      endpoints:        &#8212; http:\/\/vls-server.vmks.svc.cluster.local:9428\/insert\/elasticsearch\/      api_version: v8      mode: bulk      compression: gzip      healthcheck:        enabled: false      query:        _msg_field: message        _time_field: timestamp        _stream_fields: kubernetes.pod_namespace,kubernetes.container_name        ignore_fields: file,source_type,kubernetes.container_id,kubernetes.container_image_id,kubernetes.pod_ip,kubernetes.pod_ips,kubernetes.pod_uid,kubernetes.node_labels.*,kubernetes.pod_annotations.*,kubernetes.namespace_labels.*query._msg_field: message\u00a0\u0438\u00a0query._time_field: timestamp\u00a0\u043c\u0430\u043f\u043f\u044f\u0442 \u043f\u043e\u043b\u044f Vector \u043d\u0430 \u0441\u043f\u0435\u0446\u043f\u043e\u043b\u044f VictoriaLogs: \u0442\u0435\u043a\u0441\u0442 \u0431\u0435\u0440\u0451\u0442\u0441\u044f \u0438\u0437\u00a0message, \u0432\u0440\u0435\u043c\u044f \u2014 \u0438\u0437\u00a0timestamp. \u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u0432 VictoriaLogs\u00a0msg\u00a0\u0438\u00a0time\u00a0\u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u044b \u0442\u0430\u043a \u0436\u0435, \u043a\u0430\u043a \u043f\u0440\u0438 vlagent, \u0430\u00a0stream,\u00a0kubernetes.pod_labels.*\u00a0\u0438\u00a0kubernetes.pod_name\u00a0Vector \u043e\u0442\u0434\u0430\u0451\u0442 \u043a\u0430\u043a \u0435\u0441\u0442\u044c \u2014 \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u0430\u0432\u0438\u043b\u0430\u00a0VMRule\u00a0\u0438\u0437 \u0428\u0430\u0433\u0430 5 \u043d\u0435 \u043c\u0435\u043d\u044f\u044e\u0442\u0441\u044f.streamfields\u00a0\u0437\u0430\u0434\u0430\u0451\u0442 \u043f\u043e\u0442\u043e\u043a VictoriaLogs (\u0431\u0435\u0437 \u043d\u0435\u0433\u043e \u0432\u0441\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \u043f\u043e\u043f\u0430\u0434\u0430\u044e\u0442 \u0432\u00a0stream: {}).\u00a0ignorefields\u00a0\u043e\u0442\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u0442 \u0448\u0443\u043c Vector:\u00a0file,\u00a0source_type, id \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430\/\u043f\u043e\u0434\u0430,\u00a0node_labels.*,\u00a0pod_annotations.*.\u041b\u043e\u0433\u0438 \u0441\u0430\u043c\u043e\u0433\u043e \u043a\u043e\u043b\u043b\u0435\u043a\u0442\u043e\u0440\u0430 \u043d\u0435 \u0441\u043e\u0431\u0438\u0440\u0430\u044e\u0442\u0441\u044f: \u0447\u0430\u0440\u0442 \u0441\u0442\u0430\u0432\u0438\u0442 \u043f\u043e\u0434\u0443 \u043b\u0435\u0439\u0431\u043b\u00a0vector.dev\/exclude: &#171;true&#187;, \u0430 source\u00a0kubernetes_logs\u00a0\u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u043f\u043e\u0434\u044b \u0441 \u044d\u0442\u0438\u043c \u043b\u0435\u0439\u0431\u043b\u043e\u043c.\u041a\u0430\u043a Vector \u0448\u043b\u0451\u0442 \u0432 VictoriaLogs: \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u044bVector \u043d\u0435 \u0443\u043c\u0435\u0435\u0442 \u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0439 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b vlagent (\/insert\/native). \u041e\u043d \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442 \u043b\u043e\u0433\u0438 \u0447\u0435\u0440\u0435\u0437 HTTP API VictoriaLogs. \u0415\u0441\u0442\u044c \u0434\u0432\u0430 \u0440\u0430\u0431\u043e\u0447\u0438\u0445 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430:\u041f\u0440\u043e\u0442\u043e\u043a\u043e\u043bSink\u00a0type\u041a\u0430\u043a \u0432 VictoriaLogs\u041e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438Elasticsearch bulk\u00a0(\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c)elasticsearch\/insert\/elasticsearch\/bulk-\u0431\u0430\u0442\u0447\u0438\u043d\u0433, gzip,\u00a0api_version: v8\u00a0\u2014 \u0434\u0435\u0448\u0451\u0432\u0430\u044f \u0434\u043e\u0441\u0442\u0430\u0432\u043a\u0430 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043e\u0431\u044a\u0451\u043c\u043e\u0432. \u0420\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u043e\u0432\u0430\u043d \u0432\u00a0\u0434\u043e\u043a\u0435 VictoriaLogsHTTP JSON stream (ndjson)http\/insert\/jsonlinecodec\u00a0json\u00a0+\u00a0framing: newline_delimited, \u043f\u0440\u043e\u0449\u0435 \u0432 \u043e\u0442\u043b\u0430\u0434\u043a\u0435, \u043d\u043e \u0431\u0435\u0437&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-494956","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/494956","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=494956"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/494956\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=494956"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=494956"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=494956"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}