Установка и мониторинг DataDog с помощью Ansible

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

Почему DataDog

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


Экосистема интеграции DataDog охватывает широкий спектр технологий, что упрощает управление разрозненными системами. Я выбрал DataDog из-за этих преимуществ:


  1. Удобный интерфейс
  2. Гибкий и достаточно простой подход к конфигурации
  3. Большой выбор по настройке интеграций с множеством систем на разных уровнях
  4. Быстрая настройка алертинга, нежели в том же ELK, где требуется писать watcher в формате JSON со скриптом “painless”, который далеко не прост для новичков
  5. Простая документация и отличная поддержка от команды саппорта DataDog

Это первые преимущества, которые бросаются в глаза при начале работы с DataDog. Преимуществ может быть больше, в том числе в плане экономии средств, финансов и времени. Чтобы сэкономить ресурсы, предлагаем пройти аудит мониторинга от нашей компании.


Ознакомиться с продуктом DataDog, его сервисами и подробной информацией можно тут.

Установка DataDog на практике

Допустим, у нас есть три сервера: Windows OS и Linux OS для хранения логов, а также MS SQL БД сервер. Нам требуется настроить мониторинг, алертинг и логирование с этими серверами. Архитектура будет выглядеть примерно так:

Для начала нужно зарегистрироваться и создать аккаунт в DataDog.


После этого, переходим в Integrations APIs и находим свой API ключ. Он нам пригодится при установке агента.


Далее необходимо скачать и установить DataDog agent на этих двух серверах, который по умолчанию собирает все метрики железа серверов (CPU, RAM, Disk Usage и др.)


Можно установить агент вручную в зависимости от вашей операционной системы, тут есть хорошая инструкция. Но я был хотел показать способ установки агента с помощью Ansible плейбуков — это более удобный и автоматизированный способ.

С главной (master node) машины будет запускаться сам Ansible, он отвечает за управление slave node серверами путем выполнения плейбуков —сценариями, определяющие задачи, которые необходимо выполнить на slave node серверах. В этом же master node будет файл инвентаризации со списком всех slave node серверов и сборников плейбуков, определяющих задачи автоматизации.


Slave node — это машины, управляемые master node помощью Ansible. В нашем случае, это log-сервера Windows и Linux и БД сервер.


Подготовка окружения:


Для начала, подготовим наши slave nodes, чтобы они могли получить сигнал от плейбуков и запустить все процессы:


На Linux сервере:


# Установка Python
sudo apt-get update
sudo apt-get install -y python3

# Настройка SSH доступов и копирование публичного ключа в master node, откуда будем запускать ansible: 
ssh-keygen
ssh-copy-id user@yourserver # Тут указываете свои данные по master node

На Windows сервере (применено и для сервера с MS SQL ): Ansible использует удаленное управление Windows (WinRM) для связи с хостами Windows. Вам необходимо настроить WinRM на каждом сервере Windows. Для этого достаточно запустить этот PowerShell скрипт:


winrm set winrm/config/service/auth @{Basic="true"}

winrm set winrm/config/service @{AllowUnencrypted="true"}

New-SelfSignedCertificate -DnsName "yourserver" -CertStoreLocation "cert:\LocalMachine\My"

winrm create winrm/config/Listener?Address=*+Transport=HTTPS @{Hostname="yourserver";CertificateThumbprint="THUMBPRINT"}

winrm create winrm/config/Listener?Address=*+Transport=HTTP

Enable-PSRemoting -Force

Подготовим простое окружение для запуска Ansible на машине. Оттуда будем запускать команды плейбука (master node). Шаги для Ubuntu Linux:


# Установка Python и Pip:
sudo apt update
sudo apt install python3 python3-pip -y


# Установка Ansible:
sudo apt update
sudo apt install ansible -y


# Установка Ansible collection (для запуска плейбуков в Windows серверах с нужными модулями и плагинами):
ansible-galaxy collection install ansible.windows


# Создаем директории для Ansible кода:
mkdir ansible-datadog
cd ansible-datadog
mkdir -p inventory group_vars playbooks roles/datadog/tasks roles/datadog/defaults

