Подключение трейсинга Nginx в Proto Observability Platform
На этой странице:
- Ingress NGINX Controller
- Введение
- Установка модуля трейсинга для Nginx версии >= 1.22.0
- Работа модуля трейсинга с настройками по умолчанию
- Настройка с помощью директив конфигурации
- Настройка с помощью переменных окружения
- Если Nginx работает в Kubernetes
- Поддерживаемые версии Nginx
- Установка и настройка для версий Nginx < 1.22
Ingress NGINX Controller
Для трейсинга Ingress NGINX Controller используйте OpenTelemetry.
Введение
Общий процесс подключения 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% трейсов.
POBP_TRACE_ENABLED
Вы можете отключить отсылку трейсов в Агента с помощью этой переменной окружения, установив значение false.
При этом трейсер все равно в лог выведет свой конфиг, но трейсы отсылать агенту не будет. Также трейсер будет продолжать опрашивать агента, что в случае недоступности или отсутствия агента будет приводить к ошибкам в логе.
POBP_REMOTE_CONFIGURATION_ENABLED
Значение false отключает опрос агента, таким образом можно избавиться от записи ошибки подключения к Агенту в логе при недоступности агента.
Если 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 # порт по умолчанию
      }
      ...
  }