Интеграция Atlassian Jira, Prometheus и Slack за 15 минут

В этой статье поговорим о том, как интегрировать Atlassian Jira, Prometheus и Slack.

Я создам канал Slack, куда Prometheus будет отправлять алерты, которые в свою очередь будут формироваться на основе метрик из Atlassian Jira.

Jira и Prometheus будут запускаться в докерах. Я буду использовать образ Jira от Idalko.

Пожалуйста, посмотрите вот это видео. В этом видео я объясняю подробнее то, что мы делаем. Это позволит лучше Вам понять эту статью.

Вот структура файлов, которая получится после того, как мы создадим все файлы из этой статьи:

- tutorial
  - jira
      docker-compose.yml
  - prometheus
      docker-compose.yml
    - data
      - alertmanager
        - config
            alertmanager.yml
      - prometheus
        - config
            rules.yml
            prometheus.yml

Запускаем Jira

Создадим файл docker-compose.yml:

version: '3'
services:
  jira:
    image: idalko/atlassian-jira-software
    environment:
      - DISABLE_NOTIFICATIONS=TRUE
      - JIRA_ARGS=-Datlassian.plugins.enable.wait=300
      - JVM_MINIMUM_MEMORY=2G
      - JVM_MAXIMUM_MEMORY=4G
    volumes:
      - ./data:/opt/atlassian/jira/data
    ports:
      - 8080:8080
    restart: always

  jiradb:
    image: postgres:9.6
    environment:
      - POSTGRES_PASSWORD=secret
      - POSTGRES_USER=jira
      - POSTGRES_DB=jira
    volumes:
      - ./db:/var/lib/postgresql/data
    restart: always

Запустим этот docker-compose.yml:

docker-compose up

Затем установим плагин Prometheus Exporter for Jira.

Запускаем Prometheus

Создадим файл docker-compose.yml:

version: '3'
services:
  prometheus:
    image: prom/prometheus:latest
    container_name: monitoring_prometheus
    restart: unless-stopped
    volumes:
      - ./data/prometheus/config:/etc/prometheus/
      - ./data/prometheus/data:/prometheus
    command:
      - '--config.file=/etc/prometheus/prometheus.yml'
    expose:
      - 9090
    ports:
      - 9090:9090
    links:
      - cadvisor:cadvisor
      - node-exporter:node-exporter
  
  node-exporter:
    image: prom/node-exporter:latest
    container_name: monitoring_node_exporter
    restart: unless-stopped
    ports:
      - 9100:9100
    expose:
      - 9100
  
  cadvisor:
    image: google/cadvisor:latest
    container_name: monitoring_cadvisor
    restart: unless-stopped
    volumes:
      - /:/rootfs:ro
      - /var/run:/var/run:rw
      - /sys:/sys:ro
      - /var/lib/docker/:/var/lib/docker:ro
    ports:
      - 8081:8080
    expose:
      - 8080

  alertmanager:
    image: prom/alertmanager:latest
    volumes:
      - ./data/alertmanager/config:/etc/alertmanager/
    ports:
      - 9093:9093
    expose:
      - 9093

Добавим вот такую строку в файл hosts на Вашем компьютере:

127.0.0.1 host.docker.internal

Это нужно для того, что Вам придется обращаться к Jira из Prometheus. Jira работает на localhost:8080. Если Вы из контейнера Prometheus обратитесь по localhost:8080, то localhost будет рассматриваться как сам контейнер. Поэтому Вы будете обращаться по алиасу host.docker.internal:8080. В этом случае запрос дойдет куда нужно.

Создайте файл prometheus.yml в папке data/prometheus/config:

global:
  scrape_interval:     15s 
  evaluation_interval: 15s 
rule_files:
  - "/etc/prometheus/rules.yml"
alerting:
 alertmanagers:
   - static_configs:
     - targets:
       - alertmanager:9093
scrape_configs:
  - job_name: 'prometheus'
    static_configs:
      - targets: ['localhost:9090','cadvisor:8080','node-exporter:9100']
  - job_name: 'jira'
    scheme: http 
    metrics_path: '/plugins/servlet/prometheus/metrics'
    static_configs:
      - targets: ['host.docker.internal:8080']   

Создайте файл rules.yml в data/prometheus/config:

groups:
  - name: AllInstances
    rules:
    - alert: InstanceDown
      expr: up == 0
      for: 1m
      annotations:
        title: 'Instance {{ $labels.instance }} down'
        description: '{{ $labels.instance }} of job {{ $labels.job }} has been down for more than 1 minute.'
      labels:
        severity: 'critical'

    - alert: TooManyUsers
      expr: jira_all_active_users_gauge > 1
      annotations:
        title: 'Too many users for {{ $labels.instance }}'
        description: '{{ $labels.instance }} of job {{ $labels.job }} has more than 1 user.'
      labels:
        severity: 'meduim'

Перейдите в Slack и настройте Incoming Webhook для канала, в который будут приходить алерты. В результате у Вас будет линк, которые позволит alert менеджеру от Prometheus добавлять сообщения в этот канал. В моем случае это вот такой линк: https://hooks.slack.com/services/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. Этот линк нужно присвоить параметру slack_api_url в файле alertmanager.yml

Создайте файл alertmanager.yml в папке data/alertmanager/config:

global:
  resolve_timeout: 1m
  slack_api_url: 'https://hooks.slack.com/services/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'
 
route:
  receiver: 'slack-notifications'
 
receivers:
- name: 'slack-notifications'
  slack_configs:
  - channel: '#alerts'
    send_resolved: true
    icon_url: https://avatars3.githubusercontent.com/u/3380462
    title: |-
      [{{ .Status | toUpper }}{{ if eq .Status "firing" }}:{{ .Alerts.Firing | len }}{{ end }}] {{ .CommonLabels.alertname }} for {{ .CommonLabels.job }}
      {{- if gt (len .CommonLabels) (len .GroupLabels) -}}
        {{" "}}(
        {{- with .CommonLabels.Remove .GroupLabels.Names }}
          {{- range $index, $label := .SortedPairs -}}
            {{ if $index }}, {{ end }}
            {{- $label.Name }}="{{ $label.Value -}}"
          {{- end }}
        {{- end -}}
        )
      {{- end }}
    text: >-
      {{ range .Alerts -}}
      *Alert:* {{ .Annotations.title }}{{ if .Labels.severity }} - `{{ .Labels.severity }}`{{ end }}
 
      *Description:* {{ .Annotations.description }}
 
      *Details:*
        {{ range .Labels.SortedPairs }} • *{{ .Name }}:* `{{ .Value }}`
        {{ end }}
      {{ end }}

Запустите docker-compose.yml:

docker-compose up

Тестируем

Добавьте еще одного пользователя в Jira. В этом случае в канал Slack придет сообщение, что у Вас слишком много пользователей. Затем удалите созданного пользователя и в канал Slack придет сообщение, что проблема было разрешена.

Остановите Jira и Вы получите сообщение в канал Slack, что Jira не работает. Поднимите Jira и Вы получите сообщение, что проблема была разрешена.

If you have found a spelling error, please, notify us by selecting that text and pressing Ctrl+Enter.

Leave a Reply

%d bloggers like this:

Spelling error report

The following text will be sent to our editors: