Расширенная конфигурация
На этой странице:
- Настройка именования сервисов и дополнительных тегов
- Алгоритм группировки эндпоинтов
- Объединение быстрых SQL запросов в трейсах
Настройка именования сервисов и дополнительных тегов
Для добавления дополнительной мета-информации к трейсам и метрикам используются теги (лейблы). Теги делятся на произвольные и зарезервированные.
Формат тегов
Теги должны начинаться с буквы и после нее могут содержать символы, перечисленные ниже:
- буквенно-цифровые символы
- подчеркивания
- минусы
- двоеточия
- точки
- слэши
Другие специальные символы преобразуются в символы подчеркивания.
Теги могут содержать до 200 символов и поддерживают буквы Unicode.
Теги для метрик преобразуются в нижний регистр, для тегов спанов регистр не меняется. Поэтому не рекомендуется использовать теги CamelCase.
Тег может быть в формате value или <KEY>:<VALUE>. Ключ всегда предшествует первому двоеточию в глобальном определении тега, например:
| TAG | KEY | VALUE | 
|---|---|---|
| env:staging:east | env | staging:east | 
| env_staging:east | env_staging | east | 
Теги не должны происходить из неограниченных источников, таких как временные метки, идентификаторы пользователей или идентификаторы запросов. Это может привести к бесконечному увеличению числа метрик.
Зарезервированные теги
service – имя сервиса
Каждому сервису в интерфейсе Proto OBP присваивается определенное имя сервиса. Имя сервиса может определяться автоматически, правила и возможности автоматического определения зависят от среды исполнения сервиса, языка разработки, параметров окружения и тд.
В случае, если имя сервиса, присваиваемое по умолчанию, не является достаточно информативным или уникальным, есть возможность переопределить имя сервиса.
Для задания имени сервиса используется переменнная окружения POBP_SERVICE.
env – название окружения
Для указания в каком окружении запущен сервис, например, DEV, STAGE, PRODUCTION и т.д. добавьте переменную окружения POBP_ENV.
Значением переменной могут быть любые символы.
После указания пременной окружения к трейсам будет добавлен тег со значением переменной POBP_ENV.
Также будет изменено название сервиса. Например, при значении перевенных POBP_SERVICE=my-app и POBP_ENV=dev, итоговое имя сервиса будет отображаться как my-app-dev. Данное поведение может быть изменено в будущих версиях.
version – версия приложения
Для указания версии сервиса может использоваться переменная окружения POBP_VERSION.
Значением переменной могут быть любые символы.
После указания пременной окружения к трейсам будет добавлен тег со значением переменной POBP_VERSION.
service_group – группа, к которой относится сервис
Для указания к какому бизнес-приложению или системе относится сервис, например, Ddbo_Fiz, Online_banking и т.д. добавьте тег с ключом service_group.
Пример:
POBP_TAGS="team:frontend-ecomm, service_group:ecommerce_app"
POBP_ENV="production"
team – команда, к которой относится сервис
Для указания к какой команде или подразделению относится сервис, например, frontent_devs, faktoring, external_dbo и т.д. добавьте тег с ключом team.
Пример:
POBP_TAGS="team:frontend-ecomm, service_group:ecommerce_app"
POBP_ENV="production"
Произвольные теги
Для использования произвольных тегов добавьте их к значению переменной окружения POBP_TAGS, например:
ENV POBP_TAGS=custom_tag:value,another_tag:somevalue

Добавление тегов
apiVersion: apps/v1
kind: Deployment
...
template:
  containers:
  -  ...
    env:
      - name: POBP_ENV
        value: "<ENV>"
      - name: POBP_SERVICE
        value: "<SERVICE>"
      - name: POBP_VERSION
        value: "<VERSION>"
Теги можно задать в Dockerfile:
ENV POBP_SERVICE=<SERVICE>
ENV POBP_VERSION=<VERSION>
ENV POBP_ENV=<ENV>
ENV POBP_TAGS=<TAGS>
Или в момент запуска приложения:
docker run -e POBP_ENV="<ENV>" \
           -e POBP_SERVICE="<SERVICE>" \
           -e POBP_VERSION="<VERSION>" \
           ...
