Почему возникает ошибка "INVALID" как недопустимый стартовый токен при попытке собрать метрики Prometheus из приложения, работающего в Docker?

Какова конфигурация Prometheus, представленная в файле `prometheus.yml`, и как она связана с файлом `docker-compose.yaml`, который описывает сервис Prometheus? Кроме того, как обеспечивается связка контейнера Prometheus с API-контейнерами в одной Docker-сети, чтобы по запросу метрик в браузере можно было их увидеть?
  • 2 декабря 2024 г. 10:53
Ответы на вопрос 1
Ошибка "INVALID" как недопустимый стартовый токен в Prometheus обычно возникает, когда Prometheus пытается прочитать метрики из указанного источника, но сталкивается с некорректным форматом данных. Это может произойти по нескольким причинам, например:

1. **Неверный endpoint**: Убедитесь, что URL для сбора метрик указан правильно в конфигурации `prometheus.yml`. Этот URL должен вернуть корректный формат метрик в формате Prometheus.

2. **Недостижимость сервиса**: Если сервис, из которого нужно собрать метрики, не доступен (например, он не запущен, или настройки сети в Docker не позволяют Prometheus достучаться до него), это также может вызвать ошибку.

3. **Некорректный формат данных**: Если сервис возвращает данные в неверном формате (например, HTML вместо текстового формата метрик), Prometheus не сможет его распарсить.

Теперь давайте разберёмся с конфигурацией Prometheus и её связью с `docker-compose.yaml`.

### 1. Пример конфигурации `prometheus.yml`:

```yaml
global:
  scrape_interval: 15s 

scrape_configs:
  - job_name: 'my_service'
    static_configs:
      - targets: ['my_service:8080']
```

Этот файл определяет, что Prometheus будет собирать метрики с сервиса `my_service`, который находится по адресу `my_service:8080`.

### 2. Пример конфигурации `docker-compose.yaml`:

```yaml
version: '3'

services:
  my_service:
    image: my_service_image
    networks:
      - my_network

  prometheus:
    image: prom/prometheus
    volumes:
      - ./prometheus.yml:/etc/prometheus/prometheus.yml
    ports:
      - "9090:9090"
    networks:
      - my_network

networks:
  my_network:
```

В этом `docker-compose.yaml` создаются два сервиса: `my_service` и `prometheus`. Оба сервиса подключены к одной сети `my_network`, что позволяет им взаимодействовать друг с другом. Prometheus указывает на `my_service` как на целевой объект для сбора метрик.

### 3. Связка контейнера Prometheus с API-контейнерами:

Контейнеры Prometheus и API-сервиса должны находиться в одной сети Docker (`my_network` в данном случае), что позволяет Prometheus запрашивать метрики API по имени сервиса (в примере это `my_service`). 

Чтобы получить доступ к метрикам:

- Запустите все сервисы через Docker Compose.
- Откройте браузер и перейдите по адресу `http://localhost:9090/targets` для проверки, правильно ли Prometheus видит цели.
- Если всё настроено верно, вы должны увидеть `my_service` в статусе `UP`.
- Чтобы получить доступ к метрикам, перейдите на `http://localhost:9090/metrics` (при этом убедитесь, что ваш API-сервис отвечает на запросы в формате Prometheus).

### Итог:

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