Consul. Watches

Consul Watch: отслеживание изменений инфраструктуры и оповещение затронутых сервисов. Наблюдение организовано с помощью блокирующих запросов через HTTP API. Агент автоматически выполняет запрос данных и вызывает обработчика события.

Обработчик событий - любой исполняемый файл. Он должен принимать входные данные из потока stdin в формате JSON.

Объекты мониторинга задаются при старте агента и/или команды «consul watch». Управление мониторингом через HTTP API не предусмотрено. Интеграция возможна через библиотеки или sdk.

Агент consul поддерживает 7 видов наблюдений:

  1. key - наблюдение за парой ключ/значение
  2. keyprefix - наблюдение за ключом
  3. services - наблюдение за списком доступных сервисов
  4. nodes - наблюдение за нодами
  5. service -  наблюдение за конкретным сервисом
  6. checks - наблюдение за результатом проверки
  7. event -  наблюдение за пользовательскими событиями

1. Key

Используется для наблюдения за парой ключ/значение в распределенном хранилище.

Конфигурация наблюдателя в формате JSON:

{
  "type": "key",
  "key": "demo",
  "handler": "/bin/cat"
}

или с помощью CLI интерфейса:

$ consul watch -type=key -key=demo /bin/cat

Формат входных данных для обработчика:

{
  "Key": "demo",
  "CreateIndex": 13,
  "ModifyIndex": 13,
  "LockIndex": 0,
  "Flags": 0,
  "Value": "dmFsdWU=",
  "Session": ""
}

2. Keyprefix

Используется для наблюдения за ключами по префиксу в распределенном хранилище. Возвращает все ключи подходящие по префиксу.

Конфигурация наблюдателя в формате JSON:

{
  "type": "keyprefix",
  "prefix": "demo/",
  "handler": "/bin/cat"
}

или с помощью CLI интерфейса:

$ consul watch -type=keyprefix -prefix=demo/ /bin/cat

Формат входных данных для обработчика:

[
  {
    "Key": "demo/dev",
    "CreateIndex": 13,
    "ModifyIndex": 13,
    "LockIndex": 0,
    "Flags": 0,
    "Value": "TU9BUg==",
    "Session": ""
  },
  {
    "Key": "demo/prod",
    "CreateIndex": 13,
    "ModifyIndex": 13,
    "LockIndex": 0,
    "Flags": 0,
    "Value": "YXNkZg==",
    "Session": ""
  }
]

3. Services

Используется для наблюдения за сервисами. Задается без параметров.

Конфигурация наблюдателя в формате JSON:

{
  "type": "services",
  "handler": "/bin/cat"
}

или с помощью CLI интерфейса:

$ consul watch -type=services /bin/cat

Формат входных данных для обработчика:

{
  "consul": []
}

4. Nodes

Используется для наблюдения за узлами. Задается без параметров.

Конфигурация наблюдателя в формате JSON:

{
   "type": "nodes",
   "handler": "/bin/cat"
}

или с помощью CLI интерфейса:

$ consul watch -type=nodes /bin/cat

Формат входных данных для обработчика:

[
{
  "ID": "d50b1ab1-9e18-2e4f-b7b4-d8ca4b4cd4e2",
  "Node":  "791953045b86",
  "Address":  "127.0.0.1",
  "Datacenter":  "dc1",
  "TaggedAddresses":{
    "lan":  "127.0.0.1",
    "wan":  "127.0.0.1"
  },
  "Meta":  {},
  "CreateIndex":  5,
  "ModifyIndex":  6
}
]

5. Service

Используется для наблюдения за экземплярами сервиса. Параметр «service» обязателен. Опционально могут быть заданы «tag» «passingonly».

Конфигурация наблюдателя в формате JSON:

{
  "type": "service",
  "service": "consul",
  "handler": "/bin/cat"
}

или с помощью CLI интерфейса:

$ consul watch -type=service -service=consul /bin/cat

Формат входных данных для обработчика:

[
{
  "Node":  {
    "ID":  "d50b1ab1-9e18-2e4f-b7b4-d8ca4b4cd4e2",
    "Node":  «791953045b86",
    "Address":  «127.0.0.1",
    "Datacenter": «dc1",
    "TaggedAddresses":{
      "lan":  «127.0.0.1",
      "wan": «127.0.0.1"
    },
    "Meta":  {},
    "CreateIndex":  5,
    "ModifyIndex":  6
  },
  "Service": {
    "ID":  "consul",
    "Service": "consul",
    "Tags":  [],
    "Port":  8300,
    "Address":  "",
    "EnableTagOverride":  false,
    "CreateIndex": 5,
    "ModifyIndex":  5
  },
  "Checks":
  [
    {
      "Node": "791953045b86",
      "CheckID":  "serfHealth",
      "Name":  "Serf Health Status",
      "Status":  "passing",
      "Notes":  "",
      "Output":  "Agent alive and reachable",
      "ServiceID":  "",
      "ServiceName":  "",
      "ServiceTags":  []
    }
 ]
}
]

6. Checks

Используется для наблюдения за результатом проверок сервиса или его состояния. Опционально принимает один из параметров:  «service» или «state». По умолчанию отслеживаются все проверки.

Конфигурация наблюдателя в формате JSON:

{
  "type": "checks",
  "service": "consul",
  "handler": "/bin/cat"
}

или с помощью CLI интерфейса:

$ consul watch -type=checks -service=consul /bin/cat

Формат входных данных для обработчика:

[
  {
   "Node": "791953045b86",
    "CheckID": "service:consul",
    "Name": "Service 'consul' check",
    "Status": "passing",
    "Notes": "",
    "Output": "",
    "ServiceID": "consul",
    "ServiceName": "consul",
    "ServiceTags": []
  }
]

7. Event

Используется для наблюдения за прикладными событиями пользователя.

Конфигурация наблюдателя в формате JSON:

{
  "type": "event",
  "name": "user-event",
  "handler": "/bin/cat"
}

или с помощью CLI интерфейса:

$ consul watch -type=event -name=user-event /bin/cat

Формат входных данных для обработчика:

[
  {
    "ID": "33dad143-4b3c-eb0f-e076-547ffc5bd907",
    "Name": "user-event",
    "Payload": "aGVsbG8td29ybGQ",
    "NodeFilter": "",
    "ServiceFilter": "",
    "TagFilter": "",
    "Version": 1,
    "LTime": 4
  },
  ...
]

Генерация события с помощью команды "consul event":

$ consul event -name=user-event hello-world

Итого

Consul - инструмент для глубокой интеграции с инфраструктурой. Реактивная реакция на изменения контекста. Переключение схемы взаимодействия между прикладными сервисами. С помощью данного инструмента вы можете вывести свою инфраструктуру на новый уровень. Реализовать собственный кластер поверх механизмов consul.