Примеры использования тегов
Добавление связи сервиса с инфраструктурой Kubernetes
Для этого в спецификации пода с приложением добавьте следующие пермененные окружения:
  - name: NODE_NAME
    valueFrom:
        fieldRef:
            fieldPath: spec.nodeName
  - name: POD_NAMESPACE
    valueFrom:
        fieldRef:
            fieldPath: metadata.namespace
  - name: POD_NAME
    valueFrom:
        fieldRef:
            fieldPath: metadata.name
  - name: POBP_TAGS
    value: "pod_name:$(POD_NAME),node:$(NODE_NAME),kube_namespace:$(POD_NAMESPACE),kube_cluster_name:<my_cluster_name>"
Переменная окруженияPOBP_TAGS добавляет тэги в формате key:value,key1:value1 к каждому вызову инструментированного приложения.
После этого соответствующие теги появятся в деталях вызовов и будут доступны при фильтрации трейсов по тегам:

Сбор кастомных HTTP заголовков
Добавьте переменную окружения к приложению:
POBP_TRACE_HEADER_TAGS="<ИМЯ_HTTP_ЗАГОЛОВКА>,<ИМЯ_HTTP_ЗАГОЛОВКА>"
В значение переменной, через зяпятую, укажите список HTTP заголовков которые необходимо собирать. Заголовки будут доступны в деталях вызова в виде тэга http.request.headers.<ИМЯ_HTTP_ЗАГОЛОВКА>:<ЗНАЧЕНИЕ>
Использование имени хоста, как Service Instance для приложений
Для этого добавьте переменную окружения на хост или в Docker контейнер:
POBP_TAGS="host.name:<my_host_name>"
Алгоритм группировки эндпоинтов
Если в названии эндпоинта используется HTTP URL, то строка вида GET /some/path/any-page.html нормализуется к виду GET /*. Добавлен список часто встречающихся сегментов для сохранения в имени эндпоинтов. Например, строка вида GET /api/v1/web/getUser/123456789 будет нормализована к виду GET /api/v1/web/getUser/*, так как сегменты api, v1, web и get добавлены в список исключений для нормализации.
Полный список сегментов, которые не будут нормализованы:
"_health",
"about", "account", "activ", "add", "admin", "advance", "agree", "ajax", "anal", "all", "android", "animate", "api", "app", "attach", "audit", "auth", "auto", "availab", "average",
"balance", "bank", "banner", "base", "basket", "batch", "bill", "bind", "bitrix", "black", "block", "borrow", "bonus", "box", "branch", "build", "buy", "broker",
"cache", "call", "calc", "cancel", "card", "cart", "cash", "catalog", "categor", "change", "check", "cheque", "choose", "cities", "city", "clean", "clear", "client", "close", "code", "complet", "compan", "component", "config", "confirm", "contact", "content", "context", "conver", "count", "collect", "create", "credit", "cross", "curren", "custom", "cvv",
"dash", "data", "decline", "default", "delete", "deliver", "deposit", "device", "discard", "discount", "dist", "doc", "down", "draft", "drop",
"edit", "email", "en", "event", "exchange", "experiment", "export", "express",
"favorite", "feature", "fee", "fetch", "find", "file", "filter", "finance", "finish", "fiscal", "foot", "fraud", "free", "frontend", "fund",
"gateway", "get", "grade", "graphql", "group",
"head", "health", "healz", "heart", "help", "history", "home", "http",
"id", "image", "include", "index", "info", "init", "insur", "int", "item", "invoice",
"js",
"last", "left", "level", "lib", "link", "lim", "list", "load", "loan", "local", "locat", "log", "loy",
"mail", "main", "map", "master", "match", "media", "menu", "message", "method", "metric", "mobile", "model", "modify", "mono", "mortgage", "move", "multi",
"new", "next", "nfc", "nginx", "notif",
"oauth", "off", "onboard", "open", "opt", "order", "other", "otp", "owox", "organ",
"p2p", "pack", "page", "partner", "parameter", "pass", "pay", "perf", "person", "phone", "pick", "pictur", "pin", "place", "pobp", "polic", "position", "post", "pre", "print", "priv", "process", "product", "profile", "project", "promo", "prompt", "proto", "purchase", "push", "put",
"quote",
"rate", "rating", "read", "realm", "receive", "recipe", "recur", "replace", "require", "recom", "refresh", "refund", "region", "registr", "remote", "remove", "render", "report", "request", "resend", "reset", "resolve", "resource", "resp", "rest", "review", "right", "ru", "sale", "save",
"sample", "send", "sber", "shelf", "short", "scan", "screen", "script", "search", "secur", "segment", "select", "sell", "seo", "service", "session", "set", "shift", "ship", "soap", "shop", "show", "sign", "skip", "social", "sponsor", "ssapi", "start", "stat", "stop", "subscr", "suggest", "sum", "super", "sync",
"tag", "task", "template", "terminate", "terms", "tinkof", "token", "tool", "top", "transf", "transp",
"unbind", "unblock", "union", "unique", "unpaid", "update", "upload", "use", "utility",
"v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "video", "view", "visa", "vote", "voting", "vtb",
"wallet", "web", "widget",
"xo-stats",
"yandex"
Логика работы - сегменты из списка выше, а также все следующие за ними буквенные символы не будут заменены на *. Например, в списке есть сегмент view, тогда имя эндпоинта (Url) вида GET /viewSomething/123 будет заменено на GET /viewSomething/* (так как после view идут только буквенным символы в сегменте). При этом следующие строки размаскированы не будут:
- GET /view-Something/123->- GET /*(так как присутствует символ- -)
- GET /view_Something/123->- GET /*(так как присутствует символ- _)
- GET /view.Something/123->- GET /*(так как присутствует символ- .)
- GET /viewSomething-1/123->- GET /*(так как присутствует цифра)
Для добавления собственных сегментов используется переменная в файле <installation dir>/debug/config.yaml, пример:
POBP_COLLECTOR_CUSTOM_ALLOWED_SEGMENTS:
  - portfolio
После добавления этой переменной строка вида GET /api/v1/web/portfolio/123456789 будет нормализована к виду GET /api/v1/web/portfolio/*.
Объединение быстрых SQL запросов в трейсах
Для упрощения анализа трейсов, содержащих большое количество спанов с SQL запросами, реализован механизм объединения спанов с SQL запросами, если длительность их выполнения меньше определенной величины. Это позволяет не обращать внимание на десятки или сотни спанов с SQL вызовами, которые не влияют на общую производительность транзакции.
Пример трейса без объединения быстрых SQL запросов - видно множество спанов, в которых производились вызовы SQL длительностью 0 мс, 1 мс и тд:

Пример трейса этой же транзакции, но с включенным объединением быстрых SQL запросов - все спаны с вызовами SQL, длительность менее 5 мс объединены в один спан с общей длительностью, равно общей длительности всех объединенных спанов:

Если после нескольких объединенных быстрых SQL запросов будет встречаться SQL запрос с длительностью, превышающей пороговую, или спан с ошибкой, то этот спан с SQL запросом не будет объединен и будет всегда показан отдельно. Объединению подлежат только спаны с SQL вызовами, идущими к одной и той же базе данных подряд.
В деталях объединенного спана будут указаны общие теги для всех вызовов. В теге db.statement будет указано общее количество объединенных спанов и примененное пороговое значение в мс, пример:
Fast SQL: 5 spans faster than 5 ms combined
Управлять этой опцией можно через два конфигурационных параметра в файле config.yaml:
# включает или выключает объединение быстрых SQL запросов, по умолчанию включено (true)
POBP_TRACE_PROCESSOR_CONFIG_FAST_SQL_SPANS_MERGE: true
# пороговое время длительности исполнения SQL запросов, которые считаются быстрыми - в мс, по умолчанию 5 мс
POBP_TRACE_PROCESSOR_CONFIG_FAST_SQL_SPANS_TIME: 5