Рубрики
Без рубрики

Реализация мониторинга / аудита на вызове и восстановление

Сделайте по-эмиссии постепенно меньше перетаскивания. Tagged SystemAdministration, Pagerduty, Python, Devops.

Если вы когда-либо были частью вращения на вызове, вы, вероятно, знаете, что это может быть немного сопротивление, особенно если ваше оповещение немного ТОО хорошо; Вы просыпаетесь в 5 раз в ночь на страницы, которые, кажется, решают, как только вы просто бодрствуете, чтобы убедиться, что вы не можете легко засыпать, и, возможно, это часто бывает часто, когда возникает серьезная страница, вы понимаете «Достаточно быстро, и вот У вас есть обзор инцидентов для подготовки к следующему дню.

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

Аудит для покрытия

Первый шаг в этом процессе знает, что такое, и не является контролирующимся. Какие хосты наблюдаются? Какие услуги наблюдаются? Есть ли хозяин для каждого обслуживания? Вопросы продолжаются и дальше.

Я стремился ответить на этот вопрос сам, запросив мой источник правды, в этом случае нагиос.

Я написал скрипт, чтобы подготовить электронизированную таблицу мониторов хоста, и лист мониторов обслуживания, указывающий, существует ли картирование к контрольному хосту:

#!/bin/bash

