Поради щодо спостережуваності

Використання Prometheus для моніторингу у промисловому масштабі

Рекомендований підхід для моніторингу Istio mesh у промисловому масштабі за допомогою Prometheus — це використання ієрархічної федерації у поєднанні з набором правил запису.

Хоча встановлення Istio стандартно не розгортає Prometheus, інструкції з Початку роботи Опція 1: Швидкий старт встановлюють розгортання Prometheus, про що йдеться в керівництві з інтеграції Prometheus. Це розгортання Prometheus спеціально налаштоване з дуже коротким вікном зберігання (6 годин). Розгортання Prometheus для швидкого старту також налаштоване для збору метрик від кожного проксі Envoy, що працює в mesh, додаючи до кожної метрики набір міток про їхнє походження (instance, pod і namespace).

Архітектура моніторингу Istio у промисловому масштабі з використанням Prometheus.
Моніторинг Istio у промисловому масштабі за допомогою Istio

Агрегація на рівні робочого навантаження через правила запису

Щоб агрегувати метрики між екземплярами та контейнерами, оновіть стандартну конфігурацію Prometheus за допомогою наступних правил запису:

groups:
- name: "istio.recording-rules"
  interval: 5s
  rules:
  - record: "workload:istio_requests_total"
    expr: |
      sum without(instance, kubernetes_namespace, kubernetes_pod_name) (istio_requests_total)

  - record: "workload:istio_request_duration_milliseconds_count"
    expr: |
      sum without(instance, kubernetes_namespace, kubernetes_pod_name) (istio_request_duration_milliseconds_count)

  - record: "workload:istio_request_duration_milliseconds_sum"
    expr: |
      sum without(instance, kubernetes_namespace, kubernetes_pod_name) (istio_request_duration_milliseconds_sum)

  - record: "workload:istio_request_duration_milliseconds_bucket"
    expr: |
      sum without(instance, kubernetes_namespace, kubernetes_pod_name) (istio_request_duration_milliseconds_bucket)

  - record: "workload:istio_request_bytes_count"
    expr: |
      sum without(instance, kubernetes_namespace, kubernetes_pod_name) (istio_request_bytes_count)

  - record: "workload:istio_request_bytes_sum"
    expr: |
      sum without(instance, kubernetes_namespace, kubernetes_pod_name) (istio_request_bytes_sum)

  - record: "workload:istio_request_bytes_bucket"
    expr: |
      sum without(instance, kubernetes_namespace, kubernetes_pod_name) (istio_request_bytes_bucket)

  - record: "workload:istio_response_bytes_count"
    expr: |
      sum without(instance, kubernetes_namespace, kubernetes_pod_name) (istio_response_bytes_count)

  - record: "workload:istio_response_bytes_sum"
    expr: |
      sum without(instance, kubernetes_namespace, kubernetes_pod_name) (istio_response_bytes_sum)

  - record: "workload:istio_response_bytes_bucket"
    expr: |
      sum without(instance, kubernetes_namespace, kubernetes_pod_name) (istio_response_bytes_bucket)

  - record: "workload:istio_tcp_sent_bytes_total"
    expr: |
      sum without(instance, kubernetes_namespace, kubernetes_pod_name) (istio_tcp_sent_bytes_total)

  - record: "workload:istio_tcp_received_bytes_total"
    expr: |
      sum without(instance, kubernetes_namespace, kubernetes_pod_name) (istio_tcp_received_bytes_total)

  - record: "workload:istio_tcp_connections_opened_total"
    expr: |
      sum without(instance, kubernetes_namespace, kubernetes_pod_name) (istio_tcp_connections_opened_total)

  - record: "workload:istio_tcp_connections_closed_total"
    expr: |
      sum without(instance, kubernetes_namespace, kubernetes_pod_name) (istio_tcp_connections_closed_total)

Федерація з використанням агрегованих метрик на рівні робочого навантаження

