0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

讓你的Nginx支持分布式追蹤OpenTracing

馬哥Linux運維 ? 來源:馬哥Linux運維 ? 2023-03-08 09:54 ? 次閱讀

背景

NGINX 是一個通用且流行的應(yīng)用程序。也是最流行的 Web 服務(wù)器,它可用于提供靜態(tài)文件內(nèi)容,但也通常與其他服務(wù)一起用作分布式系統(tǒng)中的組件,在其中它用作反向代理、負載均衡 或 API 網(wǎng)關(guān)。

分布式追蹤 distributed tracing 是一種可用于分析與監(jiān)控應(yīng)用程序的機制,將追蹤在從源到目的的整個過程中的單個請求,這與僅通過單個應(yīng)用程序域來追蹤請求的形式不同。

換句話說,我們可以說分布式追蹤是對跨多個系統(tǒng)的多個請求的拼接。拼接通常由一個或多個相關(guān) ID 完成,并且跟蹤通常是一組記錄的、跨所有系統(tǒng)的結(jié)構(gòu)化日志事件,存儲在一個中心位置。

在這種背景的情況下, OpenTracing 應(yīng)運而生。OpenTracing 是一個與應(yīng)用供應(yīng)商無關(guān)的 API,它可幫助開發(fā)人員輕松地跟蹤單一請求的域。目前有多種開源產(chǎn)品都支持 OpenTracing(例如,Jaeger, skywalking 等),并將其作為一種檢測分布式追蹤的標(biāo)準(zhǔn)化方法。

本文將圍繞,從 0 到 1 實現(xiàn)在 nginx 配置分布式追蹤的架構(gòu)的簡單實例說明。本文實例使用的組件為

  • nginx[1] v1.22
  • jaeger-all-in-on[2] v1.38
  • nginx-opentracing[3] v1.22
  • jaeger-client-cpp[4] v0.9

源碼構(gòu)建 nginx-opentracing

準(zhǔn)備 nginx-opentracing

nginx-opentracing[5] 倉庫中可以看到,官方為每個 nginx 版本都提供了一個編譯好的動態(tài)庫(Nginx1.19.13+),我們可以直接拿來使用這個動態(tài)庫,如果你想將這個利用 Nginx 提供的編譯參數(shù) --add-module=/path/to/module 構(gòu)建為 nginx 的內(nèi)置功能的話,可能會出現(xiàn)一些問題,例如下面的一些錯誤:

ngx_http_opentracing_module.so/configwasfound
/root/nginx-opentracing-0.25.0/opentracing//src/ngx_http_opentracing_module.cpp
Infileincludedfrom/root/nginx-opentracing-0.25.0/opentracing//src/ngx_http_opentracing_module.cpp0:
/root/nginx-opentracing-0.25.0/opentracing//src/load_tracer.h38:fatalerror:opentracing/dynamic_load.h:Nosuchfileordirectory

根據(jù) issue[6] 中查詢得知 nginx-opentracing 需要嵌入到 nginx 中,是需要一些 opentracing-cpp[7] 因為對 c++不熟,嘗試調(diào)試很久還是上面的錯誤,故直接使用了官方提供的動態(tài)庫。

準(zhǔn)備 jaeger-client-cpp

根據(jù) nginx-opentracing 中提到的,還需要一個 jaeger-client-cpp[8] 的 tracer 才可以正常運行(這也是作為 jaeger 架構(gòu)中的角色)

來到 jaeger-client-cpp 看到 Release 提供的編譯好的動態(tài)庫已經(jīng)很久了,而最新版都沒有提供相應(yīng)編譯的版本,需要我們自己編譯

說明:編譯依賴 CMake 3.3+,gcc 4.9.2+

我們的編譯環(huán)境使用 CentOS 7 默認 gcc 與 CMake 都符合要求需要自行編譯兩個的版本。

編譯 gcc

gcc 下載地址:

https://ftp.gnu.org/gnu/gcc/[9]

cdgcc-5.4.0
./contrib/download_prerequisites

mkdirgcc-build-5.4.0
cdgcc-build-5.4.0

/usr/local/src/gcc-5.4.0/configure
--enable-checking=release
--enable-languages=c,c++
--disable-multilib

make&&makeinstall

參考這篇文章:升級 GCC[10]