Создаем файл hosts внутри Inventory директории (необходимо для таргета серверов, чтобы Ansible понял, где он будет запускать команды) и добавляем следующие записи:


[log_servers]
server1 ansible_host=192.168.1.10
server2 ansible_host=192.168.1.11

[mssql_servers]
mssql_server1 ansible_host=192.168.1.20

Мы создали две группы серверов, log_servers и mssql_servers. К ним добавили IP каждого сервера.


Далее создаем файл group_vars/all.yml (он содержит переменные, которые применяются глобально ко всем хостам в инвентаре. Эти переменные являются общими для всех сборников сценариев и ролей):


datadog_agent_version: "latest"
datadog_agent_local_repo: false
datadog_api_key: "your_datadog_api_key"
dd_password: "your_dd_password"
collection_type: "general"

Необходимо указать свои credentials по API ключу и паролю.

Первый плейбук DataDog

Далее создаем сами плейбуки, которые содержат код установки DataDog агента и его конфигурации. Первый плейбук по установке DataDog агента с конфигурациями логирования на Windows и Linux.


playbooks/datadog.yml


- hosts: log_servers
  gather_facts: True
  strategy: free

  tasks:
    - name: Install and configure datadog agent for Windows
      block:
        - name: Install and configure datadog agent for Windows
          import_role:
            name: datadog.datadog
          vars:
            datadog_api_key: "{{ datadog_api_key }}"
            datadog_windows_ddagentuser_name: DatadogAgent
            datadog_windows_ddagentuser_password: "{{ dd_password }}"
            datadog_config:
              site: datadoghq.eu
              hostname: "{{ inventory_hostname }}"
              use_dogstatsd: true
              dogstatsd_port: 8125
              process_config:
                enabled: true
                process_collection:
                  enabled: true
              inventories_configuration_enabled: true
              tags:
                - collection_type: "{{ collection_type }}"

          become: yes
          become_method: runas
          become_user: "{{ ansible_user }}"

        # Change to LocalSystem
        - name: Restart watchdog Datadog agent service
          win_service:
            name: datadogagent
            username: SYSTEM

        # Change to LocalSystem on trace agent
        - name: Restart watchdog Trace agent service
          win_service:
            name: datadog-trace-agent
            username: SYSTEM

        # worakround for DD api key missing
        - name: Restart watchdog agent service
          win_service:
            name: datadogagent
            state: restarted
            force_dependent_services: yes
      when: ansible_os_family == "Windows" 

    - name: Install and configure datadog agent for Linux
      block:

        # Workaround for installing from Katello-hosted repository
        # Package must be installed in advance, then repo management tasks are skipped
        # Since https://github.com/DataDog/ansible-datadog/pull/431 is not merged yet,
        # we need to ensure that the agent is already installed before a role tries to do it
        - name: Install agent package from local repos
          ansible.builtin.yum:
            name: "datadog-agent-{{ datadog_agent_version | d('that-should-never-happen') }}"
            state: present
          when: datadog_agent_version is defined and datadog_agent_local_repo|d(false)

        - name: Install and configure datadog agent for Linux
          import_role:
            name: datadog.datadog
          vars:
            datadog_api_key: "{{ datadog_api_key }}"
            datadog_config:
              site: datadoghq.eu
              hostname: "{{ inventory_hostname }}"
              use_dogstatsd: false
              process_config:
                enabled: true
                process_collection:
                  enabled: true
              inventories_configuration_enabled: true
              tags:
                - collection_type: "{{ collection_type }}"
          become: yes

        - name: Restart watchdog agent
          service:
            name:  datadog-agent
            state: restarted
      when: ansible_os_family != "Windows"
      tags:
        - datadog-linux

Стоит обратить внимание на переменную и значения site: datadoghq.eu - здесь указывайте тот сайт, на котором вы зарегистрировались. Подробнее о сайтах тут.

Второй плейбук DataDog

Второй плейбук будет устанавливать DataDog агент с настройками SQL и сборами метрик из базы


playbooks/datadog_sql.yml