Щоб встановити федерацію Prometheus, змініть конфігурацію вашого розгортання Prometheus у промисловому масштабі, щоб збирати метрики з федераційної точки доступу Istio Prometheus.

Додайте наступне завдання (job) до вашої конфігурації:

- job_name: 'istio-prometheus'
  honor_labels: true
  metrics_path: '/federate'
  kubernetes_sd_configs:
  - role: pod
    namespaces:
      names: ['istio-system']
  metric_relabel_configs:
  - source_labels: [__name__]
    regex: 'workload:(.*)'
    target_label: __name__
    action: replace
  params:
    'match[]':
    - '{__name__=~"workload:(.*)"}'
    - '{__name__=~"pilot(.*)"}'

Якщо ви використовуєте Prometheus Operator, натомість використовуйте наступну конфігурацію:

apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  name: istio-federation
  labels:
    app.kubernetes.io/name: istio-prometheus
spec:
  namespaceSelector:
    matchNames:
    - istio-system
  selector:
    matchLabels:
      app: prometheus
  endpoints:
  - interval: 30s
    scrapeTimeout: 30s
    params:
      'match[]':
      - '{__name__=~"workload:(.*)"}'
      - '{__name__=~"pilot(.*)"}'
    path: /federate
    targetPort: 9090
    honorLabels: true
    metricRelabelings:
    - sourceLabels: ["__name__"]
      regex: 'workload:(.*)'
      targetLabel: "__name__"
      action: replace

Оптимізація збору метрик за допомогою правил запису

Крім використання правил запису для агрегації між контейнерами та екземплярами, ви можете використовувати правила запису для створення агрегованих метрик, спеціально налаштованих для ваших існуючих інформаційних панелей та сповіщень. Оптимізація збору даних таким чином може значно зменшити споживання ресурсів у вашому виробничому екземплярі Prometheus, а також покращити швидкість виконання запитів.

Наприклад, уявімо власну інформаційну панель моніторингу, яка використовує такі запити Prometheus:

  • Загальна кількість запитів, усереднена за останню хвилину за назвою сервісу призначення та простором імен

    sum(irate(istio_requests_total{reporter="source"}[1m]))
    by (
        destination_canonical_service,
        destination_workload_namespace
    )
  • P95 клієнтська затримка, усереднена за останню хвилину, за іменами та простором імен сервісів джерела та призначення

    histogram_quantile(0.95,
      sum(irate(istio_request_duration_milliseconds_bucket{reporter="source"}[1m]))
      by (
        destination_canonical_service,
        destination_workload_namespace,
        source_canonical_service,
        source_workload_namespace,
        le
      )
    )

До конфігурації Istio Prometheus можна додати наступний набір правил запису, використовуючи префікс istio щоб спростити ідентифікацію цих метрик для федерації.

groups:
- name: "istio.recording-rules"
  interval: 5s
  rules:
  - record: "istio:istio_requests:by_destination_service:rate1m"
    expr: |
      sum(irate(istio_requests_total{reporter="destination"}[1m]))
      by (
        destination_canonical_service,
        destination_workload_namespace
      )
  - record: "istio:istio_request_duration_milliseconds_bucket:p95:rate1m"
    expr: |
      histogram_quantile(0.95,
        sum(irate(istio_request_duration_milliseconds_bucket{reporter="source"}[1m]))
        by (
          destination_canonical_service,
          destination_workload_namespace,
          source_canonical_service,
          source_workload_namespace,
          le
        )
      )

Виробничий екземпляр Prometheus буде оновлений для федерації з екземпляром Istio за допомогою:

  • умови match з {__name__=~"istio:(.*)"}

  • конфігурації relabeling метрик з: regex: "istio:(.*)"

Оригінальні запити будуть замінені на:

  • istio_requests:by_destination_service:rate1m

  • avg(istio_request_duration_milliseconds_bucket:p95:rate1m)

Чи була ця інформація корисною?
Чи є у вас пропозиції щодо покращення?

Дякуємо за ваш відгук!