重磅:SRS支持Prometheus Exporter

Written by 張俊勤, 孟曉偉.

SRS的可觀測性是支撐業(yè)務(wù)的運營的能力,主要指監(jiān)控(Prometheus Exporter)、分布式鏈路追蹤(APM)、上下文日志(Cloud Logging)三個核心能力,以及基于這些能力的運營大盤、監(jiān)控系統(tǒng)、問題排查、日志收集和分析等功能。

Why Important?

可觀測性,在云原生中有詳細的定義,參考OpenTelemetry.io,從可觀測性上看其實就是三個問題:

  • 監(jiān)控指標(Metrics):就是我們一般所理解的監(jiān)控告警。監(jiān)控一般是將一些數(shù)據(jù)聚合,體現(xiàn)系統(tǒng)在不同層面的狀態(tài),當達到某個狀態(tài)后告警。比如區(qū)域的水位值,達到一定水位后就需要自動或人工擴容,或者調(diào)整調(diào)度降低這個區(qū)域的負載。
  • 分布式跟蹤(Tracing):我們排查問題時,一般是按照會話或請求維度排查,在系統(tǒng)中會涉及多個服務(wù)器,比如播放一個流會經(jīng)過API、調(diào)度、邊緣、上游服務(wù)器、源站等,如何把這個全鏈路的信息給出來,就是分布式追蹤(Tracing)。明顯這是非常高效的解決問題的方法,問題遲遲得不到解決甚至不了了之,遲早會失去用戶。
  • 日志(Logging): 就是我們一般所理解的日志,也是一般研發(fā)所依賴的排查問題的幾乎唯一的方法。其實日志是最低效的方法,因為日志沒有上下文,無法在分布式系統(tǒng)中分離出某個會話的多個日志。日志只有具備追蹤的能力,或者在關(guān)聯(lián)到Traceing中,這樣才能更高效。

Note: 上圖請參考Metrics, tracing, and logging

Note: SRS一直吹的可追蹤日志,其實是在日志中加入了一定追蹤能力,不過沒有分布式追蹤能力,也沒有標準化(工具鏈就不完善,也無法讓業(yè)務(wù)系統(tǒng)采用同樣的日志,無法讓整個系統(tǒng)具備可觀測性)。

Note: SRS的錯誤日志還有堆棧信息,這對于Java或Go等現(xiàn)代語言是很普通的能力,但是對于C++就是對問題排查非常有用的能力了。

回頭看我們之前分析的幾個問題,如何使用這三個能力來解決:

  • 收到了系統(tǒng)告警:根據(jù)告警的信息,比如是錯誤率上升,還是耗時增加,在追蹤(Tracing)系統(tǒng)中過濾,可以看到具體的請求和會話,就可以獲取相關(guān)的詳細日志。
  • 用戶反饋的具體問題:根據(jù)業(yè)務(wù)ID,查詢到請求或會話的信息,在追蹤(Tracing)系統(tǒng)中可以看到整個鏈路,也可以查詢到每個環(huán)節(jié)的詳細日志。
  • 需要重復(fù)開發(fā)運營系統(tǒng)問題:標準化的可觀測,可以直接對接到Prometheus和Grafana,以及云存儲比如CLS,直接使用這些標準化的工具,不用再重復(fù)開發(fā)。

Note: 上圖請參考Loki: Prometheus-inspired, open source logging for cloud natives

Note: 這套系統(tǒng)就沒有問題嗎?其實也有,那就是超級大規(guī)模的系統(tǒng)不能用,比如上千萬并發(fā)的系統(tǒng),產(chǎn)生的日志非常多,成本太高。如果你是SRS的用戶,你就不用想了,你的系統(tǒng)達不到這么高量級。只有云計算本身的可觀測性不能直接使用云原生的這套系統(tǒng),而一般遵循這個標準定制。一般的業(yè)務(wù)規(guī)模,完全是夠用的,而是成本非常非常低。

針對上面的問題,SRS的運營能力分成幾個獨立的部分,首先是提供了Prometheus可以對接的Exporter,Prometheus可以直接從SRS拉取監(jiān)控數(shù)據(jù),而不依賴外部第三方服務(wù),如下圖所示:

