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儀表盤。