動態

詳情 返回 返回

Nginx Tracing 最佳實踐 - 動態 詳情

簡介

Nginx 是一款流行的高性能 HTTP 和反向代理服務器,以輕量、穩定、併發處理能力強著稱。對 Nginx 進行鏈路追蹤,能在分佈式系統中清晰呈現請求經 Nginx 轉發後的完整路徑,這不僅讓問題定位更高效,可快速鎖定延遲、錯誤等問題發生的具體環節,還能通過追蹤其處理請求的耗時、轉發延遲等數據,精準識別系統性能瓶頸,為優化資源分配和架構設計提供依據。

觀測雲

觀測雲採集器 DataKit 支持 ddtrace 採集插件,能夠接收 nginx-datadog 模塊的鏈路數據並在平台統一分析。

部署 DataKit

登錄觀測雲控制枱,點擊「集成」-「DataKit」-「Linux」,複製安裝命令在服務器執行即可。

圖片

開啓 ddtrace 插件

按照以下步驟操作:

# 進入 ddtrace 採集器配置文件目錄
cd /usr/local/datakit/conf.d/ddtrace
# 開啓配置文件
cp ddtrace.conf.sample ddtrace.conf
# 重啓 Datakit
datakit service -R

配置 Nginx

按照以下步驟操作:

1、訪問 https://github.com/DataDog/nginx-datadog/releases ,在 Assets 中尋找並下載與當前處理器架構和版本匹配的模塊 ngx_http_datadog_module-<處理器架構>-<版本>.so.tgz

2、執行以下操作創建模塊路徑,假設 Nginx 安裝在默認路徑,配置 Nginx:

# 配置 Nginx
cd /usr/local/nginx
mkdir modules && cd $_

3、上傳第一步中下載的模塊至 modules 目錄,執行以下命令解壓,解壓後將獲得 ngx_http_datadog_module.so 文件:

tar xzvf ngx_http_datadog_module-<處理器架構>-<版本>.so.tgz

4、在配置文件 /usr/local/nginx/conf/nginx.conf 的最頂部加載模塊,以在 HTTP 上下文(上下文概念請參考“配置上下文和配置項” 章節)中進行配置為例,註釋中包含詳細説明:

# 加載模塊
load_module modules/ngx_http_datadog_module.so;

worker_processes  1;

events {
    worker_connections  1024;
}

http {
    # 配置 Datakit URL
    datadog_agent_url http://localhost:9529;
    # 配置服務名稱
    datadog_service_name nginx-demo;
    # 配置環境名稱
    datadog_environment test;
    # 配置版本名稱
    datadog_version 1.0.0;
    # 配置採樣率 0-1.0
    datadog_sample_rate 1.0;
    # 配置標籤
    datadog_tag foo bar;

    include       mime.types;
    default_type  application/octet-stream;

    # 通過 $datadog_trace_id 和 $datadog_span_id 為日誌加入 trace_id 和 span_id,均為 16 進制
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"'
                      '"$datadog_trace_id" "$datadog_span_id"';

    access_log  logs/access.log  main;

    sendfile        on;
    keepalive_timeout  65;

    server {
        listen       80;
        server_name  localhost;

        location / {
            root   html;
            index  index.html index.htm;
        }
        
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

該模塊默認開啓從請求中提取追蹤上下文,默認支持 tracecontext 和 datadog 兩種協議,可通過如下配置增加對 b3 協議的支持:

datadog_propagation_styles=tracecontext datadog b3

效果展示

圖片

配置上下文和配置項

nginx-datadog 模塊將 Nginx 的配置文件劃分為如下上下文區域:

# "main" context
# ...
events {
    # ...
}
http {
    # "http" context
    # ...
    server {
        # "server" context
        # ...
        listen 80;
        location /ping {
            # "location" context
            # ...
        }

        location /auth {
            if ($request_method = POST) {
                # "if" context
                # ...
            }
            # ...
        }
    }
}

相同配置項可在不同的上下文區域中配置,例如 datadog_service_name 配置支持 http、server、location 三個不同的上下文區域,如果需要為不同的 server 分別配置服務名稱,則可以在 server 上下文中分別配置,完整配置列表參考:https://github.com/DataDog/nginx-datadog/blob/master/doc/API.md

此外,該模塊能夠支持通過環境變量進行配置,例如為應用增加額外的數據標籤,在配置環境變量後啓動 Nginx:

export DD_TAGS=layer:proxy,foo:bar
nginx

最終將在數據的 message.meta 中看到定義的標籤,可用於配置的環境變量列表參考:https://docs.datadoghq.com/tracing/trace_collection/library_c...

自行編譯所需版本的模塊

datadog-nginx 是一個較新的模塊,Github 中官方預編譯的版本支持範圍有限,因此可使用容器化構建的方式編譯所需版本。執行以下命令,構建 Nginx 所需的模塊:

mkdir -p $HOME/workspace/nginx-datadog-build && cd $_
git clone https://github.com/DataDog/nginx-datadog.git

cd nginx-datadog/
# 拉取項目中引用的子模塊
git submodule update --init --recursive

# 查看最新版本
git tag
# 檢出到最新 tag
git checkout v1.6.2
# 確認當前檢出的標籤
git status

# 根據需求替換 platform、ARCH、NGINX_VERSION
# 以 Nginx 版本 1.27.1 為例,構建 amd64 架構的模塊
# 注意:
# 構建過程中容器內部會拉取 Github 上的一些倉庫,如果因為無法訪問 Github 導致構建中斷,可為容器增加以下環境變量配置代理:
# - http_proxy=<proxy-addr>
# - https_proxy=<proxy-addr>
docker run --init --rm \
    --platform linux/x86_64 \
    --env ARCH=x86_64 \
    --env BUILD_TYPE=RelWithDebInfo \
    --env NGINX_VERSION=1.27.1 \
    --env NGINX_SRC_DIR=$HOME/workspace/nginx-datadog-build/nginx-datadog/nginx \
    --env WAF=OFF \
    --env RUM=OFF \
    --env COVERAGE=OFF \
    --mount "type=bind,source=$HOME/workspace/nginx-datadog-build/nginx-datadog,destination=/mnt/repo" \
    public.ecr.aws/b1o7r7e0/nginx_musl_toolchain:latest \
    make -C /mnt/repo build-musl-aux

# 打包製品
cd $HOME/workspace/nginx-datadog-build/nginx-datadog/.musl-build
tar czvf ngx_http_datadog_module-amd64-1.27.1.so.tgz ngx_http_datadog_module.so

注意:

  • 模塊構建成功並不意味在最終集成時不存在兼容性問題,以在引入模塊後執行 nginx -t 命令檢查的結果為準;
  • 構建配置遵循 nginx-datadog 項目 Makefile 中的變更。
user avatar hangzhoukaiyunjizhikejiyouxiangongsi 頭像 wangying_5e4b645338a98 頭像
點贊 2 用戶, 點贊了這篇動態!
點贊

Add a new 評論

Some HTML is okay.