- hosts: mssql_servers
  gather_facts: true
  strategy: free

  tasks:
  - name: Set hostname
    set_fact: 
      sql_hostname: "{{ 'secluster.bpex.site01' if 'SECLU' in ansible_facts.hostname else ('becluster.bpex.site01' if 'BECLU' in ansible_facts.hostname else ('appcluster.bpex.site01' if 'APPCLU' in ansible_facts.hostname else 'localhost'))}}"

  - name: Check if db is clustered
    win_service:
      name: clussvc 
    register: is_clustered
    ignore_errors: yes

  - name: Check SQL version 
    win_shell: "Invoke-SqlCmd -username 'datadog-sql' -password '{{ dd_password }}' -query 'select @@version' -ServerInstance {{ sql_hostname }}" 
    register: sql_version
    #no_log: True

  - name: Enable non-clustered SQL config

    win_lineinfile:
      path: C:\ProgramData\Datadog\conf.d\sqlserver.d\conf.yaml
      line: |
        init_config:

        instances:
          - host: localhost,1433
            username: datadog-sql
            password: {{ dd_password }}
            server_version: '{{ sql_version.stdout_lines[-3].split(" ")[3] }}'
            #reported_hostname: {{ ansible_facts.hostname }} 
            database_autodiscovery: true
            # autodiscovery_include:
            #   - master$
            #   - AdventureWorks.*
        
            # autodiscovery_exclude:
            #   - model
            #   - msdb
        
            autodiscovery_db_service_check: true
            include_master_files_metrics: true
            include_instance_metrics: true
            include_db_fragmentation_metrics: false
            dbm: false
        
            service: sql-server
            adoprovider: SQLOLEDB
            disable_generic_tags: false
            #include_fci_metrics: true
      create: yes
    when:
      - sql_version.stdout_lines[-3].split(" ")[3]  is version("2008", '>')
      - is_clustered.exists == false

  - name: Enable clustered SQL config
    win_lineinfile:
      path: C:\ProgramData\Datadog\conf.d\sqlserver.d\conf.yaml
      line: |
        init_config:

        instances:
          - host: localhost,1433
            username: datadog-sql
            password: {{ dd_password }}
            server_version: '{{ sql_version.stdout_lines[-3].split(" ")[3] }}'
            #reported_hostname: {{ ansible_facts.hostname }}
            database_autodiscovery: true
            # autodiscovery_include:
            #   - master$
            #   - AdventureWorks.*
        
            # autodiscovery_exclude:
            #   - model
            #   - msdb
        
            autodiscovery_db_service_check: true
            include_master_files_metrics: true
            include_instance_metrics: true
            include_db_fragmentation_metrics: false
            dbm: false
        
            service: sql-server
        
            disable_generic_tags: false
            include_fci_metrics: true 
      create: yes
    when:
      - sql_version.stdout_lines[-3].split(" ")[3]  is version("2008", '>')
      - is_clustered.exists == true
  - name: Restart datadogagent
    win_service:
        name: datadogagent
        state: restarted
        force_dependent_services: yes

Обратите внимание на переменную и значения site: datadoghq.eu. Для успешного выполнения этого плейбука нам необходимо внутри MS SQL базы создать локального юзера для DataDog агента.


Следующие команды нужно запустить внутри самого SQL.


Создать аккаунт в БД с read-only доступом:


CREATE LOGIN datadog WITH PASSWORD = '<PASSWORD>';
CREATE USER datadog FOR LOGIN datadog;
GRANT SELECT on sys.dm_os_performance_counters to datadog;
GRANT VIEW SERVER STATE to datadog;

Чтобы собирать показатели размера файлов для каждой базы данных, убедитесь, что созданный вами пользователь (datadog) имеет разрешение на подключение к вашим базам данных, запустив:


GRANT CONNECT ANY DATABASE to datadog;

Третий плейбук DataDog

Создаем третий плейбук, который отвечает за настройку логирования:


- hosts: log_servers
  gather_facts: True
  strategy: free
  
  tasks:
    - name: Enable and configure file logging for datadog agent on Windows
      block:
        - name: Enable file logging
          win_lineinfile:
            path: C:\ProgramData\Datadog\datadog.yaml 
            line: "logs_enabled: true"
            state: present
          when: logging_path is defined
        - name: Create directory if it does not exist
          win_file: 
            path: C:\ProgramData\Datadog\conf.d\{{ logging_service }}.d
            state: directory
        - name: Remove existing conf.yaml file and add new one based on provided variables
          block:
             - name: Remove existing conf.yaml file
               win_file:
                 path: C:\ProgramData\Datadog\conf.d\{{ logging_service }}.d\conf.yaml
                 state: absent    
        - name: Configure logging based on provided variables
          win_lineinfile:
            path: C:\ProgramData\Datadog\conf.d\{{ logging_service }}.d\conf.yaml
            line: |
              logs:
                - type: file
                  path: "{{ logging_path }}"
                  service: "{{ logging_service }}"
                  source: "{{ logging_source }}"
            state: present
            create: true

          when: 
            - logging_path is defined
            - logging_service is defined
            - logging_source is defined
        - name: Restart watchdog agent
          win_service:
            name: datadogagent
            state: restarted
            force_dependent_services: yes    
      when: ansible_os_family == "Windows"
  
    - name: Enable and configure file logging for datadog agent on Linux
      block:
        - name: Enable file logging
          lineinfile:
            path: /etc/datadog-agent/datadog.yaml
            line: "logs_enabled: true"
            state: present
          when: logging_path is defined

        - name: Configure logging based on provided variables
          blockinfile:
            path: /etc/datadog-agent/conf.d/{{ logging_service }}.d/conf.yaml
            block: |
              logs:
                - type: file
                  path: "{{ logging_path }}"
                  service: "{{ logging_service }}"
                  source: "{{ logging_source }}"
            state: present
            create: true
          when: 
            - logging_path is defined
            - logging_service is defined
            - logging_source is defined
            
        - name: Setup file permissions for dd-agent on server
          ansible.posix.acl:
            path: "{{ logging_path }}"
            entity: dd-agent
            type: user
            permissions: rx
            recursive: true
            state: present
          when: logging_path is defined
          
          # worakround for DD api key missing
        - name: Restart watchdog agent
          service:
            name:  datadog-agent
            state: restarted
          
      when: ansible_os_family != "Windows"

Установка агента DataDog

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


# команда запускает процесс установки DataDog агента на всех серверах:
ansible-playbook -i inventory/hosts playbooks/datadog_sql.yml

# команда запускает процесс настройки агента для SQL сервера
ansible-playbook -i inventory/ —-limit “mssql_servers” playbooks/datadog_sql.yml

# команда запускает процесс настройки логирования в DataDog агенте:
ansible-playbook -i inventory/ —-limit “log_servers” playbooks/datadog_logging.yml -e "logging_path=/path/to/logfile logging_source=my_source logging_service=my_service"   

# logging_path - это путь к файлам логов
# logging_source - директория с файлами логов или общее название 
# logging_service - наименование сервиса, у которого берем логи.

Метрики DataDog

После завершения установки заходим в наш DataDog аккаунт, конкретно в Infrastructure → Hosts, где отобразятся наши сервера с метриками.

Если на этой же странице выбрать в списке MS SQL сервер, то увидим DB метрики.

Логи DataDog

Логи в DataDog можно найти в левом меню: Logs → Search & Analytics → Explorer. Тут же есть нужный нам сервис, который мы указали при запуске плейбука datadog_logging.yaml:

Алертинг DataDog

Создать алертинг в DataDog можно в графе Monitors:

  • Нажмите New Monitor
  • Выберите нужный тип мониторинга. Например, выберем Metric и затем конфигурируем наш алретинг и его значения: какая метрика нужна, с какого сервера и значения по threshold:

Последний шаг — нотификация, которая позволяет написать сообщение в любом формате и указать тегами нужного пользователя и команду

Чтобы установить новый мониторинг с помощью DataDog, не надо много труда. Настройка, интеграция и создание алертинга занимает гораздо меньше времени, нежели в других мониторинговых решениях.

Закажите аудит мониторинга

Даже если у вас нет четкой задачи, мы все обсудим и подскажем.

Узнать больше