cd/usr/bin/
mvgccgcc_back
mvg++g++_back
ln-s/usr/local/bin/gccgcc
ln-s/usr/local/bin/g++g++

編譯時遇到幾個問題

/lib64/libstdc++.so.6: version GLIBCXX_3.4.20' not found

gcc 編譯,libgcc動態(tài)庫有改動,恢復(fù)原狀即可

configure:error:C++compilermissingorinoperational

make[2]:***[configure-stage1-libcpp]Error1
make[2]:Leavingdirectory`/home/clay/programming/C++/gcc-4.8.1'
make[1]:***[stage1-bubble]Error2
make[1]:Leavingdirectory`/home/clay/programming/C++/gcc-4.8.1'
make:***[all]Error2

編譯 cmake

./configure--prefix=/path/to/app

make
makeinstall

這里遇到一個小問題 編譯過程中遇到 [libstdc++.so.6: version GLIBCXX_3.4.20 not found

因為這里使用了自己編譯的 gcc 版本,需要指定下動態(tài)庫的路徑[11]

LD_LIBRARY_PATH=/usr/local/lib64./configure--prefix=/usr/local/cmake

編譯 jaeger-client-cpp

這里根據(jù)官方提供的步驟操作即可

cdjaeger-client-cpp-0.9.0/
mkdirbuild
cdbuild
#這里建議使用下特色上網(wǎng),編譯過程中會使用Hunter自動下載所需的依賴項
ALL_PROXY=http://x.0.0.x:10811/usr/local/cmake/bin/cmake..
make

注:依賴項挺大的,下載時間可能很長,會 hang 主,只需等待結(jié)束即可

編譯完成后 libjaegertracing.so.0.9.0 則是我們需要的

編譯 nginx

./configure
--user=web_www
--group=web_www
--with-pcre
--with-compat
--with-http_ssl_module
--with-http_gzip_static_module
--prefix=/root/nginx
--with-http_stub_status_module

--with-compat 必須加上,表面允許使用動態(tài)庫,否則編譯完在啟動時會報下面的錯誤

nginx:[emerg]module"/root/nginx/conf/ngx_http_opentracing_module.so"isnotbinarycompatiblein/root/nginx/conf/nginx.conf:1

遇到的問題,cc nou found,這里只需將 gcc 軟連接一份為 cc 即可

配置 nginx

準(zhǔn)備 jaeger-client 的配置

jaeger.json,參數(shù)的說明可以參考configuration[12]

{
"service_name":"nginx",//服務(wù)名
"sampler":{
"type":"const",
"param":1
},
"reporter":{
"localAgentHostPort":"jaeger:6831"//jaegeragent的地址
},
"headers":{//jaeger的默認的jaegerBaggage頭設(shè)置
"jaegerDebugHeader":"jaeger-debug-id",
"jaegerBaggageHeader":"jaeger-baggage",
"traceBaggageHeaderPrefix":"uberctx-"
},
"baggage_restrictions":{
"denyBaggageOnInitializationFailure":false,
"hostPort":""
}
}

在 nginx 中開啟 opentracing

對于更多的 nginx-opentracing 的配置說明參數(shù)可以參考 Reference.md[13]

#加載 OpenTracing 動態(tài)模塊。
load_moduleconf/ngx_http_opentracing_module.so;
worker_processes1;
userrootroot;

events{
worker_connections1024;
}
http{
log_formatopentracing'{"timestamp":"$time_iso8601",'
'"source":"$server_addr",'
'"hostname":"$hostname",'
'"ip":"$http_x_forwarded_for",'
'"traceID":"$opentracing_context_uber_trace_id",'
'"client":"$remote_addr",'
'"request_method":"$request_method",'
'"scheme":"$scheme",'
'"domain":"$server_name",'
'"referer":"$http_referer",'
'"request":"$request_uri",'
'"args":"$args",'
'"size":$body_bytes_sent,'
'"status":$status,'
'"responsetime":$request_time,'
'"upstreamtime":"$upstream_response_time",'
'"upstreamaddr":"$upstream_addr",'
'"http_user_agent":"$http_user_agent",'
'"https":"$https"'
'}';
#加載tracer,這里使用的jaeger,需要傳遞配置文件
opentracing_load_tracerconf/libjaegertracing.soconf/jaeger.json;
#啟用tracing
opentracingon;
#設(shè)置tag,可選參數(shù)
opentracing_taghttp_user_agent$http_user_agent;
includemime.types;
default_typeapplication/octet-stream;
sendfileon;
keepalive_timeout65;
server{
listen80;
server_namelocalhost;
location/{
opentracing_operation_name$uri;
opentracing_propagate_context;
roothtml;
indexindex.htmlindex.htm;
}
access_loglogs/access.logopentracing;
error_page500502503504/50x.html;
location=/50x.html{
roothtml;
}
}
}

注:這里使用的 opentracing-nginx 的動態(tài)庫為 ot16 ,linux-amd64-nginx-1.22.0-ot16-ngx_http_module.so.tgz ,另外一個版本不兼容,-t 檢查語法時會提示

配置說明

對于每一個 location 都可以對其設(shè)置別名,這個就是 opentracing_operation_name 與 opentracing_location_operation_name 的區(qū)別

http{
...
location=/upload/animal{
opentracing_location_operation_nameupload;
...

更多的配置說明可以參考 Tutorial.md[14]

此時我們可以在 jaeger 上查看,可以看到 NGINX 的 span(因為這里只配置了 NGINX,沒有配置更多的后端)。

0eb18926-bd34-11ed-bfe3-dac502259ad0.png

0ee7615e-bd34-11ed-bfe3-dac502259ad0.png

審核編輯 :李倩



聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 服務(wù)器
    +關(guān)注

    關(guān)注

    12

    文章

    9277

    瀏覽量

    85837
  • 架構(gòu)
    +關(guān)注

    關(guān)注

    1

    文章

    518

    瀏覽量

    25508
  • nginx
    +關(guān)注

    關(guān)注

    0

    文章

    152

    瀏覽量

    12201

原文標(biāo)題:讓你的 Nginx 支持分布式追蹤 OpenTracing

文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    分布式日志追蹤ID實戰(zhàn)

    作者:京東物流 張小龍 本文通過介紹分布式應(yīng)用下各個場景的全局日志ID透傳思路,以及介紹分布式日志追蹤ID簡單實現(xiàn)原理和實戰(zhàn)效果,從而達到通過提高日志查詢排查問題的效率。 背景 開發(fā)排查系統(tǒng)問題用得
    的頭像 發(fā)表于 01-20 10:16 ?260次閱讀

    分布式軟件系統(tǒng)

    分布式軟件系統(tǒng)分布式軟件系統(tǒng)(Distributed Software Systems)是支持分布式處理的軟件系統(tǒng),是在由通信網(wǎng)絡(luò)互聯(lián)的多處理機體系結(jié)構(gòu)上執(zhí)行任務(wù)的系統(tǒng)。它包括
    發(fā)表于 07-22 14:53

    LED分布式恒流原理

    ,智能化一定離不了灰度等級再現(xiàn)。[url=][/url] 分布式恒流技術(shù)還有一個特點是,AC電源部分繼續(xù)采用傳統(tǒng)開關(guān)電源,恒壓的供電模式。開關(guān)電源技術(shù)積累會給LED電源設(shè)計創(chuàng)造品質(zhì)條件,雖然加速老化
    發(fā)表于 03-09 16:47

    分布式發(fā)電技術(shù)與微型電網(wǎng)

    幾種分布式發(fā)電簡介2.分布式發(fā)電與配電網(wǎng)互聯(lián)問題3.微型電網(wǎng)技術(shù)4.分布式發(fā)電(電源)技術(shù)應(yīng)用的障礙和瓶頸5.分布式發(fā)電(電源)技術(shù)發(fā)展方向6.結(jié)語
    發(fā)表于 03-11 13:37

    我國分布式光伏發(fā)電發(fā)展現(xiàn)狀

    ?! ∥覈夥a(chǎn)業(yè)嚴重依賴國外市場的風(fēng)險在歐美“雙反”時暴露無遺。為挽救我國光伏產(chǎn)業(yè),國家今年連續(xù)出臺政策支持分布式光伏發(fā)電發(fā)展。為了響應(yīng)國家政策,國家電網(wǎng)公司發(fā)布分布式光伏發(fā)電相關(guān)管理辦法,為促進
    發(fā)表于 04-22 14:38

    開放分布式追蹤OpenTracing)入門與 Jaeger 實現(xiàn)

    改動。OpenTracing為了解決不同的分布式追蹤系統(tǒng) API 不兼容的問題,誕生了 OpenTracing 規(guī)范。OpenTracing
    發(fā)表于 03-07 16:27

    基于分布式調(diào)用鏈監(jiān)控技術(shù)的全息排查功能

    鏈路的分布式鏈路追蹤功能結(jié)合周邊的本地堆棧排查,性能Metrics統(tǒng)計,業(yè)務(wù)全息排查三大附加功能,形成了完整的鏈路監(jiān)控解決方案。為方便用戶了解ARMS 基于分布式鏈路追蹤技術(shù)的全息排查
    發(fā)表于 08-07 17:02

    分布式系統(tǒng)的優(yōu)勢是什么?

    當(dāng)討論分布式系統(tǒng)時,我們面臨許多以下這些形容詞所描述的 同類型: 分布式的、刪絡(luò)的、并行的、并發(fā)的和分散的。分布式處理是一個相對較新的領(lǐng)域,所以還沒有‘致的定義。與順序計算相比、并行的、并發(fā)的和
    發(fā)表于 03-31 09:01

    HarmonyOS應(yīng)用開發(fā)-分布式設(shè)計

    設(shè)計理念HarmonyOS 是面向未來全場景智慧生活方式的分布式操作系統(tǒng)。對消費者而言,HarmonyOS 將生活場景中的各類終端進行能力整合,形成“One Super Device”,以實現(xiàn)
    發(fā)表于 09-22 17:11

    支持掉線自動報警Profinet遠程分布式IO模塊分享

    華杰智控Profinet遠程分布式IO模塊不但支持IO, 同時還支持把modbus RTU的終端設(shè)備如變頻器,溫控表,電表等等轉(zhuǎn)成Profinet協(xié)議接入主PLC。 主PLC不需要處理modbus
    發(fā)表于 07-02 06:49

    各種分布式電源的電氣特性

    PS:滲透率的概念:從字面上理解,“滲透”就是由分布式電源發(fā)出的功率進入(滲入)到配電系統(tǒng),所謂的“率”就是由分布式電源發(fā)出的電和整個系統(tǒng)所消耗的電(或者說總發(fā)電量)的一個比值。各種分布式電源的電氣
    發(fā)表于 07-12 07:54

    如何高效完成HarmonyOS分布式應(yīng)用測試?

    于解決HarmonyOS分布式應(yīng)用UI自動化測試及測試效率問題。主要包含以下特性:① 提供30+測試API,覆蓋控件查找、控件操作、按鍵注入等,并支持基礎(chǔ)的分布式UI自動化測試,如:findComponent
    發(fā)表于 12-13 18:07

    【學(xué)習(xí)打卡】OpenHarmony的分布式任務(wù)調(diào)度

    了,除了串行作業(yè)之外,分布式調(diào)度系統(tǒng)也支持并行作業(yè)。分布式系統(tǒng)的架構(gòu)有以下幾種:1.集中式:通過中央節(jié)點將任務(wù)分配給工作節(jié)點或執(zhí)行節(jié)點,并在這些執(zhí)行節(jié)點之間編排任務(wù)。2.去中心化:有多個中心節(jié)點,每個
    發(fā)表于 07-18 17:06

    HarmonyOS應(yīng)用開發(fā)-分布式語音攝像頭體驗

    一、組件說明使用HarmonyOS分布式文件系統(tǒng)和AI語音識別功能開發(fā)了一個分布式語音攝像頭。使用此相機應(yīng)用程序,同一分布式網(wǎng)絡(luò)下的不同設(shè)備可以實時看到主設(shè)備拍攝的照片。這有效解決了對方拍照時需要
    發(fā)表于 08-24 15:06

    OpenHarmony技術(shù)論壇:分布式相機和分布式圖庫功能

    API開放相機能力、新增了相機權(quán)限校驗控制、分布式相機能力、支持變焦及閃光燈控制。 媒體庫特性新增了分布式媒體庫能力,支持跨設(shè)備的媒體文件查看。 ? ? 來源:OpenHarmony
    的頭像 發(fā)表于 04-25 15:06 ?1871次閱讀
    OpenHarmony技術(shù)論壇:<b class='flag-5'>分布式</b>相機和<b class='flag-5'>分布式</b>圖庫功能