hosts () {
  cat /etc/nagios/conf.d/hosts/*.cfg | grep "host_name\|address\|alias\|hostgroups" |grep -v localhost | perl -ne '$line = $_;
  chomp($line);
  if ($line =~ /host_name(.*)/) {
  $match = $1 ;
  $match =~ s/ |,//g;
  print "\n".$match.",";
  };
  if ($line =~ /address(.*)/) {
  $match = $1 ;
  $match =~ s/ |,//g;
  print $match.",";
  }
  if ($line =~ /alias(.*)/) {
  $match = $1 ;
  $match =~ s/^\s+//;
  $match =~ s/,//g;
  print $match.",";
  }
  if ($line =~ /hostgroups(.*)/) {
  $match = $1 ;
  $match =~ s/^\s+//;
  $match =~ s/,//g;
  print $match.",";
  };
  '
}

services () {
  cat /etc/nagios/conf.d/services/*.cfg | grep "hostgroup_name\|service_description\|check_command" |grep -v localhost | perl -ne '$line = $_;
  chomp($line);
  if ($line =~ /hostgroup_name(.*)/) {
  $match = $1 ;
  $match =~ s/ |,//g;
  print "\n".$match.",";
  };
  if ($line =~ /service_description(.*)/) {
  $match = $1 ;
  $match =~ s/ |,//g;
  print $match.",";
  }
  if ($line =~ /check_command(.*)/) {
  $match = $1 ;
  $match =~ s/ |,//g;
  print $match.",";
  };
  '
}

write_inv () {

  if [ $1 = "dump" ]; then
    if [ $2 = "hosts" ]]; then
      hosts
    elif [ $2 = "services" ]; then
      services
    else
      echo "bad option (services | hosts)"
    fi
  elif [ $1 = "audit" ]; then
    DATE=`date +%Y%m%d%H%m`
    OUTFILE_hosts="$HOME/hosts_$DATE.csv"
    OUTFILE_services="$HOME/services_$DATE.csv"

    echo "hostgroup_name,service_description,check_command," >> $OUTFILE_services && \
    echo "Writing $OUTFILE_services..." && \
    services >> $OUTFILE_services

    echo "hostname,address,hostgroups," >> $OUTFILE_hosts && \
    echo "Writing $OUTFILE_hosts..." && \
    hosts >> $OUTFILE_hosts
  else
    echo "Options: { dump (prints to stdout) [hosts, services] | audit (writes to file) }"
  fi
}


main () {
  write_inv $@
}

main $@

Итак, работает ./audit.sh audit создаст эту пару CSV, которые в Сервис View, даст вам Host Group, сервис и то, что тестируется в сервисе (это путь к модулю в Nagios, поэтому вы можете убедиться, какие мониторы используются), а затем использование Host_Group может быть перекрестным -Чните списком мониторинга хостов (что скажет вам, какие хосты составляют эту группу).

Это расскажет вам две вещи:

  • Что контролируется

и

  • Насколько хорошо оно контролируется (охват)

Однако этот контекст, однако, не решит все ваши проблемы; Это скажет вам, если что-то есть или нет, контролируется, не если этот монитор стоит вашего времени. Вы можете идентифицировать это что-то отсутствует, но не смещено.

Например, на серверах баз данных вы можете быть мониторинг для тупиков, но это будет делать вам немного хорошо, если экземпляр уже находится в огне (отключение сети, отказ в слоте репликации, экземпляр, возможно, был расторгнут, и проверка вверх по течению Не поймал его, список продолжается!). Вы можете заполнить эти пробелы, но Chinibrating ответ вашей команды поставляется с некоторыми дополнительными проницательностью, которые снова отслеживаются и автоматизируются по вашему циклу аудита (I.E. Equrlious).

Удаление усталости!

Ключ к улучшению вашего мониторинга – это понимание того, откуда приходят предупреждения, и оценка, если ответ был пропорционален.

Если вы знаете, что-то произойдет, и вы понимаете, почему и как это происходит, и он решает себя внутри некоторого периода времени, и вы обычно признаете страницу для этого вопроса, но найдите ее, прежде чем вы онлайн, чтобы проверить, то Возможно, это то, что может быть автоматизировано из существования, что только расточится, если проблема сохраняется (даже если этот путь эскалации добавляет несколько секунд, чтобы указать, что он не имеет резолюции в одиночку).

Большинство на звонок Pager Services имеют некоторое плагин для этого, но то, что я хотел бы поговорить о том, является ресторан ваших ответов, а также выявить смещенные мониторы.

Потому что мне нравятся электронные таблицы, я управляю сценарием, как этот период, чтобы увидеть, что мы проводим наибольшее количество времени, ответив на во время вращения на вызове:

import requests
import json
import os
import datetime
import sys
import optparse

p = optparse.OptionParser(conflict_handler="resolve", description= "Creates CSV for PagerDuty alert history; requires start and end date.")
p.add_option('-s', '--since', action='store', type='string', dest='since', default='', help='Start date for reporting')
p.add_option('-u', '--until', action='store', type='string', dest='until', default='', help='End date for Reporting')
p.add_option('-k', '--key', action='store', type='string', dest='api_key', default='', help='PagerDuty API Key')
options, arguments = p.parse_args()

since = options.since
until = options.until
key = options.key

if 'key' in locals():
    API_KEY = key
else:
    API_KEY = os.environ['PAGERDUTY_RO_KEY']

SINCE = since
UNTIL = until
STATUSES = []
TIME_ZONE = 'UTC'
LIMIT = 50
RUNDATE = datetime.datetime.today().strftime('%Y%m%d%H%M%S')

def list_incidents(offsetval):
    url = 'https://api.pagerduty.com/incidents'
    headers = {
        'Accept': 'application/vnd.pagerduty+json;version=2',
        'Authorization': 'Token token={token}'.format(token=API_KEY)
    }
    payload = {
        'since': SINCE,
        'until': UNTIL,
        'statuses[]': STATUSES,
        'limit': LIMIT,
        'time_zone': TIME_ZONE,
        'offset': offsetval
    }
    r = requests.get(url, headers=headers, params=payload)
    return r.text

def write_csv(resp):
    incidents = json.loads(resp)['incidents']
    incidents_data = open('%s/pd-audit/%s-Incidents-%s.csv' % (os.path.expanduser('~'), RUNDATE, offset), 'w+')
    for inc in incidents:
        incidents_data.write("%s,%s,\n" % (inc['title'],inc['created_at']))
    incidents_data.close()

if __name__ == '__main__':
    more_status = True
    offset = 0
    while more_status == True:
        resp = list_incidents(offset)
        more = json.loads(resp)['more']
        if more == False:
            more_status = False
            print "No more pages after current run. '%s/pd-audit/%s-Incidents-%s.csv'..." % (os.path.expanduser('~'), RUNDATE, offset)
            write_csv(resp)
        else:
            print "Writing '%s/pd-audit/%s-Incidents-%s.csv'..." % (os.path.expanduser('~'), RUNDATE, offset)
            resp = list_incidents(offset)
            write_csv(resp)
        offset += 1

Вы можете, затем сортировать лист по типу инцидента – сколько из них помог мне вручную прошедший? Сколько ли было ненужных страниц, которые были решены только достаточно быстро, чтобы оправдать использование бота, чтобы признать промежуточно? Сколько могло бы пойти лучше, потому что мы могли бы обнаружить его раньше? (Помните, что пример базы данных?) Что могло бы случиться по-разному сделать то, что мы на самом деле сделал лучше? Список вопросов продолжается.

Точка этих упражнений состоит в том, чтобы сохранить, перед вашим разумом, что такое и не работает для вас и вашей команды. Это позволяет вам некоторое объективное расстояние между вами и то, что вы на самом деле реагировали, имея данные, чтобы сказать, что-то оказалось полезным или оказалось родом сопротивления.

Реализация этого итерационного процесса, каждый проход может получить вам больше внимания того, что ваша команда может проводить меньше времени во время борьбы с огнями, инвестируясь, или, в моем случае, разбившись от этих мониторинга слепых мест

Оригинал: “https://dev.to/jmarhee/implementing-monitoringon-call-audit-and-remediation-44p9”