+++
title = "Временные ряды"
description = "Введение во временные ряды"
keywords = ["harvest", "intro", "guide", "concepts", "timeseries"]
aliases = ["/docs/harvest/latest/guides/timeseries"]
weight = 500
+++

# Введение во временные ряды

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

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

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

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

{{< рисунок src="/static/img/docs/example_graph.png" класс="docs-image--no-shadow" максимальная ширина ="850 пикселей" >}}

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

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

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

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

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

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

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

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

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

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

- **Среднее значение** возвращает сумму всех значений, деленную на общее количество значений.
- **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. Благодаря подобной оптимизации TSDBS занимает значительно меньше места, чем другие базы данных.

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

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

- [Графит](https://graphiteapp.org /)
- [InfluxDB](https://www.influxdata.com/products/influxdb-overview /)
- [Прометей](https://prometheus.io /)

    ```
    погода,местоположение=США-средний запад температура=82 1465839830100400200
      |    -------------------- --------------  |
      |             |             |             |
      |             |             |             |
    +-----------+--------+-+---------+-+---------+
    |измерение|,набор тегов| |набор полей| |временная метка|
    +-----------+--------+-+---------+-+---------+
    ```

### Сбор данных временных рядов

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

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

- [collectd](https://collectd.org /)
- [statsd](https://github.com/statsd/statsd )
- [Экспортеры Прометея](https://prometheus.io/docs/instrumenting/exporters /)
- [Телеграф](https://github.com/influxdata/telegraf )

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

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

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