上一篇文章Probius+Kubernetes任務系統如虎添翼講了我們把Kubernetes整合進了任務系統Probius,上線後小夥伴反饋雖然擺脫了Kubernetes-Dashboard,但還是得去Grafana系統檢視容器的監控資料,能否將容器監控也給整合進Probius呢?只要能優化流程提高效率那就必須給安排
當前Kubernetes叢集通過Prometheus來收集和儲存監控資料同時藉助Grafana來畫圖展示,Probius若想整合容器監控只需要獲取Prometheus儲存的容器資料並繪圖展示即可,這裡涉及到兩塊內容:1. 獲取Prometheus中儲存的POD資料,2. 根據獲取到的POD資料進行畫圖展示,完成後的效果如下
獲取資料
Prometheus提供query
和query_range
兩個API來獲取資料,query
可以查詢給定時間點的資料,而query_range
支援查詢給定時間段內的資料集合,對於我們的需求query_range
再合適不過了
GET /api/v1/query_range
API支援以下幾個引數:
query:Prometheus查詢表示式,string型別
start:開始時間,rfc3339或是unix_timestamp格式
end:結束時間,rfc3339或是unix_timestamp格式
step:步長,可以是15s
這樣的持續時間格式
timeout:超時時間
根據這些資訊就可以編寫獲取資料的程式了,大概如下
class PrometheusApi:
def __init__(self, range=1):
self.domain = "https://prometheus.ops-coffee.cn"
self.nowtime = datetime.datetime.now(datetime.timezone.utc)
self.start_time = self.nowtime - datetime.timedelta(hours=int(range))
def get_pod_metric(self, namespace, pod):
_data = {"datetime": [], "cpu": {}, "memory": {}, "bandwidth": {}, "iops": {}}
# cpu
params = {
"query": "sum(node_namespace_pod_container:container_cpu_usage_seconds_total:sum_irate{namespace='%s', pod='%s'}) by (container)" % (
namespace, pod),
"start": self.start_time.isoformat(),
"end": self.nowtime.isoformat(),
"step": "60s"
}
rc = requests.get(self.domain + '/api/v1/query_range', params=params)
for c in rc.json().get('data').get('result'):
_data['cpu'][c['metric']['container']] = [j[1] for j in c['values']]
return True, 200, _data
這裡如果對Prometheus的查詢表示式不熟悉,可以直接去Grafana圖形那複製表示式來使用,這裡我把cpu\memory等需要展示的資料統一在一個函式裡處理了,這樣只需要根據namesapce、pod和時間範圍就能獲取到一個pod的所有監控資料,方便前端展示
需要注意的是Prometheus預設使用的是UTC時間,所以在做時間處理時需要跟本地時間做轉換
畫圖展示
資料獲取到了,下一步就是畫圖展示,這裡採用了echarts,使用也非常簡單,大概程式碼如下
<div class="tab-pane" id="tab-monitor">
<div class="row">
<div class="col-md-4">
<div class="input-group">
<div class="input-group-btn"><button class="btn btn-default">選擇例項</button></div>
<select class="form-control" id="id_pod_monitor" onchange="getPodMonitor()">
<option value="">------</option>
</select>
</div>
</div>
<div class="col-md-2">
<div class="input-group">
<div class="input-group-btn"><button class="btn btn-default">時間範圍</button></div>
<select class="form-control" id="id_pod_monitor_time" onchange="getPodMonitor()">
<option value="1" selected="selected">最近1小時</option>
<option value="4">最近4小時</option>
<option value="24">最近24小時</option>
<option value="48">最近48小時</option>
<option value="72">最近72小時</option>
</select>
</div>
</div>
<div class="col-md-6">
<div class="pull-right">
<button class="btn btn-default" onclick="getPodMonitor()">
<span class="glyphicon glyphicon-refresh"></span> 重新整理
</button>
</div>
</div>
</div>
<div class="row" style="margin-top:10px;">
<div class="col-md-6" id="id_chart_cpu" style="position: relative; height: 300px;"></div>
<div class="col-md-6" id="id_chart_memory" style="position: relative; height: 300px;"></div>
<div class="col-md-6" id="id_chart_bandwidth" style="position: relative; height: 300px;"></div>
<div class="col-md-6" id="id_chart_iops" style="position: relative; height: 300px;"></div>
</div>
</div>
<script>
var chart_cpu = echarts.init(document.getElementById('id_chart_cpu')),
chart_memory = echarts.init(document.getElementById('id_chart_memory')),
chart_bandwidth = echarts.init(document.getElementById('id_chart_bandwidth')),
chart_iops = echarts.init(document.getElementById('id_chart_iops'));
function getPodMonitor() {
var pod = $('#id_pod_monitor').val(), range = $('#id_pod_monitor_time').val();
$.get("/kubeops/namespace/{{ namespace }}/pod/" + pod + "/monitor/?range="+ range +"&format=json", function(data) {
if (data.state) {
let cpu_legend = new Array, cpu_series = new Array;
$.each(data.data.cpu, function (k, v) {
cpu_legend.push(k);
cpu_series.push({
data: v,
name: k,
type: 'line'
});
})
chart_cpu.setOption(
{
title: {text: 'CPU使用(單位:core)'},
tooltip: {trigger: 'axis'},
legend: {data:cpu_legend},
xAxis: {data: data.data.datetime},
yAxis: {type: 'value'},
series: cpu_series
}
)
}
})
}
</script>
echarts使用了最簡單的折線圖,也沒有太多花裡胡哨的東西,就是去後端取資料然後展示
至此搞定Probius整合POD監控,雖然這只是一個小功能但卻是很有用~