iT邦幫忙

2022 iThome 鐵人賽

DAY 29
0
Software Development

剛入職軟體工程師會需要知道的常見工具篇系列 第 29

[Day29] 簡單搞懂Promethues Python FastAPI 實作範例

  • 分享至 

  • xImage
  •  

昨天建立好Promethues之後, 今天就可以用python FastAPI框架來建立被監控的網站囉~
其實我昨天已經偷偷寫在docker裡面啦就是onlineweb~如果不做就拿掉被監控的目標物就行哈哈哈

  • 資料夾結構
├── Dockerfile
├── docker-compose.yml
├── k8s.yaml     # 之前介紹minikube就是用這個專案啦~有沒有這個檔案都不影響
├── main.py
├── requirements.txt
└── utils
    ├── app.py
    ├── data.py
    └── templates
        └── index.html
  • app.py
    • 首先會建立我們想要監控的數據,舉例
      REQUEST_TIME = Summary('request_processing_seconds', 'Time spent processing request') Promethues的四大功能 Summary, Counter, Gauge, Histogram詳細使用方法請參考官方文件
    • 就可以在API前面加 @REQUEST_TIME.time() 要監控的數據
# -*- coding: utf-8 -*-
"""
服務主入口
"""
from pathlib import Path
from fastapi.templating import Jinja2Templates
from pathlib import Path
from typing import Optional
from fastapi import (
    FastAPI, APIRouter, Request, HTTPException
)
from fastapi.responses import JSONResponse, HTMLResponse 
from utils.data import getProduct
from prometheus_client import Counter, Summary

app = FastAPI()
## 路徑問題
BASE_DIR = Path(__file__).resolve().parent
templates = Jinja2Templates(directory=str(Path(BASE_DIR, 'templates')))

## Prometheus 監測數據 這邊可以自己設定跟說明
REQUEST_TIME = Summary('request_processing_seconds', 'Time spent processing request')
REQUEST_COUNT = Counter('request_count', 'Total webapp request count')
LATENCY = Summary('request_processing_latency_seconds', 'Time for a request')

router = APIRouter()
def reply_response(
    code: int, desc: str, result: Optional[dict] = None):
    msg = {
        'Result':result,
        'Status': {
            'Code': code,
            'Desc':desc
        }
    } 
    return msg

@REQUEST_TIME.time()
@LATENCY.time()
@router.get(f'/pageList', response_class=JSONResponse)
async def pageList(request: Request):
    try:
        # 這邊是去跟資料庫互動拉資料出來
        data = getProduct()
        msg = reply_response(
            result = data,
            code = 200,
            desc = '呼叫成功'
        )
        return JSONResponse(status_code=200, content=msg)
    except:
        msg = reply_response(
            result = None,
            code = 400,
            desc='呼叫失敗'
        )
        return JSONResponse(status_code=400, content=msg)

#跳轉至Index畫面
@router.get(f"/page", response_class=HTMLResponse)
async def userpage(request: Request):
    return templates.TemplateResponse("index.html",{"request": request})
  • data.py 很單純就從資料庫拉資料~ 範例是用mongodb作處理
# -*- coding: utf-8 -*-
"""
與資料庫做互動
"""
from pymongo import MongoClient

client = MongoClient(
    host='localhost:27017', username='帳號', password='密碼')
db = client['Web']
def getProduct():
    data = list(db.productList.find({},{'_id':0, 'created_at':0, 'modified_at':0}))
    return data
  • index.html 網頁顯示,用Jquery做示範
<script type="text/javascript">
    $(document).ready( function () {
    $.ajax({
        url: '/pageList',
        type: 'GET',
        dataType: 'json',
        contentType: 'application/json;',
        success: function(data) {
            $('#tableObj').DataTable({
                "data": data.Result,
                "columns": [ 
                    //列的標題一般是從DOM中讀取
                    //也可以使用這個屬性為表格創建列標題
                    { data: 'Id', title: "商品編號" },
                    { data: 'name', title: "商品名稱" },
                    { data: 'channel', title: "通路別" }
                ]
            })
        },
        error: function(jqXHR, textStatus, errorThrown){
            alert('Error: ' + textStatus + ' - ' + errorThrown);
        }
    });
    
});
</script>

服務啟動後,打開頁面就會看到監控的數據囉,這些數據就會對應回prometheus裡面的數據

程式碼請參考我的Github


上一篇
[Day28] 簡單搞懂Prometheus Docker實作範例
下一篇
[Day30] 簡單搞懂系列篇總攬
系列文
剛入職軟體工程師會需要知道的常見工具篇30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言