| 
				   | 
				
| (не показаны 2 промежуточные версии этого же участника) | 
| Строка 1: | 
Строка 1: | 
 | Выражения метрик позволяют использовать простые арифметические операции прямо в селекторе метрик.
  |  | Отправляет пользовательские точки данных в Dynatrace.  | 
 | 
  |  | 
  | 
 | Например, это выражение вычисляет соотношение (в процентах) двух показателей:
  |  | Предоставленные точки данных должны соответствовать протоколу приема метрик. Вам не нужно сначала регистрировать метрику. После того, как Dynatrace приняла и обработала данные, вы можете использовать их так же, как и любые другие показатели в Dynatrace, например, в диаграммах или событиях показателей. Вы также можете предоставить метаданные для введенной метрики через API настроек.  | 
 |  <code>metric1 / metric2 * 100</code>
  |  | 
 | В качестве операндов выражения можно использовать метрики или числа.
  |  | 
 | 
  |  | 
  | 
 | * Вам нужно использовать скобки, чтобы обеспечить порядок операций.
  |  | Предпочитаете использовать метрики прямо на хосте?  | 
 | * Все метрики с более чем 1 точкой данных, участвующей в выражении метрики, должны иметь одинаковое разрешение.
  |  | 
 | * В качестве операнда можно использовать любую метрику, в том числе метрику, модифицированную любой цепочкой преобразования , и можно применять преобразования к результату выражения.
  |  | 
 | 
  |  | 
  | 
 | == Ограничения ==  |  | Вы также можете передавать точки данных напрямую с узла, контролируемого ЕдиногоАгента, в модуль ЕдиныйАгент Extensions Execution Controller (EEC) по защищенному каналу с использованием локальной <code><nowiki>http://localhost</nowiki>:<port>/metrics/ingest</code>конечной точки, которая не требует проверки подлинности токена. Порт по умолчанию <code>14499</code>. При использовании этого метода <code>dt.entity.host=<host-ID></code>к каждой метрике добавляется зарезервированное измерение Dynatrace. Дополнительные сведения см. в разделе API метрик ЕдиногоАгента .  | 
 | 
  |  | 
  | 
 | * Селектор должен содержать хотя бы один ключ метрики.
  |  | Для просмотра точек данных введенной метрики можно использовать:  | 
 | * Вы можете запрашивать точки данных до 10 метрик в одном запросе.
  |  | 
 | 
  |  | 
  | 
 | Для целей этого ограничения одно выражение (например, <code>metric2 + metric2</code>) считается одной метрикой.
  |  | * Обозреватель данных  | 
 |  | * GET запрос точек данных метрики из API Metric v2.  | 
 | 
  |  | 
  | 
 | == Приоритет ==  |  | Запрос использует в качестве полезной нагрузки формат text/plain. Полезная нагрузка ограничена <code>1,000</code>строками.  | 
 | Применяются стандартные правила математического приоритета:
  |  | {| class="wikitable"  | 
 |  | | rowspan="2" |POST  | 
 |  | |Managed  | 
 |  | |<code><nowiki>https://{your-domain}/e/{your-environment-id}/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)|Токены и аутентификация]].  | 
 | # Умножение, деление
  |  | 
 | # Сложение, вычитание
  |  | 
 | 
  |  | 
  | 
 | == Агрегация ==  |  | == Параметры ==  | 
 | Если агрегация была применена в цепочке преобразования, используется эта агрегация. Если преобразование не применялось, используется агрегация по умолчанию. Ваши метрические операнды могут быть разных агрегатов. Например, <code>metric:max - metric:min</code>.
  |  | {| class="wikitable"  | 
 |  | !Параметр  | 
 |  | !Тип  | 
 |  | !Описание  | 
 |  | !In  | 
 |  | !Необходимость  | 
 |  | |-  | 
 |  | |body  | 
 |  | |string  | 
 |  | |Точки данных, указанные в линейном протоколе. Каждая строка представляет одну точку данных.  | 
 |  | |body  | 
 |  | |требуется  | 
 |  | |}  | 
 | 
  |  | 
  | 
 | == Разрешение выражений ==  |  | === Запрос объектов тела ===  | 
 | Метрические выражения разрешаются следующим образом:
  |  | 
 | 
  |  | 
  | 
 | # Сформируйте пары кортежей для каждой пары метрик.
  |  | ==== Объект <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/api/v2/metrics/ingest'</nowiki> \  | 
 | После формирования пар кортежей точки данных выравниваются, а затем к выровненным точкам данных применяется желаемая арифметическая операция.
  |  |   -H 'Authorization: Api-Token dt0c01.abc123.abcdefjhij1234567890' \  | 
 |    |  |   -H 'Content-Type: text/plain' \  | 
 | * Если какая-либо из выровненных точек данных равна <code>null</code>, выражение преобразуется в <code>null</code>.
  |  |   --data-raw 'cpu.temperature,dt.entity.host=HOST-06F288EE2A930951,cpu=1 55'</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>
  |  |