• Русский
  • Сбор метрик для компонентов Tekton

    Содержание

    ОбзорТребованияTekton PipelinesМетрики PipelineRunУровни меток для running_pipelinerunsЗначения метки статусаМетрики TaskRunКонфигурация config-observabilityГраницы корзин гистограммыРекомендуемая конфигурация для продакшенаTekton TriggersМетрики контроллера (порт 9000)Метрики EventListener SinkTekton ResultsМетрики WatcherМетрики удаленияОбщие метрикиКонфигурация config-observability для WatcherМетрики API сервераTekton ChainsМетрики ChainsМетрики Controller FrameworkНастройка ServiceMonitorServiceMonitor для PipelineServiceMonitor для TriggersServiceMonitor для EventListener SinkServiceMonitor для ResultsServiceMonitor для ChainsПроверкаПроверка эндпоинтов метрик напрямуюПроверка целей PrometheusПримеры запросов PromQLПримеры MonitorDashboardДашборд Tekton PipelineИнтерпретация дашборда Tekton Pipeline (часто задаваемые вопросы)Дашборд Tekton TriggersИнтерпретация дашборда Tekton Triggers (часто задаваемые вопросы)Дашборд Tekton ResultsИнтерпретация панели Tekton Results (часто задаваемые вопросы)Панель Tekton ChainsИнтерпретация панели Tekton Chains (часто задаваемые вопросы)

    Обзор

    Компоненты Tekton предоставляют метрики, совместимые с Prometheus, через HTTP-эндпоинты. Развертывая ресурсы ServiceMonitor, Prometheus (или VictoriaMetrics) может автоматически обнаруживать и собирать эти метрики.

    Примечание по namespace: В этом документе используется tekton-pipelines в качестве namespace по умолчанию для компонентов контрольной плоскости (Pipelines, Triggers, Results, Chains). Основное исключение — сервисы EventListener, которые работают в namespace приложений, где создаются EventListener.

    Если в вашей установке используются другие namespace, обновите как команды, так и поля namespaceSelector в ресурсах ServiceMonitor ниже.

    В этом документе рассматриваются метрики для следующих компонентов Tekton:

    • Tekton Pipelines — метрики выполнения PipelineRun / TaskRun
    • Tekton Triggers — метрики EventListener, TriggerBinding и связанных ресурсов
    • Tekton Results — метрики удаления и хранения Run
    • Tekton Chains — метрики подписания и происхождения
    • Controller Framework — инфраструктурные метрики, общие для всех контроллеров

    Также описывается:

    • Как настроить поведение метрик через config-observability
    • Как развернуть ресурсы ServiceMonitor для сбора метрик
    • Как проверить корректность сбора метрик

    Требования

    • Компоненты контрольной плоскости Tekton установлены и запущены (минимум те компоненты, метрики которых вы планируете собирать: Pipelines, Triggers, Results и/или Chains).
    • kubectl настроен на целевой кластер, и ваша учетная запись имеет права на создание ресурсов ServiceMonitor в namespace мониторинга.
    • Развернут стек мониторинга (Prometheus или совместимый VictoriaMetrics), который может обнаруживать и собирать ресурсы ServiceMonitor (или эквивалентные объекты обнаружения для вашей платформы).
    • Экземпляр Prometheus/VictoriaMetrics настроен на обнаружение созданных вами объектов ServiceMonitor (селекторы namespace и меток должны совпадать).
    • Сетевые политики и файрволы позволяют подам сборщика метрик обращаться к портам метрик Tekton (9090 для большинства сервисов контрольной плоскости, 9000 для контроллера Triggers и EventListener sink).
    • Если нужны метрики EventListener sink, EventListener должны существовать в целевых namespace и открывать порт http-metrics.

    Tekton Pipelines

    Компонент Tekton Pipelines включает несколько подсервисов, которые предоставляют метрики на порту 9090:

    СервисОписаниеПорт метрик
    tekton-pipelines-controllerОсновной reconciler для PipelineRun / TaskRun9090
    tekton-pipelines-webhookAdmission webhook9090
    tekton-events-controllerКонтроллер CloudEvents9090
    tekton-pipelines-remote-resolversРазрешение удалённых ресурсов9090

    Метрики контроллера Pipeline используют префикс tekton_pipelines_controller_.

    Метрики PipelineRun

    Название метрикиТипОписаниеМетки
    pipelinerun_duration_secondsГистограмма / LastValueВремя выполнения PipelineRun в секундахstatus, namespace, pipeline*, pipelinerun*, reason*
    pipelinerun_totalСчётчикОбщее количество завершённых PipelineRunstatus
    running_pipelinerunsLastValue (Gauge)Количество текущих выполняющихся PipelineRunУправляется metrics.running-pipelinerun.level (см. ниже)
    running_pipelineruns_waiting_on_pipeline_resolutionLastValue (Gauge)PipelineRun, ожидающие разрешения ссылки на Pipeline-
    running_pipelineruns_waiting_on_task_resolutionLastValue (Gauge)PipelineRun, ожидающие разрешения ссылки на Task-

    * Метки, отмеченные *, являются необязательными и зависят от конфигурации config-observability.

    Уровни меток для running_pipelineruns

    Метки метрики running_pipelineruns контролируются параметром metrics.running-pipelinerun.level:

    УровеньМетки
    "" (по умолчанию, кластер)Без меток
    "namespace"namespace
    "pipeline"namespace, pipeline
    "pipelinerun"namespace, pipeline, pipelinerun

    Значения метки статуса

    Для метрик PipelineRun:

    • success — PipelineRun успешно завершён
    • failed — PipelineRun завершён с ошибкой
    • cancelled — PipelineRun был отменён

    Для метрик TaskRun:

    • success — TaskRun успешно завершён
    • failed — TaskRun завершён с ошибкой

    Метрики TaskRun

    Название метрикиТипОписаниеМетки
    taskrun_duration_secondsГистограмма / LastValueВремя выполнения отдельного TaskRun в секундахstatus, namespace, task*, taskrun*, reason*
    pipelinerun_taskrun_duration_secondsГистограмма / LastValueВремя выполнения TaskRun в составе PipelineRunstatus, namespace, task*, taskrun*, pipeline*, pipelinerun*, reason*
    taskrun_totalСчётчикОбщее количество завершённых TaskRunstatus
    running_taskrunsLastValue (Gauge)Количество текущих выполняющихся TaskRun-
    running_taskruns_waiting_on_task_resolution_countLastValue (Gauge)TaskRun, ожидающие разрешения ссылки на Task-
    running_taskruns_throttled_by_quotaLastValue (Gauge)TaskRun, ограниченные ResourceQuotanamespace*
    running_taskruns_throttled_by_nodeLastValue (Gauge)TaskRun, ограниченные ресурсами на уровне узлаnamespace*
    taskruns_pod_latency_millisecondsLastValueЗадержка планирования Pod для TaskRun в миллисекундахnamespace, pod, task*, taskrun*

    Конфигурация config-observability

    ConfigMap config-observability в namespace tekton-pipelines управляет поведением метрик для контроллера Pipeline. Этот ConfigMap управляется Tekton Operator и должен настраиваться через поле spec.pipeline.options.configMaps ресурса TektonConfig. Подробнее см. в разделе Настройка необязательных параметров для подсистем.

    Поведение горячей перезагрузки: config-observability отслеживается во время работы. Большинство изменений ключей (например, metrics.*) вступают в силу без перезапуска Pod. Для появления изменений на дашбордах/запросах подождите один-два интервала сбора. Перезапуск требуется только при изменении настроек Pod (например, изменение CONFIG_OBSERVABILITY_NAME в Deployment).

    Пример конфигурации через TektonConfig:

    apiVersion: operator.tekton.dev/v1alpha1
    kind: TektonConfig
    metadata:
      name: config
    spec:
      pipeline:
        options:
          disabled: false
          configMaps:
            config-observability:
              data:
                metrics.backend-destination: prometheus
    
                # Уровень агрегации метрик PipelineRun.
                # Значения: "pipelinerun" | "pipeline" (по умолчанию) | "namespace"
                #   - "pipelinerun": включает метки pipeline + pipelinerun; длительность использует LastValue
                #   - "pipeline": включает только метку pipeline
                #   - "namespace": без меток pipeline/pipelinerun
                metrics.pipelinerun.level: "pipeline"
    
                # Уровень агрегации метрик TaskRun.
                # Значения: "taskrun" | "task" (по умолчанию) | "namespace"
                #   - "taskrun": включает метки task + taskrun; длительность использует LastValue
                #   - "task": включает только метку task
                #   - "namespace": без меток task/taskrun
                metrics.taskrun.level: "task"
    
                # Тип метрики длительности для PipelineRun / TaskRun.
                # Значения: "histogram" (по умолчанию) | "lastvalue"
                # Примечание: Когда pipelinerun.level равен "pipelinerun" или taskrun.level равен "taskrun",
                #             тип длительности принудительно устанавливается в "lastvalue" независимо от настройки.
                metrics.pipelinerun.duration-type: "histogram"
                metrics.taskrun.duration-type: "histogram"
    
                # Уровень агрегации метрик текущих PipelineRun.
                # Значения: "pipelinerun" | "pipeline" | "namespace" | "" (по умолчанию, на уровне кластера)
                metrics.running-pipelinerun.level: ""
    
                # Включать метку reason в метрики длительности (pipelinerun_duration_seconds,
                # taskrun_duration_seconds, pipelinerun_taskrun_duration_seconds).
                # Значения: "true" | "false" (по умолчанию)
                # Внимание: Включение увеличивает кардинальность меток.
                # Примечание: Несмотря на название ключа, это НЕ влияет на метрики счётчиков
                # (pipelinerun_total / taskrun_total), только на метрики длительности.
                metrics.count.enable-reason: "false"
    
                # Включать метку namespace в метрики ограниченных TaskRun.
                # Значения: "true" | "false" (по умолчанию)
                metrics.taskrun.throttle.enable-namespace: "false"

    Границы корзин гистограммы

    При типе длительности histogram используются следующие границы корзин (в секундах):

    10, 30, 60, 300, 900, 1800, 3600, 5400, 10800, 21600, 43200, 86400

    Это соответствует: 10с, 30с, 1м, 5м, 15м, 30м, 1ч, 1.5ч, 3ч, 6ч, 12ч, 24ч.

    Рекомендуемая конфигурация для продакшена

    Для производственных сред используйте агрегированные уровни для контроля кардинальности меток:

    metrics.pipelinerun.level: "pipeline"
    metrics.taskrun.level: "task"
    metrics.pipelinerun.duration-type: "histogram"
    metrics.taskrun.duration-type: "histogram"
    metrics.count.enable-reason: "false"

    Если нужна детализация по отдельным запускам для отладки, временно переключитесь на:

    metrics.pipelinerun.level: "pipelinerun"
    metrics.taskrun.level: "taskrun"

    Обратите внимание, что это значительно увеличит количество временных рядов.


    Tekton Triggers

    Компонент Tekton Triggers предоставляет две категории метрик из разных процессов.

    Метрики контроллера (порт 9000)

    Контроллер Triggers отчитывается о количестве ресурсов каждые 60 секунд.

    СервисПорт метрик
    tekton-triggers-controller9000

    Метрики контроллера Triggers используют префикс controller_.

    Название метрикиТипОписаниеМетки
    eventlistener_countLastValue (Gauge)Количество ресурсов EventListener-
    triggerbinding_countLastValue (Gauge)Количество ресурсов TriggerBinding-
    clustertriggerbinding_countLastValue (Gauge)Количество ресурсов ClusterTriggerBinding-
    triggertemplate_countLastValue (Gauge)Количество ресурсов TriggerTemplate-
    clusterinterceptor_countLastValue (Gauge)Количество ресурсов ClusterInterceptor-

    Метрики EventListener Sink

    Каждый под EventListener предоставляет дополнительные HTTP-метрики и метрики обработки событий. Эти метрики исходят из процесса EventListener sink (не из контроллера). Префикс метрик Prometheus — eventlistener_.

    Название метрики (Prometheus)ТипОписаниеМетки
    eventlistener_http_duration_secondsГистограммаДлительность HTTP-запросов EventListener-
    eventlistener_event_received_countСчётчикОбщее количество событий, полученных sinkstatus
    eventlistener_triggered_resourcesСчётчикОбщее количество созданных триггерами ресурсовkind
    • Корзины гистограммы eventlistener_http_duration_seconds: 0.001, 0.01, 0.1, 1, 10 (секунды)
    • Значения метки status для eventlistener_event_received_count: succeeded, failed
    • Значения метки kind для eventlistener_triggered_resources: Kubernetes Kind созданного объекта (например, PipelineRun, TaskRun)

    Эти метрики sink предоставляются на каждый под EventListener, а не из центрального контроллера. Возможно, потребуется отдельный ServiceMonitor или PodMonitor для их сбора, если поды EventListener открывают порт метрик.


    Tekton Results

    Tekton Results включает два подсервиса, предоставляющих метрики.

    СервисОписаниеПорт метрик
    tekton-results-watcherСледит и очищает ресурсы PipelineRun/TaskRun9090
    tekton-results-apigRPC/REST API сервер9090

    Метрики Watcher

    Метрики Watcher используют префикс watcher_.

    Метрики удаления

    Название метрикиТипОписаниеМетки
    pipelinerun_delete_countСчётчикОбщее количество удалённых PipelineRunstatus, namespace
    pipelinerun_delete_duration_secondsГистограмма / LastValueВремя от завершения PipelineRun до удаленияstatus, namespace, pipeline*
    taskrun_delete_countСчётчикОбщее количество удалённых TaskRunstatus, namespace
    taskrun_delete_duration_secondsГистограмма / LastValueВремя от завершения TaskRun до удаленияstatus, namespace, pipeline*, task*

    * Необязательные метки зависят от настроек config-observability для Results Watcher.

    Примечание: Метрики pipelinerun_delete_count, pipelinerun_delete_duration_seconds, taskrun_delete_count и taskrun_delete_duration_seconds записываются только при фактическом удалении запусков Watcher-ом. Эти метрики останутся пустыми (без данных), если флаг --completed_run_grace_period в Deployment tekton-results-watcher установлен в 0 (по умолчанию), что отключает автоматическое удаление. Установите положительное значение (например, 10m) для удаления после периода ожидания или отрицательное для немедленного удаления после архивирования.

    Значения метки статуса для Results Watcher:

    • success — Запуск успешно завершён
    • failed — Запуск завершён с ошибкой
    • cancelled — Запуск был отменён

    Общие метрики

    Эти метрики регистрируются как reconciler-ами PipelineRun, так и TaskRun в Watcher и отслеживают события, связанные с хранением.

    Название метрикиТипОписаниеМетки
    runs_not_stored_countСчётчикЗапуски, удалённые без сохранения в Resultskind, namespace
    run_storage_latency_secondsГистограммаВремя от завершения запуска до успешного сохраненияkind, namespace

    Метка kind идентифицирует тип запуска (PipelineRun / TaskRun в некоторых сериях метрик, pipelinerun / taskrun в других).

    Примечание: runs_not_stored_count записывается только при внешнем удалении запуска (например, через kubectl delete), когда Watcher удерживает finalizer для координации архивирования. Она останется пустой, если все следующие условия не выполнены:

    1. Флаг --logs_api равен false (хранение логов отключено) — если логи включены, Watcher полностью пропускает координацию через finalizer.
    2. Флаг --disable_crd_update равен false (обновления аннотаций разрешены).
    3. Флаг --store_deadline установлен в ненулевое значение — максимальное время ожидания завершения архивирования перед отказом и разрешением удаления.
    4. Запуск был удалён извне до успешного архивирования (нет аннотации results.tekton.dev/stored=true), и время store_deadline истекло.

    В нормальной работе (запуски архивируются до удаления или удаление инициируется самим Watcher через --completed_run_grace_period) счётчик остаётся равным нулю. Ненулевое значение указывает на возможную потерю данных: запуски были удалены до сохранения состояния в Results API.

    Быстрое воспроизведение (тестовая среда): Если вы не видите эту метрику, это обычно означает, что условия триггера не выполнены, а не что метрика отсутствует.

    1. Настройте Results Watcher через TektonConfig так, чтобы logs_api=false, disable_crd_update=false, и store_deadline было ненулевым (например, 30s).
    2. Временно установите количество реплик Results API в 0 через TektonConfig (spec.result.options.deployments.tekton-results-api.spec.replicas: 0), чтобы архивирование не происходило.
    3. Создайте TaskRun или PipelineRun и дождитесь завершения.
    4. Дождитесь истечения store_deadline, затем удалите запуск извне (kubectl delete ...).
    5. Проверьте /metrics Watcher или Prometheus на наличие watcher_runs_not_stored_count (с префиксом компонента в формате экспозиции); значение должно увеличиться.
    6. Восстановите исходный TektonConfig (включите реплики Results API и обычные настройки logs_api).

    Границы корзин гистограммы run_storage_latency_seconds (в секундах):

    0.1, 0.5, 1, 2, 5, 10, 30, 60, 120, 300, 600, 1800

    Конфигурация config-observability для Watcher

    Results Watcher имеет собственный ConfigMap config-observability (названный через переменную окружения CONFIG_OBSERVABILITY_NAME, обычно tekton-results-config-observability). Этот ConfigMap управляется Tekton Operator и настраивается через поле spec.results.options.configMaps ресурса TektonConfig. Подробнее см. Настройка необязательных параметров для подсистем.

    Поведение горячей перезагрузки: Watcher также отслеживает этот ConfigMap и применяет большинство изменений без перезапуска Pod. Перезапуск требуется только при изменении настроек на уровне Deployment (например, переменных окружения или аргументов).

    Поддерживаются следующие ключи:

    КлючЗначение по умолчаниюВозможные значенияОписание
    metrics.pipelinerun.levelpipelinepipeline, namespaceУправляет меткой pipeline в метриках длительности удаления
    metrics.taskrun.leveltasktask, namespaceУправляет меткой task в метриках длительности удаления
    metrics.pipelinerun.duration-typehistogramhistogram, lastvalueТип агрегации метрик длительности для удаления PipelineRun и TaskRun
    metrics.taskrun.duration-typehistogramhistogram, lastvalueПарсится, но в настоящее время не используется; metrics.pipelinerun.duration-type управляет обоими

    В отличие от Tekton Pipelines, Results Watcher не поддерживает уровни детализации pipelinerun / taskrun для отдельных запусков. Также отсутствуют ключи metrics.count.enable-reason, metrics.running-pipelinerun.level и metrics.taskrun.throttle.enable-namespace.

    Известная проблема в upstream: taskrun_delete_duration_seconds использует metrics.pipelinerun.duration-type (а не metrics.taskrun.duration-type) для определения типа агрегации. Это, по-видимому, ошибка копирования в исходном коде Results.

    Метрики API сервера

    API сервер предоставляет стандартные gRPC метрики Prometheus через библиотеку go-grpc-prometheus на порту 9090. Включают:

    • grpc_server_handled_total — общее количество завершённых RPC на сервере
    • grpc_server_started_total — общее количество запущенных RPC на сервере
    • grpc_server_msg_received_total / grpc_server_msg_sent_total — количество сообщений
    • grpc_server_handling_seconds (если включён PROMETHEUS_HISTOGRAM) — длительность обработки RPC

    Tekton Chains

    Tekton Chains — компонент безопасности, который генерирует, подписывает и хранит происхождение артефактов, собранных с помощью Tekton Pipelines. Он отслеживает завершённые TaskRun и PipelineRun, затем создаёт аттестации и подписи.

    СервисОписаниеПорт метрик
    tekton-chains-metricsWatcher/контроллер Chains9090 (http-metrics)

    Метрики контроллера Chains используют префикс watcher_ (как и Results Watcher, но имена метрик уникальны, поэтому коллизий нет).

    Метрики Chains

    Все метрики Chains — это счётчики без меток.

    Название метрики (Prometheus)ТипОписание
    watcher_taskrun_sign_created_totalСчётчикОбщее количество подписанных сообщений для TaskRun
    watcher_taskrun_payload_stored_totalСчётчикОбщее количество сохранённых полезных нагрузок для TaskRun
    watcher_taskrun_marked_signed_totalСчётчикОбщее количество TaskRun, помеченных как подписанные
    watcher_pipelinerun_sign_created_totalСчётчикОбщее количество подписанных сообщений для PipelineRun
    watcher_pipelinerun_payload_stored_totalСчётчикОбщее количество сохранённых полезных нагрузок для PipelineRun
    watcher_pipelinerun_marked_signed_totalСчётчикОбщее количество PipelineRun, помеченных как подписанные

    Примечание: В официальной документации Tekton Chains также упоминаются счётчики *_signing_failures_total для TaskRun и PipelineRun, но они отсутствуют в текущем исходном коде upstream. Проверьте в вашей версии.


    Метрики Controller Framework

    Все контроллеры Tekton автоматически предоставляют следующие инфраструктурные метрики. Они используют тот же префикс, что и пользовательские метрики компонента (например, tekton_pipelines_controller_, controller_, watcher_).

    Название метрики (без префикса)ТипОписание
    client_latencyГистограммаЗадержка запросов Kubernetes API клиента (в секундах)
    client_resultsСчётчикКоличество запросов Kubernetes API (по статус-кодам)
    workqueue_depthGaugeТекущая глубина очереди задач
    workqueue_adds_totalСчётчикОбщее количество добавлений в очередь задач
    workqueue_queue_latency_secondsГистограммаВремя ожидания элементов в очереди задач
    workqueue_work_duration_secondsГистограммаВремя обработки элементов очереди задач
    workqueue_retries_totalСчётчикОбщее количество повторных попыток обработки очереди
    workqueue_unfinished_work_secondsГистограммаДлительность незавершённых элементов очереди задач
    workqueue_longest_running_processor_secondsГистограммаДлительность самого длительного процесса обработки очереди
    reconcile_countСчётчикОбщее количество вызовов reconciler (с метками reconciler, success, namespace_name)
    reconcile_latencyГистограммаЗадержка вызова reconciler (с метками reconciler, success, namespace_name)

    Настройка ServiceMonitor

    Для включения сбора метрик Prometheus для компонентов Tekton разверните ресурсы ServiceMonitor.

    Требования перечислены в разделе Требования.

    Используйте следующие рекомендации в зависимости от вашего стека мониторинга:

    • Если вы используете Prometheus (Prometheus Operator), метки, такие как metadata.labels.prometheus: kube-prometheus, должны совпадать с селектором spec.serviceMonitorSelector в CR Prometheus; иначе этот ServiceMonitor не будет собираться.
    • Если вы используете VictoriaMetrics, обычно метки вроде prometheus: kube-prometheus не нужны; создавайте ServiceMonitor/VMServiceScrape в соответствии с вашей настройкой мониторинга.

    При использовании Prometheus выполните следующие команды для поиска и проверки селектора:

    # 1) Найти CR Prometheus (тип ресурса: monitoring.coreos.com/v1, Kind=Prometheus)
    $ kubectl get prometheus -A
    
    # 2) Проверить селектор ServiceMonitor у целевого экземпляра Prometheus
    $ kubectl get prometheus -n <prometheus-namespace> <prometheus-name> -o yaml | yq '.spec.serviceMonitorSelector'

    Если в вашем кластере отсутствует CR Prometheus, мониторинг обычно управляется платформой (например, VictoriaMetrics) или реализован иначе. В таких случаях метки вроде prometheus: kube-prometheus обычно не требуются; следуйте правилам сбора вашей платформы.

    Для дополнительной информации смотрите Integrating External Metrics.

    ServiceMonitor для Pipeline

    YAML ServiceMonitor для Pipeline
    apiVersion: monitoring.coreos.com/v1
    kind: ServiceMonitor
    metadata:
      name: tekton-pipelines-metrics
      namespace: tekton-pipelines
      labels:
        app.kubernetes.io/name: tekton-pipelines
        # prometheus: kube-prometheus
    spec:
      selector:
        matchLabels:
          app.kubernetes.io/part-of: tekton-pipelines
      endpoints:
      - port: http-metrics
        path: /metrics
        interval: 30s
      namespaceSelector:
        matchNames:
        - tekton-pipelines

    Этот ServiceMonitor выбирает сервисы Pipeline с меткой app.kubernetes.io/part-of: tekton-pipelines (включая remote-resolvers) и собирает метрики в namespace tekton-pipelines.

    ServiceMonitor для Triggers

    YAML ServiceMonitor для Triggers
    apiVersion: monitoring.coreos.com/v1
    kind: ServiceMonitor
    metadata:
      name: tekton-triggers-metrics
      namespace: tekton-pipelines
      labels:
        app.kubernetes.io/name: tekton-triggers
        # prometheus: kube-prometheus
    spec:
      selector:
        matchLabels:
          app.kubernetes.io/part-of: tekton-triggers
          app.kubernetes.io/component: controller
      endpoints:
      - port: http-metrics
        path: /metrics
        interval: 30s
      namespaceSelector:
        matchNames:
        - tekton-pipelines

    Этот ServiceMonitor собирает только метрики контроллера Triggers (controller_*). Метрики EventListener sink не включены.

    ServiceMonitor для EventListener Sink

    YAML ServiceMonitor для EventListener Sink
    apiVersion: monitoring.coreos.com/v1
    kind: ServiceMonitor
    metadata:
      name: tekton-eventlistener-sink-metrics
      namespace: tekton-pipelines
      labels:
        app.kubernetes.io/name: tekton-eventlistener-sink
        # prometheus: kube-prometheus
    spec:
      selector:
        matchExpressions:
        - key: eventlistener
          operator: Exists
        - key: app.kubernetes.io/managed-by
          operator: In
          values:
          - EventListener
      endpoints:
      - port: http-metrics
        path: /metrics
        interval: 30s
      namespaceSelector:
        any: true

    Сервисы EventListener обычно работают в namespace приложений, поэтому в этом примере используется namespaceSelector.any: true для сбора метрик из разных namespace. Если нужна более строгая область, переключитесь на matchNames и явно перечислите разрешённые namespace.

    ServiceMonitor для Results

    Сервисы Results имеют метки app.kubernetes.io/part-of: tekton-results и app.kubernetes.io/name. Чтобы точно выбрать API и Watcher (исключая Postgres), в примере используется совпадение по app.kubernetes.io/name:

    YAML ServiceMonitor для Results
    apiVersion: monitoring.coreos.com/v1
    kind: ServiceMonitor
    metadata:
      name: tekton-results-metrics
      namespace: tekton-pipelines
      labels:
        app.kubernetes.io/name: tekton-results
        # prometheus: kube-prometheus
    spec:
      selector:
        matchExpressions:
        - key: app.kubernetes.io/name
          operator: In
          values:
          - tekton-results-api
          - tekton-results-watcher
      endpoints:
      - port: prometheus
        path: /metrics
        interval: 30s
      - port: metrics
        path: /metrics
        interval: 30s
      namespaceSelector:
        matchNames:
        - tekton-pipelines

    API Results использует имя порта prometheus (9090), а Watcher — metrics (9090). Каждый сервис открывает только одно из этих имён порта, поэтому будет собран только соответствующий endpoint.

    ServiceMonitor для Chains

    YAML ServiceMonitor для Chains
    apiVersion: monitoring.coreos.com/v1
    kind: ServiceMonitor
    metadata:
      name: tekton-chains-metrics
      namespace: tekton-pipelines
      labels:
        app.kubernetes.io/name: tekton-chains
        # prometheus: kube-prometheus
    spec:
      selector:
        matchLabels:
          app.kubernetes.io/part-of: tekton-chains
      endpoints:
      - port: http-metrics
        path: /metrics
        interval: 30s
      namespaceSelector:
        matchNames:
        - tekton-pipelines

    Проверка

    После развертывания ресурсов ServiceMonitor проверьте, что Prometheus собирает метрики с целей.

    Проверка эндпоинтов метрик напрямую

    # Контроллер Pipeline
    $ kubectl port-forward -n tekton-pipelines svc/tekton-pipelines-controller 9090:9090
    $ curl -s http://localhost:9090/metrics | grep tekton_pipelines_controller_
    
    # HELP tekton_pipelines_controller_client_latency How long Kubernetes API requests take
    # TYPE tekton_pipelines_controller_client_latency histogram
    tekton_pipelines_controller_client_latency_bucket{name="",le="1e-05"} 0
    tekton_pipelines_controller_client_latency_bucket{name="",le="0.0001"} 0
    tekton_pipelines_controller_client_latency_bucket{name="",le="0.001"} 0
    
    # Контроллер Triggers
    $ kubectl port-forward -n tekton-pipelines svc/tekton-triggers-controller 9000:9000
    $ curl -s http://localhost:9000/metrics | grep controller_
    
    # HELP controller_client_latency How long Kubernetes API requests take
    # TYPE controller_client_latency histogram
    controller_client_latency_bucket{name="",le="1e-05"} 0
    controller_client_latency_bucket{name="",le="0.0001"} 1
    controller_client_latency_bucket{name="",le="0.001"} 2
    
    # Метрики EventListener sink (замените namespace/service)
    $ kubectl port-forward -n <eventlistener-namespace> svc/<eventlistener-service> 9000:9000
    $ curl -s http://localhost:9000/metrics | grep eventlistener_
    
    # HELP eventlistener_client_latency How long Kubernetes API requests take
    # TYPE eventlistener_client_latency histogram
    eventlistener_client_latency_bucket{name="",le="1e-05"} 0
    eventlistener_client_latency_bucket{name="",le="0.0001"} 0
    eventlistener_client_latency_bucket{name="",le="0.001"} 0
    
    # HELP eventlistener_triggered_resources Count of the number of triggered eventlistener resources
    # TYPE eventlistener_triggered_resources counter
    eventlistener_triggered_resources{kind="PipelineRun"} 10
    
    # Watcher Results
    $ kubectl port-forward -n tekton-pipelines svc/tekton-results-watcher 9091:9090
    $ curl -s http://localhost:9091/metrics | grep watcher_
    
    # HELP watcher_client_latency How long Kubernetes API requests take
    # TYPE watcher_client_latency histogram
    watcher_client_latency_bucket{name="",le="1e-05"} 0
    watcher_client_latency_bucket{name="",le="0.0001"} 0
    watcher_client_latency_bucket{name="",le="0.001"} 0
    
    # API Results
    $ kubectl port-forward -n tekton-pipelines svc/tekton-results-api-service 9092:9090
    $ curl -s http://localhost:9092/metrics | grep grpc_server_
    
    # HELP grpc_server_handled_total Total number of RPCs completed on the server, regardless of success or failure.
    # TYPE grpc_server_handled_total counter
    grpc_server_handled_total{grpc_code="Aborted",grpc_method="Check",grpc_service="grpc.health.v1.Health",grpc_type="unary"} 0
    grpc_server_handled_total{grpc_code="Aborted",grpc_method="CreateRecord",grpc_service="tekton.results.v1alpha2.Results",grpc_type="unary"} 0
    grpc_server_handled_total{grpc_code="Aborted",grpc_method="CreateResult",grpc_service="tekton.results.v1alpha2.Results",grpc_type="unary"} 0
    
    # HELP grpc_server_started_total Total number of RPCs started on the server.
    # TYPE grpc_server_started_total counter
    grpc_server_started_total{grpc_method="Check",grpc_service="grpc.health.v1.Health",grpc_type="unary"} 337606
    grpc_server_started_total{grpc_method="CreateRecord",grpc_service="tekton.results.v1alpha2.Results",grpc_type="unary"} 10301
    grpc_server_started_total{grpc_method="CreateResult",grpc_service="tekton.results.v1alpha2.Results",grpc_type="unary"} 832
    
    # Контроллер Chains
    $ kubectl port-forward -n tekton-pipelines svc/tekton-chains-metrics 9093:9090
    $ curl -s http://localhost:9093/metrics | grep watcher_
    
    # HELP watcher_client_latency How long Kubernetes API requests take
    # TYPE watcher_client_latency histogram
    watcher_client_latency_bucket{name="",le="1e-05"} 0
    watcher_client_latency_bucket{name="",le="0.0001"} 0
    watcher_client_latency_bucket{name="",le="0.001"} 0

    Метрики EventListener sink, такие как eventlistener_event_received_count и eventlistener_http_duration_seconds, зависят от запросов. Отправьте хотя бы один запрос к EventListener перед проверкой этих метрик.

    Проверка целей Prometheus

    # Проверить наличие ресурсов ServiceMonitor
    $ kubectl get servicemonitor -n tekton-pipelines
    
    NAME                                AGE
    tekton-chains-metrics               10m
    tekton-eventlistener-sink-metrics   10m
    tekton-pipelines-metrics            10m
    tekton-results-metrics              10m
    tekton-triggers-metrics             10m
    
    # Проверить цели Prometheus (через UI или API Prometheus)
    # Найдите цели с метками job, совпадающими с именами ServiceMonitor

    Примеры запросов PromQL

    # Кумулятивный процент успешных PipelineRun (избегает неправильной интерпретации при пустых окнах завершения)
    100 * sum(tekton_pipelines_controller_pipelinerun_total{status="success"}) / clamp_min(sum(tekton_pipelines_controller_pipelinerun_total), 1)
    
    # Завершённые PipelineRun за последние 5 минут (пропускная способность)
    round(sum(increase(tekton_pipelines_controller_pipelinerun_total[5m])))
    
    # Длительность PipelineRun P95 (режим гистограммы)
    histogram_quantile(0.95,
      rate(tekton_pipelines_controller_pipelinerun_duration_seconds_bucket[5m])
    )
    
    # Длительность TaskRun P95 (режим гистограммы, включает отдельные и в PipelineRun TaskRun)
    histogram_quantile(0.95,
      (
        sum by (le) (rate(tekton_pipelines_controller_taskrun_duration_seconds_bucket[5m]))
        +
        sum by (le) (rate(tekton_pipelines_controller_pipelinerun_taskrun_duration_seconds_bucket[5m]))
      )
    )
    
    # Длительность PipelineRun (режим lastvalue)
    avg_over_time(tekton_pipelines_controller_pipelinerun_duration_seconds[5m])
    
    # Текущие выполняющиеся PipelineRun (один ряд для избежания дублирования легенд)
    max(tekton_pipelines_controller_running_pipelineruns)
    
    # TaskRun, ограниченные квотой ресурсов
    max(tekton_pipelines_controller_running_taskruns_throttled_by_quota)
    
    # Количество ресурсов Trigger
    controller_eventlistener_count
    controller_triggertemplate_count
    
    # Активность подписания Chains
    watcher_taskrun_sign_created_total
    watcher_pipelinerun_sign_created_total

    Примеры MonitorDashboard

    Ниже приведены ресурсы MonitorDashboard с готовыми дашбордами для мониторинга компонентов Tekton. Разверните их в namespace cpaas-system в папке tekton.

    Важно: Каждая панель должна содержать id (уникальное целое число), datasource: prometheus и transformations: []. Каждая цель должна содержать datasource: prometheus и refId. Панели длительности P50/P95 в этом документе используют запросы с *_bucket и требуют metrics.*.duration-type=histogram; если вы используете lastvalue, замените эти запросы на выражения в стиле LastValue, например avg_over_time(...).

    Дашборд Tekton Pipeline

    YAML дашборда Tekton Pipeline
    kind: MonitorDashboard
    apiVersion: ait.alauda.io/v1alpha2
    metadata:
      labels:
        cpaas.io/dashboard.folder: tekton
        cpaas.io/dashboard.is.home.dashboard: "false"
        cpaas.io/dashboard.tag.tekton: "true"
      name: tekton-pipeline
      namespace: cpaas-system
    spec:
      body:
        titleZh: Tekton Pipeline Overview
        tags:
          - tekton
        time:
          from: now-1h
          to: now
        templating:
          list: []
        panels:
          - id: 1
            title: PipelineRun Total (by status)
            type: timeseries
            datasource: prometheus
            gridPos: { h: 8, w: 8, x: 0, y: 0 }
            targets:
              - datasource: prometheus
                expr: sum by (status) (tekton_pipelines_controller_pipelinerun_total)
                refId: A
            fieldConfig:
              defaults:
                color: { mode: palette-classic }
                custom: { drawStyle: line, fillOpacity: 0, lineWidth: 1, spanNulls: false }
                thresholds: { mode: absolute, steps: [{ color: green, value: null }] }
              overrides: []
            options:
              legend: { calcs: [latest], displayMode: list, placement: bottom, showLegend: true }
              tooltip: { mode: multi, sort: desc }
            transformations: []
          - id: 2
            title: TaskRun Total (by status)
            type: timeseries
            datasource: prometheus
            gridPos: { h: 8, w: 8, x: 8, y: 0 }
            targets:
              - datasource: prometheus
                expr: sum by (status) (tekton_pipelines_controller_taskrun_total)
                refId: A
            fieldConfig:
              defaults:
                color: { mode: palette-classic }
                custom: { drawStyle: line, fillOpacity: 0, lineWidth: 1, spanNulls: false }
                thresholds: { mode: absolute, steps: [{ color: green, value: null }] }
              overrides: []
            options:
              legend: { calcs: [latest], displayMode: list, placement: bottom, showLegend: true }
              tooltip: { mode: multi, sort: desc }
            transformations: []
          - id: 3
            title: PipelineRun Success Rate (cumulative)
            type: timeseries
            datasource: prometheus
            gridPos: { h: 8, w: 4, x: 16, y: 0 }
            targets:
              - datasource: prometheus
                expr: "100 * sum(tekton_pipelines_controller_pipelinerun_total{status=\"success\"}) / clamp_min(sum(tekton_pipelines_controller_pipelinerun_total), 1)"
                refId: A
            fieldConfig:
              defaults:
                unit: percent
                color: { mode: thresholds }
                custom: { drawStyle: line, fillOpacity: 0, lineWidth: 1, spanNulls: false }
                thresholds:
                  mode: absolute
                  steps:
                    - { color: red, value: null }
                    - { color: orange, value: 80 }
                    - { color: green, value: 95 }
              overrides: []
            options:
              legend: { calcs: [latest], displayMode: list, placement: bottom, showLegend: true }
              tooltip: { mode: multi, sort: desc }
            transformations: []
          - id: 12
            title: Completed PipelineRuns (last 5m)
            type: timeseries
            datasource: prometheus
            gridPos: { h: 8, w: 4, x: 20, y: 0 }
            targets:
              - datasource: prometheus
                expr: "round(sum(increase(tekton_pipelines_controller_pipelinerun_total[5m])))"
                legendFormat: completed
                refId: A
            fieldConfig:
              defaults:
                unit: short
                decimals: 0
                color: { mode: palette-classic }
                custom: { drawStyle: line, fillOpacity: 0, lineWidth: 1, spanNulls: false }
                thresholds: { mode: absolute, steps: [{ color: green, value: null }] }
              overrides: []
            options:
              legend: { calcs: [latest], displayMode: list, placement: bottom, showLegend: true }
              tooltip: { mode: multi, sort: desc }
            transformations: []
          - id: 4
            title: Running PipelineRuns
            type: timeseries
            datasource: prometheus
            gridPos: { h: 8, w: 8, x: 0, y: 8 }
            targets:
              - datasource: prometheus
                expr: max(tekton_pipelines_controller_running_pipelineruns)
                legendFormat: running
                refId: A
            fieldConfig:
              defaults:
                color: { mode: palette-classic }
                custom: { drawStyle: line, fillOpacity: 0, lineWidth: 1, spanNulls: false }
                thresholds: { mode: absolute, steps: [{ color: green, value: null }] }
              overrides: []
            options:
              legend: { calcs: [latest], displayMode: list, placement: bottom, showLegend: true }
              tooltip: { mode: multi, sort: desc }
            transformations: []
          - id: 5
            title: Running TaskRuns
            type: timeseries
            datasource: prometheus
            gridPos: { h: 8, w: 8, x: 8, y: 8 }
            targets:
              - datasource: prometheus
                expr: max(tekton_pipelines_controller_running_taskruns)
                legendFormat: running
                refId: A
            fieldConfig:
              defaults:
                color: { mode: palette-classic }
                custom: { drawStyle: line, fillOpacity: 0, lineWidth: 1, spanNulls: false }
                thresholds: { mode: absolute, steps: [{ color: green, value: null }] }
              overrides: []
            options:
              legend: { calcs: [latest], displayMode: list, placement: bottom, showLegend: true }
              tooltip: { mode: multi, sort: desc }
            transformations: []
          - id: 6
            title: TaskRuns Throttled
            type: timeseries
            datasource: prometheus
            gridPos: { h: 8, w: 8, x: 16, y: 8 }
            targets:
              - datasource: prometheus
                expr: max(tekton_pipelines_controller_running_taskruns_throttled_by_quota)
                legendFormat: by quota
                refId: A
              - datasource: prometheus
                expr: max(tekton_pipelines_controller_running_taskruns_throttled_by_node)
                legendFormat: by node
                refId: B
            fieldConfig:
              defaults:
                color: { mode: palette-classic }
                custom: { drawStyle: line, fillOpacity: 0, lineWidth: 1, spanNulls: false }
                thresholds: { mode: absolute, steps: [{ color: orange, value: null }] }
              overrides: []
            options:
              legend: { calcs: [latest], displayMode: list, placement: bottom, showLegend: true }
              tooltip: { mode: multi, sort: desc }
            transformations: []
          - id: 7
            title: PipelineRun Duration P50 / P95
            type: timeseries
            datasource: prometheus
            gridPos: { h: 8, w: 8, x: 0, y: 16 }
            targets:
              - datasource: prometheus
                expr: (histogram_quantile(0.5, sum by (le) (rate(tekton_pipelines_controller_pipelinerun_duration_seconds_bucket[5m])))) and on() (sum(rate(tekton_pipelines_controller_pipelinerun_duration_seconds_bucket{le="+Inf"}[5m])) > 0)
                legendFormat: P50
                refId: A
              - datasource: prometheus
                expr: (histogram_quantile(0.95, sum by (le) (rate(tekton_pipelines_controller_pipelinerun_duration_seconds_bucket[5m])))) and on() (sum(rate(tekton_pipelines_controller_pipelinerun_duration_seconds_bucket{le="+Inf"}[5m])) > 0)
                legendFormat: P95
                refId: B
            fieldConfig:
              defaults:
                unit: s
                color: { mode: palette-classic }
                custom: { drawStyle: line, fillOpacity: 0, lineWidth: 1, spanNulls: false }
                thresholds: { mode: absolute, steps: [{ color: green, value: null }] }
              overrides: []
            options:
              legend: { calcs: [latest], displayMode: list, placement: bottom, showLegend: true }
              tooltip: { mode: multi, sort: desc }
            transformations: []
          - id: 8
            title: TaskRun Duration P50 / P95 (Standalone)
            type: timeseries
            datasource: prometheus
            gridPos: { h: 8, w: 8, x: 8, y: 16 }
            targets:
              - datasource: prometheus
                expr: (histogram_quantile(0.5, sum by (le) (rate(tekton_pipelines_controller_taskrun_duration_seconds_bucket[5m])))) and on() (sum(rate(tekton_pipelines_controller_taskrun_duration_seconds_bucket{le="+Inf"}[5m])) > 0)
                legendFormat: P50
                refId: A
              - datasource: prometheus
                expr: (histogram_quantile(0.95, sum by (le) (rate(tekton_pipelines_controller_taskrun_duration_seconds_bucket[5m])))) and on() (sum(rate(tekton_pipelines_controller_taskrun_duration_seconds_bucket{le="+Inf"}[5m])) > 0)
                legendFormat: P95
                refId: B
            fieldConfig:
              defaults:
                unit: s
                color: { mode: palette-classic }
                custom: { drawStyle: line, fillOpacity: 0, lineWidth: 1, spanNulls: false }
                thresholds: { mode: absolute, steps: [{ color: green, value: null }] }
              overrides: []
            options:
              legend: { calcs: [latest], displayMode: list, placement: bottom, showLegend: true }
              tooltip: { mode: multi, sort: desc }
            transformations: []
          - id: 13
            title: TaskRun Duration P50 / P95 (In-Pipeline)
            type: timeseries
            datasource: prometheus
            gridPos: { h: 8, w: 8, x: 16, y: 16 }
            targets:
              - datasource: prometheus
                expr: (histogram_quantile(0.5, sum by (le) (rate(tekton_pipelines_controller_pipelinerun_taskrun_duration_seconds_bucket[5m])))) and on() (sum(rate(tekton_pipelines_controller_pipelinerun_taskrun_duration_seconds_bucket{le="+Inf"}[5m])) > 0)
                legendFormat: P50
                refId: A
              - datasource: prometheus
                expr: (histogram_quantile(0.95, sum by (le) (rate(tekton_pipelines_controller_pipelinerun_taskrun_duration_seconds_bucket[5m])))) and on() (sum(rate(tekton_pipelines_controller_pipelinerun_taskrun_duration_seconds_bucket{le="+Inf"}[5m])) > 0)
                legendFormat: P95
                refId: B
            fieldConfig:
              defaults:
                unit: s
                color: { mode: palette-classic }
                custom: { drawStyle: line, fillOpacity: 0, lineWidth: 1, spanNulls: false }
                thresholds: { mode: absolute, steps: [{ color: green, value: null }] }
              overrides: []
            options:
              legend: { calcs: [latest], displayMode: list, placement: bottom, showLegend: true }
              tooltip: { mode: multi, sort: desc }
            transformations: []
          - id: 9
            title: Workqueue Depth
            type: timeseries
            datasource: prometheus
            gridPos: { h: 8, w: 8, x: 0, y: 24 }
            targets:
              - datasource: prometheus
                expr: max(tekton_pipelines_controller_workqueue_depth)
                legendFormat: depth
                refId: A
            fieldConfig:
              defaults:
                color: { mode: palette-classic }
                custom: { drawStyle: line, fillOpacity: 0, lineWidth: 1, spanNulls: false }
                thresholds: { mode: absolute, steps: [{ color: green, value: null }] }
              overrides: []
            options:
              legend: { calcs: [latest], displayMode: list, placement: bottom, showLegend: true }
              tooltip: { mode: multi, sort: desc }
            transformations: []
          - id: 10
            title: Reconcile Count (by success)
            type: timeseries
            datasource: prometheus
            gridPos: { h: 8, w: 8, x: 8, y: 24 }
            targets:
              - datasource: prometheus
                expr: sum(increase(tekton_pipelines_controller_reconcile_count{success="true"}[5m]))
                legendFormat: success=true
                refId: A
              - datasource: prometheus
                expr: sum(increase(tekton_pipelines_controller_reconcile_count{success="false"}[5m]))
                legendFormat: success=false
                refId: B
            fieldConfig:
              defaults:
                color: { mode: palette-classic }
                custom: { drawStyle: line, fillOpacity: 0, lineWidth: 1, spanNulls: false }
                thresholds: { mode: absolute, steps: [{ color: green, value: null }] }
              overrides: []
            options:
              legend: { calcs: [latest], displayMode: list, placement: bottom, showLegend: true }
              tooltip: { mode: multi, sort: desc }
            transformations: []
          - id: 11
            title: Resolution Waiting
            type: timeseries
            datasource: prometheus
            gridPos: { h: 8, w: 8, x: 16, y: 24 }
            targets:
              - datasource: prometheus
                expr: max(tekton_pipelines_controller_running_pipelineruns_waiting_on_pipeline_resolution)
                legendFormat: PR waiting pipeline
                refId: A
              - datasource: prometheus
                expr: max(tekton_pipelines_controller_running_pipelineruns_waiting_on_task_resolution)
                legendFormat: PR waiting task
                refId: B
              - datasource: prometheus
                expr: max(tekton_pipelines_controller_running_taskruns_waiting_on_task_resolution_count)
                legendFormat: TR waiting task
                refId: C
            fieldConfig:
              defaults:
                color: { mode: palette-classic }
                custom: { drawStyle: line, fillOpacity: 0, lineWidth: 1, spanNulls: false }
                thresholds: { mode: absolute, steps: [{ color: orange, value: null }] }
              overrides: []
            options:
              legend: { calcs: [latest], displayMode: list, placement: bottom, showLegend: true }
              tooltip: { mode: multi, sort: desc }
            transformations: []

    Интерпретация дашборда Tekton Pipeline (часто задаваемые вопросы)

    • PipelineRun Total (by status) — счётчик событий завершения, записываемый контроллером, а не общее количество объектов PipelineRun. В текущей реализации отмена пользователем (spec.status=Cancelled) может не попадать в этот счётчик, поэтому серия cancelled может отсутствовать. Для проверки объёма отмен смотрите объекты PipelineRun и события.
    • Running PipelineRuns — снимок в реальном времени (сколько сейчас выполняется). Может изменяться независимо от PipelineRun Total.
    • Completed PipelineRuns (last 5m) — пропускная способность (новые завершённые запуски за последние 5 минут). Значение 0 при низкой нагрузке или простое — нормально.
    • PipelineRun Success Rate (cumulative) — кумулятивный с момента запуска контроллера, а не процент успеха за 5 минут. Кратковременный сбой не вызывает резкого изменения.
    • Reconcile Count (by success) измеряет количество циклов reconciler контроллера, а не количество PipelineRun.
    • Серии статусов отображаются только для меток, у которых есть данные в выбранном временном окне. Если статус отсутствует, его кривая/легенда не показывается.
    • TaskRun Duration P50 / P95 (Standalone) и TaskRun Duration P50 / P95 (In-Pipeline) разделены для избежания нестабильности смешанных запросов. В средах с одной гистограммой одна из панелей может быть пустой — это нормально.

    Дашборд Tekton Triggers

    YAML дашборда Tekton Triggers
    kind: MonitorDashboard
    apiVersion: ait.alauda.io/v1alpha2
    metadata:
      labels:
        cpaas.io/dashboard.folder: tekton
        cpaas.io/dashboard.is.home.dashboard: "false"
        cpaas.io/dashboard.tag.tekton: "true"
      name: tekton-triggers
      namespace: cpaas-system
    spec:
      body:
        titleZh: Tekton Triggers Overview
        tags:
          - tekton
        time:
          from: now-1h
          to: now
        templating:
          list: []
        panels:
          - id: 1
            title: EventListener Count
            type: timeseries
            datasource: prometheus
            gridPos: { h: 6, w: 5, x: 0, y: 0 }
            targets:
              - datasource: prometheus
                expr: controller_eventlistener_count
                legendFormat: EventListener
                refId: A
            fieldConfig:
              defaults:
                color: { mode: palette-classic }
                custom: { drawStyle: line, fillOpacity: 0, lineWidth: 1, spanNulls: false }
                thresholds: { mode: absolute, steps: [{ color: green, value: null }] }
              overrides: []
            options:
              legend: { calcs: [latest], displayMode: list, placement: bottom, showLegend: true }
              tooltip: { mode: multi, sort: desc }
            transformations: []
          - id: 2
            title: TriggerTemplate Count
            type: timeseries
            datasource: prometheus
            gridPos: { h: 6, w: 5, x: 5, y: 0 }
            targets:
              - datasource: prometheus
                expr: controller_triggertemplate_count
                legendFormat: TriggerTemplate
                refId: A
            fieldConfig:
              defaults:
                color: { mode: palette-classic }
                custom: { drawStyle: line, fillOpacity: 0, lineWidth: 1, spanNulls: false }
                thresholds: { mode: absolute, steps: [{ color: green, value: null }] }
              overrides: []
            options:
              legend: { calcs: [latest], displayMode: list, placement: bottom, showLegend: true }
              tooltip: { mode: multi, sort: desc }
            transformations: []
          - id: 3
            title: TriggerBinding Count
            type: timeseries
            datasource: prometheus
            gridPos: { h: 6, w: 5, x: 10, y: 0 }
            targets:
              - datasource: prometheus
                expr: controller_triggerbinding_count
                legendFormat: TriggerBinding
                refId: A
            fieldConfig:
              defaults:
                color: { mode: palette-classic }
                custom: { drawStyle: line, fillOpacity: 0, lineWidth: 1, spanNulls: false }
                thresholds: { mode: absolute, steps: [{ color: green, value: null }] }
              overrides: []
            options:
              legend: { calcs: [latest], displayMode: list, placement: bottom, showLegend: true }
              tooltip: { mode: multi, sort: desc }
            transformations: []
          - id: 4
            title: ClusterTriggerBinding
            type: timeseries
            datasource: prometheus
            gridPos: { h: 6, w: 5, x: 15, y: 0 }
            targets:
              - datasource: prometheus
                expr: controller_clustertriggerbinding_count
                legendFormat: ClusterTriggerBinding
                refId: A
            fieldConfig:
              defaults:
                color: { mode: palette-classic }
                custom: { drawStyle: line, fillOpacity: 0, lineWidth: 1, spanNulls: false }
                thresholds: { mode: absolute, steps: [{ color: green, value: null }] }
              overrides: []
            options:
              legend: { calcs: [latest], displayMode: list, placement: bottom, showLegend: true }
              tooltip: { mode: multi, sort: desc }
            transformations: []
          - id: 5
            title: ClusterInterceptor
            type: timeseries
            datasource: prometheus
            gridPos: { h: 6, w: 4, x: 20, y: 0 }
            targets:
              - datasource: prometheus
                expr: controller_clusterinterceptor_count
                legendFormat: ClusterInterceptor
                refId: A
            fieldConfig:
              defaults:
                color: { mode: palette-classic }
                custom: { drawStyle: line, fillOpacity: 0, lineWidth: 1, spanNulls: false }
                thresholds: { mode: absolute, steps: [{ color: green, value: null }] }
              overrides: []
            options:
              legend: { calcs: [latest], displayMode: list, placement: bottom, showLegend: true }
              tooltip: { mode: multi, sort: desc }
            transformations: []
          - id: 6
            title: All Trigger Resource Counts (trend)
            type: timeseries
            datasource: prometheus
            gridPos: { h: 8, w: 24, x: 0, y: 6 }
            targets:
              - datasource: prometheus
                expr: controller_eventlistener_count
                legendFormat: EventListener
                refId: A
              - datasource: prometheus
                expr: controller_triggertemplate_count
                legendFormat: TriggerTemplate
                refId: B
              - datasource: prometheus
                expr: controller_triggerbinding_count
                legendFormat: TriggerBinding
                refId: C
              - datasource: prometheus
                expr: controller_clustertriggerbinding_count
                legendFormat: ClusterTriggerBinding
                refId: D
              - datasource: prometheus
                expr: controller_clusterinterceptor_count
                legendFormat: ClusterInterceptor
                refId: E
            fieldConfig:
              defaults:
                color: { mode: palette-classic }
                custom: { drawStyle: line, fillOpacity: 0, lineWidth: 1, spanNulls: false }
                thresholds: { mode: absolute, steps: [{ color: green, value: null }] }
              overrides: []
            options:
              legend: { calcs: [latest], displayMode: list, placement: bottom, showLegend: true }
              tooltip: { mode: multi, sort: desc }
            transformations: []

    Интерпретация дашборда Tekton Triggers (часто задаваемые вопросы)

    • EventListener Count, TriggerTemplate Count, TriggerBinding Count, ClusterTriggerBinding и ClusterInterceptor — это снимки количества объектов, а не объёма запросов или пропускной способности обработки событий.
    • All Trigger Resource Counts (trend) показывает совокупную тенденцию для тех же счётчиков ресурсов. Кратковременные отклонения от отдельных панелей в пределах интервала сбора ожидаемы.
    • Отображение 0 при отсутствии ресурсов Triggers — нормально и не указывает на сбой сбора метрик.

    Дашборд Tekton Results

    YAML дашборда Tekton Results
    kind: MonitorDashboard
    apiVersion: ait.alauda.io/v1alpha2
    metadata:
      labels:
        cpaas.io/dashboard.folder: tekton
        cpaas.io/dashboard.is.home.dashboard: "false"
        cpaas.io/dashboard.tag.tekton: "true"
      name: tekton-results
      namespace: cpaas-system
    spec:
      body:
        titleZh: Tekton Results Overview
        tags:
          - tekton
        time:
          from: now-1h
          to: now
        templating:
          list: []
        panels:
          - id: 1
            title: PipelineRun Reconcile Count (last 5m)
            type: timeseries
            datasource: prometheus
            gridPos: { h: 8, w: 12, x: 0, y: 0 }
            targets:
              - datasource: prometheus
                expr: round(sum(increase(watcher_reconcile_count{reconciler="github.com.tektoncd.results.pkg.watcher.reconciler.pipelinerun.Reconciler",success="true"}[5m])))
                legendFormat: success=true
                refId: A
              - datasource: prometheus
                expr: round(sum(increase(watcher_reconcile_count{reconciler="github.com.tektoncd.results.pkg.watcher.reconciler.pipelinerun.Reconciler",success="false"}[5m])))
                legendFormat: success=false
                refId: B
            fieldConfig:
              defaults:
                color: { mode: palette-classic }
                custom: { drawStyle: line, fillOpacity: 0, lineWidth: 1, spanNulls: false }
                thresholds: { mode: absolute, steps: [{ color: green, value: null }] }
              overrides: []
            options:
              legend: { calcs: [latest], displayMode: list, placement: bottom, showLegend: true }
              tooltip: { mode: multi, sort: desc }
            transformations: []
          - id: 2
            title: TaskRun Reconcile Count (last 5m)
            type: timeseries
            datasource: prometheus
            gridPos: { h: 8, w: 12, x: 12, y: 0 }
            targets:
              - datasource: prometheus
                expr: round(sum(increase(watcher_reconcile_count{reconciler="github.com.tektoncd.results.pkg.watcher.reconciler.taskrun.Reconciler",success="true"}[5m])))
                legendFormat: success=true
                refId: A
              - datasource: prometheus
                expr: round(sum(increase(watcher_reconcile_count{reconciler="github.com.tektoncd.results.pkg.watcher.reconciler.taskrun.Reconciler",success="false"}[5m])))
                legendFormat: success=false
                refId: B
            fieldConfig:
              defaults:
                color: { mode: palette-classic }
                custom: { drawStyle: line, fillOpacity: 0, lineWidth: 1, spanNulls: false }
                thresholds: { mode: absolute, steps: [{ color: green, value: null }] }
              overrides: []
            options:
              legend: { calcs: [latest], displayMode: list, placement: bottom, showLegend: true }
              tooltip: { mode: multi, sort: desc }
            transformations: []
          - id: 3
            title: PipelineRun Reconcile Latency P95
            type: timeseries
            datasource: prometheus
            gridPos: { h: 8, w: 12, x: 0, y: 8 }
            targets:
              - datasource: prometheus
                expr: histogram_quantile(0.95, sum by (le) (rate(watcher_reconcile_latency_bucket{reconciler="github.com.tektoncd.results.pkg.watcher.reconciler.pipelinerun.Reconciler"}[5m])))
                legendFormat: P95
                refId: A
            fieldConfig:
              defaults:
                unit: ms
                color: { mode: palette-classic }
                custom: { drawStyle: line, fillOpacity: 0, lineWidth: 1, spanNulls: false }
                thresholds: { mode: absolute, steps: [{ color: green, value: null }] }
              overrides: []
            options:
              legend: { calcs: [latest], displayMode: list, placement: bottom, showLegend: true }
              tooltip: { mode: multi, sort: desc }
            transformations: []
          - id: 4
            title: TaskRun Reconcile Latency P95
            type: timeseries
            datasource: prometheus
            gridPos: { h: 8, w: 12, x: 12, y: 8 }
            targets:
              - datasource: prometheus
                expr: histogram_quantile(0.95, sum by (le) (rate(watcher_reconcile_latency_bucket{reconciler="github.com.tektoncd.results.pkg.watcher.reconciler.taskrun.Reconciler"}[5m])))
                legendFormat: P95
                refId: A
            fieldConfig:
              defaults:
                unit: ms
                color: { mode: palette-classic }
                custom: { drawStyle: line, fillOpacity: 0, lineWidth: 1, spanNulls: false }
                thresholds: { mode: absolute, steps: [{ color: green, value: null }] }
              overrides: []
            options:
              legend: { calcs: [latest], displayMode: list, placement: bottom, showLegend: true }
              tooltip: { mode: multi, sort: desc }
            transformations: []
          - id: 5
            title: Workqueue Depth (PipelineRun vs TaskRun)
            type: timeseries
            datasource: prometheus
            gridPos: { h: 8, w: 12, x: 0, y: 16 }
            targets:
              - datasource: prometheus
                expr: sum(watcher_work_queue_depth{reconciler="github.com.tektoncd.results.pkg.watcher.reconciler.pipelinerun.Reconciler"})
                legendFormat: pipelinerun
                refId: A
              - datasource: prometheus
                expr: sum(watcher_work_queue_depth{reconciler="github.com.tektoncd.results.pkg.watcher.reconciler.taskrun.Reconciler"})
                legendFormat: taskrun
                refId: B
            fieldConfig:
              defaults:
                color: { mode: palette-classic }
                custom: { drawStyle: line, fillOpacity: 0, lineWidth: 1, spanNulls: false }
                thresholds: { mode: absolute, steps: [{ color: green, value: null }] }
              overrides: []
            options:
              legend: { calcs: [latest], displayMode: list, placement: bottom, showLegend: true }
              tooltip: { mode: multi, sort: desc }
            transformations: []
          - id: 6
            title: Workqueue Adds (last 5m)
            type: timeseries
            datasource: prometheus
            gridPos: { h: 8, w: 12, x: 12, y: 16 }
            targets:
              - datasource: prometheus
                expr: round(sum(increase(watcher_workqueue_adds_total{name=~"github.com.tektoncd.results.pkg.watcher.reconciler.pipelinerun.Reconciler-(consumer|fast|slow)"}[5m])))
                legendFormat: pipelinerun adds
                refId: A
              - datasource: prometheus
                expr: round(sum(increase(watcher_workqueue_adds_total{name=~"github.com.tektoncd.results.pkg.watcher.reconciler.taskrun.Reconciler-(consumer|fast|slow)"}[5m])))
                legendFormat: taskrun adds
                refId: B
            fieldConfig:
              defaults:
                color: { mode: palette-classic }
                custom: { drawStyle: line, fillOpacity: 0, lineWidth: 1, spanNulls: false }
                thresholds: { mode: absolute, steps: [{ color: green, value: null }] }
              overrides: []
            options:
              legend: { calcs: [latest], displayMode: list, placement: bottom, showLegend: true }
              tooltip: { mode: multi, sort: desc }
            transformations: []
          - id: 7
            title: gRPC Request Rate (Results API)
            type: timeseries
            datasource: prometheus
            gridPos: { h: 8, w: 12, x: 0, y: 24 }
            targets:
              - datasource: prometheus
                expr: "sum(rate(grpc_server_handled_total{grpc_service=~\"tekton.results.*\"}[5m]))"
                legendFormat: requests
                refId: A
            fieldConfig:
              defaults:
                color: { mode: palette-classic }
                custom: { drawStyle: line, fillOpacity: 0, lineWidth: 1, spanNulls: false }
                thresholds: { mode: absolute, steps: [{ color: green, value: null }] }
              overrides: []
            options:
              legend: { calcs: [latest], displayMode: list, placement: bottom, showLegend: true }
              tooltip: { mode: multi, sort: desc }
            transformations: []
          - id: 8
            title: gRPC Error Percentage (Results API, excl. NotFound/Canceled)
            type: timeseries
            datasource: prometheus
            gridPos: { h: 8, w: 12, x: 12, y: 24 }
            targets:
              - datasource: prometheus
                expr: "100 * ((sum(rate(grpc_server_handled_total{grpc_service=~\"tekton.results.*\",grpc_code!~\"OK|NotFound|Canceled\"}[5m])) or vector(0)) / clamp_min((sum(rate(grpc_server_handled_total{grpc_service=~\"tekton.results.*\"}[5m])) or vector(0)), 0.001))"
                legendFormat: error %
                refId: A
            fieldConfig:
              defaults:
                unit: percent
                color: { mode: palette-classic }
                custom: { drawStyle: line, fillOpacity: 0, lineWidth: 1, spanNulls: false }
                thresholds: { mode: absolute, steps: [{ color: red, value: null }] }
              overrides: []
            options:
              legend: { calcs: [latest], displayMode: list, placement: bottom, showLegend: true }
              tooltip: { mode: multi, sort: desc }
            transformations: []

    Интерпретация панели Tekton Results (часто задаваемые вопросы)

    • Эта версия панели основана на метриках Results Watcher reconcile/workqueue и метриках gRPC Results API, поэтому она остается заполненной при обычных развертываниях (logs_api=true, автоматическое удаление отключено).
    • PipelineRun Reconcile Count (last 5m) и TaskRun Reconcile Count (last 5m) показывают отдельные 5-минутные приращения для success=true и success=false.
    • PipelineRun Reconcile Latency P95 и TaskRun Reconcile Latency P95 рассчитываются по гистограммам задержек reconcile watcher. При низкой нагрузке линия может быть редкой.
    • Workqueue Depth показывает текущую глубину очереди, а Workqueue Adds (last 5m) — объем добавленных элементов за последние 5 минут.
    • gRPC Error Percentage (Results API, excl. NotFound/Canceled) — это процент аномальных ошибок от общего числа запросов, исключая распространённые коды возврата бизнес-логики (NotFound, Canceled).

    Панель Tekton Chains

    Tekton Chains Dashboard YAML
    kind: MonitorDashboard
    apiVersion: ait.alauda.io/v1alpha2
    metadata:
      labels:
        cpaas.io/dashboard.folder: tekton
        cpaas.io/dashboard.is.home.dashboard: "false"
        cpaas.io/dashboard.tag.tekton: "true"
      name: tekton-chains
      namespace: cpaas-system
    spec:
      body:
        titleZh: Tekton Chains Overview
        tags:
          - tekton
        time:
          from: now-1h
          to: now
        templating:
          list: []
        panels:
          - id: 1
            title: TaskRun Signatures Created (last 5m)
            type: timeseries
            datasource: prometheus
            gridPos: { h: 8, w: 12, x: 0, y: 0 }
            targets:
              - datasource: prometheus
                expr: round(increase(watcher_taskrun_sign_created_total[5m]))
                legendFormat: sign created
                refId: A
            fieldConfig:
              defaults:
                color: { mode: palette-classic }
                custom: { drawStyle: line, fillOpacity: 0, lineWidth: 1, spanNulls: false }
                thresholds: { mode: absolute, steps: [{ color: green, value: null }] }
              overrides: []
            options:
              legend: { calcs: [latest], displayMode: list, placement: bottom, showLegend: true }
              tooltip: { mode: multi, sort: desc }
            transformations: []
          - id: 2
            title: PipelineRun Signatures Created (last 5m)
            type: timeseries
            datasource: prometheus
            gridPos: { h: 8, w: 12, x: 12, y: 0 }
            targets:
              - datasource: prometheus
                expr: round(increase(watcher_pipelinerun_sign_created_total[5m]))
                legendFormat: sign created
                refId: A
            fieldConfig:
              defaults:
                color: { mode: palette-classic }
                custom: { drawStyle: line, fillOpacity: 0, lineWidth: 1, spanNulls: false }
                thresholds: { mode: absolute, steps: [{ color: green, value: null }] }
              overrides: []
            options:
              legend: { calcs: [latest], displayMode: list, placement: bottom, showLegend: true }
              tooltip: { mode: multi, sort: desc }
            transformations: []
          - id: 3
            title: Payloads Stored (last 5m, TaskRun vs PipelineRun)
            type: timeseries
            datasource: prometheus
            gridPos: { h: 8, w: 12, x: 0, y: 8 }
            targets:
              - datasource: prometheus
                expr: round(increase(watcher_taskrun_payload_stored_total[5m]))
                legendFormat: TaskRun
                refId: A
              - datasource: prometheus
                expr: round(increase(watcher_pipelinerun_payload_stored_total[5m]))
                legendFormat: PipelineRun
                refId: B
            fieldConfig:
              defaults:
                color: { mode: palette-classic }
                custom: { drawStyle: line, fillOpacity: 0, lineWidth: 1, spanNulls: false }
                thresholds: { mode: absolute, steps: [{ color: green, value: null }] }
              overrides: []
            options:
              legend: { calcs: [latest], displayMode: list, placement: bottom, showLegend: true }
              tooltip: { mode: multi, sort: desc }
            transformations: []
          - id: 4
            title: Marked Signed (last 5m, TaskRun vs PipelineRun)
            type: timeseries
            datasource: prometheus
            gridPos: { h: 8, w: 12, x: 12, y: 8 }
            targets:
              - datasource: prometheus
                expr: round(increase(watcher_taskrun_marked_signed_total[5m]))
                legendFormat: TaskRun
                refId: A
              - datasource: prometheus
                expr: round(increase(watcher_pipelinerun_marked_signed_total[5m]))
                legendFormat: PipelineRun
                refId: B
            fieldConfig:
              defaults:
                color: { mode: palette-classic }
                custom: { drawStyle: line, fillOpacity: 0, lineWidth: 1, spanNulls: false }
                thresholds: { mode: absolute, steps: [{ color: green, value: null }] }
              overrides: []
            options:
              legend: { calcs: [latest], displayMode: list, placement: bottom, showLegend: true }
              tooltip: { mode: multi, sort: desc }
            transformations: []

    Интерпретация панели Tekton Chains (часто задаваемые вопросы)

    • TaskRun Signatures Created (last 5m), PipelineRun Signatures Created (last 5m), Payloads Stored (last 5m) и Marked Signed (last 5m) используют increase(...[5m]) и показывают приращения за последние пять минут.
    • При отсутствии новой активности по подписанию или сохранению эти линии опускаются до 0; это не означает ошибку компонента.
    • Payloads Stored и Marked Signed отражают разные этапы обработки, поэтому их значения не обязательно должны совпадать.