Подключение трейсинга Nginx в Proto Observability Platform
На этой странице:
- Введение
- Установка модуля трейсинга для Nginx версии >= 1.22.0
- Работа модуля трейсинга с настройками по умолчанию
- Настройка с помощью директив конфигурации
- Настройка с помощью переменных окружения
- Если Nginx работает в Kubernetes
- Поддерживаемые версии Nginx
- Установка и настройка для версий Nginx < 1.22
Введение
Общий процесс подключения Nginx:
- Установка ProtoOBP Агента
- Установка модуля трейсинга
- Конфигурация трейсера
- Настройка Агента для сбора метрик Nginx (не зависит от модуля трейсинга)
Установка модуля трейсинга для Nginx версии >= 1.22.0
-
Скачайте архив текущей версии трейсера с модулями для всех версий Nginx:
curl --header "PRIVATE-TOKEN:<your_token>" "https://git.proto.group/api/v4/projects/125/packages/generic/protoobp-nginx/1.2.1/ngx_http_protoobp_module-1.2.1.tar.gz" --output ngx_http_protoobp_module-1.2.1.tar.gz tar -xzvf ngx_http_protoobp_module-1.2.1.tar.gz
Структура содержимого архива:
<номер версии трейсера>/<номер версии Nginx>/ngx_http_protoobp_module.so
-
Скопируйте модуль, соответствующий вашей версии Nginx из каталога с номером версии трейсера (например,
1.2.1
) в каталог с модулями nginx:cp 1.2.1/1.22.0/ngx_http_protoobp_module.so /usr/lib/nginx/modules/
-
Инициализируйте модуль в самой верхней части основного конфигурационного файла Nginx (например
/etc/nginx/nginx.conf
):load_module modules/ngx_http_protoobp_module.so;
Работа модуля трейсинга с настройками по умолчанию
По умолчанию, без какой-либо настройки, у трейсера для Nginx будет следующее поведение:
- отправка трейсов агенту по адресу
http://localhost:8126
- создание одного спана на каждый запрос
- имя сервиса:
nginx
Для большинства сценариев потребуется настройка модуля, например, указание адреса агента и имени сервиса.
Настройка с помощью директив конфигурации
Поведение модуля Nginx Protoobp может быть настроено с помощью специальных директив в файле конфигурации nginx.
Конфигурационные файлы Nginx имеют иерархическую структуру:
# "main" context
events {
# ...
}
http {
# "http" context
server {
# "server" context
listen 80;
location /ping {
# "location" context
# ...
}
location /auth {
if ($request_method = POST) {
# "if" context
# ...
}
# ...
}
}
}
Каждый контекст наследует свою конфигурацию от окружающего контекста. Контексты расположенные ближе к “главному” контексту, находятся на “более высоком уровне”, а контексты, более глубоко вложенные контексты находятся на “более низком уровне”.
Например, в конфигурации выше, location /ping
наследует всю свою
конфигурацию от окружающего server
, который, в свою очередь, наследует свою
конфигурацию от окружающего контекста “main”.
Директивы конфигурации в данном контексте переопределяют часть конфигурации унаследованную от более высоких уровней.
Модуль трассировки Protoobp определяет следующие директивы конфигурации.
protoobp_service_name
- синтаксис
protoobp_service_name <name>
- по умолчанию:
nginx
- контекст:
http
Устанавливает имя службы, которое будет ассоциироваться с каждым спаном, созданным этим модулем.
protoobp_environment
- синтаксис
protoobp_environment <environment>
- по умолчанию: (no value)
- контекст:
http
Устанавливает имя окружения, в котором работает nginx. Общие значения
включают prod
, dev
и staging
.
protoobp_sample_rate
- синтаксис
protoobp_sample_rate <rate> [on|off]
- по умолчанию: N/A
- контекст:
http
,server
,location
Устанавливает вероятность того, что трейсы, начинающиеся с запросов в данном контексте конфигурации, будут сохранены (отправлены в Protoobp), а не отброшены.
<rate>
– это число от 0.0 до 1.0, включительно. Ноль означает «никогда», а единица – «всегда», 0,5
означает «половину времени», т.е. 50%.
Опционально укажите третий аргумент, представляющий собой переменное выражение, которое должно оцениваться как on
или off
. Если оно принимает значение on
, выбирается соответствующая частота сэмплирования. Если оно имеет значение off
, то связанная частота семплирования игнорируется. Любое другое значение ведет себя как off
и регистрирует ошибку. Если третий аргумент опущен, то по умолчанию принимается значение on
.
Директивы protoobp_sample_rate
в контекстах конфигурации нижнего уровня имеют приоритет над директивами в контекстах конфигурации более высокого уровня.
Если несколько директив на одном уровне конфигурации, то их выражения on
/off
проверяются по порядку. Первая директива, выражение которой оценивается
в on
, будет применяться на этом уровне конфигурации.
Например, рассмотрим следующую выдержку из файла конфигурации nginx:
1 http {
2 map $http_x_request_category $healthcheck_toggle {
3 healthcheck on;
4 default off;
5 }
6
7 protoobp_sample_rate 0 $healthcheck_toggle;
8 protoobp_sample_rate 0.1;
9
10 server {
11 listen 80;
12
13 location / {
14 proxy_pass http://upstream;
15 }
16
17 location /admin {
18 protoobp_sample_rate 1.0;
19 proxy_pass http://admin-portal;
20 }
21 }
22 }
У location /
в строке 13 нет собственного protoobp_sample_rate
, поэтому он наследует его от окружающих контекстов конфигурации. Не существует
директивы protoobp_sample_rate
непосредственно в блоке server
, но но она есть в блоке http
. Первая находится в строке 7 и является
условной, основанной на значении переменной $healthcheck_toggle
, которая определена в map
в строке 2.
Запрос, направляющийся к location /
, будет сэмплирован на 0% (то есть данные ), если заголовок X-Request-Category
имеет значение healthcheck
, согласно параметру
protoobp_sample_rate
в строке 7. Если заголовок X-Request-Category
отсутствует или имеет значение, отличное от healthcheck
, то запрос будет сэмплироваться с частотой 10%, согласно protoobp_sample_rate
в строке 8.
Запрос, который направляется к location /admin
, будет сэмплирован на 100%, согласно параметру protoobp_sample_rate
в строке 18.
Применяемая директива protoobp_sample_rate
, если таковая имеется, аннотируется в span запроса в виде тега nginx.sample_rate_source
. Этот тег имеет следующий
формат:
<nginx file path>:<line>#<dupe>
Например,
/etc/nginx/nginx.conf:23#1
<nginx file path>
– это путь к файлу конфигурации nginx, который содержит директивуprotoobp_sample_rate
.<line>
– это номер строки, где находится директива.<dupe>
– это индекс директивы среди всех директивprotoobp_sample_rate
, которые появляются в той же строке. Как правило, каждая директива находится в отдельной строке, поэтому<dupe>
, скорее всего, всегда1
.
protoobp_agent_url
- синтаксис
protoobp_agent_url <url>
- по умолчанию:
http://localhost:8126
- контекст:
http
Укажите URL-адрес, по которому можно связаться с агентом Protoobp. Поддерживаются следующие форматы:
http://<domain or IP>:<port>
http://<domain or IP>
http+unix://<path to socket>
unix://<path to socket>
Если порт не указан, по умолчанию используется значение 8126.
protoobp_tag
- синтаксис
protoobp_tag <key> <value>
- контекст:
http
,server
,location
Установить на активном в данный момент span тег, имя которого – указанный <key>
и значение которого является результатом оценки указанного <значения>
в контексте
текущего запроса. <значение>
– это строка, которая может содержать $
-переменные (включая те, которые предоставляются этим модулем).
protoobp_delegate_sampling
- синтаксис
protoobp_delegate_sampling [on|off]
- по умолчанию
off
- контекст
http
,server
,location
Если on
, и если nginx принимает решение о семплировании трейса (т.е. если nginx является
первым сервисом в трейсе), то делегировать решение о сэмплировании upstream сервису.
Делегирование семплирования существует для того, чтобы nginx мог выступать в качестве обратного прокси для нескольких различных сервисов, где решение о семплировании трейсов может быть лучше принято внутри этих сервисов, чем в nginx.
По умолчанию делегирование сэмплирования отключено. Аргументом директивы может быть
выражение переменной, которое оценивается как on
или off
. Если
аргумент директивы опущен, то действует так, как если бы это было on
.
protoobp_enable
- синтаксис
protoobp_enable
- контекст
http
,server
,location
Включает трассировку Protoobp в текущем контексте конфигурации. Это отменяет любые директивы protoobp_disable
на более высоких уровнях, и может быть отменено директивами protoobp_disable
на более низких уровнях.
Когда трассировка включена, для каждого запроса создается span, а контекст трейса передается проксируемому сервису.
Трейсинг включен по умолчанию.
protoobp_disable
- синтаксис
protoobp_disable
- контекст
http
,server
,location
Отключение трассировки Protoobp в текущем контексте конфигурации. Это отменяет любые директивы protoobp_enable
на более высоких уровнях и может быть переопределено
директивой protoobp_enable
на более низких уровнях.
Когда трассировка отключена, при обработке запроса не создается span, и никакой контекст трейса не передается проксируемым сервисам.
По умолчанию трассировка Protoobp включена. Эта директива позволяет отключить ее.
protoobp_trace_locations
- синтаксис
protoobp_trace_locations on|off
- по умолчанию:
off
- контекст:
http
,server
,location
Если on
, то в дополнение к созданию одного span для каждого обработанного запроса, создается
дополнительный span, представляющий блок location
, выбранный при обработке запроса.
По умолчанию эта опция off
, так что для каждого запроса создается только один span.
Обратите внимание
Рекомендуемое значение:on
.
Настройка с помощью переменных окружения
Трейсер поддерживает следующие переменные окружения для конфигурирования:
POBP_AGENT_HOST
Устанавливает имя хоста агента ProtoOBP. Если значение не задано, то по умолчанию используется localhost
.
В случае использования агента, запущенного в Docker или docker compose – укажите имя контейнера.
POBP_ENV
Устанавливает имя окружения, в котором работает nginx. Общие значения
включают prod
, dev
и staging
.
POBP_INSTRUMENTATION_TELEMETRY_ENABLED
Рекомендуемое значение: false
.
POBP_SERVICE
Имя сервиса для отображения в интерфейсе. Если не указано – значение будет равно nginx
POBP_VERSION
Версия сервиса, передается в теге version
.
POBP_TRACE_128_BIT_TRACEID_GENERATION_ENABLED
Рекомендуемое значение false
, так как не все остальные трейсеры еще поддерживают 128 битный формат trace_id.
POBP_TRACE_SAMPLE_RATE
Процент сэмплирования трейсов. Число от 0.0 до 1.0 включительно. Ноль означает «никакие трейсы не собираются», а единица – «все трейсы собираются».
0,6
означает, что будет собрано 60% трейсов.
Если Nginx работает в Kubernetes
Убедитесь, что у вас успешно установлен и настроен ProtoOBP Агент для Kubernetes.
Дополнительно необходимо передать поду переменную окружения POBP_AGENT_HOST
со значением IP адреса воркер-ноды, а также переменные окружения для связи трейсов с инфраструктурой (имя k8s кластера нужно задать вручную).
apiVersion: apps/v1
kind: Deployment
#(...)
spec:
containers:
- name: "<CONTAINER_NAME>"
image: "<CONTAINER_IMAGE>/<TAG>"
env:
- name: POBP_SERVICE
value: api-gateway
- name: POBP_AGENT_HOST
valueFrom:
fieldRef:
fieldPath: status.hostIP
- 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>"
Поддерживаемые версии Nginx
Поддерживаются все версии базовых Docker образов Nginx от 1.16.0 до 1.27.4.
- Если у вас Nginx версии
>=
1.22
, используйте версию трейсера1.2.1
. - Если у вас Nginx версии
<
1.22
, используйте версию трейсера2.3.0
.
Обратите внимание, что версия трейсера 2.3.0
является архивной, а 1.2.1
– текущей и активной (контринтуитивная особенность версионирования).
Версия | Поддерживается | Версия трейсера |
---|---|---|
1.27.4 | ✅ | 1.2.1 |
1.27.3 | ✅ | 1.2.1 |
1.27.2 | ✅ | 1.2.1 |
1.27.1 | ✅ | 1.2.1 |
1.27.0 | ✅ | 1.2.1 |
1.26.3 | ✅ | 1.2.1 |
1.26.2 | ✅ | 1.2.1 |
1.26.1 | ✅ | 1.2.1 |
1.26.0 | ✅ | 1.2.1 |
1.25.5 | ✅ | 1.2.1 |
1.25.4 | ✅ | 1.2.1 |
1.25.3 | ✅ | 1.2.1 |
1.25.2 | ✅ | 1.2.1 |
1.25.1 | ✅ | 1.2.1 |
1.25.0 | ✅ | 1.2.1 |
1.24.0 | ✅ | 1.2.1 |
1.23.4 | ✅ | 1.2.1 |
1.23.3 | ✅ | 1.2.1 |
1.23.2 | ✅ | 1.2.1 |
1.23.1 | ✅ | 1.2.1 |
1.23.0 | ✅ | 1.2.1 |
1.22.1 | ✅ | 1.2.1 |
1.22.0 | ✅ | 1.2.1 |
1.21.6-alpine | ✅ | 2.3.0 |
1.21.6 | ✅ | 2.3.0 |
1.21.5-alpine | ✅ | 2.3.0 |
1.21.5 | ✅ | 2.3.0 |
1.21.4-alpine | ✅ | 2.3.0 |
1.21.4 | ✅ | 2.3.0 |
1.21.3-alpine | ✅ | 2.3.0 |
1.21.3 | ✅ | 2.3.0 |
1.21.1-alpine | ✅ | 2.3.0 |
1.21.1 | ✅ | 2.3.0 |
1.21.0-alpine | ✅ | 2.3.0 |
1.21.0 | ✅ | 2.3.0 |
1.20.2-alpine | ✅ | 2.3.0 |
1.20.2 | ✅ | 2.3.0 |
1.20.1-alpine | ✅ | 2.3.0 |
1.20.1 | ✅ | 2.3.0 |
1.20.0-alpine | ✅ | 2.3.0 |
1.20.0 | ✅ | 2.3.0 |
1.19.10-alpine | ✅ | 2.3.0 |
1.19.10 | ✅ | 2.3.0 |
1.19.9-alpine | ✅ | 2.3.0 |
1.19.9 | ✅ | 2.3.0 |
1.19.8-alpine | ✅ | 2.3.0 |
1.19.8 | ✅ | 2.3.0 |
1.19.7-alpine | ✅ | 2.3.0 |
1.19.7 | ✅ | 2.3.0 |
1.19.6-alpine | ✅ | 2.3.0 |
1.19.6 | ✅ | 2.3.0 |
1.19.5-alpine | ✅ | 2.3.0 |
1.19.5 | ✅ | 2.3.0 |
1.19.4-alpine | ✅ | 2.3.0 |
1.19.4 | ✅ | 2.3.0 |
1.19.3-alpine | ✅ | 2.3.0 |
1.19.3 | ✅ | 2.3.0 |
1.19.2-alpine | ✅ | 2.3.0 |
1.19.2 | ✅ | 2.3.0 |
1.19.1-alpine | ✅ | 2.3.0 |
1.19.1 | ✅ | 2.3.0 |
1.19.0-alpine | ✅ | 2.3.0 |
1.19.0 | ✅ | 2.3.0 |
1.18.0-alpine | ✅ | 2.3.0 |
1.18.0 | ✅ | 2.3.0 |
1.17.10-alpine | ✅ | 2.3.0 |
1.17.10 | ✅ | 2.3.0 |
1.17.9-alpine | ✅ | 2.3.0 |
1.17.9 | ✅ | 2.3.0 |
1.17.8-alpine | ✅ | 2.3.0 |
1.17.8 | ✅ | 2.3.0 |
1.17.7-alpine | ✅ | 2.3.0 |
1.17.7 | ✅ | 2.3.0 |
1.17.6-alpine | ✅ | 2.3.0 |
1.17.6 | ✅ | 2.3.0 |
1.17.5-alpine | ✅ | 2.3.0 |
1.17.5 | ✅ | 2.3.0 |
1.17.4-alpine | ✅ | 2.3.0 |
1.17.4 | ✅ | 2.3.0 |
1.17.3-alpine | ✅ | 2.3.0 |
1.17.3 | ✅ | 2.3.0 |
1.17.2-alpine | ✅ | 2.3.0 |
1.17.2 | ✅ | 2.3.0 |
1.17.1-alpine | ✅ | 2.3.0 |
1.17.1 | ✅ | 2.3.0 |
1.17.0-alpine | ✅ | 2.3.0 |
1.17.0 | ✅ | 2.3.0 |
1.16.1-alpine | ✅ | 2.3.0 |
1.16.1 | ✅ | 2.3.0 |
1.16.0-alpine | ✅ | 2.3.0 |
1.16.0 | ✅ | 2.3.0 |
Установка и настройка для версий Nginx < 1.22
-
Скачайте модуль для вашей версии Nginx (cписок поддерживаемых версий):
curl --header "PRIVATE-TOKEN:<your_token>" "https://git.proto.group/api/v4/projects/125/packages/generic/protoobp-nginx/2.3.0/<nginx-version>-nginx-module.tar.gz" --output <nginx-version>-nginx-module.tar.gz tar -xzvf <nginx-version>-nginx-module.tar.gz
-
Скопируйте полученый файл из папки
protoobp
в каталог с модулями nginx:cp protoobp/libngx_http_protoobp_module.so /usr/lib/nginx/modules/
-
Инициализируйте модуль в самой верхней части основного конфигурационного файла Nginx (например
/etc/nginx/nginx.conf
):load_module modules/libngx_http_protoobp_module.so;
-
Добавьте в секцию
http
конфигурации NGINX параметры ProtoOBP модуля:http { protoobp { "service": "<my_nginx_name>", # Имя сервиса "sample_rate": 1, #процент сэмплирования, 100 – все вызовы, 10 – данные будут собираться только с 10% вызовов } ... }
Если NGINX запускается в контейнере, то в конфигурации необходимо указать адрес ProtoOBP агента:
http {
protoobp {
"service": "<my_nginx_name>", # Имя сервиса
"sample_rate": 1, #процент сэмплирования, 100 – все вызовы, 10 – данные будут собираться только с 10% вызовов
"agent_host": "<protoobp-agent>", # Укажите IP адрес хоста, где запущен ProtoOBP агент, доступные из сети Docker контейнера. В случае если агент запускается в виде Docker контейнера, то достаточно указать имя контейнера
"agent_port": 8126 # порт по умолчанию
}
...
}