Python 服務(wù)實現(xiàn)可觀測性最佳實踐

前言

本次實踐主要是介紹 Python 服務(wù)通過無侵入的方式接入觀測云進行全面的可觀測。

環(huán)境信息

- 系統(tǒng)環(huán)境:主機環(huán)境

- 開發(fā)語言:Python2.7+

- APM 探針包:ddtrace

接入方案

準備工作

安裝 DataKit

主機安裝 DataKit

# 需要把token 改成觀測云空間的實際token值(可在觀測云控制臺-->集成-->Datakit 上面獲?。?/p>

DK_DATAWAY="https://openway.guance.com?token=tkn_xxxxxx" bash -c "$(curl -L https://static.guance.com/datakit/install.sh)"

開啟采集器

開啟日志采集器

cp /usr/local/datakit/conf.d/log/logging.conf.sample /usr/local/datakit/conf.d/log/logging.conf

vim /usr/local/datakit/conf.d/log/logging.conf

在 [[inputs.logging]] 采集項目下的 logfiles 添加 python 日志的路徑:? "/root/guance/dd-test/python_log/*"

開啟 ddtrace 采集器

cp /usr/local/datakit/conf.d/ddtrace/ddtrace.conf.sample? /usr/local/datakit/conf.d/ddtrace/ddtrace.conf

重啟 Datakit

# 在主機終端輸入命令

datakit service -R

準備測試環(huán)境

以下實踐在 Linux 主機環(huán)境下操作

安裝 Python 依賴包:

pip install flask

pip install ddtrace

新建文件夾存儲日志數(shù)據(jù):

mkdir -p /root/guance/dd-test

準備測試代碼

服務(wù) A 代碼如下:

vim python_demo.py


import logging

from flask import Flask

log = logging.getLogger(__name__)

log.level = logging.INFO

stream_handler = logging.StreamHandler()

formatter = logging.Formatter('%(asctime)s %(levelname)s %(filename)s %(dd.service)s %(dd.trace_id)s %(dd.trace_id)s %(funcName)s:%(lineno)s %(message)s')

stream_handler.setFormatter(formatter)

log.addHandler(stream_handler)

app = Flask(__name__)

@app.route('/a', methods=['GET'])

def index():

? ? # 打印一條log日志

? ? log.info('Hello, World!')

? ? return "abcdefg", 200

if __name__ == '__main__':

? ? app.run(host="0.0.0.0", port=10001, debug=True)

啟動業(yè)務(wù)服務(wù)

# DD_AGENT_HOST、DD_AGENT_PORT? 分別為datakit 訪問的地址以及端口

DD_SERVICE=python_demo \

DD_TAGS=project:python_demo,env:test,version:v1 \

DD_AGENT_HOST=localhost \

DD_AGENT_PORT=9529 \

ddtrace-run python3 python_demo.py &> /root/guance/dd-test/a.log?

調(diào)用鏈接入

訪問服務(wù) A,服務(wù)會產(chǎn)生調(diào)用鏈上傳至 DataKit。

curl http://localhost:10001/a? ? ? ? ? # 終端使用curl 訪問,瀏覽器則直接訪問url即可

日志接入

DataKit 會定時采集服務(wù)產(chǎn)生的日志,通過觀測云 Pipeline 提取日志中的 status, service_name, trace_id 等字段,從而實現(xiàn)調(diào)用鏈和日志的串聯(lián)效果。

# pipeline 的解析規(guī)則(鏈路與日志通過trace_id 關(guān)聯(lián)起來)

grok(_, "%{TIMESTAMP_ISO8601:time} %{LOGLEVEL:status} %{DATA:file_name} %{DATA:service_name} %{DATA:trace_id} %{DATA:span_id} " )


實踐效果

- 調(diào)用鏈以及調(diào)用鏈關(guān)聯(lián)日志效果


- 日志采集效果

?著作權(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)容