Сбор метрик для компонентов Tekton
Обзор
Компоненты 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:
Метрики контроллера Pipeline используют префикс tekton_pipelines_controller_.
Метрики PipelineRun
* Метки, отмеченные *, являются необязательными и зависят от конфигурации config-observability.
Уровни меток для running_pipelineruns
Метки метрики running_pipelineruns контролируются параметром metrics.running-pipelinerun.level:
Значения метки статуса
Для метрик PipelineRun:
success — PipelineRun успешно завершён
failed — PipelineRun завершён с ошибкой
cancelled — PipelineRun был отменён
Для метрик TaskRun:
success — TaskRun успешно завершён
failed — TaskRun завершён с ошибкой
Метрики 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 секунд.
Метрики контроллера Triggers используют префикс controller_.
Метрики EventListener Sink
Каждый под EventListener предоставляет дополнительные HTTP-метрики и метрики обработки событий. Эти метрики исходят из процесса EventListener sink (не из контроллера). Префикс метрик Prometheus — eventlistener_.
- Корзины гистограммы
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 включает два подсервиса, предоставляющих метрики.
Метрики Watcher
Метрики Watcher используют префикс watcher_.
Метрики удаления
* Необязательные метки зависят от настроек 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 и отслеживают события, связанные с хранением.
Метка kind идентифицирует тип запуска (PipelineRun / TaskRun в некоторых сериях метрик, pipelinerun / taskrun в других).
Примечание: runs_not_stored_count записывается только при внешнем удалении запуска (например, через kubectl delete), когда Watcher удерживает finalizer для координации архивирования. Она останется пустой, если все следующие условия не выполнены:
- Флаг
--logs_api равен false (хранение логов отключено) — если логи включены, Watcher полностью пропускает координацию через finalizer.
- Флаг
--disable_crd_update равен false (обновления аннотаций разрешены).
- Флаг
--store_deadline установлен в ненулевое значение — максимальное время ожидания завершения архивирования перед отказом и разрешением удаления.
- Запуск был удалён извне до успешного архивирования (нет аннотации
results.tekton.dev/stored=true), и время store_deadline истекло.
В нормальной работе (запуски архивируются до удаления или удаление инициируется самим Watcher через --completed_run_grace_period) счётчик остаётся равным нулю. Ненулевое значение указывает на возможную потерю данных: запуски были удалены до сохранения состояния в Results API.
Быстрое воспроизведение (тестовая среда):
Если вы не видите эту метрику, это обычно означает, что условия триггера не выполнены, а не что метрика отсутствует.
- Настройте Results Watcher через
TektonConfig так, чтобы logs_api=false, disable_crd_update=false, и store_deadline было ненулевым (например, 30s).
- Временно установите количество реплик Results API в
0 через TektonConfig (spec.result.options.deployments.tekton-results-api.spec.replicas: 0), чтобы архивирование не происходило.
- Создайте TaskRun или PipelineRun и дождитесь завершения.
- Дождитесь истечения
store_deadline, затем удалите запуск извне (kubectl delete ...).
- Проверьте
/metrics Watcher или Prometheus на наличие watcher_runs_not_stored_count (с префиксом компонента в формате экспозиции); значение должно увеличиться.
- Восстановите исходный
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 (например, переменных окружения или аргументов).
Поддерживаются следующие ключи:
В отличие от 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, затем создаёт аттестации и подписи.
Метрики контроллера Chains используют префикс watcher_ (как и Results Watcher, но имена метрик уникальны, поэтому коллизий нет).
Метрики Chains
Все метрики Chains — это счётчики без меток.
Примечание: В официальной документации Tekton Chains также упоминаются счётчики *_signing_failures_total для TaskRun и PipelineRun, но они отсутствуют в текущем исходном коде upstream. Проверьте в вашей версии.
Метрики Controller Framework
Все контроллеры Tekton автоматически предоставляют следующие инфраструктурные метрики. Они используют тот же префикс, что и пользовательские метрики компонента (например, tekton_pipelines_controller_, controller_, watcher_).
Настройка 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 отражают разные этапы обработки, поэтому их значения не обязательно должны совпадать.