|
|
Строка 1: |
Строка 1: |
| Выражения метрик позволяют использовать простые арифметические операции прямо в селекторе метрик.
| | Отправляет пользовательские точки данных в Ключ-ААСТРОМ. |
|
| |
|
| Например, это выражение вычисляет соотношение (в процентах) двух показателей:
| | Предоставленные точки данных должны соответствовать протоколу приема метрик. Вам не нужно сначала регистрировать метрику. После того, как Ключ-АСТРОМ приняла и обработала данные, вы можете использовать их так же, как и любые другие показатели в Ключ-АСТРОМ, например, в диаграммах или событиях показателей. Вы также можете предоставить метаданные для введенной метрики через API настроек. |
| <code>metric1 / metric2 * 100</code>
| |
| В качестве операндов выражения можно использовать метрики или числа.
| |
|
| |
|
| * Вам нужно использовать скобки, чтобы обеспечить порядок операций.
| | Предпочитаете использовать метрики прямо на хосте? |
| * Все метрики с более чем 1 точкой данных, участвующей в выражении метрики, должны иметь одинаковое разрешение.
| |
| * В качестве операнда можно использовать любую метрику, в том числе метрику, модифицированную любой цепочкой преобразования , и можно применять преобразования к результату выражения.
| |
|
| |
|
| == Ограничения ==
| | Для просмотра точек данных введенной метрики можно использовать: |
|
| |
|
| * Селектор должен содержать хотя бы один ключ метрики. | | * Обозреватель данных |
| * Вы можете запрашивать точки данных до 10 метрик в одном запросе. | | * ПОЛУЧИТЬ запрос точек данных метрики из API Metric v2. |
|
| |
|
| Для целей этого ограничения одно выражение (например, <code>metric2 + metric2</code>) считается одной метрикой.
| | Запрос потребляет <code>text/plain</code>полезную нагрузку. Полезная нагрузка ограничена <code>1,000</code>строками. |
| | {| class="wikitable" |
| | | rowspan="3" |POST |
| | |Managed |
| | |<code><nowiki>https://{your-domain}/e/{your-environment-id}/api/v2/metrics/ingest</nowiki></code> |
| | |- |
| | |SaaS |
| | |<code><nowiki>https://{your-environment-id}.live.ruscomtech.ru/api/v2/metrics/ingest</nowiki></code> |
| | |- |
| | |Окружающая среда АктивногоШлюза |
| | |<code><nowiki>https://{your-activegate-domain}/e/{your-environment-id}/api/v2/metrics/ingest</nowiki></code> |
| | |} |
|
| |
|
| == Приоритет == | | == Аутентификация == |
| Применяются стандартные правила математического приоритета:
| | Чтобы выполнить этот запрос, вам нужен токен доступа с областью действия Ingest metrics (<code>metrics.ingest</code>). Чтобы узнать, как получить и использовать его, см. раздел [[Токены и аутентификация (API)|Токены и аутентификация]]. |
|
| |
|
| # Скобки, метрические преобразования
| | == Параметры == |
| # Отрицание
| | {| class="wikitable" |
| # Умножение, деление
| | !Параметр |
| # Сложение, вычитание
| | !Тип |
| | !Описание |
| | !In |
| | !Необходимость |
| | |- |
| | |body |
| | |string |
| | |Точки данных, указанные в линейном протоколе. Каждая строка представляет одну точку данных. |
| | |body |
| | |требуется |
| | |} |
|
| |
|
| == Агрегация == | | === Запрос объектов тела === |
| Если агрегация была применена в цепочке преобразования, используется эта агрегация. Если преобразование не применялось, используется агрегация по умолчанию. Ваши метрические операнды могут быть разных агрегатов. Например, <code>metric:max - metric:min</code>.
| |
|
| |
|
| == Разрешение выражений == | | ==== Объект <code>RequestBody</code> ==== |
| Метрические выражения разрешаются следующим образом:
| | Объект не предоставляет никаких параметров. |
|
| |
|
| # Сформируйте пары кортежей для каждой пары метрик.
| | == Ответ == |
| # Выровняйте точки данных в каждом кортеже.
| |
| # Примените арифметическую операцию к выровненным точкам данных.
| |
|
| |
|
| === Кортежи === | | === Коды ответов === |
| В арифметических операциях используются точки данных кортежей (уникальные комбинации метрика-измерение-значение измерения) метрик. Идентичные кортежи каждой метрики объединяются в пары, а затем их точки данных выравниваются.
| | {| class="wikitable" |
| | !Код |
| | !Описание |
| | |- |
| | |202 |
| | |Предоставленные точки данных метрики принимаются и будут обрабатываться в фоновом режиме. |
| | |- |
| | |400 |
| | |Некоторые точки данных являются недопустимыми. Допустимые точки данных принимаются и будут обрабатываться в фоновом режиме. |
| | |} |
|
| |
|
| Если одна метрика является безразмерной (имеет только один кортеж без измерений и значений измерений), то этот единственный кортеж сопоставляется с каждым кортежем других метрик. То же самое относится и к числам.
| | == Пример == |
| | | <code>curl</code>С помощью этой команды вы будете использовать метрику, назначенную измерению.<code>cpu.temperatureHOST-06F288EE2A930951</code> |
| Непарные кортежи игнорируются выражением и не представлены в результате.
| | <code>curl -L -X POST '<nowiki>https://mySampleEnv.live.ruscomtech.ru.com/api/v2/metrics/ingest'</nowiki> \ |
| | | -H 'Authorization: Api-Token dt0c01.abc123.abcdefjhij1234567890' \ |
| === Точки данных === | | -H 'Content-Type: text/plain' \ |
| После формирования пар кортежей точки данных выравниваются, а затем к выровненным точкам данных применяется желаемая арифметическая операция.
| | --data-raw 'cpu.temperature,dt.entity.host=HOST-06F288EE2A930951,cpu=1 55'</code> |
| | |
| * Если какая-либо из выровненных точек данных равна <code>null</code>, выражение преобразуется в <code>null</code>.
| |
| * Если в операции задействовано число, оно выравнивается с каждой точкой данных метрического операнда.
| |
| * Если одна метрика представляет собой одну точку данных, а другая представляет собой ряд, одна точка данных выравнивается с каждой точкой данных ряда.
| |
| * Если обе метрики представляют собой одну точку данных, точки данных выравниваются, и результирующий временной интервал охватывает обе точки данных.
| |
| * Если обе метрики являются сериями, точки данных выравниваются по отметкам времени.
| |
| | |
| Для любых невыровненных точек данных выражение разрешается в <code>null</code>.
| |
| | |
| == Лучшие практики ==
| |
| | |
| === Используйте только при необходимости ===
| |
| Используйте метрическое выражение только в том случае, если вы не можете достичь своей цели без него. Допустим, вы хотите рассчитать среднее использование ЦП двумя хостами <code>HOST-001</code>и <code>HOST-002</code>. Вы можете сделать это с помощью метрического выражения:
| |
| <code>(
| |
| builtin:host.cpu.usage:filter(eq("dt.entity.host","HOST-001")):splitBy()
| |
| +
| |
| builtin:host.cpu.usage:filter(eq("dt.entity.host","HOST-002")):splitBy()
| |
| )
| |
| /2</code>
| |
| При таком подходе есть две проблемы. Во-первых, выражение трудно читать и, следовательно, подвержено синтаксическим ошибкам. Во-вторых, если один из хостов находится в автономном режиме, результат выражения будет пустым. Несмотря на то, что вторая проблема может быть решена с помощью преобразования по умолчанию , использование средней агрегации более эффективно:
| |
| <code>builtin:host.cpu.usage | |
| :filter(
| |
| or(
| |
| eq("dt.entity.host","HOST-001"),
| |
| eq("dt.entity.host","HOST-002")
| |
| )
| |
| )
| |
| :splitBy()
| |
| :avg</code>
| |
| | |
| === Не конвертировать единицы ===
| |
| Не используйте метрическое выражение для преобразования единиц измерения данных. Вместо этого используйте преобразование toUnit . Единственным исключением из этого правила являются устройства, которые Dynatrace не поддерживает. Используйте запрос GET для всех единиц , чтобы получить список поддерживаемых единиц.
| |
| | |
| === Ограничить использование преобразований ===
| |
| Всегда применяйте предельное преобразование к результату вычисления, а не к его операндам.
| |
| | |
| Рассмотрим следующий запрос, который пытается добавить 10 самых популярных периодов использования ЦП к 10 основным периодам простоя ЦП.
| |
| <code>builtin:host.cpu.usage:sort(value(avg,descending)):limit(10)
| |
| +
| |
| builtin:host.cpu.idle:sort(value(avg,descending)):limit(10)</code>
| |
| Если у вас большая среда с сотнями хостов, маловероятно, что 10 хостов с максимальной загрузкой ЦП входят в число 10 хостов с наибольшим временем простоя ЦП. У операндов не будет совпадающих кортежей, поэтому результат выражения будет пустым. Решение состоит в том, чтобы вместо этого применить ограничение к результату выражения:
| |
| <code>(
| |
| builtin:host.cpu.usage
| |
| +
| |
| builtin:host.cpu.idle
| |
| )
| |
| :sort(value(auto,descending))
| |
| :limit(10)</code>
| |
| | |
| === Закройте пробелы в данных с помощью преобразования по умолчанию ===
| |
| Преобразование по умолчанию особенно ценно для метрических выражений . Хотя обычно преобразование не заполняет <code>null</code>точки данных, если метрика не имеет ни одной точки данных во временном интервале запроса, в контексте выражения метрики ее семантика немного отличается. Пока метрика с обеих сторон выражения имеет хотя бы одну точку данных, преобразование заполнит пробелы. Однако если во всех метриках в выражении отсутствуют данные, преобразование вернет пустые результаты.
| |
| | |
| Рассмотрим этот пример выражения соотношения, где мы вычисляем коэффициент ошибок для ключевых действий пользователя:
| |
| <code>builtin:apps.other.keyUserActions.reportedErrorCount.os
| |
| /
| |
| builtin:apps.other.keyUserActions.requestCount.os</code>
| |
| Если запросов много, но ни одной ошибки на вашем таймфрейме, результат будет пустым, хотя коэффициент ошибок <code>0</code>был бы более значимым. Вы можете добиться этого с помощью <code>default(0)</code>преобразования:
| |
| <code>builtin:apps.other.keyUserActions.reportedErrorCount.os:default(0)
| |
| /
| |
| builtin:apps.other.keyUserActions.requestCount.os</code>
| |
| | |
| == Примеры ==
| |
| Пример 1. Построение метрики соотношения
| |
| | |
| С помощью метрического выражения вы можете создавать свои собственные метрики соотношения. Предположим, мы начнем со следующих показателей:
| |
| | |
| * встроенный:service.errors.total.count показывает количество ошибок любого типа в службе
| |
| * встроенный:service.errors.server.successCount показывает количество вызовов без ошибок на стороне сервера
| |
| | |
| Из них мы можем построить метрику коэффициента ошибок:
| |
| <code>builtin:service.errors.total.count:value:default(0)
| |
| /
| |
| (
| |
| builtin:service.errors.total.successCount:value:default(0)
| |
| +
| |
| builtin:service.errors.total.count:value:default(0)
| |
| )</code> | |
| Преобразование по умолчанию используется для замены значений временных интервалов, имеющих значение <code>null</code>0.
| |
| <code>{
| |
| "totalCount": 3,
| |
| "nextPageKey": null,
| |
| "result": [
| |
| {
| |
| "metricId": "builtin:service.errors.total.count",
| |
| "data": [
| |
| {
| |
| "dimensions": ["SERVICE-B82BFBCB4E264A98"],
| |
| "dimensionMap": {
| |
| "dt.entity.service": "SERVICE-B82BFBCB4E264A98"
| |
| },
| |
| "timestamps": [1619913600000, 1620086400000, 1620259200000],
| |
| "values": [48763, 81283, 80798]
| |
| },
| |
| {
| |
| "dimensions": ["SERVICE-BE8B6928C46204B5"],
| |
| "dimensionMap": {
| |
| "dt.entity.service": "SERVICE-BE8B6928C46204B5"
| |
| },
| |
| "timestamps": [1619913600000, 1620086400000, 1620259200000],
| |
| "values": [1096, 1124, 1095]
| |
| }
| |
| ]
| |
| }
| |
| ]
| |
| }</code> | |
| Пример 2. Вклад одного сервиса в общее количество ошибок
| |
| | |
| Встроенная метрика :service.errors.total.count показывает количество ошибок в ваших службах. Список может быть длинным, и вас может заинтересовать вклад каждой службы в количество ошибок. Эту информацию может предоставить комбинация метрических преобразований и метрических выражений.
| |
| | |
| Вам нужны эти преобразования:
| |
| | |
| * преобразования фильтра , чтобы получить количество ошибок для проверяемой службы.
| |
| * разделить путем преобразования, чтобы объединить отдельные счетчики ошибок каждой службы в один.
| |
| | |
| Затем используйте это выражение:
| |
| <code>builtin:service.errors.total.count:filter(eq("dt.entity.service","SERVICE-B82BFBCB4E264A98")):value:default(0)
| |
| /
| |
| builtin:service.errors.total.count:splitBy():value:default(0) * 100</code> | |
| Преобразование по умолчанию используется для замены значений временных интервалов, имеющих значение <code>null</code>0.
| |
| <code>{
| |
| "totalCount": 1,
| |
| "nextPageKey": null,
| |
| "result": [
| |
| {
| |
| "metricId": "builtin:service.errors.total.count:filter(eq(\"dt.entity.service\",SERVICE-B82BFBCB4E264A98))",
| |
| "data": [
| |
| {
| |
| "dimensions": ["SERVICE-B82BFBCB4E264A98"],
| |
| "dimensionMap": {
| |
| "dt.entity.service": "SERVICE-B82BFBCB4E264A98"
| |
| },
| |
| "timestamps": [1619913600000, 1620086400000, 1620259200000],
| |
| "values": [48763, 81283, 80798]
| |
| }
| |
| ]
| |
| }
| |
| ]
| |
| }</code>
| |
| Пример 3. Средняя продолжительность GC
| |
| | |
| Встроенная метрика : tech.jvm.memory.gc.collectionTime показывает общую продолжительность всех сборок мусора во временном интервале. Информация об отдельных сборках мусора недоступна, но мы можем использовать встроенную метрику: tech.jvm.memory.pool.collectionCount , показывающую количество сборок мусора за раз, чтобы получить среднюю продолжительность сборки мусора.
| |
| | |
| Прежде чем мы начнем расчет, нам нужно выровнять измерения обеих метрик. Для этого нам нужно применить разделение по преобразованию с <code>dt.entity.process_group_instance</code>аргументом к встроенной метрике: tech.jvm.memory.pool.collectionCount .
| |
| | |
| Кроме того, мы можем отсортировать результат в порядке убывания, применив преобразование сортировки . Выражение выглядит так:
| |
| <code>(
| |
| builtin:tech.jvm.memory.gc.collectionTime
| |
| /
| |
| builtin:tech.jvm.memory.pool.collectionCount:splitBy("dt.entity.process_group_instance")
| |
| ):sort(value(max,descending))</code>
| |
| | |
| <code>{
| |
| "totalCount": 3,
| |
| "nextPageKey": null,
| |
| "result": [
| |
| {
| |
| "metricId": "builtin:tech.jvm.memory.gc.collectionTime",
| |
| "data": [
| |
| {
| |
| "dimensions": ["PROCESS_GROUP_INSTANCE-18A5241823ABC769"],
| |
| "dimensionMap": {
| |
| "dt.entity.process_group_instance": "PROCESS_GROUP_INSTANCE-18A5241823ABC769"
| |
| },
| |
| "timestamps": [1619913600000, 1620086400000, 1620259200000],
| |
| "values": [164670, 171630, 163044]
| |
| },
| |
| {
| |
| "dimensions": ["PROCESS_GROUP_INSTANCE-92605BB8AE962F1C"],
| |
| "dimensionMap": {
| |
| "dt.entity.process_group_instance": "PROCESS_GROUP_INSTANCE-92605BB8AE962F1C"
| |
| },
| |
| "timestamps": [1619913600000, 1620086400000, 1620259200000],
| |
| "values": [6883411, 5977311, 6356225]
| |
| },
| |
| {
| |
| "dimensions": ["PROCESS_GROUP_INSTANCE-4285F2EF6B79E8A9"],
| |
| "dimensionMap": {
| |
| "dt.entity.process_group_instance": "PROCESS_GROUP_INSTANCE-4285F2EF6B79E8A9"
| |
| },
| |
| "timestamps": [1619913600000, 1620086400000, 1620259200000],
| |
| "values": [163368, 162924, 170502]
| |
| }
| |
| ]
| |
| }
| |
| ]
| |
| }</code>
| |