+++
title = "Временные ряды"
description = "Введение во временные ряды"
keywords = ["harvest", "intro", "guide", "concepts", "timeseries"]
weight = 400
+++
# Введение во временные ряды

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

| Время | Значение |
| ----- | ----- |
| 09:00 | 24°С |
| 10:00 | 26°С |
| 11:00 | 27°С |

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

Таблицы полезны, когда вы хотите идентифицировать отдельные измерения, но вам сложно увидеть общую картину. Более распространенной визуализацией временных рядов является _graph_, который вместо этого размещает каждое измерение вдоль временной оси. Визуальные представления, такие как график, облегчают обнаружение закономерностей и особенностей данных, которые в противном случае было бы трудно увидеть.

{{< Figure src="/static/img/docs/example_graph.png" class="docs-image--no-shadow" max-width="850px" >}}

Данные о температуре, подобные приведенным в примере, далеко не единственный пример временного ряда. Другие примеры временных рядов:

- Использование процессора и памяти
- Данные датчика
- Индекс фондового рынка

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

- Новые данные добавляются в конце через равные промежутки времени, например, ежечасно в 09:00, 10:00, 11:00 и т. д.
- Измерения редко обновляются после добавления — например, вчерашняя температура не меняется.

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

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

Некоторые временные ряды имеют закономерности, которые повторяются в течение известного периода. Например, днем ​​температура обычно выше, а ночью снижается. Идентифицируя эти периодические или _сезонные_ временные ряды, вы можете делать уверенные прогнозы относительно следующего периода. Если мы знаем, что нагрузка на систему достигает пика каждый день около 18:00, мы можем добавить больше машин прямо перед этим.

## Агрегирование временных рядов

В зависимости от того, что вы измеряете, данные могут сильно различаться. Что, если вы хотите сравнить периоды, превышающие интервал между измерениями? Если бы вы измеряли температуру один раз в час, вы бы получили 24 точки данных в день. Чтобы сравнить температуру в августе за разные годы, вам нужно объединить 31 умножить на 24 точки данных в одну.

Объединение набора измерений называется _агрегацией_. Существует несколько способов агрегирования данных временных рядов. Вот некоторые из них:

- **Среднее** возвращает сумму всех значений, разделенную на общее количество значений.
- **Min** и **Max** возвращают наименьшее и наибольшее значение в коллекции.
- **Sum** возвращает сумму всех значений в коллекции.
- **Count** возвращает количество значений в коллекции.

Например, агрегируя данные за месяц, можно определить, что август 2017 г. в среднем был теплее, чем годом ранее. Вместо этого, чтобы узнать, в каком месяце была самая высокая температура, вы сравните максимальную температуру за каждый месяц.

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

В ИТ-индустрии данные временных рядов часто собираются для мониторинга таких вещей, как инфраструктура, оборудование или события приложений. Генерируемые машиной данные временных рядов обычно собираются с короткими интервалами, что позволяет реагировать на любые неожиданные изменения сразу после их возникновения. Как следствие, данные накапливаются быстрыми темпами, поэтому крайне важно иметь способ эффективного хранения и запроса данных. В результате в последние годы популярность баз данных, оптимизированных для данных временных рядов, возросла.

### Базы данных временных рядов

База данных временных рядов (TSDB) — это база данных, специально разработанная для данных временных рядов. Хотя для хранения измерений можно использовать любую обычную базу данных, TSDB предлагает некоторые полезные оптимизации.

Современные базы данных временных рядов используют тот факт, что измерения только добавляются и редко обновляются или удаляются. Например, временные метки для каждого измерения очень мало меняются с течением времени, что приводит к сохранению избыточных данных.

Посмотрите на эту последовательность временных меток Unix:

```
1572524345, 1572524375, 1572524404, 1572524434, 1572524464
```

Глядя на эти временные метки, все они начинаются с «1572524», что приводит к неэффективному использованию дискового пространства. Вместо этого мы могли бы хранить каждую последующую метку времени как разницу, или _delta_, с первой:

```
1572524345, +30, +29, +30, +30
```

Мы могли бы даже пойти дальше, вычислив дельты этих дельт:

```
1572524345, +30, -1, +1, +0
```

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

Еще одна особенность TSDB — возможность фильтровать измерения с помощью _tags_. Каждая точка данных помечена тегом, который добавляет контекстную информацию, например, где было выполнено измерение. Вот пример [формата данных InfluxDB](https://docs.influxdata.com/influxdb/v1.7/write_protocols/line_protocol_tutorial/#syntax), демонстрирующий, как хранится каждое измерение.

Вот некоторые из TSDB, поддерживаемых Harvest:

- [Graphite](https://graphiteapp.org/)
- [InfluxDB](https://www.influxdata.com/products/influxdb-overview/)
- [Prometheus](https://prometheus.io/)

    ```
   погода,расположение= us-midwest температура=82 1465839830100400200
      |    -------------------- --------------  |
      |             |             |             |
      |             |             |             |
    +-----------+--------+-+---------+-+---------+
    |измерение|,ярлык_настройка| |настройка поля| |отметка времени|
    +-----------+--------+-+---------+-+---------+
    ```
### Сбор данных временных рядов

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

Вот несколько примеров коллекторов:

- [collectd](https://collectd.org/)
- [statsd](https://github.com/statsd/statsd)
- [Prometheus exporters](https://prometheus.io/docs/instrumenting/exporters/)
- [Telegraf](https://github.com/influxdata/telegraf)

Сборщик либо отправляет данные в базу данных, либо позволяет базе данных извлекать из нее данные. Оба метода имеют свои плюсы и минусы:

|           | за                                                            | против                                                       |
| ----      | ------------------------------------------------------------  | ------------------------------------------------------------ |
|Нажать     | Легче реплицировать данные в несколько мест назначения.       | TSDB не может контролировать объем передаваемых данных.
| Вытащить  | Улучшенный контроль над тем, сколько данных принимается, и их подлинность.| Брандмауэры, VPN или балансировщики нагрузки могут затруднить доступ к агентам.|

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

