Сейчас есть много решении по мониторингу, например ELK, Grafana с Prometheus и тд., но во многих системах часто требуются интеграции нескольких инструментов и много ручной работы для достижения аналогичной функциональности.
Экосистема интеграции 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 агента с конфигурациями логирования на 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 агент с настройками 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;
Создаем третий плейбук, который отвечает за настройку логирования:
- 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 агента на всех серверах:
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 аккаунт, конкретно в Infrastructure → Hosts, где отобразятся наши сервера с метриками.
Если на этой же странице выбрать в списке MS SQL сервер, то увидим DB метрики.
Логи в DataDog можно найти в левом меню: Logs → Search & Analytics → Explorer. Тут же есть нужный нам сервис, который мы указали при запуске плейбука datadog_logging.yaml:
Создать алертинг в DataDog можно в графе Monitors:
Последний шаг — нотификация, которая позволяет написать сообщение в любом формате и указать тегами нужного пользователя и команду
Чтобы установить новый мониторинг с помощью DataDog, не надо много труда. Настройка, интеграция и создание алертинга занимает гораздо меньше времени, нежели в других мониторинговых решениях.
Даже если у вас нет четкой задачи, мы все обсудим и подскажем.
Узнать больше