Written by 張俊勤, 孟曉偉.
SRS的可觀測性是支撐業(yè)務(wù)的運營的能力临梗,主要指監(jiān)控(Prometheus Exporter)余黎、分布式鏈路追蹤(APM)、上下文日志(Cloud Logging)三個核心能力赖临,以及基于這些能力的運營大盤鲤脏、監(jiān)控系統(tǒng)、問題排查厨姚、日志收集和分析等功能衅澈。
Why Important?
可觀測性,在云原生中有詳細的定義谬墙,參考OpenTelemetry.io今布,從可觀測性上看其實就是三個問題:
- 監(jiān)控指標(biāo)(Metrics):就是我們一般所理解的監(jiān)控告警经备。監(jiān)控一般是將一些數(shù)據(jù)聚合,體現(xiàn)系統(tǒng)在不同層面的狀態(tài)部默,當(dāng)達到某個狀態(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一直吹的可追蹤日志,其實是在日志中加入了一定追蹤能力蟀伸,不過沒有分布式追蹤能力蚀同,也沒有標(biāo)準(zhǔn)化(工具鏈就不完善,也無法讓業(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)問題:標(biāo)準(zhǔn)化的可觀測酪穿,可以直接對接到Prometheus和Grafana凳干,以及云存儲比如CLS,直接使用這些標(biāo)準(zhǔn)化的工具被济,不用再重復(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),而一般遵循這個標(biāo)準(zhǔn)定制刊棕。一般的業(yè)務(wù)規(guī)模炭晒,完全是夠用的,而是成本非常非常低甥角。
針對上面的問題网严,SRS的運營能力分成幾個獨立的部分,首先是提供了Prometheus可以對接的Exporter嗤无,Prometheus可以直接從SRS拉取監(jiān)控數(shù)據(jù)震束,而不依賴外部第三方服務(wù),如下圖所示:
+-----+ +-----------+ +---------+
| SRS +--Exporter-->--| Promethus +-->--+ Grafana +
+-----+ (HTTP) +-----------+ +---------+
Note: Promethus是云原生的標(biāo)準(zhǔn)監(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驰凛,不依賴配置文件胸懈。當(dāng)然使用
conf/prometheus.conf
啟動也可以。
Note: SRS啟動成功后恰响,可以打開http://localhost:9972/metrics驗證趣钱,能看到返回指標(biāo)數(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ù)不準(zhǔn)井联,需要特殊的權(quán)限而mac不支持。實際場景請使用二進制直接在主機上啟動您旁,可以從這里下載對應(yīng)系統(tǒng)的二進制烙常。
Note: node_exporter啟動后,可以打開http://localhost:9100/metrics驗證鹤盒,能看到返回指標(biāo)數(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儀表盤脾猛。