+-----+               +-----------+     +---------+
| SRS +--Exporter-->--| Promethus +-->--+ Grafana +
+-----+   (HTTP)      +-----------+     +---------+

Note: Promethus是云原生的標準監(jiān)控系統(tǒng),在K8s中部署也可以使用這個能力,比如通過Pod發(fā)現(xiàn)和采集數(shù)據(jù)。

下面是詳細的使用說明。

Usage for SRS Exporter

首先,編譯和啟動SRS,要求SRS 5.0.86+

./configure && make
env SRS_ENV_ONLY=on SRS_EXPORTER_ENABLED=on SRS_LISTEN=1935 \
  ./objs/srs

Note: 我們使用環(huán)境變量方式配置SRS,不依賴配置文件。當然使用conf/prometheus.conf啟動也可以。

Note: SRS啟動成功后,可以打開http://localhost:9972/metrics驗證,能看到返回指標數(shù)據(jù)就是成功了。

接著,我們啟動FFmpeg推流:

docker run --rm -it ossrs/srs:encoder ffmpeg -re -i doc/source.flv -c copy \
  -f flv rtmp://host.docker.internal/live/livestream

然后,啟動node_exporter,收集節(jié)點的數(shù)據(jù),這樣和SRS的服務(wù)器數(shù)據(jù)可以形成完整的監(jiān)控數(shù)據(jù):

docker run --rm -p 9100:9100 prom/node-exporter

Note: 用Docker啟動node_exporter數(shù)據(jù)不準,需要特殊的權(quán)限而mac不支持。實際場景請使用二進制直接在主機上啟動,可以從這里下載對應(yīng)系統(tǒng)的二進制。

Note: node_exporter啟動后,可以打開http://localhost:9100/metrics驗證,能看到返回指標數(shù)據(jù)就是成功了。

最后,編寫配置文件prometheus.yml,內(nèi)容如下:

scrape_configs:
  - job_name: "node"
    metrics_path: "/metrics"
    scrape_interval: 5s
    static_configs:
      - targets: ["host.docker.internal:9100"]
  - job_name: "srs"
    metrics_path: "/metrics"
    scrape_interval: 5s
    static_configs:
      - targets: ["host.docker.internal:9972"]

Note: 默認scrape_interval是1m即一分鐘,為了測試方便我們設(shè)置為5s。

啟動Prometheus:

docker run --rm -v $(pwd)/prometheus.yml:/etc/prometheus/prometheus.yml \
  -p 9090:9090 prom/prometheus

打開Prometheus: Targets,可以看到抓取數(shù)據(jù)的狀態(tài)。打開Prometheus: Graph,輸入一下語句,可以驗證是否正常:

rate(srs_receive_bytes_total[10s])*8/1000

這個語句是計算輸入的帶寬,也就是直播流的碼率,如下圖所示:

雖然Prometheus也能生成圖,不過一般是使用Grafana對接Prometheus展示圖表。

Usage for Grafana

首先啟動Grafana:

docker run --rm -it -p 3000:3000 \
  -e GF_SECURITY_ADMIN_USER=admin \
  -e GF_SECURITY_ADMIN_PASSWORD=12345678 \
  -e GF_USERS_DEFAULT_THEME=light \
  grafana/grafana

然后打開Grafana頁面:http://localhost:3000/

輸入用戶名admin,以及密碼12345678就可以進入Grafana后臺了。

執(zhí)行命令添加Prometheus的DataSource:

curl -s -H "Content-Type: application/json" \
    -XPOST http://admin:12345678@localhost:3000/api/datasources \
    -d '{
    "name": "prometheus",
    "type": "prometheus",
    "access": "proxy", "isDefault": true,
    "url": "http://host.docker.internal:9090"
}'

執(zhí)行命令導(dǎo)入HelloWorld圖表:

curl https://raw.githubusercontent.com/ossrs/srs-grafana/main/dashboards/helloworld.json | \
curl -s -H "Content-Type: application/json" \
    -XPOST http://admin:12345678@localhost:3000/api/dashboards/db \
    --data-binary @-

導(dǎo)入后就可以在儀表盤中看到了,如下圖所示:

我們還提供了更加完整的儀表盤,可以在srs-grafana中看到,如下圖所示:

歡迎一起來完善SRS儀表盤。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容